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