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
- Ich habe zwei cmd_ definiert, die im DOIF ein reading setzen.
- dann habe ich diese cmd_s mit wait von jeweils 2 Sekunden versehen
- dann habe ich diese cmd's ausgeführt.
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
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.
Hi Damian,
Danke für deine Antwort.
Woher kommt es dann, dass die Readings 2_.* alle den gleichen Zeitstempel haben?
Grüße,
Stephan
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.
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
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.