Intégration Solar Optimizer - Optimisation de sa consommation Solaire

Naissance d’une nouvelle intégration pour optimiser vos productions solaire. Elle est en tests depuis 2 semaines maintenant chez moi et comme elle marche bien, je me propose de vous en faire profiter.
Attention : elle est encore très jeune donc peut être pas parfaite.

Vos retours seront précieux pour faire avancer ce partage.

Elle est dispo ici (et sous HACS) : GitHub - jmcollin78/solar_optimizer: The Solar Optimizer integration for Home Assistant starts and stops your equipments depending on the Solar net production


GitHub Release
GitHub Activity
License
hacs
BuyMeCoffee

Icon

Tip Cette intégration permet d’optimiser l’utilisation de votre énergie solaire. Elle commande l’allumage et l’extinction de vos équipements dont l’activation est différable dans le temps en fonction de la production et de la consommation électrique courante.

Nouveau Nouveautés

  • release 1.3.0 :
    • ajout du paramètre duration_stop_min qui permet de spécifier une durée minimale de désactivation pour le distinguer du délai minimal d’activation duration_min. Si non spécifié, ce paramètre prend la valeur de duration_min.
    • restaure l’état des switchs enable au démarrage de l’intégration.
    • lance un calcul immédiatement après le démarrage de Home Assistant
  • release 1.0 : première version opérationnelle. Commande d’équipements basés sur des switchs, commande de puissance (Tesla) et paramétrage via configuration.yaml.

Qu’est-ce que Solar Optimizer ?

Cette intégration va vous permettre de maximiser l’utilisation de votre production solaire. Vous lui déléguez le contrôle de vos équipements dontl’activation peut être différée dans le temps (chauffe-eau, pompe de piscine, charge de véhicle électrique, lave-vaisselle, lave-linge, etc) et elle s’occupe de les lancer lorsque la puissance produite est suffisante.

Elle tente en permanence de minimiser l’import et l’export d’énergie en démarrant, stoppant, modifiant la puissance allouée à un équipement.

2 types d’équipements sont gérés :

  1. les équipements commandés par un switch (un service d’une manière générale) qui ont une puissance consommée fixe et pré-déterminée,
  2. les équipements dont la puissance de consommation est réglable (Tesla, Robotdyn). En réglant la puissance allouée à ces équipements, Solar Optimizer aligne la consommation sur la production au plus près.

L’idéal est d’avoir au moins un équipement dont la puissance est ajustable dans la liste des équipements gérés par Solar Optimizer.

Comment fonctionne-t-elle ?

Le fonctionnement est le suivant :

  1. à interval régulier (paramétrable), l’algorithme simule des modifications des états des équipements (allumé / éteint / puissance allouée) et calcule un coût de cette configuration. Globalement le coût est le a * puissance_importée + b * puissance_exportée. La coefficients a et b sont calculés en fonction du cout de l’électricité au moment du calcul,
  2. l’algorithme garde la meilleure configuration (celle qui a un cout minimum) et cherche d’autres solutions, jusqu’à ce qu’un minimum soit atteint.
  3. la meilleure configuration est alors appliquée.

L’algorithme utilisé est un algorithme de type recuit simulé dont vous trouverez une description ici : Recuit simulé — Wikipédia

Anti-bagot

Pour éviter les effets de bagottements d’un cycle à l’autre, un délai minimal d’activation est paramétrable par équipements. Par exemple : un chauffe-eau doit être activé au moins une heure pour que l’allumage soit utile, la charge d’une voiture électrique doit durer au moins deux heures, …

Utilisabilité

A chaque équipement configuré est associé une entité de type switch qui permet d’autoriser l’algorithme à utiliser l’équipement. Si je veux forcer la chauffe du ballon d’eau chauffe, je mets son switch sur off. L’algorithme ne le regardera donc pas, le chauffe-eau repasse en manuel, non géré par Solar Optimizer.

Par ailleurs, il est possible de définir une règle d’utilisabilité des équipements. Par exemple, si la voiture est chargée à plus de 90%, l’algorithme considère que l’équipement qui pilote la charge de la voiture doit être éteint. Cette régle est définit sous la forme d’un template configurable qui vaut True si l’équipement est utilisable.

Ces 2 règles permettent à l’algorithme de ne commander que ce qui est réellement utile à un instant t. Ces règles sont ré-évaluées à chaque cycle.

Comment on l’installe ?

HACS installation (recommendé)

  1. Installez HACS. De cette façon, vous obtenez automatiquement les mises à jour.
  2. Ajoutez ce repository Github en tant que repository personnalisé dans les paramètres HACS.
  3. recherchez et installez « Solar Optimizer » dans HACS et cliquez sur « installer ».
  4. Redémarrez Home Assistant.
  5. Ensuite, vous pouvez ajouter l’intégration de Solar Optimizer dans la page d’intégration. Vous ne pouvez installer qu’une seule intégration Solar Optimizer.

Installation manuelle

Une installation manuelle est possible. Elle n’est pas recommandée et donc elle ne sera pas décrite ici.

La configuration

Configurer l’intégration

Lors de l’ajout de l’intégration Solar Optimizer, la page de paramétrage suivante s’ouvre :

Vous devez spécifier :

  1. le sensor qui donne la consommation nette instantanée du logement (elle doit être négative si la production dépasse la consommation). Ce chiffre est indiqué en Watt,
  2. le sensor qui donne la production photovoltaïque instantanée en Watt aussi,
  3. un sensor ou input_number qui donne le cout du kwh importée,
  4. un sensor ou input_number qui donne le prix du kwh exortée (dépend de votre contrat),
  5. un sensor ou input_number qui donne la taxe applicable sur les kwh exortée (dépend de votre contrat)

Ces 5 informations sont nécessaires à l’algorithme pour fonctionner, elles sont donc toutes obligatoires. Le fait que ce soit des sensor ou input_number permet d’avoir des valeurs qui sont réévaluées à chaque cycle. En conséquence le passage en heure creuse peut modifier le calcul et donc les états des équipements puisque l’import devient moins cher. Donc tout est dynamique et recalculé à chaque cycle.

Configurer les équipements

Les équipements pilotables sont définis dans le fichier configuration.yaml de la façon suivante :

  • ajouter la ligne suivante dans votre configuration.yaml:

    solar_optimizer: !include solar_optimizer.yaml

  • et créez un fichier au même niveau que le configuration.yaml avec les informations suivantes :

algorithm:
  initial_temp: 1000
  min_temp: 0.1
  cooling_factor: 0.95
  max_iteration_number: 1000
devices:
  - name: "<nom de l'équipement>"
    entity_id: "switch.xxxxx"
    power_max: <puissance max consommée>
    check_usable_template: "{{ <le template qui vaut True si l'équipement est utilisable> }}"
    duration_min: <la durée minimale d'activation en minutes>
    duration_stop_min: <la durée minimale de desactivation en minutes>
    action_mode: "service_call"
    activation_service: "<service name>
    deactivation_service: "switch/turn_off"

Note: les paramètres sous algorithm ne doivent pas être touchés sauf si vous savez exactement ce que vous faites.

Sous devices il faut déclarer tous les équipements qui seront commandés par Solar Optimizer de la façon suivante :

attribut valable pour signification exemple commentaire
name tous Le nom de l’équipement « VMC sous-sol » -
entity_id tous l’entity id de l’équipement à commander « switch.vmc_sous_sol » -
power_max tous la puissance maximale consommée par l’équipement 250 -
check_usable_template tous Un template qui vaut True si l’équipement pourra être utilisé par Solar Optimizer « {{ is_state(‹ cover.porte_garage_garage ›, ‹ closed ›) }} » Dans l’exemple, Sonar Optimizer n’essayera pas de commander la « VMC sous-sol » si la porte du garage est ouverte
duration_min tous La durée en minute minimale d’activation 60 La VMC sous-sol s’allumera toujours pour une heure au minimum
duration_stop_min tous La durée en minute minimale de desactivation. Vaut duration_min si elle n’est pas précisée 15 La VMC sous-sol s’éteindra toujours pour 15 min au minimum
action_mode tous le mode d’action pour allumer ou éteindre l’équipement. Peut être « service_call » ou « event » (*) « service_call » « service_call » indique que l’équipement s’allume et s’éteint via un appel de service. Cf. ci-dessous. « event » indique qu’un évènement est envoyé lorsque l’état doit changer. Cf. (*)
activation_service uniquement si action_mode=« service_call » le service a appeler pour activer l’équipement sous la forme « domain/service » « switch/turn_on » l’activation déclenchera le service « switch/turn_on » sur l’entité « entity_id »
deactivation_service uniquement si action_mode=« service_call » le service a appeler pour désactiver l’équipement sous la forme « domain/service » « switch/turn_off » la désactivation déclenchera le service « switch/turn_off » sur l’entité « entity_id »

Pour les équipements à puissance variable, les attributs suivants doivent être valorisés :

attribut valable pour signification exemple commentaire
power_entity_id équipement à puissance variable l’entity_id de l’entité gérant la puissance number.tesla_charging_amps Le changement de puissance se fera par un appel du service change_power_service sur cette entité
power_min équipement a puissance variable La puissance minimale en watt de l’équipement 100 Lorsque la consigne de puissance passe en dessous de cette valeur, l’équipement sera éteint par l’appel du deactivation_service
power_step équipement a puissance variable Le pas de puissance 10 -
change_power_service équipement a puissance variable Le service a appelé pour changer la puissance "number/set_value" -
convert_power_divide_factor équipement a puissance variable Le diviseur a appliquer pour convertir la puissance en valeur 50 Dans l’exemple, le service « number/set_value » sera appelé avec la consigne de puissance / 50 sur l’entité entity_id

Exemple complet et commenté de la partie device :

devices:
  - name: "Pompe réservoir"
    # Le switch qui commande la pompe du réservoir
    entity_id: "switch.prise_pompe_reservoir"
    # la puissance de cette pompe
    power_max: 170
    # Toujours utilisable
    # check_usable_template: "{{ True }}"
    # 15 min d'activation minimum
    duration_min: 15
    # On active/desactive via un appel de service
    action_mode: "service_call"
    # Le service permettant d'activer le switch
    activation_service: "switch/turn_on"
    # Le service permettant de désactiver le switch
    deactivation_service: "switch/turn_off"

  - name: "Recharge Tesla"
    entity_id: "switch.cloucloute_charger"
    # La puissance minimale de charge est 660 W (soit 1 Amp car convert_power_divide_factor=660 aussi)
    power_min: 660
    # La puissance minimale de charge est 3960 W (soit 5 Amp (= 3960/600) )
    power_max: 3960
    # le step de 660 soit 1 Amp après division par convert_power_divide_factor
    power_step: 660
    # Utilisable si le mode de charge est "Solaire" et la voiture est branchée sur le chargeur et elle est chargée à moins de 90 % (donc ca s'arrête tout seul à 90% )
    check_usable_template: "{{ is_state('input_select.charge_mode', 'Solaire') and is_state('binary_sensor.tesla_wall_connector_vehicle_connected', 'on') and is_state('binary_sensor.tesla_charger', 'on') and states('sensor.tesla_battery') | float(100) < states('number.cloucloute_charge_limit') | float(90) }}"
    # 1 h de charge minimum
    duration_min: 60
    # 15 min de stop charge minimum
    duration_stop_min: 15
    # L'entité qui pilote l'ampérage de charge
    power_entity_id: "number.tesla_charging_amps"
    # 5 min minimum entre 2 changements de puissance
    duration_power_min: 5
    # l'activation se fait par un appel de service
    action_mode: "service_call"
    activation_service: "switch/turn_on"
    deactivation_service: "switch/turn_off"
    # le changement de puissance se fait par un appel de service
    change_power_service: "number/set_value"
    # le facteur permettant de convertir la puissance consigne en Ampères (number.tesla_charging_amps prend des Ampères)
    convert_power_divide_factor: 660
...

Tout changement dans la configuration nécessite un arrêt / relance de l’intégration (ou de Home Assistant) pour être pris en compte.

Entités disponibles

L’intégration, une fois correctement configurée, créée un appareil (device) qui contient plusieurs entités :

  1. un sensor nommé « total_power » qui est le total de toutes les puissances des équipements commandés par Solar Optimizer,
  2. un sensor nommé « best_objective » qui est la valeur de la fonction de coût (cf. fonctionnement de l’algo),
  3. un switch par équipements nommé switch.enable_solar_optimize_<name> déclarés dans le configuration.yaml. Si le switch est « Off », l’algorithme ne considérera pas cet équipement pour le calcul. Ca permet de manuellement sortir un équipement de la liste sans avoir à modifier la liste. Ce switch contient des attributs additionnels qui permettent de suivre l’état interne de l’équipement vu de l’algorithme.

En complément

En complément, le code Lovelace suivant permet de controller chaque équipement déclaré :

# A mettre en début de page
decluttering_templates:
  managed_device_power:
    default: null
    card:
      type: custom:expander-card
      expanded: false
      title-card-button-overlay: true
      title-card:
        type: custom:mushroom-template-card
        primary: "{{ state_attr('[[device]]', 'friendly_name') }}"
        secondary: "[[secondary_infos]]"
        icon: "[[icon]]"
        badge_icon: >-
          {% if is_state_attr('[[device]]','is_enabled', True) %}mdi:check{%
          else %}mdi:cancel{% endif %}
        badge_color: >-
          {% if is_state_attr('[[device]]', 'is_usable', True) and
          is_state_attr('[[device]]', 'is_enabled', True) %}green {% elif
          is_state_attr('[[device]]', 'is_enabled', False) %}red {% elif
          is_state_attr('[[device]]','is_waiting', True) %}orange {% elif
          is_state_attr('[[device]]', 'is_usable', False) or
          state_attr('[[device]]', 'is_usable') is none %}#A0B0FF{% else
          %}blue{% endif %}
        entity: "[[device]]"
        icon_color: >-
          {% if is_state('[[device]]', 'on')%}orange{% else %}lightgray{% endif
          %}
        tap_action:
          action: toggle
        hold_action:
          action: more-info
        double_tap_action:
          action: none
      cards:
        - type: custom:mushroom-chips-card
          chips:
            - type: entity
              entity: "[[enable_entity]]"
              double_tap_action:
                action: more-info
              tap_action:
                action: toggle
              hold_action:
                action: more-info
              icon_color: green
              content_info: name
        - type: markdown
          content: >-
            **Prochaine dispo** : {{ ((as_timestamp(state_attr('[[device]]',
            'next_date_available')) - as_timestamp(now())) / 60) | int }}
            min<br> **Prochaine dispo puissance**: {{
            ((as_timestamp(state_attr('[[device]]',
            'next_date_available_power')) - as_timestamp(now())) / 60) | int }}
            min<br> **Utilisable** : {{ state_attr('[[device]]', 'is_usable')
            }}<br> **Est en attente**  : {{ state_attr('[[device]]',
            'is_waiting') }}<br> **Puissance requise** : {{
            state_attr('[[device]]', 'requested_power') }} W<br> **Puissance
            courante** : {{ state_attr('[[device]]', 'current_power') }} W
          title: Infos
  managed_device:
    default: null
    card:
      type: custom:expander-card
      expanded: false
      title-card-button-overlay: true
      title-card:
        type: custom:mushroom-template-card
        primary: "{{ state_attr('[[device]]', 'friendly_name') }}"
        secondary: >-
          [[secondary_infos]] (max. {{ state_attr('[[device]]', 'power_max') }}
          W)
        icon: "[[icon]]"
        badge_icon: >-
          {% if is_state_attr('[[device]]','is_enabled', True) %}mdi:check{%
          else %}mdi:cancel{% endif %}
        badge_color: >-
          {% if is_state_attr('[[device]]', 'is_usable', True) and
          is_state_attr('[[device]]', 'is_enabled', True) %}green {% elif
          is_state_attr('[[device]]', 'is_enabled', False) %}red {% elif
          is_state_attr('[[device]]','is_waiting', True) %}orange {% elif
          is_state_attr('[[device]]', 'is_usable', False) or
          state_attr('[[device]]', 'is_usable') is none %}#A0B0FF{% else
          %}blue{% endif %}
        entity: "[[device]]"
        icon_color: >-
          {% if is_state('[[device]]', 'on')%}orange{% else %}lightgray{% endif
          %}
        tap_action:
          action: toggle
        hold_action:
          action: more-info
        double_tap_action:
          action: none
      cards:
        - type: custom:mushroom-chips-card
          chips:
            - type: entity
              entity: "[[enable_entity]]"
              double_tap_action:
                action: more-info
              tap_action:
                action: toggle
              hold_action:
                action: more-info
              icon_color: green
              content_info: name
        - type: markdown
          content: >-
            **Prochaine dispo** : {{ ((as_timestamp(state_attr('[[device]]',
            'next_date_available')) - as_timestamp(now())) / 60) | int }}
            min<br> **Utilisable** : {{ state_attr('[[device]]', 'is_usable')
            }}<br> **Est en attente**  : {{ state_attr('[[device]]',
            'is_waiting') }}<br> **Puissance requise** : {{
            state_attr('[[device]]', 'requested_power') }} W<br> **Puissance
            courante** : {{ state_attr('[[device]]', 'current_power') }} W
  enable_template:
    default: null
    card:
      type: custom:mushroom-chips-card
      chips:
        - type: entity
          entity: '[[enable_entity]]'
          double_tap_action:
            action: more-info
          tap_action:
            action: toggle
          hold_action:
            action: more-info
          icon_color: green
          content_info: none

puis à utiliser de la façon suivante :

          - type: vertical-stack
            cards:
              - type: custom:decluttering-card
                template: managed_device_power
                variables:
                  - device: switch.solar_optimizer_recharge_tesla
                  - secondary_infos: >-
                      {{ states('sensor.total_puissance_instantanee_twc_w') }} W
                      ({{ states('number.tesla_charging_amps')}} A)
                  - icon: mdi:ev-station
                  - enable_entity: switch.enable_solar_optimizer_recharge_tesla
              - type: custom:decluttering-card
                template: managed_device
                variables:
                  - device: switch.solar_optimizer_prise_recharge_voiture_garage
                  - secondary_infos: '{{ states(''sensor.prise_garage_voiture_power'') }} W'
                  - icon: mdi:power-socket-fr
                  - enable_entity: >-
                      switch.enable_solar_optimizer_prise_recharge_voiture_garage

Vous obtiendrez alors un composant permettant d’interagir avec l’équipement qui ressemble à ça :

Les contributions sont les bienvenues !

Si vous souhaitez contribuer, veuillez lire les directives de contribution


8 « J'aime »

Quelques résultats pour vous donner envie

sans optimisations :

avec optimisations en marche :

La consommation suit bien mieux la production. Il reste qqes écarts mais ils sont beaucoup plus lissés dans le temps.

6 « J'aime »

Superbe ! Merci
J’installe ça sous peu :slight_smile:

1 « J'aime »

Merci pour ce travail, j’installe ça et je vais le tester rapidement !

1 « J'aime »

@FranZ17 @Nad merci ! N’hésitez pas si vous avez des questions.

Ps: j’ai mis à jour les déclutering templates, si ca vous intéresse pour que les différents états soient plus visibles:
Par exemple :

  • coche verte: l’eqt est utilisable et « enablé »
  • sens interdit rouge: l’eqt n’est pas « enablé »

Franchement entre le module de chauffage et celui-ci : respect ! :+1:
La courbe est top, jolie résultat.

1 « J'aime »

Bonjour,
Merci beaucoup également pour ton travail !
Je vais également la tester ces prochaines semaines.
Tu as un système sous Enphase à tout hasard ?
Au plaisir d’échanger

Oui c’est mon cas aussi.

Pour info, les courbes d’hier avec la Tesla en charge toute la journée :

Ca marche pas mal si il n’y a pas trop de démarrages intempestifs d’éqt non controlables (machines à laver vers 17h par exemple)

Bonjour,
J’ai commencé à étudier la configuration mais je ne suis pas sûr de pouvoir correctement l’utiliser je m’explique.
L’idée est de piloter des appareils en fonction de la production et de la consommation en cours.
J’ai quelques appareils sur batterie comme un aspirateur ça peut fonctionner avec un switch mais pour des lave vaiselle lave linge et seche linge sans switch tu t’envoies une notification pour dire « le lave linge peut être lancé » par exemple ?
Par ailleurs je peux injecter le surplus sur ma pac pour mettre en surchauffe le circuit d’eau chaude et de chauffage.
Tu penses que je pourrais dire si tout est bien paramétré, « surproduction en cours, la batterie du robot est en charge, tout peut être lancé et le restant va sur la pac » ou « surproduction en cours, juste le lave vaiselle peut être lancé » par exemple ?

Bonjour,
Un peu nouveau sur HA… j’ai l’erreur suivante lorsque j’ajoute le code du chargeur

Cannot quick reload all YAML configurations because the configuration is not valid: Invalid config for [solar_optimizer]: Entity number.tesla_charging_amps belongs to domain number, expected [‹ input_number ›, ‹ sensor ›] for dictionary value @ data[‹ solar_optimizer ›][‹ devices ›][1][‹ power_entity_id ›]. Got ‹ number.tesla_charging_amps ›. (See /config/configuration.yaml, line 13).

Avez-vous une piste ? D’où vient le problème de

expected [‹ input_number ›, ‹ sensor ›] for dictionary value @ data[‹ solar_optimizer ›][‹ devices ›][1][‹ power_entity_id ›]

J’ai pris l’exemple tel quelle depuis le tuto.

Merci par avance pour votre aide

Bonsoir,
Je pense que c’est une erreur sur le format attendu peut être.
Ligne 13 de ton configuration.yaml il n’y a pas d’erreur de synthaxe ?

Bonjour @Nid_d_aigle ,

est-ce que tu peux poster ta configuration proprement indentée ici en utilisant bien le bouton
Capture d’écran 2023-08-22 à 07.01.58
qu’on voit clairement ce qui ne va pas. Merci !

Si les eqts ne sont pas démarrables directement par un switch, Solar Optimizer ne va pas pouvoir les démarrer automatiquement (lapalissade). Par contre, tu peux les configurer et si il doit les activer, il envoie un évènement qui peut être reçu dans une automatisation (par exemple). L’automatisation peut alors te notifier que l’appareil en question devrait être démarré. C’est pas idéal bien sur mais j’ai pas mieux. J’ai fais les évènements pour ça. Regarde le paramètre action_mode, mets le sur event.
L’évènement envoyé sera :
solar_optimizer_state_change_event : Solar Optimizer a changé l’état requis pour un eqt.

A noter que d’autres évènements sont envoyés et peuvent être utiles.
solar_optimizer_change_power_event : Solar Optimizer demande à changer la puissance
solar_optimizer_enable_state_change_event : le flag enable a été changé pour un eqt

Est-ce que tu peux moduler la puissance que tu envoies à ton circuit d’eau chaude ? Si oui, c’est parfait et il faut utiliser la configuration des eqt à puissance variable (cf. README) - ca a été étudié pour. Si non, tu pourras juste l’allumer ou l’éteindre à la puissance max. Sinon j’ai vu passer dans le forum un diy avec du robodyn pour faire ça (moduler la puissance de sortie en fonction d’une entrée numérique en pourcentage. C’est ce genre d’éqt qu’il faut). Si je retrouve le lien, je le mettrais ici.

C’est bien ce que fait l’intégration oui mais c’est pas magique, il faut que les eqts soient commandables (on/off) ou modulables en puissance.
Le soucis des eqt non commandables, c’est qu’il ne suffit pas de le mettre une prise connectée en général. Ils ne démarrent pas tout seul quand on allume la prise.

Oui j’avais là aussi bien compris, je les démarrerais moi-même en fonction

J’ai cette fonction sur mon chauffe-eau thermo Atlantic. Un contact sec qui si il est fermé force la mise en marche du chauffe-eau jusqu’à 62°. Donc c’est pas modulable en effet mais ca permet de consommer un peu du surplus. Chez moi ça pompe 250 w et ça dure en gros 2h quand c’est en marche. Donc j’ai configuré le Solar Optimizer comme ça (je ne le déclenche que si il y a au moins 1000 w de dispo pour que ça vaille le coup) :

  - name: "Chauffe-eau solaire"
    entity_id: "switch.chauffe_eau_solaire"
    # this consume 250 but we don't want to start it under 1000 W available
    power_max: 1000
    # check_usable_template: "{{ True }}"
    # 2 h
    duration_min: 120
    # Only if water temperature is < target water temperature - 10
    check_usable_template: "{{ states('sensor.chauffe_eau_temperature_eau') | float(50) < states('sensor.chauffe_eau_temperature_cible') | float(0) - 10 }}"
    action_mode: "service_call"
    activation_service: "switch/turn_on"
    deactivation_service: "switch/turn_off"

Faut comprendre qu’on ne redirige pas un surplus vers un eqt mais qu’on active un eqt si il y a la puissance disponible. Ca chane un peu la façon de voir.

Bonjour
Dans mon cas, je pourrais activer ma PAC en mode rafraichissement.
Pour cela, j’appelle le service :

service: climate.set_hvac_mode
data:
  hvac_mode: cool
target:
  entity_id: climate.chauffage_maison

Je ne sais pas trop comment le definir dans le fichier solar.
Une petite idée ?

Nativement Solar Optimizer sait appeler un service mais pas passer des paramètres (data).
Ca devrait pouvoir faire l’objet d’une évolution dans le futur. Je pense que ca peut être intéressant pour plusieurs usages.

Dans l’attente il faut utiliser le mode event : chaque demande d’allumage extinction génère un event (cf. post de @R_hum1 juste au dessus). Tu captes l’évent dans une automatisation et tu appelles le service :

service: climate.set_hvac_mode
data:
  hvac_mode: cool
target:
  entity_id: climate.chauffage_maison

C’est pas compliqué et je peux aider au besoin, j’ai déjà fait ce genre de chose.

Bonjour, excusez-moi de mon délai à la réponse… j’ai réussi à débloqué la config et autoriser le redémarrage , toutefois je suis aveugle, impossible pour moi de voir si ça fonctionne. Du coup, j’ai créé une entrée nombre que je souhaite varier pour pouvoir observer si ça fonctionne, existe-t-il un moyen de voir si le système fonctionne et qu’il est en route aussi voir les actions ? Voilà ma config.

algorithm:
  initial_temp: 1000
  min_temp: 0.1
  cooling_factor: 0.95
  max_iteration_number: 1000
devices:
  - name: "Test_switch"
    # Le switch qui commande la pompe du réservoir
    entity_id: "switch.test_switch"
    # la puissance de cette pompe
    power_max: 170
    # Toujours utilisable
    check_usable_template: "{{ is_state('input_boolean.solar_optimizer_test', 'on')}}"
    # 15 min d'activation minimum
    duration_min: 15
    # On active/desactive via un appel de service
    action_mode: "service_call"
    # Le service permettant d'activer le switch
    activation_service: "switch/turn_on"
    # Le service permettant de désactiver le switch
    deactivation_service: "switch/turn_off"

  - name: "Recharge voiture"
    entity_id: "switch.wallbox_charger"
    # La puissance minimale de charge est 660 W (soit 1 Amp car convert_power_divide_factor=660 aussi)
    power_min: 660
    # La puissance minimale de charge est 3960 W (soit 5 Amp (= 3960/600) )
    power_max: 3960
    # le step de 660 soit 1 Amp après division par convert_power_divide_factor
    power_step: 660
    # Utilisable si le mode de charge est "Solaire" et la voiture est branchée sur le chargeur et elle est chargée à moins de 90 % (donc ca s'arrête tout seul à 90% )
    check_usable_template: "{{ is_state('input_boolean.solar_optimizer_test', 'on')}}"
    # 1 h de charge minimum
    duration_min: 60
    # 15 min de stop charge minimum
    duration_stop_min: 15
    # L'entité qui pilote l'ampérage de charge
    power_entity_id: "input_number.wallbox_portal_max_charging_current"
    # 5 min minimum entre 2 changements de puissance
    duration_power_min: 5
    # l'activation se fait par un appel de service
    action_mode: "service_call"
    activation_service: "switch/turn_on"
    deactivation_service: "switch/turn_off"
    # le changement de puissance se fait par un appel de service
    change_power_service: "number/set_value"
    # le facteur permettant de convertir la puissance consigne en Ampères (number.tesla_charging_amps prend des Ampères)
    convert_power_divide_factor: 660

Bonjour,

Voici un exemple qui modifie un input_number pour voir si ça fonctionne (c’est comme ça que je le teste en fait) :

    - name: "Equipement H"
      entity_id: "input_boolean.fake_device_h"
      power_entity_id: "input_number.tesla_amps"
      power_min: 660
      power_max: 3960
      power_step: 660
      check_usable_template: "{{ is_state('input_boolean.device_h_enable', 'on') }}"
      duration_min: 1
      duration_stop_min: 0.1
      duration_power_min: 0.1
      action_mode: "service_call"
      activation_service: "input_boolean/turn_on"
      deactivation_service: "input_boolean/turn_off"
      change_power_service: "input_number/set_value"
      convert_power_divide_factor: 660

Ce qui ne va pas, dans ton exemple, c’est que le service pour modifier un input_number c’est: input_number/set_value et non pas number/set_value

Tu dois donc changer la ligne :

change_power_service: "number/set_value"

par change_power_service: "input_number/set_value"

Et ça devrait marcher.