Al momento stai visualizzando Posizione delle persone con Home Assistant

Posizione delle persone con Home Assistant

  • Autore dell'articolo:
  • Categoria dell'articolo:Home Assistant
  • Commenti dell'articolo:88 commenti
  • Ultima modifica dell'articolo:23 Febbraio 2022

In questo articolo parleremo della posizione delle persone con Home Assistant: come definire la presenza a casa in modo sicuro e come gestire in modo veloce l’entrata e l’uscita dalle zone configurate.

Home Assistant ci da un ventaglio enorme di possibilità per tracciare la posizione delle persone e sta quindi a noi utilizzare le possibilità giuste per i nostri scopi nel modo migliore.
Lo stesso risultato, infatti, lo possiamo ottenere in modi diversi ma con velocità e affidabilità differenti.

Questo articolo vuole quindi essere una guida per gestire la posizione delle persone con modalità che si sono rivelate molto stabili e attendibili così che ognuno non debba reinventarsi la ruota ma possa partire da una soluzione funzionante, comprendendola e adattandola alle proprie specifiche necessità.

Con le informazioni di questo articolo sarai in grado di sapere chi c’è a casa in modo sicuro, configurare delle notifiche su Alexa e/o su App Home Assistant quando una persona entra o esce da una zona definita (con funzionamento rapido!) e creare gli eventi “ultimo esce da casa” e “primo entra a casa” che ti permetteranno di effettuare azioni automatiche in modo semplice come spegnere tutte le luci, attivare/disattivare l’antifurto, abbassare le tapparelle e tutto quel che hai in mente.

Ogni casa, conformazione, abitudini, esigenze sono differenti dalle altre. Questo non vuole essere una guida “fai così per” bensì spiegare i metodi che uso personalmente capendone il funzionamento così da poterlo adattare alle tue specifiche esigenze.

Se è un argomento che può interessarti allaccia la cintura e partiamo, sono certo che troverai diversi spunti interessanti!

Articolo completamente rivisto in data 19/02/2022 alla luce di come si comporta bene da un po’ di tempo a questa parte l’oggetto person di Home Assistant. Ho personalmente utilizzato (e utilizzo tuttora) la configurazione esposta qui per mesi prima di scriverne, per essere sicuro che funzioni bene

Princìpi di base

Con Home Assistant abbiamo la possibilità di tracciare non solo lo stato di a casa / non a casa ma anche la presenza nelle zone configurate (è possibile inserirle in Impostazioni -> Zone ) e addirittura la posizione GPS, che potremo tracciare su una mappa.

Mentre la presenza o meno a casa e nelle zone configurate ci sarà utile per le nostre automazioni la posizione GPS può essere un utile alleato per sapere dove sono i componenti della famiglia (che chiaramente devono essere consenzienti a condividervi la loro posizione) ed anche un utile strumento di debug per capire se la posizione di un dispositivo viene acquisita in modo regolare e corretto.

Potremo infine creare delle card di questo tipo utili, oltre che a livello informativo, anche a scopo di debug nel caso qualcosa non sia come ci aspettiamo:

Card di ausilio alla posizione delle persone con Home Assistant

Configuriamo le zone

Come prima cosa configuriamo le zone che ci interesserà tracciare e di cui creare automazioni che interagiscano con la presenza in esse.

Per farlo andiamo in Impostazioni -> Zone e creiamo tutte le zone che ci interessano.

Configurazione delle zone per individuare la posizione delle persone con Home Assistant
Interfaccia di modifica di una zona. Consiglio di non usare un raggio troppo stretto, quando il GPS è al chiuso la precisione cala notevolmente e rischiate che l’app creda di essere uscita dalla zona ripetutamente durante la permanenza.

Acquisiamo lo stato dei dispositivi con device_tracker

In Home Assistant la localizzazione delle persone viene effettuata con sensori nel dominio device_tracker. Di seguito un elenco di quelli che ritengo più interessanti per il nostro scopo:

Home Assistant Mobile AppAVM FRITZ!BoxNmap TrackerPing (ICMP)Life360Tado
L’app ufficiale di Home Assistant è per me il mezzo migliore di rilevare la posizione delle persone, permette l’uso del GPS e imposta automaticamente il geofencing in background delle zone configurate in Home Assistant. Permette la configurazione della frequenza e precisione richieste così che ognuno possa fare fine tuning di tali parametri, se desiderato (io mi trovo bene a default).
Ricordati di disabilitare le ottimizzazioni della batteria e ogni funzione conservativa per evitare che il sistema operativo dello smartphone non permetta l’aggiornamento della posizione in background!
Leggi la documentazione ufficiale
Chi possiede un router Fritz! come me non può non utilizzare questa ottima integrazione! Essa sfrutta infatti la tabella di presenza in rete dei dispositivi che il router Fritz gestisce già internamente per ogni device connesso in wifi o via cavo alla nostra rete. In tal modo facciamo totale offload di questo carico sul router, senza inondare la rete di pacchetti ICMP per sapere chi è presente. Ottima per sapere velocemente quale smartphone è collegato alla rete wifi di casa in modo stabile ed efficiente. Esistono altre integrazioni di router di altre marche ma non avendoli mai testati non posso consigliarli.
Leggi la documentazione ufficiale
Questa integrazione utilizza NMAP, un potente tool esistente per Linux e Windows che effettua una scansione dei dispositivi presenti in rete con possibilità di utilizzare diverse tecniche di rilevazione. Fa il suo dovere ma per come vedo le cose io preferisco usare i dati, se possibile, che il router già mantiene al suo interno. Se non hai un router integrabile, comunque, questa può essere una utile opzione.
Leggi la documentazione ufficiale
Una semplice integrazione che permette di interrogare degli IP noti (sarà quindi necessario avere un IP statico o prenotato con IP fisso tramite DHCP per i dispositivi da tracciare). L’integrazione è leggera e versatile ma per tracciare gli smartphone, in particolare gli iPhone, rischia di non essere adeguata in quanto i telefoni tendono a disattivare temporaneamente il wifi per risparmiare batteria. Resta una strada da provare, comunque.
Leggi la documentazione ufficiale
Questa è l’integrazione che si interfaccia con l’app Life360 presente per Android e iOS che permette di tracciare i componenti della famiglia. Alcuni utenti si trovano meglio con questa app riportandone la precisione.
l contro, a mio avviso, sono di avere un’ulteriore app che effettua operazioni in background riducendo la batteria e il fatto che l’integrazione sfrutta delle API non ufficiali. Life360 potrebbe interromperne il funzionamento in ogni momento.
Ad ogni modo se hai difficoltà con la posizione di Home Assistant questa è una soluzione da provare.
Leggi la documentazione ufficiale
Se utilizzi Tado come sistema di riscaldamento (qui un articolo se ti interessa capire come funziona) hai installato sugli smartphone dei componenti familiari l’app Tado, che effettua la loro geolocalizzazione e lo fa bene. Con questa integrazione puoi quindi utilizzare l’informazione che i server Tado già acquisiscono ma tieni conto dei seguenti limiti: il polling sul cloud di Tado avviene ogni 30 secondi al massimo, puoi rilevare solo l’informazione home / not-home in quanto per ragioni di privacy Tado non condivide la posizione GPS. Può comunque essere una strada percorribile per aumentare la sicurezza della presenza.
Leggi la documentazione ufficiale

Puoi configurare una o più di una delle integrazioni sopra elencate. Ognuna di esse ti potrà fornire tre tipi di stato diversi:

  • home: quando il dispositivo tracciato viene rilevato come “a casa
  • <nome_zona>: quando il dispositivo tracciato viene rilevato come all’interno di una zona configurata in Home Assistant il device_tracker restituirà come stato il nome della zona stessa. Chiaramente questo vale per le integrazioni che usano il GPS come l’app di Home Assistant o Life360.
  • not_home: quando il dispositivo tracciato risulta non a casa. Per le integrazioni che rilevano il collegamento alla rete di casa come Fritz, Nmap quando il dispositivo non risulta connesso.
    Per le integrazioni che fanno uso del GPS come l’app Home Assistant e Life360, invece, quando la posizione risulta fuori dalla zona di casa ma anche fuori dalle zone definite. Ad esempio durante il tragitto tra casa e il lavoro.

Accorpiamo più informazioni nell’entità Person

E’ una buona idea utilizzare più di un device tracker (in questo articolo io utilizzerò Fritz! e Home Assistant Mobile App), ognuno dei quali viene esposto con una propria entità, che può essere in disaccordo con le altre. A venirci in soccorso c’è l’oggetto Person, configurabile in Impostazioni -> Persone in cui possiamo associare ad ogni persona i propri device_tracker che concorrono alla determinazione della sua posizione.

Impostare i device_tracker nell'entità person per acquisire la posizione delle persone con Home Assistant

Ogni persona può infatti avere uno o più device_tracker associati (potenzialmente anche nessuno). In tal modo Home Assistant applicherà dei criteri piuttosto sofisticati per determinare nel migliore dei modi la posizione più probabile della persona, soprattutto quando i tracker non sono in accordo. Consiglio a tal proposito di leggere con attenzione la pagina di documentazione ufficiale che descrive molto bene questo aspetto con un esempio concreto.

Se hai anche un solo device_tracker usa lo stesso l’oggetto Person e crea le tue automazioni su di esso, non direttamente sul device_tracker!
Potrebbe sembrarti superfluo ma in questo modo disaccoppi il concetto di “persona” da quello di “dispositivi della persona”. Come conseguenza se cambierai o aggiungerai modalità di tracciamento ti basterà modificare i tracker della persona e le tue automazioni continueranno a funzionare senza alcuna modifica.

Gli oggetti person possono quindi assumere lo stato di home, not_home e <nome_zona> esattamente come i device_tracker, solo che lo stato è determinato dall’aggiornamento migliore/più recente.

Nota: l’oggetto person, fortunatamente, è molto conservativo nel determinare lo stato di home. Se quindi anche uno solo dei sensori risulta home l’oggetto person sarà esso stesso home. Questo è utilissimo perchè se mentre siamo a casa il GPS avesse una posizione molto imprecisa perchè siamo all’interno della casa e credesse di trovarsi fuori casa, ci sarebbe sempre l’integrazione locale (del router o NMAP/ping) a ricordare all’oggetto person che in realtà noi siamo a casa.

Poco più avanti aggiungeremo anche un terzo device tracker per velocizzare i cambi di zona in alcuni frangenti.

Tracking diverso per persone diverse

Non necessariamente per tutte le persone dobbiamo utilizzare le stesse tipologie di device_tracker. Nella mia configurazione, ad esempio, ho due categorie di persone: quelle appartenenti alla mia famiglia che hanno installato l’app Home Assistant e quelle che possono venire a casa mia ed ha senso tracciarne la presenza.

Nel primo caso, per i componenti della famiglia, traccio la posizione GPS, le zone e la presenza o meno a casa (vedremo meglio in seguito come).

Per tutti gli altri, invece, mi limito a tracciarne il fatto che il loro smartphone sia collegato alla mia rete wifi. In questo modo basta che abbiano con sé il telefono per far sapere al mio Home Assistant che sono a casa mia.

Per esempio gestisco la presenza della nonna quando io e mia moglie non ci siamo per configurarlo lo stato del riscaldamento automaticamente. O ancora gestisco anche la presenza della nonna per l’attivazione / disattivazione automatica dell’antifurto.

Attenzione! Per rispettare la privacy è necessario avere un esplicito consenso delle persone tracciate indicando loro lo scopo del tracciamento, le esatte modalità, dove risiedono i dati tracciati e chi è il responsabile della privacy. Bisogna anche essere pronti a rimuovere un tracciamento qualora la persona lo richieda.

Tre package per migliorare notevolmente la rilevazione

Compresi i concetti di base passerò ora a descrivere tre dei package che ho creato per migliorare sensibilmente la velocità e la precisione delle rilevazioni.

Il file che hai appena scaricato persone-base-packages-v2.zip contiene una cartella Persone da scompattare all’interno della tua cartella packages, così da ottenere una struttura come questa:

Struttura dei packages di questo articolo per acquisire la posizione delle persone con Home Assistant
Struttura dei packages di questo articolo per acquisire la posizione delle persone con Home Assistant

Ricordo che non sono packages che puoi copiare e sei pronto ma andranno adattati alle tue specifiche esigenze. Servono per illustrare un metodo e imparare magari delle cose lungo il percorso.
Se te lo stai chiedendo, inoltre, gli altri packages dello screenshot li discuteremo in un altro articolo 😉

Per comprendere i packages e adattarli alle tue esigenze è bene che tu capisca com’è la mia configurazione.
In questi packages sono coinvolte tre entità person:

  • person.henrik: sono io, tracciato dall’app e da Fritz e dal wifi (vedi in seguito)
  • person.antonella: mia moglie, tracciata dall’app e da Fritz e dal wifi (vedi in seguito)
  • person.ankie mia mamma, tracciata solo da Fritz

Io lavoro nella zona chiamata ufficio, mia moglie lavora nella zona chiamata negozio. Dal lockdown ho iniziato a tornare a casa a pranzo, prima andavo a mangiare in un locale vicino, per questo c’è una configurazione apposita per escludere o meno la possibilità.

Per le notifiche utilizzo lo script multinotify che permette di inviare notifiche alle app e ad Alexa contemporaneamente, oltre che gestire diversi comodi aspetti come un volume notifica separato.
Se non lo conosci ti consiglio caldamente il seguente articolo: Multinotify: il package per le notifiche su Alexa e App

Passiamo ora alla descrizione dei tre package così da capirne i concetti che ne stanno alla base.

Package wifi.yaml: rendiamo istantaneo il passaggio tra zone

Ora che abbiamo configurato i nostri oggetti person e le zone che ci interessa tracciare (come il luogo di lavoro dei componenti familiari, i genitori / suoceri ed ogni luogo che vogliamo utilizzare come identificazione dello stato al fine di farne delle automazioni) possiamo procedere a creare delle automazioni al passaggio dentro e fuori le zone. C’è un “però”…

La prima cosa di cui ci accorgeremmo, infatti, è che le automazioni al cambio stato delle entità person (e uguale sarebbe usando i device_tracker) risultano a volte in ritardo rispetto alle aspettative. Questo perchè l’app non interroga la posizione GPS di continuo per risparmiare batteria e dovrà quindi avere il tempo di “accorgersi” che si è entrati o usciti da una determinata zona.

Tanto lavoro è stato fatto sul geofencing delle app da quando avevo steso questo articolo originalmente e devo dire che il tracker GPS dell’app companion, almeno su Android, funziona ora piuttosto bene. Molto dipende però dallo smartphone e dalle personalizzazioni del suo produttore che possono modificare piuttosto considerevolmente la velocità di aggiornamento / refresh della posizione GPS.

Possiamo però usare un trucchetto per velocizzare parecchio questi passaggi: sfruttare il collegamento a un SSID specifico di quella zona. L’app invia infatti in modo quasi immediato le connessioni o disconnessioni dalle reti Wifi.

Per attivare questo sensore andare dal’app premendo sull’hamburger menu Hamburger menu, Configurazioni -> App complementare -> Gestione dei sensori -> sezione Sensori di rete e abilitiamo il sensore Connessione WiFi. Questa operazione creerà un sensore il cui stato sarà l’SSID (il nome della rete wifi) a cui il telefono è collegato oppure <not connected> se non collegato ad alcuna rete WiFi.

Per fare un esempio in ufficio ho uno specifico SSID wifi. Quando arrivo in ufficio il mio telefono si connette all’access point ancor prima che sia entrato dalla porta d’ingresso. Mentre il GPS deve ancora aggiornarsi il telefono informa la mia istanza di Home Assistant che si è collegato a quella specifica rete WiFi e uso questa opportunità per impostare lo stato del device_tracker alla zona dell’ufficio.
Stesso discorso all’uscita: il telefono si scollegherà dal WiFi ben prima che il GPS se ne accorga. E anche in questo caso sfrutto questo evento per impostare lo stato del device_tracker a not_home prima che lo faccia il GPS.

Sebbene usare il wifi può velocizzare la rilevazione dei cambi zona, in particolare delle zone esterne a casa e del rientro all’abitazione, c’è anche un contro. Limitatamente a quando siamo fuori casa, se spegniamo il wifi del telefono, viene spento/riavviato l’access point della zona in cui siamo o ci spostiamo fuori portata wifi, il tracker passerà a not_home, facendo scattare le automazioni di uscita dalla zona. Valuta bene se questa soluzione può essere adatta alle tue abitudini ed eventualmente escludila dalle zone dove potrebbe non funzionare bene. Nei miei casi d’uso ne sono davvero soddisfatto.
(quando sei a casa, invece, l’oggetto person non cambia da home finché un sensore, specialmente quello del router, rimane su home)

Come funziona l’impostazione del device_tracker in base all’SSID

Analizzando il package wifi.yaml scaricato precedentemente ci accorgiamo che è composto da una sola automazione che gestisce tutti i tracker e tutte le reti wifi che vogliamo gestire. Di seguito l’automazione che poi andiamo ad analizzare per capirne il funzionamento ed adattarla alla tua configurazione. Gli SSID e le zone sono inventati a scopo didattico.

automation:
  # Rilevazione della zona in base all'SSID a cui è collegato lo smartphone
  - id: 48d481d3-9051-443b-a8ea-3e698f99f560
    alias: Tracker - Wifi - Telefoni
    trace:
      stored_traces: 20
    trigger:
      - platform: state
        entity_id: 
          - sensor.tel_henrik_wifi
          - sensor.tel_anto_wifi
          - sensor.tel_erica_wifi_connection
        to:
    action:
      - variables:
          tracker: "{{ trigger.from_state.object_id }}"
          zona: >
            {% set zone =
              [
                {'ssid': '<not connected>', 'zona': 'not_home'},
                {'ssid': 'ssid-casa',          'zona': 'home'},
                {'ssid': 'ssid-guests',   'zona': 'home'},
                {'ssid': 'altro-ssid',    'zona': 'negozio'},
                {'ssid': 'ssid-ufficio',   'zona': 'ufficio'},
                {'ssid': 'ssid-ufficio-guests', 'zona': 'ufficio'},
                {'ssid': 'ssid-casa-amici', 'zona': 'mariorossi'},
                {'ssid': 'ssid-casa-amici-5g',   'zona': 'mariorossi'},
                {'ssid': 'ssid-suocera',       'zona': 'suocera'},
                {'ssid': 'ssid-nonni',       'zona': 'nonni'}
              ]
            %}
            {{zone | selectattr('ssid', 'eq', trigger.to_state.state) | map(attribute='zona') | first | default('not_home')}}
      - alias: "Imposta la zona"
        service: device_tracker.see
        data:
          dev_id: "{{tracker}}"
          location_name: "{{zona}}"

Analizziamo pezzo per pezzo l’automazione per capirne il funzionamento.

    trace:
      stored_traces: 20

Tramite questo semplice attributo indichiamo ad Home Assistant di conservare le ultime 20 tracce di esecuzione dell’automazione, che possono venirci estremamente utili per effettuare il debug dell’entrata/uscita dalle zone.

    trigger:
      - platform: state
        entity_id: 
          - sensor.tel_henrik_wifi
          - sensor.tel_anto_wifi
          - sensor.tel_erica_wifi_connection
        to:

Nel trigger indichiamo ad Home Assistant tutti i sensori wifi degli smartphone che abbiamo attivato precedentemente e to: così che l’automazione venga eseguita ogni volta che lo stato di uno di questi sensori cambi.

    action:
      - variables:
          tracker: "{{ trigger.from_state.object_id }}"

Nella prima azione impostiamo delle variabili che useremo in seguito. La prima, chiamata tracker, conterrà l’object_id dell’entità che ha fatto scattare l’automazione. L’oggetto speciale trigger, infatti, rappresenta il trigger che ha fatto scattare l’automazione tra tutti quelli configurati e ci permette di acquisirne lo stato precedente, successivo al trigger e, chiaramente, i dati identificativi come entity_id (per esempio sensor.tel_henrik_wifi) o object_id (nell’esempio precedente sarebbe tel_henrik_wifi)

          zona: >
            {% set zone =
              [
                {'ssid': '<not connected>',     'zona': 'not_home'},
                {'ssid': 'ssid-casa',           'zona': 'home'},
                {'ssid': 'ssid-guests',         'zona': 'home'},
                {'ssid': 'altro-ssid',          'zona': 'negozio'},
                {'ssid': 'ssid-ufficio',        'zona': 'ufficio'},
                {'ssid': 'ssid-ufficio-guests', 'zona': 'ufficio'},
                {'ssid': 'ssid-casa-amici',     'zona': 'mariorossi'},
                {'ssid': 'ssid-casa-amici-5g',  'zona': 'mariorossi'},
                {'ssid': 'ssid-suocera',        'zona': 'suocera'},
                {'ssid': 'ssid-nonni',          'zona': 'nonni'}
              ]
            %}
            {{zone | selectattr('ssid', 'eq', trigger.to_state.state) | map(attribute='zona') | first | default('not_home')}}

L’assegnazione della variabile zona è il cuore dell’automazione. Tramite template, infatti, dichiariamo un array di dizionari da assegnare alla variabile interna zone. In ogni record dell’array delimitato da [], infatti, dichiariamo un dizionario delimitato da {} che dichiara l’attributo ssid (che definisce il nome della rete che vogliamo gestire) e l’attributo zona che definisce il nome della zona che vogliamo attribuire a quello specifico nome rete wifi.
Sostituisci quindi i tuoi SSID che vuoi gestire con i nomi delle zone che hai definito in Home Assistant.

Un grazie a Massimiliano Albani che mi ha introdotto agli array di dizionari. Metodo preziosissimo per automazioni che possono gestire dati variabili senza dover creare automazioni multiple.

L’ultima riga è la selezione effettiva che restituisce il nome della zona a partire dall’array di dizionari definita e dallo stato del sensore che ha fatto scattare il trigger.

Seguiamone il flusso:

  • zone è l’array di dizionari
  • tramite pipe | lo diamo in pasto alla funzione selectattr('ssid', 'eq', trigger.to_state.state) che seleziona il record avente l’attributo ssid uguale (eq sta per equal) al valore dello stato dell’entità che ha fatto scattare il trigger (trigger.to_state.state). Il risultato è un array dei dizionari che rispettano la condizione specificata.
  • tramite pipe | processiamo il risultato con map(attribute='zona') che estrae dai dizionari di ogni record il solo attributo zona restituendo un array di stringhe contenenti le zone dei record filtrati precedentemente.
  • tramite pipe | processiamo quindi l’array precedente con first che ci restituirà la sola stringa corrispondente al primo record dell’array in ingresso (la selezione restituisce un record solo ma selectattr restituisce un array quindi per avere un valore singolo è necessario prendere un solo elemento con first)
  • infine tramite ancora pipe | processiamo il risultato con default('not_home') così che se il dato in arrivo è nullo restituiamo il valore not_home che corrisponde a quando non siamo né a casa né in una zona definita. Quando questo può accadere? Quando siamo connessi ad una rete wifi avente SSID non definito nell’elenco precedente!
      - alias: "Imposta la zona"
        service: device_tracker.see
        data:
          dev_id: "{{tracker}}"
          location_name: "{{zona}}"

Definiti i valori delle due variabili spiegate sopra non ci resta che effettuare la magia. Con il servizio device_tracker.see, infatti, possiamo impostare un device_tracker (se non esiste lo crea!) avente entity_id device_tracker.QUEL_CHE_PASSIAMO_A_DEV_ID e come stato quel che passiamo a location_name.

A dev_id passiamo il valore della variabile tracker, definita al principio, contenente l’object_id del sensore, ad esempio sensor.tel_henrik_wifi corrispondente a tel_henrik_wifi che quindi creerà o aggiornerà l’entità device_tracker.tel_henrik_wifi avente lo stato passato a location_name.

Le entità create con device_tracker.see saranno visibili al primo cambio di rete wifi del dispositivo e non esisteranno, pertanto, prima che questa operazione avvenga. Per forzarla al momento si può disattivare il wifi del telefono per impostare lo stato del sensore a <not connected>

Aggiungere i device_tracker wifi ognuno al relativo oggetto person di appartenenza

Una volta creati i device_tracker wifi come spiegato nel capitolo precedente dobbiamo modificare gli oggetti person relativi ad ognuno di essi ed includere tali device_tracker in essi come spiegato nel capitolo relativo.

In tal modo sarà la logica presente in Home Assistant ad accorpare le informazioni derivanti da GPS, device_tracker locale (quale Fritz) e device_tracker wifi nel migliore dei modi, valutando qual è l’informazione più aggiornata tra quelle presenti, quando discordi, e aggiornando lo stato dell’oggetto person di conseguenza. Vedrai che tale logica farà un buon lavoro e genererà un risultato affidabile.

Nell’immagine che segue ti mostro un esempio reale del mio sistema che mette a confronto la posizione (a partire dall’alto) dei seguenti elementi:

  • Oggetto person
  • Posizione del device_tracker dell’app companion
  • device_tracker di FritzBox che determina la connessione alla rete di casa
  • device tracker wifi come creato precedentemente
  • sensore SSID usato dal device_tracker wifi a scopo di controllo
  • source, attributo dell’oggeto person che determina da cosa Home Assistant sta prendendo la posizione
Rilevazione posizione delle varie entità definite nell'oggetto person di Home Assistant

Possiamo notare come in diverse occasioni la connessione o sconnessione alla rete wifi abbia impostato una posizione che altrimenti non avremmo potuto avere.

Package auto_detect.yaml

In questo package ci sono varie utilità. Vediamole insieme pezzo per pezzo.

Rilevare la prima persona che si alza la mattina

input_boolean:
  primo_sceso_scale_today:
    name: La prima persona è scesa dalle scale oggi?

automation:
# Primo che scende le scale della giornata
  - id: 47182d5e-8f95-43f2-9503-fca9dd5fcd3c
    alias: Persone - Evento - Primo che scende le scale della giornata
    description: Chiama l'evento quando il primo scende le scale della giornata (presumibilmente la mattina)
    trigger:
      - platform: state
        entity_id: binary_sensor.motion_soggiorno
        to: 'on'
      - platform: state
        entity_id: binary_sensor.motion_cucina
        to: 'on'
    condition:
      - condition: state
        entity_id: input_boolean.primo_sceso_scale_today
        state: 'off'
    action:
      - alias: "Imposto flag primo_sceso_scale_today"
        service: input_boolean.turn_on
        target:
          entity_id: input_boolean.primo_sceso_scale_today
      - event: primo_sceso_scale

  # Alle 6:20 di mattina resetta lo stato di "primo sceso dalle scale oggi", così alla mattina scatta di nuovo scendendo le scale
  - id: d617f7ff-28eb-4255-9926-b8ead30700b7
    alias: 'Persone - Logica - Reset flag primo sceso dalle scale oggi'
    trigger:
      - platform: time
        at: '06:20:00'
    action:
      - service: input_boolean.turn_off
        target:
          entity_id: input_boolean.primo_sceso_scale_today

Questa automazione, che ha poco a che fare con la posizione, può essere però di ispirazione per diversi utilizzi uguali o simili.

In sostanza, avendo casa su più piani e la zona notte è al primo piano, determino il momento in cui il primo componente della famiglia scende a pian terreno dopo la notte. In quel momento genero l’evento primo_sceso_scale che uso in diverse automazioni definite in altri package: un briefing di Alexa che dà il buongiorno, fa gli auguri se è il compleanno di qualcuno, se fuori c’è luce del sole alza le tapparelle e mette musica di sottofondo (a seconda di vari parametri).

Alle 6:20 di mattina resetto lo stato di “primo sceso dalle scale” così che l’automazione sopra sia pronta a scattare quando il PIR a pian terreno rileva la presenza di qualcuno.

Sensori più esteticamente gradevoli da mettere in UI

binary_sensor:
  - platform: template
    sensors:
      # Stato di "a casa" di Henrik basato sul suo oggetto Person
      # un falso "non a casa" dovuto ad un bounce della presenza dell'entità person. L'arrivo a casa è immediato tanto quanto la rilevazione di Fritz,
      # mentre l'uscita necessita che sia Fritz che il sensore dell'app, ritardato 10 minuti, concordino nello stato di "non a casa"
      henrik_at_home:
        friendly_name: "Henrik a casa?"
        unique_id: "henrik_at_home"
        device_class: presence
        value_template: "{{ is_state('person.henrik_sozzi', 'home')}}"
        entity_picture_template: "/local/henrik{% if not(is_state('person.henrik_sozzi', 'home')) %}_off{% endif %}.jpg"

Questi sensori binari (sopra ne è riportato uno solo sui tre definiti in quanto il principio di funzionamento è identico) servono per utilizzare l’informazione di persona a casa nell’interfaccia utente in quanto creano un sensore di presenza con stato on / off (a casa, fuori casa), con immagine henrik.jpg quando a casa e henrik_off.jpg quando fuori casa. Tramite un software di fotoritocco ho generato la seconda immagine modificando la prima in bianco e nero e schiarendola un po’, così che sia evidente anche graficamente lo stato di ogni persona.

L’impostazione di device_class al valore presence permette ad Home Assistant di sapere che lo stato di on e off si riferiscono alla presenza nominando tale valore in modo opportuno.

Questi sensori sono pratici da inserire nelle card o nei badge delle viste, ottenendo un risultato come questo:

Posizione delle persone con Home Assistant tramite l'utilizzo di badge con i sensori creati

Quale device_tracker sta determinando la posizione dell’oggetto person?

template:
  - sensor:
      # Sensori person_NAME_source che determinano nel tempo quale sorgente viene usata dall'oggetto person per determinare la posizione
      - name: Person Henrik Source
        unique_id: 8693c26f-d00d-493b-b129-f79a03d97deb
        state: "{{ state_attr('person.henrik_sozzi', 'source')[15:] }}"

Anche in questo caso riporto uno solo dei sensori template in quanto gli altri funzionano allo stesso modo. Le entità create (sensor.person_henrik_source nel codice sopra) contengono il valore dell’attributo source dell’oggetto person, che contiene il nome del device_tracker usato per determinare la posizione dell’oggetto person. Il codice [15:0] serve a prelevare da tale valore dal quindicesimo carattere così da saltare il dominio del sensore. In tal modo il valore restituito è più compatto e sarà, per esempio, tel_henrik_wifi e non device_tracker.tel_henrik_wifi.

Questo sensore è usato nella vista grafica dello stato dei device_tracker mostrata al termine del capitolo riguardante il tracker wifi.

Switch per impostare lo stato della posizione ad alta accuratezza dell’app

switch:
  - platform: template
    switches:
      # Swtich tel_NOME_hq_gps per rilevare e modificare lo stato di alta qualità nella rilevazione della posizione dei telefoni
      tel_henrik_hq_gps:
        friendly_name: Tel Henrik HQ GPS
        unique_id: e67c8229-65f9-40b1-9f6c-c8c983ccb69d
        value_template: "{{ is_state('binary_sensor.tel_henrik_high_accuracy_mode', 'on') }}"
        availability_template: "{{ states.binary_sensor.tel_henrik_high_accuracy_mode.state is defined }}"
        turn_on:
          service: notify.mobile_app_tel_henrik
          data:
            message: "command_high_accuracy_mode"
            title: "turn_on"
        turn_off:
          service: notify.mobile_app_tel_henrik
          data:
            message: "command_high_accuracy_mode"
            title: "turn_off"

Di nuovo questo è uno degli switch dichiarati per ogni persona, tutti funzionano allo stesso modo.

Questi switch permettono, inserendoli in interfaccia grafica, di mostrare se la posizione dell’app della persona sta usando la posizione di alta accuratezza oppure quella normale. Premendo è possibile inoltre impostarne lo stato così da specificare in casi particolari se si desidera una posizione più precisa.

Il comportamento di questo switch è molto bizzarro in quanto quando ci clicchiamo per cambiarne stato il suo stato torna graficamente immediatamente quello che aveva prima ma il comando è stato inviato. Quando finalmente l’app l’avrà presa in considerazione lo stato dello switch tornerà nello stato che abbiamo impostato.
Ricorda anche che attivando la posizione ad alta accuratezza il consumo della batteria sarà più elevato.

Definizione del gruppo “Qualcuno è a casa?”

group:
  # Gruppo per determinare se qualcuno è a casa (contiene solo i telefoni che certamente non sono lasciati a casa)
  anyone_at_home:
    name: Qualcuno è a casa?
    entities:
      - binary_sensor.henrik_at_home
      - binary_sensor.antonella_at_home
      - binary_sensor.ankie_at_home

Questo è un semplice gruppo che contiene tutti i binary sensor dichiarati sopra relativi a tutti i telefoni tenuti sempre con sè. Attenzione a ragionare bene su quali dispositivi includere: lo smartphone di mia figlia, ad esempio, non l’ho incluso in quanto quando lei è a scuola il telefono è a casa (e farebbe risultare qualcuno a casa, se incluso nel gruppo).

Questo gruppo può poi essere utilizzato per qualunque tipo di automazione in altri package, ad esempio per modificare la temperatura delle zone di casa quando qualcuno rientra e viceversa abbassarle quando non c’è nessuno a casa.

Il suo stato, infatti, diventa on se lo stato di almeno una qualsiasi delle entità definite è on.

Generiamo eventi “ultimo esce da casa” e “primo entra a casa”

automation:
  # Chiama l'evento uscita ultimo da casa
  - id: 86680100-fb55-4867-9f24-e8133ccc74e4
    alias: Persone - Evento - Generazione - Uscita ultimo da casa
    description: Chiama l'evento uscita ultimo da casa
    trigger:
      - platform: state
        entity_id: group.anyone_at_home
        to: 'off'
    action:
      - event: uscita_ultimo_da_casa

  # Chiama l'evento arrivo del primo a casa
  - id: cd3842d0-39d6-45a9-8f0c-6d18852e32fa
    alias: Persone - Evento - Rientro del primo a casa
    description: Chiama l'evento rientro del primo a casa
    trigger:
      - platform: state
        entity_id: group.anyone_at_home
        to: 'on'
    action:
      - event: arrivo_primo_a_casa

Queste due automazioni generano gli eventi uscita_ultimo_da_casa e arrivo_primo_a_casa.
Tali eventi possono essere utilizzati da qualunque altro package per effettuare delle automazioni in questi due specifici casi, ovvero quando l’ultima persona esce da casa (lasciandola quindi vuota) e quando il primo rientra a casa.
Pensiamo ad esempio allo spegnimento delle luci in modo automatico quando tutti sono fuori casa. O all’inserimento / disinserimento automatico dell’antifurto. O ancora ad alzare / abbassare le tapparelle in modo automatico.

Gestire tutti questi casi con trigger basati su questi eventi ci permette di tenere separati i package di luci, antifurto e tapparelle da questo e utilizzare un evento che ha una specifica logica definita una volta sola.

Altro vantaggio è rendere molto chiara e comprensibile la condizione di attivazione del trigger in altri package sulla base delle logiche definite qui. uscita_ultimo_da_casa, infatti, è auto esplicativo.

Se in futuro volessimo modificare la logica di definizione di “a casa” o il numero delle persone gestite sarà sufficiente modificare questo package e tutti gli altri che fanno uso di questi eventi non dovranno essere modificati! Un bel vantaggio!
Consiglio questo approccio a livello generale dove abbia senso creare degli eventi logici disgiunti dalle automazioni sottostanti.

Un aiuto dalla telecamera per rilevare lo stato di “a casa” prima di arrivare alla porta

automation:
  # Quando rilevo movimento dalla telecamera frontale forzo una rilevazione della posizione GPS delle app di chi non risulta a casa
  # (perchè potrebbe essere lui/lei che sta entrando. Così facendo l'app rileverà la posizione prima di arrivare alla porta di casa)
  - id: 18b09f9d-7d52-4d09-9d8a-42d789ffcc80
    alias: "Persone - Logica - Forzo rilevazione GPS quando movimento da cam front"
    trigger:
      - platform: state
        entity_id: binary_sensor.front_cam_motion
        from: "off"
        to: "on"
    action:
      - alias: "Se Henrik non è a casa forza un rilevamento GPS"
        choose:
        - conditions:
            - condition: not
              conditions:
                - alias: "Henrik è a casa?"
                  condition: state
                  entity_id: person.henrik_sozzi
                  state: "home"
          sequence:
            - service: notify.mobile_app_tel_henrik
              data:
                message: "request_location_update"
      - alias: "Se Antonella non è a casa forza un rilevamento GPS"
        choose:
        - conditions:
            - condition: not
              conditions:
                - alias: "Antonella è a casa?"
                  condition: state
                  entity_id: person.antonella
                  state: "home"
          sequence:
            - service: notify.mobile_app_smartphone_antonella
              data:
                message: "request_location_update"

Ultima automazione definita in questo package è un helper che funziona abbastanza bene nel mio caso.

Quel che fa, in sostanza, è forzare una rilevazione della posizione delle persone che non risultano a casa (e che possono far cambiare lo stato di group.anyone_at_home definito sopra) quando viene rilevato un movimento dalla telecamera che inquadra il mio vialetto di ingresso.

In tal modo, se l’app companion non ha ancora rilevato il rientro a casa prima di entrare dal cancello di casa, sarà il movimento della telecamera ad imporre un refresh della posizione a chi non risulta a casa, facilitando la possibilità di essere rilevato a casa PRIMA di arrivare alla porta di ingresso di casa.

Chiaramente è una condizione particolare che può andar bene solo se hai una abitazione indipendente come la mia ma è un concetto che può essere utilizzato a più ampio spettro.

Perchè questa accortezza? Perchè quando una persona rientra a casa l’antifurto viene automaticamente disinserito, le tapparelle (se fuori c’è luce), si accende la luce frontale di casa e quando apriamo la porta di casa Alexa ci saluta per nome e accende la luce dell’ingresso, mettendo poi una musica di sottofondo (e facendoci gli auguri se è il compleanno di chi sta entrando).

E’ quindi importante fare il possibile affinchè lo stato di “a casa” venga rilevato a tutti i costi prima di entrare in casa. E posso dire che tra rilevazione tramite wifi, come spiegato sopra, app companion e questa accortezza il 99,9% delle volte funziona senza problemi.

Package zone_notify.yaml: notifiche all’arrivo / rientro dal lavoro

L’ultimo package che prendiamo in esame gestisce le notifiche tramite Alexa e app (sempre tramite multinotify) quando un componente della famiglia arriva o esce dal lavoro.

Magari ad alcuni può sembrare una violazione della privacy ma io e mia moglie le troviamo molto comode in quanto chi di noi è a casa riesce ad organizzarsi meglio con i tempi di preparazione pranzo / cena e gestione delle bambine. Se si è tutti d’accordo (e non c’è niente da nascondere 😉 ) credetemi che è una bella comodità. Inoltre abbiamo dei super device_tracker potenziati con il wifi, perchè non sfruttarli?!

Il primo blocco definisce due input_boolean:

input_boolean:
  notifiche_lavoro:
    name: Notifiche and/rit lavoro
    icon: mdi:briefcase-outline
  henrik_ritorno_a_pranzo:
    name: Henrik ritorna a casa a pranzo
    icon: mdi:pasta

notifiche_lavoro è pensato per essere inserito nell’interfaccia grafica e poter quindi abilitare o disabilitare tutte le notifiche di questo package.

henrik_ritorna_a_pranzo è anch’esso pensato da inserire in una card e serve per determinare se io rientro a pranzo oppure no (prima della pandemia difficilmente rientravo a pranzo ma con i ristoranti chiusi ho iniziato a farlo e lascio quindi questo flag impostato, attivando la notifica del rientro al pranzo).

L’automazione di rientro dal lavoro (variante semplice)

Iniziamo con analizzare l’automazione più semplice: quella di mia moglie che esce dal negozio (l’altra di mia moglie ha lo stesso principio):

automation:
  - id: 489203b7-4720-4e73-8801-e130c889dfe9
    alias: "Persone - Notifica - Antonella esce dal negozio"
    description: "Avvisa tramite Alexa quando Anto esce dal negozio"
    trigger:
      - entity_id: person.antonella
        from: Negozio
        platform: state
    condition:
      - condition: template
        value_template: "{{ (as_timestamp(now()) - as_timestamp(state_attr('automation.persone_notifica_antonella_arriva_in_negozio', 'last_triggered') | default(0)) | int > 1800)}}"  
      - condition: template
        value_template: "{{ (as_timestamp(now()) - as_timestamp(state_attr('automation.persone_notifica_antonella_esce_dal_negozio', 'last_triggered') | default(0)) | int > 1800)}}"  
      - condition: state
        entity_id: input_boolean.notifiche_lavoro
        state: 'on'
    action:
      - service: script.multinotify
        data:
          title: Antonella sta tornando
          message: Antonella è uscita dal negozio!
          alexa_message: '<say-as interpret-as="interjection">yippii</say-as>. La mamma è uscita dal negozio!'
          alexa_target: media_player.ovunque
          notify_app: notify.all_devices
          channel: people-fromwork
          group: people
          tag: "{{trigger.to_state.name}} home"

Partiamo dal trigger: sull’oggetto person di mia moglie quando lo stato passa da Negozio a qualunque altra cosa.

Ci sono tre condizioni. L’ultima è quella più semplice: se le notifiche di questo tipo sono attivate tramite l’input_boolean configurato all’inizio.
Le prima due, invece, sono due template che permettono l’esecuzione dell’automazione solo se il tempo trascorso dall’ultima volta che questa o l’automazione di arrivo in negozio di mia moglie è più di 1800 secondi (mezz’ora).

Ricorda questo “trucchetto” che puoi usare in molti altri contesti dove non vuoi che un’automazione venga attivata più volte di seguito in un lasso temporale a scelta. Sfruttiamo l’attributo last_triggered che restituisce la data/ora dell’ultima volta che l’automazione è stata valutata, ovvero in cui un trigger è scattato. Prendiamo la data/ora corrente now() , l’attributo last_triggered, li trasformiamo in timestamp e sottraendo il secondo dal primo otterremo il numero di secondi trascorsi.

Questo evita i possibili bounce di stato possibili per diverse ragioni o ad esmepio che l’automazione riscatti se di ritorna indietro a prendere una cosa dimenticata e si esce di nuovo.

Nell’action richiamiamo lo script multinotify usando un testo per l’app e uno con una interiezione da far pronunciare a tutti i dispositivi Alexa di casa ed inviare a tutte le app.

L’automazione di rientro dal lavoro (variante più complessa)

Vediamo ora l’automazione che notifica il rientro a casa della mia persona, con qualche condizione in più che può risultare utile anche a te:

automation:
  # Arrivo al lavoro / rientro dal lavoro
  - id: 49f72ed4-1b6c-4729-baf9-edaa86fd072f
    alias: "Persone - Notifica - Henrik ritorna dal lavoro"
    description: "Quando Henrik esce dalla zona lavoro dopo le ore 19:00 annuncia il ritorno a casa con Alexa"
    trigger:
      - entity_id: person.henrik_sozzi
        from: Ufficio
        platform: state
    condition:
      - condition: template
        value_template: "{{ (as_timestamp(now()) - as_timestamp(state_attr('automation.persone_notifica_henrik_ritorna_dal_lavoro', 'last_triggered') | default(0)) | int > 1800)}}"  
      - condition: state
        entity_id: input_boolean.notifiche_lavoro
        state: 'on'
      - condition: or
        conditions:
          - condition: time
            after: '19:00:00'
            before: '22:00:00'
            weekday:
              - mon
              - tue
              - wed
              - thu
              - fri
          - condition: and
            conditions:
              - condition: state
                entity_id: input_boolean.henrik_ritorno_a_pranzo
                state: 'on'
              - condition: time
                after: '11:40:00'
                before: '14:00:00'
                weekday:
                  - mon
                  - tue
                  - wed
                  - thu
                  - fri
    action:
      - service: script.multinotify
        data:
          title: "Henrik sta tornando"
          message: "Henrik sta tornando dall'ufficio!"
          alexa_message: '<say-as interpret-as="interjection">yippii</say-as>. Papà sta tornando dall ufficio!'
          alexa_target: media_player.ovunque
          notify_app: notify.all_devices
          channel: people-fromwork
          group: people
          tag: "{{trigger.to_state.name}} home"

La sostanza è uguale alla precedente ma in più ha delle finestre temporali espresse nelle condizioni così riassumibili:

  • Se esco dal lavoro dal lunedì al venerdì tra le 19:00 e le 22:00 oppure
  • Se esco dal lavoro dal lunedi al venerdi tra le 11:40 e le 14:00 e l'input_boolean henrik_ritorno_a_pranzo è on

Questo perchè a me capita di uscire dal lavoro durante la giornata per interventi presso clienti o commissioni, in questo modo mi assicuro che l’orario sia uno di quelli dove rientro a casa.

Una notifica generica ogni volta che una persona monitorata entra o esce da casa

  # Qualcuno arriva a casa o parte da casa
  - id: 0bb4febe-f9b1-445c-9b27-ac9793c4a617
    alias: "Persone - Notifica - Qualcuno arriva o parte da casa"
    trigger:
      # To: home
      - platform: state
        entity_id: person.henrik_sozzi
        to: "home"
      - platform: state
        entity_id: person.antonella
        to: "home"
      - platform: state
        entity_id: person.erica
        to: "home"
      - platform: state
        entity_id: person.angelo
        to: "home"
      - platform: state
        entity_id: person.ankie
        to: "home"
      - platform: state
        entity_id: person.anna
        to: "home"
      - platform: state
        entity_id: person.giuseppe
        to: "home"
      - platform: state
        entity_id: person.paola
        to: "home"
      # From: home
      - platform: state
        entity_id: person.henrik_sozzi
        from: "home"
      - platform: state
        entity_id: person.antonella
        from: "home"
      - platform: state
        entity_id: person.erica
        from: "home"
      - platform: state
        entity_id: person.angelo
        from: "home"
      - platform: state
        entity_id: person.ankie
        from: "home"
      - platform: state
        entity_id: person.anna
        from: "home"
      - platform: state
        entity_id: person.giuseppe
        from: "home"
      - platform: state
        entity_id: person.paola
        from: "home"
    action:
      - service: script.multinotify
        data:
          notify_app: notify.mobile_app_tel_henrik
          title: >
            {% if trigger.to_state.state == 'home' %}
              {{trigger.to_state.name}} è a casa
            {% else %}
              {{trigger.to_state.name}} non è più a casa
            {% endif %}
          message: >
            {% if trigger.to_state.state == 'home' %}
              {{trigger.to_state.name}} è ora entrato/a a casa
            {% else %}
              {{trigger.to_state.name}} è ora uscito/a da casa
            {% endif %}
          channel: >
            {% if trigger.to_state.state == 'home' %}
              people-tohome
            {% else %}
              people-fromhome
            {% endif %}
          group: people
          tag: "{{trigger.to_state.name}} home"

Con questa automazione, che ha come trigger il passaggio da home a qualunque altro valore o da qualunque altro valore ad home delle persone monitorate (tramite app o anche solo tramite device_tracker locale come Fritz che rileva il collegamento alla propria rete dello smartphone), possiamo ricevere una notifica contenente il nome della persona che è arrivata o è appena andata via da casa nostra.

Questa automazione, nata a scopo di debug, l’ho poi trovata utile per diversi motivi. La notifica inviata tramite l’app ha title e message contenenti il nome della persona e channel differente a seconda che sia un ingresso o un’uscita. In tal modo possiamo assegnare una suoneria differente ai due tipi di notifica.
Il group è sempre people, così che questo tipo di notifiche si raggruppi con le altre notifiche dello stesso tipo.
Infine il tag è composto dal nome della persona più la scritta home, così che sia la stessa per persona, sia per l’ingresso che per l’uscita. Tramite questo stratagemma se una persona va e viene diverse volte da casa sul telefono vedremo solo la notifica dell’ultima azione e non tutta la storia della giornata.

Conclusione

Ricordando la premessa che queste automazioni potrebbero non andar bene a tutti per diversi motivi come il momento in cui il tracker Fritz (o similare) si accorge della vostra presenza a casa o della presenza o meno di access point Wifi da tracciare o altre particolarità ancora, proprie di ogni differente abitazione, spero però di aver condiviso un modo di approcciarsi alla questione che ti abbia dato degli spunti per aiutarti a costruire le automazioni più idonee alla tua specifica situazione.

Nel mio caso posso garantire che quanto spiegato in questo articolo è in uso da oltre un anno e funziona davvero bene!
Ti auguro che anche nel tuo specifico caso riesca a trovare un equilibrio tra tempi ed esigenze come nel mio così da poter utilizzare le informazioni circa la posizione di ognuno in specifiche automazioni di casa tua.

Ti è piaciuto questo contenuto?

Se ti è stato utile l’articolo che hai letto potresti pensare di darmi una mano offrendomi qualche caffè!
Oltre ad aiutarmi a star sveglio nelle nottate di ricerche e scrittura mi daresti una mano concreta nel sostenere le spese del server web, incentivandomi a produrre altri contenuti di qualità.

Puoi usare Paypal:

Oppure Buymeacoffee:

Henrik Sozzi

Sono un analista programmatore per lavoro e per passione. Amo la domotica, la stampa 3D e la tecnologia in generale.

Questo articolo ha 88 commenti.

  1. Giovanni

    Ottimo articolo, solo una correzione: TADO condivide la posizione in termini di distanza da casa e gradi (qualche info sui campi di bearingFromHome su https://blog.scphillips.com/posts/2017/01/the-tado-api-v2/ e interessante progetto di cpoetter su GitHub che qualche anno fa funzionava egregiamente). Con opportuna formula matematica puoi arrivare alla posizione. Chiaramente può essere che l’integrazione non la supporti.

    1. Henrik Sozzi

      Grazie, interessante l’informazione su Tado. Effettivamente ho visto l’articolo che citi ed effettivamente i gradi sono espressi con parecchia precisione tanto che potrebbe essere in effetti possibile calcolare una posizione. Anche se è un po’ overkill in quanto ci sono metodi più semplici. Ma volendo usare un’app che già lo fa potrebbe essere un’opzione. Non ho verificato (perchè non uso il tracker Tado in HA) se l’integrazione utilizza tali dati e se li utilizza con sufficiente precisione (ad esempio se arrotonda al grado intero è inutile). Cmq. interessante, grazie!

  2. Alberto

    Buongiorno,
    seguo con molto interesse il blog e non posso che fare i complimenti per come è scritto e come sono esposte e trattate le tematiche.
    Per quanto riguarda il tracking la soluzione con iBeacon come la vedi? Posseggo anch’io il fritz 7590 ma la rilevazione non mi ha mai convinto del tutto, risultando spesso fuori casa quando invece non lo ero; non ho ancora provato i settaggi che proponi sopra, mea culpa… ho iPhone, se può essere indicativo

    Grazie, un saluto

    1. Henrik Sozzi

      Grazie Alberto! iBeacon non l’ho mai provato perché essendo dell’altra sponda (Android) non ho mai avuto il modo. Però può essere un valido ausilio di rilevazione della zona se hai iPhone, immagino. Io stavo pensando ad una soluzione con un ESP8266 in zona portachiavi all’ingresso di casa e un portachiavi Tile per ogni mazzo di chiavi per rilevare con certezza la presenza / assenza a casa delle persone, da aggiungere agli altri criteri dell’articolo. Comunque ogni sistema può essere usato, basta conoscerne i limiti e le peculiarità per integrarne i dati al meglio.

    2. Henrik Sozzi

      Ah, mi ero dimenticato di rispondere alla seconda parte… Il device tracker Fritz è quanto di più affidabile abbia per rilevare a casa / fuori casa. So che iPhone da una certa versione ha introdotto un meccanismo anti tracciamento che randomizza il mac address ogni tanto (che può essere il motivo per cui non ti convince 😉 so che può essere disattivato ma non chiedermi dove… Provalo bene perchè funziona in modo ottimo!

  3. Alberto

    Ti confermo che la colpa è esattamente del meccanismo che dici, sostanzialmente dopo un tot diventa “invisibile” per il Wi-Fi facendo credere ad home assistant di essere fuori casa. Per 10 euro ho preso tempo fa un dongle iBeacon per provare (ma è sempre mancato il tempo), che con OwnTracks dovrebbe aiutare nello scopo. Se funziona bene ti aggiorno. Grazie, un saluto

  4. Fabrizio

    Ciao nel caso la cartella package non è presente basta crearla? Per inserire i file?
    Il tutto funziona con home assistant 2021.9.6?
    Fabrizio

    1. Henrik Sozzi

      Ciao Fabrizio. Si, la cartella package va creata. Non serve che si chiami necessariamente così, puoi chiamarla anche “pippo” o puoi crearne più di una. Serve a farti un’organizzazione dei file corretta. L’importante è che la (o le) richiami con il nome corretto dal configuration.yaml con il comando packages: !include_dir_named packages.
      Il tutto funziona con l’ultima versione di HA, la sto usando correntemente così come è stata scritta nell’articolo 🙂

  5. Ciao, mi sto avvicinando ora al mondo HA. Leggo con interesse il tuo articolo poiché devo realizzare una funzione che, tramite HA, mi permetta di comunicare ad un PLC Schneider la presenza in casa di qualche membro della famiglia. Ora, la comunicazione funziona perfettamente, mi manca l’automatismo. Vorrei sfruttare questa guida che hai redatto ma mi areno subito alle funzioni base. Quindi, domanda 1:
    – id: 46ff3d01-3f76-4f8b-a128-558a4c26a6ff —> E’ un ID casuale o lo generi in qualche modo preciso?
    – Il nome della SSID da inserire nel file Secrets. La mia SSID è un nome con degli spazi (FRITZ!Box 4040 2,4GHz. C’è una notazione precisa per includere gli spazi?
    Grazie mille.
    Andrea

    1. Henrik Sozzi

      Ciao Andrea,
      l’id è un valore casuale, l’importante è che siano tutti diversi gli id delle automazioni per permettere di identificarli in modo univoco. E’ opzionale, puoi anche non metterlo ma in tal caso non potrai guardare la traccia storica di esecuzione che è la manna dal cielo per capire perchè un’automazione non abbia funzionato a regime.
      Io ho utilizzato semplicemente un GUID, che è la cosa univoca più veloce da generare (usando VSCode basta installare un Plugin che generi GUID e con un click lo generi nel codice)
      Per quanto riguarda la seconda domanda, vale per qualsiasi valore in qualunque file di configurazione yaml di Home Assistant: basta che metti la stringa tra apici singoli o doppi. Il tuo valore sarà quindi qualcosa come:
      wifi_ufficio: "FRITZ!Box 4040 2,4GHz"

  6. Ciao, grazie della risposta. Credo di aver fatto tutto bene ma l’automazione non funziona.
    L’ho scritta così:

    # ANDREA WiFi CASA OFF
    – id: cd4f5929-bc8a-4197-88ad-3d81a7a195ac
    alias: Tracker Andrea Wifi Casa OFF
    description: Imposta lo stato not_home quando il telefono si scollega dal WiFi di casa
    trigger:
    – entity_id: device_tracker.mi_9
    from: !secret SSID_Casa
    platform: state
    action:
    – service: python_script.set_state
    data:
    entity_id: device_tracker.mi_9
    state: not_home
    source_type: wifi

    Ho testato lo script python e quello funziona perfettamente ma l’automazione… col cavolo!
    Per testarla ho provato a disconnettermi dalla WiFi di casa ma niente, non ne vuole sapere.
    Cosa sbaglio??
    Grazie

    1. Henrik Sozzi

      Hai sbagliato entità nel trigger! Non devi usare il device Tracker, che mappa dove sei, ma il sensore che dice a quale ssid sei collegato. Controlla di averlo attivo dall’app sul telefono in Configura App, gestione sensori, Connessione Wifi. Usa quel sensore come trigger.

  7. Andrea Santinelli

    Ciao, grazie ancora! Ho modificato il trigger ma non funziona nulla. Ho la sensazione che le automazioni non vengano proprio eseguite. Ho attivato altri sensori del telefono (info batteria) ma il loro aggiornamento su HA é lentissimo e spesso non si aggiornano. Dove sbaglio? Grazie

    1. Henrik Sozzi

      Puoi verificare dal log di esecuzione della automazione che si accede da impostazioni -> automazioni e cliccando sull’icona con un orologio che torna indietro relativo alla tua automazione incriminata.
      Puoi verificare che tu non abbia delle limitazioni energetiche nel sistema operativo relative all’app di Home Assistant che ne limitano gli aggiornamenti in background.
      Ma soprattutto se questi sono i tuoi problemi ti consiglio di fermarti un attimo, partire da cose più semplici, accendere una luce con un sensore di movimento, avanzare per piccoli passi e poi, una volta acquisita la consapevolezza del sistema, di realizzare automatismi più complessi come questo. Ci metterai di più ad arrivare a destinazione ma una volta arrivato starai viaggiando veloce e potrai tagliare nuovi e più lontani traguardi con facilita…

  8. Ciao, grazie della risposta. In realtà ho scoperto che le automazioni funzionano benissimo ma i problemi sono nell’App del telefono che non aggiorna lo stato dei sensori a meno che la App stessa non sia attiva in primo piano. Se spengo la WiFi del telefono, ad esempio, il suo stato non viene aggiornato a meno che non apro l’App dopo aver attivato la VPN del telefono. Credo quindi che il problema sia nella configurazione dell’App. Eppure le ho dato tutti i permessi, l’esecuzione in background, tutto di tutto. Stesso problema nel telefono di mia moglie. Riguardo al tuo consiglio delle cose semplici.. in realtà sono partito proprio da quelle. Interruttori, sensori di presenza, monitor consumi e comunicazione Modbus TCP/IP con il PLC di casa mia. Tutto per passi. Ora mi manca la gestione delle presenze in casa per attivare del codice scritto nel PLC per la gestione del ricambio aria e della climatizzazione. Grazie comunque del tuo aiuto!

    1. Henrik Sozzi

      Sul mio Samsung devo escludere l’app dall’ottimizzazione batteria altrimenti si comporterebbe come descritto. Ma ogni produttore chiama la cosa in modo diverso quindi non so darti una indicazione precisa. Ma l’area di ricerca è quella.
      E ti garantisco che a me e mia moglie, Xiaomi A2 Lite vecchiotto, funziona molto bene.

  9. Io ho uno Xiaomi Mi9 e mia moglie un Redmi 5 Plus (sempre Xiaomi). Tutto attivato ma non ne vuole sapere di funzionare…
    Grazie mille, il tuo articolo è stato molto illuminante.. complimenti!!

  10. Disinstallata l’app da entrambi i telefoni. L’ho riconfigurata totalmente, ho attivato tutti i permessi, ho eliminato il risparmio energia, ho attivato tutte le condivisioni possibili. Ho perso un pomeriggio intero. Il nulla più totale. Se apri l’app e sei collegato (VPN se sono fuori casa) allora tutto si aggiorna. Altrimenti nulla di nulla. Così è scoraggiante. Non sono un profano di tecnologia e/o programmazione, lo faccio di mestiere da 20 anni. Mai avuto tutti questi problemi a far funzionare una cosa che, fondamentalmente, è banale. Se la sensoristica funziona bene, risponde correttamente, fare automazioni non è complesso, basta un po’ di pratica e si riesce. Ma con un funzionamento così ‘approssimativo’ è impossibile anche provare a fare qualcosa di funzionante. Anche perché cadi nell’errore di pensare che una automazione non funziona mentre invece è il sensore trigger a non funzionare. Molto deluso.

    1. Henrik Sozzi

      Scusa se ti ho mal valutato quando ti ho consigliato di iniziare dalle cose semplici, ora ho un quadro migliore della tua situazione. Ti posso dire una cosa sola: tieni duro. Home Assistant è un gran software. Nessuno ti fa pagare niente, è open source e con tante teste. Sebbene coordinato non sempre tutto è lineare come sarebbe un software commerciale ma ha davvero tanta potenzialità. In casa mia è diventato una cosa che non solo apprezza ma da cui dipende anche mia moglie 🙂 E più lo usi più entri in un tunnel senza fondo. Non farti scoraggiare da un disguido. Comincia magari trovando una strada alternativa (Life360?) o manuale, poi ci lavorerai sopra per capire dove hai problemi.
      Detto questo, perchè la VPN? Non potrebbe essere lei che causa qualche disguido? Inoltre se apri l’app da dentro casa in wifi l’interfaccia funziona? Non va solo in background e solo quando sei collegato in wifi? C’è qualcosa di strano da capire. Hai configurato correttamente i due indirizzi (esterno e interno con nome wifi)?
      Cerca di capirlo non con le automazioni, che hai sempre mille dubbi sui trigger all’inizio, ma guardando lo storico dei sensori, il wifi nel tuo caso. Così vedi quando e come era.
      Poi magari hai trovato un problema con il tuo smartphone, puoi eventualmente provare ad aprire un issue nel repo github dell’app: https://github.com/home-assistant/android
      Anch’io in passato ho avuto qualche problema con l’aggiornamento in background ma normalmente mi funzionava. Da diversi mesi non ho più mezzo problema.

  11. Andrea Santinelli

    Ciao, grazie del tempo che mi dedichi. Allora, quando sono in casa è connesso con il WiFi, tutto funziona alla grande. Appena mi disconnetto (ad esempio perché me ne sono andato) ecco che non si aggiorna più nulla. Se attivo la vpn torna tutto a funzionare perché, di fatto, é come se fossi connesso al WiFi di casa. Uso la vpn da sempre per avere accesso ad altri dispositivi nella mia rete domestica e non ho mai avuto problemi. Ora, tu mi parli di 2 indirizzi, uno esterno ed uno interno. Boom!! Forse il problema é li. Da me, nella app, ho configurato URL di home Assistant e URL di connessione interno sullo stesso indirizzo. SSID WiFi della connessione domestica impostato con il nome corretto. Come imposto URL di home Assistant per accedere dall’esterno senza usare VPN?? Perché allora il problema é questo, senza VPN attiva la app non riesce a comunicare con il server di HA!!! Ecco il problema!! Grazie!!!

    1. Henrik Sozzi

      Ah ecco, l’ho capita al contrario, cioè che non funzionasse collegata al wifi, invece era al contrario: non funziona quando connessa all’esterno! Così è tutto più chiaro!
      È importante fare in modo che tu possa accedere ad Home Assistant da fuori casa e per farlo ci sono due modi: uno semplicissimo (quello che uso io): accedi da Impostazioni -> Home Assistant Cloud e attiva Nabu Casa. Costa 5$ (meno di 5€) al mese per un ottimo servizio che ti permette di esporre il tuo HA in sicurezza con certificato https in internet senza Nat del router (funziona anche se non hai un IP pubblico, fa connessione inversa) e ti permette di collegare HA ad Alexa e Google Home con un click. Inoltre contribuisci a fare stare in piedi il progetto di Home Assistant finanziando gli sviluppatori (per conto mio se li meritano tutti, hanno trasformato casa mia… 😜)
      L’altra via è gratis ma più impervia, trovi diverse guide online: comporta crearsi un certificato da sè, aprire una porta sul router e usare un servizio tipo duckdns.
      Fatta una di queste due cose è importante che nella configurazione app tu imposti in URL di connessione interno l’indirizzo con cui raggiungere HA da dentro la tua rete wifi (esempio: http://192.168.68.250:8123/ ), URL di Home Assistant l’indirizzo con cui raggiungerlo da internet (se fai Nabu Casa ti danno loro l’indirizzo) e in SSID della rete domestica il nome esatto case sensitive della rete wifi di casa, così l’app sa che quando il telefono è connesso a QUELLA rete usa l’url interno, altrimenti usa quello esterno (“URL di Home Assistant”)
      La VPN non può essere un metodo perché la attivi a bisogno, l’app ha necessità di comunicare costantemente per aggiornare i sensori di posizione, wifi, stato batteria, ecc.
      Ovviamente la VPN è cosa ottima per far manutenzione da remoto al sistema ad esempio accedendo alla configurazione attraverso samba con VSCode o ai device che hai collegato in rete.
      Dai che ci sei 😉

  12. Ci sono riuscito!!!
    Adesso i sensori si aggiornano immediatamente!!
    Per risolvere il problema ho utilizzato una delle guide InDomus (https://indomus.it/guide/collegarsi-da-remoto-a-home-assistant-installato-con-distribuzione-hassio/) utilizzando il servizio gratuito DuckDns, istallando l’omonimo componente aggiuntivo su HASSIO e configurando lo stesso servizio sul router (attivando poi il port-forwarding sulla porta TCP 8123 all’indirizzo del mio Raspberry). Funziona perfettamente!!! Comunque ti ringrazio del tuo prezioso aiuto. Se mai ci dovessimo incontrare ti devo una bevuta!!!

  13. Ciao, sfrutto ancora le tue conoscenze per una domandina semplice. Leggendo questo tuo articolo vedo che sfrutti il parametro ‘entity_picture_template’ per gestire le immagini delle persone in casa. In quel cartella devono risiedere le immagini?

    1. Henrik Sozzi

      Ciao, le immagini di qualunque tipo vanno messe nella /config/www

  14. Ciao, un ultima domandina. Tutto sembra funzionare, le automazioni vengono avviate correttamente. Ma quando viene eseguita l’automazione scatenata dall’aggancio del mio telefono alla wiFi dell’ufficio, la mia posizione rimane sempre “Fuori casa”. Anche quella di mia moglie (non assoggettata a nessuna automazione) viene sempre vista come “Fuori casa”. Ho riavviato il Raspberry per sicurezza ma non cambia nulla. Hai un suggerimento?

  15. Ciao, ti faccio una domanda. Su che piattaforma hardware stai usando HA? Io la sto eseguendo su un Raspberry Pi 3 B+. Ho caricato alcuni add-on (VS Code, InfluxDB, Grafana, DuckDNS) ed ho notato che la RAM di sistema è occupata al 95%. Inoltre, ogni tanto, non riesco ad accedere tramite browser (sia in casa che fuori casa). L’altra mattina mi sono collegato con l’app e stesso problema (la sera prima tutto funzionava). Tant’è che nel grafico storico dei sensori ho un ‘buco’ di qualche ora! Hai idea da cosa possa dipendere? Ti è mai successo? Forse il Pi 3 B+ è sottodimensionato? Grazie

    1. Henrik Sozzi

      Ciao, io su Raspberry Pi 4 con 4GB di RAM. Come Addon ho File Editor, Mosquitto broker, NetDaemon (al momento spento), Samba Share, SQlite Web, SSH & Web Terminal. L’utilizzo di RAM è 25%. L’utilizzo medio di CPU è del 2%.
      Il fatto che la RAM sia al 95% è la probabile causa dei tuoi problemi, l’rpi3b+ ha 1GB di RAM che, se non installi addon, può anche andar bene ma certamente è sottodimensionato, anche per velocità. InfluxDB e Grafana non sono leggeri, direi che lo staoi spremendo troppo.
      Ti consiglio, se hai qualche soldino in più, di passare ad un MiniPC/NUC che è certamente la scelta migliore (magari virtualizzando con ProxMox). Altrimenti almeno un Rpi4 2GB direi che è il minimo.
      Ti consiglio anche un SSD (leggi questo mio articolo!) in quanto l’SD prima o poi ti abbandona…

  16. Andrea Santinelli

    Grazie! Gentilissimo come sempre. Allora rimuovo influx e grafana. Poi mi faccio le ossa con il mio pi3 e, quando ho raggiunto ciò che voglio, faccio il salto ad un hardware più potente!!

  17. orfmia

    Ciao Henrik
    Un consiglio se posso chiedere…
    Non ho un Router FritzBox ma, come molti in italia, un onesto TIM HUB .

    Non riesco a identificare il servizio che esponga i mac-adress, o qualche cosa di simile, dei device collegati (anche se molto probabilmente c’è perchè con l’App TIM Modem ho l’elenco dei connessi

    Non mi resta quindi che cercare una strada diversa per “leggere” la presenza nella intranet di casa del cellulare, ovviamente dopo avergli assegnato un indirizzo ip Statico/Prenotato.
    Ed ecco la richiesta di consiglio che estendo anche a tutti i tuoi lettori… : Nmap o Ping?
    Leggendo in giro ci sono pro e contro:

    Il PING ha bisogno di pochissime risorse del server ma per contro alcuni cellulari non rispondono, NMAP è più esoso, ma forse qualche device in più lo becca…
    ?

    Grazie!

    1. Henrik Sozzi

      Ciao, da quanto ne so non esiste una integrazione per modem Tim. E francamente se fossi uno che fa integrazioni non ci spenderei il mio tempo in quanto potrebbe cambiare da oggi a domani, fanno un nuovo accordo con un altro produttore e cambiano tutto. Fritz invece ha una sua linea di prodotti e hanno delle api dichiarate con librerie per utilizzarle.
      Riguardo la domanda finale ti consiglio di provare prima ping. Se risponde alle tue esigenze stai con quello che appunto è più leggero per l’host e per la rete. Altrimenti nmap potrebbe funzionare meglio ma personalmente sul rpi4 ho avuto problemi, a volte andava in timeout e non riusciva a completare la scansione ma poi avendo preso il Fritz ho risolto ogni problema in tal senso (il suo device Tracker è fantastico e a risorse zero!)
      Cmq se proverai nmap fermati a studiare un po’ la sua sintassi e come funziona in quanto ha diverse modalità che vanno da solo ping ad una rilevazione più complessa e pesante, con diverse vie di mezzo. Fai le tue prove, non hai altra scelta 😉
      (…oppure… Fritz…)

  18. sphinxchocolatecirce42891

    Grazie! Purtroppo passare a Fritz non me la sento, sono tra i pochi fortunati con l’FTTH e l’ONT è integrata nel Modem e francamente va da dio!
    Discorso diverso è il frmware del router Telsy che… lascia a desiderare.
    Ho fatto qualche prova … i cellulari della famiglia non rispondono al Ping, rspondono in maniera un po’ migliore ai pacchetti di NMAP ma ogni tanto “saltano” .
    Proverò utilizzano in “person” la tripletta
    – Geolocalizzazione APP Home Assitstant,
    – Nmap,
    – e il riconoscimento della rete WiFi a cui si collegano…

    poi speriamo che gli “algoritmi” di Person facciano il miracolo 🙂
    Se ritieni vi aggiorno qui…
    Ciao.

    1. Henrik Sozzi

      Capisco la situazione. In ufficio ho l’ont staccato (openfiber) e ti lascia più libero. Nulla ti vieta di usare due dispositivi comunque, puoi anche iniziare col Fritz collegato al router Tim a cui imposti il Fritz in dmz. Ma a parte questa divagazione direi che la tua scelta migliore è esattamente quella che hai espresso. Si, certo, aggiorna pure con gli esiti grazie, è sempre interessante! 👍🏻

      1. Orfmia

        Un altro dubbio…

        l’entità (nel tuo caso) “device_tracker.tel_henrik”
        che con il comado pyton viene aggiornata,
        deve essere “creata” ?

        mi spiego meglio,
        tutto va alla grande, il servizio
        – service: python_script.set_state
        data:
        entity_id: device_tracker.smartphone_Xxxx
        state: not_home
        source_type: wifi

        setta correttamente l’entità, ma solo se “precedentemente esistente”,
        in altre parole se in “Strumenti per Sviluppatori” –> Stati –> vado a pre-settare l’entità device_tracker.smartphone_Xxxx,
        allora poi Pyton ne cambia lo stato.
        Ma se non esiste (per esempio dopo un riavvio di HA)
        non la crea “dal nulla”
        immagino sia da generare in Configuraion.yaml… della serie:

        device_tracker:
        – platform (?)
        name: smartphone_Xxxx
        name: smartphone_Yyyy
        name: smartphone_Zzzz

        sbaglio?

        Grazie!

        1. Henrik Sozzi

          L’entità device_tracker da te nominata viene creata automaticamente dall’app quando la connetti ad Home Assistant la prima volta e da lì non se ne va più via… Quando riavvi HA l’entità deve essere al suo posto come tutte le altre entità (nessuna entità “sparisce” al riavvio). C’è qualquadra che non cosa…

          1. orfmia

            “viene creata automaticamente dall’app quando la connetti ad Home Assistant la prima volta”
            scusa ma è questo che non capisco… 🙁

          2. Henrik Sozzi

            Quando colleghi l’app installata sul tuo smartphone all’istanza di Home Assistant in automatico le entità dei sensori vengono create in Home Assistant. Se abiliti ulteriori sensori questi vengono creati quando li abiliti dall’app. E le entità non vengono mai cancellate al reboot. Di conseguenza da quando hai avviato l’app i sensori sono lì a disposizione. Il device_tracker è uno di quelli attivo per default quindi, appunto, da quando hai collegato l’app alla tua istanza di Home Assistant è lì da usare e non se ne va da solo.

          3. orfmia

            Premetto che ti ringrazio per la pazienza infinita che hai con me e con tanti che ti rompono le scatoe… encomiabile :-)!

            Quato dici mi è chiaro, e così capita anche a me… i sensori / entità creati dall’app (dal cellulare andoid) non spariscono mai!

            tuttavia l’idea era quella di fare come hai fatto tu,

            partire da un sensore dell’App del cellulare (quello che mi dice il nome della rete WiFi a cui è collegato il cellulare)
            e trasformarlo in una entità device_tracker

            Questo perchè solo questo tipo di entità posso unirlo alle altre modailità di analisi della posizione di “Person.” (come dici più sopra in questa pagina.

            Quindi:
            Il sensore che arriva dall’App/Cellulare è
            sensor.cellulare_wifi_connection

            l’Automazione wifi.yaml, che ci hai suggerito, provvede a percepirne la variazione:

            trigger:
            – entity_id: sensor.cellulare_wifi_connection:
            from: Telecom-12345678
            platform: state
            condition: []

            e con il magico Python vai a modificare il varlre dell’entità device_tracker:

            action:
            – service: python_script.set_state
            data:
            entity_id: device_tracker.smartphone_mio
            state: not_home
            source_type: wifi

            e l’inghippo è qui:
            Python cambia di stato l’entità “device_tracker.smartphone_mio” solo se esiste già.
            Python non la crea ex novo se non c’è…
            posso connettere e sconnettere il cellulare dalla WiFi di casa ma nessuna traccia dell’entità “device_tracker.smartphone_mio”

            per testare la cosa è necessario creare l’entità “device_tracker.smartphone_mio” andando in
            Strumenti per sviluppatori…
            definendo la Nuova entità “device_tracker.smartphone_mio”
            e come STATO metterci qualche cosa …. “pippo” per esempio.

            da questo momento in poi “device_tracker.smartphone_mio” esiste e python ne cambia di stato agganciando o sganciando il cellulare dalla wifi di casa correttamente

            Tuttavia, se spengo o riavvio HA “device_tracker.smartphone_mio” scompare dalle Entità Correnti in Strumenti per sviluppatori e torno da capo

            lo stesso male se richiamo il servizio set_state a mano:
            Strumenti per sviluppatori –> Servizi –>
            service: python_script.set_state
            data:
            entity_id: device_tracker.smartphone_mio2
            state: home
            source_type: wifi

            poi “Ciama il servizio”
            ma di “device_tracker.smartphone_mio2” nessuna traccia tra le Entità Correnti!

            Poco male, pensavo, basta di ri-generarla all’avvio inserendola in configuration.yaml

            ma non ne esco…

            come si fa per fare in modo che l’entità device_tracker non sparisca al riavvio!
            o perlomeno come fare per generarla in automatico?
            è un problema del mio HA… ?

            So che ho le idee confuse… portate pazienza!

            Grazie!

          4. Henrik Sozzi

            Ma il problema è il device_tracker. Non lo devi creare a mano! Quando colleghi l’app ad Home Assistant ti viene creato un device_tracker.nome_telefono che perdura nell’eternità. Ed è quello che devi usare come entità da aggiornare con il set_state.
            Ad ogni modo ti consiglio di aspettare ad arrovellarti troppo su questo articolo perchè nelle ultime nottate ci ho lavorato parecchio per usare il wifi in modo più elegante e funzionale e posso dire di aver trovato la panacea che funziona benissimo, è super manutenibile ed è molto più compatta. E non soffre dei bounce che avvengono con set_state. Insomma, la soluzione perfetta!
            Ci dedicherò il prossimo articolo… 😉

          5. orfmia

            Capito, uso il device.trecker generato dall’app…. in attesa del tuo nuovo articolo ci provo… altrimenti dove sta il divertimento 🙂

  19. Ciao Henrik, vorrei farti una domanda un po’ off-topic (non so dove contattarti).
    Io devo scrivere un registro modbus sul mio PLC M251. Il dato è un INT. Il dato che devo scrivere lo recupero da uno slide che ho creato. Dopodiché ho realizzato una automazione che, al variare del valore dello slide, provvede a chiamare il servizio ‘modbus.write_register’ scrivendo sul registro modbus il valore dello slide. La chiamata è questa:
    service: modbus.write_register
    data:
    value: ‘{{ states(”input_number.kitchen_temperature”) | int }}’
    hub: M251
    address: 800
    unit: 1
    Ora, il problema che ho è che il dato ‘kitchen_temperature’ è un float ma il dato che scrivo nel registro (e che leggo nel PLC) è un INT poiché il modbus lavora impacchettando registri a 16 bit (INT, appunto). Ora, come faccio sempre in altri ambiti, quando devo trasferire un dato FLOAT mediante modbus, lo moltiplico per 10. In questo caso quindi, se leggo un valore dallo slide pari a 23,5 andrei ad inviare 235. Il problema è che non riesco a moltiplicare per 10 il valore. Avrei pensato anche a modificare il valore fornitomi dallo slide (generando valori moltiplicati per 10) ma poi non riesco a ‘spostare’ la virgola come farei, ad esempio, con un normale sensore. Puoi aiutarmi??
    Grazie

    1. Henrik Sozzi

      Scrivimi nei contatti del blog o su Messenger (non ci sono miei omonimi nel mondo 😂) così non intasiamo i commenti di OT. E credo di avere la soluzione 😜

  20. emanuele

    Ciao ho una domanda: le tabelle di presenza possono essere sfruttate solamente con modem/ router fritz? Ho un modem asus RT1200G connesso in cascata a una vodafone station revolution, posso in qualche modo sfruttare le tabelle del router per non dover continuamente bombardare la rete di pacchetti ICMP?

    1. Henrik Sozzi

      Ciao, no ci sono altre integrazioni che permettono di usare le tabelle interne dei router (il cui vantaggio hai ben compreso 🙂 ). Per Asus mi risulta che il tuo router utilizzi AsusWRT. In tal caso c’è l’integrazione relativa: Integrazione AsusWRT.
      Ma ho solo cercato sul sito, non l’ho mai provata quindi non ti so dire di più.

      1. emanuele

        Ciao, grazie mille ho aggiunto l’integrazione e vede i vari dispositivi connessi. L’unico problema é che avendo connesso tale router in cascata a una vodafone station revolution posso tener traccia solamente di alcuni dispositivi (quelli connessi al router asus per l’appunto)… Esiste qualcosa per usare le tabelle di presenza della station revolution? Grazie mille!

        1. Henrik Sozzi

          Che io sappia no, mi spiace. Prova a cercare però, Google è tuo amico 😉

          1. Emanuele Tocci

            Grazie mille per l’aiuto… al momento sto usando asuswrt e sembra funzioni abbastanza bene. L’unico problema é che non mi rileva uno smartphone e pertanto il tracking di quest’ultimo e un pochino meno preciso (ma diciamo accettabilie, soprattutto grazie alla verifica della connessione wifi). Ho effettuato qualche ricerca e purtroppo non ho trovato nulla sulla VS Revolution.

            Ho una domanda sul package “auto_detect”: non mi : non ho ben capito come poter sfruttare l’evento “uscita_ultimo_da_casa”… Cosa cambia fra questo evento e il semplice tracking che posso trovare nelle impostazioni degli utenti di home assistant (i device_tracker)?

            Tale evento traccia in maniera piú precisa i dispositivi oppure ho capito male (oppure va ad agire direttamente sull’entitá della persona)? Se cosí fosse, perché nell’automazione della notifica al rientro dal lavoro non usi l’evento ma l’entitá della persona?

            Perdona tutte queste domande… ti ringrazio di nuovo!😊😊

          2. Henrik Sozzi

            Non può non rilevarti un telefono, se si collega al wifi ed è in rete lo deve rilevare… Su Fritz non ho alcun device non rilevato che si collega.
            L’evento “uscita_ultimo_da_casa” e “entrata_primo_in_casa” (vado a memoria ma si capisce anche se sbaglio i termini) servono per rilevare, rispettivamente, l’uscita dell’ultima persona che esce di casa e l’ingresso della prima che vi rientra. Ovvero intercettano lo stato di casa con qualcuno -> casa con nessuno e viceversa. Questa informazione la uso da tante parti per fare cose tipo abbassare automaticamente le tapparelle (all’uscita) o alzarle (al rientro), attivare l’antifurto e disattivarlo, ecc. Se vivi da solo questi eventi sono coincidenti con gli stati da home a qualunque altro o da qualunque altro a home. Ma se le persone sono più di una no…
            Si può ottenere lo stesso effetto con un semplice gruppo che raggruppi le persone che vivono in casa e usando lo stato del gruppo nelle automazioni (il gruppo è home fintanto che anche un solo componente è home) ma trovo che gli eventi siano migliori per separare logicamente i package avendo meno dipendenze da entità definite altrove. Ma è questione di gusti, entrambe le soluzioni sono equivalenti.
            Per rispondere alla tua ultima domanda al rientro dal lavoro uso la persona perchè voglio che l’automazione si attivi quando la singola persona torni dal lavoro, indipendentemente che a casa ci sia qualcuno o no.
            Ciao

  21. Graziano Melzi

    Ciao Henrik, sto leggendo questo articolo con molto interesse ma non ho capito come tracciare lo smartphone di un ospite che non usa l’applicazione Home Assistant?
    Ho Sky WIFI e il modem/router rileva i device collegati al wifi ma su HA non ho traccia di questi device quindi se volessi dare il benvenuto a mia sorella quando entra in casa come faccio? Funziona solo con Fritz Box?

  22. Paolo

    Ciao Henrik,

    Complimenti per la guida.
    Sono un neofità e ho qualche dubbio.

    1) Per settare il device tracker con lo stato derivato dalla WIFI usi lo script set_state.
    Nel package che hai creato c’è un service.yaml e set_state.py.
    Mi potresti dare qualche dritta su come devo configurararli?
    2) Non avendo la possibilità di utilizzare altra entità tranne il device tracker, non posso creare il secondo sensore binario. Quindi
    configurando un delay di 10 min nel sensore legato all’app avrei una risposta molto lenta.
    Hai qualche suggerimento a riguardo?
    Grazie
    Paolo

    1. Henrik Sozzi

      Ciao, per il set_state, come ho scritto nell’articolo, rimando all’articolo specifico: Impostare lo stato di un’entità in Home Assistant.
      Per quanto riguarda la seconda domanda ti suggerisco di attendere un pochino perché ho sviluppato una seconda versione di questo package, migliore, più semplice e senza il problema dei bounce. Ti consiglio di basarti sul nuovo articolo che arriverà… 🙂
      Ciao

  23. Davide

    Ciao, io ho sky wifi è non riesco ad utilizzarlo su HA come device tracker, nel log ricevo questo errore:

    ERROR (MainThread) [pyskyqhub.skyq_hub] Error parsing data at initialisation for “indirizzo_ip_del_router”, is this a Sky Router?
    ERROR (MainThread) [homeassistant.components.device_tracker] Error setting up platform legacy sky_hub

    ho configurato sky_hub come device tracker nel configuration.yaml come da documentazione:

    # tracker su router sky hub
    device_tracker:
    – platform: sky_hub
    host: !secret sky_hub_ip
    interval_seconds: 60
    consider_home: 180
    new_device_defaults:
    track_new_devices: true

    Puoi aiutarmi? Grazie.

    1. Henrik Sozzi

      Mi spiace ma non usando Sky hub non ho idea di come poterti aiutare. Ho dato un occhio alla pagina dell’integrazione che riporta essere usata da 34 installazioni in tutto il mondo (argh) e da come si configura (alla vecchia maniera) direi che è poco seguita. Potrebbe essere un aggiornamento firmware dello Sky Hub che ha mandato fuori uso l’integrazione o una configurazione specifica, non saprei.
      Però essendo una integrazione del core puoi aprire una issue a riguardo nel repo del core e ti devono dare retta 🙂

  24. Davide

    Ciao Henrik, secondo te com’è possibile che quando il telefono si collega al SSID non scatti l’automazione

    1. Henrik Sozzi

      Detta così mi ci vuole la sfera di cristallo per risponderti 😉 Ad ogni modo ti consiglio di attendere un attimo a mettere in azione questa automazione perchè ho una versione migliorata e molto migliore del Tracker wifi… Tra non molto ne farò un nuovo articolo.

  25. Davide

    Attenderò! Grazie mille Henrik, complimenti per il lavoro!

  26. Francesco

    Ciao Henrik. Innanzitutto mi complimento dei tuoi articoli e dei tuoi interventi nelle varie sezioni dell’HA. Ti seguo da quando conosco questo hub. Secondo l’ultimo articolo riguardante il tracciamento wifi, vorrei porti una domanda. Vorrei, ( ad oggi ho questa impostazione per il device tracker), non usare il GPS per tanti motivi tra cui la durata della batteria. Se, nelle impostazioni dell’app companion, abilito il sensore di rete wifi, il risultato è non connesso. Da qui deduco che senza abilitazione del GPS il package wifi.yaml non funziona. C’è un modo di utilizzare questo metodo senza l’ausilio del GPS??

    1. Henrik Sozzi

      Ciao Francesco, grazie per i complimenti 😊
      Parlo per Android (iOS non lo conosco abbastanza): la rilevazione del wifi è soggetta ai permessi GPS. Per cui se vuoi fare quanto hai chiesto devi dare i permessi di geolocalizzazione all’app ma poi disabilitare il sensore relativo, così che l’app non acquisisca la posizione.

  27. Michelangelo

    Ottimo aggiornamento e bellissimo articolo, come sempre! 😊
    Ho apportato le modifiche per adattarlo alla mia configurazione e l’ho testato in parte (domani al rientro dal lavoro vedo se va la notifica) ho notato perè che l’automazione che manda una notifica generica quando qualcuno entra o esce di casa mi continua ad inviare notifiche che sono tornato a casa nonostante non mi sia mosso da casa.
    L’unica differenza è che nel sensor.person_xxx_source si alterna il tracker dell’APP e quello di Nmap (purtroppo non ho un Fritz) e nel caso del GPS a volte mi cambia di pochissimo le coordinate rilevate (comunque semre in zona home) forse sono questi due fattori a scatenare le notifiche continue??
    Per ora ho disattivato l’automazione per non essere sommerso di continue notifiche.
    Molto bella l’idea di usare l’SSID dei wifi associati alle zone. 👍

    1. Henrik Sozzi

      Ciao Michelangelo, grazie per le belle parole 🙂
      Quel che sperimenti, se l’automazione che hai fatto è corretta, di certo non dipende dalle coordinate che cambiano. Questo è normale in quanto la precisione del GPS è variabile a seconda di mille fattori quindi ci sta che stando fermo in casa le coordinate non rimangano le stesse. L’importante è, appunto, che rimangano nella zona home.
      Può invece essere che i due tracker che si alternano abbiano uno stato differente, causando un cambio stato continuo della person, hai provato a verificarlo? Verifica sullo storico dello stato dell’oggetto person. Se così non fosse prova ad indicarmi il trigger che hai usato, magari c’è un errore lì.

  28. Michelangelo

    Riporto il debug dell’automazione preso dal campo “Changed Variables”:
    *************************************************************************************************
    this:
    entity_id: automation.persone_notifica_qualcuno_arriva_o_parte_da_casa
    state: ‘on’
    attributes:
    last_triggered: ‘2022-02-20T13:04:11.756686+00:00’
    mode: single
    current: 0
    id: 0bb4febe-f9b1-445c-9b27-ac9793c4a617
    friendly_name: Persone – Notifica – Qualcuno arriva o parte da casa
    last_changed: ‘2022-02-21T15:16:55.133902+00:00’
    last_updated: ‘2022-02-21T15:16:55.133902+00:00’
    context:
    id: f510e5f786841aa5e4c597617fd4c359
    parent_id: null
    user_id: ad628439837b43cdb13cff22c4418481
    trigger:
    id: ‘1’
    idx: ‘1’
    platform: state
    entity_id: person.xxx
    from_state:
    entity_id: person.xxx
    state: home
    attributes:
    editable: false
    id: xxx
    latitude: xx.xxxxxxx
    longitude: xx.xxxxxxx
    gps_accuracy: 87
    source: device_tracker.redmi_note_4
    user_id: ad628439837b43cdb13cff22c4418481
    entity_picture: /api/image/serve/710f45dec82b2519cfcc953d0e55c451/512×512
    friendly_name: xxx
    last_changed: ‘2022-02-21T13:53:50.437992+00:00’
    last_updated: ‘2022-02-21T14:54:42.217443+00:00’
    context:
    id: 3676ece4980ff564dc4ba39f577071eb
    parent_id: null
    user_id: null
    to_state:
    entity_id: person.xxx
    state: home
    attributes:
    editable: false
    id: xxx
    latitude: xx.xxxxxxx
    longitude: xx.xxxxxxx
    gps_accuracy: 72
    source: device_tracker.redmi_note_4
    user_id: ad628439837b43cdb13cff22c4418481
    entity_picture: /api/image/serve/710f45dec82b2519cfcc953d0e55c451/512×512
    friendly_name: xxx
    last_changed: ‘2022-02-21T13:53:50.437992+00:00’
    last_updated: ‘2022-02-21T15:44:42.018636+00:00’
    context:
    id: d130146e765abd7098a42e8d5cfe0242
    parent_id: null
    user_id: null
    for: null
    attribute: null
    description: state of person.xxx
    *************************************************************************************************

    L’evento si è ripetuto più volte di seguito; qui sotto altro debug quando passa da una sorgente all’altra:

    *************************************************************************************************
    this:
    entity_id: automation.persone_notifica_qualcuno_arriva_o_parte_da_casa
    state: ‘on’
    attributes:
    last_triggered: ‘2022-02-21T15:56:07.419438+00:00’
    mode: single
    current: 0
    id: 0bb4febe-f9b1-445c-9b27-ac9793c4a617
    friendly_name: Persone – Notifica – Qualcuno arriva o parte da casa
    last_changed: ‘2022-02-21T15:16:55.133902+00:00’
    last_updated: ‘2022-02-21T15:56:07.857478+00:00’
    context:
    id: 6e4f74f771e57c1b386f90312cddc2e7
    parent_id: f773521a81bc713bdacd3c14c12b6dbd
    user_id: null
    trigger:
    id: ‘1’
    idx: ‘1’
    platform: state
    entity_id: person.xxx
    from_state:
    entity_id: person.xxx
    state: home
    attributes:
    editable: false
    id: mcv93
    latitude: xx.xxxxxxx
    longitude: xx.xxxxxxx
    gps_accuracy: 56
    source: device_tracker.redmi_note_4
    user_id: ad628439837b43cdb13cff22c4418481
    entity_picture: /api/image/serve/710f45dec82b2519cfcc953d0e55c451/512×512
    friendly_name: xxx
    last_changed: ‘2022-02-21T13:53:50.437992+00:00’
    last_updated: ‘2022-02-21T15:56:07.400845+00:00’
    context:
    id: f773521a81bc713bdacd3c14c12b6dbd
    parent_id: null
    user_id: null
    to_state:
    entity_id: person.xxx
    state: home
    attributes:
    editable: false
    id: xxx
    source: device_tracker.xiaomi_communications_ab_12_cd
    user_id: ad628439837b43cdb13cff22c4418481
    entity_picture: /api/image/serve/710f45dec82b2519cfcc953d0e55c451/512×512
    friendly_name: xxx
    last_changed: ‘2022-02-21T13:53:50.437992+00:00’
    last_updated: ‘2022-02-21T15:56:17.435714+00:00’
    context:
    id: d24f8015bb3c6f82fe5e920a85e8fbed
    parent_id: null
    user_id: null
    for: null
    attribute: null
    description: state of person.xxx
    *************************************************************************************************
    Non so quale è l’evento scatenante dato che lo stato è sempre “home” può cambiare leggermente il valore GPS o la sorgente.
    Anche guardando lo storico vedo sempre lo stato “home”.
    La notifica per il ritorno dal lavoro invece funziona perfettamente senza intoppi o doppie/svariate notifiche.

    1. Henrik Sozzi

      Riesci a riportarmi il codice della tua automazione? Perchè ho un sospetto… 🙂 Se vuoi anche privatamente (trovi la mia mail in alto a destra sul sito)

  29. Michelangelo

    Il fatto che tu avessi un sospetto lo ha fatto venire pure a me e perciò mi sono ricontrollato con calma tutto e ho trovato l’inghippo: nella mia furia cancellatrice ho eliminato per sbaglio il ‘from: “home”‘ dalla automazione, ecco perchè continuava ad attivarsi la condizione di “arrivato a casa”. 😳
    Ora l’automazione è attiva da una mezz’ora e non mi è arrivata nessuna nuova notifica!
    Scusa ancora per il falso allarme!

    1. Henrik Sozzi

      Ahah, ecco appunto! Pensavo proprio quello perché se non metti from e to il trigger scatta anche quando vengono modificati gli attributi (se non vuoi che accada e scatti qualunque valore cambi nello stato ma NON negli attributi va messo to: senza valore)
      Bene, ottimo che era questo e niente di sistemico 👍🏻

  30. Giuseppe

    Ciao complimenti per l’articolo.
    Non capisco una cosa, ho aggiunto il file del package wifi.yaml e configurato come di seguito:

    automation:
    # Arrivo e partenza dal negozio di Antonella
    – id: 48d481d3-9051-443b-a8ea-3e698f99f560
    alias: Tracker – Wifi – Telefoni
    trace:
    stored_traces: 20
    trigger:
    – entity_id: sensor.ipex_ssid
    platform: state
    # – entity_id: sensor.tel_anto_wifi
    # platform: state
    # – entity_id: sensor.tel_erica_wifi_connection
    # platform: state
    # condition:
    # – “{{ trigger.from_state.state != ‘LaTana’ }}”
    # – “{{ (as_timestamp(now(), 0) – as_timestamp(trigger.from_state.last_changed, 0)) > 180 }}”
    action:
    – variables:
    tracker: “{{ trigger.from_state.object_id }}”
    zona: >
    {% set zone =
    [
    {‘ssid’: ”, ‘zona’: ‘not_home’},
    {‘ssid’: ‘wlan’, ‘zona’: ‘home’}
    ]
    %}
    {{zone | selectattr(‘ssid’, ‘eq’, trigger.to_state.state) | map(attribute=’zona’) | first | default(‘not_home’)}}
    – alias: “Imposta la zona”
    service: device_tracker.see
    data:
    dev_id: “{{tracker}}”
    location_name: “{{zona}}”

    ha una volta cambiato lo stato crea un file known_devices.yaml con dentro, creando un device_tracker.ipex_ssid che io non uso.

    ipex_ssid:
    name: ipex_ssid
    mac:
    icon:
    picture:
    track: true

    la domanda è come si potrebbe fare per far agganciare al corretto device_tracker ?

    1. Henrik Sozzi

      Ciao, è giusto che ti crei un nuovo device tracker che si chiama nello stesso modo del sensore usato, è esattamente lo scopo dell’automazione! Poi devi aggiungere quel tracker al tuo oggetto person e Home Assistant fa delle valutazioni usando tutti i tracker associati alla persona e le fa bene.

  31. Giovanni

    Ciao Henrik complimenti per la tua chiareza e disponibiltá. Sono un neofita. Ho inserito la linea packages: !include_dir_named packages/ ma HA dice che “Setup failed for packages: integration not found’. Dove sbaglio? Grazie

    1. Henrik Sozzi

      Ciao, grazie 🙂 Detto così non saprei, verifica la sintassi di dove richiami i packages con packages: !include_dir_names packages e la sintassi yaml dei packages. Ti consiglio la lettura di questo capitolo

  32. Marco

    Ottima guida, molto istruttiva. Vorrei aggiungere una card che mi riepiloghi i tempi trascorsi in una zona, ad esempio vorrei sapere quante ore trascorro in negozio (per mantenere il tuo esempio) e quanto a casa. Come posso fare?

    1. Henrik Sozzi

      Ciao, la prima cosa che mi viene in mente sarebbe di creare una input_number contenente le ore che passi in negozio ed una contenente le ore che passi a casa. Con un’automazione le resetti a zero quando vuoi tu (se lo vuoi fare, altrimenti le lasci incrementare fin quando vuoi te)
      Fai poi un’automazione sul cambio stato dell’oggetto person (o con più automazioni o con un bel choose ed un’automazione sola) in cui quando esci da casa sommi il tempo tra trigger.from_state.last_changed e trigger.to_state.last_changed (ovvero il tempo trascorso dall’ultimo cambio stato) aggiungendolo all’input_number tempo_casa e, stessa cosa, per il negozio aggiungendo il tempo a tempo_negozio.
      I due input_number verranno man mano incrementati con i tempi che desideri.

  33. gfkappa63

    Ciao,
    Seguo con molto interesse tutti i tuoi articoli, le tematiche sono trattate ed esposte in maniera assolutamente professionale e non posso che fare i complimenti per il sapere che diffondi. Credo di dovere a te e Max Albani parte della paternità del mio HA!

    Sto cercando di implementare la tua logica utilizzando il sensore SSID dell’HA Companion e di “convertirlo” in device tracker, sono partito dal creare il sensore che passa allo stato home nel momento che riconosce una delle mie reti wi-fi:

    sensor
    – platform: template
    sensors:
    wifi_gfk:
    friendly_name: “Telefono Gfk collegato al wi-fi”
    value_template: >-
    {% if (“MyOrbiNet” in states(‘sensor.iphonegfk_ssid’)) %}
    home
    {% else %}
    not_home
    {% endif %}
    icon_template: >-
    {% if (“MyOrbiNet” in states(‘sensor.iphonegfk_ssid’)) %}
    mdi:home
    {% else %}
    mdi:home-export-outline
    {% endif %}

    Ho usato la funzione IN in quanto ho diverse SSID che iniziano con lo stesso nome, fin qui tutto bene.

    Da qui l’automazione che utilizza il sefvizio device_tracker.see (geniale!) per creare il device tracker in base al contenuto precedente:

    #—————————————————————-#
    – id: “PRES Imposta Device Tracker da SSID”
    alias: “PRES Imposta Device Tracker da SSID”
    description: ‘Imposta Device Tracker da SSID’
    trigger:
    – entity_id: sensor.wifi_gfk
    platform: state
    action:
    – variables:
    tracker: “{{ trigger.from_state.object_id }}”
    zona: “{{ trigger.to_state.state }}”
    – alias: “Imposta la zona”
    service: device_tracker.see
    data:
    dev_id: “{{tracker}}”
    location_name: “{{zona}}”
    mode: single

    In condizioni di funzionamento normale il tutto funziona come atteso, il problema si pone al riavvio di HA dove, nonostante il sensore acquisisca lo stato corretto (home/not_home), il device tracker rimane sempre nello stato not_home.

    Da quello che ho notato, all’avvio il sensore parte come unknown e sembra innescare l’automazione ponendo il device tracker = not_home, dopo una ventina di secondi assume lo stato corretto, per esempio home ma non innesca l’automazione.

    Spero di essere stato chiaro e se tu o qualcuno dei lettori potesse illuminarmi ne sarei infinitamento grato.

    Grazie ancora.

    1. Henrik Sozzi

      Ciao Gianfranco, grazie mille per le belle parole! Condivido il gran rispetto per Max, con cui mi confronto e chiacchiero spesso. Lui è il punto di riferimento per l’UI, ma non solo! Io e lui ragioniamo in modo molto simile riguardo script ed automazioni e il nostro know-how si è spesso intrecciato. Amo le contaminazioni di questo tipo.
      Venendo al dunque. Si, in una delle ultime versioni è stato introdotto il concetto di unknown finché non scatta il trigger. Però se dici che poi diventa home ma non fa scattare l’automazione del device_tracker questo non è possibile in quanto il trigger che hai usato è platform: state senza argomenti e questo viene chiamato anche se cambia solo un’attributo (se vuoi che cambi al solo cambio di stato metti un to: senza valori).
      Ti consiglio di spulciare bene le tracce di debug dell’automazione per capire cosa succede quando passa da unknown a home.
      Io non mi sono mai interessato particolarmente alla cosa perché usando il device tracker per alimentare l’oggetto person, insieme all’app e al tracker di Fritz, non è importante lo stato corrente quanto il cambio stato. L’oggetto Person, infatti, valuta i cambi di stato e li valuta in funzione della data/ora di riferimento per capire se è più o meno recente dell’ultimo aggiornamento e filtrare eventuali cambi “obsoleti”. Solo i cambi recenti vengono poi propagati allo stato dell’oggetto person.
      Quindi il fatto che parta unknown non ha molta importanza.

    1. Henrik Sozzi

      Ciao Maurizio, io utilizzo VSCode per editare il codice YAML di Home Assistant, con l’estensione Home Assistant Config Helper. Lo consiglio vivamente!
      Per generare l’unique_id (e ogni altro valore univoco tramite nuovo UUID) uso un’estensione che si chiama “UUID Generator”. Abilita una voce nel menu contestuale dell’editor, quando vuoi inserire un UUID basta cliccare col tasto destro e scegliere “Generate UUID at cursor” et voilà 🙂

  34. Emanuele

    Ciao Henrik, per prima cosa grazie per i tuoi contenuti… sempre il top. Sto avendo un problema con il package ” wifi”: in pratica i sensori relativi al ssid sono sempre settati su “not_home” in quanto fanno ancora riferimento ad una vecchia integrazione nmap che ho comunque rimosso… le entitá invece sono rimaste e pertanto non vengono generate quelle nuove… cosa posso fare?

    1. Henrik Sozzi

      Ciao e grazie! 😊 In teoria dovrebbe funzionare lo stesso, se la vecchia integrazione non c’è più le entità sono lì per chi le usa quindi non è necessario che siano rigenerate. Prova piuttosto a chiamare a mano il servizio che imposta lo stato per vedere se si movimenta e verifica il debug dell’ automazione per scoprire cosa non sta funzionando.

  35. Francesco

    Ciao Henrik, per prima cosa ti ringrazio per le tantissime guide che permettono ai neofiti come me di addentrarsi nel mondo della domotica!
    Ti scrivo perchè sto provando ad attuare questa guida, ma purtroppo senza successo. Ti elenco qui cosa ho fatto:

    1) Ho creato la cartella packages e al suo interno il file Wifitracker.yaml
    2) Ho abilitato i sensori relativi alla connessione Wifi sulle app che mi interessevano, in particolare le entità che ho trovato sono:
    sensor.redmi_note_9_pro_wifi_connection e sensor.samsung_daiana_wifi_connection
    3) All’interno del file packages: Wifitracker.yaml ho usato il tuo codice, te lo incollo qui:
    “`
    automation:

    – id: 48d481d3-9051-443b-a8ea-3e698f99f560
    alias: Tracker – Wifi – Telefoni
    trace:
    stored_traces: 20
    trigger:
    – entity_id: sensor.redmi_note_9_pro_wifi_connection
    platform: state
    – entity_id: sensor.samsung_daiana_wifi_connection
    platform: state

    # condition:
    # – “{{ trigger.from_state.state != ‘LaTana’ }}”
    # – “{{ (as_timestamp(now(), 0) – as_timestamp(trigger.from_state.last_changed, 0)) > 180 }}”
    action:
    – variables:
    tracker: “{{ trigger.from_state.object_id }}”
    zona: >
    {% set zone =
    [
    {‘ssid’: ”, ‘zona’: ‘not_home’},
    {‘ssid’: ‘WiFi_5ghz’, ‘zona’: ‘home’}
    ]
    %}
    {{zone | selectattr(‘ssid’, ‘eq’, trigger.to_state.state) | map(attribute=’zona’) | first | default(‘not_home’)}}
    – alias: “Imposta la zona”
    service: device_tracker.see
    data:
    dev_id: “{{device_tracker.francesco}}”
    location_name: “{{zona}}” “`

    Ho ovviamente validato la configurazione e riavviato il server ma non trovo (anche dopo aver provato un paio di volte a collegare e scollegare il wifi dal cell) nessun altro possibile device tracker nella lista di dispositivi da collegare alle “Person”.
    Non sapendo come generare l’id nella prima riga ho anche provato a toglierlo, ma non cambia nulla.
    Sapresti dirmi gentilmente dove sbaglio?
    Ti ringrazio in anticipo.
    Ciao
    Francesco

  36. Francesco

    ciao enrik, lascia stare il mio post precedente. Stamattina misteriosamente funziona tutto senza aver toccato assolutamente nulla. Ti ringrazio comunque!
    Ti faccio invece un’altra domanda:
    per me questa rilevazione di presenza è resa molto più complicato dal fatto che la mia compagna lavora a nemmeno 20 m da casa, per cui nel suo caso la rilevazione tramite gps la segnala ovviamente sempre a casa. Non avendo un router fritz ho quindi settato come device tracker per lei soltanto il nome della connessione wifi, tuttavia in questo modo se dimenticasse semplicemente il wifi staccato risulterebbe fuori casa. Avresti qualche altra magica idea da implementare in questo caso?
    Grazie mille ancora

    1. Henrik Sozzi

      Ciao Francesco, visto che hai risolto non commento il post precedente tranne che per la domanda restata senza risposta: l’id della prima riga è un testo qualsiasi che sia univoco. Puoi lasciare il mio valore o generare un valore qualsiasi, va bene anche “pippo123” per intenderci. Per essere sicuro di avere un valore sempre univoco io genero un UUID con un addon di VSCode così con un click lo si genera certamente univoco. Non è obbligatorio, puoi non metterlo proprio ma abilita la possibilità di salvare le informazioni di debug delle ultime esecuzioni quindi è importante metterlo 🙂
      La posizione di lavoro della tua compagna è una grandissima rogna… Qualunque soluzione avrà dei contro che dovrai valutare attentamente. Le cose che mi vengono in mente sono le seguenti:

      • Restringere la zona di casa così che non tocchi il lavoro. Purtroppo 20mt è davvero vicino, fai qualche esperimento ma temo che difficilmente possa funzionare usando il GPS, basta un po’ di deviazione quando è al chiuso per sbagliare zona, potenzialmente…
      • Usare il wifi ok ma non da solo, o meglio puoi anche usarlo da solo per dire che è al lavoro ma non per determinare che è a casa proprio per quel che dicevi te: se spegne il wifi o si scollega per sbaglio… Specialmente se hai automazioni importanti legate alla presenza a casa (spegnere luci, abbassare tappaprelle, inserire antifurto…
      • Puoi abilitare una integrazione per la rilevazione della presenza in rete come NMAP o ping. Non so quanto bene funzionino alla lunga perchè i telefoni tendono a non essere sempre raggiungibili sul wifi per risparmiare energia. E se hai abilitata la randomizzazione del mac address disabilitala, altrimenti sarà impossibile tracciare il dispositivo quando connesso.
      • Puoi prendere un Fritz 🙂
      • Puoi pensare ad altre soluzioni di tracking, ad esempio basate su bluetooth. O del telefono o di un portachiavi come Tile o simili. E un rilevatore usando ESP32 o qualcosa del genere. Non l’ho mai fatto però, non so darti informazioni più precise ma le trovi cercando in rete.

      Quel che ti posso consigliare è fare come ho fatto io: fare esperimenti per trovare la combinazione più affidabile, ti fai una view di una plancia dedicata al debug dove mostri lo stato corrente e il grafico delle ultime 24h dei vari tracker/sensori che vuoi usare e ogni giorni lo controlli per capire cosa funziona e cosa no. E pian piano affini e migliori fino ad arrivare ad una soluzione che ti soddisfi. Credo che alla fine dovrai passare da un sensore basato su template con la logica che vuoi implementare con dei tempi di off e di on per evitare piccoli eventi (meglio avere l’informazione un po’ in ritardo ma affidabile che averla subito ma con falsi positivi o negativi…)

      Mi spiace che una risposta magica non ci sia… 🙁

  37. Andrea Santinelli

    Ciao Enrik, premetto che la posizione delle persone nel mio Home Assistant è realizzata seguendo scrupolosamente le tue guide. Ora, ho un problema che non riesco a comprendere. Per semplicità di codice, ho creato 2 sensori binari che passano allo stato ON quando sono a casa. Il primo rileva la posizione mediante GPS, il secondo mediante WiFi (ho un router Fritz!). L’or di entrambi definisce la mia posizione a casa. Ora, spesso capita che il sensore che restituisce la mia posizione a casa mediante Fritz! rimanga sullo stato ON poiché il device_tracker rimane fisso sulla posizione “home” anche se fisicamente io sono altrove. Da cosa può dipendere? Grazie

    1. Henrik Sozzi

      Ciao Andrea, hai fatto bene ad adottare tramite binary_sensor un meccanismo di questo tipo. Pensa che l’articolo era ben partito così, con un binary_sensor per persona che metteva in or lo stato di home di fritz e dei tracker, così da evitare false uscite di casa. Poi l’ho rimosso in quanto ho acquisito fiducia nella gestione interna di Home Assistant dell’oggetto Person. In seguito ho riperso tale fiducia in quanto ho verificato che in alcune condizioni il cambio stato non avviene come vorrei io (che privilegio lo stato di Home anche se un unico tracker dice home). Penso che quindi aggiornerò di nuovo l’articolo in tal senso, tu ti sei già portato avanti! 🙂
      Nel merito della richiesta. Il tracker del Fritz ti rimane su Home per un tempo di qualche minuto o indefinitivamente? Nel primo caso è normale (ci mette un po’ Fritz a dire che non sei più a casa ed è giusto così per evitare che una breve disconnessione porti ad un fuori casa), nel secondo no e non so da cosa possa dipendere se non da un errore dell’integrazione.
      Puoi provare il codice di tracking “vecchio” cliccando su CONFIGURA dell’integrazione e selezionando l’opzione “Abilita il vecchio metodo di rilevamento” per provare a vedere se non accade più.
      Io ho problemi a tracciare i dispositivi non connessi in wifi ma anche altri, se ben ricordo, in quanto ho diverse cose collegate in ethernet tra cui un repeater 1200 in mesh via ethernet, con quell’opzione funziona tutto.
      Puoi anche verificare quando non risulti a casa nel Fritz, in Rete locale (vado a memoria) se risulta connesso o no. Se non lo risulta, come suppongo, è un buon caso da sottoporre ad un issue dell’integrazione.
      Puoi anche provare a chiedere a Simone Chemelli (lo trovi nel gruppo Home Assistant Italia di Facebook) che è uno degli autori dell’integrazione.

  38. Ciao Enrik, ho fatto tutte le verifiche che mi hai suggerito. Se accedo al Fritz, il mio telefono risulta sconnesso (sono 3 ore che sono fuori casa, vorrei vedere!!). Il device_tracker del mio telefono relativo alla WiFi è, invece, su home. Ho riavviato tutti i Fritz (ne ho 3, un 4040 che fa da router, un 7430 che fa da ripetitore mesh ed un WLAN repeater sempre in mesh), ho riavviato Home Assistant ma nulla. Ora provo a cambiare l’opzione che mi hai suggerito. La cosa strana è che il telefono di mia moglie funziona senza problemi. Grazie dell’aiuto e dei consigli.

    1. Henrik Sozzi

      Aspetta, non vorrei aver capito male. Quando parli di “device_tracker del mio telefono relativo alla WiFi” intendi il device_tracker fornito dall’integrazione Fritz che usando il router determina chi è connesso alla rete di casa e chi no oppure il device_tracker creato, come spiegato nell’articolo, basato sul sensore dell’app Home Assistant Companion che dice a quale SSID si è connessi? Perchè mi viene il dubbio.
      Se stai parlando del device_tracker di Fritz potrebbe appunto essere una condizione anomala dell’integrazione. Se anche l’altro metodo di rilevamento non funziona correttamente apri un Issue, potrebbe esserci qualche particolarità legata ai modelli che hai tu o alla tua specifica topologia di collegamento. Fammi sapere 🙂

  39. Intendo il device_tracker fornito dall’integrazione Fritz. In realtà devo correggere quanto ho scritto sopra. Riavviando Home Assistant si aggiorna. Ora mi vede fuori casa. Però ha un comportamento anomalo.
    Invece il sensore creato con l’automazione funziona correttamente.

  40. ClaudioG

    Buon pomeriggio.
    Finalmente ho avuto un po’ di tempo per macinarmi questo corposo articolo.
    Devo ripeterti che tu 6 su un altro pianeta rispetto ai copioni che trattano l’argomento HA sul panorama italiano.
    Volevo capire una cosa: la necessità di creare un binary-sensor per gestire l’icona della presenza in casa o meno di una persona.
    Dove sarebbe l’errore nello gestire la questione in una button card con:
    entity: person.enrik_sozzi
    entity_picture: |
    [[[
    if (entity.state = ‘home’) return ‘/local/My_icons/Enrik_si.png’;
    else return ‘/local/My_icons/Enrik_no.png’;
    ]]]
    Grazie dell’attenzione

    1. Henrik Sozzi

      Ti ringrazio infinitamente! Purtroppo ne pubblico meno di quanto vorrei perchè comunque stendere un articolo così richiede tanto tempo…
      La domanda che poni è tutt’altro che stupida. L’articolo in precedenza era strutturato diversamente. Avevo creato il binary_sensor da te citato per basare le mie automazioni e l’UI su una logica differente da quella di person in quanto, al tempo, person non si comportava sempre in modo corretto (in più l’app aveva diversi problemi in tal senso). Morale gestivo io la presenza a casa, mandando in off il sensore (fuori casa) solo e soltanto se tutti i sensori erano d’accordo in tal senso con anche un tempo minimo. Quando ho deciso di semplificare e rimuovere tale logica mi è rimasto il binary_sensor che ho pensato può essere utile usare come riferimento per le automazioni, così che se in futuro dovessi tornare a tale soluzione (e forse si perchè ho un caso limite che fa un po’ impazzire questa logica…) non dovrei cambiare nulla se non la logica dietro a questo sensore.
      Oltre a questa motivazione più seria ho le persone più importanti come badge nella UI e questo è comunque l’unico modo per mostrarli in modo gradevole.
      Mi fa molto piacere questa domanda perchè significa che ci hai ragionato su e hai compreso bene l’argomento, bravo!

Rispondi

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.