Gardena/Husqvarna Smart Sileno Mähroboter einbinden

Hier das neue sollte funktionieren

<?php

// -----------------------------------------------------------------------------
class gardena_gateway
{
    var $user_id, $token, $locations;
    var $devices = array();

    const LOGINURL        = "https://sg-api.dss.husqvarnagroup.net/sg-1/sessions";
    const LOCATIONSURL    = "https://sg-api.dss.husqvarnagroup.net/sg-1/locations/?user_id=";
    const DEVICESURL    = "https://sg-api.dss.husqvarnagroup.net/sg-1/devices?locationId=";
    const CMDURL        = "https://sg-api.dss.husqvarnagroup.net/sg-1/devices/|DEVICEID|/abilities/Gateway/command?locationId=";
// -----------------------------------------------------------------------------
    // Gateway
    const CATEGORY_DEVICE_INFO        = "device_info";
    const CATEGORY_GATEWAY            = "gateway";
// -----------------------------------------------------------------------------
    function gardena_gateway($user, $pw)
    {
        $data = array(
            "sessions" => array(
                "email" => "$user", "password" => "$pw")
            );
        $data_string = json_encode($data);
        $ch = curl_init(self::LOGINURL);
        curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
        curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_HTTPHEADER, array(
            'Content-Type:application/json',
            'Content-Length: ' . strlen($data_string))
        );
        $result = curl_exec($ch);
        $data = json_decode($result);
        $this -> token = $data -> sessions -> token;
        $this -> user_id = $data -> sessions -> user_id;
        $this -> loadLocations();
        $this -> loadDevices();
    }
// -----------------------------------------------------------------------------
    function loadLocations()
    {
        $url = self::LOCATIONSURL . $this -> user_id;
        $ch = curl_init($url);
        curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "GET");
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_HTTPHEADER, array(
            'Content-Type:application/json',
            'X-Session:' . $this -> token)
        );
        $this -> locations = json_decode(curl_exec($ch)) -> locations;  
    }
// -----------------------------------------------------------------------------
    function loadDevices()
    {
        foreach($this->locations as $location)
        {
            $url = self::DEVICESURL . $location -> id;
            $ch = curl_init($url);
            curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "GET");
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
            curl_setopt($ch, CURLOPT_HTTPHEADER, array(
                'Content-Type:application/json',
                'X-Session:' . $this -> token)
            );
            $this -> devices[$location -> id] = json_decode(curl_exec($ch)) -> devices;
        }
    }
// -----------------------------------------------------------------------------
    /*
    * Finds the first occurrence of a certain category type.
    * Example: You want to find your only mower, having one or more gardens. 
    * @param constant $category
    */
    function getFirstDeviceOfCategory($category)
    {
        foreach($this -> devices as $locationId => $devices)
        {
            foreach($devices as $device)
                if ($device -> category == $category)
                    return $device;
        }
    }
// -----------------------------------------------------------------------------
    function getDeviceLocation($device)
    {
        foreach($this -> locations as $location)
            foreach($location -> devices as $d)
                if ($d == $device -> id)
                    return $location;
    }
// -----------------------------------------------------------------------------
    function getInfo($device, $category_name, $proberty_name)
    {
        foreach ($device -> abilities as $ability)
            if ($ability -> name == $category_name)
                foreach($ability -> properties as $property)
                    if ($property -> name == $proberty_name)
                        return $property -> value;
    }

}

?>

Und noch ein kleines Script da seht ihr alle Daten die da ankommen.
Hilft euch vlt. weiter.

<?php

    error_reporting(E_ALL);
    include("pass.ips.php");
    include("php_gardena_mover_class.ips.php");

    $gardena = new gardena($pw_user_maeher, $pw_pawo_maeher);
    $mower = $gardena -> getFirstDeviceOfCategory($gardena::CATEGORY_MOWER);

    print_r($gardena);

//    print_r($mower);

?>

Hallo WiBo,

Gateway konnte nun erfolgreich eingebunden werden. Danke.

Das zweite Script war sehr hilfreich. Bastel gerade an der Class für den Feuchtigkeitssensor mit dem dazugehörigen Ausleseskript. Bis zur Batterie ist es schon fertig. Hoffe, ich kann es heute noch abschließen und dann posten.

Bei den Regnern werde ich sicher noch Hilfe benötigen.

Gruß

Jimmy

Also irgendwie komme ich mit den Klassen net zurecht … bei mir läuft immer noch net … immer noch dieselben Meldungen … ich glaube ich brauch mal eine 1000seitige Anleitung … Grüsse, MaLu

Moin,

Feuchtigkeitssensor ist fertig. Hier die Klasse und das Script nach „unser“ Lesart.

Klasse: php_gardena_senor_class.ips.php

<?php

// -----------------------------------------------------------------------------
class gardena_sensor
{
    var $user_id, $token, $locations;
    var $devices = array();

    const LOGINURL        = "https://sg-api.dss.husqvarnagroup.net/sg-1/sessions";
    const LOCATIONSURL    = "https://sg-api.dss.husqvarnagroup.net/sg-1/locations/?user_id=";
    const DEVICESURL    = "https://sg-api.dss.husqvarnagroup.net/sg-1/devices?locationId=";
    const CMDURL        = "https://sg-api.dss.husqvarnagroup.net/sg-1/devices/|DEVICEID|/abilities/sensor/command?locationId=";
//-----------------------------------------------------------------------------
    // Sensor
    const CATEGORY_DEVICE_INFO         = "device_info";
    const CATEGORY_SENSOR              = "sensor";
    // Sensor Batterie
    const CATEGORY_BATTERY             = "battery";
    // Sensor Radio - Funksignal
    const CATEGORY_RADIO               = "radio";
    // Sensor Temperatur
    const CATEGORY_AMBIENT_TEMPERATURE = "ambient_temperature";
    // Sensor Boden_Temperatur
    const CATEGORY_SOIL_TEMPERATURE = "soil_temperature";
    // Sensor Luftfeuchtigkeit
    const CATEGORY_HUMIDITY= "humidity";
    // Sensor Helligkeit
    const CATEGORY_LIGHT= "light";

//-----------------------------------------------------------------------------
    function gardena_sensor($user, $pw)
    {
        $data = array(
            "sessions" => array(
                "email" => "$user", "password" => "$pw")
            );
        $data_string = json_encode($data);
        $ch = curl_init(self::LOGINURL);
        curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
        curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_HTTPHEADER, array(
            'Content-Type:application/json',
            'Content-Length: ' . strlen($data_string))
        );
        $result = curl_exec($ch);
        $data = json_decode($result);
        $this -> token = $data -> sessions -> token;
        $this -> user_id = $data -> sessions -> user_id;
        $this -> loadLocations();
        $this -> loadDevices();
    }
// -----------------------------------------------------------------------------
    function loadLocations()
    {
        $url = self::LOCATIONSURL . $this -> user_id;
        $ch = curl_init($url);
        curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "GET");
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_HTTPHEADER, array(
            'Content-Type:application/json',
            'X-Session:' . $this -> token)
        );
        $this -> locations = json_decode(curl_exec($ch)) -> locations;  
    }
// -----------------------------------------------------------------------------
    function loadDevices()
    {
        foreach($this->locations as $location)
        {
            $url = self::DEVICESURL . $location -> id;
            $ch = curl_init($url);
            curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "GET");
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
            curl_setopt($ch, CURLOPT_HTTPHEADER, array(
                'Content-Type:application/json',
                'X-Session:' . $this -> token)
            );
            $this -> devices[$location -> id] = json_decode(curl_exec($ch)) -> devices;
        }
    }
// -----------------------------------------------------------------------------
    /*
    * Finds the first occurrence of a certain category type.
    * Example: You want to find your only mower, having one or more gardens. 
    * @param constant $category
    */
    function getFirstDeviceOfCategory($category)
    {
        foreach($this -> devices as $locationId => $devices)
        {
            foreach($devices as $device)
                if ($device -> category == $category)
                    return $device;
        }
    }
// -----------------------------------------------------------------------------
    function getDeviceLocation($device)
    {
        foreach($this -> locations as $location)
            foreach($location -> devices as $d)
                if ($d == $device -> id)
                    return $location;
    }
// -----------------------------------------------------------------------------
    function getInfo($device, $category_name, $proberty_name)
    {
        foreach ($device -> abilities as $ability)
            if ($ability -> name == $category_name)
                foreach($ability -> properties as $property)
                    if ($property -> name == $proberty_name)
                        return $property -> value;
    }

}

?>

Das Auslese-Script:

<?php

    error_reporting(E_ALL);
    include("pass.ips.php");
    include("php_gardena_sensor_class.ips.php");

    $gardena = new gardena_sensor($pw_user_maeher, $pw_pawo_maeher);
    $mower = $gardena -> getFirstDeviceOfCategory($gardena::CATEGORY_SENSOR);
    $category_name = "device_info";

    $id_device_manufaktur        = 35400 /*[Home\Außenbereich\Bewässerung\Feuchtigkeitssensor\Hersteller]*/;
    $id_device_product            = 19718 /*[Home\Außenbereich\Bewässerung\Feuchtigkeitssensor\Gerät]*/;
    $id_device_serial_number    = 50877 /*[Home\Außenbereich\Bewässerung\Feuchtigkeitssensor\Seriennummer]*/;
    $id_device_version            = 42529 /*[Home\Außenbereich\Bewässerung\Feuchtigkeitssensor\Version]*/;
    $id_device_category            = 50634 /*[Home\Außenbereich\Bewässerung\Feuchtigkeitssensor\Kategorie]*/;
    $id_device_last_time_online    = 27007 /*[Home\Außenbereich\Bewässerung\Feuchtigkeitssensor\Letztes Mal online]*/;
    $id_device_sgtin            = 36826 /*[Home\Außenbereich\Bewässerung\Feuchtigkeitssensor\sgtin]*/;

    $proberty_name = "manufacturer";
    $status = $gardena -> getInfo($mower, $category_name, $proberty_name);
    SetValue($id_device_manufaktur, $status);

    $proberty_name = "product";
    $status = $gardena -> getInfo($mower, $category_name, $proberty_name);
    SetValue($id_device_product, $status);

    $proberty_name = "serial_number";
    $status = $gardena -> getInfo($mower, $category_name, $proberty_name);
    SetValue($id_device_serial_number, $status);

    $proberty_name = "version";
    $status = $gardena -> getInfo($mower, $category_name, $proberty_name);
    SetValue($id_device_version, $status);

    $proberty_name = "category";
    $status = $gardena -> getInfo($mower, $category_name, $proberty_name);
    SetValue($id_device_category, $status);

    $proberty_name = "last_time_online";
    $status = $gardena -> getInfo($mower, $category_name, $proberty_name);
    SetValue($id_device_last_time_online, $status);

    $proberty_name = "sgtin";
    $status = $gardena -> getInfo($mower, $category_name, $proberty_name);
    SetValue($id_device_sgtin, $status);

    $category_name = "battery";

    $id_device_level        = 31867 /*[Home\Außenbereich\Bewässerung\Feuchtigkeitssensor\Batterie]*/;
    $battery_status        = 17648 /*[Home\Außenbereich\Bewässerung\Feuchtigkeitssensor\Status Batterie]*/;

    $proberty_name = "level";
    $status = $gardena -> getInfo($mower, $category_name, $proberty_name);
    SetValue($id_device_level, $status);

    $proberty_name = "disposable_battery_status";
    $status = $gardena -> getInfo($mower, $category_name, $proberty_name);
    SetValue($battery_status, $status);

	 $category_name = "radio";

    $id_device_quality        = 43306 /*[Home\Außenbereich\Bewässerung\Feuchtigkeitssensor\Signalstärke]*/;
    $connection_status        = 26635 /*[Home\Außenbereich\Bewässerung\Feuchtigkeitssensor\Connection Status]*/;
	 $signal_status        		= 46304 /*[Home\Außenbereich\Bewässerung\Feuchtigkeitssensor\Empfang]*/;

    $proberty_name = "quality";
    $status = $gardena -> getInfo($mower, $category_name, $proberty_name);
    SetValue($id_device_quality, $status);

    $proberty_name = "connection_status";
    $status = $gardena -> getInfo($mower, $category_name, $proberty_name);
    SetValue($connection_status, $status);
    
    $proberty_name = "state";
    $status = $gardena -> getInfo($mower, $category_name, $proberty_name);
    SetValue($signal_status, $status);
    
    $category_name = "ambient_temperature";

    $temperature        = 45209 /*[Home\Außenbereich\Bewässerung\Feuchtigkeitssensor\Außentemperatur]*/;
    $frost_warning        = 13654 /*[Home\Außenbereich\Bewässerung\Feuchtigkeitssensor\Frostwarnung]*/;

    $proberty_name = "temperature";
    $status = $gardena -> getInfo($mower, $category_name, $proberty_name);
    SetValue($temperature, $status);

    $proberty_name = "frost_warning";
    $status = $gardena -> getInfo($mower, $category_name, $proberty_name);
    SetValue($frost_warning, $status);
    
    $category_name = "soil_temperature";

    $boden_durchschschnitts_temperature        = 52298 /*[Home\Außenbereich\Bewässerung\Feuchtigkeitssensor\Durchschnittsbodentemperatur]*/;
    
    $proberty_name = "temperature";
    $status = $gardena -> getInfo($mower, $category_name, $proberty_name);
    SetValue($boden_durchschschnitts_temperature, $status);

    $category_name = "humidity";

    $humidity        = 14252 /*[Home\Außenbereich\Bewässerung\Feuchtigkeitssensor\Bodenfeuchtigkeit]*/;

    $proberty_name = "humidity";
    $status = $gardena -> getInfo($mower, $category_name, $proberty_name);
    SetValue($humidity, $status);
    
    $category_name = "light";

    $light        = 13327 /*[Home\Außenbereich\Bewässerung\Feuchtigkeitssensor\Helligkeit]*/;

    $proberty_name = "light";
    $status = $gardena -> getInfo($mower, $category_name, $proberty_name);
    SetValue($light, $status);
?>

Sieht dann so aus:

Gruß

Jimmy

Prima, den Rest bekommen wir auch hin.
Da ja bei dem Regner sicher nur gesendet wird ist die function sendCommand($device, $command) das Schlüsselwort
und das Aktionsscript für den Mover

@MaLu wo liegt dein Problem

Hallo Ihr Beiden,

ich habe nun mal das von Jimmy verwendet … bekomme das zurück (wie bei allen anderen Versuchen)

Notice: Trying to get property of non-object in C:\IP-Symcon\scripts\php_gardena_sensor_class.ips.php on line 48

Line 48:

$this -> token = $data -> sessions -> token;

Sieht so aus als würde kein Token zurückkommen …

Grüsse,
MaLu

Was für ein Gerät hast Du im Einsatz

Hallo,

das Set aus Gateway, Sensor und Bewässerungscomputer.

Grüsse,
MaLu

Hey,

So, nu habe ich mal die API in meiner externen Automatisierungssoftware verwurstet - was soll ich sagen … ich bekomme die Daten von der Webseite zurück … alle Schritte funktionieren Tokenerstellung, Location ID, User ID und holen der Daten … also ich speichere es einfach was zurückkommt als Datei ab … Grundsätzlich sollte das dann auch mit Euren Skripten gehen … das ist ja nur Cut and Paste … Nachdem es ja hier grundsätzlich geht … Eine Idee warum ich in IPS scheitere?

Danke und Grüsse,
MaLu

was haste denn bis jetzt in IPS mit den Scripten gemacht?

was meinst Du damit? Ich verwende meine externe Software autark - eigene Sprache und Funktionen für die API - die Skripte von Dir und Jimmy habe ich so eingebunden wie beschrieben - also in IPS eingebunden - … Grüsse, MaLu

Wozu brauchst du eigentlich eine autarke Software dafür? Mit den Skripten läuft das doch komplett in IPS.

Gruß

Jimmy

@all: Habt ihr eigentlich externe Antennen am Gateway? Wenn ja, welche? Link?

Gruß

Jimmy

Kleiner Fehler im Sensor Auslese-Skript. Bitte gegen aktuelle Version austauschen!

Eine Variable war falsch benamst.

Gruß

Jimmy

Ich hab da von alten WLAN Routern Antenne dran.
Ob das was bringt bin ich mir nicht sicher.
WLAN funkt mit 2,4 GHz das Gatewy mit ca. 800 MHz somit passen die Antennen nicht richtig.
Da unser Grundstück nur ca. 20 x 30 meter gibt es da auch ohne Antennen kein Problem.

Kann sowieso erst nächste Woche testen bzw. einbinden da Sensor noch nicht da ist.

@JImmy - Eure Skripte laufen bei mir nicht … siehe weiter oben die Fehlermeldung … deswegen habe ich das „Daten-holen“ nun woandershinverlegt … die Daten hole ich nun über eine Datei ins IPS. (Leider - Eure Skripte haben mir ganz gut gefallen).

Fehlermeldung mit Deiner Klasse … siehe @ Post 27

Grüsse,
MaLu

Dann zeig doch mal was Du machst

Neues, zusätzliches Test, Info Script bei dem alle Daten angezeigt werden, auch wenn neues Gerät hinzukommt.

Index.php mit User und Passwort Daten füllen

Alles unter Webfront/user/husqvarna abspeichern und die index.php als externe Seite einbinden.

Die request.php kann zum steuern und abfragen unabhänig genutzt werden. (Hier gibt es kein Support)

husqvarna.zip (585 KB)