Home Assistant 2025.12 come migrare platform: template alla sintassi moderna ed evitare l'errore di deprecazione

Home Assistant 2025.12: come migrare platform: template alla sintassi moderna ed evitare l’errore di deprecazione

Abbiamo parlato ieri delle novità entusiasmanti di Home Assistant 2025.12: Home Assistant Labs con funzioni sperimentali, automazioni purpose-specific intuitive, Energy Dashboard potenziato con monitoraggio real-time e Winter Mode che fa nevicare sul dashboard. Un aggiornamento ricco di funzionalità che chiude il 2025 in bellezza.​

Tuttavia, insieme alle novità, molti utenti stanno ricevendo un warning preoccupante nelle notifiche e nei log dopo l’aggiornamento:

⚠️ La sintassi obsoleta platform: template per sensor sta per essere rimossa. 
Si prega di migrare [nome_sensore] alla sintassi del modello moderna.

Se anche tu hai ricevuto questo avviso, non sei solo: migliaia di utenti con configurazioni template “legacy” (create prima del 2021) stanno vedendo questo messaggio. La buona notizia? Non è un bug, ma un avviso di deprecazione pianificato che ti dà tempo per agire prima che i tuoi template smettano di funzionare definitivamente.

Questa guida ti mostrerà esattamente come migrare dalla vecchia alla nuova sintassi template, con esempi pratici step-by-step per sensor, binary_sensor, switch e tutti i casi d’uso comuni. Non serve essere esperti YAML: seguendo questa guida, migliorerai anche l’organizzazione e le performance della tua configurazione Home Assistant.


Il warning che sta comparendo a molti utenti

Con l’aggiornamento a Home Assistant 2025.12, molti utenti stanno ricevendo un warning di deprecazione nelle notifiche e nei log:

Importante: Anche se i tuoi template funzionano ancora ora, smetteranno di funzionare in una release futura (probabilmente 2025.2 o 2025.3). È necessario migrarli subito per evitare che le automazioni si rompano improvvisamente.

Perché il cambio di sintassi?

Vecchia sintassi: limitata e poco chiara

La vecchia sintassi template (pre-2021) aveva diverse limitazioni:

Problemi sintassi legacy:

  1. Un template = un sensore: dovevi ripetere platform: template per ogni sensore

  2. Configurazione dispersa: sensori template mescolati ad altri tipi sensor

  3. Opzioni limitate: trigger e attributi custom difficili da implementare

  4. Leggibilità scarsa: file configuration.yaml diventavano caotici con 20+ template

Nuova sintassi: potente e organizzata

La sintassi moderna template (post-2021) risolve tutto:

Vantaggi sintassi moderna:

  1. Organizzazione: tutti i template in sezione dedicata template:

  2. Trigger-based: template che si aggiornano solo quando necessario (risparmio CPU)

  3. Attributi custom illimitati: aggiungi metadati personalizzati facilmente

  4. Leggibilità: struttura chiara e manutenibile

  5. Performance: calcoli solo quando trigger scatta (vs polling continuo legacy)


Come identificare template da migrare

Controllo nei log

Developer Tools > Logs:
Cerca warning tipo:

WARNING (MainThread) [homeassistant.components.template.sensor] 
The platform: template configuration for sensor is deprecated

Controllo manuale configuration.yaml

Cerca nel tuo configuration.yaml (o file inclusi) questa struttura:

sensor:
  - platform: template
    sensors:
      nome_sensore:
        # configurazione sensore

Altri pattern da cercare:

  • binary_sensor: con platform: template

  • switch: con platform: template

  • cover: con platform: template

  • fan: con platform: template

  • light: con platform: template


Migrazione passo-passo: Sensor Template

Esempio 1: Sensor semplice con value_template

VECCHIA SINTASSI (da eliminare):

sensor:
  - platform: template
    sensors:
      stato_balcone:
        friendly_name: "Temperatura Balcone"
        unit_of_measurement: "°C"
        value_template: "{{ states('sensor.temperatura_esterna') | float }}"
        device_class: temperature

NUOVA SINTASSI (corretta):

template:
  - sensor:
      - name: "Temperatura Balcone"
        unit_of_measurement: "°C"
        state: "{{ states('sensor.temperatura_esterna') | float }}"
        device_class: temperature

Cambiamenti chiave:

  • sensor:template:- sensor:

  • friendly_name:name:

  • value_template:state:

  • Rimuovi platform: template e sensors:


Esempio 2: Sensor con attributi custom

VECCHIA SINTASSI:

sensor:
  - platform: template
    sensors:
      potenza_casa:
        friendly_name: "Potenza Casa Totale"
        unit_of_measurement: "W"
        value_template: >
          {{ states('sensor.potenza_soggiorno') | float(0) +
             states('sensor.potenza_cucina') | float(0) +
             states('sensor.potenza_camera') | float(0) }}
        attribute_templates:
          costo_orario: >
            {{ (states('sensor.potenza_casa') | float / 1000 * 0.30) | round(2) }}
          aggiornato: "{{ now().strftime('%H:%M:%S') }}"

NUOVA SINTASSI:

template:
  - sensor:
      - name: "Potenza Casa Totale"
        unit_of_measurement: "W"
        state: >
          {{ states('sensor.potenza_soggiorno') | float(0) +
             states('sensor.potenza_cucina') | float(0) +
             states('sensor.potenza_camera') | float(0) }}
        attributes:
          costo_orario: >
            {{ (states('sensor.potenza_casa') | float / 1000 * 0.30) | round(2) }}
          aggiornato: "{{ now().strftime('%H:%M:%S') }}"

Cambiamenti:

  • attribute_templates:attributes:

  • Resto sintassi identica a esempio 1


Esempio 3: Sensor con availability e icon_template

VECCHIA SINTASSI:

sensor:
  - platform: template
    sensors:
      stato_finestre:
        friendly_name: "Finestre Aperte"
        value_template: >
          {% set aperte = expand('group.finestre') 
             | selectattr('state', 'eq', 'on') | list | count %}
          {{ aperte }}
        unit_of_measurement: "finestre"
        icon_template: >
          {% if states('sensor.stato_finestre') | int > 0 %}
            mdi:window-open
          {% else %}
            mdi:window-closed
          {% endif %}
        availability_template: "{{ states('group.finestre') != 'unavailable' }}"

NUOVA SINTASSI:

template:
  - sensor:
      - name: "Finestre Aperte"
        state: >
          {% set aperte = expand('group.finestre') 
             | selectattr('state', 'eq', 'on') | list | count %}
          {{ aperte }}
        unit_of_measurement: "finestre"
        icon: >
          {% if states('sensor.stato_finestre') | int > 0 %}
            mdi:window-open
          {% else %}
            mdi:window-closed
          {% endif %}
        availability: "{{ states('group.finestre') != 'unavailable' }}"

Cambiamenti:

  • icon_template:icon:

  • availability_template:availability:


Esempio 4: Sensor trigger-based (NUOVO, solo sintassi moderna)

Questa è una funzionalità esclusiva della sintassi moderna: sensor che si aggiorna solo quando trigger scatta, invece di ricalcolare continuamente.

SINTASSI MODERNA CON TRIGGER:

template:
  - trigger:
      - platform: state
        entity_id: sensor.potenza_lavatrice
        to: "0"
        for:
          minutes: 5
    sensor:
      - name: "Lavatrice Terminata"
        state: "{{ now().strftime('%H:%M') }}"
        attributes:
          tempo_ciclo: "{{ (now() - trigger.from_state.last_changed).total_seconds() / 60 }}"

Vantaggi trigger-based:

  • Performance: calcolo solo al trigger (vs ogni 30 secondi legacy)

  • Variabile trigger disponibile: accedi a trigger.from_state, trigger.to_state

  • Logica evento: perfetto per tracking eventi discreti (lavatrice finita, porta aperta/chiusa)


Migrazione Binary Sensor Template

Esempio binary_sensor

VECCHIA SINTASSI:

binary_sensor:
  - platform: template
    sensors:
      notte:
        friendly_name: "È Notte"
        device_class: light
        value_template: >
          {{ now().hour >= 22 or now().hour < 6 }}

NUOVA SINTASSI:

template:
  - binary_sensor:
      - name: "È Notte"
        device_class: light
        state: >
          {{ now().hour >= 22 or now().hour < 6 }}

Cambiamenti:

  • binary_sensor:template:- binary_sensor:

  • value_template:state:


Migrazione Switch Template

Esempio switch con turn_on/turn_off

VECCHIA SINTASSI: