NEWS
Array "undefined" und obj.deviceID "null" bei Trigger
-
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!
Phlixxjavascript.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); } -
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!
Phlixxjavascript.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); }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
-
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
-
@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.
@paul53 Darauf muss man mal kommen.
Dann kann das Array zur Laufzeit ja weg ;-)Danke Dir, Paul!
Gruß PhlixxFalls 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); }