Hallo Ihr Lieben,
ich setze mich gerade mit dem Thema Mustererkennung in Daten auseinander. Also nicht Texte, wo Perl ja prädestiniert wäre, sondern Muster in Zahlenreihen. Konkret ist der Hintergrund, dass ich gerne aus meinen Stromleistungsdaten/Phase die Aktivzeit(Kühlphase) von Kühl-,Gefriergeräten erkennen möchte, ohne dass ich jetzt z.B. ein device zur Strommessung explizit am jeweiligen Gerät angeschlossen habe(die devices u./o. einen Rückkanal an Aktoren könnte man sich dann sparen). Betrachtet man die Plots der Leistungsreihen, so fällt dem intelligenten Menschen sofort auf, dass die Leistungsaufnahmen der einzelnen elektr. Geräte ein sich wiederholendes deutliches Muster(Details später)/Gerät aufweisen.
Nun hab ich mal ein wenig recherchiert und stellte fest, dass es in der Theorie einiges im Internet zu finden gibt. Hier bei uns in FHEM findet sich nichts, außer dass hier und da der Bedarf geäußert wird. Ich selber sehe den Nutzen primär in der Analyse von Stromleistungsdaten, aber sicherlich gibt es auch andere Felder, wo eine allgemeine Mustererkennung in FHEM Anwendung finden könnte. Mir kommt da z.B. die Erkennung von Großwetterlagen und Heizungssteuerung in den Sinn.
Im Sinne eines Pflichtenhefts, gilt es meiner Ansicht nach zwischen 2 allgemeinen Kernfunktionalitäten bei der Mustererkennung zu unterscheiden:
1. eigenständige
erstmalige Erkennung von bisher
unbekannten Mustern(also etwas, was ich als KI bezeichnen würde) aus beliebigen Datenreihen
2. Anwendung eines
bekannten/definierten Musters, um dessen
erneutes/wiederholtes Auftreten zu erkennen(das ist für mich kein KI, sondern "simple" Datenverarbeitung)
Wenn jemand einen Link auf Theorie oder gar Algorithmen, Code-Schnipsel beisteuern kann, freue ich mich über eine Dokumentation in diesem Thread.
Das oben unter 1. als "erstmalige Mustererkennung" bezeichnete, sehe ich erst einmal als nicht einfach u. schnell realisierbar an. Die Definition und Anwendung eines Musters halte ich hingegen in der FHEM-Umsetzung für realistisch. Dabei möchte ich mich über 2 beispielhafte Gerätetypen an das Ziel herantasten:
1. Kühl-/Gefrier-/Klimageräte, die aufgrund ihres Kompressors ein außergewöhnliches, typisches Muster erkennen lassen
2. Bewegungsmelder, die etwas schalten, was dann zu einem typischen Rechteckverlauf in den Daten führt
Zu 1.: Die Geräte haben eine typische Leistungsspitze nach dem Einschalten. Relativ schnell sinkt die Leistungsaufnahme ein wenig auf ein Niveau ab, das dann dauerhaft und fast gleichbleibend bis zum Abschalten gehalten wird
Ein-/Ausschaltperioden sind relativ konstant und wiederholen sich zyklisch
Zu 2.: Viele elektr. Geräte weisen einen typischen Rechteckverlauf auf. Die Leistungsaufnahme ist über die Einschaltdauer konstant(Konstantverbraucher).
Die Einschaltdauer beim BM ist in der Regel über einen Einstellmechanismus vordefiniert. Die Leistungsaufnahme über die direkt(oder per FHEM indirekt) angeschlossenen Verbraucher ist konstant. Die Ausschaltdauer ist undefiniert.
Wie könnte man das nun technisch in FHEM definieren/realisieren ?
Wir haben heute bereits devices, die über Attributdefinitionen in anderen devices ihre Funktionalität definieren. Mir kommt da als Erstes das Alarmmodul in den Sinn. Hier werden ja auch die funktionsspezifischen Eigenschaften über Attribute in den vorhandenen Sensor-/Aktor-devices definiert.(per UI zentral, aber technisch im jeweiligen device)
Erste Ansätze zu Algorithmen bzw. notwendigen Attributen(oder nur eins, vergleichbar dem Alarmmodul ?)
Zu 1.(Kompressorgeräte):
- Einschaltzeitpunkt(t0): Anstieg der Leistungsaufnahme um xW (currentval = oldval + x <==> x = currentval - oldval)
- Einschaltphase(t1-t0) beendet(t1): Absenkung der Leistungsaufnahme um yW (y = z% * x

)
- Aktivphase: relativ konstante Leistung x-y
(diese Phase ist vergleichbar einem Konstantverbraucher)
- Abschaltung(t2; t2-t1): Leistungsaufnahme sinkt um xW-yW
- Ausschaltperiode t3: "Notfalleigenschaft" um ggfs. ein nicht erkanntes t0 zu übersteuern
Zu 2.(Konstantverbraucher primär BM)
- Einschaltzeitpunkt(t0): Anstieg der Leistungsaufnahme um xW (currentval = oldval + x <==> x = currentval - oldval)
- Aktivphase: relativ konstante Leistung x
- Abschaltung(t1): Leistungsaufnahme sinkt um xW
- Einschaltdauer Delta t: "Notfalleigenschaft" um ggfs. ein nicht erkanntes t1 zu übersteuern
Unter Idealbedingungen(z.B. nachts) ist die Erkennung noch realtiv einfach. Im normalen Tagesablauf wird die Erkennung durch permanentes An-/Abschalten von Verbrauchern, Nicht-Konstantverbrauchern(z.B. E-Herd, Mikrowelle, Wasch-/Spülmaschine) und Eigenerzeugern erschwert. Und manche Geräte schwanken ja auch mehr oder weniger in ihrer Leistungsaufnahme.
Deshalb bedarf es Filter, die den Verlauf glätten, die Leistungsaufnahme von Nicht-Konstantverbrauchern(in der Regel Leistungsaufnahmen > 0,5 kW) ausfiltern u. Abweichungen von konkret definierten Werten von devices "tolerieren".
Die ersten beiden Filterfunktionen sehe ich in einer zentralen Logik/device. "Toleranzparameter" zu jedem Leistungs- u. Zeitparameter als Attribut in dem jeweiligen device.
Last but not least ist die Performance zu berücksichtigen. Je besser und dann komplizierter eine Lösung wird, um so kritischer wird es für die Performance des Gesamtsystems. Es ist deshalb sicherlich sinnvoll den zentralen Abgleich der Daten per BlockingCall auszulagern. Längerfristig wird eine Lösung dauerhaft ausgelagert werden müssen, also sich Modulen wie Sub- oder CoProcess bedienen müssen.
Ich habe den Thread bewusst im Development-Forum eröffnet, weil es keine Frage von Bedarf u. nice-to-have Funktionalitäten ist, sondern die Problematik in der technischen Umsetzung liegt.
Jegliche Beiträge mit Anregung, Kritik, Ergänzung.... sind willkommen.
@pah:
falls Du den Beitrag liest, bin ich einerseits ganz besonders an Deiner Meinung interessiert, weil ich ja technisch eine Ähnlichkeit zu Deinem Alarm-Modul sehe, aber auch, weil Du immer wieder erwähnst, dass Deine Studenten sich mit FHEM beschäftigen (müssen ?). Wäre das nicht ein Thema für studentische Aktivitäten ? Vielleicht auch vom e.V. finanziell gefördert ?
Grüße Markus