Régulation injection de courant de panneaux solaires en fonction de la consommation

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

L’intention de partager est louable. En revanche ce script sans les variables ou capteurs associés, ça ne servira pas à grand chose. Surtout si tu n’es pas en mesure d’expliquer la logique.

Et aussi, tu as posté des informations personnelles avec le code partagé, il va falloir expurger ça.

Bref, si ton cousin n’a pas envie de partager, je crois qu’il faut juste respecter ça.

C’est pas qu’il n’a pas envie (il est plutôt serviable) c’est qu’il n’a pas le temps : dans la famille on dit qu’il est le seul à faire tenir 48 H dans une journée tellement il fait de choses.

sur le plan du contenu je n’ai rien vu qui permette de l’identifier ?

Ah si : il y avait un bout d’un autre code qu’il m’ envoyé (pour controler la charge USB et Smartphones par switch USB) je l’ai viré

1 « J'aime »

maintenant je peux aussi tout supprimer. vous me dites.