DOIF schaltet nicht bei Dummy Änderung

Begonnen von Xargon, 25 April 2018, 22:57:58

Vorheriges Thema - Nächstes Thema

Xargon

Hallo zusammen,
leider habe ich nach mehrstündiger Suche keine Lösung für mein Problem gefunden. Daher eröffne ich nun ein neues Thema. Ich hoffe ihr verzeiht mir, wenn es dazu schon einmal etwas gab.
Ich möchte eine (später mehrere per structure) Funksteckdose(n) abschalten, wenn ich die Wohnung verlasse oder wenn die Energieaufnahme eine bestimmte Zeit x unter einem Wert y war.
Da ich keine andere Möglichkeit gefunden habe, versuche ich die vergangene Zeit mit einem Dummy und ReadingsAge herauszufinden. Mein Dummy wird auf "false" gestellt, wenn die Energieaufnahme y unterschritten wurde.

Mein Dummy:
Internals:
   CFGFN     
   NAME       wz_switch_active_dummy
   NR         1497
   STATE      false
   TYPE       dummy
   READINGS:
     2018-04-25 22:20:19   state           false
Attributes:
   alias      1 Aktivität Wohnzimmer
   group      DOIF_Strom
   icon       helper_doiftools
   room       DOIF


Wird geschaltet, wenn y unterschritten:
Internals:
   CFGFN     
   DEF        ([wz_switch_Pwr:power] > 100)(set wz_switch_active_dummy true) DOELSE(set wz_switch_active_dummy false)
   NAME       di_wz_activity
   NR         1506
   NTFY_ORDER 50-di_wz_activity
   STATE      cmd_2
   TYPE       DOIF
   READINGS:
     2018-04-25 22:35:25   Device          wz_switch_Pwr
     2018-04-25 22:20:19   cmd             2
     2018-04-25 22:20:19   cmd_event       set_cmd_2
     2018-04-25 22:20:19   cmd_nr          2
     2018-04-25 22:35:25   e_wz_switch_Pwr_power 0
     2018-04-25 18:52:06   mode            enabled
     2018-04-25 22:20:19   state           cmd_2
   Regex:
   condition:
     0          ReadingValDoIf($hash,'wz_switch_Pwr','power') > 100
   devices:
     0           wz_switch_Pwr
     all         wz_switch_Pwr
   do:
     0:
       0          set wz_switch_active_dummy true
     1:
       0          set wz_switch_active_dummy false
   helper:
     DOIF_Readings_events
     DOIF_eventas
     event      boot: off,current: 0,eState: E: 3214.7 P: 0 I: 0 U: 233.5 f: 49.99,energy: 3214.7,energyCalc: 3214.7,frequency: 49.99,power: 0,3214.7,voltage: 233.5
     globalinit 1
     last_timer 0
     sleeptimer -1
     timerdev   wz_switch_Pwr
     timerevent boot: off,current: 0,eState: E: 3214.7 P: 0 I: 0 U: 233.5 f: 49.99,energy: 3214.7,energyCalc: 3214.7,frequency: 49.99,power: 0,3214.7,voltage: 233.5
     triggerDev wz_switch_Pwr
     timerevents:
       boot: off
       current: 0
       eState: E: 3214.7 P: 0 I: 0 U: 233.5 f: 49.99
       energy: 3214.7
       energyCalc: 3214.7
       frequency: 49.99
       power: 0
       3214.7
       voltage: 233.5
     timereventsState:
       boot: off
       current: 0
       eState: E: 3214.7 P: 0 I: 0 U: 233.5 f: 49.99
       energy: 3214.7
       energyCalc: 3214.7
       frequency: 49.99
       power: 0
       state: 3214.7
       voltage: 233.5
     triggerEvents:
       boot: off
       current: 0
       eState: E: 3214.7 P: 0 I: 0 U: 233.5 f: 49.99
       energy: 3214.7
       energyCalc: 3214.7
       frequency: 49.99
       power: 0
       3214.7
       voltage: 233.5
     triggerEventsState:
       boot: off
       current: 0
       eState: E: 3214.7 P: 0 I: 0 U: 233.5 f: 49.99
       energy: 3214.7
       energyCalc: 3214.7
       frequency: 49.99
       power: 0
       state: 3214.7
       voltage: 233.5
   internals:
   itimer:
   readings:
     0           wz_switch_Pwr:power
     all         wz_switch_Pwr:power
   trigger:
   uiState:
   uiTable:
Attributes:
   alias      2 Wohnzimmer Aktivität Trigger
   devStateIcon cmd_1:general_an:cmd_2 cmd_2|initialized:general_aus:cmd_1
   group      DOIF_Strom
   icon       helper_doif
   room       DOIF


Soweit funktioniert alles wunderbar. Je nach y (in diesem Fall 100) hat mein Dummy state true oder false.

Nun möchte ich anhand dieses Dummys und ReadingsAge dessen states meine Funksteckdose deaktivieren, wenn state länger als x Sekunden in state false ist. Hier testweise nach 60 Sekunden.

Hier die eigentlich relevante DOIF Schaltung:
Internals:
   CFGFN     
   DEF        ([Bewohner] eq "home" and [di_struct_electricity] eq "off")(set di_struct_electricity on)
DOELSEIF([Bewohner] eq "home" and [wz_switch_activity_dummy:state] eq "false" and [ReadingsAge('wz_switch_activity_dummy','state','0')] > 60 and [wz_switch_Sw:state] eq "on")(set wz_switch_Sw off)
DOELSEIF([Bewohner] ne "home" and [di_struct_electricity] eq "on")(set di_struct_electricity off)
   NAME       di_electricity
   NR         705
   NTFY_ORDER 50-di_electricity
   STATE      initialized
   TYPE       DOIF
   READINGS:
     2018-04-25 22:51:04   Device          Bewohner
     2018-04-25 22:50:56   cmd             0
     2018-04-25 22:51:04   e_Bewohner_STATE home
     2018-04-25 22:50:56   mode            enabled
     2018-04-25 22:50:56   state           initialized
     2018-04-25 22:50:56   timer_01_c02    error: Wrong timespec ReadingsAge('wz_switch_activity_dummy','state','0'): either HH:MM:SS or {perlcode}
   Regex:
   condition:
     0          InternalDoIf($hash,'Bewohner','STATE') eq "home" and InternalDoIf($hash,'di_struct_electricity','STATE') eq "off"
     1          InternalDoIf($hash,'Bewohner','STATE') eq "home" and ReadingValDoIf($hash,'wz_switch_activity_dummy','state') eq "false" and DOIF_time_once($hash,0,$wday) > 60 and ReadingValDoIf($hash,'wz_switch_Sw','state') eq "on"
     2          InternalDoIf($hash,'Bewohner','STATE') ne "home" and InternalDoIf($hash,'di_struct_electricity','STATE') eq "on"
   devices:
     0           Bewohner di_struct_electricity
     1           Bewohner wz_switch_activity_dummy wz_switch_Sw
     2           Bewohner di_struct_electricity
     all         Bewohner di_struct_electricity wz_switch_activity_dummy wz_switch_Sw
   do:
     0:
       0          set di_struct_electricity on
     1:
       0          set wz_switch_Sw off
     2:
       0          set di_struct_electricity off
     3:
   helper:
     DOIF_Readings_events
     DOIF_eventas
     event      durTimerPresence_cr: 88,durTimerPresence: 01:28:08
     globalinit 1
     last_timer 1
     sleeptimer -1
     triggerDev Bewohner
     triggerEvents:
       durTimerPresence_cr: 88
       durTimerPresence: 01:28:08
     triggerEventsState:
       durTimerPresence_cr: 88
       durTimerPresence: 01:28:08
   internals:
     0           Bewohner:STATE di_struct_electricity:STATE
     1           Bewohner:STATE
     2           Bewohner:STATE di_struct_electricity:STATE
     all         Bewohner:STATE di_struct_electricity:STATE
   itimer:
   localtime:
   readings:
     1           wz_switch_activity_dummy:state wz_switch_Sw:state
     all         wz_switch_activity_dummy:state wz_switch_Sw:state
   time:
     0          ReadingsAge('wz_switch_activity_dummy','state','0')
   timeCond:
     0          1
   timer:
     0          0
   timers:
     1           0
   trigger:
   uiState:
   uiTable:
Attributes:
   alias      Stromautomatik
   devStateIcon cmd_1:general_an:cmd_2 cmd_2|initialized:general_aus:cmd_1
   group      DOIF_Strom
   icon       helper_doif
   room       DOIF


Kommando 1 und 3 funktionieren wunderbar.
Leider jedoch nicht Kommando 2. Dieses scheint nie erreicht zu werden. Ich bin langsam am verzweifeln.
Ich hoffe es kann mir jemand einen Tipp geben, was ich falsch mache.

Vielen Dank und liebe Grüße
Xargon

Otto123

Hi Xargon,

also ich denke ja dein Konstrukt mit ReadingsAge steht in keiner Doku (PerlCode in eckigen Klammern)  :o - aber mag sein ich liege falsch.
Dafür habe ich das gefunden -> https://commandref.fhem.de/commandref_DE.html#DOIF_Zeitspanne_eines_Readings_seit_der_letzten_Aenderung

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

Xargon

Hi Otto,
vielen Dank für deine schnelle Antwort.
Ich gebe zu, dass ich ReadingsAge in diesem Zusammenhang nirgendwo dokumentiert gesehen habe. Ich habe einfach gehofft, dass es hier auch funktioniert.
Ich werde mir die DOIF Zeitspanne morgen mal anschauen.

Ich befürchte jedoch, dass mein Problem bereits beim auslesen des state meines Dummys liegt. Denn auch ohne die ReadingsAge Bedingung wird die Bedingung für das Kommando 2 scheinbar nie erfüllt.
Möglicherweise ist es einfach irgendwo ein Tippfehler, aber ich finde ihn einfach nicht.

Ich habe ehrlich gesagt auch noch nicht ganz verstanden wann DOIF getriggert wird. Nur, wenn sich etwas im ersten Bedinungsblock ändert oder auch, wenn sich etwas in den ELSEDOIF Blöcken andert?

Viele Grüße
Xargon

nils_

Zitat von: Xargon am 25 April 2018, 23:41:25
Ich gebe zu, dass ich ReadingsAge in diesem Zusammenhang nirgendwo dokumentiert gesehen habe. Ich habe einfach gehofft, dass es hier auch funktioniert.
Ich werde mir die DOIF Zeitspanne morgen mal anschauen.
das die syntax so nicht gepasst hat, siehst du auch daran:
Zitat2018-04-25 22:50:56   timer_01_c02    error: Wrong timespec ReadingsAge('wz_switch_activity_dummy','state','0'): either HH:MM:SS or {perlcode}
aber da hat otto ja schon was zu geschrieben.

Zitat von: Xargon am 25 April 2018, 23:41:25
Ich befürchte jedoch, dass mein Problem bereits beim auslesen des state meines Dummys liegt. Denn auch ohne die ReadingsAge Bedingung wird die Bedingung für das Kommando 2 scheinbar nie erfüllt.
Möglicherweise ist es einfach irgendwo ein Tippfehler, aber ich finde ihn einfach nicht.
tippfehler oder die bedingungen sind wirklich nie erfüllt bisher??

Zitat von: Xargon am 25 April 2018, 23:41:25
Ich habe ehrlich gesagt auch noch nicht ganz verstanden wann DOIF getriggert wird. Nur, wenn sich etwas im ersten Bedinungsblock ändert oder auch, wenn sich etwas in den ELSEDOIF Blöcken andert?
auch in den DOELSEIF-Teilen, wenn kein ? vorangestellt ist.
die commandref zu DOIF ist sehr, sehr, sehr umfangreich (auch mit beispielen!), die muss man schon öfter als einmal lesen. :)


wäre es auch eine mögliche lösung deinen dummy verzögert zu setzen durch das DOIF ?? (wait Attribut in der DOIF commandref angucken!)
dann brauchst du dich - wenn ich es richtig verstanden habe - nicht mit ReadingsAge(...) befassen.
viele Wege in FHEM es gibt!

Otto123

#4
Moin Xargon,

den Teil
Zitatand [wz_switch_Sw:state] eq "on")(set wz_switch_Sw off)
Würde ich unabhängig vom Rest so lösen wie in der allgemeinen Doku beschrieben:
(set wz_switch_Sw:FILTER=STATE=on  off)
Gilt auch hier:
(set di_struct_electricity:FILTER=STATE=on off)

Getriggert wird ein DOIF bei einer Änderung einer der Werte die Du abfragst. Dann wird von oben abgearbeitet und jeder Zweig entschieden ob er wahr ist. Wenn Einer wahr ist wird dieser ausgeführt, die folgenden bleiben bis zum nächsten Trigger unbeachtet.

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

Xargon

Hi Nils und Otto,

Ich habe es nun hinbekommen. Mein DOIF sieht nun folgendermaßen aus:
Internals:
   CFGFN     
   DEF        ([Bewohner] eq "home" and [di_struct_electricity] eq "off")(set di_struct_electricity on)
DOELSEIF([Bewohner] eq "home" and [bu_switch_active_dummy:state] eq "false" and [bu_switch_active_dummy:state:sec]>600)(set wz_switch_Sw:FILTER=STATE=on off)
DOELSEIF([Bewohner] eq "home" and [wz_switch_active_dummy:state] eq "false" and [wz_switch_active_dummy:state:sec]>300)(set wz_switch_Sw:FILTER=STATE=on off)
DOELSEIF([Bewohner] ne "home" and [di_struct_electricity] eq "on")(set di_struct_electricity:FILTER=STATE=on off)
   NAME       di_electricity
   NR         705
   NTFY_ORDER 50-di_electricity
   STATE      cmd_2
   TYPE       DOIF
   READINGS:
     2018-04-27 00:53:47   Device          di_struct_electricity
     2018-04-27 00:53:47   cmd             2
     2018-04-27 00:53:47   cmd_event       Bewohner
     2018-04-27 00:53:47   cmd_nr          2
     2018-04-27 00:53:47   e_Bewohner_STATE home
     2018-04-27 00:53:47   e_di_struct_electricity_STATE on
     2018-04-27 00:53:12   e_wz_switch_active_dummy_state false
     2018-04-27 00:50:48   mode            enabled
     2018-04-27 00:53:47   state           cmd_2
   Regex:
   condition:
     0          InternalDoIf($hash,'Bewohner','STATE') eq "home" and InternalDoIf($hash,'di_struct_electricity','STATE') eq "off"
     1          InternalDoIf($hash,'Bewohner','STATE') eq "home" and ReadingValDoIf($hash,'bu_switch_active_dummy','state') eq "false" and ReadingSecDoIf('bu_switch_active_dummy','state')>600
     2          InternalDoIf($hash,'Bewohner','STATE') eq "home" and ReadingValDoIf($hash,'wz_switch_active_dummy','state') eq "false" and ReadingSecDoIf('wz_switch_active_dummy','state')>300
     3          InternalDoIf($hash,'Bewohner','STATE') ne "home" and InternalDoIf($hash,'di_struct_electricity','STATE') eq "on"
   devices:
     0           Bewohner di_struct_electricity
     1           Bewohner bu_switch_active_dummy
     2           Bewohner wz_switch_active_dummy
     3           Bewohner di_struct_electricity
     all         Bewohner di_struct_electricity bu_switch_active_dummy wz_switch_active_dummy
   do:
     0:
       0          set di_struct_electricity on
     1:
       0          set wz_switch_Sw:FILTER=STATE=on off
     2:
       0          set wz_switch_Sw:FILTER=STATE=on off
     3:
       0          set di_struct_electricity:FILTER=STATE=on off
     4:
   helper:
     DOIF_Readings_events
     DOIF_eventas
     event      on
     globalinit 1
     last_timer 0
     sleeptimer -1
     timerdev   Bewohner
     timerevent durTimerPresence_cr: 1,durTimerPresence: 00:01:00
     triggerDev di_struct_electricity
     timerevents:
       durTimerPresence_cr: 1
       durTimerPresence: 00:01:00
     timereventsState:
       durTimerPresence_cr: 1
       durTimerPresence: 00:01:00
     triggerEvents:
       on
     triggerEventsState:
       state: on
   internals:
     0           Bewohner:STATE di_struct_electricity:STATE
     1           Bewohner:STATE
     2           Bewohner:STATE
     3           Bewohner:STATE di_struct_electricity:STATE
     all         Bewohner:STATE di_struct_electricity:STATE
   itimer:
   readings:
     1           bu_switch_active_dummy:state
     2           wz_switch_active_dummy:state
     all         bu_switch_active_dummy:state wz_switch_active_dummy:state
   trigger:
   uiState:
   uiTable:
Attributes:
   alias      Stromautomatik
   devStateIcon cmd_1:user_available@green cmd_2|cmd_3:time_eco_mode@red cmd_4:user_away@red initialized:message_attention@yellow
   group      DOIF_Strom
   icon       helper_doif
   room       DOIF


Ich hatte testweise die Zeit zum Abschalten auf 10 Sekunden gesetzt. Dabei ist mir aufgefallen, dass die Abschaltung erst nach mehr als 10 Sekunden in Kraft getreten ist. Ich nehme an, das liegt daran, dass die Readings nicht sekündlich aktualisiert werden und es so zu zeitlichen Abweichungen kommen kann. Liege ich damit richtig?

An meinem Dummy und "Hilfs-DOIF" habe ich nichts geändert. Es ist ja schon fast peinlich zuzugeben, aber ich habe in meiner Bedingung nicht den korrekten Namen meines Dummys verwendet.
wz_switch_active_dummy != wz_switch_activity_dummy

Vielen Dank euch beiden!

VG Xargon

Otto123

Hi,

ich wollte Deinen Code ja mit meinem Einwurf etwas verkürzen.
Du hast das zwar übernommen, aber im letzten Zweig ist die Abfrage ist noch redundant drin.

Der Ausdruck:  and [di_struct_electricity] eq "on" im Abfrageteil bewirkt das gleiche wie di_struct_electricity:FILTER=STATE=on im Ausführungsteil.

Ich finde es aber eleganter, weil damit erst bei der Ausführung entschieden wird. Es erfolgt vorher zum Einen keine Triggerung (kann man auch verhindern) zum Anderen wird der logische Ausdruck einfacher.

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

Xargon

Hi nochmal,

Ich versuche die Readings Zeitspanne zu verwenden, um die beiden Schalter nach einer halben, bzw. vollen Stunde abzuschalten, nachdem der Leistungsschwellwert unterschritten wurde, also meine Dummy states auf false gesetzt wurden.
Leider springt er aktuell nach maximal zehn Sekunden in cmd_3 und verharrt dann dort. Meinem Verständnis aus commandref nach sollte das erst passieren, nachdem 3600 Sekunden vergangen sind und somit die Zeitspanne größer als 3600 geworden ist. Und wieso springt er zuerst in cmd_3 und nicht in cmd_2, da doch eigentlich 1800<3600?
Habe ich irgendwo einen Denkfehler?

Internals:
   CFGFN     
   DEF        ([Bewohner] eq "home" and [di_struct_electricity] eq "off")(set di_struct_electricity:FILTER=STATE=off on)
DOELSEIF([Bewohner] eq "home" and [wz_switch_active_dummy:state] eq "false" and [wz_switch_active_dummy:state:sec]>1800)(set wz_switch_Sw:FILTER=STATE=on off)
DOELSEIF([Bewohner] eq "home" and [bu_switch_active_dummy:state] eq "false" and [bu_switch_active_dummy:state:sec]>3600)(set bu_switch_Sw:FILTER=STATE=on off)
DOELSEIF([Bewohner] ne "home")(set di_struct_electricity:FILTER=STATE=on off)
   NAME       di_electricity
   NR         705
   NTFY_ORDER 50-di_electricity
   STATE      cmd_3
   TYPE       DOIF
   READINGS:
     2018-04-27 20:51:02   Device          Bewohner
     2018-04-27 20:49:02   cmd             3
     2018-04-27 20:49:02   cmd_event       Bewohner
     2018-04-27 20:49:02   cmd_nr          3
     2018-04-27 20:51:02   e_Bewohner_STATE home
     2018-04-27 20:49:02   e_di_struct_electricity_STATE on
     2018-04-27 20:48:27   e_wz_switch_active_dummy_state false
     2018-04-27 20:46:49   mode            enabled
     2018-04-27 20:49:02   state           cmd_3
   Regex:
   condition:
     0          InternalDoIf($hash,'Bewohner','STATE') eq "home" and InternalDoIf($hash,'di_struct_electricity','STATE') eq "off"
     1          InternalDoIf($hash,'Bewohner','STATE') eq "home" and ReadingValDoIf($hash,'wz_switch_active_dummy','state') eq "false" and ReadingSecDoIf('wz_switch_active_dummy','state')>1800
     2          InternalDoIf($hash,'Bewohner','STATE') eq "home" and ReadingValDoIf($hash,'bu_switch_active_dummy','state') eq "false" and ReadingSecDoIf('bu_switch_active_dummy','state')>3600
     3          InternalDoIf($hash,'Bewohner','STATE') ne "home"
   devices:
     0           Bewohner di_struct_electricity
     1           Bewohner wz_switch_active_dummy
     2           Bewohner bu_switch_active_dummy
     3           Bewohner
     all         Bewohner di_struct_electricity wz_switch_active_dummy bu_switch_active_dummy
   do:
     0:
       0          set di_struct_electricity:FILTER=STATE=off on
     1:
       0          set wz_switch_Sw:FILTER=STATE=on off
     2:
       0          set bu_switch_Sw:FILTER=STATE=on off
     3:
       0          set di_struct_electricity:FILTER=STATE=on off
     4:
   helper:
     DOIF_Readings_events
     DOIF_eventas
     event      durTimerPresence_cr: 3,durTimerPresence: 00:03:00
     globalinit 1
     last_timer 0
     sleeptimer -1
     timerdev   Bewohner
     timerevent durTimerPresence_cr: 3,durTimerPresence: 00:03:00
     triggerDev Bewohner
     timerevents:
       durTimerPresence_cr: 3
       durTimerPresence: 00:03:00
     timereventsState:
       durTimerPresence_cr: 3
       durTimerPresence: 00:03:00
     triggerEvents:
       durTimerPresence_cr: 3
       durTimerPresence: 00:03:00
     triggerEventsState:
       durTimerPresence_cr: 3
       durTimerPresence: 00:03:00
   internals:
     0           Bewohner:STATE di_struct_electricity:STATE
     1           Bewohner:STATE
     2           Bewohner:STATE
     3           Bewohner:STATE
     all         Bewohner:STATE di_struct_electricity:STATE
   itimer:
   readings:
     1           wz_switch_active_dummy:state
     2           bu_switch_active_dummy:state
     all         wz_switch_active_dummy:state bu_switch_active_dummy:state
   trigger:
   uiState:
   uiTable:
Attributes:
   alias      Stromautomatik
   devStateIcon cmd_1:user_available@green cmd_2|cmd_3:time_eco_mode@red cmd_4:user_away@red initialized:message_attention@yellow
   group      DOIF_Strom
   icon       helper_doif
   room       DOIF


VG Xargon

Otto123

Hallo,

das wird jetzt schwierig in der Beurteilung. Was ich aus deinem list sehe: der Bewohnerstatus triggert offenbar ständig. Das muss kein Problem sein.
Eventuell musst Du noch dies hier beachten -> https://forum.fhem.de/index.php/topic,87322.msg797656.html#msg797656
Du musst mit Eventmonitor beobachten, in welcher Reihenfolge was passiert. Von aussen ist das schwer zu beurteilen.

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

Per

Zitat von: Otto123 am 27 April 2018, 09:34:31Der Ausdruck:  and [di_struct_electricity] eq "on" im Abfrageteil bewirkt das gleiche wie di_struct_electricity:FILTER=STATE=on im Ausführungsteil.
Das Gleiche bewirkt es nicht. Der Status des DOIF und die Ausführung der nachfolgenden cmd sind schon sehr unterschiedlich, je nachdem, wie ich die Abfrage stelle.

Ob es in diesen Fall eine Relevanz hat, beurteile ich aber mal nicht.

Otto123

Zitat von: Per am 02 Mai 2018, 11:37:23
Das Gleiche bewirkt es nicht. Der Status des DOIF und die Ausführung der nachfolgenden cmd sind schon sehr unterschiedlich, je nachdem, wie ich die Abfrage stelle.

Ob es in diesen Fall eine Relevanz hat, beurteile ich aber mal nicht.
Aussagen zerpflücken  :'(
Es geht um den ursprünglichen Code in der Frage des TE.
Da der Ausführungsteil nur aus set <> on besteht und in der Abfrage in jedem Zweig mit "and" als Hauptkriterium für das Schalten einbezogen wird, ist das Ergebnis das Gleiche aber kürzer.

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

Xargon

#11
Hallo zusammen,

tut mir Leid, dass ich nicht früher Rückmeldung gegeben habe. Ich hatte die letzten Tage wenig Zeit.

Ich habe nun herausgefunden, was bei mir noch unerwünschte Effekte verursacht hat. Wie zuvor schon erwähnt, arbeite ich mit Dummys, um zu bestimmen, wann der Stromverbrauch einen bestimmten Schwellwert unterschritten hat.
Wenn ich also heimgekommen bin, wurden meine Funksteckdosen aktiviert.
Dabei überschreitet mein Fernseher kurzzeitig den Schwellwert und unterschreitet ihn anschließend schnell wieder. Die Folge davon ist jedoch, dass das Reading meines Dummys neu gesetzt wurde.
Im Büro hingegen, wo nur mein Notebook und ein Bildschirm an der Steckdose hängen, wird der Schwellwert jedoch nicht überschritten. Daher konnte das Dummy Reading schon erheblich älter sein.
Ich habe es nun so gelöst, dass ich beim Heimkommen nun nicht nur die Steckdosen aktiviere, sondern auch meine Hilf-Dummys auf true setze. Somit stelle ich sicher, dass sie nicht bereits "zu alt" sind. Sicherlich gibt es schönere Lösungen. Aber damit verhalten sich meine Steckdosen wie gewünscht.

Mein DOIF sieht nun wie folgt aus:
Internals:
   DEF        ([Bewohner] eq "home" and [di_struct_electricity] eq "off")
(set di_struct_electricity:FILTER=STATE=off on, set bu_switch_active_dummy true, set wz_switch_active_dummy true)
DOELSEIF([Bewohner] eq "home" and [wz_switch_active_dummy:state] eq "false" and [wz_switch_active_dummy:state:sec]>3600)
(set wz_switch_Sw:FILTER=STATE=on off)
DOELSEIF([Bewohner] eq "home" and [bu_switch_active_dummy:state] eq "false" and [bu_switch_active_dummy:state:sec]>5400)
(set bu_switch_Sw:FILTER=STATE=on off)
DOELSEIF([Bewohner] ne "home")(set di_struct_electricity:FILTER=STATE=on off)
   MODEL      FHEM
   NAME       di_electricity
   NR         129
   NTFY_ORDER 50-di_electricity
   STATE      cmd_2
   TYPE       DOIF
   READINGS:
     2018-05-03 21:25:39   Device          Bewohner
     2018-05-03 21:25:39   cmd             2
     2018-05-03 21:25:39   cmd_event       Bewohner
     2018-05-03 21:25:39   cmd_nr          2
     2018-05-03 21:25:39   e_Bewohner_STATE home
     2018-05-03 21:25:35   mode            enabled
     2018-05-03 21:25:39   state           cmd_2
   Regex:
   condition:
     0          InternalDoIf($hash,'Bewohner','STATE') eq "home" and InternalDoIf($hash,'di_struct_electricity','STATE') eq "off"
     1          InternalDoIf($hash,'Bewohner','STATE') eq "home" and ReadingValDoIf($hash,'wz_switch_active_dummy','state') eq "false" and ReadingSecDoIf('wz_switch_active_dummy','state')>3600
     2          InternalDoIf($hash,'Bewohner','STATE') eq "home" and ReadingValDoIf($hash,'bu_switch_active_dummy','state') eq "false" and ReadingSecDoIf('bu_switch_active_dummy','state')>5400
     3          InternalDoIf($hash,'Bewohner','STATE') ne "home"
   devices:
     0           Bewohner di_struct_electricity
     1           Bewohner wz_switch_active_dummy
     2           Bewohner bu_switch_active_dummy
     3           Bewohner
     all         Bewohner di_struct_electricity wz_switch_active_dummy bu_switch_active_dummy
   do:
     0:
       0          set di_struct_electricity:FILTER=STATE=off on, set bu_switch_active_dummy true, set wz_switch_active_dummy true
     1:
       0          set wz_switch_Sw:FILTER=STATE=on off
     2:
       0          set bu_switch_Sw:FILTER=STATE=on off
     3:
       0          set di_struct_electricity:FILTER=STATE=on off
     4:
   helper:
     DOIF_Readings_events
     DOIF_eventas
     event      durTimerPresence_cr: 188,durTimerPresence: 03:08:02
     globalinit 1
     last_timer 0
     sleeptimer -1
     timerdev   Bewohner
     timerevent durTimerPresence_cr: 188,durTimerPresence: 03:08:02
     triggerDev Bewohner
     timerevents:
       durTimerPresence_cr: 188
       durTimerPresence: 03:08:02
     timereventsState:
       durTimerPresence_cr: 188
       durTimerPresence: 03:08:02
     triggerEvents:
       durTimerPresence_cr: 188
       durTimerPresence: 03:08:02
     triggerEventsState:
       durTimerPresence_cr: 188
       durTimerPresence: 03:08:02
   internals:
     0           Bewohner:STATE di_struct_electricity:STATE
     1           Bewohner:STATE
     2           Bewohner:STATE
     3           Bewohner:STATE
     all         Bewohner:STATE di_struct_electricity:STATE
   itimer:
   readings:
     1           wz_switch_active_dummy:state
     2           bu_switch_active_dummy:state
     all         wz_switch_active_dummy:state bu_switch_active_dummy:state
   trigger:
   uiState:
   uiTable:
Attributes:
   alias      Stromautomatik
   devStateIcon cmd_1:user_available@green cmd_2|cmd_3:time_eco_mode@red cmd_4:user_away@red initialized:message_attention@yellow
   group      DOIF_Strom
   icon       helper_doif
   initialize initialized
   room       DOIF


VG Xargon und vielen Dank für eure Hilfe!