Monitoring électricité avec la téléinfo + Node Red + influxDB

Si…
Un noeud substract attends un array en entrée et sort un simple clé:valeur (ou la valeur est un nombre).

J’ai l’impression que tu pars de très loin, là on est pas dans le sujet de la téléinfo, mais dans les basiques de nodered.
Tu devrais aller lire un peu sur le sujet nodered, la structure du msg, les documentations des noeuds etc…

Enfin bref, pour ton souci :

[{"id":"909e46ab.eb5a78","type":"cronplus","z":"659b0a60.7f2d34","name":"","outputField":"payload","timeZone":"","persistDynamic":false,"commandResponseMsgOutput":"output1","outputs":1,"options":[{"name":"mai","topic":"mai","payloadType":"default","payload":"","expressionType":"cron","expression":"0 58 23 31 MAY * 2021","location":"","offset":"0","solarType":"all","solarEvents":"sunrise,sunset"}],"x":120,"y":300,"wires":[["a090a5e5.e272d8"]]},{"id":"a090a5e5.e272d8","type":"switch","z":"659b0a60.7f2d34","name":"period select","property":"topic","propertyType":"msg","rules":[{"t":"eq","v":"mai","vt":"str"}],"checkall":"true","repair":false,"outputs":1,"x":290,"y":300,"wires":[["af207d4d.7c013"]]},{"id":"392fca13.093316","type":"debug","z":"659b0a60.7f2d34","name":"Conso elec 21_05","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":910,"y":240,"wires":[]},{"id":"309a2353.1966bc","type":"influxdb out","z":"659b0a60.7f2d34","influxdb":"468eb0a8.3cc35","name":"Influxdb Conso elec mai","measurement":"conso_elec_hist","precision":"","retentionPolicy":"","database":"database","precisionV18FluxV20":"ms","retentionPolicyV18Flux":"","org":"organisation","bucket":"bucket","x":950,"y":300,"wires":[]},{"id":"af207d4d.7c013","type":"function","z":"659b0a60.7f2d34","name":"transforme en nombre + format pour influx","func":"var conso_elec_hist= parseFloat(flow.conso_elec_hist_month);\nvar month = msg.topic\nmsg.payload = [];\nfields = {\"value\":conso_elec_hist};\ntags =  {\"entity\":\"conso_elec_\"+month};\nmsg.payload = [fields,tags];\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":600,"y":240,"wires":[["392fca13.093316","309a2353.1966bc"]]},{"id":"794f5215.04f54c","type":"inject","z":"659b0a60.7f2d34","name":"Manual init","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":260,"y":220,"wires":[["af207d4d.7c013"]]},{"id":"468eb0a8.3cc35","type":"influxdb","hostname":"a0d7b954-influxdb","port":"8086","protocol":"http","database":"nodereddb","name":"influx db addon","usetls":false,"tls":"","influxdbVersion":"1.x","url":"http://localhost:8086","rejectUnauthorized":true}]

Pourquoi passer par des variables de flow si c’est inutile ? Là tu veux juste prendre la valeur d’une variable pour la mettre dans influx, pourquoi la remettre dans une autre variable avant ?
Deplus ton noeud cron set un topic par mois, autant s’en reservir pour mettre ça dans le tag influx.

Mais encore une fois cette solution n’est pour moi absolument pas la bonne !
Tu vas créer un point avec une valeure chaque fin de mois dans influxdb en plus sur un tag différent chaque mois, comment tu compte en faire une représentation ensuite ? Je pense que tu n’as pas saisi le concept de time series d’influxDB.

Si vraiement tu veux faire ça fais le au moins sur le même tag genre conso_mensuelle et tu pourras tracer un graphique de conso mensuelle. Mais encore une fois tu ne pourras pas sortir la valeur du mois de février comme ça par magie, tu devras limiter ta requête influxdb sur le moment ou tu créé LE point du mois de février.

En plus du panel Grafana, je souhaite récupérer la consommation chaque fin de mois et l’archiver sur 4 ans ; dans le dashboard la présentation sera sous cette forme pour chaque année :
Conso-archive
La barre de progression change de couleur par rapport à la valeur moyenne (sur 4 ans).de la consommation mensuelle.

Le principe est le suivant :

  • le dernier jour du mois, (avec le nœud cron-plus) je récupère la consommation du mois (celle qui est dans conso month de Node-Red) et je la stocke dans influxDB ; je pensais à un field par année « conso_elec_2021 », « conso_elec_2022 »,etc avec un tag pour chaque mois « janvier », « février », etc.
  • je récupère ensuite la valeur de la consommation de chaque mois dans un sensor qui est ensuite affichée comme le montre la carte ci-dessus.
# Récupération données dans InfluxDB
- platform: influxdb
  host: a0d7b954-influxdb
  port: 8086
  username: !secret influxdb_user
  password: !secret influxdb_password
  queries:
    - name: test_conso_day
      unit_of_measurement: kWh
      measurement: '"conso_elec"'
      field: value
      value_template: '{{ value | float / 1000 }}'
      group_function: max
      where: '"entity" = ''conso_elec_day'''
      database: nodereddb

Concernant l’erreur, j’ai effectué la modification que tu m’as proposé :

[{"id":"bbada7d3.cf7c18","type":"cronplus","z":"5f869aea.270dd4","name":"","outputField":"payload","timeZone":"","persistDynamic":false,"commandResponseMsgOutput":"output1","outputs":1,"options":[{"name":"mai","topic":"mai","payloadType":"default","payload":"","expressionType":"cron","expression":"0 58 23 31 MAY * 2021","location":"","offset":"0","solarType":"all","solarEvents":"sunrise,sunset"}],"x":220,"y":1280,"wires":[["92034da.c510ab"]]},{"id":"92034da.c510ab","type":"switch","z":"5f869aea.270dd4","name":"period select","property":"topic","propertyType":"msg","rules":[{"t":"eq","v":"mai","vt":"str"}],"checkall":"true","repair":false,"outputs":1,"x":410,"y":1220,"wires":[["36ef96d7.2f7c5a"]]},{"id":"61d3b162.06572","type":"debug","z":"5f869aea.270dd4","name":"Conso elec 21_05","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":970,"y":1160,"wires":[]},{"id":"3c0f3caa.bd0ba4","type":"influxdb out","z":"5f869aea.270dd4","influxdb":"468eb0a8.3cc35","name":"Influxdb Conso elec mai","measurement":"conso_elec_hist","precision":"","retentionPolicy":"","database":"database","precisionV18FluxV20":"ms","retentionPolicyV18Flux":"","org":"organisation","bucket":"bucket","x":1010,"y":1220,"wires":[]},{"id":"36ef96d7.2f7c5a","type":"function","z":"5f869aea.270dd4","name":"transforme en nombre + format pour influx","func":"var conso_elec_hist= parseFloat(flow.conso_elec_hist_month);\nvar month = msg.topic\nmsg.payload = [];\nfields = {\"value\":conso_elec_hist};\ntags =  {\"entity\":\"conso_elec_\"+month};\nmsg.payload = [fields,tags];\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":660,"y":1160,"wires":[["61d3b162.06572","3c0f3caa.bd0ba4"]]},{"id":"ef76e5cb.3d1ea8","type":"inject","z":"5f869aea.270dd4","name":"Manual init","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":320,"y":1140,"wires":[["36ef96d7.2f7c5a"]]},{"id":"468eb0a8.3cc35","type":"influxdb","hostname":"a0d7b954-influxdb","port":"8086","protocol":"http","database":"nodereddb","name":"influx db addon","usetls":false,"tls":"","influxdbVersion":"1.x","url":"http://localhost:8086","rejectUnauthorized":true}]

J’ai toujours l’erreur invalid number:

14/05/2021, 14:54:11node: Influxdb Conso elec mai
msg : error
error
Error: A 400 Bad Request error occurred: {"error":"unable to parse 'conso_elec_hist,entity=conso_elec_ value=NaN': invalid number"}

J’ai peut-être fait un erreur dans le flow de la conso month

[{"id":"d5bdfee2.944e6","type":"change","z":"5f869aea.270dd4","name":"","rules":[{"t":"set","p":"index_wh_end_month","pt":"flow","to":"index_wh","tot":"flow"}],"action":"","property":"","from":"","to":"","reg":false,"x":350,"y":640,"wires":[["e55712dc.75c39"]]},{"id":"5ec724c8.33514c","type":"calculator","z":"5f869aea.270dd4","name":"","inputMsgField":"payload","outputMsgField":"payload","operation":"sub","constant":"","round":false,"decimals":"0","x":720,"y":640,"wires":[["8a1bcddf.43a4"]]},{"id":"e55712dc.75c39","type":"function","z":"5f869aea.270dd4","name":"","func":"var elec_start_month = flow.get(\"index_wh_start_month\");\nvar elec_end_month = flow.get(\"index_wh_end_month\");\nmsg.payload = [elec_end_month,elec_start_month];\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":580,"y":640,"wires":[["5ec724c8.33514c"]]},{"id":"8a1bcddf.43a4","type":"function","z":"5f869aea.270dd4","name":"transforme en nombre + format pour influx","func":"var conso_elec = parseFloat(msg.payload);\nmsg.payload = [];\nfields = {\"value\":conso_elec};\ntags =  {\"entity\":\"conso_elec_month\"};\nmsg.payload = [fields,tags];\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":980,"y":640,"wires":[["5a96ca46.cc6b04","3a516db7.53f7d2","effbe540.004468"]]},{"id":"5a96ca46.cc6b04","type":"debug","z":"5f869aea.270dd4","name":"Conso month","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":1290,"y":620,"wires":[]},{"id":"3a516db7.53f7d2","type":"influxdb out","z":"5f869aea.270dd4","influxdb":"468eb0a8.3cc35","name":"Influxdb Conso Wh month","measurement":"conso_elec","precision":"","retentionPolicy":"","database":"database","precisionV18FluxV20":"ms","retentionPolicyV18Flux":"","org":"organisation","bucket":"bucket","x":1330,"y":660,"wires":[]},{"id":"effbe540.004468","type":"change","z":"5f869aea.270dd4","name":"","rules":[{"t":"set","p":"conso_elec_hist_month","pt":"flow","to":"payload","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":1350,"y":720,"wires":[[]]},{"id":"468eb0a8.3cc35","type":"influxdb","hostname":"a0d7b954-influxdb","port":"8086","protocol":"http","database":"nodereddb","name":"influx db addon","usetls":false,"tls":"","influxdbVersion":"1.x","url":"http://localhost:8086","rejectUnauthorized":true}]
1 « J'aime »

OK tu te retrouve donc avec un tag avec 1 seul point. Surtout que ça t’oblige a garder toute la db sur 4 ans.
C’est très contraire au concept de time series non ?

Oui.
Tu vas chercher ta valeur à la sortie du format pour influx donc tu récupère un array pas un nombre…
Tu répètes sans arrêt les mêmes erreurs en fait. Je te conseille encore une fois d’aller lire les basiques de nodered, surtout tout ce qui est structure du msg.
Bref pour corriger ton noeud set conso_elec_hist_month doit etre connecté à la sortie du substract.

I’m out !

Ma problématique actuelle c’est d’afficher des consommations sur diverses périodes et d’en archiver certaines…
Le time series répond au 1er objectif et, de ce fait, disposant des valeurs des consommations à archiver, le second point vient « naturellement » surtout que lors d’un échange précédent tu faisais remarquer, à juste titre, qu’il était plus pertinent de stocker des valeurs d’archives dans une base de données que dans HA.

Je peux comprendre ton exaspération et les apparences peuvent être trompeuses car j’ai beaucoup progressé avec tes conseils et ton aide sur des exemples précis ; pour ce dernier cas c’est une erreur d’étourderie suite aux diverses modifications effectuées dans le code car je pense maintenant avoir compris le formatage des number et array.

Finalement, cette partie du code fonctionne après avoir effcetué les modifications suivantes dans le dernier flow que tu as donné :

  1. dans le nœud « Transforme », remplacé
var conso_elec_hist= parseFloat(flow.conso_elec_hist_month)

par

var conso_elec_hist = flow.get("conso_elec_hist_month");
  1. dans le nœud « Manuel init » (dans l’attente du déclenchement de Cron-plus en fin de mois)
  • ajouté « mai » dans le champ string de msg.topic

Encore merci pour ton aide.

Comme je suis un grand malade, et que les défis j’aime ça, je réfléchissais à une solution moins pourrie.
Je pense que j’ai trouvé.
Alors the best solution serait de pouvoir group by time interval : month => pas possible. Et en Flux ça passe mais ça déconne…
Du coup, je me suis demandé, par quoi on peut grouper nativement ?
Ben par tags !!!
Et là, voilà ma réflexion, on envoie la conso mensuelle chaque minute avec un tag « entity » : « conso_month », pourquoi ne pas ajouter un second tag « month » : « 5-2021 » (pour le mois de mai) et on pourrait simplement grouper par ce tag !
Bingo :smiley:
Je viens de le mettre en place chez moi, bon évidemment comme toutes mes datas précédentes n’avaient pas ce tag « month » quand je fais un group by tag « month » je me retrouve avec 2 catégories : 5-2021 et rien_du_tout
Mais quand le mois de juin va débarquer j’aurai « 5-2021 » et « 6-2021 » en faisant un group by tag ça fera mon group by month en fait, vu que le tag change au mois :smiley:
Pour injecter ce nouveau tag, rien de plus simple :
le noeud « transforme en nombre + format pour influx » de la conso mensuelle deviens :

var conso = parseFloat(msg.payload);
var date = new Date();
var month = date.getMonth() + 1;
var year = date.getFullYear();
var tag_date = month+"-"+year;
msg.payload = [];
fields = {"value":conso};
tags =  {"entity":"conso_month", "month":tag_date};
msg.payload = [fields,tags];
return msg;

Et voilà, j’ai mon group by month « bricolé » dans grafana :smiley:
la requête : SELECT max("mean_value") FROM "downsample"."Wh" WHERE ("entity" = 'conso_month' AND "month" != '') AND $timeFilter GROUP BY "month" tz('Europe/Paris')
On peut l’afficher sous forme de pie-chart, c’est sympa, et même faire des % !

On peut aisément bricoler un group by year aussi sur le même modèle.

Tu es un vrai gentil et tu ne lâches rien ! :grinning_face_with_smiling_eyes:

Je pense avoir compris le principe, qui permet notamment de faire des requêtes sur le mois qui ne sont pas possible avec Grafana HA.

Avec ton exemple de requête, les mois seront affichés avec la conso pour chacun.d’eux ?

Ce sera en mois glissants et si je souhaite conserver les consommations de chaque mois sur une même année civile je pourrai lire les tags « 5-2021 », « 6-2021 » etc ?

[Edit] Pour tester j’ai entrer des valeurs bidons pour mai, juin et juillet, voici la structure de la base :


Il y a bien des valeurs dans 5-2021, 6-2021 et 7-2021
Dans sensors.yaml j’ai fait la requête suivante :

    - name: test_conso_month
      unit_of_measurement: kWh
      measurement: '"conso_elec3"'
      field: value
      value_template: '{{ value | float / 1000 }}'
      group_function: max
      where: '"entity" = ''5-2021'''
      database: nodereddb

Ensuite dans lovelace j’ai ajouté une carte entities avec sensor.test_conso_month.
La valeur retournée est 0 mais la ligne where: ‹ « entity » = ‹ ‹ 5-2021 › › › est-elle incomplète ?

where: '"entity" = ''conso_month''' AND '"month" = ''5-2021'''

Il y a 2 tags !

Lorsque j’entre

    where: '"entity" = ''conso_month''' AND '"month" = ''5-2021'''

j’ai le message « can not read an implicit mapping pair; a colon is missing » et si j’joute : à la fin j’ai une erreur au check de la configuration.

[Edit] avec la syntaxe suivante je n’ai plus de message d’erreur mais la valeur du sensor reste à 0 :angry:

      where: '"entity" = ''conso_month'' AND  ''month'' = ''5-2021'''

[Edit] Finalement la syntaxe c’est :

      where: '"entity" = ''conso_month'' AND  "month"=''5-2021'''

Trois heures pour trouver la bonne syntaxe ! :disappointed:

Du coup on peu faire pareil pour conso lundi, mardi etc… ou il y a plus simple?

Hello,
Bon j’avance petit à petit… beaucoup d’infos à comprendre pour un newbee :thinking: :grin:.

Actuellement j’ai des index qui remontent pas…je cherche mais je vois pas :
HC day, Monty et year et aussi HP year. J’ai aussi fait la modification de sweepy car j’avais aussi des erreurs…

J’ai aussi une question, c’est normal que j’ai 2 « v1.x EDF » ??

Autre question, l’astuce que tu avais donné pour avoir la conso j-1, m-1, a-1 fonctionne encore ?

Merci pour tout ce boulot !!!

Pour récupérer les consommations par année, je propose ceci pour la fonction Transforme (SNoof pourra corriger) :

var conso = parseFloat(msg.payload);
var date = new Date();
var year = date.getFullYear();
msg.payload = [];
fields = {"value":conso};
tags =  {"entity":"conso_year", "year":year};
msg.payload = [fields,tags];
return msg;

Bonjour,
c’est bon j’ai tout qui fonctionne. Je souhaiterai juste savoir comment avoir une conso par heure et aussi avoir la consommation d’hier, du mois dernier et de l’année dernière d’affiché…
Super boulot !!!
Merci

J’affiche ceci dans une carte HA avec Grafana ; je ne sais pas si c’est ce que tu souhaites faire ?

Grafan-elec-menu2

C’est également possible d’afficher sur 24 h en heures glissantes.

Bonjour
Je suis toujours sur mon pb de consommation au jour, et je n’ai tjs pas la solution est ce possible d’avoir la même chose mais conso total de chaque jour de la semaine.
Merci

C’est à dire « la même chose » ? Un graphique avec une barre par jour sur la semaine ?

Oui mais pas sous grafana avec des sensors qui récupèrent la conso de chaque jours depuis influxdb, je ne suis pas arrivé à grand chose pour l’instant

Oui, c’est top ça… je veux bien !

Et aussi je voudrais juste afficher la conso du jour précédent, celle du mois précédent et année précédente.

Quand tu dis récupérer les conso par année, c’est pareil que les jours ?

As-tu installé Grafana dans HA ? Voici la requête :

requête

Avec la requête suivante tu peux aller chercher la valeur d’un mois au choix:

- name: test_conso_month
      unit_of_measurement: kWh
      measurement: '"conso_elec3"'
      field: value
      value_template: '{{ value | float / 1000 }}'
      group_function: max
      where: '"entity" = ''conso_month'' AND  "month"=''5-2021'''
      database: nodereddb

à condition d’avoir modifié la structure de la base comme l’a indiqué SNoof :

var conso = parseFloat(msg.payload);
var date = new Date();
var month = date.getMonth() + 1;
var year = date.getFullYear();
var tag_date = month+"-"+year;
msg.payload = [];
fields = {"value":conso};
tags =  {"entity":"conso_month", "month":tag_date};
msg.payload = [fields,tags];
return msg;

Je le répète encore une fois et pour la dernière fois :slight_smile:
HA c’est bien pour les données instantanées, les données fraîches (quelques jours) mais pour le mois passés, les années les périodes par mois, par semaine. Rien ne vaut un vrai bon outil de visualisation comme grafana.