Hallo,
ich möchte meinen Küchen-Heizkörper per doif steuern.
Folgende Definition habe ich dafür gemacht:
Internals:
DEF ([5:00 | AT ] and [HomeOffice] eq "1")
(setreading di_Kueche_Heizung muss_an 1)
DOELSEIF([05:00 | AT] and [wech] eq "da" and [StefanUrlaub] eq "1")
(setreading di_Kueche_Heizung muss_an 1)
DOELSEIF([di_Kueche_Heizung:muss_an] eq "1")
{my $Today = $mday.".".$month.".".($year - 2000);
fhem("set Kueche_Wandthermostat_Climate controlParty 20.0 $Today 08:00 $Today 19:30")}
(setreading di_Kueche_Heizung muss_an 0)
FUUID 5e7c9f57-f33f-78f8-ff51-9bb0cc4199cb953d
MODEL FHEM
NAME di_Kueche_Heizung
NOTIFYDEV HomeOffice,global,di_Kueche_Heizung,wech,StefanUrlaub
NR 651
NTFY_ORDER 50-di_Kueche_Heizung
STATE cmd_2
TYPE DOIF
VERSION 21224 2020-02-18 18:45:49
READINGS:
2020-04-15 05:00:00 cmd 2
2020-04-15 05:00:00 cmd_event timer_2
2020-04-15 05:00:00 cmd_nr 2
2020-04-14 18:50:25 mode enabled
2020-04-15 05:00:00 muss_an 1
2020-04-15 05:00:00 state cmd_2
2020-04-15 05:00:00 timer_01_c01 16.04.2020 05:00:00|AT
2020-04-15 05:00:00 timer_02_c02 16.04.2020 05:00:00|AT
Regex:
accu:
cond:
HomeOffice:
0:
&STATE ^HomeOffice$
StefanUrlaub:
1:
&STATE ^StefanUrlaub$
di_Kueche_Heizung:
2:
muss_an ^di_Kueche_Heizung$:^muss_an:
wech:
1:
&STATE ^wech$
attr:
cmdState:
wait:
waitdel:
condition:
0 ::DOIF_time_once($hash,0,$wday,"AT") and ::InternalDoIf($hash,'HomeOffice','STATE') eq "1"
1 ::DOIF_time_once($hash,1,$wday,"AT") and ::InternalDoIf($hash,'wech','STATE') eq "da" and ::InternalDoIf($hash,'StefanUrlaub','STATE') eq "1"
2 ::ReadingValDoIf($hash,'di_Kueche_Heizung','muss_an') eq "1"
days:
0 AT
1 AT
do:
0:
0 setreading di_Kueche_Heizung muss_an 1
1:
0 setreading di_Kueche_Heizung muss_an 1
2:
0 {my $Today = $mday.".".$month.".".($year - 2000); fhem("set Kueche_Wandthermostat_Climate controlParty 20.0 $Today 08:00 $Today 19:30")}
1 setreading di_Kueche_Heizung muss_an 0
3:
helper:
DEVFILTER ^global$|^di_Kueche_Heizung$|^wech$|^HomeOffice$|^StefanUrlaub$
NOTIFYDEV global|di_Kueche_Heizung|wech|HomeOffice|StefanUrlaub
event timer_2
globalinit 1
last_timer 2
sleeptimer -1
timerdev
timerevent timer_2
triggerDev
timerevents:
timer_2
timereventsState:
timer_2
triggerEvents:
timer_2
triggerEventsState:
timer_2
internals:
all HomeOffice:STATE wech:STATE StefanUrlaub:STATE
interval:
intervalfunc:
localtime:
0 1587006000
1 1587006000
readings:
all di_Kueche_Heizung:muss_an
realtime:
0 05:00:00
1 05:00:00
time:
0 5:00
1 05:00:00
timeCond:
0 0
1 1
timer:
0 0
1 0
timers:
0 0
1 1
triggertime:
1587006000:
localtime 1587006000
hash:
uiState:
uiTable:
Attributes:
do always
room 99_System
Morgens um 5 Uhr wir das Reading di_Kueche_Heizung muss_an auf 1 gesetzt.Leider funktioniert der zweite Teil nicht. DOELSEIF([di_Kueche_Heizung:muss_an] eq "1") wird leider nicht ausgeführt. Unterstützt DOIF meine Idee nicht oder habe ich micht nur vertan / verschreiben?
Danke für die Hilfe
Stefan
DOIF führt standardmäßig immer nur einen Zweig aus. Wenn du zwei Dinge gleichzeitig ausführen willst, musst du sie in einen Zweig packen und dann per IF die einzelnen Anweisungen ausführen.
Alternativen: eine andere Zeit nehmen oder DOIF-Perl nutzen
Ich verstehe nicht ganz, was du erreichen willst... Im ersten DOELSEIF-Zweig setzt du das reading und im zweiten DOELSEIF möchtest du auf das Setzen dieses readings reagieren?
Mögliche Probleme hierbei:
* CMD_2 (also der erste DOELSEIF-Zweig) ist bereits ausgeführt, daher kann nicht auch noch CMD_3 ausgeführt werden
* zumindest bei notify erzeugt setreading kein Event, wenn ein reading im auslösenden Device gesetzt wird, das heisst es wird auch nicht erneut getriggert. Abhilfe steht in der Commandref:
ZitatUse "sleep 0.1; setreading X Y Z" in this case.
. Vielleicht hilft das ja...
danke,
die Verzögerung um 0.1 Sekunden brachte das gewünschte Ergebnis.