homelab-brain/smart-home/scripts/cleanup_reconstruct.py
root b61ac66367 docs(smart-home): dokumentiere Heizung/Brenner komplett, alle Zugänge in homelab.conf
- 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
2026-04-20 22:31:32 +02:00

43 lines
1.8 KiB
Python

#!/usr/bin/env python3
"""1) Löscht Überlappungsbereich 2) rekonstruiert sauber mit neuen Schwellen."""
import json
from urllib.parse import quote
from urllib.request import Request, urlopen
INFLUX='http://localhost:8086'; DB='iobroker'
def qget(sql):
with urlopen(f'{INFLUX}/query?db={DB}&epoch=ns&q={quote(sql)}', timeout=30) as r:
return json.loads(r.read().decode())
def qpost(sql):
url = f'{INFLUX}/query?db={DB}'
req = Request(url, data=f'q={quote(sql)}'.encode(), method='POST',
headers={'Content-Type':'application/x-www-form-urlencoded'})
with urlopen(req, timeout=30) as r:
return json.loads(r.read().decode())
# Zeitraum: ab erstem "toten" Zeitpunkt bis eine Minute vor Live-Service-Start
# Live-Start war 2026-04-20 21:45 MESZ = 19:45 UTC
# Rekonstruktion soll 06.04. mittags bis 20.04. 21:44 MESZ
START_UTC = '2026-04-06T02:00:00Z' # 04:00 MESZ 06.04.
END_UTC = '2026-04-20T19:45:00Z' # 21:45 MESZ 20.04.
print('=== VOR DELETE ===')
for m in ('brennerstarts','brennerstatus','brennerlaufzeit'):
r = qget(f'SELECT count(value) FROM {m} WHERE time >= \'{START_UTC}\' AND time < \'{END_UTC}\'')
s = r['results'][0].get('series',[])
c = s[0]['values'][0][1] if s else 0
print(f' {m}: {c} Zeilen im Rekonstruktions-Fenster')
print('\n=== DELETE ===')
for m in ('brennerstarts','brennerstatus','brennerlaufzeit'):
r = qpost(f'DELETE FROM {m} WHERE time >= \'{START_UTC}\' AND time < \'{END_UTC}\'')
print(f' {m}: {r}')
print('\n=== NACH DELETE ===')
for m in ('brennerstarts','brennerstatus','brennerlaufzeit'):
r = qget(f'SELECT count(value) FROM {m} WHERE time >= \'{START_UTC}\' AND time < \'{END_UTC}\'')
s = r['results'][0].get('series',[])
c = s[0]['values'][0][1] if s else 0
print(f' {m}: {c} Zeilen verbleibend')