Hallo zusammen,
in den bisherigen attrTemplate ist zur Erstellung bzw. Änderung von Wochenprogrammen eine Lösung enthalten, die die ganzen Readings "einsammelt", die durch json2nameValue in der "complex"-Einstellung generiert werden, und das ganze dann auf dummy-Devices mappt und von dort aus dann wieder einsammelt und dann auf Anforderung wieder als Wochenprofil an den ebusd sendet. Wie das funktioniert, hatte Reinhart
hier dargestellt.
Das funktioniert zwar, aber am Ende muss man das ganze doch irgendwie "manuell" bedienen - kurz: es entspicht mAn. nicht unbedingt dem, was möglich wäre. Meine persönliche Vision von dem ganzen Thema Heizungssteuerung sieht so aus, dass die Schaltzeiten aller Heizungsgeräte miteinander synchron laufen und zum jeweiligen Anforderungsprofil passen; und das sieht eben an einem Feiertag ggf. anders aus wie an einem Spätschichttag, normalen Arbeitstag oder bei Homeoffice, in den Ferien, etc. pp...
Hier soll daher eine Lösung entwickelt werden, die
- das Modul weekprofile nutzt, um verschiedene Profile zu verwalten, die dann auch sehr einfach gewechselt werden können; (Für die, die das nicht kennen: weekprofile kann über das hier nicht dargestellte feature "Topic" sämtliche Heizungsgeräte mit individuell zum jeweiligen Topic passenden Profilen versorgen, dazu braucht man dann am Ende nur einen einzigen, kurzen Befehl...)
- die vom ebus kommenden MQTT-Daten dann auch gleich so aufbereitet, dass man nicht die ganzen Datenpunkte irgendwie "verstreut" hat, sondern das ganze konsolidiert;
- "heute" auf "Feiertagsmodus" umstellen kann;
- die Zahl der Events und (potentiellen) Schreibvorgänge in Richtung ebus möglichst gering hält;
- ....?
Mein Problem: ich habe keinen ebus, und kann daher nur simulieren und mir denken, wie es in etwa funktionieren müsste...
Daher: keine Gewähr - weder für den Code, noch für das, was ggf. hinter dem ebusd passiert!
Den erforderlichen Code bekommt man mit
{ Svn_GetFile('contrib/AttrTemplate/99_attrTmqtt2_ebus_Utils.pm', 'FHEM/99_attrTmqtt2_ebus_Utils.pm', sub(){ CommandReload(undef, '99_attrTmqtt2_ebus_Utils') }) }
(bzw. nach dem morgigen update mit einem attrTemplate)
Da sind drei neue Funktionen drin:
-FHEM::aTm2u_ebus::j2nv() ist ein "wrapper" um json2nameValue, der das "_value" aus dem Readingnamen eliminiert (m.E. für alle ebus-MQTT2-Geräte interessant)
- FHEM::aTm2u_ebus::upd_day_profile() - Das konsolidiert die ganzen Einzelwerte zu Tagesprofilen (leider fehlt noch Info, wo die Art des Tagesprofils herkommt)
- FHEM::aTm2u_ebus::send_weekprofile() - holt die Profildaten aus dem weekprofile-Device und sendet sie an den ebus.
Dabei kann man eine "Grenztemperatur" festlegen, welche "on" von "off" trennen soll, im Code ist die mal auf 20° festgelegt. Steht also im weekprofile 20° oder höher, ist das eine Einschaltphase, die gilt, bis eine Temperatur kleiner 20° kommt, das ganze maximal für 3 Perioden...
Falls jemand Testen will, hier ein paar Zeilen zur Konfiguration als Beispiele...
Ein MQTT2-Device als "Heizungsgerät" (gleich für die Topic-Funktion mit "brenner" benannt):
defmod MQTT2_ebusd_hc1 MQTT2_DEVICE MQTT2_ebusd_hc1 attr MQTT2_ebusd_hc1 userattr weekprofile
attr MQTT2_ebusd_hc1 readingList ebusd/hc1/Set:.* { FHEM::aTm2u_ebus::j2nv($EVENT, '', $JSONMAP) }\
ebusd/hc1/MaxDHWTemp:.* { FHEM::aTm2u_ebus::j2nv($EVENT, '', $JSONMAP) }\
ebusd/hc1/ProgramChooseSwitch:.* { FHEM::aTm2u_ebus::j2nv($EVENT, '', $JSONMAP) }\
ebusd/hc1/SummerWinterChangeOverTemperature:.* { FHEM::aTm2u_ebus::j2nv($EVENT, '', $JSONMAP) }\
ebusd/hc1/StartOfHoliday.Day:.* { FHEM::aTm2u_ebus::j2nv($EVENT, 'Day_', $JSONMAP) }\
ebusd/hc1/StartOfHoliday.Month:.* { FHEM::aTm2u_ebus::j2nv($EVENT, 'Month_', $JSONMAP) }\
ebusd/hc1/Adaption:.* { FHEM::aTm2u_ebus::j2nv($EVENT, '', $JSONMAP) }\
ebusd/hc1/HolidayTemp:.* { FHEM::aTm2u_ebus::j2nv($EVENT, '', $JSONMAP) }\
ebusd/hc1/HP1.*:.* { FHEM::aTm2u_ebus::upd_day_profile( $NAME, $TOPIC, $EVENT, 'So|Mo|Di|Mi|Do|Fr|Sa' ) }\
ebusd/hc1/HP1.*:.* HP1_last_json
attr MQTT2_ebusd_hc1 setList Sunday ebusd/hc1/hcTimer.Sunday/set\
Monday ebusd/hc1/hcTimer.Monday/set\
Tuesday ebusd/hc1/hcTimer.Tuesday/set\
Wednesday ebusd/hc1/hcTimer.Wednesday/set\
Thursday ebusd/hc1/hcTimer.Thursday/set\
Friday ebusd/hc1/hcTimer.Friday/set\
Saturday ebusd/hc1/hcTimer.Saturday/set\
weekprofile { FHEM::aTm2u_ebus::send_weekprofile($NAME, $EVTPART1, $EVTPART2) }\
today_holiday_weekprofile { FHEM::aTm2u_ebus::send_weekprofile( $NAME, $EVTPART1, $EVTPART2, 'holiday' ) }
attr MQTT2_ebusd_hc1 setStateList on off
attr MQTT2_ebusd_hc1 weekprofile brenner
Wer nicht möchte, dass die Daten effektiv an den ebus gehen, kann ja in der setList "unpassende" Topics nehmen, und dann mit einem Tool wie mosquitto_sub checken, was auf der MQTT-Seite passiert, wenn man die Profile gewechselt...

.
Ein weekprofile Device:
defmod wp weekprofile
Das füllen wir mit zwei Profilen (EDIT: das hier ist eine Abkürzung, später kann man die Profile sehr viel komfortabler über das Web-Interface von weekprofile editieren, erweitern, ...) :
set wp profile_data default {"Wed":{"time":["12:00","16:00","18:00","20:00","24:00"],"temp":["18.0","23.5","5.0","20.0","15.0"]},"Sun":{"temp":["18.0","23.5","5.0","20.0","15.0"],"time":["11:00","15:00","17:30","21:00","24:00"]},"Sat":{"temp":["18.0","23.5","5.0","20.0","15.0"],"time":["11:30","16:30","18:30","20:20","24:00"]},"Tue":{"time":["12:00","16:00","18:00","20:00","24:00"],"temp":["18.0","23.5","5.0","20.0","15.0"]},"Mon":{"temp":["18.0","23.5","5.0","20.0","15.0"],"time":["12:00","16:00","18:00","20:00","24:00"]},"Fri":{"temp":["18.0","23.5","5.0","20.0","15.0"],"time":["12:00","16:00","18:00","20:00","24:00"]},"Thu":{"temp":["18.0","23.5","5.0","20.0","15.0"],"time":["12:00","16:00","18:00","20:00","24:00"]}}
set wp profile_data test {"Thu":{"temp":["18.0","23.5","5.0","20.0","15.0"],"time":["12:04","16:04","18:04","20:04","24:00"]},"Tue":{"time":["12:02","16:02","18:02","20:02","24:00"],"temp":["18.0","23.5","5.0","20.0","15.0"]},"Fri":{"temp":["18.0","23.5","5.0","20.0","15.0"],"time":["12:05","16:05","18:05","20:05","24:00"]},"Mon":{"temp":["18.0","23.5","5.0","20.0","15.0"],"time":["12:01","16:01","18:01","20:01","24:00"]},"Wed":{"time":["12:03","16:03","18:03","20:03","24:00"],"temp":["18.0","23.5","5.0","20.0","15.0"]},"Sun":{"time":["11:00","15:00","17:30","21:00","24:00"],"temp":["18.0","23.5","5.0","20.0","15.0"]},"Sat":{"temp":["18.0","23.5","5.0","20.0","15.0"],"time":["11:36","16:36","18:36","20:26","24:00"]}}
Und hier noch ein paar Befehle zum testen:
{ FHEM::aTm2u_ebus::send_weekprofile('MQTT2_ebusd_hc1', 'wp','default') }
{ FHEM::aTm2u_ebus::send_weekprofile('MQTT2_ebusd_hc1', 'wp','test') }
{ FHEM::aTm2u_ebus::send_weekprofile('MQTT2_ebusd_hc1', 'wp','test','holiday','15') }
set wp send_to_device test MQTT2_ebusd_hc1
set MQTT2_ebusd_hc1 today_holiday_weekprofile wp default
Bin mal auf euer feedback gespannt - ist sicher noch nicht perfekt, aber ich hoffe, man kann erkennen, was es "bringen" könnte...