NEWS
Bewegungsmelder Skript für Raum mit schaltbarem Licht
-
Hi Leute,
Ich habe folgendes im Sinn:
Im Wohnzimmer befinden sich ein paar Hue Leuchten und ein Motion Sensor. Die Lichter können wie gewohnt geschaltet werden.
Ab Sonnenuntergang soll folgendes passieren:Skript #1
Anwendungsfall: Es ist dunkel, man betritt den Raum, schalte das Licht einDer Bewegungssensor soll die Nachtlicht Szene schalten, sofern:
- Bewegung erkannt
- Keine Lampe an ist
- Astro zwischen Untergang und Aufgang
Nach 5 Minuten soll er das Licht wieder ausschalten, aber nur sofern man das Licht nicht zwischenzeitig schon angeschaltet hat
Skript #2
Anwendungsfall: Man befindet sich im Wohnzimmer und schaltet das Licht aus, nun soll automatisch und ohne Bewegunserkennung noch 5 Minuten das Nachtlicht an bleibenSchalte Nachtlicht Szene ein falls:
- Astro zwischen Untergang und Aufgang
- Licht wurde ausgeschaltet
Dadurch dass Skript #1 ja am Ende das "Licht ausschaltet" würde hier erstmal Skript #2 gestartet werden (nachtlicht)
Damit Skript #2 nur startet wenn händisch das Licht ausgeschaltet wird, habe ich einen Datenpunkt Wohnzimmer_Nachtlicht_aktiv angelegt. Sofern dieser true ist und das licht ausgeschaltet wird, soll nicht wieder das Nachtlicht aktiviert werden
Erste Testversuche zeigen, dass das Script soweit funktioniert, allerdings hatte ich heute früh scheinbar einen infinite loop im iobroker, den ich nur durch
iobroker del javascript
deaktivieren konnte.Eine mögliche Fehlerquelle ist natürlich das Polling des Hue Adapters, welches ich derzeit auf 10 Sekunden gestellt habe.
Daher meine Frage, seht ihr hier Optimierungsbedarf, kann man hier ggf. vereinfachen?
Anbei mein derzeitiges Blockly Script.Vielen Dank für euren Input!
-
Optimierungsvorschläge:
- Skript
- vor den "Ausführen lichtAusschalten2" Baustein noch ein stop lichtAusschalten2.
- An Stelle von "pause 15 sek" beim "Steuere Wohnzimmer_Nachtlicht_aktiv" die Einstellungen "Mit Verzögerung 15 Sekunden" und "löschen falls läuft" aktivieren
- Skript:
- Im Bereich "System" gibt es zwischen den "falls Objekt" Bausteinen einen der mit"Objekt ID" vordefiniert ist. Dieser Baustein kann auf "wert" umgestellt werden und innerhalb des Triggers den Baustein "wert vom Objekt ID Motion Sensor presence" ersetzen.
- Alternativ dazu kann statt auf "wurde geändert" auf "ist grösser als vorher" getriggert werden, dann kann im Falls die Abfrage "wert vom Objekt ID Motion Sensor presence = wahr" entfallen. (in JS gilt: Wahr > Falsch)
In beiden Skripten fragst Du mehrfach den "wert vom Objekt ID Wohnzimmer.level" ab. Ich würde das generell so lösen:
- eine Variable "RaumHelligkeit" anlegen
- ein "Falls Objekt ID Wohnzimmer.level" wurde geändert machen, darin ein "setze RaumHelligkeit auf wert" (den Baustein im 1. Vorschlag am 2. Skript) nutzen
- In beiden Skriptteilen jedes auftreten von wert vom "Objekt ID Wohnzimmer.level" durch "RaumHelligkeit" ersetzen
A.
-
Hey Asgothian,
danke für deine Anregungen.@asgothian said in Bewegungsmelder Skript für Raum mit schaltbarem Licht:
An Stelle von "pause 15 sek" beim "Steuere Wohnzimmer_Nachtlicht_aktiv" die Einstellungen "Mit Verzögerung 15 Sekunden" und "löschen falls läuft" aktivieren
Was bedeutet die Checkbox "löschen falls läuft"?
eine Variable "RaumHelligkeit" anlegen
ein "Falls Objekt ID Wohnzimmer.level" wurde geändert machen, darin ein "setze RaumHelligkeit auf wert" (den Baustein im 1. Vorschlag am 2. Skript) nutzen
In beiden Skriptteilen jedes auftreten von wert vom "Objekt ID Wohnzimmer.level" durch "RaumHelligkeit" ersetzenAlso ein separater Block mit einem trigger auf
Wohnzimmer.level
?
Ich sehe hier eine race condition, dass das Skript 1 oder 2 durchläuft bevor der callback dieses event triggers die lokale variable angepasst hat, oder habe ich einen Verständnisfehler?Ich habe das Timeout fürs zurücksetzen der
Wohnzimmer_Nachtlicht_aktiv
variable nun auf 20 sekunden gesetzt.Irgendwo scheint noch ein Wurm im Skript zu sein, da ich eben wieder ein CPU 100% problem hatte..
-
@benda sagte: seht ihr hier Optimierungsbedarf, kann man hier ggf. vereinfachen?
Gleiche Abfragen (nachts) und Abläufe packt man in eine Funktion. Dann benötigt man auch nur einen Ausschalt-Timeout.
-
@benda sagte:
wieder ein CPU 100% problem hatte..
Der Trigger "Wohnzimmer.anyOn" mit "ist unwahr" wird anscheinend indirekt vom Script selbst ausgelöst und erzeugt so eine Endlosschleife. Ändere den Trigger auf "ist kleiner als letztes".
Besser: Packe beides in ein Script, verwende anstelle des Datenpunktes "Wohnzimmer_Nachtlicht_aktiv" eine Variable und nimm für den gemeinsamen Teil eine Funktion.
EDIT: Etwa so:
-
Vielen Dank für eure Anregungen, hab einiges gelernt
Das Script funktioniert nun auch super, ich werde meine finale Version nochmal zur Referenz posten.Tatsächlich kam die Endlosschleife durch ein anderes Script zu Stande, welches auf diverse Alexa Routinen triggert (mit ist wahr). Diese Trigger gingen aber scheinbar auch so los, da die Alexa Routinen auf True blieben..
Ich denke ein Trigger mit
>
oder<
oder wurde geändert gefolgt von einemfalls
mit Wertüberprüfung ist die sichere Variante -
@benda und finale Version. thx