Architektur - BeGiBue/home-assistant-water-leak-guard GitHub Wiki
Architektur und Datenfluss
Überblick
Der Wasserwächter ist bewusst als Backend-Integration aufgebaut. Die eigentliche Sicherheitslogik liegt nicht in einer Lovelace-Karte, sondern vollständig in Home Assistant.
Vereinfachter Datenfluss:
Durchflusssensor ─┐
├─> Normalisierung ─> Manager ─> Detection Engine
Gesamtverbrauch ──┘ │ │
│ ├─> Leck-Events
│ ├─> Alarmstatus
│ └─> Shut-Off-Request
│
├─> Adaptive Learner
├─> Hydraulikmodell
├─> Notification Controller
├─> HA-Entitäten
└─> Persistenter Store
1. Manager
Der WaterLeakManager ist die Laufzeitkoordination einer eingerichteten Instanz.
Er übernimmt:
- Lesen der Home-Assistant-Quellzustände
- Normalisierung der Messwerte
- Ausführung der Detektoren
- Berechnung statischer High- und adaptiver Burst-Grenzen
- Übergabe sicherer Episoden an das Lernmodell
- Erzeugen von Home-Assistant-Events
- Verwaltung des High-Flow-Bypass
- Speichern und Wiederherstellen des Laufzeitzustands
- Aktualisierung der bereitgestellten Entitäten
Ausführungszeitpunkte
Die Auswertung erfolgt:
- bei Zustandsänderung eines konfigurierten Quellsensors
- zusätzlich zyklisch alle 10 Sekunden
Die internen Ticks prüfen Steuerungen und Quellenstatus, liefern aber keine Mess-Evidenz. Nur echte frische gültige Reports bestätigen Detektions- oder Quiet-Intervalle.
2. Detection Engine
Die Detection Engine ist weitgehend Home-Assistant-unabhängig und bildet vier getrennte Zustandsautomaten ab:
- Slow Leak
- Low Flow
- High Flow
- Burst Leak
Jeder Automat kennt die Phasen:
idlemonitoringactive
Monitoring vs. Active
monitoring bedeutet:
Es liegen verdächtige Messwerte vor, aber die zeitliche bzw. mengenmäßige Bestätigung ist noch nicht erfüllt.
active bedeutet:
Der Detektor hat seine Erkennungsbedingung bestätigt und erzeugt ein Ereignis mit eigener Event-ID.
Diese Trennung verhindert, dass ein kurzer normaler Wasserverbrauch sofort als Leckage gemeldet wird.
3. Event-IDs
Beim Übergang auf active erzeugt jeder Detektor eine eindeutige Ereignis-ID.
Sinngemäß:
slow_leak_20261006T123456_a1b2c3
Quittierungen sind immer an genau diese Event-ID gebunden.
Endet die physische Situation und tritt später erneut auf, entsteht eine neue Event-ID und damit ein vollständig neuer Alarmzyklus.
4. Messwertnormalisierung
Der Kern arbeitet unabhängig von der Einheit des Quellsensors.
Intern:
- Durchfluss: L/h
- Volumen: L
Negative und nicht endliche Durchflusswerte sind ungültige Messungen. Sie werden niemals als 0-Durchfluss oder Ruhe-Evidenz ausgewertet. Bestätigte Leckagen bleiben erhalten.
5. Verhalten bei Sensorausfall
Wenn der Durchflusssensor unknown, unavailable oder nicht sinnvoll konvertierbar ist:
- wird die Quelle als nicht verfügbar markiert
- bestätigter normaler Slow/Low/High-Monitoring-Fortschritt derselben Quelle bleibt nach Round7 erhalten; unbestätigte Burst-Kandidaten und Low-Stabilität werden unterbrochen
- laufende Quiet-/Reset-Zeitfenster werden verworfen
- bereits bestätigte
active-Ereignisse bleiben aus Sicherheitsgründen aktiv - die aktuelle unvollständige Lern-Episode wird verworfen
Grund:
Fehlende Messwerte sind kein Beweis für 0 L/h.
6. Volumenberechnung
Wenn ein kumulierter Gesamtverbrauchssensor vorhanden ist, wird das Ereignisvolumen bevorzugt aus dessen Differenz berechnet.
Falls nicht, integriert die Engine den Durchfluss über die Zeit.
Nach längeren HA-Ausfallzeiten wird nicht beliebig viel Volumen rückwirkend integriert; große Zeitlücken werden begrenzt.
7. Adaptive Grenzwerte
Slow und Low verwenden bewusst statische fachliche Bänder.
High verwendet eine statische Grenze; Burst kann adaptive Grenzwerte verwenden.
Dadurch wird vermieden, dass ein gelerntes hohes Haushaltsmaximum den Low-Flow-Bereich ungewollt nach oben verschiebt.
8. Notification Controller
Der Notification Controller ist von der Detection Engine getrennt.
Er verwaltet:
- konfigurierbare Companion-Empfänger
- pro Ereignis persönliche Mutes
- globale Quittierung
- Home-Zone-Prüfung
- Re-Notification beim Heimkommen
- Critical-Payload für Burst
Er kann einen Detektor nicht zurücksetzen.
9. Water-Shut-Off-Schicht
Die Engine berechnet aus allen aktiven Detektoren und deren konfigurierter Zuordnung eine unabhängige boolesche Absperranforderung.
Diese wird als Home-Assistant-Binary-Sensor bereitgestellt.
Die physische Ventilsteuerung erfolgt in der aktuellen Version bewusst außerhalb der Integration über eine Home-Assistant-Automation.
10. Persistenz
Persistiert werden unter anderem:
- Detector-Runtime
- Event-ID und Startzeit
- Quittierungszustände
- High-Flow-Bypass-Endzeit
- zugelassene Lernwerte
Nicht persistiert wird eine noch unvollständige Lern-Episode. Eine vor einem Neustart nur teilweise beobachtete Episode ist keine vertrauenswürdige Grundlage für „normales Verhalten“.
Betriebszustand ohne zweiten Detektor
WaterLeakManager.hydraulic_monitoring_status spiegelt vorhandene Annahme-,
Ausschluss- und Rebind-Entscheidungen. Der flüchtige Diagnosegrund beginnt mit
waiting_for_measurement, wird bei akzeptierter Messung verified_measurement
und bei _suspend_source() zum konkreten Ausschlussgrund. Aktiv erfordert zugleich
source_available. Die Anzeige steuert weder Evidenz noch Detektor und wird nicht
als eigener Sicherheitszustand persistiert. Sensorupdates verwenden dieselben
Manager-Listener, ohne neue Polling-Schleife oder MQTT-Subscription.
Nach Store-Restore wird MQTT einmal an den vor Store-I/O erfassten Setupbeginn
gebunden; max(gespeicherte Grenze, Setupbeginn) erhält strengere Grenzen.
Die erste gültige Messung liefert null Sekunden. Betrieb
und Sensorattribute.