Hallo,
ich habe leider nix passendes gefunden, bzw. ich kriege das mit meinen flachen Kenntnissen nicht hin.
Hoffentlich nutze ich das Forum richtig.
Folgender Aufbau:
2 einzeln schaltbare Leuchten (L1 und L2)
ein Doppeltaster (433mhz) an der Wand und je ein Einfach- Taster (433mhz) rechts und links neben dem Bett, eine Bridge.
(alles geflashte Sonoff-Geräte)
Die Leuchten werden von der Wand aus einzeln mit toggle angesprochen.
Vom Bett aus soll das so gehen:
Wenn Code an Lampe geschickt wird soll geprüft werden, ob beide Leuchten den selben Status (on oder off) haben.
Ist der Status gleich, wird der toggle-Befehl ausgegeben, ist er ungleich werden beide Leuchten auf aus gesetzt.
Zitatdefmod Bridge_DOIF_1 DOIF
([Bridge:"^RfReceived_Data:.123456$"] and [MQTT2_L1] eq [MQTT2_L2]) (@Otto123 danke für den Hinbweis ;D)
(set MQTT2_L1 toggle);
(set MQTT2_L2 toggle)
DOELSEIF
(set (set MQTT2_L1 off);
(set (set MQTT2_L2 off)
Irgendwie funktioniert das aber gar nicht.
Was mache ich falsch? Mag mir jemand helfen?
Bei
Zitatdefmod Bridge_DOIF_1 DOIF ([Bridge:"^RfReceived_Data:.123456$"]) \
(set MQTT2_L1 toggle;;
set MQTT2_L2 toggle)
erreiche ich erst nach dem Drücken eines anderen Tasters und dann wieder des eigentlichen Tasters einen Toggle.
Ich krieg echt nen Knoten im Kopf.
Das sollte immer wahr sein:
[MQTT2_L1] eq [MQTT2_L1]
:-[
Wen ich die Bedingung [MQTT2_L1] eq [MQTT2_L2] stelle, vergleicht er dann die Schaltzustände oder noch mehr oder was anderes? Wie müsste ich das schreiben, damit er den Schaltstatus von L1 mit dem Schaltstatus von L2 vergleicht?
defmod doif_Test_L DOIF ([du_Taster_L:"on"] and [du_L1] eq "on" and [du_L2] eq "on")(set du_L.* off) DOELSEIF\
([du_Taster_L:"on"] and [du_L1] eq "off" and [du_L2] eq "off")(set du_L.* on) DOELSEIF\
(([du_Taster_L:"on"]) and ([du_L1] eq "on" or [du_L2] eq "on"))(set du_L.*:FILTER=state=off on)\
attr doif_Test_L do always
attr doif_Test_L room Test
So in der Art könnte mans, ohne toggle, angehen.
Geht mit Sicherheit auch raffinierter.
Gruß
Thomas
Hmm, TomLee, da steige nicht ganz hinter.
Ich habe das jetzt so interpretiert:
[Bridge:"^RfReceived_Data:.1173A4$"] and [MQTT2_SchlafZiDeckenlichtLiLfT] eq "on" and [MQTT2_SchlafZiDeckenlichtRe] eq "on"
(set MQTT2_SchlafZiDeckenlichtLiLfT off)
(set MQTT2_SchlafZiDeckenlichtRe off)
DOELSEIF
([Bridge:"^RfReceived_Data:.1173A4$"] and [MQTT2_SchlafZiDeckenlichtLiLfT] eq "off" and [MQTT2_SchlafZiDeckenlichtRe] eq "on")
(set MQTT2_SchlafZiDeckenlichtLiLfT off)
(set MQTT2_SchlafZiDeckenlichtRe off)
DOELSEIF
([Bridge:"^RfReceived_Data:.1173A4$"] and [MQTT2_SchlafZiDeckenlichtLiLfT] eq "on" and [MQTT2_SchlafZiDeckenlichtRe] eq "off")
(set MQTT2_SchlafZiDeckenlichtLiLfT off)
(set MQTT2_SchlafZiDeckenlichtRe off)
DOELSEIF
([Bridge:"^RfReceived_Data:.1173A4$"] and [MQTT2_SchlafZiDeckenlichtLiLfT] eq "on" and [MQTT2_SchlafZiDeckenlichtRe] eq "on")
(set MQTT2_SchlafZiDeckenlichtLiLfT on)
(set MQTT2_SchlafZiDeckenlichtRe on)
funktioniert leider nicht.
Zitatdefmod doif_Test_L DOIF ([du_Taster_L:"on"] and [du_L1] eq "on" and [du_L2] eq "on")(set du_L.* off) DOELSEIF\
([du_Taster_L:"on"] and [du_L1] eq "off" and [du_L2] eq "off")(set du_L.* on) DOELSEIF\
(([du_Taster_L:"on"]) and ([du_L1] eq "on" or [du_L2] eq "on"))(set du_L.*:FILTER=state=off on)\
Du hast die L1 und L2 ind du_L1 du_L2 umbenannt, um das bei dir zu testen?
Das mit dem (set du_L.*:FILTER=state=off on) macht was?
set du_L.*:FILTER=state=off on
Das schaltet alle Devices "on", wovon der Name mit "du_L" anfängt, und die "off" sind.
Zitat von: einfach am 21 Juli 2019, 19:26:06
Hmm, TomLee, da steige nicht ganz hinter.
Ich habe das jetzt so interpretiert:
[Bridge:"^RfReceived_Data:.1173A4$"] and [MQTT2_SchlafZiDeckenlichtLiLfT] eq "on" and [MQTT2_SchlafZiDeckenlichtRe] eq "on"
(set MQTT2_SchlafZiDeckenlichtLiLfT off)
(set MQTT2_SchlafZiDeckenlichtRe off)
DOELSEIF
([Bridge:"^RfReceived_Data:.1173A4$"] and [MQTT2_SchlafZiDeckenlichtLiLfT] eq "off" and [MQTT2_SchlafZiDeckenlichtRe] eq "on")
(set MQTT2_SchlafZiDeckenlichtLiLfT off)
(set MQTT2_SchlafZiDeckenlichtRe off)
DOELSEIF
([Bridge:"^RfReceived_Data:.1173A4$"] and [MQTT2_SchlafZiDeckenlichtLiLfT] eq "on" and [MQTT2_SchlafZiDeckenlichtRe] eq "off")
(set MQTT2_SchlafZiDeckenlichtLiLfT off)
(set MQTT2_SchlafZiDeckenlichtRe off)
DOELSEIF
([Bridge:"^RfReceived_Data:.1173A4$"] and [MQTT2_SchlafZiDeckenlichtLiLfT] eq "on" and [MQTT2_SchlafZiDeckenlichtRe] eq "on")
(set MQTT2_SchlafZiDeckenlichtLiLfT on)
(set MQTT2_SchlafZiDeckenlichtRe on)
Bei der erste Bedingung fehlen die Klammern
Die 4. Bedingung ist gleich wie die 1.
Bitte code tags benutzen (das # Zeichen im Editor-Menü), und ein vollstäntiges "list" des DOIFs und eines MQTT Devices posten. Das "list" vom DOIF am besten wenn es deiner Meinung nach "nich funktioniert" hat.
ZitatDu hast die L1 und L2 ind du_L1 du_L2 umbenannt, um das bei dir zu testen?
Richtig, anbei die Definitionen der einfachen Dummys, falls dir das schwer fällt :). Damit würd ich einfach mal" rumspielen", dann kommt Stück für Stück auch das Verständis bezüglich
set du_L.*:FILTER=state=off on, hoff ich :P
defmod du_L1 dummy
attr du_L1 room Test
attr du_L1 setList on off
defmod du_L2 dummy
attr du_L2 room Test
attr du_L2 setList on off
defmod du_Taster_L dummy
attr du_Taster_L room Test
attr du_Taster_L setList on off
([Bridge:"^RfReceived_Data:.1173A4$"] and [MQTT2_SchlafZiDeckenlichtLiLfT] eq "on" and [MQTT2_SchlafZiDeckenlichtRe] eq "on"
(set MQTT2_SchlafZiDeckenlichtLiLfT off)
(set MQTT2_SchlafZiDeckenlichtRe off)
DOELSEIF
([Bridge:"^RfReceived_Data:.1173A4$"] and [MQTT2_SchlafZiDeckenlichtLiLfT] eq "off" and [MQTT2_SchlafZiDeckenlichtRe] eq "on")
(set MQTT2_SchlafZiDeckenlichtLiLfT off)
(set MQTT2_SchlafZiDeckenlichtRe off)
DOELSEIF
([Bridge:"^RfReceived_Data:.1173A4$"] and [MQTT2_SchlafZiDeckenlichtLiLfT] eq "on" and [MQTT2_SchlafZiDeckenlichtRe] eq "off")
(set MQTT2_SchlafZiDeckenlichtLiLfT off)
(set MQTT2_SchlafZiDeckenlichtRe off)
DOELSEIF
([Bridge:"^RfReceived_Data:.1173A4$"] and [MQTT2_SchlafZiDeckenlichtLiLfT] eq "off" and [MQTT2_SchlafZiDeckenlichtRe] eq "off")
(set MQTT2_SchlafZiDeckenlichtLiLfT on)
(set MQTT2_SchlafZiDeckenlichtRe on)
ergibt leider
Bad regexp: Unmatched ( in regex; marked by <-- HERE in m/^( <-- HERE [Bridge:"^RfReceived_Data:.1173A4$"]$/ at ./FHEM/91_notify.pm line 56.
TomLee
Bei deiner Lösung klappt das schon gar nicht schlecht, aber das sieht so umwegig aus, auch wenn das Resultat stimmt. Da wäre ich nie drauf gekommen.
defmod du_L1 dummy
attr du_L1 room Test
attr du_L1 setList on off
defmod du_L2 dummy
attr du_L2 room Test
attr du_L2 setList on off
defmod du_Taster_L dummy
attr du_Taster_L room Test
attr du_Taster_L setList on off
defmod doif_Test_L DOIF ([du_Taster_L:"on"] and [du_L1] eq "on" and [du_L2] eq "on")(set du_L.* off) DOELSEIF\
([du_Taster_L:"on"] and [du_L1] eq "off" and [du_L2] eq "off")(set du_L.* on) DOELSEIF\
(([du_Taster_L:"on"]) and ([du_L1] eq "on" or [du_L2] eq "on"))(set du_L.*:FILTER=state=on off)
defmod Bridge_notify_2 notify Bridge:RfReceived_Data:.1173A4 set du_Taster_L on
Wird jetzt das Signal empfangen wird bei ungleichem Zustand L1 und L2 auf aus gesetzt und beim nächsten mal beide an und dann beide auf aus gestellt.
ABER: in echt, im System gibt es ein erhebliches Problem mit dem Filter: Das System verlangsamt sich drastisch, bis fast nix mehr geht.
Zitat von: einfach am 21 Juli 2019, 20:50:06
([Bridge:"^RfReceived_Data:.1173A4$"] and [MQTT2_SchlafZiDeckenlichtLiLfT] eq "on" and [MQTT2_SchlafZiDeckenlichtRe] eq "on"
(set MQTT2_SchlafZiDeckenlichtLiLfT off)
(set MQTT2_SchlafZiDeckenlichtRe off)
Es fehlt immer noch ein Klammer (am Ende der Bedingung)
ZitatWird jetzt das Signal empfangen wird bei ungleichem Zustand L1 und L2 auf aus gesetzt und beim nächsten mal beide an und dann beide auf aus gestellt.
Zitat von: einfach am 21 Juli 2019, 20:50:06
(([du_Taster_L:"on"]) and ([du_L1] eq "on" or [du_L2] eq "on"))(set du_L.*:FILTER=state=on off)
Das hast du daraus gemacht. ;D
@TomLee
ja, damit der Schalter lieber erst das Licht aus macht und nicht erst noch die zweite Lampe an.
Im Dummymodel geht das wunderbar, mit den Aktoren geht der Raspi auf Volllast.
@Amenomade
([Bridge:"^RfReceived_Data:.1173A4$"] and [MQTT2_SchlafZiDeckenlichtLiLfT] eq "on" and [MQTT2_SchlafZiDeckenlichtRe] eq "on")
(set MQTT2_SchlafZiDeckenlichtLiLfT off)
(set MQTT2_SchlafZiDeckenlichtRe off)
DOELSEIF
([Bridge:"^RfReceived_Data:.1173A4$"] and [MQTT2_SchlafZiDeckenlichtLiLfT] eq "off" and [MQTT2_SchlafZiDeckenlichtRe] eq "on")
(set MQTT2_SchlafZiDeckenlichtLiLfT off)
(set MQTT2_SchlafZiDeckenlichtRe off)
DOELSEIF
([Bridge:"^RfReceived_Data:.1173A4$"] and [MQTT2_SchlafZiDeckenlichtLiLfT] eq "on" and [MQTT2_SchlafZiDeckenlichtRe] eq "off")
(set MQTT2_SchlafZiDeckenlichtLiLfT off)
(set MQTT2_SchlafZiDeckenlichtRe off)
DOELSEIF
([Bridge:"^RfReceived_Data:.1173A4$"] and [MQTT2_SchlafZiDeckenlichtLiLfT] eq "off" and [MQTT2_SchlafZiDeckenlichtRe] eq "off")
(set MQTT2_SchlafZiDeckenlichtLiLfT on)
(set MQTT2_SchlafZiDeckenlichtRe on)}
ergit immer diesen Fehler
Bad regexp: Unmatched ( in regex; marked by <-- HERE in m/^( <-- HERE [Bridge:"^RfReceived_Data:.1173A4$"]$/ at ./FHEM/91_notify.pm line 56.
und ich kann es dann nicht so eintragen.
Wann kommt der Fehler? Beim Speichern der Definition , oder beim Schalten des Bridges?
"und ich kann es dann nicht so eintragen." Bei mir kann ich das problemlos eintragen (bis auf das } am Ende)
Wie trägst Du das ein?
Im Dummymodel geht das wunderbar, mit den Aktoren geht der Raspi auf Volllast.
Ohne list (https://forum.fhem.de/index.php/topic,71806.msg633579.html#msg633579) der Definition mit Aktoren ein Ratespiel.
Zitat von: TomLee am 21 Juli 2019, 22:30:33
Im Dummymodel geht das wunderbar, mit den Aktoren geht der Raspi auf Volllast.
Ohne list (https://forum.fhem.de/index.php/topic,71806.msg633579.html#msg633579) der Definition mit Aktoren ein Ratespiel.
Und wenn direkt in fhem.cfg editiert, noch mehr ein Ratespiel. Das könnte die Fehlermeldung bei Änderung des DOIFs (der Fehler deutet auf dem notify Modul!!) so wohl auch den Volllast erklären...
@amenomade
die Fehlermeldung bekomme ich, wenn ich versuche die Änderung ganz normal auf der Geräte-Website, mit dem dortigen UI zu übernehmen. Direkt in der fhem.cfg mache ich nix.
@TomLee
Internals:
DEF ([du_Taster_L:"on"] and [MQTT2_SchlafZiDeckenlichtRe] eq "on" and [MQTT2_SchlafZiDeckenlichtLiLfT] eq "on")(set MQTT2_SchlafZiDeckenlicht.* off) DOELSEIF
([du_Taster_L:"on"] and [MQTT2_SchlafZiDeckenlichtRe] eq "off" and [MQTT2_SchlafZiDeckenlichtLiLfT] eq "off")(set du_L.* on) DOELSEIF
(([du_Taster_L:"on"]) and ([MQTT2_SchlafZiDeckenlichtRe] eq "on" or [MQTT2_SchlafZiDeckenlichtLiLfT] eq "on"))(set MQTT2_SchlafZiDeckenlicht.*:FILTER=state=off on)
FUUID 5d34b4ad-f33f-d1e3-2775-a3f59439329f3d55
MODEL FHEM
NAME DOIF_Decider_SchlafZiDeLi
NR 150
NTFY_ORDER 50-DOIF_Decider_SchlafZiDeLi
STATE disabled
TYPE DOIF
VERSION 19786 2019-07-05 21:47:08
READINGS:
2019-07-21 22:16:09 Device MQTT2_SchlafZiDeckenlichtLiLfT
2019-07-21 22:15:31 cmd 0
2019-07-21 22:16:09 e_MQTT2_SchlafZiDeckenlichtLiLfT_STATE 61.5 %LF
23.3 °C <br>
off
Online
2019-07-21 22:15:54 e_du_Taster_L_events on
2019-07-21 22:16:20 last_cmd initialized
2019-07-21 22:16:20 mode disabled
2019-07-21 22:16:20 state disabled
Regex:
accu:
condition:
0 ::EventDoIf('du_Taster_L',$hash,'on',1) and ::InternalDoIf($hash,'MQTT2_SchlafZiDeckenlichtRe','STATE') eq "on" and ::InternalDoIf($hash,'MQTT2_SchlafZiDeckenlichtLiLfT','STATE') eq "on"
1 ::EventDoIf('du_Taster_L',$hash,'on',1) and ::InternalDoIf($hash,'MQTT2_SchlafZiDeckenlichtRe','STATE') eq "off" and ::InternalDoIf($hash,'MQTT2_SchlafZiDeckenlichtLiLfT','STATE') eq "off"
2 (::EventDoIf('du_Taster_L',$hash,'on',1)) and (::InternalDoIf($hash,'MQTT2_SchlafZiDeckenlichtRe','STATE') eq "on" or ::InternalDoIf($hash,'MQTT2_SchlafZiDeckenlichtLiLfT','STATE') eq "on")
devices:
0 du_Taster_L MQTT2_SchlafZiDeckenlichtRe MQTT2_SchlafZiDeckenlichtLiLfT
1 du_Taster_L MQTT2_SchlafZiDeckenlichtRe MQTT2_SchlafZiDeckenlichtLiLfT
2 du_Taster_L MQTT2_SchlafZiDeckenlichtRe MQTT2_SchlafZiDeckenlichtLiLfT
all du_Taster_L MQTT2_SchlafZiDeckenlichtRe MQTT2_SchlafZiDeckenlichtLiLfT
do:
0:
0 set MQTT2_SchlafZiDeckenlicht.* off
1:
0 set du_L.* on
2:
0 set MQTT2_SchlafZiDeckenlicht.*:FILTER=state=off on
3:
helper:
event LWT: Online
globalinit 1
last_timer 0
sleeptimer -1
triggerDev MQTT2_SchlafZiDeckenlichtLiLfT
triggerEvents:
LWT: Online
triggerEventsState:
LWT: Online
internals:
0 MQTT2_SchlafZiDeckenlichtRe:STATE MQTT2_SchlafZiDeckenlichtLiLfT:STATE
1 MQTT2_SchlafZiDeckenlichtRe:STATE MQTT2_SchlafZiDeckenlichtLiLfT:STATE
2 MQTT2_SchlafZiDeckenlichtRe:STATE MQTT2_SchlafZiDeckenlichtLiLfT:STATE
all MQTT2_SchlafZiDeckenlichtRe:STATE MQTT2_SchlafZiDeckenlichtLiLfT:STATE
itimer:
readings:
trigger:
all du_Taster_L
uiState:
uiTable:
Attributes:
room SchlafZi,SchlafZi-Logik
Zitat von: einfach am 22 Juli 2019, 09:52:03
Internals:
DEF ([du_Taster_L:"on"] and [MQTT2_SchlafZiDeckenlichtRe] eq "on" and [MQTT2_SchlafZiDeckenlichtLiLfT] eq "on")(set MQTT2_SchlafZiDeckenlicht.* off) DOELSEIF
([du_Taster_L:"on"] and [MQTT2_SchlafZiDeckenlichtRe] eq "off" and [MQTT2_SchlafZiDeckenlichtLiLfT] eq "off")(set du_L.* on) DOELSEIF
(([du_Taster_L:"on"]) and ([MQTT2_SchlafZiDeckenlichtRe] eq "on" or [MQTT2_SchlafZiDeckenlichtLiLfT] eq "on"))(set MQTT2_SchlafZiDeckenlicht.*:FILTER=state=off on)
FUUID 5d34b4ad-f33f-d1e3-2775-a3f59439329f3d55
MODEL FHEM
NAME DOIF_Decider_SchlafZiDeLi
NR 150
NTFY_ORDER 50-DOIF_Decider_SchlafZiDeLi
STATE disabled
TYPE DOIF
VERSION 19786 2019-07-05 21:47:08
READINGS:
2019-07-21 22:16:09 Device MQTT2_SchlafZiDeckenlichtLiLfT
2019-07-21 22:15:31 cmd 0
2019-07-21 22:16:09 e_MQTT2_SchlafZiDeckenlichtLiLfT_STATE 61.5 %LF
23.3 °C <br>
off
Online
2019-07-21 22:15:54 e_du_Taster_L_events on
2019-07-21 22:16:20 last_cmd initialized
2019-07-21 22:16:20 mode disabled
2019-07-21 22:16:20 state disabled
Regex:
accu:
condition:
0 ::EventDoIf('du_Taster_L',$hash,'on',1) and ::InternalDoIf($hash,'MQTT2_SchlafZiDeckenlichtRe','STATE') eq "on" and ::InternalDoIf($hash,'MQTT2_SchlafZiDeckenlichtLiLfT','STATE') eq "on"
1 ::EventDoIf('du_Taster_L',$hash,'on',1) and ::InternalDoIf($hash,'MQTT2_SchlafZiDeckenlichtRe','STATE') eq "off" and ::InternalDoIf($hash,'MQTT2_SchlafZiDeckenlichtLiLfT','STATE') eq "off"
2 (::EventDoIf('du_Taster_L',$hash,'on',1)) and (::InternalDoIf($hash,'MQTT2_SchlafZiDeckenlichtRe','STATE') eq "on" or ::InternalDoIf($hash,'MQTT2_SchlafZiDeckenlichtLiLfT','STATE') eq "on")
devices:
0 du_Taster_L MQTT2_SchlafZiDeckenlichtRe MQTT2_SchlafZiDeckenlichtLiLfT
1 du_Taster_L MQTT2_SchlafZiDeckenlichtRe MQTT2_SchlafZiDeckenlichtLiLfT
2 du_Taster_L MQTT2_SchlafZiDeckenlichtRe MQTT2_SchlafZiDeckenlichtLiLfT
all du_Taster_L MQTT2_SchlafZiDeckenlichtRe MQTT2_SchlafZiDeckenlichtLiLfT
do:
0:
0 set MQTT2_SchlafZiDeckenlicht.* off
1:
0 set du_L.* on
2:
0 set MQTT2_SchlafZiDeckenlicht.*:FILTER=state=off on
3:
helper:
event LWT: Online
globalinit 1
last_timer 0
sleeptimer -1
triggerDev MQTT2_SchlafZiDeckenlichtLiLfT
triggerEvents:
LWT: Online
triggerEventsState:
LWT: Online
internals:
0 MQTT2_SchlafZiDeckenlichtRe:STATE MQTT2_SchlafZiDeckenlichtLiLfT:STATE
1 MQTT2_SchlafZiDeckenlichtRe:STATE MQTT2_SchlafZiDeckenlichtLiLfT:STATE
2 MQTT2_SchlafZiDeckenlichtRe:STATE MQTT2_SchlafZiDeckenlichtLiLfT:STATE
all MQTT2_SchlafZiDeckenlichtRe:STATE MQTT2_SchlafZiDeckenlichtLiLfT:STATE
itimer:
readings:
trigger:
all du_Taster_L
uiState:
uiTable:
Attributes:
room SchlafZi,SchlafZi-Logik
Mit dem Problem hat das aber denk ich weniger zu tun.
Schließ doch einfach mal das notify als mögliche Fehlerursache (Volllast) aus:
([Bridge:"^RfReceived_Data:.1173A4$"] and [MQTT2_SchlafZiDeckenlichtRe] eq "on" and [MQTT2_SchlafZiDeckenlichtLiLfT] eq "on")(set MQTT2_SchlafZiDeckenlicht.* off) DOELSEIF
([Bridge:"^RfReceived_Data:.1173A4$"] and [MQTT2_SchlafZiDeckenlichtRe] eq "off" and [MQTT2_SchlafZiDeckenlichtLiLfT] eq "off")(set MQTT2_SchlafZiDeckenlicht.* on) DOELSEIF
(([Bridge:"^RfReceived_Data:.1173A4$"]) and ([MQTT2_SchlafZiDeckenlichtRe] eq "on" or [MQTT2_SchlafZiDeckenlichtLiLfT] eq "on"))(set MQTT2_SchlafZiDeckenlicht.*:FILTER=state=off on)
Zitat von: TomLee am 21 Juli 2019, 16:10:06
Geht mit Sicherheit auch raffinierter.
Zitat von: einfach am 21 Juli 2019, 20:50:06
Bei deiner Lösung klappt das schon gar nicht schlecht, aber das sieht so umwegig aus, auch wenn das Resultat stimmt. Da wäre ich nie drauf gekommen.
Jetzt beschäftige ich mich wegen dir tiefer mit DOIF dabei sollte ich mehr Zeit in das Verständnis von notify stecken ;D
Etwas kürzer/eleganter:
defmod doif_Test2_L DOIF
([du_Taster_L:"on"] and [#"^du_L":state:"on"] == 2)(set du_L.* off) DOELSEIF\
([du_Taster_L:"on"] and [#"^du_L":state:"off"] == 2)(set du_L.* on) DOELSEIF\
([du_Taster_L:"on"] and [#"^du_L":state:"on"] == 1)(set du_L.*:FILTER=state=off on)\
attr doif_Test2_L do always
attr doif_Test2_L room Test
@TomLee
ZitatSchließ doch einfach mal das notify als mögliche Fehlerursache (Volllast) aus:
Code: [Auswählen]
([Bridge:"^RfReceived_Data:.1173A4$"] and [MQTT2_SchlafZiDeckenlichtRe] eq "on" and [MQTT2_SchlafZiDeckenlichtLiLfT] eq "on")(set MQTT2_SchlafZiDeckenlicht.* off) DOELSEIF
([Bridge:"^RfReceived_Data:.1173A4$"] and [MQTT2_SchlafZiDeckenlichtRe] eq "off" and [MQTT2_SchlafZiDeckenlichtLiLfT] eq "off")(set MQTT2_SchlafZiDeckenlicht.* on) DOELSEIF
(([Bridge:"^RfReceived_Data:.1173A4$"]) and ([MQTT2_SchlafZiDeckenlichtRe] eq "on" or [MQTT2_SchlafZiDeckenlichtLiLfT] eq "on"))(set MQTT2_SchlafZiDeckenlicht.*:FILTER=state=off on)
ergibt diese Fehlermeldung
set MQTT2_SchlafZiDeckenlicht.* off: Unknown argument off, choose one of attrTemplate:?,0_00_General_Info,A_00_MQTT2_CLIENT_general_bridge,A_01_tasmota_basic,A_01a_tasmota_basic_state_power1,A_01b_tasmota_1ch+motion+SI7021,A_01c_tasmota_POW,A_01d_tasmota_ir,A_01d_tasmota_rf,A_01x_tasmota_clear_readings_reset_readingsList_and_reboot,A_01z_tasmota_set_lowercase_texts_and_state1,A_01z_tasmota_set_power1_state_to_power,A_01z_tasmota_set_uppercase_texts_and_state1,A_02_tasmota_2channel_split,A_02a_tasmota_2ch_unified,A_02b_tasmota_2ch_shutter_invert_0,A_02b_tasmota_2ch_shutter_invert_1,A_04a_tasmota_4ch_unified_basic_text,A_04b_tasmota_4ch_unified_icon,A_05a_tasmota_rgb_led_controller,A_10_shelly1,E_01a_eBus_daemon_splitter,L_01_zigbee2mqtt_bridge,X_01_esp_milight_hub_bridge
folglich fehlt ein list auch dann von dem Device.
Ins Blaue, ist es eventuell ein OFF.
Zitat von: einfach am 22 Juli 2019, 09:52:03
@amenomade
die Fehlermeldung bekomme ich, wenn ich versuche die Änderung ganz normal auf der Geräte-Website, mit dem dortigen UI zu übernehmen. Direkt in der fhem.cfg mache ich nix.
Ehrlich gesagt... ich weiss nicht, was Du machst, aber es ist total unmöglich, dass bei einer Änderung eines DOIFs, eine Fehlermeldung aus dem
notify Modul kommt. Ist es ein notify oder ein DOIF ??????
Ich weiss nicht. Zeig vielleicht Bildschirmkopien von deiner Vorgehensweise...
Es kommt ja auch nicht aus dem Notify, sondern beim Versuch Änderung des DOIFs.
Dann vermute ich Du hast ein notify was auf "alles" triggert? Schau mal bitte nach:
list TYPE=notify REGEXP
Gruß Otto
ZitatBad regexp: Unmatched ( in regex; marked by <-- HERE in m/^( <-- HERE [Bridge:"^RfReceived_Data:.1173A4$"]$/ at ./FHEM/91_notify.pm line 56.
ist definitiv eine Meldung des Moduls notify. Schau dir mal alle deine notify-Definitionen an, dann wirst du bestimmt eine finden.
So, diese Konstellation läuft, aber es wäre mir lieber, wenn das weniger Gerätedefinitionen wären.
Vielen Dank für eure Hinweise und Hilfestellungen!
Das Zentralmodul, dass zwei Notifys steuert (aktiviert, bzw. deaktiviert)
defmod doif_SchlaZi_notifywahl DOIF ([MQTT2_SchlafZiDeckenlichtRe:POWER1] eq "on" and [MQTT2_SchlafZiDeckenlichtLiLfT:POWER1] eq "on") \
(set SchlafZiDeLi_gleich active, \
set SchlafZiDeLi_ungleich inactive)\
DOELSEIF\
([MQTT2_SchlafZiDeckenlichtRe:POWER1] eq "off" and [MQTT2_SchlafZiDeckenlichtLiLfT:POWER1] eq "off") \
(set SchlafZiDeLi_gleich active,\
set SchlafZiDeLi_ungleich inactive)\
DOELSE\
([MQTT2_SchlafZiDeckenlichtRe:POWER1] eq "off" and [MQTT2_SchlafZiDeckenlichtLiLfT:POWER1] eq "on") \
(set SchlafZiDeLi_gleich inactive, \
set SchlafZiDeLi_ungleich active)\
DOELSE \
([MQTT2_SchlafZiDeckenlichtRe:POWER1] eq "on" and [MQTT2_SchlafZiDeckenlichtLiLfT:POWER1] eq "off") \
(set SchlafZiDeLi_gleich inactive,\
set SchlafZiDeLi_ungleich active)
attr doif_SchlaZi_notifywahl do always
attr doif_SchlaZi_notifywahl room DOIF,SchlafZi-Logik
Dann die beiden Notifys, die den gleichen Signalcode für unterschiedliche Befehle als Auslöser haben.
Und dann eben die beiden Leuten, deren POWER1 ich abfragen lasse.
Das DOELSE ist falsch! DOELSE hat keine Bedingung!
Aber es geht natürlich weil diese Abfragen zweimal ob der erste Teil nicht wahr war - ist überflüssig.
defmod doif_SchlaZi_notifywahl DOIF ([MQTT2_SchlafZiDeckenlichtRe:POWER1] eq "on" and [MQTT2_SchlafZiDeckenlichtLiLfT:POWER1] eq "on") \
(set SchlafZiDeLi_gleich active, \
set SchlafZiDeLi_ungleich inactive)\
DOELSEIF\
([MQTT2_SchlafZiDeckenlichtRe:POWER1] eq "off" and [MQTT2_SchlafZiDeckenlichtLiLfT:POWER1] eq "off") \
(set SchlafZiDeLi_gleich active,\
set SchlafZiDeLi_ungleich inactive)\
DOELSE\
(set SchlafZiDeLi_gleich inactive, \
set SchlafZiDeLi_ungleich active)\
attr doif_SchlaZi_notifywahl do always
attr doif_SchlaZi_notifywahl room DOIF,SchlafZi-Logik
Ja, cool, das ist etwas kürzer und funktioniert! ;D
Aber auf das richtige Statusauslesen bin ich echt spät gekommen. Dieses List-Tool ist praktisch!
Auch, dass man Notifys einfach aktive oder inaktive setzen kann, macht die sache leichter.
Und dass die Befehle in eine Klammer durch ein Komma getrennt gehören ist mir dann auch aufgefallen.
DOELSE oder DOELSEIF nist mir noch nicht ganz so klar.
Auch wann man eq und ne, bzw. == verwendet, und das gegenteil von == sind mir etwas schleierhaft geblieben.
DOELSEIF ist die Alternative mit einer Bedingung, davon kann es viele geben.
DOELSE ist einfach die letzte bedingungslose Alternative, wenn keine Bedingung vorher wahr war mach das. Maximal einmal am Ende!
Kurzfassung
eq und ne nimmst du bei "Strings" -> "on" "off" "0" "1"
== und != nimmst Du bei Zahlen -> 0 1 2 10
Langfassung
https://perldoc.perl.org/perlop.html#Operator-Precedence-and-Associativity
:D
Dankeschön!
Ich verstehe die Notwendigkeit vom Umweg über 2 notify nicht ganz... aber gut... wenn es funktioniert! Never touch a running system ;)
Wenn @Damian noch hier mitliest: kann man nicht direkt 2 triggernde (oder mit "?" nicht triggernde) Readings vergleichen?
DOIF ([MQTT2_SchlafZiDeckenlichtRe:POWER1] eq [MQTT2_SchlafZiDeckenlichtLiLfT:POWER1])
Zitat von: amenomade am 23 Juli 2019, 20:05:55
Ich verstehe die Notwendigkeit vom Umweg über 2 notify nicht ganz... aber gut... wenn es funktioniert! Never touch a running system ;)
Wenn @Damian noch hier mitliest: kann man nicht direkt 2 triggernde (oder mit "?" nicht triggernde) Readings vergleichen?
DOIF ([MQTT2_SchlafZiDeckenlichtRe:POWER1] eq [MQTT2_SchlafZiDeckenlichtLiLfT:POWER1])
Natürlich kann man auch zwei Readings wie oben mit oder ohne Trigger miteinander vergleichen.
ZitatIch verstehe die Notwendigkeit vom Umweg über 2 notify nicht ganz... aber gut... wenn es funktioniert! Never touch a running system ;)
Naja, wenn ich mit dem Notify Bedingungen nicht vernünftig abgefragt bekomme, mache ich mir einfach zwei Notifis die ich mit einem DOIF bei Bedingungserfüllung jeweils scharf schalte oder deaktiviere,
Zitat von: Damian am 23 Juli 2019, 22:55:21
Natürlich kann man auch zwei Readings wie oben mit oder ohne Trigger miteinander vergleichen.
Dazu hätte ich auch eine Verständnisfrage, nicht mehr, das DOIF macht was es soll.
Zitat von: commandrefIn der Bedingung und im Status reagiert sie auf Ereignistrigger. Das lässt sich durch ein vorangestelltes Fragezeichen unterbinden.
In meinem Beispiel (https://forum.fhem.de/index.php/topic,102407.msg960165.html#msg960165) vergleiche ich doch mit der Aggregationsfunktion ( bspw.
[#"^du_L":state:"on"] ) zwei nicht triggernde Readings und würde erwarten das ich ein ? voranstellen muss, es funktioniert aber so.
Weiter bin ich irritiert von der Syntax, die entspricht hier doch jetzt der von
Ereignissteuerung über Auswertung von Events ich mach doch aber nur eine vergleichende Abfrage.
Gruß
Thomas
Also, ich verstehe es so: die Aggregationsfunktion reagiert auf Ereignisse der zugehörigen Devices, sprich z.B. die Summe wird dann neu kalkuliert. Es ist aber grundsätzlich eine Zustandabfrage als Bedingung.
In deinem Beispiel funktioniert es, weil ein DOIF auf sich selbst nicht getriggert wird:
https://www.fhem.de/commandref_DE.html#DOIF_selftrigger
Zitat von: CommandRefStandardmäßig unterbindet das DOIF-Modul Selbsttriggerung. D. h. das Modul reagiert nicht auf Events, die es selbst direkt oder indirekt auslöst.