Syntaxe en Yaml d'une formule pour calcul de l'ampérage d'une borne de recharge

Bonjour,

Mon problème

Je suis en train de mettre au point un automatisme pour recharger ma voiture avec une borne Feyree en fonction de ma production solaire.
J’ai fait un premier automatisme avec une incrémentation de l’ampérage qui fonctionne correctement. Pour plus de dynamisme dans les changements d’ampérages lors d’une production solaire instable (passages de nuages), j’ai remplacer l’incrémentation par une formule qui calcule l’ampérage. Mais je n’arrive pas à exprimer cette formule pourtant simple en Yaml. Voici la formule avec ses conditions d’exécution :

 - conditions:
          - condition: numeric_state
            entity_id: sensor.shellyproem50_08f9e0e89e74_em0_power
            above: 250
          - condition: state
            entity_id: sensor.borne_feyree_evse_74_kw_etat
            state: charging
        sequence:
          - target:
              entity_id: number.borne_feyree_evse_74_kw_set_charge_current
            data:
              value: >-
                {{ ([8, (
                  (states('sensor.shellyproem50_08f9e0e89e74_em0_power') | float(0) +
                   states('sensor.borne_feyree_evse_74_kw_puissance') | float(0)) /
                   (states('sensor.borne_feyree_evse_74_kw_tension_l1') | float(230))
                ) | int, 20] | sort)[1] }}
            action: number.set_value
          - delay:
              seconds: 14

Voici ci-dessous la formule sans les conditions d’exécution. Elle veut dire : (Injection ou soutirage avec une valeur négative + puissance de la borne actuelle) / tension de la borne actuelle = ampérage à affecter à la borne entre 8 et 20 A :

 {{ ([8, (
                  (states('sensor.shellyproem50_08f9e0e89e74_em0_power') | float(0) +
                   states('sensor.borne_feyree_evse_74_kw_puissance') | float(0)) /
                   (states('sensor.borne_feyree_evse_74_kw_tension_l1') | float(230))
                ) | int, 20] | sort)[1] }}

Malheureusement le résultat de cette formule donne systématiquement pour résultat 8 A au lieu de l’ampérage calculé normalement par la formule.
Avez-vous une idée sur la syntaxe à utiliser pour une formule du type (capteur A + capteur B) / capteur C => résultat affecté à l’ampérage ?

Bien cordialement

Ma configuration


System Information

version core-2025.4.2
installation_type Home Assistant OS
dev false
hassio true
docker true
user root
virtualenv false
python_version 3.13.2
os_name Linux
os_version 6.6.74-haos-raspi
arch aarch64
timezone Europe/Paris
config_dir /config
Home Assistant Community Store
GitHub API ok
GitHub Content ok
GitHub Web ok
HACS Data ok
GitHub API Calls Remaining 5000
Installed Version 2.0.5
Stage running
Available Repositories 2009
Downloaded Repositories 14
Home Assistant Cloud
logged_in true
subscription_expiration 22 juin 2025 à 02:00
relayer_connected true
relayer_region eu-central-1
remote_enabled true
remote_connected true
alexa_enabled true
google_enabled true
cloud_ice_servers_enabled true
remote_server eu-central-1-25.ui.nabu.casa
certificate_status ready
instance_id af5b81a0034c4e058047b7b14c063eee
can_reach_cert_server ok
can_reach_cloud_auth ok
can_reach_cloud ok
Home Assistant Supervisor
host_os Home Assistant OS 15.2
update_channel stable
supervisor_version supervisor-2025.05.3
agent_version 1.7.2
docker_version 28.0.4
disk_total 916.2 GB
disk_used 6.6 GB
healthy true
supported true
host_connectivity true
supervisor_connectivity true
ntp_synchronized true
virtualization
board rpi5-64
supervisor_api ok
version_api ok
installed_addons Terminal & SSH (9.17.0), File editor (5.8.0), Get HACS (1.3.1)
Dashboards
dashboards 4
resources 11
views 3
mode storage
Network Configuration
adapters lo (disabled), end0 (enabled, default, auto), wlan0 (disabled), hassio (disabled), docker0 (disabled), veth906e631 (disabled), veth65eee6c (disabled), veth7f487d6 (disabled), veth35090fb (disabled), vethac5dc11 (disabled), veth1794bce (disabled), veth2a2c8a0 (disabled), veth105ad66 (disabled)
ipv4_addresses lo (127.0.0.1/8), end0 (192.168.1.155/24), wlan0 (192.168.1.140/24), hassio (172.30.32.1/23), docker0 (172.30.232.1/23), veth906e631 (), veth65eee6c (), veth7f487d6 (), veth35090fb (), vethac5dc11 (), veth1794bce (), veth2a2c8a0 (), veth105ad66 ()
ipv6_addresses lo (::1/128), end0 (2a01:e0a:4e0:4ca0:296d:dbf4:dc1:8729/64, fe80::de13:36bc:7e2f:7746/64), wlan0 (2a01:e0a:4e0:4ca0:d3b:83da:1263:7ac/64, fe80::2326:b932:c703:c9e2/64), hassio (fe80::6885:92ff:fe86:5a74/64), docker0 (fe80::1039:b8ff:fe28:6c9/64), veth906e631 (fe80::d8cf:75ff:fe88:717a/64), veth65eee6c (fe80::5421:cfff:fe30:77ed/64), veth7f487d6 (fe80::9cdb:92ff:feca:da4/64), veth35090fb (fe80::9c35:4bff:febe:e247/64), vethac5dc11 (fe80::f01a:bfff:fe0b:eec8/64), veth1794bce (fe80::acdb:c9ff:fedf:634b/64), veth2a2c8a0 (fe80::cbb:f7ff:feb0:176f/64), veth105ad66 (fe80::fc20:d1ff:fe83:618/64)
announce_addresses 192.168.1.155, 2a01:e0a:4e0:4ca0:296d:dbf4:dc1:8729, fe80::de13:36bc:7e2f:7746
Recorder
oldest_recorder_run 28 mai 2025 à 00:16
current_recorder_run 7 juin 2025 à 16:45
estimated_db_size 222.14 MiB
database_engine sqlite
database_version 3.48.0
___

Salut
C’est quoi le " 8 "au départ de ta formule, le " , 20] | sort)[1] " à la fin ???
essai simplement

{{ (states('sensor.power1')|float(0) + states('sensor.power2')|float(0)) / states('sensor.tension')|float(230) }}

salut,

Tu fais ça :

([8, ( ... ) | int, 20] | sort)[1]

Le | int convertit la valeur en entier avant qu’elle ne soit triée avec 8 et 20. Si ton calcul donne, par exemple, 8.9, il est converti en 8, ce qui explique pourquoi tu obtiens toujours 8 comme résultat.

tu devrais applique le | float dans le calcul, fais le min/max avec min() et max(), ou garde les valeurs en float dans la liste, puis convertis le résultat final en int :

Merci pour vos réponses, je vais tester ça demain lorsqu’il y aura du soleil. Le but c’est d’encadrer le résultat entre 8A et 20A pour ne pas sortir des limites inférieures et supérieures de la borne de recharge.

Dans ce cas es tu sur que le resultat est supérieur à 8 quand tu fais tes tests ?

Merci hackdiy,
Après plusieurs test j’ai déjà modifié la formule où il y avait une erreur de signe sur la puissance bidirectionnelle du Shelly, et une conversion à faire sur la puissance active de la borne Feyree exprimée en kW que j’ai donc multiplié par 1000 pour la convertir en W.
Maintenant j’ai pu tester avec succès dans l’éditeur de modèles de outils de développement de HA la formule suivante sans les limites d’ampérage entre 8 et 20 A et sans arrondir au nombre entier inférieur et la formule a produit des résultats justes :

{{  (( - (states('sensor.shellyproem50_08f9e0e89e74_em0_power') | float(0))
              + (states('sensor.borne_feyree_evse_74_kw_puissance') | float(0) * 1000)
            )
            / (states('sensor.borne_feyree_evse_74_kw_tension_l1') | float(230))) }}

Maintenant j’ai essayé d’introduire les limites entre 8 et 20 A et arrondir au nombre entier inférieur avec cette formule qui renvoie systématiquement un résultat faux de 8A :

{{ [
     8,
     [
       20,
       (
         (
           - (states('sensor.shellyproem50_08f9e0e89e74_em0_power') | float(0))
           + (states('sensor.borne_feyree_evse_74_kw_puissance') | float(0) * 1000)
         )
         / (states('sensor.borne_feyree_evse_74_kw_tension_l1') | float(230))
       ) | round(0, 'floor')
      ] | min
   ] | max | int }}

Vois-tu l’erreur de syntaxe qui fausse le résultat ?

Ton code devient trop gros et source d’erreur

Je te conseil de passer par une variable intermédiaire qui fait le calcul.
Puis tu limites via min & max (voir avec des conditions if/else ) :

{% set amperes = 7.33 %}
{{ (max(8 , amperes)) }}

Puis tu convertir ta valeur en entier, exemple :

{% set amperes = 8.33 %}
{{ (max(8 , amperes)) | int}}

essaye plutôt comme ça

{{ [
  8,
  (
    (
      - (states('sensor.shellyproem50_08f9e0e89e74_em0_power') | float(0)) +
      (states('sensor.borne_feyree_evse_74_kw_puissance') | float(0) * 1000)
    ) / (states('sensor.borne_feyree_evse_74_kw_tension_l1') | float(230))
  ) | round(0, 'floor'),
  20
] | sort | slice(1, 1) | first | int }}

si tu veux une version plus claire encore :

`{% set calc = (
  - (states('sensor.shellyproem50_08f9e0e89e74_em0_power') | float(0)) +
  (states('sensor.borne_feyree_evse_74_kw_puissance') | float(0) * 1000)
) / (states('sensor.borne_feyree_evse_74_kw_tension_l1') | float(230)) %}

{{ [8, calc | round(0, 'floor'), 20] | sort | slice(1, 1) | first | int }}
`

Merci pour votre aide qui m’a permis de régler mon problème :grinning: