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.
([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)
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?
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
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.
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?
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")
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?
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
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.
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
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.