Configurare Il Nest in Italia

| Comments

Attenzione: le operazioni descritte in questo articolo non sono più necessarie in seguito all’update software 4.0 del Nest. Vedere la sezione update in fondo al post.

Nell’articolo precedente abbiamo imparato a collegare il Nest a un tipico impianto a caldaia italiano con circuito di comando a 220V. Una volta collegato via WiFi al router ADSL di casa seguendo le istruzioni allegate al termostato, le cose funzionano egregiamente, ma ci sono un paio di dettagli che ci fanno capire come l’utilizzo al di fuori del territorio americano non rientri ancora nei piani di Tony Fadell & co.

In particolare il Nest si collega alla rete per sincronizzare il proprio orologio e scaricare le previsioni del tempo, e l’unico modo per indicare dove è installato è l’inserimento del CAP della città di residenza. Ovviamente Nest prevede solo CAP di USA e Canada, che spesso si sovrappongono a quelli italiani. Se in questo momento inserisco il CAP di Sanremo (18038) il Nest pensa di trovarsi a Danielsville in Pennsylvania e che la temperatura esterna sia di −2’C quando in realtà qui a Sanremo la temperatura è ben più mite (18’C). Considerato che Nest utilizza queste informazioni per anticipare o ritardare l’accensione della caldaia a seconda della temperatura esterna, è ovvio che il funzionamento non risulta ottimale. Inoltre tutte le funzioni di timer vengono regolate in base al fuso orario relativo al CAP inserito.

Qualcuno ha ovviato selezionando un CAP di Honolulu, che ha 12 ore di differenza dall’Europa. Questo però comporta l’inversione nel timer di orari giornalieri e notturni, ed impedisce il funzionamento dell’auto-away che spegne la caldaia quando non rileva nessuno in casa di giorno, mentre di notte è abbastanza smart da capire che se il sensore di movimento non rileva nessuno è perchè state dormendo.

Per avere il meglio dal Nest ed abilitare tutte le funzioni anche in Italia è necessario un po’ di sano hacking in modo da farlo lavorare con le informazioni corrette.

Disclaimer iniziale: il seguente non vuole essere un manuale di istruzioni per installare il Nest e farlo funzionare in Italia. La descrizione della procedura presuppone un discreto livello di famigliarità con i sistemi Unix oppure OS X. Come succede per qualsiasi articolo tecnico, è inevitabile che qualcuno trovi la descrizione molto semplice e a tratti ridondante: questo non mi preoccupa, saprete scremare ed estrarre le informazioni che vi servono e modificarle secondo le vostre necessità e preferenze. E’ altrettanto inevitabile che qualcuno trovi il tutto di difficile comprensione: non c’è niente di male, abbiamo tutti cominciato da zero.
Il mio invito in tal caso è quello di utilizzare la rete: se non capite cosa significa “installare Dnsmasq con Homebrew” è inutile chiedere un ulteriore tutorial nei commenti a questo articolo, usate google e ne troverete decine.

Le informazioni di base e lo script PHP di partenza le ho ottenute dal blog del mitico Mot. Nelle sue istruzioni Mot utilizza un router con custom firmware Linux per fornire le informazioni corrette al Nest. L’installazione di un custom firmware è una cosa un po’ complicata, si rischia di buttare via il router, e solo una parte dei router in commercio lo consentono. Ho quindi preferito realizzare qualcosa di analogo attraverso un computer sempre acceso sulla rete di casa che funziona da server web e dns.

Nel mio caso ho usato il MacMini con OS X 10.6 Snow Leopard che utilizzo anche come mediacenter, ma la procedura si può adattare comodamente a qualsiasi computer basato su Linux. Se non avete un computer da dedicare al progetto, un ottimo candidato può essere il Raspberry-PI.

Analisi del problema

Intercettando le comunicazioni TCP si vede che il Nest accede sovente a un indirizzo su Wunderground, servizio web di monitoraggio e previsioni meteo.

http://www.wunderground.com/auto/nestlabs/geo/current/i?query=18038

Aprendo con Safari la stessa pagina Wunderground si visualizza una pagina JSON con dati identificativi, metereologici, di geolocalizzazione e di fuso orario relativi alla famosa Danielsville in Pennsylvania.

Wunderground - 18038 Apri nel browser
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
{
  "18038": {
  "location":{
  "station_id":"KPAWALNU2",
  "zip":"18038",
  "city":"Danielsville",
  "state":"PA",
  "country":"US",
  "lat":"40.79058456",
  "lon":"-75.48538208",
  "short_name":"Danielsville,PA",
  "timezone":"EST",
  "timezone_long":"America/New_York",
  "gmt_offset":"-5.00",
  "full_name":"Danielsville,PA 18038 US"},
  "current": {
  "temp_f":26.5,
  "temp_c":-3.1,
  "condition":"Scattered Clouds",
  "sunrise":1361360932,
  "sunset":1361400178,
  "lengthofday":654,
  "humidity":57,
  "timezone":"EST",
  "gmt_offset":"-5.00",
  "wind_dir":"WNW",
  "wind_mph":20.7,
  "wind_kph":33.3,
  "observation_time":1361375411,
  "icon":"partlycloudy"
  },
  "forecast": {
  "daily":[ { ...

Se proviamo a sostituire nella url il CAP 18038 con qualcos’altro, riusciamo ad ottenere da wunderground informazioni su altre città. Ad esempio se inseriamo:

http://www.wunderground.com/auto/nestlabs/geo/current/i?query=sanremo

riesco ad ottenere informazioni corrette sulla mia città.

Wunderground - sanremo Apri nel browser
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
{
  "sanremo": {
  "location":{
  "city":"Sanremo",
  "state":"",
  "country":"IY",
  "lat":"43.81821823",
  "lon":"7.76114607",
  "short_name":"Sanremo,",
  "timezone":"CET",
  "timezone_long":"Europe/Rome",
  "gmt_offset":"1.00",
  "full_name":"Sanremo, 00000 EU"},
  "current": {
  "temp_f":47.7,
  "temp_c":8.7,
  "condition":"Chance of Snow",
  "sunrise":1361686435,
  "sunset":1361725861,
  "lengthofday":657,
  "humidity":67,
  "timezone":"CET",
  "gmt_offset":"1.00",
  "wind_dir":"West",
  "wind_mph":0.4,
  "wind_kph":0.6,
  "observation_epoch":"1361707200",
  "icon":"chancesnow" },
  "forecast": {
  "daily":[ {

L’obiettivo della procedura sarà quindi quello di intercettare la chiamata di Nest verso wunderground, modificarla in modo da sostituire “18038” con “sanremo” nella query, ottenere i risultati da wunderground, e restituirli al Nest in modo che lavori con le informazioni corrette.

In termine tecnico quello che vogliamo realizzare si chiama “man in the middle attack”, ovvero “attacco dell’uomo nel mezzo” e nel nostro caso comporta avere un server web dedicato che scambi le informazioni tra Nest e Wunderground, e un server dns dedicato che inganni Nest e lo dirotti verso il server web quando cerca di contattare Wunderground.

NB: Tenete presente che tutti gli indirizzi IP riportati andranno adattati agli indirizzi utilizzati sulla vostra rete. Nel mio caso il MacMini è su 192.168.1.11

Apache

La prima parte è molto semplice. OS X contiene pre-installato il server web Apache: basta attivarlo nelle preferenze di sistema (Condivisione -> Condivisione Internet). Di default Apache su OS X è configurato in modo da non far girare gli script PHP, quindi bisogna fare una piccola modifica nel file di configurazione (ignorate la parte relativa a MySql) e riavviare Apache.

A questo punto bisogna inserire nella cartella da cui Apache prende i file da servire al pubblico uno script PHP che faccia da intermediario tra Wunderground e il Nest. La cartella dove mettiamo lo script è importante e facile da sbagliare. Vogliamo che apache risponda allo stesso indirizzo che Nest si aspetta da Wunderground, quindi http://192.168.1.11/auto/nestlabs/geo/current/i

Innanzitutto va ricercata la cartella dei documenti apache nella libreria di sistema e non quella utente. Nel caso di OS X 10.6 la cartella è /Library/WebServer/Documents/ da non confondere con /Users/nomeutente/Library/WebServer/Documents che è quella da cui apache serve i file web di ogni singolo utente.

Dopodichè nella cartella base va creata la struttura corretta di cartelle e sottocartelle. Potete usare il terminale col comando:

mkdir -p /Library/WebServer/Documents/auto/nestlabs/geo/current/

Nella cartella current metteremo quindi il seguente script php con il nome di “i.php”

i.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php
$param = $_GET["query"];
if ($param == "18038") {
        $jsonData = json_decode(file_get_contents('http://38.102.136.104/auto/nestlabs/geo/current/i?query=sanremo'), true);
        $data = $jsonData["sanremo"];
        $data["location"]["city"] = "Sanremo";
        $data["location"]["state"] = "IM";
        $data["location"]["zip"] = "18038";
        $data["location"]["country"] = "US";
        $data["location"]["timezone"] = "EDT";
        $data["current"]["timezone"] = "EDT";
        $jsonData = array("18038"=>$data);
} else {
        $jsonData = json_decode(file_get_contents('http://38.102.136.104/auto/nestlabs/geo/current/i?query=' . $param));
}
header('Content-Type: application/json');
print stripslashes(json_encode($jsonData));
?>

Il funzionamento è relativamente semplice. Quando viene interrogato dal Nest con un argomento query uguale a 18038, lo script scarica dal vero server di wunderground (38.102.136.104) la pagina auto/nestlabs/geo/current/i?query=sanremo, modifica alcuni dei dati, e la restituisce al Nest così modificata.
Qualsiasi altra query viene restituita invariata dallo script.

Occorre ovviamente sostituire i dati Sanremo, IM e 18038 sia nella riga if ($param==“18038) sia in quelle $data[“location… con i dati relativi alla vostra posizione, ricordando poi di inserire nel Nest lo stesso CAP che abbiamo messo nello script. I dati US ed EDT sono fondamentali per far credere a Nest di essere in USA e quindi di accettare il CAP inserito.

Una volta salvato il file potete verificare che funzioni accedendo con un browser sullo stesso computer dove avete installato lo script all’indirizzo:

http://127.0.0.1/auto/nestlabs/geo/current/i?query=18038

Se il browser visualizza le informazioni sulla vostra città significa che lo script e Apache funzionano a dovere. La stessa cosa deve accadere se da un altro computer sulla stessa rete accedete a:

http://192.168.1.11/auto/nestlabs/geo/current/i?query=18038

Dnsmasq

Il passo successivo consiste nell’ingannare Nest e dirottarlo verso il Mac Mini quando cerca di contattare Wunderground. Il compito di indirizzare le richieste verso i server web avviene a livello dei server DNS, che traducono gli indirizzi testuali (wunderground.com) in indirizzi IP (38.102.136.104).

Dnsmasq è un software di server DNS molto semplice che gira su OS X o qualsiasi macchina su base Unix. Il modo più semplice per installarlo su MacMini è utilizzando Homebrew con il comando:

brew install dnsmasq  

seguendo poi le istruzioni che homebrew ci fornisce per configurare dnsmasq in modo che si avvii automaticamente al boot del sistema.

Un ottimo tutorial per installare facilmente Homebrew su OS X lo trovate qui: How to Install Xcode, Homebrew, Git… (i primi 3 step sono sufficienti).

Per fornire le traduzioni indirizzo testuale -> indirizzo numerico dnsmasq di default le prende dai server DNS configurati nelle preferenze della macchina su cui gira (questo vale almeno per l’installazione su MacMini attraverso homebrew). Occorre quindi andare nelle preferenze di sistema (network, ethernet, avanzate, DNS) e inserire almeno due indirizzi di DNS conosciuti e affidabili.

  • OpenDNS:
    • 208.67.220.220
    • 208.67.222.222
  • oppure GoogleDNS:
    • 8.8.8.8
    • 8.8.4.4

Ricordate di riavviare dnsmasq, oppure fare il reboot, dopo aver modificato la configurazione oppure i server DNS.

Verificare che dnsmasq sia ben configurato è semplice. Collegate un altro computer alla stessa rete del MacMini, modificatene i server DNS cancellando quelli eventualmente inseriti e sostituiteli con l’indirizzo del MacMini (192.168.1.11). A questo punto con un browser visitate qualsiasi sito esterno tramite indirizzo testuale (digitalia.fm è ottimo per i test).
Se il sito di Digitalia viene caricato significa che dnsmasq funziona correttamente. Già che ci siete mettete Digitalia nei bookmark perchè è il migliore tech show in circolazione in Italia: un episodio alla settimana, in diretta il lunedì e in podcasting quando volete voi. (fine della pubblicità)

Router

Inserire manualmente l’indirizzo del dns nel Nest non è possibile in quanto, come molti dispositivi WiFi, richiede l’indirizzo del server DNS corretto al router tramite il quale accede al internet. Il vostro computer fa la stessa cosa se non inserite manualmente uno o più indirizzi di server DNS. Dobbiamo quindi istruire il router a distribuire l’indirizzo del computer dove gira dnsmasq come DNS a qualunque dispositivo si colleghi via WiFi e lo richieda. Questo si fa nelle pagine di configurazione del router. La maggior parte dei router permettono di modificare i DNS, ma c’è qualche eccezione come i router standard in dotazione con Alice di Telecom (cambiate il router). Nell’immagine qui sotto trovate la pagina di configurazione del classico Netgear 834G.

Ancora una volta verifichiamo se tutto funziona. Con un qualsiasi dispositivo collegato alla rete locale, ma non il con il computer su cui gira dnsmasq, eliminate gli indirizzi dei server DNS dalla configurazione di rete. Eventualmente riavviate il computer, o se siete connessi in WiFi fate “dimenticare” l’accoppiamento tra computer e router in modo da ripetere il login con la base WiFi. Questo è importante perchè il computer chieda nuovamente l’indirizzo dei DNS al router. Verificate che la navigazione per indirizzi testuali funzioni correttamente e che il dispositivo stia utilizzando effettivamente il computer locale con dnsmasq come DNS.

Su Linux:

cat /etc/resolv.conf

Su Mac:

networksetup -getdnsservers Wi-Fi
networksetup -getdnsservers ethernet

Configurazione Dnsmasq

L’ultimo passo è quello di dirottare le chiamate a Wunderground verso il nostro script su Apache. Cercate il file di configurazione di dnsmasq (installando dnsmasq con Homebrew dovrebbe essere /usr/local/etc/dnsmasq.conf) e aggiungete sotto alla riga:

# Add domains which you want to force to an IP address here.

la vostra configurazione specifica per le richieste a Wunderground:

address=/www.wunderground.com/192.168.1.11

Riavviate il computer con dnsmasq. A questo punto visitando http://www.wunderground.com/auto/nestlabs/geo/current/i?query=18038 su un computer sulla rete locale (che abbia i DNS impostati sull’indirizzo IP del computer con dnsmasq) deve comparire una pagina con le informazioni della vostra città, e non quelle americane.

Potete resettare il vostro Nest, inserire il CAP che avete usato nello script, e collegarlo al WiFi. Una volta effettuato il collegamento dovrebbe dirvi il nome della città che avete inserito nello script e cominciare a funzionare con le informazioni corrette, a partire dall’ora locale.

Noterete che quando vi collegate al vostro Nest tramite browser web, oppure tramite app mobile quando siete fuori dalla vostra rete locale, nelle informazioni sul meteo viene visualizzata la temperatura esterna relativa al CAP americano. Se invece vi collegate con l’app mobile quando il vostro dispositivo è collegato alla rete di casa, con impostato come DNS la macchina con dnsmasq, l’informazione è quella corretta.

Non ho un modo per ovviare a questo inconveniente, ma riguarda solo la visualizzazione, il Nest lavora comunque con le informazioni meteo corrette della vostra località.

Update (10/11/2013)

Nell’ultimo aggiornamento (automatico) del firmware del Nest, è stato modificato il server a cui accede il termostato per recuperare le informazioni su meteo e ora locale. Al posto di wunderground.com ora Nest prende informazioni direttamente da weather.nest.com. A causa di questo cambiamento è probabile che a partire dal 9/10/2013 chi aveva seguito questa guida si sia ritrovato con l’ora del termostato errata e le informazioni meteo completamente sballate.

Ricordandovi che quello qui illustrato è un hack, studiato in maniera indipendente, e che quindi sarà sempre vulnerabile a interventi di aggiornamento da parte della casa madre (e che il sottoscritto non si assume alcuna responsabilità se vi svegliate congelati perchè il Nest non è partito), sono sollevato nel dirvi che per questa volta siamo fortunati: la modifica non è così drastica, e il problema facilmente risolvibile.

La URL che il termostato Nest interroga per la precisione è:
http://weather.nest.com/weather/v1?query=18038

Se provate ad accedere con il browser però questo non carica nulla. Il motivo è che weather.nest.com risponde solo a chiamate con un user-agent custom del Nest, in particolare “AddLightness/3.5.1 (Display-2.6)”.

Aprendo (con wget oppure Safari modificando l’user-agent) arriva la sorpresa: la struttura dei dati è la stessa identica che restituiva Wunderground. Probabilmente weather.nest.com scarica in tempo reale i dati di Wunderground, li modifica (o li modificherà in futuro) a suo piacimento, e li fornisce al termostato. (ma guarda un po’ è proprio quello che facciamo noi con il nostro script).

La soluzione è semplice. Creiamo una cartella ulteriore dentro la root del nostro webserver:

mkdir -p /Library/WebServer/Documents/weather/

Copiamo il nostro script precedente i.php dentro la nuova cartella weather, e lo rinominiamo v1.php.

Nella configurazione di Dnsmasq aggiungiamo sotto la nostra precedente entry relativa a wunderground.com la direttiva per dirottare anche le chiamate verso weather.nest.com:

address=/weather.nest.com/192.168.1.11

Ricordate di far ripartire dnsmasq oppure di riavviare la macchina dove questo è in esecuzione.

Il Nest ora dovrebbe caricare le informazioni corrette. C’è però un potenziale problema, dovuto al fatto che il nostro script carica le informazioni ancora da wunderground.com, bypassando completamente weather.nest.com, e quindi perdendo eventuali modifiche/aggiunte operate da quest’ultimo. Al momento il problema non si pone in quanto apparentemente weather.nest.com non apporta modifiche evidenti, almeno io non sono riuscito a trovarne. L’ottimale sarebbe non scaricare più i dati da wunderground.com, ma direttamente da weather.nest.com. Sarà probabilmente argomento di un prossimo update.

Update (27/11/2013)

Le modifiche apportate dall’aggiornamento descritto nel precedente update presagivano novità che sono puntualmente arrivate. Con il nuovo update Nest è ora facilmente configurabile per l’utilizzo in tutta Europa. Le operazioni di configurazione di questo tutorial diventano quindi superflue.

Se avete effettuato tutta la configurazione come descritto in questo articolo e volete disfare il tutto è molto semplice: basta modificare di nuovo l’indirizzo del DNS nella configurazione del vostro router, inserendo quelli desiderati (GoogleDNS, OpenDNS) oppure lasciando il campo vuoto facendo sì che il router carichi quelli di default del vostro internet service provider. Potete poi disinstallare dnsmasq, ed eventualmente fermare il server Apache sul vostro computer se non lo usate per altri scopi.

Lascerò online questo articolo che rimane utile come riferimento per eventuali problemi futuri, e come buon esercizio per imparare qualcosa in materia computer networking.

Rimane ovviamente utilissimo il post precedente riguardante l’installazione elettrica del Nest a un impianto domestico italiano.

Comments