Guida: come tracciare la posizione degli smartphone su Home Assistant con GPS e Wi-Fi

Leggi questo articolo grazie alle donazioni di Varano Enrico e Galanti Michele, Lorenzo Amato, Marco Massimetti, Francesco Lo Cascio, Daniele Saron, Marco Farruggio, Francesco Fanti.
♥ Partecipa anche tu alle donazioni: sostieni SaggiaMente, sostieni le tue passioni!

Continuiamo con i nostri piccoli passi nel mondo Home Assistant, aggiungendo una interessante possibilità che riguarda la localizzazione degli smartphone. Se la nostra "casa" sa dove ci troviamo noi potremo creare automazioni più intelligenti ed è per questo che un servizio di device_tracker è incluso direttamente in Home Assistant. Purtroppo lo stesso non è molto efficiente, per questo molti di noi dello SmartHome Channel hanno implementato tecniche alternative. La soluzione che ci sembra migliore in assoluto è quella che utilizza gli smart beacon, che ci spiegherà il nostro Alberto (@albyzambo) più avanti, iniziamo oggi a vedere come mettere in sinergia due diversi sistemi: GPS e Wi-Fi.

1. CloudMQTT

Il primo passo è quello di creare un account gratuito su cloudmqtt.com, servizio che riceverà le informazioni di localizzazione dello smartphone e farà da ponte con Home Asssistant. Una volta abilitato l'accesso cliccate in alto a destra su [Create New Instance] e mettete un nome a piacere (ad es. Smartphone Tracking), selezionate il piano "Cute Cat (Free)" e come data center qualcosa di più vicino possibile (nel mio caso era l'Irlanda). Una volta creata questa istanza entrate al suo interno e poi selezionate a sinistra "Users & ACL". Qui create un nuovo utente per ogni persona che intendete tracciare, specificando nome e password (che dovete memorizzare). Ad esempio il mio utente si chiama semplicemente "maurizio" ma poi arriverà in Home Assistant come "maurizio_iphonex" grazie al passaggio successivo in OwnTracks. Create anche un accesso per il vostro server – chiamatelo proprio homeassistant magari – perché gli servirà per andare a leggere le informazioni di localizzazione degli altri.

Nella stessa pagina degli utenti trovate l'area ACLs, in cui sarà necessario andare ad inserire un record per ognuno dei dispositivi. Lo schema è molto semplice ed è il seguente:

  • Tipologia: Topic (non Pattern)
  • User: selezionate dalla tendina
  • Pattern: # (ovvero il simbolo del cancelletto)
  • Accessi: abilitate sia Read che Write
  • Cliccate su [+ Add]

Al termine dell'operazione recatevi nella menu "Details" e memorizzate in un appunto i dati di Server e Port (preferite la SSL Port, specie se avete abilitato l'HTTPS seguendo la nostra guida).

2. OwnTracks

Per dare in pasto i dati a CloudMQTT sarà necessario installare sullo smartphone l'app OwnTracks, disponibile sia per iOS che per Android. Le impostazioni non sono molto complesse, le avete già tutte in vostro possesso, ma l'interfaccia non è particolarmente ergonomica. Iniziamo avviando l'app e garantendogli l'accesso ai dati di localizzazione di cui ha bisogno. Il protocollo MQTT è molto leggero di per sé, consumerà davvero pochissimi dati, e anche in termini di batteria non ho riscontrato. Specie su iOS, dove il sistema autorizza l'invio di informazioni di localizzazione in modo centellinato e solo in caso di macro spostamenti (ragione per cui più avanti aggiungeremo anche un altro metodo al fine di rendere più preciso il posizionamento). Parlando della versione per iOS, la configurazione andrà inserita nell'app partendo dall'icona con la "i" in alto a sinistra e poi sulla parola "Settings" nella maschera che si aprirà.

La pagina che vedrete va compilata così:

  • Mode: "MQTT"
  • TrackingID: Due lettere che vi identificano, io ho messo le iniziali "MN"
  • DeviceID: Nome a piacere, io ho messo "iphonex" per farlo apparire dopo il nome utente in HA
  • Host: Il server di CloudMQTT che vi ho detto di memorizzare
  • Port: Come sopra, utilizzate preferibilmente la SSL Port di CloudMQTT
  • Websockets: Off
  • TLS: On
  • Authentication: On
  • UserID: quello di CloudMQTT
  • Password: quella dell'utente su CloudMQTT

Tornando indietro su "Status Info" dovreste già leggere connected sotto Status. Andate nuovamente su "Map" e vedrete le vostre iniziali apparire in un cerchietto in corrispondenza della vostra posizione.

3. Home Assistant: GPS parte 1

La prima cosa da fare su Home Assistant è quella di modificare il file configuration.yaml per abilitare l'accesso ai dati di CloudMQTT e il servizio OwnTracks. Basterà aggiungere queste righe dove più preferite:

mqtt:
  broker: !secret mqtt_host
  port: !secret mqtt_ssl_port
  username: !secret mqtt_username
  password: !secret mqtt_password

device_tracker:
  - platform: owntracks
    max_gps_accuracy: 100

Vi ricordo che la stringa "!secret name" va a prendere il contenuto della variabile "name" nel file di configurazione secrets.yaml. Utilizzare questa struttura in cui le informazioni sensibili vengono centralizzate in un unico documento è molto più comodo e soprattutto sicuro, sia se vi dovesse capitare di chiedere aiuto che di fornirlo a terzi, magari pubblicando righe di codice nei forum o tutto la cartella progetto su GitHub. Comunque la struttura dei dati è semplicissima e le uniche cose da modificare sono:

  • Broker: il vostro server di CloudMQTT
  • Port: la solita porta SSL di CloudMQTT
  • Username: il nome utente che avete creato per Home Assistant su CloudMQTT
  • Password: avete capito...

Una volta completata la scrittura recatevi in Impostazioni / Generale di Home Assistant, eseguite un [Controlla la Configurazione] e se risulta tutto ok riavviate il server. A questo punto, però, prima di poter fare qualsiasi cosa sarà necessario che OwnTracks invii un cambio posizione a CloudMQTT, il quale verrà letto da HA. Può rendersi necessario uscire proprio di casa ed allontanarsi un bel po': se non avete fretta lasciate tutto così e la prossima volta che uscirete e poi rientrerete troverete le impostazioni giuste per completare il prossimo passaggio.

4. Home Assistant: GPS parte 2

Se tutto è andato per il verso giusto, ovvero se vi siete mossi a sufficienza affinché OwnTracks si sia deciso ad inviare un cambio di posizione significativo a CloudMQTT che sia poi stato letto da HA, dovreste trovare un nuovo file nella cartella /config con il nome "known_devices.yaml". La sua struttura è molto semplice, ecco come dovrebbe apparire la prima volta:

maurizio_iphonex:
  hide_if_away: false
  icon:
  name: Maurizio
  picture:
  track: true

Notate che l'id del dispositivo è l'unione del nome utente di CloudMQTT e del DeviceID di OwnTracks con un underscore a separarli. Essendo tutti parametri destinati ad un id li ho sempre inseriti in minuscolo e senza spazi, mentre il name che vedete qui è una etichetta che potete scrivere con maiuscole, spazi o accenti senza problemi; infatti io ho scritto "Maurizio". I device tracciati appaiono come sensori su HA, quindi con il classico cerchietto, a cui si aggiunge sotto l'etichetta [in casa] o [fuori] a seconda se il parametro "state" risulta essere "home" o "not_home". Questo dato verrà attualmente valorizzato solo tramite il GPS aggiornato da OwnTracks e ben presto noterete che non è sufficiente. Si aggiorna con una lentezza disarmante e fa decadere parte della sua utilità.

tip: se non lo avete già fatto, registrate la vostra email su gravatar ed inviate una immagine di profilo. Potrete così aggiungere al vostro dispositivo in HA la proprietà "gravatar: email" per vedere apparire la foto nel cerchietto del dispositivo.

5. Home Assistant: Wi-Fi

Per migliorare la precisione del sistema ci viene in aiuto la nostra rete Wi-Fi ed il tracciamento NMAP. Prima, però, sarà opportuno andare a prenotare sul modem/router un IP fisso per ognuno degli smartphone interessati. Una volta fatto questo disattivate e riattivate il Wi-Fi in modo che ottengano il nuovo IP e modificate il device_tracker: in configuration.yaml in questo modo:

device_tracker:
  - platform: owntracks
    max_gps_accuracy: 100
  - platform: nmap_tracker
    hosts:
      - !secret ip_iphone_maurizio
      - !secret ip_iphone_piera
    interval_seconds: 30

Inutile che vi ripeta nuovamente la storia del !secret: ho messo gli IP nel file secrets.yaml per non scriverli qui manualmente. Non che sia un grande segreto questo, si tratta di indirizzi locali, tuttavia trovo più pratico concentrare in quel file tutte le "variabili" che riguardano la mia specifica configurazione. È potenzialmente utile anche se si dovesse inserire due o più volte quello stesso dato, in quanto si potrebbe richiamare ovunque e modificarlo una sola volta, in caso di necessità. Una volta salvato il file di configurazione effettuate l'ennesimo riavvio di HA, al termine andate ad aprire il file kwnon_devices.yaml e noterete che avrà aggiunto una nuova entità con un campo in più: il mac address. Ok, potevate già leggerlo in altro modo, lo so, ma così siete certi che venga effettuata una lettura corretta da HA. Ovviamente non conviene avere due diversi dispositivi da tracciare, per cui andremo a cancellare il secondo generato da nmap_tracker e inseriremo la riga del mac address all'interno dell'entità creatasi tramite il primo step (poiché lì è importante l'id, che non va modificato). Il risultato dovrebbe essere molto simile a questo:

maurizio_iphonex:
  hide_if_away: false
  icon:
  mac: !secret maurizio_mac_address
  name: Maurizio
  gravatar: !secret maurizio_email
  picture:
  track: true

6. Mettere a frutto il tracciamento

In questo passaggio tutto dipende dalle vostre esigenze, non c'è necessariamente un giusto/sbagliato o qualche automazione da compiere. Potreste semplicemente volere la visualizzazione di "in casa" o "fuori", tanto per dirne una. E non pensate di adoperare questo sistema per cose tipo accendere le luci al passaggio poiché la latenza non lo rende possibile. Più che altro è un sistema utile da utilizzare nelle condizioni, qualcosa del tipo: fai questo, ma solo se questa persona è a casa o se risulta fuori casa. Ecco un esempio possibile di condizione:

condition:
  - condition: state
    entity_id: 'device_tracker.maurizio_iphonex'
    state: 'home'

In un mondo perfetto basterebbe questo per ottenere una validazione corretta, tuttavia anche unendo le informazioni del GPS e del Wi-Fi si possono ottenere dei falsi positivi. Ad esempio se per qualche istante un dispositivo si sconnette dal Wi-Fi potrebbe passare su "not_home" e poi di nuovo su "home". Per risolvere questo inconveniente che vi garantisco essere reale, conviene aggiungere una condizione for: specificando un tempo di attesa.

condition:
  - condition: state
    entity_id: 'device_tracker.maurizio_iphonex'
    state: 'home'
    for:
      minutes: 5

Nel caso in cui vogliate invece far scattare un'automazione all'uscita o al rientro a casa, sempre considerando un tempo di attesa minimo che serve ad accertarsi che il dato sia statico ed effettivo. Eccovi un esempio di automazione in cui la presenza in casa è utilizzata come trigger per farci dare un saluto vocale dal Google Home:

- alias: at_home_alert
  initial_state: true
  trigger:
    platform: state
    entity_id: device_tracker.maurizio_iphonex
    from: 'not_home'
    to: 'home'
    for:
      minutes: 5
  condition:
    condition: time
    before: '20:00:00'
  action:
    - service: tts.google_say
      entity_id: media_player.google_home
      data:
        message: "Ciao Maurizio"

Questo è solo un esempio la cui utilità può essere del tutto marginale, starà a voi implementare la cosa in base alle specifiche necessità. Nelle prossime uscite analizzeremo alcuni argomenti teorici importanti, ovvero i Modelli (Templates) e l'integrazione con altri servizi come Telegram (per ricevere le notifiche) oppure Google Assistant (per impartire comandi o ricevere informazioni).

Autore:
Maurizio Natali (@simplemal)

Revisore:
Alberto Zamboni (@albyzambo)

SmartHome Channel

Special Team - I SaggiUtenti del canale #SmartHome presente sul nostro Slack uniti per creare guide e recensioni dedicate all'automazione. Partecipa anche tu entrando nel gruppo effettuando una donazione dal SaggioSupporto.