Pb migration vers TEMPLATE nouveau format

Bonjour à tous,

je cherche à transférer mes sensors type template vers le nouveau format cependant cela me pose problème. exemple ci-dessous, le premier « sensor.teleinfokit_puissance_soutiree » est fonctionnel mais pas le deuxième « sensor.solar_power_production ».

Ces sensors sont déclaré dans le fichier « config_template.yaml » que je charge via la ligne « template: !include config_template.yaml » du fichier configuration.yaml

Je loupe quoi ?

  - sensor:

      - name: "Teleinfokit Puissance soutiree"
        unique_id: teleinfokit_puissance_soutiree
        unit_of_measurement: 'W'
        device_class: power
        state: '{{ (states("sensor.teleinfokit_papp") | float * 0.9) | round(0) }}'

      - name: "Puissance totale de la production solaire"
        unique_id: solar_power_production
        unit_of_measurement: 'W'
        device_class: power
        state: >
          {% set prod_sud = ((states('sensor.power_production_now_sud')|float * 1.0)|round (0)) %}
          {% set prod_ouest = ((states('sensor.power_production_now_ouest')|float * 1.0)|round (0)) %}
          {{ (( prod_sud + prod_ouest) | round (0)) }}

salut,
je suis pas un pro, mais les | round (0) ca serais pas plutot | round(0) ?
moi c’est coller dans tout mes templates.

Salut messieurs,

Même séparé d’un espace ça le fait :wink:

@Neuvidor je vois rien d’anormal dans la déclaration de ton sensor.

T’as pas un message d’erreur dans les logs ?

1 « J'aime »

Alors si j’en ai plein, mais je comprend pas trop où est le problème…

Logger: homeassistant.helpers.event
Source: helpers/template.py:460
First occurred: 07:07:15 (11 occurrences)
Last logged: 07:07:16

Error while processing template: Template("{% set salon = ((states('sensor.sonde_salon_temperature')|float * 59.28)|round (1)) %} {% set ch1 = ((states('sensor.sonde_chambre_parents_temperature')|float * 16.10)|round (1)) %} {% set mezzanine = ((states('sensor.sonde_mezzanine_temperature')|float * 17.13)|round (1)) %} {% set ch2 = ((states('sensor.sonde_chambre_lucie_temperature')|float * 10.93)|round (1)) %} {% set ch3 = ((states('sensor.sonde_chambre_jeanne_temperature')|float * 12.5)|round (1)) %} {{((( salon + ch1 + mezzanine + ch2 + ch3) / 115.94 )|round (1))}}")
Error while processing template: Template("{{ (states("sensor.prise_chambre_parents_bureau_energy") | float / 1.0) | round(3) }}")
Error while processing template: Template("{% set import = ((((states('sensor.teleinfokit_puissance_soutiree')|float * 1.0) - (states('sensor.solar_power_production')|float * 1.0) ) * 1.0)|round ) %} {{ 0 if import < 0 else import }}")
Error while processing template: Template("{% set surplus = ((((states('sensor.solar_power_production')|float * 1.0) - (states('sensor.teleinfokit_puissance_soutiree')|float * 1.0) ) * 1.0)|round ) %} {{ 0 if surplus < 0 else surplus }}")
Error while processing template: Template("{% set autoconso = ((((states('sensor.daily_energy_soutiree')|float * 1.0) - (states('sensor.daily_solar_energy_grid_import')|float * 1.0) ) * 1.0)|round (3) ) %} {{ 0 if autoconso < 0 else autoconso }}")
Traceback (most recent call last):
  File "/usr/src/homeassistant/homeassistant/helpers/template.py", line 1771, in forgiving_float_filter
    return float(value)
ValueError: could not convert string to float: 'unknown'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/src/homeassistant/homeassistant/helpers/template.py", line 458, in async_render
    render_result = _render_with_context(self.template, compiled, **kwargs)
  File "/usr/src/homeassistant/homeassistant/helpers/template.py", line 2007, in _render_with_context
    return template.render(**kwargs)
  File "/usr/local/lib/python3.10/site-packages/jinja2/environment.py", line 1301, in render
    self.environment.handle_exception()
  File "/usr/local/lib/python3.10/site-packages/jinja2/environment.py", line 936, in handle_exception
    raise rewrite_traceback_stack(source=source)
  File "<template>", line 1, in top-level template code
  File "/usr/src/homeassistant/homeassistant/helpers/template.py", line 1774, in forgiving_float_filter
    raise_no_default("float", value)
  File "/usr/src/homeassistant/homeassistant/helpers/template.py", line 1472, in raise_no_default
    raise ValueError(
ValueError: Template error: float got invalid input 'unknown' when rendering template '{{ states('sensor.solar_power_production')|float > 5 }}' but no default was specified

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/usr/src/homeassistant/homeassistant/helpers/template.py", line 576, in async_render_to_info
    render_info._result = self.async_render(variables, strict=strict, **kwargs)
  File "/usr/src/homeassistant/homeassistant/helpers/template.py", line 460, in async_render
    raise TemplateError(err) from err
homeassistant.exceptions.TemplateError: ValueError: Template error: float got invalid input 'unknown' when rendering template '{{ states('sensor.solar_power_production')|float > 5 }}' but no default was specified

Avec ce type de message, la partie importante est :

Template error: float got invalid input 'unknown' when rendering template '{{ states('sensor.solar_power_production')|float > 5 }}' but no default was specified

En gros si un des capteur de base est à l’état « unknown », il dit qu’il ne sait pas évaluer la template.

Et pour « bypass » ça il faut fournir une valeur qu’il prendra par défaut.

donc juste pour test tu peux modifier tes « float » comme ça :

float(default=0)

ou même :

float(0)

Alors je suis d’accord avec toi, il faudrait que je définisse une valeur par défaut, je vais le faire mais cela reste optionnel selon moi.

Le problème principal est que « sensor.solar_power_production » devrait être fonctionnel car il est le résultat de la somme de 2 variables fonctionnelles.

Depuis une parie de version, il est obligatoire d’avoir des défault value sinon les additions de sensors ne fonctionne pas.
cf : Updating Templates with the new default values in 2021.10.x - Configuration - Home Assistant Community

Sinon tu peut faire ca sur une seule ligne (sans passer par 2 variables temporaires) comme ceci :

  state: >
{{ ( (states('sensor.circuit_7_power') | float(default=0) ) - (states('sensor.chargeur_velo_power') | float(default=0) ) ) | round(2) }}

Nouvel essai:

Vérification de la syntaxe dans l’outils de dev => OK

Mise à jour du capteur de type TEMPLATE :

      - name: "Puissance totale de la production solaire"
        unique_id: solar_power_production
        unit_of_measurement: 'W'
        device_class: power
        state: >
          {% set prod_sud = ((states('sensor.power_production_now_sud')|float (default=0) * 1.0)|round (0)) %}
          {% set prod_ouest = ((states('sensor.power_production_now_ouest')|float (default=0) * 1.0)|round (0)) %}
          {{ (( prod_sud + prod_ouest) | round (0)) }}

Malheureusement c’est toujours non fonctionnel après redémarrage de HA, aucune entité du type « sensor.solar_power_production ». Il y a un truc qui m’échappe !

Salut,

si tu n’as plus d’erreur liée dans les logs, ça doit marcher.
Mais tu ne confondrais pas un peu name et unique_id?
De ce que je sais le unique_id ne va pas être utilisé pour créer le sensor…

La vu ton yaml ce sera « sensor.puissance_totale_de_la_production_solaire »

2 « J'aime »

Mais que je suis c*n !
Tu as tapé dans le mille car j’ai bien confondu… :crazy_face: :crazy_face: :crazy_face:

En fait je pensais à tord que le "name"correspondait à la description de l’entité
Merci pour la remarque !

2 « J'aime »

Oh t’inquiètes pas, j’ai du relire 20 fois ton post et j’ai pas tilté non plus :crazy_face:

1 « J'aime »

En tous cas merci à tous pour votre aide !
C’était le but, avoir un œil neuf sur le sujet :wink:

Bonjour
Va falloir que me m’y penche aussi. Tu as vu une info sur la version ha qui n’acceptera plus l’ancienne méthode?

Pour le moment j’ai pas vu d’info dans ce sens.

Bonjour

Je me permet de poser ma question ici, car sa concerne le nouveau format de Template. J’ai un sensor qui utilise ce code :

#sensor:
# Température extérieure domicile
- platform: template
  sensors:
    outside_temp:
      friendly_name: "Température extérieure"
      device_class: temperature
      unit_of_measurement: "°C"
      value_template: "{{ state_attr('weather.maison_ville_hourly', 'temperature') }}" # Remplacer ma_ville par l'identifiant weather correspondant à votre domicile
      unique_id: "outside_temp_id"
        
#

Faut il le ré-écrire avec le nouveau format template ?
Merci pour votre aide

Hello

Oui, il fonctionne encore, mais il faudra le réécrire.

J’ai tenté de réécrire le template, mais sa ne fonctionne pas.

#sensor:
# Température extérieure domicile
#- platform: template
- sensor:
    name: "Température extérieure"
    device_class: temperature
    unit_of_measurement: "°C"
    value_template: "{{ state_attr('weather.maison_ville_hourly', 'temperature') }}" # Remplacer ma_ville par l'identifiant weather correspondant à votre domicile
    unique_id: "temp_outside"
        
#

J’ai erreur suivante :

Invalid config for [template]: [value_template] is an invalid option for [template]. Check: template->sensor->0->value_template. (See /config/integrations/../entities/sensors_templates/temperarure_ext_sensor.yaml, line 3)

Je suis nul en code, et malgré avoir lu le lien « template » je n’y parviens pas.

Essaie ça:

#sensor:
# Température extérieure domicile
#- platform: template
- sensor:
    name: "Température extérieure"
    device_class: temperature
    unit_of_measurement: "°C"
    state: "{{ state_attr('weather.maison_argenteuil_hourly', 'temperature') }}" # Remplacer ma_ville par l'identifiant weather correspondant à votre domicile
    unique_id: "temp_outside"

Merci @Giga77
Sa fonctionne, je vais essayer de faire les autres, mais c’est pas évident.
Je n’arrive pas à intégré la logique du code yaml, et quand j’y arrive un peu…ils changent tout :woozy_face:

Je viens de modifier ce code :

# Sensor:
# Season pour Sun card
#- platform: template
- sensor:
    name: "saison"
    unique_id: saison
    state: >
      {% if is_state("sensor.season", "spring") %}
        Printemps
      {% elif is_state("sensor.season", "summer") %}
        Eté
      {% elif is_state("sensor.season", "autumn") %}
        Automne
      {% else %}
        Hiver
      {% endif %}

Sa fonctionne :grin: enfin presque !
Il me dit que c’est l’hiver avec 26° dehors j’ai un peu de mal a y croire :rofl:

Par contre je ne vois pas ce qui cloche…a moins qu’il faut remplacer les sensor.season par sensor.saison ? (j’ai essayé, mais c’est pareil)