NEWS
Brauche Hilfe zu async/await
-
Hallo,
ich möchte hier ein Script erstellen und denke, dass hierfür async/await anzuwenden wäre. Aber ich verstehe noch nicht ganz, wie man das scripted.
Folgender Fall: ich habe an einem Gerät (eine Enthärtungsanlage judo isoft) u.a. 2 Datenpunkte:
'judoisoft.0.StandBy' wird vom Anwender auf 'true' geschaltet. Damit wird der Leckageschutz der Anlage für eine bestimmte Zeit deaktiviert. Diese Zeit ist in der Anlage voreingestellt (aber variabel, 1 - x Stunden), und wird erst nach diesem Trigger an den 2. Datenpunkt, 'judoisoft.0.StandByValue', zurückgeschrieben. Diese Dauer möchte ich auslesen, um sie in meiner Visualisierung anzuzeigen. Das Script muss dazu aber warten, bis der 2. DP den neuen Wert hat. Ich möchte vermeiden, da mit 'wait' oder Ähnlichem zu arbeiten. Auf der anderen Seite sollte das Script iobroker nicht blockieren, in dem es ewig wartet, wenn 2. der DP nicht aktualisiert wird. Wie macht man das am Besten ? -
@roughestboy sagte in Brauche Hilfe zu async/await:
Hallo,
ich möchte hier ein Script erstellen und denke, dass hierfür async/await anzuwenden wäre. Aber ich verstehe noch nicht ganz, wie man das scripted.
Folgender Fall: ich habe an einem Gerät (eine Enthärtungsanlage judo isoft) u.a. 2 Datenpunkte:
'judoisoft.0.StandBy' wird vom Anwender auf 'true' geschaltet. Damit wird der Leckageschutz der Anlage für eine bestimmte Zeit deaktiviert. Diese Zeit ist in der Anlage voreingestellt (aber variabel, 1 - x Stunden), und wird erst nach diesem Trigger an den 2. Datenpunkt, 'judoisoft.0.StandByValue', zurückgeschrieben. Diese Dauer möchte ich auslesen, um sie in meiner Visualisierung anzuzeigen. Das Script muss dazu aber warten, bis der 2. DP den neuen Wert hat. Ich möchte vermeiden, da mit 'wait' oder Ähnlichem zu arbeiten. Auf der anderen Seite sollte das Script iobroker nicht blockieren, in dem es ewig wartet, wenn 2. der DP nicht aktualisiert wird. Wie macht man das am Besten ?Das ist kein Fall für async/await sondern ein einfacher "setTimeout"
let offTimout = null; let WaitForDuration = false; let WFDTimeout = null // auf das aktivieren des standby warten, um die Überwachung für die Dauer einzuschalten on ({id:'..standby', change:'gt'}, function(obj) { if (WFDTimeout) { clearTimeout(WFDTimeout) } WaitForDuration = true; WFDTimeout = setTimeout(function() { WaitForDuration = false}, 10000) ; // wenn nicht in 10 Sekunden eine Dauer kommt, dauer-ueberwachung abschalten } // eigentlicher Start des Standby durch Anpassung des Standby wertes on ({id:'..standbyvalue', change:'ne', function(obj) { if WaitForDuration { if (offTimeout) clearTimeout(offTimeout); offTimeout = setTimeout(function() { setState('..standby', false); offTimeout = null; } , obj.val * 60 * 60 * 1000); } }
Die Datenpunkte musst du natürlich korrekt benennen, und der ZeitWert für den Timeout muss in ms umgerechnet werden, daher die * 10006060
A.
ps. So - ist korrigiert. -
@asgothian
Geht das auch mit Blockly oder muss ich da ins Javascript rein ? -
@roughestboy latuernich
Alternative, geht aber nur wenn die Standby Zeit während des Standby nicht aktualisiert wird:
-
Danke Dir, sollte dann auch bei meinen Kenntnissen reichen, das umzusetzen.
Außerdem glaube ich, ich habe falsch rum gedacht und es ist viel einfacher, das umzusetzen, was ich möchte. Wenn das Setzen von 'StandBy' auf true schon nach sich zieht, dass 'StandbyValue' von 0 auf 'x' Stunden geändert wird, kann ich ja 'StandByValue' als Trigger für diesen Modus hernehmen, nicht 'Standby'.
Die Anlage zählt ja nach 'StandBy' = true ihre x Stunden runter, bis sie den Leckageschutz wieder anschaltet.
Ich kann dann ja 'StandbyValue' im Script als Trigger her nehmen, ggf. 'sicherheitshalber' nochmal nachfragen ob 'Standby' auch true ist, und dann einen Timer mit der gleichen Zeit/Dauer setzen, der in der VIS angezeigt wird und herunterzählt. Danach beendet die Anlage eh von selbst diesen Modus, und auch die beiden DP's gehen wieder auf ihre vorherigen Werte ('false' und '0' (h)).