Bonjour, voici mon 1er vrai tuto merci d’être indulgent
Version mise à jour le 26/02/2024
Ce tuto sera amené à évoluer, n’hésitez pas à aimer le post ou apporter des suggestions
- Lien GITHUB : Lien github énergie : code complet
Les différentes Valeurs connues / Étapes :
-
Obtenir sa consommation soutirée du réseau instantanée (ex: Zlinky)
-
Obtenir sa production solaire instantanée ( dans mon cas le module Ecu_R de Apsystem)
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 ?
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 quesensor.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 desensor.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 quesensor.ecu_current_power
soit :0
Alors, le code calcule la moyenne quotidienne de consommation d’énergie en utilisant la dernière valeur connue desensor.moyenne consomation electrique
, qui est égale à1800.0
W.
Pour intégrer un capteur dans le dashboard energy il va nous faloir 3 étapes:
-
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 :
-
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 !
-
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.
-
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'
-
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.
-
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.
-
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