Gardena/Husqvarna Smart Sileno Mähroboter einbinden

Hi,

hier gibt es einen Ansatz die neuen Smart Robis einzubinden.

Gardena Smart System Analyse

Da ich in JSON nicht fit bin, gibt es jemand der mich unterstützen kann.

Hallo,

hab jemanden gefunden der mir eine PHP JSON CLASS schreibt.

Erste Versuche sind vielversprechend.

Hallo wibo,

darf ich mich / kann ich mich anschliessen - ich habe das Bewässerungs-System.

Danke und Grüsse,
MaLu

Hi Wibo,

bin auch Besitzer eines Gardena Smart Bewässerungssystems. Würde mich auch zum Testen anbieten.

Gruß

Jimmy

Hi ihr 2,

selbstverständlich.

Sobald es Veröffentlichsfähig ist wird es hier rein gestellt.

Hallo Ihr 2

es wird wohl noch etwas dauern.

Als Sofortmaßnahme geht

https://sg-api.dss.husqvarnagroup.net/sg-1/index/ios/

als externe Seite im Webfront einbinden.

Hi,

so zur Info vorab.

Hier hat Schaussi aus Österreich eine Class für das SmartSystem erstellt.

http://www.dxsdata.com/2016/07/php-class-for-gardena-smart-system-api/

Getestet und funkt ohne Probleme.

Mh, kommt noch was für das Bewässerungssystem :slight_smile: Grüsse, MaLu

Hi,

da ist alles drin für das gesamte Smart System.
Da ich nur den Robi habe kann ich das nicht testen.

Hol das Testsscript trage deine Daten ein.
Unter der Funktion

function loadDevices()

bekommst Du alle deine Geräte.

Dann musste leider selber weiter machen.
In der php_gardena_class.ips.php brauchste nur deine Anpassungen machen.

Sodele, hier die php_gardena_mover_class.ips.php zur Einbindung von Gardena Sileno
mit freundlicher Genehmigung von Schaussi und gerrig aus Österreich.


<?php
/*
//Ref. http://www.dxsdata.com/2016/07/php-class-for-gardena-smart-system-api/
* Ref. http://www.roboter-forum.com/showthread.php?16777-Gardena-Smart-System-Analyse
* Angepasst 03.07.2016 / WiBo
*/
// -----------------------------------------------------------------------------
class gardena
{
    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/mower/command?locationId=";

    var $CMD_MOWER_PARK_UNTIL_NEXT_TIMER        = array("name" => "park_until_next_timer");
    var $CMD_MOWER_PARK_UNTIL_FURTHER_NOTICE    = array("name" => "park_until_further_notice");
    var $CMD_MOWER_START_RESUME_SCHEDULE        = array("name" => "start_resume_schedule");
    var $CMD_MOWER_START_24HOURS                = array("name" => "start_override_timer", "parameters" => array("duration" => 1440));
    var $CMD_MOWER_START_3DAYS                    = array("name" => "start_override_timer", "parameters" => array("duration" => 4320));
// -----------------------------------------------------------------------------
    // Gateway
    const CATEGORY_DEVICE_INFO        = "device_info";
    const CATEGORY_GATEWAY            = "gateway";
    // Mover Device Info
    const CATEGORY_DEVICE            = "device_info";
    // Mover Akkuzustand
    const CATEGORY_BATTERY            = "battery";
    // Mover Radio - Funksignal
    const CATEGORY_RADIO            = "radio";
    // Mover Mäherstatus
    const CATEGORY_MOWER            = "mower";
    const PROPERTY_STATUS            = "status";
    // Mover Temperatur
    const CATEGORY_TEMPERATUR        = "internal_temperature";
// -----------------------------------------------------------------------------
    function gardena($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 sendCommand($device, $command)
    {
        $location = $this -> getDeviceLocation($device);
        $url = str_replace("|DEVICEID|", $device -> id, self::CMDURL) . $location -> id;
        $data_string = json_encode($command);
        $ch = curl_init($url);
        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',
            'X-Session:' . $this -> token,
            'Content-Length: ' . strlen($data_string)
            ));  
        $result =  curl_exec($ch);        
        if (curl_getinfo($ch, CURLINFO_HTTP_CODE) == "204") //success
            return true;
        return json_encode($result);
    }
// -----------------------------------------------------------------------------
    function getMowerState($device)
    {
        foreach ($device -> abilities as $ability)
            if ($ability -> name == self::CATEGORY_MOWER)
                foreach($ability -> properties as $property)
                    if ($property -> name == self::PROPERTY_STATUS)
                        return $property -> value;
    }
// =============================================================================
    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;
    }
// =============================================================================
    function getDeviceStatusReportFriendly($device)
    {
        $result = "";
        foreach ($device -> status_report_history as $entry)
        {
            $result .= $entry -> timestamp . " | " . $entry -> source . " | " . $entry -> message . "<br>";
        }
        return $result;
    }
// -----------------------------------------------------------------------------
}

?>

Und das Aktionsscript


<?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);

    if( $_IPS['SENDER'] == 'WebFront' OR $_IPS['SENDER'] == 'Execute' )
        {
            SetValue($_IPS['VARIABLE'], $_IPS['VALUE']);
            $switch = $_IPS['VALUE'];
            switch ($switch)
            {
            // Parken ----------------------------------------------------------
            case 1:
                $gardena -> sendCommand($mower, $gardena -> CMD_MOWER_PARK_UNTIL_FURTHER_NOTICE);
                break;
            case 2:
                $gardena -> sendCommand($mower, $gardena -> CMD_MOWER_PARK_UNTIL_NEXT_TIMER);
                break;
            // Mähen -----------------------------------------------------------
            case 3:
                $gardena -> sendCommand($mower, $gardena -> CMD_MOWER_START_RESUME_SCHEDUL);
                break;
            case 4:
                $gardena -> sendCommand($mower, $gardena -> CMD_MOWER_START_24HOURS);
                break;
            case 5:
                $gardena -> sendCommand($mower, $gardena -> CMD_MOWER_START_3DAYS);
                break;
            }
        }
?>

Und noch das Device Infoscript


<?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);
    $category_name = "device_info";

    $id_device_manufaktur        = 42594 /*[Gardena\Mover_Informationen\Mover_Device_Info\Device_Manufaktur]*/;
    $id_device_product            = 42928 /*[Gardena\Mover_Informationen\Mover_Device_Info\Device_Product]*/;
    $id_device_serial_number    = 19617 /*[Gardena\Mover_Informationen\Mover_Device_Info\Device_Serial_Nr]*/;
    $id_device_version            = 39643 /*[Gardena\Mover_Informationen\Mover_Device_Info\Device_Version]*/;
    $id_device_category            = 49323 /*[Gardena\Mover_Informationen\Mover_Device_Info\Device_Category]*/;
    $id_device_last_time_online    = 20273 /*[Gardena\Mover_Informationen\Mover_Device_Info\Device_last_Time]*/;
    $id_device_sgtin            = 29919 /*[Gardena\Mover_Informationen\Mover_Device_Info\Device_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);

?>

Batterie Info


<?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);
    $category_name = "battery";

    $id_battery_level        = 17163 /*[Gardena\Mover_Informationen\Mover_Battery\Battery_Level]*/;
    $id_battery_status        = 59588 /*[Gardena\Mover_Informationen\Mover_Battery\Battery_Status]*/;
    $id_battery_charging    = 58271 /*[Gardena\Mover_Informationen\Mover_Battery\Battery_Charging]*/;

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

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

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

?>

Und Radiolink


<?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);
    $category_name = "radio";

    $id_radio_quality    = 14998 /*[Gardena\Mover_Informationen\Mover_Radio_Link\Radio_Quality]*/;
    $id_radio_connect    = 11272 /*[Gardena\Mover_Informationen\Mover_Radio_Link\Radio_Connection_Status]*/;
    $id_radio_state        = 22371 /*[Gardena\Mover_Informationen\Mover_Radio_Link\Radio_Status]*/;

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

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

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

?>

Und Mäherstatus


<?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);
    $category_name = "mower";

    $id_mover_operation        = 57382 /*[Gardena\Mover_Informationen\Mover_Status\Mover_Manual_Operation]*/;
    $id_mover_status        = 28614 /*[Gardena\Mover_Informationen\Mover_Status\Mover_Status]*/;
    $id_mover_fornextstart    = 13488 /*[Gardena\Mover_Informationen\Mover_Status\Mover_Source_for_Next_Start]*/;
    $id_mover_timenextstart    = 21688 /*[Gardena\Mover_Informationen\Mover_Status\Mover_Timestamp_Next_Start]*/;
    $id_mover_endtime        = 58809 /*[Gardena\Mover_Informationen\Mover_Status\Mover_Override_End_Time]*/;

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

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

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

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

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

?>

Und noch Temperatur


<?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);
    $category_name = "internal_temperature";

    $id_mover_temperatur    = 23953 /*[Gardena\Mover_Informationen\Mover_Temperatur\Mover_Temperatur]*/;

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

?>

Und zu letzt noch das Gateway


<?php

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

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

    $id_device_manufaktur        = 20045 /*[Gardena\Gateway\Gateway_Device_Info\Device_Manufaktur]*/;
    $id_device_product            = 32537 /*[Gardena\Gateway\Gateway_Device_Info\Device_Product]*/;
    $id_device_serial_number    = 43248 /*[Gardena\Gateway\Gateway_Device_Info\Device_Serial_Nr]*/;
    $id_device_version            = 52471 /*[Gardena\Gateway\Gateway_Device_Info\Device_Version]*/;
    $id_device_category            = 48184 /*[Gardena\Gateway\Gateway_Device_Info\Device_Category]*/;
    $id_device_last_time_online    = 33067 /*[Gardena\Gateway\Gateway_Device_Info\Device_last_Time]*/;
    $id_device_sgtin            = 12633 /*[Gardena\Gateway\Gateway_Device_Info\Device_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 = "gateway";

    $id_device_ipdresse        = 38565 /*[Gardena\Gateway\Gateway_Device_Info\IP_Adresse]*/;
    $id_device_timezone        = 32377 /*[Gardena\Gateway\Gateway_Device_Info\Time_Zone]*/;

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

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

?>

Und dann noch einige bildchen

Hallo WiBo,

zunächst mal herzlichen Dank für die Skripte.

Hier mal ne blöde Frage, vielleicht hab ich das auch übersehen, wo kommt der Benutzername und das Passwort rein?

Ich muss ja meine Devices irgendwie auslesen können. Hab ja keinen Tower sondern die Bewässerung.

Gruß

Jimmy

Edit: Jetzt sehe ich, die Daten stehen bei dir in der pass.ips.php. Wie muss die aufgebaut sein? Hast du mal ein Beispiel?

Und wo ist das Script für „php_gardena_gateway_class.ips.php“?

include(„pass.ips.php“); —>>> da stehen nur die 2 Zeilen drin.

[COLOR=#000000][COLOR=#0000BB]$pw_user_maeher = „EMail oder User Name“;
$pw_pawo_maeher = „Hier Passwort“;

[/COLOR]$gardena = new gardena($pw_user_maeher, $pw_pawo_maeher);

[/COLOR]die php_gardena_gateway_class.ips.php ist die gleiche wie die php_gardena_mover_class.ips.php
musst nur die Constante gegen GATEWAY tauschen

const CMDURL = „https://sg-api.dss.husqvarnagroup.net/sg-1/devices/|DEVICEID|/abilities/gateway/command?locationId=“;
und kannst alles entfernen was zum senden gebraucht wird da Du nur die Daten lesen kannst.

Hallo WiBo,

danke für die Infos. Skripte sind angepasst. Wenn ich nun jedoch das Gateway-Skript starte, kommt folgender Fehler:


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

Warning:  Invalid argument supplied for foreach() in C:\IP-Symcon\scripts\php_gardena_gateway_class.ips.php on line 145

Hier die Class dazu:

<?php
/*
//Ref. http://www.dxsdata.com/2016/07/php-class-for-gardena-smart-system-api/
* Ref. http://www.roboter-forum.com/showthread.php?16777-Gardena-Smart-System-Analyse
* Angepasst 03.07.2016 / WiBo
*/
// -----------------------------------------------------------------------------
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=";

    var $CMD_MOWER_PARK_UNTIL_NEXT_TIMER        = array("name" => "park_until_next_timer");
    var $CMD_MOWER_PARK_UNTIL_FURTHER_NOTICE    = array("name" => "park_until_further_notice");
    var $CMD_MOWER_START_RESUME_SCHEDULE        = array("name" => "start_resume_schedule");
    var $CMD_MOWER_START_24HOURS                = array("name" => "start_override_timer", "parameters" => array("duration" => 1440));
    var $CMD_MOWER_START_3DAYS                    = array("name" => "start_override_timer", "parameters" => array("duration" => 4320));
// -----------------------------------------------------------------------------
    // Gateway
    const CATEGORY_DEVICE_INFO        = "device_info";
    const CATEGORY_GATEWAY            = "gateway";
    // Mover Device Info
    const CATEGORY_DEVICE            = "device_info";
    // Mover Akkuzustand
    const CATEGORY_BATTERY            = "battery";
    // Mover Radio - Funksignal
    const CATEGORY_RADIO            = "radio";
    // Mover Mäherstatus
    const CATEGORY_MOWER            = "mower";
    const PROPERTY_STATUS            = "status";
    // Mover Temperatur
    const CATEGORY_TEMPERATUR        = "internal_temperature";
// -----------------------------------------------------------------------------
    function gardena($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 sendCommand($device, $command)
    {
        $location = $this -> getDeviceLocation($device);
        $url = str_replace("|DEVICEID|", $device -> id, self::CMDURL) . $location -> id;
        $data_string = json_encode($command);
        $ch = curl_init($url);
        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',
            'X-Session:' . $this -> token,
            'Content-Length: ' . strlen($data_string)
            ));  
        $result =  curl_exec($ch);        
        if (curl_getinfo($ch, CURLINFO_HTTP_CODE) == "204") //success
            return true;
        return json_encode($result);
    }
// -----------------------------------------------------------------------------
    function getMowerState($device)
    {
        foreach ($device -> abilities as $ability)
            if ($ability -> name == self::CATEGORY_MOWER)
                foreach($ability -> properties as $property)
                    if ($property -> name == self::PROPERTY_STATUS)
                        return $property -> value;
    }
// =============================================================================
    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;
    }
// =============================================================================
    function getDeviceStatusReportFriendly($device)
    {
        $result = "";
        foreach ($device -> status_report_history as $entry)
        {
            $result .= $entry -> timestamp . " | " . $entry -> source . " | " . $entry -> message . "<br>";
        }
        return $result;
    }
// -----------------------------------------------------------------------------
}

?>

Wie bekomme ich eigentlich raus, wie die Category meiner Regner und des Feuchtesensors heissen und deren Variablen?

Eine Alternative wäre auch, ich stelle euch einen „Test-Account“ zur Verfügung und ihr könnt dann das Gardena-Rundum-Sorglos-Paket bauen.

Gruß

Jimmy

hier mein Gateway Script

gelöscht war Fehler drin / WiBo ( unten Neu )

den Feuchtefühler hab ich mir bestellt werde den dann einbinden und noch ein
Auslesescript für die Devices erstellen.

Oder Du gibst mir für 1-2 Tage einen Zugang
Hab nur die nächsten Tage keine Zeit. Sag Dir dann bescheid.

Huhu, ich verfolge hier das ganze und krieg net mal das Gateway ans Laufen … :confused: Grüsse, MaLu

Ah, gleicher Fehler wie bei Jimmy … dann bin ich beruhigt … liegt net an mir :slight_smile:

guckste drüber

Nur so zur Info

Das Gateway Script wird für die Mover Steuerung nicht benötigt.

Dient nur zur Info über die Gateway Daten

:slight_smile: Meinste Dein Gateway Script benutzen? - :slight_smile: oder das Du den Sensor einbindest?

Ja, Danke aber ich bekomme ja schon keine Daten für das Gateway … wenn das net geht … brauch ich ja gar nicht dahinter zu fummeln

Hallo WiBo,

hast PN wegen Test.

Gruß

Jimmy