{"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: Verbrauchsstatistiken f\u00fcr Wasser und Strom in Home Assistant erstellen","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Smart Home: Verbrauchsstatistiken f\u00fcr Wasser und Strom in Home Assistant erstellen\" 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, frage ich mich, verbraucht meine Familie wirklich soooo viel? Ja, der Fu\u00dfboden im Bad ist beheizt und es gibt einen Boiler, aber die laufen doch nicht st\u00e4ndig. Auch beim Wasser sparen wir anscheinend (obwohl wir gerne auch mal im Bad planschen). Vor einigen Jahren habe ich bereits <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/411259\/\">Wasserz\u00e4hler<\/a><\/noindex> und <noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/watch?v=XKvunh29sZo&amp;list=PLkt_cQxT0oUmfdxhbmTjytjaJjZjSVUOu\">Stromz\u00e4hler<\/a><\/noindex> mit dem Smart Home verbunden, aber damit bin ich nicht weitergekommen. Erst jetzt habe ich die Datenanalyse angegangen, worum es in diesem Artikel geht.<\/p>\n<p>K\u00fcrzlich bin ich auf Home Assistant als mein Smart Home-System umgestiegen. Ein Grund war gerade die M\u00f6glichkeit, eine gro\u00dfe Menge an Daten zu sammeln und auf einfache Weise verschiedene Arten von Grafiken zu erstellen.<\/p>\n<p>Die Informationen in diesem Artikel sind nicht neu; all diese Dinge wurden bereits im Internet unter verschiedenen Vorw\u00e4nden behandelt. Dennoch beschreibt jeder Artikel in der Regel nur einen Ansatz oder Aspekt. Daher musste ich selbst vergleichen und den passendsten Ansatz ausw\u00e4hlen. Der Artikel bietet zwar keine umfassenden Informationen zur Datensammlung, ist aber eine Art Zusammenfassung dessen, wie ich es gemacht habe. Konstruktive Kritik und Verbesserungsvorschl\u00e4ge sind daher willkommen.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>Problemstellung<\/h2>\n<p>\nDas Ziel der heutigen \u00dcbung ist es, sch\u00f6ne Grafiken f\u00fcr Wasser- und Stromverbrauch 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>\nHierbei sto\u00dfen wir auf einige Herausforderungen:<\/p>\n<ul>\n<li>Die Standardgrafikomponenten sind in der Regel ziemlich begrenzt. Im besten Fall kann man ein Liniendiagramm aus den Punkten erstellen.\n<p>Wenn man gut sucht, findet man externe Komponenten, die die F\u00e4higkeiten der Standardgrafiken 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 jedoch auch etwas eingeschr\u00e4nkt:<\/p>\n<ul>\n<li>Es ist schwierig, die Parameter f\u00fcr das Balkendiagramm \u00fcber gro\u00dfe Zeitr\u00e4ume festzulegen (die Breite des Balkens wird in Stundenbruchteilen angegeben, was bedeutet, dass Zeitr\u00e4ume l\u00e4nger als eine Stunde als Dezimalzahlen dargestellt werden m\u00fcssen).<\/li>\n<li>Verschiedene Entit\u00e4ten k\u00f6nnen nicht in ein einziges Diagramm eingef\u00fcgt werden (zum Beispiel Temperatur und Luftfeuchtigkeit oder das Kombinieren eines Balkendiagramms mit einer Linie).<\/li>\n<\/ul>\n<\/li>\n<li>Es ist nicht nur so, dass Home Assistant standardm\u00e4\u00dfig die einfachste Datenbank, SQLite, verwendet (und ich bin, bl\u00f6d wie ich bin, nicht mit der Installation von MySQL oder Postgres klargekommen), sondern auch, dass die Daten nicht optimal gespeichert werden. Bei jeder \u00c4nderung auch der kleinsten digitalen Parameter wird ein riesiges JSON von etwa einem Kilobyte in die Datenbank geschrieben.\n<pre><code class=\"json\">{&quot;entity_id&quot;: &quot;sensor.water_cold_hourly&quot;, &quot;old_state&quot;: {&quot;entity_id&quot;: &quot;sensor.water_cold_hourly&quot;, &quot;state&quot;: &quot;3&quot;, &quot;attributes&quot;: {&quot;source&quot;: &quot;sensor.water_meter_cold&quot;, &quot;status&quot;: &quot;sammelt&quot;, &quot;last_period&quot;: &quot;29&quot;, &quot;last_reset&quot;: &quot;2020-02-23T21:00:00.022246+02:00&quot;, &quot;meter_period&quot;: &quot;stundenweise&quot;, &quot;unit_of_measurement&quot;: &quot;l&quot;, &quot;friendly_name&quot;: &quot;wasser_kalt_st\u00fcndlich&quot;, &quot;icon&quot;: &quot;mdi:counter&quot;}, &quot;last_changed&quot;: &quot;2020-02-23T19:05:06.897604+00:00&quot;, &quot;last_updated&quot;: &quot;2020-02-23T19:05:06.897604+00:00&quot;, &quot;context&quot;: {&quot;id&quot;: &quot;aafc8ca305ba4e49ad4c97f0eddd8893&quot;, &quot;parent_id&quot;: null, &quot;user_id&quot;: null}}, &quot;new_state&quot;: {&quot;entity_id&quot;: &quot;sensor.water_cold_hourly&quot;, &quot;state&quot;: &quot;4&quot;, &quot;attributes&quot;: {&quot;source&quot;: &quot;sensor.water_meter_cold&quot;, &quot;status&quot;: &quot;sammelt&quot;, &quot;last_period&quot;: &quot;29&quot;, &quot;last_reset&quot;: &quot;2020-02-23T21:00:00.022246+02:00&quot;, &quot;meter_period&quot;: &quot;stundenweise&quot;, &quot;unit_of_measurement&quot;: &quot;l&quot;, &quot;friendly_name&quot;: &quot;wasser_kalt_st\u00fcndlich&quot;, &quot;icon&quot;: &quot;mdi:counter&quot;}, &quot;last_changed&quot;: &quot;2020-02-23T19:11:11.251545+00:00&quot;, &quot;last_updated&quot;: &quot;2020-02-23T19:11:11.251545+00:00&quot;, &quot;context&quot;: {&quot;id&quot;: &quot;0de64b8af6f14bb9a419dcf3b200ef56&quot;, &quot;parent_id&quot;: null, &quot;user_id&quot;: null}}}<\/code><\/pre>\n<p>\nIch habe ziemlich viele Sensoren (Temperatursensoren in jedem Raum sowie Wasser- und Stromz\u00e4hler), und einige davon erzeugen eine betr\u00e4chtliche Menge an Daten. Der Stromz\u00e4hler SDM220 zum Beispiel generiert alle 10\u201315 Sekunden etwa zehn Werte, und ich m\u00f6chte davon etwa acht installieren. Zudem gibt es eine ganze Reihe von Parametern, die auf Basis anderer Sensoren berechnet werden. Diese Werte k\u00f6nnen die Datenbank leicht um t\u00e4glich 100\u2013200 MB vergr\u00f6\u00dfern. Nach einer Woche wird das System kaum noch funktionieren, und nach einem Monat wird der Flash-Speicher (bei einer typischen Installation von Home Assistant auf einem Raspberry Pi) den Geist aufgeben. Von einer Datenspeicherung \u00fcber ein ganzes Jahr will ich gar nicht erst reden.<\/li>\n<li>Wenn Sie Gl\u00fcck haben, kann Ihr Z\u00e4hler den Verbrauch selbst berechnen. Sie k\u00f6nnen jederzeit den Z\u00e4hler abfragen, um den aktuellen Stand des Verbrauchs zu erfahren. In der Regel bieten alle Stromz\u00e4hler mit einer digitalen Schnittstelle (RS232\/RS485\/Modbus\/Zigbee) diese M\u00f6glichkeit.\n<p>Schlimmer w\u00e4re es, wenn das Ger\u00e4t einfach nur einen bestimmten Momentanparameter (wie Momentanleistung oder Strom) messen oder regelm\u00e4\u00dfig Impulse alle X Wattstunden oder Liter erzeugen kann. Dann muss man \u00fcberlegen, wie und womit dies integriert werden kann und wo die Werte gespeichert werden. Es besteht das Risiko, einen weiteren Bericht aus irgendeinem Grund zu verpassen, und die Genauigkeit des Systems insgesamt wirft Fragen auf. Man k\u00f6nnte das nat\u00fcrlich alles einem Smart-Home-System wie Home Assistant anvertrauen, aber die Anzahl der Datens\u00e4tze in der Datenbank bleibt eine Herausforderung, und es wird nicht m\u00f6glich sein, die Sensoren \u00f6fter als einmal pro Sekunde abzufragen (Architekturgrenze von Home Assistant).<\/li>\n<\/ul>\n<p><\/p>\n<h2>Ansatz 1<\/h2>\n<p>\nZun\u00e4chst schauen wir, 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 vor l\u00e4ngerer Zeit in Form eines spezialisierten Components \u2014 utility_meter \u2014 realisiert. <\/p>\n<p>Die Funktion des Components besteht darin, eine Variable namens current_accumulated_value intern zu f\u00fchren und diese nach Ablauf eines festgelegten Zeitraums (Stunde\/Woche\/Monat) zur\u00fcckzusetzen. Der Component \u00fcberwacht selbst die eingehende Variable (den Wert eines Sensors) und abonniert \u00c4nderungen an diesem Wert \u2013 Sie erhalten einfach das fertige Ergebnis. Diese Funktion wird in nur wenigen Zeilen in der Konfigurationsdatei beschrieben.<\/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>\nHierbei ist sensor.water_meter_cold der aktuelle Wert des Z\u00e4hlers in Litern, den ich erhalte <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/411259\/\">direkt von der Hardware<\/a><\/noindex> \u00fcber MQTT. Die Konstruktion erstellt zwei neue Sensoren, water_cold_hour_um und water_cold_day_um, die st\u00fcndliche und t\u00e4gliche Werte accumulieren und diese am Ende des Zeitraums zur\u00fccksetzen. Hier ist das Diagramm des st\u00fcndlichen Akkumulators f\u00fcr einen halben Tag.<\/p>\n<p><img decoding=\"async\" alt=\"Smart Home: Verbrauchsstatistiken f\u00fcr Wasser und Strom in Home Assistant erstellen\" 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 Diagramme f\u00fcr das 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>\nEigentlich liegt das Problem dieses Ansatzes in diesem Algorithmus. Wie bereits erw\u00e4hnt, wird f\u00fcr jeden eingehenden Wert (aktuelle Z\u00e4hlerstand f\u00fcr jeden n\u00e4chsten Liter) 1 kB Datensatz in der Datenbank generiert. Jeder Utility Meter erzeugt ebenso einen neuen Wert, der ebenfalls in der Datenbank gespeichert wird. Wenn ich st\u00fcndliche, t\u00e4gliche, w\u00f6chentliche oder monatliche Messwerte erfassen m\u00f6chte, und das f\u00fcr mehrere Wasserverteiler und noch eine Reihe von Stromz\u00e4hlern hinzuf\u00fcge \u2013 wird es eine enorme Menge an Daten geben. Es sind zwar nicht viele Daten an sich, aber da der Home Assistant eine Menge unn\u00f6tiger Informationen in die Datenbank schreibt, wird die Datenbankgr\u00f6\u00dfe exponentiell wachsen. Ich habe sogar Bedenken, die Datenbankgr\u00f6\u00dfe f\u00fcr w\u00f6chentliche und monatliche Diagramme abzusch\u00e4tzen.<\/p>\n<p>Dar\u00fcber hinaus l\u00f6st der Utility Meter das vorgestellte Problem nicht allein. Das Diagramm der Werte, die der Utility Meter liefert, ist eine monoton steigende Funktion, die jede Stunde auf 0 zur\u00fcckgesetzt wird. Wir ben\u00f6tigen jedoch ein verst\u00e4ndliches Diagramm f\u00fcr den Benutzer, das zeigt, wie viele Liter \u00fcber einen Zeitraum konsumiert wurden. Der Standardkomponent history-graph kann das nicht, aber der externe Komponenten mini-graph-card kann uns dabei helfen.<\/p>\n<p>Das ist der Code f\u00fcr die Karte in der 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 Standardoptionen wie Sensornamen, Grafiktyp und Farbe (das Standardorange hat mir nicht gefallen) sind hier drei Einstellungen wichtig:<\/p>\n<ul>\n<li>group_by:hour \u2014 Der Grafik wird mit einer Ausrichtung der Balken zum Beginn der Stunde erstellt.<\/li>\n<li>points_per_hour: 1 \u2014 Ein Balken pro Stunde.<\/li>\n<li>Und das Wichtigste, aggregate_func: max \u2014 Der maximalen Wert innerhalb jeder Stunde wird genommen. Dieses Parameter verwandelt das gezackte Diagramm in Balken.<\/li>\n<\/ul>\n<p>\n<img decoding=\"async\" alt=\"Smart Home: Verbrauchsstatistiken f\u00fcr Wasser und Strom in Home Assistant erstellen\" src=\"\/wp-content\/uploads\/2020\/03\/5bd866c39b23299e5f15dcf4a9bce38f.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nIgnorieren Sie die Reihe an Balken links \u2014 das ist das Standardverhalten des Komponenten, wenn keine Daten vorhanden sind. Und Daten gab es nicht \u2014 ich habe erst vor ein paar Stunden mit der Datenerhebung \u00fcber den Verbrauchsz\u00e4hler nur f\u00fcr diesen Artikel begonnen (meinen aktuellen Ansatz werde ich gleich darunter beschreiben). <\/p>\n<p>In diesem Bild wollte ich zeigen, dass die Datenanzeige manchmal tats\u00e4chlich funktioniert und die Balken die richtigen Werte widerspiegeln. Nur leider nicht alle. Der hervorgehobene Balken f\u00fcr den Zeitraum von 11 bis 12 Uhr zeigt aus irgendeinem Grund 19 Liter an, w\u00e4hrend wir im gezackten Diagramm etwas weiter oben f\u00fcr denselben Zeitraum von demselben Sensor einen Verbrauch von 62 Litern sehen. Entweder ein Fehler oder es liegt an uns. Aber ich habe noch nicht verstanden, warum die Daten rechts fehlen \u2014 der Verbrauch war dort in Ordnung, was auch im gezackten Diagramm zu sehen 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>\u00c4hnlicher Code f\u00fcr den Tagessensor. <\/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>\nBitte beachten Sie, dass der Parameter group_by auf den Wert interval eingestellt ist und der Parameter points_per_hour alles steuert. Das f\u00fchrt zu einem weiteren Problem dieses Components \u2013 points_per_hour funktioniert gut f\u00fcr Grafiken, die einen Zeitraum von einer Stunde oder weniger abdecken, ist aber schlecht f\u00fcr gr\u00f6\u00dfere Zeitr\u00e4ume. Um eine S\u00e4ule f\u00fcr einen Tag darzustellen, musste ich den Wert 1\/24=0.04166666 eingeben. Von w\u00f6chentlichen und monatlichen Grafiken ganz zu schweigen.<\/p>\n<h2>Ansatz 2<\/h2>\n<p>\nAls ich mich gerade mit Home Assistant besch\u00e4ftigte, stie\u00df ich auf dieses Video:<\/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 erfasst den Verbrauch von mehreren Arten von Xiaomi-Steckdosen. Seine Aufgabe ist etwas einfacher \u2013 er m\u00f6chte einfach die Verbrauchswerte von heute, gestern und f\u00fcr den Monat anzeigen. Keine Grafiken sind notwendig. <\/p>\n<p>Lassen wir die \u00dcberlegungen zu einer manuellen Integration der aktuellen Leistungswerte beiseite \u2013 \u00fcber die \"Genauigkeit\" dieses Ansatzes habe ich bereits oben geschrieben. Es ist unklar, warum er die akkumulierten Verbrauchswerte, die bereits von der gleichen Steckdose erfasst werden, nicht verwendet hat. Meiner Meinung nach wird die Integration innerhalb des Ger\u00e4ts besser funktionieren. <\/p>\n<p>Wir nehmen aus dem Video die Idee einer manuellen Verbrauchsz\u00e4hlung \u00fcber einen bestimmten Zeitraum. Der Fokus liegt auf den Werten von heute und gestern, aber wir gehen einen Schritt weiter und versuchen, ein Diagramm zu erstellen. Der Kern der vorgeschlagenen Methode in meinem Fall ist wie folgt.<\/p>\n<p>Wir erstellen eine Variable namens wert_zu_stundenbeginn, in der wir die aktuellen Messwerte des Z\u00e4hlers speichern.<br \/>\nBei einem Timer am Ende der Stunde (oder zu Beginn der n\u00e4chsten) berechnen wir die Differenz zwischen dem aktuellen Wert und dem zu Beginn der Stunde gespeicherten Wert. Diese Differenz stellt den Verbrauch der aktuellen Stunde dar \u2014 wir speichern den Wert in einem Sensor und werden in Zukunft auf dieser Grundlage ein Diagramm erstellen. <br \/>\nAu\u00dferdem muss die Variable wert_zu_stundenbeginn \u201ezur\u00fcckgesetzt\u201c werden, indem der aktuelle Z\u00e4hlerstand dort gespeichert wird.<\/p>\n<p>Das kann alles \u00fcber die Funktionen des Home Assistant gemacht werden. <\/p>\n<p>Der Code wird etwas umfangreicher sein als beim vorherigen Ansatz. Zun\u00e4chst definieren wir diese \u201eVariablen\u201c. Aus der Box heraus haben wir kein Konzept f\u00fcr \u201eVariablen\u201c, aber wir k\u00f6nnen die Dienste eines MQTT-Brokers in Anspruch nehmen. Wir werden dort Werte mit dem Flag retain=true senden \u2013 das speichert den Wert im Broker, und wir k\u00f6nnen ihn jederzeit abrufen, selbst nach einem Neustart von Home Assistant. Ich habe sofort st\u00fcndliche und 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 gesamte Magie findet in der Automatisierung statt, die jeweils jede Stunde und jede Nacht 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 zwei Aktionen durch:<\/p>\n<ul>\n<li>Sie berechnen den Wert f\u00fcr das Intervall als Differenz zwischen dem Anfangs- und Endwert.<\/li>\n<li>Sie aktualisieren den Basiswert f\u00fcr das n\u00e4chste Intervall.<\/li>\n<\/ul>\n<p>\nDie Erstellung von Diagrammen wird in diesem Fall durch einen 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: Verbrauchsstatistiken f\u00fcr Wasser und Strom in Home Assistant erstellen\" 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 einmal pro Intervall generiert werden. Das bedeutet insgesamt 24 Datens\u00e4tze pro Tag f\u00fcr das Stunden-Diagramm. <\/p>\n<p>Leider l\u00f6st dies das allgemeine Problem einer wachsenden Datenbasis nicht. Wenn ich einen monatlichen Verbrauchsbericht m\u00f6chte, m\u00fcsste ich die Daten mindestens ein Jahr lang speichern. Da der Home Assistant nur eine Einstellung f\u00fcr die Speicherdauer f\u00fcr die gesamte Datenbank bereitstellt, bedeutet das, dass ALLE Daten im System ein ganzes Jahr lang aufbewahrt werden m\u00fcssen. Beispielsweise verbrauche ich im Jahr 200 Kubikmeter Wasser, was 200.000 Datens\u00e4tzen in der Datenbank entspricht. Und wenn ich noch andere Sensoren hinzunehme, wird die Zahl wirklich unermesslich.<\/p>\n<h2>Ansatz 3<\/h2>\n<p>\nGl\u00fccklicherweise haben kluge K\u00f6pfe dieses Problem bereits gel\u00f6st, indem sie die InfluxDB-Datenbank entwickelt haben. Diese Datenbank ist speziell f\u00fcr die Speicherung von zeitbasierten Daten optimiert und ideal f\u00fcr die Aufbewahrung von Werten verschiedener Sensoren. Das System bietet auch eine SQL-\u00e4hnliche Abfragesprache, mit der Werte aus der Datenbank extrahiert und auf verschiedene Weise aggregiert werden k\u00f6nnen. Schlie\u00dflich k\u00f6nnen unterschiedliche Daten unterschiedlich lange gespeichert werden. Beispielsweise k\u00f6nnen h\u00e4ufig wechselnde Werte wie Temperatur oder Luftfeuchtigkeit nur ein paar Wochen lang gespeichert werden, w\u00e4hrend t\u00e4gliche Verbrauchswerte \u00fcber ein ganzes Jahr aufbewahrt werden k\u00f6nnen.<\/p>\n<p>Neben InfluxDB haben kluge K\u00f6pfe auch Grafana erfunden \u2013 ein System zur Visualisierung von Daten aus InfluxDB. Grafana kann verschiedene Arten von Diagrammen zeichnen, diese detailliert anpassen und, das Wichtigste, diese Diagramme k\u00f6nnen in die Lovelace-UI des Home Assistant integriert werden.<\/p>\n<p>Inspiriert werden <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>. Die Artikel beschreiben ausf\u00fchrlich den Prozess der Installation und Anbindung von InfluxDB und Grafana an den Home Assistant. Ich konzentriere mich jedoch auf die L\u00f6sung meiner spezifischen Aufgabe.<\/p>\n<p>Beginnen wir also damit, die Z\u00e4hlerwerte in InfluxDB zu speichern. Hier ist ein Auszug aus der Konfiguration des Home Assistant (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 die Speicherung dieser Daten in der internen Datenbank des 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>\nJetzt gehen wir zur InfluxDB-Konsole und richten unsere Datenbank ein. Insbesondere m\u00fcssen wir festlegen, wie lange verschiedene Daten aufbewahrt werden. Dies wird durch die sogenannte Retention Policy geregelt \u2013 sie \u00e4hnelt Datenbanken innerhalb der Hauptdatenbank, wobei jede interne Datenbank eigene 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, w\u00f6chentliche Daten ein Jahr und monatliche Daten \u00fcberhaupt niemals gel\u00f6scht werden. Lassen Sie uns die entsprechenden Retention Policies erstellen.<\/p>\n<pre><code class=\"sql\">CREATE RETENTION POLICY \"month\" ON \"homeassistant\" DURATION 30d REPLICATION 1\nCREATE RETENTION POLICY \"year\" ON \"homeassistant\" DURATION 52w REPLICATION 1\nCREATE RETENTION POLICY \"infinite\" ON \"homeassistant\" DURATION INF REPLICATION 1<\/code><\/pre>\n<p>\nNun kommt der Haupttrick \u2013 die Aggregation von Daten mittels Continuous Query. Dies ist ein Mechanismus, der automatisch einen Abfragebefehl in festgelegten Zeitabst\u00e4nden ausf\u00fchrt, die Daten dieser Abfrage aggregiert und das Ergebnis in einen neuen Wert speichert. Lassen Sie uns das anhand eines Beispiels erl\u00e4utern (ich schreibe vertikal zur besseren Lesbarkeit, aber in der Tat musste ich diesen Befehl in einer Zeile eingeben).<\/p>\n<pre><code class=\"sql\">ERSTELLEN SIE EINE KONTINUIERLICHE ABFRAGE cq_water_hourly IN homeassistant \nBEGIN \n  W\u00c4HLEN SIE max(value) ALS value \n  IN homeassistant.month.water_meter_hour \n  VON homeassistant.autogen.l \n  GRUPPIEREN SIE NACH time(1h), entity_id f\u00fclle(vorhergehend) \nEND<\/code><\/pre>\n<p>\nDieser Befehl:<\/p>\n<ul>\n<li>Erstellt eine kontinuierliche Abfrage mit dem Namen cq_water_cold_hourly in der Datenbank homeassistant<\/li>\n<li>Die Abfrage wird st\u00fcndlich ausgef\u00fchrt (time(1h))<\/li>\n<li>Die Abfrage wird alle Daten aus dem Messwert homeassistant.autogen.l (Liter) abrufen, einschlie\u00dflich der Messwerte f\u00fcr kaltes und warmes Wasser<\/li>\n<li>Die aggregierten Daten werden nach entity_id gruppiert, was uns separate Werte f\u00fcr kaltes und warmes Wasser gibt<\/li>\n<li>Da der Literz\u00e4hler eine monoton wachsende Folge ist, muss innerhalb jeder Stunde der Maximalwert ermittelt werden. Daher erfolgt die Aggregation mit der Funktion max(value) <\/li>\n<li>Der neue Wert wird in homeassistant.month.water_meter_hour gespeichert, wobei month der Name der Aufbewahrungspolitik mit einer Speicherdauer von einem Monat ist. Dabei werden die Daten f\u00fcr kaltes und warmes Wasser in separaten Eintr\u00e4gen mit der entsprechenden entity_id und dem Wert im Feld value abgelegt<\/li>\n<\/ul>\n<p>\nIn der Nacht oder wenn niemand zu Hause ist, wird kein Wasser verbraucht, und dementsprechend gibt es auch keine neuen Eintr\u00e4ge in homeassistant.autogen.l. Um zu vermeiden, dass es L\u00fccken in den regul\u00e4ren Abfragen gibt, kann man fill(previous) verwenden. Dies zwingt InfluxDB, den Wert der letzten Stunde zu nutzen. <\/p>\n<p>Leider hat die continuous query eine Besonderheit: der Trick fill(previous) funktioniert nicht und Eintr\u00e4ge werden einfach nicht erstellt. Es handelt sich hierbei 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 continuous query kann bleiben \u2013 es st\u00f6rt nicht. <\/p>\n<p>\u00dcberpr\u00fcfen wir, was herausgekommen ist (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. Daher gibt es eine Differenz von 3 Stunden \u2013 die Werte f\u00fcr 7 Uhr morgens in der InfluxDB-Ausgabe entsprechen den Werten f\u00fcr 10 Uhr auf den obenstehenden Grafiken. Zudem beachten Sie bitte, dass zwischen 2 und 5 Uhr morgens einfach keine Aufzeichnungen vorhanden sind \u2013 das ist die besondere Eigenschaft der kontinuierlichen Abfrage.<\/p>\n<p>Wie Sie sehen, ist der aggregierte Wert ebenfalls eine monoton wachsende Folge, nur dass die Aufzeichnungen seltener sind \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 es entschl\u00fcsseln:<\/p>\n<ul>\n<li>Wir ziehen 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 Sequenz homeassistant.month.water_meter_hour einige Aufzeichnungen fehlen. Diese Daten werden wir neu generieren, indem wir die Abfrage mit GROUP BY time(1h) ausf\u00fchren. Diesmal wird fill(previous) wie gew\u00fcnscht funktionieren und die fehlenden Daten generieren (die Funktion nimmt den vorherigen Wert).<\/li>\n<li>Das Wichtigste an dieser Abfrage ist die Funktion difference, die den Unterschied zwischen den Zeitstempeln berechnet. Sie funktioniert jedoch nicht allein und ben\u00f6tigt eine aggregierende Funktion. Lassen Sie uns max() verwenden, die zuvor eingesetzt wurde.<\/li>\n<\/ul>\n<p>\nDas Ergebnis der Ausf\u00fchrung 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 wir 0 erhalten, was genau das ist, was ben\u00f6tigt wird.<\/p>\n<p>Jetzt bleibt nur noch, das Diagramm zu erstellen. Dazu \u00f6ffnen wir Grafana, ein vorhandenes Dashboard (oder erstellen ein neues), und f\u00fcgen ein neues Panel hinzu. Die Diagrammeinstellungen werden wie folgt sein.<\/p>\n<p><img decoding=\"async\" alt=\"Smart Home: Verbrauchsstatistiken f\u00fcr Wasser und Strom in Home Assistant erstellen\" 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 anzeigen. Die Abfrage ist genau die gleiche wie die oben beschriebene. <\/p>\n<p>Die Anzeigeparameter werden wie folgt festgelegt. In meinem Fall handelt es sich um ein Liniendiagramm (lines), das stufenweise (stairs) verl\u00e4uft. Den Parameter Stack werde ich gleich n\u00e4her erl\u00e4utern. Weiter unten gibt es noch einige Anzeigeneinstellungen, die aber weniger interessant sind.<\/p>\n<p><img decoding=\"async\" alt=\"Smart Home: Verbrauchsstatistiken f\u00fcr Wasser und Strom in Home Assistant erstellen\" src=\"\/wp-content\/uploads\/2020\/03\/cb47fc8570b7fd1305ce3451e0518f11.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nUm das erhaltene Diagramm in Home Assistant hinzuzuf\u00fcgen, m\u00fcssen Sie:<\/p>\n<ul>\n<li>aus dem Bearbeitungsmodus des Diagramms herausgehen. Aus irgendeinem Grund werden die richtigen Einstellungen zum Teilen von Diagrammen nur von der Dashboard-Seite angeboten.<\/li>\n<li>Auf den kleinen Pfeil neben dem Diagrammnamen klicken und im Men\u00fc 'share' ausw\u00e4hlen.<\/li>\n<li>Im sich \u00f6ffnenden Fenster zur Registerkarte 'embed' wechseln.<\/li>\n<li>Das H\u00e4kchen bei 'current time range' entfernen \u2014 den Zeitbereich legen wir \u00fcber die URL fest. <\/li>\n<li>Das gew\u00fcnschte Thema ausw\u00e4hlen. In meinem Fall ist es hell (light).<\/li>\n<li>Die erhaltene URL in die Konfiguration des Lovelace-UI einf\u00fcgen.<\/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>\nBitte beachten 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. In den letzten 2 Tagen habe ich kein hei\u00dfes Wasser genutzt, daher wird nur das Diagramm f\u00fcr kaltes Wasser angezeigt.<\/p>\n<p><img decoding=\"async\" alt=\"Smart Home: Verbrauchsstatistiken f\u00fcr Wasser und Strom in Home Assistant erstellen\" src=\"\/wp-content\/uploads\/2020\/03\/d18c82712d3b829a97ada8c8e2adce24.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nIch habe f\u00fcr mich selbst noch nicht entschieden, welches Diagramm ich besser finde: das Stufendiagramm oder die tats\u00e4chlichen S\u00e4ulen. Daher f\u00fchre ich einfach ein Beispiel eines Tagesverbrauchsdiagramms an, diesmal jedoch in Form von S\u00e4ulen. Die Anfragen werden \u00e4hnlich wie zuvor beschrieben erstellt. Die Anzeigeparameter sind folgende:<\/p>\n<p><img decoding=\"async\" alt=\"Smart Home: Verbrauchsstatistiken f\u00fcr Wasser und Strom in Home Assistant erstellen\" 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: Verbrauchsstatistiken f\u00fcr Wasser und Strom in Home Assistant erstellen\" 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 kalte Wassers\u00e4ule \u00fcber der hei\u00dfen Wassers\u00e4ule gezeichnet. Die Gesamth\u00f6he entspricht dem Gesamtverbrauch von kaltem und hei\u00dfem Wasser \u00fcber den Zeitraum. <\/p>\n<p>Alle gezeigten Diagramme sind dynamisch. Man kann mit der Maus \u00fcber einen interessanten Punkt fahren, um Details und Werte an diesem spezifischen Punkt zu sehen. <\/p>\n<p>Leider ging es nicht ohne eine kleine Portion Pech. Im S\u00e4ulendiagramm (im Gegensatz zum Stufendiagramm) befindet sich die Mitte der S\u00e4ule nicht in der Mitte des Tages, sondern um 00:00 Uhr. Das hei\u00dft, die linke H\u00e4lfte der S\u00e4ule wird an der Stelle des vorherigen Tages gezeichnet. Die Diagramme f\u00fcr Samstag und Sonntag sind also etwas weiter links als die bl\u00e4uliche Zone. Bisher habe ich noch keine L\u00f6sung daf\u00fcr gefunden. <\/p>\n<p>Ein weiteres Problem besteht darin, dass es nicht m\u00f6glich ist, mit monatlichen Intervallen korrekt zu arbeiten. Der Grund ist, dass die Dauer von Stunde\/Tag\/Woche fixiert ist, w\u00e4hrend die Dauer eines Monats jedes Mal anders ist. InfluxDB kann nur mit einheitlichen Intervallen arbeiten. Bisher hatte ich die Idee, ein fixes Intervall von 30 Tagen festzulegen. Ja, die Grafik wird im Laufe des Jahres ein wenig verzerrt sein, und die S\u00e4ulen werden nicht ganz genau mit den Monaten \u00fcbereinstimmen. Aber da ich daran interessiert bin, es einfach als Messger\u00e4t zu nutzen, ist das f\u00fcr mich in Ordnung. <\/p>\n<p>Ich sehe mindestens zwei L\u00f6sungen:<\/p>\n<ul>\n<li>Monatliche Grafiken vernachl\u00e4ssigen und sich auf w\u00f6chentliche beschr\u00e4nken. 52 w\u00f6chentliche S\u00e4ulen pro Jahr sehen durchaus gut aus.<\/li>\n<li>Den monatlichen Verbrauch als Methode Nr. 2 berechnen und Grafana nur f\u00fcr ansprechende Grafiken verwenden. Das wird ein ziemlich genaues Ergebnis liefern. Man k\u00f6nnte sogar die Grafiken des letzten Jahres zum Vergleich \u00fcberlagern - Grafana kann sowas.<\/li>\n<\/ul>\n<h2>Fazit<\/h2>\n<p>\nIch wei\u00df nicht, warum, aber ich bin ein gro\u00dfer Fan solcher Grafiken. Sie zeigen, dass das Leben pulsierend ist und sich st\u00e4ndig ver\u00e4ndert. Gestern gab es viel, heute wenig, und morgen wird es irgendwie wieder anders sein. Ich muss noch mit den Familienmitgliedern \u00fcber den Verbrauch sprechen. Aber selbst bei den aktuellen Bed\u00fcrfnissen verwandelt sich die gro\u00dfe und unklare Zahl auf der Rechnung bereits in ein ziemlich klares Bild des Verbrauchs.<\/p>\n<p>Trotz meiner fast 20-j\u00e4hrigen Karriere als Programmierer hatte ich kaum mit Datenbanken zu tun. Daher schien mir die Einrichtung einer externen Datenbank etwas, das zu kompliziert und unverst\u00e4ndlich war. Alles \u00e4nderte sich durch <noindex><a rel=\"nofollow\" href=\"https:\/\/dummylabs.com\/ru\/post\/2019-01-13-influxdb-part1\">den oben erw\u00e4hnten Artikel<\/a><\/noindex> \u2014 es stellte sich heraus, dass das Anbringen des passenden Werkzeugs mit ein paar Klicks erledigt ist, und mit einem spezialisierten Werkzeug wird die Erstellung von Grafiken etwas einfacher.<\/p>\n<p>Im Titel habe ich den Stromverbrauch erw\u00e4hnt. Leider kann ich im Moment keine Grafiken pr\u00e4sentieren. Ein SDM120 Z\u00e4hler ist kaputt gegangen, und der andere hat beim Zugriff \u00fcber Modbus Probleme. Dennoch hat das keinen Einfluss auf das Thema dieses Artikels \u2013 die Grafiken werden auf die gleiche Weise erstellt wie die f\u00fcr Wasser.<\/p>\n<p>In diesem Artikel teile ich die Ans\u00e4tze, die ich selbst ausprobiert habe. Sicherlich gibt es noch weitere M\u00f6glichkeiten zur Organisation der Datensammlung und -visualisierung, von denen ich nichts wei\u00df. Lassen Sie es mich in den Kommentaren wissen, ich w\u00fcrde mich sehr dar\u00fcber freuen. Konstruktive Kritik und neue Ideen sind immer willkommen. Ich hoffe, das Material hilft auch jemandem anderen.<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 4.9.10 - aioseo.com -->\n\t<meta name=\"description\" content=\"\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,\" \/>\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) 4.9.10\" \/>\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 \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,\" \/>\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: Wir erstellen Grafiken f\u00fcr den Wasser- und Stromverbrauch in Home Assistant | ProHoster","description":"Jedes Mal, wenn ich die Rechnung f\u00fcr Strom und Wasser bekomme, bin ich erstaunt \u2013 verbraucht meine Familie wirklich so viel? Ja, im Bad haben wir Fu\u00dfbodenheizung und einen Boiler, aber die laufen nicht st\u00e4ndig. Auch beim Wasser sparen wir eigentlich (obwohl wir das Baden nicht verleugnen k\u00f6nnen). Vor einigen Jahren habe ich bereits die Wasser- und Stromz\u00e4hler mit dem Smart Home verbunden.","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 \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,","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"},"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}]}}