Smart Home: Wasser- und Stromverbrauch im Home Assistant grafisch darstellen

Smart Home: Wasser- und Stromverbrauch im Home Assistant grafisch darstellen
Jedes Mal, wenn ich eine Zahlung für Strom und Wasser erhalte, frage ich mich: Verbraucht meine Familie wirklich sooooo viel? Nun ja, es gibt eine Fußbodenheizung und einen Boiler im Badezimmer, aber sie sind nicht ständig als Feuerwehrleute im Einsatz. Wir scheinen auch Wasser zu sparen (obwohl wir auch gerne im Badezimmer planschen). Vor ein paar Jahren habe ich schon angeschlossene Wasserzähler и Elektrizität zu einem Smart Home, aber hier blieb es hängen. Die Hände sind erst jetzt bei der Verbrauchsanalyse angelangt, um die es in diesem Artikel eigentlich geht.

Ich bin kürzlich auf Home Assistant als mein Smart-Home-System umgestiegen. Einer der Gründe war einfach die Möglichkeit, die Sammlung großer Datenmengen zu organisieren und gleichzeitig verschiedene Arten von Diagrammen bequem zu erstellen.

Die in diesem Artikel beschriebenen Informationen sind nicht neu, all diese Dinge unter verschiedenen Soßen wurden bereits im Internet beschrieben. Aber jeder Artikel beschreibt in der Regel nur einen Ansatz oder Aspekt. Ich musste alle diese Ansätze vergleichen und selbst den am besten geeigneten auswählen. Der Artikel liefert noch keine erschöpfenden Informationen zur Datenerhebung, ist aber eine Art Zusammenfassung, wie ich es gemacht habe. Konstruktive Kritik und Verbesserungsvorschläge sind daher willkommen.

Formulierung des Problems

Das Ziel der heutigen Übung besteht also darin, schöne Diagramme des Wasser- und Stromverbrauchs zu erstellen:

  • Stündlich für 2 Tage
  • Täglich für 2 Wochen
  • (optional) wöchentlich und monatlich

Dabei gibt es einige Schwierigkeiten:

  • Die Standard-Diagrammkomponenten sind in der Regel recht dürftig. Im besten Fall können Sie ein Liniendiagramm nach Punkten erstellen.

    Wenn Sie gut suchen, können Sie Komponenten von Drittanbietern finden, die die Funktionen des Standarddiagramms erweitern. Für den Heimassistenten im Prinzip eine gute und schöne Komponente Mini-Grafikkarte, aber es ist auch etwas eingeschränkt:

    • Es ist schwierig, die Parameter des Balkendiagramms bei großen Intervallen festzulegen (die Breite des Balkens wird in Bruchteilen einer Stunde eingestellt, was bedeutet, dass Intervalle, die länger als eine Stunde sind, in Bruchzahlen eingestellt werden).
    • Sie können einem Diagramm keine verschiedenen Elemente hinzufügen (z. B. Temperatur und Luftfeuchtigkeit oder ein Balkendiagramm mit einer Linie kombinieren).
  • Der Heimassistent verwendet nicht nur standardmäßig die primitivste SQLite-Datenbank (und ich als Handwerker beherrsche die Installation von MySQL oder Postgres nicht), die Daten werden auch nicht optimal gespeichert. So wird beispielsweise bei jeder Änderung jedes noch so kleinen digitalen Parameters ein riesiger JSON mit einer Größe von etwa einem Kilobyte 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 einige Sensoren (Temperatursensoren in jedem Raum, Wasser- und Stromzähler) und einige generieren auch ziemlich viele Daten. Beispielsweise erzeugt nur der Stromzähler SDM220 alle 10-15 Sekunden etwa ein Dutzend Werte, und ich möchte 8 solcher Zähler installieren. Und es gibt auch eine ganze Reihe von Parametern, die auf Basis anderer Sensoren berechnet werden. Das. Alle diese Werte können die Datenbank täglich leicht um 100-200 MB aufblähen. In einer Woche wird sich das System kaum hin und her bewegen, und in einem Monat wird das Flash-Laufwerk sterben (im Fall einer typischen Installation von Home Assistant auf Raspberry PI), und von einer Datenspeicherung für ein ganzes Jahr kann keine Rede sein .

  • Wenn Sie Glück haben, kann Ihr Zähler den Verbrauch selbst zählen. Sie können sich jederzeit an den Zähler wenden und nachfragen, wie spät der kumulierte Verbrauchswert ist. Eine solche Möglichkeit bieten grundsätzlich alle Stromzähler, die über eine digitale Schnittstelle (RS232/RS485/Modbus/Zigbee) verfügen.

    Schlimmer noch, wenn das Gerät einfach einen Momentanparameter messen kann (z. B. Momentanleistung oder -strom) oder einfach alle X Wattstunden oder Liter Impulse erzeugen kann. Dann müssen Sie darüber nachdenken, wie und womit Sie es integrieren und wo Sie Wert akkumulieren können. Es besteht die Gefahr, dass der nächste Bericht aus irgendeinem Grund verpasst wird, und die Genauigkeit des Systems insgesamt wirft Fragen auf. Sie können das alles natürlich einem Smart-Home-System wie dem Home Assistant anvertrauen, aber niemand hat den Punkt über die Anzahl der Einträge in der Datenbank gestrichen, und mehr als einmal pro Sekunde die Sensoren abzufragen, wird nicht funktionieren (eine Einschränkung des Home Assistant-Architektur).

Ansatz 1

Sehen wir uns zunächst an, welcher Heimassistent im Lieferumfang enthalten ist. Die Messung des Verbrauchs über einen Zeitraum ist eine stark nachgefragte Funktionalität. Natürlich wurde es vor langer Zeit als spezielle Komponente implementiert – Utility_Meter.

Der Kern der Komponente besteht darin, dass sie die darin enthaltene Variable „current_accumulated_value“ startet und nach einem bestimmten Zeitraum (Stunde/Woche/Monat) zurücksetzt. Die Komponente selbst überwacht die eingehende Variable (den Wert einer Art Sensor), abonniert Änderungen im Wert selbst – Sie erhalten lediglich das fertige Ergebnis. Dieses Ding wird in nur wenigen Zeilen in der Konfigurationsdatei beschrieben

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 erhalte direkt aus dem Eisen von mqtt. Das Design erstellt zwei neue Sensoren, Water_cold_hour_um und Water_cold_day_um, die stündliche und tägliche Messwerte sammeln und sie nach einer gewissen Zeit auf Null zurücksetzen. Hier ist eine Grafik der stündlichen Batterie für einen halben Tag.

Smart Home: Wasser- und Stromverbrauch im Home Assistant grafisch darstellen

Der Stunden- und Tagesdiagrammcode für lovelace-UI sieht folgendermaßen aus:

      - type: history-graph
        title: 'Hourly water consumption using vars'
        hours_to_show: 48
        entities:
          - sensor.water_hour

      - type: history-graph
        title: 'Daily water consumption using vars'
        hours_to_show: 360
        entities:
          - sensor.water_day

Tatsächlich liegt in diesem Algorithmus das Problem dieses Ansatzes. Wie bereits erwähnt, wird für jeden eingehenden Wert (der aktuelle Zählerstand für jeden nächsten Liter) 1 KB eines Datensatzes in der Datenbank generiert. Jeder Verbrauchszähler generiert außerdem einen neuen Wert, der ebenfalls zur Basis addiert wird. Wenn ich stündliche/tägliche/wöchentliche/monatliche Messwerte sammeln möchte, ja, für mehrere Wasserleitungen und sogar ein Paket Stromzähler hinzufügen möchte, werden das viele Daten sein. Genauer gesagt gibt es nicht viele Daten, aber da der Heimassistent eine Menge unnötiger Informationen in die Datenbank schreibt, wird die Größe der Datenbank sprunghaft wachsen. Ich habe sogar Angst, die Größe der Basis für Wochen- und Monatsdiagramme abzuschätzen.

Darüber hinaus löst der Verbrauchszähler selbst das Problem nicht. Die Darstellung des Versorgungszählers ist eine monoton ansteigende Funktion, die jede Stunde auf 0 zurückgesetzt wird. Außerdem benötigen wir eine benutzerfreundliche Verbrauchstabelle, wie viele Liter in dem Zeitraum verzehrt wurden. Die Standard-History-Graph-Komponente leistet dies nicht, aber die externe Mini-Graph-Card-Komponente kann uns helfen.

Dies ist der Kartencode für lovelace-UI:

      - aggregate_func: max
        entities:
          - color: var(--primary-color)
            entity: sensor.water_cold_hour_um
        group_by: hour
        hours_to_show: 48
        name: "Hourly water consumption aggregated by utility meter"
        points_per_hour: 1
        show:
          graph: bar
        type: 'custom:mini-graph-card'

Zusätzlich zu den Standardeinstellungen wie Sensorname, Diagrammtyp, Farbe (das Standard-Orange gefiel mir nicht) ist es wichtig, hier drei Einstellungen zu beachten:

  • group_by:hour – das Diagramm wird mit Spalten generiert, die am Anfang der Stunde ausgerichtet sind
  • point_per_hour: 1 – ein Balken pro Stunde
  • Und am wichtigsten ist, dass „aggregate_func: max“ innerhalb jeder Stunde den Maximalwert annimmt. Es ist dieser Parameter, der das Sägezahndiagramm in Balken umwandelt.

Smart Home: Wasser- und Stromverbrauch im Home Assistant grafisch darstellen

Achten Sie nicht auf die Spaltenreihe auf der linken Seite – dies ist das Standardverhalten der Komponente, wenn keine Daten vorhanden sind. Aber es gab keine Daten – ich habe die Datenerfassung mit dem Stromzähler erst vor ein paar Stunden für diesen Artikel aktiviert (meinen aktuellen Ansatz beschreibe ich etwas weiter unten).

Mit diesem Bild wollte ich zeigen, dass die Datenanzeige manchmal sogar funktioniert und die Balken wirklich die richtigen Werte wiedergeben. Aber das ist nicht alles. Aus irgendeinem Grund zeigt die hervorgehobene Spalte für den Zeitraum von 11 bis 12 Uhr 19 Liter an, obwohl wir in der gezähnten Grafik, die für denselben Zeitraum und denselben Sensor etwas höher liegt, einen Verbrauch von 62 Litern sehen. Entweder ein Käfer oder die Hände sind schief. Aber ich verstehe immer noch nicht, warum die Daten rechts abgebrochen sind – der Verbrauch war dort normal, was auch aus der Zahngrafik ersichtlich ist.

Im Allgemeinen ist es mir nicht gelungen, die Plausibilität dieses Ansatzes zu erreichen – die Grafik zeigt fast immer eine Art Häresie.

Ähnlicher Code für den Tagessensor.

      - aggregate_func: max
        entities:
          - color: var(--primary-color)
            entity: sensor.water_cold_day_um
        group_by: interval
        hours_to_show: 360
        name: "Daily water consumption aggregated by utility meter"
        points_per_hour: 0.0416666666
        show:
          graph: bar
        type: 'custom:mini-graph-card'

Bitte beachten Sie, dass der Parameter „group_by“ auf „Intervall“ eingestellt ist und der Parameter „points_per_hour“ alles regelt. Und das ist ein weiteres Problem dieser Komponente: „points_per_hour“ funktioniert gut bei Diagrammen von einer Stunde oder weniger, bei größeren Intervallen jedoch ekelhaft. Um also eine Spalte an einem Tag zu erhalten, musste ich den Wert 1/24=0.04166666 eingeben. Ich spreche nicht von wöchentlichen und monatlichen Charts.

Ansatz 2

Während ich mich noch mit dem Heimassistenten beschäftigte, stieß ich auf dieses Video:


Der Kamerad sammelt Verbrauchsdaten von mehreren Arten von Xiaomi-Steckdosen. Seine Aufgabe ist etwas einfacher: Zeigen Sie einfach den Verbrauchswert für heute, gestern und für den Monat an. Keine Diagramme erforderlich.

Lassen wir die Argumente zur manuellen Integration von Momentanleistungswerten beiseite – über die „Genauigkeit“ dieses Ansatzes habe ich oben bereits geschrieben. Es ist nicht klar, warum er nicht die kumulierten Verbrauchswerte verwendet hat, die bereits von derselben Verkaufsstelle erhoben werden. Meiner Meinung nach wird die Integration im Inneren des Eisenstücks besser funktionieren.

Aus dem Video übernehmen wir die Idee, den Verbrauch für einen Zeitraum manuell zu zählen. Für einen Mann werden nur die Werte für heute und für gestern berücksichtigt, wir gehen aber noch einen Schritt weiter und versuchen, eine Grafik zu zeichnen. Der Kern der in meinem Fall vorgeschlagenen Methode ist wie folgt.

Wir erstellen eine Variable value_at_the_beginning_of_hour, in die wir die aktuellen Zählerstände schreiben
Gemäß dem Timer am Ende der Stunde (oder am Anfang der nächsten) berechnen wir die Differenz zwischen dem aktuellen Messwert und dem zu Beginn der Stunde gespeicherten Wert. Diese Differenz stellt den Verbrauch für die aktuelle Stunde dar. Wir speichern den Wert im Sensor und erstellen in Zukunft ein Diagramm basierend auf diesem Wert.
Sie müssen außerdem die Variable value_at_beginning_of_hour „zurücksetzen“, indem Sie dort den aktuellen Wert des Zählers schreiben.

All dies kann gut erledigt werden ... mit dem Heimassistenten selbst.

Sie müssen etwas mehr Code schreiben als beim vorherigen Ansatz. Beginnen wir mit diesen „Variablen“. Standardmäßig verfügen wir nicht über die Entität „Variable“, Sie können jedoch die Dienste eines MQTT-Brokers nutzen. Wir werden Werte mit dem Flag „retain=true“ dorthin senden – dadurch wird der Wert im Broker gespeichert und kann jederzeit abgerufen werden, auch wenn der Heimassistent neu gestartet wird. Ich habe gleichzeitig Stunden- und Tageszähler erstellt.

- platform: mqtt
  state_topic: "test/water/hour"
  name: water_hour
  unit_of_measurement: l

- platform: mqtt
  state_topic: "test/water/hour_begin"
  name: water_hour_begin
  unit_of_measurement: l

- platform: mqtt
  state_topic: "test/water/day"
  name: water_day
  unit_of_measurement: l

- platform: mqtt
  state_topic: "test/water/day_begin"
  name: water_day_begin
  unit_of_measurement: l

Die ganze Magie geschieht in der Automatisierung, die jede Stunde bzw. jede Nacht läuft.

- id: water_new_hour
  alias: water_new_hour
  initial_state: true
  trigger:
    - platform: time_pattern
      minutes: 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: water_new_day
  alias: water_new_day
  initial_state: true
  trigger:
    - platform: time
      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: true

Beide Automatisierungen bewirken zwei Dinge:

  • Berechnen Sie den Wert pro Intervall als Differenz zwischen Start- und Endwert
  • Aktualisieren Sie den Basiswert für das nächste Intervall

Die Konstruktion von Graphen wird in diesem Fall durch den üblichen Verlaufsgraphen gelöst:

      - type: history-graph
        title: 'Hourly water consumption using vars'
        hours_to_show: 48
        entities:
          - sensor.water_hour

      - type: history-graph
        title: 'Daily water consumption using vars'
        hours_to_show: 360
        entities:
          - sensor.water_day

Es sieht so aus:

Smart Home: Wasser- und Stromverbrauch im Home Assistant grafisch darstellen

Im Prinzip ist das bereits das, was Sie brauchen. Der Vorteil dieser Methode besteht darin, dass die Daten einmal pro Intervall generiert werden. Diese. insgesamt 24 Einträge pro Tag für das Stundendiagramm.

Leider löst dies immer noch nicht das allgemeine Problem einer wachsenden Basis. Wenn ich eine monatliche Verbrauchsgrafik möchte, muss ich die Daten mindestens ein Jahr lang speichern. Und da Home Assistant nur eine Speicherdauereinstellung für die gesamte Datenbank bereitstellt, bedeutet dies, dass ALLE Daten im System ein ganzes Jahr lang gespeichert werden müssen. Ich verbrauche beispielsweise in einem Jahr 200 Kubikmeter Wasser, das bedeutet 200000 Einträge in der Datenbank. Und wenn man andere Sensoren berücksichtigt, wird die Zahl im Allgemeinen unanständig.

Ansatz 3

Glücklicherweise haben kluge Köpfe dieses Problem bereits gelöst, indem sie die InfluxDB-Datenbank geschrieben haben. Diese Datenbank ist speziell für die Speicherung zeitbasierter Daten optimiert und eignet sich hervorragend zur Speicherung von Werten unterschiedlicher Sensoren. Das System bietet außerdem eine SQL-ähnliche Abfragesprache, mit der Sie Werte aus der Datenbank extrahieren und diese dann auf verschiedene Arten aggregieren können. Schließlich können unterschiedliche Daten für unterschiedliche Zeiten gespeichert werden. Beispielsweise können sich häufig ändernde Messwerte wie Temperatur oder Luftfeuchtigkeit nur für ein paar Wochen gespeichert werden, während tägliche Messwerte des Wasserverbrauchs ein ganzes Jahr lang gespeichert werden können.

Neben InfluxDB haben kluge Köpfe auch Grafana erfunden, ein System zum Zeichnen von Diagrammen aus Daten von InfluxDB. Grafana kann verschiedene Arten von Diagrammen zeichnen, sie im Detail anpassen und, was am wichtigsten ist, diese Diagramme können in den Home Assistant von lovelace-UI „eingesteckt“ werden.

sei inspiriert hier и hier. Die Artikel beschreiben detailliert den Prozess der Installation und Verbindung von InfluxDB und Grafana mit Home Assistant. Ich werde mich auf die Lösung meines spezifischen Problems konzentrieren.

Beginnen wir also zunächst mit dem Hinzufügen des Zählerwerts in influxDB. Ein Teil der Home-Assist-Konfiguration (in diesem Beispiel werde ich nicht nur mit kaltem, sondern auch mit heißem Wasser Spaß haben):

influxdb:
  host: localhost
  max_retries: 3
  default_measurement: state
  database: homeassistant
  include:
    entities:
      - sensor.water_meter_hot
      - sensor.water_meter_cold

Deaktivieren wir die Speicherung derselben Daten in der internen Datenbank des Home Assistant, um sie nicht noch einmal aufzublähen:

recorder:
  purge_keep_days: 10
  purge_interval: 1
  exclude:
    entities:
      - sensor.water_meter_hot
      - sensor.water_meter_cold

Gehen wir nun zur InfluxDB-Konsole und richten unsere Datenbank ein. Insbesondere müssen Sie konfigurieren, wie lange bestimmte Daten gespeichert werden. Dies wird durch das sogenannte geregelt. Aufbewahrungsrichtlinie – diese ähnelt Datenbanken innerhalb der Hauptdatenbank, wobei jede interne Datenbank ihre eigenen Einstellungen hat. Standardmäßig werden alle Daten der Aufbewahrungsrichtlinie namens Autogen hinzugefügt. Diese Daten werden eine Woche lang gespeichert. Ich möchte, dass stündliche Daten einen Monat lang gespeichert werden, wöchentliche Daten ein Jahr lang und monatliche Daten überhaupt nicht gelöscht werden. Wir erstellen entsprechende Aufbewahrungsrichtlinien

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 1

Tatsächlich besteht der Haupttrick in der Datenaggregation mithilfe kontinuierlicher Abfragen. Hierbei handelt es sich um einen Mechanismus, der in bestimmten Intervallen automatisch eine Abfrage startet, die Daten für diese Abfrage aggregiert und das Ergebnis einem neuen Wert hinzufügt. Schauen wir uns ein Beispiel an (ich schreibe aus Gründen der Lesbarkeit in eine Spalte, 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) 
END

Dieser Befehl:

  • Erstellt eine kontinuierliche Abfrage mit dem Namen cq_water_cold_hourly in der Homeassistant-Datenbank
  • Die Abfrage wird stündlich ausgeführt (Zeit(1h))
  • Die Abfrage ruft alle Daten aus der Messung „a homeassistant.autogen.l“ (Liter) ab, einschließlich der Messwerte für kaltes und heißes Wasser
  • Aggregierte Daten werden nach „entity_id“ gruppiert, wodurch separate Werte für Kalt- und Warmwasser erstellt werden.
  • Da der Literzähler eine monoton ansteigende Folge innerhalb jeder Stunde ist, müssen Sie den Maximalwert nehmen, sodass die Aggregation durch die Funktion max(value) durchgeführt wird
  • Der neue Wert wird in homeassistant.month.water_meter_hour geschrieben, wobei Monat der Name der Aufbewahrungsrichtlinie mit einer Aufbewahrungsfrist von einem Monat ist. Darüber hinaus werden Daten zu Kalt- und Warmwasser in separate Datensätze mit der entsprechenden entity_id und dem Wert im Wertfeld aufgeteilt

Nachts oder wenn niemand zu Hause ist, erfolgt kein Wasserverbrauch und dementsprechend gibt es auch keine neuen Aufzeichnungen in homeassistant.autogen.l. Um fehlende Werte in normalen Abfragen zu vermeiden, können Sie fill( previous) verwenden. Dadurch wird InfluxDB gezwungen, den Wert der letzten Stunde zu verwenden.

Leider weist die kontinuierliche Abfrage eine Besonderheit auf: Der Fill( previous)-Trick funktioniert nicht und es werden einfach keine Datensätze erstellt. Darüber hinaus ist dies eine Art unüberwindbares Problem, das wird seit mehr als einem Jahr diskutiert. Wir werden uns später mit diesem Problem befassen und die Funktion „fill( previous)“ in der kontinuierlichen Abfrage beibehalten – es stört nicht.

Schauen wir uns an, was passiert ist (natürlich müssen Sie 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

Beachten Sie, dass die Werte in der Datenbank in UTC gespeichert sind, sodass sich diese Liste um 3 Stunden unterscheidet – die 7-Uhr-Werte in der InfluxDB-Ausgabe stimmen mit den 10-Uhr-Werten in den obigen Diagrammen überein. Beachten Sie auch, dass es zwischen 2 und 5 Uhr morgens einfach keine Datensätze gibt – das ist das eigentliche Merkmal der kontinuierlichen Abfrage.

Wie Sie sehen, handelt es sich bei dem aggregierten Wert ebenfalls um eine monoton steigende Folge, lediglich die Einträge sind seltener – einmal pro Stunde. Dies ist jedoch kein Problem – wir können eine weitere Abfrage schreiben, die die richtigen Daten für das Diagramm extrahiert.

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 entschlüsseln:

  • Aus der Datenbank „homeassistant.month.water_meter_hour“ rufen wir Daten für „entity_id='water_meter_cold‘“ für den letzten Tag ab (Zeit >= now() -24h).
  • Wie ich bereits erwähnt habe, fehlen möglicherweise einige Einträge in der Sequenz homeassistant.month.water_meter_hour. Wir werden diese Daten neu generieren, indem wir die Abfrage mit GROUP BY time(1h) ausführen. Dieses Mal funktioniert fill( previous) ordnungsgemäß und generiert die fehlenden Daten (die Funktion übernimmt den vorherigen Wert).
  • Das Wichtigste in dieser Abfrage ist die Differenzfunktion, die die Differenz zwischen den Stundenmarkierungen berechnet. An sich funktioniert es nicht und erfordert eine Aggregationsfunktion. Dies sei das zuvor verwendete max().

Das Ausführungsergebnis 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 72

Von 2 Uhr morgens bis 5 Uhr morgens (UTC) gab es keinen Konsum. Trotzdem wird die Abfrage dank fill( previous) denselben Verbrauchswert zurückgeben, und die Differenzfunktion wird diesen Wert von sich selbst subtrahieren und am Ausgang 0 erhalten, was tatsächlich erforderlich ist.

Jetzt müssen Sie nur noch ein Diagramm erstellen. Öffnen Sie dazu Grafana, öffnen Sie ein vorhandenes Dashboard (oder erstellen Sie ein neues) und erstellen Sie ein neues Panel. Die Diagrammeinstellungen lauten wie folgt.

Smart Home: Wasser- und Stromverbrauch im Home Assistant grafisch darstellen

Ich zeige Kalt- und Warmwasserdaten im selben Diagramm an. Die Anfrage ist genau die gleiche, wie ich sie oben beschrieben habe.

Die Anzeigeparameter werden wie folgt eingestellt. Für mich wird es ein Diagramm mit Linien (Linien) sein, das in Stufen (Treppen) verläuft. Der Stack-Parameter wird im Folgenden erläutert. Unten gibt es noch ein paar weitere Anzeigeoptionen, die aber nicht so interessant sind.

Smart Home: Wasser- und Stromverbrauch im Home Assistant grafisch darstellen

Um das resultierende Diagramm zum Home Assistant hinzuzufügen, müssen Sie Folgendes tun:

  • Verlassen Sie den Diagrammbearbeitungsmodus. Aus irgendeinem Grund werden die richtigen Diagrammfreigabeeinstellungen nur auf der Dashboard-Seite angeboten
  • Klicken Sie auf das Dreieck neben dem Diagrammnamen und wählen Sie „Teilen“ aus dem Menü
  • Gehen Sie im sich öffnenden Fenster zur Registerkarte „Einbetten“.
  • Deaktivieren Sie den aktuellen Zeitbereich. Wir legen den Zeitbereich über die URL fest
  • Wählen Sie das gewünschte Thema aus. In meinem Fall ist es hell
  • Kopieren Sie die resultierende URL in die Lovelace-UI-Einstellungskarte

      - 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"

Bitte beachten Sie, dass der Zeitraum (letzte 2 Tage) hier eingestellt wird und nicht in den Dashboard-Einstellungen.

Das Diagramm sieht so aus. Ich habe in den letzten 2 Tagen kein heißes Wasser verwendet, daher wird nur eine Grafik für kaltes Wasser gezeichnet.

Smart Home: Wasser- und Stromverbrauch im Home Assistant grafisch darstellen

Ich habe mich noch nicht entschieden, welches Diagramm mir am besten gefällt, eine Stufenlinie oder echte Balken. Deshalb werde ich lediglich ein Beispiel für einen täglichen Verzehrplan geben, dieses Mal jedoch in Riegeln. Abfragen werden auf die gleiche Weise wie oben beschrieben erstellt. Die Anzeigeoptionen sind:

Smart Home: Wasser- und Stromverbrauch im Home Assistant grafisch darstellen

Dieses Diagramm sieht folgendermaßen aus:

Smart Home: Wasser- und Stromverbrauch im Home Assistant grafisch darstellen

Also, zum Stack-Parameter. In dieser Grafik ist ein Kaltwasserbalken über einem Warmwasserbalken gezeichnet. Die Gesamthöhe entspricht dem Gesamtverbrauch an Kalt- und Warmwasser für den Zeitraum.

Alle angezeigten Diagramme sind dynamisch. Sie können die Maus über den Punkt von Interesse bewegen und die Details und den Wert an einem bestimmten Punkt sehen.

Leider war es nicht ohne ein paar Wermutstropfen. Bei einem Balkendiagramm liegt die Mitte des Balkens (im Gegensatz zum Diagramm mit Stufenlinien) nicht in der Tagesmitte, sondern bei 00:00 Uhr. Diese. Die linke Hälfte des Balkens wird anstelle des Vortages eingezeichnet. Daher sind die Charts für Samstag und Sonntag etwas links von der bläulichen Zone gezeichnet. Bis ich herausgefunden habe, wie ich es gewinnen kann.

Ein weiteres Problem ist die Unfähigkeit, in monatlichen Abständen richtig zu arbeiten. Tatsache ist, dass die Länge der Stunde/des Tages/der Woche festgelegt ist, die Länge des Monats jedoch jedes Mal anders ist. InfluxDB kann nur mit gleichen Intervallen arbeiten. Bisher reichte mein Gehirn aus, um ein festes Intervall von 30 Tagen festzulegen. Ja, das Diagramm schwankt im Laufe des Jahres ein wenig und die Balken entsprechen nicht genau den Monaten. Aber da das Ding für mich nur als Anzeigegerät interessant ist, bin ich damit einverstanden.

Ich sehe mindestens zwei Lösungen:

  • Um in monatlichen Charts zu punkten und sich auf wöchentliche Charts zu beschränken. 52 wöchentliche Takte in einem Jahr sehen ziemlich gut aus
  • Betrachten Sie den monatlichen Verbrauch selbst als Methode Nr. 2 und verwenden Sie die Grafana nur für schöne Grafiken. Es ist eine ziemlich genaue Lösung. Sie können zum Vergleich sogar Diagramme für das vergangene Jahr überlagern – Grafana kann das.

Abschluss

Ich weiß nicht warum, aber ich liebe diese Art von Diagrammen. Sie zeigen, dass das Leben in vollem Gange ist und sich alles verändert. Gestern war viel, heute ist wenig, morgen wird es etwas anderes geben. Es bleibt die Arbeit mit den Haushalten zum Thema Konsum. Aber selbst bei den derzeitigen Vorlieben verwandelt sich eine große und unverständliche Zahl in der Rechnung bereits in ein einigermaßen verständliches Bild des Konsums.

Trotz meiner fast 20-jährigen Karriere als Programmierer hatte ich praktisch keine Berührungspunkte mit Datenbanken. Daher schien die Installation einer externen Datenbank etwas so Abstruses und Unverständliches zu sein. Alles hat sich geändert den obigen Artikel - Es stellte sich heraus, dass das Schrauben eines geeigneten Werkzeugs mit ein paar Klicks erledigt ist und mit einem Spezialwerkzeug das Plotten etwas einfacher wird.

Im Titel habe ich den Stromverbrauch erwähnt. Leider kann ich im Moment keine Grafik zur Verfügung stellen. Ein SDM120-Zähler ist defekt und der andere ist fehlerhaft, wenn über Modbus darauf zugegriffen wird. Dies hat jedoch keinerlei Einfluss auf das Thema dieses Artikels – die Diagramme werden auf die gleiche Weise wie für Wasser erstellt.

In diesem Artikel habe ich die Ansätze aufgeführt, die ich selbst ausprobiert habe. Sicherlich gibt es noch andere Möglichkeiten, die Sammlung und Visualisierung von Daten zu organisieren, die ich nicht kenne. Erzähl mir davon in den Kommentaren, ich werde sehr interessiert sein. Über konstruktive Kritik und neue Ideen freue ich mich. Ich hoffe, dass das obige Material auch jemandem helfen wird.

Source: habr.com

Kommentar hinzufügen