NEWS
(Gelöst) Warten des Triggers auf anderes Objekt
-
Hallo zusammen,
ich bin neu im IO-Broker und versuche nun meine Rolläden/Fenster-Kombinationen (Velux, angebunden über KLF200) ans Laufen zu kriegen. Dabei habe ich folgendes Problem:
Fall ein Fenster öffnen Befehl kommt, soll er zuerst prüfen, ob der Rolladen weiter an 50% geöffnet ist. Denn sonst scheppert das Fenstern in den Rolladen hinein. Leider bekomme ich die Logik in Blocky nicht hin.
mit dieser Logik fährt er erst das Fenster durch und danach erst den Rolladen.Folgende Anlternative habe ich auch probiert:
Aber dann geht das Script in die Todesschleife, weil sich die Änderungsbefehle gegenseitig triggern.Wie bekomme ich es also hin, das der eigentliche Trigger (targetPosition des Fensters) auf die Ausführung des Rolladenchecks und ggf. Korrektur wartet?
Vielen Dank!
Stefan
Die Lösung war mit Blocky nicht zu erreichen, im JS über die richtigen Callbacks gar nicht so schwer.
Die Schwierigkeit war lediglich, dass der Callback nicht beim Abschluss der physischen Aktion, sondern beim erfolgreichen Funktionsaufruf erfolgt. Daher habe ich die Statuswerte der KLF200 als eigentliche Bedingung für die fertige Bewegung des Rolladens verwendet. Hier mein finaler Code:/* Prüfe, ob Fenster weiter als bisher geöffnet werden soll*/ on({ id: 'klf200.0.products.1.targetPosition'/*Position Fenster*/, change: "gt", ack: false }, async function (obj) { var valueFenster = obj.state.val; var oldValueFenster = obj.oldState.val; /* Prüfe, ob Rolle weiter als 50% geöffnet ist*/ if (getState("klf200.0.products.0.currentPosition").val > 50) { /* Fenster anhalten */ setState('klf200.0.products.1.stop'/*stop*/, true); /* Rolle auf 50% zurückfahren, dann kann das Fenster gefahrlos geöffnet werden */ setState('klf200.0.products.0.targetPosition', 50, false, function () { /* Callback: Trigger, wenn Rolloänderung fertig (Status 5) */ on({ id: 'klf200.0.products.0.state'/*state*/, val: 5, ack: true }, async function (obj) { var valueRollo = obj.state.val; var oldValueRollo = obj.oldState.val; /* Wenn Trigger erfüllt, Fenster auf ursprünglich gewünste Position öffnen */ setState('klf200.0.products.1.targetPosition', valueFenster, false, function () { /* Trigger auf Rolladenstatus abmelden*/ unsubscribe('klf200.0.products.0.state') }); }) }) }; });
-
@StefanS
Zuerst solltest Du den Datenpunkten eindeutige Namen geben, da so das Blockly nicht lesbar ist. -
@StefanS sagte:
auf die Ausführung des Rolladenchecks und ggf. Korrektur wartet?
Triggere zusätzlich auf die Ist-Position des Rollos. Vorschlag: