Gardena/Husqvarna Smart Sileno Mähroboter einbinden

Oh… nein, bitte nicht.

Also ich „erahne“ mal, dass deine PHP-Kenntnisse relativ jung sind, dementsprechen versuche ich es dir ein klein wenig detaillierter zu erkären:

Zuerst: Sleep: NUR für ganz kurze Pausen, sobald die Ausführung des Scripts die maximale Laufzeit erreicht wird es abgebrochen, was du da vor hast geht nicht.
Dafür wird ein Timer verwendet, zeige ich dir dann weiter unten.

Nächster Punkt: Wer soll denn das Script überhaupt aufrufen? Das läuft ja nicht von alleine… wenn das ein Event macht, dann erspar dir die Unterscheidung im Script, das macht es für dich selber verständlicher, zumindest am Anfang.

So, jetzt in kurzen Worten, aber Schritt-für-Schritt wie du das machst (ausm Kopf, verhafte mich nicht gleich drauf):

  1. Ereignis erstellen -> Auslöser: Regen-Variable (45066) -> bei bestimmten Wert „true“ -> ausgelöst wird Script 1
  2. Script 1 erstellen, Inhalt in etwa:

GAR_AktionAusfuehren(56874,1); // da muss die Instance rein und der Wert aus dem Variablen-Profil, also 1 für parken bis auf weiteres

  1. Ereignis erstellen → Auslöser: Regen-Variable (45066) → bei bestimmten Wert „false“ → ausgelöst wird Script 2
  2. Script 2 erstellen, Inhalt in etwa:

if ($_IPS['SENDER'] == "TimerEvent")
	{
	

		// Timer ausschalten

		IPS_SetScriptTimer($_IPS['SELF'], 0);
		// Aktion ausführen
              GAR_AktionAusfuehren(56874,3); 	// Start/Wiederaufnahme Timer
			

	}

else  {
              // Ziehe einen Timer auf dich selber für 180 Minuten (3 Stunden) auf
	IPS_SetScriptTimer($_IPS['SELF'], 180*60); // 180 Minuten *60 macht es leichter zu lesen als 10800
		// wenn der Timer abgelaufen ist ruft sich das Script selber auf und kommt nicht in diesen else-Zweig 
                // sondern oben in den IF-Zweig
	   }


Damit sollte dein Problem eigentlich gelöst sein

Hallo Hagbard235,

der Fehler lag bei mir. Jetzt funktioniert alles :). Danke.

Gruß Philipp

Hallo Zusammen,

nachdem ich meinen Mäher mit dem Gardena Update versehen habe mäht er leider nur ca. 20min. und fährt dann wieder zurück zum Laden. Habe an der Programmierung seit letztem Jahr nichts geändert. In der Gardena App wird kurz nach dem Start immer die Zeit angezeigt, wann er wieder zurückfahrt. Darauf habe ich keinen Einfluss. Ich habe in der App nur einen Zeitplan, immer Montags von 06:00 - 06:01 Uhr.

Ich starte den Mäher mit:

GAR_AktionAusfuehren(16361,4);

Hat Gardena etwas geändert? Hat jemand anders das gleiche Problem?

Gruß, Michael

Option 4 wäre 24 Stunden mähen… aber wenn er nach 20 Minuten wieder zurück fährt würde ich auf den Akku-Stand schielen… er fährt ja bei Restenergie ~40% wieder zurück… ist vielleicht der Akku hinüber?

Hallo,

danke für den Tipp mit dem Akku. War bei mir aber nicht das Problem. Er ist immer bei ca. 80% zurück gefahren.

Ich habe die Programierung wie folgt geändert. So geht es wieder.

GAR_AktionAusfuehren(16361,5); 

Grüße vom Bodensee, Michael

Option 5 ist „Start für 3 Tage“ und unterscheidet sich nur in der Anzahl Minuten die übergeben werden… ich glaube nicht das es daran lag.

Vielleicht löst es das Problem noch nicht. Es funktioniert aber wieder. Der Robi mäht bis ca.45% Batteriekapazität.

Woran könnte es sonst noch liegen?

Hallo Zusammen,

ich habe mir jetzt auch das Gateway und Feuchtesensor von Gardena zugelegt. Hat noch jemand die Klasse: php_gardena_senor_class.ips.php aktualisiert am laufen?

Bekomme die Klasse von Seite 3 Post #25 irgendwie nicht zum laufen.
Wäre dankbar für Unterstützung. Ich habe selbst noch keine Klasse erstellt und bin jetzt etwas überfordert.
Vielleicht kann mir auch jemand auf die Sprünge helfen, was ich in dem Script ändern muss.

Vielen Dank

VG Alex

Kann mir vielleicht jemand weiterhelfen?

Aktuell habe ich drei Schripte:

Script 1: pass

$user = "meine Mail Adresse";
$pw = "Mein Passwort";

Script 2 ist die Abfrage:

<?php

    error_reporting(E_ALL);
    include IPS_GetKernelDir()."scripts\\59757.ips.php";
    include IPS_GetKernelDir()."scripts\\45657.ips.php";

    $gardena = new gardena_sensor($user, $pw);
	$mower = $gardena -> getFirstDeviceOfCategory($gardena::CATEGORY_SENSOR);

    print_r($gardena);

und Script 3 ist die Class: „php_gardena_senor_class“

<?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_sensorauslesen($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;
    }

}

?>

Wenn ich die Abfrage starte bekomme ich folgende Ausgabe:

gardena_sensor Object ( [user_id] => [token] => [locations] => [devices] => Array ( ) )

Kann mir jemand helfen, wo mein Fehler liegt?

VG Alex

Update: Fehler gefunden.
Ich habe in der Klasse folgende Zeile geändert und schon kamen die Daten:

function gardena_sensorauslesen($user, $pw)

in

function __construct($user, $pw)

Hallo Zusammen,

ich habe 2 Feuchtesensoren. Wie kann ich denn den Status des zweiten Sensors abfragen?
Im Script von WiBo wird ja immer nur der erste abgefragt.

<?php
    error_reporting(E_ALL);
    require_once(IPS_GetKernelDir()."scripts".DIRECTORY_SEPARATOR.IPS_GetScriptFile(59757 ));
    require_once(IPS_GetKernelDir()."scripts".DIRECTORY_SEPARATOR.IPS_GetScriptFile(45657    ));

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

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

    echo $status;

Kann mir jemand hier weiterhelfen?

VG Alex

Das Script das ich damals übernommen habe kann pro Klasse nur ein Gerät und ich habe noch nicht die Zeit gefunden das zu ändern.

Ok, schade.
Liegt es an der Klasse oder am Script?

So, hab’s geschafft.
Falls es jemand braucht.

In der gardena_sensor_class habe ich zwei Constanten und eine Funktion hinzugefügt (Die Funktion getFirstDeviceOfCategory etwas abgewandelt).
In den Konstanten sind die Namen der Sensoren enthalten.

const NAME_SENSOR_01 = "Hecke";
const NAME_SENSOR_02 = "Rasen";

und die Funktion

function getFirstDeviceOfCategory2($category)
    {
    foreach($this -> devices as $locationId => $devices)
        {
        foreach($devices as $device)
            if ($device -> name == $category)
                return $device;
        }
    }

Die Abfrage erfolgt über:


    $sensor1 = $gardena -> getFirstDeviceOfCategory2($gardena::NAME_SENSOR_01 );
    $sensor2 = $gardena -> getFirstDeviceOfCategory2($gardena::NAME_SENSOR_02 );

    $category_name = "device_info";
    $proberty_name = "serial_number";
    //Sensor 1
    $status = $gardena -> getInfo($sensor1, $category_name, $proberty_name);
    SetValue($sen1), $status);
    // Sensor 2    
    $status = $gardena -> getInfo($sensor2, $category_name, $proberty_name);
    SetValue($sen2), $status);

Danke 59Hagbard235 für die super vorarbeit.

VG Alex

Hallo Zusammen,

ich verzweifel gerade daran die Bewässerungsregler von Gardena einzubinden.
Ich hatte mit der SensorClaas von Jimmy angefangen. Integration funktionierte schnell.
Die Ergänzung von Alexandro, damit ich beide Sensoren abfragen kann, war perfekt.

Leider habe ich mit der Steuerung der Bewässerungscomputer nicht so viel erfolg.
Beiße mir jetzt schon das 2. Wochenende die Zähne aus.

Ursprünglich wollte ich die Regler per Ifttt ansteuern, was manuell auch klappt nur trennt ifttt inzwischen jede Tag die Verbindung.
Ich bekomme imer wieder die email:
„Action required: GARDENA smart system is offline
We still can’t connect to your GARDENA smart system.
Have you updated your password recently, or made some other changes? It could also be because somewhere, somehow, an engineer has been working tirelessly on improvements to the service.“

Ich kann die Verbindung zwar wieder herstellen aber nach ungefähr einem Tag geht der Spaß von vorne los.
Leider nicht sehr zuverlässig.

Daher lieber direkt, leider komme ich nicht wirklich weiter.
Ich fing mit den Skripten von Wibo an, leider kein erfolg.
Das Auslesen Regler wie Seriennummer oder Batteriestatus funktioniert, nur das versenden von befehlen nicht.
Auch das Einfleißen der von anderen Quellen GitHub - DXSdata/Gardena: Tools to access Gardena Smart API oder Gardena Smart System Analyse - Gardena - Roboter-Forum.com
brachte mich nicht weiter.

Interessant das ich beim beim Debugger von chrome ganz andere befehle zum senden ausgelesen habe
{name: „watering_timer_1“, value: {state: „manual“, duration: 60, valve_id: 1}}
Ich hatte auch versucht in allen Variation diesen Befehl in Wibos Skripte zu übertragen, leider reagieren die Regler auf nichts.

Hat jemand die Regler mit einem funktionierenden Skript am laufen, dann würde ich mich über dieses Skript sehr freuen.

Besten Dank
André