
Jedes Mal, wenn ich die Rechnung fĂŒr Strom und Wasser bekomme, wundere ich mich â verbraucht meine Familie wirklich so viel? Ja, im Badezimmer gibt es eine FuĂbodenheizung und einen Boiler, aber die laufen doch nicht stĂ€ndig. Auch Wasser sparen wir, obwohl wir es lieben, im Bad zu planschen. Vor einigen Jahren habe ich bereits und an das Smart Home, aber damit war es dann auch. Erst jetzt habe ich endlich Zeit gefunden, den Verbrauch zu analysieren, worĂŒber dieser Artikel handelt.
KĂŒrzlich bin ich auf Home Assistant als Smart Home-System umgestiegen. Ein Grund war die Möglichkeit, eine groĂe Menge an Daten zu sammeln und dabei einfach verschiedene Diagramme zu erstellen.
Die Informationen in diesem Artikel sind nicht neu, all diese Dinge wurden unter verschiedenen VorwÀnden schon im Internet beschrieben. Aber in der Regel befasst sich jeder Artikel nur mit einem Ansatz oder Aspekt. Ich musste selbst die verschiedenen AnsÀtze vergleichen und den am besten geeigneten auswÀhlen. Der Artikel liefert zwar keine umfassenden Informationen zur Datensammlung, ist aber eine Art Zusammenfassung, wie ich es gemacht habe. Konstruktive Kritik und VerbesserungsvorschlÀge sind willkommen.
Aufgabenstellung
Die heutige Ăbung hat also das Ziel, schöne Verbrauchsdiagramme fĂŒr Wasser und Strom zu erstellen:
- StĂŒndlich ĂŒber 2 Tage
- TĂ€glich ĂŒber 2 Wochen
- (optional) wöchentlich und monatlich
Dabei stoĂen wir auf einige Schwierigkeiten:
- Standard-Diagrammkomponenten sind in der Regel recht dĂŒrftig. Im besten Fall lĂ€sst sich ein Liniendiagramm aus Punkten erstellen.
Wenn man gut sucht, kann man Drittanbieter-Komponenten finden, die die Möglichkeiten des Standarddiagramms erweitern. FĂŒr Home Assistant ist die Komponente im Grunde genommen nicht schlecht und sieht gut aus, aber auch sie hat einige EinschrĂ€nkungen:
- Es ist schwierig, die Parameter fĂŒr das SĂ€ulendiagramm ĂŒber groĂe ZeitrĂ€ume festzulegen (die Breite der SĂ€ule wird in Stundenbruchteilen angegeben, was bedeutet, dass ZeitrĂ€ume von mehr als einer Stunde in Dezimalzahlen festgelegt werden mĂŒssen)
- Man kann nicht verschiedene EntitĂ€ten (zum Beispiel Temperatur und Luftfeuchtigkeit oder ein SĂ€ulendiagramm mit einer Linie kombinieren) in ein Diagramm einfĂŒgen
- Es ist nicht nur so, dass der Home Assistant standardmĂ€Ăig die einfachste SQLite-Datenbank verwendet (und ich, ungeschickt, die Installation von MySQL oder Postgres nicht bewĂ€ltigen konnte), sondern auch, dass die Daten nicht optimal gespeichert werden. Beispielsweise wird bei jeder Ănderung eines auch nur geringfĂŒgigen digitalen Parameters ein riesiges JSON, das etwa ein Kilobyte groĂ ist, in die Datenbank geschrieben.
{"entity_id": "sensor.water_cold_hourly", "old_state": {"entity_id": "sensor.water_cold_hourly", "state": "3", "attributes": {"source": "sensor.water_meter_cold", "status": "collecting", "last_period": "29", "last_reset": "2020-02-23T21:00:00.022246+02:00", "meter_period": "hourly", "unit_of_measurement": "l", "friendly_name": "water_cold_hourly", "icon": "mdi:counter"}, "last_changed": "2020-02-23T19:05:06.897604+00:00", "last_updated": "2020-02-23T19:05:06.897604+00:00", "context": {"id": "aafc8ca305ba4e49ad4c97f0eddd8893", "parent_id": null, "user_id": null}}, "new_state": {"entity_id": "sensor.water_cold_hourly", "state": "4", "attributes": {"source": "sensor.water_meter_cold", "status": "collecting", "last_period": "29", "last_reset": "2020-02-23T21:00:00.022246+02:00", "meter_period": "hourly", "unit_of_measurement": "l", "friendly_name": "water_cold_hourly", "icon": "mdi:counter"}, "last_changed": "2020-02-23T19:11:11.251545+00:00", "last_updated": "2020-02-23T19:11:11.251545+00:00", "context": {"id": "0de64b8af6f14bb9a419dcf3b200ef56", "parent_id": null, "user_id": null}}}Ich habe ziemlich viele Sensoren (Temperatursensoren in jedem Raum, Wasser- und StromzĂ€hler), und einige davon erzeugen auĂerdem eine betrĂ€chtliche Menge an Daten. Zum Beispiel erzeugt allein der StromzĂ€hler SDM220 etwa zehn Werte alle 10-15 Sekunden, und ich wĂŒrde gerne etwa 8 solcher ZĂ€hler installieren. AuĂerdem gibt es eine ganze Reihe von Parametern, die auf der Basis anderer Sensoren berechnet werden. So können all diese Werte die Datenbank leicht tĂ€glich um 100-200 MB aufblĂ€hen. Nach einer Woche wird das System kaum noch reibungslos laufen, und nach einem Monat wird der USB-Stick (im Falle einer typischen Home Assistant-Installation auf Raspberry Pi) ausfallen, geschweige denn, dass es möglich wĂ€re, die Daten ein ganzes Jahr lang zu speichern.
- Wenn Sie GlĂŒck haben, kann Ihr ZĂ€hler selbst den Verbrauch erfassen. Sie können jederzeit den ZĂ€hler ansprechen und ihn nach dem aktuellen kumulierten Verbrauchswert fragen. In der Regel bieten alle StromzĂ€hler mit digitaler Schnittstelle (RS232/RS485/Modbus/Zigbee) diese Möglichkeit.
Schlimmer ist es, wenn das GerĂ€t einfach nur einen bestimmten Momentanwert (zum Beispiel Momentanleistung oder Strom) messen kann, oder einfach Impulse alle X Wattstunden oder Liter generiert. Dann muss man darĂŒber nachdenken, wie und womit man das integrieren und wo man die Werte speichern kann. Es besteht das Risiko, einen weiteren Bericht aus irgendeinem Grund zu verpassen, und auch die Genauigkeit des Systems insgesamt wirft Fragen auf. Man könnte natĂŒrlich alles dem Smart Home-System wie home assistant anvertrauen, aber der Punkt zur Anzahl der EintrĂ€ge in der Datenbank ist nicht aufgehoben, und eine Abfrage der Sensoren öfter als einmal pro Sekunde lĂ€sst sich nicht einrichten (Architekturbegrenzung von home assistant).
Ansatz 1
ZunĂ€chst schauen wir uns an, was home assistant standardmĂ€Ăig bietet. Die Messung des Verbrauchs ĂŒber einen Zeitraum ist eine sehr gefragte FunktionalitĂ€t. NatĂŒrlich wurde dies schon lange in Form einer spezialisierten Komponente â utility_meter â implementiert.
Der Kern der Komponente besteht darin, dass sie intern eine Variable fĂŒr den aktuellen kumulierten Wert fĂŒhrt und diese nach Ablauf des festgelegten Zeitraums (Stunde/Woche/Monat) zurĂŒcksetzt. Die Komponente ĂŒberwacht selbst die Eingangsvariable (den Wert eines Sensors), subscribiert sich selbst auf Ănderungen des Wertes â Sie erhalten einfach das fertige Ergebnis. Diese Funktion lĂ€sst sich in nur wenigen Zeilen in der Konfigurationsdatei beschreiben.
utility_meter:
water_cold_hour_um:
source: sensor.water_meter_cold
cycle: hourly
water_cold_day_um:
source: sensor.water_meter_cold
cycle: daily
Hier ist sensor.water_meter_cold der aktuelle Wert des ZĂ€hlers in Litern, den ich direkt ĂŒber MQTT erhalte. Die Konstruktion erzeugt 2 neue Sensoren water_cold_hour_um und water_cold_day_um, die stĂŒndliche und tĂ€gliche Messwerte kumulieren und diese nach Ablauf des Zeitraums zurĂŒcksetzen. Hier ist das Diagramm des stĂŒndlichen Akkumulationswertes ĂŒber einen halben Tag.

Der Code fĂŒr die stĂŒndlichen und tĂ€glichen Graphen fĂŒr die Lovelace-UI sieht so aus:
- type: history-graph
title: 'StĂŒndlicher Wasserverbrauch mit Variablen'
hours_to_show: 48
entities:
- sensor.water_hour
- type: history-graph
title: 'TĂ€glicher Wasserverbrauch mit Variablen'
hours_to_show: 360
entities:
- sensor.water_day
TatsĂ€chlich liegt in diesem Algorithmus das Problem dieser Herangehensweise. Wie ich bereits erwĂ€hnt habe, wird fĂŒr jeden Eingangswert (aktuelle ZĂ€hlerstand fĂŒr jeden nĂ€chsten Liter) ein 1kB-Datensatz in der Datenbank generiert. Jeder Utility-Meter generiert zudem einen neuen Wert, der ebenfalls in die Datenbank eingetragen wird. Wenn ich stĂŒndliche/tĂ€gliche/wöchentliche/monatliche Ablesungen sammeln möchte, und das fĂŒr mehrere Wasserleitungen, und dann noch eine Menge StromzĂ€hler hinzufĂŒgen will â das wird extrem viele Daten bedeuten. Um genauer zu sein, die Daten sind nicht viel, aber da der Home Assistant eine Menge unnötiger Informationen in die Datenbank schreibt, wird die GröĂe der Datenbank explosionsartig wachsen. Ich habe sogar Angst, die GröĂe der Datenbank fĂŒr wöchentliche und monatliche Diagramme einzuschĂ€tzen.
DarĂŒber hinaus löst der Utility-Meter das gestellte Problem nicht von selbst. Der Graph der Werte, die der Utility-Meter ausgibt, ist eine monoton wachsende Funktion, die jede Stunde auf 0 zurĂŒckgesetzt wird. Wir benötigen jedoch ein fĂŒr den Benutzer verstĂ€ndliches Diagramm des Verbrauchs, also wie viele Liter ĂŒber den Zeitraum verbraucht wurden. Der Standardkomponent history-graph kann das nicht, aber der externe Komponent mini-graph-card könnte uns helfen.
Das ist der Code fĂŒr die Karte fĂŒr die Lovelace-UI:
- aggregate_func: max
entities:
- color: var(--primary-color)
entity: sensor.water_cold_hour_um
group_by: hour
hours_to_show: 48
name: "StĂŒndlicher Wasserverbrauch aggregiert nach Utility-Meter"
points_per_hour: 1
show:
graph: bar
type: 'custom:mini-graph-card'Neben den Standardkonfigurationen wie Sensorname, Diagrammtyp, Farbe (das Standardorange gefiel mir nicht) sind hier drei Einstellungen wichtig:
- group_by:hour â das Diagramm wird so generiert, dass die Balken am Beginn der Stunde ausgerichtet sind
- points_per_hour: 1 â ein Balken pro Stunde
- Und das Wichtigste, aggregate_func: max â das maximale Wert innerhalb jeder Stunde wird genommen. Diese Einstellung verwandelt das gezackte Diagramm in Balken.

Ignorieren Sie die Reihe von Balken links â das ist das Standardverhalten des Components, wenn keine Daten vorhanden sind. Und es gab keine Daten â ich habe die Datenerfassung fĂŒr den Utility-Meter erst vor ein paar Stunden nur fĂŒr diesen Artikel aktiviert (meinen aktuellen Ansatz werde ich gleich unten erlĂ€utern).
Auf diesem Bild wollte ich zeigen, dass manchmal die Datenanzeige tatsĂ€chlich funktioniert und die Balken die richtigen Werte widerspiegeln. Nur ist das bei weitem nicht der Fall. Der hervorgehobene Balken fĂŒr den Zeitraum von 11 bis 12 Uhr zeigt aus irgendeinem Grund 19 Liter an, wĂ€hrend wir im Zacken-Grafik etwas weiter oben fĂŒr denselben Zeitraum vom selben Sensor einen Verbrauch von 62 Litern sehen. Entweder ein Bug oder es wurde falsch interpretiert. Warum die Daten rechts fehlen, habe ich noch nicht verstanden â der Verbrauch war dort im Normalbereich, was ebenfalls im Zacken-Grafik sichtbar ist.
Insgesamt ist es mir nicht gelungen, die GlaubwĂŒrdigkeit dieses Ansatzes zu erreichen â das Diagramm zeigt fast immer irgendeinen Unsinn.
Ein Ă€hnlicher Code fĂŒr den Tages-Sensor.
- aggregate_func: max
entities:
- color: var(--primary-color)
entity: sensor.water_cold_day_um
group_by: interval
hours_to_show: 360
name: "TÀglicher Wasserverbrauch aggregiert nach VersorgungszÀhler"
points_per_hour: 0.0416666666
show:
graph: bar
type: 'custom:mini-graph-card'
Beachten Sie, dass der Parameter group_by auf interval gesetzt ist und alle Punkte durch den Parameter points_per_hour bestimmt werden. Und darin liegt ein weiteres Problem dieser Komponente â points_per_hour funktioniert gut bei Diagrammen fĂŒr eine Stunde oder weniger, aber schlecht bei gröĂeren ZeitrĂ€umen. Um einen Balken fĂŒr einen Tag zu erhalten, musste ich den Wert 1/24=0.04166666 eingeben. Von wöchentlichen und monatlichen Diagrammen will ich gar nicht reden.
Ansatz 2
WĂ€hrend ich mich noch in das Home Assistant einarbeite, bin ich auf dieses Video gestoĂen:

Ein Bekannter sammelt Verbrauchsdaten von verschiedenen Arten von Xiaomi-Steckdosen. Seine Aufgabe ist etwas einfacher â einfach den Verbrauch fĂŒr heute, gestern und fĂŒr den Monat anzuzeigen. Es sind keine Diagramme erforderlich.
Lassen wir die Ăberlegungen zu der manuellen Integration von momentanen Leistungswerten beiseite â zur "Genauigkeit" dieses Ansatzes habe ich bereits oben geschrieben. Es ist unklar, warum er keine akkumulierten Verbrauchswerte verwendet hat, die bereits von derselben Steckdose gesammelt werden. Meiner Meinung nach wird eine Integration innerhalb des GerĂ€tes besser funktionieren.
Aus dem Video ĂŒbernehmen wir die Idee der manuellen Berechnung des Verbrauchs ĂŒber einen Zeitraum. Der Typ betrachtet nur die Werte fĂŒr heute und gestern, aber wir gehen weiter und versuchen, ein Diagramm zu zeichnen. Der Vorschlag besteht darin, dass ich in meinem Fall Folgendes tue.
Wir definieren die Variable wert_zum_Beginn_der_Stunde, in die wir die aktuellen ZÀhlerstÀnde schreiben.
Am Ende der Stunde (oder zu Beginn der nĂ€chsten) berechnen wir die Differenz zwischen dem aktuellen Messwert und dem zu Beginn der Stunde gespeicherten Wert. Diese Differenz wird der Verbrauch fĂŒr die aktuelle Stunde sein â wir speichern den Wert im Sensor und werden in Zukunft basierend auf diesem Wert ein Diagramm erstellen.
AuĂerdem muss die Variable wert_zu_stundenbeginn zurĂŒckgesetzt werden, indem der aktuelle Wert des ZĂ€hlers dort geschrieben wird.
All dies kann ĂŒber die Mittel von Home Assistant selbst erledigt werden.
Es wird etwas mehr Code erforderlich sein als im vorherigen Ansatz. Zuerst erstellen wir diese "Variablen". Von Haus aus haben wir keine EntitĂ€t "Variable", aber wir können die Dienste eines MQTT-Brokers nutzen. Wir werden Werte mit dem Flag retain=true dorthin senden â dies speichert den Wert im Broker, und wir können ihn jederzeit auch nach einem Neustart von Home Assistant wieder abrufen. Ich habe sowohl stĂŒndliche als auch tĂ€gliche ZĂ€hler erstellt.
- plattform: mqtt
state_topic: "test/water/hour"
name: wasser_stunde
einheit: l
- plattform: mqtt
state_topic: "test/water/hour_begin"
name: wasser_stunde_begin
einheit: l
- plattform: mqtt
state_topic: "test/water/day"
name: wasser_tag
einheit: l
- plattform: mqtt
state_topic: "test/water/day_begin"
name: wasser_tag_begin
einheit: lDie ganze Magie geschieht in der Automatisierung, die jede Stunde und jede Nacht entsprechend ausgefĂŒhrt wird.
- id: wasser_neue_stunde
alias: wasser_neue_stunde
initial_state: true
trigger:
- plattform: zeitmuster
minuten: 0
action:
- service: mqtt.publish
data:
topic: "test/water/hour"
payload_template: >
{{ (states.sensor.water_meter_cold.state|int) - (states.sensor.water_hour_begin.state|int) }}
retain: true
- service: mqtt.publish
data:
topic: "test/water/hour_begin"
payload_template: >
{{ states.sensor.water_meter_cold.state }}
retain: true
- id: wasser_neuer_tag
alias: wasser_neuer_tag
initial_state: true
trigger:
- plattform: zeit
at: "00:00:00"
action:
- service: mqtt.publish
data:
topic: "test/water/day"
payload_template: >
{{ (states.sensor.water_meter_cold.state|int) - (states.sensor.water_day_begin.state|int) }}
retain: true
- service: mqtt.publish
data:
topic: "test/water/day_begin"
payload_template: >
{{ states.sensor.water_meter_cold.state }}
retain: trueBeide Automatisierungen fĂŒhren 2 Aktionen durch:
- Sie berechnen den Wert fĂŒr das Intervall als Differenz zwischen dem Anfangs- und dem Endwert
- Sie aktualisieren den Basiswert fĂŒr das nĂ€chste Intervall
Das Erstellen von Diagrammen wird in diesem Fall mit einem normalen history-graph gelöst:
- type: history-graph
title: 'StĂŒndlicher Wasserverbrauch mit Variablen'
hours_to_show: 48
entities:
- sensor.water_hour
- type: history-graph
title: 'TĂ€glicher Wasserverbrauch mit Variablen'
hours_to_show: 360
entities:
- sensor.water_daySo sieht es aus:

Im Grunde ist dies bereits das, was benötigt wird. Ein Vorteil dieser Methode ist, dass die Daten nur einmal pro Intervall generiert werden. Das heiĂt, es gibt insgesamt 24 EintrĂ€ge pro Tag fĂŒr das Stunden-Diagramm.
Leider löst dies nicht das zugrunde liegende Problem einer wachsenden Datenbank. Wenn ich einen Monatlichen Verbrauchsbericht will, muss ich Daten mindestens fĂŒr ein Jahr speichern. Da der Home Assistant nur eine einzige Einstellung fĂŒr die Speicherdauer fĂŒr die gesamte Datenbank bietet, bedeutet das, dass alle Daten im System ein ganzes Jahr lang aufbewahrt werden mĂŒssen. Zum Beispiel verbrauche ich im Jahr 200 Kubikmeter Wasser, was 200.000 EintrĂ€gen in der Datenbank entspricht. Wenn ich dann noch andere Sensoren berĂŒcksichtige, wird die Zahl wirklich unangemessen hoch.
Ansatz 3
GlĂŒcklicherweise haben kluge Köpfe bereits dieses Problem gelöst, indem sie die Datenbank InfluxDB entwickelt haben. Diese Datenbank ist speziell fĂŒr die Speicherung zeitbasierter Daten optimiert und eignet sich hervorragend zur Speicherung von Werten verschiedener Sensoren. Das System bietet auch eine SQL-Ă€hnliche Abfragesprache, mit der man Werte aus der Datenbank abrufen und auf verschiedene Arten aggregieren kann. SchlieĂlich können unterschiedliche Daten unterschiedlich lange gespeichert werden. Zum Beispiel können hĂ€ufig wechselnde Messwerte wie Temperatur oder Luftfeuchtigkeit nur ein paar Wochen lang gespeichert werden, wĂ€hrend tĂ€gliche Wasserverbrauchswerte ein ganzes Jahr lang gespeichert werden können.
Neben InfluxDB haben kluge Köpfe auch Grafana erfunden â ein System zum Erstellen von Grafiken auf Basis von Daten aus InfluxDB. Grafana kann verschiedene Arten von Grafiken erstellen, diese detailliert anpassen und, was am wichtigsten ist, diese Grafiken können in die lovelace-UI des Home Assistant integriert werden.
Inspiriert von und . In den Artikeln wird der Prozess der Installation und Anbindung von InfluxDB und Grafana an den Home Assistant ausfĂŒhrlich beschrieben. Ich werde mich jedoch auf meine spezifische Aufgabe konzentrieren.
Also, als Erstes beginnen wir damit, den Wert des ZĂ€hlers in InfluxDB zu speichern. Ein StĂŒck der Home Assistant-Konfiguration (in diesem Beispiel werde ich mich nicht nur mit kaltem, sondern auch mit heiĂem Wasser beschĂ€ftigen):
influxdb:
host: localhost
max_retries: 3
default_measurement: state
database: homeassistant
include:
entities:
- sensor.water_meter_hot
- sensor.water_meter_coldWir deaktivieren das Speichern dieser Daten in der internen Datenbank von Home Assistant, um sie nicht unnötig aufzublÀhen:
recorder:
purge_keep_days: 10
purge_interval: 1
exclude:
entities:
- sensor.water_meter_hot
- sensor.water_meter_coldLassen Sie uns jetzt zur InfluxDB-Konsole ĂŒbergehen und unsere Datenbank konfigurieren. Insbesondere mĂŒssen wir festlegen, wie lange bestimmte Daten aufbewahrt werden. Dies wird durch die sogenannte Retention Policy geregelt â das ist Ă€hnlich wie Datenbanken innerhalb einer Hauptdatenbank, wobei jede interne Datenbank ihre eigenen Einstellungen hat. StandardmĂ€Ăig werden alle Daten in der Retention Policy mit dem Namen autogen gespeichert, diese Daten werden eine Woche lang aufbewahrt. Ich möchte, dass stĂŒndliche Daten einen Monat lang aufbewahrt werden, wöchentliche Daten ein Jahr und monatliche Daten ĂŒberhaupt nie gelöscht werden. Lassen Sie uns die entsprechenden Retention Policies erstellen.
CREATE RETENTION POLICY "month" ON "homeassistant" DURATION 30d REPLICATION 1
CREATE RETENTION POLICY "year" ON "homeassistant" DURATION 52w REPLICATION 1
CREATE RETENTION POLICY "infinite" ON "homeassistant" DURATION INF REPLICATION 1Jetzt kommt der eigentliche Trick â die Aggregation von Daten mithilfe einer Continuous Query. Dies ist ein Mechanismus, der automatisch alle festgelegten Zeitintervalle einen Query ausfĂŒhrt, die Daten zu diesem Query aggregiert und das Ergebnis in einem neuen Wert speichert. Lassen Sie uns ein Beispiel durchgehen (ich schreibe es untereinander zur besseren Lesbarkeit, aber in Wirklichkeit musste ich diesen Befehl in einer Zeile eingeben).
CREATE CONTINUOUS QUERY cq_water_hourly ON homeassistant
BEGIN
SELECT max(value) AS value
INTO homeassistant.month.water_meter_hour
FROM homeassistant.autogen.l
GROUP BY time(1h), entity_id fill(previous)
ENDDieser Befehl:
- Erstellt eine Continuous Query mit dem Namen cq_water_cold_hourly in der Datenbank homeassistant.
- Die Abfrage wird jede Stunde ausgefĂŒhrt (time(1h)).
- Die Abfrage wird alle Daten aus dem Measurement homeassistant.autogen.l (Liter) abfragen, einschlieĂlich der Messwerte fĂŒr kaltes und heiĂes Wasser.
- Die aggregierten Daten werden nach entity_id gruppiert, was uns separate Werte fĂŒr kaltes und heiĂes Wasser liefert.
- Da der LiterzĂ€hler eine monoton steigende Sequenz darstellt, muss innerhalb jeder Stunde der Höchstwert genommen werden, daher wird die Aggregation durch die Funktion max(value) durchgefĂŒhrt.
- Der neue Wert wird in homeassistant.month.water_meter_hour gespeichert, wobei month der Name der Retention Policy mit einer Aufbewahrungsdauer von einem Monat ist. Dabei werden die Daten fĂŒr kaltes und heiĂes Wasser in separaten EintrĂ€gen mit dem entsprechenden entity_id und dem Wert im Feld value gespeichert.
In der Nacht oder wenn niemand zu Hause ist, gibt es keinen Wasserverbrauch, und somit auch keine neuen EintrÀge in homeassistant.autogen.l. Um zu vermeiden, dass Werte in normalen Abfragen fehlen, kann fill(previous) verwendet werden. Dies zwingt InfluxDB, den Wert der letzten Stunde zu verwenden.
Leider hat die kontinuierliche Abfrage eine Besonderheit: der Trick fill(previous) funktioniert nicht und die DatensĂ€tze werden einfach nicht erstellt. Dabei handelt es sich um ein unĂŒberwindbares Problem, das Wir werden uns spĂ€ter mit diesem Problem befassen, und fill(previous) in der kontinuierlichen Abfrage kann bleiben â es stört nicht.
Lass uns prĂŒfen, was wir erreicht haben (natĂŒrlich mĂŒssen wir ein paar Stunden warten):
> select * from homeassistant.month.water_meter_hour group by entity_id
...
name: water_meter_hour
tags: entity_id=water_meter_cold
time value
---- -----
...
2020-03-08T01:00:00Z 370511
2020-03-08T02:00:00Z 370513
2020-03-08T05:00:00Z 370527
2020-03-08T06:00:00Z 370605
2020-03-08T07:00:00Z 370635
2020-03-08T08:00:00Z 370699
2020-03-08T09:00:00Z 370761
2020-03-08T10:00:00Z 370767
2020-03-08T11:00:00Z 370810
2020-03-08T12:00:00Z 370818
2020-03-08T13:00:00Z 370827
2020-03-08T14:00:00Z 370849
2020-03-08T15:00:00Z 370921
Bitte beachten Sie, dass die Werte in der Datenbank in UTC gespeichert werden, weshalb sie in dieser Liste um 3 Stunden abweichen â die Werte um 7 Uhr morgens in der InfluxDB-Ausgabe entsprechen den Werten um 10 Uhr morgens in den obigen Grafiken. Beachten Sie auch, dass zwischen 2 und 5 Uhr morgens einfach keine DatensĂ€tze vorhanden sind â das ist die besagte Besonderheit der kontinuierlichen Abfrage.
Wie Sie sehen können, ist der aggregierte Wert ebenfalls eine monoton wachsende Folge, nur dass die DatensĂ€tze seltener kommen â einmal pro Stunde. Aber das ist kein Problem â wir können eine weitere Abfrage schreiben, die die richtigen Daten fĂŒr das Diagramm abruft.
SELECT difference(max(value))
FROM homeassistant.month.water_meter_hour
WHERE entity_id='water_meter_cold' and time >= now() -24h
GROUP BY time(1h), entity_id
fill(previous)Ich werde das erklÀren:
- Wir ziehen Daten aus der Datenbank homeassistant.month.water_meter_hour fĂŒr entity_id='water_meter_cold' der letzten 24 Stunden (time >= now() -24h).
- Wie ich bereits erwĂ€hnt habe, können in der Reihenfolge homeassistant.month.water_meter_hour einige DatensĂ€tze fehlen. Diese Daten werden wir neu generieren, indem wir die Abfrage mit GROUP BY time(1h) ausfĂŒhren. Dieses Mal wird fill(previous) wie gewĂŒnscht funktionieren und fehlende Daten generieren (die Funktion nimmt den vorherigen Wert).
- Das Wichtigste an dieser Abfrage ist die Funktion difference, die die Differenz zwischen den stĂŒndlichen Markierungen berechnet. Sie selbst funktioniert nicht und erfordert eine aggregierende Funktion. Lassen wir es die zuvor verwendete max() sein.
Das Ergebnis sieht so aus:
name: water_meter_hour
tags: entity_id=water_meter_cold
time difference
---- ----------
...
2020-03-08T02:00:00Z 2
2020-03-08T03:00:00Z 0
2020-03-08T04:00:00Z 0
2020-03-08T05:00:00Z 14
2020-03-08T06:00:00Z 78
2020-03-08T07:00:00Z 30
2020-03-08T08:00:00Z 64
2020-03-08T09:00:00Z 62
2020-03-08T10:00:00Z 6
2020-03-08T11:00:00Z 43
2020-03-08T12:00:00Z 8
2020-03-08T13:00:00Z 9
2020-03-08T14:00:00Z 22
2020-03-08T15:00:00Z 72Von 2 bis 5 Uhr morgens (UTC) gab es keinen Verbrauch. Dennoch wird die Abfrage denselben Verbrauchswert zurĂŒckgeben, dank fill(previous), und die Funktion difference wird diesen Wert von sich selbst abziehen, sodass am Ende 0 herauskommt, was erforderlich ist.
Jetzt bleibt nur noch die Aufgabe, das Diagramm zu erstellen. Dazu öffnen wir Grafana, wĂ€hlen ein bestehendes (oder erstellen ein neues) Dashboard und fĂŒgen ein neues Panel hinzu. Die Diagrameinstellungen werden wie folgt sein.

Ich werde die Daten fĂŒr kaltes und warmes Wasser in einem Diagramm darstellen. Die Abfrage ist genau die gleiche, die ich oben beschrieben habe.
Die Anzeigeparameter werden wie folgt festgelegt. In meinem Fall wird es ein Linendiagramm (lines) sein, das in Treppenform (stairs) dargestellt wird. Den Parameter Stack werde ich gleich erlÀutern. Weiter unten gibt es noch ein paar Anzeigeparameter, die jedoch nicht so interessant sind.

Um das erhaltene Diagramm in Home Assistant einzufĂŒgen, mĂŒssen Sie:
- den Bearbeitungsmodus des Diagramms verlassen. Aus irgendeinem Grund werden die richtigen Freigabeeinstellungen fĂŒr Diagramme nur von der Dashboard-Seite aus angeboten.
- Auf das Dreieck neben dem Diagrammnamen klicken und im MenĂŒ 'share' auswĂ€hlen.
- Im sich öffnenden Fenster auf den Tab 'embed' wechseln.
- Das HĂ€kchen bei 'current time range' entfernen â den Zeitbereich werden wir ĂŒber die URL festlegen.
- Das benötigte Thema auswÀhlen. In meinem Fall ist es light.
- Die resultierende URL in die Einstellungskarte lovelace-UI kopieren.
- type: iframe
id: graf_water_hourly
url: "http://192.168.10.200:3000/d-solo/rZARemQWk/water?orgId=1&panelId=2&from=now-2d&to=now&theme=light"
Beachten Sie, dass der Zeitbereich (letzte 2 Tage) genau hier festgelegt wird und nicht in den Dashboard-Einstellungen.
So sieht das Diagramm aus. Warmwasser habe ich in den letzten 2 Tagen nicht verwendet, weshalb nur das Diagramm fĂŒr kaltes Wasser angezeigt wird.

Ich habe mich bis jetzt nicht entschieden, welches Diagramm ich besser finde, das mit Linien in Treppenform oder das mit echten SĂ€ulen. Deshalb werde ich einfach ein Beispiel fĂŒr ein Tagesdiagramm des Verbrauchs anfĂŒhren, dieses Mal jedoch mit SĂ€ulen. Die Abfragen werden Ă€hnlich wie die oben beschriebenen erstellt. Die Anzeigeparameter sind folgende:

So sieht dieses Diagramm aus:

Nun zum Parameter Stack. In diesem Diagramm wird die SĂ€ule fĂŒr kaltes Wasser ĂŒber der SĂ€ule fĂŒr warmes Wasser gezeichnet. Die Gesamthöhe entspricht dem gesamten Verbrauch von kaltem und warmem Wasser ĂŒber den Zeitraum.
Alle gezeigten Diagramme sind dynamisch. Man kann mit der Maus ĂŒber einen interessierenden Punkt fahren und die Details sowie den Wert an diesem spezifischen Punkt einsehen.
Leider kam es nicht ohne einen Hauch von Kritik aus. In dem SĂ€ulendiagramm (im Gegensatz zu einem Treppendiagramm) befindet sich die Mitte der SĂ€ule nicht zur Mitte des Tages, sondern um 00:00 Uhr. Das bedeutet, dass die linke HĂ€lfte der SĂ€ule an der Stelle des vorherigen Tages gezeichnet wird. So sind die Diagramme fĂŒr Samstag und Sonntag etwas weiter links gezeichnet als die blĂ€uliche Zone. Bis jetzt habe ich noch keine Lösung gefunden, wie ich das ĂŒberwinden kann.
Ein weiteres Problem besteht darin, dass man nicht richtig mit Monatsintervallen arbeiten kann. Der Grund dafĂŒr ist, dass die LĂ€nge von Stunde/Tag/Woche festgelegt ist, wĂ€hrend die LĂ€nge eines Monats jedes Mal unterschiedlich ist. InfluxDB kann nur mit gleichen Intervallen arbeiten. Bis jetzt hatte ich genug Verstand, um ein festes Intervall von 30 Tagen zu setzen. Ja, das Diagramm wird ĂŒber das Jahr hinweg etwas verschoben sein und die SĂ€ulen werden nicht ganz genau mit den Monaten ĂŒbereinstimmen. Aber da ich dies nur als Zeiger fĂŒr mein Interesse sehe, ist mir das egal.
Ich sehe mindestens zwei Lösungen:
- Auf monatliche Diagramme verzichten und sich mit wöchentlichen begnĂŒgen. 52 wöchentliche SĂ€ulen pro Jahr sehen ganz gut aus.
- Das monatliche Verbrauchsquantifizieren als Methode Nr. 2 zu betrachten und Grafana nur fĂŒr schöne Diagramme zu verwenden. Dadurch könnte eine ziemlich prĂ€zise Lösung entstehen. Man könnte sogar die Diagramme des vergangenen Jahres zur Vergleichung ĂŒbereinanderlegen â dafĂŒr ist Grafana auch fĂ€hig.
Fazit
Ich weiĂ nicht warum, aber ich liebe solche Diagramme. Sie zeigen, dass das Leben pulsiert und sich alles verĂ€ndert. Gestern gab es viel, heute wenig und morgen wird es irgendwie anders sein. Es bleibt nur abzuwarten, wie die BedĂŒrfnisse der Haushaltsangehörigen in Bezug auf den Verbrauch sind. Aber selbst bei den aktuellen AnsprĂŒchen verwandelt sich einfach eine groĂe und unverstĂ€ndliche Zahl auf der Abrechnung in ein deutlich verstĂ€ndlicheres Bild des Verbrauchs.
Trotz fast 20 Jahren Erfahrung als Programmierer habe ich kaum mit Datenbanken gearbeitet. Daher schien mir die Installation einer externen Datenbank etwas sehr Kompliziertes und UnverstĂ€ndliches zu sein. Alles Ă€nderte sich durch den â es stellte sich heraus, dass das Anbinden eines geeigneten Werkzeugs in wenigen Klicks erledigt werden kann und mit einem spezialisierten Werkzeug wird die Aufgabe, Diagramme zu erstellen, etwas einfacher.
Im Titel habe ich den Stromverbrauch erwĂ€hnt. Leider kann ich momentan kein einziges Diagramm prĂ€sentieren. Ein SDM120 ZĂ€hler ist defekt, und der andere hat beim Zugriff ĂŒber Modbus Probleme. Allerdings beeinflusst das das Thema dieses Artikels nicht â die Diagramme werden auf die gleiche Weise erstellt wie fĂŒr Wasser.
In diesem Artikel habe ich die AnsĂ€tze dargestellt, die ich selbst ausprobiert habe. Sicherlich gibt es noch andere Möglichkeiten zur Organisation der Datenerfassung und -visualisierung, von denen ich nichts weiĂ. ErzĂ€hlen Sie mir davon in den Kommentaren, ich wĂ€re sehr interessiert. Ich freue mich ĂŒber konstruktive Kritik und neue Ideen. Ich hoffe, das hier prĂ€sentierte Material hilft ebenfalls jemandem.
Quelle: habr.com
