Neues Modul: 74_HusqvarnaAutomower.pm

Begonnen von krannich, 27 Januar 2018, 12:12:01

Vorheriges Thema - Nächstes Thema

guehoe

Hallo Klaus,

habe ich selbstverständlich als Erstes getestet, endete allerdings in einer Katastrophe. Der park-Befehl ging problemlos durch aber nach erstem update-Befehl ist fhem komplett abgesoffen.

Can't use string ("PARKED_PARKED_SELECTED") as a HASH ref while "strict refs" in use at ./FHEM/74_HusqvarnaAutomower.pm line 504.

Das war die letzte Ausgabe. Fhem restart ging auch nicht. Letzte Ausgabe beim Startup siehe oben. So kam ich auf diese Lösung.

Dann habe ich heute nochmal das Protokoll der Netzaufzeichnung durchgesehen und mir ist aufgefallen das u.A. auch die Plattform abgefragt/übertragen wird.

{"deviceId":"xyz...","platform":"android"}


Wird schon werden. Ich lasse jetzt einfach mal meine Version weiterlaufen.

Um die Frage, weiter oben im Thread, was bei "park" geschieht zu beantworten: "Parken bis auf weiteres"

Gruß, Günter
Raspi 3+, CUL868, FS20, CCU2, div. MAX! und Shellys

OliS.

Hallo zusammen.

Danke für das Modul. Funktioniert bei mir sehr gut.

Ich hätte mal eine Verständisfrage zum Abfrage-Intervall. In einem der vorigen Posts kam doch die Frage auf, ob ein hohes Intervall auch ein hohes Datenaufkommen für die eingebaute SIM-Karte bedeutet. Ist es nicht so, dass der Mäher seinerseits seinen Status in bestimmten Abständen an die Cloud sendet? Das Modul fragt doch nicht den Mäher selbst ab sondern die Cloud. Deshalb dürfte doch das Abfrage-Intervall keine Auswirkungen auf das Datenvolumen der SIM-Karte haben. Oder sehe ich das falsch.

Ich habe nämlich bei mir ein Intervall von 60 Sekunden eingestellt, um in FHEM auch nachts schnell auf Änderungen der Geoposition des Mähers reagieren zu können.

Ansonsten noch mal vielen Dank für das Modul.

Oli
FHEM in Debian VM auf DS720+, HMLAN und HMUARTLGW, RFXTRX, Conbee II, Homebridge, Alexa
Geräte: Homematic, Tradfri, Shelly, IT, ESA2000, VU+, Denon-AVR, Sonos, Fritz!Box, Harmony Hub, IP-Cams, Roborock, Automower

HenrikAachen

#92
Erledigt! Neuanlage des Mower hat geholfen!


Nach einem Reboot von FHEM kriege ich nur noch den Status: authenticated beim Rasenmäher.
Update geht auch nicht mehr, leider.

Hatte den Fehler schon jemand?


spi3845

#93
Hallo,

danke für das Modul! Gestern Mäher gekommen, heute in fhem drin.

Status funktioniert einwandfrei. Park/Start/Stop mit default-Modul ohne Veränderungen bewirken bei mir auch nichts. Habe ein 2018er 315-Model mit Bluetooth und GSM-connect-Karte.

Wie kann ich unterstützend beitragen mit logs/traces etc.?

Viele Grüße,
Sebastian

P.S. Habe in dem Modul die Zeile "use constant APIURL => "https://amc-api.dss.husqvarnagroup.net/app/v1/";" testweise geändert und kann bestätigen, dass mit "app/" in der URL die Status-Abfrage funktioniert, ohne "app/" funktioniert sie nicht. Dafür funktioniert z.B. park ohne "app/" in der URL.

Es muss noch weitere Parameter geben, da ein park den Mäher zum Parken "bis auf weiteres" schickt. In der App kann man z.B. auswählen "Parken bis zum nächsten Timer" oder "Parken 3h|6h|12h".

isy

Hallo Sebastian,
geht bei allen nicht. Denke wir müssen auf den Moduldentwickler warten.

Gruß Helmut
Ein Weg wird erst zu einem Weg, wenn man ihn geht

spi3845

Zitat von: dl4fb am 15 Juni 2018, 18:15:28
Hallo Sebastian,
geht bei allen nicht. Denke wir müssen auf den Moduldentwickler warten.

Gruß Helmut

Hat jemand eine x86-Version der Husquarna Android App (als apk-Datei)? Die könnte ich versuchen, in einem Emulator laufen zu lassen, um sie besser zu debuggen. Habe nur eine ARM-Version...

isy

Nutze hier am Tablet eine 32 Bit Version, habe aber keinen Toot User, komme also an die apk nicht ran.

Ich habe mich mit Perl nie beschäftigt, mit Turbo Pascal damals.
Deswegen ist meine Analyse recht wackelig.
Ich hatte mir am Git. den Sourcecode oberflächlich angeschaut. Es sieht so aus, als ob die Befehle an Husqvarna in Englisch abgesetzt werden müssen, wir also die englischen Ausdrücke im Auswahlfeld eingeben müssen.
Hatte ich probiert, mit "Main area" und anderen Varianten, ohne Ergebnis.
Ich habe allerdings nicht gesucht, wie das Auswahlfeld bearbeitet und Richtung Server gesendet wird. Vielleicht fehlt auch einfach der Code dafür aktuell.
Ein Weg wird erst zu einem Weg, wenn man ihn geht

spi3845

#97
Zitat von: dl4fb am 15 Juni 2018, 18:34:01
Nutze hier am Tablet eine 32 Bit Version, habe aber keinen Toot User, komme also an die apk nicht ran.

Hast Du bei Dir auf deinem PC adb (Android Debugging Bridge) installiert, um auf das Tablet per USB zugreifen zu können? Dann könntest Du per "adb shell pm list packages" (1) Dir eine Liste der apps, per "adb shell pm path <Name aus 1>" (2) den Pfad der App und dann per "adb pull <Pfad aus 2> Zielpfad" die App kopieren. Puh, kompliziert. Einfacher geht es vielleicht mit https://play.google.com/store/apps/details?id=com.estrongs.android.pop&hl=en oder https://play.google.com/store/apps/details?id=com.ext.ui.

isy

Guter Tip, werde ich testen.

Habe aber auch eine gute Info von  Entwickler.
Siehe https://blog.krannich.de/husqvarna-automower-modul-fuer-fhem/

Erst ist an der an der Implementierung.
Ein Weg wird erst zu einem Weg, wenn man ihn geht

spi3845

#99
Hat jemand Erfahrung mit Android-App-Programmierung? Habe die apk auf die Schnelle angeschaut und z.B. folgende Zustände des Mähers darin gefunden:


    public static final MowerActivity charging;
    public static final MowerActivity goingHome;
    public static final MowerActivity leaving;
    public static final MowerActivity mowing;
    public static final MowerActivity none;
    public static final MowerActivity parkedInCs;
    public static final MowerActivity stoppedInGarden;
    public static final MowerActivity unknown;


Als urls verwendet die apk:


    public static final String API_BASE_URL = "amc-api.dss.husqvarnagroup.net";
    public static final String IAM_BASE_URL = "iam-api.dss.husqvarnagroup.net";


Daraus werden die kompletten urls zusammengebaut. Es gibt in der apk auch einen Demo-Mode mit abweichenden Links, vielleicht kann man hier was testen... Sieht aber eher nach einem Husquarna-eigenen Entwicklungssystem aus.


    public static okhttp3.HttpUrl.Builder getDefaultIamUrlBuilder()
    {
        if (Constants.DEMO_MODE_ENABLED)
        {
            return (new okhttp3.HttpUrl.Builder()).scheme("http").host(MockBackend.server.getHostName()).port(MockBackend.server.getPort()).addPathSegment("iam");
        } else
        {
            return (new okhttp3.HttpUrl.Builder()).scheme(API_SCHEME).host("iam-api.dss.husqvarnagroup.net").addPathSegment("api").addPathSegment("v3");
        }
    }

    public static okhttp3.HttpUrl.Builder getDefaultMowerUrlBuilder()
    {
        if (Constants.DEMO_MODE_ENABLED)
        {
            return (new okhttp3.HttpUrl.Builder()).scheme("http").host(MockBackend.server.getHostName()).port(MockBackend.server.getPort()).addPathSegment("v1").addPathSegment("mowers");
        } else
        {
            return (new okhttp3.HttpUrl.Builder()).scheme(API_SCHEME).host("amc-api.dss.husqvarnagroup.net").addPathSegment("app").addPathSegment("v1").addPathSegment("mowers");
        }
    }

    public static okhttp3.HttpUrl.Builder getDefaultUrlBuilder()
    {
        if (Constants.DEMO_MODE_ENABLED)
        {
            return (new okhttp3.HttpUrl.Builder()).scheme("http").host(MockBackend.server.getHostName()).port(MockBackend.server.getPort()).addPathSegment("v1");
        } else
        {
            return (new okhttp3.HttpUrl.Builder()).scheme(API_SCHEME).host("amc-api.dss.husqvarnagroup.net").addPathSegment("app").addPathSegment("v1");
        }
    }


Dort sind auch alle Aufrufe für die Funktionen drin, aber das ist doch etwas mühsam für die Analyse. Vielleicht kriege ich ja noch was raus.

P.S. Habe noch was rausbekommen. Es gibt in der App Java-Funktionen zum Aufruf unterschiedlicher Mäher-Funktionen. Diese lauten:


    public void parkUntilFurtherNotice(String s, ControlMowerRequestListener controlmowerrequestlistener)
    {
        control(BaseRequest.getDefaultMowerUrlBuilder().addPathSegment(s).addPathSegment("control").addPathSegment("park").build(), "", controlmowerrequestlistener);
    }

    public void parkUntilNextStart(String s, ControlMowerRequestListener controlmowerrequestlistener)
    {
        control(BaseRequest.getDefaultMowerUrlBuilder().addPathSegment(s).addPathSegment("control").addPathSegment("park").addPathSegment("duration").addPathSegment("timer").build(), "", controlmowerrequestlistener);
    }

    public void parkWithDuration(String s, int i, ControlMowerRequestListener controlmowerrequestlistener)
    {
        control(BaseRequest.getDefaultMowerUrlBuilder().addPathSegment(s).addPathSegment("control").addPathSegment("park").addPathSegment("duration").addPathSegment("period").build(), getDurationJsonString(i), controlmowerrequestlistener);
    }

    public void pause(String s, ControlMowerRequestListener controlmowerrequestlistener)
    {
        control(BaseRequest.getDefaultMowerUrlBuilder().addPathSegment(s).addPathSegment("control").addPathSegment("pause").build(), "", controlmowerrequestlistener);
    }

    public void startMainArea(String s, ControlMowerRequestListener controlmowerrequestlistener)
    {
        control(BaseRequest.getDefaultMowerUrlBuilder().addPathSegment(s).addPathSegment("control").addPathSegment("start").build(), "", controlmowerrequestlistener);
    }

    public void startMainAreaOverrideTimer(String s, int i, ControlMowerRequestListener controlmowerrequestlistener)
    {
        control(BaseRequest.getDefaultMowerUrlBuilder().addPathSegment(s).addPathSegment("control").addPathSegment("start").addPathSegment("override").addPathSegment("period").build(), getDurationJsonString(i), controlmowerrequestlistener);
    }


Jeder einzelne Aufruf baut eine url zusammen, der String s ist die Mäher ID. Der Aufruf zum Parken mit Dauer lautet dann:


.../mower-id/control/park/duration/period

Die Dauer wird als JSON-String übergeben.

P.S.2 In der App gibt es auch den Code für den Mockserver (MockBackend.server) - weiß nur nicht, wie der zu starten ist. Aber damit könnte die App wohl gegen einen Test-Webservice, der auf dem Smartphone selbst läuft, getestet werden.

Klaus.A

#100
Hallo zusammen,

aktueller Stand aus meinen Testläufen:

Wenn man die Änderungen aus Post #88 vornimmt dann funktioniert alles, einschl. Start, Stop, Parken. Die URLs müssen angepasst werden, es sind insgesamt 3 erforderlich, für Authentifizierung, Post und Get.

Das zur Zeit verteilte Modul ist noch fehlerhaft.

Zur Frage nach dem Abfrage-Intervall: Ich habe mir die Logik im Modul genauer angesehen. Ja, es wird nur die Cloud abgefragt, so gesehen ist das Intervall belanglos für die Mobilfunkverbindung. Die Cloud greift bei Abfragen nicht auf den Mower durch. Dieser dürfte immer bei einer Statusänderung den neuen Status an die Cloud senden. Er scheint von Zeit zu Zeit auch ein "Keep Alive" zu senden - jedenfalls habe ich auch mit der Original-App Situationen erlebt, die "getrennt" gemeldet haben. Das kann der Mower ja nicht gesendet haben, da hat die Cloud erkannt das die Verbindung fehlt. Ich vermute eben das der Mower dieses "Keep Alive" sendet, denn nur so gibt es die Gewähr das der in der Cloud vorhandene Status einigermaßen aktuell ist.

Unschön ist das er bei jedem Interfvall-Call das Log zumüllt mit


doUpdate() called.
2018.06.21 21:25:35 3: Update with device: xxxxxxxxx-xxxxxxxxx


Im normalen Betrieb ist das völlig unnötig. Das sollte eigentlich mehr ein Debug-Protokoll sein. Vielleicht kann das der Entwickler auf einen anderen Level umstellen, sodass es nur bei einer anderen Verbose-Einstellung zieht.

Gruß, Klaus


2 x CubieTruck mit 1) FHEM 5.9 und 2) IOBroker-mit Echo-Dot/Alexa und Homekit-/Siri-Integration. 1 x HMLAN, 3 x HM-LGW-O-TW-W-EU-2, mehr als 90 HomeMatic Sensoren und Aktoren, Velux-Fenster-IF, Fibaro ZWave-Sensoren und Aktoren, Philips Hue Bridge, IRTrans IR-Konverter, AutoMower via API

HenrikAachen

Hallo,

ich habe die Änderungen aus #88 versucht, aber das Modul lässt sich nicht mehr laden.
Könnte jemand mal bitte sein funktionierendes PM einfach hier Posten?

Wäre sehr dankbar.

Gruß Henrik

guehoe

#102
Hallo zusammen,

ZitatZur Frage nach dem Abfrage-Intervall: Ich habe mir die Logik im Modul genauer angesehen. Ja, es wird nur die Cloud abgefragt, so gesehen ist das Intervall belanglos für die Mobilfunkverbindung. Die Cloud greift bei Abfragen nicht auf den Mower durch. Dieser dürfte immer bei einer Statusänderung den neuen Status an die Cloud senden. Er scheint von Zeit zu Zeit auch ein "Keep Alive" zu senden - jedenfalls habe ich auch mit der Original-App Situationen erlebt, die "getrennt" gemeldet haben. Das kann der Mower ja nicht gesendet haben, da hat die Cloud erkannt das die Verbindung fehlt. Ich vermute eben das der Mower dieses "Keep Alive" sendet, denn nur so gibt es die Gewähr das der in der Cloud vorhandene Status einigermaßen aktuell ist.

Das kann ich nicht bestätigen. Während des Mähens wird mit jedem "update" auch die aktuelle Position übertragen. Da die Cloud diese nicht kennen kann muss hier wohl der Mäher abgefragt werden. Lediglich im Zustand "geparkt" erfolgt eine Aktualisierung der Koordinaten nur ca. alle 10 Minuten.

Dann habe ich noch einen Fehler entdeckt: Wenn "event-on-change/update-reading" eingesetzt wird verliert das Modul, warum auch immer, die Verbindung. Der Status ist dann "authenticated".

Gruß, Günter

@Klaus: mit verbose 0 ist der Log-Spuk weg.
Raspi 3+, CUL868, FS20, CCU2, div. MAX! und Shellys

Klaus.A

Die Positionsmeldung ist dann also das "Keep-Alive" bzw. Meldung das der Mower noch funktioniert. Die Cloud wird nicht den Mower anrufen ... der meldet sich periodisch und sendet seine aktuelle Position. Damit ist auch gewährleistet das bei einem Abbruch/Fehler des Mowers dessen letzte bekannte Position verfügbar ist.

Verbose 0 ist klar, das kann aber nur eine Notlösung sein, denn damit schalte ich für das Modul ja alles ab.

Gruß, Klaus
2 x CubieTruck mit 1) FHEM 5.9 und 2) IOBroker-mit Echo-Dot/Alexa und Homekit-/Siri-Integration. 1 x HMLAN, 3 x HM-LGW-O-TW-W-EU-2, mehr als 90 HomeMatic Sensoren und Aktoren, Velux-Fenster-IF, Fibaro ZWave-Sensoren und Aktoren, Philips Hue Bridge, IRTrans IR-Konverter, AutoMower via API

HenrikAachen

Hi,

Geht es hier noch weiter?
Ich habe folgende Proble:

- Status ist ,,mäht", Sonderzeichen sollte weg
- set Park etc geht nicht
- mower verliert Verbindung und geht auf authenticated bei Event on Change

Ich denke eine funktionierende Lösung ist sehr nah für alle.