Code-Quickie: Heizung mit Grafana visualisieren

Code-Quickie: Heizung visualisieren mit Grafana

Code-Quickie: Heizung mit Grafana visualisieren

Die kalte Jahreszeit rückt näher und so bekommt meine Heizung ein paar schöne Updates. Heute also ein kleiner Code-Quickie zur Visualisierung meiner Heizung mit Grafana.

Einleitung

Nach dem InfluxDB und Grafana schon eine ganze Weile erfolgreich bei mir läuft und kräftig Daten sammelt sowie visualisiert, dachte ich mir, ich statte meinen Heizraum mit einem Display aus, auf dem ich alle wichtigen Werte zentral darstellen bzw. ablesen kann.

Dieser Code-Quickie umfasst nicht nur das reine Visualisierungthema, sondern holt etwas weiter aus und behandelt auch die Komponenten die die Visualisierung erst möglich machen.

Neben der hauptsächlichen Visualisierung in Grafana werde ich auch kurz auf die Visualisierung in FHEM und auf externen Geräte eingehen.

Die Heizung

Im Folgenden zuerst eine Zusammenstellung von welchen Geräten und Sensoren ich Daten für die Visualisierung sammle. Generell können natürlich alle Arten von Heizungen verwendet werden, aber die Daten müssen in irgendeiner Form in FHEM oder einem anderen Smart-Home-System bzw. in der InfluxDB/MariaDB landen, damit sie später visualisiert werden können.

Meine Heizung besteht in Grunde genommen aus 3 Teilen, welche ich im Folgenden näher darstellen werde.

Buderus Ölheizung

Zuerst die Buderus Ölheizung. Ein G115 Kessel mit der Logamatic 2107 Steuerung.

Code-Quickie: Heizung mit Grafana visualisieren

Nichts besonderes und an sich langweilig wäre da nicht das KM271 Kommunikationsmodul. Mit diesem Kommunikationsmodul und passendem FHEM-Modul lassen sich fast alle Parameter und Temperaturen auslesen und das besondere auch einstellen bzw. fernsteuern. Super!Code-Quickie: Heizung mit Grafana visualisieren

Daneben ist das KM271-Modul ein wichtiger Datenlieferant für die spätere Visualisierung mit Grafana.

Das KM271-Modul und FHEM passen sehr gut zusammen und diese Konstellation funktioniert seit ca. 1,5 Jahren ziemlich problemlos bei mir. 

Code-Quickie: Heizung mit Grafana visualisieren

Für eine schnelle Übersicht habe ich auch einige Plots in FHEM dazu erstellt.

Zuerst die Einbindung in FHEM:

define SVG_DbLog_KM271 SVG DbLog_KM271:SVG_DbLog_KM271:HISTORY
attr SVG_DbLog_KM271 fixedrange 30days
attr SVG_DbLog_KM271 label "Buderus Ölbrenner - Aktuelle Temps.: Aussentemp: $data{currval1}°C (min: $data{min1}°C / max: $data{max1}°C) / Kesseltemp Ist $data{currval2}°C / WWtemp Ist: $data{currval4}°C / HK2 Ist: $data{currval6}°C"
attr SVG_DbLog_KM271 plotsize 1900,480
attr SVG_DbLog_KM271 room KM271

define SVG_DbLog_UG.Heizraum.Buderus.Oelbrenner.Einschaltverhalten.HC.Statistik1 SVG DbLog_UG.Heizraum.Buderus.Oelbrenner.Einschaltverhalten.HC:SVG_DbLog_UG.Heizraum.Buderus.Oelbrenner.Einschaltverhalten.HC.Statistik.1:HISTORY
attr SVG_DbLog_UG.Heizraum.Buderus.Oelbrenner.Einschaltverhalten.HC.Statistik1 fixedrange 7days
attr SVG_DbLog_UG.Heizraum.Buderus.Oelbrenner.Einschaltverhalten.HC.Statistik1 label sprintf("Buderus Ölbrenner - Statistik1: Brenner-Starts heute: %0.0fx / Betriebsstunden heute: %0.1fh / Letzte Einschaltdauer: %0.1fh", $data{currval2},$data{currval3},$data{currval4})
attr SVG_DbLog_UG.Heizraum.Buderus.Oelbrenner.Einschaltverhalten.HC.Statistik1 plotsize 1900,480
attr SVG_DbLog_UG.Heizraum.Buderus.Oelbrenner.Einschaltverhalten.HC.Statistik1 room KM271

define SVG_DbLog_UG.Heizraum.Buderus.Oelbrenner.Einschaltverhalten.HC.Statistik2 SVG DbLog_UG.Heizraum.Buderus.Oelbrenner.Einschaltverhalten.HC:SVG_DbLog_UG.Heizraum.Buderus.Oelbrenner.Einschaltverhalten.HC.Statistik.2:HISTORY
attr SVG_DbLog_UG.Heizraum.Buderus.Oelbrenner.Einschaltverhalten.HC.Statistik2 fixedrange 90days
attr SVG_DbLog_UG.Heizraum.Buderus.Oelbrenner.Einschaltverhalten.HC.Statistik2 label "Buderus Ölbrenner - Statistik2"
attr SVG_DbLog_UG.Heizraum.Buderus.Oelbrenner.Einschaltverhalten.HC.Statistik2 plotsize 1900,480
attr SVG_DbLog_UG.Heizraum.Buderus.Oelbrenner.Einschaltverhalten.HC.Statistik2 room KM271

Gefolgt von den dazugehörigen gplot-Defintionen:

# Created by FHEM/98_SVG.pm, 2016-03-18
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 '<L1>'
set ytics
set y2tics
set grid ytics
set ylabel "Temperatur [°C]"
set y2label "Temperatur [°C]"
set yrange [-10:110]
set y2range [-10:90]

#DbLog_KM271 KM271:Aussentemperatur_gedaempft
#DbLog_KM271 KM271:Kessel_Vorlaufisttemperatur
#DbLog_KM271 KM271:Kessel_Vorlaufsolltemperatur
#DbLog_KM271 KM271:WW_Isttemperatur
#DbLog_KM271 KM271:WW_Solltemperatur
#DbLog_KM271 KM271:HK2_Vorlaufisttemperatur
#DbLog_KM271 KM271:HK2_Vorlaufsolltemperatur

plot "<IN>" using 1:2 axes x1y1 title 'Aussentemperatur [°C]' ls l1 lw 1 with steps,\
     "<IN>" using 1:2 axes x1y1 title 'Kesseltemperatur_Ist [°C]' ls l3 lw 1 with steps,\
     "<IN>" using 1:2 axes x1y1 title 'Kesseltemperatur_Soll [°C]' ls l4 lw 1 with steps,\
     "<IN>" using 1:2 axes x1y1 title 'Warmwassertemperatur_Ist [°C]' ls l5 lw 1 with steps,\
     "<IN>" using 1:2 axes x1y1 title 'Warmwassertemperatur_Soll [°C]' ls l6 lw 1 with steps,\
     "<IN>" using 1:2 axes x1y1 title 'Heizkreis2-Temperatur_Ist [°C]' ls l8 lw 1 with steps,\
     "<IN>" using 1:2 axes x1y1 title 'Heizkreis2-Temperatur_Soll [°C]' ls l7 lw 1 with steps
# Created by FHEM/98_SVG.pm, 2016-03-22
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 '<L1>'
set ytics "EIN" -5, "AUS" -19,"0" 0,"10" 10,"20" 20,"30" 30,"40" 40,"50" 50,"60" 60,"70" 70
set y2tics
set grid y2tics
set ylabel "Brenner-Starts [Anzahl] / Auslastung [%]"
set y2label "Betriebsstunden [h] / Einschaltdauer [h]"
set yrange [-20:80]
set y2range [-15:15]

#DbLog_UG.Heizraum.Buderus.Oelbrenner.Einschaltverhalten.HC UG.Heizraum.Buderus.Oelbrenner.Einschaltverhalten.HC:value:::$val=($val=~"1"?-5:-19)
#DbLog_UG.Heizraum.Buderus.Oelbrenner.Einschaltverhalten.HC UG.Heizraum.Buderus.Oelbrenner.Einschaltverhalten.HC:countsPerDay
#DbLog_UG.Heizraum.Buderus.Oelbrenner.Einschaltverhalten.HC UG.Heizraum.Buderus.Oelbrenner.Einschaltverhalten.HC:pulseTimePerDay:::$val=($val/3600)
#DbLog_UG.Heizraum.Buderus.Oelbrenner.Einschaltverhalten.HC UG.Heizraum.Buderus.Oelbrenner.Einschaltverhalten.HC:pulseTimeIncrement:::$val=($val/3600)
#DbLog_UG.Heizraum.Buderus.Oelbrenner.Einschaltverhalten.HC UG.Heizraum.Buderus.Oelbrenner.Einschaltverhalten.HC:appUtilizationTemp

plot "<IN>" using 1:2 axes x1y1 title 'Brenner [EIN/AUS]' ls l0 lw 1 with steps,\
     "<IN>" using 1:2 axes x1y1 title 'Brenner-Starts [Anzahl]' ls l1 lw 1 with steps,\
     "<IN>" using 1:2 axes x1y2 title 'Betriebsstunden [h]' ls l2 lw 1 with steps,\
     "<IN>" using 1:2 axes x1y2 title 'Letzte Einschaltdauer [h]' ls l3 lw 1 with fsteps,\
     "<IN>" using 1:2 axes x1y1 title 'Auslastung [%]' ls l4 lw 1 with lines
# Created by FHEM/98_SVG.pm, 2016-09-25
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 '<L1>'
set ytics
set y2tics
set grid ytics
set ylabel "Laufzeit [h] / Brenner-Starts [Anzahl]"
set y2label "Auslastung [%]"
set yrange [0:15]
set y2range [0:33]

#DbLog_UG.Heizraum.Buderus.Oelbrenner.Einschaltverhalten.HC UG.Heizraum.Buderus.Oelbrenner.Einschaltverhalten.HC:appOpHoursPerDay
#DbLog_UG.Heizraum.Buderus.Oelbrenner.Einschaltverhalten.HC UG.Heizraum.Buderus.Oelbrenner.Einschaltverhalten.HC:appCountsPerDay
#DbLog_UG.Heizraum.Buderus.Oelbrenner.Einschaltverhalten.HC UG.Heizraum.Buderus.Oelbrenner.Einschaltverhalten.HC:appUtilization

plot "<IN>" using 1:2 axes x1y1 title 'Laufzeit [h/Tag]' ls l0fill_stripe lw 1 with ibars,\
     "<IN>" using 1:2 axes x1y1 title 'Brenner-Starts [Anzahl/Tag]' ls l1 lw 2 with fsteps,\
     "<IN>" using 1:2 axes x1y2 title 'Auslastung [%/Tag] ' ls l2 lw 1 with fsteps

Das KM271-Modul überträgt unter anderem folgende interessante Werte zur späteren Visualisierung:

  • Betriebsart
  • Warmwassertemperatur über einen eigenen Sensor im Speicher.1 Ist/Soll
  • Kesseltemperatur Ist/Soll
  • Heizkreistemperatur Ist/Soll
  • Außentemperatur

Code-Quickie: Heizung mit Grafana visualisieren

Die Buderus Logamatic 2107 steuert desweiteren eine Pumpe für die Fußboden- und Dachschrägenheizung (Heizkreis2). Hier greife ich Vorlauf- und Rücklauftemperatur mittels KM271-Modul und 1-Wire-Sensoren ab. 

Offtopic, aber für alle Interessierten: Ich lasse mir eine Warnung zukommen falls das WarmWasser aus irgendeinem Grund mal kalt bleiben sollte:

define WW.bleibt.kalt.Info.pushover.not notify KM271:WW_Betriebswerte1.* {\
if (ReadingsVal("KM271","WW_Betriebswerte1","") eq "Fehler WW bleibt kalt")\
 {fhem ("set PushoverReinhardfhemheizung msg 'fhem-heizung Info' 'Fehler WW bleibt kalt' '' 0 ''")}}
attr WW.bleibt.kalt.Info.pushover.not room KM271

Atmos Holzvergaser

Als nächstes Element steht der Atmos DC 30 GSE Holzvergaser im Mittelpunkt. Ein Sahnestück an osteuropäischer Heiztechnik. Im Normalzustand robuste Technik aber leider ziemlich ineffizient.

Code-Quickie: Heizung mit Grafana visualisierenErweitert man die Fähigkeiten des Holzvergasers mit einer “Flammtronik” ergeben sich ganz neue Möglichkeiten der Steuerung, Datengewinnung und natürlich auch der Effizienz. 

Code-Quickie: Heizung mit Grafana visualisieren

Praktischersweise lässt sich die Flammtronik auch in FHEM inkl. diverser Plots einbinden. 

Code-Quickie: Heizung mit Grafana visualisieren

Zuerst wieder die Einbindung in FHEM:

define DbLog_Atmos_Holzvergaser DbLog ./contrib/dblog/db_extern.conf Atmos_Holzvergaser:(Abgas|Brennkammer|Kesseltemp|O2|Primaerluefter|Sekundaerluefter|Verlust|status|Pumpe|CAN_T1|CAN_T2|CAN_T3|CAN_T4).*
attr DbLog_Atmos_Holzvergaser asyncMode 1
attr DbLog_Atmos_Holzvergaser room FlammTronik
define SVG_DbLog_Atmos_Holzvergaser SVG DbLog_Atmos_Holzvergaser:SVG_DbLog_Atmos_Holzvergaser:HISTORY
attr SVG_DbLog_Atmos_Holzvergaser fixedrange 1days
attr SVG_DbLog_Atmos_Holzvergaser label sprintf("Atmos Holzvergaser - Aktuelle Werte: Abgas: %0.0f°C / Brennkammer: %0.0f°C / Kessel: %0.0f°C / Rest O2: %0.1f%%",$data{currval1},$data{currval2},$data{currval3},$data{currval4})
attr SVG_DbLog_Atmos_Holzvergaser plotsize 1900,800
attr SVG_DbLog_Atmos_Holzvergaser room FlammTronik

Gefolgt von der dazugehörigen gplot-Defintion:

# Created by FHEM/98_SVG.pm, 2016-12-09
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 '<L1>'
set ytics "EIN" -50, "AUS" -190,"0" 0,"100" 100,"200" 200,"300" 300,"400" 400,"500" 500,"600" 600,"700" 700,"800" 800,"900" 900
set y2tics
set grid
set ylabel "Temperatur [°C]"
set y2label "Rest O2, Primärluft, Sekundärluft [%]"
set y2range [0:100]

#DbLog_Atmos_Holzvergaser Atmos_Holzvergaser:Abgas
#DbLog_Atmos_Holzvergaser Atmos_Holzvergaser:Brennkammer
#DbLog_Atmos_Holzvergaser Atmos_Holzvergaser:Kesseltemp
#DbLog_Atmos_Holzvergaser Atmos_Holzvergaser:O2
#DbLog_Atmos_Holzvergaser Atmos_Holzvergaser:Primaerluefter
#DbLog_Atmos_Holzvergaser Atmos_Holzvergaser:Sekundaerluefter
#DbLog_Atmos_Holzvergaser Atmos_Holzvergaser:Pumpe:::$val=($val=~"1"?-50:-190)

plot "<IN>" using 1:2 axes x1y1 title 'Abgastemperatur [°C]' ls l0 lw 1 with lines,\
     "<IN>" using 1:2 axes x1y1 title 'Brennerkammertemperatur [°C]' ls l1 lw 1 with lines,\
     "<IN>" using 1:2 axes x1y1 title 'Kesseltemperatur [°C]' ls l2fill lw 2 with lines,\
     "<IN>" using 1:2 axes x1y2 title 'Rest O2 [%]' ls l7 lw 1 with lines,\
     "<IN>" using 1:2 axes x1y2 title 'Primärluft [%]' ls l3fill lw 0.2 with steps,\
     "<IN>" using 1:2 axes x1y2 title 'Sekundärluft [%]' ls l5fill lw 0.2 with steps,\
     "<IN>" using 1:2 axes x1y1 title 'Pumpe [EIN/AUS]' ls l4 lw 1 with steps,

 

Zu beachten ist, das die Flammtronik nur Werte liefern kann. Ein Einstellen ist nur an der Flammtronik selbst möglich. Absolut in Ordnung, da einmal richtig eingestellt nichts mehr an der Flammtronik gemacht werden muss. 

Die Flammtronik ist ebenfalls ein wichtiger Datenlieferant für die spätere Visualisierung mit Grafana.

Was wird gesteuert und welche Sensoren werden ausgelesen:

Die beiden Belimo Stellantriebe zur Steuerung der Primär- und Sekundärluft:

Code-Quickie: Heizung mit Grafana visualisieren

Der Lüfter inkl. Flammtronik-Drehzahlmodul:

Code-Quickie: Heizung mit Grafana visualisieren Code-Quickie: Heizung mit Grafana visualisieren

Restsauerstoff (RestO2) mit einem Lamdasensor (aus dem KFZ-Bereich):

Code-Quickie: Heizung mit Grafana visualisieren

Abgastemperatur mit einem PT1000-Sensor:

Code-Quickie: Heizung mit Grafana visualisieren

Kesseltemperatur mit einem PT1000-Sensor:

Code-Quickie: Heizung mit Grafana visualisieren

Brennkammertemperatur mit einem Thermoelement Typ K (NiCr/Ni – bis 1200°C):

Code-Quickie: Heizung mit Grafana visualisieren

Laddomat-Temperaturen mit 3x PT1000-Sensoren:

Code-Quickie: Heizung mit Grafana visualisieren

 

Eine textbasierte Visualiserung habe ich mit einem Witty-Board (ESP8266, ESPEasy) und einem 2004 LC-Display realisiert. Damit ich nicht immer auf das Handy oder auf den Bildschirm schauen muss, um die wichtigsten Holzvergaserwerte außerhalb des Heizraums ablesen zu können. Das Display wird später per Akku betrieben und mobil sein.

Code-Quickie: Heizung mit Grafana visualisieren

Sehr günstig und mit ein paar Zeilen Code in FHEM eingefügt:

#########################################################################
## Atmos Holzvergaser InfoDisplay
#########################################################################
define Atmos_Holzvergaser.Info.Display.cD cloneDummy Atmos_Holzvergaser
attr Atmos_Holzvergaser.Info.Display.cD room InfoDisplay
attr Atmos_Holzvergaser.Info.Display.cD event-on-change-reading Abgas,Brennkammer,Kesseltemp,O2
attr Atmos_Holzvergaser.Info.Display.cD suppressReading (Ra|Rt|Ruecknahme|Sponta|state2|status|Primaerluefter|Pumpe|Sekundaerluefter|Verlust|CAN_T1|CAN_T2|CAN_T3|CAN_T4|Sponta).*

define Atmos.HV.Info.Display.ESP.Zeile.1.doif DOIF ([Atmos_Holzvergaser.Info.Display.cD:Abgas]) ({my $value = sprintf "%0.fC", ReadingsVal("Atmos_Holzvergaser.Info.Display.cD","Abgas",0) ;; system("wget -q -O- 'http://192.168.178.108/control?cmd=lcd,1,1,Abgastemp       $value'")})
attr Atmos.HV.Info.Display.ESP.Zeile.1.doif do always
attr Atmos.HV.Info.Display.ESP.Zeile.1.doif room InfoDisplay
attr Atmos.HV.Info.Display.ESP.Zeile.1.doif verbose 0
define Atmos.HV.Info.Display.ESP.Zeile.2.doif DOIF ([Atmos_Holzvergaser.Info.Display.cD:Brennkammer]) ({my $value = sprintf "%0.fC", ReadingsVal("Atmos_Holzvergaser.Info.Display.cD","Brennkammer",0) ;; system("wget -q -O- 'http://192.168.178.108/control?cmd=lcd,2,1,Brennkammertemp $value'")})
attr Atmos.HV.Info.Display.ESP.Zeile.2.doif do always
attr Atmos.HV.Info.Display.ESP.Zeile.2.doif room InfoDisplay
attr Atmos.HV.Info.Display.ESP.Zeile.2.doif verbose 0
define Atmos.HV.Info.Display.ESP.Zeile.3.doif DOIF ([Atmos_Holzvergaser.Info.Display.cD:Kesseltemp]) ({my $value = sprintf "%0.fC", ReadingsVal("Atmos_Holzvergaser.Info.Display.cD","Kesseltemp",0) ;; system("wget -q -O- 'http://192.168.178.108/control?cmd=lcd,3,1,Kesseltemp      $value'")})
attr Atmos.HV.Info.Display.ESP.Zeile.3.doif do always
attr Atmos.HV.Info.Display.ESP.Zeile.3.doif room InfoDisplay
attr Atmos.HV.Info.Display.ESP.Zeile.3.doif verbose 0
define Atmos.HV.Info.Display.ESP.Zeile.4.doif DOIF ([Atmos_Holzvergaser.Info.Display.cD:O2]) ({my $value = sprintf "%0.1f%%", ReadingsVal("Atmos_Holzvergaser.Info.Display.cD","O2",0) ;; system("wget -q -O- 'http://192.168.178.108/control?cmd=lcd,4,1,Rest O2        $value'")})
attr Atmos.HV.Info.Display.ESP.Zeile.4.doif do always
attr Atmos.HV.Info.Display.ESP.Zeile.4.doif room InfoDisplay
attr Atmos.HV.Info.Display.ESP.Zeile.4.doif verbose 0

Die IP-Adressen bitte durch eigene ersetzen.

Noch ein Hinweis zum Display: Nach Ausführung des Codes neigt FHEM bzw. das Linux-System dazu zu blockieren, inbesondere wenn das Display ausgeschaltet ist. Mögliche Lösung: Bei mir läuft ein eigenes FHEM isoliert in einem Docker-Container extra für dieses Display. Da stören solche Blockaden dann nicht weiter. Sollte jemand eine bessere Lösung haben, bitte in jeden Fall in den Kommentaren eintragen. 

Ein bisschen Offtopic aber ich möchte es hier trotzdem erwähnen: Die Daten der Flammtronik können auch für verschiedene Aktionen verwendet werden. So war es ohne die Flammtronik z.B. nicht möglich den perfekten Zeitpunkt zum Holz nachlegen zu finden. Man konnte ihn zwar mittels analoger Abgastemperaturanzeige erahnen, aber dazu musste man auch in den Heizraum gehen um ihn dort ablesen zu können. Allzu gerne habe ich diesen Zeitpunkt verpasst und das Feuer war dann leider schon aus.

Mittlerweile lasse ich mir eine Nachlegewarnung mittels pushover auf mein Handy schicken – RestO2-gesteuert. 

define Atmos_Holzvergaser.cD.Nachlegewarnung.pushover.doif DOIF ([Atmos_Holzvergaser.cD:O2] > 10 and [Atmos_Holzvergaser.cD:O2] <= 10.2 and [06:00-22:00] and [Atmos_Holzvergaser.cD:Kesseltemp] >= 75 and [Anwesenheit.Reinhard] eq "on") ({my $O2 = sprintf "%.1f %%", ReadingsVal("Atmos_Holzvergaser.cD","O2",0) ;;;; fhem ("set PushoverReinhardFHEMMain msg 'fhem-main Alarm' 'Nachlegewarnung: O2 ist bei $O2' '' 1 ''")})
attr Atmos_Holzvergaser.cD.Nachlegewarnung.pushover.doif repeatcmd 300
attr Atmos_Holzvergaser.cD.Nachlegewarnung.pushover.doif room Heizung

Noch ein bisschen mehr Offtopic: Ich lasse mir auch einen Hinweis meiner Heizung geben, wann ich mit dem Feuer machen im Holzvergaser starten sollte, damit das Wasser im Speicher nicht zu kalt wird und die Ölheizung unnötig anspringen muss.

define Atmos_Holzvergaser.starten.pushover.doif DOIF ([UG.Heizraum.Speicher.1.Tempsensor.2:temperature] < 61 and [KM271:Aussentemperatur_gedaempft] < 15) ({my $temp1 = sprintf "%.1f °C", ReadingsVal("UG.Heizraum.Speicher.1.Tempsensor.1","temperature",0) ;;;; my $temp2 = sprintf "%.1f °C", ReadingsVal("UG.Heizraum.Speicher.1.Tempsensor.2","temperature",0) ;;;; my $temp3 = sprintf "%.1f °C", ReadingsVal("UG.Heizraum.Speicher.1.Tempsensor.3","temperature",0) ;;;; my $temp4 = sprintf "%.1f °C", ReadingsVal("UG.Heizraum.Speicher.1.Tempsensor.4","temperature",0) ;;;; fhem ("set PushoverReinhardfhemheizung msg 'fhem-heizung Info' 'Holzvergaser jetzt starten : UG.Heizraum.Speicher.1.Tempsensor.1 ist bei $temp1<br> UG.Heizraum.Speicher.1.Tempsensor.2 ist bei $temp2<br>UG.Heizraum.Speicher.1.Tempsensor.3 ist bei $temp3 <br>UG.Heizraum.Speicher.1.Tempsensor.4 ist bei $temp4' '' 0 ''")}) DOELSE
attr Atmos_Holzvergaser.starten.pushover.doif repeatcmd 1200
attr Atmos_Holzvergaser.starten.pushover.doif repeatsame 5
attr Atmos_Holzvergaser.starten.pushover.doif room FlammTronik

Code-Quickie: Heizung mit Grafana visualisieren

Solar

Die Solarsteuerung findet hauptsächlich über den Solar-Speicherregler PS 5511 SZ statt.

Code-Quickie: Heizung mit Grafana visualisieren

Der Regler hat eine EBus-Anbindung, die ich leider, auch wegen schlechter Dokumentation, nicht zum laufen gebracht habe. Ich hätte gerne z.B. die Kollektortemperatur ausgelesen und in FHEM integriert. Wer mir hier vielleicht Tipp hat, sollte sich bitte über die Kommentarfunktion bei mir melden. 

Die Temperaturen in der Solarpumpeneinheit lese ich über günstige 1-wire Temperatursensoren aus.

Code-Quickie: Heizung mit Grafana visualisieren

1-wire

Wie man bisher vielleicht erkennen kann, verwende ich einige Sensoren die über einen 1-wire-Bus angebunden sind.

Zusätzlich zu den oben beschrieben Sensoren verwende ich noch 10x weitere in meinen beiden 1000L Speichern.

Code-Quickie: Heizung mit Grafana visualisieren

Desweitern befinden sich 2x 1-wire-Sensoren an einem WarmWasser-Pumpenkreislauf – einer im Heizraum und einer im Holzlagerraum.

Code-Quickie: Heizung mit Grafana visualisieren

Für die Verabelung verwende ich, wo möglich, normale Brandmeldekabel. Die einzelnen Käbelchen bestehen aus festen Drähten, was von Vorteil ist, denn man benötigt keine Adernhülsen mehr. Das Kabel enthält ebenso eine Abschirmung. 

20m Brandmeldekabel Profi-Line 2x2x0,8mm² rot*
Verschiedene Kabel Hersteller aus der EU
12,99 EUR

VOC-Mischgas- und PM-Sensor

VOC-Mischgas-Sensor

Im Heizraum herrscht durch die Ölheizung, Öltanks und Holzvergaser ziemlich dicke Luft. Ich möchte mich hier immer nur so kurz wie möglich aufhalten.

Deswegen ist bei mir im Heizraum ein VOC-Mischgas-Sensor neu hinzugekommen. 

Code-Quickie: Heizung mit Grafana visualisieren

Vorab vielen Dank an Tobias Müller für die Entwicklung des 1-wire VOC-Moduls und das gute Feedbacks zu meinen Fragen. Kaufen könnt Ihr das VOC-Modul hier https://www.tm3d.de

Ein VOC-Sensor wird zur Bestimmung der Luftgüte verwendet. Der VOC-Sensor reagiert dabei auf verschiedene schlechte Stoffe in der Luft und verändert so seinen Widerstand je nach Belastung, der wiederum gemessen werden kann. Der Messwert korreliert dabei ziemlich gut mit dem CO2-Wert, weswegen ich ihn auch dafür nun einsetze.

Daneben besitzt das gezeigte Modul einen Temperatur- und Feuchtesensor, welche ich für die Messungen im Heizraum verwende.

Code-Quickie: Heizung mit Grafana visualisieren

Meine eigentliche Idee war den VOC-Sensor als CO-Sensor (Kohlenmonoxid) zu verwenden. Der VOC-Sensor reagiert stark auf CO, aber es lässt sich keine gute Korrelation zwischen Sensormesswert und CO herstellen, was mir dann doch zu ungenau bzw. unsicher ist. In Zukunft plane ich dennoch eine direkte Messung des CO-Wertes mit einem anderen Sensor.

Die FHEM-Integration inkl. InfluxDB-Anbindung sieht dabei wie folgt aus:

define UG.Heizraum.VOC.Sensor OWTHERM DS18B20 XXXXXXXXXXXXXXXXX
attr UG.Heizraum.VOC.Sensor IODev OneWire
attr UG.Heizraum.VOC.Sensor event-min-interval VOC:3600,CO2:3600
attr UG.Heizraum.VOC.Sensor event-on-change-reading VOC: 1,CO2: 1
attr UG.Heizraum.VOC.Sensor interval 120
attr UG.Heizraum.VOC.Sensor model DS18B20
attr UG.Heizraum.VOC.Sensor room OWX
attr UG.Heizraum.VOC.Sensor userReadings VOC {ReadingsNum("UG.Heizraum.VOC.Sensor","temperature",0)*2}, CO2 {ReadingsNum("UG.Heizraum.VOC.Sensor","VOC",0)*75+400}
define InfluxDBLog_UG.Heizraum.VOC.Sensor InfluxDBLog 192.168.178.143 8186 fhem_environment dbuser passwort UG.Heizraum.VOC.Sensor:.*
attr InfluxDBLog_UG.Heizraum.VOC.Sensor group InfluxDBLog
attr InfluxDBLog_UG.Heizraum.VOC.Sensor room OWX

Der VOC-Sensor gibt sich erst einmal als normaler DS18B20 Temperatursensor aus. Den Ausgabewert muss man mit 2 multiplizieren um den eigentlichen VOC-Wert zu bekommen. Dies erledigt man am besten über die “userReadings”. Um einen ungefähren CO2-Wert in ppm zu bekommen muss man den VOC-Wert mit dem Faktor 75 (Die Wahrheit liegt irgendwo zwischen dem Faktor 50 und 100) multiplizieren und 400 dazu addieren.

PM-Sensor

Aus Spaß und inspiriert durch das “luftdaten.info – Feinstaub selber messen”-Projekt werde ich noch einen PM-Sensor in den Heizraum und in die Visualisierung mit Grafana einbauen. 

Code-Quickie: Heizung mit Grafana visualisieren Code-Quickie: Heizung mit Grafana visualisieren

Bis jetzt liegt der Sensor nur auf meinem Schreibtisch und misst dort, aber wenn es soweit ist und ich mit dem Einbau in den Heizraum starte werde ich den Blogbeitrag aktualisieren. Ich bin gespannt, was der Holzvergaser so für Feinstaubmengen im Heizraum erzeugt.
Code-Quickie: Heizung mit Grafana visualisieren

Code-Quickie: Heizung mit Grafana visualisieren

Die FHEM-Integration inkl. InfluxDB-Anbindung sieht dabei wie folgt aus:

#########################################################################
## PM-Sensor/LuftdatenInfo
#########################################################################
define Heizraum.PM.Sensor.1 LuftdatenInfo local 192.168.178.38
attr Heizraum.PM.Sensor.1 event-on-change-reading PM10,PM2.5
attr Heizraum.PM.Sensor.1 group Heizraum.PM.Sensor.1
attr Heizraum.PM.Sensor.1 room PM-Sensor
define InfluxDBLog_Heizraum.PM.Sensor.1 InfluxDBLog 192.168.178.143 8186 fhem_environment dbuser passwort Heizraum.PM.Sensor.1:.*
attr InfluxDBLog_Heizraum.PM.Sensor.1 group InfluxDBLog
attr InfluxDBLog_Heizraum.PM.Sensor.1 room PM-Sensor

Wie üblich vorher ein Update von FHEM machen um das “LuftdatenInfo”-Modul zu laden und die IP-Adressen, User, Datenbanknamen, Passwörter durch die eigenen Werte ersetzen.

Das Display

Als Display verwende ich ein älteren Dell U2410, den ich sonst nicht mehr in Verwendung hatte. Das Display hat ein matte Displayoberfläche und ist kalbriert was man auch nicht alle Tage in einem Heizraum findet  :mrgreen: 

Prinzipell kann jedes Display verwendet werden, aber es sollte sich an einen RaspberryPi anschließen lassen. 

Ich verwende eine recht einfache Monitorhalterung ohne viel Schnickschnack für kleines Geld.

Code-Quickie: Heizung mit Grafana visualisieren

Zum Einschalten verwende ich einen Jung Aufputztaster. Die Wippe habe ich von einem Aufputzschalter genommen.

Angebot
Angebot
Jung 631W Taster Schlieáer, 1-polig*
Jung - Werkzeug
9,12 EUR

Der Taster schaltet einen Homematic-Aktor, an den das Display und der RaspberryPi angeschlossen sind.

Der FHEM-Code dazu sieht wie folgt aus:

#########################################################################
## Disyplayanzeige + RaspberryPi Aktor
#########################################################################
define UG.Heizraum.Infodisplay.Aktor CUL_HM XXXXXX
attr UG.Heizraum.Infodisplay.Aktor IODev HomematicLANGateway2
attr UG.Heizraum.Infodisplay.Aktor IOgrp VCCU:HomematicLANGateway2
attr UG.Heizraum.Infodisplay.Aktor autoReadReg 4_reqStatus
attr UG.Heizraum.Infodisplay.Aktor devStateIcon on:general_an@orange off:general_aus@blue
attr UG.Heizraum.Infodisplay.Aktor event-on-change-reading .*
attr UG.Heizraum.Infodisplay.Aktor expert 2_raw
attr UG.Heizraum.Infodisplay.Aktor firmware 2.5
attr UG.Heizraum.Infodisplay.Aktor group UG.Heizraum
attr UG.Heizraum.Infodisplay.Aktor icon it_television
attr UG.Heizraum.Infodisplay.Aktor model HM-LC-SW1-FM
attr UG.Heizraum.Infodisplay.Aktor peerIDs 00000000,
attr UG.Heizraum.Infodisplay.Aktor room Heizung
attr UG.Heizraum.Infodisplay.Aktor serialNr XXXXXXXXXXXX
attr UG.Heizraum.Infodisplay.Aktor subType switch
attr UG.Heizraum.Infodisplay.Aktor webCmd :

define UG.Heizraum.Displayanzeige.Aktor.watchdog watchdog UG.Heizraum.Displayanzeige.Aktor:on 00:30:00 UG.Heizraum.Displayanzeige.Aktor:off set PushoverReinhardFHEMMain msg 'fhem-main Info' 'UG.Heizraum.Displayanzeige wurde angelassen' '' 0 '';; setstate UG.Heizraum.Displayanzeige.Aktor.watchdog defined
attr UG.Heizraum.Displayanzeige.Aktor.watchdog room Heizung

define UG.Heizraum.Displayanzeige.Aktor.AutoAus.DOIF DOIF ([02:00]) (set UG.Heizraum.Infodisplay.Aktor off)
attr UG.Heizraum.Displayanzeige.Aktor.AutoAus.DOIF do always
attr UG.Heizraum.Displayanzeige.Aktor.AutoAus.DOIF room Heizung

Oben Zuerst die übliche Definition des Aktors in FHEM.

Danach einen watchdog der mich nach 30 Minuten darauf hinweist, das das Display noch an ist. 

Zuletzt ein DOIF, welches das Display um 2 Uhr nachts abschaltet, sollte es doch mal aus Versehen an bleiben.

Der RaspberryPi im Kiosk-Modus

Die spätere Visualisierung mit Grafana wird in der Regel über einen Webbrowser aufgerufen wofür ein Rechner benötigt wird. Für mein Display verwende ich dafür, wie soll es auch anders sein, einen RaspberryPi3.

Der RaspberryPi3 ist bei mir etwas schwer erreichbar hinter dem Display professionell mit Heißkleber platziert. Aus diesem Grund verwende ich ein microSD-Extender Flex-Kabel mit der Besonderheit das ich hier normale SD-Karten verwenden kann. 

Code-Quickie: Heizung mit Grafana visualisieren

Da der RaspberryPi stets manuell (über den Jung-Taster) gebootet werden muss und das möglichst schnell, verwende ich hier eine 16GB Sandisk Extreme Pro (refurbished) SD-Karte, die man aber kaum noch bekommt. 32GB sind mittlerweile Standard, welche selbstverständlich auch funktionieren. 

Code-Quickie: Heizung mit Grafana visualisieren

Als Netzteil kommt wieder ein 5V Hutschienennetzteil von Meanwell zum Einsatz.

Auf die SD-Karte wird dann das ganz normale Raspbian Stretch mit Desktop installiert inkl. aktiviertem SSH und eingerichtetem WLAN.

Damit nachher der RaspberryPi3 direkt in den Fullscreen Browser (Kiosk-Modus) bootet, müssen dazu noch einige Schritte in der Kommandozeile durchgeführt werden. 

Wer mag, kann zuerst das Passwort des Benutzers “pi” wie folgt ändern:

passwd

Danach am besten das System auf den neuesten Stand bringen:

sudo apt-get -y autoremove && sudo apt-get -y clean && sudo apt-get update && sudo apt-get -y dist-upgrade

Danach müssen noch einige Abhängigkeiten installiert werden:

sudo apt-get install -y chromium-browser ttf-mscorefonts-installer unclutter x11-xserver-utils
  • chromium-browser installiert den Googls Chrome Browser
  • ttf-mscorefonts-installer Fügt ein paar allgemeine Schriftarten hinzu
  • unclutter versteckt den Mauszeiger
  • x11-xserver-utils Deaktiviert das Ausschalten des Displays

Jetzt muss noch das Desktop-Autostartscript und Google Chrome konfiguriert werden:

sudo nano .config/lxsession/LXDE-pi/autostart

Es erscheint der Inhalt der Konfigurationsdatei, welche ungefähr so aussehen müsste:

@lxpanel --profile LXDE-pi
@pcmanfm --desktop --profile LXDE-pi
# @xscreensaver -no-splash
@point-rpi

Nach der letzten Zeile muss man folgenden Inhalt einfügen:

@/usr/bin/chromium-browser --incognito --start-maximized --kiosk http://192.168.178.143:3000/dashboard/db/heizung?refresh=10s&orgId=1
@unclutter
@xset s off
@xset s noblank
@xset -dpms

Die meisten Parameter sprechen für sich selbst:

  • --incognito Inkognitomodus für Chrome um Warnungen zu unterdrücken
  • --start-maximized Chrome startet maximiert
  • --kiosk Chrome startet ohne Navigationsleiste
  • @unclutter Versteckt den Mauszeiger
  • @xset s off Schaltet den Bildschirmschoner ab
  • @xset s noblank Deaktiviert das Ausschalten des Displays
  • @xset -dpms Deaktiviert das Display Power Management Signaling (DPMS)

Weitere nützliche Parameter bei Bedarf:

  • --allow-running-insecure-content Erlaubt https Seiten http Inhalte anzuzeigen
  • --remember-cert-error-decisions Erlaubt Chrome Zertifikate zu speichern

IP-Adresse und Link zum eigenen Dashboard müssen noch angepasst werden.

An den Link zum Dashboard gelangt man in Grafana so:

Code-Quickie: Heizung mit Grafana visualisieren

Wichtiger Shortcut: möchte man aus dem Fullscreen-Modus heraus, kann man dies mit folgender Tastenkombination machen: Umschalttaste+Strg+Q

Nach einem Neustart sollte das System nun direkt in den Fullscreen Browser mit Grafana booten.Code-Quickie: Heizung mit Grafana visualisieren

 

An diesem Punkt angelangt, kann der Stand der SD-Karte eingefroren werden, da man ab jetzt keine Daten mehr im System anpassen muss. Das Einfrieren hat auch den Vorteil, das bei einem direkten Ausschalten ohne sauberes Herunterfahren das Dateisystem nicht beschädigt wird.

Früher konnte man bei der SD-Karte über den seitlichen Schiebeschalter den Schreibschutz aktivieren. Der RaspberryPi ignoriert diesen Schalter leider komplett und so kann, egal in welcher Position der Schalter sich befindet, munter auf die SD-Karte geschrieben werden. 

Eine andere Lösung musste her. 

Wenig dokumentiert ist, das SD-Karten ein elektronisches Schreibschutzsystem besitzen. 

Mit einem kleinen Tool kann dieser Schreibschutz aktiviert werden.

Zuerst muss man in der Konsole das Tool installieren:

wget "https://github.com/BertoldVdb/sdtool/blob/master/static/arm-sdtool?raw=true" -O arm-sdtool

Dann die Schreib-/Leserechte anpassen:

chmod +x arm-sdtool

Jetzt kann man schon den Schreibschutz der SD-Karte aktivieren:

sudo ./arm-sdtool /dev/mmcblk0 lock

Folgende Kommandos sind möglich

  • status Zeigt die aktuellen Schreibschutzeinstellungen
  • unlock Deaktiviert den Schreibschutz
  • lock Aktiviert den Schreibschutz
  • permlock Aktiviert den Schreibschutz für immer – Vorsicht!
  • reset Sendet ein “go_idle_state”-Kommando um eine abgeschmierte Karte ohne aus- und wiedereinschalten des RaspberryPis wieder ins System zu bekommen

Die Steuerung

Gesteuert wird der RaspberryPi bzw. Grafana nur bei Bedarf. Falls dies der Fall ist, verwende ich dafür eine Logitech K400 Plus Tastatur.

Code-Quickie: Heizung mit Grafana visualisieren

Diese hat den Vorteil das man sie bei Nichtverwendung Ausschalten kann. Desweiteren hat sie links oben eine Taste für den (Maus-)Linksklick – sehr praktisch bei Zweihandbedienung im Stehen auch wenn man sich als Rechtshänder kurz an das Klicken mit der linken Hand gewöhnen muss.

Geschützt, vor allem vor dem Staub im Heizraum, wird sie durch eine Schutzhülle. 

Code-Quickie: Heizung mit Grafana visualisieren

Visualisierung mit Grafana

Nach dem installieren der Geräte, Schnitstellen, Module, Sensoren usw. und dem Sammeln der Daten in der InfluxDB kann mit der Visualisierung von selbigen in Grafana begonnen werden. Das schöne an Grafana ist, das man seine Plots schön anordnen, hin- und herschieben und kopieren kann, sodass man zügig seine Dashboards zusammen gestelltt bekommt.

Meine aktuelle Visualisierung für den Heizraum sieht wie folgt aus:

Code-Quickie: Heizung mit Grafana visualisieren

Download des JSON-Codes:

Download “JSON-File Heizung” – 0-mal heruntergeladen –

Links oben der Bereich für dem Atmos Holzvergaser, recht oben für die Buderus Heizung. Unten die Speicher – und Solartemperaturen sowie weitere Messwerte aus dem Heizraum. PM-Sensor ist bereits integriert liefert aber noch nicht die korrekten Werte, er sich noch im Büro befindet. 

In meiner Temperatur- und Luftfeuchteansicht, welche ich bereits in anderen Beiträgen gezeigt habe, befinden sich auch einige Werte der Heizung:

Code-Quickie: Heizung mit Grafana visualisieren

Download des JSON-Codes:

Download “JSON-File Temperaturen und Luftfeuchtigkeit” – 0-mal heruntergeladen –

Hier noch ein Screenshot mit laufendem Holzvergaser:

Code-Quickie: Heizung mit Grafana visualisieren

Schön ist das die singlestats auch plots anzeigen. Auch die Farbgebung, je nach Zustand oder Temperatur macht optisch etwas her.

Meine Standardeinstellung für die Heizung zur Anzeige der Plots sind 6h mit 10Sekunden Updatezyklus:

Code-Quickie: Heizung mit Grafana visualisieren

ausgenommen individuelle Zeiteinstellungen:

Code-Quickie: Heizung mit Grafana visualisieren

Einzelne Plots können auch zur Vollansicht vergrößert werden:

Code-Quickie: Heizung mit Grafana visualisieren

Code-Quickie: Heizung mit Grafana visualisieren

In den Plots kann auch ein Zeitbereich ausgewälht werden, in den dann sozusagen hineingezommt wird:

Code-Quickie: Heizung mit Grafana visualisieren

Import

Ganze Dashboards lassen sich über “Dashboars->Import” importieren:

Code-Quickie: Heizung mit Grafana visualisieren

Hier kann dann ein JSON-File direkt per Datei (siehe Downloads oben) oder in Textform geladen werden.

Code-Quickie: Heizung mit Grafana visualisieren

Meine oben verlinkten JSON-Files können so importiert und dann an die eigenen Datenbanken, Sources, Namen usw. angepasst werden.

 

Reinhard

Autor von frombeyond.de. Smart-Home-Verrückter.

Nutzt Zuhause FHEM zusammen mit HomeMatic, JeeLink, 1-Wire, Flammtronik / Atmos HV, Buderus KM271, Philips HUE, Xiaomi Yeelight, Alexa, Sonos, FritzBox, Ubiquiti UniFi APs, APC UPS, APC PDU, IPMI. MariaDB, InfluxDB und Grafana zur Auswertung. Als Hardware-Untersatz kommen mehrere RaspberryPis und Supermicro Serverhardware zum Einsatz. Softwareseitig werden hauptsächlich Raspbian, Ubuntu, ESXi und Docker verwendet.

*Diese Links führen zu Amazon- oder anderen Online-Angeboten, keine Verfügbarkeitsgarantie, keine Garantie auf günstigsten Preis, Preise können variieren, Preise inkl. MwSt. / evtl. zzgl. Versandkosten, alle Angaben ohne Gewähr. Letzte Aktualisierung am 23.11.2017