HA Verlauf: mehr als 10 Tage? Long Time Statistic (LTS)
Der Verlauf in Home-Assistant zeigt standardmäßig die Statusänderungen der letzten 10 Tage und ergänzt ältere Daten für bestimmte Entitäten von der Langzeitstatistik: Long Time Statistic (LTS).
Für das Speichern von historischen Werten besitzt Home Assistant eigene Datenbank-Tabellen, wodurch als Beispiel das Energiedashboard auch Daten älter als 10 Tage anzeigen kann. Aber nicht nur das Energie-Dashboard kann die Langzeitstatistikdaten verwenden.
Entitäten mit Langzeitstatistik (LTS)
Voraussetzung für das Aufzeichnen der Langzeit-Statistikdaten (Long-term statistics = LTS) ist das Attribute "state_class" mit einer der Eigenschaften: "measurement", "total" oder "total_increasing".
Ein Blick in die Entwicklertools / Zustände verrät uns, ob eine Entität zusätzlich zu den Statusänderungen auch LTS-Daten aufzeichnet.
Sollten die Attribute fehlen, können diese über die Datei customize.yaml hinzugefügt werden.
"total_increasing": für Gesamtzähler: z.B der gesamte Energieverbrauch, oder "measurement" für Statuswerte, wie die Temperatur.
Als Beispiel wurden für einen meiner Temperatursensoren keine LTS-Daten aufgezeichnet, was auch in "Zustände" in den Entwicklerwerkzeugen ersichtlich ist:
Dem Temperatursensor fehlt offensichtlich die Eigenschaft "state_class", welche über eine Konfig-Datei hinzugefügt werden können.
Das fehlende Attribut kann in der Datei customize.yaml ergänzt werden:
sensor.eg_temperatur:
state_class: measurement
Sollte die Datei customize.yaml fehlen, kann diese einfach angelegt und in der Datei configuration.yaml erwähnt werden:
...
homeassistant:
customize: !include customize.yaml
...
Nach dem Hinzufügen der fehlenden Eigenschaft und einem Neustart von Home-Assistant werden die Attribute um "state_class" ergänzt:
Sind die Attribute vorhanden, werden die Statistiktabellen befüllt:
Historische Daten im Verlauf
Ältere Langzeitstatistikdaten können am einfachsten im Verlauf angezeigt werden:
Die aktuellen Daten der letzten 10 Tage werden im Verlauf etwas schwächer angezeigt, die Daten aus den History-Tabellen etwas stärker.
In Home Assistant inkludiert: Statistikdiagramm
Ohne zusätzlicher Integration können historische Daten über die Lovelance-Karte "Statistikdiagramm" visualisiert werden:
Bei Auswahl von 5 Minuten, sollten zuvor fehlende Statistikdaten spätestens nach 5 Minuten auftauchen:
Hier ein weiteres Beispiel für die PV-Produktion meines Balkonkraftwerks: täglich und monatlich:
Anders als beim Energiedashboard können der Zeitraum oder die anzuzeigenden Tagen derzeit noch nicht im Frontend angepasst werden: Die Werte sind in der Karte fixiert. Bis es dazu weitere Verbesserungen in Home Assistant gibt, kann auf bestimmte Custom-Repositories, wie die Plotly Graph Card zurückgegriffen werden. Plotly Graph ermöglicht ein interaktives Scrollen, Vergrößern und Verkleinern von Charts. Anfangs habe ich Plotly Graph nur für aktuelle Sensordaten eingesetzt, Plotly kann aber auch mit historischen Daten umgehen:
Plotly Graph
Die Option "period" in Plotly Graph passt die Datenpunkte an den Zoom-Faktor an und verwendet mehr oder weniger Details aus den Statistik-Tabellen. Die Plotly Graph Card kann über den Home Assistant Community Store (HACS) installiert werden.
Für die Einstellung muss Ploty Graph im YAML-Editor angepasst werden. Hier ein Beispiel für die Visualisierung eines Temperatursensors:
type: custom:plotly-graph
title: Temp
entities:
- entity: sensor.aussen_temperature
yaxis: y2
showlegend: true
show_value: true
fill: tozeroy
name: ww🌡
period: auto
fillcolor: rgba(255, 255, 0, 0.1)
line:
color: orange
smoothing: 0.5
shape: spline
width: 1
hours_to_show: 800
refresh_interval: auto
layout:
xaxis:
rangeselector:
buttons:
- count: 3
step: hour
- count: 12
step: hour
- count: 30
step: day
- count: 365
step: day
yaxis:
zeroline: true
fixedrange: true
legend:
'y': 1.05
margin:
l: 35
r: 43
Ohne der Option "period" verwendet Plotly die aktuellen Statusdaten. Ursprünglich habe ich hier zusätzlich die History-Explorer-Card vorgestellt. Nachdem Home-Assistant mittlerweile über dessen Verlauf auf die Statistikdaten zugreifen kann und mit Plotly Graph wesentlich flexiblere Cards zusammenstellt werden können, habe ich die Card nicht mehr in Verwendung und auch hier entfernt.
Was steckt hinter der LTS-Funktion?
Intern verwendet Home-Assistant verschiedene Datenbank-Tabellen für das Speichern der Daten. Die Tabelle "states" speichert sämtliche Statusänderungen, was über einen längeren Zeitraum nicht nur eine hohe Datenmenge produziert, sondern dadurch die Performance von Home-Assistant beeinflussen würde. Aus diesem Grund löscht Home Assistant Daten die älter als 10 Tage sind. Verantwortlich für das Aufräumen der Statusdaten ist die Einstellung: purge_keep_days, diese räumt Daten älter 10 Tage auf und löscht diese, siehe: www.home-assistant.io/integrations/recorder/. Das Ändern dieser Einstellung ist aber nicht unbedingt eine gute Idee, da ein längerer Zeitraum mehr Daten produziert und Home-Assistant bei einem zu hohen Wert ausgebremst wird.
Um dennoch auf Daten die älter als 10 Tage sind zugreifen zu können, ermittelt Home-Assistant für die Sensoren Durchschnitts-, Minimal- und Maximalwert und schreibt diese in eigene Tabellen:
In die Tabelle "statistics_short_term" werden alle 5 Minuten Durchschnitts-, Minimal- und Maximalwert abgelegt. Auch die Tabelle statistics_short_term verwirft Daten die älter als 10 Tage sind, genau wie dessen Ursprungstabelle "states". Anders bei der Tabelle "statistics", diese speichert die Statistik-Daten Durchschnitts-, Minimal- und Maximalwert für jede Stunde und löscht diese nicht. Ein Blick in die SQLite-Datenbank zeigt uns die Daten:
Als Format für Datum und Uhrzeit verwendet Home Assistant Unix-Timestamps:
Um den Unix-Timestamp auf ein lesbares Datum umzuwandeln, habe ich ein kleines JavaScript-Tool auf dieser Seite veröffentlicht: Datum umwandeln: Unix Timestamp
Die interne Datenbankstruktur von Home-Assistant kann auch anhand des folgenden Beispiels vermutet werden: Versuche ich in der Statistik-Karte als Zeitraum 5 Minuten einzustellen, kann diese nur bis zu 10 Tage anzeigen. Würde ich einen 11ten Tag auswählen, zeigt die Karte nichts mehr an:
Wechsle ich hingegen auf "Stunde", verwendet die Karte offensichtlich die Tabelle "statistics" und zeigt auch Daten die älter als 10 Tage sind an:
Kontrolle direkt über eine Datenbankabfrage:
Nachdem die Daten der Tabelle "statistics_short_term" alle 5 Minuten in die Datenbank geschrieben werden, sollten spätestens nach dieser Zeit Daten des Sensors in der "statistics_short_term" Tabelle erscheinen. Für zusätzliche Informationen zum Zugriff auf die Datenbank, siehe: Home Assistant SQlite - Statistik-Daten ändern
Datenbank Query:
select STRFTIME('%Y.%m.%d %H:%M', datetime(created_ts, 'unixepoch', 'localtime')) as date, * from statistics_short_term where metadata_id = (SELECT id FROM statistics_meta WHERE statistic_id = 'sensor.eg_temperatur') order by created_ts DESC;
Natürlich muss die Sensor-ID, hier "sensor.eg_temperatur" in der Query angepasst werden:
Zu jeder vollen Stunde sollte dann auch ein Eintrag in der "states"-Tabelle erscheinen, hier die entsprechende Abfrage dazu:
select STRFTIME('%Y.%m.%d %H:%M', datetime(created_ts, 'unixepoch', 'localtime')) as date, * from statistics where metadata_id = (SELECT id FROM statistics_meta WHERE statistic_id = 'sensor.eg_temperatur') order by created_ts DESC;
Fazit
Das Verhalten von Home-Assistant beim Speichern der Sensor-Daten ist mehr oder weniger ein Kompromiss aus den gespeicherten Details und dem Alter der Daten: Für die letzten 10 Tage sind sämtliche Statusänderungen verfügbar, darüber hinaus kann nur mehr im Stundenintervall auf die Statistik-Tabelle zugegriffen werden. Funktionell hat sich in Home-Assistant hier in der Vergangenheit einiges getan, dennoch kann Home Assistant beim Speichern von historischen Daten nicht mit einer Timeseries - Datenbank wie InfluxDB und beim Visualisieren mit einer Lösung wie Grafana mithalten. Wer damit leben kann, dass Daten älter als 10 Tage nur mehr stündlich verfügbar sind, findet mit Plotly Graph dennoch eine würdige Alternative.
{{percentage}} % positiv