Bonjour je poste ce code que m’a envoyé mon cousin parce que je trouve que ça fait un sacré morceau et pas mal de boulot.
Je n’en ai pas l’usage, n’ayant pas de panneaux et ayant un compteur EDF tarif ‹ bleu › unique 24H/24.
mon cousin ne créera pas un tuto explicatif alors je trouve dommage que tout ça ‹ se perde › si ça peut être utilisé ou modifié par quelqu’un pour ses besoins.
ne posez pas de question je ne saurais y répondre. Et si les modérateurs trouvent ma démarche incongrue : pas de problèmes, ils suppriment je ne serais pas vexé.
Si j’ai bien compris ça régule le courant injecté par ses panneaux en fonction des besoins et en privilégiant la chauffe du cumulus.
Voici les différents morceaux de code pour ma régulation zero injection , en tenant compte de la priorité de régulation de mon routeur pour le cumulus :
alias: Activation Zéro Injection au lever du soleil
description: ""
triggers:
- event: sunrise
offset: "+00:01:00"
trigger: sun
conditions:
- condition: state
entity_id: input_boolean.activation_zero_injection
state: "off"
actions:
- target:
entity_id: input_boolean.activation_zero_injection
action: input_boolean.turn_on
- data:
name: Zéro Injection PV
message: >-
☀️ Régulation Zéro Injection réactivée automatiquement au lever du
soleil
entity_id: input_boolean.activation_zero_injection
action: logbook.log
mode: single
alias: Bascule mode régulation fine selon température cumulus
description: >-
Active ou désactive le mode régulation fine selon la température du cumulus et
la consigne réglable
triggers:
- entity_id: sensor.temperature_cumulus_corrigee
trigger: state
- minutes: /5
trigger: time_pattern
conditions: []
actions:
- variables:
temperature: "{{ states('sensor.temperature_cumulus_corrigee') | float }}"
seuil: "{{ states('input_number.consigne_temperature_cumulus') | float }}"
- choose:
- conditions:
- condition: template
value_template: "{{ temperature >= seuil }}"
sequence:
- target:
entity_id: input_boolean.mode_regulation_fine
action: input_boolean.turn_on
- conditions:
- condition: template
value_template: "{{ temperature < (seuil - 7) }}"
sequence:
- target:
entity_id: input_boolean.mode_regulation_fine
action: input_boolean.turn_off
mode: single
alias: Calcul consigne proportionnelle (test)
description: Calcule la consigne sans l'appliquer, pour test et affichage
triggers:
- seconds: /30
trigger: time_pattern
conditions:
- condition: state
entity_id: input_boolean.activation_zero_injection
state: "on"
actions:
- target:
entity_id: input_number.consigne_calculee
data:
value: >
{% set injection = states('sensor.puissance_preleve_reseau_relatif') |
float %} {% set seuil = states('input_number.seuil_injection_max') |
float %} {% set p_max = states('input_number.puissance_onduleur_max') |
float %} {% set p_min = states('input_number.puissance_onduleur_min') |
float %}
{% if injection < seuil %}
{% set ratio = (seuil - injection) / abs(seuil) %}
{% set ajustement = p_max - (ratio * (p_max - p_min)) %}
{{ ajustement | round(0) }}
{% else %}
{{ p_max }}
{% endif %}
action: input_number.set_value
mode: single
alias: Mise à jour moyenne injection (avec facteur réglable)
description: ""
triggers:
- minutes: /1
trigger: time_pattern
actions:
- variables:
ancienne: "{{ states('input_number.injection_moyenne') | float }}"
nouvelle: "{{ states('sensor.puissance_preleve_reseau_relatif') | float }}"
facteur: "{{ states('input_number.facteur_moyenne_injection') | float }}"
moyenne: "{{ ((ancienne * (facteur - 1)) + nouvelle) / facteur }}"
- target:
entity_id: input_number.injection_moyenne
data:
value: "{{ moyenne | round(1) }}"
action: input_number.set_value
mode: single
alias: Régulation Zéro Injection (avec priorité chauffe cumulus)
description: ""
triggers:
- minutes: /1
trigger: time_pattern
conditions:
- condition: state
entity_id: input_boolean.activation_zero_injection
state: "on"
actions:
- variables:
injection: "{{ states('input_number.injection_moyenne') | float }}"
seuil: "{{ states('input_number.seuil_injection_max') | float }}"
p_max: "{{ states('input_number.puissance_onduleur_max') | float }}"
p_min: "{{ states('input_number.puissance_onduleur_min') | float }}"
temp_cumulus: "{{ states('sensor.sonde_temperature_cumulus_temperature') | float }}"
consigne_temp_cumulus: "{{ states('input_number.consigne_temperature_cumulus') | float }}"
consigne_actuelle: "{{ states('number.dtu_limite_de_puissance') | float }}"
- variables:
facteur_amorti: >
{% set delta = consigne_temp_cumulus - temp_cumulus %} {% if delta > 10
%}
0.2
{% elif delta > 5 %}
0.4
{% elif delta > 2 %}
0.6
{% else %}
{{ states('input_number.facteur_amortissement') | float }}
{% endif %}
- target:
entity_id: input_number.facteur_amortissement_actif
data:
value: "{{ facteur_amorti }}"
action: input_number.set_value
- variables:
consigne_nouvelle: |
{% if injection < seuil %}
{% set ratio = (seuil - injection) / (seuil | abs) %}
{% set ratio_limited = [ratio, 1] | min %}
{% set ajustement = p_max - (ratio_limited * (p_max - p_min) * facteur_amorti) %}
{% set ajustement_lisse = ajustement | round(2) %}
{% if ajustement_lisse < p_min %}
{{ p_min }}
{% else %}
{{ ajustement_lisse }}
{% endif %}
{% else %}
{{ p_max }}
{% endif %}
- choose:
- conditions:
- condition: template
value_template: >
{{ (consigne_nouvelle | float - consigne_actuelle | float) | abs >
1 }}
sequence:
- target:
entity_id: number.dtu_limite_de_puissance
data:
value: "{{ consigne_nouvelle }}"
action: number.set_value
- target:
entity_id: input_number.consigne_calculee
data:
value: "{{ consigne_nouvelle }}"
action: input_number.set_value
- data:
name: Zéro Injection PV
message: >
⚡ Injection moyenne : {{ injection }} W 🎯 Seuil : {{ seuil }}
W 🌡️ Température cumulus : {{ temp_cumulus }}°C 🎯 Consigne
chauffe : {{ consigne_temp_cumulus }}°C 🧠 Facteur amorti : {{
facteur_amorti }} ✅ Consigne ajustée à {{ consigne_nouvelle
}} %
entity_id: number.dtu_limite_de_puissance
action: logbook.log
mode: single
Une des carte de mon dashbord pour le pilotage:
type: vertical-stack
cards:
- type: conditional
conditions:
- entity: input_boolean.verrou_reglages_zero_injection
state: "on"
card:
type: entities
title: ⚙️ Contrôle Zéro Injection
entities:
- entity: input_boolean.activation_zero_injection
name: Activer automatisation
- entity: sensor.puissance_preleve_reseau_relatif
name: Puissance réseau (W)
- entity: number.dtu_limite_de_puissance
name: Limite onduleur (%)
- entity: input_boolean.verrou_reglages_zero_injection
name: 🔒 Verrou réglages (activé)
- type: conditional
conditions:
- entity: input_boolean.verrou_reglages_zero_injection
state: "off"
card:
type: entities
title: ⚙️ Contrôle Zéro Injection
entities:
- entity: input_boolean.activation_zero_injection
name: Activer automatisation
- entity: sensor.puissance_preleve_reseau_relatif
name: Puissance réseau (W)
- entity: number.dtu_limite_de_puissance
name: Limite onduleur (%)
- entity: input_boolean.verrou_reglages_zero_injection
name: 🔓 Verrou réglages (désactivé)
- type: conditional
conditions:
- entity: input_boolean.verrou_reglages_zero_injection
state: "off"
card:
type: entities
title: 🎛️ Réglages Zéro Injection
entities:
- entity: input_number.seuil_injection_max
name: Seuil injection max (W)
- entity: input_number.puissance_onduleur_max
name: Puissance max onduleur (%)
- entity: input_number.puissance_onduleur_min
name: Puissance min onduleur (%)
Une carte pour les graphiques :
type: vertical-stack
cards:
- type: entities
title: ⚙️ Pilotage Zéro Injection
entities:
- entity: input_boolean.activation_zero_injection
name: 🔘 Mode Zéro Injection
- entity: input_boolean.mode_regulation_fine
name: ⚙️ Mode régulation fine
- entity: input_number.consigne_temperature_cumulus
name: 🎯 Seuil température cumulus (°C)
- type: entities
title: 🔍 Supervision en direct
entities:
- entity: sensor.sonde_temperature_cumulus_temperature
name: 🌡️ Température cumulus (°C)
- entity: sensor.puissance_preleve_reseau_relatif
name: ⚡ Injection réseau (W)
- entity: input_number.consigne_calculee
name: 📐 Consigne calculée (%)
- type: markdown
content: >
**🧠 Ratio de régulation** : {% set injection =
states('sensor.puissance_preleve_reseau_relatif') | float %} {% set seuil
= states('input_number.seuil_injection_max') | float %} {% set seuil_abs =
(seuil if seuil > 0 else -seuil) %} {% if injection < seuil %}
{% set ratio = ((seuil - injection) / seuil_abs) %}
{% set ratio_limited = (1 if ratio > 1 else ratio) %}
{{ (ratio_limited * 100) | round(1) }} %
{% else %}
0 %
{% endif %}
- type: history-graph
title: 📈 Historique régulation & température
hours_to_show: 12
refresh_interval: 60
entities:
- entity: sensor.puissance_preleve_reseau_relatif
- entity: input_number.consigne_calculee
- entity: number.dtu_limite_de_puissance
- entity: sensor.sonde_temperature_cumulus_temperature