Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. JavaScript
    5. Array "undefined" und obj.deviceID "null" bei Trigger

    NEWS

    • Neuer Blog: Fotos und Eindrücke aus Solingen

    • ioBroker@Smart Living Forum Solingen, 14.06. - Agenda added

    • ioBroker goes Matter ... Matter Adapter in Stable

    Array "undefined" und obj.deviceID "null" bei Trigger

    This topic has been deleted. Only users with topic management privileges can see it.
    • Phlixx
      Phlixx last edited by

      Hallo Community,

      brauche Eure Hilfe, stehe auf dem Schlauch.

      Hintergrund:
      Ich erstelle in einem Skript mit Start des Skripts ein Array von Datenpunkten, um darauf jeweils einen Listener zu registrieren. Das funktioniert ("registered 4 subscriptions").

      Mit Auslösen des Triggers (Wert 3)

      • hat obj.newState.val den Wert 3 (prima)
      • ist obj.objectID aber null und
      • thermostateTrigger[i] undefined.

      Was kann ich tun? Kann ich thermostateTrigger[i] irgendwie persistent zur Laufzeit bekommen, dass die function() bei Aufruf ihre banalen Befehle ausführen kann?

      Danke!
      Phlixx

      javascript.0	2020-10-23 10:42:43.147	info	(21842) script.js.Counter.CountdownBoostMaxEQtest: Countdown Trigger: undefined-null, Wert:3
      javascript.0	2020-10-23 10:42:40.110	info	(21842) script.js.Counter.CountdownBoostMaxEQtest: registered 4 subscriptions and 0 schedules
      javascript.0	2020-10-23 10:42:40.110	info	(21842) script.js.Counter.CountdownBoostMaxEQtest: subscribe: {"pattern":{"id":"maxcul.0.JMD301xxxx.mode","change":"ne","q":0},"name":"script.js.Counter.CountdownBoostMaxEQtest"}
      javascript.0	2020-10-23 10:42:40.109	info	(21842) script.js.Counter.CountdownBoostMaxEQtest: subscribe: {"pattern":{"id":"maxcul.0.MEQ145xxxx.mode","change":"ne","q":0},"name":"script.js.Counter.CountdownBoostMaxEQtest"}
      javascript.0	2020-10-23 10:42:40.107	info	(21842) script.js.Counter.CountdownBoostMaxEQtest: subscribe: {"pattern":{"id":"maxcul.0.MEQ145xxxx.mode","change":"ne","q":0},"name":"script.js.Counter.CountdownBoostMaxEQtest"}
      javascript.0	2020-10-23 10:42:40.106	info	(21842) script.js.Counter.CountdownBoostMaxEQtest: subscribe: {"pattern":{"id":"maxcul.0.JMD300xxxx.mode","change":"ne","q":0},"name":"script.js.Counter.CountdownBoostMaxEQtest"}
      
      
      var thermostate = new Array('maxcul.0.JMD300xxxx','maxcul.0.MEQ145xxxx','maxcul.0.MEQ145xxxx','maxcul.0.JMD301xxxx');
      var thermostateTrigger = new Array();
      
      for (var i = 0;i <thermostate.length;i++) {
          thermostateTrigger[i] = thermostate[i]+'.mode';
          createState(thermostateTrigger[i]+'.countdown', 300);
          createState(thermostateTrigger[i]+'.afterCount', false);
          createState(thermostateTrigger[i]+'.countTrigger', false);
      
          on(thermostateTrigger[i], function (obj) {
          log ('Countdown Trigger: '+thermostateTrigger[i]+'-'+obj.deviceId+', Wert:'+obj.newState.val);
          if (obj.newState.val === 3) {
              setState(thermostateTrigger[i]+'.countdown', 300);
              setState(thermostateTrigger[i]+'.countTrigger', true);
              count(thermostateTrigger[i]);
          }    
      });
      }
      
      function count(thermostate) {
          setTimeout(function () {
              var timer = getState(thermostate+'.countdown').val;
              if (timer > 1) {
                  setState(thermostate+'.countTrigger', false);
                  setState(thermostate+'.countdown', timer - 1);
                  count(thermostate);
              } else {
                  setState(thermostate+'.countdown', 0);
                  setState(thermostate+'.afterCount', true);
              }
          }, 1000);
      }
      
      
      Phlixx 1 Reply Last reply Reply Quote 0
      • Phlixx
        Phlixx @Phlixx last edited by

        Oder Kurzfassung:

        Warum komme ich nicht an die deviceID des auslösenden Objekts?

        obj.newState.val --> 3

        obj.deviceID --> null

        Muss ich was in ioBroker umstellen?

        Danke!

        (Das mit dem Array war nur der hilflose Versuch eines Workarounds für obiges Problem

        paul53 1 Reply Last reply Reply Quote 0
        • paul53
          paul53 @Phlixx last edited by paul53

          @Phlixx sagte:

          Warum komme ich nicht an die deviceID des auslösenden Objekts?

          obj.deviceId funktioniert nur bei einer Ordnerstruktur "device.channel.state". Versuche es mal mit obj.channelId.

          Phlixx 1 Reply Last reply Reply Quote 0
          • Phlixx
            Phlixx @paul53 last edited by Phlixx

            @paul53 Darauf muss man mal kommen.
            Dann kann das Array zur Laufzeit ja weg 😉

            Danke Dir, Paul!
            Gruß Phlixx

            Falls jemand auf der Suche vorbei schaut, einfach das Array mit den DeviceIDs der eigenen Geräte füllen. Rest sollte dank @paul53 jetzt so gehen ...

            
            var thermostate = new Array('maxcul.0.JMD300xxxx','maxcul.0.MEQ145xxxx','maxcul.0.MEQ145xxxx','maxcul.0.JMD301xxxx');
            //Array mit den DeviceIDs der eigenen Geräte füllen
            
            for (var i = 0;i <thermostate.length;i++) {
                createState(thermostate[i]+'.countdown', 0); // falls noch nicht existent
                createState(thermostate[i]+'.afterCount', false);
                
                on(thermostate[i]+'.mode', function (obj) { //je DeviceID einen Listener registrieren
                    // geht nur mit obj.channelId, nicht obj.deviceId
                    if (obj.newState.val === 3) {
                        setState(obj.channelId+'.countdown', 300);
                        count(obj.channelId);
                    }    
                });
            }
            
            function count(thermostat) { 
            // mit diesem Sekundentimer (setTimeOut(...,1000) bin ich nicht glücklich, im Frontent sieht es unruhig aus, da die Updates nicht sekündlich kommen... ggs. als Minuten darstellen...
                setTimeout(function () {
                    var timer = getState(thermostat+'.countdown').val;
                    if (timer > 1) {
                        setState(thermostat+'.countdown', timer - 1);
                        count(thermostat);
                    } else {
                        setState(thermostat+'.countdown', 0);
                        setState(thermostat+'.afterCount', true);
                    }
                }, 1000);
            }
            
            
            1 Reply Last reply Reply Quote 0
            • First post
              Last post

            Support us

            ioBroker
            Community Adapters
            Donate

            983
            Online

            31.8k
            Users

            80.0k
            Topics

            1.3m
            Posts

            2
            4
            206
            Loading More Posts
            • Oldest to Newest
            • Newest to Oldest
            • Most Votes
            Reply
            • Reply as topic
            Log in to reply
            Community
            Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
            The ioBroker Community 2014-2023
            logo