Aktion abhängig vom Vergleich der Zustände zweier Aktoren

Begonnen von einfach, 20 Juli 2019, 23:04:49

Vorheriges Thema - Nächstes Thema

einfach

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.

Otto123

Das sollte immer wahr sein:
[MQTT2_L1] eq  [MQTT2_L1]
:-[
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

einfach

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?

TomLee

#3
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

einfach

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?

amenomade

set du_L.*:FILTER=state=off on
Das schaltet alle Devices "on", wovon der Name mit "du_L" anfängt, und die "off" sind.
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

amenomade

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.
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

TomLee

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

einfach

#8

([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.

amenomade

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)
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

TomLee

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

einfach

@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.

amenomade

#12
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?
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

TomLee

Im Dummymodel geht das wunderbar, mit den Aktoren geht der Raspi auf Volllast.

Ohne list der Definition mit Aktoren ein Ratespiel.

amenomade

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 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...
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus