- 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
43 lines
1.8 KiB
Python
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')
|