Sensordaten glätten: Durchschnitt, Min/Max und Ausreißer abfangen

Stell Dir vor, Du hast drei Temperatursensoren im Wohnzimmer. Einer zeigt 21,4 Grad, der zweite 21,8 Grad und der dritte 20,9 Grad. Alle drei sind korrekt kalibriert und liegen im selben Raum – trotzdem verrät Dir keiner von ihnen eindeutig, wie warm es im Wohnzimmer tatsächlich ist. Genau um dieses Problem geht es in diesem Beitrag: Wie Du mehrere Rohwerte zu einem einzigen, verlässlichen Wert zusammenführst und Ausreißer herausfilterst, bevor sie Deine Automationen durcheinanderbringen.

🎥 Das dazugehörige Video mit allen Beispielen „live“ in Home Assistant gibt’s hier:

Sie sehen gerade einen Platzhalterinhalt von YouTube. Um auf den eigentlichen Inhalt zuzugreifen, klicken Sie auf die Schaltfläche unten. Bitte beachten Sie, dass dabei Daten an Drittanbieter weitergegeben werden.

Mehr Informationen
Sensordaten in Home Assistant glätten

Der technische Rahmen: Helfer oder YAML

Alles, was ich Dir in diesem Beitrag zeige, läuft über einen Template-Sensor. Dafür hast Du zwei Wege zur Auswahl: Entweder klickst Du Dich über die Oberfläche zum Ziel (unter Einstellungen > Geräte und Dienste > Helfer > Helfer erstellen > Template), oder Du legst ihn direkt in YAML an, wenn Du mehr Kontrolle möchtest. Beide Wege führen zum selben Ergebnis. Hier zeige ich Dir die YAML-Variante, weil sie sich einfach besser lesen lässt.

template:
  - sensor:
      - name: "Wohnzimmer Temperatur"
        unique_id: wohnzimmer_temperatur_glatt
        unit_of_measurement: "°C"
        state: >
          {{ 0 }}

Das ist Dein Grundgerüst: Ein neuer Sensor mit einem eigenen Namen und einem state, der berechnet wird, statt direkt von einem Gerät zu kommen. Genau in dieses state-Feld packen wir jetzt die eigentlichen Funktionen.

Ein kurzer Hinweis noch, bevor wir loslegen: Ich habe die Sensoren und Werte in diesem Beitrag bewusst einfach gehalten. In Deiner Praxis hast Du vielleicht fünf statt drei Sensoren oder verwendest ganz andere Namen. Es geht hier ausschließlich darum, Dir das Prinzip zu zeigen, und nicht um eine komplette Konfiguration.

Erstens: average fasst mehrere Werte zu einem zusammen

Die Funktion average nimmt mehrere Werte entgegen und gibt Dir den Durchschnitt zurück.

{{ average(
     state_attr('climate.wohnzimmer_rechts_4', 'current_temperature'),
     state_attr('climate.thermostat_wohnzimmer_l', 'current_temperature'),
     state_attr('climate.thermostat_esstisch', 'current_temperature')
   ) }}

Hier übergibst Du average drei Werte, einfach durch Kommas getrennt. Da die drei Thermostate die Temperatur nicht als normalen Zustand, sondern als Attribut liefern, nutzt Du hier state_attr anstelle von states – ergänzt um den Attributnamen current_temperature. Dein Ergebnis ist ein einzelner Wert: der Durchschnitt aus allen dreien.

Fällt jedoch eines der drei Thermostate kurz aus, bekommst Du einen Fehler, denn average erwartet durchgehend Zahlen. Falls mal ein Sensor nicht liefert, ist hier genau dieselbe Absicherung sinnvoll, die ich Dir schon im ersten Video dieser Reihe unter dem Stichwort default gezeigt habe.

Zweitens: clamp begrenzt Ausreißer

Mit clamp begrenzt Du einen Wert auf einen Bereich, den Du selbst festlegen kannst.

{{ states('sensor.wohnzimmer_temp_1') | float | clamp(-30, 50) }}

Springt einer Deiner Wohnzimmer-Sensoren durch einen kurzen Wackelkontakt für eine einzelne Messung auf 70 Grad, würde eine Automation ohne Absicherung diesen Wert ungeprüft übernehmen. Mit clamp(-30, 50) wird jeder Wert, der unter minus 30 oder über 50 Grad liegt, auf die jeweilige Grenze gestutzt. Der Ausreißer verschwindet damit zwar nicht komplett aus Deiner Statistik, aber er kann Deine Automationen nicht mehr durcheinanderbringen.

Solche kurzen Aussetzer sind in der Praxis gar nicht so selten – gerade bei günstigeren Funksensoren. Ein einziger wackeliger Messwert reicht schon aus, um Deine Heizungs- oder Lüftungs-Automation für einen Moment komplett in die falsche Richtung laufen zu lassen. Genau diesen einen Moment fängst Du mit clamp ab.

Drittens: remap übersetzt Wertebereiche

Die Funktion remap übersetzt einen Wert aus einem Wertebereich in einen anderen. Ein sehr verbreiteter Fall dafür ist die WLAN-Signalstärke. Viele Geräte liefern Dir diese nur als dBm-Wert: minus 30 bedeutet exzellenten Empfang, minus 90 steht für kaum noch nutzbaren Empfang. Für die wenigsten von uns ist das auf Anhieb wirklich greifbar.

{{ states('sensor.irgendein_geraet_wifi_signal') | float | remap(-90, -30, 0, 100) }}

Mit remap(-90, -30, 0, 100) übersetzt Du genau diesen Bereich in eine Prozentangabe. So kannst Du den Wert sofort einordnen, ohne die Umrechnungsformel jedes Mal von Hand hinschreiben zu müssen.

Alles zusammen: ein veredelter Sensor

Jetzt führen wir das Ganze zusammen: Du baust Dir einen einzigen Sensor, der die drei Wohnzimmer-Temperaturen mittelt und gleichzeitig Ausreißer abfängt.

template:
  - sensor:
      - name: "Wohnzimmer Temperatur"
        unique_id: wohnzimmer_temperatur_glatt
        unit_of_measurement: "°C"
        state: >
          {{ average(
               state_attr('climate.wohnzimmer_rechts_4', 'current_temperature') | float | clamp(-30, 50),
               state_attr('climate.thermostat_wohnzimmer_l', 'current_temperature') | float | clamp(-30, 50),
               state_attr('climate.thermostat_esstisch', 'current_temperature') | float | clamp(-30, 50)
             ) | round(1) }}

Dein Ergebnis ist ein Sensor, den Du Dir wie jeden anderen im Dashboard anzeigen lassen kannst. Der große Unterschied: Dahinter steckt keine einzelne, mal mehr und mal weniger zuverlässige Messung. Stattdessen nutzt Du eine Zusammenfassung mehrerer Werte – sauber bereinigt um die Ausreißer, die sonst für Ärger gesorgt hätten.

Fazit

Deine Rohdaten direkt ins Dashboard zu packen, ist zwar der einfachste Weg, aber selten der zuverlässigste. Ein Template-Sensor, der mehrere Werte zusammenführt und Ausreißer abfängt, kostet Dich einmal ein paar Minuten Arbeit. Danach hast Du aber einen Wert, dem Du vertrauen kannst – völlig egal, was einer der einzelnen Sensoren gerade treibt.

Dieser Beitrag ist der zweite Teil der kleinen Reihe über Stolpersteine und Besonderheiten bei Templates in Home Assistant, es folgt also noch mehr davon!