[Concours] Facture d'électricité dynamique

Bonjour à tous et meilleurs vœux 2025,
Voici ma solution pour suivre en permanence sa facture d’électricité et ne plus être surpris (désagréablement) par sa facture d’énergie.


J’ai tenté de faire simple et facile, à la portée de tous.
Il s’agit de faire trois copié/collé afin d’avoir sa facture d’électricité dynamique sur son dashboard.

PRE-REQUIS : il vous faut un capteur sur votre compteur d’électricité afin de recueillir en temps réel les index de consommation.
Dans mon cas, j’ai un module filaire de Teleinformation Cartelectronique qui me fournit les entités Heures Creuses et Heures Pleines. Si vous avez un abonnement Tempo ou autre, il faudra adapter les variables.

Principe :
A la réception de la facture d’électricité, on repart sur une nouvelle période de facturation.
Il faut donc modifier la valeur (ligne initial: ) des input_number, entités déclarées dans configuration.yaml :

  • Index HP et HC : Il s’agit des index retenus pour clôturer votre dernière facture et donc
    débuter la nouvelle
  • Tarifs HP et HC : le côut TTC du kWh facturé
  • Tarif abonnement mensuel : L’abonnement mensuel TTC
  • Date de la dernière facture : Format YYY-MM-DD

C’est parti !

Tout d’abord, si ce n’est déja fait, je vous conseille, pour plus de clarté, de créer un fichier template.yaml dans /homeassistant et de placer la ligne suivante dans le fichier configuration.yaml :

template: !include template.yaml

Insérer le code suivant dans votre fichier template.yaml :
Remplacer avant tout les deux entités
sensor.teleinfo_022164498820_hchc
sensor.teleinfo_022164498820_hchp
par vos entités provenant de votre module de téléinfo

#
#  Facture électricité dynamique
#  @nissa33 12/2024
#
# Code à insérer dans template.yaml 
# On retire ici du compteur HC/HP les index HP/HC de la dernière facture
# Heures Creuses
#
- sensor:
    - name: hc_sur_facture_en_cours
      unit_of_measurement: "kWh"
      device_class: energy
      state_class: total_increasing
      state: >
        {% set temp = states('sensor.teleinfo_022164498820_hchc') | round(default=0) %}
        {% set temp2 = states('input_number.dernier_index_hc') | round(default=0) %}
        {{ (temp / 1000) - temp2 | round(default=0) }}
#
# Heures Pleines
- sensor:
    - name: hp_sur_facture_en_cours
      unit_of_measurement: "kWh"
      device_class: energy
      state_class: total_increasing
      state: >
        {% set temp = states('sensor.teleinfo_022164498820_hchp') | round(default=0) %}
        {% set temp2 = states('input_number.dernier_index_hp') | round(default=0) %}
        {{ (temp / 1000) - temp2 | round(default=0) }}      
#
# Calcul du montant des HP et HC
# Montant HC
#
- sensor:
    - name: montant_hc_sur_facture_en_cours
      unit_of_measurement: "€"
      state_class: total_increasing
      state: >
        {{ states('sensor.hc_sur_facture_en_cours') | round(0) * states('input_number.tarif_heures_creuses') | round(4) | round(4) }}
# Montant HP
#
- sensor:
    - name: montant_hp_sur_facture_en_cours
      unit_of_measurement: "€"
      state_class: total_increasing
      state: >
        {{ states('sensor.hp_sur_facture_en_cours') | round(0) * states('input_number.tarif_heures_pleines') | round(4) | round(4) }}
#
# Calcul nombre de mois d'abo
#
- sensor:
    - name: nombre_mois_abo
      unit_of_measurement: "mois"
      state: >
        {% set date = states('input_datetime.date_derniere_facture') %}
        {% set date = strptime(date, '%Y-%m-%d') %}
        {% set today = now() %}
        {{ today.year*12+today.month - (date.year*12+date.month) }}
#
# Montant abonnement en cours
#
- sensor:
    - name: montant_abo_sur_facture_en_cours
      unit_of_measurement: "€"
      state_class: total_increasing
      state: >
        {% set temp = states('sensor.nombre_mois_abo') | round(default=0) %}
        {% set temp2 = states('input_number.abonnement_mensuel_electicite') | float(default=2) %}
        {{ (temp2 * temp) | float(default=2) }}
# Montant total HP + HC + Abonnement
- sensor:
    - name: total_facture_electrique
      unit_of_measurement: "€"
      state_class: total_increasing
      state: >
        {% set temp = states('sensor.montant_hc_sur_facture_en_cours') | float(default=2) %}
        {% set temp2 = states('sensor.montant_hp_sur_facture_en_cours') | float(default=2) %}
        {% set temp3 = states('sensor.montant_abo_sur_facture_en_cours') | float(default=2) %}        
        {{ (temp + temp2 + temp3) | float(default=2) }}

Insérer le code suivant dans votre fichier configuration.yaml :

#
#  Facture électricité dynamique
#  @nissa33 12/2024
#
# Code à insérer dans configuration.yaml 
# Entités à valeur fixe 
# saisir les nouvelles données (ligne initial: )
# A MODIFIER uniquement à réception de la facture annuelle d'électricité, 
#
input_number:
# Indexs figurants sur la dernière facture 
  dernier_index_hc:
    name: Index Heures creuses
    initial: 10145
    max: 999999
    min: 0
    unit_of_measurement: kWh
#
  dernier_index_hp:
    name: Index heures pleines
    initial: 10279
    max: 999999
    min: 0
    unit_of_measurement: kWh
#
# Tarifs TTC : Attention pas de virgule, mais un point
#
  tarif_heures_creuses:
    name: Tarif heures creuses
    initial: 0.1656
    max: 99
    min: 0.0001
    unit_of_measurement: "€"
#
  tarif_heures_pleines:
    name: Tarif heures pleines
    initial: 0.2288
    max: 99
    min: 0.0001
    unit_of_measurement: "€"
#
# Cout mensuel TTC de l'abonnement
#
  abonnement_mensuel_electicite:
    name: Abonnement electrique mensuel
    initial: 20.13
    max: 99999
    min: 0
    unit_of_measurement: "€"
#
# Date : format YYYY-MM-DD
#
input_datetime:
  date_derniere_facture:
     name: Date derniere facture electricite
     has_date: true
     initial: 2024-06-22
#

Recharger sa configuration YAML (Outils de développement / Toute la configuration YAML)

Insérer le code suivant sur votre dashboard :

type: custom:vertical-stack-in-card
cards:
  - type: custom:text-divider-row
    text: Ma facture d'électricté dynamique
    align: center
  - type: entities
    entities:
      - entity: sensor.hc_sur_facture_en_cours
        type: custom:multiple-entity-row
        name: Heures Creuses
        icon: mdi:hours-12
        show_state: false
        entities:
          - entity: sensor.hc_sur_facture_en_cours
            name: false
            format: precision0
            styles:
              color: blue
          - entity: sensor.montant_hc_sur_facture_en_cours
            name: false
            format: precision2
            styles:
              color: red
      - entity: sensor.hp_sur_facture_en_cours
        type: custom:multiple-entity-row
        name: Heures Pleines
        icon: mdi:hours-24
        show_state: false
        entities:
          - entity: sensor.hp_sur_facture_en_cours
            name: false
            format: precision0
            styles:
              color: blue
          - entity: sensor.montant_hp_sur_facture_en_cours
            name: false
            format: precision2
            styles:
              color: red
      - entity: sensor.montant_abo_sur_facture_en_cours
        type: custom:multiple-entity-row
        name: Abonnement
        icon: mdi:currency-eur
        show_state: false
        entities:
          - entity: sensor.nombre_mois_abo
            name: false
            format: precision0
            styles:
              color: blue
          - entity: sensor.montant_abo_sur_facture_en_cours
            name: false
            format: precision2
            styles:
              color: red
      - entity: sensor.total_facture_electrique
        type: custom:multiple-entity-row
        name: Total
        icon: mdi:currency-eur
        show_state: false
        entities:
          - entity: sensor.total_facture_electrique
            name: false
            format: precision2
        card_mod:
          style: |
            :host {
              --mdc-icon-size: 20px;
              color:black;
            }        
    card_mod:
      style: |
        .card-content div {
          margin-top: 0px !important;
          margin-bottom: 0px  !important;
          
        }
        ha-card {
          margin-top: -25px;
          background: transparent;
        }

Voilà c’est terminé, merci de me faire part de vos remarques.
A+

9 « J'aime »