Folgender Code zur Steuerung der Position von Jalousien (EnOcean) ist bei mir monatelang problemlos gelaufen:
define OG_AZ_Jalousien_SyncA DOIF ([OG_AZ_Jalousien:stateFSB12A] eq "opens") (setreading OG_AZ_Jalousien positionA 0, setreading OG_AZ_Jalousien stateFSB12A open) \
DOELSEIF ([OG_AZ_Jalousien:stateFSB12A] eq "closes") (setreading OG_AZ_Jalousien positionA 100, setreading OG_AZ_Jalousien stateFSB12A closed)
attr OG_AZ_Jalousien_SyncA do always
attr OG_AZ_Jalousien_SyncA wait 60:60
Heute habe ich (eher zufällig) bemerkt, dass dieser Code nicht mehr so funktioniert wie geplant. Obwohl das userReading "stateFSB12A" den Wert "stopped" hat (also weder die erste noch die zweite Bedingung erfüllt ist), wird eines der Kommandos ausgeführt. Ich habe noch nicht herausfinden können, seit wann das Verhalten geändert ist. Hat sich mit einem Update an der Funktionalität von DOIF etwas geändert? In der Referenz (commandref) habe ich keinen entsprechenden Hinweis finden können.
Zitat von: CountAlmasy am 11 Februar 2016, 09:43:22
Folgender Code zur Steuerung der Position von Jalousien (EnOcean) ist bei mir monatelang problemlos gelaufen:
define OG_AZ_Jalousien_SyncA DOIF ([OG_AZ_Jalousien:stateFSB12A] eq "opens") (setreading OG_AZ_Jalousien positionA 0, setreading OG_AZ_Jalousien stateFSB12A open) \
DOELSEIF ([OG_AZ_Jalousien:stateFSB12A] eq "closes") (setreading OG_AZ_Jalousien positionA 100, setreading OG_AZ_Jalousien stateFSB12A closed)
attr OG_AZ_Jalousien_SyncA do always
attr OG_AZ_Jalousien_SyncA wait 60:60
Heute habe ich (eher zufällig) bemerkt, dass dieser Code nicht mehr so funktioniert wie geplant. Obwohl das userReading "stateFSB12A" den Wert "stopped" hat (also weder die erste noch die zweite Bedingung erfüllt ist), wird eines der Kommandos ausgeführt. Ich habe noch nicht herausfinden können, seit wann das Verhalten geändert ist. Hat sich mit einem Update an der Funktionalität von DOIF etwas geändert? In der Referenz (commandref) habe ich keinen entsprechenden Hinweis finden können.
Poste mal list von diesem Modul.
Damian
Hier ist derOutput:
Internals:
DEF ([OG_AZ_Jalousien:stateFSB12A] eq "opens") (setreading OG_AZ_Jalousien positionA 0, setreading OG_AZ_Jalousien stateFSB12A open)
DOELSEIF ([OG_AZ_Jalousien:stateFSB12A] eq "closes") (setreading OG_AZ_Jalousien positionA 100, setreading OG_AZ_Jalousien stateFSB12A closed)
NAME OG_AZ_Jalousien_SyncA
NR 275
NTFY_ORDER 50-OG_AZ_Jalousien_SyncA
STATE cmd_1
TYPE DOIF
Readings:
2016-02-11 09:29:43 Device OG_AZ_Jalousien
2016-02-11 09:30:42 cmd_event OG_AZ_Jalousien
2016-02-11 09:30:42 cmd_nr 1
2016-02-11 09:29:43 e_OG_AZ_Jalousien_stateFSB12A stopped
2016-02-11 09:30:42 state cmd_1
2016-02-11 09:45:08 wait_timer no timer
Condition:
0 ReadingValDoIf('OG_AZ_Jalousien','stateFSB12A','',AttrVal($hash->{NAME},'notexist',undef)) eq "opens"
1 ReadingValDoIf('OG_AZ_Jalousien','stateFSB12A','',AttrVal($hash->{NAME},'notexist',undef)) eq "closes"
Devices:
0 OG_AZ_Jalousien
1 OG_AZ_Jalousien
all OG_AZ_Jalousien
Do:
0:
0 setreading OG_AZ_Jalousien positionA 0, setreading OG_AZ_Jalousien stateFSB12A open
1:
0 setreading OG_AZ_Jalousien positionA 100, setreading OG_AZ_Jalousien stateFSB12A closed
Helper:
globalinit 1
last_timer 0
sleeptimer -1
Itimer:
Readings:
0 OG_AZ_Jalousien:stateFSB12A
1 OG_AZ_Jalousien:stateFSB12A
all OG_AZ_Jalousien:stateFSB12A
Regexp:
All:
State:
Attributes:
do always
wait 60:60
Ich kann hier kein fehlerhaftes Verhalten erkennen:
um 09:29:43 Uhr gab es einen Trigger von OG_AZ_Jalousien_stateFSB12A
Daraufhin wurde ca. 60 Sekunden später um 09:30:42 cmd_1 geschaltet.
Es funktioniert hier alles wie programmiert.
Gruß
Damian
Hallo Damian,
ich fürchte, dass wir aneinander vorbeireden. Der Algorithmus sieht vor, dass cmd_1 ausgeführt werden soll, wenn das userReading "stateFSB12A" den Wert "opens" hat, und dass cmd_2 ausgeführt werden soll, wenn das userReading den Wert "closes" hat. Tatsächlich hat das userReading aber den Wert "stopped", so dass weder cmd_1 noch cmd_2 ausgeführt werden sollte. So verhielt sich diese Anweisung auch, als ich das vor vielen Monaten konfiguriert habe.
Wie sollte ich das oben beschriebene Verhalten denn in der "neuen" Version alternativ umsetzen?
Zitat von: CountAlmasy am 11 Februar 2016, 20:02:57
Hallo Damian,
ich fürchte, dass wir aneinander vorbeireden. Der Algorithmus sieht vor, dass cmd_1 ausgeführt werden soll, wenn das userReading "stateFSB12A" den Wert "opens" hat, und dass cmd_2 ausgeführt werden soll, wenn das userReading den Wert "closes" hat. Tatsächlich hat das userReading aber den Wert "stopped", so dass weder cmd_1 noch cmd_2 ausgeführt werden sollte. So verhielt sich diese Anweisung auch, als ich das vor vielen Monaten konfiguriert habe.
Wie sollte ich das oben beschriebene Verhalten denn in der "neuen" Version alternativ umsetzen?
Ok, du hast recht. Die neue Version muss sich an der Stelle genauso verhalten wie die alte.
Die Auswertung wird von Perl vorgenommen und das sollte sich gleich verhalten.
Benutzt du Aliasnamen?
Teste mal ohne wait, dann mal mit einem Dummy, bis man die Ursache eingekreist hat.
Ich bin mir relativ sicher, dass eine Sekunde vor "stopped" "opens" kam. Das könntest du mit Logging der Ereignisse sehen.
Du kannst z. B. bei dir ergänzen:
({Log 3,"Ereignisse von $DEVICE: $EVENTS"},setreading OG_AZ_Jalousien positionA 0, setreading OG_AZ_Jalousien stateFSB12A open)
Moin,
ich glaube mein Problem passt auch hier her.
Ich benutze DOIF um mir Meldungen zu schicken wenn das Fenster offen ist.
Es kommen 3 Nachrichten alle 10 Minuten. Die erste aber erst nach 5 Minuten.
Wenn ich nun innerhalb dieses Zeitraum das Fenster wieder schließe werden trotzdem die restlichen Nachrichten verschickt.
list nach dem Öffnen:
Internals:
CFGFN
DEF (["Fensterkontakt$:open"] and [?Heizungmodus] eq "Winter")
({PushMassage("Fhem","$DEVICE ist offen","",0,"")})
DOELSE
()
NAME doif_Ueberwachung_Fensterkontakt
NR 308
NTFY_ORDER 50-doif_Ueberwachung_Fensterkontakt
STATE initialized
TYPE DOIF
Helper:
Dblog:
Cmd_count:
Dblog:
TIME 1455268054.01556
VALUE 1
Cmd_event:
Dblog:
TIME 1455268054.51926
VALUE 2_03_SZ_Fensterkontakt
Cmd_nr:
Dblog:
TIME 1455268054.51926
VALUE 1
Cmd_seqnr:
Dblog:
TIME 1455268054.51926
VALUE 2
Error:
Dblog:
TIME 1455268054.51926
VALUE {EximMail("peterpan\@web.de", "FHEM Überwachung: 2_03_SZ_Fensterkontakt", "Fenster ist offen")}: -1
State:
Dblog:
TIME 1455268264.03589
VALUE initialized
Wait_timer:
Dblog:
TIME 1455268358.61317
VALUE 12.02.2016 10:17:38 cmd_1 2_03_SZ_Fensterkontakt
Readings:
2016-02-12 10:12:38 Device 2_03_SZ_Fensterkontakt
2016-02-12 10:12:38 matched_event_c1_1 contact: open (to VCCU)
2016-02-12 10:11:04 state initialized
2016-02-12 10:12:38 wait_timer 12.02.2016 10:17:38 cmd_1 2_03_SZ_Fensterkontakt
Condition:
0 EventDoIf('Fensterkontakt$',$hash,'open',0) and InternalDoIf('Heizungmodus','STATE','',AttrVal($hash->{NAME},'notexist',undef)) eq "Winter"
Devices:
Do:
0:
0 {PushMassage("Fhem","$DEVICE ist offen","",0,"")}
1:
0
Helper:
event contact: open (to VCCU)
globalinit 1
last_timer 0
sleepdevice 2_03_SZ_Fensterkontakt
sleepsubtimer 0
sleeptimer 0
timerdev 2_03_SZ_Fensterkontakt
timerevent contact: open (to VCCU)
triggerDev 2_03_SZ_Fensterkontakt
timerevents:
battery: ok
contact: open (to VCCU)
open
trigDst_VCCU: noConfig
trigger_cnt: 84
triggerEvents:
battery: ok
contact: open (to VCCU)
open
trigDst_VCCU: noConfig
trigger_cnt: 84
Internals:
0 Heizungmodus:STATE
all Heizungmodus:STATE
Itimer:
Readings:
Regexp:
0:
0 Fensterkontakt$:open
All:
0 Fensterkontakt$:open
State:
Trigger:
Attributes:
do always
group Überwachung
loglevel 6
repeatcmd 600
repeatsame 3
room 9_09_Einstellungen
wait 300
list nach dem Senden der ersten Nachricht:
Internals:
CFGFN
DEF (["Fensterkontakt$:open"] and [?Heizungmodus] eq "Winter")
({PushMassage("Fhem","$DEVICE ist offen","",0,"")})
DOELSE
()
NAME doif_Ueberwachung_Fensterkontakt
NR 308
NTFY_ORDER 50-doif_Ueberwachung_Fensterkontakt
STATE cmd_1
TYPE DOIF
Helper:
Dblog:
Cmd_count:
Dblog:
TIME 1455268659.15706
VALUE 1
Cmd_event:
Dblog:
TIME 1455268659.21851
VALUE 2_03_SZ_Fensterkontakt
Cmd_nr:
Dblog:
TIME 1455268659.21851
VALUE 1
Cmd_seqnr:
Dblog:
TIME 1455268054.51926
VALUE 2
Error:
Dblog:
TIME 1455268054.51926
VALUE {EximMail("peterpan\@web.de", "FHEM Überwachung: 2_03_SZ_Fensterkontakt", "Fenster ist offen")}: -1
State:
Dblog:
TIME 1455268659.21851
VALUE cmd_1
Wait_timer:
Dblog:
TIME 1455268659.25232
VALUE 12.02.2016 10:27:39 cmd_1 2_03_SZ_Fensterkontakt
Readings:
2016-02-12 10:12:38 Device 2_03_SZ_Fensterkontakt
2016-02-12 10:17:39 cmd_count 1
2016-02-12 10:17:39 cmd_event 2_03_SZ_Fensterkontakt
2016-02-12 10:17:39 cmd_nr 1
2016-02-12 10:12:38 matched_event_c1_1 contact: open (to VCCU)
2016-02-12 10:17:39 state cmd_1
2016-02-12 10:17:39 wait_timer 12.02.2016 10:27:39 cmd_1 2_03_SZ_Fensterkontakt
Condition:
0 EventDoIf('Fensterkontakt$',$hash,'open',0) and InternalDoIf('Heizungmodus','STATE','',AttrVal($hash->{NAME},'notexist',undef)) eq "Winter"
Devices:
Do:
0:
0 {PushMassage("Fhem","$DEVICE ist offen","",0,"")}
1:
0
Helper:
event contact: open (to VCCU)
globalinit 1
last_timer 0
sleepdevice 2_03_SZ_Fensterkontakt
sleepsubtimer 0
sleeptimer 0
timerdev 2_03_SZ_Fensterkontakt
timerevent contact: open (to VCCU)
triggerDev 2_03_SZ_Fensterkontakt
timerevents:
battery: ok
contact: open (to VCCU)
open
trigDst_VCCU: noConfig
trigger_cnt: 84
triggerEvents:
battery: ok
contact: open (to VCCU)
open
trigDst_VCCU: noConfig
trigger_cnt: 84
Internals:
0 Heizungmodus:STATE
all Heizungmodus:STATE
Itimer:
Readings:
Regexp:
0:
0 Fensterkontakt$:open
All:
0 Fensterkontakt$:open
State:
Trigger:
Attributes:
do always
group Überwachung
loglevel 6
repeatcmd 600
repeatsame 3
room 9_09_Einstellungen
wait 300
list nach dem Schließen des Fensters. Keine Änderung zum vorherigen.
Internals:
CFGFN
DEF (["Fensterkontakt$:open"] and [?Heizungmodus] eq "Winter")
({PushMassage("Fhem","$DEVICE ist offen","",0,"")})
DOELSE
()
NAME doif_Ueberwachung_Fensterkontakt
NR 308
NTFY_ORDER 50-doif_Ueberwachung_Fensterkontakt
STATE cmd_1
TYPE DOIF
Helper:
Dblog:
Cmd_count:
Dblog:
TIME 1455268659.15706
VALUE 1
Cmd_event:
Dblog:
TIME 1455268659.21851
VALUE 2_03_SZ_Fensterkontakt
Cmd_nr:
Dblog:
TIME 1455268659.21851
VALUE 1
Cmd_seqnr:
Dblog:
TIME 1455268054.51926
VALUE 2
Error:
Dblog:
TIME 1455268054.51926
VALUE {EximMail("peterpan\@web.de", "FHEM Überwachung: 2_03_SZ_Fensterkontakt", "Fenster ist offen")}: -1
State:
Dblog:
TIME 1455268659.21851
VALUE cmd_1
Wait_timer:
Dblog:
TIME 1455268659.25232
VALUE 12.02.2016 10:27:39 cmd_1 2_03_SZ_Fensterkontakt
Readings:
2016-02-12 10:12:38 Device 2_03_SZ_Fensterkontakt
2016-02-12 10:17:39 cmd_count 1
2016-02-12 10:17:39 cmd_event 2_03_SZ_Fensterkontakt
2016-02-12 10:17:39 cmd_nr 1
2016-02-12 10:12:38 matched_event_c1_1 contact: open (to VCCU)
2016-02-12 10:17:39 state cmd_1
2016-02-12 10:17:39 wait_timer 12.02.2016 10:27:39 cmd_1 2_03_SZ_Fensterkontakt
Condition:
0 EventDoIf('Fensterkontakt$',$hash,'open',0) and InternalDoIf('Heizungmodus','STATE','',AttrVal($hash->{NAME},'notexist',undef)) eq "Winter"
Devices:
Do:
0:
0 {PushMassage("Fhem","$DEVICE ist offen","",0,"")}
1:
0
Helper:
event contact: open (to VCCU)
globalinit 1
last_timer 0
sleepdevice 2_03_SZ_Fensterkontakt
sleepsubtimer 0
sleeptimer 0
timerdev 2_03_SZ_Fensterkontakt
timerevent contact: open (to VCCU)
triggerDev 2_03_SZ_Fensterkontakt
timerevents:
battery: ok
contact: open (to VCCU)
open
trigDst_VCCU: noConfig
trigger_cnt: 84
triggerEvents:
battery: ok
contact: open (to VCCU)
open
trigDst_VCCU: noConfig
trigger_cnt: 84
Internals:
0 Heizungmodus:STATE
all Heizungmodus:STATE
Itimer:
Readings:
Regexp:
0:
0 Fensterkontakt$:open
All:
0 Fensterkontakt$:open
State:
Trigger:
Attributes:
do always
group Überwachung
loglevel 6
repeatcmd 600
repeatsame 3
room 9_09_Einstellungen
wait 300
list vom Fensterkontakt:
Internals:
...
HMLAN1_TIME 2016-02-12 10:19:40
IODev HMLAN1
LASTInputDev HMLAN1
MSGCNT 16
NAME 2_03_SZ_Fensterkontakt
NR 81
NTFY_ORDER 50-2_03_SZ_Fensterkontakt
STATE closed
TYPE CUL_HM
lastMsg No:F2 - t:41 s:2AD870 d:23A38D 015500
peerList 2_03_SZ_Heizungsthermostat_WindowRec,
protLastRcv 2016-02-12 10:19:40
protSnd 8 last_at:2016-02-12 10:19:40
protState CMDs_done
...
list nach dem Senden der zweiten Nachricht obwohl das Fenster schon geschlossen ist:
Internals:
CFGFN
DEF (["Fensterkontakt$:open"] and [?Heizungmodus] eq "Winter")
({PushMassage("Fhem","$DEVICE ist offen","",0,"")})
DOELSE
()
NAME doif_Ueberwachung_Fensterkontakt
NR 308
NTFY_ORDER 50-doif_Ueberwachung_Fensterkontakt
STATE cmd_1
TYPE DOIF
Helper:
Dblog:
Cmd_count:
Dblog:
TIME 1455269259.27562
VALUE 2
Cmd_event:
Dblog:
TIME 1455269259.32628
VALUE 2_03_SZ_Fensterkontakt
Cmd_nr:
Dblog:
TIME 1455269259.32628
VALUE 1
Cmd_seqnr:
Dblog:
TIME 1455268054.51926
VALUE 2
Error:
Dblog:
TIME 1455268054.51926
VALUE {EximMail("peterpan\@web.de", "doif FHEM Überwachung: 2_03_SZ_Fensterkontakt", "Fenster ist offen")}: -1
State:
Dblog:
TIME 1455269259.32628
VALUE cmd_1
Wait_timer:
Dblog:
TIME 1455269259.35794
VALUE 12.02.2016 10:37:39 cmd_1 2_03_SZ_Fensterkontakt
Readings:
2016-02-12 10:12:38 Device 2_03_SZ_Fensterkontakt
2016-02-12 10:27:39 cmd_count 2
2016-02-12 10:27:39 cmd_event 2_03_SZ_Fensterkontakt
2016-02-12 10:27:39 cmd_nr 1
2016-02-12 10:12:38 matched_event_c1_1 contact: open (to VCCU)
2016-02-12 10:27:39 state cmd_1
2016-02-12 10:27:39 wait_timer 12.02.2016 10:37:39 cmd_1 2_03_SZ_Fensterkontakt
Condition:
0 EventDoIf('Fensterkontakt$',$hash,'open',0) and InternalDoIf('Heizungmodus','STATE','',AttrVal($hash->{NAME},'notexist',undef)) eq "Winter"
Devices:
Do:
0:
0 {PushMassage("Fhem","$DEVICE ist offen","",0,"")}
1:
0
Helper:
event contact: open (to VCCU)
globalinit 1
last_timer 0
sleepdevice 2_03_SZ_Fensterkontakt
sleepsubtimer 0
sleeptimer 0
timerdev 2_03_SZ_Fensterkontakt
timerevent contact: open (to VCCU)
triggerDev 2_03_SZ_Fensterkontakt
timerevents:
battery: ok
contact: open (to VCCU)
open
trigDst_VCCU: noConfig
trigger_cnt: 84
triggerEvents:
battery: ok
contact: open (to VCCU)
open
trigDst_VCCU: noConfig
trigger_cnt: 84
Internals:
0 Heizungmodus:STATE
all Heizungmodus:STATE
Itimer:
Readings:
Regexp:
0:
0 Fensterkontakt$:open
All:
0 Fensterkontakt$:open
State:
Trigger:
Attributes:
do always
group Überwachung
loglevel 6
repeatcmd 600
repeatsame 3
room 9_09_Einstellungen
wait 300
Die dritte Meldung kommt dann auch noch.
Das Problem besteht nicht wenn ich anstatt Device-Regex direkt auf das Device prüfe.
Zitat von: Damian am 12 Februar 2016, 08:10:39
Ich bin mir relativ sicher, dass eine Sekunde vor "stopped" "opens" kam. Das könntest du mit Logging der Ereignisse sehen.
Hallo Damian,
ja, das kann ich Dir sogar ohne Log bestätigen. Aber DOIF sollte ja den letzten Status auswerten, also "stopped". Wäre es möglich, dass stattdessen der vorherige Status "opens" von DOIF ausgewertet wird? Das war früher definitiv nicht der Fall (und sollte meines Erachtens auch nicht so sein). Ich werde am Wochenende mal ein wenig debuggen und versuchen, die Ursache für das geänderte Verhalten zu finden.
Zum Hintergrund:
Ich möchte mit dem DOIF die Stellung der Jalousien setzen. Wenn innerhalb der Motorlaufzeit der Jalousie der Schalter erneut gedrückt wird (zumeist nach einer Sekunde, um die Neigung der Lamellen zu ändern), setzt eine von mir geschriebene Perl-Funktion den Status (stateFSB12A) auf "stopped" und wertet aufgrund der Zeit seit dem letzten Tastendruck die Position aus. Mit der DOIF-Anweisung prüfe ich am Ende der Motorlaufzeit, ob
keine Taste gedrückt wurde und setze die Position dann entweder auf 0 (offen) oder auf 100 (geschlossen). Aktuell wird aber immer ein Kommando ausgeführt, auch wenn ich eine Taste gedrückt habe und der Status auf "stopped" steht.
Zitat von: CountAlmasy am 12 Februar 2016, 13:02:38
Hallo Damian,
ja, das kann ich Dir sogar ohne Log bestätigen. Aber DOIF sollte ja den letzten Status auswerten, also "stopped". Wäre es möglich, dass stattdessen der vorherige Status "opens" von DOIF ausgewertet wird? Das war früher definitiv nicht der Fall (und sollte meines Erachtens auch nicht so sein). Ich werde am Wochenende mal ein wenig debuggen und versuchen, die Ursache für das geänderte Verhalten zu finden.
"stopped" wird ja auch ausgewertet, dafür hast du aber keinen Zweig definiert, deswegen passiert nichts.
Du hast mehrere Möglichkeiten. Wenn du do always weglässt wird automatisch bei "stopped" in einen nicht angegeben Sonst-Fall hier cmd_3 geschaltet und die geplante Ausführung von cmd_1 wegen wait unterbrochen.
Wenn du dieses Verhalten auch bei do always erreichen willst (das war tatsächlich mal eine Änderung vor einigen Monaten), dann musst du am Ende einfach DOELSE ohne weitere Angaben dran hängen.
Gruß
Damian
Hallo Damian,
ich hatte bereits versucht, "do always" auszukommentieren, bevor ich den Thread eröffnet habe. Das hatte aber nichts bewirkt. Ich habe es nach Deiner Antwort noch einmal probiert. Aber diese Variante funktioniert leider nicht.
Die Variante mit DOELSE funktioniert aber! Vielen Dank für diesen Hinweis! Ich werde jetzt meine mehr als 30 DOIF-Anweisungen daraufhin überprüfen, ob sie angepasst werden müssen :(
Ich werde mir aber für die Zukunft überlegen, ob ich seltener Updates durchführen und dafür nach jedem Update einige Tests einbauen werde. Die Geschwindigkeit, mit der sich FHEM weiterentwickelt, stellt eine gewisse Herausforderung für die Kontinuität und Stabilität eines laufenden Systems dar.
Meine Familie ist leider nicht so begeistert von der Idee, dass ich noch mehr Zeit für FHEM aufwende ;)
Hallo Damian,
eine Idee zu meinem Post?
http://forum.fhem.de/index.php/topic,49148.msg408556.html#msg408556 (http://forum.fhem.de/index.php/topic,49148.msg408556.html#msg408556)
Oder geht das mit der neuen Version einfach nicht.
Vielen Dank.
Gruß Daniel