Hallo Leute,
brauche mal eure Hilfe. Für meine Homematic Thermostate (HM-CC-RT-DN) möchte ich den Urlaubsmodus per FHEM Web Oberfläche konfigurieren/aktivieren können. Um die Temperatur auszuwählen, verwende ich einen "knob" und um Start- und Enddatum festzulegen den "DateTimePicker". Das DOIF scheint insgesamt das zu tun, was es soll. Allerdings erwartet der entsprechende "set <devices> controlParty ..." Befehl das Datum im Format "26.11.19" und nicht im Format "26.11.2019" (was mir das DOIF liefert). Die Basis für das DOIF habe ich dem Wiki entnommen.
Hier das DOIF im RAW Format:
define di_Thermostate_Urlaub DOIF ([[$SELF:P_begin:"(\d\d:\d\d)$","00:00"]] and [?$SELF:P_begin:"^(\d\d).(\d\d).(\d\d\d\d)":$3."-".($2*1)."-".($1*1)] eq "$year-$month-$mday")
(({Log 3, "Thermostate: Urlaubsmodus startet"}),(set OG_Buero_Thermostat_Clima controlParty [$SELF:P_temp] [$SELF:P_begin] [$SELF:P_end]))
DOELSEIF ([[$SELF:P_end:"(\d\d:\d\d)$","00:00"]] and [?$SELF:P_end:"^(\d\d).(\d\d).(\d\d\d\d)":$3."-".($2*1)."-".($1*1)] eq "$year-$month-$mday" or ["^global$:^MODIFIED $SELF$"])
(({Log 3, "Thermostate: Urlaubsmodus beendet"}),(set OG_Buero_Thermostat_Clima controlMode auto))
attr di_Thermostate_Urlaub cmdState 1|0
attr di_Thermostate_Urlaub devStateIcon 1:general_an@green .*:general_aus
attr di_Thermostate_Urlaub group Urlaubszeitraum und Temperatur der Thermostate festelegen:
attr di_Thermostate_Urlaub readingList P_temp P_begin P_end
attr di_Thermostate_Urlaub room System->DOIF
attr di_Thermostate_Urlaub setList P_temp:knob,step:1,datepicker:false,min:5,max:30,bgcolor:grey P_begin:datetime,theme:"dark",step:30,inline:true P_end:datetime,theme:"dark",step:30,inline:true
attr di_Thermostate_Urlaub webCmd P_temp:P_begin:P_end
attr di_Thermostate_Urlaub widgetOverride setList:textField-long
Hier der Vollständigkeit halber ein list des DOIFs:
Internals:
DEF ([[$SELF:P_begin:"(\d\d:\d\d)$","00:00"]] and [?$SELF:P_begin:"^(\d\d).(\d\d).(\d\d\d\d)":$3."-".($2*1)."-".($1*1)] eq "$year-$month-$mday")
(({Log 3, "Thermostate: Urlaubsmodus startet"}),(set OG_Buero_Thermostat_Clima controlParty [$SELF:P_temp] [$SELF:P_begin] [$SELF:P_end]))
DOELSEIF ([[$SELF:P_end:"(\d\d:\d\d)$","00:00"]] and [?$SELF:P_end:"^(\d\d).(\d\d).(\d\d\d\d)":$3."-".($2*1)."-".($1*1)] eq "$year-$month-$mday" or ["^global$:^MODIFIED $SELF$"])
(({Log 3, "Thermostate: Urlaubsmodus beendet"}),(set OG_Buero_Thermostat_Clima controlMode auto))
FUUID 5ddd27cc-f33f-5dcf-1984-0038eeae166ab88a
MODEL FHEM
NAME di_Thermostate_Urlaub
NOTIFYDEV di_Thermostate_Urlaub,global
NR 535
NTFY_ORDER 50-di_Thermostate_Urlaub
STATE 0
TYPE DOIF
VERSION 20268 2019-09-28 21:00:39
READINGS:
2019-11-26 16:46:01 Device global
2019-11-26 16:45:01 P_begin 26.11.2019 17:00
2019-11-26 16:45:02 P_end 26.11.2019 17:30
2019-11-26 14:27:32 P_temp 17
2019-11-26 17:30:00 cmd 2
2019-11-26 17:30:00 cmd_event timer_2
2019-11-26 17:30:00 cmd_nr 2
2019-11-26 16:46:01 mode enabled
2019-11-26 17:30:00 state 0
2019-11-26 17:00:00 timer_01_c01 27.11.2019 17:00:00
2019-11-26 17:30:00 timer_02_c02 27.11.2019 17:30:00
Regex:
accu:
cond:
:
0:
1:
"^global$:^MODIFIED di_Thermostate_Urlaub$" ^global$:^MODIFIED di_Thermostate_Urlaub$
itimer:
di_Thermostate_Urlaub:
itimer:
P_begin ^di_Thermostate_Urlaub$:^P_begin:
P_end ^di_Thermostate_Urlaub$:^P_end:
attr:
cmdState:
0:
1
1:
0
wait:
waitdel:
condition:
0 ::DOIF_time_once($hash,0,$wday) and ::ReadingValDoIf($hash,'di_Thermostate_Urlaub','P_begin','','^(\d\d).(\d\d).(\d\d\d\d)','$3."-".($2*1)."-".($1*1)') eq "$year-$month-$mday"
1 ::DOIF_time_once($hash,1,$wday) and ::ReadingValDoIf($hash,'di_Thermostate_Urlaub','P_end','','^(\d\d).(\d\d).(\d\d\d\d)','$3."-".($2*1)."-".($1*1)') eq "$year-$month-$mday" or ::EventDoIf('^global$',$hash,'^MODIFIED di_Thermostate_Urlaub$',0)
days:
do:
0:
0 ({Log 3, "Thermostate: Urlaubsmodus startet"}),(set OG_Buero_Thermostat_Clima controlParty [di_Thermostate_Urlaub:P_temp] [di_Thermostate_Urlaub:P_begin] [di_Thermostate_Urlaub:P_end])
1:
0 ({Log 3, "Thermostate: Urlaubsmodus beendet"}),(set OG_Buero_Thermostat_Clima controlMode auto)
2:
helper:
DEVFILTER ^global$|^di_Thermostate_Urlaub$
NOTIFYDEV global|di_Thermostate_Urlaub
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:
interval:
intervalfunc:
localtime:
0 1574870400
1 1574872200
readings:
realtime:
0 17:00:00
1 17:30:00
time:
0 [di_Thermostate_Urlaub:P_begin:"(\d\d:\d\d)$","00:00"]
1 [di_Thermostate_Urlaub:P_end:"(\d\d:\d\d)$","00:00"]
timeCond:
0 0
1 1
timer:
0 0
1 0
timers:
0 0
1 1
trigger:
triggertime:
1574870400:
localtime 1574870400
hash:
1574872200:
localtime 1574872200
hash:
uiState:
uiTable:
Attributes:
cmdState 1|0
devStateIcon 1:general_an@green .*:general_aus
group Urlaubszeitraum und Temperatur der Thermostate festelegen:
readingList P_temp P_begin P_end
room System->DOIF
setList P_temp:knob,step:1,datepicker:false,min:5,max:30,bgcolor:grey P_begin:datetime,theme:dark,step:30,inline:true P_end:datetime,theme:dark,step:30,inline:true
webCmd P_temp:P_begin:P_end
widgetOverride setList:textField-long
Die Fehlermeldung im Logfile sieht wie folgt aus:
2019.11.26 17:00:00 2: di_Thermostate_Urlaub: set OG_Buero_Thermostat_Clima controlParty 17 26.11.2019 17:00 26.11.2019 17:30: wrong start year 2019
Richtigerweise müsste der set Befehl wie folgt aussehen:
set OG_Buero_Thermostat_Clima controlParty 17 26.11.19 17:00 26.11.19 17:30
Was muss ich am DOIF anpassen, damit der set controlParty Befehl korrekt ausgeführt werden kann?
Vielen Dank und Grüße Hoppel
Das musst Du anpassen:
(set OG_Buero_Thermostat_Clima controlParty [$SELF:P_temp] [$SELF:P_begin] [$SELF:P_end]))
Das einfachste und am besten lesbare ist wahrscheinlich userReadings zu definieren:
attr di_Thermostate_Urlaub userReadings P_sbegin:P_begin.* {my $begin = ReadingsVal("$SELF", "$begin",""); return substr($begin,0,6).substr($begin,8,8 }
und dann P_sbegin statt P_begin im set benutzt
Du kannst im set-Befehl ebenfalls die Filteroption von DOIF verwenden:
set OG_Buero_Thermostat_Clima controlParty [$SELF:P_temp] [$SELF:P_begin:"^(\d\d).(\d\d)...(\d\d)":"$1.$2.$3"] [$SELF:P_end:"^(\d\d).(\d\d)...(\d\d)":"$1.$2.$3"])
Noch besser ! Hab ich in CommandRef gesucht, und nicht gefunden, das es auch für Befehle benutzt werden kann.
Allerdings würde ich die Regex anders schreiben. Hier wirst Du wahrscheinlich "261119" statt "26.11.19 17:00" bekommen, oder?
Zitat von: amenomade am 26 November 2019, 23:24:54
Noch besser ! Hab ich in CommandRef gesucht, und nicht gefunden, das es auch für Befehle benutzt werden kann.
Allerdings würde ich die Regex anders schreiben. Hier wirst Du wahrscheinlich "261119" statt "26.11.19 17:00" bekommen, oder?
Die Uhrzeit habe ich wohl übersehen, dann:
set OG_Buero_Thermostat_Clima controlParty [$SELF:P_temp] [$SELF:P_begin:"^(\d\d.\d\d)...(\d\d)(.*)":"$1.$2 $3"] [$SELF:P_end:"^(\d\d.\d\d)...(\d\d)(.*)":"$1.$2 $3"])
Zitat von: Damian am 26 November 2019, 23:33:28
Die Uhrzeit habe ich wohl übersehen, dann:
set OG_Buero_Thermostat_Clima controlParty [$SELF:P_temp] [$SELF:P_begin:"^(\d\d.\d\d)...(\d\d)(.*)":"$1.$2 $3"] [$SELF:P_end:"^(\d\d.\d\d)...(\d\d)(.*)":"$1.$2 $3"])
Perfekt, das funktioniert genauso wie es soll. :)
2019.11.27 05:00:00 3: Thermostate: Urlaubsmodus startet
2019.11.27 05:00:00 3: CUL_HM set OG_Buero_Thermostat_Clima controlParty 17 27.11.19 05:00 27.11.19 05:30
2019.11.27 05:30:00 3: Thermostate: Urlaubsmodus beendet
Habe schon länger daran herumgedacht und habe natürlich auch Wiki, Commandref und Google durchsucht, bin aber nicht fündig geworden bzw. nicht auf die Lösung gekommen.
Bin am Überlegen, dieses DOIF im Wiki bei dem Thermostat (HM-CC-RT-DN) zu ergänzen, da ich lange Zeit nach genau so einer Lösung gesucht habe, um nicht immer einen Befehl auf der Command Line eingeben zu müssen, wenn's mal in den Urlaub geht. (Ich weiß, man kann auch einen Kalender von bspw. Google einbinden und dort nach Urlaubseinträgen suchen...) Nun, wo ich mich gerade intensiv mit DOIF auseinandersetze, bin ich eher zufällig über den DateTimePicker gestoßen. Tolles Teil!
DOIF macht Spaß! Gefühlt kann man damit alles umsetzen/automatisieren. :)
Danke euch beiden für die zügige Unterstützung!
Viele Grüße Hoppel
Zitat von: hoppel118 am 27 November 2019, 05:56:11
Perfekt, das funktioniert genauso wie es soll. :)
2019.11.27 05:00:00 3: Thermostate: Urlaubsmodus startet
2019.11.27 05:00:00 3: CUL_HM set OG_Buero_Thermostat_Clima controlParty 17 27.11.19 05:00 27.11.19 05:30
2019.11.27 05:30:00 3: Thermostate: Urlaubsmodus beendet
Habe schon länger daran herumgedacht und habe natürlich auch Wiki, Commandref und Google durchsucht, bin aber nicht fündig geworden bzw. nicht auf die Lösung gekommen.
Bin am Überlegen, dieses DOIF im Wiki bei dem Thermostat (HM-CC-RT-DN) zu ergänzen, da ich lange Zeit nach genau so einer Lösung gesucht habe, um nicht immer einen Befehl auf der Command Line eingeben zu müssen, wenn's mal in den Urlaub geht. (Ich weiß, man kann auch einen Kalender von bspw. Google einbinden und dort nach Urlaubseinträgen suchen...) Nun, wo ich mich gerade intensiv mit DOIF auseinandersetze, bin ich eher zufällig über den DateTimePicker gestoßen. Tolles Teil!
Jeder kann Wiki ergänzen. Der ursprüngliche Beitrag müsste von Ellert sein.
Zitat
DOIF macht Spaß! Gefühlt kann man damit alles umsetzen/automatisieren. :)
Wenn etwas mit DOIF (FHEM-Modus) nicht geht, dann kann man es spätestens mit DOIF-Perl realisiert, es ist also nicht nur gefühlt ;)
Zitat von: Damian am 27 November 2019, 08:28:56
Jeder kann Wiki ergänzen.
Jo, habe schon länger einen Wiki Account und pflege dort auch immer mal wieder etwas, wenn mir etwas auffällt oder es gewünscht wird. ;)
Zitat von: Damian am 27 November 2019, 08:28:56
Der ursprüngliche Beitrag müsste von Ellert sein.
Welchen Beitrag meinst du genau?
Ich würde das hier als Beispiel unter ,,D" pflegen:
https://wiki.fhem.de/wiki/Kategorie:Code_Snippets
Und hier dann nochmal darauf verlinken:
https://wiki.fhem.de/wiki/DOIF/Zeitspanne_zwischen_zwei_Terminen_schalten
https://wiki.fhem.de/wiki/HM-CC-RT-DN_Funk-Heizkörperthermostat
Zitat von: Damian am 27 November 2019, 08:28:56
Wenn etwas mit DOIF (FHEM-Modus) nicht geht, dann kann man es spätestens mit DOIF-Perl realisiert, es ist also nicht nur gefühlt ;)
Sehr gut, danke für dieses mächtige Tool! ;)
Ich meinte diesen Beitrag:
https://wiki.fhem.de/wiki/DOIF/Zeitspanne_zwischen_zwei_Terminen_schalten
Du kannst ja, wie du vorgeschlagen hast, deinen eigenen machen und auf den oberen verweisen.
Jo, alles klar! So mache ich es bei Gelegenheit... ;)
Gruß Hoppel