[GELÖST] Waschmaschinenstatus: Zustandswechsel bei Ausbleiben eines Events

Begonnen von OliS., 28 Februar 2018, 22:09:08

Vorheriges Thema - Nächstes Thema

OliS.

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

FHEM in Debian VM auf DS720+, HMLAN und HMUARTLGW, RFXTRX, Conbee II, Homebridge, Alexa
Geräte: Homematic, Tradfri, Shelly, IT, ESA2000, VU+, Denon-AVR, Sonos, Fritz!Box, Harmony Hub, IP-Cams, Roborock, Automower

Otto123

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

OliS.

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
FHEM in Debian VM auf DS720+, HMLAN und HMUARTLGW, RFXTRX, Conbee II, Homebridge, Alexa
Geräte: Homematic, Tradfri, Shelly, IT, ESA2000, VU+, Denon-AVR, Sonos, Fritz!Box, Harmony Hub, IP-Cams, Roborock, Automower

OliS.

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
FHEM in Debian VM auf DS720+, HMLAN und HMUARTLGW, RFXTRX, Conbee II, Homebridge, Alexa
Geräte: Homematic, Tradfri, Shelly, IT, ESA2000, VU+, Denon-AVR, Sonos, Fritz!Box, Harmony Hub, IP-Cams, Roborock, Automower

Damian

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

Ellert

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?

OliS.

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
FHEM in Debian VM auf DS720+, HMLAN und HMUARTLGW, RFXTRX, Conbee II, Homebridge, Alexa
Geräte: Homematic, Tradfri, Shelly, IT, ESA2000, VU+, Denon-AVR, Sonos, Fritz!Box, Harmony Hub, IP-Cams, Roborock, Automower