# Verhaltensmodell und Berechnung ## Datenfluss 1. Nutzer wählt einen Aktor. 2. `ActuatorReconciliationService` ordnet Kontext-Entities zu. 3. `BehaviorEngine.train()` liest Aktor- und Kontexthistorie. 4. Aktor-Zustandswechsel werden als `BehaviorPattern` gespeichert. 5. `BehaviorEngine.evaluate()` vergleicht aktuelle Zustände mit den Mustern. 6. Shadow zeigt nur die Vorhersage. Active darf sie ausführen. ## Herkunft und Gewicht - HA-Benutzer: `source=user`, Gewicht `1.0` - eindeutig erkannte HA-Automation oder Script: `source=automation`, Gewicht `1.0` - physisch oder unbekannt: `source=physical_or_unknown`, Gewicht `0.7` - eigene SillyHome-Ausführung: wird verworfen Manuelle und eindeutig automatisierte Handlungen zählen für die Freigabe. ## Kausale Muster Wechselt ein Kontextsensor höchstens drei Sekunden vor der Aktorhandlung, wird der Wechsel gespeichert: ```text binary_sensor.tuer: off -> on light.raum: off -> on ``` Eine kausale Vorhersage gilt nur, wenn derselbe Kontextzustand frisch ist. Das Standardfenster ist zweimal `SILLYHOME_PREDICTION_INTERVAL_SECONDS`. ## Nicht-kausale Bewertung Für Muster ohne frischen Trigger: ```text score = weight * ( 0.45 * time_score + 0.45 * context_score + 0.10 * weekday_score ) ``` Die Confidence ist der mittlere Score, begrenzt durch die Mindestunterstützung: ```text confidence = mean(scores) * min(1, support / min_behavior_actions) ``` ## Ausführungsbedingungen Eine Vorhersage wird nur ausgeführt, wenn alle Bedingungen erfüllt sind: - Betriebsart `active` - Confidence mindestens `SILLYHOME_PREDICTION_CONFIDENCE` - Zielzustand ist noch nicht erreicht - Domain und Zustand sind erlaubt - Cooldown erlaubt die Aktion Der Cooldown sperrt nur eine schnelle Wiederholung desselben Zielzustands. Eine Gegenaktion, beispielsweise `on` gefolgt von `off`, bleibt sofort erlaubt. ## Freigabe `activation_ready=true`, wenn: - Verhaltensstatus `trained` - mindestens `SILLYHOME_MIN_BEHAVIOR_ACTIONS` eindeutig zugeordnete manuelle oder automatisierte Handlungen vorhanden sind Die UI zeigt `activation_reason` immer an.