Neues Modul PresenceSimulation: historienbasierte Anwesenheitssimulation

Begonnen von Flachzange, 20 Juni 2026, 14:52:05

Vorheriges Thema - Nächstes Thema

Flachzange


Ich möchte ein neues FHEM-Modul zur historienbasierten Anwesenheitssimulation vorstellen:

PresenceSimulation auf GitHub

Vorweg: Das Modul ist mit Hilfe von KI erstellt worden

Seit Jahren schwebt mir vor, dass sich unserer Haus bei Abwesenheit nach außen genauso verhalten soll, als wenn wir daheim wären. Ursprünglich hatte ich hier hier ein neuronales Netz vor Augen, aber es geht eigentlich viel einfacher. Die mir bisher bekannten FHEM-Module fand ich hier jedoch entweder zu wenig automatisch oder zu statisch, insbesondere weil sich das Verhalten über das Jahr hinweg ja ständig ändert. Im Unterschied zu RandomTimer oder dem Abspielen fest gespeicherter Szenen lernt PresenceSimulation aus realen Ein- und Ausschaltvorgängen der konfigurierten FHEM-Geräte. In den meisten Smart-Homes liegen diese Ereignisse ja vor und erlauben so eine rollierende Betrachtung über das Jahr hinweg.

Das Modul ist nicht auf Lampen beschränkt. Grundsätzlich können beliebige Geräte verwendet werden, deren Ein- und Ausschaltzustände über ein Reading erkannt und die über FHEM-Befehle geschaltet werden können.

Als Trainingsquelle können laufende FHEM-Events und bereits vorhandene Daten aus DbLog dienen. DbLog-Daten lassen sich manuell oder täglich automatisch importieren. Schaltziel und Zustandserkennung können bei Bedarf auf unterschiedlichen FHEM-Devices liegen.

Aus den abgeschlossenen Ein-/Ausschalt-Sessions erzeugt das Modul ein rollierendes Wahrscheinlichkeitsmodell. Für jedes konfigurierte Gerät und jeden Zeitblock wird anhand der historischen Daten ermittelt, wie wahrscheinlich eine Einschaltung ist.

Bei einer positiven Entscheidung wird eine Startzeit aus den historischen Startpositionen innerhalb des Zeitblocks gezogen. Die Einschaltdauer wird ebenfalls aus den historischen Sessions abgeleitet. Dadurch entstehen neue Abläufe, die den erlernten Gewohnheiten statistisch ähneln, ohne einen vergangenen Tag lediglich unverändert wiederzugeben.

Aktuell unterstützt das Modul unter anderem:

  • Training aus laufenden FHEM-Events
  • manuelle und automatische, nicht blockierende DbLog-Importe
  • getrennt konfigurierbare Trainings- und Aufbewahrungszeiträume
  • optionale wochentagsspezifische Modelle
  • frei konfigurierbare Readings, Ein-/Aus-Erkennung und Schaltbefehle
  • getrennte Devices für Schaltbefehle und Zustandserkennung
  • Dry-Run-Modus ohne reale Schaltbefehle
  • globale und gerätespezifische Sperrbedingungen, z.B. muss man ja nicht das Licht einschalten, wenn die Jalousien geschlossen sind.
  • erneute Prüfung zunächst blockierter Schaltpläne innerhalb des aktuellen Zeitblocks
  • Erkennung und Berücksichtigung manueller Eingriffe
  • sicheres Playback, bei dem nur vom Modul selbst eingeschaltete Geräte verwaltet werden
  • eine konfigurierbare eventFn zur Weiterverarbeitung erzeugter Simulationsereignisse
  • persistente Rohdaten und Laufzeitinformationen mit Sicherungs- und Wiederherstellungsmechanismen

Das Wahrscheinlichkeitsmodell selbst wird nicht als separate Datei gespeichert. Persistiert werden die historischen Rohdaten und der Laufzeitstatus; das Modell wird daraus bei Bedarf neu aufgebaut.

Beispiel aus meiner Installation

In meiner eigenen Installation sind derzeit 17 Geräte konfiguriert. Das Modell verwendet 60 Trainingstage und basiert aktuell auf mehr als 1.500 erfassten Sessions.

Neben normalen Lichtaktoren verwende ich auch ein Beispiel, bei dem Schaltziel und Zustandserkennung getrennt sind: Die Befehle für den Fernseher werden an ein DOIF gesendet, während der tatsächliche Zustand über ein KODI-Device erkannt und trainiert wird. Grund ist, dass der Einschaltprozess für den Fernseher einige Zusatzschritte benötigt und nicht nur über "on" funktioniert.

Ein verkürzter Auszug:

define PresenceSim PresenceSimulation
attr PresenceSim dbLogDevice logdb
attr PresenceSim device01 device=Lichtaktor_EG_Buero reading=state onRegex=^on$ offRegex=^off$ onCommand=on offCommand=off minDuration=1 maxDuration=240
attr PresenceSim device02 device=Lichtaktor_EG_Buero_2 reading=state onRegex=^on$ offRegex=^off$ onCommand=on offCommand=off minDuration=1 maxDuration=240
attr PresenceSim device17 device=DOIF_PresenceSimulation_TV onCommand=cmd_1 offCommand=cmd_2 reading=state readingDevice=KODI onRegex=(?i:^(opened|connected)$) offRegex=(?i:^disconnected$) minDuration=1 maxDuration=240
attr PresenceSim globalBlock01 [DOIF_Weather_Brightness:state] > 800
attr PresenceSim eventFn msg @Bewohner msgPrio="" msgText="$EVENT"
attr PresenceSim trainingDays 60
attr PresenceSim retentionDays 90

Die vollständige und kommentierte Beispielkonfiguration befindet sich im Repository:

examples/PresenceSimulation_real_world.cfg

Geräte-, Reading-, Empfänger- und DbLog-Namen müssen an die eigene FHEM-Installation angepasst werden.

Empfohlener Einstieg

Vor einem echten Playback sollte zunächst vorhandene DbLog-Historie importiert oder das Event-Training verwendet werden:

set PresenceSim importDbLog 60
get PresenceSim importInfo
get PresenceSim modelInfo
set PresenceSim mode dryrun

Erst nach Kontrolle der im Dry Run erzeugten simulationEvent-Ereignisse sollte das reale Playback aktiviert werden. Das könnte man auch automatisch machen, wenn das Haus verlässt, die Alarmanlage scharf schaltet etc.

set PresenceSim mode playback

Der aktuelle Stand ist Version 1.1.8. Das Modul ist als testing/experimental gekennzeichnet.

Das Modul wurde iterativ mit starker Unterstützung von ChatGPT entwickelt, von mir fachlich geprüft und in meiner eigenen FHEM-Installation praktisch getestet.

Ich freue mich über Rückmeldungen, weitere Tester, Fehlerberichte und Hinweise auf bestehende FHEM-Module oder andere Lösungen mit einer vergleichbaren historienbasierten beziehungsweise statistischen Funktionsweise.

Grüße
Chris