DOIF wird immer wiederholt, kein attr do always gesetzt

Begonnen von Nexium, 10 August 2019, 20:42:12

Vorheriges Thema - Nächstes Thema

Nexium

Hallo,

ich hab folgedes DOIF es wird immer wieder ausgeführt und ich weis nicht warum.

Internals:
   CFGFN     
   DEF        ([PlugS:"^power:..*$"] > 0.01) (setreading PlugS start [PlugS:energy], set PlugSTelegramDOIF enable, setreading PlugS running 1)
   FUUID      5d4f0d51-f33f-c32d-a03d-b8ba64800892e073
   MODEL      FHEM
   NAME       PlugS_Start
   NR         45817
   NTFY_ORDER 50-PlugS_DOIF_1
   STATE      cmd_2
   TYPE       DOIF
   VERSION    19786 2019-07-05 21:47:08
   READINGS:
     2019-08-10 20:39:19   Device          PlugS
     2019-08-10 20:39:19   cmd             2
     2019-08-10 20:39:19   cmd_event       PlugS
     2019-08-10 20:39:19   cmd_nr          2
     2019-08-10 20:39:19   e_PlugS_events  energy: 18288
     2019-08-10 20:31:41   mode            enabled
     2019-08-10 20:39:19   state           cmd_2
     2019-08-10 20:36:28   wait_timer      no timer
   Regex:
     accu:
   attr:
     cmdState:
     repeatcmd:
     wait:
     waitdel:
   condition:
     0          ::EventDoIf('PlugS',$hash,'^power:..*$',1) > 0.01
   devices:
     0           PlugS
     all         PlugS
   do:
     0:
       0          setreading PlugS start [PlugS:energy], set PlugSTelegramDOIF enable, setreading PlugS running 1
     1:
   helper:
     event      energy: 18288
     globalinit 1
     last_timer 0
     sleepdevice PlugS
     sleepsubtimer 0
     sleeptimer -1
     timerdev   PlugS
     timerevent energy: 18288
     triggerDev PlugS
     DOIF_eventas:
       cmd_nr: 2
       cmd: 2
       cmd_event: PlugS
       state: cmd_2
     timerevents:
       energy: 18288
     timereventsState:
       energy: 18288
     triggerEvents:
       energy: 18288
     triggerEventsState:
       energy: 18288
   internals:
   itimer:
   readings:
   trigger:
     all         PlugS
   uiState:
   uiTable:
Attributes:
   room       Strom2


Vielleicht kann mir jemand weiter helfen.

amenomade

([PlugS:"^power:..*$"])
ist eine Ereignissteuerung. Bei jedem passenden Event wird es getriggert
Dann ein Ereignis mit 0.01 zu vergleichen hat wenig Sinn und ist immer wahr. Deswegen wird der Befehl immer wieder ausgeführt

Was Du willst ist wahrscheinlich eher ([PlugS:power] > 0.01)
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

Nexium

Danke für deine Antwort. Ja ich hatte es anfangs so wie du es beschrieben hast und dann mal abgeändert. In der ersten Variante die ich oben eingefügt hab wird es bei jedem Event ausgelöst wie du sagst. Richtig ist die von dir beschrieben Variante.

Internals:
   CFGFN     
   DEF        ([PlugS:power] > 0.01) (setreading PlugS start [PlugS:energy], set PlugSTelegramDOIF enable, setreading PlugS running 1)
   FUUID      5d4f0d51-f33f-c32d-a03d-b8ba64800892e073
   MODEL      FHEM
   NAME       PlugS_Start
   NR         45817
   NTFY_ORDER 50-PlugS_DOIF_1
   STATE      cmd_1
   TYPE       DOIF
   VERSION    19786 2019-07-05 21:47:08
   READINGS:
     2019-08-10 21:15:39   Device          PlugS
     2019-08-10 21:14:45   cmd             1
     2019-08-10 21:14:45   cmd_event       PlugS
     2019-08-10 21:14:45   cmd_nr          1
     2019-08-10 21:15:39   e_PlugS_power   50.49
     2019-08-10 21:11:27   mode            enabled
     2019-08-10 21:14:45   state           cmd_1
   Regex:
     accu:
   attr:
     cmdState:
     repeatcmd:
     wait:
     waitdel:
   condition:
     0          ::ReadingValDoIf($hash,'PlugS','power') > 0.01
   devices:
     0           PlugS
     all         PlugS
   do:
     0:
       0          setreading PlugS start [PlugS:energy], set PlugSTelegramDOIF enable, setreading PlugS running 1
     1:
   helper:
     event      energy: 20200
     globalinit 1
     last_timer 0
     sleeptimer -1
     timerdev   PlugS
     timerevent power: 50.49,Amper: 0.220
     triggerDev PlugS
     DOIF_eventas:
       cmd_nr: 1
       cmd: 1
       cmd_event: PlugS
       state: cmd_1
     timerevents:
       power: 50.49
       Amper: 0.220
     timereventsState:
       power: 50.49
       Amper: 0.220
     triggerEvents:
       energy: 20200
     triggerEventsState:
       energy: 20200
   internals:
   itimer:
   readings:
     0           PlugS:power
     all         PlugS:power
   trigger:
   uiState:
   uiTable:
Attributes:
   room       Strom2


Aber müsste das DOIF nicht einmalig ausgeführt werden wenn power größer als 0.01 ist und dann nie wieder? Sprich selbst wenn power 0.00 wird und dann wieder auf größer 0.01 geht dürfte es doch ohne attr do always nicht auslösen oder?

Otto123

#3
Nein ein Wechsel des Ergebnisses der Bedingung macht das DOIF quasi wieder scharf.
Also bei jeder triggerung des Gerätes PlugS
Bedingung falsch -> nichts passiert
Bedingung wahr -> Ausführung weil Wechsel falsch wahr
Bedingung wahr -> nichts passiert weil kein Wechsel
Bedingung wahr -> nichts passiert weil kein Wechsel
Bedingung falsch -> nichts passiert
Bedingung wahr -> Ausführung weil Wechsel falsch wahr

Mit do always wäre es so
Bedingung falsch -> nichts passiert
Bedingung wahr -> Ausführung weil Wechsel falsch wahr
Bedingung wahr -> Ausführung weil trigger und do always
Bedingung wahr -> Ausführung weil trigger und do always
Bedingung falsch -> nichts passiert
Bedingung wahr -> Ausführung weil Wechsel falsch wahr

So habe ich das zumindest mal verstanden...

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

amenomade

Zitat von: Nexium am 10 August 2019, 21:19:19

Aber müsste das DOIF nicht einmalig ausgeführt werden wenn power größer als 0.01 ist und dann nie wieder? Sprich selbst wenn power 0.00 wird und dann wieder auf größer 0.01 geht dürfte es doch ohne attr do always nicht auslösen oder?
Nein weil:
Zitat von: CommandeRefSoll bei Nicht-Erfüllung aller Bedingungen ein Zustandswechsel erfolgen, so muss man ein DOELSE am Ende der Definition anhängen. Ausnahme ist eine einzige Bedingung ohne do always, wie im obigen Beispiel, hierbei wird intern ein virtuelles DOELSE angenommen, um bei Nicht-Erfüllung der Bedingung einen Zustandswechsel in cmd_2 zu provozieren, da sonst nur ein einziges Mal geschaltet werden könnte, da das Modul aus dem cmd_1-Zustand nicht mehr herauskäme.
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

Nexium

okay wieder was gelernt, vielen dank.

Möchte ich das DOIF nur einmal ausführen muss ich noch ein set PlugS_start disable anhängen?

Otto123

Oder die erste Bedingung so ausbauen, dass es in Kombination nur wahr wird. Denn wirklich nur einmal wirst Du es ja nicht wollen?

Also nur als Anregung: Ich habe ein DOIF das soll in einem Zeitfenster nur einmal was auslösen, egal wie oft der Schalter auf on geht. Das geht quasi einmal am Tag.

([05:51-11:00] and [LichtBWaSw_02] eq "on")
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

Nexium

okay, ich muss mir das nochmal durch den Kopf gehen lassen aber es würde dann in meinem Fall wohl mit dem reading running klappen wenn ich das dann noch in die Bedinung mit rein nehme.

Ist es unüblich ein DOIF auf disable oder enable zu setzen?

Frank_Huber

Oder wenn es einmal am Tag benachrichtigen soll ein
DOELSEIF ([18:00]) dahinter. Dann wird das doif immer um diese Zeit "zurückgesetzt"

Gesendet von meinem S60 mit Tapatalk


Otto123

Zitat von: Nexium am 10 August 2019, 22:43:46
Ist es unüblich ein DOIF auf disable oder enable zu setzen?
Nein kannst Du auch machen ..
@Frank Deinen Vorschlag versteh ich nicht. Das Problem der existierenden Bedingung ist doch, das sie wiederholt den Zustand wechselt.
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

Frank_Huber

Zitat von: Otto123 am 10 August 2019, 23:07:36
Nein kannst Du auch machen ..
@Frank Deinen Vorschlag versteh ich nicht. Das Problem der existierenden Bedingung ist doch, das sie wiederholt den Zustand wechselt.
Das ist für das Problem der fehlenden Rüvksetzung des DOIF.
Wenn sich der doif Status nicht ändert wird das doif damit zurückgesetzt.

Gesendet von meinem S60 mit Tapatalk


Otto123

Zitat von: Frank_Huber am 10 August 2019, 23:12:26
Das ist für das Problem der fehlenden Rüvksetzung des DOIF.
Wenn sich der doif Status nicht ändert wird das doif damit zurückgesetzt.

Gesendet von meinem S60 mit Tapatalk
Du bist auf dem falschen Dampfer  ;) es ist in dem Fall genau anders herum.
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