Come salvare i valori di temperatura e umidità rilevati da Nest

Nell’ambito della domotica – e in particolare dei termostati smart – il termostato Nest è sicuramente uno dei dispositivi più conosciuti. Al momento siamo arrivati alla terza generazione e Nest Labs – di proprietà di Google – ha da poco lanciato un nuovo modello “economico”, il Nest Thermostat E oltre a un sacco di altri dispositivi per la telesorveglianza.

Sfortunatamente, nonstante la prima generazione di Nest sia uscita ben 6 anni fa, ad oggi non è ancora possibile salvare i valori rilevati dal termostato per farsi un’idea dell’andamento della temperatura e dell’umidità nell’abitazione. Questo è un peccato, perché comunque quei dati vengono rilevati costantemente, solo non vengono salvati.

Guardando in rete anni fa mi sono imbattuto in questo blog – che ringrazio – che spiega come fare precisamente questo: loggare e salvare tutte le rilevazioni di Nest.

Tuttavia, visto che l’articolo originario ormai ha due anni e mezzo e richiede qualche modifica dello script (oltre ad essere in inglese), ho deciso di pubblicare una guida passo passo aggiornata e in italiano.

Alternativamente, se volete uno strumento ad hoc per segnare la temperatura (niente umidità purtroppo) e non avete voglia di smanettare potete acquistare un ThermoPeanut a 30 € su Amazon che funziona benissimo e pemette di esportare tutti i dati.

Purtroppo Sen.se, l’azienda che produceva il ThermoPeanut, è fallita. Nessuno dei miei dispositivi uploadda più i dati, hanno cancellato tutte le pagine social e non rispondono più alle mail.

Prerequisiti

  • un account Google (i dati verranno loggati su Google Sheet)
  • un account Nest ovviamente
  • un account di OpenWeatherMap (per sapere la temperatura esterna)

Come loggare i valori rilevati dal termostato Nest

  1. andate su Drive e create un nuovo “Foglio Google” (NUOVO > Fogli Google);
  2. nella prima riga del nuovo foglio scrivete una valore per ogni casella: Data, Target, T Interna, T esterna, Umidità, Riscaldamento, Away (questo passaggio è opzionale);
  3. segnatevi la stringa di caratteri tra /d/ e /edit nell’indirizzo del foglio (se l’URL è https://docs.google.com/spreadsheets/d/1cJoZRwzGY_c12vbyCAHNhPzB_vLidsTiK3V0TTjb21w/edit#gid=0 voi vi segnate 1cJoZRwzGY_c12vbyCAHNhPzB_vLidsTiK3V0TTjb21w);
  4. vi loggate su OpenWeatherMap, create una nuova API key e vi segnate anche questo valore (l’API key è una stringa alfanumerica di 32 caratteri);
  5. cercate la vostra città su OpenWeatherMap e vi segnate la stringa di numeri dopo /city/ nell’URL (per Roma ad esempio è 3169070).

Ok, buona parte del lavoro l’avete già fatto. Adesso dobbiamo mettere insieme lo script. Copiate il codice che trovate a fine articolo, quindi:

  1. aprite il foglio di Google Sheet creato al precedente punto 1 e cliccate su Strumenti > Editor di script;
  2. incollate il codice dello script appena copiato e modificate le prime righe sostituendo ai campi in MAIUSCOLO i valori corrispondenti (lasciando gli apostrofi all’inizio e alla fine);
  3. File > Salva
  4. Pubblica > Distribuisci come applicazione web
    Esegui l ‘applicazione come > Io ([email protected])
    Chi accede all’applicazione > Chiunque, inclusi utenti anonimi
    Implementa > OKVerificate che lo script funzioni correttamente cliccando su Esegui > doGet e andando a verificare nel foglio di Google Sheet se sono comparsi dei valori.
  5. Come ultimo passaggio impostiamo l’intervallo col quale vogliamo segnare i dati cliccando su Modifica > Trigger del progetto corrente > Aggiungi un nuovo trigger usando questi valori:
    Esegui = getData; Eventi = Basato su tempo – Timer minuti – Ogni 15 minuti e salvate.

Se avete fatto tutto correttamente ogni 15 minuti lo script loggerà i valori di temperatura, umidità e lo stato del termostato (caldaia ON/OFF, Away/Home) su una nuova riga del foglio di Google Sheet. Come intervallo potete anche mettere di più o di meno di 15 minuti, tuttavia non consiglio di scendere troppo.

Codice dello script

function doGet() {
var email = ‘MAILDELLACCOUNTNEST‘; //inserite qui la mail che usate per loggarvi su Nest
var password = ‘PASSWORDNEST‘; //inserite qui la password che usate per loggarvi su Nest
var sheetid = ‘STRINGAGOOGLESHEET‘; //inserite qui la stringa che vi siete segnati al precedente punto 3
var apikey = ‘APIKEY‘; //inserite qui la stringa che vi siete segnati al precedente punto 4
var city = ‘IDCITTAMETEO‘; //inserite qui la stringa che vi siete segnati al precedente punto 5

var login_auth = performLogin(email,password);

var headers = {
“Authorization” : ‘Basic ‘+login_auth[‘access_token’],
“X-nl-user-id” : login_auth[‘userid’],
“X-nl-protocol-version” : ‘1’,
‘Accept-Language’: ‘en-us’,
‘Connection’ : ‘keep-alive’,
‘Accept’ : ‘*/*’,
};

var options = {
‘headers’ : headers
};

var request=UrlFetchApp.fetch(login_auth[‘urls’][‘transport_url’]+’/v2/mobile/user.’+login_auth[‘userid’], options);
var result=JSON.parse(request.getContentText());

var structure_id = result[‘user’][login_auth[‘userid’]][‘structures’][0].split(‘.’)[1]
var device_id = result[‘structure’][structure_id][‘devices’][0].split(‘.’)[1]

var current_temp = result[“shared”][device_id][“current_temperature”];
var target_temp = result[“shared”][device_id][“target_temperature”];
var humidity = result[“device”][device_id][“current_humidity”]/100;
var auto_away = result[“shared”][device_id][“auto_away”];
var heater_state = result[“shared”][device_id][“hvac_heater_state”];
var time = new Date();

var wxrequest=UrlFetchApp.fetch(‘http://api.openweathermap.org/data/2.5/weather?id=’ + city + ‘&units=metric&APPID=’ + apikey’);
var wxresult=JSON.parse(wxrequest.getContentText());

var outside_temp = (wxresult[“main”][“temp”]);

var ss = SpreadsheetApp.openById(sheetid);
var sheet = ss.getSheets()[0];

// Appends a new row with 3 columns to the bottom of the
// spreadsheet containing the values in the array
sheet.appendRow( [ time, target_temp, current_temp, outside_temp, humidity, heater_state, auto_away ] );
}

function performLogin(email, password) {
var payload = {
“username” : email,
“password” : password
};

var options = {
“method” : “post”,
“payload” : payload
};

var response = JSON.parse(UrlFetchApp.fetch(‘https://home.nest.com/user/login’, options).getContentText());
if (‘error’ in response) {
throw “Invalid login credentials”;
}
return response
}

function getData(){
var url = ScriptApp.getService().getUrl();
var response = UrlFetchApp.fetch(url);
}

4 risposte a “Come salvare i valori di temperatura e umidità rilevati da Nest”

  1. Sarebbe molto interessante….
    sapete se funziona anche oggi ?? Temo che Google abbia stretto le maglie per accesso ai dati con user/password blandi…
    H provato ma sempre con errore di login al Nest account

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *