{"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\/it\/blog\/administrirovanie\/umnyj-dom-stroim-grafiki-potrebleniya-vody-i-elektrichestva-v-home-assistant","title":{"rendered":"Casa intelligente: Costruiamo grafici del consumo di acqua ed elettricit\u00e0 in Home Assistant","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Casa intelligente: Costruiamo grafici del consumo di acqua ed elettricit\u00e0 in Home Assistant\" src=\"\/wp-content\/uploads\/2020\/03\/f1133a4c391e901ed64bf0825a774fc6.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nOgni volta che ricevo la bolletta per l'elettricit\u00e0 e l'acqua mi chiedo: la mia famiglia consuma davvero cos\u00ec tanto? S\u00ec, in bagno abbiamo il riscaldamento a pavimento e un boiler, ma non \u00e8 che stiano sempre funzionando. Anche l'acqua la stiamo risparmiando (anche se ci piace farci un bel bagno). Qualche anno fa ho gi\u00e0 <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/411259\/\">installato i contatori dell'acqua<\/a><\/noindex> e <noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/watch?v=XKvunh29sZo&amp;list=PLkt_cQxT0oUmfdxhbmTjytjaJjZjSVUOu\">e dell'elettricit\u00e0<\/a><\/noindex> , ma poi tutto si \u00e8 arenato. Solo ora ho finalmente trovato il tempo di analizzare il consumo, e questa \u00e8, in effetti, l'oggetto di questo articolo.<\/p>\n<p>Recentemente sono passato a Home Assistant come sistema di smart home. Una delle ragioni era proprio la possibilit\u00e0 di raccogliere un grande numero di dati e creare vari tipi di grafici.<\/p>\n<p>Le informazioni descritte in questo articolo non sono nuove, tutte queste cose sono state gi\u00e0 trattate online in vari modi. Ma ogni articolo, di solito, tratta solo un approccio o un aspetto. Ho dovuto confrontare tutti questi approcci e scegliere quello pi\u00f9 adatto per me. Anche se l'articolo non offre informazioni esaustive sulla raccolta dei dati, \u00e8 in qualche modo un riassunto di come ho fatto io. Pertanto, sono ben accette critiche costruttive e suggerimenti per migliorare.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>Definizione del compito<\/h2>\n<p>\nQuindi, l'obiettivo di questo esercizio \u00e8 ottenere grafici dell'uso di acqua ed elettricit\u00e0:<\/p>\n<ul>\n<li>Orari per 2 giorni<\/li>\n<li>Giornalieri per 2 settimane<\/li>\n<li>(opzionale) settimanali e mensili<\/li>\n<\/ul>\n<p>\nIn questo ci sono alcune complicazioni:<\/p>\n<ul>\n<li>I componenti standard dei grafici sono generalmente abbastanza poveri. Al meglio si pu\u00f2 costruire un grafico a linee con i punti.\n<p>Se si cerca bene, si possono trovare componenti di terze parti che ampliano le possibilit\u00e0 del grafico standard. Per Home Assistant, in linea di massima, \u00e8 buono e bello il componente <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/kalkih\/mini-graph-card\">mini-graph-card<\/a><\/noindex>, ma anche questo ha alcune limitazioni:<\/p>\n<ul>\n<li>\u00c8 difficile impostare i parametri del grafico a barre su intervalli grandi (la larghezza della barra \u00e8 impostata in frazioni d'ora, e quindi intervalli pi\u00f9 lunghi di un'ora devono essere impostati con numeri decimali)<\/li>\n<li>Non puoi aggiungere entit\u00e0 diverse su un unico grafico (ad esempio, temperatura e umidit\u00e0, o combinare un grafico a barre con una linea)<\/li>\n<\/ul>\n<\/li>\n<li>Non solo l'home assistant utilizza per default il database SQLite pi\u00f9 primitivo (e io, mani di gomma, non sono riuscito a installare MySQL o Postgres), ma i dati non vengono memorizzati in modo ottimale. Ad esempio, ad ogni modifica di ogni minimo parametro numerico, viene registrato un enorme json di circa un kilobyte nel database.\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>\nHo molti sensori (sensori di temperatura in ogni stanza, contatori d\u2019acqua ed elettricit\u00e0), e alcuni di questi generano una quantit\u00e0 considerevole di dati. Ad esempio, solo il contatore di elettricit\u00e0 SDM220 genera circa dieci valori ogni 10-15 secondi, e io vorrei installarne circa 8. Inoltre, ci sono un sacco di parametri calcolati sulla base di altri sensori. Pertanto, tutti questi valori possono facilmente gonfiare il database di 100-200 MB al giorno. Dopo una settimana, il sistema faticher\u00e0 a funzionare, e dopo un mese la chiavetta USB si guaster\u00e0 (nel caso di un'installazione tipica dell'home assistant su Raspberry PI), e nemmeno si pu\u00f2 parlare di conservare i dati per un anno intero.<\/li>\n<li>Se sei fortunato, il tuo contatore \u00e8 in grado di calcolare autonomamente i consumi. Puoi consultare il contatore in qualsiasi momento e chiedergli quale sia il valore accumulato di consumo. Di solito, tutti i contatori elettrici che hanno un'interfaccia digitale (RS232\/RS485\/Modbus\/Zigbee) offrono questa possibilit\u00e0.\n<p>Peggio se il dispositivo pu\u00f2 semplicemente misurare un qualche parametro istantaneo (ad esempio, potenza istantanea o corrente), o semplicemente generare impulsi ogni X watt-ora o litri. Allora bisogna pensare a come e con cosa integrare e dove accumulare il valore. C'\u00e8 il rischio di perdere un rapporto per qualche motivo, e anche la precisione del sistema in generale solleva interrogativi. Certo, si pu\u00f2 affidare tutto questo a un sistema di smart home come home assistant, ma la questione del numero di registrazioni nel database rimane, e non \u00e8 possibile interrogare i sensori pi\u00f9 frequentemente di una volta al secondo (limitazione dell'architettura di home assistant).<\/li>\n<\/ul>\n<p><\/p>\n<h2>Approccio 1<\/h2>\n<p>\nIniziamo a vedere cosa offre home assistant di default. La misurazione del consumo su un periodo \u00e8 una funzionalit\u00e0 molto richiesta. Naturalmente, \u00e8 stata implementata da tempo in forma di componente specializzato: utility_meter. <\/p>\n<p>Il principio del componente \u00e8 che al suo interno crea una variabile valore_accumulato_corrente e la azzera al termine di un periodo definito (ora\/settimana\/mese). Il componente monitora autonomamente la variabile in ingresso (il valore di un sensore) e si sottoscrive alle modifiche di valore: il risultato \u00e8 pronto per te. Questa cosa si descrive in poche righe nel file di configurazione.<\/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>\nQui sensor.water_meter_cold \u00e8 il valore attuale del contatore in litri che ricevo <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/411259\/\">direttamente dall'apparecchio<\/a><\/noindex> tramite mqtt. La struttura crea 2 nuovi sensori water_cold_hour_um e water_cold_day_um, che accumulano le letture orarie e quotidiane, azzerandole al termine del periodo. Ecco il grafico dell'accumulatore orario per mezza giornata.<\/p>\n<p><img decoding=\"async\" alt=\"Casa intelligente: Costruiamo grafici del consumo di acqua ed elettricit\u00e0 in Home Assistant\" src=\"\/wp-content\/uploads\/2020\/03\/d3c3ea29c10b17142e51ebe756ab7123.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nIl codice dei grafici orari e giornalieri per lovelace-UI appare cos\u00ec:<\/p>\n<pre><code class=\"python\">      - type: history-graph\n        title: 'Consumo d'acqua orario usando variabili'\n        hours_to_show: 48\n        entities:\n          - sensor.water_hour\n\n      - type: history-graph\n        title: 'Consumo d'acqua giornaliero usando variabili'\n        hours_to_show: 360\n        entities:\n          - sensor.water_day\n<\/code><\/pre>\n<p>\nIn realt\u00e0, in questo algoritmo risiede il problema di questo approccio. Come ho gi\u00e0 accennato, per ogni valore in ingresso (la lettura attuale del contatore per ogni litro successivo) viene generato un record di 1kB nel database. Ogni utility meter genera anche un nuovo valore che viene anch'esso aggiunto al database. Se voglio raccogliere letture orarie\/giornaliere\/settiminali\/mensili, per diversi gruppi di acqua, e aggiungere anche una serie di contatori elettrici, si tratter\u00e0 di un'enorme quantit\u00e0 di dati. Anzi, i dati non sono molti, ma poich\u00e9 il home assistant scrive un sacco di informazioni superflue nel database, la dimensione del database crescer\u00e0 esponenzialmente. Temo persino di dover calcolare la dimensione del database per i grafici settimanali e mensili.<\/p>\n<p>Oltre a ci\u00f2, l'utility meter da solo non risolve il compito assegnato. Il grafico dei valori forniti dall'utility meter \u00e8 una funzione monotonicamente crescente, che si azzera ogni ora. Noi abbiamo bisogno di un grafico comprensibile per l'utente che mostri quanti litri sono stati consumati in un determinato periodo. Il componente standard history-graph non ha questa funzionalit\u00e0, ma il componente esterno mini-graph-card pu\u00f2 aiutarci.<\/p>\n<p>Questo \u00e8 il codice della scheda per 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: \"Consumo di acqua orario aggregato dal contatore\"\n        points_per_hour: 1\n        show:\n          graph: bar\n        type: 'custom:mini-graph-card'<\/code><\/pre>\n<p>\nOltre alle impostazioni standard come nome del sensore, tipo di grafico, colore (l'arancione standard non mi piaceva), \u00e8 importante notare 3 impostazioni:<\/p>\n<ul>\n<li>group_by:hour \u2014 il grafico verr\u00e0 generato allineando le colonne all'inizio dell'ora<\/li>\n<li>points_per_hour: 1 \u2014 una colonna per ogni ora<\/li>\n<li>E la cosa pi\u00f9 importante, aggregate_func: max \u2014 prendere il valore massimo in ciascuna ora. Questo parametro trasforma il grafico a zig-zag in colonne.<\/li>\n<\/ul>\n<p>\n<img decoding=\"async\" alt=\"Casa intelligente: Costruiamo grafici del consumo di acqua ed elettricit\u00e0 in Home Assistant\" src=\"\/wp-content\/uploads\/2020\/03\/5bd866c39b23299e5f15dcf4a9bce38f.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nNon badate ai vari colonne di sinistra: \u00e8 il comportamento standard del componente se non ci sono dati. E dati non ce ne sono \u2014 ho appena attivato la raccolta dati dall'utility meter solo per questo articolo (il mio approccio attuale lo descriver\u00f2 pi\u00f9 avanti). <\/p>\n<p>In questa immagine volevo dimostrare che a volte la visualizzazione dei dati funziona realmente e le colonne riflettono valori corretti. Solo che non tutti. La colonna evidenziata per l'intervallo dalle 11 alle 12 di mattina mostra 19 litri, anche se nel grafico dentato poco sopra per lo stesso periodo dallo stesso sensore vediamo un consumo di 62 litri. O \u00e8 un bug, o le mani sono imprecise. E non ho ancora capito perch\u00e9 manchino dati a destra: il consumo l\u00ec era nella norma, come \u00e8 visibile anche dal grafico dentato.<\/p>\n<p>In generale, non sono riuscito a ottenere credibilit\u00e0 da questo approccio: il grafico mostra quasi sempre qualche assurdit\u00e0.<\/p>\n<p>Codice analogo per il sensore giornaliero. <\/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: \"Consumo di acqua giornaliero aggregato dal contatore\"\n        points_per_hour: 0.0416666666\n        show:\n          graph: bar\n        type: 'custom:mini-graph-card'\n<\/code><\/pre>\n<p>\nSi noti che il parametro group_by \u00e8 impostato su interval, e controlla tutto il parametro points_per_hour. E qui sta un altro problema di questo componente: points_per_hour funziona bene sui grafici di un'ora o meno, ma malissimo su intervalli maggiori. Pertanto, per ottenere una colonna per un giorno, ho dovuto scrivere il valore 1\/24=0.04166666. Non parlo nemmeno dei grafici settimanali e mensili.<\/p>\n<h2>Approccio 2<\/h2>\n<p>\nSolo iniziando a esplorare home assistant mi sono imbattuto in questo 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=\"Guarda il video\" loading=\"lazy\" width=\"480\" height=\"360\" style=\"width:100%;height:auto;\">\r\n        <div class=\"play-button\"><\/div>\r\n    <\/div><\/center><br \/>\nUn compagno raccoglie dati di consumo da diversi tipi di prese Xiaomi. Il suo compito \u00e8 un po' pi\u00f9 semplice: mostrare semplicemente il valore di consumo di oggi, ieri e del mese. Non sono richiesti grafici. <\/p>\n<p>Lasciamo da parte le considerazioni sull'integrazione manuale dei valori istantanei di potenza: sulla \"precisione\" di questo approccio ho gi\u00e0 scritto sopra. Non \u00e8 chiaro perch\u00e9 non abbia utilizzato i valori accumulati di consumo, che gi\u00e0 vengono raccolti dalla stessa presa. A mio avviso, l'integrazione all'interno del dispositivo funzionerebbe meglio. <\/p>\n<p>Dallo video prenderemo l'idea del conteggio manuale del consumo per periodo. L'uomo considera solo i valori di oggi e di ieri, ma noi andremo oltre e proveremo a disegnare un grafico. L'essenza del metodo proposto nel mio caso \u00e8 la seguente.<\/p>\n<p>Creeremo una variabile valore_all_inizio_dell_ora, in cui registreremo i dati attuali del contatore.<br \/>\nAlla fine dell'ora (o all'inizio della successiva) conteremo la differenza tra la lettura attuale e quella memorizzata all'inizio dell'ora. Questa differenza sar\u00e0 il consumo per l'ora corrente: salveremo il valore nel sensore e in futuro utilizzeremo questo valore per costruire il grafico. <br \/>\n\u00c8 anche necessario \"azzerare\" la variabile valore_in_inizio_ora scrivendo il valore attuale del contatore.<\/p>\n<p>Tutto questo pu\u00f2 essere fatto tramite i\u2026 strumenti dello stesso home assistant. <\/p>\n<p>Il codice da scrivere sar\u00e0 leggermente pi\u00f9 lungo rispetto all'approccio precedente. Iniziamo a creare queste \"variabili\". Non abbiamo un'entit\u00e0 \"variabile\" predefinita, ma possiamo avvalerci dei servizi del broker mqtt. Invieremo l\u00e0 i valori con il flag retain=true: questo conserver\u00e0 il valore all'interno del broker e potr\u00e0 essere recuperato in qualsiasi momento, anche dopo il riavvio di home assistant. Ho creato direttamente contatori orari e giornalieri.<\/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>\nTutta la magia avviene nell'automazione, che si attiva ogni ora e ogni notte.<\/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>\nEntrambe le automazioni eseguono 2 azioni:<\/p>\n<ul>\n<li>Calcolano il valore per l'intervallo come differenza tra il valore iniziale e quello finale<\/li>\n<li>Aggiornano il valore di base per il prossimo intervallo<\/li>\n<\/ul>\n<p>\nLa costruzione dei grafici in questo caso viene realizzata con un semplice history-graph:<\/p>\n<pre><code class=\"python\">      - type: history-graph\n        title: 'Consumo d'acqua orario usando variabili'\n        hours_to_show: 48\n        entities:\n          - sensor.water_hour\n\n      - type: history-graph\n        title: 'Consumo d'acqua giornaliero usando variabili'\n        hours_to_show: 360\n        entities:\n          - sensor.water_day<\/code><\/pre>\n<p>\nAppare cos\u00ec:<\/p>\n<p><img decoding=\"async\" alt=\"Casa intelligente: Costruiamo grafici del consumo di acqua ed elettricit\u00e0 in Home Assistant\" src=\"\/wp-content\/uploads\/2020\/03\/ebde2fc5f0a72d7d6ba565c3686dc9c6.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nIn pratica, questo \u00e8 gi\u00e0 ci\u00f2 di cui abbiamo bisogno. Il vantaggio di questo metodo \u00e8 che i dati vengono generati una sola volta per intervallo. Cio\u00e8, solo 24 registrazioni al giorno per il grafico orario. <\/p>\n<p>Sfortunatamente, questo non risolve comunque il problema generale della crescente base. Se voglio un grafico del consumo mensile, devo conservare i dati per almeno un anno. E poich\u00e9 Home Assistant fornisce solo una impostazione della durata di conservazione per l'intero database, questo significa che TUTTI i dati nel sistema dovranno essere conservati per un anno intero. Ad esempio, in un anno consumo 200 metri cubi d'acqua, il che significa 200.000 registrazioni nel database. E se considero anche altri sensori, il numero diventa davvero imbarazzante.<\/p>\n<h2>Approccio 3<\/h2>\n<p>\nFortunatamente, persone ingeniose hanno gi\u00e0 risolto questo problema scrivendo il database InfluxDB. Questo database \u00e8 ottimizzato in modo speciale per la conservazione di dati time-based ed \u00e8 perfetto per memorizzare i valori di diversi sensori. Il sistema fornisce anche un linguaggio di query simile a SQL, che permette di estrarre valori dal database e poi aggregarli in vari modi. Infine, \u00e8 possibile conservare dati diversi per periodi di tempo diversi. Ad esempio, le letture frequentemente variabili come temperatura o umidit\u00e0 possono essere conservate solo per un paio di settimane, mentre le letture giornaliere del consumo d'acqua possono essere conservate per un anno intero.<\/p>\n<p>Oltre a InfluxDB, persone ingegnose hanno anche inventato Grafana \u2014 un sistema per la visualizzazione grafica dei dati di InfluxDB. Grafana \u00e8 in grado di disegnare diversi tipi di grafici, personalizzarli in dettaglio e, cosa pi\u00f9 importante, questi grafici possono essere \"inseriti\" nell'interfaccia lovelace di Home Assistant.<\/p>\n<p>Ispirarsi <noindex><a rel=\"nofollow\" href=\"https:\/\/dummylabs.com\/ru\/post\/2019-01-13-influxdb-part1\/\">qui <\/a><\/noindex> e <noindex><a rel=\"nofollow\" href=\"https:\/\/dummylabs.com\/ru\/post\/2019-05-28-influxdb-part2\/\">qui<\/a><\/noindex>. Negli articoli viene descritto nel dettaglio il processo di installazione e collegamento di InfluxDB e Grafana a Home Assistant. Io mi concentrer\u00f2 sulla soluzione del mio specifico problema.<\/p>\n<p>Quindi, per prima cosa iniziamo a memorizzare i valori del contatore in InfluxDB. Ecco un pezzo di configurazione di Home Assistant (in questo esempio mi divertir\u00f2 sia con l'acqua fredda che con quella calda):<\/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>\nDisattiveremo il salvataggio di questi stessi dati nel database interno di Home Assistant, per non gonfiarlo inutilmente:<\/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>\nPassiamo ora alla console di InfluxDB e configuriamo il nostro database. In particolare, dobbiamo impostare quanto tempo verranno conservati determinati dati. Questo \u00e8 regolato dalla cosiddetta retention policy \u2014 \u00e8 simile a database all'interno del database principale, e ogni database interno ha le proprie impostazioni. Per impostazione predefinita, tutti i dati vengono collocati nella retention policy chiamata autogen, questi dati verranno conservati per una settimana. Vorrei che i dati orari venissero conservati per un mese, quelli settimanali per un anno e che quelli mensili non venissero mai eliminati. Creiamo le corrispondenti retention policy.<\/p>\n<pre><code class=\"sql\">CREA POLITICA DI CONSERVAZIONE \"mese\" SU \"homeassistant\" DURATA 30d REPLICA 1\nCREA POLITICA DI CONSERVAZIONE \"anno\" SU \"homeassistant\" DURATA 52w REPLICA 1\nCREA POLITICA DI CONSERVAZIONE \"infinito\" SU \"homeassistant\" DURATA INF REPLICA 1<\/code><\/pre>\n<p>\nOra, veniamo al trucco principale \u2014 l'aggregazione dei dati tramite una continuous query. Questo \u00e8 un meccanismo che esegue automaticamente una query a intervalli di tempo prestabiliti, aggrega i dati in base a quella query e memorizza il risultato in un nuovo valore. Spieghiamolo con un esempio (scrivo in colonna per facilitare la lettura, ma in realt\u00e0 ho dovuto inserire questo comando in un'unica riga).<\/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>\nQuesto comando:<\/p>\n<ul>\n<li>Crea una continuous query chiamata cq_water_cold_hourly nel database homeassistant.<\/li>\n<li>La query verr\u00e0 eseguita ogni ora (time(1h)).<\/li>\n<li>La query prelever\u00e0 tutti i dati dalla misurazione homeassistant.autogen.l (litri), inclusi i dati sull'acqua fredda e calda.<\/li>\n<li>I dati aggregati verranno raggruppati per entity_id, creando valori separati per acqua fredda e calda.<\/li>\n<li>Poich\u00e9 il contatore dei litri \u00e8 una sequenza monotonicamente crescente, all'interno di ogni ora bisogna prendere il valore massimo, quindi l'aggregazione verr\u00e0 eseguita con la funzione max(value). <\/li>\n<li>Il nuovo valore verr\u00e0 registrato in homeassistant.month.water_meter_hour, dove month \u00e8 il nome della retention policy con un periodo di conservazione di un mese. Inoltre, i dati sull'acqua fredda e calda verranno distribuiti in voci separate con il corrispondente entity_id e valore nel campo value.<\/li>\n<\/ul>\n<p>\nDi notte o quando non c'\u00e8 nessuno in casa, non c'\u00e8 consumo d'acqua e quindi non ci sono nuovi registri in homeassistant.autogen.l. Per evitare lacune nei valori delle query ordinarie, si pu\u00f2 utilizzare fill(previous). Questo far\u00e0 in modo che InfluxDB usi il valore dell'ora precedente. <\/p>\n<p>Sfortunatamente, la query continua ha una peculiarit\u00e0: il trucco fill(previous) non funziona e le registrazioni semplicemente non vengono create. Inoltre, \u00e8 un problema insormontabile che <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/influxdata\/influxdb\/issues\/3220\">\u00e8 discusso da diversi anni<\/a><\/noindex>. Ci occuperemo di questo problema pi\u00f9 tardi, e fill(previous) nella query continua pu\u00f2 rimanere \u2014 non d\u00e0 fastidio. <\/p>\n<p>Verifichiamo cosa abbiamo ottenuto (naturalmente \u00e8 necessario aspettare un paio d'ore):<\/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>\nSi prega di notare che i valori nel database sono salvati in UTC, quindi in questo elenco differiscono di 3 ore: i valori delle 7 del mattino nell'output di InfluxDB corrispondono ai valori delle 10 del mattino nei grafici sopra. Inoltre, si noti che tra le 2 e le 5 del mattino non ci sono registrazioni: questa \u00e8 la stessa peculiarit\u00e0 della query continua.<\/p>\n<p>Come vedete, il valore aggregato \u00e8 anch'esso una sequenza monotonicamente crescente, solo che le registrazioni avvengono meno frequentemente \u2014 una volta all'ora. Ma non \u00e8 un problema \u2014 possiamo scrivere un'altra query che estrarr\u00e0 i dati corretti per il grafico.<\/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>\nDecrittazione:<\/p>\n<ul>\n<li>Dalla base dati homeassistant.month.water_meter_hour estraiamo i dati per entity_id='water_meter_cold' negli ultimi  giorni (time &gt;= now() -24h). <\/li>\n<li>Come ho gi\u00e0 menzionato, nella sequenza homeassistant.month.water_meter_hour possono mancare alcune registrazioni. Questi dati li genereremo nuovamente, eseguendo la query con GROUP BY time(1h). Questa volta fill(previous) funzioner\u00e0 come previsto, generando i dati mancanti (la funzione utilizzer\u00e0 il valore precedente)<\/li>\n<li>La cosa pi\u00f9 importante in questa query \u00e8 la funzione difference, che calcoler\u00e0 la differenza tra i timestamp orari. Essa da sola non funziona e richiede una funzione aggregante. Lasciamola essere max() come utilizzato in precedenza.<\/li>\n<\/ul>\n<p>\nL'output appare cos\u00ec<\/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>\nDalle 2 alle 5 del mattino (UTC) non ci sono stati consumi. Tuttavia, la richiesta restituir\u00e0 lo stesso valore di consumo grazie a fill(previous), e la funzione difference sottrarr\u00e0 questo valore da se stesso, producendo come risultato 0, che \u00e8 esattamente ci\u00f2 che ci serve.<\/p>\n<p>Ora resta solo da fare una cosa: costruire il grafico. Per questo apriremo Grafana, apriremo un cruscotto esistente (o ne creeremo uno nuovo), e creeremo un nuovo pannello. Le impostazioni dei grafici saranno le seguenti.<\/p>\n<p><img decoding=\"async\" alt=\"Casa intelligente: Costruiamo grafici del consumo di acqua ed elettricit\u00e0 in Home Assistant\" src=\"\/wp-content\/uploads\/2020\/03\/c6f551590cd141438b644b24aa4ddebf.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nVisualizzer\u00f2 i dati sull'acqua fredda e calda nello stesso grafico. La richiesta \u00e8 esattamente la stessa che ho descritto sopra. <\/p>\n<p>Le impostazioni di visualizzazione sono stabilite in questo modo. Per me sar\u00e0 un grafico a linee (lines), che prosegue a gradini (stairs). Spiegher\u00f2 il parametro Stack poco pi\u00f9 avanti. Ci sono anche altri parametri di visualizzazione, ma non sono cos\u00ec interessanti.<\/p>\n<p><img decoding=\"async\" alt=\"Casa intelligente: Costruiamo grafici del consumo di acqua ed elettricit\u00e0 in Home Assistant\" src=\"\/wp-content\/uploads\/2020\/03\/cb47fc8570b7fd1305ce3451e0518f11.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nPer aggiungere il grafico ottenuto in Home Assistant, \u00e8 necessario:<\/p>\n<ul>\n<li>uscire dalla modalit\u00e0 di modifica del grafico. Per qualche motivo, le impostazioni corrette per la condivisione dei grafici sono disponibili solo dalla pagina del cruscotto.<\/li>\n<li>Cliccare sul triangolo vicino al nome del grafico, nel menu selezionare share.<\/li>\n<li>Nella finestra che si apre, andare alla scheda embed.<\/li>\n<li>Deselezionare l'opzione current time range \u2014 il range temporale lo imposteremo tramite URL. <\/li>\n<li>Selezionare il tema richiesto. Nel mio caso, \u00e8 light.<\/li>\n<li>Copiare l'URL ottenuto nella scheda delle impostazioni lovelace-UI.<\/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>\nSi prega di notare che l'intervallo di tempo (ultimi 2 giorni) \u00e8 impostato proprio qui, e non nelle impostazioni del cruscotto. <\/p>\n<p>Il grafico appare cos\u00ec. Non ho usato acqua calda negli ultimi 2 giorni, quindi viene visualizzato solo il grafico dell'acqua fredda.<\/p>\n<p><img decoding=\"async\" alt=\"Casa intelligente: Costruiamo grafici del consumo di acqua ed elettricit\u00e0 in Home Assistant\" src=\"\/wp-content\/uploads\/2020\/03\/d18c82712d3b829a97ada8c8e2adce24.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nNon ho ancora deciso quale grafico mi piaccia di pi\u00f9, quello a gradini o i veri e propri bastoncini. Pertanto, fornir\u00f2 semplicemente un esempio del grafico giornaliero dei consumi, ma questa volta a colonne. Le richieste si costruiscono in modo simile a quanto descritto sopra. Le impostazioni di visualizzazione sono le seguenti:<\/p>\n<p><img decoding=\"async\" alt=\"Casa intelligente: Costruiamo grafici del consumo di acqua ed elettricit\u00e0 in Home Assistant\" src=\"\/wp-content\/uploads\/2020\/03\/557297e666f9cd73c3d2aa2fd80c0a2d.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nQuesto grafico appare cos\u00ec:<\/p>\n<p><img decoding=\"async\" alt=\"Casa intelligente: Costruiamo grafici del consumo di acqua ed elettricit\u00e0 in Home Assistant\" src=\"\/wp-content\/uploads\/2020\/03\/ac8c53569c6b05aeb22e05969de4cd6d.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nEcco riguardo al parametro Stack. In questo grafico, la colonna dell'acqua fredda si sovrappone alla colonna dell'acqua calda. L'altezza totale corrisponde al consumo totale di acqua fredda e calda per il periodo. <\/p>\n<p>Tutti i grafici mostrati sono dinamici. \u00c8 possibile posizionare il cursore su un punto di interesse e vedere i dettagli e il valore in quel punto specifico. <\/p>\n<p>Purtroppo non \u00e8 stato possibile evitare un po' di fango. Nel grafico a barre (a differenza del grafico a linee scalari) il centro della barra non si trova a met\u00e0 giornata, ma a 00:00. Cio\u00e8, la met\u00e0 sinistra della barra \u00e8 disegnata sul posto del giorno precedente. Cos\u00ec, i grafici del sabato e della domenica sono disegnati un po' pi\u00f9 a sinistra rispetto alla zona bluastro. Finora non ho trovato un modo per risolvere questo problema. <\/p>\n<p>Un altro problema riguarda l'impossibilit\u00e0 di lavorare correttamente con le intervalli mensili. Infatti, la lunghezza di un'ora\/giorno\/settimana \u00e8 fissa, ma la lunghezza di un mese varia ogni volta. InfluxDB pu\u00f2 lavorare solo con intervalli identici. Finora la mia mente \u00e8 riuscita a impostare un intervallo fisso di 30 giorni. S\u00ec, il grafico nel corso dell'anno si discoster\u00e0 leggermente e le barre non corrisponderanno esattamente ai mesi. Ma poich\u00e9 trovo interessante questa cosa come indicatore, va bene cos\u00ec. <\/p>\n<p>Vedo almeno due soluzioni:<\/p>\n<ul>\n<li>Ignorare i grafici mensili e limitarsi a quelli settimanali. 52 barre settimanali all'anno si presentano piuttosto bene.<\/li>\n<li>Considerare il consumo mensile come metodo n. 2 e utilizzare Grafana solo per grafici esteticamente belli. Sar\u00e0 una soluzione sufficientemente precisa. Si possono anche sovrapporre i grafici dell'anno scorso per il confronto\u2014Grafana pu\u00f2 fare anche questo.<\/li>\n<\/ul>\n<h2>Conclusione<\/h2>\n<p>\nNon so perch\u00e9, ma trovo affascinanti questo tipo di grafici. Mostrano che la vita \u00e8 in movimento e tutto cambia. Ieri era molto, oggi \u00e8 poco, domani sar\u00e0 diversamente. Devo ancora lavorare con i miei familiari sul tema del consumo. Ma anche con le attuali spese, semplicemente una cifra grande e poco chiara nella bolletta si trasforma gi\u00e0 in una rappresentazione piuttosto chiara dei consumi.<\/p>\n<p>Nonostante quasi 20 anni di carriera come programmatore, non ho praticamente mai avuto a che fare con database. Pertanto, l'installazione di un database esterno sembrava qualcosa di astruso e incomprensibile. Tutto \u00e8 cambiato <noindex><a rel=\"nofollow\" href=\"https:\/\/dummylabs.com\/ru\/post\/2019-01-13-influxdb-part1\">dall'articolo menzionato sopra<\/a><\/noindex> \u2014 si \u00e8 scoperto che aggiungere lo strumento appropriato si fa in pochi clic e, con uno strumento specializzato, il compito di costruire grafici diventa un po' pi\u00f9 semplice.<\/p>\n<p>Nel titolo ho menzionato il consumo di elettricit\u00e0. Sfortunatamente, al momento non posso fornire alcun grafico. Un contatore SDM120 \u00e8 morto, mentre l'altro presenta malfunzionamenti quando si utilizza Modbus. Tuttavia, questo non influisce sul tema di questo articolo: i grafici verranno realizzati nello stesso modo di quelli per l'acqua.<\/p>\n<p>In questo articolo ho presentato i metodi che ho sperimentato personalmente. Sicuramente ci sono altri modi per organizzare la raccolta e la visualizzazione dei dati di cui non sono a conoscenza. Raccontatemi nei commenti, mi interesser\u00e0 molto. Sar\u00f2 felice di ricevere critiche costruttive e nuove idee. Spero che il materiale presentato possa essere utile a qualcuno.<br \/>\n<br \/>Fonte: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/492314\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437 \u043f\u043e\u043b\u0443\u0447\u0430\u044f \u043f\u043b\u0430\u0442\u0435\u0436\u043a\u0443 \u0437\u0430 \u044d\u043b\u0435\u043a\u0442\u0440\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0438 \u0432\u043e\u0434\u0443 \u044f \u0443\u0434\u0438\u0432\u043b\u044f\u044e\u0441\u044c \u2014 \u043d\u0435\u0443\u0436\u0435\u043b\u0438 \u043c\u043e\u044f \u0441\u0435\u043c\u044c\u044f \u0441\u0442\u043e\u043e\u043e\u043e\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u044f\u0435\u0442? \u041d\u0443 \u0434\u0430, \u0432 \u0432\u0430\u043d\u043d\u043e\u0439 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d \u0442\u0435\u043f\u043b\u044b\u0439 \u043f\u043e\u043b \u0438 \u0431\u043e\u0439\u043b\u0435\u0440, \u043d\u043e \u0432\u0435\u0434\u044c \u043e\u043d\u0438 \u0436\u0435 \u043d\u0435 \u043a\u043e\u0447\u0435\u0433\u0430\u0440\u044f\u0442 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e. \u0412\u043e\u0434\u0443 \u0442\u043e\u0436\u0435 \u0432\u0440\u043e\u0434\u0435 \u044d\u043a\u043e\u043d\u043e\u043c\u0438\u043c (\u0445\u043e\u0442\u044f \u043f\u043e\u043f\u043b\u0435\u0441\u043a\u0430\u0442\u044c\u0441\u044f \u0432 \u0432\u0430\u043d\u043d\u043e\u0439 \u0442\u043e\u0436\u0435 \u043b\u044e\u0431\u0438\u043c). \u041d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043b\u0435\u0442 \u043d\u0430\u0437\u0430\u0434 \u044f \u0443\u0436\u0435 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u043b \u0441\u0447\u0435\u0442\u0447\u0438\u043a\u0438 \u0432\u043e\u0434\u044b \u0438 \u044d\u043b\u0435\u043a\u0442\u0440\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u043a \u0443\u043c\u043d\u043e\u043c\u0443 \u0434\u043e\u043c\u0443, [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":74422,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-74421","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.1.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/it\/blog\/administrirovanie\/umnyj-dom-stroim-grafiki-potrebleniya-vody-i-elektrichestva-v-home-assistant\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"it_IT\" \/>\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\/it\/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\udd47Casa intelligente: Creiamo grafici sul consumo di acqua ed elettricit\u00e0 in Home Assistant | ProHoster","description":"Ogni volta.","canonical_url":"https:\/\/prohoster.info\/it\/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":"it_IT","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\/it\/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\/it\/wp-json\/wp\/v2\/posts\/74421","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/comments?post=74421"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts\/74421\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/media\/74422"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/media?parent=74421"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/categories?post=74421"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/tags?post=74421"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}