Hallo zusammen,
ich möchte über den Tag, abhängig des Tages meine Heizung regeln. Dazu habe ich vereinfacht ein TestDoIf erstellt.
Mit dem habe ich folgendes Problem,
gebe ich nur Zeitformate vor, Funktioniert alles
Beispiel:
## 1
([05:30-15:00])
(set myDoIfTemp [MQTT2_ESP32Client:temperatur_W_soll])
## 2
DOELSEIF ([15:00-21:00])
(set myDoIfTemp [MQTT2_ESP32Client:temperatur_W_soll])
## 3
DOELSEIF ([21:00-23:00])
(set myDoIfTemp [MQTT2_ESP32Client:temperatur_W_soll])
## 4
DOELSE
(set myDoIfTemp 18.0)
gebe ich nun andere Zustandsbedingungen hinzu, werden diese mit checkall (cmd_2) richtig ausgegeben, tritt ein Event ein, wird dies nicht mehr richtig erkannt (cmd_4).
Listing 1 mit checkall:
Internals:
CFGFN
DEF ## 1
(([05:30-15:00]) and ([Anwesenheit] eq "present") and ([myTemperatur] eq "on"))
(set myDoIfTemp ([MQTT2_ESP32Client:temperatur_W_soll]))
## 2
DOELSEIF (([15:00-21:00]) and ([myTemperatur] eq "on"))
(set myDoIfTemp ([MQTT2_ESP32Client:temperatur_W_soll]))
## 3
DOELSEIF (([21:00-23:00]) and ([Anwesenheit] eq "present") and ([myTemperatur] eq "on"))
(set myDoIfTemp ([MQTT2_ESP32Client:temperatur_W_soll]))
## 4
DOELSE
(set myDoIfTemp 18.0)
FUUID 64299a42-f33f-7b43-0102-401d106e1ea461a9
MODEL FHEM
NAME TestDoif
NOTIFYDEV myTemperatur,global,Anwesenheit
NR 13381
NTFY_ORDER 50-TestDoif
STATE cmd_2
TYPE DOIF
VERSION 27367 2023-03-27 21:37:33
eventCount 42
READINGS:
2023-04-02 17:47:18 Device Anwesenheit
2023-04-02 17:47:25 cmd 2
2023-04-02 17:47:25 cmd_event TestDoif
2023-04-02 17:47:25 cmd_nr 2
2023-04-02 17:47:18 e_Anwesenheit_STATE present
2023-04-02 17:44:11 mode enabled
2023-04-02 17:47:25 state cmd_2
2023-04-02 17:44:12 timer_01_c01 03.04.2023 05:30:00
2023-04-02 17:44:12 timer_02_c01 03.04.2023 15:00:00
2023-04-02 17:44:12 timer_03_c02 03.04.2023 15:00:00
2023-04-02 17:44:12 timer_04_c02 02.04.2023 21:00:00
2023-04-02 17:44:12 timer_05_c03 02.04.2023 21:00:00
2023-04-02 17:44:12 timer_06_c03 02.04.2023 23:00:00
Regex:
accu:
bar:
barAvg:
collect:
cond:
Anwesenheit:
0:
&STATE ^Anwesenheit$
1:
2:
&STATE ^Anwesenheit$
myTemperatur:
0:
&STATE ^myTemperatur$
1:
&STATE ^myTemperatur$
2:
&STATE ^myTemperatur$
attr:
cmdState:
wait:
waitdel:
condition:
0 (::DOIF_time($hash,0,1,$wday,$hms)) and (::InternalDoIf($hash,'Anwesenheit','STATE') eq "present") and (::InternalDoIf($hash,'myTemperatur','STATE') eq "on")
1 (::DOIF_time($hash,2,3,$wday,$hms)) and (::InternalDoIf($hash,'myTemperatur','STATE') eq "on")
2 (::DOIF_time($hash,4,5,$wday,$hms)) and (::InternalDoIf($hash,'Anwesenheit','STATE') eq "present") and (::InternalDoIf($hash,'myTemperatur','STATE') eq "on")
days:
devices:
do:
0:
0 set myDoIfTemp ([MQTT2_ESP32Client:temperatur_W_soll])
1:
0 set myDoIfTemp ([MQTT2_ESP32Client:temperatur_W_soll])
2:
0 set myDoIfTemp ([MQTT2_ESP32Client:temperatur_W_soll])
3:
0 set myDoIfTemp 18.0
helper:
NOTIFYDEV myTemperatur,global,Anwesenheit
event present
globalinit 1
last_timer 6
sleeptimer -1
timerdev
timerevent present
timerevents
timereventsState
triggerDev
DOIF_eventa:
cmd_nr: 2
cmd: 2
cmd_event: TestDoif
cmd_2
DOIF_eventas:
cmd_nr: 2
cmd: 2
cmd_event: TestDoif
state: cmd_2
internals:
all Anwesenheit:STATE myTemperatur:STATE
interval:
0 -1
1 0
2 -1
3 2
4 -1
5 4
intervalfunc:
localtime:
0 1680492600
1 1680526800
2 1680526800
3 1680462000
4 1680462000
5 1680469200
readings:
realtime:
0 05:30:00
1 15:00:00
2 15:00:00
3 21:00:00
4 21:00:00
5 23:00:00
time:
0 05:30:00
1 15:00:00
2 15:00:00
3 21:00:00
4 21:00:00
5 23:00:00
timeCond:
0 0
1 0
2 1
3 1
4 2
5 2
timer:
0 0
1 0
2 0
3 0
4 0
5 0
timers:
0 0 1
1 2 3
2 4 5
trigger:
triggertime:
1680462000:
localtime 1680462000
hash:
1680469200:
localtime 1680469200
hash:
1680492600:
localtime 1680492600
hash:
1680526800:
localtime 1680526800
hash:
uiState:
uiTable:
Attributes:
room Testraum
Listing 2 nach kurzer Zeit durch auslöser eines Events
Internals:
CFGFN
DEF ## 1
(([05:30-15:00]) and ([Anwesenheit] eq "present") and ([myTemperatur] eq "on"))
(set myDoIfTemp ([MQTT2_ESP32Client:temperatur_W_soll]))
## 2
DOELSEIF (([15:00-21:00]) and ([myTemperatur] eq "on"))
(set myDoIfTemp ([MQTT2_ESP32Client:temperatur_W_soll]))
## 3
DOELSEIF (([21:00-23:00]) and ([Anwesenheit] eq "present") and ([myTemperatur] eq "on"))
(set myDoIfTemp ([MQTT2_ESP32Client:temperatur_W_soll]))
## 4
DOELSE
(set myDoIfTemp 18.0)
FUUID 64299a42-f33f-7b43-0102-401d106e1ea461a9
MODEL FHEM
NAME TestDoif
NOTIFYDEV myTemperatur,global,Anwesenheit
NR 13381
NTFY_ORDER 50-TestDoif
STATE cmd_4
TYPE DOIF
VERSION 27367 2023-03-27 21:37:33
eventCount 43
READINGS:
2023-04-02 17:48:30 Device Anwesenheit
2023-04-02 17:47:54 cmd 4
2023-04-02 17:47:54 cmd_event Anwesenheit
2023-04-02 17:47:54 cmd_nr 4
2023-04-02 17:48:30 e_Anwesenheit_STATE present
2023-04-02 17:44:11 mode enabled
2023-04-02 17:47:54 state cmd_4
2023-04-02 17:44:12 timer_01_c01 03.04.2023 05:30:00
2023-04-02 17:44:12 timer_02_c01 03.04.2023 15:00:00
2023-04-02 17:44:12 timer_03_c02 03.04.2023 15:00:00
2023-04-02 17:44:12 timer_04_c02 02.04.2023 21:00:00
2023-04-02 17:44:12 timer_05_c03 02.04.2023 21:00:00
2023-04-02 17:44:12 timer_06_c03 02.04.2023 23:00:00
Regex:
accu:
bar:
barAvg:
collect:
cond:
Anwesenheit:
0:
&STATE ^Anwesenheit$
1:
2:
&STATE ^Anwesenheit$
myTemperatur:
0:
&STATE ^myTemperatur$
1:
&STATE ^myTemperatur$
2:
&STATE ^myTemperatur$
attr:
cmdState:
wait:
waitdel:
condition:
0 (::DOIF_time($hash,0,1,$wday,$hms)) and (::InternalDoIf($hash,'Anwesenheit','STATE') eq "present") and (::InternalDoIf($hash,'myTemperatur','STATE') eq "on")
1 (::DOIF_time($hash,2,3,$wday,$hms)) and (::InternalDoIf($hash,'myTemperatur','STATE') eq "on")
2 (::DOIF_time($hash,4,5,$wday,$hms)) and (::InternalDoIf($hash,'Anwesenheit','STATE') eq "present") and (::InternalDoIf($hash,'myTemperatur','STATE') eq "on")
days:
devices:
do:
0:
0 set myDoIfTemp ([MQTT2_ESP32Client:temperatur_W_soll])
1:
0 set myDoIfTemp ([MQTT2_ESP32Client:temperatur_W_soll])
2:
0 set myDoIfTemp ([MQTT2_ESP32Client:temperatur_W_soll])
3:
0 set myDoIfTemp 18.0
helper:
NOTIFYDEV myTemperatur,global,Anwesenheit
event present
globalinit 1
last_timer 6
sleeptimer -1
timerdev Anwesenheit
timerevent present
triggerDev Anwesenheit
timerevents:
present
timereventsState:
state: present
triggerEvents:
present
triggerEventsState:
state: present
internals:
all Anwesenheit:STATE myTemperatur:STATE
interval:
0 -1
1 0
2 -1
3 2
4 -1
5 4
intervalfunc:
localtime:
0 1680492600
1 1680526800
2 1680526800
3 1680462000
4 1680462000
5 1680469200
readings:
realtime:
0 05:30:00
1 15:00:00
2 15:00:00
3 21:00:00
4 21:00:00
5 23:00:00
time:
0 05:30:00
1 15:00:00
2 15:00:00
3 21:00:00
4 21:00:00
5 23:00:00
timeCond:
0 0
1 0
2 1
3 1
4 2
5 2
timer:
0 0
1 0
2 0
3 0
4 0
5 0
timers:
0 0 1
1 2 3
2 4 5
trigger:
triggertime:
1680462000:
localtime 1680462000
hash:
1680469200:
localtime 1680469200
hash:
1680492600:
localtime 1680492600
hash:
1680526800:
localtime 1680526800
hash:
uiState:
uiTable:
Attributes:
room Testraum
Leider kiann ich aus den Listings keinen Unterschied erkennen, warum das eine mal cmd_2 erscheint und das nächste mal cmd_4.
Ich habe auch verschiedene andere Möglichkeiten schon getestet, die aber leider zu keinem Brauchbaren ergebnis führen.
Deshalb bin ich auf die Hilfe des Forums jetzt angewiesen und freue mich über jede Unterstützung.
Beste Grüße
RatisBow
Brauchst du da nicht ein "do always".
Sonst wird ein Zweig niemals ein zweites mal ausgeführt (bevor nicht ein anderer zutrifft).
Hat mich auch schon öfter verwirrt.
@Adimarantis vielen Dank, das war wohl der Richtige Hinweis.
hier Forum-Beitrag (https://forum.fhem.de/index.php?topic=48419.0) habe ich die Antwort gefunden. Genau wie es dort beschrieben wird, gehe ich bei einer DOIF DOELSEIF .. DOELSE Schleife aus, das jede Bedingung geprüft wird. dies ist aber leider nicht der Fall. Ich habe das Attribut "checkall" auf all gestellt und hoffe, das es dadurch Funktioniert, wie ich es brauche.
RatisBow