NEWS
Gelöst: Verzögerungszeit bei der Ausführung von Anweisungen
-
Hallo und einen schönen Sonntag,
ich bin neu hier und möchte mich zunächst einmal an all diejenigen bedanken, die ioBroker realisiert haben. Ich bin kein Programmierer, schon etwas älter und war schon etwas frustriert, als ich im Homematic-Forum die Abkündigung von CCU.IO und den diversen AddOns lesen musste – gerade, als ich eine funktionierende Lösung mit einem Raspi auf die Beine gestellt hatte.
OK – dann also ioBoker
Mit Vis habe ich schon die Visualisierung meines Reihenhauses einigermaßen hinbekommen, nun soll es an die Scripte gehen. Und genau hier habe ich ein Problem, dass ich nicht lösen kann:
Ich habe ein billiges Tablet für die Visualisierung, das dauerhaft mit dem Ladegerät verbunden ist.
Da alle Tablets, die ich kenne, den Bildschirm aktivieren, wenn mindestens der Ladestrom eingeschaltet wird, verwende ich einen Schaltaktor, der den Ladestrom für eine Sekunde einschaltet, wenn ein bestimmter Bewegungmelder Bewegung erkennt.
DAS habe ich auch schon hinbekommen:
on("hm-rpc.0.KEQ1234567.1.MOTION", function(obj) { if (obj.newState.val === true) { setState('hm-rpc.0.MEQ1234567.1.ON_TIME', 2 ); setState("hm-rpc.0.MEQ1234567.1.STATE",true); } });
Das ist ja auch kein Hexenwerk und funktioniert soweit einwandfrei - jedenfalls solange der Schaltaktor vorher AUS war !
Ich möchte nun diese Funktion aber auch in der Zeit nutzen, in der ich das Tablet zum tatsächlichen Laden mit Strom versorge, der Schaltaktor also den Zustand AN hat.
Mit einem CCU-Programm hatte ich das gelöst, indem ich -wenn der Schaltaktor EIN ist- erst die Anweisung „Schaltaktor AUS“ und dann mit einer Verzögerungszeit von 2 Sekunden, diesen wieder eingeschaltet habe.
Das würde ich nun gern in einem ioBroker-Script realisieren.
Als Anfänger hat mich auch eine Suche nicht weitergebracht, da ich die Lösung wahrscheinlich nicht mal erkenne, wenn ich sie gefunden habe.
Vielen Dank schon mal und Grüße aus dem Weserbergland - Ralf
-
on("hm-rpc.0.KEQ1234567.1.MOTION", function(obj) { if (obj.newState.val === true) { // falls schon eingeschaltet if (getState("hm-rpc.0.MEQ1234567.1.STATE").val) { // schalte aus setState("hm-rpc.0.MEQ1234567.1.STATE",false); // Timer für 2 sekunden setTimeout(function (){ // schalte an setState("hm-rpc.0.MEQ1234567.1.STATE",true); }, 2000); } else { // schalte sofort an setState('hm-rpc.0.MEQ1234567.1.ON_TIME', 2 ); setState("hm-rpc.0.MEQ1234567.1.STATE",true); } } });
-
Hallo Bluefox,
vielen Dank, das Script funktioniert nun prima.
-> setTimeout war die Lösung, die ich nicht erkannt hatte!
Damit nun der vorige Ladezustand wieder hergestellt wird, habe ich die erste Anweisung für die Einschaltdauer in Zeile 10 gelöscht.
Hintergrund: Das Display soll auch innerhalb des Zeitraums aufgeweckt werden, in dem das Tablet ohnehin geladen wird.
In der Zwischenzeit ist mir allerdings auch noch eine Alternative eingefallen, die ich aber auch noch nicht ganz umsetzen kann:
Schritt 1: aktuellen Stand des Schaltaktors abfragen und in einer Variable speichern
Schritt 2: Statur des Schaltaktors sofort = AUS
Schritt 2: Status des Schaltaktors nach einer Sekunde = EIN
Ergebnis: Das Display geht an.
Schritt 3: den Status des Schaltaktors wieder mit dem Wert der Variable aus Schritt 1 setzen.
Ergebnis: der alte Status quo ist wieder hergestellt.
Wäre das möglicherweise eine elegantere Lösung?
Kommt die CCU2 da auch mit, oder muss dem Schaltaktor Zeit gegeben werden, bis er die nächste Anweisung entgegen und ausführen kann?
Ralf
-
Hallo Ralf H.
@Ralf H.:In der Zwischenzeit ist mir allerdings auch noch eine Alternative eingefallen, die ich aber auch noch nicht ganz umsetzen kann: `
dann nutze lieber das Skript von Bluefox. Das ist kurz und gut und funktioniert. Hatte vor Monaten selbst so ein Skript laufen (bevor ich auf iPad mit Magnetcover umgestiegen bin).Da es analog zu ONTIME keinen Datenpunkt OFFTIME gibt, der für eine bestimmte Zeit einen Aktor ausschaltet, muss man eben so vorgehen. Variablen machen das komplizierter und soviel Code spart das in diesem Fall auch nicht.
geht aber auch so:
on("hm-rpc.0.KEQ1234567.1.MOTION", function(obj) { if (obj.newState.val === true) { // Aktorstatus in Variable schreiben var ur_status_aktor = getState("hm-rpc.0.MEQ1234567.1.STATE").val; // schalte sofort aus setState("hm-rpc.0.MEQ1234567.1.STATE",false); // Timer für 2 sekunden setTimeout(function (){ // schalte an setState("hm-rpc.0.MEQ1234567.1.STATE",true); }, 2000); setState("hm-rpc.0.MEQ1234567.1.STATE",ur_status_aktor); } });
Gruß
Pix
-
Hi Pix,
danke für die Hinweise und den Alternativcode.
Für mich ist dieses Austesten an einem eigentlich banalen Problem die beste Möglichkeit, die Möglichkeiten der Scripte zu verstehen.
Grüße Ralf
-
@pix:Da es analog zu ONTIME keinen Datenpunkt OFFTIME gibt, der für eine bestimmte Zeit einen Aktor ausschaltet, … `
Jetzt (seit 0.5.8) haben wir ja https://github.com/iobroker/ioBroker.javascript/blob/master/README.md#setstatedelayedVielen Dank an Bluefox.
Gruß,
Pix
-
Und das konnte man dann so umschreiben:
on("hm-rpc.0.KEQ1234567.1.MOTION", function(obj) { if (obj.newState.val === true) { // falls schon eingeschaltet if (getState("hm-rpc.0.MEQ1234567.1.STATE").val) { // schalte aus setState("hm-rpc.0.MEQ1234567.1.STATE",false); // Timer für 2 sekunden setStateDelayed("hm-rpc.0.MEQ1234567.1.STATE",true, 2000); } else { // schalte sofort an setState("hm-rpc.0.MEQ1234567.1.STATE",true); setStateDelayed("hm-rpc.0.MEQ1234567.1.STATE",false, 2000); } } });
-
Und das konnte man dann so umschreiben: `
… und hätte es dann (zumindest für mich) auch gleich noch lesbarer und verständlicher, soweit es die "Verwandschaft" zwischen setState und setStateDelayed betrifft.Mann dankt - Ralf