Attention, les anciens templates (legacy) vont être supprimés en 2026.6, il va falloir passer sur le nouveau format de template

Bonjour,
avec la version du core 2025.12.0, vous aurez un avertissement que les anciens template (legacy) vont être supprimé. Il va vous falloir les convertir en nouveau format template.


Vous aurez un exemple de conversion. Vous avez 6 mois pour faire la migration, mais ne tardez pas :wink:

les legacy template sont supprimés de la doc :

il y a un sujet sur le forum anglais :

5 « J'aime »

Tu peux partager un exemple?

Genre Un template Avant vers ce vers quoi on doit migrer Apres?

comme dit, tu auras un exemple du nouveau format a changer dans le message d’avertissement.
avant :

sensor:
  - platform: template
    sensors:
      humidity_garage:
        friendly_name: "humdity garage"
        unit_of_measurement: "g/m³"
        device_class: humidity
        icon_template: mdi:water
        value_template: "{{ ((states('sensor.garage_absolute_humidity') | float(0)) - (states('sensor.aussensensor_absolute_humidity') | float(0)))|round(2) }}"

après

template:
  - sensor:
      - name: "humdity garage"
        unique_id: humidity_garage
        unit_of_measurement: "g/m³"
        device_class: humidity
        icon: mdi:water
        state: "{{ ((states('sensor.garage_absolute_humidity') | float(0)) - (states('sensor.aussensensor_absolute_humidity') | float(0)))|round(2) }}"
6 « J'aime »

Attention, on ne peut avoir qu’une seule clef template dans configuration.yaml.

Donc si vous avez déjà une clef template dans configuration.yaml (ou un fichier templates.yaml avec un include template: !include templates.yaml dans le configuration.yaml), il faudra ajouter ces template à la suite de la clef template existante et pas créer une nouvelle clef template (ou ajouter dans le fichier templates.yaml existant et ne pas créer ni une autre clef template, ni un autre fichier et un autre include).


Exemples tirés du post anglophone:

Si vous avez ce template legacy:

sensor:
  - platform: template
    sensors:
      my_jam:
        value_template: "{{ 1==1 }}"

et si vous avez déjà ça dans configuration.yaml

template:
- triggers:
  - trigger: state
    entity_id: sensor.foo
  sensor:
  - name: abc
    state: "{{ 'something' }}"

ce qu’il faut faire

template:
- triggers:
  - trigger: state
    entity_id: sensor.foo
  sensor:
  - name: abc
    state: "{{ 'something' }}"

# ENTITE MIGREE
- sensor:
  - default_entity_id: sensor.my_jam
    state: '{{ 1==1 }}'
    name: my_jam

Ce qu’il ne faut pas faire

template:
- triggers:
  - trigger: state
    entity_id: sensor.foo
  sensor:
  - name: abc
    state: "{{ 'something' }}"

template: # <--- A ne sourtout PAS FAIRE, pas plus d'un - template:

# ENTITE MIGREE 
- sensor:
  - default_entity_id: sensor.my_jam
    state: '{{ 1==1 }}'
    name: my_jam
3 « J'aime »

Salut

Il est aussi possible de recréer tous ces sensors (enfin 95% d’entre eux) à l’aide de l’interface utilisateur ce qui évite d’avoir des sensors qui traînent à droite et à gauche

5 « J'aime »

Y aurait-il un outil que je n’ai pas vu pour ça ?

Parametres / appareils et services / entrées

Dans config.yaml j’ai :

binary_sensor:
  - platform: template
    sensors:
      bt_stuck:
        friendly_name: "BT"
        value_template: >-
          {% set btvalues = [
            states.sensor.ble_temperature_salon.last_updated,
            states.sensor.ble_temperature_chambre.last_updated]%}
          {{ (as_timestamp(now())-as_timestamp(btvalues | max)) > 120 }}
        device_class: problem

Devient dans l’ui:

3 « J'aime »

Salut

Comment ça ce passe dans le cas de packages ?

dans configuration.yaml j’ai cette ligne :

homeassistant:
  customize: !include customize.yaml
## Chargement des packages
  packages: !include_dir_named packages

puis j’ai un dossier packages avec ceci à l’intérieur :

exemple de code :

fichier xxxxx.yaml

template:
  - sensor:
  ####### Prévisions Tempo OpenDPE #######
    - name: "OpenDPE forecast J2"
      unique_id: opendpe_forecast_j2
      availability: > #Pour mettre à jours les capteurs sous-jacents lorsque le raw1 est mis à jour
        {{ states('sensor.opendpe_raw_day1') not in ['unavailable', 'unknown', ''] }}
      state: >
        {% set target_date = (now() + timedelta(days=2)).strftime('%Y-%m-%d') %}
        {% set ns = namespace(couleur='unknown') %}
        {% for i in range(1, 12) %}
          {% set sensor = 'sensor.opendpe_raw_day' ~ i %}
          {% if states(sensor) == target_date %}
            {% set ns.couleur = state_attr(sensor, 'couleur') | default('unknown') %}
          {% endif %}
        {% endfor %}
        {{ ns.couleur }}
      attributes:
        date: "{{ (now() + timedelta(days=2)).strftime('%Y-%m-%d') }}"
        probability: >
          {% set target_date = (now() + timedelta(days=2)).strftime('%Y-%m-%d') %}
          {% set ns = namespace(prob='') %}
          {% for i in range(1, 12) %}
            {% set sensor = 'sensor.opendpe_raw_day' ~ i %}
            {% if states(sensor) == target_date %}
            {% set ns.prob = state_attr(sensor, 'probability') | default('') %}
            {% endif %}
          {% endfor %}
          {{ ns.prob }}

    - name: "OpenDPE forecast J3"
      unique_id: opendpe_forecast_j3
      availability: > #Pour mettre à jours les capteurs sous-jacents lorsque le raw1 est mis à jour
        {{ states('sensor.opendpe_raw_day1') not in ['unavailable', 'unknown', ''] }}
      state: >
        {% set target_date = (now() + timedelta(days=3)).strftime('%Y-%m-%d') %}
        {% set ns = namespace(couleur='unknown') %}
        {% for i in range(1, 12) %}
          {% set sensor = 'sensor.opendpe_raw_day' ~ i %}
          {% if states(sensor) == target_date %}
            {% set ns.couleur = state_attr(sensor, 'couleur') | default('unknown') %}
          {% endif %}
        {% endfor %}
        {{ ns.couleur }}
      attributes:
        date: "{{ (now() + timedelta(days=3)).strftime('%Y-%m-%d') }}"
        probability: >
          {% set target_date = (now() + timedelta(days=3)).strftime('%Y-%m-%d') %}
          {% set ns = namespace(prob='') %}
          {% for i in range(1, 12) %}
            {% set sensor = 'sensor.opendpe_raw_day' ~ i %}
            {% if states(sensor) == target_date %}
              {% set ns.prob = state_attr(sensor, 'probability') | default('') %}
            {% endif %}
          {% endfor %}
          {{ ns.prob }}

fichier yyyyy.yaml

template:
# compteur eau m³
  - sensor:

############################
# Compteur Eau froide generale  
    - name: "EF litres"
      unique_id: ef_litres
      icon: mdi:counter
#      device_class: water
      state_class: measurement
      state: >
        {{ (states('counter.compteur_ef') | float(default=0) / 1) | round(3) }}
      unit_of_measurement: "L"
      availability: "{{ states('counter.compteur_ef')|is_number and states('counter.compteur_ef')|is_number }}"  

    - name: "EF mètres cubes"
      unique_id: ef_metres_cubes
      icon: mdi:counter
#      device_class: water
      state_class: measurement
      state: >
        {{ (states('counter.compteur_ef') | float(default=0) / 1000) | round(3) }}
      unit_of_measurement: "m³"
      availability: "{{ states('counter.compteur_ef')|is_number and states('counter.compteur_ef')|is_number }}"        

############################
## Compteur ECS
    - name: "ECS litres"
      unique_id: ecs_litres
      icon: mdi:counter
#      device_class: water
      state_class: measurement
      state: >
        {{ (states('counter.compteur_ecs') | float(default=0) / 1) | round(3) }}
      unit_of_measurement: "L"
      availability: "{{ states('counter.compteur_ecs')|is_number and states('counter.compteur_ecs')|is_number }}"      

    - name: "ECS mètres cubes"
      unique_id: ecs_metres_cubes
      icon: mdi:counter
#      device_class: water
      state_class: measurement    
      state: >
        {{ (states('counter.compteur_ecs') | float(default=0) / 1000) | round(3) }}
      unit_of_measurement: "m³"
      availability: "{{ states('counter.compteur_ecs')|is_number and states('counter.compteur_ecs')|is_number }}"

je dois faire quoi ? regrouper tous les fichiers en un seul ?

Si c’est le cas ça va pas simplifier pour s’y retourver

Merci de votre aide

Mais tu n’as rien à faire, tu utilises déjà le nouveau format .
J’utilise package et un seul fichier template avec tout dedans.

homeassistant:
  packages: !include_dir_named packages

Quelques uns que j’avais oublié… Du coup m’en vais ptet les faire par l’UI suivant le type de capteurs…

[edit] tout migré, sans soucis… tout propre…

1 « J'aime »

J’ai trois fichier dans packages qui utilise template:

garbage_sensor_template.yaml
previsions_tempo_template.yaml
compteur_ eau_template.yaml

J’ai mis une partie du contenu de deux d’entre eux ci dessus.

du coup je me demande si je dois les regrouper.

Comme tu veux, rien ne t’oblige.

Ok Merci

Donc pour le moment je vais pas y toucher, si Ha rouspète je corrigerai…

Tu peux avoir 50 fichiers dans tes packages qui chacun contiennent, templates, binary etc… ça ne posera aucun soucis.

Le seul soucis de cette mise à jour est l’abandon (dans 6 mois) de la forme legacy des sensors écrits en yaml rien d’autre.

Donc tant que dans tes packages, tu n’as pas l’ancien format legacy pour décrire un sensor, pas de soucis.


Je n’en ai qu’un qui traine de mon coté, le tout premier que j’avais écrit et que je n’avais jamais pris le temps de transformer, du coup c’est chose faite.

2 « J'aime »

Slt moi je n’avais pas modifier les switch :innocent:


31 à modifier, donc je vais passer directement par l’UI …

J’avais pas vu , aussi :

Les intégrations suivantes ont été supprimées car elles sont incompatibles avec les méthodes d'installation actuellement prises en charge :
Suivi Bluetooth
TASSES
Décora
dlib Détection de visage
dlib Face Identifier
Température d'Eddystone
GStreamer
Clavier
LIRC
Pandora
Caméra Raspberry Pi
SMS
Ciseaux
TensorFlow

Et du coup SMS notifications via GSM-modem ne fonctionne plus , va falloir trouver un autre truc :face_with_monocle:

Bonjour, pour les SMS j’ai trouvé et cela fonctionne très bien.

“SMS Gammu Gateway Add-on”

Je vais regarder cet addon ?

Moi j’ai un warning, et lorsque je copie / colle ce qu’il me donne, il y a des erreurs !

Savez vous comment migrer ces sensors avec les nouveaux template et dans quel fichier le mettre ?

- platform: time_date

  display_options:

    - "time"

    - "date"

    - "date_time"

    - "date_time_utc"

    - "date_time_iso"

    - "time_date"

    - "time_utc"

J’en ai un comme ça et il ne m’a pas demander de le migrer.

Sinon tu peux le faire directement depuis l’ui avec l’intégration date et time.


Mais j’ai une question par rapport à ce sensor car du coup hier j’ai fait du message sur ma config et je me demandais qu’elle était son utilité.

Je l’avais créé lors de mes tout premier pas sur HA car il était dit que j’en avais besoin pour un autre sensor. Hors hier je l’ai pour l’instant désactivé et j’ai l’impression que tout fonctionne correctement donc je m’interroge.