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

@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

TomLee

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.

TomLee

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)

TomLee

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


einfach

@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

TomLee

folglich fehlt ein list auch dann von dem Device.

Ins Blaue, ist es eventuell ein OFF.

amenomade

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

einfach

Es kommt ja auch nicht aus dem Notify, sondern beim Versuch Änderung des DOIFs.

Otto123

Dann vermute ich Du hast ein notify was auf "alles" triggert? Schau mal bitte nach:
list TYPE=notify REGEXP

Gruß Otto
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

Damian

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.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

einfach

#25
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.

Otto123

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

#27
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.

Otto123

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