Récupération automatique du prix du kwh et de l’abonnement EDF/Gaz/Eau (ou autre fournisseur) - accessible à tous

Bonjour à tous,

Dans cet exemple, cela concerne le prix annuel de l’abonnement EDF, que je récupère dans un tableau sur internet.

Pour récupérer n’importe quelle donnée (température, lieu, texte, prix de l’essence près de chez vous, valeurs de la bourse, météo, etc) , voici une solution simple à mettre en place.

Celle-ci est basée sur le fait de mettre à jour une entrée input.number en lui changeant sa valeur sa valeur en fonction de celle du sensor correspondant créé sous Scrape, c’est à dire récupérée sur internet, uniquement si elle est disponible. Si indisponible, vous gardez la dernière valeur valide. (2 sensors + 1 automatisation à créer)

Pour cela :

ETAPE 1 :
Sous Appareils&services, cliquer sur Ajouter une intégration, et recherchez « Scrape », puis installez-la.


ETAPE 2 : Configurer la ressource

Ici, il vous faut indiquer le site internet sur lequel se rendre pour accéder à la donnée voulue.

Dans mon cas, j’utilise la page : Tarifs Tempo EDF bleu blanc rouge : grille tarifaire février 2026
Avec comme délai d’expiration « 20160 ».

Vous pouvez créer autant de Ressources (site web cible) que vous le désirez, et créer autant de capteurs que vous le voulez pour chacun d’eux.

Récupérant dans le même tableau le prix annuel de l’abonnement EDF Tempo, et ses différents prix, j’ai donc un total d’une ressource ayant elle-même 7 entités, dans mon cas.


ETAPE 3 : Ajouter un capteur

A cette étape, vous allez définir l’endroit ou se trouve la valeur désirée sur la page internet, d’après son CSS.

J’utilise donc :
table.table.table--stripped.table--small tbody tr:nth-child(2) td:nth-child(2)

Ce qui correspond à la 2eme colonne de la 2eme ligne du tableau sur la page en question, c’est à dire 209,4 €, ayant un contrat 9kVA.

Pour le Prix du kWh Jour Bleu en heures creuses, j’aurais utilisé :
table.table.table--stripped.table--small tbody tr:nth-child(2) td:nth-child(3)

Ce qui correspond à la 3eme colonne de la 2eme ligne du tableau sur la page en question, c’est à dire 0,1288 €, au moment où j’écris cet article.

S’agissant d’un prix, on donnera comme « Unité de mesure » des « EUR ».

Enfin, il faudra utiliser le « Modèle de valeur » suivant pour supprimer tout ce qui n’est pas un chiffre ou une virgule dans la valeur récupérée, convertir cela en nombre décimal et transformer la virgule en point :

{{ value | regex_replace('[^0-9,]', '') | replace(',', '.') | float }}


ETAPE 4 :
A présent, afin de s’assurer d’avoir toujours un capteur valide, on va créer un input.number sur lequel on va transférer la valeur du sensor correspondant créé via Scrape.

Pour cela, se rendre sur « Appareils&services », puis « Entrées », et cliquer sur « Créer une Entrée ».

Il a pour ID : input_number.prix_abonnement_edf_annuel_maj_auto
Avec une valeur max de 1000, du fait que le prix de l’abonnement sera normalement toujours en dessous.


ETAPE 5 :
Il ne reste plus qu’à créer l’automatisation qui va prendre la valeur du sensor créé sous scrape, pour la coller sur ce nouveau sensor input.number qu’on utilisera sur la page Énergie.

Et comme garde-fou, on ne fera la mise à jour que si le sensor sous scrape est valide. Dans le cas contraire, notre input_number reste lui valide.

Voici l’automatisation correspondante :

alias: "Mise à jour coût abonnement si valide dans Scrape "
description: ""
triggers:
  - entity_id:
      - sensor.prix_abo_annuel_edf
    trigger: state
conditions:
  - condition: template
    value_template: >
      {{ not states('sensor.prix_abo_annuel_edf') in ['unavailable', 'unknown']
      }}
actions:
  - target:
      entity_id: input_number.prix_abonnement_edf_annuel_maj_auto
    data:
      value: "{{ states('sensor.prix_abo_annuel_edf') }}"
    action: input_number.set_value

Si vous récupérez comme moi 7 tarifs (abonnement + prix tempo), il vous faudra 7 input.number, bien sûr. Et adapter l’automatisation pour qu’elle soit valide pour chacun d’eux, ou simplement faire 7 automatisations.


ETAPE 6 :

Suivre le tutoriel en lien ci-dessous pour pouvoir diviser le montant annuel du coût de l’abonnement afin de correspondre à une journée, et pouvoir l’utiliser dans Énergie automatiquement.


INFOS COMPLÉMENTAIRES :

Voilà, vous récupérez à présent la valeur voulue sur le site internet désiré (choisissez en qui est fiable), comme ici avec kelwatt.

De plus, vous avez un capteur « propre » qui restera même si vous supprimez un jour Scrape (qui je le rappelle est une intégration native de HA).

Enfin, tant que vous utilisez cette manière de faire, vous aurez une valeur qui ne pourra jamais être indisponible.


ATTENTION :

Pour ceux qui ont déjà suivi mon précédent tutoriel ( Ajout du cout de l'abonnement EDF/Gaz/Eau (ou autre fournisseur) au dashboard Energy - accessible à tous ), si vous suivez celui-ci, il est nécessaire de remplacer sensor.prix_abo_annuel_edf par input_number.prix_abonnement_edf_annuel_maj_auto , dans la première ligne du sensor créé à l’étape 1, qui s’appelle « Abonnement EDF journalier »


Enjoy ! :blush:

8 « J'aime »

Tutoriel mis à jour.

1 « J'aime »

Merci pour la mise a jour.

J’ai profité pour faire la mise a jour des tarifs tempo en automatique.

1 « J'aime »

Bonjour et merci beaucoup à toi @n3fansub , j’ai pas mal regardé tes 2 sujets car il m’intéresse fortement.

En effet, je suis en Tempo et j’ai installé avant hier une Lixee sur mon compteur.

Donc pour le moment, mes coûts en Energie sont fixes sur les 6 tarifs, donc les rendre dynamiques serait vraiment bien même si “que” 2 mises à jours à an.

Et surtout ajouter l’abonnement qui m’a fait découvrir tes 2 sujets.

Sur ce sujet, j’avoue avoir tout suivi et compris jusqu’à l’étape 4.

Pour l’étape 5, je ne sais pas comment l’aborder (surement car je débute que depuis quelques jours sur HAOS …). J’ai bien vu où allait pour créer une nouvelle automatisation, mais je ne sais pas vraiment quoi prendre pour le déclencheur …

De même, si j’ai bien suivi, pour intégrer l’abonnement au dashboard Energie, je devrai ensuite reprendre ton autre sujet pour faire la division par 12 … Mais là aussi, je suis perdue avec les automatisations.

J’aime pouvoir comprendre ce que je fais, puisque comme tu le dis, ton tutoriel puis s’adapter dans plein d’autres circonstances.

Merci par avance de votre aide, cordialement

1 « J'aime »

Bonjour @Batmat86 ,

Pour l’automatisation, tu as juste à copier celle que j’ai mise dans l’étape 5, si tu as nommé tes identités exactement comme moi.

Concrètement, elle permet de mettre à jour les capteurs qu’on utilise réellement dans la page Énergie seulement si ceux qui remontent via scrape ne sont pas indisponible ou non viable.

Pour l’autre automatisation qui te pose problème, n’hésite pas à m’indiquer sur le post correspondant laquelle c’est, que je l’explique.

Enfin, oui, une fois qu’on maîtrise scrape, on peut récupérer sous forme de capteur énormément d’informations du net.

Bonne soirée.

Bonjour @n3fansub et désolé du délai, je n’avais pas vu ta réponse, je pensais avoir un mail pour signaler la notification de réponse, mais en vérifiant, je vois que c’est uniquement pour le navigateur utilisé et vu que je suis rarement sur le PC …

Avant ton message, j’avais réussi via ton superbe tuto à gérer pour mes 6 tarifs tempo mais je calais pour l’abonnement, car un peu moins d’étape sur où aller précisément à chaque étape.

Donc ce soir, j’ai repris ton sujet sur l’abonnement, et j’ai pu réussir à faire fonctionner et en forçant pour aujourd’hui l’incrémentation, cela fonctionne, à voir demain si cela se fait bien tout seul, mais il n’y a pas de raison que cela ne fonctionne pas. Donc merci beaucoup à toi.

Pour rester sur ce sujet, j’ai utilisé ta méthode de faire 6 automatisations pour mes 6 tarifs tempo, cela fonctionne très bien. Mais j’aimerai bien une piste pour essayer de limiter le nombre d’automatisation, pour en faire qu’une voir deux (car pas sur de pouvoir faire Abonnement et Tarif en une seule) pour Tempo. Certes, surement plus compliqué de base à mettre en place, mais je me dis que surement plus simple si besoin de faire une mise à jour à l’avenir, d’avoir tout dans un endroit plutôt que 6 …

Merci par avance, cordialement

Comme lors de mon message initial pour l’étape 5, c’était que faire de ton code d’automatisation, où le mettre … Je n’avais encore jamais fais d’automatisation puisque je débute sous HAOS.

1 « J'aime »

Bonjour @Batmat86 ,

Voici l’automatisation que j’utilise pour tout gérer en une seule :

alias: Mise à jour coûts kwh et abonnement si valide dans Scrape
description: ""
triggers:
  - trigger: state
    entity_id:
      - sensor.prix_abo_annuel_edf_2
      - sensor.prix_du_kwh_jour_blanc_en_heures_creuses_2
      - sensor.prix_du_kwh_jour_blanc_en_heures_pleines_2
      - sensor.prix_du_kwh_jour_bleu_en_heures_creuses_2
      - sensor.prix_du_kwh_jour_bleu_en_heures_pleines_2
      - sensor.prix_du_kwh_jour_rouge_en_heures_creuses_2
      - sensor.prix_du_kwh_jour_rouge_en_heures_pleines_2
conditions:
  - condition: state
    entity_id: binary_sensor.sfr_box_etat_ftth
    state: "on"
actions:
  - parallel:
      - if:
          - condition: template
            value_template: >-
              {{ states('sensor.prix_abo_annuel_edf_2') not in ['unavailable',
              'unknown'] and (states('sensor.prix_abo_annuel_edf_2') | float !=
              states('input_number.prix_abonnement_edf_annuel_maj_auto') |
              float) }}
        then:
          - target:
              entity_id: input_number.prix_abonnement_edf_annuel_maj_auto
            data:
              value: "{{ states('sensor.prix_abo_annuel_edf_2') }}"
            action: input_number.set_value
      - if:
          - condition: template
            value_template: >-
              {{ states('sensor.prix_du_kwh_jour_blanc_en_heures_creuses_2') not
              in ['unavailable', 'unknown'] and
              (states('sensor.prix_du_kwh_jour_blanc_en_heures_creuses_2') |
              float != states('input_number.heure_blanc_creuse_kwh') | float) }}
        then:
          - target:
              entity_id:
                - input_number.heure_blanc_creuse_kwh
            data:
              value: >-
                {{ states('sensor.prix_du_kwh_jour_blanc_en_heures_creuses_2')
                }}
            action: input_number.set_value
      - if:
          - condition: template
            value_template: >-
              {{ states('sensor.prix_du_kwh_jour_blanc_en_heures_pleines_2') not
              in ['unavailable', 'unknown'] and
              (states('sensor.prix_du_kwh_jour_blanc_en_heures_pleines_2') |
              float != states('input_number.heure_blanc_pleine_kwh') | float) }}
        then:
          - target:
              entity_id:
                - input_number.heure_blanc_pleine_kwh
            data:
              value: >-
                {{ states('sensor.prix_du_kwh_jour_blanc_en_heures_pleines_2')
                }}
            action: input_number.set_value
      - if:
          - condition: template
            value_template: >-
              {{ states('sensor.prix_du_kwh_jour_rouge_en_heures_pleines_2') not
              in ['unavailable', 'unknown'] and
              (states('sensor.prix_du_kwh_jour_rouge_en_heures_pleines_2') |
              float != states('input_number.heure_rouge_pleine_kwh') | float) }}
        then:
          - target:
              entity_id:
                - input_number.heure_rouge_pleine_kwh
            data:
              value: >-
                {{ states('sensor.prix_du_kwh_jour_rouge_en_heures_pleines_2')
                }}
            action: input_number.set_value
      - if:
          - condition: template
            value_template: >-
              {{ states('sensor.prix_du_kwh_jour_rouge_en_heures_creuses_2') not
              in ['unavailable', 'unknown'] and
              (states('sensor.prix_du_kwh_jour_rouge_en_heures_creuses_2') |
              float != states('input_number.heure_rouge_creuse_kwh') | float) }}
        then:
          - target:
              entity_id:
                - input_number.heure_rouge_creuse_kwh
            data:
              value: >-
                {{ states('sensor.prix_du_kwh_jour_rouge_en_heures_creuses_2')
                }}
            action: input_number.set_value
      - if:
          - condition: template
            value_template: >-
              {{ states('sensor.prix_du_kwh_jour_bleu_en_heures_creuses_2') not
              in ['unavailable', 'unknown'] and
              (states('sensor.prix_du_kwh_jour_bleu_en_heures_creuses_2') |
              float != states('input_number.heure_bleu_creuse_kwh') | float) }}
        then:
          - target:
              entity_id:
                - input_number.heure_bleu_creuse_kwh
            data:
              value: "{{ states('sensor.prix_du_kwh_jour_bleu_en_heures_creuses_2') }}"
            action: input_number.set_value
      - if:
          - condition: template
            value_template: >-
              {{ states('sensor.prix_du_kwh_jour_bleu_en_heures_pleines_2') not
              in ['unavailable', 'unknown'] and
              (states('sensor.prix_du_kwh_jour_bleu_en_heures_pleines_2') |
              float != states('input_number.heure_bleu_pleine_kwh') | float) }}
        then:
          - target:
              entity_id:
                - input_number.heure_bleu_pleine_kwh
            data:
              value: "{{ states('sensor.prix_du_kwh_jour_bleu_en_heures_pleines_2') }}"
            action: input_number.set_value

Tu noteras que les actions se déroulent en parallèle. C’est à dire que si l’un des capteurs nommés change d’état, l’ensemble des actions de lance. Puis, pour chacune d’elle, ça vérifie si la valeur qui remonte n’est pas invalide ou indisponible, avant de la mettre à jour.

Tu dois donc modifier ton automatisation actuelle pour y copier ce code, avant de l’adapter suivant le nom des capteurs que tu as créé.

Cela répond il à ta question ?

Merci @n3fansub pour ton retour si précis, en effet cela répond parfaitement à la demande, je constate que l’on peut ainsi bien faire en une seule automatisation, la mise à jour des 7 valeurs y compris l’abonnement donc c’est une très bonne chose.

Un petite question, le “ET si” facultatif avec la valeur :

Doit être utile dans ton cas, mais si j’ai bien compris le code, il n’est pas obligatoire d’avoir un et si facultatif ici pour les 7 valeurs puisque l’on va tester chaque valeur plus loin dans le code.

Car initialement ton code de tutoriel en Et si facultatif c’était pour tester que valeur invalide. Ou alors j’ai loupé un truc.

Et oui c’est bon à savoir que l’on peut faire des actions en parallèles.

@Batmat86 , en fait cette partie, c’est pour vérifier que ma box est bien connectée à internet au moment ou l’état change. Ainsi, si la box est KO, alors ne pas mettre à jour la valeur car elle sera forcément indisponible.

Elle n’est pas obligatoire en soit, mais c’est un garde-fou en plus que j’ai préféré mettre en place.

1 « J'aime »

@n3fansub, Bonjour merci pour ton explication, je n’avais pas répondu, car j’avais bien compris le principe et je ne pouvais pas vraiment adapter à mon cas, n’ayant que peu d’information accessible de ma box sous HA (Freebox ultra, bon j’ai pu couper et activer le wifi à ma présence dans le logement, déjà cà).

Je reviens vers toi, puisque la source des données à savoir Kelwatt a changé la page de son site, par conséquent, va falloir tout adapter de nouveau. Pour l’étape ou tu dis qu’il faut regarder via le css c’est en faisant afficher le code source sur la page internet ?

Car j’aimerai pouvoir comprendre et me mettre à jour mon code …

J’avoue que j’avais pensé à un moment, de peut être faire plus simple pour récupérer les tarifs tempo via RTE Tempo, mais il n’a que les 6 tarifs pour les plages horaires, il n’y a pas le prix de l’abonnement en fonction de l’abonnement, et j’aime bien avoir mon coût d’abonnement sur mon dashboard Energy que j’avais pu mettre en place grace à toi …

Bonjour,

C’est le souci de “scrape”, dès que site évolue, il y a de grande chance que le système tombe

Dans l’exemple ici, ce n’est pas très grave, le nombre de mise à jour des tarifs n’est pas non plus tous les jours, pour ma part je repasse en “manuel” !

C’était une option intéressante, toujours sympa de découvrir un truc, et rien ne dit qu’une solution n’apparaisse pas dans quelques temps :grinning_face:

Salut

Les sensors scrape était indisponible, mais depuis hier ils sont revenus.

1 « J'aime »

Effectivement, la grille des tarifs est revenue sur la page Kelwat :+1:

@Batmat86

Bonjour et meilleurs vœux,

Concernant le code, c’est des balises CSS qui sont utilisées dans la structure de la page. Avec f12, depuis un navigateur, tu peux les voir.

Et l’index sert à indiquer si c’est le premier code css correspondant sur cette page, ou si c’est le 2eme, 3 ème, etc… (une balise peut être utilisée plusieurs fois)

Pour ce qui est des tarifs, effectivement, comme c’est en ligne, on est dépendant du site internet. D’où la sécurité mise en place en cas de valeur indisponible. Le seul cas où ça peut poser problème, c’est si le site change la structure de la page pour ajouter un nouveau tableau ou de nouvelles colonnes.

Ici, la page n’a été indisponible que le 31/12, avant d’être mise à jour, sauf erreur de ma part. Tu confirmes ? Abonnement et tarifs HP/hc ?

Si t’as d’autres questions, n’hésite pas. Je passe de temps à autre voir si y a des messages.

2 « J'aime »

Bonjour,

C’est pour ça qu’il faut sélectionner un site le plus fiable possible. Si EDF mettait sur son propre site le coût de l’abonnement Tempo, ou via l’api, je pourrais utiliser les données directement à la source. Mais comme c’est pas le cas, que Selectra est une entité fiable et que kelwatt lui appartient et tire ses données de Selectra, je pense qu’on peut difficilement trouver mieux pour le coup.

A voir le changement prévu pour le 1er février, comment la page sera mise à jour…

2 « J'aime »

Oui, tout est revenu !

Je crois qu’en fait, le principal problème c’est …. l’impatience :blush:

1 « J'aime »

Bonjour à tous,

N’étant plus client Tempo, pouvez vous me faire un retour suite à la MAJ tarifaire du 01/02/26, svp ?
Est ce que tout s’est bien mis à jour tout seul ? Satisfaits ?

Merci d’avance.

Salut

Hier la mise a jour ne s’est pas faite.

Du coup, je l’ai fait a la main.

Mais aujourd’hui la mise a jour des tarifs par hellowat (scrappe) a eu lieu et les prix ont bien changé.

1 « J'aime »

Salut,

Ok, merci pour le retour.
Donc pour résumer, c’est fonctionnel, mais y a un délai de 24/48h avant changement lorsque le tarif évolue.

Si on accepte cette latence, alors on a plus besoin de se préoccuper de la maj des tarifs abonnement et kwh.

1 « J'aime »

La grille tarifaire officielle, et mise à jour le jour J est dispo ici :

Par contre, je ne sais pas s’il est possible de scrapper un fichier pdf depuis HA.