{"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\/nl\/blog\/administrirovanie\/umnyj-dom-stroim-grafiki-potrebleniya-vody-i-elektrichestva-v-home-assistant","title":{"rendered":"Slimme woning: Grafieken van water- en elektriciteitsverbruik opstellen in Home Assistant","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Slimme woning: Grafieken van water- en elektriciteitsverbruik opstellen in Home Assistant\" src=\"\/wp-content\/uploads\/2020\/03\/f1133a4c391e901ed64bf0825a774fc6.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nIedere keer als ik de rekening voor elektriciteit en water ontvang, vraag ik me af \u2013 verbruikt mijn gezin \u00e9cht zo veel? Natuurlijk, er is vloerverwarming en een boiler in de badkamer, maar die draaien toch niet constant. We proberen ook water te besparen (hoewel we het ook leuk vinden om in bad te relaxen). Enkele jaren geleden heb ik al <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/411259\/\">de watermeters aangesloten<\/a><\/noindex> en <noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/watch?v=XKvunh29sZo&amp;list=PLkt_cQxT0oUmfdxhbmTjytjaJjZjSVUOu\">elektriciteit<\/a><\/noindex> op het slimme huis, maar sindsdien is het daarmee stil blijven staan. Het analyseren van het verbruik is pas nu aan de orde gekomen, waar deze artikel over gaat.<\/p>\n<p>Onlangs ben ik overgestapt op Home Assistant als slim huis systeem. Een van de redenen was juist de mogelijkheid om een grote hoeveelheid data te verzamelen met de optie om verschillende soorten grafieken eenvoudig op te stellen.<\/p>\n<p>De informatie die in dit artikel wordt beschreven is niet nieuw, al deze zaken zijn al op verschillende manieren op internet behandeld. Maar elke artikel beschrijft meestal slechts \u00e9\u00e9n benadering of aspect. Het vergelijken van al deze benaderingen en het kiezen van de meest geschikte was aan mij. Het artikel biedt geen uitputtende informatie over dataverzameling, maar is een soort samenvatting van hoe ik het heb gedaan. Constructieve kritiek en suggesties voor verbetering zijn welkom.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>Taakstelling<\/h2>\n<p>\nDus, het doel van de vandaag oefening is om mooie grafieken van water- en elektriciteitsverbruik te krijgen:<\/p>\n<ul>\n<li>Uurgegevens over 2 dagen<\/li>\n<li>Daggegevens over 2 weken<\/li>\n<li>(optioneel) week- en maandgegevens<\/li>\n<\/ul>\n<p>\nDaarin schuilt enige moeilijkheid:<\/p>\n<ul>\n<li>Standaard grafiekcomponenten zijn meestal behoorlijk beperkt. In het beste geval kan je een lijngrafiek opbouwen met punten.\n<p>Als je goed zoekt, kun je externe componenten vinden die de mogelijkheden van standaard grafieken uitbreiden. Voor Home Assistant is de component <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/kalkih\/mini-graph-card\">mini-graph-card<\/a><\/noindex>, maar ook deze is enigszins beperkt:<\/p>\n<ul>\n<li>Het is moeilijk om de parameters van een kolomgrafiek in te stellen over lange intervallen (de breedte van de kolom wordt ingesteld in fracties van een uur, wat betekent dat intervallen langer dan een uur in decimalen moeten worden ingesteld)<\/li>\n<li>Je kunt geen verschillende entiteiten op \u00e9\u00e9n grafiek toevoegen (bijvoorbeeld temperatuur en luchtvochtigheid, of een kolomgrafiek combineren met een lijn)<\/li>\n<\/ul>\n<\/li>\n<li>Niet alleen gebruikt Home Assistant standaard een zeer primitieve SQLite-database (en ik, met mijn klunzige vaardigheden, kon MySQL of Postgres niet installeren), maar de gegevens worden ook niet op de meest optimale manier opgeslagen. Zo wordt bijvoorbeeld bij elke wijziging van zelfs de kleinste digitale parameter een enorme JSON van ongeveer een kilobyte in de database opgeslagen.\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>\nIk heb best veel sensoren (temperatuursensoren in elke kamer, water- en elektriciteitsmeters), en sommige daarvan genereren behoorlijk veel gegevens. Zo genereert alleen de elektriciteitsmeter SDM220 ongeveer een tiental waarden elke 10-15 seconden, en van zulke meters zou ik er graag acht willen installeren. Daarnaast zijn er een heleboel parameters die op basis van andere sensoren worden berekend. Al deze waarden kunnen de database gemakkelijk dagelijks met 100-200 MB laten groeien. Na een week zal het systeem nauwelijks meer functioneren, en na een maand zal de flash-geheugenkaart (in het geval van een typische installatie van Home Assistant op een Raspberry Pi) kapot zijn, laat staan dat er een jaar aan gegevens kan worden opgeslagen.<\/li>\n<li>Als je geluk hebt, kan je meter zelf het verbruik bijhouden. Je kunt op elk moment de meter raadplegen en vragen naar de cumulatieve waarde van het verbruik. Over het algemeen bieden alle elektriciteitsmeters met een digitale interface (RS232\/RS485\/Modbus\/Zigbee) deze mogelijkheid.\n<p>Slechter is het als het apparaat gewoon een bepaalde onmiddellijke parameter kan meten (zoals onmiddellijke kracht of stroom), of gewoon impulsen kan genereren elke X watt-uur of liters. Dan moet je nadenken over hoe en waarmee je dit kunt integreren en waar je de waarde kunt opslaan. Er is een risico om een rapport te missen om welke reden dan ook, en de nauwkeurigheid van het systeem als geheel roept vragen op. Natuurlijk kan je dit allemaal toevertrouwen aan een smart home-systeem zoals Home Assistant, maar het punt over het aantal records in de database is niet komen te vervallen, en het is niet mogelijk om de sensoren vaker dan \u00e9\u00e9n keer per seconde uit te lezen (beperkingen van de architectuur van Home Assistant).<\/li>\n<\/ul>\n<p><\/p>\n<h2>Aanpak 1<\/h2>\n<p>\nLaten we eerst kijken wat Home Assistant standaard biedt. Het meten van het verbruik over een periode is een zeer gewilde functionaliteit. Uiteraard is dit al lang geleden gerealiseerd in de vorm van een gespecialiseerde component: utility_meter. <\/p>\n<p>De essentie van de component is dat deze intern een variabele current_accumulated_value introduceert, die wordt gereset na afloop van de opgegeven periode (uur\/week\/maand). De component monitort zelf de inkomende variabele (de waarde van een bepaalde sensor), abonneert zich op waarde wijzigingen \u2014 jij ontvangt simpelweg het eindresultaat. Dit wordt beschreven met slechts een paar regels in het configuratiebestand.<\/p>\n<pre><code class=\"python\">utility_meter:\n  water_cold_hour_um:\n    source: sensor.water_meter_cold\n    cycle: hourly\n  water_cold_day_um:\n    source: sensor.water_meter_cold\n    cycle: daily\n<\/code><\/pre>\n<p>\nHier is sensor.water_meter_cold de huidige waarde van de meter in liters, die ik ontvang <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/411259\/\">rechtstreeks van het apparaat<\/a><\/noindex> via MQTT. De constructie cre\u00ebert 2 nieuwe sensoren water_cold_hour_um en water_cold_day_um, die uurlijks en dagelijks demetingen accumuleren en deze resetten na afloop van de periode. Hier is de grafiek van de uurlijk accumulator voor een halve dag.<\/p>\n<p><img decoding=\"async\" alt=\"Slimme woning: Grafieken van water- en elektriciteitsverbruik opstellen in Home Assistant\" src=\"\/wp-content\/uploads\/2020\/03\/d3c3ea29c10b17142e51ebe756ab7123.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDe code voor de uur- en daggrafieken voor de Lovelace-UI ziet er als volgt uit:<\/p>\n<pre><code class=\"python\">      - type: history-graph\n        title: 'Uurlijkse waterconsumptie met behulp van variabelen'\n        hours_to_show: 48\n        entities:\n          - sensor.water_hour\n\n      - type: history-graph\n        title: 'Dagelijkse waterconsumptie met behulp van variabelen'\n        hours_to_show: 360\n        entities:\n          - sensor.water_day\n<\/code><\/pre>\n<p>\nEigenlijk ligt het probleem van deze aanpak in dit algoritme. Zoals ik al eerder zei, wordt voor elke binnenkomende waarde (de huidige meterstand voor elke volgende liter) 1 KB aan gegevens in de database gegenereerd. Elke utility meter genereert ook een nieuwe waarde die in de database wordt opgeslagen. Als ik uurlijks\/dagelijks\/weekelijks\/maandelijks gegevens wil verzamelen, en ook nog eens voor meerdere waterleidingen, plus een aantal elektriciteitsmeters wil toevoegen - dan wordt dit een enorme hoeveelheid gegevens. Data is misschien niet veel, maar omdat de home assistant veel overbodige informatie in de database schrijft, zal de databasegrootte exponentieel toenemen. Ik durf zelfs niet te schatten hoe groot de database zou zijn voor wekelijkse en maandelijkse grafieken.<\/p>\n<p>Bovendien lost de utility meter op zich de gestelde taak niet op. De grafiek van waarden die de utility meter biedt is een monotonisch toenemende functie die elke uur op 0 wordt gezet. We hebben een begrijpelijke grafiek nodig voor de gebruiker, hoeveel liters er zijn verbruikt in een bepaalde periode. De standaard component history-graph kan dat niet, maar de externe component mini-graph-card kan ons helpen.<\/p>\n<p>Dit is de code voor de kaart in 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: \"Uren waterverbruik geaggregeerd op utiliteitsmeter\"\n        points_per_hour: 1\n        show:\n          graph: bar\n        type: 'custom:mini-graph-card'<\/code><\/pre>\n<p>\nNaast de standaardinstellingen zoals de naam van de sensor, het type grafiek en de kleur (de standaard oranje vond ik niet leuk) is het belangrijk om 3 instellingen op te merken:<\/p>\n<ul>\n<li>group_by:hour \u2014 de grafiek wordt gegenereerd met uitlijning van de balken aan het begin van het uur<\/li>\n<li>points_per_hour: 1 \u2014 \u00e9\u00e9n balk per uur<\/li>\n<li>En het belangrijkste, aggregate_func: max \u2014 neem de maximale waarde binnen elk uur. Deze parameter transformeert de zaagtandgrafiek in balken.<\/li>\n<\/ul>\n<p>\n<img decoding=\"async\" alt=\"Slimme woning: Grafieken van water- en elektriciteitsverbruik opstellen in Home Assistant\" src=\"\/wp-content\/uploads\/2020\/03\/5bd866c39b23299e5f15dcf4a9bce38f.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nLet niet op de reeks balken aan de linkerkant \u2014 dit is het standaardgedrag van de component als er geen gegevens zijn. En er waren geen gegevens \u2014 ik heb pas een paar uur geleden het verzamelen van gegevens via de utility meter geactiveerd, alleen voor dit artikel (mijn huidige aanpak zal ik iets lager toelichten). <\/p>\n<p>In deze afbeelding wilde ik laten zien dat het weergeven van gegevens soms zelfs goed werkt en de kolommen daadwerkelijk de juiste waarden weerspiegelen. Maar niet alles. De gemarkeerde kolom voor de periode van 11 uur tot 12 uur geeft om een of andere reden 19 liter weer, terwijl we op de steile grafiek hierboven voor dezelfde periode van dezelfde sensor een verbruik van 62 liter zien. Of het is een bug, of het is slecht gedaan. Waarom de gegevens aan de rechterkant ontbreken, begrijp ik tot nu toe niet \u2014 het verbruik daar was normaal, wat ook zichtbaar is op de steile grafiek.<\/p>\n<p>Over het geheel genomen is het me niet gelukt om geloofwaardigheid met deze aanpak te bereiken \u2014 de grafiek toont bijna altijd onzin.<\/p>\n<p>Vergelijkbare code voor de dag-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: \"Dagelijks waterverbruik geaggregeerd op utiliteitsmeter\"\n        points_per_hour: 0.0416666666\n        show:\n          graph: bar\n        type: 'custom:mini-graph-card'\n<\/code><\/pre>\n<p>\nLet op dat de parameter group_by is ingesteld op interval, en dat alles wordt aangestuurd door de parameter points_per_hour. Dit is ook een ander probleem van deze component \u2014 points_per_hour werkt goed op grafieken voor een uur of minder, maar verschrikkelijk voor grotere tijdsintervallen. Om dus \u00e9\u00e9n kolom voor \u00e9\u00e9n dag te krijgen, moest ik de waarde 1\/24=0.04166666 invullen. Ik zeg al niet eens iets over wekelijkse en maandelijkse grafieken.<\/p>\n<h2>Aanpak 2<\/h2>\n<p>\nTerwijl ik me nog aan het verdiepen was in Home Assistant, kwam ik deze video tegen:<\/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 afspelen\" loading=\"lazy\" width=\"480\" height=\"360\" style=\"width:100%;height:auto;\">\r\n        <div class=\"play-button\"><\/div>\r\n    <\/div><\/center><br \/>\nEen vriend verzamelt verbruiksgegevens van verschillende soorten Xiaomi-stopcontacten. Zijn taak is iets eenvoudiger \u2014 gewoon de verbruikwaarde van vandaag, gisteren en voor de maand tonen. Er zijn geen grafieken nodig. <\/p>\n<p>Laten we de overpeinzingen over het handmatig integreren van onmiddellijke vermogenswaarden even terzijde schuiven \u2014 over de 'nauwkeurigheid' van deze aanpak heb ik hierboven al geschreven. Het is onduidelijk waarom hij geen gebruik heeft gemaakt van de accumulatieve verbruikwaarden die al door hetzelfde stopcontact worden verzameld. Naar mijn mening zal integreren binnen de hardware beter functioneren. <\/p>\n<p>Van de video nemen we het idee van handmatige berekening van het verbruik over een periode over. De man berekent alleen de waarden van vandaag en gisteren, maar wij gaan verder en proberen een grafiek te maken. De essentie van de voorgestelde methode in mijn geval is als volgt.<\/p>\n<p>We defini\u00ebren de variabele waarde_begin_uur, waarin we de huidige meterstand opslaan.<br \/>\nAan het einde van het uur (of aan het begin van het volgende) berekenen we het verschil tussen de huidige waarde en de waarde die aan het begin van het uur is opgeslagen. Dit verschil is het verbruik voor het huidige uur \u2014 we slaan de waarde op in de sensor, en in de toekomst zullen we op basis van deze waarde een grafiek opbouwen. <br \/>\nWe moeten ook de variabele waarde_begin_uur 'resetten' door daar de huidige waarde van de teller in te schrijven.<\/p>\n<p>Dit kan allemaal gedaan worden via de middelen van home assistant zelf. <\/p>\n<p>Er moet iets meer code geschreven worden dan in de vorige aanpak. Laten we beginnen met het aanmaken van deze 'variabelen'. Standaard hebben we geen entiteit 'variabele', maar we kunnen de diensten van de MQTT-broker gebruiken. We zullen waarden verzenden met de vlag retain=true \u2014 dit behoudt de waarde binnen de broker, en je kunt deze op elk moment eruit halen, zelfs bij een herstart van Home Assistant. Ik heb meteen uurlijkse en dagelijkse tellers gemaakt.<\/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>\nDe hele magie gebeurt in de automatisering, die elk uur en elke nacht respectievelijk wordt uitgevoerd.<\/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 automatiseringen voeren 2 acties uit:<\/p>\n<ul>\n<li>Berekenen de waarde voor het interval als het verschil tussen de begin- en eindwaarde<\/li>\n<li>Bijwerken van de basiswaarde voor het volgende interval<\/li>\n<\/ul>\n<p>\nHet opbouwen van grafieken wordt in dit geval opgelost door een gewone history-graph:<\/p>\n<pre><code class=\"python\">      - type: history-graph\n        title: 'Uurlijkse waterconsumptie met behulp van variabelen'\n        hours_to_show: 48\n        entities:\n          - sensor.water_hour\n\n      - type: history-graph\n        title: 'Dagelijkse waterconsumptie met behulp van variabelen'\n        hours_to_show: 360\n        entities:\n          - sensor.water_day<\/code><\/pre>\n<p>\nHet ziet er zo uit:<\/p>\n<p><img decoding=\"async\" alt=\"Slimme woning: Grafieken van water- en elektriciteitsverbruik opstellen in Home Assistant\" src=\"\/wp-content\/uploads\/2020\/03\/ebde2fc5f0a72d7d6ba565c3686dc9c6.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nIn principe is dit al wat nodig is. Een voordeel van deze methode is dat de gegevens \u00e9\u00e9n keer per interval worden gegenereerd. Dat wil zeggen, in totaal 24 records per dag voor de uurlijke grafiek. <\/p>\n<p>Helaas lost het de algemene kwestie van de groeiende database nog steeds niet op. Als ik een grafiek van het maandelijkse verbruik wil, moet ik de gegevens minstens een jaar opslaan. Aangezien Home Assistant slechts \u00e9\u00e9n opslagduurinstelling voor de hele database biedt, betekent dit dat ALLE gegevens in het systeem een heel jaar moeten worden opgeslagen. Bijvoorbeeld, in een jaar verbruik ik 200 kubieke meter water, wat betekent dat er 200.000 records in de database komen. En als we ook andere sensoren meerekenen, wordt het cijfer werkelijk onfatsoenlijk.<\/p>\n<h2>Benadering 3<\/h2>\n<p>\nGelukkig hebben slimme mensen dit probleem al opgelost door de database InfluxDB te schrijven. Deze database is speciaal geoptimaliseerd voor het opslaan van tijdgebonden gegevens en is ideaal voor het opslaan van waarden van verschillende sensoren. Het systeem biedt ook een SQL-achtige querytaal waarmee je waarden uit de database kunt halen en ze op verschillende manieren kunt aggregeren. Ten slotte kunnen verschillende gegevens verschillende opslagtijden hebben. Bijvoorbeeld, vaak veranderende waarden zoals temperatuur of luchtvochtigheid kunnen slechts een paar weken worden opgeslagen, terwijl dagelijkse waterverbruiksgegevens een jaar kunnen worden bewaard.<\/p>\n<p>Naast InfluxDB hebben slimme mensen ook Grafana uitgevonden - een systeem voor het tekenen van grafieken met gegevens uit InfluxDB. Grafana kan verschillende soorten grafieken tekenen, deze gedetailleerd aanpassen en, het belangrijkste, deze grafieken kunnen worden \u201cingestoken\u201d in de Lovelace-interface van Home Assistant.<\/p>\n<p>Inspireren <noindex><a rel=\"nofollow\" href=\"https:\/\/dummylabs.com\/ru\/post\/2019-01-13-influxdb-part1\/\">here <\/a><\/noindex> en <noindex><a rel=\"nofollow\" href=\"https:\/\/dummylabs.com\/ru\/post\/2019-05-28-influxdb-part2\/\">here<\/a><\/noindex>. De artikelen beschrijven uitvoerig het installatieproces en de koppeling van InfluxDB en Grafana aan Home Assistant. Ik zal me echter richten op het oplossen van mijn specifieke probleem.<\/p>\n<p>Laten we dus eerst beginnen met het opslaan van de waarden van de meter in InfluxDB. Een stuk configuratie van Home Assistant (in dit voorbeeld ga ik me zowel met koud als met warm water vermaken):<\/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>\nWe schakelen het opslaan van deze gegevens in de interne database van Home Assistant uit om deze niet onnodig op te blazen:<\/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>\nLaten we nu naar de InfluxDB-console gaan en onze database instellen. We moeten namelijk bepalen hoe lang bepaalde gegevens bewaard moeten blijven. Dit wordt geregeld door de zogenaamde retention policy \u2014 dit is vergelijkbaar met databases binnen de hoofd-database, waarbij elke interne database zijn eigen instellingen heeft. Standaard worden alle gegevens opgeslagen in de retention policy genaamd autogen, en deze gegevens worden een week bewaard. Ik zou willen dat de uurgegevens een maand worden bewaard, wekelijkse gegevens een jaar en maandelijkse gegevens nooit worden verwijderd. Laten we de bijbehorende retention policies cre\u00ebren.<\/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>\nNu, het belangrijkste trucje \u2014 de aggregatie van gegevens met behulp van een continuous query. Dit is een mechanisme dat automatisch een query uitvoert op ingestelde tijdsintervallen, de gegevens aggregeert op basis van deze query, en het resultaat in een nieuwe waarde opslaat. Laten we het aan de hand van een voorbeeld bekijken (ik schrijf het met een kolom voor de leesbaarheid, maar in werkelijkheid moest ik deze opdracht als \u00e9\u00e9n regel invoeren).<\/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>\nDeze opdracht:<\/p>\n<ul>\n<li>Cre\u00ebert een continuous query met de naam cq_water_cold_hourly in de database homeassistant.<\/li>\n<li>De query wordt elk uur uitgevoerd (time(1h)).<\/li>\n<li>De query haalt alle gegevens op uit de measurement homeassistant.autogen.l (liter), inclusief de metingen van koud en warm water.<\/li>\n<li>Geaggregeerde gegevens worden gegroepeerd op entity_id, wat ons aparte waarden voor koud en warm water oplevert.<\/li>\n<li>Aangezien de meter in liters een monotoon stijgende reeks is, moet voor elk uur de maximale waarde worden genomen, dus de aggregatie wordt uitgevoerd met de functie max(value). <\/li>\n<li>De nieuwe waarde wordt opgeslagen in homeassistant.month.water_meter_hour, waarbij month de naam is van de retention policy met een bewaartermijn van een maand. De gegevens voor koud en warm water zullen in aparte records worden verspreid met de bijbehorende entity_id en waarde in het veld value.<\/li>\n<\/ul>\n<p>\nS nachts of wanneer er niemand thuis is, is er geen waterverbruik, en dus zijn er ook geen nieuwe records in homeassistant.autogen.l. Om te voorkomen dat er hiaten in de waarden zijn bij reguliere queries kan men fill(previous) gebruiken. Dit zorgt ervoor dat InfluxDB de waarde van het vorige uur gebruikt. <\/p>\n<p>Helaas heeft de continuous query een eigenschap: de truc fill(previous) werkt niet en de records worden eenvoudigweg niet aangemaakt. Dit is een onoverkomelijk probleem dat <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/influxdata\/influxdb\/issues\/3220\">al jaren wordt besproken<\/a><\/noindex>. We zullen later met dit probleem omgaan, en laat fill(previous) in de continuous query maar staan \u2014 het hindert niet. <\/p>\n<p>Laten we controleren wat we hebben gekregen (natuurlijk moeten we een paar uurtjes wachten):<\/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>\nLet op dat de waarden in de database in UTC worden opgeslagen, daarom verschillen ze in deze lijst met 3 uur \u2014 de waarden van 7 uur 's ochtends in de InfluxDB-output komen overeen met de waarden van 10 uur 's ochtends in de grafieken hierboven. Merkt u ook op dat er tussen 2 en 5 uur 's ochtends gewoon geen records zijn \u2014 dat is die specifieke eigenschap van continuous query.<\/p>\n<p>Zoals u ziet, is de geaggregeerde waarde ook een monotonisch toenemende volgorde, maar de records komen minder vaak voor \u2014 eenmaal per uur. Maar dat is geen probleem \u2014 we kunnen een andere query schrijven die de juiste gegevens voor de grafiek haalt.<\/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>\nIk zal het uitleggen:<\/p>\n<ul>\n<li>We will extract data from the database homeassistant.month.water_meter_hour for entity_id='water_meter_cold' over the last 24 hours (time &gt;= now() -24h). <\/li>\n<li>Zoals ik al eerder vermeldde, kunnen er enkele records ontbreken in de reeks homeassistant.month.water_meter_hour. Deze gegevens zullen we opnieuw genereren door de query met GROUP BY time(1h) uit te voeren. Deze keer zal fill(previous) werken zoals het hoort, door ontbrekende gegevens te genereren (de functie neemt de vorige waarde).<\/li>\n<li>Het belangrijkste in deze query is de functie difference, die het verschil tussen de uurmarkeringen berekent. Op zichzelf werkt deze niet en heeft een aggregatiefunctie nodig. Laten we het max() gebruiken zoals eerder gedaan.<\/li>\n<\/ul>\n<p>\nDe uitvoer ziet er als volgt uit<\/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>\nVan 2 tot 5 uur 's ochtends (UTC) was er geen verbruik. Desondanks retourneert de aanvraag dezelfde waarde voor verbruik dankzij fill(previous), en de functie difference trekt deze waarde zelf van zichzelf af, waardoor we 0 krijgen, wat eigenlijk vereist is.<\/p>\n<p>Het enige dat nu nog rest is het maken van de grafiek. Hiervoor openen we Grafana, openen een bestaande (of cre\u00ebren een nieuwe) dashboard, en maken een nieuw paneel aan. De instellingen voor de grafieken zullen als volgt zijn.<\/p>\n<p><img decoding=\"async\" alt=\"Slimme woning: Grafieken van water- en elektriciteitsverbruik opstellen in Home Assistant\" src=\"\/wp-content\/uploads\/2020\/03\/c6f551590cd141438b644b24aa4ddebf.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nIk zal de gegevens over koude en warme water op \u00e9\u00e9n grafiek weergeven. De aanvraag is precies hetzelfde als ik hierboven heb beschreven. <\/p>\n<p>De weergave-instellingen worden als volgt gedefinieerd. Voor mij zal dit een lijngrafiek (lines) zijn, die in stappen loopt (stairs). De parameter Stack zal ik hieronder uitleggen. Er zijn hieronder nog een paar weergaveparameters, maar die zijn niet zo interessant.<\/p>\n<p><img decoding=\"async\" alt=\"Slimme woning: Grafieken van water- en elektriciteitsverbruik opstellen in Home Assistant\" src=\"\/wp-content\/uploads\/2020\/03\/cb47fc8570b7fd1305ce3451e0518f11.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nOm de verkregen grafiek aan het home assistant toe te voegen, moet je:<\/p>\n<ul>\n<li>uit de bewerkingsmodus van de grafiek komen. Om de een of andere reden worden de juiste instellingen voor het delen van grafieken alleen aangeboden vanaf de dashboardpagina.<\/li>\n<li>Klik op de driehoek naast de naam van de grafiek en kies in het menu voor delen.<\/li>\n<li>Ga in het geopende venster naar het tabblad embed.<\/li>\n<li>Verwijder het vinkje bij huidige tijdsperiode \u2014 de tijdsperiode zullen we via de URL instellen. <\/li>\n<li>Kies het gewenste thema. In mijn geval is dat licht.<\/li>\n<li>Kopieer de verkregen URL naar de lovelace-UI instellingskaart.<\/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>\nLet op dat de tijdsperiode (de laatste 2 dagen) hier wordt ingesteld, en niet in de dashboardinstellingen. <\/p>\n<p>De grafiek ziet er als volgt uit. Ik heb het warme water de laatste 2 dagen niet gebruikt, dus er wordt alleen de grafiek van het koude water weergegeven.<\/p>\n<p><img decoding=\"async\" alt=\"Slimme woning: Grafieken van water- en elektriciteitsverbruik opstellen in Home Assistant\" src=\"\/wp-content\/uploads\/2020\/03\/d18c82712d3b829a97ada8c8e2adce24.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nIk heb nog niet besloten welke grafiek ik leuker vind, de lijn-stap of de echte kolommen. Daarom geef ik gewoon een voorbeeld van een dagelijkse verbruiksgrafiek, maar dit keer in kolommen. De aanvragen worden op dezelfde manier opgebouwd als hierboven beschreven. De weergaveparameters zijn als volgt:<\/p>\n<p><img decoding=\"async\" alt=\"Slimme woning: Grafieken van water- en elektriciteitsverbruik opstellen in Home Assistant\" src=\"\/wp-content\/uploads\/2020\/03\/557297e666f9cd73c3d2aa2fd80c0a2d.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDeze grafiek ziet er zo uit:<\/p>\n<p><img decoding=\"async\" alt=\"Slimme woning: Grafieken van water- en elektriciteitsverbruik opstellen in Home Assistant\" src=\"\/wp-content\/uploads\/2020\/03\/ac8c53569c6b05aeb22e05969de4cd6d.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nLaten we het nu over de parameter Stack hebben. In deze grafiek wordt de kolom voor koud water bovenop de kolom voor warm water getekend. De totale hoogte komt overeen met het totale verbruik van koud en warm water gedurende de periode. <\/p>\n<p>Alle getoonde grafieken zijn dynamisch. Je kunt met de muis over een interessant punt bewegen en de details en waarde op dat specifieke punt bekijken. <\/p>\n<p>Helaas zijn er zonder een paar tegenslagen geen voordelen. Op de staafgrafiek (in tegenstelling tot de stapgrafiek) ligt het midden van de staaf niet in het midden van de dag, maar om 00:00 uur. Dat wil zeggen, de linkse helft van de staaf is getekend op de plaats van de vorige dag. De grafieken voor zaterdag en zondag zijn dus iets naar links getekend in vergelijking met het blauwe gebied. Tot nu toe heb ik nog geen oplossing gevonden om dit te verhelpen. <\/p>\n<p>Een ander probleem is de onmogelijkheid om correct met maandintervallen te werken. Het punt is dat de duur van een uur\/dag\/week vast is, maar de lengte van de maand elke keer anders is. InfluxDB kan alleen met gelijke intervallen werken. Tot nu toe heb ik mijn best gedaan om een vast interval van 30 dagen in te stellen. Ja, de grafiek zal gedurende het jaar een beetje verschuiven en de staven zullen niet helemaal overeenkomen met de maanden. Maar omdat ik dit gewoon interessant vind als een soort meter, kan ik daar mee leven. <\/p>\n<p>Ik zie ten minste twee oplossingen:<\/p>\n<ul>\n<li>Vergeet maandgrafieken en beperk je tot weekgrafieken. 52 weekstaven per jaar zien er best goed uit.<\/li>\n<li>De maandelijkse consumptie beschouwen als methode nummer 2, en Grafana alleen gebruiken voor mooie grafieken. Dat resulteert in een vrij nauwkeurige oplossing. Je kunt zelfs de grafieken van vorig jaar overlappen voor vergelijking \u2014 Grafana kan dat ook.<\/li>\n<\/ul>\n<h2>Conclusie<\/h2>\n<p>\nIk weet niet waarom, maar ik ben dol op dit soort grafieken. Ze laten zien dat het leven bruisend is en dat alles verandert. Gisteren was er veel, vandaag is er weinig, morgen zal het weer anders zijn. We moeten nog werken met de huisgenoten over het onderwerp consumptie. Maar zelfs met de huidige appetijt verandert simpelweg een grote en onduidelijke cijfer op de rekening al in een vrij duidelijk beeld van het verbruik.<\/p>\n<p>Ondanks bijna 20 jaar carri\u00e8re als programmeur, heb ik nauwelijks met databases gewerkt. Daarom leek het opzetten van een externe database iets heel ingewikkelds en onduidelijks. Alles veranderde <noindex><a rel=\"nofollow\" href=\"https:\/\/dummylabs.com\/ru\/post\/2019-01-13-influxdb-part1\">door het eerder genoemde artikel<\/a><\/noindex> \u2014 het bleek dat het aansluiten van de juiste tool in een paar klikken kan, en met een gespecialiseerde tool wordt de taak van het bouwen van grafieken een stuk eenvoudiger.<\/p>\n<p>In de titel heb ik het elektriciteitsverbruik genoemd. Helaas kan ik op dit moment geen enkele grafiek tonen. E\u00e9n SDM120 meter is kapot en de andere heeft problemen bij het gebruik van Modbus. Dit be\u00efnvloedt echter de inhoud van dit artikel niet - de grafieken zullen op dezelfde manier worden gemaakt als voor water.<\/p>\n<p>In dit artikel heb ik de methoden opgesomd die ik zelf heb uitgeprobeerd. Er zijn vast nog andere manieren om data te verzamelen en te visualiseren waar ik niet van op de hoogte ben. Laat het me weten in de reacties, ik ben er zeer in ge\u00efnteresseerd. Ik sta open voor constructieve kritiek en nieuwe idee\u00ebn. Ik hoop dat het materiaal ook anderen van dienst zal zijn.<br \/>\n<br \/>Bron: <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\/nl\/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=\"nl_NL\" \/>\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\/nl\/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\udd47Slim huis: We bouwen grafieken voor water- en elektriciteitsverbruik in Home Assistant | ProHoster","description":"Elke keer.","canonical_url":"https:\/\/prohoster.info\/nl\/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":"nl_NL","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\/nl\/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\/nl\/wp-json\/wp\/v2\/posts\/74421","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/comments?post=74421"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/posts\/74421\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/media\/74422"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/media?parent=74421"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/categories?post=74421"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/tags?post=74421"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}