Glättung/Mittelwertbildung von Messsignalen >> einfaches Homematic-Skript

Problemlösungen und Hinweise von allgemeinem Interesse zur Haussteuerung mit HomeMatic

Moderator: Co-Administratoren

Benutzeravatar
funkleuchtturm
Beiträge: 2362
Registriert: 13.06.2011, 16:42
Hat sich bedankt: 23 Mal
Danksagung erhalten: 355 Mal
Kontaktdaten:

Glättung/Mittelwertbildung von Messsignalen >> einfaches Homematic-Skript

Beitrag von funkleuchtturm » 07.06.2023, 11:01

Aktuelle und weitere Informationen zu diesem Thema auf meiner Webseite
mittelwert_1.jpg
Ausgangssituation
Oft sind die Sensorsignale-Signale sehr dynamisch und mit regellosen Störsignalen überlagert, so daß es manchmal ganz hilfreich sein kann , wenn man diese Messsignale  "glättet". Der Elektroniker macht das meistens mit einem Tiefpass in Form eines sehr einfachen RC-Gliedes. Bei SmartHome Steuerungen liegen die Signale aber meistens als Information auf dem Controller vor, so daß es nicht möglich ist, die Signale hardwaremäßig zu glätten. Die Lösung ist in diesem Fall mit Software-Methoden anzustreben.

Lösungsansätze
Wenn man die KI-Suchmaschine Bing befragt: "wie kann man Messsignale glätten?" , dann erhält man von Bing folgende hilfreiche Antwort:

Es gibt verschiedene Methoden, um Messsignale zu glätten, die je nach Art und Zweck des Signals angewendet werden können.

Eine häufige Methode ist die Verwendung eines RC-Tiefpasses, der ein elektronisches Filter ist, das nur niedrige Frequenzen durchlässt und hohe Frequenzen unterdrückt. Das Rauschen ist meist eine hochfrequente Störung, die sich dem Messsignal überlagert. Durch einen RC-Tiefpass kann das Rauschen reduziert und der Mittelwert des Messsignals ermittelt werden.

Eine andere Methode ist die Fouriertransformation, die ein mathematisches Verfahren ist, das ein Messsignal in seine spektralen Komponenten zerlegt. Das Spektrum zeigt an, welche Frequenzen in dem Signal enthalten sind und wie stark sie sind. Durch eine Fouriertransformation kann man das Signal vom Rauschen trennen, indem man nur die gewünschten Frequenzbereiche berücksichtigt und die anderen ignoriert.

Eine weitere Methode ist die Derivativ-Methode oder Ableitungs-Methode, die eine mathematische Operation ist, die die Änderungsrate eines Signals bestimmt. Durch eine Ableitung kann man überlappende Signale auflösen, indem man zusätzliche Extrema erzeugt. Zum Beispiel kann man zwei Absorptionsbanden in einem Spektrometer unterscheiden, indem man die erste oder zweite Ableitung des Signals bildet.

Es gibt noch andere Methoden, wie z.B. den gleitenden Mittelwert, den exponentiell geglätteten Durchschnitt oder den linear gewichteten gleitenden Durchschnitt, die das arithmetische Mittel von einer festen oder variablen Anzahl von Datenpunkten berechnen, die sich mit dem Signal verschieben oder alle bisherigen Datenpunkte berücksichtigen. Diese können gleichgewichtet oder gewichtet sein, um den neueren oder älteren Daten mehr oder weniger Bedeutung zu geben.

Der "Softwerker" ist schnell dabei, mit dem gleitenden Mittelwert das Problem zu lösen. Der "Hardwerker" ist mit dem Lötkolben und wenigen elektronischen Bauteilen mit einem RC-Tiefpass schnell am Ziel. Entsprechende Lösungsansätze für die Verwendung in Verbindung mit der Homematic kann man u.a. in den entsprechenden Foren finden.

Hier möchte ich einen besonders einfachen Ansatz zeigen, bei dem ein RC-Tiefpass durch eine mathematische Simulation näherungsweise nachgebildet wird.

Grundlagen zur Nachbildung eines RC-Tiefpasses
Mit der Homematic kann man rechentechnisch Informationen nur mit einem HM-Skript bearbeiten. Das reicht aber aus, um einen RC-Tiefpass nachzubilden. Bei dem Skript hat man ein ungefiltertes Eingangssignal "signal_in" , das von einem Sensor oder Aktor kommen kann. Dieses "signal_in" kann man mit folgender Formel zu dem geglätteten neuen "signal_avg" mit folgender Formel umrechnen :

signal_avg  =  signal_avg  + ( k * (signal_in - signal_avg) )

Dabei wird diese Formel zyklisch in einem bestimmten Zeitabstand (delta) ausgeführt.  Während beim Hardware-RC-Glied die sog. Zeitkonstante  sich mit T = R*C berechnet, ist beim dieser Nachbildung die Zeitkonstante näherungsweise  T = delta / k.   Die Konstante k ist 1, wenn keinerlei Tiefpasswirkung erreicht werden soll. Je kleiner diese Konstante k wird, desto stärker ist die Tiefpasswirkung. Üblicherweise liegt k zwischen 0.02 (starke Mittelung)  und 0.5 (schwache Mittelung) bzw. 1.0 (keine Mittelung). Die Abtastrate delta liegt bei den typischen Homematic-Signalen (z.B. Temperatur) bei 1 bis 3 Minuten.  Man sollte nicht kleiner als 1 min werden, weil das die CCU nur unnötig belastet.

Umsetzung auf der CCU 
Das HM-Skript wird zyklisch (bei mir alle 2 min) ausgelöst. Das zugehörige WebUI-Programm sieht so aus:
mittelwert_WebUI.jpg
Das HM-Skript muß natürlich den speziellen eigenen Anforderungen angepasst werden. Das ist mit den auskommentierten Erklärungen im Skript (Zeilen beginnen mit ! ) aber ganz leicht. Und nicht vergessen, zur Ausgabe des gemittelten Messsignals vorher auf der CCU eine Systemvariable "signal_avg" vom Typ Zahl anlegen:

Code: Alles auswählen

!stall.biz >> HM-Skript zur Glaettung von Messsignalen
!vorher auf der CCU eine Systemvariable "signal_avg" vom Typ Zahl anlegen
!dieses Skript zyklisch aufrufen >> z.B. alle 2min
!Zeitkonstante T = Abtastzeit / k
!############ Hinweis #########################################
! Um das Signal_von den verschiedenen HM-Produkten/Datenquellen zu holen, muss man leider so abfragen:
! dom.GetObject("BidCos-RF.HEQ08155716:1.DATENPUNKT").Value() >> fuer HM Funk
! dom.GetObject("HmIP-RF.000BC081516A:0.DATENPUNKT").Value() >> fuer HM IP Funk
! dom.GetObject("BidCos-Wired.AB081516:0.DATENPUNKT").Value() >> fuer HM wired
! dom.GetObject("HmIP-RF.0001151617HG:0.DATENPUNKT").Value() >> fuer HM IP wired
! dom.GetObject("name_systemvariable").Value() >> fuer Systemvariable
!############ HM-Skript #########################################
real k = 0.05; !Werte zwischen 0.02 und 1.0 je nach Mittelung
real signal_in = dom.GetObject("BidCos-RF.IEQ0405570:1.TEMPERATURE").Value(); !Holen des zu glaettenden Messwertes
real signal_avg = dom.GetObject("signal_avg").Value(); ! letzten gemittelten wert von "signal_avg" holen
signal_avg = signal_avg + ( k * (signal_in - signal_avg) ); !neue mittelung
dom.GetObject("signal_avg").State(signal_avg); !gemittelten Wert in Systemvariable signal_avg zuruck
!WriteLine('hallo Welt');
Dieses Skript verwendet im Gegensatz zur gleitenden Mittelwertberechnung sehr wenig Resourcen, so daß man ohne weiteres die Mittelung auch bei mehreren Messignalen anwenden kann. Notwendig ist die Definition nur einer zusätzlichen Systemvariablen, die auch gleichzeitig der Ausgangswert ist. Insbesondere bei kleinen Abtastzeiten bis 1min kann es sinnvoll sein, den CuxD-Timer für die regelmässige Auslösung des Skriptes zu verwenden, weil der Standard-Timer der CCU manchmal Zuverlässigkeitsprobleme hat. Ich selbst hatte damit bisher keine Probleme, aber in Foren wird manchmal darüber berichtet.

Ich verwende diese Mittelwertbildung beispielsweise bei diesem einfachen Sonnensensor oder bei diesem beim mir schon 10 Jahre sehr gut funktionierenden Sonnensensor. Deren Temperatur schwankt bei wolkigem Himmel sehr stark, so daß die von diesem Wert gesteuerten Beschattungsmaßnahmen manchmal sehr "unruhig" agieren. Mit der hier dargestellten Mittelwertbildung werden diese Aktionen weitaus ruhiger.  Die folgenden Aufzeichnungen zeigen das originale Temperatursignal und das gemittelte Signal mit einer Abtastrate von 2min und einem k-Wert von 0.05 was einer Mittelungszeit T von etwa 40min entspricht.
mittelwert_1.jpg
Zuletzt geändert von funkleuchtturm am 07.06.2023, 15:30, insgesamt 1-mal geändert.
Viele Gruesse
Eugen
________________________________________________
SmartHome-Eintopf mit feinem Homeduino-Gemüse
... und für Feinschmecker gibt´s den WIFFI, den WEATHERMAN-2, den PULSECOUNTER und den AIRSNIFFER
mit vielen Kochrezepten für den ambitionierten Homematiker

MichaelN
Beiträge: 9562
Registriert: 27.04.2020, 10:34
System: CCU
Hat sich bedankt: 696 Mal
Danksagung erhalten: 1608 Mal

Re: Einfaches Homematic-Skript zur Glättung/Mittelwertbildung von Messsignalen

Beitrag von MichaelN » 07.06.2023, 11:27

Also gleitender Mittelwert geht mit noch weniger Ressourcen, da man die Einzelwerte gar nicht speichern muss :

viewtopic.php?f=43&t=10182&p=750572#p750572
LG, Michael.

Wenn du eine App zur Bedienung brauchst, dann hast du kein Smarthome.

Wettervorhersage über AccuWeather oder OpenWeatherMap+++ Rollladensteuerung 2.0 +++ JSON-API-Ausgaben auswerten +++ undokumentierte Skript-Befehle und Debugging-Tipps +++

Benutzeravatar
funkleuchtturm
Beiträge: 2362
Registriert: 13.06.2011, 16:42
Hat sich bedankt: 23 Mal
Danksagung erhalten: 355 Mal
Kontaktdaten:

Re: Einfaches Homematic-Skript zur Glättung/Mittelwertbildung von Messsignalen

Beitrag von funkleuchtturm » 07.06.2023, 12:17

MichaelN hat geschrieben:
07.06.2023, 11:27
Also gleitender Mittelwert geht mit noch weniger Ressourcen, da man die Einzelwerte gar nicht speichern muss :
Das stimmt nicht, denn dafür wird bei den Verfahren, die ich kenne, eine spezielle "umfangreiche" Systemvariable verwendet, in die die einzelnen Messwerte eingespeichert und herausgenommen werden. Ein gleitender Mittelwert verwendet immer für die mehr oder weniger vielen Messpunkte bzw. entsprechend viele Speicher, das ist bei diesem Verfahren so vorgegeben. Die Messwertspeicher kann man natürlich in einer sehr komplexen Systemvariable unterbringen, aber im Vergleich zu diesem Verfahren ist das ungleich komplexer.

Bei diesem Verfahren wird nur eine "einfache" Systemvariable vom Typ Zahl verwendet, die gleichzeitig das gemittelte Ausgangssignal enthält.
Für die gesamte Mittelung sind nur 5 Programmzeilen notwendig, welche die CCU nur sehr gering belasten :D
Ich halte zudem von einem gleitenden Mittelwert bei Messsignalen recht wenig, weil alle Abtastungen bei der Mittelung gleichwertig sind, auch die alten Messwerte. Bei diesem Verfahren haben die neueren Messwerte ein hoehere Wertigkeit als die alten, was m.E. für die Auswertung von Messsignalen meistens sinnvoller ist. Deshalb verwenden die Hardwerker zur Glättung von Messignalen seit ewigen Zeiten das RC-Glied oder andere Tiefpässe. Das ist erprobt, einfach und gut!

... aber jeder kann das ja machen wie er will!
Viele Gruesse
Eugen
________________________________________________
SmartHome-Eintopf mit feinem Homeduino-Gemüse
... und für Feinschmecker gibt´s den WIFFI, den WEATHERMAN-2, den PULSECOUNTER und den AIRSNIFFER
mit vielen Kochrezepten für den ambitionierten Homematiker

MichaelN
Beiträge: 9562
Registriert: 27.04.2020, 10:34
System: CCU
Hat sich bedankt: 696 Mal
Danksagung erhalten: 1608 Mal

Re: Glättung/Mittelwertbildung von Messsignalen >> einfaches Homematic-Skript

Beitrag von MichaelN » 07.06.2023, 15:51

Ach, du bist dem link gar nicht gefolgt
LG, Michael.

Wenn du eine App zur Bedienung brauchst, dann hast du kein Smarthome.

Wettervorhersage über AccuWeather oder OpenWeatherMap+++ Rollladensteuerung 2.0 +++ JSON-API-Ausgaben auswerten +++ undokumentierte Skript-Befehle und Debugging-Tipps +++

Benutzeravatar
funkleuchtturm
Beiträge: 2362
Registriert: 13.06.2011, 16:42
Hat sich bedankt: 23 Mal
Danksagung erhalten: 355 Mal
Kontaktdaten:

Re: Glättung/Mittelwertbildung von Messsignalen >> einfaches Homematic-Skript

Beitrag von funkleuchtturm » 07.06.2023, 16:55

MichaelN hat geschrieben:
07.06.2023, 15:51
Ach, du bist dem link gar nicht gefolgt
Natürlich, aber das was Du im Skript berechnest ist kein "gleitender Mittelwert", sondern was ganz anderes:
Deine Rechnung: MW = (MW * ((n-1.0)/n)) + (Messung / n)
>> Mit n = 24 wird das einfach >> MW = (23 * MW + Messung ) /24

Beim gleitenden Mittelwert werden n Messwerte einzeln gespeichert und darüber der Mittelwert gebildet. Ein neuer Messwert wird "vorne eingeschoben" und der älteste Messwert fällt hinten raus. Bei Deiner Berechnung fällt hinten der aktuelle Mittelwert raus und nicht der wirklich älteste Wert.
"Irgendwie" wird auch damit eine Mittelung realisiert, das ist aber eben kein gleitender Mittelwert!
Viele Gruesse
Eugen
________________________________________________
SmartHome-Eintopf mit feinem Homeduino-Gemüse
... und für Feinschmecker gibt´s den WIFFI, den WEATHERMAN-2, den PULSECOUNTER und den AIRSNIFFER
mit vielen Kochrezepten für den ambitionierten Homematiker

Benutzeravatar
Henke
Beiträge: 1500
Registriert: 27.06.2022, 20:51
System: CCU
Hat sich bedankt: 133 Mal
Danksagung erhalten: 304 Mal

Re: Glättung/Mittelwertbildung von Messsignalen >> einfaches Homematic-Skript

Beitrag von Henke » 07.06.2023, 22:00

funkleuchtturm hat geschrieben:
07.06.2023, 11:01
Die folgenden Aufzeichnungen zeigen das originale Temperatursignal und das gemittelte Signal mit einer Abtastrate von 2min und einem k-Wert von 0.05 was einer Mittelungszeit T von etwa 40min entspricht.
40 min plus/minus wie viel ms? :D
Wenn ich mir das Diagramm ansehe, so wurde ich sagen der berechnete Mittelwert sollte um etwa 20min in die Vergangenheit verschoben werden.

Benutzeravatar
funkleuchtturm
Beiträge: 2362
Registriert: 13.06.2011, 16:42
Hat sich bedankt: 23 Mal
Danksagung erhalten: 355 Mal
Kontaktdaten:

Re: Glättung/Mittelwertbildung von Messsignalen >> einfaches Homematic-Skript

Beitrag von funkleuchtturm » 08.06.2023, 07:49

Henke hat geschrieben:
07.06.2023, 22:00
Wenn ich mir das Diagramm ansehe, so wurde ich sagen der berechnete Mittelwert sollte um etwa 20min in die Vergangenheit verschoben werden.
Jede Mittelwertberechnung ist mit einer Zeitverzögerung verbunden. Bei sinusförmigen Signalen nennt man das Phasenverschiebung.
Viele Gruesse
Eugen
________________________________________________
SmartHome-Eintopf mit feinem Homeduino-Gemüse
... und für Feinschmecker gibt´s den WIFFI, den WEATHERMAN-2, den PULSECOUNTER und den AIRSNIFFER
mit vielen Kochrezepten für den ambitionierten Homematiker

Benutzeravatar
Henke
Beiträge: 1500
Registriert: 27.06.2022, 20:51
System: CCU
Hat sich bedankt: 133 Mal
Danksagung erhalten: 304 Mal

Re: Glättung/Mittelwertbildung von Messsignalen >> einfaches Homematic-Skript

Beitrag von Henke » 08.06.2023, 09:14

Henke hat geschrieben:
07.06.2023, 22:00
Jede Mittelwertberechnung ist mit einer Zeitverzögerung verbunden.
... die durch Verschiebung korrigiert werden kann und sollte.

Gehört für dich der Swinging Door auch zur Mittelwertberechnung?
Er wird zumindest mit der klassischen Mittelwertberechnung verglichen und dann ist die Aussage falsch.
LINK https://pdfs.semanticscholar.org/fe00/b ... fce467.pdf

PS. Das ist der Algorithmus, den ich für die meisten Datenpunkte verwende. Temperatur, Feuchte, DC, CS, etc.
Läuft Prima und das auch bei Werten wie der Vorlauftemperatur der Zirkulationspumpe.Werte, die plötzlich ansteigen und durch eine Mittelwertbildung/Tiefpass keine sinnvollen Daten liefern.

Benutzeravatar
funkleuchtturm
Beiträge: 2362
Registriert: 13.06.2011, 16:42
Hat sich bedankt: 23 Mal
Danksagung erhalten: 355 Mal
Kontaktdaten:

Re: Glättung/Mittelwertbildung von Messsignalen >> einfaches Homematic-Skript

Beitrag von funkleuchtturm » 08.06.2023, 10:26

Henke hat geschrieben:
08.06.2023, 09:14
Gehört für dich der Swinging Door auch zur Mittelwertberechnung?
Das ist für meinen einfachen Geist viel zu kompliziert und Algorithmen, die ich nicht durchschaue, möchte ich nicht verwenden :mrgreen:

Kannst Du denn mit wenigen einfachen Worten das Wesen dieses Algrithmus erklären?
Henke hat geschrieben:
08.06.2023, 09:14
Läuft Prima und das auch bei Werten wie der Vorlauftemperatur der Zirkulationspumpe.Werte, die plötzlich ansteigen und durch eine Mittelwertbildung/Tiefpass keine sinnvollen Daten liefern.
Ich verwende in meinem https://www.stall.biz/project/wiffi-pum ... WIFFI-Pump die Vorlauftemperatur oder genauer die Änderung der Vorlauftemperatur zur Steuerung der Zirkulationspumpe. Diese Temperatur darf natürlich auf keinen Fall tiefpassgefiltert werden.
Henke hat geschrieben:
08.06.2023, 09:14
... die durch Verschiebung korrigiert werden kann und sollte.
Wie soll das denn funktionieren? Dazu müßte man doch die Messwerte "voraussehen" können.
Zuletzt geändert von funkleuchtturm am 08.06.2023, 18:40, insgesamt 1-mal geändert.
Viele Gruesse
Eugen
________________________________________________
SmartHome-Eintopf mit feinem Homeduino-Gemüse
... und für Feinschmecker gibt´s den WIFFI, den WEATHERMAN-2, den PULSECOUNTER und den AIRSNIFFER
mit vielen Kochrezepten für den ambitionierten Homematiker

Benutzeravatar
Henke
Beiträge: 1500
Registriert: 27.06.2022, 20:51
System: CCU
Hat sich bedankt: 133 Mal
Danksagung erhalten: 304 Mal

Re: Glättung/Mittelwertbildung von Messsignalen >> einfaches Homematic-Skript

Beitrag von Henke » 08.06.2023, 11:31

Zur Implementierung sollte man den Algorithmus verstehen. Sonst wird das hart...
funkleuchtturm hat geschrieben:
08.06.2023, 10:26
Kannst Du denn mit wenigen einfachen Worten das Wesen dieses Algrithmus erklären?
Durch die ersten beiden Datenpunkte (Zeit,Wert - konstantes Zeitintervall ist nicht nötig) wird eine Lineare mit oberen und unteren Fehlerbereich gebildet. Ist der nächste Datenpunkt innerhalb des Fehlerbereiches wird nichts ausgegeben und die Fehlerbereiche/Lineare angepasst.
Das erste Bild im Link zeigt das.

Ich habe das soweit geändert, so das ich auf die Berechnungen zugreifen kann und z.B. daraus den aktuellen Wert ermitteln kann.
Beispiel Temperatur Pufferspeicher. Die fällt so schön linear, das stundenlang kein neuer Wert kommt. Für die Diagramme brauche ich aber den aktuellen Wert, damit sie nicht in der Mitte aufhören und für andere Berechnungen sende ich den im 30 Minuten Takt.
Henke hat geschrieben:
08.06.2023, 09:14
Wie soll das denn funktionieren? Dazu müßte man doch die Messwerte "voraussehen" können.
Für Diagramme reicht es die Zeit entsprechend zu ändern. Der Blick in die Zukunft für eine Steuerung wäre über die Methode oben möglich, jedoch etwas aufwendiger insbesondere wenn es nicht linear ist.

Antworten

Zurück zu „HomeMatic Tipps & Tricks - keine Fragen!“