DOIF und die Waittimer/Do always - ich kapier es noch immer nicht

Begonnen von Stonemuc, 31 Juli 2022, 13:07:34

Vorheriges Thema - Nächstes Thema

Stonemuc

Hallo Leute,

ich stehe wieder vor meinem altbekannten Problem, was ich öfter habe, wenn ich ein neues DOIF anlege.

Ich möchte meine Waschmaschine und meine Spülmaschine automatisch starten..dazu habe ich folgendes DOIF:

defmod Geraeteautomatik DOIF ([Wechselrichter:AC.Power] > 1000) (set SX758X06TE requestSettings, set WAYH2841 requestSettings)
DOELSEIF ([Wechselrichter:AC.Power] > 1500 and [WAYH2841:BSH.Common.Status.RemoteControlStartAllowed] eq "1") (set WAYH2841 startProgram)
DOELSEIF ([Wechselrichter:AC.Power] > 1501 and [SX758X06TE:BSH.Common.Status.RemoteControlStartAllowed] eq "1") (set SX758X06TE startProgram)
attr Geraeteautomatik room Haus

Wie verwirkliche ich es jetzt, dass die Befehle nur 1 x am Tag ausgeführt werden?  - der Wechselrichter schwankt ja täglich auch mal wieder unter die Werte und dann wieder drüber..mit doalways würde es ja jedes Mal wieder den ersten Teil ausführen, wenn der Wert von AC.Power neu geschrieben wird und über 1000 ist... - analgog auch die anderen beiden ab 1500 und 1501.

Kann ich da Wait benutzen? Schiebe ich mit ait nur den Ausführungsteil nach hinten oer bedeutet wait, dass ich nach der Ausführung des cmd0 cmd1 oder cmd3 dann einen waittimer habe, der die erneute Ausführung dann so lange blockiert wie ich den waitimer setze?

FHEM aus Raspberry PI 3 B+, Haussteuerung auf EnOcean Basis, Tecalor THZ 404eco Wärmepumpe

dyna

Hallo Stonemuc,

ich vermute das Attribut repeatsame im DOIf kann Deiner Lösung helfen. Hier kannst Du die maximale Anzahl hintereinander folgenden Ausführungen festlegen.


Grüße
Jens

Stelaku

Hallo Stonemuc

ich weiss nicht ob es da noch elegantere Lösungen gibt aber ich helfe mir da immer mit einen Reading weches ich mir beim auslösen eines DOIF Fall setzte dieses verhindert dann ein erneutes triggern dieses DOIF Zweiges.
z.b.:

defmod Geraeteautomatik DOIF ([Wechselrichter:AC.Power] > 1000 and [$SELF:nureinmal_cmd1] = 0) (set SX758X06TE requestSettings, set WAYH2841 requestSettings, setreading $SELF nureinmal_cmd1 1)

und dann dieses blockierende Reading wieder auf null setzten damit der Zweig am nächsten Tag wieder getriggert werden kann

DOELSEIF ([00:01]) (setreading $SELF nureinmal_cmd1 0)


vieleicht hilft Dir das weiter

Gruß

Stephan

Damian

Da du alles in einem DOIF hast, können die Zweige immer wechseln - das kannst du nicht durch Attribute verhindern. Entweder du definierst mehrere DOIFs ohne do always mit dem zusätzlichen Zweig DOELSEIF ([00:00]) oder du löst es, wie Stefen es vorgeschlagen hat.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Stonemuc

#4
Zitat von: Stelaku am 31 Juli 2022, 18:34:09
Hallo Stonemuc

ich weiss nicht ob es da noch elegantere Lösungen gibt aber ich helfe mir da immer mit einen Reading weches ich mir beim auslösen eines DOIF Fall setzte dieses verhindert dann ein erneutes triggern dieses DOIF Zweiges.
z.b.:

defmod Geraeteautomatik DOIF ([Wechselrichter:AC.Power] > 1000 and [$SELF:nureinmal_cmd1] = 0) (set SX758X06TE requestSettings, set WAYH2841 requestSettings, setreading $SELF nureinmal_cmd1 1)

und dann dieses blockierende Reading wieder auf null setzten damit der Zweig am nächsten Tag wieder getriggert werden kann

DOELSEIF ([00:01]) (setreading $SELF nureinmal_cmd1 0)


vieleicht hilft Dir das weiter

Gruß

Stephan

Und dann mit do always?

Ich hab das mal modifiziert, gibt mir aber einen Error aus...

Internals:
   CFGFN     
   DEF        ([Wechselrichter:AC.Power] > 500 and [$SELF:nureinmal_cmd1] = 0) (set SX758X06TE requestSettings, set WAYH2841 requestSettings, setreading $SELF nureinmal_cmd1 1) DOELSEIF ([Wechselrichter:AC.Power] > 1000 and [$SELF:nureinmal_cmd2] = 0 and [WAYH2841:BSH.Common.Status.RemoteControlStartAllowed] eq "0") (set Citylife500FHEM_Bot message Waschmaschine könnte gestartet werden, setreading $SELF nureinmal_cmd2 1) DOELSEIF ([Wechselrichter:AC.Power] > 1000 and [$SELF:nureinmal_cmd3] = 0[WAYH2841:BSH.Common.Status.RemoteControlStartAllowed] eq "1") (set WAYH2841 startProgram, set Citylife500FHEM_Bot message Waschmaschine automatisch gestartet, setreading $SELF nureinmal_cmd3 1) DOELSEIF ([Wechselrichter:AC.Power] > 1300 and [$SELF:nureinmal_cmd4] = 0[SX758X06TE:BSH.Common.Status.RemoteControlStartAllowed] eq "0") (set Citylife500FHEM_Bot message Geschirrspüler könnte gestartet werden, setreading $SELF nureinmal_cmd4 1) DOELSEIF ([Wechselrichter:AC.Power] > 1300 and [$SELF:nureinmal_cmd5] = 0 [SX758X06TE:BSH.Common.Status.RemoteControlStartAllowed] eq "1") (set SX758X06TE startProgram, set Citylife500FHEM_Bot message Geschirrspüler automatisch gestartet, setreading $SELF nureinmal_cmd5 1) DOELSEIF ([00:01]) (setreading $SELF nureinmal_cmd1 0, setreading $SELF nureinmal_cmd2 0, setreading $SELF nureinmal_cmd3 0, setreading $SELF nureinmal_cmd4 0, setreading $SELF nureinmal_cmd5 0)
   FUUID      62e65f3b-f33f-37e6-6a7a-f9a7d9d3888158db
   MODEL      FHEM
   NAME       Geraeteautomatik
   NOTIFYDEV  global,Geraeteautomatik,SX758X06TE,WAYH2841,Wechselrichter
   NR         59178
   NTFY_ORDER 50-Geraeteautomatik
   STATE      initialized
   TYPE       DOIF
   VERSION    26182 2022-06-29 18:57:26
   eventCount 17
   READINGS:
     2022-08-01 14:03:35   Device          Wechselrichter
     2022-08-01 13:59:50   cmd             0
     2022-07-31 19:19:44   e_SX758X06TE_BSH.Common.Status.RemoteControlStartAllowed 0
     2022-08-01 14:03:35   e_Wechselrichter_AC.Power 2308
     2022-08-01 14:03:35   error           condition c01: Can't modify non-lvalue subroutine call of &main::ReadingValDoIf in scalar assignment, line 1, at EOF

     2022-08-01 13:59:50   mode            enabled
     2022-08-01 13:59:50   state           initialized
     2022-08-01 13:59:50   timer_01_c06    02.08.2022 00:01:00
   Regex:
     accu:
     collect:
     cond:
       Geraeteautomatik:
         0:
           nureinmal_cmd1 ^Geraeteautomatik$:^nureinmal_cmd1:
         1:
           nureinmal_cmd2 ^Geraeteautomatik$:^nureinmal_cmd2:
         2:
           nureinmal_cmd3 ^Geraeteautomatik$:^nureinmal_cmd3:
         3:
           nureinmal_cmd4 ^Geraeteautomatik$:^nureinmal_cmd4:
         4:
           nureinmal_cmd5 ^Geraeteautomatik$:^nureinmal_cmd5:
       SX758X06TE:
         3:
           BSH.Common.Status.RemoteControlStartAllowed ^SX758X06TE$:^BSH.Common.Status.RemoteControlStartAllowed:
         4:
           BSH.Common.Status.RemoteControlStartAllowed ^SX758X06TE$:^BSH.Common.Status.RemoteControlStartAllowed:
       WAYH2841:
         1:
           BSH.Common.Status.RemoteControlStartAllowed ^WAYH2841$:^BSH.Common.Status.RemoteControlStartAllowed:
         2:
           BSH.Common.Status.RemoteControlStartAllowed ^WAYH2841$:^BSH.Common.Status.RemoteControlStartAllowed:
       Wechselrichter:
         0:
           AC.Power   ^Wechselrichter$:^AC.Power:
         1:
           AC.Power   ^Wechselrichter$:^AC.Power:
         2:
           AC.Power   ^Wechselrichter$:^AC.Power:
         3:
           AC.Power   ^Wechselrichter$:^AC.Power:
         4:
           AC.Power   ^Wechselrichter$:^AC.Power:
   attr:
     cmdState:
     cmdpause:
     wait:
     waitdel:
   condition:
     0          ::ReadingValDoIf($hash,'Wechselrichter','AC.Power') > 500 and ::ReadingValDoIf($hash,'Geraeteautomatik','nureinmal_cmd1') = 0
     1          ::ReadingValDoIf($hash,'Wechselrichter','AC.Power') > 1000 and ::ReadingValDoIf($hash,'Geraeteautomatik','nureinmal_cmd2') = 0 and ::ReadingValDoIf($hash,'WAYH2841','BSH.Common.Status.RemoteControlStartAllowed') eq "0"
     2          ::ReadingValDoIf($hash,'Wechselrichter','AC.Power') > 1000 and ::ReadingValDoIf($hash,'Geraeteautomatik','nureinmal_cmd3') = 0::ReadingValDoIf($hash,'WAYH2841','BSH.Common.Status.RemoteControlStartAllowed') eq "1"
     3          ::ReadingValDoIf($hash,'Wechselrichter','AC.Power') > 1300 and ::ReadingValDoIf($hash,'Geraeteautomatik','nureinmal_cmd4') = 0::ReadingValDoIf($hash,'SX758X06TE','BSH.Common.Status.RemoteControlStartAllowed') eq "0"
     4          ::ReadingValDoIf($hash,'Wechselrichter','AC.Power') > 1300 and ::ReadingValDoIf($hash,'Geraeteautomatik','nureinmal_cmd5') = 0 ::ReadingValDoIf($hash,'SX758X06TE','BSH.Common.Status.RemoteControlStartAllowed') eq "1"
     5          ::DOIF_time_once($hash,0,$wday)
   days:
   do:
     0:
       0          set SX758X06TE requestSettings, set WAYH2841 requestSettings, setreading Geraeteautomatik nureinmal_cmd1 1
     1:
       0          set Citylife500FHEM_Bot message Waschmaschine könnte gestartet werden, setreading Geraeteautomatik nureinmal_cmd2 1
     2:
       0          set WAYH2841 startProgram, set Citylife500FHEM_Bot message Waschmaschine automatisch gestartet, setreading Geraeteautomatik nureinmal_cmd3 1
     3:
       0          set Citylife500FHEM_Bot message Geschirrspüler könnte gestartet werden, setreading Geraeteautomatik nureinmal_cmd4 1
     4:
       0          set SX758X06TE startProgram, set Citylife500FHEM_Bot message Geschirrspüler automatisch gestartet, setreading Geraeteautomatik nureinmal_cmd5 1
     5:
       0          setreading Geraeteautomatik nureinmal_cmd1 0, setreading Geraeteautomatik nureinmal_cmd2 0, setreading Geraeteautomatik nureinmal_cmd3 0, setreading Geraeteautomatik nureinmal_cmd4 0, setreading Geraeteautomatik nureinmal_cmd5 0
     6:
   helper:
     NOTIFYDEV  global,Geraeteautomatik,SX758X06TE,WAYH2841,Wechselrichter
     event      AC.Power: 2308,AC.Power.Fast: 2308,Daily.Energy: 3.93,generator.1.current: 10.09,generator.1.voltage: 350,output.1.power: 764,output.1.voltage: 229,output.2.power: 773,output.2.voltage: 240,output.3.power: 771,output.3.voltage: 236,sensor.3: 0.01,W: 2308 - Einspeisen (MPP),EnergyExpected: 10.305092
     globalinit 1
     last_timer 1
     sleeptimer -1
     triggerDev Wechselrichter
     triggerEvents:
       AC.Power: 2308
       AC.Power.Fast: 2308
       Daily.Energy: 3.93
       generator.1.current: 10.09
       generator.1.voltage: 350
       output.1.power: 764
       output.1.voltage: 229
       output.2.power: 773
       output.2.voltage: 240
       output.3.power: 771
       output.3.voltage: 236
       sensor.3: 0.01
       W: 2308 - Einspeisen (MPP)
       EnergyExpected: 10.305092
     triggerEventsState:
       AC.Power: 2308
       AC.Power.Fast: 2308
       Daily.Energy: 3.93
       generator.1.current: 10.09
       generator.1.voltage: 350
       output.1.power: 764
       output.1.voltage: 229
       output.2.power: 773
       output.2.voltage: 240
       output.3.power: 771
       output.3.voltage: 236
       sensor.3: 0.01
       state: W: 2308 - Einspeisen (MPP)
       EnergyExpected: 10.305092
   internals:
   intervalfunc:
   localtime:
     0          1659391260
   readings:
     all         Wechselrichter:AC.Power Geraeteautomatik:nureinmal_cmd1 Geraeteautomatik:nureinmal_cmd2 WAYH2841:BSH.Common.Status.RemoteControlStartAllowed Geraeteautomatik:nureinmal_cmd3 Geraeteautomatik:nureinmal_cmd4 SX758X06TE:BSH.Common.Status.RemoteControlStartAllowed Geraeteautomatik:nureinmal_cmd5
   realtime:
     0          00:01:00
   time:
     0          00:01:00
   timeCond:
     0          5
   timer:
     0          0
   timers:
     5           0
   trigger:
   triggertime:
     1659391260:
       localtime  1659391260
       hash:
   uiState:
   uiTable:
Attributes:
   room       Haus
FHEM aus Raspberry PI 3 B+, Haussteuerung auf EnOcean Basis, Tecalor THZ 404eco Wärmepumpe

Stelaku

#5
Hallo Stonemuc

Die Fehlermeldung kommt daher weil die Readings nureinmal_cmd1 bis 5 noch nicht existieren. Die werden ja erst um [00:01]
das erste mal geschrieben. Oder du legst eine setlist mit den einzelnen Readings an.


Dann fehlen noch mehrere and in den zweigen 3,4 und 5.
Ein do always brauchst Du eigentlich nicht da ja Deine Zweige nur einmal pro Tag getriggert werden sollen.

Gruß

Stephan

Stonemuc

ups... die and habe ich ergänzt.

Dann schau ich morgen mal...

Vielen Dank
FHEM aus Raspberry PI 3 B+, Haussteuerung auf EnOcean Basis, Tecalor THZ 404eco Wärmepumpe

Stelaku

mir ist da noch ein fehler in meinem Beispiel aufgefallen bei der Abfrage auf Zahlen muss es == 0 lauten sonst kommt auch diese Fehlermeldung.
([Wechselrichter:AC.Power] > 500 and [$SELF:nureinmal_cmd1] == 0)
(set SX758X06TE requestSettings,
set WAYH2841 requestSettings,
setreading $SELF nureinmal_cmd1 1)
DOELSEIF ( [Wechselrichter:AC.Power] > 1000 and
[$SELF:nureinmal_cmd2] == 0 and
[WAYH2841:BSH.Common.Status.RemoteControlStartAllowed] eq "0")
(set Citylife500FHEM_Bot message Waschmaschine könnte gestartet werden,
setreading $SELF nureinmal_cmd2 1)
DOELSEIF ( [Wechselrichter:AC.Power] > 1000 and
[$SELF:nureinmal_cmd3] == 0 and
[WAYH2841:BSH.Common.Status.RemoteControlStartAllowed] eq "1")
(set WAYH2841 startProgram,
set Citylife500FHEM_Bot message Waschmaschine automatisch gestartet,
setreading $SELF nureinmal_cmd3 1)
DOELSEIF ( [Wechselrichter:AC.Power] > 1300 and
[$SELF:nureinmal_cmd4] == 0 and
[SX758X06TE:BSH.Common.Status.RemoteControlStartAllowed] eq "0")
(set Citylife500FHEM_Bot message Geschirrspüler könnte gestartet werden,
setreading $SELF nureinmal_cmd4 1)
DOELSEIF ( [Wechselrichter:AC.Power] > 1300 and
[$SELF:nureinmal_cmd5] == 0 and
[SX758X06TE:BSH.Common.Status.RemoteControlStartAllowed] eq "1")
(set SX758X06TE startProgram,
set Citylife500FHEM_Bot message Geschirrspüler automatisch gestartet,
setreading $SELF nureinmal_cmd5 1)
DOELSEIF ([00:01])
(setreading $SELF nureinmal_cmd1 0,
setreading $SELF nureinmal_cmd2 0,
setreading $SELF nureinmal_cmd3 0,
setreading $SELF nureinmal_cmd4 0,
setreading $SELF nureinmal_cmd5 0)


Gruß

Stephan


Stonemuc

#8
Hab die = in == geändert...trotzdem bleibt der Error bei mir da..mal schauen ob das DOIF trotzdem läuft...

EDIT:
DOIF läuft, Error ist jetzt auch weg..

Vielen Dank fr den Hinweis mit dem reading...
FHEM aus Raspberry PI 3 B+, Haussteuerung auf EnOcean Basis, Tecalor THZ 404eco Wärmepumpe

Stonemuc

Ich hab noch ne allgemeine Frage zu meinem DOIF...

Meine Waschmaschine startet nur, wenn ich das aktuell ausgewählte Programm zusammen mit dem Start Befehl angebestartProgram XXX.

Wie kann ich das in einen Set Befehl aus dem Waschmaschinen reading umwandeln? Das Reading der Waschmaschine WAYH2841 lautet z.B., kann aber auch mit anderem Programm anders ausshehen...da steht an anstelle von "Mix" etwas anderes...:

BSH.Common.Root.SelectedProgram Mix 2022-08-08 09:38:38

Das reading lasse ich vor dem Programmstart abfragen und ist dann immer aktuell, wie an der Maschine von Hand eingestellt...
FHEM aus Raspberry PI 3 B+, Haussteuerung auf EnOcean Basis, Tecalor THZ 404eco Wärmepumpe