- smart-home/HEIZUNG.md: komplette Doku zur Ölbrenner-Erkennung (brennerstarts.py), Schwellwerte, Rekonstruktion, Dashboard-Panels, Troubleshooting - smart-home/STATE.md: klare Tabelle mit allen Dienst-URLs (public+intern) und Logins — Grafana/ioBroker/InfluxDB laufen ALLE in CT 143 auf pve-mu-3 - homelab.conf: CT_143_MU3 Beschreibung korrigiert (war "Raspi-Broker"), neue Variablen GRAFANA_URL_*/IOBROKER_URL_*/INFLUX_URL_INTERN + User/Pass (=PW_DEFAULT) damit beim nächsten Mal keine Fragen aufkommen - smart-home/scripts/: alle relevanten Skripte ins Repo: grafana_shot.js (Puppeteer-Login mit admin/astral66) add_month_panel.py (idempotente Monatskacheln im Heizung-Dashboard) brenner_rekonstruktion.py + cleanup_reconstruct.py + check_april.py patch_brenner.sh (Anpassung der Schwellwerte nach Regelkurven-Änderung) - MASTER_INDEX.md: Verweis auf HEIZUNG.md Made-with: Cursor
6.8 KiB
Heizung Muldenstein — Brenner-Erkennung & Ölverbrauch
Wo läuft das? Alles in CT 143 auf pve-mu-3 (Tailscale
100.66.78.56, LAN192.168.178.36). Was heißt das? Es gibt KEINEN Raspberry Pi mehr — der alteraspi-brokerwurde durch diesen LXC-Container ersetzt.
Zugänge — NICHT MEHR FRAGEN, STEHT HIER
Alle Passwörter sind PW_DEFAULT aus homelab.conf, also astral66.
| Dienst | URL intern (Tailscale) | URL public / LAN | Login |
|---|---|---|---|
| Grafana | http://100.66.78.56:3000 | https://grafana.orbitalo.net (Cloudflare) | admin / astral66 |
| ioBroker | http://100.66.78.56:8081 | http://192.168.178.36:8081 | admin / astral66 |
| InfluxDB | http://100.66.78.56:8086 | — (nur intern) | keine Auth, DB iobroker |
SSH-Zugang (funktioniert aus dem monitoring-bot CT 116 heraus, wo Cursor läuft):
ssh pve-mu-3 # Proxmox-Host (ProxyCommand via SOCKS5 Tailscale)
ssh pve-mu-3 'pct exec 143 -- <befehl>' # direkt im Container ausführen
# Beispiel:
ssh pve-mu-3 'pct exec 143 -- systemctl status brennerstarts.service'
Die SSH-Config dafür liegt in ~/.ssh/config auf CT 116 und nutzt den Tailscale-SOCKS5-Proxy auf 127.0.0.1:1055.
Grafana-Screenshots (Puppeteer, loggt sich automatisch ein):
node /tmp/grafana_shot.js "https://grafana.orbitalo.net/d/heizung/f09f94a5-heizung-and-puffer?kiosk" /tmp/out.png
Der Login ist im Script fest auf admin / astral66 gesetzt — Script liegt in scripts/grafana_shot.js im Repo.
Hardware-Kontext
- Ölkessel ohne eigenen digitalen Status-Ausgang. Daher wird "Brenner an/aus" über die
Vorlauftemperatur
mqtt.0.Oelkessel.Oelkessel_VL.Vorlaufdetektiert. - Brenner-Rate: 1,89 L/h Heizöl (Messwert).
- Regelkurve wurde im April 2026 abgesenkt → max. Vorlauf jetzt ~40 °C statt vorher ~60 °C. Das hat die alte Erkennungslogik kaputt gemacht (Schwellwerte zu hoch).
Erkennungslogik: /root/brennerstarts.py (im CT 143)
Python-Daemon, läuft als brennerstarts.service (systemd).
Pollt jede Minute die Vorlauftemperatur aus InfluxDB und schreibt brennerstatus, brennerstarts,
brennerlaufzeit und brenner_heute zurück.
Aktuelle Parameter (nach Regelkurven-Anpassung, Stand 2026-04-20):
STEIGUNG_AN = 0.3 # °C über 3 Min → "Brenner zündet"
STEIGUNG_1MIN = 0.1 # °C über 1 Min → Sofort-Anstieg (zusätzlich zu AN)
STEIGUNG_AUS = -0.15 # °C über 3 Min → "Brenner aus"
MIN_TEMP_BRENNER = 30 # unter 30 °C gar keine Brennerdetektion
COOLDOWN_MINUTEN = 10 # Mindestpause zwischen zwei START-Events
BRENNER_RATE_LH = 1.89 # Liter/Stunde
Alte Werte (vor Regelkurven-Anpassung, falls Rollback nötig): 55 / 1.5 / 0.3 / -0.3.
Backup der Originaldatei liegt im CT 143 unter /root/brennerstarts.py.bak-20260420-2142.
InfluxDB-Query-Timeouts wurden von 10s auf 30s erhöht (Log zeigte gehäuft timed out um 04:00,
während das Backup lief).
Service-Kommandos
ssh pve-mu-3 'pct exec 143 -- systemctl status brennerstarts.service'
ssh pve-mu-3 'pct exec 143 -- systemctl restart brennerstarts.service'
ssh pve-mu-3 'pct exec 143 -- journalctl -u brennerstarts.service -n 200 --no-pager'
InfluxDB Measurements (DB iobroker)
| Measurement | Bedeutung | Quelle |
|---|---|---|
mqtt.0.Oelkessel.Oelkessel_VL.Vorlauf |
Vorlauftemperatur °C | MQTT → ioBroker |
mqtt.0.Holzvergaser_Sensoren_6.Aussenfühler.temperature |
Außentemp °C | MQTT |
mqtt.0.Wohnstube_Temperatur_1.Wohnstube.Wohnstube_Temperatur |
Raumtemp °C | MQTT |
brennerstatus |
0/1 live | brennerstarts.py |
brennerstarts |
Event pro Brennerstart (value=1) | brennerstarts.py |
brennerlaufzeit |
Sekunden kumulativ pro Intervall | brennerstarts.py |
brenner_heute |
Sekunden seit 00:00 | brennerstarts.py |
Heizöl-Liter = sum(brennerlaufzeit) / 3600 * 1.89.
Grafana-Dashboard Heizung & Puffer (UID: heizung)
URL: https://grafana.orbitalo.net/d/heizung/
Aktueller Aufbau (Stand 2026-04-20):
| Zeile | Panels |
|---|---|
| Oben | Puffer Oben/Mitte/Unten · Füllgrad · Außen · Ölkessel VL · Brenner AN/AUS · Rücklauf |
| Row "🛢️ Ölkessel Statistik (1,89 L/h)" | Heute · Letzte 7 Tage · Letzte 30 Tage · Gesamt |
| Mitte | Temperaturverlauf (Zeitreihe) |
| Unten | 📅 Tagesverbrauch (letzte 7 Tage) als Bar Chart |
| Ganz unten | Ölverbrauch je Heizmonat (Liter) — farbige Kachelzeile, 1 Kachel pro Kalendermonat |
Monats-Kacheln pflegen / erweitern
Wenn ein neuer Monat dazukommt, einfach das Script nochmal laufen lassen — es entfernt das alte Panel und erzeugt die Kacheln neu für alle Monate ab Jan 2026 bis einschließlich aktueller Monat:
python3 scripts/add_month_panel.py
Idempotent. Script liegt in scripts/add_month_panel.py in diesem Repo.
Historische Daten-Rekonstruktion (einmalig, 2026-04-20)
Weil die Erkennung zwischen 06.04. und 20.04.2026 wegen der zu hohen Schwellwerte keine Brenner-Events geschrieben hat, wurde die Periode nachträglich rekonstruiert:
- Löschen alter/doppelter Events im Fenster
(
2026-04-06T02:00:00Zbis2026-04-20T19:45:00Z) viaDELETEaufbrennerstarts,brennerstatus,brennerlaufzeit. - Neu berechnen mit den aktuellen Schwellwerten aus den noch vorhandenen Rohdaten
(
Oelkessel_VL.Vorlauf), Dry-Run zuerst, dann--commit. - Ergebnis (April gesamt): 52 Starts, 18,2 h Laufzeit, 34,4 L Öl.
Scripts:
scripts/brenner_rekonstruktion.py— Rekonstruktion (Dry-Run default,--commitschreibt)scripts/cleanup_reconstruct.py— löscht Events im Reconstruction-Fensterscripts/check_april.py— Sanity-Check der Monatszahlen
Nicht nochmal laufen lassen, außer die Logik ändert sich erneut und ein Zeitraum muss neu berechnet werden.
Häufige Fragen / Troubleshooting
"Der Brenner scheint nicht erkannt zu werden."
→ Vorlauftemperatur Oelkessel_VL.Vorlauf anschauen (Grafana „Temperaturverlauf"). Wenn die
Amplitude < 30 °C bleibt, ist MIN_TEMP_BRENNER zu hoch → in brennerstarts.py anpassen.
"Zahlen in 'Letzte 30 Tage' passen nicht zum Kalendermonat."
→ Das ist gewollt: Das Panel zeigt ein rollierendes 30-Tage-Fenster (Grafana now()-30d).
Für Kalendermonate ist die Kachelzeile unten da.
"Wo sehe ich ob der Brenner gerade läuft?"
→ Oben rechts im Dashboard: Panel Brenner. Rot/AN wenn brennerstatus == 1, grün/AUS sonst.
Datenquelle: das Measurement brennerstatus das brennerstarts.py minütlich aktualisiert.
"Grafana liefert keine Screenshots über die Render-API."
→ Der native grafana-image-renderer ist auf dieser Installation kaputt (Plugin-Signatur-Issue).
Immer den Puppeteer-Wrapper scripts/grafana_shot.js verwenden.