Hallo zusammen,
seit einer der letzten Updates wird in einem DOIF der AT (8) und WE (9) nicht mehr ausgewertet.
Im Wike steht:
Wochentagsteuerung
Hinter der Zeitangabe kann ein oder mehrere Wochentage getrennt mit einem Pipezeichen | angegeben werden. Die Syntax lautet:
[<time>|0123456789X] mit 0 Sonntag, 1 Montag, ... bis 6 Samstag, 7 Wochenende und Feiertage (entspricht $we), 8 Arbeitstag (entspricht !$we),9 Wochenende oder Feiertag morgen (entspricht intern $twe), X Arbeitstag morgen (entspricht intern !$twe)
Wenn man AT für Arbeitstag einsetzt wird die Anweisung nicht getriggert und mit der 8 funktioniert es auch nicht. Wurde da etwas bei den letzten Updates verändert, was ich nicht über die Suchanfrage gefunden habe?
Beispiel:
([05:30-18:00 |AT])
(set EG.WohnEsszimmer desired-temp [MQTT2_ESP32Client:temperatur_W_soll])
DOELSEIF ([05:30-18:00 |8])
(set EG.WohnEsszimmer desired-temp [MQTT2_ESP32Client:temperatur_W_soll])
DOELSE
(set EG.WohnEsszimmer desired-temp 18.0)
Beide werden nicht ausgeführt. Es wir immer die DOELSE Abfrage ausgeführt.
Gruß
RatisBow
Bei mir funktioniert alles, wie programmiert. Abgesehen davon ist das keine sinnvolle Definition bei dir, du hast zwei gleiche Zeitintervalle definiert (AT entspricht 8 ). Ausgeführt wird immer nur ein Zweig, nämlich der erste Treffer in der Definition hier also der erste Zweig. Im DOIF-Perlmodus kannst auch unabhängige Zweige definieren, die durch den gleichen Trigger "gleichzeitig" ausgeführt werden.
Evtl. aber stimmt etwas mit deiner Systemzeit nicht.
Das ist nur ein Beispiel, das beide nicht funktionieren. In meinem Code habe ich da keine Zeitliche Überschneidung drinnen.
Vollständig schaut der so aus:
## 1
(([05:30-7:00|AT]) and ([Anwesenheit] eq "present"))
(set EG.WohnEsszimmer desired-temp [MQTT2_ESP32Client:temperatur_W_soll])
## 2
DOELSEIF (([08:00-11:00|Fr WE]) and (([Anwesenheit] eq "present") or ([myEGHeadWohnz] eq "on")) and ([myTemperatur] eq "on"))
(set EG.WohnEsszimmer desired-temp [MQTT2_ESP32Client:temperatur_W_soll])
## 3
DOELSEIF (([11:00-13:00]) and (([Anwesenheit] eq "present") or ([myEGHeadWohnz] eq "on")) and ([myTemperatur] eq "on"))
(set EG.WohnEsszimmer desired-temp [MQTT2_ESP32Client:temperatur_W_soll])
## 4
DOELSEIF (([13:00-15:00|Fr WE]) and (([Anwesenheit] eq "present") or ([myEGHeadWohnz] eq "on")) and ([myTemperatur] eq "on"))
(set EG.WohnEsszimmer desired-temp [MQTT2_ESP32Client:temperatur_W_soll])
## 5
DOELSEIF (([15:00-21:30]) and (([Anwesenheit] eq "present") or ([Anwesenheit] eq "absent") or [myEGHeadWohnz] eq "on") and ([myTemperatur] eq "on"))
(set EG.WohnEsszimmer desired-temp [MQTT2_ESP32Client:temperatur_W_soll])
## 6
DOELSEIF (([21:30-23:00|Fr WE]) and (([Anwesenheit] eq "present") or ([myEGHeadWohnz] eq "on")) and ([myTemperatur] eq "on"))
(set EG.WohnEsszimmer desired-temp [MQTT2_ESP32Client:temperatur_W_soll])
## 7
DOELSE
## (set EG.WohnEsszimmer desired-temp [MQTT2_ESP32Client:temperatur_W_soll])
(set EG.WohnEsszimmer desired-temp 18.0)
Die Anweisung habe ich jetzt schon über Jahre und hatte bisher funktioniert.
Hier das Listing:
Internals:
DEF ## 1.2
([05:30-8:00 |8])
(set EG.WohnEsszimmer desired-temp [MQTT2_ESP32Client:temperatur_W_soll])
## 1
(([05:30-7:00|AT]) and ([Anwesenheit] eq "present"))
(set EG.WohnEsszimmer desired-temp [MQTT2_ESP32Client:temperatur_W_soll])
## 2
DOELSEIF (([08:00-11:00|Fr WE]) and (([Anwesenheit] eq "present") or ([myEGHeadWohnz] eq "on")) and ([myTemperatur] eq "on"))
(set EG.WohnEsszimmer desired-temp [MQTT2_ESP32Client:temperatur_W_soll])
## 3
DOELSEIF (([11:00-13:00]) and (([Anwesenheit] eq "present") or ([myEGHeadWohnz] eq "on")) and ([myTemperatur] eq "on"))
(set EG.WohnEsszimmer desired-temp [MQTT2_ESP32Client:temperatur_W_soll])
## 4
DOELSEIF (([13:00-15:00|Fr WE]) and (([Anwesenheit] eq "present") or ([myEGHeadWohnz] eq "on")) and ([myTemperatur] eq "on"))
(set EG.WohnEsszimmer desired-temp [MQTT2_ESP32Client:temperatur_W_soll])
## 5
DOELSEIF (([15:00-21:30]) and (([Anwesenheit] eq "present") or ([Anwesenheit] eq "absent") or [myEGHeadWohnz] eq "on") and ([myTemperatur] eq "on"))
(set EG.WohnEsszimmer desired-temp [MQTT2_ESP32Client:temperatur_W_soll])
## 6
DOELSEIF (([21:30-23:00|Fr WE]) and (([Anwesenheit] eq "present") or ([myEGHeadWohnz] eq "on")) and ([myTemperatur] eq "on"))
(set EG.WohnEsszimmer desired-temp [MQTT2_ESP32Client:temperatur_W_soll])
## 7
DOELSE
## (set EG.WohnEsszimmer desired-temp [MQTT2_ESP32Client:temperatur_W_soll])
(set EG.WohnEsszimmer desired-temp 18.0)
FUUID 5d788ab6-f33f-7b43-b3de-31b4749d5c646ddb
MODEL FHEM
NAME EG.WohnEsszimmer_01
NOTIFYDEV global,myTemperatur,Anwesenheit,myEGHeadWohnz
NR 297
NTFY_ORDER 50-EG.WohnEsszimmer_01
STATE cmd_7
TYPE DOIF
VERSION 28546 2024-02-23 20:11:05
eventCount 28
READINGS:
2024-04-26 08:37:08 Device Anwesenheit
2024-04-26 07:35:02 cmd 7
2024-04-26 07:35:02 cmd_event Anwesenheit
2024-04-26 07:35:02 cmd_nr 7
2024-04-26 08:37:08 e_Anwesenheit_STATE present
2024-04-26 07:34:43 mode enabled
2024-04-26 07:35:02 state cmd_7
2024-04-26 08:00:02 timer_01_c01 27.04.2024 05:30:00|8
2024-04-26 08:00:02 timer_02_c01 27.04.2024 08:00:00|8
2024-04-26 07:34:43 timer_03_c02 26.04.2024 08:00:00|FrWE
2024-04-26 07:34:43 timer_04_c02 26.04.2024 11:00:00|FrWE
2024-04-26 07:34:43 timer_05_c03 26.04.2024 11:00:00
2024-04-26 07:34:43 timer_06_c03 26.04.2024 13:00:00
2024-04-26 07:34:43 timer_07_c04 26.04.2024 13:00:00|FrWE
2024-04-26 07:34:43 timer_08_c04 26.04.2024 15:00:00|FrWE
2024-04-26 07:34:43 timer_09_c05 26.04.2024 15:00:00
2024-04-26 07:34:43 timer_10_c05 26.04.2024 21:30:00
2024-04-26 07:34:43 timer_11_c06 26.04.2024 21:30:00|FrWE
2024-04-26 07:34:43 timer_12_c06 26.04.2024 23:00:00|FrWE
Regex:
accu:
bar:
barAvg:
collect:
cond:
Anwesenheit:
0:
1:
&STATE ^Anwesenheit$
2:
&STATE ^Anwesenheit$
3:
&STATE ^Anwesenheit$
4:
&STATE ^Anwesenheit$
5:
&STATE ^Anwesenheit$
myEGHeadWohnz:
1:
&STATE ^myEGHeadWohnz$
2:
&STATE ^myEGHeadWohnz$
3:
&STATE ^myEGHeadWohnz$
4:
&STATE ^myEGHeadWohnz$
5:
&STATE ^myEGHeadWohnz$
myTemperatur:
1:
&STATE ^myTemperatur$
2:
&STATE ^myTemperatur$
3:
&STATE ^myTemperatur$
4:
&STATE ^myTemperatur$
5:
&STATE ^myTemperatur$
attr:
cmdState:
wait:
waitdel:
condition:
0 ::DOIF_time($hash,0,1,$wday,$hms,"8")
1 (::DOIF_time($hash,2,3,$wday,$hms,"FrWE")) and ((::InternalDoIf($hash,'Anwesenheit','STATE') eq "present") or (::InternalDoIf($hash,'myEGHeadWohnz','STATE') eq "on")) and (::InternalDoIf($hash,'myTemperatur','STATE') eq "on")
2 (::DOIF_time($hash,4,5,$wday,$hms)) and ((::InternalDoIf($hash,'Anwesenheit','STATE') eq "present") or (::InternalDoIf($hash,'myEGHeadWohnz','STATE') eq "on")) and (::InternalDoIf($hash,'myTemperatur','STATE') eq "on")
3 (::DOIF_time($hash,6,7,$wday,$hms,"FrWE")) and ((::InternalDoIf($hash,'Anwesenheit','STATE') eq "present") or (::InternalDoIf($hash,'myEGHeadWohnz','STATE') eq "on")) and (::InternalDoIf($hash,'myTemperatur','STATE') eq "on")
4 (::DOIF_time($hash,8,9,$wday,$hms)) and ((::InternalDoIf($hash,'Anwesenheit','STATE') eq "present") or (::InternalDoIf($hash,'Anwesenheit','STATE') eq "absent") or ::InternalDoIf($hash,'myEGHeadWohnz','STATE') eq "on") and (::InternalDoIf($hash,'myTemperatur','STATE') eq "on")
5 (::DOIF_time($hash,10,11,$wday,$hms,"FrWE")) and ((::InternalDoIf($hash,'Anwesenheit','STATE') eq "present") or (::InternalDoIf($hash,'myEGHeadWohnz','STATE') eq "on")) and (::InternalDoIf($hash,'myTemperatur','STATE') eq "on")
days:
0 8
1 8
10 FrWE
11 FrWE
2 FrWE
3 FrWE
6 FrWE
7 FrWE
do:
0:
0 set EG.WohnEsszimmer desired-temp [MQTT2_ESP32Client:temperatur_W_soll]
1 ([05:30-7:00|AT]) and ([Anwesenheit] eq "present")
2 set EG.WohnEsszimmer desired-temp [MQTT2_ESP32Client:temperatur_W_soll]
1:
0 set EG.WohnEsszimmer desired-temp [MQTT2_ESP32Client:temperatur_W_soll]
2:
0 set EG.WohnEsszimmer desired-temp [MQTT2_ESP32Client:temperatur_W_soll]
3:
0 set EG.WohnEsszimmer desired-temp [MQTT2_ESP32Client:temperatur_W_soll]
4:
0 set EG.WohnEsszimmer desired-temp [MQTT2_ESP32Client:temperatur_W_soll]
5:
0 set EG.WohnEsszimmer desired-temp [MQTT2_ESP32Client:temperatur_W_soll]
6:
0 set EG.WohnEsszimmer desired-temp 18.0
helper:
NOTIFYDEV global,myTemperatur,Anwesenheit,myEGHeadWohnz
event present
globalinit 1
last_timer 12
sleeptimer -1
timerdev Anwesenheit
timerevent present
triggerDev Anwesenheit
timerevents:
present
timereventsState:
state: present
triggerEvents:
present
triggerEventsState:
state: present
internals:
all Anwesenheit:STATE myEGHeadWohnz:STATE myTemperatur:STATE
interval:
0 -1
1 0
10 -1
11 10
2 -1
3 2
4 -1
5 4
6 -1
7 6
8 -1
9 8
intervalfunc:
intervaltimer:
localtime:
0 1714188600
1 1714197600
10 1714159800
11 1714165200
2 1714111200
3 1714122000
4 1714122000
5 1714129200
6 1714129200
7 1714136400
8 1714136400
9 1714159800
readings:
realtime:
0 05:30:00
1 08:00:00
10 21:30:00
11 23:00:00
2 08:00:00
3 11:00:00
4 11:00:00
5 13:00:00
6 13:00:00
7 15:00:00
8 15:00:00
9 21:30:00
time:
0 05:30:00
1 8:00
10 21:30:00
11 23:00:00
2 08:00:00
3 11:00:00
4 11:00:00
5 13:00:00
6 13:00:00
7 15:00:00
8 15:00:00
9 21:30:00
timeCond:
0 0
1 0
10 5
11 5
2 1
3 1
4 2
5 2
6 3
7 3
8 4
9 4
timer:
0 0
1 0
10 0
11 0
2 0
3 0
4 0
5 0
6 0
7 0
8 0
9 0
timers:
0 0 1
1 2 3
2 4 5
3 6 7
4 8 9
5 10 11
trigger:
triggertime:
1714122000:
localtime 1714122000
hash:
1714129200:
localtime 1714129200
hash:
1714136400:
localtime 1714136400
hash:
1714159800:
localtime 1714159800
hash:
1714165200:
localtime 1714165200
hash:
1714188600:
localtime 1714188600
hash:
1714197600:
localtime 1714197600
hash:
uiState:
uiTable:
Attributes:
checkall all
room EG.Esszimmer,EG.Wohnzimmer,Testraum
Gruß
RatisBow
Die Systemzeit auf dem FHEM läuft stimmt auch. Habe ich gerade noch überprüft.
RatisBow
Du solltest auch das Attribut do always setzen, damit bei deinen Tests eine Wiederholung des gleichen Zweiges möglich ist.
Das beantwortet aber nicht mein Problem.
Hier ein einfaches Besipiel, das schon nicht funktioniert!
([08:00-21:00|AT])
(set DOIF_Dum1 "Arbeitstag")
DOELSE
(set DOIF_Dum1 "Wochenende")
Das Listing:
Internals:
DEF ([08:00-21:00|AT])
(set DOIF_Dum1 "Arbeitstag")
DOELSE
(set DOIF_Dum1 "Wochenende")
FUUID 5dbefce6-f33f-7b43-092f-2810cd773123eff5
MODEL FHEM
NAME DOIF_Dummy
NOTIFYDEV global
NR 380
NTFY_ORDER 50-DOIF_Dummy
STATE cmd_2
TYPE DOIF
VERSION 28546 2024-02-23 20:11:05
eventCount 6
READINGS:
2024-04-26 10:10:49 cmd 2
2024-04-26 10:10:49 cmd_event DOIF_Dummy
2024-04-26 10:10:49 cmd_nr 2
2024-04-26 10:10:37 mode enabled
2024-04-26 10:10:49 state cmd_2
2024-04-26 10:10:37 timer_01_c01 27.04.2024 08:00:00|AT
2024-04-26 10:10:37 timer_02_c01 26.04.2024 21:00:00|AT
Regex:
accu:
bar:
barAvg:
collect:
attr:
cmdState:
wait:
waitdel:
condition:
0 ::DOIF_time($hash,0,1,$wday,$hms,"AT")
days:
0 AT
1 AT
do:
0:
0 set DOIF_Dum1 "Arbeitstag"
1:
0 set DOIF_Dum1 "Wochenende"
helper:
NOTIFYDEV global
globalinit 1
last_timer 2
sleeptimer -1
timerdev
timerevent
timerevents
timereventsState
triggerDev
DOIF_eventa:
cmd_nr: 2
cmd: 2
cmd_event: DOIF_Dummy
cmd_2
DOIF_eventas:
cmd_nr: 2
cmd: 2
cmd_event: DOIF_Dummy
state: cmd_2
interval:
0 -1
1 0
intervalfunc:
localtime:
0 1714197600
1 1714158000
realtime:
0 08:00:00
1 21:00:00
time:
0 08:00:00
1 21:00:00
timeCond:
0 0
1 0
timer:
0 0
1 0
timers:
0 0 1
triggertime:
1714158000:
localtime 1714158000
hash:
1714197600:
localtime 1714197600
hash:
uiState:
uiTable:
Attributes:
room Testraum
Das sollte doch heute als Arbeitstag funktionieren!
RatisBow
Einen Urlaubskalender hast du nicht zufällig eingebunden?
Doch, Urlaubskalender habe ich auch eingebunden. Der Stand auch auf Urlaub. Das letzte Beispiel wurde jetzt auch Korrekt ausgeführt. Dann muss ich mir das erste noch einmal anschauen. Der Schaltet immer noch nicht richtig.
Erstmal Danke
RatisBow
Zitat von: RatisBow am 26 April 2024, 10:14:48Das beantwortet aber nicht mein Problem.
Hier ein einfaches Besipiel, das schon nicht funktioniert!
([08:00-21:00|AT])
(set DOIF_Dum1 "Arbeitstag")
DOELSE
(set DOIF_Dum1 "Wochenende")
Das Listing:
Internals:
DEF ([08:00-21:00|AT])
(set DOIF_Dum1 "Arbeitstag")
DOELSE
(set DOIF_Dum1 "Wochenende")
FUUID 5dbefce6-f33f-7b43-092f-2810cd773123eff5
MODEL FHEM
NAME DOIF_Dummy
NOTIFYDEV global
NR 380
NTFY_ORDER 50-DOIF_Dummy
STATE cmd_2
TYPE DOIF
VERSION 28546 2024-02-23 20:11:05
eventCount 6
READINGS:
2024-04-26 10:10:49 cmd 2
2024-04-26 10:10:49 cmd_event DOIF_Dummy
2024-04-26 10:10:49 cmd_nr 2
2024-04-26 10:10:37 mode enabled
2024-04-26 10:10:49 state cmd_2
2024-04-26 10:10:37 timer_01_c01 27.04.2024 08:00:00|AT
2024-04-26 10:10:37 timer_02_c01 26.04.2024 21:00:00|AT
Regex:
accu:
bar:
barAvg:
collect:
attr:
cmdState:
wait:
waitdel:
condition:
0 ::DOIF_time($hash,0,1,$wday,$hms,"AT")
days:
0 AT
1 AT
do:
0:
0 set DOIF_Dum1 "Arbeitstag"
1:
0 set DOIF_Dum1 "Wochenende"
helper:
NOTIFYDEV global
globalinit 1
last_timer 2
sleeptimer -1
timerdev
timerevent
timerevents
timereventsState
triggerDev
DOIF_eventa:
cmd_nr: 2
cmd: 2
cmd_event: DOIF_Dummy
cmd_2
DOIF_eventas:
cmd_nr: 2
cmd: 2
cmd_event: DOIF_Dummy
state: cmd_2
interval:
0 -1
1 0
intervalfunc:
localtime:
0 1714197600
1 1714158000
realtime:
0 08:00:00
1 21:00:00
time:
0 08:00:00
1 21:00:00
timeCond:
0 0
1 0
timer:
0 0
1 0
timers:
0 0 1
triggertime:
1714158000:
localtime 1714158000
hash:
1714197600:
localtime 1714197600
hash:
uiState:
uiTable:
Attributes:
room Testraum
Das sollte doch heute als Arbeitstag funktionieren!
RatisBow
Es funktioniert auch hier alles wie programmiert um 10:10:17 hast du das Device definiert, also nach 8:00 Uhr, der nächste Beginn ist am 27.04 um 08:00 - das ist ein Samstag und damit nicht AT.
Edit: Ich sehe gerade, dass du es um 10:10:37 per checkall provoziert hast, hier hätte cmd_1 kommen sollen. Ob etwas in deinem System nicht stimmt, kannst du über die Kommandozeile testen: {$we}
Am Wochenende sollte 1 kommen sonst 0, wenn das nicht stimmt wird auch DOIF nicht funktionieren, denn DOIF wertet $we aus.