Erreur Log sur exécution d'une automatisation

Mon problème

j’ai crée une automatisation qui exécute le code suivant toutes le 6 secondes le but étant de rafraichir le « input_number.grid_max_charger_current » à cette fréquence en fonction de ‹ sensor.reseau_enedis › et ‹ sensor.vbat › en bornant la valeur de ‹ input_number.grid_max_charger_current › entre 1 et 60.

service: input_number.set_value
data:
  entity_id: input_number.grid_max_charger_current
  value: |-
    {% if states('sensor.reseau_enedis')|int > -10 %}
      {% set new_value = states('input_number.grid_max_charger_current')|int -
              (((states('sensor.reseau_enedis'))|int|abs|int ) / (states('sensor.vbat')|int)  )|round(0) %}
      {{ max(min(new_value,60),1) }}

    {% elif states('sensor.reseau_enedis')|int < -80 %}
      {% set new_value = states('input_number.grid_max_charger_current')|int +
              (((states('sensor.reseau_enedis'))|int|abs|int ) / (states('sensor.vbat')|int)  )|round(0) %}
      {{ max(min(new_value,60),1) }} 
    {% endif %}

Voilà ce que me retourne le log :

Logger: homeassistant.components.automation.reg_batt_2
Source: components/automation/__init__.py:566
Integration: Automatisation (documentation, issues)
First occurred: 08:48:06 (560 occurrences)
Last logged: 10:31:24

Error while executing automation automation.reg_batt_2: expected float for dictionary value @ data['value']

Je ne vois pas où est l’erreur ??

Salut,

Je ne sais pas trop ce que tu as comme format en entrée (int/float ?) et ce que tu veux en sortie (int/float)+ arrondi mais ça fait beaucoup de conversion qui ne sont pas au bon format.
- int(0) ou float(0) c’est la syntaxe fonctionnelle (avec les valeurs par défaut)

En tout cas là il râle justement pas que ça attends un float mais que ça ne retourne pas ça

bien vu effectivement input_number attend un float, c’est dans la doc. j’ai d’abord converti en int la valeur new_value et après je lui ai fais évaluer en float comme suit:

service: input_number.set_value
data:
  entity_id: input_number.grid_max_charger_current
  value: |-
    {% if states('sensor.reseau_enedis')|int > -10 %}
      {% set new_value = (states('input_number.grid_max_charger_current')|int -
              states('sensor.reseau_enedis')|int|abs  / states('sensor.vbat')|int)|int %}
      {{ (max(min(new_value,60),1))|float }}

    {% elif states('sensor.reseau_enedis')|int < -80 %}
      {% set new_value = (states('input_number.grid_max_charger_current')|int +
              states('sensor.reseau_enedis')|int|abs  / states('sensor.vbat')|int)|int %}
      {{ (max(min(new_value,60),1))|float }} 
    {% endif %}

en fait cela ne marche toujours pas. Je suis perdu

Ton calcul est pas idéal…

  • Comme dit, plus haut les syntaxes sont incorrectes
  • Tu transforme des valeurs en INT, tu fais des additions/division avec et à la fin tu fais un float…
    5.4 / 3.1 ça fait jamais la même valeur que 5 / 3

ok je comprend, par contre je suis obligé de les convertir en quelque chose car les states(‹ … ›) retournent des String. j’ai donc pensé à remplacer les |INT par de |FLOAT. Sinon je vois pas comment je peux faire pour avoir le format final 1.0, 2.0 jusqu’à 60.0 attendu par le input_number.grid_max_charger_current ?

On est d’accord qu’il faut un format numérique. Mais un float(0) et pas un float tout court

je comprend ps il faut que je mette |float(0) au lieu de |float ? en quoi cela est different ? que représente le (0) ?

J’ai pourtant tout dit dans mon message ce matin :cry:

voila ce que je veux faire récupérer la partie entière et la convertir en float:
exemple: new_value donne15.1213232, je prend la partie entière 15 et je la convertie en float 15.0

J’ai le bon format pour input_number.grid_max_charger_current mais j’ai toujours la même erreur dans le LOG :grimacing:

service: input_number.set_value
data:
  entity_id: input_number.grid_max_charger_current
  value: |-
    {% if states('sensor.reseau_enedis')|float > -10 %}
      {% set new_value = states('input_number.grid_max_charger_current')|float -
              states('sensor.reseau_enedis')|float|abs  / states('sensor.vbat')|float %}
     
      {{max(min(new_value,60.0),1.0)|int|float}}

    {% elif states('sensor.reseau_enedis')|float < -80 %}
      {% set new_value = states('input_number.grid_max_charger_current')|float +
              states('sensor.reseau_enedis')|float|abs  / states('sensor.vbat')|float %}
       
      {{max(min(new_value,60.0),1.0)|int|float}}
    {% endif %}

personne pour me venir en aide ?

Écoute et applique les conseils sinon personne voudra t’aider par la suite et a juste titre.

Au lieu de faire |int|float utilise que des float et si tu a besoin de faire des approximations/arrondie utilise la fonction round c’est prévu pour ça

2 « J'aime »

j’ai suivi scrupuleusement les conseils j’ai essayer mon code dans la partie développement de HA et mon code fonctionne parfaitement et fonctionne d’ailleurs aussi dans mon automatisme. j’ai bien une valeur en float retournée avec un chiffre après la virgule mais j’ai toujours une erreur dans le LOG lié à l’exécution du code dans mon automatisme.
Auriez vous d’autres conseils ?

Et le code corrigé donne quoi ?

Bonjour,

Je suis novice dans home assitant et je doit ingurgité beaucoup d’informations. Je vous ai mis le code. Pourriez vous svp corriger la syntaxe car il se peut qu’il y ait des chose que je n’ai pas bien compris lors de nos échanges précédent ? grand merci d’avance pour votre compréhension .

service: input_number.set_value
data:
  entity_id: input_number.grid_max_charger_current
  value: |-
    {% if states('sensor.reseau_enedis')|float > -10 %}
      {% set new_value = states('input_number.grid_max_charger_current')|float -
              states('sensor.reseau_enedis')|float|abs  / states('sensor.vbat')|float %}
     
      {{max(min(new_value,60.0),1.0)|float|round(1)}}

    {% elif states('sensor.reseau_enedis')|float < -80 %}
      {% set new_value = states('input_number.grid_max_charger_current')|float +
              states('sensor.reseau_enedis')|float|abs  / states('sensor.vbat')|float %}
       
      {{max(min(new_value,60.0),1.0)|float|round(1)}}
    {% endif %}

Salut,
il faut mettre des float(0)

service: input_number.set_value
data:
  entity_id: input_number.grid_max_charger_current
  value: |-
    {% if states('sensor.reseau_enedis')|float(0) > -10 %}
      {% set new_value = states('input_number.grid_max_charger_current')|float(0) -
              states('sensor.reseau_enedis')|float(0)|abs  / states('sensor.vbat')|float(0) %}
     
      {{max(min(new_value,60.0),1.0)|float(0)|round(1)}}

    {% elif states('sensor.reseau_enedis')|float(0) < -80 %}
      {% set new_value = states('input_number.grid_max_charger_current')|float(0) +
              states('sensor.reseau_enedis')|float(0)|abs  / states('sensor.vbat')|float(0) %}
       
      {{max(min(new_value,60.0),1.0)|float(0)|round(1)}}
    {% endif %}

Après à tester mais il y a moyen de faire moins lourd, il reste un cas à traiter cependant entre >-80 et <-10

service: input_number.set_value
data:
  entity_id: input_number.grid_max_charger_current
  value: |-
	{% set reseau_enedis = states('sensor.reseau_enedis')|float(0) %}
	{% set grid_max_charger_current = states('input_number.grid_max_charger_current')|float(0) %}
	{% set vbat = states('sensor.vbat')|float(0) %}
    {% if reseau_enedis > -10 %}
      {% set new_value = grid_max_charger_current - reseau_enedis|abs  / vbat %}
    {% elif reseau_enedis < -80 %}
      {% set new_value = grid_max_charger_current + reseau_enedis|abs  / vbat %}
    {% else %}
      {% set new_value = 0 %}
    {% endif %}
    {{max(min(new_value,60.0),1.0)|float(0)|round(1)}}

Pas tout a fait, mais tu apprend :wink:
c’est pas pour rien qu’il est important de partager le code pour voir et analyser ce qu’il vas pas.

Et pour ton information le | float(0) est équivalent a float(default=0). Ce qui veut dire que si la variable n’est pas initialiser ou consultable à un moment donner (genre ton capteur est hors service) , ça prendre la valeur de 0.

Et bien le code fonctionne bien mais j’ai toujours une erreur dans le log :smiling_face_with_tear:

Le mieux c’est de partager ou de redonner l’erreur …

voila ce que me donne le LOG avec 560 occurrences à ce moment là !. J’ai pourtant bien une valeur en float qui est retourné, je l’ai testé !

Source: components/automation/__init__.py:566
Integration: Automatisation (documentation, issues)
First occurred: 08:48:06 (560 occurrences)
Last logged: 10:31:24

Error while executing automation automation.reg_batt_2: expected float for dictionary value @ data['value']