{"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\/da\/blog\/administrirovanie\/umnyj-dom-stroim-grafiki-potrebleniya-vody-i-elektrichestva-v-home-assistant","title":{"rendered":"Smart Home: Bygger forbrugsgrafer for vand og elektricitet i Home Assistant","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Smart Home: Bygger forbrugsgrafer for vand og elektricitet i Home Assistant\" src=\"\/wp-content\/uploads\/2020\/03\/f1133a4c391e901ed64bf0825a774fc6.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nHver gang jeg modtager regningen for elektricitet og vand, undrer jeg mig \u2014 forbruger min familie virkelig s\u00e5 meget? Ja, der er varmeunderlag og en varmtvandsbeholder i badev\u00e6relset, men de k\u00f8rer jo ikke hele tiden. Vi pr\u00f8ver ogs\u00e5 at spare p\u00e5 vandet (selvom vi ogs\u00e5 godt kan lide at tage karbad). For flere \u00e5r siden <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/411259\/\">tilsluttede jeg vandm\u00e5lere<\/a><\/noindex> og <noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/watch?v=XKvunh29sZo&amp;list=PLkt_cQxT0oUmfdxhbmTjytjaJjZjSVUOu\">elektricitet<\/a><\/noindex> til mit smarte hjem, men s\u00e5 stoppede det ligesom der. F\u00f8rst nu er jeg kommet til at analysere forbruget, og det er, hvad denne artikel handler om.<\/p>\n<p>For nylig skiftede jeg til Home Assistant som mit smarte hjem-system. En af grundene var netop muligheden for at organisere indsamlingen af mange data med muligheden for nemt at opbygge forskellige typer grafer.<\/p>\n<p>Oplysningerne beskrevet i denne artikel er ikke nye, alle disse ting er allerede blevet beskrevet online i forskellige former. Men hver artikel beskriver som regel kun \u00e9n tilgang eller aspekt. At sammenligne alle disse tilgange og v\u00e6lge den mest passende m\u00e5tte jeg g\u00f8re selv. Artiklen giver stadig ikke fyldestg\u00f8rende information om indsamling af data, men fungerer som et slags resum\u00e9 af, hvordan jeg gjorde det. S\u00e5 konstruktiv kritik og forslag til forbedringer er velkomne.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>Problemformulering<\/h2>\n<p>\nS\u00e5 m\u00e5let for dagens \u00f8velse er at f\u00e5 flotte grafer over vand- og elforbrug:<\/p>\n<ul>\n<li>Timebaseret for 2 dage<\/li>\n<li>Dagligt for 2 uger<\/li>\n<li>(valgfrit) ugentligt og m\u00e5nedligt<\/li>\n<\/ul>\n<p>\nHer st\u00e5r vi over for nogle udfordringer:<\/p>\n<ul>\n<li>Standardgrafkomponenter er som regel ret begr\u00e6nsede. I bedste fald kan man lave en linjegraf baseret p\u00e5 punkter.\n<p>Hvis man s\u00f8ger godt, kan man finde tredjeparts komponenter, der udvider mulighederne for den standardgraf. For Home Assistant er der en ret god og p\u00e6n komponent <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/kalkih\/mini-graph-card\">mini-graph-card<\/a><\/noindex>, men den er ogs\u00e5 lidt begr\u00e6nset:<\/p>\n<ul>\n<li>Det er sv\u00e6rt at indstille parametre for s\u00f8jlediagrammer over lange intervaller (s\u00f8jlens bredde indstilles i timer, hvilket betyder, at intervaller l\u00e6ngere end en time vil blive angivet med br\u00f8ker)<\/li>\n<li>Man kan ikke tilf\u00f8je forskellige enheder p\u00e5 \u00e9n graf (for eksempel temperatur og luftfugtighed, eller kombinere et s\u00f8jlediagram med en linje)<\/li>\n<\/ul>\n<\/li>\n<li>Ikke blot bruger home assistant som standard den mest primitive database SQLite (og jeg, h\u00e6nderne p\u00e5 ryggen, kunne ikke f\u00e5 installeret MySQL eller Postgres), men dataene gemmes heller ikke p\u00e5 den mest optimale m\u00e5de. For eksempel, ved hver \u00e6ndring af selv den mindste digitale parameter skrives der en enorm JSON p\u00e5 omkring et kilobyte til databasen.\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>\nJeg har ret mange sensorer (temperaturm\u00e5lere i hvert rum, vand- og elm\u00e5lere), og nogle genererer desuden en del data. For eksempel genererer el-m\u00e5leren SDM220 omkring ti v\u00e6rdier hvert 10-15. sekund, og jeg ville gerne installere omkring 8 af s\u00e5danne m\u00e5lere. Derudover er der en hel bunke parametre, der beregnes p\u00e5 baggrund af andre sensorer. S\u00e5 alle disse v\u00e6rdier kan nemt f\u00e5 databasen til at vokse med 100-200 MB dagligt. Efter en uge vil systemet n\u00e6sten v\u00e6re i stand til at fungere, og efter en m\u00e5ned vil USB-stikket svigte (i tilf\u00e6lde af en typisk installation af home assistant p\u00e5 en Raspberry Pi), og der kan slet ikke v\u00e6re tale om at gemme data i et helt \u00e5r.<\/li>\n<li>Hvis du er heldig, kan din m\u00e5ler selv holde styr p\u00e5 forbruget. Du kan til enhver tid henvende dig til m\u00e5leren og sp\u00f8rge, hvilken time det akkumulerede forbrug er. Som regel giver alle elm\u00e5lere med et digitalt interface (RS232\/RS485\/Modbus\/Zigbee) denne mulighed.\n<p>Det er v\u00e6rre, hvis enheden blot kan m\u00e5le en \u00f8jeblikkelig parameter (fx \u00f8jeblikkelig effekt eller str\u00f8m) eller blot generere impulser hver X watt-timer eller liter. S\u00e5 skal man t\u00e6nke over, hvordan og med hvilket udstyr det skal integreres, og hvor v\u00e6rdien skal opbevares. Der er en risiko for, at man g\u00e5r glip af en rapport af en eller anden grund, og systemets n\u00f8jagtighed i sin helhed rejser sp\u00f8rgsm\u00e5l. Man kan selvf\u00f8lgelig overlade alt dette til et smart home-system som home assistant, men punktet om antallet af poster i databasen er stadig relevant, og man kan ikke sp\u00f8rge sensorer oftere end en gang i sekundet (begr\u00e6nsning i home assistant-arkitekturen).<\/li>\n<\/ul>\n<p><\/p>\n<h2>Tilgang 1<\/h2>\n<p>\nF\u00f8rst ser vi p\u00e5, hvad home assistant tilbyder ud af boksen. M\u00e5l for forbrug over en periode er en meget efterspurgt funktion. Naturligvis er den blevet implementeret for l\u00e6ngst som en specialiseret komponent \u2014 utility_meter. <\/p>\n<p>Essensen af komponenten er, at den internt opretter en variabel current_accumulated_value og nulstiller den efter udl\u00f8bet af den angivne periode (time\/uge\/m\u00e5ned). Komponentet overv\u00e5ger selv den indkommende variabel (v\u00e6rdien af en sensor) og abonnerer selv p\u00e5 \u00e6ndringer i v\u00e6rdien \u2014 du f\u00e5r blot det f\u00e6rdige resultat. Denne ting beskrives blot med et par linjer i konfigurationsfilen.<\/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>\nHer er sensor.water_meter_cold den aktuelle v\u00e6rdi af m\u00e5leren i liter, som jeg modtager <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/411259\/\">direkte fra enheden<\/a><\/noindex> via mqtt. Strukturen opretter 2 nye sensorer, water_cold_hour_um og water_cold_day_um, som opsamler time- og dagsm\u00e5linger og nulstiller dem efter periodeens udl\u00f8b. Her er grafen for det timebaserede opsamlingssystem over en halv dag.<\/p>\n<p><img decoding=\"async\" alt=\"Smart Home: Bygger forbrugsgrafer for vand og elektricitet i Home Assistant\" src=\"\/wp-content\/uploads\/2020\/03\/d3c3ea29c10b17142e51ebe756ab7123.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nKoden til time- og dagsgraferne til lovelace-UI ser s\u00e5dan ud:<\/p>\n<pre><code class=\"python\">      - type: history-graph\n        title: 'Timeforbrug af vand ved brug af variabler'\n        hours_to_show: 48\n        entities:\n          - sensor.water_hour\n\n      - type: history-graph\n        title: 'Dagsforbrug af vand ved brug af variabler'\n        hours_to_show: 360\n        entities:\n          - sensor.water_day\n<\/code><\/pre>\n<p>\nEgentlig ligger problemet med denne tilgang i den algoritme. Som jeg n\u00e6vnte, genereres der 1 kB optegnelse i databasen for hver indg\u00e5ende v\u00e6rdi (det nuv\u00e6rende m\u00e5lerafl\u00e6sning for hver efterf\u00f8lgende liter). Hver utility meter genererer ogs\u00e5 en ny v\u00e6rdi, som ogs\u00e5 gemmes i databasen. Hvis jeg \u00f8nsker at samle time-\/dag-\/uge-\/m\u00e5nedlige afl\u00e6sninger, ja, for flere vand-r\u00f8r, og s\u00e5 tilf\u00f8je en bunke elektricitetsm\u00e5lere \u2014 s\u00e5 vil det blive utrolig mange data. N\u00e6rmere bestemt er der ikke meget data, men fordi home assistant skriver en masse un\u00f8dvendig information til databasen, vil st\u00f8rrelsen p\u00e5 databasen vokse hastigt. Jeg frygter endda at overveje databasen for ugeskemaer og m\u00e5nedlige diagrammer.<\/p>\n<p>Derudover l\u00f8ser utility meter i sig selv ikke det stillede problem. Grafen med v\u00e6rdierne, som utility meter leverer, er en monotont stigende funktion, der nulstilles til 0 hver time. Vi har brug for en brugervenlig graf over forbruget, hvor mange liter der er blevet brugt i perioden. Den standardkomponent, history-graph, kan ikke g\u00f8re det, men den eksterne komponent mini-graph-card kan hj\u00e6lpe os.<\/p>\n<p>Her er koden til kortet til 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: \"Timeforbrugsforbrug sammenflettet af m\u00e5ler\"\n        points_per_hour: 1\n        show:\n          graph: bar\n        type: 'custom:mini-graph-card'<\/code><\/pre>\n<p>\nUdover de standardindstillinger som sensorens navn, grafens type, farve (den standard orange kunne jeg ikke lide), er der tre vigtige indstillinger:<\/p>\n<ul>\n<li>group_by:hour \u2014 grafen vil blive genereret med justering af s\u00f8jlerne ved timens begyndelse<\/li>\n<li>points_per_hour: 1 \u2014 en s\u00f8jle for hver time<\/li>\n<li>Og det vigtigste, aggregate_func: max \u2014 tage den maksimale v\u00e6rdi inden for hver time. Netop denne parameter omdanner det s\u00e5kaldte saggede diagram til s\u00f8jler<\/li>\n<\/ul>\n<p>\n<img decoding=\"async\" alt=\"Smart Home: Bygger forbrugsgrafer for vand og elektricitet i Home Assistant\" src=\"\/wp-content\/uploads\/2020\/03\/5bd866c39b23299e5f15dcf4a9bce38f.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nIgnore venstre kolonne af s\u00f8jler \u2014 det er standardadf\u00e6rden for komponenten, hvis der ikke er data. Og der var heller ikke data \u2014 jeg aktiverede f\u00f8rst dataindsamlingen fra utility meter for bare et par timer siden kun til denne artikel (jeg vil fort\u00e6lle om min nuv\u00e6rende tilgang lidt l\u00e6ngere nede). <\/p>\n<p>I wanted to show in this picture that sometimes the data display even works, and the bars actually reflect the correct values. However, not all of them. The highlighted bar for the period from 11 to 12 AM displays 19 liters, although the jagged graph slightly above shows a consumption of 62 liters for the same period from the same sensor. It's either a bug or someone's got a little something wrong. I'm still trying to figure out why the data is broken on the right \u2014 the consumption was normal, as can also be seen from the jagged graph.<\/p>\n<p>Overall, I couldn\u2019t achieve credibility with this approach \u2014 the graph almost always shows some nonsense.<\/p>\n<p>An equivalent code for the daily 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: \"Dagsforbrug sammenflettet af m\u00e5ler\"\n        points_per_hour: 0.0416666666\n        show:\n          graph: bar\n        type: 'custom:mini-graph-card'\n<\/code><\/pre>\n<p>\nNote that the group_by parameter is set to interval, and the points_per_hour parameter controls everything. This leads to another problem with this component \u2014 points_per_hour works well on graphs for one hour or less, but poorly on longer intervals. To get one bar for one day, I had to write the value 1\/24=0.04166666. I\u2019m not even talking about weekly and monthly graphs.<\/p>\n<h2>Approach 2<\/h2>\n<p>\nWhile still figuring out Home Assistant, I came across this 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=\"Afspil video\" loading=\"lazy\" width=\"480\" height=\"360\" style=\"width:100%;height:auto;\">\r\n        <div class=\"play-button\"><\/div>\r\n    <\/div><\/center><br \/>\nA friend collects consumption data from several types of Xiaomi sockets. His task is a bit simpler \u2014 just to display the consumption value for today, yesterday, and for the month. No graphs are required. <\/p>\n<p>Let's put aside discussions about manually integrating instantaneous power values \u2014 I've already written about the 'accuracy' of this approach above. It's unclear why he didn\u2019t use the accumulated consumption values that are already being gathered by the same socket. In my opinion, integrating the values inside the device will yield better results. <\/p>\n<p>From the video, we will take the idea of manually calculating consumption for a period. The guy only counts the values for today and yesterday, but we will go further and try to draw a graph. The essence of the proposed method in my case is as follows.<\/p>\n<p>We will create a variable initial_value_at_hour, which will store the current readings of the meter.<br \/>\nVed timens slut, eller i begyndelsen af den n\u00e6ste, beregner vi forskellen mellem den nuv\u00e6rende afl\u00e6sning og den gemte afl\u00e6sning fra begyndelsen af timen. Denne forskel vil v\u00e6re forbruget for den aktuelle time \u2014 vi gemmer v\u00e6rdien i sensoren, og i fremtiden vil vi bygge et diagram baseret p\u00e5 denne v\u00e6rdi. <br \/>\nVi skal ogs\u00e5 \"nulstille\" variablen v\u00e6rdi_i_begyndelsen_af_timen ved at skrive den nuv\u00e6rende v\u00e6rdi af t\u00e6lleren ind.<\/p>\n<p>Alt dette kan g\u00f8res gennem hjemmetjenesterne selv. <\/p>\n<p>Koden vil kr\u00e6ve lidt mere end i den tidligere tilgang. F\u00f8rst skal vi oprette disse \"variabler\". Der er ikke en \"variabel\"-enhed som standard, men vi kan bruge en MQTT-broker. Vi sender v\u00e6rdier derhen med flaget retain=true \u2014 dette vil gemme v\u00e6rdien i brokeren, og den kan til enhver tid hentes derfra, selv ved genstart af Home Assistant. Jeg lavede b\u00e5de timet\u00e6llere og dagt\u00e6llere.<\/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>\nAl sin magi sker i automatiseringen, som k\u00f8rer hvert time og hver nat.<\/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>\nBegge automatiseringer udf\u00f8rer 2 handlinger:<\/p>\n<ul>\n<li>Beregner v\u00e6rdien for intervallet som forskellen mellem start- og slutv\u00e6rdi<\/li>\n<li>Opdaterer basisv\u00e6rdien til det n\u00e6ste interval<\/li>\n<\/ul>\n<p>\nOpbygningen af diagrammer l\u00f8ses i dette tilf\u00e6lde med et almindeligt history-graph:<\/p>\n<pre><code class=\"python\">      - type: history-graph\n        title: 'Timeforbrug af vand ved brug af variabler'\n        hours_to_show: 48\n        entities:\n          - sensor.water_hour\n\n      - type: history-graph\n        title: 'Dagsforbrug af vand ved brug af variabler'\n        hours_to_show: 360\n        entities:\n          - sensor.water_day<\/code><\/pre>\n<p>\nS\u00e5dan ser det ud:<\/p>\n<p><img decoding=\"async\" alt=\"Smart Home: Bygger forbrugsgrafer for vand og elektricitet i Home Assistant\" src=\"\/wp-content\/uploads\/2020\/03\/ebde2fc5f0a72d7d6ba565c3686dc9c6.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nI princippet er det allerede, hvad der er n\u00f8dvendigt. Fordelen ved denne metode er, at data genereres \u00e9n gang pr. interval. Det vil sige i alt 24 poster per dag for timegrafen. <\/p>\n<p>Desv\u00e6rre l\u00f8ser det stadig ikke det generelle problem med den voksende database. Hvis jeg \u00f8nsker en m\u00e5nedsvis forbrugsgraf, bliver jeg n\u00f8dt til at gemme data i mindst et \u00e5r. Og da home assistant kun tilbyder \u00e9n indstilling for opbevaringsvarighed for hele databasen, betyder det, at ALLE data i systemet skal gemmes i et helt \u00e5r. For eksempel forbruger jeg 200 kubikmeter vand om \u00e5ret, hvilket betyder 200000 poster i databasen. Og hvis man tager andre sensorer i betragtning, bliver tallet faktisk uh\u00f8rt h\u00f8jt.<\/p>\n<h2>Tilgang 3<\/h2>\n<p>\nHeldigvis har kloge mennesker allerede l\u00f8st dette problem ved at skrive databasen InfluxDB. Denne database er specielt optimeret til opbevaring af tidsbaserede data og er ideel til at gemme v\u00e6rdier fra forskellige sensorer. Systemet tilbyder ogs\u00e5 et SQL-lignende foresp\u00f8rgselssprog, som g\u00f8r det muligt at udtr\u00e6kke v\u00e6rdier fra databasen og aggregere dem p\u00e5 forskellige m\u00e5der. Endelig kan forskellige data gemmes i forskellige perioder. For eksempel kan ofte skiftende m\u00e5linger s\u00e5som temperatur eller fugtighed opbevares i kun et par uger, mens daglige forbrugsoplysninger kan gemmes i et helt \u00e5r.<\/p>\n<p>Udover InfluxDB har kloge mennesker ogs\u00e5 opfundet Grafana - et system til at lave diagrammer baseret p\u00e5 data fra InfluxDB. Grafana kan tegne forskellige typer diagrammer, tilpasse dem i detaljer, og vigtigst af alt, disse diagrammer kan 'inds\u00e6ttes' i lovelace-UI i home assistant.<\/p>\n<p>At lade sig inspirere <noindex><a rel=\"nofollow\" href=\"https:\/\/dummylabs.com\/ru\/post\/2019-01-13-influxdb-part1\/\">her <\/a><\/noindex> og <noindex><a rel=\"nofollow\" href=\"https:\/\/dummylabs.com\/ru\/post\/2019-05-28-influxdb-part2\/\">her<\/a><\/noindex>. Artiklerne beskriver detaljeret processen for installation og tilslutning af InfluxDB og Grafana til home assistant. Jeg vil dog fokusere p\u00e5 at l\u00f8se min specifikke opgave.<\/p>\n<p>S\u00e5, f\u00f8rst og fremmest starter vi med at samle v\u00e6rdien fra t\u00e6lleren i InfluxDB. Et stykke konfiguration til home assistant (i dette eksempel vil jeg have det sjovt med b\u00e5de koldt og varmt vand):<\/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>\nLad os deaktivere gemmingen af disse samme data i home assistants interne database, for ikke at bl\u00e6se den op un\u00f8digt:<\/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>\nLad os nu g\u00e5 til InfluxDB-konsollen og konfigurere vores database. Is\u00e6r skal vi indstille, hvor lang tid de forskellige data skal opbevares. Dette reguleres af s\u00e5kaldt retention policy - det ligner databaser inden for den prim\u00e6re database, og hver intern database har sine egne indstillinger. Som standard opbevares alle data i retention policy kaldet autogen, og disse data vil blive opbevaret i en uge. Jeg \u00f8nsker, at time-data opbevares i en m\u00e5ned, uge-data i et \u00e5r, og m\u00e5nedlige data slet ikke skal slettes. Lad os oprette de relevante retention policies.<\/p>\n<pre><code class=\"sql\">OPRET RETENTION POLITIK \"m\u00e5ned\" P\u00c5 \"homeassistant\" VARIGHED 30d REPLIKATION 1\nOPRET RETENTION POLITIK \"\u00e5r\" P\u00c5 \"homeassistant\" VARIGHED 52w REPLIKATION 1\nOPRET RETENTION POLITIK \"uendelig\" P\u00c5 \"homeassistant\" VARIGHED INF REPLIKATION 1<\/code><\/pre>\n<p>\nNu kommer selve hovedtricket - dataaggregation ved hj\u00e6lp af en kontinuerlig foresp\u00f8rgsel. Dette er en mekanisme, der automatisk k\u00f8rer en foresp\u00f8rgsel med bestemte intervaller, aggregerer dataene ud fra denne foresp\u00f8rgsel, og gemmer resultatet som en ny v\u00e6rdi. Lad os se p\u00e5 et eksempel (jeg skriver i kolonner for l\u00e6sbarhed, men i virkeligheden m\u00e5tte jeg indtaste denne kommando i en enkelt linje).<\/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>\nDenne kommando:<\/p>\n<ul>\n<li>Opretter en kontinuerlig foresp\u00f8rgsel med navnet cq_water_cold_hourly i databasen homeassistant.<\/li>\n<li>Foresp\u00f8rgslen vil blive k\u00f8rt hver time (time(1h)).<\/li>\n<li>Foresp\u00f8rgslen vil indhente alle data fra measurement'en homeassistant.autogen.l (liter), inklusive m\u00e5linger af koldt og varmt vand.<\/li>\n<li>De aggregerede data vil blive grupperet efter entity_id, hvilket skaber separate v\u00e6rdier for koldt og varmt vand.<\/li>\n<li>Da liter t\u00e6lleren er en monoton stigende sekvens, er det n\u00f8dvendigt at tage den maksimale v\u00e6rdi inden for hver time, s\u00e5 aggregation vil blive udf\u00f8rt med funktionen max(value). <\/li>\n<li>Den nye v\u00e6rdi vil blive skrevet til homeassistant.month.water_meter_hour, hvor month er navnet p\u00e5 retention policy med en opbevaringsperiode p\u00e5 en m\u00e5ned. Dataene for koldt og varmt vand vil s\u00e5ledes v\u00e6re spredt over separate poster med de respektive entity_id og v\u00e6rdien i feltet value.<\/li>\n<\/ul>\n<p>\nOm natten eller n\u00e5r der ikke er nogen hjemme, er der intet vandforbrug, og derfor er der heller ingen nye poster i homeassistant.autogen.l. For at forhindre manglende v\u00e6rdier i de almindelige foresp\u00f8rgsler kan man bruge fill(previous). Dette vil f\u00e5 InfluxDB til at anvende v\u00e6rdien fra den foreg\u00e5ende time. <\/p>\n<p>Desv\u00e6rre har den kontinuerlige foresp\u00f8rgsel en s\u00e6rlig egenskab: tricket fill(previous) fungerer ikke, og poster bliver simpelthen ikke oprettet. Faktisk er det et uovervindeligt problem, som <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/influxdata\/influxdb\/issues\/3220\">har v\u00e6ret diskuteret i flere \u00e5r.<\/a><\/noindex>. Vi vil tage os af dette problem senere, men lad fill(previous) i den kontinuerlige foresp\u00f8rgsel v\u00e6re \u2014 det skader ikke. <\/p>\n<p>Lad os tjekke, hvad vi har f\u00e5et (selvf\u00f8lgelig skal vi vente et par timer):<\/p>\n<pre><code class=\"python\">&gt; select * from homeassistant.month.water_meter_hour group by entity_id\n...\nnavn: water_meter_hour\ntags: entity_id=water_meter_cold\ntime                 v\u00e6rdi\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>\nBem\u00e6rk, at v\u00e6rdierne i databasen gemmes i UTC, s\u00e5 derfor adskiller de sig med 3 timer \u2014 v\u00e6rdierne for kl. 7 om morgenen i InfluxDB-outputtet svarer til v\u00e6rdierne kl. 10 om morgenen i de ovenst\u00e5ende grafer. Bem\u00e6rk ogs\u00e5, at der ingen poster er mellem kl. 2 og 5 om morgenen \u2014 det er den s\u00e6rlige egenskab ved den kontinuerlige foresp\u00f8rgsel.<\/p>\n<p>Som du kan se, er den aggregerede v\u00e6rdi ogs\u00e5 en monoton stigende sekvens, bare med sj\u00e6ldnere poster \u2014 \u00e9n gang i timen. Men det er ikke et problem \u2014 vi kan skrive en anden foresp\u00f8rgsel, der vil hente de korrekte data til grafen.<\/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>\nLad mig forklare:<\/p>\n<ul>\n<li>Fra databasen homeassistant.month.water_meter_hour tr\u00e6kker vi data for entity_id='water_meter_cold' de sidste 24 timer (time &gt;= now() -24h). <\/li>\n<li>Som jeg allerede har n\u00e6vnt, kan der mangle nogle poster i r\u00e6kken homeassistant.month.water_meter_hour. Disse data vil vi generere igen ved at k\u00f8re foresp\u00f8rgslen med GROUP BY time(1h). Denne gang vil fill(previous) fungere som \u00f8nsket og generere de manglende data (funktionen vil tage den forrige v\u00e6rdi).<\/li>\n<li>Det vigtigste ved denne foresp\u00f8rgsel er funktionen difference, som vil beregne forskellen mellem de timem\u00e6rker. Den fungerer ikke alene og kr\u00e6ver en aggregerende funktion. Lad os bruge max(), som tidligere.<\/li>\n<\/ul>\n<p>\nResultatet af udf\u00f8relsen ser s\u00e5ledes ud:<\/p>\n<pre><code class=\"python\">navn: 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>\nFra kl. 2 til 5 om morgenen (UTC) var der ikke noget forbrug. Alligevel vil foresp\u00f8rgslen returnere den samme v\u00e6rdi for forbruget takket v\u00e6re fill(previous), og funktionen difference tr\u00e6kker dette v\u00e6rdi fra sig selv, hvilket giver 0 i output, som det er meningen.<\/p>\n<p>Nu mangler det kun at bygge grafen. For at g\u00f8re dette \u00e5bner vi Grafana, \u00e5bner et eksisterende (eller opretter et nyt) dashboard, og opretter et nyt panel. Indstillingerne for grafen vil v\u00e6re som f\u00f8lger.<\/p>\n<p><img decoding=\"async\" alt=\"Smart Home: Bygger forbrugsgrafer for vand og elektricitet i Home Assistant\" src=\"\/wp-content\/uploads\/2020\/03\/c6f551590cd141438b644b24aa4ddebf.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nJeg vil vise data for koldt og varmt vand p\u00e5 \u00e9n graf. Foresp\u00f8rgslen er pr\u00e6cis den samme som jeg beskrev ovenfor. <\/p>\n<p>Visningsparametrene angives s\u00e5ledes. Jeg vil have en linjegraf (lines), som g\u00e5r i trin (stairs). Parameteren Stack vil jeg forklare lidt l\u00e6ngere nede. Der er ogs\u00e5 nogle andre visningsparametre, men de er ikke s\u00e5 interessante.<\/p>\n<p><img decoding=\"async\" alt=\"Smart Home: Bygger forbrugsgrafer for vand og elektricitet i Home Assistant\" src=\"\/wp-content\/uploads\/2020\/03\/cb47fc8570b7fd1305ce3451e0518f11.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nFor at tilf\u00f8je den opn\u00e5ede graf til Home Assistant skal du:<\/p>\n<ul>\n<li>forlade redigeringsmodus for grafen. Af en eller anden grund foresl\u00e5s de korrekte delingsindstillinger for grafer kun fra dashboard-siden.<\/li>\n<li>Klik p\u00e5 trekanten ved siden af grafens navn, v\u00e6lg del i menuen.<\/li>\n<li>I det \u00e5bnede vindue skal du g\u00e5 til fanen embed.<\/li>\n<li>Fjern markeringen i current time range \u2014 tidsintervallet vil vi angive via URL. <\/li>\n<li>V\u00e6lg det \u00f8nskede tema. I mit tilf\u00e6lde er det lys (light).<\/li>\n<li>Kopier den resulterende URL ind i lovelace-UI's indstillingskort.<\/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>\nBem\u00e6rk, at tidsintervallet (de sidste 2 dage) angives netop her og ikke i dashboardets indstillinger. <\/p>\n<p>Grafen ser s\u00e5dan ud. Jeg har ikke brugt varmt vand de sidste 2 dage, s\u00e5 der vises kun grafen for koldt vand.<\/p>\n<p><img decoding=\"async\" alt=\"Smart Home: Bygger forbrugsgrafer for vand og elektricitet i Home Assistant\" src=\"\/wp-content\/uploads\/2020\/03\/d18c82712d3b829a97ada8c8e2adce24.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nJeg har faktisk ikke besluttet mig for, hvilken graf jeg bedst kan lide, linje-trin eller rigtige s\u00f8jler. Derfor vil jeg bare vise et eksempel p\u00e5 en daglig graf for forbrug, men denne gang med s\u00f8jler. Foresp\u00f8rgslerne opbygges p\u00e5 samme m\u00e5de som beskrevet ovenfor. Visningsparametrene er:<\/p>\n<p><img decoding=\"async\" alt=\"Smart Home: Bygger forbrugsgrafer for vand og elektricitet i Home Assistant\" src=\"\/wp-content\/uploads\/2020\/03\/557297e666f9cd73c3d2aa2fd80c0a2d.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDenne graf ser s\u00e5dan ud:<\/p>\n<p><img decoding=\"async\" alt=\"Smart Home: Bygger forbrugsgrafer for vand og elektricitet i Home Assistant\" src=\"\/wp-content\/uploads\/2020\/03\/ac8c53569c6b05aeb22e05969de4cd6d.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nS\u00e5 om parameteren Stack. I denne graf tegnes s\u00f8jlen for koldt vand oven p\u00e5 s\u00f8jlen for varmt vand. Den samlede h\u00f8jde svarer til det samlede forbrug af koldt og varmt vand i perioden. <\/p>\n<p>Alle viste grafer er dynamiske. Du kan f\u00f8re musen over et interessant punkt for at se detaljer og v\u00e6rdi p\u00e5 det specifikke punkt. <\/p>\n<p>Desv\u00e6rre er der ikke g\u00e5et en spand tj\u00e6re forbi. P\u00e5 s\u00f8jlediagrammet (i mods\u00e6tning til trin-diagrammet) er midten af s\u00f8jlen ikke i midten af d\u00f8gnet, men kl. 00:00. Det vil sige, at den venstre halvdel af s\u00f8jlen er tegnet p\u00e5 den foreg\u00e5ende dags plads. S\u00e5 diagrammerne for l\u00f8rdag og s\u00f8ndag er tegnet lidt til venstre for den bl\u00e5 zone. Indtil videre har jeg ikke opfundet en l\u00f8sning p\u00e5 dette. <\/p>\n<p>Et andet problem er, at det er umuligt at arbejde korrekt med m\u00e5nedlige intervaller. Problemet er, at l\u00e6ngden af en time\/dag\/uge er fast, mens l\u00e6ngden af en m\u00e5ned hver gang er forskellig. InfluxDB kan kun arbejde med ensartede intervaller. Indtil videre har jeg haft mine kognitive evner til at angive et fast interval p\u00e5 30 dage. Ja, diagrammet vil glide en smule over \u00e5ret, og s\u00f8jlerne vil ikke pr\u00e6cist svare til m\u00e5nederne. Men da jeg blot er interesseret i det som en m\u00e5ler, er jeg okay med det. <\/p>\n<p>Jeg ser mindst to l\u00f8sninger:<\/p>\n<ul>\n<li>Ignorer m\u00e5nedlige diagrammer og begr\u00e6ns dig til ugentlige. 52 ugentlige s\u00f8jler om \u00e5ret ser ret godt ud.<\/li>\n<li>Beregne det m\u00e5nedlige forbrug som metode nr. 2 og kun bruge Grafana til flotte diagrammer. Det vil blive en ret pr\u00e6cis l\u00f8sning. Man kan endda overlappe diagrammerne fra sidste \u00e5r til sammenligning \u2014 Grafana kan ogs\u00e5 det.<\/li>\n<\/ul>\n<h2>Konklusion<\/h2>\n<p>\nJeg ved ikke hvorfor, men jeg elsker denne slags diagrammer. De viser, at livet koger, og alting \u00e6ndrer sig. I g\u00e5r var der meget, i dag er der lidt, i morgen bliver det p\u00e5 en eller anden m\u00e5de anderledes. Der er stadig noget arbejde tilbage med husstanden ang\u00e5ende forbruget. Men selv med de nuv\u00e6rende appetitter bliver det blot en stor og uforst\u00e5elig tal i regningen til en ret forst\u00e5elig forbrugsoversigt.<\/p>\n<p>P\u00e5 trods af n\u00e6sten 20 \u00e5rs karriere som programm\u00f8r har jeg n\u00e6sten ikke arbejdet med databaser. Derfor virkede installationen af en ekstern database som noget mystisk og uforst\u00e5eligt. Alt \u00e6ndrede sig. <noindex><a rel=\"nofollow\" href=\"https:\/\/dummylabs.com\/ru\/post\/2019-01-13-influxdb-part1\">den ovenn\u00e6vnte artikel<\/a><\/noindex> \u2014 det viste sig, at tilslutning af det rigtige v\u00e6rkt\u00f8j kan g\u00f8res med et par klik, og med et specialiseret v\u00e6rkt\u00f8j bliver opgaven med at bygge diagrammer en smule lettere.<\/p>\n<p>I overs\u00e6tte jeg n\u00e6vnte str\u00f8mforbrug. Desv\u00e6rre kan jeg i \u00f8jeblikket ikke fremvise nogen grafer. En SDM120 m\u00e5ler er g\u00e5et i stykker, og den anden glitcher ved kommunikation via Modbus. Men dette p\u00e5virker ikke emnet for denne artikel \u2014 graferne vil blive oprettet p\u00e5 samme m\u00e5de som for vand.<\/p>\n<p>I denne artikel har jeg pr\u00e6senteret de metoder, jeg selv har afpr\u00f8vet. Der er sikkert nogle andre m\u00e5der at organisere indsamling og visualisering af data, som jeg ikke kender til. Fort\u00e6l mig gerne om det i kommentarerne, jeg vil v\u00e6re meget interesseret. Jeg ser frem til konstruktiv kritik og nye id\u00e9er. Jeg h\u00e5ber, at det pr\u00e6senterede materiale ogs\u00e5 kan hj\u00e6lpe nogen.<br \/>\n<br \/>Kilde: <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.3 - 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\/da\/blog\/administrirovanie\/umnyj-dom-stroim-grafiki-potrebleniya-vody-i-elektrichestva-v-home-assistant\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"da_DK\" \/>\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\/da\/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 hjem: Bygger grafer over vand- og str\u00f8mforbrug i Home Assistant | ProHoster","description":"Hver gang.","canonical_url":"https:\/\/prohoster.info\/da\/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":"da_DK","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\/da\/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\/da\/wp-json\/wp\/v2\/posts\/74421","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/comments?post=74421"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/posts\/74421\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/media\/74422"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/media?parent=74421"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/categories?post=74421"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/tags?post=74421"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}