Gelöst: DOIF schaltet nicht, obwohl Bedingung erfüllt sein sollte -> checkall

Begonnen von abc2006, 28 September 2019, 10:45:40

Vorheriges Thema - Nächstes Thema

abc2006

Hallo,
ich habe folgendes DOIF gebaut:

Internals:
   DEF        ( [Effekta:Device_Mode] ne "Battery Mode" || ([BMS:1_SOC_BMS_total:d] < [$SELF:sw_PV2Line] && ([?KNX33.O03_Aktor_NetzPV_doppel] eq "PV" || [?KNX33.O02_Aktor_NetzPV_einzel] eq "PV")))
(set alarmbot message DF_switch_PV_Line  Netz _cmd1_)
(set KNX02.O11_Aktor_PV_In steuern on)
(set KNX33.O03_Aktor_NetzPV_doppel Netz)
(set KNX33.O02_Aktor_NetzPV_einzel Netz)
(set KNX02.O11_Aktor_PV_In steuern off)
DOELSEIF([BMS:1_SOC_BMS_total:d] > [$SELF:sw_Line2PV] && ([?KNX33.O03_Aktor_NetzPV_doppel] eq "Netz" || [?KNX33.O02_Aktor_NetzPV_einzel] eq "Netz") && [$SELF:FullyCharged:sec] < 172800 && [Effekta:Device_Mode] eq "Battery Mode")
(set alarmbot message DF_switch_PV_Line  PV _cmd2_)
(set KNX02.O11_Aktor_PV_In steuern on)
(set KNX33.O03_Aktor_NetzPV_doppel PV)
(set KNX33.O02_Aktor_NetzPV_einzel PV)
(set KNX02.O11_Aktor_PV_In steuern off)
DOELSEIF([KNX02.O12_Aktor_PV_Out:current:d] == 0 && ([?KNX33.O03_Aktor_NetzPV_doppel] eq "PV" || [?KNX33.O02_Aktor_NetzPV_einzel] eq "PV"))
(
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(1)
(
setreading $SELF sw_PV2Line 15,
setreading $SELF sw_Line2PV 20
)
DOELSEIF([BMS:1_SOC_BMS_total:d] > 70)
(
setreading $SELF FullyCharged y,
setreading $SELF sw_PV2Line 15,
setreading $SELF sw_Line2PV 20
)
   FUUID      5ca61632-f33f-4040-fd90-07118ec98190fba6
   MODEL      FHEM
   NAME       DF_switch_PV_Line
   NR         496
   NTFY_ORDER 50-DF_switch_PV_Line
   STATE      doppel: Netz
einzel: Netz
   TYPE       DOIF
   DOIF_Readings:
     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:
     2019-09-28 10:38:20   Device          BMS
     2019-09-27 14:13:12   NetzPV_doppel   Netz
     2019-09-27 14:13:13   NetzPV_einzel   Netz
     2019-09-27 15:41:01   checkit         1569591661
     2019-09-27 15:41:01   cmd             4
     2019-09-27 15:41:01   cmd_event       DF_switch_PV_Line
     2019-09-27 15:41:01   cmd_nr          4
     2019-09-28 10:38:20   e_BMS_1_SOC_BMS_total 72.6
     2019-09-27 15:41:01   e_DF_switch_PV_Line_sw_Line2PV 20
     2019-09-28 10:38:04   e_Effekta_Device_Mode Battery Mode
     2019-09-28 10:27:31   e_KNX02.O12_Aktor_PV_Out_current 0 mA
     2019-09-27 15:41:01   mode            enabled
     2019-09-28 10:38:20   soc             72.6
     2019-09-27 15:41:01   state           cmd_4
     2019-09-27 15:41:01   sw_Line2PV      20
     2019-09-27 15:41:01   sw_PV2Line      15
   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:
       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$
     accu:
   attr:
     cmdState:
     wait:
       0:
         5
         0
         1
         1
         1
       1:
         900
         0
         1
         1
         1
       2:
         0
       3:
         0
     waitdel:
   condition:
     0           ::ReadingValDoIf($hash,'Effekta','Device_Mode') ne "Battery Mode" || (::ReadingValDoIf($hash,'BMS','1_SOC_BMS_total','','d') < ::ReadingValDoIf($hash,'DF_switch_PV_Line','sw_PV2Line') && (::InternalDoIf($hash,'KNX33.O03_Aktor_NetzPV_doppel','STATE') eq "PV" || ::InternalDoIf($hash,'KNX33.O02_Aktor_NetzPV_einzel','STATE') eq "PV"))
     1          ::ReadingValDoIf($hash,'BMS','1_SOC_BMS_total','','d') > ::ReadingValDoIf($hash,'DF_switch_PV_Line','sw_Line2PV') && (::InternalDoIf($hash,'KNX33.O03_Aktor_NetzPV_doppel','STATE') eq "Netz" || ::InternalDoIf($hash,'KNX33.O02_Aktor_NetzPV_einzel','STATE') eq "Netz") && ::ReadingSecDoIf('DF_switch_PV_Line','FullyCharged') < 172800 && ::ReadingValDoIf($hash,'Effekta','Device_Mode') eq "Battery Mode"
     2          ::ReadingValDoIf($hash,'KNX02.O12_Aktor_PV_Out','current','','d') == 0 && (::InternalDoIf($hash,'KNX33.O03_Aktor_NetzPV_doppel','STATE') eq "PV" || ::InternalDoIf($hash,'KNX33.O02_Aktor_NetzPV_einzel','STATE') eq "PV")
     3          1
     4          ::ReadingValDoIf($hash,'BMS','1_SOC_BMS_total','','d') > 70
   devices:
     0           Effekta BMS DF_switch_PV_Line
     1           BMS DF_switch_PV_Line Effekta
     2           KNX02.O12_Aktor_PV_Out
     4           BMS
     all         Effekta BMS DF_switch_PV_Line KNX02.O12_Aktor_PV_Out
   do:
     0:
       0          set alarmbot message DF_switch_PV_Line  Netz _cmd1_
       1          set KNX02.O11_Aktor_PV_In steuern on
       2          set KNX33.O03_Aktor_NetzPV_doppel Netz
       3          set KNX33.O02_Aktor_NetzPV_einzel Netz
       4          set KNX02.O11_Aktor_PV_In steuern off
     1:
       0          set alarmbot message DF_switch_PV_Line  PV _cmd2_
       1          set KNX02.O11_Aktor_PV_In steuern on
       2          set KNX33.O03_Aktor_NetzPV_doppel PV
       3          set KNX33.O02_Aktor_NetzPV_einzel PV
       4          set KNX02.O11_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 sw_PV2Line 15, setreading DF_switch_PV_Line sw_Line2PV 20
     4:
       0           setreading DF_switch_PV_Line FullyCharged y, setreading DF_switch_PV_Line sw_PV2Line 15, setreading DF_switch_PV_Line sw_Line2PV 20
     5:
   helper:
     DOIF_Readings_events
     event      1_Power_total: 1200
     globalinit 1
     last_timer 0
     sleeptimer -1
     timerdev   BMS
     timerevent 1_Power_total: 1200
     triggerDev BMS
     DOIF_eventas:
       cmd_nr: 4
       cmd: 4
       cmd_event: DF_switch_PV_Line
       state: cmd_4
     timerevents:
       1_Power_total: 1200
     timereventsState:
       1_Power_total: 1200
     triggerEvents:
       1_Power_total: 1200
     triggerEventsState:
       1_Power_total: 1200
   internals:
     0           KNX33.O03_Aktor_NetzPV_doppel:STATE KNX33.O02_Aktor_NetzPV_einzel:STATE
     1           KNX33.O03_Aktor_NetzPV_doppel:STATE KNX33.O02_Aktor_NetzPV_einzel:STATE
     2           KNX33.O03_Aktor_NetzPV_doppel:STATE KNX33.O02_Aktor_NetzPV_einzel:STATE
     all         KNX33.O03_Aktor_NetzPV_doppel:STATE KNX33.O02_Aktor_NetzPV_einzel:STATE
   itimer:
   readings:
     0           Effekta:Device_Mode BMS:1_SOC_BMS_total DF_switch_PV_Line:sw_PV2Line
     1           BMS:1_SOC_BMS_total DF_switch_PV_Line:sw_Line2PV DF_switch_PV_Line:FullyCharged Effekta:Device_Mode
     2           KNX02.O12_Aktor_PV_Out:current
     4           BMS:1_SOC_BMS_total
     all         Effekta:Device_Mode BMS:1_SOC_BMS_total DF_switch_PV_Line:sw_PV2Line DF_switch_PV_Line:sw_Line2PV DF_switch_PV_Line:FullyCharged KNX02.O12_Aktor_PV_Out:current
   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]

   checkall   all
   devStateIcon Netz:message_socket@red:PV PV:measure_photovoltaic_inst@orange:Netz

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


Leider bleibt es im cmd_4, obwohl die Bedingung DOELSEIF([BMS:1_SOC_BMS_total:d] > 70) bereits mehrfach erfüllt wurde (vom Device BMS, als auch durch einen manuellen Befehl "setreading BMS 1_SOC_BMS_total 71.5".



2019-09-28 10:37:04.895 dummy BMS 1_SOC_BMS_total: 71.5
2019-09-28 10:37:25.755 dummy BMS 1_SOC_BMS_total: 72.3
2019-09-28 10:38:20.434 dummy BMS 1_SOC_BMS_total: 72.6
2019-09-28 10:39:41.902 dummy BMS 1_SOC_BMS_total: 73

Was mach ich verkehrt?

Danke für eure Tipps,
Stephan
FHEM nightly auf Intel Atom (lubuntu) mit VDSL 50000 ;-)
Nutze zur Zeit OneWire und KNX

Damian

Ich würde das Attribut checkall herausnehmen, denn auch wenn deine Bedingung erfüllt ist und der Trigger kommt, werden alle Bedingungen zuvor ausgewertet und dann schlägt wohl cmd_4 zu. Ohne do always gibt´s natürlich keine Wiederholung von cmd_4 - es passiert dann nichts.

checkall ist für typische ereignisgesteuerte Steuerung immer mit Vorsicht zu genießen.

Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

abc2006

Okay, nehm ich raus.
Hatte das hier gelesen:
https://forum.fhem.de/index.php/topic,63375.msg547211.html#msg547211
und mich entschieden, dass es dann wohl nicht stört.
Okay, nächster Test:
Perfekt, jetzt funktionierts.
Dann muss ich mich wohl nochmal mit checkall beschäftigen ...
Danke vielmals!

Grüße,
Stephan
FHEM nightly auf Intel Atom (lubuntu) mit VDSL 50000 ;-)
Nutze zur Zeit OneWire und KNX

Damian

#3
Zitat von: abc2006 am 28 September 2019, 11:12:53
Okay, nehm ich raus.
Hatte das hier gelesen:
https://forum.fhem.de/index.php/topic,63375.msg547211.html#msg547211
und mich entschieden, dass es dann wohl nicht stört.
Okay, nächster Test:
Perfekt, jetzt funktionierts.
Dann muss ich mich wohl nochmal mit checkall beschäftigen ...
Danke vielmals!

Grüße,
Stephan

Ich habe mich lange gegen checkall gewährt, habe es dann doch auf Wunsch von Usern eingebaut.

Beim sequentiellen Programmieren, ist es ja üblich von oben nach unten die Bedingungen zu prüfen, daher war checkall gewünscht. Nun arbeitet DOIF ja vom Anfang an nicht sequentiell, sondern prüft normalerweise nur Zweige, die zum Event passen, das macht beim ereignisgesteuerten durchaus Sinn, denn zum Zeitpunkt des Triggerns interessieren die anderen Zweige nicht, weil sich bei diesen ja nichts geändert hat, hätte sich dort etwas geändert, dann wären sie durch ihren Trigger bereits geprüft worden.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF