FHEM Forum

FHEM => Automatisierung => DOIF => Thema gestartet von: abc2006 am 09 Februar 2020, 23:46:33

Titel: [gelöst] wait bei set DF_xx cmd_2
Beitrag von: abc2006 am 09 Februar 2020, 23:46:33
Hallo zusammen,
ich möchte gerne ein DOIF von Hand schalten, und eine per wait verzögerte Befehlsfolge ausführen. list hänge ich dann gerne noch an.
Erstmal gehts ums Prinzip:

a) in der commandref steht:
ZitatMit set <DOIF-modul> cmd_<nr> lässt sich ein Befehlszweig (cmd_1, cmd_2, usw.) bedingunglos ausführen.
Der Befehl hat folgende Eigenschaften:
1) der set-Befehl übersteuert alle Attribute wie z. B. wait, do, usw.

Das liest sich für mich so, als ob dass wait-Attribut bei einem set DF_xx cmd_y komplett ignoriert wird.
b) Im Forenbeitrag
https://forum.fhem.de/index.php/topic,107199.msg1011427.html#msg1011427 (https://forum.fhem.de/index.php/topic,107199.msg1011427.html#msg1011427)
schreibt amenomade (mal völlig aus dem Zusammenhang gerissen, aber es geht ja nur um die Verzögerung - sorry ;)

Zitat von: amenomade am 10 Januar 2020, 18:56:41
Führen wir "set di3 cmd_1" aus
(1)- es schaltet auf cmd 1.1
(2)- 30s später auf cmd 1.2
(3)- 30s später auf cmd 1.3
Also wird doch gewartet, bis das wait rum ist?

c) jetzt komm ich zu meinen persönlichen Erfahrungen.
Beim  testen hatte ich den Eindruck, dass bei
set DF_xx cmd_1
das wait berücksichtigt wird, bei
set DF_xx cmd_2
aber nicht.
Zu dieser Erkenntnis möchte ich gerne ein minimal-Doif anhängen, was (meiner Meinung nach) zeigt, dass es genau so ist:
Internals:
   CFGFN     
   DEF        (1)
(setreading $SELF 1_1 x)
(setreading $SELF 1_2 x)
(setreading $SELF 1_3 x)
(setreading $SELF 1_4 x)
(setreading $SELF 1_5 x)
(setreading $SELF 1_6 x)
(2)
(setreading $SELF 2_1 x)
(setreading $SELF 2_2 x)
(setreading $SELF 2_3 x)
(setreading $SELF 2_4 x)
(setreading $SELF 2_5 x)
(setreading $SELF 2_6 x)
   FUUID      5e4086b1-f33f-4040-db2b-edae36016c41e445
   MODEL      FHEM
   NAME       DF_test_wait
   NOTIFYDEV  global
   NR         1937193
   NTFY_ORDER 50-DF_test_wait
   STATE      cmd_2
   TYPE       DOIF
   VERSION    20811 2019-12-22 17:45:08
   READINGS:
     2020-02-09 23:26:58   1_1             x
     2020-02-09 23:27:00   1_2             x
     2020-02-09 23:27:02   1_3             x
     2020-02-09 23:27:04   1_4             x
     2020-02-09 23:27:06   1_5             x
     2020-02-09 23:27:08   1_6             x
     2020-02-09 23:27:08   2_1             x
     2020-02-09 23:27:08   2_2             x
     2020-02-09 23:27:08   2_3             x
     2020-02-09 23:27:08   2_4             x
     2020-02-09 23:27:08   2_5             x
     2020-02-09 23:27:08   2_6             x
     2020-02-09 23:27:15   cmd             2
     2020-02-09 23:27:15   cmd_event       set_cmd_2
     2020-02-09 23:27:15   cmd_nr          2
     2020-02-09 23:26:52   mode            enabled
     2020-02-09 23:27:15   state           cmd_2
     2020-02-09 23:27:08   wait_timer      no timer
   Regex:
     accu:
   attr:
     cmdState:
     wait:
       0:
         2
         2
         2
         2
         2
         2
       1:
         2
         2
         2
         2
         2
         2
     waitdel:
   condition:
     0          1
   do:
     0:
       0          setreading DF_test_wait 1_1 x
       1          setreading DF_test_wait 1_2 x
       10         setreading DF_test_wait 2_4 x
       11         setreading DF_test_wait 2_5 x
       12         setreading DF_test_wait 2_6 x
       2          setreading DF_test_wait 1_3 x
       3          setreading DF_test_wait 1_4 x
       4          setreading DF_test_wait 1_5 x
       5          setreading DF_test_wait 1_6 x
       6          2
       7          setreading DF_test_wait 2_1 x
       8          setreading DF_test_wait 2_2 x
       9          setreading DF_test_wait 2_3 x
     1:
   helper:
     DEVFILTER  ^global$
     NOTIFYDEV  global
     event     
     globalinit 1
     last_timer 0
     sleepdevice set_cmd_1
     sleepsubtimer -1
     sleeptimer -1
     triggerDev
     triggerEvents
     triggerEventsState
   uiState:
   uiTable:
Attributes:
   wait       2,2,2,2,2,2:2,2,2,2,2,2


Wie man sieht, sind die orders von Befehl 1 schön um jeweils 2 sekunden versetzt, während die Orders von Befehl 2 alle gleichzeitig ausgeführt werden.

Warum ich jetzt diesen Beitrag schreibe:
Mir würde es sehr entgegenkommen, wenn das Verhalten bei Befehl 2 identisch zu Befehl 1 wäre:
Wait für cmd_y_1 wird ignoriert, alle anderen werden eingehalten.


Hier ist noch das list von meinem original-DOIF (was wie gesagt mit der Frage nur indirekt zu tun hat):

Internals:
   DEF        ([BMS:1_SOC_BMS_total:d] < 20)
(set alarmbot message DF_switch_PV_Line  Netz _cmd1_ [BMS:1_SOC_BMS_total:d])
(set KNX50.O02_Aktor_PV_in steuern on)
(set KNX33.O03_Aktor_NetzPV_doppel Netz)
(set KNX33.O02_Aktor_NetzPV_einzel Netz)
(set KNX50.O02_Aktor_PV_in steuern off)
(set KNX33.O08_Aktor_EffektaWR steuern off)
DOELSEIF([BMS:1_SOC_BMS_total:d] > 25 && [$SELF:FullyCharged:sec] < 604800 && [Effekta:Device_Mode] eq "Battery Mode")
(set KNX33.O08_Aktor_EffektaWR steuern on)
(set alarmbot message DF_switch_PV_Line  PV _cmd2_ [BMS:1_SOC_BMS_total:d])
(set KNX50.O02_Aktor_PV_in steuern on)
(set KNX33.O03_Aktor_NetzPV_doppel PV)
(set KNX33.O02_Aktor_NetzPV_einzel PV)
(set KNX50.O02_Aktor_PV_in steuern off)
DOELSEIF([KNX50.O01_Aktor_PV_out:active_current:d] == 0 && [KNX33.O02_Aktor_NetzPV_einzel] ne "Netz" && [KNX33.O03_Aktor_NetzPV_doppel] ne "Netz")
(
set alarmbot message DF_switch_PV_Line Ausfall PV Netz _cmd3_,
set Pushover msg ALARM DF_switch_PV_Line Ausfall PV title=PV priority=1,
set $SELF cmd_1
)
DOELSEIF([BMS:1_SOC_BMS_total:d] > 70 || [$SELF:checkit] < 0)
(
setreading $SELF FullyCharged y
)
   FUUID      5ca61632-f33f-4040-fd90-07118ec98190fba6
   MODEL      FHEM
   NAME       DF_switch_PV_Line
   NOTIFYDEV  KNX33.O02_Aktor_NetzPV_einzel,KNX50.O01_Aktor_PV_out,Effekta,DF_switch_PV_Line,global,BMS,KNX33.O03_Aktor_NetzPV_doppel,KNX50.O02_Aktor_PV_in
   NR         469
   NTFY_ORDER 50-DF_switch_PV_Line
   STATE      doppel: Netz
einzel: Netz
   TYPE       DOIF
   VERSION    20811 2019-12-22 17:45:08
   DOIF_Readings:
     Effekta    ::ReadingValDoIf($hash,'Effekta','Device_Mode')
     KNX50.O01_Aktor_PV_out ::ReadingValDoIf($hash,'KNX50.O01_Aktor_PV_out','status')
     KNX50.O02_Aktor_PV_in ::ReadingValDoIf($hash,'KNX50.O02_Aktor_PV_in','status')
     NetzPV_doppel ::InternalDoIf($hash,'KNX33.O03_Aktor_NetzPV_doppel','STATE')
     NetzPV_einzel ::InternalDoIf($hash,'KNX33.O02_Aktor_NetzPV_einzel','STATE')
     checkit    ::ReadingSecDoIf('DF_switch_PV_Line','FullyCharged')
     soc        ::ReadingValDoIf($hash,'BMS','1_SOC_BMS_total','','d')
   OLDREADINGS:
   READINGS:
     2020-02-09 23:44:35   Device          BMS
     2020-02-09 09:02:28   Effekta         Battery Mode
     2020-02-02 18:21:31   FullyCharged    y
     2020-02-08 19:56:29   KNX50.O01_Aktor_PV_out off
     2020-02-09 23:21:03   KNX50.O02_Aktor_PV_in off
     2020-02-09 23:20:52   NetzPV_doppel   Netz
     2020-02-09 23:20:57   NetzPV_einzel   Netz
     2020-02-09 23:18:50   checkit         622639
     2020-02-09 23:21:07   cmd             1.6
     2020-02-09 23:21:07   cmd_event       set_cmd_1
     2020-02-09 23:21:07   cmd_nr          1
     2020-02-09 23:21:07   cmd_seqnr       6
     2020-02-09 23:44:35   e_BMS_1_SOC_BMS_total 21.6
     2020-02-09 23:18:50   e_DF_switch_PV_Line_checkit 622639
     2020-02-09 23:44:29   e_Effekta_Device_Mode Battery Mode
     2020-02-09 23:20:57   e_KNX33.O02_Aktor_NetzPV_einzel_STATE Netz
     2020-02-09 23:20:52   e_KNX33.O03_Aktor_NetzPV_doppel_STATE Netz
     2020-02-09 23:18:50   mode            enabled
     2020-02-09 22:56:40   soc             21.6
     2020-02-09 23:21:07   state           cmd_1
     2020-02-09 23:21:07   wait_timer      no timer
   Regex:
     DOIF_Readings:
       BMS:
         soc:
           1_SOC_BMS_total ^BMS$:^1_SOC_BMS_total:
       DF_switch_PV_Line:
         checkit:
           FullyCharged ^DF_switch_PV_Line$:^FullyCharged:
       Effekta:
         Effekta:
           Device_Mode ^Effekta$:^Device_Mode:
       KNX33.O02_Aktor_NetzPV_einzel:
         NetzPV_einzel:
           &STATE     ^KNX33.O02_Aktor_NetzPV_einzel$
       KNX33.O03_Aktor_NetzPV_doppel:
         NetzPV_doppel:
           &STATE     ^KNX33.O03_Aktor_NetzPV_doppel$
       KNX50.O01_Aktor_PV_out:
         KNX50.O01_Aktor_PV_out:
           status     ^KNX50.O01_Aktor_PV_out$:^status:
       KNX50.O02_Aktor_PV_in:
         KNX50.O02_Aktor_PV_in:
           status     ^KNX50.O02_Aktor_PV_in$:^status:
     accu:
     cond:
       BMS:
         0:
           1_SOC_BMS_total ^BMS$:^1_SOC_BMS_total:
         1:
           1_SOC_BMS_total ^BMS$:^1_SOC_BMS_total:
         2:
         3:
           1_SOC_BMS_total ^BMS$:^1_SOC_BMS_total:
       DF_switch_PV_Line:
         0:
         1:
           FullyCharged ^DF_switch_PV_Line$:^FullyCharged:
         2:
         3:
           checkit    ^DF_switch_PV_Line$:^checkit:
       Effekta:
         0:
         1:
           Device_Mode ^Effekta$:^Device_Mode:
         2:
         3:
       KNX33.O02_Aktor_NetzPV_einzel:
         0:
         1:
         2:
           &STATE     ^KNX33.O02_Aktor_NetzPV_einzel$
         3:
       KNX33.O03_Aktor_NetzPV_doppel:
         0:
         1:
         2:
           &STATE     ^KNX33.O03_Aktor_NetzPV_doppel$
         3:
       KNX50.O01_Aktor_PV_out:
         2:
           active_current ^KNX50.O01_Aktor_PV_out$:^active_current:
   attr:
     cmdState:
     wait:
       0:
         0
         0
         5
         5
         5
         5
       1:
         0
       2:
         60
         5
         5
         5
         5
       3:
         10
       4:
         0
       5:
         0
     waitdel:
   condition:
     0          ::ReadingValDoIf($hash,'BMS','1_SOC_BMS_total','','d') < 20
     1          ::ReadingValDoIf($hash,'BMS','1_SOC_BMS_total','','d') > 25 && ::ReadingSecDoIf('DF_switch_PV_Line','FullyCharged') < 604800 && ::ReadingValDoIf($hash,'Effekta','Device_Mode') eq "Battery Mode"
     2          ::ReadingValDoIf($hash,'KNX50.O01_Aktor_PV_out','active_current','','d') == 0 && ::InternalDoIf($hash,'KNX33.O02_Aktor_NetzPV_einzel','STATE') ne "Netz" && ::InternalDoIf($hash,'KNX33.O03_Aktor_NetzPV_doppel','STATE') ne "Netz"
     3          ::ReadingValDoIf($hash,'BMS','1_SOC_BMS_total','','d') > 70 || ::ReadingValDoIf($hash,'DF_switch_PV_Line','checkit') < 0
   do:
     0:
       0          set alarmbot message DF_switch_PV_Line  Netz _cmd1_ [BMS:1_SOC_BMS_total:d]
       1          set KNX50.O02_Aktor_PV_in steuern on
       2          set KNX33.O03_Aktor_NetzPV_doppel Netz
       3          set KNX33.O02_Aktor_NetzPV_einzel Netz
       4          set KNX50.O02_Aktor_PV_in steuern off
       5          set KNX33.O08_Aktor_EffektaWR steuern off
     1:
       0          set KNX33.O08_Aktor_EffektaWR steuern on
       1          set alarmbot message DF_switch_PV_Line  PV _cmd2_ [BMS:1_SOC_BMS_total:d]
       2          set KNX50.O02_Aktor_PV_in steuern on
       3          set KNX33.O03_Aktor_NetzPV_doppel PV
       4          set KNX33.O02_Aktor_NetzPV_einzel PV
       5          set KNX50.O02_Aktor_PV_in steuern off
     2:
       0           set alarmbot message DF_switch_PV_Line Ausfall PV Netz _cmd3_, set Pushover msg ALARM DF_switch_PV_Line Ausfall PV title=PV priority=1, set DF_switch_PV_Line cmd_1
     3:
       0           setreading DF_switch_PV_Line FullyCharged y
     4:
   helper:
     DEVFILTER  ^global$|^KNX33.O02_Aktor_NetzPV_einzel$|^KNX33.O03_Aktor_NetzPV_doppel$|^KNX50.O01_Aktor_PV_out$|^BMS$|^Effekta$|^DF_switch_PV_Line$|^KNX50.O02_Aktor_PV_in$
     NOTIFYDEV  global|KNX33.O02_Aktor_NetzPV_einzel|KNX33.O03_Aktor_NetzPV_doppel|KNX50.O01_Aktor_PV_out|BMS|Effekta|DF_switch_PV_Line|KNX50.O02_Aktor_PV_in
     event      1_SOC_BMS_total: 21.6
     globalinit 1
     last_timer 0
     sleepdevice set_cmd_1
     sleepsubtimer -1
     sleeptimer -1
     timerdev   KNX33.O02_Aktor_NetzPV_einzel
     timerevent status: PV,named_status: PV Mode
     triggerDev BMS
     timerevents:
       status: PV
       named_status: PV Mode
     timereventsState:
       status: PV
       named_status: PV Mode
     triggerEvents:
       1_SOC_BMS_total: 21.6
     triggerEventsState:
       1_SOC_BMS_total: 21.6
   internals:
     all         KNX33.O02_Aktor_NetzPV_einzel:STATE KNX33.O03_Aktor_NetzPV_doppel:STATE
   readings:
     all         BMS:1_SOC_BMS_total DF_switch_PV_Line:FullyCharged Effekta:Device_Mode KNX50.O01_Aktor_PV_out:active_current DF_switch_PV_Line:checkit
   trigger:
   uiState:
   uiTable:
Attributes:
   DOIF_Readings NetzPV_einzel:[KNX33.O02_Aktor_NetzPV_einzel],
NetzPV_doppel:[KNX33.O03_Aktor_NetzPV_doppel],
checkit:[$SELF:FullyCharged:sec],
soc:[BMS:1_SOC_BMS_total:d],
Effekta:[Effekta:Device_Mode],
KNX50.O02_Aktor_PV_in:[KNX50.O02_Aktor_PV_in:status],
KNX50.O01_Aktor_PV_out:[KNX50.O01_Aktor_PV_out:status]
   devStateIcon Netz:message_socket@red:PV PV:measure_photovoltaic_inst@orange:Netz

   disable    0
   eventMap   cmd_1:Netz cmd_2:PV

   room       Solar_PV,_doif
   selftrigger all
   startup    set $SELF checkall
   stateFormat doppel: NetzPV_doppel
einzel: NetzPV_einzel
   wait       0,0,5,5,5,5:0:60,5,5,5,5:10:0:0



Vielen Dank für eure Hilfe,
Stephan
Titel: Antw:wait bei set DF_xx cmd_2
Beitrag von: Damian am 10 Februar 2020, 09:12:18
Bei set cmd wird das erste Wait einer Sequenz übergangen.

z. B

(set bla1 on) (set bla2 on) (set bla3 on)

wait 1,2,3


set bla1 on wird sofort ausgeführt, die anderen beiden mit Verzögerung.

Das Verhalten ist für alle Zweige: set cmd_1, set cmd_2 usw. gleich.
Titel: Antw:wait bei set DF_xx cmd_2
Beitrag von: abc2006 am 10 Februar 2020, 11:54:58
Hi Damian,
Danke für deine Antwort.
Woher kommt es dann, dass die Readings 2_.* alle den gleichen Zeitstempel haben?
Grüße,
Stephan
Titel: Antw:wait bei set DF_xx cmd_2
Beitrag von: Damian am 10 Februar 2020, 12:07:20
Zitat von: abc2006 am 10 Februar 2020, 11:54:58
Hi Damian,
Danke für deine Antwort.
Woher kommt es dann, dass die Readings 2_.* alle den gleichen Zeitstempel haben?
Grüße,
Stephan

Weil du keinen cmd_2-Zweig richtig definiert hast:

statt (2) muss DOELSE dahin.

Titel: Antw:wait bei set DF_xx cmd_2
Beitrag von: abc2006 am 10 Februar 2020, 12:42:30
Das hab ich total übersehen... Mist. War wohl zu spät gestern. So funktioniert es (natürlich) ;)
(Habe DOELSEIF verwendet, weil ich das dann später brauche, funktioniert ganz genau so)

Internals:
   CFGFN     
   DEF        (1)
(setreading $SELF 1_1 x)
(setreading $SELF 1_2 x)
(setreading $SELF 1_3 x)
(setreading $SELF 1_4 x)
(setreading $SELF 1_5 x)
(setreading $SELF 1_6 x)
DOELSEIF(2)
(setreading $SELF 2_1 x)
(setreading $SELF 2_2 x)
(setreading $SELF 2_3 x)
(setreading $SELF 2_4 x)
(setreading $SELF 2_5 x)
(setreading $SELF 2_6 x)
   FUUID      5e4086b1-f33f-4040-db2b-edae36016c41e445
   MODEL      FHEM
   NAME       DF_test_wait
   NOTIFYDEV  global
   NR         1937193
   NTFY_ORDER 50-DF_test_wait
   STATE      cmd_2
   TYPE       DOIF
   VERSION    20811 2019-12-22 17:45:08
   READINGS:
     2020-02-10 12:17:08   1_1             x
     2020-02-10 12:17:10   1_2             x
     2020-02-10 12:17:12   1_3             x
     2020-02-10 12:17:14   1_4             x
     2020-02-10 12:17:16   1_5             x
     2020-02-10 12:17:18   1_6             x
     2020-02-10 12:17:27   2_1             x
     2020-02-10 12:17:29   2_2             x
     2020-02-10 12:17:31   2_3             x
     2020-02-10 12:17:33   2_4             x
     2020-02-10 12:17:35   2_5             x
     2020-02-10 12:17:37   2_6             x
     2020-02-10 12:17:37   cmd             2.6
     2020-02-10 12:17:37   cmd_event       set_cmd_2
     2020-02-10 12:17:37   cmd_nr          2
     2020-02-10 12:17:37   cmd_seqnr       6
     2020-02-10 12:17:03   mode            enabled
     2020-02-10 12:17:37   state           cmd_2
     2020-02-10 12:17:37   wait_timer      no timer
   Regex:
     accu:
   attr:
     cmdState:
     wait:
       0:
         2
         2
         2
         2
         2
         2
       1:
         2
         2
         2
         2
         2
         2
     waitdel:
   condition:
     0          1
     1          2
   do:
     0:
       0          setreading DF_test_wait 1_1 x
       1          setreading DF_test_wait 1_2 x
       2          setreading DF_test_wait 1_3 x
       3          setreading DF_test_wait 1_4 x
       4          setreading DF_test_wait 1_5 x
       5          setreading DF_test_wait 1_6 x
     1:
       0          setreading DF_test_wait 2_1 x
       1          setreading DF_test_wait 2_2 x
       2          setreading DF_test_wait 2_3 x
       3          setreading DF_test_wait 2_4 x
       4          setreading DF_test_wait 2_5 x
       5          setreading DF_test_wait 2_6 x
     2:
   helper:
     DEVFILTER  ^global$
     NOTIFYDEV  global
     event     
     globalinit 1
     last_timer 0
     sleepdevice set_cmd_2
     sleepsubtimer -1
     sleeptimer -1
     triggerDev
     triggerEvents
     triggerEventsState
     DOIF_eventa:
       cmd_nr: 2
       cmd_seqnr: 6
       cmd_event: set_cmd_2
       cmd_2
     DOIF_eventas:
       cmd_nr: 2
       cmd_seqnr: 6
       cmd_event: set_cmd_2
       state: cmd_2
   uiState:
   uiTable:
Attributes:
   wait       2,2,2,2,2,2:2,2,2,2,2,2



[ tausende unnötige Zeilen entfernt :)]

Tja manchmal hilft das verfassen von Einträgen beim öffnen der Augen:
wait       0,0,5,5,5,5:0:60,5,5,5,5:10:0:0

Es hat genau das gemacht, was es sollte, mir ist wohl beim editieren ein Doppelpunkt statt einem Komma entfleucht.

Allerdings möchte ich vorschlagen, dass die cmdref angepasst wird, weil (zumindest mir) das aktuelle (wünschenswerte) Verhalten nicht ganz klar wurde:
1a) bei wait wird der erste Timer pro cmd ignoriert, alle folgenden Timer werden beachtet.

Danke nochmal für deine Hilfe,
Stephan

Titel: Antw:wait bei set DF_xx cmd_2
Beitrag von: Damian am 10 Februar 2020, 15:50:21
Zitat von: abc2006 am 10 Februar 2020, 12:42:30
Allerdings möchte ich vorschlagen, dass die cmdref angepasst wird, weil (zumindest mir) das aktuelle (wünschenswerte) Verhalten nicht ganz klar wurde:
1a) bei wait wird der erste Timer pro cmd ignoriert, alle folgenden Timer werden beachtet.

kommt ins nächste Update.