Einbindung von Google NEST Geräten in IP Symcon

Ich möchte meine NEST Geräte (Kameras etc. ) in Symcon einbinden um mir Eventgetrieben Bilder sowie Streams meiner Doorbell schicken zu lassen.

Ich möchte also nicht wie Beim Google Assistant über Google, Endgeräte die bereits in mein IP-Symcon System eingebunden sind ansteuern, sondern ohne explizite Aufforderung durch den Nutzer (also eventgetrieben) Daten von meinen Nest Geräten in IP Symcon empfangen um diese dort weiterzuverarbeiten

Google nutzt für die API eine OAUTH 2.0 Authentifizierung und zumindest in den Beispielen CURL commandos. Events werden durch die API unterstützt

In IPSymcon gibt es ein paar Komponenten die man nutzen kann/sollte. Dazu gehören :

1.) Symcon Connect => einfache Methode um mit HTTPS über IP-Magic meinen Symcon Rechner zu erreichen

2.) WebOATUH => Die WebOAuth Instanz dient einfach als Endpunkt von IP-Symcon über die Daten dann von IP-Symcon Connect empfangen werden oder über die Instanz verschickt werden.
https://www.symcon.de/forum/threads/35475-Kerninstanz-WebOAuth-Was-kann-die-Wie-verwendet-man-diese

3.)OAUTH Test Modul => Ein Modul das die automatische Erneuerung der Token durchführt. Man kann den Identifier „Test“ ersetzen. In meinem Fall wäre das : „google_nest“. https://www.symcon.de/forum/threads/33123-OAuth2-%C3%BCber-Symcon-Connect?highlight=oauth

Zum jetzigen Stand haben ich von Google die Daten für :
1.) Client ID
2.) Client Secret
3.) Token
4.) Refresh Token
5.) Scope
6.) Project ID

Im OAUTH Test Modul ist ein Kommentar zu finden das Symcon mir auch eine eigene ID geben kann aber falls möglich soll ich eine vorhandene ID nehmen (Macht erstmal Sinn)
https://github.com/symcon/SymconTest/tree/master/OAuthTest

Wenn ich die vorhandene „google_nest“ ID nehme ist mir unklar wie ich später meine eigenen Google Devices in meinem Heim ansprechen kann.
In Symcon gibt es keine „Doorbell“ Instanz um ein Beispiel zu nennen. In Google Home habe ich IP-Symcon autorisiert, ich vermute das hier die Verknüpfung mit meinen Nest Geräten in meinem Heim und IP-Symcon hergestellt wird. Richtig ?

Wie kann meine Symcon Installation nun mit meinen NEST Geräten kommunizieren ?
Es gibt keine Doorbell Instanz in Symcon d.h. Ich müsste mir eine programmieren ?
Nutze ich dazu eine Public Funktion des OAUTH „Test“ Moduls ?
Wie bekomme ich vom Modul mein aktuelles Token ?

Ich finde keine Dokumentation des OAUTH Test Moduls. Diese Public Functions sind vorhanden :

übliche Modul Funktionen :
public function __construct($InstanceID)
public function Create()
public function ApplyChanges()
public function Register()

Spezifische Funktionen
public function RequestStatus()

Erhalte ich meinen Token indem ich RequestStatus() aufrufe ?

Ist meine Annahme korrekt ich die Kommunikation mit Google über PHP CURL erfolgt (und nicht über Funktionen des OAUTH Moduls) und ich mir dazu eine Google Doorbell Instanz programmieren muss ?

Deine Annahmen sind soweit korrekt. Das OAuth Control übernimmt für dich das aktualisieren und austauchen des Tokens. Diesen verwendest du dann als Authentifizierung bei Webanfragen an Google, via curl oder file_get_contents.

Ich glaube übrigens, das Testmodul speichert den Token in einer Eigenschaft, was natürlich Unfug ist, da der Benutzer den Token nicht einstellt. Hierfür solltest du ein Attribut verwenden. Schau dir sonst auch gerne mal das SpotifyModul an. Da verwende ich ebenfalls OAuth um mich für die Spotify API zu autorisieren.

Zusatzfrage : Im OAUTH TestModul muss ich im Formblatt einen Token zur Initialisierung eingeben. Wo kommt dieser erste Token her ?

Der sollte automatisch kommen wenn du auf Register klickst

Für die Eingabe des Identifier „google_nest“ gibt es ja kein Formblatt.

Das heist doch das ich im Github Code die folgende Änderung machen muss und dann den Code auf meinen Rechner lade und local als Modul einbinde, Richtig ?

//This one needs to be available on our OAuth client backend.
		//Please contact us to register for an identifier: https://www.symcon.de/kontakt/#OAuth
		private $oauthIdentifer = "google_nest";

Genau, der Identifier sollte für dein Modul ja konstant sein, eine Eigenschaft wäre dafür also unpassend

@DrNiels habe ich das richtig verstanden das Du das OAUTH Testmodul als Basis für dein SPOTIFY Modul genutzt hast ?
(Das heist das das Spotify Modul nicht das externe Test Modul aufruft sondern das du die Spotify Funktionen in das Test Modul eingebaut hast)

Ganz genau so ist es

Welche User ID und welches Passwort ist hier eigentlich gemeint ?

Ich habe alle meine NEST Geräte nach Google Home transferiert.

Die Passwörter/ID`s für mein Google account sowie für das alte Nest account und mein Symcon account haben alle nicht funktioniert :frowning:

Müsste ich ein Anwendungsspezifisches Passwort generieren ?

Hinweis :
Um das OAUTH Test Modul in einem eigenen GITHUB repository zum laufen zu bekommen, ist es wichtig in das Haupt Verzeichnis auch die library.json und die libs Bibliotheken des WebHookModule und des WebOAUTHModule (beide in einen eigenen Folder libs) mit rüber zu kopieren

So, ich habe nach unserem Telefonat gerade noch einmal nachgebohrt.

Unser aktueller Google Nest OAuth läuft über die Loginadresse https://home.nest.com/login/oauth2 und die Token-Adresse https://api.home.nest.com/oauth2/access_token.

Es kann nun gut sein, dass dies nur über Legacy-Nest-Konten läuft, welche ja abgekündigt wurden und du in deinem Kontext über eine andere API für Google Home gehen möchtest. Dafür würden wir dann einen neuen OAuth für dich einrichten. Dafür bräuchten wir eine Adresse, wo wir den OAuth als Entwickler für dich registrieren können, dann machen wir das auch gerne.

OK dann versuchen wir das doch einmal. Mir ist unklar welche Adresse Du meinst. Ich habe bei


ein Projekt angelegt und kann https://developers.google.com/nest/device-access/authorize mittlerweile Token generieren und erneuern.

Ich habe dazu bei Google Cloud ein OAUTH angelegt mit meinem ips magic link und eine weiter mit google für die Spielwiese. Bei Bedarf kann ich weitere URI angeben

Was genau braucht Ihr von mir ?

Vorweg entschuldigung für die lange Reaktionszeit. Ich habe den Beitrag wohl übersehen…

Wir würden die existierende google_nest ClientID auf die „neue“ Schnittstelle anpassen. Die „alte“ Schnittstelle wurde eigentlich gar nicht verwendet, ist aber weiterhin als google_nest_legacy verfügbar.

Dann müsstest du bei dir als Redirect URL https://oauth.ipmagic.de/forward/google_nest eintragen. Damit wir das fertig machen, bräuchten wir von dir die Client ID und das Client Secret, das hattest du (verständlicherweise) im Screenshot ja geschwärzt. Schick mir die am besten per PM, dann mache ich das fertig.

OK die Infos habe ich per PM verschickt und die gewünschte URI bei Google eingetragen

Mal gespannt :slight_smile:

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 :slight_smile: und falls nicht Dr. Niels ?

Kurzer Zwischenstand (Details poste ich später)

Ich habe die Events mittlerweile richtig bei Google konfiguriert und das ganze erfolgreich in Symcon zum laufen gebracht.

Nach zwei Tagen rumprobieren verfüge ich nunmehr auch über die korrekte Curl configuration um mit JSON Video und Image Links von meinen Kameras eventbasierend zu erhalten.

Google beschreibt die Handhabung der Events hier : https://developers.google.com/nest/device-access/api/events#created

Events müssen im Google Projekt aktiviert werden, danach erfolgt die subscription : https://developers.google.com/nest/device-access/subscribe-to-events#enable_events

Es gibt zwei Arten von Events, bei PULL löst eine Abfrage an die SDM API einen Event aus und bei PUSH generiert ein externes Ereignis wie z.B. bei Kameras eine Bewegung, ein Ton oder die Erkennung einer Person den Event.

Um in Symcon events zu nutzen muss man ein Script (details später) und einen Webhook anlegen. Google wird die URL des Webhooks aufrufen und dadurch das Script aufrufen und die Event Daten zur Auswertung übergeben.

Ich habe mich ich für PUSH entschieden. Am einfachsten ist es die Code Beispiele (Quickstart Guide Nr. 4 Subscribe to Events) angereichert mit den eignen Informationen zu kopieren, im Dashboard die Terminal Funktion zu aktivieren (Falls sich das Terminal Fenster nicht automatisch öffnet den Button oben rechts neben dem Fragezeichen an clicken ) und den zuvor kopierten Code in das Terminal einfügen. Das Terminal versteht curl, dass hat mir eine Menge Arbeit gespart und da die Befehle nur einmalig beim anlegen benötigt werden kann man sich m.e. ein script sparen.

Das Ergebnis kann man sich hier anschauen : https://console.cloud.google.com/cloudpubsub/subscription

Als Endpoint habe ich meine Webhook adresse in Verbindung mit meiner ipmagic Adresse eingegeben. Was mich lange aufgehalten hat war die Verbindung der Google Event Steuerung (die nennen das Pub/Sub) mit meinem Projekt. Wie in der Dokumentation beschrieben befindet sich die entsprechende Adresse auf der Projektseite unter Projekt Info neben Pub/Sub topic. Es ist letztlich die Kombination von projects/sdm-prod/topics/enterprise- mit der Projekt ID. Dieser Link wird beim anlegen der Subscription unter Topic Name eingegeben. Der subscription name kann beliebig gewählt werden. Alle anderen Parameter können nach bedarf ausgewählt werden.

Wie zuvor beschrieben ruft ein Event eines NEST Gerätes das script auf das im entsprechenden Webhook verlinkt wurde.

In meinem System legt dieses Script alle Eventnachrichten als serialisiertes Array in einer String Variablen ab.
Es ist wichtig das alles Event Nachrichten gegenüber Google quittiert (

http_response_code(200);

) werden da Google ansonsten ständig (bis zu 3 Tagen) die alten events wieder schickt.

Hier ist das Script

<?php
//IPS_LogMessage('NEST','Start script');
if($_IPS['SENDER'] == 'WebHook')
{

    //IPS_LogMessage('NEST',$_SERVER['HOOK']);
    if($_SERVER['REQUEST_METHOD'] == 'GET')
    {
            //IPS_LogMessage('NEST','A '.$_GET);
    }
    elseif($_SERVER['REQUEST_METHOD'] == 'POST')
    {
            //IPS_LogMessage('NEST','B ');           
            $jsonRequest    = file_get_contents("php://input");
            http_response_code(200);
            header('Connection: close');
            //IPS_LogMessage('NEST',$jsonRequest);
            SetValueString(31877,$jsonRequest);


            $message = json_decode($jsonRequest);

            $array = json_decode(json_encode($message), true);

            SetValueString(25093,base64_decode ( $array['message']['data'] ));
    }
    else
    {
            IPS_LogMessage('NEST','Unkonwn Protokoll');
    }

}
else
{


}

In dem folgenden Beispiel wird das Script bei jedem neuen Event (Im Beispiel zuvor wurden die Events in der variable message abgelegt, das script reagiert auf jede Veränderung der variable) aufgerufen. Unterhalb des Scripts liegen die Media Dateien der Cameras. Die Namen der Media Dateien entsprechen den Namen und dem Ort der Kameras.

Das folgende Hilfsscript muss nach dem hinzufügen neuer NEST Geräte einmal durchlaufen und speichert ein serialisiertes Array mit der Device ID als Index und dem Gerätenamen verbunden mit dem Raum als Wert :

Array
(
    [AVPHwEua2F3Uzf.........] => THERMOSTAT.Dining Room
    [AVPHwEuDXzj............] => DISPLAY.Living Room
    [AVPHwEvs5z.............] => DISPLAY.Sitting Room
    [AVPHwEv4tidn...........] => CAMERA.City
    [AVPHwEs29e.............] => DOORBELL.Outside
    [AVPHwEv................] => CAMERA.Pool
)
<?php

$project_id = GetValueString(30352);
$access_token = GetValueString(51237);


$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);
foreach($array['devices'] as $key => $value)
{
      
    $device_list[explode ( '/' , $value['name'])[3]]= explode ( '.' , $value['type'])[3].'.'.$value['parentRelations'][0]['displayName'];

}
SetValueString(12867,serialize( $device_list));
print_r($device_list);

Durch die Ergebnisse dieses Scripts können jetzt über die Device ID alle ankommenden Event Nachrichten meiner Kameras identifiziert und wie im folgenden Script verarbeitet werden. Der Ablauf ist wie folgt. Eine Kamera erkennt einen Event, ein Ereignis wird ausgelöst, Google ruft den Webhook auf, das assoziierte script empfängt die Nachricht und legt diese in der message variablen ab. Die Veränderung der variablen startet das folgende Script. Im script wird nachgeschaut ob ein „resoureupdate“ (nur hier werden events gemeldet) stattgefunden hat und ob das event jünger als 30 Sekunden ist (Google erlaubt nur Auswertungen von events die nicht älter als 30 Sekunden sind). Danach wird geprüft on es sich um einen event handelt. Anschließend wird an Google eine Nachricht geschickt um die URL des Bildes abzufragen. Nach dem Empfang der URL wird in einer weiteren Abfrage das Bild in der der Kamera zugeordneten (Name der Datei ist identisch mit dem Namen der Kamera s.o.) Media Datei abgespeichert.

<?php

$project_id = GetValueString(30352);
$device_ids_and_names = unserialize(GetValueString(12867));
$data = json_decode(GetValueString(25093));
$array = json_decode(json_encode($data), true);
$access_token = GetValueString(51237);

$eventage = time() - strtotime ($array['timestamp']);
//echo $eventage;
if(
    (array_keys($array)[2] =='resourceUpdate')
    and
    ($eventage < 30)
  )
{ 
    if(array_keys($array['resourceUpdate'])[1] =='events')
    {       
        $event_type = array_keys($array['resourceUpdate']['events'])[0];
        $event_id =   $array['resourceUpdate']['events'][$event_type]['eventId'];
        $device_id = explode ( '/' , $array['resourceUpdate']['name'])[3];
        $device_name = $device_ids_and_names[$device_id];

        $sub ['eventId'] = $event_id;
        $PostData_array = array('command' => "sdm.devices.commands.CameraEventImage.GenerateImage" ,
                        'params' => $sub               
                        );
 
        $PostData = json_encode ($PostData_array);
        $url = 'https://smartdevicemanagement.googleapis.com/v1/enterprises/'.$project_id.'/devices/'.$device_id.':executeCommand'; 
        $time_stamp = $array['timestamp'];
        $unix_time = strtotime ($time_stamp);
        $elapsed_time = time() - $unix_time;

        $curl_handle=curl_init();
        $headers = array(
            "POST  HTTP/1.0",
            "Content-type: application/json",
            "Accept: application/json",
            "Content-length: ".strlen($PostData),
            "Authorization:  Bearer ".$access_token
        );
        curl_setopt($curl_handle, CURLOPT_HTTPHEADER, $headers);
        curl_setopt($curl_handle, CURLOPT_POST, true);
        curl_setopt($curl_handle, CURLOPT_POSTFIELDS, $PostData);
        curl_setopt($curl_handle, CURLOPT_URL,$url);
        curl_setopt($curl_handle, CURLOPT_RETURNTRANSFER, true);  
        $fileContent = curl_exec($curl_handle);
        curl_close($curl_handle);

        $url = json_decode ($fileContent);
        $url_array = json_decode(json_encode($url), true);
        $url_image = $url_array['results']['url'].'?width=1280';
        $url_token = $url_array['results']['token'];

        $curl_handle=curl_init();
        curl_setopt($curl_handle, CURLOPT_URL,$url_image);
        curl_setopt($curl_handle, CURLOPT_RETURNTRANSFER, true);  
        curl_setopt($curl_handle, CURLOPT_HTTPHEADER, array('Authorization: Basic '.$url_token ));
        $fileContent = curl_exec($curl_handle);
        $info = curl_getinfo($curl_handle);
        curl_close($curl_handle);

        $expiery_date = 30 - $eventage;
        $token_time_left = 30 - $eventage ;
/*
        echo "
".$device_name."
".'Device  ID : '.$device_id."
".'Event Type : '.$event_type."
".'Event ID : '.
        $event_id."
"."
".'Access Token '.$access_token."
"."
"."
".$PostData."
"."
".'Elapsed Time : '.
        $elapsed_time." seconds 
"."
".'Token expires in '.$token_time_left." seconds 
"."
";
*/
        if(IPS_GetObjectIDByName($device_name,15647))
        { 
          IPS_SetMediaContent (IPS_GetObjectIDByName($device_name,15647),base64_encode($fileContent));
        }
    }
    elseif(array_keys($array['resourceUpdate'])[1] =='traits')
    { 


    }
    else
    {

    }
}



Guten Morgen,
Ich bin auf der Suche nach einer Möglichkeit die Nest Rauchwarnmelder in IPS zu integrieren auf dieses Thema gestoßen. Das heißt du testest noch? Hast du ggf auch schon einen Rauchmelder?

Gruß oekomat

Die Rauchmelder sind noch nicht in der Google API vorhanden

https://developers.google.com/nest/device-access/traits