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); }
-
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 wegDanke 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); }