- 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
165 lines
6.8 KiB
Markdown
165 lines
6.8 KiB
Markdown
# 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):
|
|
|
|
```bash
|
|
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):
|
|
|
|
```bash
|
|
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):**
|
|
|
|
```python
|
|
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
|
|
|
|
```bash
|
|
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:
|
|
|
|
```bash
|
|
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
|
|
|
|
**"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.
|