{"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\/es\/blog\/administrirovanie\/umnyj-dom-stroim-grafiki-potrebleniya-vody-i-elektrichestva-v-home-assistant","title":{"rendered":"Casa inteligente: Creando gr\u00e1ficos de consumo de agua y electricidad en Home Assistant","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Casa inteligente: Creando gr\u00e1ficos de consumo de agua y electricidad en Home Assistant\" src=\"\/wp-content\/uploads\/2020\/03\/f1133a4c391e901ed64bf0825a774fc6.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nCada vez que recibo la factura de electricidad y agua me sorprendo: \u00bfacaso mi familia consume tanto? Bueno, s\u00ed, hay suelo radiante y un calentador en el ba\u00f1o, pero no est\u00e1n funcionando todo el tiempo. Tambi\u00e9n parece que estamos ahorrando agua (aunque nos gusta relajarnos en la ba\u00f1era). Hace unos a\u00f1os ya <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/411259\/\">conect\u00e9 los medidores de agua<\/a><\/noindex> y <noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/watch?v=XKvunh29sZo&amp;list=PLkt_cQxT0oUmfdxhbmTjytjaJjZjSVUOu\">electricidad<\/a><\/noindex> al hogar inteligente, pero eso se qued\u00f3 ah\u00ed. Solo ahora he tenido tiempo de analizar el consumo, de lo cual trata este art\u00edculo.<\/p>\n<p>Recientemente cambi\u00e9 a Home Assistant como mi sistema de hogar inteligente. Una de las razones fue precisamente la capacidad de recopilar una gran cantidad de datos y poder generar gr\u00e1ficos de diferentes tipos de manera conveniente.<\/p>\n<p>La informaci\u00f3n descrita en este art\u00edculo no es nueva, todas estas cosas ya se han descrito en Internet bajo diferentes enfoques. Pero cada art\u00edculo, por lo general, describe solo un enfoque o aspecto. Comparar todos estos enfoques y elegir el m\u00e1s adecuado fue mi tarea. El art\u00edculo a\u00fan no proporciona informaci\u00f3n exhaustiva sobre la recopilaci\u00f3n de datos, pero es una especie de resumen de c\u00f3mo lo hice yo. Por lo tanto, se agradecen cr\u00edticas constructivas y sugerencias de mejora.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>Planteamiento del problema<\/h2>\n<p>\nAs\u00ed que el objetivo del ejercicio de hoy es obtener gr\u00e1ficos atractivos del consumo de agua y electricidad:<\/p>\n<ul>\n<li>Por hora durante 2 d\u00edas<\/li>\n<li>Por d\u00eda durante 2 semanas<\/li>\n<li>(opcional) semanal y mensual<\/li>\n<\/ul>\n<p>\nEn esto nos encontramos con algunas dificultades:<\/p>\n<ul>\n<li>Los componentes gr\u00e1ficos est\u00e1ndar suelen ser bastante limitados. En el mejor de los casos, se puede construir un gr\u00e1fico lineal a partir de puntos.\n<p>Si se busca bien, se pueden encontrar componentes de terceros que ampl\u00edan las posibilidades del gr\u00e1fico est\u00e1ndar. Para Home Assistant, el componente <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/kalkih\/mini-graph-card\">mini-graph-card<\/a><\/noindex>, aunque es bastante bueno y bonito, tambi\u00e9n tiene algunas limitaciones:<\/p>\n<ul>\n<li>Es complicado establecer par\u00e1metros para el gr\u00e1fico de barras en intervalos grandes (el ancho de la barra se define en fracciones de hora, por lo que los intervalos mayores de una hora se definir\u00e1n con n\u00fameros fraccionarios)<\/li>\n<li>No se pueden agregar diferentes entidades a un mismo gr\u00e1fico (por ejemplo, temperatura y humedad, o combinar un gr\u00e1fico de barras con una l\u00ednea)<\/li>\n<\/ul>\n<\/li>\n<li>No solo el asistente de inicio utiliza por defecto la base de datos m\u00e1s primitiva, SQLite (y yo, con mis torpes manos, no logr\u00e9 instalar MySQL o Postgres), sino que los datos se almacenan de la manera menos \u00f3ptima. Por ejemplo, cada vez que cambia cualquier par\u00e1metro digital, por m\u00e1s peque\u00f1o que sea, se escribe en la base de datos un enorme JSON de alrededor de un kilobyte.\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;recolectando&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;horario&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;recolectando&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;horario&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>\nTengo muchos sensores (sensores de temperatura en cada habitaci\u00f3n, contadores de agua y electricidad), y algunos generan bastantes datos. Por ejemplo, solo el contador de electricidad SDM220 genera alrededor de una decena de valores cada 10-15 segundos, y me gustar\u00eda instalar alrededor de 8 de esos contadores. Adem\u00e1s, hay un mont\u00f3n de par\u00e1metros que se calculan en funci\u00f3n de otros sensores. Por lo tanto, todos estos valores f\u00e1cilmente pueden aumentar la base de datos en 100-200 MB diariamente. Despu\u00e9s de una semana, el sistema apenas funcionar\u00e1, y despu\u00e9s de un mes, la memoria flash se apagar\u00e1 (en el caso de una instalaci\u00f3n t\u00edpica del asistente en Raspberry PI), y ni hablar de almacenar datos durante un a\u00f1o.<\/li>\n<li>Si tienes suerte, tu contador puede medir el consumo por s\u00ed mismo. En cualquier momento, puedes consultar al contador y preguntar cu\u00e1l es el valor acumulado del consumo. Por lo general, todos los contadores el\u00e9ctricos que tienen una interfaz digital (RS232\/RS485\/Modbus\/Zigbee) ofrecen tal posibilidad.\n<p>Es peor si el dispositivo solo puede medir un par\u00e1metro instant\u00e1neo (por ejemplo, potencia instant\u00e1nea o corriente), o simplemente generar pulsos cada X vatios-hora o litros. Entonces hay que pensar en c\u00f3mo y con qu\u00e9 integrarlo y d\u00f3nde acumular el valor. Existe el riesgo de pasar por alto el pr\u00f3ximo informe por alguna raz\u00f3n, y la precisi\u00f3n del sistema en general plantea dudas. Claro que se puede delegar esto a un sistema de hogar inteligente como home assistant, pero el punto sobre la cantidad de registros en la base de datos no se ha cancelado, y no se puede preguntar a los sensores con m\u00e1s frecuencia que una vez por segundo (limitaci\u00f3n de la arquitectura de home assistant).<\/li>\n<\/ul>\n<p><\/p>\n<h2>Enfoque 1<\/h2>\n<p>\nPrimero veamos lo que proporciona home assistant fuera de la caja. La medici\u00f3n del consumo durante un periodo es una funcionalidad muy demandada. Por supuesto, hace tiempo que se implement\u00f3 en forma de un componente especializado: utility_meter. <\/p>\n<p>La esencia del componente es que introduce una variable current_accumulated_value y la restablece al final del periodo designado (hora\/semana\/mes). El componente monitoriza la variable de entrada (el valor de alg\u00fan sensor), se suscribe a los cambios de valor y usted simplemente obtiene el resultado final. Esto se describe en solo unas pocas l\u00edneas en el archivo de configuraci\u00f3n.<\/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>\nAqu\u00ed, sensor.water_meter_cold es el valor actual del contador en litros, que recibo <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/411259\/\">directamente del dispositivo<\/a><\/noindex> a trav\u00e9s de MQTT. La estructura crea 2 nuevos sensores water_cold_hour_um y water_cold_day_um, que acumulan las lecturas horarias y diarias, restableci\u00e9ndolas al final del periodo. Aqu\u00ed est\u00e1 el gr\u00e1fico del acumulador horario durante medio d\u00eda.<\/p>\n<p><img decoding=\"async\" alt=\"Casa inteligente: Creando gr\u00e1ficos de consumo de agua y electricidad en Home Assistant\" src=\"\/wp-content\/uploads\/2020\/03\/d3c3ea29c10b17142e51ebe756ab7123.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nEl c\u00f3digo para los gr\u00e1ficos horarios y diarios para lovelace-UI se ve as\u00ed:<\/p>\n<pre><code class=\"python\">      - type: history-graph\n        title: 'Consumo de agua horario usando vars'\n        hours_to_show: 48\n        entities:\n          - sensor.water_hour\n\n      - type: history-graph\n        title: 'Consumo de agua diario usando vars'\n        hours_to_show: 360\n        entities:\n          - sensor.water_day\n<\/code><\/pre>\n<p>\nDe hecho, en este algoritmo radica el problema de este enfoque. Como mencion\u00e9 anteriormente, para cada valor de entrada (la lectura actual del contador para cada siguiente litro) se genera 1 kB de registro en la base de datos. Cada medidor de servicios tambi\u00e9n genera un nuevo valor, que tambi\u00e9n se almacena en la base. Si quiero recopilar lecturas horarias\/dia\/semana\/mensuales, adem\u00e1s de varios grupos de agua, y agregar un mont\u00f3n de contadores el\u00e9ctricos, \u00a1habr\u00e1 muchos datos! Bueno, en realidad no son tantos datos, pero dado que el asistente dom\u00e9stico escribe un mont\u00f3n de informaci\u00f3n innecesaria en la base, el tama\u00f1o de la base crecer\u00e1 como la espuma. Temo incluso estimar el tama\u00f1o de la base para gr\u00e1ficos semanales y mensuales.<\/p>\n<p>Adem\u00e1s, el medidor de servicios por s\u00ed mismo no resuelve el problema planteado. El gr\u00e1fico de valores que emite el medidor de servicios es una funci\u00f3n que crece de manera mon\u00f3tona y se reinicia a 0 cada hora. Necesitamos un gr\u00e1fico de consumo que sea comprensible para el usuario, que muestre cu\u00e1ntos litros se han consumido durante un periodo. El componente est\u00e1ndar history-graph no puede hacer esto, pero podemos utilizar un componente externo llamado mini-graph-card.<\/p>\n<p>Este es el c\u00f3digo de la tarjeta para 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 agua horario agregado por medidor de servicios&quot;\n        points_per_hour: 1\n        show:\n          graph: bar\n        type: 'custom:mini-graph-card'<\/code><\/pre>\n<p>\nAdem\u00e1s de las configuraciones est\u00e1ndar como el nombre del sensor, el tipo de gr\u00e1fico y el color (no me gust\u00f3 el naranja est\u00e1ndar), es importante se\u00f1alar 3 configuraciones:<\/p>\n<ul>\n<li>group_by:hour \u2014 el gr\u00e1fico se generar\u00e1 alineando las barras al inicio de la hora.<\/li>\n<li>points_per_hour: 1 \u2014 una barra para cada hora.<\/li>\n<li>Y lo m\u00e1s importante, aggregate_func: max \u2014 obtener el valor m\u00e1ximo dentro de cada hora. Precisamente este par\u00e1metro convierte el gr\u00e1fico en barras.<\/li>\n<\/ul>\n<p>\n<img decoding=\"async\" alt=\"Casa inteligente: Creando gr\u00e1ficos de consumo de agua y electricidad en Home Assistant\" src=\"\/wp-content\/uploads\/2020\/03\/5bd866c39b23299e5f15dcf4a9bce38f.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nNo prestes atenci\u00f3n a la serie de barras a la izquierda, es el comportamiento est\u00e1ndar del componente si no hay datos. Y no hubo datos, ya que solo hace un par de horas activ\u00e9 la recopilaci\u00f3n de datos del medidor de servicios solo para este art\u00edculo (mi enfoque actual lo explicar\u00e9 m\u00e1s adelante). <\/p>\n<p>En esta imagen quer\u00eda mostrar que a veces la visualizaci\u00f3n de datos funciona, y las barras realmente reflejan los valores correctos. Sin embargo, no todas lo hacen. La barra destacada entre las 11 y las 12 de la ma\u00f1ana muestra 19 litros, mientras que en el gr\u00e1fico dentado arriba, durante el mismo per\u00edodo y desde el mismo sensor, vemos un consumo de 62 litros. O es un error, o hay algo mal hecho. A\u00fan no he entendido por qu\u00e9 se rompieron los datos a la derecha \u2014 el consumo all\u00ed era normal, lo cual tambi\u00e9n se ve en el gr\u00e1fico dentado.<\/p>\n<p>En general, no logr\u00e9 hacer que este enfoque fuera cre\u00edble \u2014 el gr\u00e1fico casi siempre muestra alguna tonter\u00eda.<\/p>\n<p>C\u00f3digo similar para el sensor diario. <\/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 agua diario agregado por medidor de servicios&quot;\n        points_per_hour: 0.0416666666\n        show:\n          graph: bar\n        type: 'custom:mini-graph-card'\n<\/code><\/pre>\n<p>\nTenga en cuenta que el par\u00e1metro group_by se establece en interval y est\u00e1 controlado por el par\u00e1metro points_per_hour. Aqu\u00ed radica otro problema de este componente: points_per_hour funciona bien en gr\u00e1ficos de una hora o menos, pero funciona muy mal en intervalos mayores. As\u00ed que para obtener una barra por un d\u00eda, tuve que introducir el valor 1\/24=0.04166666. Ya ni hablemos de gr\u00e1ficos semanales y mensuales.<\/p>\n<h2>Enfoque 2<\/h2>\n<p>\nA\u00fan mientras aprend\u00eda sobre home assistant, me encontr\u00e9 con este 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=\"Reproducir 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 compa\u00f1ero recopila datos de consumo de varios tipos de enchufes de Xiaomi. Su tarea es un poco m\u00e1s sencilla: simplemente mostrar el valor del consumo de hoy, ayer y del mes. No se requieren gr\u00e1ficos. <\/p>\n<p>Dejaremos de lado las consideraciones sobre la integraci\u00f3n manual de los valores instant\u00e1neos de potencia \u2014 ya he escrito sobre la \"precisi\u00f3n\" de este enfoque anteriormente. No est\u00e1 claro por qu\u00e9 no us\u00f3 los valores acumulados de consumo, que ya recoge el mismo enchufe. En mi opini\u00f3n, la integraci\u00f3n dentro del dispositivo funcionar\u00e1 mejor. <\/p>\n<p>Tomaremos del video la idea del c\u00e1lculo manual del consumo durante un per\u00edodo. El hombre solo cuenta los valores de hoy y ayer, pero iremos m\u00e1s all\u00e1 e intentaremos dibujar un gr\u00e1fico. La esencia del m\u00e9todo propuesto en mi caso es la siguiente.<\/p>\n<p>Crearemos una variable valor_al_inicio_de_la_hora, en la que registraremos las lecturas actuales del contador.<br \/>\nAl final de la hora (o al principio de la siguiente), contaremos la diferencia entre la lectura actual y la guardada al inicio de la hora. Esta diferencia ser\u00e1 el consumo de la hora actual; almacenaremos el valor en el sensor y en el futuro construiremos un gr\u00e1fico basado en este valor. <br \/>\nTambi\u00e9n es necesario \"resetear\" la variable valor_al_inicio_hora guardando all\u00ed el valor actual del contador.<\/p>\n<p>Todo esto se puede hacer a trav\u00e9s de los m\u00e9todos del propio home assistant. <\/p>\n<p>Tendremos que escribir un poco m\u00e1s de c\u00f3digo que en el enfoque anterior. Primero estableceremos estas \"variables\". No tenemos una entidad de \"variable\" de forma predeterminada, pero podemos recurrir a los servicios del broker mqtt. Enviaremos valores con la bandera retain=true; esto mantendr\u00e1 el valor dentro del broker y podr\u00e1 recuperarse en cualquier momento, incluso al reiniciar home assistant. He creado contadores horarios y diarios de inmediato.<\/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 la magia ocurre en la automatizaci\u00f3n que se ejecuta cada hora y cada noche, 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: &quot;test\/water\/hour&quot;\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: &quot;test\/water\/hour_begin&quot;\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: &quot;00:00:00&quot;\n  action:\n    - service: mqtt.publish\n      data:\n        topic: &quot;test\/water\/day&quot;\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: &quot;test\/water\/day_begin&quot;\n        payload_template: &gt;\n          {{ states.sensor.water_meter_cold.state }}\n        retain: true<\/code><\/pre>\n<p>\nAmbas automatizaciones realizan 2 acciones:<\/p>\n<ul>\n<li>Calculan el valor del intervalo como la diferencia entre el valor inicial y el final<\/li>\n<li>Actualizan el valor base para el siguiente intervalo<\/li>\n<\/ul>\n<p>\nLa construcci\u00f3n de gr\u00e1ficos en este caso se resuelve con un history-graph normal:<\/p>\n<pre><code class=\"python\">      - type: history-graph\n        title: 'Consumo de agua horario usando vars'\n        hours_to_show: 48\n        entities:\n          - sensor.water_hour\n\n      - type: history-graph\n        title: 'Consumo de agua diario usando vars'\n        hours_to_show: 360\n        entities:\n          - sensor.water_day<\/code><\/pre>\n<p>\nAs\u00ed es como se ve:<\/p>\n<p><img decoding=\"async\" alt=\"Casa inteligente: Creando gr\u00e1ficos de consumo de agua y electricidad en Home Assistant\" src=\"\/wp-content\/uploads\/2020\/03\/ebde2fc5f0a72d7d6ba565c3686dc9c6.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nEn principio, esto es ya lo que se necesita. La ventaja de este m\u00e9todo es que los datos se generan una sola vez por intervalo. Es decir, en total 24 registros por d\u00eda para el gr\u00e1fico horario. <\/p>\n<p>Lamentablemente, esto no resuelve el problema general de la creciente base de datos. Si quiero un gr\u00e1fico del consumo mensual, tendr\u00e9 que almacenar datos durante al menos un a\u00f1o. Y dado que el asistente dom\u00e9stico solo proporciona una configuraci\u00f3n de duraci\u00f3n de almacenamiento para toda la base, eso significa que TODOS los datos en el sistema tendr\u00e1n que almacenarse durante un a\u00f1o. Por ejemplo, en un a\u00f1o consumo 200 metros c\u00fabicos de agua, lo que equivale a 200000 registros en la base. Y si consideramos otros sensores, la cifra se vuelve realmente exorbitante.<\/p>\n<h2>Enfoque 3<\/h2>\n<p>\nAfortunadamente, personas inteligentes ya han resuelto este problema al crear la base de datos InfluxDB. Esta base est\u00e1 optimizada espec\u00edficamente para el almacenamiento de datos basados en el tiempo y es ideal para almacenar los valores de diferentes sensores. El sistema tambi\u00e9n proporciona un lenguaje de consultas similar a SQL, que permite extraer valores de la base y luego agregarlos de diversas maneras. Finalmente, diferentes datos se pueden almacenar durante diferentes per\u00edodos. Por ejemplo, lecturas que cambian con frecuencia, como la temperatura o la humedad, se pueden almacenar solo durante un par de semanas, mientras que las lecturas diarias del consumo de agua se pueden almacenar durante todo un a\u00f1o.<\/p>\n<p>Adem\u00e1s de InfluxDB, las personas inteligentes tambi\u00e9n han inventado Grafana, un sistema para crear gr\u00e1ficos con datos de InfluxDB. Grafana puede dibujar diferentes tipos de gr\u00e1ficos, personalizarlos en detalle y, lo m\u00e1s importante, estos gr\u00e1ficos se pueden \u201cincrustar\u201d en la interfaz Lovelace del asistente dom\u00e9stico.<\/p>\n<p>Inspirarse <noindex><a rel=\"nofollow\" href=\"https:\/\/dummylabs.com\/ru\/post\/2019-01-13-influxdb-part1\/\">aqu\u00ed <\/a><\/noindex> y <noindex><a rel=\"nofollow\" href=\"https:\/\/dummylabs.com\/ru\/post\/2019-05-28-influxdb-part2\/\">aqu\u00ed<\/a><\/noindex>. Los art\u00edculos describen en detalle el proceso de instalaci\u00f3n y conexi\u00f3n de InfluxDB y Grafana al asistente dom\u00e9stico. Yo me centrar\u00e9 en resolver mi tarea espec\u00edfica.<\/p>\n<p>As\u00ed que, lo primero que haremos es comenzar a almacenar el valor del medidor en InfluxDB. Un fragmento de configuraci\u00f3n del asistente dom\u00e9stico (en este ejemplo me entretendr\u00e9 no solo con agua fr\u00eda, sino tambi\u00e9n con agua caliente):<\/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>\nDesactivaremos el almacenamiento de estos mismos datos en la base de datos interna del asistente dom\u00e9stico, para no inflarla innecesariamente:<\/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>\nAhora pasemos a la consola de InfluxDB y configuremos nuestra base de datos. En particular, necesitamos ajustar cu\u00e1nto tiempo se almacenar\u00e1n ciertos datos. Esto se regula mediante la llamada pol\u00edtica de retenci\u00f3n, que se asemeja a bases de datos dentro de la base de datos principal, y cada base interna tiene su propia configuraci\u00f3n. Por defecto, todos los datos se almacenan en una pol\u00edtica de retenci\u00f3n llamada autogen, y estos datos se almacenar\u00e1n durante una semana. Me gustar\u00eda que los datos horarios se guardaran un mes, los semanales un a\u00f1o, y los mensuales nunca se eliminaran. Crearemos las pol\u00edticas de retenci\u00f3n correspondientes.<\/p>\n<pre><code class=\"sql\">CREAR POL\u00cdTICA DE RETENCI\u00d3N &quot;month&quot; EN &quot;homeassistant&quot; DURACI\u00d3N 30d REPLICACI\u00d3N 1\nCREAR POL\u00cdTICA DE RETENCI\u00d3N &quot;year&quot; EN &quot;homeassistant&quot; DURACI\u00d3N 52w REPLICACI\u00d3N 1\nCREAR POL\u00cdTICA DE RETENCI\u00d3N &quot;infinite&quot; EN &quot;homeassistant&quot; DURACI\u00d3N INF REPLICACI\u00d3N 1<\/code><\/pre>\n<p>\nAhora, el truco principal: la agregaci\u00f3n de datos mediante consulta continua. Este es un mecanismo que ejecuta autom\u00e1ticamente una consulta a intervalos de tiempo establecidos, agrega datos seg\u00fan esa consulta, y almacena el resultado en un nuevo valor. Vamos a verlo con un ejemplo (escribo en columnas para facilitar la lectura, pero en realidad tuve que introducir este comando en una sola l\u00ednea).<\/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>Crea una consulta continua llamada cq_water_cold_hourly en la base homeassistant.<\/li>\n<li>La consulta se ejecutar\u00e1 cada hora (time(1h)).<\/li>\n<li>La consulta recoger\u00e1 todos los datos de la medici\u00f3n homeassistant.autogen.l (litros), incluyendo las lecturas de agua fr\u00eda y caliente.<\/li>\n<li>Los datos agregados se agrupar\u00e1n por entity_id, lo que nos dar\u00e1 valores separados para el agua fr\u00eda y caliente.<\/li>\n<li>Dado que el contador de litros es una secuencia monotonamente creciente, dentro de cada hora se tomar\u00e1 el valor m\u00e1ximo; por lo tanto, la agregaci\u00f3n se realizar\u00e1 mediante la funci\u00f3n max(value). <\/li>\n<li>El nuevo valor se registrar\u00e1 en homeassistant.month.water_meter_hour, donde month es el nombre de la pol\u00edtica de retenci\u00f3n con un per\u00edodo de almacenamiento de un mes. Adem\u00e1s, los datos de agua fr\u00eda y caliente se distribuir\u00e1n en entradas separadas con el correspondiente entity_id y valor en el campo value.<\/li>\n<\/ul>\n<p>\nDurante la noche o cuando no hay nadie en casa, no hay consumo de agua y, por lo tanto, tampoco hay nuevos registros en homeassistant.autogen.l. Para evitar que haya omisiones de valores en consultas normales, se puede usar fill(previous). Esto har\u00e1 que InfluxDB utilice el valor de la hora anterior. <\/p>\n<p>Lamentablemente, la consulta continua tiene una caracter\u00edstica: el truco fill(previous) no funciona y los registros simplemente no se crean. Adem\u00e1s, es un problema insuperable que <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/influxdata\/influxdb\/issues\/3220\">se discute desde hace varios a\u00f1os<\/a><\/noindex>. Abordaremos este problema m\u00e1s adelante, y el fill(previous) en la consulta continua puede permanecer, ya que no interfiere. <\/p>\n<p>Verificaremos qu\u00e9 hemos obtenido (por supuesto, hay que esperar un par de horas):<\/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>\nTenga en cuenta que los valores en la base de datos se guardan en UTC, por lo que en esta lista difieren por 3 horas: los valores de las 7 de la ma\u00f1ana en la salida de InfluxDB corresponden a los valores de las 10 de la ma\u00f1ana en los gr\u00e1ficos anteriores. Tambi\u00e9n tenga en cuenta que entre las 2 y las 5 de la ma\u00f1ana simplemente no hay registros: esa es la caracter\u00edstica de la consulta continua.<\/p>\n<p>Como puede ver, el valor agregado tambi\u00e9n es una secuencia mon\u00f3tonamente creciente, solo que los registros son menos frecuentes: una vez por hora. Pero no es un problema: podemos escribir otra consulta que extraiga los datos correctos para el 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>\nDejar\u00e9 claro:<\/p>\n<ul>\n<li>Extraeremos datos de homeassistant.month.water_meter_hour para entity_id=&#8217;water_meter_cold&#8217; en las \u00faltimas 24 horas (time &gt;= now() -24h). <\/li>\n<li>Como mencion\u00e9 anteriormente, en la secuencia homeassistant.month.water_meter_hour pueden faltar algunos registros. Estos datos los generaremos de nuevo, ejecutando la consulta con GROUP BY time(1h). Esta vez fill(previous) funcionar\u00e1 como se espera, generando los datos faltantes (la funci\u00f3n tomar\u00e1 el valor anterior)<\/li>\n<li>Lo m\u00e1s importante en esta consulta es la funci\u00f3n difference, que calcular\u00e1 la diferencia entre las marcas horarias. Por s\u00ed sola no funciona y requiere una funci\u00f3n de agregaci\u00f3n. Que sea max() como se us\u00f3 antes.<\/li>\n<\/ul>\n<p>\nEl resultado de la ejecuci\u00f3n se ve as\u00ed<\/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>\nDe 2 a 5 de la ma\u00f1ana (UTC) no hubo consumo. Sin embargo, la consulta devolver\u00e1 el mismo valor de consumo gracias a fill(previous), y la funci\u00f3n difference restar\u00e1 este valor de s\u00ed mismo y obtendremos 0, que es lo que se requiere.<\/p>\n<p>Solo falta lo m\u00e1s sencillo: construir el gr\u00e1fico. Para ello, abrimos Grafana, abrimos alg\u00fan panel existente (o creamos uno nuevo), y creamos un nuevo panel. La configuraci\u00f3n de los gr\u00e1ficos ser\u00e1 la siguiente.<\/p>\n<p><img decoding=\"async\" alt=\"Casa inteligente: Creando gr\u00e1ficos de consumo de agua y electricidad en Home Assistant\" src=\"\/wp-content\/uploads\/2020\/03\/c6f551590cd141438b644b24aa4ddebf.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nVoy a mostrar los datos de agua fr\u00eda y caliente en un mismo gr\u00e1fico. La consulta es exactamente la misma que describ\u00ed anteriormente. <\/p>\n<p>Los par\u00e1metros de visualizaci\u00f3n se definen as\u00ed. En mi caso, ser\u00e1 un gr\u00e1fico de l\u00edneas (lines) que avanza en escalones (stairs). El par\u00e1metro Stack lo explicar\u00e9 un poco m\u00e1s abajo. A continuaci\u00f3n, hay otros par\u00e1metros de visualizaci\u00f3n, pero no son tan interesantes.<\/p>\n<p><img decoding=\"async\" alt=\"Casa inteligente: Creando gr\u00e1ficos de consumo de agua y electricidad en Home Assistant\" src=\"\/wp-content\/uploads\/2020\/03\/cb47fc8570b7fd1305ce3451e0518f11.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nPara a\u00f1adir el gr\u00e1fico obtenido a home assistant, se necesita:<\/p>\n<ul>\n<li>salir del modo de edici\u00f3n del gr\u00e1fico. Por alguna raz\u00f3n, la configuraci\u00f3n correcta de compartir gr\u00e1ficos solo se ofrece desde la p\u00e1gina del dashboard.<\/li>\n<li>Hacer clic en el tri\u00e1ngulo junto al nombre del gr\u00e1fico, en el men\u00fa seleccionar compartir.<\/li>\n<li>En la ventana que se abre, ir a la pesta\u00f1a de insertar.<\/li>\n<li>Desmarcar la casilla de rango de tiempo actual: el rango de tiempo lo estableceremos a trav\u00e9s de la URL. <\/li>\n<li>Seleccionar el tema necesario. En mi caso, es claro.<\/li>\n<li>Copiar la URL resultante en la tarjeta de configuraci\u00f3n de lovelace-UI.<\/li>\n<\/ul>\n<p><\/p>\n<pre><code class=\"python\">      - type: iframe\n        id: graf_water_hourly\n        url: &quot;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&quot;\n<\/code><\/pre>\n<p>\nTenga en cuenta que el rango de tiempo (\u00faltimos 2 d\u00edas) se define aqu\u00ed, y no en la configuraci\u00f3n del dashboard. <\/p>\n<p>As\u00ed es como se ve el gr\u00e1fico. No utilic\u00e9 agua caliente en los \u00faltimos 2 d\u00edas, por lo que solo se muestra el gr\u00e1fico del agua fr\u00eda.<\/p>\n<p><img decoding=\"async\" alt=\"Casa inteligente: Creando gr\u00e1ficos de consumo de agua y electricidad en Home Assistant\" src=\"\/wp-content\/uploads\/2020\/03\/d18c82712d3b829a97ada8c8e2adce24.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nAs\u00ed que a\u00fan no he decidido cu\u00e1l gr\u00e1fico me gusta m\u00e1s, el de l\u00ednea escalonada o las verdaderas barras. Por eso, simplemente dar\u00e9 un ejemplo de gr\u00e1fico diario de consumo, pero esta vez con barras. Las consultas se construyen de manera similar a las descritas anteriormente. Los par\u00e1metros de visualizaci\u00f3n son los siguientes:<\/p>\n<p><img decoding=\"async\" alt=\"Casa inteligente: Creando gr\u00e1ficos de consumo de agua y electricidad en Home Assistant\" src=\"\/wp-content\/uploads\/2020\/03\/557297e666f9cd73c3d2aa2fd80c0a2d.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nEste gr\u00e1fico se ve as\u00ed:<\/p>\n<p><img decoding=\"async\" alt=\"Casa inteligente: Creando gr\u00e1ficos de consumo de agua y electricidad en Home Assistant\" src=\"\/wp-content\/uploads\/2020\/03\/ac8c53569c6b05aeb22e05969de4cd6d.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nAs\u00ed que sobre el par\u00e1metro Stack. En este gr\u00e1fico, la barra de agua fr\u00eda se dibuja sobre la barra de agua caliente. La altura total corresponde al consumo total de agua fr\u00eda y caliente durante el per\u00edodo. <\/p>\n<p>Todos los gr\u00e1ficos mostrados son din\u00e1micos. Se puede pasar el rat\u00f3n sobre un punto de inter\u00e9s y ver los detalles y el valor en un punto espec\u00edfico. <\/p>\n<p>Desafortunadamente, no se pudo evitar un par de cucharadas de alquitr\u00e1n. En el gr\u00e1fico de columnas (a diferencia del gr\u00e1fico de l\u00edneas escalonadas), el medio de la columna no se encuentra a la mitad del d\u00eda, sino a las 00:00. Es decir, la mitad izquierda de la columna se dibuja en el lugar del d\u00eda anterior. As\u00ed que los gr\u00e1ficos del s\u00e1bado y domingo est\u00e1n dibujados un poco m\u00e1s a la izquierda que la zona azulada. A\u00fan no he encontrado la manera de solucionar esto. <\/p>\n<p>Otro problema radica en la imposibilidad de trabajar correctamente con intervalos mensuales. La cuesti\u00f3n es que la duraci\u00f3n de la hora\/d\u00eda\/semana es fija, mientras que la duraci\u00f3n del mes var\u00eda cada vez. InfluxDB solo puede trabajar con intervalos iguales. Por ahora, solo he podido establecer un intervalo fijo de 30 d\u00edas. S\u00ed, el gr\u00e1fico se desviar\u00e1 un poco a lo largo del a\u00f1o y las columnas no corresponder\u00e1n exactamente a los meses. Pero como esta cosa me interesa simplemente como medidor, estoy bien con eso. <\/p>\n<p>Veo al menos dos soluciones:<\/p>\n<ul>\n<li>Ignorar los gr\u00e1ficos mensuales y limitarnos a los semanales. 52 columnas semanales al a\u00f1o se ven bastante bien.<\/li>\n<li>Calcular el consumo mensual como m\u00e9todo n\u00ba 2, usando Grafana solo para gr\u00e1ficos bonitos. Se obtendr\u00e1 una soluci\u00f3n bastante precisa. Incluso se pueden superponer los gr\u00e1ficos del a\u00f1o pasado para comparaci\u00f3n \u2014 Grafana puede hacer eso.<\/li>\n<\/ul>\n<h2>Conclusi\u00f3n<\/h2>\n<p>\nNo s\u00e9 por qu\u00e9, pero me encanta este tipo de gr\u00e1ficos. Muestran que la vida est\u00e1 en constante movimiento y todo cambia. Ayer hab\u00eda mucho, hoy poco, ma\u00f1ana ser\u00e1 algo diferente. Solo queda trabajar con los miembros de la familia sobre el tema del consumo. Pero incluso con los apetitos actuales, simplemente un n\u00famero grande y confuso en la factura ya se transforma en una imagen de consumo bastante clara.<\/p>\n<p>A pesar de tener casi 20 a\u00f1os de carrera como programador, apenas he tenido contacto con bases de datos. Por eso, la instalaci\u00f3n de una base de datos externa me parec\u00eda algo tan abstracto e incomprensible. Todo cambi\u00f3 <noindex><a rel=\"nofollow\" href=\"https:\/\/dummylabs.com\/ru\/post\/2019-01-13-influxdb-part1\">el art\u00edculo mencionado anteriormente<\/a><\/noindex> result\u00f3 ser que conectar la herramienta adecuada se hace en un par de clics, y con una herramienta especializada, la tarea de crear gr\u00e1ficos se vuelve un poco m\u00e1s f\u00e1cil.<\/p>\n<p>En el t\u00edtulo mencion\u00e9 el consumo de electricidad. Lamentablemente, en este momento no puedo proporcionar ning\u00fan gr\u00e1fico. Un contador SDM120 se ha roto, y el otro falla al comunicarse a trav\u00e9s de Modbus. Sin embargo, esto no afecta el tema del art\u00edculo: los gr\u00e1ficos se construir\u00e1n de la misma manera que los de agua.<\/p>\n<p>En este art\u00edculo he presentado los enfoques que he probado yo mismo. Seguramente hay otros m\u00e9todos para organizar la recolecci\u00f3n y visualizaci\u00f3n de datos que desconozco. Cu\u00e9ntame sobre ellos en los comentarios, me interesar\u00e1 mucho. Apreciar\u00e9 las cr\u00edticas constructivas y nuevas ideas. Espero que el material expuesto tambi\u00e9n ayude a alguien m\u00e1s.<br \/>\n<br \/>Fuente: <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.2 - 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\/es\/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.2\" \/>\n\t\t<meta property=\"og:locale\" content=\"es_ES\" \/>\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\/es\/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: Construimos gr\u00e1ficos de consumo de agua y electricidad en Home Assistant | ProHoster","description":"Cada vez.","canonical_url":"https:\/\/prohoster.info\/es\/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":"es_ES","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\/es\/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\/es\/wp-json\/wp\/v2\/posts\/74421","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/comments?post=74421"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/posts\/74421\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/media\/74422"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/media?parent=74421"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/categories?post=74421"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/tags?post=74421"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}