Zeitschaltuhr mit Zustandsautomaten

Begonnen von Topgun, 08 September 2017, 10:24:23

Vorheriges Thema - Nächstes Thema

Topgun

Hallo,
ich suche und experimentiere nun schon eine geraume Zeit, habe aber für folgendes Problem noch keine Lösung gefunden:

Ich möchte gerne eine Zeitschaltuhr mit Zustandsautomaten für die Treppenhausbeleuchtung wie folgt implementieren.

Ein Anschalten soll das Licht für 5 Minuten einschalten. Sollte innerhalb den 5 Minuten ein zweites mal an geschaltet werden, soll das Licht permanent an bleiben (bis man es wieder ausschaltet).


defmod di_test DOIF ([Teppenlicht_Dimmer:"on"] and [$SELF] eq "Aus") (set Teppenlicht_Dimmer 100 300)\
DOELSEIF ([Teppenlicht_Dimmer:"on"] and [$SELF] eq "Intervall") (set Teppenlicht_Dimmer 100)\
DOELSEIF ([Teppenlicht_Dimmer] eq "off") ()

attr di_test cmdState Intervall|Permanent|Aus


So wird der Status Intervall aber "übersprungen" und es schaltet direkt auf Permanent.

Als weitere Herausforderung kommt hinzu, dass ein Homematic-Dimmer nicht nur "on" und "off" kennt, sondern auch alle Zahlen zwischen 0 und 100.
Sprich der Teppenlicht_Dimmer kann auch ein Event "15" erzeugen, dann sollte der Zustandsautomaten immer noch funktionieren.

Ich hatte versucht auf das Event "nicht off" zu triggern, aber eine Regex mit "nicht", ist nicht so einfach.

Kann mir da jemand weiterhelfen?

Per

HM (und andere) Taster senden solange sie gedrückt werden. Manche senden noch ein "release", andere hören einfach auf.
Die einfachste Variante ist, wenn du einen Timer (wait) startest und erst nach (bspw) 5 Sekunden auswertest:

defmod di_test DOIF ([Teppenlicht_Dimmer:"on"] and [$SELF] eq "Aus") (set Teppenlicht_Dimmer 100 300) ()\
DOELSEIF ([Teppenlicht_Dimmer:"on"] and [$SELF] eq "Intervall") (set Teppenlicht_Dimmer 100)\
DOELSEIF ([Teppenlicht_Dimmer] eq "off") ()

attr di_test cmdState Wait,Intervall|Permanent|Aus
attr di_test wait 5,0:0:0

Wobei ich das "Permanent" durchaus noch begrenzen würde. Entweder mit einem [12:00] oder auf mit "set Teppenlicht_Dimmer 100 3600" oder ähnlich.

Zitat von: Topgun am 08 September 2017, 10:24:23Sprich der Teppenlicht_Dimmer kann auch ein Event "15" erzeugen, dann sollte der Zustandsautomaten immer noch funktionieren.
Nein, kann er nicht wirklich. Außer, du hast noch weitere Möglichkeiten, diesen zu beeinflussen und zeigst die uns nicht. Dann wundere dich aber später nicht über "komische" Effekte!

Aber als erste Variante kannst du

defmod di_test DOIF ([Teppenlicht_Dimmer] ne "off" and [?$SELF] eq "Aus") (set Teppenlicht_Dimmer 100 300) ()\
DOELSEIF ([Teppenlicht_Dimmer] ne "off" and [?$SELF] eq "Intervall") (set Teppenlicht_Dimmer 100)\
DOELSEIF ([Teppenlicht_Dimmer] eq "off") ()

attr di_test cmdState Wait,Intervall|Permanent|Aus
attr di_test wait 5,0:0:0

schreiben.

Topgun

Vielen Dank erst mal für das Beispiel.
So ganz funktioniert es aber nicht, da die 2. Bedingung ja sofort erfüllt ist (wenn die erste abgeschlossen ist). Somit springt er wieder über den ersten Status hinweg.

Mein Satz
ZitatSprich der Teppenlicht_Dimmer kann auch ein Event "15" erzeugen, dann sollte der Zustandsautomaten immer noch funktionieren.
muss ich etwas korrigieren.
Der Dimmer kann den State "15" haben, nicht das Event.

Prinzipiell denke ich es wäre besser bei Schaltaktionen das Event abzufragen als den State. Dann kann ein "Überspringen" nicht passieren, da das Event fehlen würde.