FHEM Forum

FHEM => Automatisierung => DOIF => Thema gestartet von: hoppel118 am 26 November 2019, 20:57:08

Titel: Homematic Thermostate Urlaub -> Datum in DOIF von "2019" zu "19" formatieren
Beitrag von: hoppel118 am 26 November 2019, 20:57:08
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
Titel: Antw:Homematic Thermostate Urlaub -> Datum in DOIF von "2019" zu "19" formatieren
Beitrag von: amenomade am 26 November 2019, 22:17:35
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
Titel: Antw:Homematic Thermostate Urlaub -> Datum in DOIF von "2019" zu "19" formatieren
Beitrag von: Damian am 26 November 2019, 22:50:06
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"])
Titel: Antw:Homematic Thermostate Urlaub -> Datum in DOIF von "2019" zu "19" formatieren
Beitrag 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?
Titel: Antw:Homematic Thermostate Urlaub -> Datum in DOIF von "2019" zu "19" formatieren
Beitrag von: Damian am 26 November 2019, 23:33:28
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"])

Titel: Homematic Thermostate Urlaub -> Datum in DOIF von "2019" zu "19" formatieren
Beitrag von: hoppel118 am 27 November 2019, 05:56:11
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
Titel: Antw:Homematic Thermostate Urlaub -> Datum in DOIF von "2019" zu "19" formatieren
Beitrag von: Damian am 27 November 2019, 08:28:56
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 ;)
Titel: Homematic Thermostate Urlaub -> Datum in DOIF von "2019" zu "19" formatieren
Beitrag von: hoppel118 am 27 November 2019, 09:02:42
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! ;)
Titel: Antw:Homematic Thermostate Urlaub -> Datum in DOIF von "2019" zu "19" formatieren
Beitrag von: Damian am 27 November 2019, 13:36:13
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.
Titel: Antw:Homematic Thermostate Urlaub -&gt; Datum in DOIF von &quot;2019&quot; zu &quot;19&quot; formati
Beitrag von: hoppel118 am 27 November 2019, 13:56:06
Jo, alles klar! So mache ich es bei Gelegenheit... ;)

Gruß Hoppel