Zwischenstand : OAUTH läuft und Abfragen meiner NEST Geräte funktioniert
Voraussetzung : Ich habe mich bei Google als developer angemeldet und ein Projekt angelegt. Auf der Google Cloud platform habe ich dann unter Credentials einen neuen OAUTH 2.0 Client angelegt bzw. konfiguriert. Der Redirect URI wurde wie folgt definiert : https://oauth.ipmagic.de/forward/google_nest
An Symcon (Dr. Niels) habe ich die Client sowie die Projekt ID weitergegeben sowie das Client Secret. Dr. Niels hat dann eine entsprechende Konfigurationsänderung bei Symcon gemacht um mir die Nutzung von IPMAGIC (Connect) zu ermöglichen.
Mein erster Ansatz das OAUTH Test Modul anzupassen hat erstmal nicht funktioniert.
Um ein Token und ein Refresh Token zu erhalten müssen die folgenden Schritte unternommen werden :
1.) Link your account
2.) Get an access token
3.) Make a device list call
4.) Refresh Token
Die Anleitung für die OAUTH Schnittstelle von Google ist hier zu finden : https://developers.google.com/nest/device-access/api/authorization
1.) Diesen Schritt habe ich im Chrome Browser durchgeführt. Google gibt in der Doku eine URL vor die im Browser aufgerufen wird :
https://nestservices.google.com/partnerconnections/project-id/auth?
redirect_uri=https://www.google.com&
access_type=offline&
prompt=consent&
client_id=oauth2-client-id&
response_type=code&
scope=https://www.googleapis.com/auth/sdm.service
Open the following link in a web browser, replacing project-id with your Device Access Project ID and oauth2-client-id with the OAuth2 Client ID from your GCP Credentials
Nach der Eingabe der URL (Bitte aufpassen, alle Leerzeichen und Zeilenumbrüche müssen entfernt werden) öffnet sich im Browser eine Seite auf der man sich dann in sein Google Konto auf dem die NEST Geräte registriert sind anmeldet. Danach kommt eine weitere Seite mit den Nest Geräten die man freischalten muss. Danach eine neue Seite auf der man Symcon erlaubt auf die NEST Geräte zugreifen zu dürfen. Es gibt im Moment noch eine Warnung das die Freigabe mangels Google Verifizierung unsicher ist. Am Ende erscheint dann eine leere Browser Seite mit einer URL in der sich der Access Code befindet :
https://www.google.com?code=authorization_code&scope=https://www.googleapis.com/auth/sdm.service
Die nächsten Schritte erfolgen dann über Scripts
Als erstes wird der Token geholt in dem man den access Code aus der URL sowie Client ID und Client Secret übermittelt :
$redirect_uri = 'https://oauth.ipmagic.de/forward/google_nest';
$PostData = array('client_id' => $client_id ,
'client_secret' => $client_secret ,
'code' => $access_code,
'grant_type' => 'authorization_code',
'redirect_uri' => $redirect_uri
);
$curl_handle=curl_init();
curl_setopt($curl_handle, CURLOPT_FOLLOWLOCATION,true); // -L redirect
curl_setopt($curl_handle, CURLOPT_POST, true);
curl_setopt($curl_handle, CURLOPT_URL, 'https://www.googleapis.com/oauth2/v4/token');
curl_setopt($curl_handle, CURLOPT_POSTFIELDS, $PostData);
$fileContent = curl_exec($curl_handle);
curl_close($curl_handle);
if ($fileContent===false)
{
echo 'Token request failed !!!';
}
else
{
print_r ($fileContent);
}
Der Aufruf wird mit der Rückgabe der folgenden Struktur quittiert die den Token sowie den Refresh Token und die verbleibende Gültigkeit des Tokens (3599 sek.) enthält:
{
"access_token": "access-token",
"expires_in": 3599,
"refresh_token": "refresh-token",
"scope": "https://www.googleapis.com/auth/sdm.service",
"token_type": "Bearer"
}
Danach muss ein Device List call durchgeführt werden um den Autorisierungs Prozess zu beenden :
$curl_handle=curl_init();
curl_setopt($curl_handle, CURLOPT_URL,'https://smartdevicemanagement.googleapis.com/v1/enterprises/'.$project_id.'/devices');
curl_setopt($curl_handle, CURLOPT_HTTPHEADER, array('Accept: application/json'));
curl_setopt($curl_handle, CURLOPT_HTTPHEADER, array('Authorization: Bearer '.$access_token ));
$fileContent = curl_exec($curl_handle);
curl_close($curl_handle);
if ($fileContent===false)
{
echo 'Token request failed !!!';
}
else
{
print_r ($fileContent);
}
Als nächstes muss man ein Timer Script für den Refresh Token anlegen sonst war alles für die Katz
$PostData = array('client_id' => $client_id ,
'client_secret' => $client_secret ,
'refresh_token' => $refresh_token,
'grant_type' => 'refresh_token'
);
$curl_handle=curl_init();
curl_setopt($curl_handle, CURLOPT_FOLLOWLOCATION,true); // -L redirect
curl_setopt($curl_handle, CURLOPT_POST, true);
curl_setopt($curl_handle, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl_handle, CURLOPT_URL, 'https://www.googleapis.com/oauth2/v4/token');
curl_setopt($curl_handle, CURLOPT_POSTFIELDS, $PostData);
$fileContent = curl_exec($curl_handle);
curl_close($curl_handle);
if ($fileContent===false)
{
echo 'Token request failed !!!';
}
else
{
echo $fileContent;
}
$fields = explode ( ',' , $fileContent);
$token = explode ( '"' , $fields[0]);
SetValueString(51237,$token[3]);
Hier mal ein Beispiel wo ich die Device Infos meiner NEST Geräte abhole und die Daten meines Thermostat`s abspeichere
$PostData = array('client_id' => $client_id ,
'client_secret' => $client_secret ,
'code' => $access_code,
'grant_type' => 'authorization_code',
'redirect_uri' => $redirect_uri
);
$curl_handle=curl_init();
curl_setopt($curl_handle, CURLOPT_URL,'https://smartdevicemanagement.googleapis.com/v1/enterprises/'.$project_id.'/devices');
curl_setopt($curl_handle, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl_handle, CURLOPT_HTTPHEADER, array('Accept: application/json'));
curl_setopt($curl_handle, CURLOPT_HTTPHEADER, array('Authorization: Bearer '.$access_token ));
$fileContent = curl_exec($curl_handle);
curl_close($curl_handle);
if ($fileContent===false)
{
echo 'Token request failed !!!';
}
else
{
}
$devices = json_decode ($fileContent);
$array = json_decode(json_encode($devices), true);
SetValueInteger(20366,intval( $array['devices'][0]['traits']['sdm.devices.traits.Humidity']['ambientHumidityPercent']));
SetValueFloat(34399, $array['devices'][0]['traits']['sdm.devices.traits.Temperature']['ambientTemperatureCelsius']);
SetValueString(54499, $array['devices'][0]['traits']['sdm.devices.traits.Connectivity']['status']);
SetValueFloat(53600, $array['devices'][0]['traits']['sdm.devices.traits.ThermostatTemperatureSetpoint']['coolCelsius']);
Als Antwort erhalte ich eine Struktur die ich mit Hilfe von JSON in ein Array umwandele (mehrfach JSON um die mistige objekt Dinger zu entfernen)
$devices = json_decode ($fileContent);
$array = json_decode(json_encode($devices), true);
Die Beschreibung der abgefragten Struktur ist hier zu finden : https://developers.google.com/nest/device-access/traits
Was ich noch nicht hinbekommen habe sind Events die von meinen Nest Geräten (z.B. Doorbell) erzeugt wurden in IPS zu verwerten.
Ich muss noch herausbekommen welche Methode Symcon dafür verwendet.
Ich werde das Ergebnis dann wieder berichten. Das OAUTH Modul sollte umgeschrieben werden. Ich werde mich dazu mit Dr. Niels unterhalten und vielleicht bekomme ich das ja hin und falls nicht Dr. Niels ?