Ich habe ein kniffliges Problem, an dem ich mir echt die Zähne ausbeiße.
Ist es möglich, ein DOIF über Events eines Gerätes erst in den einen Zustand und dann durch AUSBLEIBEN der Events in den nächsten Zustand zu bringen? Folgender Anwendungsfall:
Ich habe eine Energiemesssteckdose (Revolt), mit der ich den Zustand meiner Waschmaschine versuche in FHEM abzubilden. Wenn die Leistungsaufnahme über 3 Watt steigt, soll mein DOIF meinen Waschmaschinen-Dummy auf "waschen" stellen. Wenn die Leistungsaufnahme unter 3 Watt sinkt, soll das DOIF den Dummy auf "fertig" stellen. Gleichzeitig wird alle 1800 eine Push-Nachricht abgesetzt "Wäsche aufhängen". Soweit so einfach. Aber jetzt wird es (für mich) kompliziert.
Als Bestätigung, dass die Wäsche aufgehängt wurde, wird die Energiemessdose stromlos gemacht. Das heißt, ab diesem Zeitpunkt sendet sie nicht mehr. Und genau über das Ausbleiben dieser Events würde ich mein DOIF gerne in einen dritten Zustand bringen, "waschmaschine aus", keine Push mehr.
Ist sowas möglich?
Oli
Hi Oli,
aus der Doku
ZitatAnwendungsbeispiel: Meldung beim Ausbleiben eines Events
define di_push DOIF ([Tempsensor])(set pushmsg "sensor failed again")
attr di_push wait 1800
attr di_push do resetwait
Gruß Otto
Hey Otto,
danke für Deine Antwort. Die Doku zu DOIF kenne ich (ob ich sie komplett verstanden habe, weiß ich nicht). Und ich kenne auch den zitierten Abschnitt. Bei einem DOIF mit einem Befehlszweig funktioniert das Attribut "resetwait" auch wie es soll. Leider bezieht sich resetwait immer auf das komplette DOIF. Und da ich zusätzlich das Attribut "repeatcmd" für den zweiten Befehlszweig verwende, um die Push "Wäsche aufhängen" so lange zu wiederholen, bis die Messsteckdose stromlos ist, funktioniert das leider nicht so, wie ich mir das vorstelle.
Hier mal mein DOIF:
Internals:
DEF ([Revolt_3f21:energy_power:d]>3 and [$SELF] eq "cmd_3")
(set pushmsg_admin msg 'Waschmaschine' 'gestartet')
(set waschmaschine waschen)
DOELSEIF
([Revolt_3f21:energy_power:d]<3 and [$SELF] eq "cmd_1")
(set pushmsg_admin msg 'Erinnerung' 'Wäsche aufhängen')
(set waschmaschine fertig)
DOELSEIF
(["Revolt_3f21"] and [$SELF] eq "cmd_2")
(set pushmsg_admin msg 'Waschmaschine' 'aus')
(set waschmaschine aus)
NAME di_waschmaschine
NR 749
NTFY_ORDER 50-di_waschmaschine
STATE initialized
TYPE DOIF
READINGS:
2018-03-01 21:24:46 Device Revolt_3f21
2018-03-01 21:19:00 cmd 0
2018-03-01 21:24:46 e_Revolt_3f21_energy_power 0 W
2018-03-01 21:19:00 mode enabled
2018-03-01 21:19:00 state initialized
Regex:
cond:
:
0:
1:
2:
"Revolt_3f21" Revolt_3f21
condition:
0 ReadingValDoIf($hash,'Revolt_3f21','energy_power','','d')>3 and InternalDoIf($hash,'di_waschmaschine','STATE') eq "cmd_3"
1 ReadingValDoIf($hash,'Revolt_3f21','energy_power','','d')<3 and InternalDoIf($hash,'di_waschmaschine','STATE') eq "cmd_1"
2 EventDoIf('Revolt_3f21',$hash,'',0) and InternalDoIf($hash,'di_waschmaschine','STATE') eq "cmd_2"
devices:
0 Revolt_3f21 di_waschmaschine
1 Revolt_3f21 di_waschmaschine
2 di_waschmaschine
all Revolt_3f21 di_waschmaschine
do:
0:
0 set pushmsg_admin msg 'Waschmaschine' 'gestartet'
1 set waschmaschine waschen
1:
0 set pushmsg_admin msg 'Erinnerung' 'Wäsche aufhängen'
1 set waschmaschine fertig
2:
0 set pushmsg_admin msg 'Waschmaschine' 'aus'
1 set waschmaschine aus
3:
helper:
DOIF_Readings_events
DOIF_eventas
event voltage: 234 V,energy_current: 0 A,energy_power: 0 W,energy_total: 20.5400,energy_pf: 0 ,frequency: 50 Hz,EPOW: 0 ESUM: 20.5400
globalinit 1
last_timer 0
sleeptimer -1
triggerDev Revolt_3f21
triggerEvents:
voltage: 234 V
energy_current: 0 A
energy_power: 0 W
energy_total: 20.5400
energy_pf: 0
frequency: 50 Hz
EPOW: 0 ESUM: 20.5400
triggerEventsState:
voltage: 234 V
energy_current: 0 A
energy_power: 0 W
energy_total: 20.5400
energy_pf: 0
frequency: 50 Hz
state: EPOW: 0 ESUM: 20.5400
internals:
0 di_waschmaschine:STATE
1 di_waschmaschine:STATE
2 di_waschmaschine:STATE
all di_waschmaschine:STATE
itimer:
readings:
0 Revolt_3f21:energy_power
1 Revolt_3f21:energy_power
all Revolt_3f21:energy_power
trigger:
uiState:
uiTable:
Attributes:
do resetwait
repeatcmd 0:600:0
wait 0:300:60
Keine Ahnung, ob resetwait sich überhaupt mit repeatcmd verträgt.
Oli
Ok, dann formuliere ich meine Frage noch mal konkreter.
Ist es möglich, das Attribut "resetwait" in einem DOIF mit mehreren Befehlszweigen und mehreren Wait-Timern zu verwenden? Oder besser, lässt sich beeinflussen, dass das resetwait nur für einen bestimmten Befehlszweig gilt?
Vielleicht kann ja einer der DOIF-Gurus hier einen kurzen Blick drauf werfen.
Ein schönes Restwochenende.
Oli
Zitat von: OliS. am 04 März 2018, 11:39:07
Ok, dann formuliere ich meine Frage noch mal konkreter.
Ist es möglich, das Attribut "resetwait" in einem DOIF mit mehreren Befehlszweigen und mehreren Wait-Timern zu verwenden? Oder besser, lässt sich beeinflussen, dass das resetwait nur für einen bestimmten Befehlszweig gilt?
Vielleicht kann ja einer der DOIF-Gurus hier einen kurzen Blick drauf werfen.
Ein schönes Restwochenende.
Oli
Resetwait gilt für alle Zweige, die mit wait ausgestattet sind.
Da muss man ggf. das Problem in mehrer DOIFs aufteilen, oder sich mal DOIF-Perl anschauen https://forum.fhem.de/index.php/topic,84969.0.html, da muss man mehr "programmieren", dafür hat man beliebig viele Wait-Timer und kann selbst entscheiden, wann man einen Timer zurücksetzt und wann nicht.
Zitat von: OliS. am 01 März 2018, 21:27:52
Hey Otto,
danke für Deine Antwort. Die Doku zu DOIF kenne ich (ob ich sie komplett verstanden habe, weiß ich nicht). Und ich kenne auch den zitierten Abschnitt. Bei einem DOIF mit einem Befehlszweig funktioniert das Attribut "resetwait" auch wie es soll. Leider bezieht sich resetwait immer auf das komplette DOIF. Und da ich zusätzlich das Attribut "repeatcmd" für den zweiten Befehlszweig verwende, um die Push "Wäsche aufhängen" so lange zu wiederholen, bis die Messsteckdose stromlos ist, funktioniert das leider nicht so, wie ich mir das vorstelle.
Hier mal mein DOIF:
Internals:
DEF ([Revolt_3f21:energy_power:d]>3 and [$SELF] eq "cmd_3")
(set pushmsg_admin msg 'Waschmaschine' 'gestartet')
(set waschmaschine waschen)
DOELSEIF
([Revolt_3f21:energy_power:d]<3 and [$SELF] eq "cmd_1")
(set pushmsg_admin msg 'Erinnerung' 'Wäsche aufhängen')
(set waschmaschine fertig)
DOELSEIF
(["Revolt_3f21"] and [$SELF] eq "cmd_2")
(set pushmsg_admin msg 'Waschmaschine' 'aus')
(set waschmaschine aus)
NAME di_waschmaschine
NR 749
NTFY_ORDER 50-di_waschmaschine
STATE initialized
TYPE DOIF
READINGS:
2018-03-01 21:24:46 Device Revolt_3f21
2018-03-01 21:19:00 cmd 0
2018-03-01 21:24:46 e_Revolt_3f21_energy_power 0 W
2018-03-01 21:19:00 mode enabled
2018-03-01 21:19:00 state initialized
Regex:
cond:
:
0:
1:
2:
"Revolt_3f21" Revolt_3f21
condition:
0 ReadingValDoIf($hash,'Revolt_3f21','energy_power','','d')>3 and InternalDoIf($hash,'di_waschmaschine','STATE') eq "cmd_3"
1 ReadingValDoIf($hash,'Revolt_3f21','energy_power','','d')<3 and InternalDoIf($hash,'di_waschmaschine','STATE') eq "cmd_1"
2 EventDoIf('Revolt_3f21',$hash,'',0) and InternalDoIf($hash,'di_waschmaschine','STATE') eq "cmd_2"
devices:
0 Revolt_3f21 di_waschmaschine
1 Revolt_3f21 di_waschmaschine
2 di_waschmaschine
all Revolt_3f21 di_waschmaschine
do:
0:
0 set pushmsg_admin msg 'Waschmaschine' 'gestartet'
1 set waschmaschine waschen
1:
0 set pushmsg_admin msg 'Erinnerung' 'Wäsche aufhängen'
1 set waschmaschine fertig
2:
0 set pushmsg_admin msg 'Waschmaschine' 'aus'
1 set waschmaschine aus
3:
helper:
DOIF_Readings_events
DOIF_eventas
event voltage: 234 V,energy_current: 0 A,energy_power: 0 W,energy_total: 20.5400,energy_pf: 0 ,frequency: 50 Hz,EPOW: 0 ESUM: 20.5400
globalinit 1
last_timer 0
sleeptimer -1
triggerDev Revolt_3f21
triggerEvents:
voltage: 234 V
energy_current: 0 A
energy_power: 0 W
energy_total: 20.5400
energy_pf: 0
frequency: 50 Hz
EPOW: 0 ESUM: 20.5400
triggerEventsState:
voltage: 234 V
energy_current: 0 A
energy_power: 0 W
energy_total: 20.5400
energy_pf: 0
frequency: 50 Hz
state: EPOW: 0 ESUM: 20.5400
internals:
0 di_waschmaschine:STATE
1 di_waschmaschine:STATE
2 di_waschmaschine:STATE
all di_waschmaschine:STATE
itimer:
readings:
0 Revolt_3f21:energy_power
1 Revolt_3f21:energy_power
all Revolt_3f21:energy_power
trigger:
uiState:
uiTable:
Attributes:
do resetwait
repeatcmd 0:600:0
wait 0:300:60
Keine Ahnung, ob resetwait sich überhaupt mit repeatcmd verträgt.
Oli
Ich weiss nicht welche Events Revolt liefert, aber wenn
Zitatwird die Energiemessdose stromlos gemacht. Das heißt, ab diesem Zeitpunkt sendet sie nicht mehr.
zutrifft, halte ich ein Warten auf ein Event, wie
Zitat["Revolt_3f21"]
für übertrieben hoffnungsvoll.
Warum verwendest Du Befehlssequenzen, wie
Zitat(set pushmsg_admin msg 'Waschmaschine' 'gestartet')
(set waschmaschine waschen)
? Das ist nicht sinnvoll ohne entsprechende Waittimer?
Danke Euch Dreien für Eure Antworten,
ich habe es jetzt mit zwei zusätzlichen DOIF gelöst. Diese füllen in Abhängigkeit davon, ob die Revolt periodisch sendet oder nicht, ein userReading "power on/off" an der Messsteckdose, dieses wird per stateFormat zum State und diesen frage ich dann einfach in meinem eigentlichen Waschmaschinen-DOIF ab.
Internals:
DEF ([Revolt_3f21:energy_power:d1] > 3 and [?Revolt_3f21] eq "on" and [?$SELF] eq "cmd_3")
(set pushmsg msg 'Waschmaschine' 'gestartet')
DOELSEIF
([Revolt_3f21:energy_power:d1] < 2 and [?Revolt_3f21] eq "on" and [?$SELF] eq "cmd_1")
(set pushmsg msg title=Erinnerung 'Wäsche aufhängen' sound=bike,
(set FHEM_TTS tts Erinnerung, Wäsche aufhängen))
DOELSEIF
([Revolt_3f21:energy_power:d1] < 2 and [?Revolt_3f21] eq "off" and [?$SELF] eq "cmd_2")
NAME di_waschmaschine
NR 748
NTFY_ORDER 50-di_waschmaschine
STATE cmd_1
TYPE DOIF
READINGS:
2018-03-18 13:25:14 Device Revolt_3f21
2018-03-18 12:59:13 cmd 1
2018-03-18 12:59:13 cmd_event Revolt_3f21
2018-03-18 12:59:13 cmd_nr 1
2018-03-18 13:25:14 e_Revolt_3f21_STATE on
2018-03-18 13:25:14 e_Revolt_3f21_energy_power 13.1 W
2018-03-07 10:38:28 mode enabled
2018-03-18 12:59:13 state cmd_1
2018-03-17 16:36:01 wait_timer no timer
Regex:
condition:
0 ReadingValDoIf($hash,'Revolt_3f21','energy_power','','d1') > 3 and InternalDoIf($hash,'Revolt_3f21','STATE') eq "on" and InternalDoIf($hash,'di_waschmaschine','STATE') eq "cmd_3"
1 ReadingValDoIf($hash,'Revolt_3f21','energy_power','','d1') < 2 and InternalDoIf($hash,'Revolt_3f21','STATE') eq "on" and InternalDoIf($hash,'di_waschmaschine','STATE') eq "cmd_1"
2 ReadingValDoIf($hash,'Revolt_3f21','energy_power','','d1') < 2 and InternalDoIf($hash,'Revolt_3f21','STATE') eq "off" and InternalDoIf($hash,'di_waschmaschine','STATE') eq "cmd_2"
devices:
0 Revolt_3f21
1 Revolt_3f21
2 Revolt_3f21
all Revolt_3f21
do:
0:
0 set pushmsg msg 'Waschmaschine' 'gestartet'
1:
0 set pushmsg msg title=Erinnerung 'Wäsche aufhängen' sound=bike
1 (set FHEM_TTS tts Erinnerung, Wäsche aufhängen)
2:
0
3:
helper:
DOIF_Readings_events
DOIF_eventas
event power: on
globalinit 1
last_timer 0
sleepdevice Revolt_3f21
sleepsubtimer 0
sleeptimer -1
timerdev Revolt_3f21
timerevent power: on
triggerDev Revolt_3f21
timerevents:
power: on
timereventsState:
power: on
triggerEvents:
power: on
triggerEventsState:
power: on
internals:
0 Revolt_3f21:STATE di_waschmaschine:STATE
1 Revolt_3f21:STATE di_waschmaschine:STATE
2 Revolt_3f21:STATE di_waschmaschine:STATE
all Revolt_3f21:STATE di_waschmaschine:STATE
itimer:
readings:
0 Revolt_3f21:energy_power
1 Revolt_3f21:energy_power
2 Revolt_3f21:energy_power
all Revolt_3f21:energy_power
trigger:
uiState:
uiTable:
Attributes:
alias Waschmaschine
devStateIcon cmd_1:scene_washing_machine@green cmd_2:scene_washing_machine@orange cmd_3:scene_washing_machine@red
group 3 Information
repeatcmd 0:1800,1800
room Keller
wait 0:60
Vielleicht wäre es ja eine Überlegung wert, das Attribut "resetwait" ebenfalls separat für jeden Zweig eines DOIF zu ermöglichen. Analog zu "wait".
ZitatWarum verwendest Du Befehlssequenzen...
Das stammt noch aus Zeiten, als ich mich mit DOIF noch nicht so gut auskannte (sagt jetzt bitte nichts!). Ich weiß, dass das nicht viel Sinn ergibt. Werde jetzt mal nach und nach meine DOIF optimieren.
Schönen Sonntag Euch allen und Danke für die Hilfe.
Oli