Gardena Smart System Analyse

  • Habe mich mit der Gardena Smart Sytem IOS App ein wenig beschäftigt und herausgefunden, wie die Kommunikation grundsätzlich funktioniert. Der Datenaustausch erfolgt mittels JSON.


    Die root URL ist: https://sg-api.dss.husqvarnagroup.net/sg-1
    Man kann auch unter OSX mit Safari die Applikation aufrufen: https://sg-api.dss.husqvarnagroup.net/sg-1/index/ios/


    In den Beispielen habe ich meine ID's zur Sicherheit verändert.


    1.) Login
    Man muss user/passwort and eine URL schicken und bekommt eine user_id und einen Token zurück. Die user_id ist für die jeweilige user/passwort Kombination immer gleich, der Token ändert sich immer. Ist also eine SessionId.


    URL:

    Code
    1. https://sg-api.dss.husqvarnagroup.net/sg-1/sessions


    Request Header:

    Code
    1. Content-Type:application/json


    POST Request:

    Code
    1. {
    2. "sessions": {
    3. "email": "max.mustermann@email.com",
    4. "password": "PASSWORT"
    5. }
    6. }


    Beispiel:

    Code
    1. curl --data '{"sessions":{"email":"max.mustermann@email.com","password":"PASSWORT"}}' --header "Content-Type:application/json" https://sg-api.dss.husqvarnagroup.net/sg-1/sessions


    Response:

    Code
    1. {
    2. "sessions": {
    3. "token": "7867e26c-05eb-4a60-bf30-7c3a1b4480aa",
    4. "user_id": "196ab891-a521-872c-ab1d-1685d1e77afc"
    5. }
    6. }


    Den Token muss man jetzt immer in den Folgerequests als HTTP Header 'X-Session' mitsenden.


    2.) Locations
    Für die weiteren Requests benötigt man eine locations_id, diese bekommt man mit der user_id. Die location_id ist ebenfalls für die jeweilige user/passwort Kombination immer gleich


    URL:

    Code
    1. https://sg-api.dss.husqvarnagroup.net/sg-1/locations/?user_id=196ab891-a521-872c-ab1d-1685d1e77afc


    Request Header:

    Code
    1. Content-Type:application/json
    2. X-Session: 7867e26c-05eb-4a60-bf30-7c3a1b4480aa


    Beispiel:

    Code
    1. curl --header "Content-Type:application/json" --header "X-Session:b38f9351-ccb7-40ea-8f2f-0bbf86ee5330" https://sg-api.dss.husqvarnagroup.net/sg-1/locations/?user_id=196ab891-a521-872c-ab1d-1685d1e77afc


    Response:

    Code
    1. {
    2. "locations": [{
    3. 'id': '1c8b301f-22c8-423d-1b4d-ec25315d1377',
    4. 'name': 'My Garden',
    5. 'devices': ['75cfc1f8-a20c-51d6-c5ea-1b5ecdde80c1', 'e3c1b615-7351-25fc-a551-1908254a2b3e']
    6. }]
    7. }


    3.) Devices
    Mit der locations_id bekommt man dann alle Infos zu den Geräten


    URL:

    Code
    1. https://sg-api.dss.husqvarnagroup.net/sg-1/devices?locationId=1c8b301f-22c8-423d-1b4d-ec25315d1377


    Request Header:

    Code
    1. Content-Type:application/json
    2. X-Session: 7867e26c-05eb-4a60-bf30-7c3a1b4480aa


    Beispiel:

    Code
    1. curl --header "Content-Type:application/json" --header "X-Session:b38f9351-ccb7-40ea-8f2f-0bbf86ee5330" https://sg-api.dss.husqvarnagroup.net/sg-1/devices?locationId=1c8b301f-22c8-423d-1b4d-ec25315d1377


    Response:


    4.) Befehle senden
    Man braucht die deviceId und die locationId
    URL:

    Code
    1. https://sg-api.dss.husqvarnagroup.net/sg-1/devices/e3c1b615-7351-25fc-a551-1908254a2b3e/abilities/mower/command?locationId=1c8b301f-22c8-423d-1b4d-ec25315d1377


    Request Header:

    Code
    1. Content-Type:application/json
    2. X-Session: 7867e26c-05eb-4a60-bf30-7c3a1b4480aa


    POST Request:


    Beispiel:

    Code
    1. curl --data '{"name":"start_resume_schedule"}' --header "Content-Type:application/json" --header "X-Session:7867e26c-05eb-4a60-bf30-7c3a1b4480aa" https://sg-api.dss.husqvarnagroup.net/sg-1/devices/e3c1b615-7351-25fc-a551-1908254a2b3e/abilities/mower/command?locationId=1c8b301f-22c8-423d-1b4d-ec25315d1377
  • Hallo gerrieg,


    das habe ich gesucht.


    Bin nur in Json nicht fit.
    Bräuchte für mein SmartHome System das ganze in PHP.
    kannste mir da weiterhelfen ?



  • Hi,


    cool. Ich hatte auch gerade angefangen die API zu erforschen. Konnte mir die Responses nur noch nicht angucken.


    WiBo


    JSON ist das Format in dem die Daten vom Server empfangen bzw. gesendet werden. Welches SmartHome verwendest du denn?

    Robo:
    Gardena smart Sileno BJ. 2016


    SmartHome:
    FHEM & Openhab auf RasPi: CUL, Homematic etc.

  • Ist viele Jahre her, als ich noch PHP programmiert habe. Bin Java Entwickler, wenn ich mehr Zeit habe, werde ich vielleicht ein Binding für Openhab machen.
    Momentan schaut's aber zeitmäßig schlecht aus.

  • Es kommt ja auch drauf an, was du in deinem SmartHome mit dem Roby machen willst. Ich versuche gerade in FHEM die Lade- und Mähzeiten zu protokollieren. Nächster Schritt wäre dann die Anzeige ob der Garten für die Lütten frei ist.


    gerrieg Ich finde ja "Rosi" als Mähernamen toll.

    Robo:
    Gardena smart Sileno BJ. 2016


    SmartHome:
    FHEM & Openhab auf RasPi: CUL, Homematic etc.

  • Hi, sagtmal sind das die zugangsdaten von der APP ? oder muss man da was neu anlegen ?

    Grüße Ralf


    Mäher:
    aktuell: Gardena Smart Sileno (2016)


    Hausautomation:
    aktuell: Gigaset elements System/Security Smart Home (2014)

  • Ok hat sich erledigt...... Hatte immer das falsche passwort genommen [emoji106] funktioniert auch auf Android ich kann nur das Menü zum Zeitplan nicht öffnen

    Grüße Ralf


    Mäher:
    aktuell: Gardena Smart Sileno (2016)


    Hausautomation:
    aktuell: Gigaset elements System/Security Smart Home (2014)

  • Wie man das auf Deutsch umstellt hab ich mir noch nicht angesehen, das Menü geht ja auch nur in der App wie Meexx schon erwähnt hat. Schätze beides ist App-Spezifisch.

  • Wie man das auf Deutsch umstellt hab ich mir noch nicht angesehen, das Menü geht ja auch nur in der App wie Meexx schon erwähnt hat. Schätze beides ist App-Spezifisch.



    OK Danke für die Info

  • Vielen Dank gerrieg für die Analyse.
    Habe dazu eine (vorläufige) PHP-Klasse erstellt, falls sie jemand benötigt.


    Gibt es evtl. fürs Senden der Befehle eine Möglichkeit um an Returncodes zu kommen? "Command accepted" / "Error" oder Ähnliches würde bereits ausreichen...


    Danke

  • Danke Schaussi für das Script.
    Ich glaube der Returncode ist der HTTP Status. Bei HTTP 200 (OK) wurde der Befehl akzeptiert, bei HTTP 400 (Bad Request) passt irgendetwas nicht. Wenn beim Login User/Pass nicht stimmt, kommt HTTP 401 (Unauthorized) zurück.

  • Danke für den Hinweis, war mein Fehler - bei sendCommand() hatte die X-Session gefehlt, habe das Skript aktualisiert.
    Jetzt sollte es funktionieren und es kommt auch ein Json-Response beim Senden der Befehle.

  • ...leider doch noch nicht ganz.
    Bsp.:
    Beim Senden von "park_until_next_timer" kommt folgender Json-Response:

    Quote

    {"errors":[{'attribute':'locationId','error':'empty'}]}


    Der Status ist danach weiterhin "ok_cutting".
    Auch ein Ergänzen einer POST-Variable "locationId" behebt das Problem nicht...

  • Update: SendCommand funktioniert nun ebenfalls (Code ist aktualisiert).


    Nebenbei noch ein Hinweis, den ich heute von der Hotline erfahren habe:
    Wenn die Ladestation vom Stromnetz getrennt wird, muss jedes Mal danach der Mäher manuell gestartet werden. D.h. auch wenn PIN eingegeben wurde und am Display "Bereit" steht - es reicht nicht aus. Man muss zusätzlich explizit "Start" am Mäher drücken und die Abdeckung schließen, bevor Befehle von der App bzw. über die API angenommen werden.

  • Hallo Schaussi


    nochmals vielen Dank für die Info und das Script.


    Skript macht was es soll einsch Rückmeldungen.


    Werde es auf mein System anpassen.


    Wenn ich fertig bin, sofern Du es akzeptierst, werde ich das mit Hinweis auf dich bei IP-Symcon veröffentlichen.

  • Gerne, kein Problem.
    Wird natürlich noch weiter aktualisiert, da noch einiges fehlt (Batteriestatus, ...), kann aber eine Weile dauern.
    Für mich reicht es vorerst so aus, weil sich der Mäher somit von der Haussteuerung z.B. bei Unwetter automatisch parken und danach wieder starten lässt.
    Über kleine Umwege ist es auch mit OpenHAB oder Ähnlichem nutzbar.
    Man muss also nicht auf das Robonect H30X für den Sileno warten :) wobei das sicher auch noch interessant wird.