raspberry.tips
raspberry.tips - Raspberry Pi Projekte und Tutorials
Etwas Zeit zur die Optimierung der Heizkosten hat mich eine automatisierte Lösung für die Heizungssteuerung mit FHEM auf meinem Raspberry Pi, den Homematic Heizungsthermostaten und meinen selbstgebauten Temperatursensoren umsetzen lassen.
Ich sende alle paar Minuten die Werte meiner Selbstbau Temperatursensoren an die Homematic Thermostate da ich die Erfahrung gemacht habe das die integrierte Temperaturmessung der Thermostate nicht sehr gut funktioniert. Nebenbei sind die Homematic eigenen Temperatursensoren meines Erachtens mit 50€ überteuert, für den Preis sind 3-4 Sensoren selbst gebaut.
Die Programmierung der Temperaturprogramme habe ich einmalig direkt an den Thermostaten erledigt, über eine Automatisierung und dynamische Steuerung mache ich mir später Gedanken, hier geht es Primär erst einmal um die Grundkonfiguration und den Thermostaten die aktuelle Raumtemperatur der Sensoren zu übermitteln.
Material & Vorbereitung
- HomeMatic Funk Stellantrieb für meine Heizkörper
- Meine Selbstbau-Temperatursensoren in FHEM für die Messung der Raumtemperatur (Bau der Sensoren & FHEM Konfiguration)
- Basis FHEM Installation mit NanoCUL oder Kauf-CUL
Grundeinrichtung Thermostat HM-CC-RT-DN
Nachdem ihr die Termostaten nach Anleitung montiert habt versetzt den CUL an eurem FHEM in den Pairing-Modus (kontrollieren könnt ihr das auf dem Gerät, es meldet als Status im Pairing Modus immer „hmPair 1“).
set <CUL-Name> hmPairForSec 600
Dann könnt ihr durch drücken der Boost Taste (mittlere Taste) den Thermostat in den Pairing Modus versetzen, im Pairing Modus zählt ein 30 Sekunden Countdown auf dem Display herunter. Das Pairing mit FHEM sollte immer nur mit einem Gerät erfolgen, immer erst ein Gerät konfigurieren und dann den nächsten Thermostat pairen.
Wenn das Pairing geklappt hat wird automatisch ein Gerät im Raum CUL_HM angelegt. Die Geräte sind nach dem Pairing und der automatischen Analge in FHEM immer mit HM_<GeräteID> benannt.
Dann bennen wir das automatisch erstellte Gerät entsprechend unserem Wunsch um
rename HM_51A3D9 Wohnzimmer_Heizung_Fenster
Das Gerät wird dann den passenden Raum verschoben, existiert dieser nicht wird er automatisch erstellt
attr Wohnzimmer_Heizung_Fenster room Wohnzimmer attr FileLog_Wohnzimmer_Heizung_Fenster room Logfiles
Aus Gründen der Übersichtlichkeit können alle Gerät vom selben Typ in einer Box angezeigt werden, den Typ können wir beliebig festlegen. Bei mir ist es „Heizung“.
attr Wohnzimmer_Heizung_Fenster group Heizung
Vergesst nicht das Umbenennen der internen Channels des erstellten Geräts, diese könnt ihr euch in den Eigenschaften anzeigen lassen. Hierbei sollte jeweils der Channel-Name immer erhalten bleiben, achtet darauf nur den Gerätenamen auszutauschen <GeräteName>_<Channel-Name>
rename HM_51A3D9_Weather Wohnzimmer_Heizung_Fenster_Weather rename HM_51A3D9_Climate Wohnzimmer_Heizung_Fenster_Climate rename HM_51A3D9_WindowRec Wohnzimmer_Heizung_Fenster_WindowRec rename HM_51A3D9_Clima Wohnzimmer_Heizung_Fenster_Clima rename HM_51A3D9_ClimaTeam Wohnzimmer_Heizung_Fenster_ClimaTeam rename HM_51A3D9_remote Wohnzimmer_Heizung_Fenster_remote rename ActionDetector Wohnzimmer_Heizung_Fenster_ActionDetector
Meine FHEM.cfg des Homematic HM-CC-RT-DN Funk-Heizkörperthermostat
###### Heizung ### WZ define Wohnzimmer_Heizung_Fenster CUL_HM 51A3D9 attr Wohnzimmer_Heizung_Fenster IODev nanoCUL attr Wohnzimmer_Heizung_Fenster actCycle 000:10 attr Wohnzimmer_Heizung_Fenster actStatus alive attr Wohnzimmer_Heizung_Fenster autoReadReg 4_reqStatus attr Wohnzimmer_Heizung_Fenster expert 2_raw attr Wohnzimmer_Heizung_Fenster firmware 1.4 attr Wohnzimmer_Heizung_Fenster group Heizung attr Wohnzimmer_Heizung_Fenster model HM-CC-RT-DN attr Wohnzimmer_Heizung_Fenster room Wohnzimmer attr Wohnzimmer_Heizung_Fenster serialNr NEQxxxxxx attr Wohnzimmer_Heizung_Fenster subType thermostat attr Wohnzimmer_Heizung_Fenster webCmd getConfig:clear msgEvents:burstXmit define Wohnzimmer_Heizung_Fenster_Weather CUL_HM 51A3D901 attr Wohnzimmer_Heizung_Fenster_Weather model HM-CC-RT-DN attr Wohnzimmer_Heizung_Fenster_Weather peerIDs 00000000, define Wohnzimmer_Heizung_Fenster_Climate CUL_HM 51A3D902 attr Wohnzimmer_Heizung_Fenster_Climate model HM-CC-RT-DN attr Wohnzimmer_Heizung_Fenster_Climate peerIDs 00000000, define Wohnzimmer_Heizung_Fenster_WindowRec CUL_HM 51A3D903 attr Wohnzimmer_Heizung_Fenster_WindowRec model HM-CC-RT-DN attr Wohnzimmer_Heizung_Fenster_WindowRec peerIDs 00000000, attr Wohnzimmer_Heizung_Fenster_WindowRec stateFormat last:trigLast define Wohnzimmer_Heizung_Fenster_Clima CUL_HM 51A3D904 attr Wohnzimmer_Heizung_Fenster_Clima model HM-CC-RT-DN attr Wohnzimmer_Heizung_Fenster_Clima peerIDs 00000000, define Wohnzimmer_Heizung_Fenster_ClimaTeam CUL_HM 51A3D905 attr Wohnzimmer_Heizung_Fenster_ClimaTeam model HM-CC-RT-DN attr Wohnzimmer_Heizung_Fenster_ClimaTeam peerIDs 00000000, define Wohnzimmer_Heizung_Fenster_remote CUL_HM 51A3D906 attr Wohnzimmer_Heizung_Fenster_remote model HM-CC-RT-DN attr Wohnzimmer_Heizung_Fenster_remote peerIDs 00000000, define Wohnzimmer_Heizung_Fenster_ActionDetector CUL_HM 000000 attr Wohnzimmer_Heizung_Fenster_ActionDetector event-on-change-reading .* attr Wohnzimmer_Heizung_Fenster_ActionDetector model ActionDetector define FileLog_Wohnzimmer_Heizung_Fenster FileLog ./log/Wohnzimmer_Heizung_Fenster-%Y.log Wohnzimmer_Heizung_Fenster attr FileLog_Wohnzimmer_Heizung_Fenster logtype text attr FileLog_Wohnzimmer_Heizung_Fenster room Logfiles
Anpassung der Ausgaben
Die Ausgabe muss via ReadingsGroup verschönert werden, das ist allerdings sehr komplex und mich einiges an Zeit gekostet die Beispiele aus dem WIKI für mich anzupassen.
Um die Ausgabe für eure Thermostate anzupassen müsst ihr leider den Code durcharbeiten und die Namen der Thermostate ersetzen. Achtet darauf das keine Zeilenumbrüche beim C&P entstehen.
# Readings Group erstellen fuer schoene Ausgabe define Heizung readingsGroup <%sani_heating>,<Soll>,<Ist>,<Ventil>,<Modus>,<Lock>,<Bat> Schlafzimmer_Heizung_Fenster_Clima:desired-temp,measured-temp,ValvePosition,controlMode,R-globalBtnLock@Schlafzimmer_Heizung_Fenster,batteryLevel@Schlafzimmer_Heizung_Fenster \ Wohnzimmer_Heizung_Fenster_Clima:desired-temp,measured-temp,ValvePosition,controlMode,R-globalBtnLock@Wohnzimmer_Heizung_Fenster,batteryLevel@Wohnzimmer_Heizung_Fenster \ Wohnzimmer_Heizung_Tuere_Clima:desired-temp,measured-temp,ValvePosition,controlMode,R-globalBtnLock@Wohnzimmer_Heizung_Tuere,batteryLevel@Wohnzimmer_Heizung_Tuere # Kommandos definieren attr Heizung commands {"controlMode.manual"=>"set %DEVICE controlMode auto","controlMode.auto"=>"set %DEVICE controlMode manual","R-globalBtnLock.on"=>"set %DEVICE regSet globalBtnLock off","R-globalBtnLock.off"=>"set %DEVICE regSet globalBtnLock on"} #Namen Mappen attr Heizung mapping {Wohnzimmer_Heizung_Tuere_Clima=>"WZ Tuere",Wohnzimmer_Heizung_Fenster_Clima=>"WZ Fenster",Schlafzimmer_Heizung_Fenster_Clima=>"SZ Fenster"} #Raum zuweißen attr Heizung room Heizung #Werte formatieren sodass passende Icons angezeigt werden attr Heizung valueFormat {if($READING eq "ValvePosition" & $VALUE ne "0"){$VALUE = int($VALUE/10)*10} elsif($READING eq "batteryLevel"){if($VALUE>=3){$VALUE=100} elsif($VALUE>=2.7){$VALUE=75}elsif($VALUE>=2.5){$VALUE=50}elsif($VALUE>=2.2){$VALUE=25} else{$VALUE=0}}} # Icons definieren attr Heizung valueIcon {'controlMode.manual' => 'sani_heating_manual@795CFF', 'controlMode.auto' => 'sani_heating_automatic@FFC13A', 'controlMode.boost' => 'sani_heating_boost@FB0C02', 'humidity'=>'humidity@6FD9FB', 'R-globalBtnLock.on'=>'secur_locked@F7301D', 'R-globalBtnLock.off'=>'secur_open@0CFB0C','ValvePosition.0' => 'sani_heating_level_0@002AE0', 'ValvePosition.10' => 'sani_heating_level_10@F8D53D','ValvePosition.20' => 'sani_heating_level_20@FF9341', 'ValvePosition.30' => 'sani_heating_level_30@F17F3F','ValvePosition.40' => 'sani_heating_level_40@E46C3C', 'ValvePosition.50' => 'sani_heating_level_50@DE3B3A','ValvePosition.60' => 'sani_heating_level_60@A30D2D', 'ValvePosition.70' => 'sani_heating_level_70@B40A23','ValvePosition.80' => 'sani_heating_level_80@C40619', 'ValvePosition.90' => 'sani_heating_level_90@D4030F','ValvePosition.100' => 'sani_heating_level_100@E50005', 'batteryLevel.100'=>'measure_battery_100@0CFB0C','batteryLevel.75'=>'measure_battery_75@42BC0A', 'batteryLevel.50'=>'measure_battery_50@F5FF10','batteryLevel.25'=>'measure_battery_25@FB5909', 'batteryLevel.0'=>'measure_battery_0@E50005','controlMode.set_boost' => 'hourglass', 'controlMode.set_auto' => 'hourglass','controlMode.set_manual' => 'hourglass', 'R-globalBtnLock.set_on' => 'hourglass','R-globalBtnLock.set_off' => 'hourglass'} #Ausgabewerte anpassen Icon und Wert attr Heizung valueStyle {if($READING eq "measured-temp"){my $t=$VALUE;;my $d=ReadingsVal($DEVICE,'desired-temp',0);;if($t-$d>=1){'style="color:rgb(251,63,11);;"'}elsif($t-$d<=-1){'style="color:rgb(79,58,251);;"'}else{'style="color:rgb(12,251,12);;"'}}} # Den Wert die passende Einheit C / Prozent zuweißen attr Heizung valueSuffix {"desired-temp"=>" °C", "measured-temp"=>" °C","ValvePosition"=>" (".ReadingsVal($DEVICE,$READING,0)." %)","humidity"=>" ".ReadingsVal($DEVICE,$READING,0)." % RH","batteryLevel"=>" (".ReadingsVal($DEVICE,$READING,0)." V)"}
Thermostat mit externen Temperaturdaten füttern
Nun möchte ich den Heizkörperthermostat natürlich immer mit einer passenden IST Temperatur (Raumtemperatur) füttern da die Messung am Thermostat logischerweise nicht sehr gut funktioniert.
Ich verwende hierzu meine Selbstbau Temperatursensoren deren Werte ich bereits von meinem EmonCMS in FHEM übertrage. Ihr könnt aber auch jegliche andere Temperaturquelle, welche bereits in FHEM eingebunden ist, benutzen.
Das Prinzip ist recht einfach, wir erstellen ein virtuelles Gerät welches wir an unseren Thermostaten „pairen“, dem virtuellen Gerät weißen wir via Aufgabenplaner alle paar minuten die aktuelle Raumtemperatur eines beliebigen Sensors zu.
Als erstes müssen wir ein virtuelles Gerät anlegen um die Daten ordentlich an den Thermostat übertragen zu können.
Dann erstellen wir das virtuelle Device, ändert die HMID auf eine beliebige die noch nicht verwendet wird.
define virtualCCU_WZ CUL_HM 22ABCD attr virtualCCU_WZ model CCU-FHEM
Ich verschiebe das Gerät direkt in einen Raum (diesen könnt ihr später verstecken da für den Alltag nicht notwendig)
attr virtualCCU_WZ room SomeRoom
Wir erstellen für das Gerät nun noch virtuelle Aktoren mit welchen wir unsere Thermostate pairen können. Hier hatte ich das Problem das ich über virtuelle CCU immer nur Thmerostate eines Raumes bedienen konnte, sonst ist FHEM durcheinander gekommen.
Ich erstelle daher pro Raum eine virtuelle CCU und pro Thermostat im Raum ein virtuellen Aktor für die vCCU (in diesem Fall 2)
set virtualCCU_WZ virtual 2
Da im Standard ein virtuelle Aktor vom Typ Button angelegt wird benennen wir diese noch um
rename virtualCCU_WZ_Btn1 virtualCCU_WZ_Sensor1 rename virtualCCU_WZ_Btn2 virtualCCU_WZ_Sensor2
Nun erfolgt das Pairing mit eurem Thermostat, ersetzt zb. „Wohnzimmer_Heizung_Fenster“ mit dem Namen eures Thermostats in FHEM, _Weather muss angehangen werden sodass an den richtigen Kanal gepeered wird.
set virtualCCU_WZ_Sensor1 peerChan 0 Wohnzimmer_Heizung_Fenster_Weather single set set virtualCCU_WZ_Sensor2 peerChan 0 Wohnzimmer_Heizung_Tuere_Weather single set
Als letztes definieren wir noch den regelmäßigen Job der alle paar Minuten die Temperatur von einem in FHEM vorhandenen Gerät liest und an das virtuelle Gerät sendet sodass es vom Thermostat verarbeitet werden kann.
define at_virtualCCU_WZ_Sensor1 at +*00:02 { my $T=(ReadingsVal("Wohnzimmer_Temperatur","temperature",20.0));; fhem "set virtualCCU_WZ_Sensor1 virtTemp $T" } define at_virtualCCU_WZ_Sensor2 at +*00:02 { my $T=(ReadingsVal("Wohnzimmer_Temperatur","temperature",20.0));; fhem "set virtualCCU_WZ_Sensor2 virtTemp $T" }
Die Temperatur von meinen Temperatur Geräten , z.B. „Wohnzimmer_Temperatur“ wird über den Wert „temperature“ an die virtuellen Aktoren übergeben. Wenn keine Temperatur gelesen werden kann wird 20C gesendet. Via Peering lesen die Thermostate dann den IST Wert von den virtuellen Devices.
Das ist mein fertiges virtuellen CCUs
Kontrollieren könnt ihr das ganze natürlich entweder über die FHEM Logfile, darin müsstet ihr alle X Minuten folgenden Eintrag finden
2017.04.15 21:17:16 3: CUL_HM set <virt. Sensor>virtTemp 21.4
Hier meine gesamte Config für zwei vCCUs mit drei Thermostaten
## vCCU1 mit zwei Devices an zwei Thermostaten define virtualCCU_WZ CUL_HM 22ABCD attr virtualCCU_WZ IODev nanoCUL attr virtualCCU_WZ expert 2_raw attr virtualCCU_WZ model CCU-FHEM attr virtualCCU_WZ room Heizung attr virtualCCU_WZ subType virtual attr virtualCCU_WZ webCmd virtual:update define virtualCCU_WZ_Sensor1 CUL_HM 22ABCD01 attr virtualCCU_WZ_Sensor1 model CCU-FHEM attr virtualCCU_WZ_Sensor1 peerIDs 51A3D901, attr virtualCCU_WZ_Sensor1 webCmd virtTemp define virtualCCU_WZ_Sensor2 CUL_HM 22ABCD02 attr virtualCCU_WZ_Sensor2 model CCU-FHEM attr virtualCCU_WZ_Sensor2 peerIDs 51A3E501, attr virtualCCU_WZ_Sensor2 webCmd virtTemp ## vCCU2 mit einem Device an einem Thermostat, HM ID muss sich wohl an den ersten beiden Stelle unterscheiden define virtualCCU_SZ CUL_HM 23ABCD attr virtualCCU_SZ IODev nanoCUL attr virtualCCU_SZ expert 2_raw attr virtualCCU_SZ model CCU-FHEM attr virtualCCU_SZ room Heizung attr virtualCCU_SZ subType virtual attr virtualCCU_SZ webCmd virtual:update define virtualCCU_SZ_Sensor1 CUL_HM 23ABCD01 attr virtualCCU_SZ_Sensor1 model CCU-FHEM attr virtualCCU_SZ_Sensor1 peerIDs 30A1A801, attr virtualCCU_SZ_Sensor1 webCmd virtTemp #Schedules zum schreiben in die virtuellen Devices, Senden an die Thermostate erfolgt automatisch define at_virtualCCU_WZ_Sensor1 at +*00:02 { my $T=(ReadingsVal("Wohnzimmer_Temperatur","temperature",20.0));; fhem "set virtualCCU_WZ_Sensor1 virtTemp $T" } define at_virtualCCU_WZ_Sensor2 at +*00:02 { my $T=(ReadingsVal("Wohnzimmer_Temperatur","temperature",20.0));; fhem "set virtualCCU_WZ_Sensor2 virtTemp $T" } define at_virtualCCU_SZ_Sensor1 at +*00:02 { my $T=(ReadingsVal("Schlafen_Temperatur","temperature",20.0));; fhem "set virtualCCU_SZ_Sensor1 virtTemp $T" }
FHEM Plot für den Thermostaten erstellen
Wir erstellen uns nun noch einige schöne Grafiken, auch Plotts genannt um auf einen Blick erkennen zu können wann unser Thermostat die Heizung anwirft und wann er abschaltet.
Hierzu öffnen wir das Logfile unseres Thermostaten, entweder ihr klickt auf euren Thermostat und findet ganz unten das Logfile oder ihr habt das Log File im Selben Raum hinterlegt und öffnet es direkt.
Innerhalb des Logfile Geräts eures Thermostaten klickt ihr auf „Create SVG Plot“
Wir speichern den Plot einfach ab ohne eine Änderung vorzunehmen, klickt hierzu im Webinterface einfach wie gewohnt auf „Save config“ links oben. Dann Wechsel wir auf Edit Files und suchen unsere gerade erstellt .glot Datei, bei mir wurde Sie „SVG_<Gerät>_1.gplot“ bekannt.
Öffnet die Datei und ersetzt den Inhalt mit folgendem:
set terminal png transparent size <SIZE> crop set output '<OUT>.png' set xdata time set timefmt "%Y-%m-%d_%H:%M:%S" set xlabel " " set title '<TL>' set ytics set y2tics set grid y2tics set ylabel "Ventilposition (%)" set y2label "Temperatur (°C)" set yrange [0:100] set y2range [15:26] #FileLog 4:measured-temp\x3a:: #FileLog 4:desired-temp\x3a:: #FileLog 4:actuator\x3a:: plot "<IN>" using 1:2 axes x1y2 title 'Gemessen' ls l0fill lw 2 with lines,\ "<IN>" using 1:2 axes x1y2 title 'Gewünscht' ls l1fill lw 1 with lines,\ "<IN>" using 1:2 axes x1y1 title 'Ventilpos' ls l2 lw 1 with lines
Speichert die .glot Datei.
Wir können uns nun den Plott noch in einem gewünschten Raum ausgeben lassen, hierzu passen wir die Attribute unseres Plots wie folgt an.
Wir definieren die Ausgabegröße des Plots und fügen den Plot dem Raum Wohnzimmer hinzu
attr SVG_FileLog_Wohnzimmer_Heizung_Fenster_1 plotsize 840,240 attr SVG_FileLog_Wohnzimmer_Heizung_Fenster_1 room Wohnzimmer
Meiner sieht so aus
Automatisches zeit-gesteuertes Temperaturprogramm erstellen
Ihr habt die Möglichkeit via FHEM das Temperaturprogramm pro Wochentag einzustellen anstelle dieses mühsam über das Gerät zu programmieren. Die Umsetzung ist recht simpel, wir setzen auf den Kanal „CLIMA“ (bei anderen Geräten ist es Climate) pro Wochentag / Uhrzeit die Soll Temperaturwerte.
Der Aufbau des Befehls ist recht simpel:
set <Name>_Clima tempListMon prep|exec 05:30 19.0 07:00 20.5 16:00 19.0 20:30 20.0 24:00 17.0
Wir setzen also pro Tag einen Befehl ab um die Temperaturliste des Tages zu ändern, es gibt folgende Listen tempListMon, tempListTue, tempListWed, tempListThu, tempListFri, tempListSat, tempListSun.
Das prep oder exec gibt an ob die geänderte Liste direkt an das Gerät übertragen werden soll (exec) oder erst mal in FEHM gespeichert wird (prep). Es empfiehlt sich erst nach Anpassung aller Listen bei der letzten exec zu verwenden um die Änderungen zu übertragen.
Am Ende stehen die Zeiträume für die Soll Temperatur. Beginn ist automatisch immer 00:00Uhr des jeweiligen Tages, die Zeitangabe und der dahinter stehende Temperaturwert ergibt somit immer eine Zeitspanne.
Im obrigen Beispiel wird also in der Zeit zwischen 00:00Uhr und 05:30Uhr die soll Temperatur auf 19.0 C gesetzt. Zwischen 05:30Uhr und 07:00Uhr auf 20.5C usw. Hier ein Beispiel für mein Wochenprogramm:
Wichtig! Die Änderung der letzten Temperaturliste wird mit EXEC anstelle mit PREP ausgeführt um zu übertragen!
set Thermostat_Clima tempListMon prep 05:30 19.0 07:00 21.5 16:00 20.0 20:30 21.0 24:00 17.0 set Thermostat_Clima tempListTue prep 05:30 19.0 07:00 21.5 16:00 20.0 20:30 21.0 24:00 17.0 set Thermostat_Clima tempListWed prep 05:30 19.0 07:00 21.5 16:00 20.0 20:30 21.0 24:00 17.0 set Thermostat_Clima tempListThu prep 05:30 19.0 07:00 21.5 16:00 20.0 20:30 21.0 24:00 17.0 set Thermostat_Clima tempListFri prep 05:30 19.0 07:00 21.5 16:00 20.0 20:30 21.0 24:00 17.0 set Thermostat_Clima tempListSat prep 05:30 19.0 07:00 21.5 16:00 20.0 20:30 21.0 24:00 17.0 set Thermostat_Clima tempListSun exec 05:30 19.0 07:00 21.5 16:00 20.0 20:30 21.0 24:00 17.0
Zeitraum Temperatur
00:00 – 05:30 19,0 C
05:30–07:00 21,5 C
07:00–16:00 20,0 C
16:00–20:30 21,0 C
21:30–24:00 17,0 C
Die Temperatur-liste könnt ihr euch im Gerät im Channel Clima jeder Zeit im selben Format ansehen, hier ein Beispiel
Ich hatte mir dann die Temperaturlisten noch in einer Datei in FHEM abgelegt, schaut euch das am Besten im WIKI an.
Heizungssteuerung mit HomeMatic HM-CC-RT-DN und FHEM auf dem Raspberry Pi
raspberry.tips