Retour d'expérience sur l'utilisation des plugin influxdb, teleinfo et l'utilisation de grafana

Bonjour,

Cela faisait bien longtemps que je souhaitait analyser mes consommations de courant et pouvoir afficher la consommation afin d’effectuer les analyses et optimiser si possible surtout depuis l’arrivée de 2 voitures électriques à la maison.

Pas facile d’effectuer cela dans Jeedom, la solution n’étant pas construite pour effectuer des analyses croisées avec une notion forte de temps.

J’avais effectué des premier tests avec influx v1.8 (database temporelle) mais cette version était assez limitée et surtout nous ne pouvions pas effectuer d’analyse de données au mois.
J4ai pu tester la version 2.0 et là cela commençait à être sympa avec la puissance associée de grafana pour effectuer l’analyse graphique.

Devant installer influx v2.0 sur mon raspberry, il me fallait passer en 64 bits sur mon raspberry, je n’ai pas voulu prendre le risque de faire cela sur mon Jeedom ‹ principal › avec toute ma domotique en production.
J’ai donc installé un rasbian 64bits avec un Jeedom ‹ secondaire › sur un PI4B d’avance :slight_smile: avec 4GB de mémoire me permettant d’installer un Jeedom ‹ Technique › avec influx v2, Grafana, connecté à mon compteur edf (temps réel) via le plugin teleinfo et le plugin influxdb pour copier toutes mes données en temps réel vers la base influxdb (réception de plusieurs information par seconde, je suis en tri-phasé).
Mes données du compteurs sont automatiquement copiées via le plugin Influxdb vers mon influx.

Après 7 mois d’utilisation voici les différentes analyses que l’on peut sortir incluant les coûts.
J’ai ‹ injecté › manuellement dans influxdb les consommation des années précédentes (grace aux factures) et le prix du kw heure creuse heure pleine ainsi que l’abonnement.

Il me restera à intégrer dans une page de mon Design Jeedom les graphs les plus pertinents pour mon suivi.

N’hésitez pas à me poser des questions, l’objectif étant de partager :slight_smile: .

Quelques captures d’écran
L’affichage de la consommation les 24 dernières heures
Aujourd’hui très calme, en bas une vision de la consommation sur les 40 derniers jours

Une autre journée plus pertinente ou l’on constate bien la consommation électrique lors de la charge des voitures la nuit (en 2 étapes de montée en charge) et du chauffage.
Très intéressant aussi durant l’hivers lorsque l’on chauffe à l’électrique :wink:

Et enfin une autre page de graphiques avec le suivi de la consommation et du coût
Par jour pour le mois en cours, par mois pour l’année (commencé au mois de Janvier à collecter les données en temps réel), et par année


6 « J'aime »

Salut pas mal, tu fais remonté dans t’on jeedom?

1 « J'aime »

Je ne fais pas remonter dans mon jeedom, il n’y a pas trop d’intérêt je pense et pour la données cela est trop volumineux pour une base de données ‹ classique › … infludb et grafana sont là pour ça :slight_smile:
Le compteur EDF est très très bavard

  • Je reçois plus de10 informations par secondes ce qui représente environ 1 million de ligne par jour :slight_smile:
  • Après 7 mois de fonctionnement la base infludb sans aucune épuration ne fait ‹ que › 250 méga ce qui est étonnant
  • Des temps de réponses incroyables sur un raspberry, je suis autour de 700ms même sur les requêtes pour les années qui sont complexes avec agrégations multiples
  • Pour info sur mon jeedom technique je ne garde que 15 jours, juste au cas où il aurait un problème de transfert de données via le plugin influxdb. Ma sauvegarde Jeedom technique ne fait que 50mb

Par contre à partir d’une page de mon Design Jeedom je vais pouvoir afficher un panel (graphique) de Grafana, Grafana comme jeedom permet d’effectuer des appels via les liens Web et clé API.

c’est exactement ca que je veut faire

Par contre à partir d’une page de mon Design Jeedom je vais pouvoir afficher un panel (graphique) de Grafana, Grafana comme jeedom permet d’effectuer des appels via les liens Web et clé API.

2 « J'aime »

Salut franckybel,

J’aimerai aussi mettre grafana associe a mon jeedom. J’utilise grafana au boulot et je trouve ca genial. Par contre je sais pas commebt m’y prendre.
Tu serai partant pour m’expliquer le fonctionnement ?

Bonne soirée

1 « J'aime »

Salut @mikl43290 ,

Oui bien évidemment, je suis pris par le boulot, mais je pense que début Aout je vais pouvoir prendre le temps et essayer cela.
Dès que c’est opérationnel je partage et te tiens informé.

2 « J'aime »

@mikl43290 J’ai trouvé cela entre 2 avions :wink:
C’est hyper simple et pas de raison que cela ne fonctionne pas. il faut juste modifier comme indiqué le fichier de configuration de grafana et bien redémarrer le service. J’ai contrôlé sur le mien et par défaut cela n’est pas autorisé d’appeler un graph depuis une autre application (embedded application).
Juste sur la sécurité, je trouve cela limite si on ne prend pas en compte le fait de se connecter (ce qui est prosposé sur ces 2 tutos). sur un système interne dans une maison pourquoi pas mais si tu ouvres à l’extérieur il faudra creuser un peu plus pour être certain que l’authentification user fonctionne entre le Jeedom (Login HTTP/HTTPS) et le user grafana.

Embed Grafana dashboards in your web application | by Akshay Bobade | Medium.

2 « J'aime »

Salut,
C’est une super nouvelle. J’attends ton retour.
Merci

Bonjour !
Loin d’etre aussi doué avec Telegraf, Influxdb et Grafana, j’ai tout de même réussi à alimenter un influxdb2 via telegraf depuis un source MQTT (elle même aliménetée par un python qui récupère les valeur du compteur en USB)…
Je cherche maintenant à afficher tout ça et tes dashboards m’interessent.
Aurais-tu l’amabilité de me les partager ? Puisque tu récupères tout depuis influxdb2, je devrait pouvoir adapter les requètes à mon cas…
D’avance merci et bravo pour le travail accompli !

Salut @dramces,

Pour ma part j’avais fait plus simple pour utiliser directement les Plugin et ne pas devoir développer, juste les queries un peu complexes surtout ceux qui tournent toutes les 10 minutes.

Des jours, des semaines de travail à partager gratuitement … :face_with_diagonal_mouth:
Je réfléchi … :kissing:
Encore un peu … :face_with_peeking_eye:
Oui mais bon … :woozy_face:

Allé ma décision :crazy_face: :crazy_face: :crazy_face:OUI :rofl: :rofl:

Juste un petit détail pour que tu puisses appréhender plus rapidement les queries mis en place.
J’ai 2 Buckets Influxdb :

  • Jeedom : données brutes venant directement de Jeedom, permet d’afficher principalement la consommation jour en instantané et sur le max/min 5min. J’ai une delete data de 90 jours
  • Jeedom_History : qui est rempli à travers des tâches exécutées toutes les 10 minutes dans Influxdb, pour calculer à la journée (je garde de ce fait un minimum de données pour limiter le volume, un enregistrement par jour). Je ne supprime pas les données.

Contient donc 4 _measurements

  • Conso : les conso jours (info compteur min max par période bleu,blanc, jour nuit …),
  • Cout : les coûts jour par période et total
  • Tarif : Tarif Elec, permet évidemment de calculer les coûts suivant une fois encore les période et abonnement
  • Mesure : Mesures diverses que je souhaite garder au cas ou … mais qui me servent pour afficher par exemple les délestages avec les infos ADIR1, ADIR2, ADI3, DEMAIN, PAPP_Max (sur des zones de 5 min.), …

En résumé Grafana n’a pas de calcul, il ne fait que reprendre les données déjà calculées toutes les 10 minutes dans influxdb, cela permet d’avoir bien évidemment un affichage très rapide et ne pas charger mon raspberry avec une mise à jour du graph que j’ai mis à 5s pour avoir les affichages fluides des conso instantanées.

Depuis le temps j’ai bien évidemment amélioré les graphs, tu verras par toi même
A importer dans grafana en ayant renommé les txt en json.

Bonne lecture :wink:

Electricité - Coût-1676620303342.txt (66,7 Ko)
Electricité - Conso Journée-1676620052747.txt (40,4 Ko)

Salut @Franckybel

Avant même de télécharger et tester, je t’adresse mes sincères remerciements ! :innocent:
J’ai hâte de voir ça !
Je reste conscient du travail que tu as mené ! Je vois déjà combien j’ai galéré pour en arriver là.
On ne trouve pas tant de sources que ça pour la téléinfo. Je pense que cela se perd car ENEDIS partage les (nos) données…Mais ce n’est pas du temps réel ! Ce n’est pas très beau… Ce n’est pas très fin…

Je vais donc analyser tout ça se soir, ou demain… Je pense qu’il y a beaucoup d’adptation à faire mais tes requêtes semblent bien complètes de ce que tu me dis ! Cooool ! :star_struck: :star_struck: :star_struck:

Je reviendrais ici faire part de mon avancée !

Merci encore :wink: :wink: :wink:

1 « J'aime »

Bonjour !
J’avance bien mais contrairement à toi @Franckybel , je n’ai pas de Jeedom qui fait du calcul…
D’ailleurs, pour le coup, rien ne passe dans Jeedom et c’est à terme que j’aimerai intégrer ce dashbord dans un design.
Je suis en mono phasé et je ne produit pas…
J’ai un véhicule électrique par contre qui recharge toutes les nuits…
Je trouve vraiment bien de visualiser la vie électrique de la maison.

Il faut maintenant que je joue avec les données afin de produire des cumuls et avoir ainsi des valeurs journalières et mensuelles. InfluxDb doit pouvoir calculer tout ca, mais j’ignore encore comment.

Pour le moment, j’ai déja ça :

Encore merci !

Marc

Bravo, super avancée.

Je trouve également très intéressant de gérer son électricité en temps réel, j’ai également 2 voitures électriques avec le chauffages électrique et je gere mon délestage cia Jeedom et les infos de la télé-info.

Oui avec influxdb tu peux faire les calculs pour faire les cumuls, c’est ce que j’effectue.
Il faut ecrire un query de regroupement que tu executeras en tâches avec une planification pour une écriture dans un autre bucket (le pourquoi de mes 2 buckets)

Dans tous les cas, content que cela a permis de te servir.

Bonjour à tous,

J’ai continué de « jouer » avec InfluxDB et Grafana. J’y ai ajouté mon chauffage piloté par Tado° avec un Dashboard bien complet (mais hors sujet Teleinfo).
J’ai donc ajouté sur le même graphique les périodes de chauffage.

On voit dans ce graph les hausses de consommation liées au chauffage. Les zones sombres sont les périodes ou le chauffe-eau a « le droit » de chauffer (mais il travaille ensuite en solo sans bavarder). Le gros bloc de nuit reste la voiture qui charge. Il y a aussi quelques pics hors tout mais quand je regarde l’heure, c’est autour des repas et donc la plaque induction, micro-ondes ou four…
Je dois maintenant ajouter les données de Jeedom pour la charge de ma voiture qui y est connectée et pour encadrer le graph plus finement et le rendre plus verbeux. Peut-etre aussi le home-cinema…
J’aurai ainsi une vision assez exhaustive de l’usage électrique de la maison.

Viendra ensuite l’optimisation pour que tout cela tienne dans le temps.
Je pense notamment à la création du 2ème Bucket pour y agréger comme toi @Franckybel les données semaines et mensuelles. Mais j’ignore comment m’y prendre :thinking:
Il y a en effet bcp bcp de données qui entrent !

Mon NAS ne bronche pas malgré la 10aine d’autres dockers qui tournent en plus de son rôle multimédia et serveur (Synology DS920+).

Reste que ma femme me prend pour un taré avec mes graphs ! :rofl: :rofl: :rofl:
Mais ça, c’est une autre histoire !

2 « J'aime »

Bravo super résultat :slight_smile: , je pense comme toi que la gestion de l’électricité en temps réel est important.

Je te donne (et à toute la communauté :wink:) un exemple d’aggréga et écriture dans un bucket d’historique.
Si ça peut aider pour avancer plus vite, j’avais galéré sur ce sujet :slight_smile:

import "math"
import "strings"

import "timezone"
option location = timezone.location(name: "Europe/Paris")

//Number_of_days = 15

data = () =>
    from(bucket: "Jeedom")
        |> range(start: -5d)
//        |> range(start: v.timeRangeStart, stop: v.timeRangeStop)
        |> filter(
            fn: (r) =>
                r["_measurement"] == "BBRHCJB" or r["_measurement"] == "BBRHCJR" or r["_measurement"] == "BBRHCJW"
                    or
                    r["_measurement"] == "BBRHPJB" or r["_measurement"] == "BBRHPJR" or r["_measurement"] == "BBRHPJW"
                    or
                    r["_measurement"] == "HCHC" or r["_measurement"] == "HCHP",
        )
        |> filter(fn: (r) => r["_field"] == "Compteur")

 max = data()
        |> aggregateWindow(every: 1d, fn: max, createEmpty: false)
        //|> fill(value: 0.0)
        |> pivot(rowKey: ["_time"], columnKey: ["_measurement"], valueColumn: "_value")
        |> rename(
            fn: (column) => {
                columnRegex = /HCHC|HCHP|BBRHCJB|BBRHCJW|BBRHCJR|BBRHPJB|BBRHPJW|BBRHPJR/
                columnName = if column =~ columnRegex then "${column}_Max" else column
                return columnName
            },
        )

 min = data()
        |> aggregateWindow(every: 1d, fn: min, createEmpty: false)
        //|> fill(value: 0.0)
        |> pivot(rowKey: ["_time"], columnKey: ["_measurement"], valueColumn: "_value")
        |> rename(
            fn: (column) => {
                columnRegex = /HCHC|HCHP|BBRHCJB|BBRHCJW|BBRHCJR|BBRHPJB|BBRHPJW|BBRHPJR/
                columnName = if column =~ columnRegex then "${column}_Min" else column
                return columnName
            },
        )
        
join(tables: {min: min, max: max}, on: ["_time"])
|> drop(columns: ["_field_max","_field_min","_start_max","_start_min","_stop_max","_stop_min"])

|> map(
        fn: (r) => ({ r with
            BRHCJB_Conso: if exists r.BBRHCJB_Max then math.roundtoeven(x: (r.BBRHCJB_Max - r.BBRHCJB_Min) / 10.0) / 100.0 else 0.0,
            BRHPJB_Conso: if exists r.BBRHPJB_Max then math.roundtoeven(x: (r.BBRHPJB_Max - r.BBRHPJB_Min) / 10.0) / 100.0 else 0.0,
            BRHCJW_Conso: if exists r.BBRHCJW_Max then math.roundtoeven(x: (r.BBRHCJW_Max - r.BBRHCJW_Min) / 10.0) / 100.0 else 0.0,
            BRHPJW_Conso: if exists r.BBRHPJW_Max then math.roundtoeven(x: (r.BBRHPJW_Max - r.BBRHPJW_Min) / 10.0) / 100.0 else 0.0,
            BRHCJR_Conso: if exists r.BBRHCJR_Max then math.roundtoeven(x: (r.BBRHCJR_Max - r.BBRHCJR_Min) / 10.0) / 100.0 else 0.0,
            BRHPJR_Conso: if exists r.BBRHPJR_Max then math.roundtoeven(x: (r.BBRHPJR_Max - r.BBRHPJR_Min) / 10.0) / 100.0 else 0.0,
            HCHC_Conso: if exists r.HCHC_Max then math.roundtoeven(x: (r.HCHC_Max - r.HCHC_Min) / 10.0) / 100.0 else 0.0,
            HCHP_Conso: if exists r.HCHP_Max then math.roundtoeven(x: (r.HCHP_Max - r.HCHP_Min) / 10.0) / 100.0 else 0.0,           
        }),
    )

|> map(
    fn: (r) => ({ r with
        STAT_TODAY_HP: math.roundtoeven(x: (r.BRHPJB_Conso + r.BRHPJW_Conso + r.BRHPJR_Conso + r.HCHP_Conso) * 100.0) / 100.0,
        STAT_TODAY_HC: math.roundtoeven(x: (r.BRHCJB_Conso + r.BRHCJW_Conso + r.BRHCJR_Conso + r.HCHC_Conso) * 100.0) / 100.0,
        STAT_TODAY:  
            (math.round(x:  
            ((math.roundtoeven(x: (r.BRHPJB_Conso + r.BRHPJW_Conso + r.BRHPJR_Conso + r.HCHP_Conso) * 100.0) / 100.0 + 
            math.roundtoeven(x: (r.BRHCJB_Conso + r.BRHCJW_Conso + r.BRHCJR_Conso + r.HCHC_Conso) * 100.0) / 100.0)) * 100.0) / 100.0
            ) ,
    }),
)

|> keep(fn: (column) => column =~ /_Conso|STAT_TODAY|_time|_Max|_Min/)

// Pour rappel la fonction truncateTimeColumn(unit: 1d) met la date de la veille sur un enregistement en cours sur la journée
// Permet de ne garder que la date et mettre l'heure à 00:00:00:00, en convertissant la date sans l'heure dans le string
|> map(fn: (r) => ({ r with _time: time(v: strings.substring(v: string(v: r._time), start: 0, end: 10)) }))

// On enlève la première journée de la sélection car elle ne sera pas complète à cause de la référence Now po()ur le -xxx Days
|> range(start: -4d)

// Creation _measurement pour utiliser la fonction wideTo
|> set(key: "_measurement", value: "Conso")
|> group(columns: ["_measurement"])

// Ecriture dans le Bucket Jeedom_History
|> wideTo(bucket: "Jeedom_History")
2 « J'aime »

Merci beaucoup @Franckybel