Carte histogramme à partir d'infos MQTT

Bonjour,

Qurelqu’un as-tu déjà réalisé un graph du type 1 données par jour sur X jours à partir de données issues de mqtt
Pour l’instant une série d’infos (90 entrées organisées de la sorte)
image

Comme j’ai la main complète sur la structure de la queue MQTT et le format des messages, je voudrais rendre les choses les plus simples possibles.
Pour l’instant, je ne me vois pas faire 90 sensors à la main :unamused:

Petites précisions :

  • il y a entre 0 et 90 lots données
{
  "releve": "15/09/2021",
  "index": 303089,
  "conso": 2,
  "type": "M"
}
  • les données sont sur 90 jours glissants, rafraichies au moins 1 fois par jour
  • la date de la donnée n’est pas la date du message MQTT

Pas habitué avec le MQTT mais je partirais sur 1 seule entité et les 90 automatiquement en attributs :

Et ensuite, le graph taperait directement dessus les attributs… Apex j’imagine

Merci @Clemalex
Justement 1 entité et 90 attributs c’est un peu l’idée que j’ai eu avec le topic veoliacollect/histo

Un peu comme ça

Mais j’ai pas encore réussi à tomber sur la bonne configuration pour créer ce fameux sensor.
Il n’y a que l’astuce du + à la fin du tpic qui semble induire un changement, j’arrive à avoir le type (M) dans les attibuts mais c’est tout

Je suis donc revenu à moins compliqué et partir de la même doc/exemple que toi j’ai bien tenté de faire :

- platform: mqtt
  name: "Veolia télécollecte Index 2"
  state_topic: "veoliacollect"
  unit_of_measurement: "m³"
  value_template: "{{ value_json.index }}"

Et par contre, ça

- platform: "mqtt"
  name: "Veolia télécollecte Index"
  state_topic: "veoliacollect/index"
  unit_of_measurement: "m³"


c’est OK

Du coup, je suis un peu perdu… si ça coince sur la transo simple MQTT => template … la partie graphique risque d’être encore plus fun

pas rassuré :

1 « J'aime »

Si j’ai compris, à partir d’un message MQTT tu veux récupérer une liste d’attributs qui proviennent du tableau en JSON?
C’est ça?
Si, c’est le cas, je fais un truc comme ça avec NodeRed et je créé un sensor avec une palanquées d’attributs.
La seule différence que je vois c’est ta liste qui a un nombre variable de données. Comment savoir qu’un coup tu as 55 données et un autre 48?
Je pense que je garderais toujours les 90 entrées d’attributs avec des valeurs par défaut « 01/01/1970 » pour la date par exemple…
Si tu mets un morceau de json ici, je te fais un exemple vite fait (ce week-end, sans doute…).

1 « J'aime »

Merci @golfvert.

Bon le nombre variable de données en entrée c’est anecdotique. On reste sur 90, ça sera valable quasiment tous le temps.
Je prépare un jeu de données pour faire l’exercice.

Après NR ça ne me gêne pas, mais ça rends mon petit outil moins portable

Hello,

Je reviens sur le sujet car plus facile de tout expliquer ce soir.
L’idée c’est de proposer un truc qui fait l’équivalent du plugin jeedom veolia/teleo (dans les grandes lignes, pour l’instant c’est pas aussi exploitable).
En gros, ça se se connecte à l’interface du fournisseur, ça récupéré le fichier Excel qui contient les 90 valeurs antérieures.
Toute la partie récupération etc, ça fonctionne.
Pour aller un peu plus loin que l’usage de base (récupérer tous les jours la dernière valeur de la conso), je trouvai sympa de traiter les 90 indices par un moyen ou un autre.
MQTT c’est plutôt simple pour s’intégrer à HA, d’autant plus que ça fait partie des fonctions de base de appdaemon.
J’aurais vraiment aimé pourvoir antidater mes messages MQTT, ça aurait géré l’historique tout seul mais c’est pas possible.

Donc il s’il faut traiter les 90 entrées …

[
    {"releve":"13/09/2021", "index":303086, "conso":1, "type":"M"}, 
    {"releve":"14/09/2021", "index":303087, "conso":1, "type":"M"}, 
    {"releve":"15/09/2021", "index":303089, "conso":2, "type":"M"}, 
    {"releve":"16/09/2021", "index":303112, "conso":23, "type":"M"}, 
    {"releve":"17/09/2021", "index":303113, "conso":1, "type":"M"}, 
    {"releve":"18/09/2021", "index":303115, "conso":2, "type":"M"}, 
    {"releve":"19/09/2021", "index":303222, "conso":107, "type":"M"}, 
    {"releve":"20/09/2021", "index":303460, "conso":238, "type":"M"}, 
    {"releve":"21/09/2021", "index":303633, "conso":173, "type":"M"}, 
    {"releve":"22/09/2021", "index":303736, "conso":103, "type":"M"}, 
    {"releve":"23/09/2021", "index":303918, "conso":182, "type":"M"}, 
    {"releve":"24/09/2021", "index":304009, "conso":91, "type":"M"}, 
    {"releve":"25/09/2021", "index":304605, "conso":596, "type":"M"}, 
    {"releve":"26/09/2021", "index":304730, "conso":125, "type":"M"}, 
    {"releve":"27/09/2021", "index":304794, "conso":64, "type":"M"}, 
    {"releve":"28/09/2021", "index":305015, "conso":221, "type":"M"}, 
    {"releve":"29/09/2021", "index":305071, "conso":56, "type":"M"}, 
    {"releve":"30/09/2021", "index":305225, "conso":154, "type":"M"}, 
    {"releve":"01/10/2021", "index":305287, "conso":62, "type":"M"}, 
    {"releve":"02/10/2021", "index":305369, "conso":82, "type":"M"}, 
    {"releve":"03/10/2021", "index":305395, "conso":26, "type":"M"}, 
    {"releve":"04/10/2021", "index":305561, "conso":166, "type":"M"}, 
    {"releve":"05/10/2021", "index":305634, "conso":73, "type":"M"}, 
    {"releve":"06/10/2021", "index":305712, "conso":78, "type":"M"}, 
    {"releve":"07/10/2021", "index":305857, "conso":145, "type":"M"}, 
    {"releve":"08/10/2021", "index":305960, "conso":103, "type":"M"}, 
    {"releve":"09/10/2021", "index":306078, "conso":118, "type":"M"}, 
    {"releve":"10/10/2021", "index":306080, "conso":2, "type":"M"}, 
    {"releve":"11/10/2021", "index":306084, "conso":4, "type":"M"}, 
    {"releve":"12/10/2021", "index":306304, "conso":220, "type":"M"}, 
    {"releve":"13/10/2021", "index":306362, "conso":58, "type":"M"}, 
    {"releve":"14/10/2021", "index":306506, "conso":144, "type":"M"}, 
    {"releve":"15/10/2021", "index":306584, "conso":78, "type":"M"}, 
    {"releve":"16/10/2021", "index":306689, "conso":105, "type":"M"}, 
    {"releve":"17/10/2021", "index":306889, "conso":200, "type":"M"}, 
    {"releve":"18/10/2021", "index":307017, "conso":128, "type":"M"}, 
    {"releve":"19/10/2021", "index":307031, "conso":14, "type":"M"}, 
    {"releve":"20/10/2021", "index":307148, "conso":117, "type":"M"}, 
    {"releve":"21/10/2021", "index":307255, "conso":107, "type":"E"}, 
    {"releve":"22/10/2021", "index":307362, "conso":107, "type":"M"}, 
    {"releve":"23/10/2021", "index":307495, "conso":133, "type":"M"}, 
    {"releve":"24/10/2021", "index":308086, "conso":591, "type":"M"}, 
    {"releve":"25/10/2021", "index":309037, "conso":951, "type":"M"}, 
    {"releve":"26/10/2021", "index":309130, "conso":93, "type":"M"}, 
    {"releve":"27/10/2021", "index":309207, "conso":77, "type":"M"}, 
    {"releve":"28/10/2021", "index":309350, "conso":143, "type":"M"}, 
    {"releve":"29/10/2021", "index":309377, "conso":27, "type":"M"}, 
    {"releve":"30/10/2021", "index":309479, "conso":102, "type":"E"}, 
    {"releve":"31/10/2021", "index":309581, "conso":102, "type":"M"}, 
    {"releve":"01/11/2021", "index":309582, "conso":1, "type":"M"}, 
    {"releve":"02/11/2021", "index":309659, "conso":77, "type":"M"}, 
    {"releve":"03/11/2021", "index":309722, "conso":63, "type":"M"}, 
    {"releve":"04/11/2021", "index":309914, "conso":192, "type":"M"}, 
    {"releve":"05/11/2021", "index":310004, "conso":90, "type":"M"}, 
    {"releve":"06/11/2021", "index":310112, "conso":108, "type":"M"}, 
    {"releve":"07/11/2021", "index":310190, "conso":78, "type":"M"}, 
    {"releve":"08/11/2021", "index":310293, "conso":103, "type":"M"}, 
    {"releve":"09/11/2021", "index":310362, "conso":69, "type":"E"}, 
    {"releve":"10/11/2021", "index":310430, "conso":69, "type":"M"}, 
    {"releve":"11/11/2021", "index":310728, "conso":298, "type":"M"}, 
    {"releve":"12/11/2021", "index":310872, "conso":144, "type":"M"}, 
    {"releve":"13/11/2021", "index":311052, "conso":180, "type":"M"}, 
    {"releve":"14/11/2021", "index":311138, "conso":86, "type":"E"}, 
    {"releve":"15/11/2021", "index":311224, "conso":86, "type":"E"}, 
    {"releve":"16/11/2021", "index":311310, "conso":86, "type":"M"}, 
    {"releve":"17/11/2021", "index":311382, "conso":72, "type":"M"}, 
    {"releve":"18/11/2021", "index":311683, "conso":301, "type":"M"}, 
    {"releve":"19/11/2021", "index":311763, "conso":80, "type":"M"}, 
    {"releve":"20/11/2021", "index":311863, "conso":100, "type":"M"}, 
    {"releve":"21/11/2021", "index":311882, "conso":19, "type":"M"},
    {"releve":"22/11/2021", "index":312021, "conso":139, "type":"M"}, 
    {"releve":"23/11/2021", "index":312140, "conso":119, "type":"M"}, 
    {"releve":"24/11/2021", "index":312766, "conso":626, "type":"M"}, 
    {"releve":"25/11/2021", "index":312910, "conso":144, "type":"M"}, 
    {"releve":"26/11/2021", "index":312969, "conso":59, "type":"M"}, 
    {"releve":"27/11/2021", "index":313072, "conso":103, "type":"E"}, 
    {"releve":"28/11/2021", "index":313175, "conso":103, "type":"M"}, 
    {"releve":"29/11/2021", "index":313258, "conso":83, "type":"M"}, 
    {"releve":"30/11/2021", "index":313359, "conso":101, "type":"M"}, 
    {"releve":"01/12/2021", "index":313432, "conso":73, "type":"M"}, 
    {"releve":"02/12/2021", "index":313436, "conso":4, "type":"M"}, 
    {"releve":"03/12/2021", "index":313621, "conso":185, "type":"M"}, 
    {"releve":"04/12/2021", "index":313693, "conso":72, "type":"M"}, 
    {"releve":"05/12/2021", "index":313800, "conso":107, "type":"M"}, 
    {"releve":"06/12/2021", "index":313819, "conso":19, "type":"M"}, 
    {"releve":"07/12/2021", "index":313874, "conso":55, "type":"M"}, 
    {"releve":"08/12/2021", "index":314068, "conso":194, "type":"M"}, 
    {"releve":"09/12/2021", "index":314245, "conso":177, "type":"M"}, 
    {"releve":"10/12/2021", "index":314354, "conso":109, "type":"M"}
]

Le

tu as "index" et pas "type" c’est la créativité de veolia?
Moi, j’aimerais bien qu’ils fassent des factures tous les 6 mois exactes. Alors, une API, je n’y compte même pas…

Coquille lors de ma mise en forme ! Corrigée

Vu le JSON, je vois deux possibilités:

  • un sensor unique qui a une valeur (qui ne sert pas) et 270 (si on ne met pas le type) ou 360 attributs avec des numéros de 1 à 90 qui identifie les 90 jours de profondeurs. sensor.veolia et les 360 (270) amis.
  • un sensor par jour qui a pour valeur (par exemple) l’index et en attribut la date du relevé et la conso. Donc 90 sensors avec sensor.veolia1… veolia90 et chacun 3 (2) attributs (puisque une des données peut être la valeur du sensor)

Si c’est pour afficher dans un tableau le veolia1…90 est sans doute plus pratique.
En NR les deux se font assez bien.

C’est moi qui construit le JSON donc s’il y a un autre format plus adapté c’est pas un souci.
En rendu final j’aurai bien vu :
1 sensor avec un state (index ou conso) et 3 attributs releve/conso (ou index)/type + 90 attributs qui regroupent les valeurs releve/index/conso/type sous forme de chaine.

Je me demande si je devrais pas chercher à injecter les 90 states (avec la date) directement en base pour 3 entités… ça permettrai d’avoir les bonnes infos direct, sans transfo à partir de NR
ça à l’air d’être possible

Là, si je comprends, ça fait 93 attributs :slight_smile:

Ca ferait un truc comme: sensor.veolia a pour valeur 314354 (l’index du jour le plus récent) et ensuite 90 attributs:

date1: "10/12/2021;314354;109"
date2: "09/12/2021;314245;177"

et ainsi de suite. C’est ça?
A froid, je dirait que ça doit être faisable en jinja2 (que je ne pratique pas du tout…) dans HA ou en jsonata (je me débrouille) dans NodeRed.

C’est ça.
Noter les 90 attributs de 0 à 89 c’est faisable mais est ce exploitable ensuite ?
Parce techniquement après 30j de récupération quotidienne l’historique s’est auto créé