{"id":74421,"date":"2020-03-17T08:43:08","date_gmt":"2020-03-17T05:43:08","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/umnyj-dom-stroim-grafiki-potrebleniya-vody-i-elektrichestva-v-home-assistant"},"modified":"2020-03-17T08:43:08","modified_gmt":"2020-03-17T05:43:08","slug":"umnyj-dom-stroim-grafiki-potrebleniya-vody-i-elektrichestva-v-home-assistant","status":"publish","type":"post","link":"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/umnyj-dom-stroim-grafiki-potrebleniya-vody-i-elektrichestva-v-home-assistant","title":{"rendered":"Smart Home: Wir erstellen Verbrauchsdiagramme f\u00fcr Wasser und Strom in Home Assistant","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Smart Home: Wir erstellen Verbrauchsdiagramme f\u00fcr Wasser und Strom in Home Assistant\" src=\"\/wp-content\/uploads\/2020\/03\/f1133a4c391e901ed64bf0825a774fc6.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nJedes Mal, wenn ich die Rechnung f\u00fcr Strom und Wasser bekomme, wundere ich mich \u2013 verbraucht meine Familie wirklich so viel? Ja, im Badezimmer gibt es eine Fu\u00dfbodenheizung und einen Boiler, aber die laufen doch nicht st\u00e4ndig. Auch Wasser sparen wir, obwohl wir es lieben, im Bad zu planschen. Vor einigen Jahren habe ich bereits <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/411259\/\">Wasserz\u00e4hler angeschlossen<\/a><\/noindex> und <noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/watch?v=XKvunh29sZo&amp;list=PLkt_cQxT0oUmfdxhbmTjytjaJjZjSVUOu\">Strom<\/a><\/noindex> an das Smart Home, aber damit war es dann auch. Erst jetzt habe ich endlich Zeit gefunden, den Verbrauch zu analysieren, wor\u00fcber dieser Artikel handelt.<\/p>\n<p>K\u00fcrzlich bin ich auf Home Assistant als Smart Home-System umgestiegen. Ein Grund war die M\u00f6glichkeit, eine gro\u00dfe Menge an Daten zu sammeln und dabei einfach verschiedene Diagramme zu erstellen.<\/p>\n<p>Die Informationen in diesem Artikel sind nicht neu, all diese Dinge wurden unter verschiedenen Vorw\u00e4nden schon im Internet beschrieben. Aber in der Regel befasst sich jeder Artikel nur mit einem Ansatz oder Aspekt. Ich musste selbst die verschiedenen Ans\u00e4tze vergleichen und den am besten geeigneten ausw\u00e4hlen. Der Artikel liefert zwar keine umfassenden Informationen zur Datensammlung, ist aber eine Art Zusammenfassung, wie ich es gemacht habe. Konstruktive Kritik und Verbesserungsvorschl\u00e4ge sind willkommen.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>Aufgabenstellung<\/h2>\n<p>\nDie heutige \u00dcbung hat also das Ziel, sch\u00f6ne Verbrauchsdiagramme f\u00fcr Wasser und Strom zu erstellen:<\/p>\n<ul>\n<li>St\u00fcndlich \u00fcber 2 Tage<\/li>\n<li>T\u00e4glich \u00fcber 2 Wochen<\/li>\n<li>(optional) w\u00f6chentlich und monatlich<\/li>\n<\/ul>\n<p>\nDabei sto\u00dfen wir auf einige Schwierigkeiten:<\/p>\n<ul>\n<li>Standard-Diagrammkomponenten sind in der Regel recht d\u00fcrftig. Im besten Fall l\u00e4sst sich ein Liniendiagramm aus Punkten erstellen.\n<p>Wenn man gut sucht, kann man Drittanbieter-Komponenten finden, die die M\u00f6glichkeiten des Standarddiagramms erweitern. F\u00fcr Home Assistant ist die Komponente <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/kalkih\/mini-graph-card\">mini-graph-card<\/a><\/noindex>im Grunde genommen nicht schlecht und sieht gut aus, aber auch sie hat einige Einschr\u00e4nkungen:<\/p>\n<ul>\n<li>Es ist schwierig, die Parameter f\u00fcr das S\u00e4ulendiagramm \u00fcber gro\u00dfe Zeitr\u00e4ume festzulegen (die Breite der S\u00e4ule wird in Stundenbruchteilen angegeben, was bedeutet, dass Zeitr\u00e4ume von mehr als einer Stunde in Dezimalzahlen festgelegt werden m\u00fcssen)<\/li>\n<li>Man kann nicht verschiedene Entit\u00e4ten (zum Beispiel Temperatur und Luftfeuchtigkeit oder ein S\u00e4ulendiagramm mit einer Linie kombinieren) in ein Diagramm einf\u00fcgen<\/li>\n<\/ul>\n<\/li>\n<li>Es ist nicht nur so, dass der Home Assistant standardm\u00e4\u00dfig die einfachste SQLite-Datenbank verwendet (und ich, ungeschickt, die Installation von MySQL oder Postgres nicht bew\u00e4ltigen konnte), sondern auch, dass die Daten nicht optimal gespeichert werden. Beispielsweise wird bei jeder \u00c4nderung eines auch nur geringf\u00fcgigen digitalen Parameters ein riesiges JSON, das etwa ein Kilobyte gro\u00df ist, in die Datenbank geschrieben.\n<pre><code class=\"json\">{\"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}}}<\/code><\/pre>\n<p>\nIch habe ziemlich viele Sensoren (Temperatursensoren in jedem Raum, Wasser- und Stromz\u00e4hler), und einige davon erzeugen au\u00dferdem eine betr\u00e4chtliche Menge an Daten. Zum Beispiel erzeugt allein der Stromz\u00e4hler SDM220 etwa zehn Werte alle 10-15 Sekunden, und ich w\u00fcrde gerne etwa 8 solcher Z\u00e4hler installieren. Au\u00dferdem gibt es eine ganze Reihe von Parametern, die auf der Basis anderer Sensoren berechnet werden. So k\u00f6nnen all diese Werte die Datenbank leicht t\u00e4glich um 100-200 MB aufbl\u00e4hen. 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\u00f6glich w\u00e4re, die Daten ein ganzes Jahr lang zu speichern.<\/li>\n<li>Wenn Sie Gl\u00fcck haben, kann Ihr Z\u00e4hler selbst den Verbrauch erfassen. Sie k\u00f6nnen jederzeit den Z\u00e4hler ansprechen und ihn nach dem aktuellen kumulierten Verbrauchswert fragen. In der Regel bieten alle Stromz\u00e4hler mit digitaler Schnittstelle (RS232\/RS485\/Modbus\/Zigbee) diese M\u00f6glichkeit.\n<p>Schlimmer ist es, wenn das Ger\u00e4t 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\u00fcber 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\u00f6nnte nat\u00fcrlich alles dem Smart Home-System wie home assistant anvertrauen, aber der Punkt zur Anzahl der Eintr\u00e4ge in der Datenbank ist nicht aufgehoben, und eine Abfrage der Sensoren \u00f6fter als einmal pro Sekunde l\u00e4sst sich nicht einrichten (Architekturbegrenzung von home assistant).<\/li>\n<\/ul>\n<p><\/p>\n<h2>Ansatz 1<\/h2>\n<p>\nZun\u00e4chst schauen wir uns an, was home assistant standardm\u00e4\u00dfig bietet. Die Messung des Verbrauchs \u00fcber einen Zeitraum ist eine sehr gefragte Funktionalit\u00e4t. Nat\u00fcrlich wurde dies schon lange in Form einer spezialisierten Komponente \u2013 utility_meter \u2013 implementiert. <\/p>\n<p>Der Kern der Komponente besteht darin, dass sie intern eine Variable f\u00fcr den aktuellen kumulierten Wert f\u00fchrt und diese nach Ablauf des festgelegten Zeitraums (Stunde\/Woche\/Monat) zur\u00fccksetzt. Die Komponente \u00fcberwacht selbst die Eingangsvariable (den Wert eines Sensors), subscribiert sich selbst auf \u00c4nderungen des Wertes \u2013 Sie erhalten einfach das fertige Ergebnis. Diese Funktion l\u00e4sst sich in nur wenigen Zeilen in der Konfigurationsdatei beschreiben.<\/p>\n<pre><code class=\"python\">utility_meter:\n  water_cold_hour_um:\n    source: sensor.water_meter_cold\n    cycle: hourly\n  water_cold_day_um:\n    source: sensor.water_meter_cold\n    cycle: daily\n<\/code><\/pre>\n<p>\nHier ist sensor.water_meter_cold der aktuelle Wert des Z\u00e4hlers in Litern, den ich direkt <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/411259\/\">von der Hardware<\/a><\/noindex> \u00fcber MQTT erhalte. Die Konstruktion erzeugt 2 neue Sensoren water_cold_hour_um und water_cold_day_um, die st\u00fcndliche und t\u00e4gliche Messwerte kumulieren und diese nach Ablauf des Zeitraums zur\u00fccksetzen. Hier ist das Diagramm des st\u00fcndlichen Akkumulationswertes \u00fcber einen halben Tag.<\/p>\n<p><img decoding=\"async\" alt=\"Smart Home: Wir erstellen Verbrauchsdiagramme f\u00fcr Wasser und Strom in Home Assistant\" src=\"\/wp-content\/uploads\/2020\/03\/d3c3ea29c10b17142e51ebe756ab7123.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDer Code f\u00fcr die st\u00fcndlichen und t\u00e4glichen Graphen f\u00fcr die Lovelace-UI sieht so aus:<\/p>\n<pre><code class=\"python\">      - type: history-graph\n        title: 'St\u00fcndlicher Wasserverbrauch mit Variablen'\n        hours_to_show: 48\n        entities:\n          - sensor.water_hour\n\n      - type: history-graph\n        title: 'T\u00e4glicher Wasserverbrauch mit Variablen'\n        hours_to_show: 360\n        entities:\n          - sensor.water_day\n<\/code><\/pre>\n<p>\nTats\u00e4chlich liegt in diesem Algorithmus das Problem dieser Herangehensweise. Wie ich bereits erw\u00e4hnt habe, wird f\u00fcr jeden Eingangswert (aktuelle Z\u00e4hlerstand f\u00fcr jeden n\u00e4chsten 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\u00fcndliche\/t\u00e4gliche\/w\u00f6chentliche\/monatliche Ablesungen sammeln m\u00f6chte, und das f\u00fcr mehrere Wasserleitungen, und dann noch eine Menge Stromz\u00e4hler hinzuf\u00fcgen will \u2013 das wird extrem viele Daten bedeuten. Um genauer zu sein, die Daten sind nicht viel, aber da der Home Assistant eine Menge unn\u00f6tiger Informationen in die Datenbank schreibt, wird die Gr\u00f6\u00dfe der Datenbank explosionsartig wachsen. Ich habe sogar Angst, die Gr\u00f6\u00dfe der Datenbank f\u00fcr w\u00f6chentliche und monatliche Diagramme einzusch\u00e4tzen.<\/p>\n<p>Dar\u00fcber hinaus l\u00f6st 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\u00fcckgesetzt wird. Wir ben\u00f6tigen jedoch ein f\u00fcr den Benutzer verst\u00e4ndliches Diagramm des Verbrauchs, also wie viele Liter \u00fcber den Zeitraum verbraucht wurden. Der Standardkomponent history-graph kann das nicht, aber der externe Komponent mini-graph-card k\u00f6nnte uns helfen.<\/p>\n<p>Das ist der Code f\u00fcr die Karte f\u00fcr die Lovelace-UI:<\/p>\n<pre><code class=\"python\">      - aggregate_func: max\n        entities:\n          - color: var(--primary-color)\n            entity: sensor.water_cold_hour_um\n        group_by: hour\n        hours_to_show: 48\n        name: \"St\u00fcndlicher Wasserverbrauch aggregiert nach Z\u00e4hler\"\n        points_per_hour: 1\n        show:\n          graph: bar\n        type: 'custom:mini-graph-card'<\/code><\/pre>\n<p>\nNeben den Standardkonfigurationen wie Sensorname, Diagrammtyp, Farbe (das Standardorange gefiel mir nicht) sind hier drei Einstellungen wichtig:<\/p>\n<ul>\n<li>group_by:hour \u2014 das Diagramm wird so generiert, dass die Balken am Beginn der Stunde ausgerichtet sind<\/li>\n<li>points_per_hour: 1 \u2014 ein Balken pro Stunde<\/li>\n<li>Und das Wichtigste, aggregate_func: max \u2014 das maximale Wert innerhalb jeder Stunde wird genommen. Diese Einstellung verwandelt das gezackte Diagramm in Balken.<\/li>\n<\/ul>\n<p>\n<img decoding=\"async\" alt=\"Smart Home: Wir erstellen Verbrauchsdiagramme f\u00fcr Wasser und Strom in Home Assistant\" src=\"\/wp-content\/uploads\/2020\/03\/5bd866c39b23299e5f15dcf4a9bce38f.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nIgnorieren Sie die Reihe von Balken links \u2014 das ist das Standardverhalten des Components, wenn keine Daten vorhanden sind. Und es gab keine Daten \u2014 ich habe die Datenerfassung f\u00fcr den Utility-Meter erst vor ein paar Stunden nur f\u00fcr diesen Artikel aktiviert (meinen aktuellen Ansatz werde ich gleich unten erl\u00e4utern). <\/p>\n<p>Auf diesem Bild wollte ich zeigen, dass manchmal die Datenanzeige tats\u00e4chlich funktioniert und die Balken die richtigen Werte widerspiegeln. Nur ist das bei weitem nicht der Fall. Der hervorgehobene Balken f\u00fcr den Zeitraum von 11 bis 12 Uhr zeigt aus irgendeinem Grund 19 Liter an, w\u00e4hrend wir im Zacken-Grafik etwas weiter oben f\u00fcr 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 \u2013 der Verbrauch war dort im Normalbereich, was ebenfalls im Zacken-Grafik sichtbar ist.<\/p>\n<p>Insgesamt ist es mir nicht gelungen, die Glaubw\u00fcrdigkeit dieses Ansatzes zu erreichen \u2013 das Diagramm zeigt fast immer irgendeinen Unsinn.<\/p>\n<p>Ein \u00e4hnlicher Code f\u00fcr den Tages-Sensor. <\/p>\n<pre><code class=\"python\">      - aggregate_func: max\n        entities:\n          - color: var(--primary-color)\n            entity: sensor.water_cold_day_um\n        group_by: interval\n        hours_to_show: 360\n        name: \"T\u00e4glicher Wasserverbrauch aggregiert nach Z\u00e4hler\"\n        points_per_hour: 0.0416666666\n        show:\n          graph: bar\n        type: 'custom:mini-graph-card'\n<\/code><\/pre>\n<p>\nBeachten 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 \u2013 points_per_hour funktioniert gut bei Diagrammen f\u00fcr eine Stunde oder weniger, aber schlecht bei gr\u00f6\u00dferen Zeitr\u00e4umen. Um einen Balken f\u00fcr einen Tag zu erhalten, musste ich den Wert 1\/24=0.04166666 eingeben. Von w\u00f6chentlichen und monatlichen Diagrammen will ich gar nicht reden.<\/p>\n<h2>Ansatz 2<\/h2>\n<p>\nW\u00e4hrend ich mich noch in das Home Assistant einarbeite, bin ich auf dieses Video gesto\u00dfen:<\/p>\n<p><center><div class=\"youtube-placeholder\" data-id=\"-0HrYFCRH0M\" onclick=\"loadVideo(this)\">\r\n        <img decoding=\"async\" src=\"https:\/\/img.youtube.com\/vi\/-0HrYFCRH0M\/hqdefault.jpg\" alt=\"Video abspielen\" loading=\"lazy\" width=\"480\" height=\"360\" style=\"width:100%;height:auto;\">\r\n        <div class=\"play-button\"><\/div>\r\n    <\/div><\/center><br \/>\nEin Bekannter sammelt Verbrauchsdaten von verschiedenen Arten von Xiaomi-Steckdosen. Seine Aufgabe ist etwas einfacher \u2013 einfach den Verbrauch f\u00fcr heute, gestern und f\u00fcr den Monat anzuzeigen. Es sind keine Diagramme erforderlich. <\/p>\n<p>Lassen wir die \u00dcberlegungen zu der manuellen Integration von momentanen Leistungswerten beiseite \u2013 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\u00e4tes besser funktionieren. <\/p>\n<p>Aus dem Video \u00fcbernehmen wir die Idee der manuellen Berechnung des Verbrauchs \u00fcber einen Zeitraum. Der Typ betrachtet nur die Werte f\u00fcr heute und gestern, aber wir gehen weiter und versuchen, ein Diagramm zu zeichnen. Der Vorschlag besteht darin, dass ich in meinem Fall Folgendes tue.<\/p>\n<p>Wir definieren die Variable wert_zum_Beginn_der_Stunde, in die wir die aktuellen Z\u00e4hlerst\u00e4nde schreiben.<br \/>\nAm Ende der Stunde (oder zu Beginn der n\u00e4chsten) berechnen wir die Differenz zwischen dem aktuellen Messwert und dem zu Beginn der Stunde gespeicherten Wert. Diese Differenz wird der Verbrauch f\u00fcr die aktuelle Stunde sein \u2013 wir speichern den Wert im Sensor und werden in Zukunft basierend auf diesem Wert ein Diagramm erstellen. <br \/>\nAu\u00dferdem muss die Variable wert_zu_stundenbeginn zur\u00fcckgesetzt werden, indem der aktuelle Wert des Z\u00e4hlers dort geschrieben wird.<\/p>\n<p>All dies kann \u00fcber die Funktionen des Home Assistant durchgef\u00fchrt werden. <\/p>\n<p>Es wird etwas mehr Code erforderlich sein als im vorherigen Ansatz. Zuerst erstellen wir diese \"Variablen\". Von Haus aus haben wir keine Entit\u00e4t \"Variable\", aber wir k\u00f6nnen die Dienste eines MQTT-Brokers nutzen. Wir werden Werte mit dem Flag retain=true dorthin senden \u2013 dies speichert den Wert im Broker, und wir k\u00f6nnen ihn jederzeit auch nach einem Neustart von Home Assistant wieder abrufen. Ich habe sowohl st\u00fcndliche als auch t\u00e4gliche Z\u00e4hler erstellt.<\/p>\n<pre><code class=\"python\">- platform: mqtt\n  state_topic: \"test\/water\/hour\"\n  name: water_hour\n  unit_of_measurement: l\n\n- platform: mqtt\n  state_topic: \"test\/water\/hour_begin\"\n  name: water_hour_begin\n  unit_of_measurement: l\n\n- platform: mqtt\n  state_topic: \"test\/water\/day\"\n  name: water_day\n  unit_of_measurement: l\n\n- platform: mqtt\n  state_topic: \"test\/water\/day_begin\"\n  name: water_day_begin\n  unit_of_measurement: l<\/code><\/pre>\n<p>\nDie ganze Magie geschieht in der Automatisierung, die jede Stunde und jede Nacht entsprechend ausgef\u00fchrt wird.<\/p>\n<pre><code class=\"python\">- id: water_new_hour\n  alias: water_new_hour\n  initial_state: true\n  trigger:\n    - platform: time_pattern\n      minutes: 0\n  action:\n    - service: mqtt.publish\n      data:\n        topic: \"test\/water\/hour\"\n        payload_template: &gt;\n          {{ (states.sensor.water_meter_cold.state|int) - (states.sensor.water_hour_begin.state|int) }}\n        retain: true\n    - service: mqtt.publish\n      data:\n        topic: \"test\/water\/hour_begin\"\n        payload_template: &gt;\n          {{ states.sensor.water_meter_cold.state }}\n        retain: true\n\n- id: water_new_day\n  alias: water_new_day\n  initial_state: true\n  trigger:\n    - platform: time\n      at: \"00:00:00\"\n  action:\n    - service: mqtt.publish\n      data:\n        topic: \"test\/water\/day\"\n        payload_template: &gt;\n          {{ (states.sensor.water_meter_cold.state|int) - (states.sensor.water_day_begin.state|int) }}\n        retain: true\n    - service: mqtt.publish\n      data:\n        topic: \"test\/water\/day_begin\"\n        payload_template: &gt;\n          {{ states.sensor.water_meter_cold.state }}\n        retain: true<\/code><\/pre>\n<p>\nBeide Automatisierungen f\u00fchren 2 Aktionen durch:<\/p>\n<ul>\n<li>Sie berechnen den Wert f\u00fcr das Intervall als Differenz zwischen dem Anfangs- und dem Endwert<\/li>\n<li>Sie aktualisieren den Basiswert f\u00fcr das n\u00e4chste Intervall<\/li>\n<\/ul>\n<p>\nDas Erstellen von Diagrammen wird in diesem Fall mit einem normalen history-graph gel\u00f6st:<\/p>\n<pre><code class=\"python\">      - type: history-graph\n        title: 'St\u00fcndlicher Wasserverbrauch mit Variablen'\n        hours_to_show: 48\n        entities:\n          - sensor.water_hour\n\n      - type: history-graph\n        title: 'T\u00e4glicher Wasserverbrauch mit Variablen'\n        hours_to_show: 360\n        entities:\n          - sensor.water_day<\/code><\/pre>\n<p>\nSo sieht es aus:<\/p>\n<p><img decoding=\"async\" alt=\"Smart Home: Wir erstellen Verbrauchsdiagramme f\u00fcr Wasser und Strom in Home Assistant\" src=\"\/wp-content\/uploads\/2020\/03\/ebde2fc5f0a72d7d6ba565c3686dc9c6.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nIm Grunde ist dies bereits das, was ben\u00f6tigt wird. Ein Vorteil dieser Methode ist, dass die Daten nur einmal pro Intervall generiert werden. Das hei\u00dft, es gibt insgesamt 24 Eintr\u00e4ge pro Tag f\u00fcr das Stunden-Diagramm. <\/p>\n<p>Leider l\u00f6st dies nicht das zugrunde liegende Problem einer wachsenden Datenbank. Wenn ich einen Monatlichen Verbrauchsbericht will, muss ich Daten mindestens f\u00fcr ein Jahr speichern. Da der Home Assistant nur eine einzige Einstellung f\u00fcr die Speicherdauer f\u00fcr die gesamte Datenbank bietet, bedeutet das, dass alle Daten im System ein ganzes Jahr lang aufbewahrt werden m\u00fcssen. Zum Beispiel verbrauche ich im Jahr 200 Kubikmeter Wasser, was 200.000 Eintr\u00e4gen in der Datenbank entspricht. Wenn ich dann noch andere Sensoren ber\u00fccksichtige, wird die Zahl wirklich unangemessen hoch.<\/p>\n<h2>Ansatz 3<\/h2>\n<p>\nGl\u00fccklicherweise haben kluge K\u00f6pfe bereits dieses Problem gel\u00f6st, indem sie die Datenbank InfluxDB entwickelt haben. Diese Datenbank ist speziell f\u00fcr die Speicherung zeitbasierter Daten optimiert und eignet sich hervorragend zur Speicherung von Werten verschiedener Sensoren. Das System bietet auch eine SQL-\u00e4hnliche Abfragesprache, mit der man Werte aus der Datenbank abrufen und auf verschiedene Arten aggregieren kann. Schlie\u00dflich k\u00f6nnen unterschiedliche Daten unterschiedlich lange gespeichert werden. Zum Beispiel k\u00f6nnen h\u00e4ufig wechselnde Messwerte wie Temperatur oder Luftfeuchtigkeit nur ein paar Wochen lang gespeichert werden, w\u00e4hrend t\u00e4gliche Wasserverbrauchswerte ein ganzes Jahr lang gespeichert werden k\u00f6nnen.<\/p>\n<p>Neben InfluxDB haben kluge K\u00f6pfe auch Grafana erfunden \u2013 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\u00f6nnen in die lovelace-UI des Home Assistant integriert werden.<\/p>\n<p>Inspiriert von <noindex><a rel=\"nofollow\" href=\"https:\/\/dummylabs.com\/ru\/post\/2019-01-13-influxdb-part1\/\">hier <\/a><\/noindex> und <noindex><a rel=\"nofollow\" href=\"https:\/\/dummylabs.com\/ru\/post\/2019-05-28-influxdb-part2\/\">hier<\/a><\/noindex>. In den Artikeln wird der Prozess der Installation und Anbindung von InfluxDB und Grafana an den Home Assistant ausf\u00fchrlich beschrieben. Ich werde mich jedoch auf meine spezifische Aufgabe konzentrieren.<\/p>\n<p>Also, als Erstes beginnen wir damit, den Wert des Z\u00e4hlers in InfluxDB zu speichern. Ein St\u00fcck der Home Assistant-Konfiguration (in diesem Beispiel werde ich mich nicht nur mit kaltem, sondern auch mit hei\u00dfem Wasser besch\u00e4ftigen):<\/p>\n<pre><code class=\"python\">influxdb:\n  host: localhost\n  max_retries: 3\n  default_measurement: state\n  database: homeassistant\n  include:\n    entities:\n      - sensor.water_meter_hot\n      - sensor.water_meter_cold<\/code><\/pre>\n<p>\nWir deaktivieren das Speichern dieser Daten in der internen Datenbank von Home Assistant, um sie nicht unn\u00f6tig aufzubl\u00e4hen:<\/p>\n<pre><code class=\"python\">recorder:\n  purge_keep_days: 10\n  purge_interval: 1\n  exclude:\n    entities:\n      - sensor.water_meter_hot\n      - sensor.water_meter_cold<\/code><\/pre>\n<p>\nLassen Sie uns jetzt zur InfluxDB-Konsole \u00fcbergehen und unsere Datenbank konfigurieren. Insbesondere m\u00fcssen wir festlegen, wie lange bestimmte Daten aufbewahrt werden. Dies wird durch die sogenannte Retention Policy geregelt \u2013 das ist \u00e4hnlich wie Datenbanken innerhalb einer Hauptdatenbank, wobei jede interne Datenbank ihre eigenen Einstellungen hat. Standardm\u00e4\u00dfig werden alle Daten in der Retention Policy mit dem Namen autogen gespeichert, diese Daten werden eine Woche lang aufbewahrt. Ich m\u00f6chte, dass st\u00fcndliche Daten einen Monat lang aufbewahrt werden, w\u00f6chentliche Daten ein Jahr und monatliche Daten \u00fcberhaupt nie gel\u00f6scht werden. Lassen Sie uns die entsprechenden Retention Policies erstellen.<\/p>\n<pre><code class=\"sql\">ERSTELLE BEWAHRUNGSPOLITIK \"monat\" F\u00dcR \"homeassistant\" DAUER 30d REPLIKATION 1\nERSTELLE BEWAHRUNGSPOLITIK \"jahr\" F\u00dcR \"homeassistant\" DAUER 52w REPLIKATION 1\nERSTELLE BEWAHRUNGSPOLITIK \"unbegrenzt\" F\u00dcR \"homeassistant\" DAUER INF REPLIKATION 1<\/code><\/pre>\n<p>\nJetzt kommt der eigentliche Trick \u2013 die Aggregation von Daten mithilfe einer Continuous Query. Dies ist ein Mechanismus, der automatisch alle festgelegten Zeitintervalle einen Query ausf\u00fchrt, 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).<\/p>\n<pre><code class=\"sql\">CREATE CONTINUOUS QUERY cq_water_hourly ON homeassistant \nBEGIN \n  SELECT max(value) AS value \n  INTO homeassistant.month.water_meter_hour \n  FROM homeassistant.autogen.l \n  GROUP BY time(1h), entity_id fill(previous) \nEND<\/code><\/pre>\n<p>\nDieser Befehl:<\/p>\n<ul>\n<li>Erstellt eine Continuous Query mit dem Namen cq_water_cold_hourly in der Datenbank homeassistant.<\/li>\n<li>Die Abfrage wird jede Stunde ausgef\u00fchrt (time(1h)).<\/li>\n<li>Die Abfrage wird alle Daten aus dem Measurement homeassistant.autogen.l (Liter) abfragen, einschlie\u00dflich der Messwerte f\u00fcr kaltes und hei\u00dfes Wasser.<\/li>\n<li>Die aggregierten Daten werden nach entity_id gruppiert, was uns separate Werte f\u00fcr kaltes und hei\u00dfes Wasser liefert.<\/li>\n<li>Da der Literz\u00e4hler eine monoton steigende Sequenz darstellt, muss innerhalb jeder Stunde der H\u00f6chstwert genommen werden, daher wird die Aggregation durch die Funktion max(value) durchgef\u00fchrt. <\/li>\n<li>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\u00fcr kaltes und hei\u00dfes Wasser in separaten Eintr\u00e4gen mit dem entsprechenden entity_id und dem Wert im Feld value gespeichert.<\/li>\n<\/ul>\n<p>\nIn der Nacht oder wenn niemand zu Hause ist, gibt es keinen Wasserverbrauch, und somit auch keine neuen Eintr\u00e4ge 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. <\/p>\n<p>Leider hat die kontinuierliche Abfrage eine Besonderheit: der Trick fill(previous) funktioniert nicht und die Datens\u00e4tze werden einfach nicht erstellt. Dabei handelt es sich um ein un\u00fcberwindbares Problem, das <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/influxdata\/influxdb\/issues\/3220\">schon seit mehreren Jahren diskutiert wird.<\/a><\/noindex>Wir werden uns sp\u00e4ter mit diesem Problem befassen, und fill(previous) in der kontinuierlichen Abfrage kann bleiben \u2013 es st\u00f6rt nicht. <\/p>\n<p>Lass uns pr\u00fcfen, was wir erreicht haben (nat\u00fcrlich m\u00fcssen wir ein paar Stunden warten):<\/p>\n<pre><code class=\"python\">&gt; select * from homeassistant.month.water_meter_hour group by entity_id\n...\nname: water_meter_hour\ntags: entity_id=water_meter_cold\ntime                 value\n----                 -----\n...\n2020-03-08T01:00:00Z 370511\n2020-03-08T02:00:00Z 370513\n2020-03-08T05:00:00Z 370527\n2020-03-08T06:00:00Z 370605\n2020-03-08T07:00:00Z 370635\n2020-03-08T08:00:00Z 370699\n2020-03-08T09:00:00Z 370761\n2020-03-08T10:00:00Z 370767\n2020-03-08T11:00:00Z 370810\n2020-03-08T12:00:00Z 370818\n2020-03-08T13:00:00Z 370827\n2020-03-08T14:00:00Z 370849\n2020-03-08T15:00:00Z 370921\n<\/code><\/pre>\n<p>\nBitte beachten Sie, dass die Werte in der Datenbank in UTC gespeichert werden, weshalb sie in dieser Liste um 3 Stunden abweichen \u2013 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\u00e4tze vorhanden sind \u2013 das ist die besagte Besonderheit der kontinuierlichen Abfrage.<\/p>\n<p>Wie Sie sehen k\u00f6nnen, ist der aggregierte Wert ebenfalls eine monoton wachsende Folge, nur dass die Datens\u00e4tze seltener kommen \u2013 einmal pro Stunde. Aber das ist kein Problem \u2013 wir k\u00f6nnen eine weitere Abfrage schreiben, die die richtigen Daten f\u00fcr das Diagramm abruft.<\/p>\n<pre><code class=\"sql\">SELECT difference(max(value)) \nFROM homeassistant.month.water_meter_hour \nWHERE entity_id='water_meter_cold' and time &gt;= now() -24h \nGROUP BY time(1h), entity_id \nfill(previous)<\/code><\/pre>\n<p>\nIch werde das erkl\u00e4ren:<\/p>\n<ul>\n<li>Ziehen Sie Daten aus der Datenbank homeassistant.month.water_meter_hour f\u00fcr entity_id='water_meter_cold' der letzten 24 Stunden (time &gt;= now() -24h). <\/li>\n<li>Wie ich bereits erw\u00e4hnt habe, k\u00f6nnen in der Reihenfolge homeassistant.month.water_meter_hour einige Datens\u00e4tze fehlen. Diese Daten werden wir neu generieren, indem wir die Abfrage mit GROUP BY time(1h) ausf\u00fchren. Dieses Mal wird fill(previous) wie gew\u00fcnscht funktionieren und fehlende Daten generieren (die Funktion nimmt den vorherigen Wert).<\/li>\n<li>Das Wichtigste an dieser Abfrage ist die Funktion difference, die die Differenz zwischen den st\u00fcndlichen Markierungen berechnet. Sie selbst funktioniert nicht und erfordert eine aggregierende Funktion. Lassen wir es die zuvor verwendete max() sein.<\/li>\n<\/ul>\n<p>\nDas Ergebnis sieht so aus:<\/p>\n<pre><code class=\"python\">name: water_meter_hour\ntags: entity_id=water_meter_cold\ntime                 difference\n----                 ----------\n...\n2020-03-08T02:00:00Z 2\n2020-03-08T03:00:00Z 0\n2020-03-08T04:00:00Z 0\n2020-03-08T05:00:00Z 14\n2020-03-08T06:00:00Z 78\n2020-03-08T07:00:00Z 30\n2020-03-08T08:00:00Z 64\n2020-03-08T09:00:00Z 62\n2020-03-08T10:00:00Z 6\n2020-03-08T11:00:00Z 43\n2020-03-08T12:00:00Z 8\n2020-03-08T13:00:00Z 9\n2020-03-08T14:00:00Z 22\n2020-03-08T15:00:00Z 72<\/code><\/pre>\n<p>\nVon 2 bis 5 Uhr morgens (UTC) gab es keinen Verbrauch. Dennoch wird die Abfrage denselben Verbrauchswert zur\u00fcckgeben, dank fill(previous), und die Funktion difference wird diesen Wert von sich selbst abziehen, sodass am Ende 0 herauskommt, was erforderlich ist.<\/p>\n<p>Jetzt bleibt nur noch die Aufgabe, das Diagramm zu erstellen. Dazu \u00f6ffnen wir Grafana, w\u00e4hlen ein bestehendes (oder erstellen ein neues) Dashboard und f\u00fcgen ein neues Panel hinzu. Die Diagrameinstellungen werden wie folgt sein.<\/p>\n<p><img decoding=\"async\" alt=\"Smart Home: Wir erstellen Verbrauchsdiagramme f\u00fcr Wasser und Strom in Home Assistant\" src=\"\/wp-content\/uploads\/2020\/03\/c6f551590cd141438b644b24aa4ddebf.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nIch werde die Daten f\u00fcr kaltes und warmes Wasser in einem Diagramm darstellen. Die Abfrage ist genau die gleiche, die ich oben beschrieben habe. <\/p>\n<p>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\u00e4utern. Weiter unten gibt es noch ein paar Anzeigeparameter, die jedoch nicht so interessant sind.<\/p>\n<p><img decoding=\"async\" alt=\"Smart Home: Wir erstellen Verbrauchsdiagramme f\u00fcr Wasser und Strom in Home Assistant\" src=\"\/wp-content\/uploads\/2020\/03\/cb47fc8570b7fd1305ce3451e0518f11.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nUm das erhaltene Diagramm in Home Assistant einzuf\u00fcgen, m\u00fcssen Sie:<\/p>\n<ul>\n<li>den Bearbeitungsmodus des Diagramms verlassen. Aus irgendeinem Grund werden die richtigen Freigabeeinstellungen f\u00fcr Diagramme nur von der Dashboard-Seite aus angeboten.<\/li>\n<li>Auf das Dreieck neben dem Diagrammnamen klicken und im Men\u00fc 'share' ausw\u00e4hlen.<\/li>\n<li>Im sich \u00f6ffnenden Fenster auf den Tab 'embed' wechseln.<\/li>\n<li>Das H\u00e4kchen bei 'current time range' entfernen \u2013 den Zeitbereich werden wir \u00fcber die URL festlegen. <\/li>\n<li>Das ben\u00f6tigte Thema ausw\u00e4hlen. In meinem Fall ist es light.<\/li>\n<li>Die resultierende URL in die Einstellungskarte lovelace-UI kopieren.<\/li>\n<\/ul>\n<p><\/p>\n<pre><code class=\"python\">      - type: iframe\n        id: graf_water_hourly\n        url: \"http:\/\/192.168.10.200:3000\/d-solo\/rZARemQWk\/water?orgId=1&amp;panelId=2&amp;from=now-2d&amp;to=now&amp;theme=light\"\n<\/code><\/pre>\n<p>\nBeachten Sie, dass der Zeitbereich (letzte 2 Tage) genau hier festgelegt wird und nicht in den Dashboard-Einstellungen. <\/p>\n<p>So sieht das Diagramm aus. Warmwasser habe ich in den letzten 2 Tagen nicht verwendet, weshalb nur das Diagramm f\u00fcr kaltes Wasser angezeigt wird.<\/p>\n<p><img decoding=\"async\" alt=\"Smart Home: Wir erstellen Verbrauchsdiagramme f\u00fcr Wasser und Strom in Home Assistant\" src=\"\/wp-content\/uploads\/2020\/03\/d18c82712d3b829a97ada8c8e2adce24.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nIch habe mich bis jetzt nicht entschieden, welches Diagramm ich besser finde, das mit Linien in Treppenform oder das mit echten S\u00e4ulen. Deshalb werde ich einfach ein Beispiel f\u00fcr ein Tagesdiagramm des Verbrauchs anf\u00fchren, dieses Mal jedoch mit S\u00e4ulen. Die Abfragen werden \u00e4hnlich wie die oben beschriebenen erstellt. Die Anzeigeparameter sind folgende:<\/p>\n<p><img decoding=\"async\" alt=\"Smart Home: Wir erstellen Verbrauchsdiagramme f\u00fcr Wasser und Strom in Home Assistant\" src=\"\/wp-content\/uploads\/2020\/03\/557297e666f9cd73c3d2aa2fd80c0a2d.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nSo sieht dieses Diagramm aus:<\/p>\n<p><img decoding=\"async\" alt=\"Smart Home: Wir erstellen Verbrauchsdiagramme f\u00fcr Wasser und Strom in Home Assistant\" src=\"\/wp-content\/uploads\/2020\/03\/ac8c53569c6b05aeb22e05969de4cd6d.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nNun zum Parameter Stack. In diesem Diagramm wird die S\u00e4ule f\u00fcr kaltes Wasser \u00fcber der S\u00e4ule f\u00fcr warmes Wasser gezeichnet. Die Gesamth\u00f6he entspricht dem gesamten Verbrauch von kaltem und warmem Wasser \u00fcber den Zeitraum. <\/p>\n<p>Alle gezeigten Diagramme sind dynamisch. Man kann mit der Maus \u00fcber einen interessierenden Punkt fahren und die Details sowie den Wert an diesem spezifischen Punkt einsehen. <\/p>\n<p>Leider kam es nicht ohne einen Hauch von Kritik aus. In dem S\u00e4ulendiagramm (im Gegensatz zu einem Treppendiagramm) befindet sich die Mitte der S\u00e4ule nicht zur Mitte des Tages, sondern um 00:00 Uhr. Das bedeutet, dass die linke H\u00e4lfte der S\u00e4ule an der Stelle des vorherigen Tages gezeichnet wird. So sind die Diagramme f\u00fcr Samstag und Sonntag etwas weiter links gezeichnet als die bl\u00e4uliche Zone. Bis jetzt habe ich noch keine L\u00f6sung gefunden, wie ich das \u00fcberwinden kann. <\/p>\n<p>Ein weiteres Problem besteht darin, dass man nicht richtig mit Monatsintervallen arbeiten kann. Der Grund daf\u00fcr ist, dass die L\u00e4nge von Stunde\/Tag\/Woche festgelegt ist, w\u00e4hrend die L\u00e4nge 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 \u00fcber das Jahr hinweg etwas verschoben sein und die S\u00e4ulen werden nicht ganz genau mit den Monaten \u00fcbereinstimmen. Aber da ich dies nur als Zeiger f\u00fcr mein Interesse sehe, ist mir das egal. <\/p>\n<p>Ich sehe mindestens zwei L\u00f6sungen:<\/p>\n<ul>\n<li>Auf monatliche Diagramme verzichten und sich mit w\u00f6chentlichen begn\u00fcgen. 52 w\u00f6chentliche S\u00e4ulen pro Jahr sehen ganz gut aus.<\/li>\n<li>Das monatliche Verbrauchsquantifizieren als Methode Nr. 2 zu betrachten und Grafana nur f\u00fcr sch\u00f6ne Diagramme zu verwenden. Dadurch k\u00f6nnte eine ziemlich pr\u00e4zise L\u00f6sung entstehen. Man k\u00f6nnte sogar die Diagramme des vergangenen Jahres zur Vergleichung \u00fcbereinanderlegen \u2014 daf\u00fcr ist Grafana auch f\u00e4hig.<\/li>\n<\/ul>\n<h2>Fazit<\/h2>\n<p>\nIch wei\u00df nicht warum, aber ich liebe solche Diagramme. Sie zeigen, dass das Leben pulsiert und sich alles ver\u00e4ndert. Gestern gab es viel, heute wenig und morgen wird es irgendwie anders sein. Es bleibt nur abzuwarten, wie die Bed\u00fcrfnisse der Haushaltsangeh\u00f6rigen in Bezug auf den Verbrauch sind. Aber selbst bei den aktuellen Anspr\u00fcchen verwandelt sich einfach eine gro\u00dfe und unverst\u00e4ndliche Zahl auf der Abrechnung in ein deutlich verst\u00e4ndlicheres Bild des Verbrauchs.<\/p>\n<p>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\u00e4ndliches zu sein. Alles \u00e4nderte sich durch den <noindex><a rel=\"nofollow\" href=\"https:\/\/dummylabs.com\/ru\/post\/2019-01-13-influxdb-part1\">oben genannten Artikel,<\/a><\/noindex> \u2014 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.<\/p>\n<p>Im Titel habe ich den Stromverbrauch erw\u00e4hnt. Leider kann ich momentan kein einziges Diagramm pr\u00e4sentieren. Ein SDM120 Z\u00e4hler ist defekt, und der andere hat beim Zugriff \u00fcber Modbus Probleme. Allerdings beeinflusst das das Thema dieses Artikels nicht \u2014 die Diagramme werden auf die gleiche Weise erstellt wie f\u00fcr Wasser.<\/p>\n<p>In diesem Artikel habe ich die Ans\u00e4tze dargestellt, die ich selbst ausprobiert habe. Sicherlich gibt es noch andere M\u00f6glichkeiten zur Organisation der Datenerfassung und -visualisierung, von denen ich nichts wei\u00df. Erz\u00e4hlen Sie mir davon in den Kommentaren, ich w\u00e4re sehr interessiert. Ich freue mich \u00fcber konstruktive Kritik und neue Ideen. Ich hoffe, das hier pr\u00e4sentierte Material hilft ebenfalls jemandem.<br \/>\n<br \/>Quelle: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/492314\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437 \u043f\u043e\u043b\u0443\u0447\u0430\u044f \u043f\u043b\u0430\u0442\u0435\u0436\u043a\u0443 \u0437\u0430 \u044d\u043b\u0435\u043a\u0442\u0440\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0438 \u0432\u043e\u0434\u0443 \u044f \u0443\u0434\u0438\u0432\u043b\u044f\u044e\u0441\u044c \u2014 \u043d\u0435\u0443\u0436\u0435\u043b\u0438 \u043c\u043e\u044f \u0441\u0435\u043c\u044c\u044f \u0441\u0442\u043e\u043e\u043e\u043e\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u044f\u0435\u0442? \u041d\u0443 \u0434\u0430, \u0432 \u0432\u0430\u043d\u043d\u043e\u0439 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d \u0442\u0435\u043f\u043b\u044b\u0439 \u043f\u043e\u043b \u0438 \u0431\u043e\u0439\u043b\u0435\u0440, \u043d\u043e \u0432\u0435\u0434\u044c \u043e\u043d\u0438 \u0436\u0435 \u043d\u0435 \u043a\u043e\u0447\u0435\u0433\u0430\u0440\u044f\u0442 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e. \u0412\u043e\u0434\u0443 \u0442\u043e\u0436\u0435 \u0432\u0440\u043e\u0434\u0435 \u044d\u043a\u043e\u043d\u043e\u043c\u0438\u043c (\u0445\u043e\u0442\u044f \u043f\u043e\u043f\u043b\u0435\u0441\u043a\u0430\u0442\u044c\u0441\u044f \u0432 \u0432\u0430\u043d\u043d\u043e\u0439 \u0442\u043e\u0436\u0435 \u043b\u044e\u0431\u0438\u043c). \u041d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043b\u0435\u0442 \u043d\u0430\u0437\u0430\u0434 \u044f \u0443\u0436\u0435 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u043b \u0441\u0447\u0435\u0442\u0447\u0438\u043a\u0438 \u0432\u043e\u0434\u044b \u0438 \u044d\u043b\u0435\u043a\u0442\u0440\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u043a \u0443\u043c\u043d\u043e\u043c\u0443 \u0434\u043e\u043c\u0443, [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":74422,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-74421","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.1.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/umnyj-dom-stroim-grafiki-potrebleniya-vody-i-elektrichestva-v-home-assistant\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"de_DE\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u0423\u043c\u043d\u044b\u0439 \u0434\u043e\u043c: \u0421\u0442\u0440\u043e\u0438\u043c \u0433\u0440\u0430\u0444\u0438\u043a\u0438 \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u0435\u043d\u0438\u044f \u0432\u043e\u0434\u044b \u0438 \u044d\u043b\u0435\u043a\u0442\u0440\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u0432 Home Assistant | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/umnyj-dom-stroim-grafiki-potrebleniya-vody-i-elektrichestva-v-home-assistant\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-03-17T05:43:08+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-03-17T05:43:08+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Smart Home: Wasser- und Stromverbrauchsdiagramme in Home Assistant erstellen | ProHoster","description":"Jedes Mal.","canonical_url":"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/umnyj-dom-stroim-grafiki-potrebleniya-vody-i-elektrichestva-v-home-assistant","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"de_DE","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u0423\u043c\u043d\u044b\u0439 \u0434\u043e\u043c: \u0421\u0442\u0440\u043e\u0438\u043c \u0433\u0440\u0430\u0444\u0438\u043a\u0438 \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u0435\u043d\u0438\u044f \u0432\u043e\u0434\u044b \u0438 \u044d\u043b\u0435\u043a\u0442\u0440\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u0432 Home Assistant | ProHoster","og:description":"\u041a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437.","og:url":"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/umnyj-dom-stroim-grafiki-potrebleniya-vody-i-elektrichestva-v-home-assistant","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2020-03-17T05:43:08+00:00","article:modified_time":"2020-03-17T05:43:08+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"74421","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 18:15:28","updated":"2022-09-27 16:07:45","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts\/74421","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/comments?post=74421"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts\/74421\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media\/74422"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media?parent=74421"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/categories?post=74421"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/tags?post=74421"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}