Sullo schermo dell'auto, aprendo Home Assistant, vedo una lista corta: «🚗 Esco di casa», «🏠 Arrivo a casa», «📋 Stato casa», «🤖 Robot pulisci», «🤖 Robot alla base». Un tocco e lo script parte. E quando esco dal cancello con qualcosa rimasto acceso, o quando mi avvicino a casa con l'allarme armato, sullo schermo arriva una notifica con due pulsanti.

Home Assistant gira in Docker su un mini PC di casa, il telefono è un Android con l'app ufficiale. A casa ci sono l'allarme Blink, luci e prese Smart Life, un condizionatore e una caldaia Tuya, un sensore gas, il robot Dreame e un gateway WhatsApp che manda conferme e avvisi. Questa guida racconta come li ho portati in macchina.

🚫 Perché niente dashboard

Volevo «una dashboard per Android Auto». Non esiste: Android Auto non mostra pagine web né dashboard Lovelace. L'app Home Assistant però ha un supporto diretto per Android Auto: mostra elenchi di entità (script, scene, luci, interruttori, pulsanti), una lista di Preferiti e le notifiche inviate con l'opzione car_ui: true.

Quindi la «dashboard» diventa un'altra cosa: pochi script fatti bene, con nomi chiari ed emoji, da mettere nei Preferiti, più notifiche con pulsanti per i due momenti in cui serve davvero, l'uscita e l'arrivo.

Il nome dello script è l'unica cosa che vedo prima di toccarlo, quindi deve dire da solo cosa succede. L'emoji in testa aiuta a riconoscerlo con un'occhiata, senza leggere. E ogni script deve fare tutto il lavoro da solo: in macchina non c'è spazio per scegliere opzioni o confermare passaggi intermedi.

🧱 L'architettura

📱 Telefonoapp Home Assistant e Android Auto
Tailscale
→
🔒 Tailnetnessuna porta aperta sul router
nome Tailscale del server
→
🏠 Home Assistantin Docker sul mini PC

Da fuori casa il telefono raggiunge Home Assistant con Tailscale, senza aprire porte sul router e senza servizi cloud: telefono e server sono nella stessa tailnet, e nell'app l'URL esterno è il nome Tailscale del server, con la porta di Home Assistant. L'ho raccontato in monitorare il mini PC.

📜 Gli script

Tutto sta in un package YAML. Il primo pezzo è lo script che manda le notifiche all'auto. Riceve titolo, messaggio e pulsanti e chiama il servizio di notifica del telefono con le opzioni giuste: car_ui per farla comparire sullo schermo dell'auto, un canale dedicato, priorità alta e un tag fisso, così la notifica nuova sostituisce la vecchia invece di accumularsi.

Avere un solo script per tutte le notifiche dell'auto ha un vantaggio pratico: le opzioni stanno in un posto solo. Se un giorno voglio cambiare il canale o la priorità, lo faccio lì e vale per uscita, arrivo e stato casa insieme.

script:
  auto_notifica:
    alias: Notifica in auto
    fields:
      titolo: {}
      messaggio: {}
      pulsanti: {}
    sequence:
      - action: notify.mobile_app_telefono
        data:
          title: "{{ titolo }}"
          message: "{{ messaggio }}"
          data:
            car_ui: true
            channel: Auto
            importance: high
            tag: auto
            actions: "{{ pulsanti | default([]) }}"

🚗 Esco di casa

Spegne luci e condizionatore se sono accesi, arma l'allarme e manda un riepilogo. La lista si filtra prima: has_value scarta le entità che non rispondono, reject('is_state', 'off') quelle già spente.

  auto_esco:
    alias: "🚗 Esco di casa"
    sequence:
      - variables:
          da_spegnere: >-
            {{ ['light.studio', 'light.cucina', 'light.esterno', 'climate.condizionatore']
               | select('has_value') | reject('is_state', 'off') | list }}
      - if: "{{ da_spegnere | count > 0 }}"
        then:
          - action: homeassistant.turn_off
            target:
              entity_id: "{{ da_spegnere }}"
      - action: alarm_control_panel.alarm_arm_away
        target:
          entity_id: alarm_control_panel.casa
      - action: script.auto_notifica
        data:
          titolo: "🚗 Casa chiusa"
          messaggio: "🛡️ Allarme armato · 💡 spenti: {{ da_spegnere | count }}"

🏠 Arrivo a casa

Disarma l'allarme riusando lo script che manda anche la conferma su WhatsApp, e accende le luci esterne solo se il sole è sotto l'orizzonte, secondo sun.sun.

  auto_arrivo:
    alias: "🏠 Arrivo a casa"
    sequence:
      - action: script.allarme_disarma
      - if:
          - condition: state
            entity_id: sun.sun
            state: below_horizon
        then:
          - action: light.turn_on
            target:
              entity_id: light.esterno

📋 Stato casa

Un'unica notifica con allarme, luci accese, temperatura interna, clima, gas e robot. Gli stati arrivano in inglese (armed_away, docked…), quindi una piccola mappa li traduce in italiano.

  auto_stato:
    alias: "📋 Stato casa"
    sequence:
      - variables:
          it:
            armed_away: armato
            disarmed: disarmato
            cool: freddo
            heat: caldo
            "off": spento
            docked: alla base
            cleaning: in pulizia
          t: "{{ (it.get(states('alarm_control_panel.casa'), states('alarm_control_panel.casa'))) }}"
      - action: script.auto_notifica
        data:
          titolo: "📋 Stato casa"
          messaggio: >-
            🛡️ {{ t }} · 💡 {{ states('sensor.luci_accese') }} accese ·
            🌡️ {{ states('sensor.temperatura_interna') }} °C ·
            ❄️ {{ it.get(states('climate.condizionatore'), states('climate.condizionatore')) }} ·
            🔥 gas {{ 'ok' if is_state('binary_sensor.gas', 'off') else 'ALLARME' }} ·
            🤖 {{ it.get(states('vacuum.robot'), states('vacuum.robot')) }}

Gli ultimi due script, «🤖 Robot pulisci» e «🤖 Robot alla base», mandano il robot a pulire e lo riportano alla stazione. Per il primo vale quello che ho scoperto in robot Dreame da WhatsApp: avviare e riprendere spesso sono lo stesso servizio.

Un sensore di riepilogo

Un sensore template conta e nomina le luci accese. Lo uso nelle notifiche e nelle condizioni delle automazioni:

template:
  - sensor:
      - name: Luci accese
        state: >-
          {{ ['light.studio', 'light.cucina', 'light.esterno']
             | select('is_state', 'on') | list | count }}
        attributes:
          nomi: >-
            {{ ['light.studio', 'light.cucina', 'light.esterno']
               | select('is_state', 'on') | map('state_attr', 'friendly_name') | join(', ') }}

📍 Zone e automazioni

La zona home di serie ha un raggio di 100 metri: quando scatta sono già davanti al cancello. Per l'arrivo serve una zona più larga, «Vicino a casa», con un raggio di 1 km. Le coordinate stanno nei secrets, non nel package.

zone:
  - name: Vicino a casa
    latitude: !secret casa_latitudine
    longitude: !secret casa_longitudine
    radius: 1000
    icon: mdi:home-import-outline

La zona serve solo all'arrivo. Per l'uscita basta la zona di casa: appena il tracker del telefono la lascia, l'automazione controlla se c'è qualcosa da sistemare.

Le automazioni sono tre, e tutte dipendono da due cose: il sensore «Android Auto» dell'app, acceso solo quando il telefono è collegato all'auto, e un interruttore per spegnere gli avvisi. Così non partono in bici, a piedi o quando sono passeggero in un'altra auto.

automation:
  - alias: Auto - uscita da casa
    triggers:
      - trigger: state
        entity_id: device_tracker.telefono
        from: home
    conditions:
      - condition: state
        entity_id: input_boolean.avvisi_auto
        state: "on"
      - condition: state
        entity_id: binary_sensor.telefono_android_auto
        state: "on"
      - condition: template
        value_template: >-
          {{ not is_state('alarm_control_panel.casa', 'armed_away')
             or states('sensor.luci_accese') | int(0) > 0 }}
    actions:
      - action: script.auto_notifica
        data:
          titolo: "🚗 Stai uscendo"
          messaggio: "Allarme non armato o luci accese"
          pulsanti:
            - action: AUTO_ESCO
              title: Arma e spegni
            - action: AUTO_NIENTE
              title: Lascia così

L'avvicinamento è uguale, con un trigger di ingresso nella zona da 1 km e la condizione che l'allarme sia armato; i pulsanti sono «Disarma» (AUTO_ARRIVO) e «Non ora». La terza automazione ascolta i pulsanti e lancia lo script giusto:

  - alias: Auto - pulsanti delle notifiche
    triggers:
      - trigger: event
        event_type: mobile_app_notification_action
        event_data:
          action: AUTO_ESCO
        id: esco
      - trigger: event
        event_type: mobile_app_notification_action
        event_data:
          action: AUTO_ARRIVO
        id: arrivo
    actions:
      - choose:
          - conditions: "{{ trigger.id == 'esco' }}"
            sequence:
              - action: script.auto_esco
          - conditions: "{{ trigger.id == 'arrivo' }}"
            sequence:
              - action: script.auto_arrivo

I pulsanti «Lascia così» e «Non ora» non hanno un'automazione: chiudono la notifica e basta. Ci sono perché la scelta di non fare niente deve essere comoda quanto l'altra: se c'è solo «Arma e spegni», prima o poi lo premo per far sparire la notifica.

La condizione dell'uscita è volutamente stretta. La notifica arriva solo se c'è davvero qualcosa da sistemare, cioè l'allarme non armato o almeno una luce accesa, contata dal sensore di riepilogo. Se la casa è già a posto, esco senza che lo schermo dell'auto mi dica niente.

📱 Preparare il telefono

Questa è la parte che fa la differenza. Senza questi passaggi il codice è giusto ma non scatta niente.

✅ Checklist

  • Tailscale sempre attivo; nell'app, URL esterno impostato sul nome Tailscale del server, con la porta di Home Assistant.
  • Nell'app, in Impostazioni → Sensori, attivare «Android Auto», che di serie è disabilitato.
  • Posizione su «Consenti sempre» e posizione in background attiva.
  • Sui telefoni Xiaomi con MIUI o HyperOS, togliere le restrizioni della batteria all'app: altrimenti il tracker si aggiorna di rado e l'uscita non viene vista.
  • In auto: aprire Home Assistant su Android Auto e aggiungere ai Preferiti gli script e le scene.

🎛️ Pulsanti e notifiche

PulsanteDove compareCosa fa
🚗 Esco di casaPreferitiSpegne luci e clima accesi, arma l'allarme, manda il riepilogo
🏠 Arrivo a casaPreferitiDisarma con conferma su WhatsApp, luci esterne se è buio
📋 Stato casaPreferitiUna notifica con allarme, luci, temperatura, clima, gas e robot
🤖 Robot pulisci / alla basePreferitiManda il robot a pulire o alla stazione
Arma e spegniNotifica di uscitaLancia «Esco di casa»
DisarmaNotifica di avvicinamentoLancia «Arrivo a casa»
Lascia così / Non oraEntrambe le notificheNiente
🚗 Stai uscendo

🛡️ Allarme non armato · 💡 2 luci accese (studio, cucina)

[ Arma e spegni ]  [ Lascia così ]

🏠 Quasi a casa

🛡️ L'allarme è armato

[ Disarma ]  [ Non ora ]

📋 Stato casa

🛡️ armato · 💡 0 accese · 🌡️ 21 °C · ❄️ spento · 🔥 gas ok · 🤖 alla base

Esempi di notifica con testi inventati

🧪 Come l'ho provato

Prima di scrivere ho controllato cosa c'era già. Nell'elenco delle entità del telefono, nel registro, il sensore Android Auto risultava disabilitato. Nella storia del tracker il telefono risultava sempre «home»: segno che la posizione non si aggiornava, quindi un'automazione di uscita non sarebbe mai partita. Ho verificato che Home Assistant risponda sull'indirizzo Tailscale.

Poi ho lanciato «Stato casa» e ho letto nella traccia dello script il messaggio e i dati inviati, con car_ui presente. La prova in macchina è il passo successivo. Le cose da controllare sono queste:

  • gli script compaiono nell'elenco di Home Assistant su Android Auto e si possono mettere nei Preferiti;
  • il sensore Android Auto diventa «on» quando il telefono si collega all'auto;
  • uscendo con una luce accesa arriva la notifica, e «Arma e spegni» fa davvero quello che dice;
  • entrando nel raggio di 1 km con l'allarme armato arriva «Disarma», con la conferma su WhatsApp.

🪤 Intoppi e lezioni

💡 Quello che ho imparato

  • La dashboard per Android Auto non esiste. Si ragiona per entità e notifiche: pochi script con nomi chiari valgono più di una schermata piena.
  • Una lista vuota passata a turn_off può dare errore. Meglio un if prima, come nello script di uscita.
  • In auto le notifiche devono essere brevi. Due pulsanti al massimo, e uno dei due deve essere «non fare niente».
  • Un disarmo all'arrivo può essere annullato da un riarmo a tempo. Se hai un riarmo automatico, decidi quale regola vince.
  • La geolocalizzazione è il punto debole. Senza «Consenti sempre» e senza le eccezioni della batteria, le automazioni di uscita e arrivo non scattano.