NEWS
Blockly: Präsenztimer
-
Hallo zusammen,
ich habe jetzt erstmals meinen Deconz adapter und meine Mqtt Geräte mit iobroker verbunden und die ersten Blocklys gebaut, aber derzeit komme ich nicht weiter, evtl kann mir jemand auf die Sprünge helfen.
Und zwar ich habe einen Bewegungsmelder in der Küche, dieser soll das Licht einschalten wenn sich jemand darin Befindet und nach 5 Minuten ausschalten wenn sich keiner darin befindet. Ich habe also einmal den Zustandswert des Bewegungsmelders den ich alle 60 Sekunden bekomme und einmal den Zustandswert der Lampe (An/Aus) über Mqtt.
Nachdem ich aber die Zustandswerte vom Bewegungsmelder nur alle 60 Sekunden bekomme springt er von "es ist jemand da" zu "es ist niemand da" hin und her und erfüllt somit die "Ausschaltprozedur" (rechts).
In der Praxis heißt das, das Licht geht kurz aus wenn sich jemand in der Küche befindet und gleich wieder an.
Jemand tipps wie ich das vermeiden kann? :mrgreen:
-
Beide Blöcke sind falsch. Beim ersten hast keine Bedingung angegeben "falls wahr". Ja was denn überhaupt. Im zweiten ist der interne Trigger ohne Funktion, weil da eine Fallsbedingung rein muss.
-
Ich habe Ähnliches wie folgt gelöst (gekürzte Version)…
Es wäre sogar noch kürzer möglich, z.B. ohne Gegenprüfung des aktuellen Schaltzustands und im "falls" bzw. "sonst falls" würde "Wert von Objekt ID - default" auch ausreichen.
:
-
@j Riemann
Ehrlich gesagt steige ich da nicht so ganz durch.
Nehmen wir an du verlässt die Küche und der Bewegungsmelder sagt da ist nichts mehr, jetzt fängt die Logik an zu laufen … Innerhalb dieser Zeit betrittst du wieder die Küche und der Bewegungsmelder sagt da ist doch jemand.
Wird dann der erste Wert der sich in der Logik befindet gelöscht? Sonst hast du doch auch eine kurze Zeit in der das Licht ausgeschaltet wird oder!?
-
Ganz einfach:
Der Präsenzmelder ändert seinen Status egal zu welchem Zustand (Bewegung/keine Bewegung).
Das ist der Trigger "Falls Objekt PIR - wurde geändert" der den Skriptdurchlauf startet.
Fall 1: Der PIR wechselt von "Bewegung erkannt" zu "keine Bewegung"
Das Skript startet und der blaue "prüfen-Block" wird abgearbeitet. Die Bedingung: "keine Bewegung erkannt" ist erfüllt und der "mache-Bolck" wird abgearbeitet. Hier steht übersetzt: Wenn der PIR "keine Bewgung" meldet starte eine Verzögerung (Timeout) von 5 Minuten nach der die Aktion innerhalb der Timeout-Klammer ausgeführt wird. Die Aufgabe lautet: Prüfe ob das Licht an ist und schalte es aus wenn es eingeschaltet ist.
Nun läuft quasi eine eine Ausschaltverzögerung von 5 Minuten nachdem der PIR "keine Bewegung" gemeldet hat.
Das Skript läuft weiter zum "sonst-falls-Block" und die Bedingung: "Bewegung erkannt" ist nicht erfüllt. Darum wird der "mache" Teil übersprungen und das Skript endet.
Fall 2: Der PIR wechselt von "keine Bewegung" zu "Bewegung erkannt"
Das Skript startet und der blaue "prüfen-Block" wird abgearbeitet. Die Bedingung: "keine Bewegung erkannt" ist nicht erfüllt und der "mache-Bolck" wird übersprungen. Weiter geht es im "sonst-falls-Block". Die Bedingung "Bewegung erkannt" ist jetzt erfüllt und der dazugehörige "mache-Block" wird abgearbeitet. Hier wird jetzt zuerst ein evtl. vorher gestarteter Timeout abgebrochen. Also wird ein evtl. durch das obere "falls" verzögert (Timeout) gesetzter Ausschaltbefehl gelöscht. Außerdem wird jetzt ein ausgeschaltetes Licht eingeschaltet.
-
Also ich habe jetzt auch mal ein Update erstellt und ich bin mir nicht sicher warum es nicht funktioniert (einschalten klappt wunderbar).
Ich habe irgendwie noch Logikfehler weil ich nicht weiß wie Blockly genau funktioniert.
Also meiner Meinung funktioniert das jetzt so:
Falls "Flurlicht An" springt er in die Ausschaltbedingung (unten) und da geht es eigentlich schon los, wann wird diese Bedingung abgerufen, die ganze Zeit? bei einer Änderung?
Naja auf jeden Fall geht es dann weiter, falls der Bewegungsmelder "false" ist wird der timeout getriggert, ist dieser abgelaufen wird überprüft ob das Flurlicht "true" ist, falls das zutrifft wird es ausgeschaltet.
Wenn der Bewegungsmelder "true" ist, wird überprüft ob das Licht "aus" ist, trifft dieses zu wird das Licht angeschaltet.
Wo liegt der fehler?
Oder was habe ich nicht verstanden?
5045_221321.jpg -
Der zweite Block ist etwas unlogisch. Der Trigger wird bei wahr aktiv und alls Bedingungen hast den selben DP intern noch mal auf wahr geprüft. Ändere mal den Trigger auf "wurde geändert" oder aktualisiert, denn so mach die weitere Abfrage wieder Sinn. Ob's dann läuft ist was anderes
-
Ja das hatte ich schon geändert auf "wurde geändert" macht aber keinen unterschied
-
Weil Dein Trigger Power ist und nur wenn sich da was ändert, dann wird der Inhalt dessen auch ausgeführt. Da Dein Bewegungsmelder im Trigger drin ist, kann der machen was er will ohne dass was passiert
Du musst da schon auf den Bewegungsmelder triggern.
-