NEWS
Wie lasse ich eine if Bedingung regelmäßig prüfen?
-
Hallo,
ich arbeite mich gerade etwas in Javascript ja, klappt schon einiges ganz gut. Nun habe ich aber mal eine Frage.
Über den on Befehl oder Zeiten setze ich Variablen. Diese möchte ich am Ende mit einem if Befehl auf den KNX Bus schreiben. Das Problem was ich habe, das Script läuft beim starten einmal durch. Die on Befehle werden ja weiterhin getriggert, ebenso die Zeiten. Jedoch wird der if Befehl nicht mehr ausgeführt. Wir ändere ich das, das der if Befehl ausgeführt wird wenn sich eine Bedingungsvariable ändert? Wäre klassen wenn mich da jemand auf den richtigen Weg bringen kann.
var Aussenlicht_Freigabe = false; var Aussentaster = false; on({id: "knx.0.Beleuchtungssteuerung_EG.Außen.Schalter_Garten_Pfosten"/*Schalter Garten Pfosten*/}, function (obj) { Aussentaster = true; log("Taster Außenbeleuchtung gedrückt Timer gestartet"); }); on({id: "knx.0.Beleuchtungssteuerung_EG.Außen.Schalter_Garten_Pfosten"/*Schalter Garten Pfosten*/}, function (obj) { setTimeout(Aussentaster = false, 300000); setTimeout(log("Taster Außenbeleuchtung abgelaufen",300000)); }); schedule({astro: "sunset", shift: 0}, function () { log("Sonnenuntergang Aussenlicht_Freigabe AN"); Aussenlicht_Freigabe = true; }); schedule("00 23 * * 1-5", function () { log("Werktags 23 Uhr Aussenlicht_Freigabe AUS"); Aussenlicht_Freigabe = false; }); schedule("00 23 * * 6-7", function () { log("Wochenende 23 Uhr Aussenlicht_Freigabe AUS"); Aussenlicht_Freigabe = false; }); schedule("00 5 * * 1-5", function () { log("Werktags 5 Uhr Aussenlicht_Freigabe EIN"); Aussenlicht_Freigabe = true; }); schedule("00 7 * * 6-7", function () { log("Wochenende 7 Uhr Aussenlicht_Freigabe EIN"); Aussenlicht_Freigabe = true; }); schedule("00 9 * * 1-5", function () { log("Werktags 9 Uhr Aussenlicht_Freigabe AUS"); Aussenlicht_Freigabe = false; }); schedule("00 10 * * 6-7", function () { log("Wochenende 10 Uhr Aussenlicht_Freigabe AUS"); Aussenlicht_Freigabe = false; }); if (isAstroDay () && Aussenlicht_Freigabe || Aussentaster) { setState("knx.0.Beleuchtungssteuerung_EG.Außen.Außenbeleuchtung_Tür_Schalten",true); log("Außenlicht wurde eingeschaltet"); } else { setState("knx.0.Beleuchtungssteuerung_EG.Außen.Außenbeleuchtung_Tür_Schalten",false); log("Außenlicht wurde ausgeschaltet"); }
-
Entweder du packst die if-Abfrage in eine eigene Funktion, die du jedesmal aufrufst, wenn du deine Skriptvariablen änderst, und 1x zu Beginn des Skripts.
Oder du ersetzt deine Skriptvariablen durch States (Datenpunkte) in ioBroker, die du per setState(…) / getState(...) schreibst und ausliest. Dann kannst du die if-Abfrage in einen on(...)-Block wie oben packen, der immer aufgerufen wird, wenn sich die Zustände geändert haben.
Übrigens:
setTimeout(Aussentaster = false, 300000);
setzt den Wert von Aussentaster sofort auf false
setTimeout(function() {Aussentaster = false}, 300000);
erst nach 300s.
-
Vielen Dank für den Hinweis und die Ideen
Dann werde ich die if Anweisung in eine Funktion legen und sie im oberen Bereich immer mit hineinschreiben.
-
Vielen Dank, hat alles super geklappt. Für die Umstellung von EibPC auf ioBroker hätte ich noch eine Frage. Ich habe einige Timer die das Radio ausschalten wenn keine Bewegung mehr im Raum ist. Also: wenn bewegung=false starte timer 30s danach schalte radio aus. Wenn nun zwischenzeitlich wieder eine Bewegung registriert wird breche Timer ab bis Bewegung wieder false. Wie setzt ich soetwas um?
-
Nur ein kleiner Tipp:
Ich verwende für gleiche/ähnliche Beispiele meine 'StateMachine', ein Javascript Programm mit welchem mann einfach State-Machines und sonstige Befehle abarbeiten kann.
Einen ersten Versuch einer Beschreibung gibt es da: http://forum.iobroker.net/viewtopic.php … atemachine
Eine StateMachiene für das Radio könnte so ausschauen:
const Machines = { RadioLichtBad: { _all: { timer: ["BewegungsmelderBad~+", "LichtschalterBad~+"], aus: "LichtschalterBad~-" }, aus: { _onEnter: ["radioBad-", "lichtBad-"], _onExit: ["radioBad+", "lichtBad+"], _default:true }, timer: { _timeout: "aus:30000" } } }
Sie reagiert auf Schalter oder Bewegung und schaltet Radio und Licht.
Das könnte man erweitern um das Licht natürlich nur bei Dunkelheit zu schalten
Die ~ bedeutet bei Änderung und +- ein(+)/aus(-).
Die Maschine hat 2 States: aus und timer. bei allen states wird '_all:' abgefragt was bedeutet dass beim Einschalten oder bei Bewegung die Maschine auf timer geht und beim ausschalten auf aus.
timer selbst geht nach 30 Sekunden auf aus.
aus schaltet Lich und Radio ein oder aus je nachdem…
Habe so etliche Steuerungen, auch mit Zeiten und lichtabhängig realisiert.
p.s.: Irgendwann werd ich das in einen Adapter packen -- wenn BlueFox mir zeigt wie ich den Javascript-Adapter dafür ergänzen oder adaptieren kann....