Zum Inhalt springen

Ökofen Monitoring

aus www.kruedewagen.de, Homepage von Ralf und Judith Krüdewagen (Kruedewagen)
(Weitergeleitet von Ökofen Pelletheizung)

Diese Seite befasst sich mit einer zentralen Pelletheizung des Herstellers Ökofen. Besonderes Augenmerk lege ich auf das Monitoring wichtiger Betriebsdaten der Heizanlage.

Diese Dokumentation ist begleitend zum Sourcecode des Softwareprojekts.

Dashboard mit Kennzahlen in InfluxDB


Ökofen Pellematic

Wichtige Komponenten der Ökofen Pellematic Condens Heizanlage sind:

  • Pelletkessel
  • Pelletsilo
  • Pufferspeicher
  • Pumpen für Warmwasser und Heizung
  • Externer Temperaturfühler

Die Bedienung und Einstellung der Heizanlage geschieht entweder über das Touch-Bedienteil am Gerät oder die Ökofen App. Bestimmte Einstellungen sind nur über das Bedienteil am Gerät möglich, wobei für Bedienteil und App oft die sog. Codeebene nötig ist, um besonders "geschützte" Einstellungen vornehmen zu können (wie z.B. die Leistungsstufe des Kessels oder den Offset für den externen Temperaturfühler).

Software Version

Die hier vorgestellten Scripte und Parameter basieren auf der Praxis mit der Pellematic Software (Bedienteil) "Touch V4.02a_P".

Wichtige Einstellungen und Kennwerte

  • Leistungsstufe des Pellematic Condens Z12 Zero Flame Kessels (über das Bedienteil auf Codeebene einzustellen: 12 [kWh] -> Wichtig für die Berechnungen zum Verbrauch
  • Raumtemperatur Heizen: z.B. 21°C
  • Heizkurve: z.B. Heizkurve/Kennlinienneigung 1,2 ; Fußpunkt 30°C ; Heizgrenze Heizen: 18°C ; Heizgrenze Absenken: 10°C ; Vorhaltezeit: 90min

Temperaturen und Brennwert

Folgende Tabelle zeigt expemplarisch Vorlauftemperaturen abhängig vom Sollwert der Raumtemperatur und der Außentemperatur (Quelle: Gemini):

Vorlauftemperaturen
Außentemperatur Vorlauf bei 20 °C Soll Vorlauf bei 21 °C Soll Vorlauf bei 22 °C Soll (ca.)
+10 °C (milder Herbst/Frühling) ca. 33 °C ca. 34,2 °C ca. 35,4 °C
0 °C (Gefrierpunkt) ca. 45 °C ca. 46,2 °C ca. 47,4 °C
-10 °C (knackiger Frost) ca. 57 °C ca. 58,2 °C ca. 59,4 °C

Anmerkungen dazu (Quelle: Gemini):

  • Jedes zusätzliche Grad Raum-Soll erhöht die Vorlauftemperatur bei Kennlinien-Neigung von 1,2 um 2,2 °C (1+1,2)
  • Für einen Pellematic Condens bedeutet eine höhere Vorlauftemperatur auch eine höhere Rücklauftemperatur. Bleibt der Rücklauf unter ca. 45–50 °C, nutzt der Kessel die Abgaskondensation (Brennwerteffekt) noch voll aus. Bei -10 °C Außen und 22 °C Raumtemperatur-Soll gerät der Kessel langsam an den oberen Rand des optimalen Brennwertfensters (da die Rücklauftemperatur irgendwann zu hoch ist).

In meinem Beispiel bei 8°C Außentemperatur stieg der Vorlauftemperatur-Sollwert von 40,3°C auf 42,5°C, nachdem ich den Sollwert von "Raumtemperatur Heizen" von 21°C auf 22°C erhöht hatte.

Monitoring zur Datenanalyse

Konzept

Beim Monitoring geht es darum, aus aktuellen Kennzahlen der Heizanlage, die man periodisch über eine Schnittstelle bezieht, historische Daten als Zeitreihen zu speichern. So kann man den zeitlichen Verlauf der Kennzahlen einsehen und darauf basierend Berechnungen vornehmen. Optimierungen an der Anlage können vorgenommen und deren Auswirkungen überprüft werden.

Inspiriert wurde ich durch das Projekt "Ökofen Spy", welches ich verfeinert und an meine Bedürfnisse angepasst habe. Außerdem verwende ich aktuell nicht Grafana zur Visualisierung und Berechnung von Kennwerten, sondern nutze die Möglichkeiten der eh verwendeten InfluxDB v2 Datenbank, die im Gegensatz zu Version 1, die in "Ökofen Spy" verwendet wird, ein Dashboard mitbringt.

Das Monitoring basiert auf:

  • Linux Mini-PC/Server mit openSUSE Tumbleweed
  • InfluxDB v2 (Zeitreihendatenbank)
  • JSON Schnittstelle der Ökofen Heizanlage
  • Script zum Datensammeln aus Ökofen Spy, angepasst an InfluxDB v2 und mit Fehlerkorrektur für JSON-Syntax der V4.02 Software von Ökofen
  • Cronjob zum Ausführen der Datensammlung (z.B. alle 4 min)
  • Dashboard mit Grafiken und Berechnungen mit InfluxDB v2

JSON Schnittstelle

Allgemeines

Die Ökofen Heizanlage hat eine eingebaute JSON-Schnittstelle, mit der man wichtige Kenndaten der Heizanlage auslesen kann, z.B. die aktuelle Vorlauftemperatur, die Temperatur des Außenfühlers oder auch die aktuelle Leistung des Brenners.

Hinweis Bei der Abfrage gibt es eine Rate Limit von 2,5sec. Kommen Anfragen schneller rein, gibt es einen HTTP 401 Fehler (Unauthorized) mit dem Body-Text "Wait at least 2500ms during requests."

Einrichtung

Diese Schnittstelle muss am Touch-Bedienteil eingeschaltet werden. Die Einstellung findet sich unter den "IP-/Netzwerk-Einstellungen" ganz unten. Einzugeben sind:

Parameter Wert Anmerkung
JSON Modus Ein
JSON Passwort Irgendeine Zeichenfolge Passwort ist ein Teil der URL. Der Standardwert sollte verändert werden.
JSON Port 4321

Spezifikation

Leider hat Ökofen die Spezifikation der Schnittstelle nicht für die Öffentlichkeit dokumentiert (ein Trauerspiel!), daher ist Reverse Enginieering nötig, um die zurückgegebene Werte und deren Einheiten zu verstehen. Einige Entwickler und Bastler haben bereits Vorarbeit geleistet, u.a. hier dokumentiert.

Eine allgemeine Kurzerklärung der Schnittstelle bekommt man nach Aufruf der Basis-URL, z.B.

http://192.168.1.24:4321/

Aufruf

Die Schnittstelle wird wie folgt aufgerufen:

http://192.168.1.24:4321/JSONPASSWORD/all

Weitere Endpunkte, die das Ergebnis auf einzelne Abschnitte eingrenzen, findet man in der o.g. Kurzbeschreibung. Auch einzelne Werte können abgerufen werden. Beispiele:

http://192.168.1.24:4321/JSONPASSWORD/hk1

http://192.168.1.24:4321/JSONPASSWORD/hk1.L_flowtemp_act
Warnung Achtung: Das JSONPASSWORD ist keine gute Absicherung der Schnittstelle. Es findet keine Authentifizierung statt. Auch das Setzen von Werten ist damit möglich (z.B. Heizkreis aus/auto, siehe unten bzw. dieses Beispiel).
Setzen von Werten

Folgendes Beispiel zeigt, wie man die "Raumtemperatur Heizen" auf 22°C setzt:

http://192.168.1.24:4321/JSONPASSWORD/hk1_temp_heat=220

Beispielergebnis

Der /all Endpunkt bringt beispielsweise folgendes Resultat (Inhalt zum Ausklappen):

{
 "system":{
  "L_ambient":112, 
  "L_errors":0, 
  "L_usb_stick":1, 
  "L_existing_boiler":0
 },
 "weather":{
  "L_temp":110, 
  "L_clouds":100, 
  "L_forecast_temp":90, 
  "L_forecast_clouds":56, 
  "L_forecast_today":0, 
  "L_starttime":900, 
  "L_endtime":1630, 
  "L_source":"https://www.openweathermap.org", 
  "L_location":"Dortmund|Germany|2935517", 
  "cloud_limit":55, 
  "hysteresys":-40, 
  "offtemp":-100, 
  "lead":120, 
  "refresh":0, 
  "oekomode":0
 },
 "forecast":{
  "L_w_0":"Mi, 21 Okt 16:47|11|100|16 km/h|04d|804|C|08:01|18:24", 
  "L_w_1":"Mi, 21 Okt 17:00|11|100|16 km/h|04d|804|C", 
  "L_w_2":"Mi, 21 Okt 20:00|10|100|18 km/h|10n|500|C", 
  "L_w_3":"Mi, 21 Okt 23:00|9|99|20 km/h|04n|804|C", 
  "L_w_4":"Do, 22 Okt 02:00|6|75|20 km/h|04n|803|C", 
  "L_w_5":"Do, 22 Okt 05:00|5|2|19 km/h|01n|800|C", 
  "L_w_6":"Do, 22 Okt 08:00|5|52|20 km/h|04n|803|C", 
  "L_w_7":"Do, 22 Okt 11:00|8|43|26 km/h|03d|802|C", 
  "L_w_8":"Do, 22 Okt 14:00|10|99|29 km/h|04d|804|C", 
  "L_w_9":"Do, 22 Okt 17:00|9|13|19 km/h|10d|500|C", 
  "L_w_10":"Do, 22 Okt 20:00|8|38|15 km/h|03n|802|C", 
  "L_w_11":"Do, 22 Okt 23:00|7|37|13 km/h|03n|802|C", 
  "L_w_12":"Fr, 23 Okt 02:00|7|99|14 km/h|04n|804|C", 
  "L_w_13":"Fr, 23 Okt 05:00|8|100|18 km/h|04n|804|C", 
  "L_w_14":"Fr, 23 Okt 08:00|8|100|21 km/h|10n|500|C", 
  "L_w_15":"Fr, 23 Okt 11:00|8|99|25 km/h|10d|501|C", 
  "L_w_16":"Fr, 23 Okt 14:00|9|100|25 km/h|10d|500|C", 
  "L_w_17":"Fr, 23 Okt 17:00|11|94|26 km/h|10d|500|C", 
  "L_w_18":"Fr, 23 Okt 20:00|9|100|29 km/h|10n|500|C", 
  "L_w_19":"Fr, 23 Okt 23:00|9|100|34 km/h|10n|501|C", 
  "L_w_20":"Sa, 24 Okt 02:00|7|100|32 km/h|10n|501|C", 
  "L_w_21":"Sa, 24 Okt 05:00|6|100|27 km/h|10n|501|C", 
  "L_w_22":"Sa, 24 Okt 08:00|6|100|25 km/h|10n|500|C", 
  "L_w_23":"Sa, 24 Okt 11:00|6|84|21 km/h|10d|500|C", 
  "L_w_24":"Sa, 24 Okt 14:00|9|63|24 km/h|04d|803|C"
 },
 "hk1":{
  "L_roomtemp_act":0, 
  "L_roomtemp_set":210, 
  "L_flowtemp_act":368, 
  "L_flowtemp_set":367, 
  "L_comfort":0, 
  "L_state":32, 
  "L_statetext:"Heizbetrieb aktiv",
  "L_pump":1, 
  "remote_override":0, 
  "mode_auto":1, 
  "time_prg":0, 
  "temp_setback":160, 
  "temp_heat":210, 
  "temp_vacation":180, 
  "name":"Heizung", 
  "oekomode":0
 },
 "pu1":{
  "L_tpo_act":392, 
  "L_tpo_set":417, 
  "L_tpm_act":377, 
  "L_tpm_set":417, 
  "L_pump_release":400, 
  "L_pump":0, 
  "L_state":320, 
  "L_statetext:"Quellentemp unterhalb Pumpenfreigabetemp|Anforderung Ein",
  "mintemp_off":80, 
  "mintemp_on":80, 
  "ext_mintemp_off":80, 
  "ext_mintemp_on":80
 },
 "ww1":{
  "L_temp_set":300, 
  "L_ontemp_act":390, 
  "L_offtemp_act":392, 
  "L_pump":0, 
  "L_state":8200, 
  "L_statetext:"Zeit außerhalb Zeitprogramm|Anforderung Aus",
  "time_prg":0, 
  "sensor_on":0, 
  "sensor_off":1, 
  "mode_auto":1, 
  "mode_dhw":1, 
  "heat_once":0, 
  "temp_min_set":350, 
  "temp_max_set":550, 
  "name":"Warmwasser", 
  "smartstart":0, 
  "use_boiler_heat":0, 
  "oekomode":0
 },
 "circ1":{
  "L_pump":1, 
  "L_ret_temp":379, 
  "L_release_temp":390, 
  "time_prg":0, 
  "mode":1, 
  "pump_release":150, 
  "return_set":450, 
  "name":"Zirkulation Badezimmer"
 },
 "pe1":{
  "L_temp_act":397, 
  "L_temp_set":447, 
  "L_ext_temp":-32768, 
  "L_frt_temp_act":5452, 
  "L_frt_temp_set":5584, 
  "L_frt_temp_end":5720, 
  "L_br":0, 
  "L_ak":0, 
  "L_not":1, 
  "L_stb":1, 
  "L_modulation":100, 
  "L_runtimeburner":3396, 
  "L_resttimeburner":8000, 
  "L_currentairflow":0, 
  "L_lowpressure":1530, 
  "L_lowpressure_set":1520, 
  "L_fluegas":61, 
  "L_uw_speed":56, 
  "L_state":16, 
  "L_statetext:"Leistungsbrand",
  "L_type":6, 
  "L_starts":3759, 
  "L_runtime":5642, 
  "L_avg_runtime":90, 
  "L_uw_release":350, 
  "L_uw":56, 
  "L_storage_fill":6000, 
  "L_storage_min":400, 
  "L_storage_max":6000, 
  "L_storage_popper":31, 
  "storage_fill_today":32765, 
  "storage_fill_yesterday":32765, 
  "mode":1
 },
   "error":{
   }
}

InfluxDB

InfluxDB ist eine Open-Source Datenbank speziell für Zeitreihen und wird für das Speichern der ausgelesenen Daten verwendet. Ich nutze InfluxDB v2 aktuell auch zum Berechnen und Visualisieren der Kennzahlen und Statistiken.

Installation

Folgende Pakete sind zu installieren (hier unter openSUSE Tumbleweed Stand Oktober 2026):

a) InfluxDB

zypper in influxdb2
systemctl enable influxdb
systemctl start influxdb

Erfolg testen:

systemctl status influxdb

b) InfluxDB Client für Python (Script)

zypper in python313-influxdb-client

Erfolg testen:

python3 -c "import influxdb_client; print('Erfolgreich installiert')"

c) Influx Client für die Kommandozeile

Der CLI Client ist nötig für bestimmte Operationen (Benutzer, Organisation, etc.), die in der Web UI nicht implementiert sind.

Aktuelle Client Download-Links siehe Install and use the influx CLI.

wget https://dl.influxdata.com/influxdb/releases/influxdb2-client-2.8.0-linux-amd64.tar.gz
tar zxvf influxdb2-client-2.8.0-linux-amd64.tar.gz
cp ./influx /usr/local/bin/

Erfolg testen:

influx version
Erster Benutzer

Nach frischer Installation ist unter http://localhost:8086 bzw. http://<IP>:8086 der erste Benutzer, eine Organisation und ein sog. Bucket anzulegen. Dieser Benutzer hat vollen Zugriff auf das Bucket und die Organisation (und sogar auf die gesamte DB) entsprechend dem erzeugten root-Token, das man sich im Passwortmanager seiner Wahl notieren sollte.

Beispiel:

  • Benutzer: admin
  • Organisation: Privat
  • Bucket: oekofen
Hinweis Weiter unten wird ein weiterer Benutzer erstellt mit eigenem Token, der nur die nötigen Rechte auf das Bucket hat. Dieser Benutzer wird später nur für das Scripting genutzt, um die Daten zu füllen.
Shell

Um auf Kommandozeile den Client influx nutzen zu können, ist einmalig eine Konfiguration zu erstellen:

influx config create --config-name default --host-url http://localhost:8086 --org Privat --token TOKEN --active

Als TOKEN wird der Token verwendet, der beim Anlegen des ersten Benutzers "admin" erstellt wurde (mit den vollen Rechten!).

Die Konfiguration inkl. Token wird in folgender Datei geschrieben:

~/.influxdbv2/configs

Erfolg testen:

influx user list
Es darf dabei kein Fehler wie Error: failed to list users: 401 Unauthorized: unauthorized access erscheinen.
Benutzer für das Script
  • Benutzer "oekofen" für das Script anlegen
influx user create -n oekofen -p PASSWORD -o Privat
API Token für das Datensammeln
  • Token für Benutzer "oekofen" erstellen (nur Rechte am Bucket vergeben!) über http://localhost:8086 als Benutzer "admin" angemeldet:
Load Data -> API Tokens
GENERATE API TOKEN -> Custom API Token
Buckets: oekofen (read/write)

Der erstellte Token wird später im Script hinterlegt.

Organisationen

Falls irgendwann nötig, kann man Organisationen listen, löschen (geht nur über die id) und deren Mitglieder einsehen wie folgt:

influx org list
influx org members list
influx org delete --id 123456789
Bucket anpassen
Änderung der Vorhaltezeit

Das oben erstellte Bucket kann z.B. auf "2 Jahre" Vorhaltezeit gestellt werden (Default ist unendlich):

Load Data -> Buckets
SETTINGS
OLDER THAN -> Custom duration -> 2 Jahre (730 days)

Backup

Das folgende Script backup-influxdbv2.sh macht ein Backup der gesamten InfluxDB v2:

#!/bin/bash
#
# Dieses Script dient zum Backup einer InfluxDB v2.
# Der Pfad zum Ort des Backups und der Token müssen angepasst werden. Das Verzeichnis sollte dann in das reguläre Backup aufgenommen werden.
#
# Erstellt von Ralf Krüdewagen

# Das root Token des ersten Benutzers bei Ersteinrichtung 
TOKEN=xxxxx==

# influx Client Binary
INFLUX=/usr/local/bin/influx

# Backup Path, wird erzeugt falls noch nicht vorhanden
BACKUP_ROOT_PATH=/data/backup/influxdb
mkdir -p $BACKUP_ROOT_PATH -m 750

# Aktuelles Datum und Uhrzeit für das Backup Dir
DATE=`date '+%Y%m%d_%H%M'`

# InfluxDB Backup Kommando
# -t ist das root Token des ersten Benutzers bei Ersteinrichtung 
$INFLUX backup $BACKUP_ROOT_PATH/$DATE -t $TOKEN

Der folgende Cronjob (/etc/crontab) sorgt für regelmäßige Backups jeden Tag um 23:59 Uhr:

59 23 * * * root /root/bin/backup-influxdbv2.sh 1>/var/tmp/backup-influxdbv2.log 2>/var/tmp/backup-influxdbv2.log
Hinweis In der "bolt" -Datei sind u.a. die Dashboards enthalten.

Offizielle Doku siehe Back up data und zum influx backup-Kommando.

Datensammlung

Basis "Ökofen Spy"

Das Script oekofen2influxv2.py zum Einlesen der Daten über die JSON-Schnittstelle und Speichern der Daten in einer InfluxDB basiert auf dem Script oekofen2influx.py des Projekts Ökofen-Spy[1], welches ich angepasst habe (s.u.).

Meine Anpassungen

Meine Änderungen an dem Script umfassen:

  • Anpassung an InfluxDB v2 (statt v1)
  • Behandlung eines Fehlers in der JSON-Antwort der Pellematic (alle Parameter mit "L_statetext"). Hinweis: Dieser Fehler ist nicht in allen Softwareständen von Ökofen enthalten.
  • Konvertierung der Parameter "L_lowpressure" um Faktor 0.01 (Umrechnung in EH bzw. Pa)

Einrichten

  • Installation

Zur Installation des Rohdaten-Sammelscripts kann man es direkt aus dem Repository auschecken, z.B. so:

git clone https://gitlab.com/formwandler/oekofen-monitoring.git

Dann kopiert man das Script am besten an einen Ort außerhalb des git-Arbeitsverzeichnisses:

cp oekofen-monitoring/bin/oekofen2influxv2.py /usr/local/bin/
  • Cronjob

Das Script muss regelmäßig starten (z.B. alle 4 Minuten), daher richtet man am besten einen systemweiten Cronjob ein wie folgt:

*/4 * * * * nobody /usr/bin/python3 /usr/local/bin/oekofen2influxv2.py 1>>/var/tmp/oekofen-spy.log 2>>/var/tmp/oekofen-spy.log
Hinweis Das Logfile wächst pro Woche um ca. 1 MByte, daher sollte man ein Logrotating einrichten.
  • Erfolg testen

Prüfen der in der InfluxDB gespeicherten Felder über folgendes Flux-Script (Data Explorer) mit "Table" als Visualisierung:

import "influxdata/influxdb/schema"
schema.fieldKeys(bucket: "oekofen", predicate: (r) => r._measurement == "oekofen")

Prüfen von Werten, z.B. im Feld "hk1_L_flowtemp_act"

from(bucket: "oekofen")
  |> range(start: v.timeRangeStart, stop: v.timeRangeStop)
  |> filter(fn: (r) => r["_measurement"] == "oekofen")
  |> filter(fn: (r) => r["_field"] == "hk1_L_flowtemp_act")
  |> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false)
  |> yield(name: "mean")

Visualisierung und Berechnungen

Berechnungen

Annahmen und Anmerkungen (Quelle: meist Gemini):

  • Zeiten
    • Merksatz für Flux-Zeitfenster: Tage (1d), Monate (1mo) und Jahre (1y) richten sich mit dem timezone-Modul automatisch am Kalender aus. Nur Wochen (1w) benötigen wegen des Epochen-Donnerstags den Offset offset: -3d, um auf Montag zu springen.
  • Pelletverbrauch
    • Für die Berechnung des Pelletverbrauchs wird zugrunde gelegt, dass Pellets einen Heizwert von 4,9 kWh/kg haben. Daraus ergibt sich bei einer Nenn-Kesselleistung von 12 kWh ein Pelletverbrauch von 12 kW / 4,9 kWh/kg = 2,45 kg pro Stunde bei 100% Kesselleistung (Modulation).
    • Der Schwellenwert für die Modulation des Kessels > 10.0 dient als Filter gegen Falschverbrauch, damit wirklich nur dann Pellets berechnet werden, wenn der Brenner im echten Leistungsbrand steht (und nicht im Nachlauf o.ä.).
  • Temperaturen:
    • Brennwerteffekt nur bei Vorlauf unter 55°C. Da für den Rücklauf kein Sensor verfügbar ist, wird die Rücklauftemperatur geschätzt wie folgt:

Rücklauftemperatur = Vorlauftemperatur - 10°C

Flux Scripte

In InfluxDB v2 wird die Scriptsprache Flux[1] verwendet, um Berechnungen vorzunehmen und Daten für die Visualisierung vorzubereiten. Die umfangreichen Rechenvorschriften für jeden Graph sind im Code des jeweiligen Dashboards (s.u.) hinterlegt.

Folgende Tabelle erläutert einige Besonderheiten bei den Flux-Scripten:

Kennzahl Aggregation / Intervall Flux-Besonderheit Visualisierung
Verbrauch Tag / Woche / Monat / Jahr offset: -3d bei 1w (Mo–So) Graph (Stepped) / Table / Single Stat
Brennerlaufzeit Stunden pro Tag / Woche / Monat _value * (4.0 / 60.0) Graph (Stepped) / Single Stat
Brennerstarts Gesamt & Avg pro Tag difference() + count() / mean() Single Stat
Starts pro Tag Täglicher Verlauf difference() + aggregateWindow(1d) Graph (Interpolation: Stepped)
Laufzeit pro Start Tägliche Durchschnittsdauer Typ-Konvertierung float() vor join() Graph (Stepped)

In den Scripten sind einige feste Werte enthalten, die je nach Setup angepasst werden müssen:

  • Für Zeitberechnungen wird der Faktor "4.0" verwendet, da die Rohdaten alle 4 min eingesammelt werden (und damit für 4 min "gültig" sind). Sollte der Cronjob zum Sammeln der Rohdaten ein anderes Intervall vorsehen, dann muss der Faktor angepasst werden.
  • In Berechnungen zum Pelletverbrauch ist die Nennleistung des Kessels/Brenners von "12.0" fest eingestellt. Hier muss bei abweichender Nennleistung angepasst werden.

Dashboards

Folgende Screenshots zeigen die Kennzahlen und Graphen der Lösung:


Die folgende Tabelle zeigt, welche Kennzahlen und Graphen in verschiedenen Dashboards zu sehen sind:

Berechnete und angezeigte Werte in den Dashboards
Kennzahlen Einheit Graph-Typ Datenfelder Bemerkung
Außentemperatur aktuell °C Gauge system_L_ambient
Vorlauftemperatur aktuell °C Gauge hk1_L_flowtemp_act
Warmwassertemperatur aktuell °C Gauge ww1_L_ontemp_act
Kesseltemperatur aktuell °C Gauge pe1_L_temp_act
Leistung Brenner aktuell % Gauge pe1_L_modulation Kann werte zwischen 0 und 100 annehmen (moduliert)
Brennerstarts pro Tag im Zeitfenster (Durchschnitt) [1] Gauge pe1_L_modulation Zählt und mittelt Starts, sobald pe1_L_modulation > 0.

Zu viele Starts am Tag sind auffällig.

Brennerstarts pro Tag [1] Graph (step) pe1_L_modulation Zählt Starts, sobald pe1_L_modulation > 0.

Zu viele Starts am Tag sind auffällig.

Brennerstarts im Zeitfenster [1] Single Stat pe1_L_modulation Zählt Starts, sobald pe1_L_modulation > 0.
Durchschnittliche Laufzeit des Brenners pro Start in der Zeit [min] min Gauge pe1_L_modulation Zählt Laufzeit, sobald pe1_L_modulation > 0.

Laufzeit sollte möglichst >60 min sein.

Durchschnittliche Laufzeit des Brenners pro Start und Tag [min] min Graph (step) pe1_L_modulation Zählt Laufzeit, sobald pe1_L_modulation > 0.

Laufzeit sollte möglichst >60 min sein.

Mittlere Unterdruck-Abweichung im Leistungsbrand im Zeitfenster [%] % Gauge pe1_L_lowpressure

pe1_L_lowpressure_set pe1_L_modulation

Diese Kennzahl berechnet die prozentuale Abweichung des gemessenen Unterdrucks vom Sollwert während der aktiven Modulation (pe1_L_modulation > 10.0). Bei großen Abweichungen ist eine Wartung zu empfehlen, bevor die Heizung ausfällt.
Solltemperatur Brenner aktuell (Brenner an bei >8°C) °C Single Stat pe1_L_temp_set Eine alternative Anzeige für "Brenner an" (wenn Soll >8°C)
Laufzeit pro Tag h Graph + Single Stat pe1_L_modulation Zählt Laufzeit, sobald pe1_L_modulation > 0.
Laufzeit pro Woche h Graph + Single Stat pe1_L_modulation Zählt Laufzeit, sobald pe1_L_modulation > 0.
Laufzeit pro Monat h Graph + Single Stat pe1_L_modulation Zählt Laufzeit, sobald pe1_L_modulation > 0.
Laufzeit im Zeitfenster h Single Stat pe1_L_modulation Zählt Laufzeit, sobald pe1_L_modulation > 0.
Pellets Tagesverbrauch - Heute [kg] kg Gauge pe1_L_modulation Diese Kennzahl berechnet den Pelletverbrauch während der aktiven Modulation (pe1_L_modulation > 10.0) anhand Nennleistung, Pellet-Heizwert und Zeit.
Pellets Tagesverbrauch [kg] kg Graph + Single Stat pe1_L_modulation s.o.
Pellets Wochenverbrauch [kg] kg Graph + Single Stat pe1_L_modulation s.o.
Pellets Monatsverbrauch [kg] kg Graph + Single Stat pe1_L_modulation s.o.
Pellets Jahresverbrauch - dieses Jahr [kg] kg Gauge pe1_L_modulation s.o.
Pellets Gesamtverbrauch [kg] kg Single Stat pe1_L_modulation s.o.
Brennwert-Anteil im Zeitfenster [%] % Gauge k1_L_flowtemp_act

pe1_L_modulation

Annahme: Wenn die Vorlauftemperatur < 55°C ist, wird eine Rücklauftemperatur < 45°C angenommen. Für diese Zeiten läuft der Brenner im Brennwert-Modus.
Kesselleistung Modulation % Graph pe1_L_modulation Zeigt an, wann der Kessel brennt und mit welcher Leistung von 0-100%.
Temperatur Kessel Ist/Soll °C Graph pe1_L_temp_act

pe1_L_temp_set

Temperatur Feuerraum °C Graph pe1_L_frt_temp_act
Vorlauftemperatur Ist / Soll °C Graph hk1_L_flowtemp_act

hk1_L_flowtemp_set

Nutzbare Ausbrandzeit [Stunden/Tag] h Graph (step) pe1_L_frt_temp_act

pe1_L_modulation

Zeigt an, wie durchschnittlich lang eine Ausbrand-Restwärme anhält.
Umwälzpumpe Modulation Heizkreis % Graph pe1_L_uw_speed Zeigt an, wann und wie stark die Umwälzpumpe läuft von 0-100%. Sollte mit der Brenner-Modulation korrelieren.
Unterdruck Ist/Soll Pa Graph pe1_L_lowpressure

pe1_L_lowpressure_set

Der Istwert sollte im Brandfall fast identisch dem Sollwert sein. Bei großen Abweichungen ist eine Wartung zu empfehlen, bevor die Heizung ausfällt.
Temperatur Außen/Wetter/Soll °C Graph system_L_ambient

weather_L_temp hk1_temp_heat

Zeigt Temperatur vom Außenfühler und von der Wettervorhersage an. Differenz sollte klein sein. Die Heizungssolltemperatur wird eingestellt und bestimmt mit der Kennlinie zusammen das Temperaturverhalten.
Tägliche Durchschnitts-Außentemperatur °C Graph (step) system_L_ambient Mittelwert pro Tag
Temperatur Pufferspeicher Oben/Unten Ist/Soll °C Graph pu1_L_tpo_act

pu1_L_tpo_set pu1_L_tpm_act pu1_L_tpm_set

Thermische Spreizung / Ladezustand im Puffer (ΔT in °C) °C Graph pu1_L_tpo_act

pu1_L_tpm_act

Diese Kennzahl berechnet die Differenz zwischen Puffer-Oben und Puffer-Mitte (Ist). Eine hohe Spreizung (>15-20K) signalisiert eine hervorragende Schichtung (oben heißes Nutzwasser, unten/mitte abgekühltes Rücklaufwasser). Bei zu kleiner Differenz wird i.d.R. der Brenner starten.
Warmwasser Temperatur Ist/Soll °C Graph ww1_L_ontemp_act

ww1_L_offtemp_act ww1_L_temp_set

Diese Abfrage stellt die reale Warmwassertemperatur der Solltemperatur bzw. Einschalt-Schwelle gegenüber. Die Solltemperatur ist i.d.R. zeitgesteuert.
Zirkulationsdauer Warmwasser [Stunden/Tag] h Graph (step) circ1_L_pump Zeigt die mittlere Laufzeit der Zirkulationspumpe für Warmwasser an. Diese wird i.d.R. zeitgesteuert eingeschaltet. Je kleiner die Dauer, desto weniger Energie wird verschwendet für "dumm" zirkulierendes Warmwasser.
Zirkulation Warmwasser Status [1] Graph (step) circ1_L_pump Zeigt an, wann die Zirkulationspumpe für Warmwasser lief. Diese wird i.d.R. zeitgesteuert eingeschaltet.

Im Sourcecode der Dashboard-Exporte finden sich die genauen Berechnungen, Kommentare und Schwellwerte für Farben vor allem bei Gauge-Anzeigen.

Monitoring zur Alarmierung

Konzept

Um bei wichtigen Änderungen oder bei Fehlern der Heizanlage zuverlässig alarmiert zu werden, werden einige Basis-Monitore mit dem Tool Uptime Kuma implementiert. Dazu sind Web-Checks eingerichtet, die bei negativem Resultat Benachrichtigungen über die die eingerichteten Kanäle verschickt (z.B. über E-Mail, Nextcloud Talk, Matrix, etc.).

Checks in Uptime Kuma

Die folgende Tabelle zeigt die eingerichteten HTTP-Checks:

Name Check-Art URL-Endpoint Suche nach Antwort / Schlüsselwort Bemerkung
Ökofen No Errors HTTP JSON-Abfrage /system system.L_errors == 1 Prüft, ob es aktuell Fehlermeldungen gibt.

Hinweis: Im errors {} Objekt kann man dann die Fehlermeldung sehen.

Ökofen Heizbetrieb Auto HTTP JSON-Abfrage /hk1.mode_auto mode_auto == 1 Prüft ob Heizbetrieb auf "Auto" steht.
Ökofen Warmwasser Auto HTTP JSON-Abfrage /ww1.mode_auto mode_auto == 1 Prüft ob Warmwasser auf "Auto" steht.
Ökofen Pellematic Auto HTTP JSON-Abfrage /pe1.mode mode == 1 Prüft ob der Brenner auf "Auto" steht.
Ökofen Heizbetrieb aktiv HTTP - Schlüsselwort /hk1 "betrieb aktiv" Prüft ob der Heizbetrieb oder Absenkbetrieb aktiv ist (umzustellen bei Sommermodus).
Prüfung des Warmwasser Modus auf "auto"
Tipp Aufgrund des Rate Limits von 2,5 sec zwischen zwei JSON-API-Anfragen, kommt es immer wieder vor, dass Checks, die parallel laufen, einen 401 (Unauthorized) Fehler schmeißen. Daher sollte mind. eine Check-Wiederholung eingerichtet werden, bevor alarmiert wird.


Offen / ToDo

  • Installation der InfluxDB in einem Docker Container statt auf dem Host
  • Eigene Domain mit TLS Zertifikat und Reverse Proxy für die FluxDB Web UI
  • Einrichten von Logrotating für das Sammel-Script

Softwareprojekt

Den Code für die Scripts und InfluxDB-Visualisierungen inkl. Berechnungen findet man unter

https://gitlab.com/formwandler/oekofen-monitoring

Disclaimer

Warnung Für die Korrektheit der Angaben auf dieser Seite und die Funktionsweise des bereitgestellten oder verlinkten Codes übernehme ich keine Gewähr.

Anwender sollten das Vorgehen verstehen und mit Sorgfalt implementieren, vor allem da die undokumentierte JSON-Schnittstelle von Ökofen auch das Setzen von Parametern erlaubt (ohne eine dem Stand der Technik entsprechende Authentifizierung und Autorisierung).

Einen Großteil der Visualisierungen in InfluxDB habe ich mit dem KI-Sparringspartner Google Gemini Modell "Flash 3.6" erstellt.

Einzelnachweise

  1. ↑ Das Original-Script steht unter der MIT License, Copyright (c) 2021 Peter Fuerle. Siehe auch Code auf GitLab

Siehe auch