homelab-brain/smart-home/HEIZUNG.md
Homelab Cursor d0b2c182de fix(ops): dokumentiere Smart-Home-Alert-Fixes und Matomo-Check
- Hausmeister-Bot Matomo-HTTP-Check korrigiert: Matomo laeuft in CT109
  (10.10.10.109), nicht in CT113.
- Smart-Home-Doku ergaenzt: CT143/raspi-broker Error-Rate war durch
  /tmp-tmpfs-Backups, vollen Swap und Telegraf-Noise verursacht.
- Cleanup-Script fuer alte raspi-broker-TARs versioniert, damit /tmp
  im CT143 nicht erneut RAM/Swap fuellt.
2026-04-25 14:50:16 +02:00

8.2 KiB

Heizung Muldenstein — Brenner-Erkennung & Ölverbrauch

Wo läuft das? Alles in CT 143 auf pve-mu-3 (Tailscale 100.66.78.56, LAN 192.168.178.36). Was heißt das? Es gibt KEINEN Raspberry Pi mehr — der alte raspi-broker wurde 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.Vorlauf detektiert.
  • 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:

  1. Löschen alter/doppelter Events im Fenster (2026-04-06T02:00:00Z bis 2026-04-20T19:45:00Z) via DELETE auf brennerstarts, brennerstatus, brennerlaufzeit.
  2. Neu berechnen mit den aktuellen Schwellwerten aus den noch vorhandenen Rohdaten (Oelkessel_VL.Vorlauf), Dry-Run zuerst, dann --commit.
  3. Ergebnis (April gesamt): 52 Starts, 18,2 h Laufzeit, 34,4 L Öl.

Scripts:

  • scripts/brenner_rekonstruktion.py — Rekonstruktion (Dry-Run default, --commit schreibt)
  • scripts/cleanup_reconstruct.py — löscht Events im Reconstruction-Fenster
  • scripts/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

2026-04-25: raspi-broker Error-Rate / Influx-Timeouts

Ursache war kein Brenner-Logikfehler, sondern Ressourcen-Druck im CT143:

  • /tmp ist im Smart-Home-CT ein tmpfs und belegt RAM.
  • ioBroker/backitup hatte dort taegliche raspi-broker-YYYY-MM-DD.tar.gz Archive liegen lassen (~700 MB pro Tag, ~7 GB gesamt).
  • Dadurch war der CT im Swap, InfluxDB-Queries aus brennerstarts.py liefen in 30s-Timeouts.
  • Alte TARs wurden geloescht, nur das aktuelle Tagesarchiv blieb.
  • Dauerfix: /usr/local/sbin/cleanup-raspi-broker-tmp.py + Cron /etc/cron.d/cleanup-raspi-broker-tmp loescht Archive aelter als 36h. Versionierte Kopie: smart-home/scripts/cleanup-raspi-broker-tmp.py.

Zweiter Fehlerstrom kam von Telegraf:

  • /etc/telegraf/telegraf.d/promtail.conf pollte http://100.78.77.115:9080/metrics, ein seit Wochen offline befindlicher Tailscale-Node.
  • Datei wurde nach /etc/telegraf/telegraf.d/promtail.conf.disabled verschoben. Backup: .bak-20260425.
  • In /etc/telegraf/telegraf.d/openwb.conf wurde openWB/lp/1/TimeRemaining aus dem Float-MQTT-Consumer entfernt, weil Payloads wie Min nicht als Float parsebar sind. Backup: .bak-20260425.

Pruefung:

ssh pve-mu-3 'pct exec 143 -- df -h /tmp && pct exec 143 -- free -h'
ssh pve-mu-3 'pct exec 143 -- journalctl -u telegraf --since "10 min ago" --no-pager'
ssh pve-mu-3 'pct exec 143 -- journalctl -u brennerstarts --since "10 min ago" --no-pager'

"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.