{"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\/pt\/blog\/administrirovanie\/umnyj-dom-stroim-grafiki-potrebleniya-vody-i-elektrichestva-v-home-assistant","title":{"rendered":"Casa inteligente: Construindo gr\u00e1ficos de consumo de \u00e1gua e eletricidade no Home Assistant","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Casa inteligente: Construindo gr\u00e1ficos de consumo de \u00e1gua e eletricidade no Home Assistant\" src=\"\/wp-content\/uploads\/2020\/03\/f1133a4c391e901ed64bf0825a774fc6.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nToda vez que recebo a conta de eletricidade e \u00e1gua, fico surpresa - ser\u00e1 que minha fam\u00edlia consome tudo isso? Sim, temos aquecimento no banheiro e um boiler, mas eles n\u00e3o ficam funcionando o tempo todo. Tamb\u00e9m tentamos economizar \u00e1gua (embora adorar um banho relaxante seja uma de nossas prefer\u00eancias). H\u00e1 alguns anos, eu j\u00e1 <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/411259\/\">instalei medidores de \u00e1gua<\/a><\/noindex> e <noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/watch?v=XKvunh29sZo&amp;list=PLkt_cQxT0oUmfdxhbmTjytjaJjZjSVUOu\">de eletricidade<\/a><\/noindex> no sistema de casa inteligente, mas por a\u00ed ficou. S\u00f3 agora consegui analisar o consumo, e \u00e9 sobre isso que fala este artigo.<\/p>\n<p>Recentemente, migrei para o Home Assistant como meu sistema de casa inteligente. Uma das raz\u00f5es foi justamente a possibilidade de coletar muitos dados e gerar gr\u00e1ficos de forma conveniente.<\/p>\n<p>As informa\u00e7\u00f5es descritas neste artigo n\u00e3o s\u00e3o novas, todos esses m\u00e9todos j\u00e1 foram abordados de v\u00e1rias maneiras na internet. Por\u00e9m, cada artigo geralmente foca apenas em uma abordagem ou aspecto. Tive que comparar todas essas abordagens e escolher a mais adequada. O artigo ainda n\u00e3o oferece informa\u00e7\u00f5es abrangentes sobre coleta de dados, mas \u00e9 uma esp\u00e9cie de resumo do que eu fiz. Ent\u00e3o, cr\u00edticas construtivas e sugest\u00f5es de aprimoramento s\u00e3o bem-vindas.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>Formula\u00e7\u00e3o do problema<\/h2>\n<p>\nPortanto, o objetivo deste exerc\u00edcio \u00e9 obter gr\u00e1ficos bonitos de consumo de \u00e1gua e eletricidade:<\/p>\n<ul>\n<li>Por hora por 2 dias<\/li>\n<li>Di\u00e1rio por 2 semanas<\/li>\n<li>(opcional) semanal e mensal<\/li>\n<\/ul>\n<p>\nAqui, encontramos algumas dificuldades:<\/p>\n<ul>\n<li>Os componentes gr\u00e1ficos padr\u00e3o s\u00e3o geralmente bastante limitados. Na melhor das hip\u00f3teses, \u00e9 poss\u00edvel criar um gr\u00e1fico linear usando pontos.\n<p>Se voc\u00ea procurar bem, encontrar\u00e1 componentes de terceiros que ampliam as capacidades dos gr\u00e1ficos padr\u00e3o. Para o home assistant, h\u00e1 um componente <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/kalkih\/mini-graph-card\">mini-graph-card<\/a><\/noindex>, mas ele tamb\u00e9m \u00e9 um pouco limitado:<\/p>\n<ul>\n<li>\u00c9 dif\u00edcil definir os par\u00e2metros de gr\u00e1ficos de barras em per\u00edodos longos (a largura da barra \u00e9 definida em fra\u00e7\u00f5es de hora, ent\u00e3o intervalos maiores que uma hora s\u00e3o definidos com n\u00fameros fracion\u00e1rios)<\/li>\n<li>N\u00e3o \u00e9 poss\u00edvel adicionar diferentes entidades em um \u00fanico gr\u00e1fico (por exemplo, temperatura e umidade, ou misturar um gr\u00e1fico de barras com uma linha)<\/li>\n<\/ul>\n<\/li>\n<li>Al\u00e9m de que o home assistant por padr\u00e3o utiliza o banco de dados SQLite mais primitivo (e eu, com minhas habilidades limitadas, n\u00e3o consegui instalar o MySQL ou Postgres), os dados n\u00e3o s\u00e3o armazenados da forma mais otimizada. Por exemplo, a cada altera\u00e7\u00e3o de qualquer par\u00e2metro num\u00e9rico, mesmo que seja o menor, uma enorme json com cerca de um kilobyte \u00e9 gravada no banco.\n<pre><code class=\"json\">{&quot;entity_id&quot;: &quot;sensor.water_cold_hourly&quot;, &quot;old_state&quot;: {&quot;entity_id&quot;: &quot;sensor.water_cold_hourly&quot;, &quot;state&quot;: &quot;3&quot;, &quot;attributes&quot;: {&quot;source&quot;: &quot;sensor.water_meter_cold&quot;, &quot;status&quot;: &quot;collecting&quot;, &quot;last_period&quot;: &quot;29&quot;, &quot;last_reset&quot;: &quot;2020-02-23T21:00:00.022246+02:00&quot;, &quot;meter_period&quot;: &quot;hourly&quot;, &quot;unit_of_measurement&quot;: &quot;l&quot;, &quot;friendly_name&quot;: &quot;water_cold_hourly&quot;, &quot;icon&quot;: &quot;mdi:counter&quot;}, &quot;last_changed&quot;: &quot;2020-02-23T19:05:06.897604+00:00&quot;, &quot;last_updated&quot;: &quot;2020-02-23T19:05:06.897604+00:00&quot;, &quot;context&quot;: {&quot;id&quot;: &quot;aafc8ca305ba4e49ad4c97f0eddd8893&quot;, &quot;parent_id&quot;: null, &quot;user_id&quot;: null}}, &quot;new_state&quot;: {&quot;entity_id&quot;: &quot;sensor.water_cold_hourly&quot;, &quot;state&quot;: &quot;4&quot;, &quot;attributes&quot;: {&quot;source&quot;: &quot;sensor.water_meter_cold&quot;, &quot;status&quot;: &quot;collecting&quot;, &quot;last_period&quot;: &quot;29&quot;, &quot;last_reset&quot;: &quot;2020-02-23T21:00:00.022246+02:00&quot;, &quot;meter_period&quot;: &quot;hourly&quot;, &quot;unit_of_measurement&quot;: &quot;l&quot;, &quot;friendly_name&quot;: &quot;water_cold_hourly&quot;, &quot;icon&quot;: &quot;mdi:counter&quot;}, &quot;last_changed&quot;: &quot;2020-02-23T19:11:11.251545+00:00&quot;, &quot;last_updated&quot;: &quot;2020-02-23T19:11:11.251545+00:00&quot;, &quot;context&quot;: {&quot;id&quot;: &quot;0de64b8af6f14bb9a419dcf3b200ef56&quot;, &quot;parent_id&quot;: null, &quot;user_id&quot;: null}}}<\/code><\/pre>\n<p>\nTenho muitos sensores (sensores de temperatura em cada c\u00f4modo, contadores de \u00e1gua e eletricidade), e alguns deles geram uma quantidade consider\u00e1vel de dados. Por exemplo, apenas o contador de eletricidade SDM220 gera cerca de uma dezena de valores a cada 10-15 segundos, e gostaria de instalar cerca de 8 desses contadores. Al\u00e9m disso, existem muitos par\u00e2metros que s\u00e3o calculados com base em outros sensores. Assim, todos esses valores podem facilmente inflar o banco em 100-200 Mb diariamente. Ap\u00f3s uma semana, o sistema ter\u00e1 dificuldades para funcionar, e depois de um m\u00eas, o cart\u00e3o de mem\u00f3ria do Raspberry Pi (em uma instala\u00e7\u00e3o t\u00edpica do home assistant) pode falhar, e a ideia de armazenar dados por um ano torna-se invi\u00e1vel.<\/li>\n<li>Se voc\u00ea tiver sorte, seu contador pode registrar o consumo por conta pr\u00f3pria. Voc\u00ea pode consultar o contador a qualquer momento e perguntar qual o valor acumulado de consumo. Normalmente, todos os contadores de eletricidade que possuem uma interface digital (RS232\/RS485\/Modbus\/Zigbee) oferecem essa possibilidade.\n<p>Pior ainda se o dispositivo puder apenas medir um determinado par\u00e2metro instant\u00e2neo (como pot\u00eancia instant\u00e2nea ou corrente), ou simplesmente gerar pulsos a cada X watt-horas ou litros. Nesse caso, \u00e9 necess\u00e1rio pensar em como e com o que integrar isso e onde armazenar o valor. H\u00e1 o risco de perder um relat\u00f3rio por algum motivo, e a precis\u00e3o do sistema como um todo levanta quest\u00f5es. Claro, tudo isso pode ser delegado a um sistema de casa inteligente como o home assistant, mas o ponto sobre o n\u00famero de registros na base de dados n\u00e3o foi esquecido, e n\u00e3o \u00e9 poss\u00edvel consultar os sensores com frequ\u00eancia maior que uma vez por segundo (limita\u00e7\u00e3o da arquitetura do home assistant).<\/li>\n<\/ul>\n<p><\/p>\n<h2>Abordagem 1<\/h2>\n<p>\nPrimeiro, vamos ver o que o home assistant oferece de forma nativa. A medi\u00e7\u00e3o do consumo durante um per\u00edodo \u00e9 uma funcionalidade bastante requisitada. Sem d\u00favida, isso foi implementado h\u00e1 muito tempo na forma de um componente especializado \u2014 utility_meter. <\/p>\n<p>A ess\u00eancia do componente \u00e9 que ele cria internamente uma vari\u00e1vel current_accumulated_value e a redefine ao final de um determinado per\u00edodo (hora\/semanal\/mensal). O componente monitora a vari\u00e1vel de entrada (valor de algum sensor) e assina as mudan\u00e7as de valor \u2014 voc\u00ea simplesmente recebe o resultado pronto. Essa coisa \u00e9 descrita em apenas algumas linhas no arquivo de configura\u00e7\u00e3o.<\/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>\nAqui, sensor.water_meter_cold representa o valor atual do medidor em litros, que estou recebendo <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/411259\/\">diretamente do dispositivo<\/a><\/noindex> via mqtt. A estrutura cria 2 novos sensores water_cold_hour_um e water_cold_day_um, que acumulam as leituras hor\u00e1rias e di\u00e1rias, zerando-as ao final do per\u00edodo. Aqui est\u00e1 o gr\u00e1fico do acumulador hor\u00e1rio por meio dia.<\/p>\n<p><img decoding=\"async\" alt=\"Casa inteligente: Construindo gr\u00e1ficos de consumo de \u00e1gua e eletricidade no Home Assistant\" src=\"\/wp-content\/uploads\/2020\/03\/d3c3ea29c10b17142e51ebe756ab7123.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nO c\u00f3digo para os gr\u00e1ficos hor\u00e1rios e di\u00e1rios no lovelace-UI parece assim:<\/p>\n<pre><code class=\"python\">      - type: history-graph\n        title: 'Consumo de \u00e1gua hor\u00e1rio usando vari\u00e1veis'\n        hours_to_show: 48\n        entities:\n          - sensor.water_hour\n\n      - type: history-graph\n        title: 'Consumo de \u00e1gua di\u00e1rio usando vari\u00e1veis'\n        hours_to_show: 360\n        entities:\n          - sensor.water_day\n<\/code><\/pre>\n<p>\nNa verdade, neste algoritmo reside o problema dessa abordagem. Como mencionei anteriormente, para cada valor de entrada (o valor atual do medidor a cada litro seguinte) \u00e9 gerado 1KB de registro na base. Cada medidor de utilidade tamb\u00e9m gera um novo valor, que tamb\u00e9m \u00e9 adicionado \u00e0 base. Se eu quiser coletar medi\u00e7\u00f5es hor\u00e1rias \/ di\u00e1rias \/ semanais \/ mensais, e ainda adicionar v\u00e1rios sistemas de \u00e1gua, al\u00e9m de um monte de medidores de eletricidade \u2014 isso gerar\u00e1 uma quantidade enorme de dados. Na verdade, n\u00e3o s\u00e3o muitos dados, mas como o home assistant escreve uma por\u00e7\u00e3o de informa\u00e7\u00f5es desnecess\u00e1rias na base, o tamanho da base aumentar\u00e1 rapidamente. Tenho medo de at\u00e9 estimar o tamanho da base para gr\u00e1ficos semanais e mensais.<\/p>\n<p>Al\u00e9m disso, o medidor de utilidade por si s\u00f3 n\u00e3o resolve o problema proposto. O gr\u00e1fico dos valores fornecidos pelo medidor de utilidade \u00e9 uma fun\u00e7\u00e3o que cresce monotonamente, que \u00e9 zerada a cada hora. Precisamos de um gr\u00e1fico de consumo compreens\u00edvel para o usu\u00e1rio, mostrando quantos litros foram consumidos durante o per\u00edodo. O componente padr\u00e3o history-graph n\u00e3o faz isso, mas podemos contar com um componente externo chamado mini-graph-card.<\/p>\n<p>Este \u00e9 o c\u00f3digo do cart\u00e3o para o 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: &quot;Consumo de \u00e1gua hor\u00e1rio agregado pelo medidor de utilidade&quot;\n        points_per_hour: 1\n        show:\n          graph: bar\n        type: 'custom:mini-graph-card'<\/code><\/pre>\n<p>\nAl\u00e9m das configura\u00e7\u00f5es padr\u00e3o, como o nome do sensor, o tipo de gr\u00e1fico, a cor (n\u00e3o gostei do laranja padr\u00e3o), \u00e9 importante ressaltar 3 configura\u00e7\u00f5es:<\/p>\n<ul>\n<li>group_by:hour \u2014 o gr\u00e1fico ser\u00e1 gerado com o alinhamento das barras no in\u00edcio da hora<\/li>\n<li>points_per_hour: 1 \u2014 uma barra para cada hora<\/li>\n<li>E o mais importante, aggregate_func: max \u2014 pega o valor m\u00e1ximo dentro de cada hora. \u00c9 esse par\u00e2metro que transforma o gr\u00e1fico serrilhado em barras.<\/li>\n<\/ul>\n<p>\n<img decoding=\"async\" alt=\"Casa inteligente: Construindo gr\u00e1ficos de consumo de \u00e1gua e eletricidade no Home Assistant\" src=\"\/wp-content\/uploads\/2020\/03\/5bd866c39b23299e5f15dcf4a9bce38f.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nN\u00e3o preste aten\u00e7\u00e3o a uma s\u00e9rie de barras \u00e0 esquerda \u2014 esse \u00e9 o comportamento padr\u00e3o do componente quando n\u00e3o h\u00e1 dados. E realmente n\u00e3o havia dado \u2014 eu s\u00f3 liguei a coleta de dados pelo medidor de utilidade h\u00e1 apenas algumas horas, apenas para este artigo (minha abordagem atual explicarei um pouco mais abaixo). <\/p>\n<p>Nesta imagem, eu queria mostrar que \u00e0s vezes a exibi\u00e7\u00e3o dos dados realmente funciona, e as colunas refletem os valores corretos. Por\u00e9m, nem todos eles. A coluna destacada para o intervalo das 11h \u00e0s 12h da manh\u00e3, por algum motivo, exibe 19 litros, enquanto que no gr\u00e1fico dentado logo acima, para o mesmo per\u00edodo e do mesmo sensor, vemos um consumo de 62 litros. Ou \u00e9 um bug ou \u00e9 erro humano. E ainda n\u00e3o entendi por que os dados \u00e0 direita foram de alguma forma corrompidos \u2014 o consumo ali estava normal, como tamb\u00e9m \u00e9 vis\u00edvel no gr\u00e1fico dentado.<\/p>\n<p>Em suma, n\u00e3o consegui alcan\u00e7ar a credibilidade com essa abordagem \u2014 o gr\u00e1fico quase sempre mostra alguma coisa absurda.<\/p>\n<p>C\u00f3digo semelhante para o sensor di\u00e1rio. <\/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: &quot;Consumo de \u00e1gua di\u00e1rio agregado pelo medidor de utilidade&quot;\n        points_per_hour: 0.0416666666\n        show:\n          graph: bar\n        type: 'custom:mini-graph-card'\n<\/code><\/pre>\n<p>\nNote que o par\u00e2metro group_by est\u00e1 definido como interval, e o par\u00e2metro points_per_hour controla tudo. E isso traz \u00e0 tona outro problema deste componente \u2014 points_per_hour funciona bem em gr\u00e1ficos de uma hora ou menos, mas horrivelmente em intervalos maiores. Portanto, para obter uma \u00fanica coluna por dia, foi necess\u00e1rio inserir o valor 1\/24=0.04166666. J\u00e1 nem falo sobre gr\u00e1ficos semanais e mensais.<\/p>\n<h2>Abordagem 2<\/h2>\n<p>\nEnquanto ainda estava aprendendo sobre o Home Assistant, me deparei com este v\u00eddeo:<\/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=\"Por que no hosting comum a administra\u00e7\u00e3o do PrestaShop \u00e9 lenta, e no seu n\u00e3o \u00e9?\" loading=\"lazy\" width=\"480\" height=\"360\" style=\"width:100%;height:auto;\">\r\n        <div class=\"play-button\"><\/div>\r\n    <\/div><\/center><br \/>\nUm amigo coleta dados de consumo de v\u00e1rios tipos de tomadas da Xiaomi. A tarefa dele \u00e9 um pouco mais simples \u2014 apenas exibir o valor do consumo de hoje, ontem e do m\u00eas. Nenhum gr\u00e1fico \u00e9 necess\u00e1rio. <\/p>\n<p>Vamos deixar de lado as discuss\u00f5es sobre a integra\u00e7\u00e3o manual dos valores instant\u00e2neos de pot\u00eancia \u2014 j\u00e1 escrevi sobre a 'precis\u00e3o' dessa abordagem acima. N\u00e3o est\u00e1 claro por que ele n\u00e3o usou os valores acumulados de consumo, que j\u00e1 est\u00e3o sendo coletados pela mesma tomada. Na minha opini\u00e3o, a integra\u00e7\u00e3o dentro do dispositivo funcionar\u00e1 melhor. <\/p>\n<p>Do v\u00eddeo, vamos pegar a ideia de contar manualmente o consumo durante um per\u00edodo. O homem s\u00f3 considera os valores de hoje e ontem, mas vamos al\u00e9m e tentaremos desenhar um gr\u00e1fico. A ess\u00eancia do m\u00e9todo proposto, no meu caso, \u00e9 a seguinte.<\/p>\n<p>Vamos criar uma vari\u00e1vel chamada valor_no_in\u00edcio_da_hora, onde registraremos os dados atuais do contador.<br \/>\nNo final da hora (ou no in\u00edcio da pr\u00f3xima), contabilizaremos a diferen\u00e7a entre a leitura atual e a armazenada no in\u00edcio da hora. Esta diferen\u00e7a ser\u00e1 o consumo no hor\u00e1rio atual \u2014 vamos salvar o valor no sensor, e no futuro construiremos um gr\u00e1fico a partir desse valor. <br \/>\nTamb\u00e9m \u00e9 necess\u00e1rio \"zerar\" a vari\u00e1vel valor_no_in\u00edcio_da_hora, armazenando o valor atual do contador.<\/p>\n<p>Tudo isso pode ser feito atrav\u00e9s de... os pr\u00f3prios recursos do home assistant. <\/p>\n<p>O c\u00f3digo precisar\u00e1 ser um pouco maior do que na abordagem anterior. Primeiro, vamos definir essas \"vari\u00e1veis\". Por padr\u00e3o, n\u00e3o temos uma entidade \"vari\u00e1vel\", mas podemos usar os servi\u00e7os do broker mqtt. Vamos enviar valores para l\u00e1 com o sinalizador retain=true \u2014 isso preservar\u00e1 o valor dentro do broker, e poder\u00e1 ser recuperado a qualquer momento, mesmo ap\u00f3s a reinicializa\u00e7\u00e3o do home assistant. Eu criei contadores horais e di\u00e1rios.<\/p>\n<pre><code class=\"python\">- platform: mqtt\n  state_topic: &quot;test\/water\/hour&quot;\n  name: water_hour\n  unit_of_measurement: l\n\n- platform: mqtt\n  state_topic: &quot;test\/water\/hour_begin&quot;\n  name: water_hour_begin\n  unit_of_measurement: l\n\n- platform: mqtt\n  state_topic: &quot;test\/water\/day&quot;\n  name: water_day\n  unit_of_measurement: l\n\n- platform: mqtt\n  state_topic: &quot;test\/water\/day_begin&quot;\n  name: water_day_begin\n  unit_of_measurement: l<\/code><\/pre>\n<p>\nToda a m\u00e1gica ocorre na automa\u00e7\u00e3o, que \u00e9 acionada a cada hora e a cada noite, respectivamente.<\/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>\nAmbas as automa\u00e7\u00f5es realizam 2 a\u00e7\u00f5es:<\/p>\n<ul>\n<li>Calculam o valor do intervalo como a diferen\u00e7a entre o valor inicial e o final<\/li>\n<li>Atualizam o valor base para o pr\u00f3ximo intervalo<\/li>\n<\/ul>\n<p>\nA constru\u00e7\u00e3o de gr\u00e1ficos, neste caso, \u00e9 resolvida com um history-graph comum:<\/p>\n<pre><code class=\"python\">      - type: history-graph\n        title: 'Consumo de \u00e1gua hor\u00e1rio usando vari\u00e1veis'\n        hours_to_show: 48\n        entities:\n          - sensor.water_hour\n\n      - type: history-graph\n        title: 'Consumo de \u00e1gua di\u00e1rio usando vari\u00e1veis'\n        hours_to_show: 360\n        entities:\n          - sensor.water_day<\/code><\/pre>\n<p>\nAssim que se apresenta:<\/p>\n<p><img decoding=\"async\" alt=\"Casa inteligente: Construindo gr\u00e1ficos de consumo de \u00e1gua e eletricidade no Home Assistant\" src=\"\/wp-content\/uploads\/2020\/03\/ebde2fc5f0a72d7d6ba565c3686dc9c6.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nBasicamente, isso \u00e9 tudo o que \u00e9 necess\u00e1rio. A vantagem desse m\u00e9todo \u00e9 que os dados s\u00e3o gerados uma vez por intervalo. Ou seja, no total haver\u00e1 24 registros por dia para o gr\u00e1fico hor\u00e1rio. <\/p>\n<p>Infelizmente, isso n\u00e3o resolve o problema geral da base de dados em crescimento. Se eu quiser um gr\u00e1fico de consumo mensal, terei que armazenar dados por pelo menos um ano. E como o home assistant oferece apenas uma configura\u00e7\u00e3o de dura\u00e7\u00e3o de armazenamento para toda a base, isso significa que TODOS os dados do sistema precisar\u00e3o ser armazenados por um ano inteiro. Por exemplo, em um ano eu consumo 200 metros c\u00fabicos de \u00e1gua, o que resulta em 200.000 registros na base. E se considerarmos outros sensores, esse n\u00famero se torna realmente desproporcional.<\/p>\n<h2>Abordagem 3<\/h2>\n<p>\nFelizmente, pessoas inteligentes j\u00e1 resolveram esse problema criando o banco de dados InfluxDB. Esse banco \u00e9 otimizado especificamente para armazenar dados baseados em tempo e \u00e9 ideal para manter os valores de diferentes sensores. O sistema tamb\u00e9m oferece uma linguagem de consulta semelhante ao SQL, que permite extrair valores da base e, em seguida, agreg\u00e1-los de v\u00e1rias formas. Finalmente, diferentes dados podem ser armazenados por per\u00edodos distintos. Por exemplo, leituras que mudam frequentemente, como temperatura ou umidade, podem ser armazenadas por apenas algumas semanas, enquanto os dados di\u00e1rios de consumo de \u00e1gua podem ser mantidos por um ano inteiro.<\/p>\n<p>Al\u00e9m do InfluxDB, pessoas inteligentes tamb\u00e9m inventaram o Grafana \u2014 um sistema para criar gr\u00e1ficos a partir dos dados do InfluxDB. O Grafana consegue gerar diferentes tipos de gr\u00e1ficos, personaliz\u00e1-los detalhadamente e, o mais importante, esses gr\u00e1ficos podem ser \u201cinseridos\u201d na interface lovelace do home assistant.<\/p>\n<p>Inspirar-se <noindex><a rel=\"nofollow\" href=\"https:\/\/dummylabs.com\/ru\/post\/2019-01-13-influxdb-part1\/\">aqui <\/a><\/noindex> e <noindex><a rel=\"nofollow\" href=\"https:\/\/dummylabs.com\/ru\/post\/2019-05-28-influxdb-part2\/\">aqui<\/a><\/noindex>. Os artigos detalham o processo de instala\u00e7\u00e3o e conex\u00e3o do InfluxDB e Grafana ao home assistant. Eu, por minha vez, vou me concentrar na resolu\u00e7\u00e3o da minha tarefa espec\u00edfica.<\/p>\n<p>Portanto, em primeiro lugar, vamos come\u00e7ar a armazenar os valores do contador no InfluxDB. Um trecho da configura\u00e7\u00e3o do home assistant (neste exemplo, vou lidar n\u00e3o apenas com \u00e1gua fria, mas tamb\u00e9m com \u00e1gua quente):<\/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>\nVamos desativar o armazenamento dos mesmos dados na base interna do home assistant, para n\u00e3o inch\u00e1-la desnecessariamente:<\/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>\nAgora, vamos para o console do InfluxDB e configuraremos nosso banco de dados. Em particular, precisamos definir por quanto tempo certos dados ser\u00e3o armazenados. Isso \u00e9 gerenciado pela chamada retention policy \u2014 isso \u00e9 semelhante a bancos de dados dentro do banco de dados principal, onde cada banco interno tem suas pr\u00f3prias configura\u00e7\u00f5es. Por padr\u00e3o, todos os dados s\u00e3o armazenados na retention policy chamada autogen, e esses dados ser\u00e3o mantidos por uma semana. Eu gostaria que os dados hor\u00e1rios fossem armazenados por um m\u00eas, os semanais por um ano, e os mensais nunca fossem exclu\u00eddos. Vamos criar as retention policies correspondentes.<\/p>\n<pre><code class=\"sql\">CRIE UMA POL\u00cdTICA DE RETEN\u00c7\u00c3O \"m\u00eas\" EM \"homeassistant\" DURA\u00c7\u00c3O 30d REPLICA\u00c7\u00c3O 1\nCRIE UMA POL\u00cdTICA DE RETEN\u00c7\u00c3O \"ano\" EM \"homeassistant\" DURA\u00c7\u00c3O 52w REPLICA\u00c7\u00c3O 1\nCRIE UMA POL\u00cdTICA DE RETEN\u00c7\u00c3O \"infinito\" EM \"homeassistant\" DURA\u00c7\u00c3O INF REPLICA\u00c7\u00c3O 1<\/code><\/pre>\n<p>\nAgora, a verdadeira jogada \u2014 a agrega\u00e7\u00e3o de dados atrav\u00e9s de uma continuous query. Este \u00e9 um mecanismo que executa automaticamente uma consulta em intervalos de tempo definidos, agrega os dados com base nessa consulta, e armazena o resultado em um novo valor. Vamos analisar por meio de um exemplo (eu estou escrevendo em coluna para facilitar a leitura, mas na pr\u00e1tica eu precisei inserir esse comando em uma \u00fanica linha).<\/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>\nEste comando:<\/p>\n<ul>\n<li>Cria uma continuous query chamada cq_water_cold_hourly no banco homeassistant.<\/li>\n<li>A consulta ser\u00e1 executada a cada hora (time(1h)).<\/li>\n<li>A consulta ir\u00e1 extrair todos os dados da measurement homeassistant.autogen.l (litros), incluindo as leituras de \u00e1gua fria e quente.<\/li>\n<li>Os dados agregados ser\u00e3o agrupados por entity_id, o que nos dar\u00e1 valores separados para \u00e1gua fria e quente.<\/li>\n<li>Como o medidor de litros \u00e9 uma sequ\u00eancia mon\u00f3tona crescente, em cada hora precisaremos pegar o valor m\u00e1ximo, portanto, a agrega\u00e7\u00e3o ser\u00e1 realizada pela fun\u00e7\u00e3o max(value). <\/li>\n<li>O novo valor ser\u00e1 gravado em homeassistant.month.water_meter_hour, onde month \u00e9 o nome da retention policy com prazo de armazenamento de um m\u00eas. Al\u00e9m disso, os dados de \u00e1gua fria e quente ser\u00e3o dispersos em registros separados com os respectivos entity_id e valor no campo value.<\/li>\n<\/ul>\n<p>\nDurante a noite ou quando n\u00e3o h\u00e1 ningu\u00e9m em casa, o consumo de \u00e1gua \u00e9 zero, portanto, n\u00e3o h\u00e1 novos registros em homeassistant.autogen.l. Para evitar lacunas nos valores em consultas normais, pode-se usar fill(previous). Isso far\u00e1 com que o InfluxDB use o valor da hora anterior. <\/p>\n<p>Infelizmente, a consulta cont\u00ednua tem uma particularidade: o truque fill(previous) n\u00e3o funciona e os registros simplesmente n\u00e3o s\u00e3o criados. Al\u00e9m disso, \u00e9 um problema que <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/influxdata\/influxdb\/issues\/3220\">est\u00e1 sendo discutido h\u00e1 v\u00e1rios anos<\/a><\/noindex>. Vamos lidar com esse problema mais tarde, e o fill(previous) na consulta cont\u00ednua pode ficar \u2014 ele n\u00e3o atrapalha. <\/p>\n<p>Vamos verificar o que conseguimos (\u00e9 claro que precisamos esperar algumas horinhas):<\/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>\nNote que os valores na base de dados s\u00e3o armazenados em UTC, portanto, nesta lista eles diferem em 3 horas \u2014 os valores das 7 da manh\u00e3 no resultado do InfluxDB correspondem aos valores das 10 da manh\u00e3 nos gr\u00e1ficos acima. Tamb\u00e9m observe que entre 2 e 5 da manh\u00e3, n\u00e3o h\u00e1 registros \u2014 essa \u00e9 a particularidade da consulta cont\u00ednua.<\/p>\n<p>Como pode ver, o valor agregado tamb\u00e9m \u00e9 uma sequ\u00eancia mon\u00f3tona crescente, apenas os registros aparecem com menos frequ\u00eancia \u2014 uma vez por hora. Mas isso n\u00e3o \u00e9 um problema \u2014 podemos escrever mais uma consulta que obter\u00e1 os dados corretos para o gr\u00e1fico.<\/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>\nVou explicar:<\/p>\n<ul>\n<li>Extra\u00edmos dados da base homeassistant.month.water_meter_hour para entity_id='water_meter_cold' nas \u00faltimas 24 horas (time &gt;= now() -24h). <\/li>\n<li>Como mencionei, na sequ\u00eancia homeassistant.month.water_meter_hour podem faltar alguns registros. Vamos gerar esses dados novamente, executando a consulta com GROUP BY time(1h). Desta vez, o fill(previous) funcionar\u00e1 como deveria, gerando os dados faltantes (a fun\u00e7\u00e3o pegar\u00e1 o valor anterior)<\/li>\n<li>O mais importante nesta consulta \u00e9 a fun\u00e7\u00e3o difference, que calcular\u00e1 a diferen\u00e7a entre as marcas hor\u00e1rias. Ela n\u00e3o funciona sozinha e requer uma fun\u00e7\u00e3o de agrega\u00e7\u00e3o. Vamos usar max() que foi utilizada anteriormente.<\/li>\n<\/ul>\n<p>\nO resultado da execu\u00e7\u00e3o \u00e9 assim<\/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>\nDas 2 \u00e0s 5 da manh\u00e3 (UTC), n\u00e3o houve consumo. No entanto, a consulta retornar\u00e1 o mesmo valor de consumo gra\u00e7as ao fill(previous), e a fun\u00e7\u00e3o difference subtrair\u00e1 esse valor de si mesma, resultando em 0, que \u00e9 exatamente o que se requer.<\/p>\n<p>Agora, falta o mais simples \u2014 construir o gr\u00e1fico. Para isso, abriremos o Grafana, abriremos um painel existente (ou criaremos um novo), e criaremos um novo painel. As configura\u00e7\u00f5es dos gr\u00e1ficos ser\u00e3o as seguintes.<\/p>\n<p><img decoding=\"async\" alt=\"Casa inteligente: Construindo gr\u00e1ficos de consumo de \u00e1gua e eletricidade no Home Assistant\" src=\"\/wp-content\/uploads\/2020\/03\/c6f551590cd141438b644b24aa4ddebf.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nVou exibir os dados de \u00e1gua fria e quente em um mesmo gr\u00e1fico. A consulta \u00e9 exatamente como descrevi acima. <\/p>\n<p>As op\u00e7\u00f5es de exibi\u00e7\u00e3o s\u00e3o definidas assim. Para mim, ser\u00e1 um gr\u00e1fico de linhas (lines), que ser\u00e1 exibido em degraus (stairs). Vou explicar o par\u00e2metro Stack um pouco mais abaixo. Existem ainda outros par\u00e2metros de exibi\u00e7\u00e3o, mas eles n\u00e3o s\u00e3o t\u00e3o interessantes.<\/p>\n<p><img decoding=\"async\" alt=\"Casa inteligente: Construindo gr\u00e1ficos de consumo de \u00e1gua e eletricidade no Home Assistant\" src=\"\/wp-content\/uploads\/2020\/03\/cb47fc8570b7fd1305ce3451e0518f11.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nPara adicionar o gr\u00e1fico obtido ao home assistant, \u00e9 necess\u00e1rio:<\/p>\n<ul>\n<li>sair do modo de edi\u00e7\u00e3o do gr\u00e1fico. Por algum motivo, as configura\u00e7\u00f5es de compartilhamento de gr\u00e1ficos corretas s\u00e3o oferecidas apenas na p\u00e1gina do painel.<\/li>\n<li>Clique no tri\u00e2ngulo ao lado do nome do gr\u00e1fico e, no menu, selecione compartilhar.<\/li>\n<li>Na janela que se abre, v\u00e1 para a aba embed.<\/li>\n<li>Desmarque a op\u00e7\u00e3o current time range \u2014 o intervalo de tempo ser\u00e1 definido atrav\u00e9s da URL. <\/li>\n<li>Escolha o tema necess\u00e1rio. No meu caso, \u00e9 o tema claro.<\/li>\n<li>Copie a URL resultante para o cart\u00e3o de configura\u00e7\u00f5es do 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>\nObserve que o intervalo de tempo (\u00faltimos 2 dias) \u00e9 definido exatamente aqui, e n\u00e3o nas configura\u00e7\u00f5es do painel. <\/p>\n<p>O gr\u00e1fico se apresenta assim. N\u00e3o usei \u00e1gua quente nos \u00faltimos 2 dias, portanto, apenas o gr\u00e1fico da \u00e1gua fria \u00e9 desenhado.<\/p>\n<p><img decoding=\"async\" alt=\"Casa inteligente: Construindo gr\u00e1ficos de consumo de \u00e1gua e eletricidade no Home Assistant\" src=\"\/wp-content\/uploads\/2020\/03\/d18c82712d3b829a97ada8c8e2adce24.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nAssim, ainda n\u00e3o decidi qual gr\u00e1fico eu gosto mais, se o de linha em degraus ou os de barras reais. Portanto, apenas apresentarei um exemplo do gr\u00e1fico di\u00e1rio de consumo, desta vez apenas com barras. As consultas s\u00e3o constru\u00eddas de maneira semelhante \u00e0s descritas acima. As op\u00e7\u00f5es de exibi\u00e7\u00e3o s\u00e3o as seguintes:<\/p>\n<p><img decoding=\"async\" alt=\"Casa inteligente: Construindo gr\u00e1ficos de consumo de \u00e1gua e eletricidade no Home Assistant\" src=\"\/wp-content\/uploads\/2020\/03\/557297e666f9cd73c3d2aa2fd80c0a2d.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nEste gr\u00e1fico se apresenta assim:<\/p>\n<p><img decoding=\"async\" alt=\"Casa inteligente: Construindo gr\u00e1ficos de consumo de \u00e1gua e eletricidade no Home Assistant\" src=\"\/wp-content\/uploads\/2020\/03\/ac8c53569c6b05aeb22e05969de4cd6d.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nAqui est\u00e1 o que diz respeito ao par\u00e2metro Stack. Neste gr\u00e1fico, a barra de \u00e1gua fria \u00e9 desenhada sobre a barra de \u00e1gua quente. A altura total corresponde ao consumo total de \u00e1gua fria e quente durante o per\u00edodo. <\/p>\n<p>Todos os gr\u00e1ficos mostrados s\u00e3o din\u00e2micos. Voc\u00ea pode passar o mouse sobre um ponto de interesse e ver os detalhes e o valor em um ponto espec\u00edfico. <\/p>\n<p>Infelizmente, n\u00e3o conseguimos evitar um pequeno problema. No gr\u00e1fico de barras (diferente do gr\u00e1fico de linhas-segmentadas), o meio da barra n\u00e3o est\u00e1 no meio do dia, mas sim \u00e0 meia-noite. Ou seja, a metade esquerda da barra \u00e9 desenhada no dia anterior. Assim, os gr\u00e1ficos de s\u00e1bado e domingo est\u00e3o um pouco \u00e0 esquerda da zona azulada. At\u00e9 agora, n\u00e3o consegui pensar em uma solu\u00e7\u00e3o para isso. <\/p>\n<p>Outro problema \u00e9 a incapacidade de trabalhar corretamente com intervalos mensais. A quest\u00e3o \u00e9 que a dura\u00e7\u00e3o da hora\/dia\/semana \u00e9 fixa, mas a dura\u00e7\u00e3o do m\u00eas \u00e9 diferente a cada vez. O InfluxDB s\u00f3 consegue trabalhar com intervalos iguais. At\u00e9 agora, consegui definir um intervalo fixo de 30 dias. Sim, o gr\u00e1fico vai diluir um pouco ao longo do ano e as barras n\u00e3o corresponder\u00e3o perfeitamente aos meses. Mas como estou apenas interessado nisso como um indicador, estou bem com isso. <\/p>\n<p>Vejo pelo menos duas solu\u00e7\u00f5es:<\/p>\n<ul>\n<li>Abrir m\u00e3o dos gr\u00e1ficos mensais e limitar-me aos semanais. 52 barras semanais por ano ficam bem melhores.<\/li>\n<li>Calcular o consumo mensal como m\u00e9todo n\u00ba 2 e usar o Grafana apenas para gr\u00e1ficos bonitos. Assim, teremos uma solu\u00e7\u00e3o bastante precisa. \u00c9 poss\u00edvel at\u00e9 sobrepor os gr\u00e1ficos do ano passado para compara\u00e7\u00e3o \u2014 o Grafana faz isso.<\/li>\n<\/ul>\n<h2>Conclus\u00e3o<\/h2>\n<p>\nN\u00e3o sei por que, mas eu gosto desse tipo de gr\u00e1ficos. Eles mostram que a vida est\u00e1 pulsando e tudo muda. Ontem havia muito, hoje pouco, amanh\u00e3 ser\u00e1 de outra forma. Resta trabalhar com os familiares sobre o tema do consumo. Mas mesmo com os atuais h\u00e1bitos, um n\u00famero grande e confuso na fatura j\u00e1 se transforma em uma imagem bastante clara do consumo.<\/p>\n<p>Apesar de quase 20 anos de carreira como programador, eu praticamente n\u00e3o tinha experi\u00eancia com bancos de dados. Portanto, a instala\u00e7\u00e3o de um banco de dados externo parecia algo muito complexo e confuso. Tudo mudou <noindex><a rel=\"nofollow\" href=\"https:\/\/dummylabs.com\/ru\/post\/2019-01-13-influxdb-part1\">o artigo mencionado acima<\/a><\/noindex> \u2014 descobri que a integra\u00e7\u00e3o da ferramenta adequada pode ser feita em alguns cliques, e com uma ferramenta especializada, a tarefa de construir gr\u00e1ficos se torna um pouco mais f\u00e1cil.<\/p>\n<p>No t\u00edtulo, mencionei o consumo de eletricidade. Infelizmente, no momento n\u00e3o posso apresentar nenhum gr\u00e1fico. Um medidor SDM120 queimou, e o outro est\u00e1 com falha ao ser acessado via Modbus. No entanto, isso n\u00e3o afeta o tema deste artigo \u2014 os gr\u00e1ficos ser\u00e3o constru\u00eddos da mesma forma que para a \u00e1gua.<\/p>\n<p>Neste artigo, compartilhei as abordagens que testei pessoalmente. Com certeza existem outras formas de organizar a coleta e visualiza\u00e7\u00e3o de dados que eu n\u00e3o conhe\u00e7o. Compartilhe isso nos coment\u00e1rios, ficarei muito interessado. Agrade\u00e7o por cr\u00edticas construtivas e novas ideias. Espero que o material apresentado tamb\u00e9m ajude algu\u00e9m.<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.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\/pt\/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=\"pt_PT\" \/>\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\/pt\/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 Inteligente: Construindo gr\u00e1ficos de consumo de \u00e1gua e eletricidade no Home Assistant | ProHoster","description":"Toda vez.","canonical_url":"https:\/\/prohoster.info\/pt\/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":"pt_PT","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\/pt\/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\/pt\/wp-json\/wp\/v2\/posts\/74421","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/comments?post=74421"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts\/74421\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/media\/74422"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/media?parent=74421"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/categories?post=74421"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/tags?post=74421"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}