[Tuto] Optimiser la gestion de sa production Solaire

Bonjour, voici mon 1er vrai tuto merci d’être indulgent :stuck_out_tongue:

Version mise à jour le 26/02/2024

Ce tuto sera amené à évoluer, n’hésitez pas à aimer le post ou apporter des suggestions

L’objectif de ce tutoriel :

1. Surveiller sa consommation d’énergie électrique et de production solaire en temps réel. Identifier les sources de gaspillage et de trouver des moyens de réduire sa consommation d’énergie.

2. Détecter des anomalies telles que des appareils défectueux ou des fuites de courant. Croiser les données de production solaire, afin de suivre la quantité d’énergie solaire générée et consommée, ainsi que la quantité d’énergie exportée et importée vers le réseau.

3. Cela peut aider à mieux comprendre leur utilisation d’énergie et à prendre des mesures pour économiser de l’énergie et réduire leur facture d’électricité.

Les différentes Valeurs connues / Étapes :

  • Obtenir sa consommation soutirée du réseau instantanée (ex: Zlinky)
    image

  • Obtenir sa production solaire instantanée ( dans mon cas le module Ecu_R de Apsystem)

Problèmatique :
Comment obtenir la valeur consommation instantanée quand la production solaire altère la valeur soutirée du réseau et que tu ne fais que de l’auto-consommation ?

Étape 1:

Calculer la consommation moyenne d’énergie quotidienne.

Sensor(capteur) utilisés :

  • Un capteur qui surveille la consommation électrique en temps réel : « sensor.zlinky_sinsts ».
  • Un capteur qui surveille la production solaire : « sensor.ecu_current_power »

Cela va nous donnée la valeur la plus précise possible !

Voici un tutoriel étape par étape pour comprendre et utiliser ce code :

  • Valeur a modifier dans le code suivant en fonction de votre installation : *"0.15"
{% elif consommation_reseau == 0 %}
                {% set consommation_corrigee = moyenne_consommation_horssolaire * (1 + (production_solaire / (moyenne_consommation_horssolaire))*0.15) %}
              {% endif %}
  • cette ligne de code calcule la consommation corrigée en fonction de la moyenne de consommation hors solaire. Elle ajuste la consommation en fonction de la production solaire pour obtenir une estimation plus précise de la consommation réelle.

  • A Modifier selon vos envis exemple :
    {% set consommation_corrigee = moyenne_consommation_horssolaire * (1 + (production_solaire / (moyenne_consommation_horssolaire))*0.15) %}
    (augmente de 15% la valeur de la consommation corrigé.)

Exemple : si pour vous entre la nuit et la journée (hors période de grosse conso four, lave linge ect…) votre consommation électrique peux évoluer dans votre foyer jusqu’a 15% de + que hors période solaire (la nuit) Alors modifier le nombre 10 → 15 ect…

CODE STATISTICS / CONSOMMATION MOYENNE
# Création de valeur moyenne statistics
sensor:
  - platform: statistics
    entity_id: sensor.consommation_electrique_corrigee #capteur de mesure de consommation_electrique_corrigee
    name: "Moyenne consommation électrique" #nom du capteur final
    #sampling_size: 576 #288
    max_age:
      minutes: 30
    state_characteristic: mean

  - platform: statistics
    entity_id: sensor.zlinky_sinsts #capteur Zlinky lissé sur 1 journée avec influence de production solaire
    name: "Moyenne conso zlinky" #nom du capteur final
    #sampling_size: 2880 #288
    max_age:
      hours: 24
    state_characteristic: mean

##############################################################################
###     Consommation Moyenne Electrique Corrigée
##############################################################################
  
      - name: "consommation_electrique_corrigee"
        unique_id: "Consommation électrique corrigée"
        unit_of_measurement: "Wh"
        state: >-
          {% set consommation_reseau = states('sensor.zlinky_sinsts')|float(default=0) %}
          {% set production_solaire = states('sensor.ecu_current_power')|float(default=0) %}
          {% set moyenne_consommation_horssolaire = states('sensor.moyenne_conso_zlinky')|float(default=0) %}
          {% set consommation_corrigee = states('sensor.consommation_electrique_corrigee')|float(default=0) %}
          {% set last_updated_ecu = states.sensor.ecu_current_power.last_updated %}
          {% set last_updated_zlinky = states.sensor.zlinky_sinsts.last_updated %}
          {% set minutes_since_update_ecu = ((as_timestamp(now()) - as_timestamp(last_updated_ecu)) / 60)|int(default=0) %}
          {% set minutes_since_update_zlinky = ((as_timestamp(now()) - as_timestamp(last_updated_zlinky)) / 60)|int(default=0) %}
          {% if production_solaire > 0 %}
            {% if minutes_since_update_ecu <= 15 %}
              {% if consommation_reseau > 0 %}
                {% set consommation_corrigee = production_solaire + consommation_reseau %}
                {% if 0.70 * moyenne_consommation_horssolaire <= consommation_corrigee <= 1.30 * moyenne_consommation_horssolaire %}
                  {% set consommation_corrigee = consommation_corrigee %}
                {% elif 1.3 * moyenne_consommation_horssolaire < consommation_corrigee < 2 * moyenne_consommation_horssolaire %}
                  {% set consommation_corrigee = consommation_reseau %} 
                {% elif consommation_corrigee >= 2 * moyenne_consommation_horssolaire %}
                  {% set consommation_corrigee = consommation_corrigee %}
                {% else %}
                  {% set consommation_corrigee = moyenne_consommation_horssolaire %}
                {% endif %}
              {% elif consommation_reseau == 0 %}
                {% set consommation_corrigee = moyenne_consommation_horssolaire * (1 + (production_solaire / (moyenne_consommation_horssolaire))*0.15) %}
              {% endif %}
            {% else %}
              {{ moyenne_consommation_horssolaire }}
            {% endif %}
          {% elif production_solaire == 0 %}
            {% if minutes_since_update_zlinky <= 15 %}
              {% set consommation_corrigee = consommation_reseau %}
            {% endif %}
          {% endif %}          
          {{ consommation_corrigee }}
  • Configuration du capteur de statistiques pour la consommation électrique moyenne :

    • Utilisation de la plateforme « statistics ».
    • L’entité associée est :« sensor.consommation_electrique_corrigee ».
    • Nom du capteur : « Moyenne consommation électrique ».
    • Les données sont limitées à la dernière demi-heures.
  • Définition du capteur de consommation électrique corrigée le + important :

**Guide du fonctionemment**

1. Capteurs et Variables Initiales :
consommation_reseau: Capteur de consommation récupéré depuis sensor.zlinky_sinsts.
production_solaire: Capteur de production solaire récupéré depuis sensor.ecu_current_power.
moyenne_consommation_horssolaire: Moyenne de consommation hors solaire récupérée depuis sensor.moyenne_conso_zlinky.
consommation_corrigee: Variable représentant la consommation électrique corrigée, initialement définie à partir du capteur existant sensor.consommation_electrique_corrigee.
last_updated_ecu: Temps de la dernière mise à jour du capteur de production solaire.
last_updated_zlinky: Temps de la dernière mise à jour du capteur de consommation.
minutes_since_update_ecu: Minutes écoulées depuis la dernière mise à jour du capteur de production solaire.
minutes_since_update_zlinky: Minutes écoulées depuis la dernière mise à jour du capteur de consommation.

2. Logique Conditionnelle - Production Solaire Supérieure à 0 :
Si la production solaire est en cours (production_solaire > 0).
Vérifie si les capteurs ont été mis à jour dans les 15 dernières minutes (minutes_since_update_ecu <= 15).
Si la consommation réseau est supérieure à 0 (consommation_reseau > 0), calcule la consommation corrigée en ajoutant la production solaire à la consommation réseau.
Applique des conditions pour ajuster la consommation corrigée en fonction de la moyenne de consommation hors solaire.

3. Logique Conditionnelle - Production Solaire Égale à 0 :
Si la production solaire est égale à 0, le code vérifie si le capteur de consommation reseau a été mis à jour dans les 15 dernières minutes.
Si la production solaire est nulle, la consommation corrigée est basée uniquement sur la consommation réseau, et aucune production solaire n’est ajoutée à cette estimation. Cette approche simplifiée est utilisée pour les périodes où aucune énergie solaire n’est générée.

4. Calcul de la Consommation Corrigée :
Selon les conditions précédentes, la consommation_corrigee est définie pour représenter la consommation électrique corrigée.

5. Renvoi de la Valeur Finale :
La valeur finale de consommation_corrigee est renvoyée, représentant la consommation électrique corrigée en fonction des conditions et des calculs effectués.

La logique globale du code vise à ajuster la consommation électrique en tenant compte de la production solaire et des conditions spécifiques pour obtenir une estimation corrigée de la consommation.

Exemple 1 : Supposons que les valeurs de sensor.zlinky_sinsts soient : 1000, 1200, 1400, 1600, 1800 Supposons que sensor.ecu_current_power soit : 2000 Alors, le code calcule la moyenne quotidienne de consommation d’énergie en ajoutant la production d’énergie solaire (2000 W) à la dernière valeur de sensor.zlinky_sinsts (1800 W) si elle est différente inférieur ou égale/supérieur ou égale +/-50% de la moyenne zlinky, pour obtenir une nouvelle valeur de 3800 W. Ensuite, cette nouvelle valeur est ajoutée à la liste pour calculer la moyenne quotidienne de consommation d’énergie, qui est égale à 2200.0 W.

Exemple 2 : Supposons que les valeurs de sensor.zlinky_sinsts soient : 1000, 1200, 1400, 1600, 1800 Supposons que sensor.ecu_current_power soit : 0 Alors, le code calcule la moyenne quotidienne de consommation d’énergie en utilisant la dernière valeur connue de sensor.moyenne consomation electrique, qui est égale à 1800.0 W.

Etape 2:

Obtenir les valeurs Importation et exportation d’énergie:

:warning:
Pour intégrer un capteur dans le dashboard energy il va nous faloir 3 étapes:

  1. Creer le capteur « energy_exporting » qui calculera la quantité d’électricité que vous exportez vers le réseau en soustrayant votre production solaire à votre consommation électrique moyenne actuelle :

  2. Creer un capteur statistics « hours_energy_exporting » qui calcule la moyenne dans heures des valeurs du capteur « energy_exporting » (cette valeur va nous afficher une valeur net et fidèle !

  3. Creer une automatisation qui va aller chercher a toute les fin de chaque heure xxH59 minutes la valeurs la plus exacte et l’ajouter à la valeur précedente dans un input_number (cumul heure après heure.

  4. Le capteur Finale : —> le daily_energy_exported <-----
    Il va colleter les valeurs moyenne exporté de chaque heure et les renvoyé au dashboard energy (simple et efficace).

CODE ETAPE 2 : IMPORT / EXPORT
template:
  - sensor: #Capteur compatible dashboard energy
     # calcul power export
      - name: energy_exporting
        state: "{{ (max(states.sensor.ecu_current_power.state |float |round(2) - states.sensor.moyenne_consommation_electrique.state |float |round(2),0) /1000) }}"
        unit_of_measurement: 'kWh'
        device_class: energy
        state_class: total_increasing
        icon: 'mdi:flash'
        unique_id: 'énergy_export'
        

      # calcul power import (consomation live) - (production PV Live)
      - name: energy_importing
        state: "{{ (max(states.sensor.consommation_electrique_corrigee.state |float | round(2) - states.sensor.ecu_current_power.state |float | round(2), 0) /1000) }}"
        unit_of_measurement: 'kWh'
        device_class: energy
        state_class: total_increasing
        icon: 'mdi:flash'
    ##################################
    ### Moyenne energy hours export ##
    ##################################

  - platform: statistics
    entity_id: sensor.energy_exporting #capteur energy exporté moyenne /1h = (solaire - consommation_electrique_corrigee)
    name: "hours energy exporting" #nom du capteur final
    max_age: 
      hours: 1
    state_characteristic: mean
#######################
##  Automatisation   ##      
#######################
# Relève la valeur exportée moyenne dans l'heure et ajoute la valeur à la précédente dans un input_number

automation:
  alias: "[Update] daily exporté "
  description: ""
  trigger:
    - platform: time_pattern
      minutes: "59"
  condition:
    - condition: template
      value_template: "{{ now().minute == 59 }}"
  action:
    - service: input_number.set_value
      data_template:
        value: >-
          {{ (states('input_number.daily_export') | float(0) |round(2)) + (states('sensor.hours_energy_exporting') | float(0) |round(2)) }}
      target:
        entity_id: input_number.daily_export
  mode: single

#######################
##   input_number     ##      
#######################
input_number:
  daily_export:
    name: daily_export
    initial: 0
    min: 0
    max: 999
# Création capteur statistics energy "daily_energy_export"        
      - name: daily_energy_exported
        state: "{{ states.input_number.daily_export.state |float(0) |round(2) }}"
        unit_of_measurement: 'kWh'
        device_class: energy
        state_class: total_increasing
        icon: 'mdi:flash'     

Etape 3 :

La Notification

  1. Cette automatisation a pour objectif de surveiller la production solaire actuelle et de notifier l’utilisateur lorsque la production dépasse ou n’atteint pas certains seuils. La notification contiendra des informations sur la quantité d’énergie produite et des suggestions sur les appareils électroménagers pouvant être utilisés en fonction de la quantité d’énergie produite.

  2. Plus précisément, l’automatisation est déclenchée chaque fois que l’état du capteur de puissance solaire actuelle change ou à 23h55 chaque jour. Il y a également des conditions pour s’assurer que la présence de l’utilisateur est détectée et que l’écart entre la production solaire actuelle et une valeur seuil prédéfinie ne dépasse pas 200 watts.

  3. En fonction de la production solaire actuelle, l’automatisation déclenchera différentes actions qui incluent l’envoi de notifications avec des messages différents en fonction des seuils atteints et la mise à jour d’une entité de type « input_number » qui stockera la valeur de production solaire actuelle. Si l’automatisation est déclenchée après 23h55, la valeur stockée dans « input_number » sera réinitialisée à 0.

Anti-spam: condition ajouter: intervalle de 30 minutes entre chaque nouvelle notification

  - condition: template
    value_template: >-
      {{ (now() -
      states.input_text.last_notification_solaire.last_changed).total_seconds()
      / 60 > 30 }}
CODE AUTOMATISATION NOTIFICATION
############################
###     Input_number     ###
############################
input_number:
  ecu_r:
    name: Ecu-R
    initial: 0
    min: 0
    max: 10000

alias: "[NOTIFY] Production Solaire"
description: ""
trigger:
  - platform: state
    entity_id:
      - sensor.energy_exporting_wh
  - platform: time
    at: "23:55:00"
condition:
  - condition: state
    entity_id: binary_sensor.presence_home
    state: "on"
    for:
      hours: 0
      minutes: 0
      seconds: 0
  - condition: or
    conditions:
      - condition: template
        value_template: >-
          {{ states('sensor.ecu_current_power')|float >
          states('input_number.ecu_r')|float + 350}}
      - condition: template
        value_template: >-
          {{ states('sensor.ecu_current_power')|float <
          states('input_number.ecu_r')|float - 350}}
  - condition: template
    value_template: >-
      {{ (now() -
      states.input_text.last_notification_solaire.last_changed).total_seconds()
      / 60 > 30 }}
action:
  - choose:
      - conditions:
          - condition: numeric_state
            entity_id: sensor.ecu_current_power
            above: 451
            below: 850
        sequence:
          - service: input_number.set_value
            data_template:
              value: "{{states('sensor.ecu_current_power') }}"
            target:
              entity_id: input_number.ecu_r
          - parallel:
              - if:
                  - condition: state
                    entity_id: person.marine
                    state: home
                then:
                  - service: notify.mobile_app_redmi_note_10s
                    data:
                      title: ⚡Production solaire légère
                      message: >-
                        ⛅ Production : {{ states('sensor.ecu_current_power')
                        }}wh dont <b>{{states('sensor.energy_exporting_wh') }}wh
                        en surplus</b>\n ℹ️ Ideal pour : Lampe, Televiseur,
                        Ordinateur portable
              - if:
                  - condition: state
                    entity_id: person.quentin
                    state: home
                then:
                  - service: notify.mobile_app_redmi_note_8_pro
                    data:
                      title: ⚡Production solaire légère
                      message: >-
                        ⛅ Production : {{ states('sensor.ecu_current_power')
                        }}wh dont <b>{{states('sensor.energy_exporting_wh') }}wh
                        en surplus</b>\n ℹ️ Ideal pour : Lampe, Televiseur,
                        Ordinateur portable
          - service: input_text.set_value
            target:
              entity_id: input_text.last_notification_solaire
            data:
              value: "{{ states('sensor.hour_minute') }}"
      - conditions:
          - condition: numeric_state
            entity_id: sensor.ecu_current_power
            above: 851
            below: 1300
        sequence:
          - service: input_number.set_value
            data_template:
              value: "{{states('sensor.ecu_current_power') }}"
            target:
              entity_id: input_number.ecu_r
          - parallel:
              - if:
                  - condition: state
                    entity_id: person.marine
                    state: home
                then:
                  - service: notify.mobile_app_redmi_note_10s
                    data:
                      title: ⚡Production moyenne
                      message: >-
                        ⛅ Production : {{ states('sensor.ecu_current_power')
                        }}wh dont <b>{{states('sensor.energy_exporting_wh') }}wh
                        en surplus</b>\n ℹ️ Ideal pour : Fer à repasser,
                        Micro-onde, Aspirateur, Lave-linge, Grille-pain,
                        Bouilloire..
              - if:
                  - condition: state
                    entity_id: person.quentin
                    state: home
                then:
                  - service: notify.mobile_app_redmi_note_8_pro
                    data:
                      title: ⚡Production moyenne
                      message: >-
                        ⛅ Production : {{ states('sensor.ecu_current_power')
                        }}wh dont <b>{{states('sensor.energy_exporting_wh') }}wh
                        en surplus</b>\n ℹ️ Ideal pour : Fer à repasser,
                        Micro-onde, Aspirateur, Lave-linge, Grille-pain,
                        Bouilloire..
          - service: input_text.set_value
            target:
              entity_id: input_text.last_notification_solaire
            data:
              value: "{{ states('sensor.hour_minute') }}"
      - conditions:
          - condition: numeric_state
            entity_id: sensor.ecu_current_power
            above: 1300
        sequence:
          - service: input_number.set_value
            data_template:
              value: "{{states('sensor.ecu_current_power') }}"
            target:
              entity_id: input_number.ecu_r
          - parallel:
              - if:
                  - condition: state
                    entity_id: person.marine
                    state: home
                then:
                  - service: notify.mobile_app_redmi_note_10s
                    data:
                      title: ⚡Production importante
                      message: >-
                        ⛅ Production : {{ states('sensor.ecu_current_power')
                        }}wh dont <b>{{states('sensor.energy_exporting_wh') }}wh
                        en surplus</b>\n ℹ️ Ideal pour : Four électrique,
                        Chauffage, Plaque de cuisson...
              - if:
                  - condition: state
                    entity_id: person.quentin
                    state: home
                then:
                  - service: notify.mobile_app_redmi_note_8_pro
                    data:
                      title: ⚡Production importante
                      message: >-
                        ⛅ Production : {{ states('sensor.ecu_current_power')
                        }}wh dont <b>{{states('sensor.energy_exporting_wh') }}wh
                        en surplus</b>\n ℹ️ Ideal pour : Four électrique,
                        Chauffage, Plaque de cuisson...
          - service: input_text.set_value
            target:
              entity_id: input_text.last_notification_solaire
            data:
              value: "{{ states('sensor.hour_minute') }}"
      - conditions:
          - condition: time
            after: "23:55:00"
        sequence:
          - service: input_number.set_value
            data:
              value: 0
            target:
              entity_id: input_number.ecu_r
mode: single
  • Optimisation du code de l’automatisation
17 « J'aime »

Super intéressant merci bien

le 24/04/2023
Refonte du code de calcul dû au limite de home assistant pour l’instant et moi même en nombre de cheveux arraché :stuck_out_tongue: .

Calcul de la moyenne qui reflète dans cette situation la valeur la plus précise donc j’ai eu recoure à l’intégration de home assistant ‹ statistics ›(merci à @papoo pour la suggestion )idéal pour ce cas.
L’intégration est directement reliés à l’historique du sensor et dans mon cas va regarder les dernières 24h.

Maj du 02/05/2023:

Ajout des capteurs « UTILITY METER »
Objectif: avoir un collecteur de donnée sur une période (journée, semaine, mois …)

Le capteur Exporting (journée, semaine …) doit être ajouté au tableau de bord energy.

# Utility Meters pour historisation
utility_meter:
#### Energy importée ###
  daily_energy_imported:
    source: sensor.energy_importing
    cycle: daily  
  weekly_energy_imported:
    source: sensor.energy_importing
    cycle: weekly 
### Energy exportée ###
  daily_energy_exported:
    source: sensor.energy_exporting
    cycle: daily
  weekly_energy_exported:
    source: sensor.energy_exporting
    cycle: weekly

Résultat d’une journée passé:

Et voilà, après une bonne petite journée de soleil et qq automations pour ré balancer le surplus sur la PAC piscine et le véhicule électrique. Vive le solaire!

2 « J'aime »

Bonjour

Très interessant, merci.
Je suis dans la meme situation avec un panneau Sunology qui produit en autoconsommation, et j’ai enfin réussi à rajouter la prise dans le dashboard energy
Du coup je vais acheter un Lixee, pour pouvoir faire le differentiel
Mais un point m’interpelle dans ton calcul : à priori si tu produis trop en solaire, ta consommation recalculee sera toujours = 0 … puisqu’on va tomber dans ce cas :

   {% else %}
            {% set consommation_corrigee = max(consommation_reseau - production_solaire, 0) %}

Sachant que consommation_reseau = 0 … Donc le max sera 0
Ca ne donne donc pas la consommation reelle de la maison
Ou alors j’ai raté quelque chose ?

Oui effectivement j’ai passé tellement la tête dedans que j’ai pas fait attention à cette partie.

Après je te rassure dans le calcul du capteur statistiques il ne retient que les variables non nul donc différent de 0. Avec utility meter.

Cela n’exclut pas que je te remercie pour ton intervention reste à voir ce que l’on peux y mettre en remplacement

oui c’est toute la difficulté avec le panneau solaire en auto consommation qui vient du coup gommer la consommation reelle du logement.
Et c’est cette valeur que je cherche à trouver, puisque c’est ce qui me permettra de savoir ce que je produis en trop pour pouvoir allumer le bon equipement (charge voiture sur faible intensité par exemple, ou pompe piscine par ex)
A moins que le Lixee ne donne la valeur reinjectée gratuitement dans le reseau ? (et du coup on aurait directement la bonne valeur) ?

Malheureusement non la valeur réinjecté n’est pas communiqué Sans contract.

La solution dans l’immédiat c’est de s’appuyer sur la consommation moyenne qu’affiche le capteur « statistiques » vue que c’est la consommation moyenne dans ce cas de figure.

En tout cas pour ma part après avoir fait le test durant plusieurs jours le code est stable et affiche une valeur plutôt fidèle et va jusqu’à gommer les fausses notes.

Je vais modifier le code sur cette partie après le travail :smiling_face:

Arg … Merci beaucoup pour tes réponses
Dans mon cas j’essaie de surproduire legerement, mais du coup la journée je suis tres souvent en consommation logement à 0 … (mais parce que c’est effacé par la production des panneaux solaires).
Donc la valeur moyenne va etre tres fortement diminuée … et donc ca va me dire que j’autoconsomme tres peu …
Je vais peut etre plutot ajuster en prenant par exemple consommation_recalculée = (production_solaire-10%), quand la valeur de consommation_reseau=0
A voir dans le temps si je trouve mieux, je posterai ici

Cela dépend effectivement de le dimensionnement de ton installation solaire et si ta consommation en journée est proche de celle en veille donc la nuit.

La moyenne calculé durant la nuit sans solaire te servira alors de base pour le calcul de la moyenne la journée

Maj: 10/05/2023:
1 - Si la production solaire est supérieure à zéro et la consommation du réseau est supérieure à zéro, la consommation corrigée est calculée en ajoutant la production solaire à la consommation du réseau.

2 - Si la production solaire est nulle, la consommation corrigée est simplement égale à la consommation du réseau.

3 - Si la production solaire est supérieure à zéro et la consommation du réseau est nulle, la consommation corrigée est évaluée à l’aide de la valeur de la moyenne de la consommation électrique calculée par le capteur de statistiques.

  - platform: template
    sensors:
      consommation_electrique_corrigee:
        friendly_name: "Consommation électrique corrigée"
        unit_of_measurement: "VA"
        value_template: >-
          {% set consommation_reseau = states('sensor.zlinky_sinsts') | float(0) %}
          {% set production_solaire = states('sensor.ecu_current_power') | float(0) %}
          {% set consommation_corrigee = 0 %}
          {% if production_solaire > 0 and consommation_reseau > 0 %}
            {% set consommation_corrigee = production_solaire + consommation_reseau %}
          {% elif production_solaire == 0 %}
            {% set consommation_corrigee = consommation_reseau %}
          {% else %}
            {% set consommation_corrigee = states('sensor.moyenne_consommation_electrique') |float(0) %}
          {% endif %}
          {{ consommation_corrigee }}        

MAJ: 12/05/2023
Après vérification j’apporte cette modification :
Avant:
Si production solaire > 0 et consommation réseau > 0 alors on ajoute les deux production + solaire = somme
Maintenant
Si production solaire > 0 et consommation reseau > 0 alors on calcul d’abord les deux (production + consommation) = valeurs cumulé

Ensuite on vérifier si cette « valeur cumulé » >=(supérieur ou égale) 2x la valeur du capteur « statistics » qui calcule la moyenne si c’est OUI alors on affiche la « valeur cumulé » SINON on affiche la valeur du « sensor statistics » équivalent à la moyenne de consommation sur la journée.

Pourquoi :
Car j’ai remarqué que le sensor consommation et production ne se mettent parfois pas a jour en même temps et que souvent quand les deux ont des valeurs > 0 c’est durant un temps limité (selon si votre installation est bien dimensionné) donc c’est une valeur qui risque de faussé le calcul pour une erreur de synchronisation des capteurs ou un simple piques de consommation.

Pour que la valeur soit la plus fidèle alors on va vérifié si elle peut être considéré comme vrai consommation non habituelle (four, micro-onde, toaster ect…) et si oui alors on va porter attention à cette valeur car elle apporte de la fidélité au calcul.

Voici le code modifié:

- platform: template
  sensors:
    consommation_electrique_corrigee:
      friendly_name: "Consommation électrique corrigée"
      unit_of_measurement: "VA"
      value_template: >-
        {% set consommation_reseau = states('sensor.zlinky_sinsts') | float(0 if states('sensor.zlinky_sinsts') == 'unavailable' else states('sensor.zlinky_sinsts')) %}
        {% set production_solaire = states('sensor.ecu_current_power') | float(0 if states('sensor.ecu_current_power') == 'unavailable' else states('sensor.ecu_current_power')) %}
        {% set consommation_electrique_corrigee = states('sensor.consommation_electrique_corrigee') | float(0 if states('sensor.consommation_electrique_corrigee') == 'unavailable' else states('sensor.consommation_electrique_corrigee')) %}
        {% set moyenne_consommation_electrique = states('sensor.moyenne_consommation_electrique') | float(0 if states('sensor.moyenne_consommation_electrique') == 'unavailable' else states('sensor.moyenne_consommation_electrique')) %}
        {% set consommation_corrigee = 0 %}
        {% if production_solaire > 0 and consommation_reseau > 0 %}
          {% set consommation_corrigee = production_solaire + consommation_reseau %}
          {% if consommation_corrigee >= 2 * consommation_electrique_corrigee %}
            {% set consommation_corrigee = consommation_corrigee %}
          {% else %}
            {% set consommation_corrigee = moyenne_consommation_electrique %}
          {% endif %}
        {% elif production_solaire == 0 %}
          {% set consommation_corrigee = consommation_reseau %}
        {% else %}
          {% set consommation_corrigee = moyenne_consommation_electrique %}
        {% endif %}
        {{ consommation_corrigee }}

J’ai repensé à notre échange et j’apporte un grand changement (je viens de finir ce soir donc en phase de test pour le moment.

MAJ : 15/05/2023

  • Vérification si les capteurs ont été mise a jour (- 10 minutes)
  • Dans le cas ou il y a une valeur production > 0 et consommation > 0 pour éviter tout valeurs qui viendrait faussé on vérifier si la valeur est 50% supérieur ou inférieur à la valeurs actuelle sinon on garde la valeur actuelle (car c’est une valeur très ponctuelle ( - 10 minutes ).

Voici une explication ligne par ligne de la dernière condition :

{% if production_solaire > 0 and consommation_reseau == 0 %} : C'est la condition principale qui vérifie si la production solaire est supérieure à 0 et la consommation du réseau est égale à 0.

Cela calcule la valeur du "palier" en soustrayant la moyenne de la consommation électrique de la puissance solaire installée, puis en divisant par 15.

Puis calcule le pourcentage en divisant la production solaire par le palier, puis en le divisant à nouveau par 100.

Enfin, le calcule la consommation corrigée en multipliant la moyenne de la consommation électrique par (1 + pourcentage). Cela ajuste la consommation en fonction de la production solaire et du palier.

En résumé, cette partie du code permet de calculer la consommation corrigée lorsque la production solaire est présente mais la consommation du réseau est nulle, en ajustant la consommation en fonction de la production solaire et de la puissance solaire installée en variant jusqu’à +15% de la consommation.

Valeur à modifier:

{% set puissance_solaire_installee = 2400 %} # dans mon cas 2400 watt crête
- platform: template
  sensors:
    consommation_electrique_corrigee:
      friendly_name: "Consommation électrique corrigée"
      unit_of_measurement: "VA"
      value_template: >-
        {% set consommation_reseau = states('sensor.zlinky_sinsts')|float(default=0) %}
        {% set production_solaire = states('sensor.ecu_current_power')|float(default=0) %}
        {% set consommation_electrique_corrigee = states('sensor.consommation_electrique_corrigee')|float(default=0) %}
        {% set moyenne_consommation_electrique = states('sensor.moyenne_conso_zlinky')|float(default=0) %}
        {% set puissance_solaire_installee = 2400 %}
        {% set consommation_corrigee = 0 %}
        {% set last_updated_ecu = states.sensor.ecu_current_power.last_updated %}
        {% set last_updated_zlinky = states.sensor.zlinky_sinsts.last_updated %}
        {% set minutes_since_update_ecu = ((as_timestamp(now()) - as_timestamp(last_updated_ecu)) / 60)|int(default=0) %}
        {% set minutes_since_update_zlinky = ((as_timestamp(now()) - as_timestamp(last_updated_zlinky)) / 60)|int(default=0) %}
        {% if last_updated_ecu and last_updated_zlinky and minutes_since_update_ecu <= 10 %}
          {% if production_solaire > 0 and consommation_reseau > 0 %}
            {% set consommation_corrigee = production_solaire + consommation_reseau %}
            {% if consommation_corrigee >= 0.5 * moyenne_consommation_electrique or consommation_corrigee <= 1.5 * moyenne_consommation_electrique %}
              {% set consommation_corrigee = consommation_corrigee %}
            {% else %}
              {% set consommation_corrigee = moyenne_consommation_electrique %}
            {% endif %}
          {% elif production_solaire > 0 and consommation_reseau == 0 %}
            {% set consommation_corrigee = moyenne_consommation_horssolaire * (1 + (production_solaire / (puissance_solaire_installee - moyenne_consommation_horssolaire))*0.4) %}
          {% elif production_solaire == 0 %}
            {% set consommation_corrigee = consommation_reseau %}
          {% endif %}
        {% endif %}
        {{ consommation_corrigee }}

Maj : 28/05/2023

  • Conseil : vérifier l’unité de mesure de vos capteurs solaire pour uniformiser en W, Wh, Kwh, Va ect…
  • Modification sur les capteurs export / import:
    • Valeur = 0 si valeur négative afin d’éviter les anomalies.
    • Meilleurs compatibilité en cas de chaines de caractères.
template:
  - sensor:
     # calcul power export
      - name: energy_exporting
        state: "{{ max(states.sensor.ecu_current_power.state | float(default=0) - states.sensor.moyenne_consommation_electrique.state | float(default=0),0 ) }}"
        unit_of_measurement: 'W'
        device_class: energy
        state_class: total_increasing
        icon: 'mdi:flash'
        unique_id: 'énergy_export'
        

      # calcul power import (consomation live) - (production PV Live)
      - name: energy_importing
        state: "{{ max(states.sensor.consommation_electrique_corrigee.state | float(default=0) - states.sensor.ecu_current_power.state | float(default=0), 0) }}"
        unit_of_measurement: 'W'
        device_class: energy
        state_class: total_increasing
        icon: 'mdi:flash'

Maj: 29/05/2023

Optimisation et correction:
Dans le cas ou il n’y à pas de production solaire (la nuit) on va exclure la vérification de last_updated pour (capteur de production solaire) afin d’obtenir la valeur du Zlinky (soutirée du réseau).

  - platform: template
    sensors:
      consommation_electrique_corrigee:
        friendly_name: "Consommation électrique corrigée"
        unit_of_measurement: "W"
        value_template: >-
          {% set consommation_reseau = states('sensor.zlinky_sinsts')|float(default=0) %}
          {% set production_solaire = states('sensor.ecu_current_power')|float(default=0) %}
          {% set moyenne_consommation_horssolaire = states('sensor.moyenne_conso_zlinky')|float(default=0) %}
          {% set puissance_solaire_installee = 2400 %}
          {% set consommation_corrigee = 0 %}
          {% set last_updated_ecu = states.sensor.ecu_current_power.last_updated %}
          {% set last_updated_zlinky = states.sensor.zlinky_sinsts.last_updated %}
          {% set minutes_since_update_ecu = ((as_timestamp(now()) - as_timestamp(last_updated_ecu)) / 60)|int(default=0) %}
          {% set minutes_since_update_zlinky = ((as_timestamp(now()) - as_timestamp(last_updated_zlinky)) / 60)|int(default=0) %}
          {% if production_solaire > 0 %}
            {% if last_updated_ecu and last_updated_zlinky and minutes_since_update_ecu <= 15 %}
              {% if consommation_reseau > 0 %}
                {% set consommation_corrigee = production_solaire + consommation_reseau %}
                {% if consommation_corrigee >= 0.5 * moyenne_consommation_horssolaire or consommation_corrigee <= 1.5 * moyenne_consommation_horssolaire %}
                  {% set consommation_corrigee = consommation_corrigee %}
                {% else %}
                  {% set consommation_corrigee = moyenne_consommation_horssolaire %}
                {% endif %}
              {% elif consommation_reseau == 0 %}
                {% set consommation_corrigee = moyenne_consommation_horssolaire * (1 + (production_solaire / (puissance_solaire_installee - moyenne_consommation_horssolaire))*0.4) %}
              {% endif %}
            {% endif %}
          {% elif production_solaire == 0 %}
            {% if last_updated_zlinky and minutes_since_update_zlinky <= 15 %}
              {% set consommation_corrigee = consommation_reseau %}
            {% endif %}
          {% endif %}          
          {{ consommation_corrigee }}

Bonjour,
J’ai ajouté les lignes des étapes 1 et 2 dans mon fichier configuration.yaml et je n’arrive pas à utiliser le sensor dans le dashboard énergie, je ne peux pas le sélectionner, il n’apparait pas dans la liste.

Dans les paramètres au niveau des entités j’ai un logo d’erreur indisponible.

pouvez-vous m’aider ?
merci

Oui c’est moi, j’ai remarqué que le dashboard energy n’accepte pas les unités en « w » …
j’envoie la correction dès que possible :+1:

1 « J'aime »

Sujet Beaucoup plus complexe que prévu finalement.

voici les capteurs pour @Daywalker :

#########################################
template:
  - sensor: #Capteur compatible dashboard energy
     # calcul power export
      - name: energy_exporting
        state: "{{ (max(states.sensor.ecu_current_power.state |float |round(2) - states.sensor.moyenne_consommation_electrique.state |float |round(2),0) /1000) }}"
        unit_of_measurement: 'kWh'
        device_class: energy
        state_class: total_increasing
        icon: 'mdi:flash'
        unique_id: 'énergy_export'
        

      # calcul power import (consomation live) - (production PV Live)
      - name: energy_importing
        state: "{{ (max(states.sensor.consommation_electrique_corrigee.state |float | round(2) - states.sensor.ecu_current_power.state |float | round(2), 0) /1000) }}"
        unit_of_measurement: 'kWh'
        device_class: energy
        state_class: total_increasing
        icon: 'mdi:flash'

Version Beta test qui devrai fonctionner j’ai juste - 24h de test.

Avec Home assistant les capteurs ne font qu’afficher des valeurs et les mètres à jour. Cependant, si la valeur est en kWh et que vous avez eu 5 valeurs mise a jour au cours de l’heure avec ce capteur difficile de récupéré 1 unique valeur qui soit la plus fidèle possible.

Exemple: Valeur du capteur energy exporté (kwh) = 2 puis 5 puis 2 puis 3
Combien de kWh ais-je exporté durant l’heure écoulé ? car si on additionne les valeurs alors la valeur final sera erroné donc il nous faut creer une moyenne de valeurs exporté dans l’heure.

    ##################################
    ### Moyenne energy hours export ##
    ##################################

  - platform: statistics
    entity_id: sensor.energy_exporting #capteur energy exporté moyenne /1h = (solaire - consommation_electrique_corrigee)
    name: "hours energy exporting" #nom du capteur final
    max_age: 
      hours: 1
    state_characteristic: mean
    #sampling_size: 1 #nombre échantillonage

Parfait, désormais nous avons la valeurs moyenne qui est calculé toutes les heures pour être la plus juste et fidèle.
Sauf que cette valeur va elle aussi se mettre a jour et donc changer tout les X minutes durant l’heure de calcule…
Donc il nous faut capté la dernière valeurs présente avant la fin de l’heure qui s’écoule.

C’est là que l’automatisation entre en jeux à chaque xxh59 minutes mais il faut stocker cette valeur récupéré donc il nous faut un « input_number » qui va ajouter les valeurs de chaque heure de la journée pour obtenir la somme des valeurs (total) exporté => daily_energy_exported.

automation:
  alias: "[Update] daily exporté "
  description: ""
  trigger:
    - platform: time_pattern
      minutes: "59"
  condition:
    - condition: template
      value_template: "{{ now().minute == 59 }}"
  action:
    - service: input_number.set_value
      data_template:
        value: >-
          {{ (states('input_number.daily_export') | float(0) |round(2)) + (states('sensor.hours_energy_exporting') | float(0) |round(2)) }}
      target:
        entity_id: input_number.daily_export
  mode: single

#######################
##   input_number     ##      
#######################
input_number:
  daily_export:
    name: daily_export
    initial: 0
    min: 0
    max: 999

Enfin, comme le dashboard energy n’accepte pas toutes les capteurs il nous faut créer un capteur spécifique compatible qui va reprendre cette valeur et l’afficher.

# Création capteur statistics energy "daily_energy_export"        
      - name: daily_energy_exported
        state: "{{ states.input_number.daily_export.state |float(0) |round(2) }}"
        unit_of_measurement: 'kWh'
        device_class: energy
        state_class: total_increasing
        icon: 'mdi:flash' 

Je confirmerai avec screen a l’appui du dashboard :slight_smile:
avec le fichier .yaml complet pour les intéressé.

1 « J'aime »

Maj : 07/06/2023 (Version définitive)

Après +36 test et modification de code :exploding_head:

voici la version qui fonctionne à la perfection chez moi, j’invite ceux qui ont un appareil de mesure à faire le teste avec les paramétrage en adéquation de leurs installations et à faire un retour d’expérience.

Bonne journée à tous :slight_smile:

1 « J'aime »

Bonjour, ce tuto a l’air vraiment bien, mais une chose m’echappe… mon sensor.zlinky_sinsts en journée de production Solaire tombe rapidement a 0 (Solaire 2800W et conso maison residuelle hors conso four, chauffe etc…environ 300W)
du coup par jour de solail j’ai environ 10-11h ou le sensor.zlinky_sinsts est à 0…
je ne comprends pas bien comment il faut faire !
Merci de votre retour !