{"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\/fr\/blog\/administrirovanie\/umnyj-dom-stroim-grafiki-potrebleniya-vody-i-elektrichestva-v-home-assistant","title":{"rendered":"Maison intelligente : Construisons des graphiques de consommation d'eau et d'\u00e9lectricit\u00e9 dans Home Assistant","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Maison intelligente : Construisons des graphiques de consommation d&#039;eau et d&#039;\u00e9lectricit\u00e9 dans Home Assistant\" src=\"\/wp-content\/uploads\/2020\/03\/f1133a4c391e901ed64bf0825a774fc6.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nChaque fois que je re\u00e7ois ma facture d'\u00e9lectricit\u00e9 et d'eau, je suis \u00e9tonn\u00e9 : ma famille consomme-t-elle vraiment autant ? Certes, nous avons un chauffage au sol et un chauffe-eau dans la salle de bain, mais ils ne fonctionnent pas en continu. Nous essayons aussi d'\u00e9conomiser l'eau (m\u00eame si nous aimons nous d\u00e9tendre dans la baignoire). Il y a d\u00e9j\u00e0 plusieurs ann\u00e9es, j'ai <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/411259\/\">install\u00e9 des compteurs d'eau<\/a><\/noindex> et <noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/watch?v=XKvunh29sZo&amp;list=PLkt_cQxT0oUmfdxhbmTjytjaJjZjSVUOu\">d'\u00e9lectricit\u00e9<\/a><\/noindex> \u00e0 la maison intelligente, mais je me suis arr\u00eat\u00e9 l\u00e0. Ce n'est que r\u00e9cemment que j'ai vraiment commenc\u00e9 \u00e0 analyser mes consommations, et c'est de cela que parle cet article.<\/p>\n<p>R\u00e9cemment, je suis pass\u00e9 \u00e0 Home Assistant comme syst\u00e8me de maison intelligente. L'une des raisons \u00e9tait justement la possibilit\u00e9 de collecter une grande quantit\u00e9 de donn\u00e9es et de construire facilement divers types de graphiques.<\/p>\n<p>Les informations d\u00e9crites dans cet article ne sont pas nouvelles ; toutes ces choses ont d\u00e9j\u00e0 \u00e9t\u00e9 abord\u00e9es sous diff\u00e9rentes formes sur Internet. Mais chaque article se concentre g\u00e9n\u00e9ralement sur une seule approche ou un seul aspect. J'ai d\u00fb comparer toutes ces approches et choisir celle qui me convenait le mieux. Cet article n'apporte pas d'informations exhaustives sur la collecte de donn\u00e9es, mais constitue plut\u00f4t un r\u00e9sum\u00e9 de ma propre exp\u00e9rience. Je suis donc ouvert \u00e0 toute critique constructive et \u00e0 des suggestions d'am\u00e9lioration.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>D\u00e9finition du probl\u00e8me<\/h2>\n<p>\nAinsi, l'objectif de l'exercice d'aujourd'hui est d'obtenir de jolis graphiques de consommation d'eau et d'\u00e9lectricit\u00e9 :<\/p>\n<ul>\n<li>Horaire sur 2 jours<\/li>\n<li>Journalier sur 2 semaines<\/li>\n<li>(optionnel) Hebdomadaire et Mensuel<\/li>\n<\/ul>\n<p>\nNous rencontrons quelques difficult\u00e9s ici :<\/p>\n<ul>\n<li>Les composants graphiques standards sont g\u00e9n\u00e9ralement assez limit\u00e9s. Dans le meilleur des cas, on peut cr\u00e9er un graphique lin\u00e9aire \u00e0 partir de points.\n<p>Si l'on cherche bien, on peut trouver des composants tiers qui \u00e9largissent les capacit\u00e9s des graphiques standards. Pour Home Assistant, il y a un composant qui est \u00e0 la fois joli et fonctionnel : <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/kalkih\/mini-graph-card\">mini-graph-card<\/a><\/noindex>, mais il est aussi un peu limit\u00e9 :<\/p>\n<ul>\n<li>Il est difficile de d\u00e9finir les param\u00e8tres d'un histogramme sur de grands intervalles (largeur de la barre d\u00e9finie en fractions d'heure, donc les intervalles de plus d'une heure doivent \u00eatre sp\u00e9cifi\u00e9s par des nombres d\u00e9cimaux)<\/li>\n<li>On ne peut pas ajouter diff\u00e9rentes entit\u00e9s sur un m\u00eame graphique (par exemple, combiner la temp\u00e9rature et l'humidit\u00e9, ou m\u00e9langer un histogramme avec une ligne)<\/li>\n<\/ul>\n<\/li>\n<li>Non seulement Home Assistant utilise par d\u00e9faut une base de donn\u00e9es SQLite assez rudimentaire (et moi, avec mes comp\u00e9tences limit\u00e9es, je n'ai pas r\u00e9ussi \u00e0 installer MySQL ou Postgres), mais les donn\u00e9es sont \u00e9galement stock\u00e9es de mani\u00e8re peu optimale. Par exemple, \u00e0 chaque changement de n'importe quel param\u00e8tre num\u00e9rique, m\u00eame le plus insignifiant, un \u00e9norme JSON d'environ un kilooctet est enregistr\u00e9 dans la base.\n<pre><code class=\"json\">{\"entity_id\": \"sensor.water_cold_hourly\", \"old_state\": {\"entity_id\": \"sensor.water_cold_hourly\", \"state\": \"3\", \"attributes\": {\"source\": \"sensor.water_meter_cold\", \"status\": \"collecting\", \"last_period\": \"29\", \"last_reset\": \"2020-02-23T21:00:00.022246+02:00\", \"meter_period\": \"hourly\", \"unit_of_measurement\": \"l\", \"friendly_name\": \"water_cold_hourly\", \"icon\": \"mdi:counter\"}, \"last_changed\": \"2020-02-23T19:05:06.897604+00:00\", \"last_updated\": \"2020-02-23T19:05:06.897604+00:00\", \"context\": {\"id\": \"aafc8ca305ba4e49ad4c97f0eddd8893\", \"parent_id\": null, \"user_id\": null}}, \"new_state\": {\"entity_id\": \"sensor.water_cold_hourly\", \"state\": \"4\", \"attributes\": {\"source\": \"sensor.water_meter_cold\", \"status\": \"collecting\", \"last_period\": \"29\", \"last_reset\": \"2020-02-23T21:00:00.022246+02:00\", \"meter_period\": \"hourly\", \"unit_of_measurement\": \"l\", \"friendly_name\": \"water_cold_hourly\", \"icon\": \"mdi:counter\"}, \"last_changed\": \"2020-02-23T19:11:11.251545+00:00\", \"last_updated\": \"2020-02-23T19:11:11.251545+00:00\", \"context\": {\"id\": \"0de64b8af6f14bb9a419dcf3b200ef56\", \"parent_id\": null, \"user_id\": null}}}<\/code><\/pre>\n<p>\nJ'ai un nombre assez \u00e9lev\u00e9 de capteurs (des capteurs de temp\u00e9rature dans chaque pi\u00e8ce, des compteurs d'eau et d'\u00e9lectricit\u00e9), et certains g\u00e9n\u00e8rent \u00e9galement une quantit\u00e9 importante de donn\u00e9es. Par exemple, le compteur \u00e9lectrique SDM220 g\u00e9n\u00e8re environ une dizaine de valeurs toutes les 10 \u00e0 15 secondes, et j'aimerais installer environ 8 de ces compteurs. De plus, il y a toute une s\u00e9rie de param\u00e8tres calcul\u00e9s sur la base d'autres capteurs. Ainsi, toutes ces valeurs peuvent facilement gonfler la base de donn\u00e9es de 100 \u00e0 200 Mo par jour. Apr\u00e8s une semaine, le syst\u00e8me aura du mal \u00e0 fonctionner, et apr\u00e8s un mois, la cl\u00e9 USB risque de rendre l'\u00e2me (dans le cas d'une installation typique de Home Assistant sur un Raspberry Pi), et il est hors de question de stocker les donn\u00e9es pendant un an.<\/li>\n<li>Si vous avez de la chance, votre compteur est capable de calculer la consommation par lui-m\u00eame. Vous pouvez \u00e0 tout moment interroger le compteur pour conna\u00eetre la valeur accumul\u00e9e de la consommation. En g\u00e9n\u00e9ral, tous les compteurs \u00e9lectriques disposant d'une interface num\u00e9rique (RS232\/RS485\/Modbus\/Zigbee) offrent cette possibilit\u00e9.\n<p>Il est pire si l'appareil peut simplement mesurer un certain param\u00e8tre instantan\u00e9 (par exemple, la puissance instantan\u00e9e ou le courant), ou g\u00e9n\u00e9rer des impulsions toutes les X watts-heure ou litres. Dans ce cas, il faut r\u00e9fl\u00e9chir \u00e0 comment et avec quoi l'int\u00e9grer et o\u00f9 stocker la valeur. Il existe un risque de manquer un rapport pour une raison quelconque, et la pr\u00e9cision du syst\u00e8me en g\u00e9n\u00e9ral soul\u00e8ve des questions. Bien s\u00fbr, on peut tout confier \u00e0 un syst\u00e8me de maison intelligente comme Home Assistant, mais le point concernant le nombre d'enregistrements dans la base n'est pas \u00e0 ignorer, et il n'est pas possible de sonder les capteurs plus d'une fois par seconde (restriction de l'architecture de Home Assistant).<\/li>\n<\/ul>\n<p><\/p>\n<h2>Approche 1<\/h2>\n<p>\nCommen\u00e7ons par voir ce que Home Assistant propose par d\u00e9faut. La mesure de la consommation sur une p\u00e9riode est une fonctionnalit\u00e9 tr\u00e8s demand\u00e9e. \u00c9videmment, cela a \u00e9t\u00e9 r\u00e9alis\u00e9 depuis longtemps sous la forme d'un composant sp\u00e9cialis\u00e9 : utility_meter. <\/p>\n<p>Le principe du composant est qu'il cr\u00e9e en interne une variable current_accumulated_value, et la r\u00e9initialise \u00e0 l'expiration de la p\u00e9riode d\u00e9finie (heure\/semaine\/mois). Le composant surveille lui-m\u00eame la variable d'entr\u00e9e (la valeur d'un capteur quelconque), s'abonne aux changements de valeur - vous obtenez simplement le r\u00e9sultat final. C'est d\u00e9crit en quelques lignes dans le fichier de configuration.<\/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>\nIci, sensor.water_meter_cold est la valeur actuelle du compteur en litres, que je re\u00e7ois <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/411259\/\">directement de l'appareil<\/a><\/noindex> via MQTT. La structure cr\u00e9e 2 nouveaux capteurs water_cold_hour_um et water_cold_day_um, qui accumulent les lectures horaires et journali\u00e8res, les r\u00e9initialisant \u00e0 l'expiration de la p\u00e9riode. Voici le graphique de l'accumulateur horaire pour une demi-journ\u00e9e.<\/p>\n<p><img decoding=\"async\" alt=\"Maison intelligente : Construisons des graphiques de consommation d&#039;eau et d&#039;\u00e9lectricit\u00e9 dans Home Assistant\" src=\"\/wp-content\/uploads\/2020\/03\/d3c3ea29c10b17142e51ebe756ab7123.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nLe code des graphiques horaire et journalier pour l'interface Lovelace ressemble \u00e0 ceci :<\/p>\n<pre><code class=\"python\">      - type: history-graph\n        title: 'Consommation d'eau horaire utilisant des variables'\n        hours_to_show: 48\n        entities:\n          - sensor.water_hour\n\n      - type: history-graph\n        title: 'Consommation d'eau quotidienne utilisant des variables'\n        hours_to_show: 360\n        entities:\n          - sensor.water_day\n<\/code><\/pre>\n<p>\nEn r\u00e9alit\u00e9, c'est dans cet algorithme que r\u00e9side le probl\u00e8me de cette approche. Comme je l'ai d\u00e9j\u00e0 mentionn\u00e9, pour chaque valeur d'entr\u00e9e (la lecture actuelle du compteur pour chaque litre suivant), 1 Ko d'enregistrement est g\u00e9n\u00e9r\u00e9 dans la base. Chaque compteur utilitaire g\u00e9n\u00e8re \u00e9galement une nouvelle valeur qui s'ajoute \u00e0 la base. Si je veux collecter des relev\u00e9s horaires\/journaliers\/hebdomadaires\/mensuels, et ce pour plusieurs colonnes d'eau, tout en ajoutant une pile de compteurs \u00e9lectriques \u2014 cela va g\u00e9n\u00e9rer une quantit\u00e9 \u00e9norme de donn\u00e9es. En r\u00e9alit\u00e9, les donn\u00e9es ne sont pas tr\u00e8s nombreuses, mais puisque l'assistant domestique \u00e9crit une quantit\u00e9 d'informations superflues dans la base, la taille de celle-ci va cro\u00eetre de mani\u00e8re exponentielle. J'ose m\u00eame pas estimer la taille de la base pour des graphiques hebdomadaires et mensuels.<\/p>\n<p>De plus, le compteur utilitaire ne r\u00e9sout pas le probl\u00e8me pos\u00e9. Le graphique des valeurs fournies par le compteur utilitaire est une fonction constamment croissante qui est r\u00e9initialis\u00e9e \u00e0 0 chaque heure. Nous avons besoin d'un graphique de consommation compr\u00e9hensible pour l'utilisateur, montrant combien de litres ont \u00e9t\u00e9 consomm\u00e9s sur une p\u00e9riode donn\u00e9e. Le composant standard history-graph n'est pas capable de cela, mais un composant externe comme mini-graph-card pourrait nous aider.<\/p>\n<p>Voici le code de la carte pour 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: \"Consommation d'eau horaire agr\u00e9g\u00e9e par compteur\"\n        points_per_hour: 1\n        show:\n          graph: bar\n        type: 'custom:mini-graph-card'<\/code><\/pre>\n<p>\nEn plus des param\u00e8tres standard comme le nom du capteur, le type de graphique, la couleur (je n'ai pas aim\u00e9 l'orange standard), il est important de noter 3 r\u00e9glages :<\/p>\n<ul>\n<li>group_by:hour \u2014 le graphique sera g\u00e9n\u00e9r\u00e9 en alignant les barres au d\u00e9but de l'heure<\/li>\n<li>points_per_hour: 1 \u2014 une barre pour chaque heure<\/li>\n<li>Et le plus important, aggregate_func: max \u2014 prendre la valeur maximale dans chaque heure. C'est ce param\u00e8tre qui transforme le graphique en dents de scie en barres.<\/li>\n<\/ul>\n<p>\n<img decoding=\"async\" alt=\"Maison intelligente : Construisons des graphiques de consommation d&#039;eau et d&#039;\u00e9lectricit\u00e9 dans Home Assistant\" src=\"\/wp-content\/uploads\/2020\/03\/5bd866c39b23299e5f15dcf4a9bce38f.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nNe vous inqui\u00e9tez pas pour les barres sur la gauche \u2014 c'est le comportement standard du composant s'il n'y a pas de donn\u00e9es. Et il n'y avait pas de donn\u00e9es \u2014 je n'ai commenc\u00e9 \u00e0 collecter les donn\u00e9es via le compteur utilitaire que quelques heures avant cet article (je vous parlerai de mon approche actuelle un peu plus bas). <\/p>\n<p>Sur cette image, je voulais montrer que parfois l'affichage des donn\u00e9es fonctionne, et que les barres refl\u00e8tent r\u00e9ellement les bonnes valeurs. Cependant, ce n'est pas le cas pour tout. La barre sur la p\u00e9riode de 11h \u00e0 12h affiche inexplicablement 19 litres, alors que sur le graphique dentel\u00e9 juste au-dessus pour la m\u00eame p\u00e9riode provenant du m\u00eame capteur, nous voyons une consommation de 62 litres. Soit c'est un bug, soit la manipulation est d\u00e9fectueuse. Je ne comprends pas encore pourquoi les donn\u00e9es de droite ont \u00e9t\u00e9 perdues \u2014 la consommation y \u00e9tait normale, comme le montre \u00e9galement le graphique dentel\u00e9.<\/p>\n<p>Globalement, je n'ai pas r\u00e9ussi \u00e0 obtenir la cr\u00e9dibilit\u00e9 de cette approche \u2014 le graphique montre presque toujours des absurdit\u00e9s.<\/p>\n<p>Code similaire pour le capteur quotidien. <\/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: \"Consommation d'eau quotidienne agr\u00e9g\u00e9e par compteur\"\n        points_per_hour: 0.0416666666\n        show:\n          graph: bar\n        type: 'custom:mini-graph-card'\n<\/code><\/pre>\n<p>\nNotez que le param\u00e8tre group_by est d\u00e9fini sur interval, et c'est le param\u00e8tre points_per_hour qui en d\u00e9pend. Et c'est l\u00e0 qu'est un autre probl\u00e8me de ce composant \u2014 points_per_hour fonctionne bien sur les graphiques d'une heure ou moins, mais est horrible sur des intervalles plus longs. Pour obtenir une barre pour une journ\u00e9e, il a fallu entrer la valeur 1\/24=0.04166666. Je ne parle m\u00eame pas des graphiques hebdomadaires et mensuels.<\/p>\n<h2>Approche 2<\/h2>\n<p>\nAlors que je commen\u00e7ais \u00e0 comprendre l'assistant domestique, je suis tomb\u00e9 sur cette vid\u00e9o :<\/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=\"Lire la vid\u00e9o\" loading=\"lazy\" width=\"480\" height=\"360\" style=\"width:100%;height:auto;\">\r\n        <div class=\"play-button\"><\/div>\r\n    <\/div><\/center><br \/>\nUn camarade collecte des donn\u00e9es de consommation de plusieurs types de prises Xiaomi. Sa t\u00e2che est un peu plus simple \u2014 il s'agit simplement d'afficher la valeur de consommation pour aujourd'hui, hier et pour le mois. Aucun graphique n'est requis. <\/p>\n<p>Mettons de c\u00f4t\u00e9 les r\u00e9flexions sur l'int\u00e9gration manuelle des valeurs instantan\u00e9es de puissance \u2014 j'ai d\u00e9j\u00e0 \u00e9crit ci-dessus sur la 'pr\u00e9cision' de cette approche. Il n'est pas clair pourquoi il n'a pas utilis\u00e9 les valeurs accumul\u00e9es de consommation, qui sont d\u00e9j\u00e0 collect\u00e9es par la m\u00eame prise. \u00c0 mon avis, l'int\u00e9gration \u00e0 l'int\u00e9rieur du mat\u00e9riel fonctionnera mieux. <\/p>\n<p>Nous allons prendre de la vid\u00e9o l'id\u00e9e du calcul manuel de la consommation sur une p\u00e9riode. L'homme ne compte que les valeurs d'aujourd'hui et d'hier, mais nous irons plus loin et essayerons de dessiner un graphique. L'essence de la m\u00e9thode propos\u00e9e dans mon cas est la suivante.<\/p>\n<p>Nous allons cr\u00e9er une variable valeur_au_d\u00e9but_de_l_heure, dans laquelle nous enregistrerons les relev\u00e9s actuels du compteur.<br \/>\n\u00c0 la fin de chaque heure (ou au d\u00e9but de la suivante), nous allons calculer la diff\u00e9rence entre la lecture actuelle et celle m\u00e9moris\u00e9e au d\u00e9but de l'heure. Cette diff\u00e9rence correspondra \u00e0 la consommation pour l'heure en cours \u2014 nous allons enregistrer cette valeur dans le capteur et dans le futur, nous allons construire un graphique bas\u00e9 sur cette valeur. <br \/>\nIl est \u00e9galement n\u00e9cessaire de \"r\u00e9initialiser\" la variable valeur_au_d\u00e9but_de_l'heure en y \u00e9crivant la valeur actuelle du compteur.<\/p>\n<p>Tout cela peut \u00eatre r\u00e9alis\u00e9 \u00e0 travers les\u2026 les moyens du home assistant lui-m\u00eame. <\/p>\n<p>Nous devrons \u00e9crire un peu plus de code que dans l'approche pr\u00e9c\u00e9dente. Pour commencer, cr\u00e9ons ces \"variables\". Par d\u00e9faut, nous n'avons pas d'entit\u00e9 \"variable\", mais nous pouvons utiliser les services du broker mqtt. Nous allons y envoyer des valeurs avec le drapeau retain=true \u2014 cela conservera la valeur \u00e0 l'int\u00e9rieur du broker, et il sera possible de l'extraire \u00e0 tout moment, m\u00eame apr\u00e8s un red\u00e9marrage de home assistant. J'ai imm\u00e9diatement cr\u00e9\u00e9 des compteurs horaires et journaliers.<\/p>\n<pre><code class=\"python\">- platform: mqtt\n  state_topic: \"test\/water\/hour\"\n  name: water_hour\n  unit_of_measurement: l\n\n- platform: mqtt\n  state_topic: \"test\/water\/hour_begin\"\n  name: water_hour_begin\n  unit_of_measurement: l\n\n- platform: mqtt\n  state_topic: \"test\/water\/day\"\n  name: water_day\n  unit_of_measurement: l\n\n- platform: mqtt\n  state_topic: \"test\/water\/day_begin\"\n  name: water_day_begin\n  unit_of_measurement: l<\/code><\/pre>\n<p>\nToute la magie se produit dans l'automatisation, qui s'active chaque heure et chaque nuit respectivement.<\/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>\nLes deux automatisations effectuent 2 actions :<\/p>\n<ul>\n<li>Elles calculent la valeur pour l'intervalle en prenant la diff\u00e9rence entre la valeur de d\u00e9part et celle de fin.<\/li>\n<li>Elles mettent \u00e0 jour la valeur de base pour le prochain intervalle.<\/li>\n<\/ul>\n<p>\nLa construction de graphiques se fait ici avec un history-graph ordinaire :<\/p>\n<pre><code class=\"python\">      - type: history-graph\n        title: 'Consommation d'eau horaire utilisant des variables'\n        hours_to_show: 48\n        entities:\n          - sensor.water_hour\n\n      - type: history-graph\n        title: 'Consommation d'eau quotidienne utilisant des variables'\n        hours_to_show: 360\n        entities:\n          - sensor.water_day<\/code><\/pre>\n<p>\nCela ressemble \u00e0 ceci :<\/p>\n<p><img decoding=\"async\" alt=\"Maison intelligente : Construisons des graphiques de consommation d&#039;eau et d&#039;\u00e9lectricit\u00e9 dans Home Assistant\" src=\"\/wp-content\/uploads\/2020\/03\/ebde2fc5f0a72d7d6ba565c3686dc9c6.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nEn principe, c'est d\u00e9j\u00e0 ce dont nous avons besoin. L'avantage de cette m\u00e9thode est que les donn\u00e9es sont g\u00e9n\u00e9r\u00e9es une seule fois par intervalle. C'est-\u00e0-dire au maximum 24 enregistrements par jour pour le graphique horaire. <\/p>\n<p>Malheureusement, cela ne r\u00e9sout toujours pas le probl\u00e8me g\u00e9n\u00e9ral de la base de donn\u00e9es croissante. Si je veux un graphique de la consommation mensuelle, je vais devoir stocker des donn\u00e9es pendant au moins un an. \u00c9tant donn\u00e9 que Home Assistant ne propose qu'un seul param\u00e8tre de dur\u00e9e de conservation pour toute la base, cela signifie que TOUTES les donn\u00e9es du syst\u00e8me devront \u00eatre conserv\u00e9es pendant une ann\u00e9e enti\u00e8re. Par exemple, au cours de l'ann\u00e9e, je consomme 200 m\u00e8tres cubes d'eau, ce qui \u00e9quivaut \u00e0 200000 enregistrements dans la base. Et si l'on consid\u00e8re d'autres capteurs, ce chiffre devient vraiment ind\u00e9cent.<\/p>\n<h2>Approche 3<\/h2>\n<p>\nHeureusement, des personnes intelligentes ont d\u00e9j\u00e0 r\u00e9solu ce probl\u00e8me en \u00e9crivant la base de donn\u00e9es InfluxDB. Cette base est sp\u00e9cialement optimis\u00e9e pour le stockage de donn\u00e9es temporelles et convient parfaitement \u00e0 la conservation des valeurs de diff\u00e9rents capteurs. Le syst\u00e8me propose \u00e9galement un langage de requ\u00eate similaire \u00e0 SQL, qui permet d'extraire des valeurs de la base, puis de les agr\u00e9ger de diff\u00e9rentes mani\u00e8res. Enfin, on peut conserver diff\u00e9rentes donn\u00e9es pendant des p\u00e9riodes diff\u00e9rentes. Par exemple, des mesures qui changent fr\u00e9quemment, comme la temp\u00e9rature ou l'humidit\u00e9, peuvent \u00eatre stock\u00e9es pendant seulement quelques semaines, alors que les relev\u00e9s quotidiens de consommation d'eau peuvent \u00eatre conserv\u00e9s pendant un an entier.<\/p>\n<p>En plus d'InfluxDB, des personnes intelligentes ont \u00e9galement invent\u00e9 Grafana \u2014 un syst\u00e8me de cr\u00e9ation de graphiques \u00e0 partir des donn\u00e9es d'InfluxDB. Grafana peut cr\u00e9er diff\u00e9rents types de graphiques, les personnaliser en d\u00e9tail, et, surtout, ces graphiques peuvent \u00eatre 'int\u00e9gr\u00e9s' dans l'interface Lovelace de Home Assistant.<\/p>\n<p>S'inspirer de <noindex><a rel=\"nofollow\" href=\"https:\/\/dummylabs.com\/ru\/post\/2019-01-13-influxdb-part1\/\">ici <\/a><\/noindex> et <noindex><a rel=\"nofollow\" href=\"https:\/\/dummylabs.com\/ru\/post\/2019-05-28-influxdb-part2\/\">ici<\/a><\/noindex>. Les articles d\u00e9crivent en d\u00e9tail le processus d'installation et de connexion d'InfluxDB et de Grafana \u00e0 Home Assistant. Quant \u00e0 moi, je vais me concentrer sur la r\u00e9solution de mon probl\u00e8me sp\u00e9cifique.<\/p>\n<p>Alors, tout d'abord, nous allons commencer par enregistrer la valeur du compteur dans InfluxDB. Voici un extrait de la configuration de Home Assistant (dans cet exemple, je vais m'amuser avec de l'eau froide et chaude) :<\/p>\n<pre><code class=\"python\">influxdb:\n  h\u00f4te: 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>\nNous allons d\u00e9sactiver la sauvegarde de ces m\u00eames donn\u00e9es dans la base interne de Home Assistant, afin de ne pas l'encombrer inutilement :<\/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>\nPassons maintenant \u00e0 la console InfluxDB et configurons notre base de donn\u00e9es. En particulier, il est n\u00e9cessaire de d\u00e9finir combien de temps certaines donn\u00e9es seront conserv\u00e9es. Cela est r\u00e9gul\u00e9 par la politique de conservation, qui est similaire \u00e0 des bases de donn\u00e9es \u00e0 l'int\u00e9rieur de la base de donn\u00e9es principale, chaque base interne ayant ses propres param\u00e8tres. Par d\u00e9faut, toutes les donn\u00e9es sont stock\u00e9es dans la politique de conservation appel\u00e9e autogen, ces donn\u00e9es seront conserv\u00e9es pendant une semaine. Je voudrais que les donn\u00e9es horaires soient conserv\u00e9es un mois, hebdomadaires - un an, et que les mensuelles ne soient jamais supprim\u00e9es. Cr\u00e9ons les politiques de conservation correspondantes.<\/p>\n<pre><code class=\"sql\">CR\u00c9ER UNE POLITIQUE DE R\u00c9TENTION \"mois\" SUR \"homeassistant\" DUR\u00c9E 30j R\u00c9PLICATION 1\nCR\u00c9ER UNE POLITIQUE DE R\u00c9TENTION \"ann\u00e9e\" SUR \"homeassistant\" DUR\u00c9E 52s R\u00c9PLICATION 1\nCR\u00c9ER UNE POLITIQUE DE R\u00c9TENTION \"infinie\" SUR \"homeassistant\" DUR\u00c9E INF R\u00c9PLICATION 1<\/code><\/pre>\n<p>\nMaintenant, le principal tour de magie - l'agr\u00e9gation des donn\u00e9es \u00e0 l'aide d'une requ\u00eate continue. C'est un m\u00e9canisme qui ex\u00e9cute automatiquement une requ\u00eate \u00e0 intervalles r\u00e9guliers, agr\u00e8ge les donn\u00e9es selon cette requ\u00eate et stocke le r\u00e9sultat dans une nouvelle valeur. D\u00e9montrons-le avec un exemple (j'\u00e9cris en colonne pour la lisibilit\u00e9, mais en r\u00e9alit\u00e9, j'ai d\u00fb entrer cette commande sur une seule ligne).<\/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>\nCette commande :<\/p>\n<ul>\n<li>Cr\u00e9e une requ\u00eate continue nomm\u00e9e cq_water_cold_hourly dans la base homeassistant.<\/li>\n<li>La requ\u00eate sera ex\u00e9cut\u00e9e chaque heure (time(1h)).<\/li>\n<li>La requ\u00eate r\u00e9cup\u00e9rera toutes les donn\u00e9es de la mesure homeassistant.autogen.l (litres), y compris les relev\u00e9s d'eau froide et chaude.<\/li>\n<li>Les donn\u00e9es agr\u00e9g\u00e9es seront regroup\u00e9es par entity_id, ce qui nous donnera des valeurs distinctes pour l'eau froide et l'eau chaude.<\/li>\n<li>\u00c9tant donn\u00e9 que le compteur de litres est une s\u00e9quence monotone croissante, dans le cadre de chaque heure, il faudra prendre la valeur maximale, donc l'agr\u00e9gation se fera avec la fonction max(value). <\/li>\n<li>La nouvelle valeur sera enregistr\u00e9e dans homeassistant.month.water_meter_hour, o\u00f9 month est le nom de la politique de conservation avec une p\u00e9riode de stockage d'un mois. Les donn\u00e9es d'eau froide et chaude seront r\u00e9parties dans des enregistrements distincts avec les entity_id correspondants et les valeurs dans le champ value.<\/li>\n<\/ul>\n<p>\nLa nuit ou lorsque personne n'est \u00e0 la maison, il n'y a pas de consommation d'eau, et donc pas de nouvelles entr\u00e9es dans homeassistant.autogen.l non plus. Pour \u00e9viter des valeurs manquantes dans les requ\u00eates normales, vous pouvez utiliser fill(previous). Cela forcera InfluxDB \u00e0 utiliser la valeur de l'heure pr\u00e9c\u00e9dente. <\/p>\n<p>Malheureusement, la requ\u00eate continue a une particularit\u00e9 : le truc fill(previous) ne fonctionne pas et les enregistrements ne sont tout simplement pas cr\u00e9\u00e9s. Il s'agit d'un probl\u00e8me apparemment insurmontable, qui <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/influxdata\/influxdb\/issues\/3220\">est discut\u00e9 depuis plusieurs ann\u00e9es d\u00e9j\u00e0.<\/a><\/noindex>. Nous aborderons ce probl\u00e8me plus tard, et pour le moment, la fonction fill(previous) dans la requ\u00eate continue pourra rester \u2014 elle ne g\u00eane pas. <\/p>\n<p>V\u00e9rifions ce que nous avons obtenu (bien s\u00fbr, il faut attendre quelques heures) :<\/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>\nNotez que les valeurs dans la base sont enregistr\u00e9es en UTC, donc dans cette liste, elles diff\u00e8rent de 3 heures \u2014 les valeurs \u00e0 7 heures du matin dans le rendu InfluxDB correspondent aux valeurs \u00e0 10 heures du matin sur les graphiques ci-dessus. Notez \u00e9galement qu'il n'y a tout simplement pas d'enregistrements entre 2 et 5 heures \u2014 c'est cette m\u00eame particularit\u00e9 de la requ\u00eate continue.<\/p>\n<p>Comme vous pouvez le voir, la valeur agr\u00e9g\u00e9e est \u00e9galement une s\u00e9quence croissante monotone, les enregistrements \u00e9tant seulement moins fr\u00e9quents \u2014 une fois par heure. Mais ce n'est pas un probl\u00e8me \u2014 nous pouvons \u00e9crire une autre requ\u00eate qui extraira les bonnes donn\u00e9es pour le graphique.<\/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>\nJe vais clarifier :<\/p>\n<ul>\n<li>Nous extrairons des donn\u00e9es de la base homeassistant.month.water_meter_hour pour entity_id='water_meter_cold' des derni\u00e8res 24 heures (time &gt;= now() -24h). <\/li>\n<li>Comme je l'ai d\u00e9j\u00e0 mentionn\u00e9, il peut manquer certains enregistrements dans la s\u00e9quence homeassistant.month.water_meter_hour. Nous allons r\u00e9g\u00e9n\u00e9rer ces donn\u00e9es en lan\u00e7ant une requ\u00eate avec GROUP BY time(1h). Cette fois, fill(previous) fonctionnera comme il se doit, en g\u00e9n\u00e9rant les donn\u00e9es manquantes (la fonction prendra la valeur pr\u00e9c\u00e9dente).<\/li>\n<li>L'\u00e9l\u00e9ment le plus important dans cette requ\u00eate est la fonction difference, qui calculera la diff\u00e9rence entre les horodatages horaires. Elle ne fonctionne pas seule et n\u00e9cessite une fonction d'agr\u00e9gation. Cela sera max() utilis\u00e9e auparavant.<\/li>\n<\/ul>\n<p>\nLe r\u00e9sultat d'ex\u00e9cution est le suivant :<\/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 \u00e0 5 heures du matin (UTC), il n'y a eu aucune consommation. Cependant, la requ\u00eate renverra la m\u00eame valeur de consommation gr\u00e2ce \u00e0 fill(previous), et la fonction difference soustraira cette valeur d'elle-m\u00eame, ce qui nous donnera 0, ce qui est justement ce qui est requis.<\/p>\n<p>Il ne reste plus qu'\u00e0 construire le graphique. Pour cela, ouvrons Grafana, prenons un tableau de bord existant (ou cr\u00e9ons-en un nouveau), puis cr\u00e9ons un nouveau panneau. Les param\u00e8tres des graphiques seront les suivants.<\/p>\n<p><img decoding=\"async\" alt=\"Maison intelligente : Construisons des graphiques de consommation d&#039;eau et d&#039;\u00e9lectricit\u00e9 dans Home Assistant\" src=\"\/wp-content\/uploads\/2020\/03\/c6f551590cd141438b644b24aa4ddebf.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nJe vais afficher les donn\u00e9es sur l'eau froide et chaude sur un seul graphique. La requ\u00eate est exactement celle que j'ai d\u00e9crite ci-dessus. <\/p>\n<p>Les param\u00e8tres d'affichage sont d\u00e9finis comme suit. Pour moi, ce sera un graphique \u00e0 lignes (lines), qui sera en escalier (stairs). Je vais expliquer le param\u00e8tre Stack un peu plus bas. Il y a encore quelques param\u00e8tres d'affichage en dessous, mais ils ne sont pas aussi int\u00e9ressants.<\/p>\n<p><img decoding=\"async\" alt=\"Maison intelligente : Construisons des graphiques de consommation d&#039;eau et d&#039;\u00e9lectricit\u00e9 dans Home Assistant\" src=\"\/wp-content\/uploads\/2020\/03\/cb47fc8570b7fd1305ce3451e0518f11.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nPour ajouter le graphique obtenu \u00e0 l'assistant maison, il faut :<\/p>\n<ul>\n<li>sortir du mode d'\u00e9dition du graphique. \u00c9trangement, les param\u00e8tres corrects de partage des graphiques ne sont propos\u00e9s que depuis la page du tableau de bord.<\/li>\n<li>Cliquer sur le triangle \u00e0 c\u00f4t\u00e9 du nom du graphique, puis dans le menu, choisir partager.<\/li>\n<li>Dans la fen\u00eatre qui s'ouvre, aller \u00e0 l'onglet embarquer.<\/li>\n<li>D\u00e9s\u00e9lectionner la case current time range \u2014 la plage horaire sera d\u00e9finie via l'URL. <\/li>\n<li>Choisir le th\u00e8me n\u00e9cessaire. Dans mon cas, c'est clair.<\/li>\n<li>Copier l'URL obtenue dans la carte de param\u00e8tres 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>\nNotez que la plage horaire (les 2 derniers jours) est d\u00e9finie ici, et non dans les param\u00e8tres du tableau de bord. <\/p>\n<p>Le graphique ressemble \u00e0 \u00e7a. Je n'ai pas utilis\u00e9 d'eau chaude au cours des 2 derniers jours, donc seul le graphique de l'eau froide est affich\u00e9.<\/p>\n<p><img decoding=\"async\" alt=\"Maison intelligente : Construisons des graphiques de consommation d&#039;eau et d&#039;\u00e9lectricit\u00e9 dans Home Assistant\" src=\"\/wp-content\/uploads\/2020\/03\/d18c82712d3b829a97ada8c8e2adce24.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nJe n'ai pas encore d\u00e9cid\u00e9 quel graphique je pr\u00e9f\u00e8re, celui en escalier ou les vrais barres. Par cons\u00e9quent, je vais juste donner un exemple d'un graphique de consommation quotidienne, mais cette fois avec des barres. Les requ\u00eates sont construites de mani\u00e8re similaire \u00e0 celles d\u00e9crites ci-dessus. Les param\u00e8tres d'affichage sont les suivants :<\/p>\n<p><img decoding=\"async\" alt=\"Maison intelligente : Construisons des graphiques de consommation d&#039;eau et d&#039;\u00e9lectricit\u00e9 dans Home Assistant\" src=\"\/wp-content\/uploads\/2020\/03\/557297e666f9cd73c3d2aa2fd80c0a2d.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nCe graphique ressemble \u00e0 \u00e7a :<\/p>\n<p><img decoding=\"async\" alt=\"Maison intelligente : Construisons des graphiques de consommation d&#039;eau et d&#039;\u00e9lectricit\u00e9 dans Home Assistant\" src=\"\/wp-content\/uploads\/2020\/03\/ac8c53569c6b05aeb22e05969de4cd6d.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n\u00c0 propos du param\u00e8tre Stack. Dans ce graphique, la barre d'eau froide est dessin\u00e9e au-dessus de celle d'eau chaude. La hauteur totale correspond \u00e0 la consommation totale d'eau froide et chaude pour la p\u00e9riode. <\/p>\n<p>Tous les graphiques affich\u00e9s sont dynamiques. Vous pouvez passer la souris sur un point d'int\u00e9r\u00eat et voir les d\u00e9tails et la valeur \u00e0 un point pr\u00e9cis. <\/p>\n<p>Malheureusement, il y a eu quelques points n\u00e9gatifs. Dans le graphique \u00e0 barres (contrairement au graphique \u00e0 lignes en escalier), le milieu de la barre ne se situe pas au milieu de la journ\u00e9e, mais \u00e0 00h00. Autrement dit, la moiti\u00e9 gauche de la barre est dessin\u00e9e \u00e0 la place du jour pr\u00e9c\u00e9dent. Les graphiques pour samedi et dimanche sont donc l\u00e9g\u00e8rement d\u00e9cal\u00e9s vers la gauche par rapport \u00e0 la zone bleut\u00e9e. Je n'ai pas encore trouv\u00e9 comment y rem\u00e9dier. <\/p>\n<p>Un autre probl\u00e8me r\u00e9side dans l'impossibilit\u00e9 de travailler correctement avec des intervalles mensuels. En fait, la dur\u00e9e de l'heure \/ du jour \/ de la semaine est fixe, tandis que la dur\u00e9e du mois varie \u00e0 chaque fois. InfluxDB ne peut travailler qu'avec des intervalles identiques. Pour l'instant, j'ai trouv\u00e9 le moyen de d\u00e9finir un intervalle fixe de 30 jours. Oui, le graphique va un peu d\u00e9river au cours de l'ann\u00e9e et les barres ne correspondra pas tout \u00e0 fait aux mois. Mais comme cette fonctionnalit\u00e9 m'int\u00e9resse juste \u00e0 titre d'indicateur, cela me convient. <\/p>\n<p>Je vois au moins deux solutions :<\/p>\n<ul>\n<li>Abandonner les graphiques mensuels et se limiter aux hebdomadaires. 52 barres hebdomadaires par an se pr\u00e9sentent plut\u00f4t bien.<\/li>\n<li>Consid\u00e9rer la consommation mensuelle comme m\u00e9thode n\u00b02, et utiliser Grafana uniquement pour de beaux graphiques. Cela donnera une solution assez pr\u00e9cise. On peut m\u00eame superposer les graphiques de l'ann\u00e9e pr\u00e9c\u00e9dente pour comparaison \u2014 Grafana sait le faire.<\/li>\n<\/ul>\n<h2>Conclusion<\/h2>\n<p>\nJe ne sais pas pourquoi, mais j'adore ce genre de graphiques. Ils montrent que la vie bouillonne et que tout change. Hier il y avait beaucoup, aujourd'hui peu, et demain sera encore diff\u00e9rent. Il reste \u00e0 travailler avec les membres du m\u00e9nage sur le sujet de la consommation. Mais m\u00eame avec les app\u00e9tits actuels, un chiffre simplement grand et incompr\u00e9hensible sur la facture devient d\u00e9j\u00e0 un tableau de consommation assez clair.<\/p>\n<p>Malgr\u00e9 presque 20 ans de carri\u00e8re en tant que programmeur, je n'ai pratiquement pas eu de contacts avec les bases de donn\u00e9es. C'est pourquoi l'installation d'une base de donn\u00e9es externe me semblait quelque chose de follement complexe et inconnu. Tout a chang\u00e9 <noindex><a rel=\"nofollow\" href=\"https:\/\/dummylabs.com\/ru\/post\/2019-01-13-influxdb-part1\">l'article mentionn\u00e9 ci-dessus<\/a><\/noindex> \u2014 il s'est av\u00e9r\u00e9 que la connexion d'un outil appropri\u00e9 se fait en quelques clics, et avec un outil sp\u00e9cialis\u00e9, la t\u00e2che de construction de graphiques devient un peu plus simple.<\/p>\n<p>Dans le titre, j'ai mentionn\u00e9 la consommation d'\u00e9lectricit\u00e9. Malheureusement, je ne peux pas fournir de graphiques pour le moment. Un compteur SDM120 est tomb\u00e9 en panne, et l'autre fonctionne mal lors de l'acc\u00e8s via Modbus. Cela dit, cela n'a aucune incidence sur le sujet de cet article : les graphiques seront construits de la m\u00eame mani\u00e8re que pour l'eau.<\/p>\n<p>Dans cet article, j'ai pr\u00e9sent\u00e9 les approches que j'ai exp\u00e9riment\u00e9es moi-m\u00eame. Il existe s\u00fbrement d'autres m\u00e9thodes pour organiser la collecte et la visualisation des donn\u00e9es dont je ne suis pas au courant. N'h\u00e9sitez pas \u00e0 m'en parler dans les commentaires, cela m'int\u00e9ressera beaucoup. Je serai ravi des critiques constructives et des nouvelles id\u00e9es. J'esp\u00e8re que le mat\u00e9riel expos\u00e9 pourra \u00e9galement aider quelqu'un.<br \/>\n<br \/>Source : <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\/fr\/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=\"fr_FR\" \/>\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\/fr\/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\udd47 Maison intelligente : Cr\u00e9ation de graphiques de consommation d'eau et d'\u00e9lectricit\u00e9 dans Home Assistant | ProHoster","description":"\u00c0 chaque fois.","canonical_url":"https:\/\/prohoster.info\/fr\/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":"fr_FR","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\/fr\/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\/fr\/wp-json\/wp\/v2\/posts\/74421","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/comments?post=74421"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts\/74421\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/media\/74422"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/media?parent=74421"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/categories?post=74421"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/tags?post=74421"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}