Smarthome Teil 3:

Simple Heizungssteuerung in FHEM

Ich heize meine Wohnung über eine Gastherme, die bislang über ein Thermostat in der Wohnküche gesteuert wurde. Das Thermostat verfügte über eine programmierbare Wochenzeitschaltuhr, da ich aber oft zu unterschiedlichen Zeiten Zuhause bin, war mir das zu unflexibel.
Mit der jetzigen Lösung wird die Therme immer nur automatisch eingeschaltet, wenn ich auch Zuhause bin. Außerdem habe ich die Option, von unterwegs über mein Handy die Heizung schon kurz bevor ich nach Hause komme einzuschalten.

In Zukunft möchte ich dann noch an die Heizkörper der einzelnen Räume Z-Wave-Thermostate anbauen, so dass ich die verschiedenen Räume separat regeln kann. Fürs erste reicht es aber erstmal die alte Regelung der Therme auszutauschen.

Das alte Thermostat mit Wochenzeitschaltuhr hatte einen einfachen Relaisausgang, so dass ich dieses gut austauschen konnte. Ich verwende ein Qubino FLUSH 1D RELAY mit dem dazugehörigen Temperaturfühler (separat zu kaufen). Dieses Modell hat einen potentialfreien Relaiskontakt und lies sich ohne Probleme anstelle der alten Regelung einbauen.

Für den Anfang habe ich eine einfache Zweipunktregelung implementiert (entsprechend dem alten Thermostat).

Zunächst setzten das Raspberry in den Anlernmodus setzen

set ZWAVE1 addNode onNw

Anschließend sollte beim Anschließen des Qubino dieses als neues Schaltmodul in FHEM auftauchen. Der Temperaturfühler sollte schon angeschlossen sein, damit dieser auch erkannt wird.

Zunächst geben wir dem Device einen eindeutigeren Namen (ZWave_??? durch den alten Namen ersetzen) und fügen es dann dem Raum ‘Heizung’ hinzu:

rename ZWave_??? Heizungsschalter
attr Heizungsschalter room Heizung

Da das Modul nicht kalibriert ist, kann man über Angabe eines Offsets die Temperatur korrigieren (in meinem Fall mit dem Wert 1033; siehe Anleitung).
Außerdem sollte configDigitalTemperatureSensor auf 2 gesetzt werden. D.h. das Modul soll bei einer Temperaturänderung von 0,2°C ein Event schicken. Bemerkung: Eine Einstellung von 1 führte bei mir zu einer Flut von Events, da der Wert oft um 0,1°C schwankte.

set Heizungsschalter configTemperatureSensorOffsetSettings 1033
set Heizungsschalter configDigitalTemperatureSensor120 2

Als nächstes definieren wir uns zwei Dummy-Devices, um separate Tag- und Nachttemperaturen einstellen zu können:

define desiredTemperatureNight dummy
attr desiredTemperatureNight room Heizung
attr desiredTemperatureNight setListstate:13.5,14.0,14.5,15.0,15.5,16.0,16.5,17.0,17.5,18.0,18.5,19.0
attr desiredTemperatureNight webCmd state
define desiredTemperatureDay dummy
attr desiredTemperatureDay room Heizung
attr desiredTemperatureDay setList state:17.0,17.5,18.0,18.5,19.0,19.5,20.0,20.5,21.0,21.5,22.0
attr desiredTemperatureDay webCmd state

Außerdem brauchen wir ein weiteres Dummy, um zwischen Tag, Nacht und Aus wechseln zu können:

define currentStateHeizung dummy
attr currentStateHeizung room Heizung
attr currentStateHeizung webCmd day:night:off

Nun kommt die eigentliche Zweipunktregelung:

define Heizungsthermostat THRESHOLD Heizungsschalter:temperature Heizungsschalter
attr Heizungsthermostat room Heizung

Klicken wir auf das hinzugefügte Heizungsthermostat sollten wir folgende Internals sehen (falls nicht, über den set-Befehl ändern):
sensor: Heizungsschalter
sensor_reading: temperature
cmd1_gt: set Heizungsschalter on
cmd2_lt: set Heizungsschalter off

Der Wert ‘hysteresis’ gibt an, ab welcher Temperatur unterhalb des Sollwertes die Heizung an gehen soll. Bei Erreichen des Sollwertes wird wieder ausgeschaltet.
Mit Einstellung eines Offsets kann man beide Werte anheben.

set Heizungsschalter offset 0
set Heizungsschalter hysteresis 1

Durch den Befehl set Heizungsthermostat desired 19 aktiviert man das Thermostat für die angegebene Temperatur.
Damit die Temperatur entsprechend den Einstellungen für Tag und Nacht übernommen wird, definieren wir noch ein DOIF:

define doif_Heizungsthermostat_desired DOIF ([currentStateHeizung] eq "day") (set Heizungsthermostat desired [desiredTemperatureDay]) DOELSEIF ([currentStateHeizung] eq "night") (set Heizungsthermostat desired [desiredTemperatureNight]) DOELSEIF ([currentStateHeizung] eq "off") (set Heizungsthermostat desired 10)

Auch noch zum Raum ‘Heizung’:

attr doif_Heizungsthermostat_desired room Heizung

Um die Funktion besser überprüfen zu können, legen wir schließlich noch eine Grafik an, wo wir Temperaturverlauf und Schaltzustand im zeitlichen Verlauf betrachten können.
Dazu Klicken wir unter ‘Everything’ auf das Device ‘FileLog_Heizungsschalter’, das automatisch mit dem Schalter angelegt wurde. Dort gibt es die Option ‘Create SVG plot’.
Die dort gemachten Änderungen werden in einem File *.gplot gespeichert.
Für eine Grafik, den Temperaturverlauf und zusätzlich den Schaltzustand als Rechteckfunktion anzeigt, sollte dieses File in etwa so aussehen:

# Created by FHEM/98_SVG.pm, 2016-12-09 10:57:46
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 'Raumtemperatur'
set ytics 
set y2tics ("on" 1, "off" 0)
set grid ytics y2tics
set ylabel "°C"
set y2label "on/off"
set yrange [12:24]
set y2range [-0.2:1.2]

#FileLog_Heizungsschalter 4:Heizungsschalter.temperature\x3a::
#FileLog_Heizungsschalter 3:Heizungsschalter.reportedState\x3a::$fld[3]=~"on"?1:0

plot "<IN>" using 1:2 axes x1y1 title 'Temp' ls l2 lw 1.5 with lines,\
     "<IN>" using 1:2 axes x1y2 title 'Schaltzustand' ls l1 lw 1.5 with steps

Wenn man dann den verschiedenen Schaltzuständen noch Icons hinzufügt, sieht die Regelung am Ende in etwa so aus:

Bei mir erfolgt die Umstellung von Tag und Nacht automatisch sowohl Präsenz- als auch Zeitgesteuert, indem ich ‘currentStateHeizung’ abhängig von meinem Anwesenheitsstatus, bzw. meiner geschätzen Zeit zu der ich nach Hause komme, auf Tag bzw. Nacht setze.

SMARTHOME
smarthome raspberry pi fhem

Neuer Kommentar