[Modul] Husqvarna Automower Connect

Hallo,

ich habe ganz frisch einen Husqvarna Automower 430X mit dem Connect-Modul bekommen und wollte den natürlich in IPS einbinden.

Es gibt zwar hier im Forum jeden Menge Beiträge, die sich auch um Husqvarna drehen, jedoch habe ich noch kein IPS-Modul gefunden, das direkt mit dem Connect-Modul kommuniziert.
Nach meinem Verständnis ist das ConnectModul nicht das gleiche wie das verschiedentlich angesprochenen Robonect-Modul, mit dem z.B. Gardena Sileno angeschlossen werden können.

Falls ich einen Beitrag überlesen habe würde ich mich über eine Info freuen.

Eine offizielle API-Dokumentation habe ich noch nicht gefunden, allerdings ein paar Projekte auf Github etc.

Wenn noch kein solches Modul existiert würde ich mich dann mal dran begeben und schauen, ob ich da was sinnvolle zustande bringen. Falls noch jemand Interesse daran hat und als Tester zur Verfügung stehen würde, gerne.

Gruß
demel

Hallo,

ich habe nur eine erste Version dieses Modul erstellt, mit dem ich den Status des Mähers überwachen und die Basis-Befehle (Start, Stop, Parken) absetzen kann.

GitHub - demel42/IPSymconAutomowerConnect: Interface to Husqvarna Automower with Connect-Module

Leider gibt es keine offizielle API-Dokumentation, sodaß ich auf Funde im Internet zurückgreifen musste und weis daher auch nicht ob jede Variante abgedeckt ist. Insbesondere was an Status zurückkommt ist naturgemäß unklar.
Daher muss ich das selbstredend in den nächsten Wochen intensiv beobachten.
Wenn jemand einen solchen Automower mit Connect-Modul hat, würde ich mich über Unterstützung beim Test freuen.

Ich habe selber noch ein paar Punkte, die ich nächste Tage einbauen werden (Start / Ende letzter Mähvorgang, kumulierte Zeiten pro Tag/Woche für Mähen, Fahren und Laden) aber Ideen sind immer willkommen.

Die regulären Mähvorgänge werden (vorläufig) weiterhin über den eingebauten Timer ausgelöst, wenn man das selbst komplett steuern möchte, stehen die 3 o.g. Befehle als Interface-Funktion zur Verfügung.

Gruß
demel

Vielleicht helfen dir die folgenden Codes die ich meinem Script nutze weiter (bei uns heißen die Mower Henry und Henriette :slight_smile: :

case chr(0x01).chr(0xf1):    switch ($werte) {
                                                        case 1    :setvalue(10575 /*[Scripte\Robomower\Automower Henriette\Webcontrol\Status]*/,"Arbeitsbereich"); break;
                                                        case 2    :setvalue(10575 /*[Scripte\Robomower\Automower Henriette\Webcontrol\Status]*/,"Kein Schleifensignal"); break;
                                                        case 4    :setvalue(10575 /*[Scripte\Robomower\Automower Henriette\Webcontrol\Status]*/,"Vorderer Schleifensensor defekt"); break;
                                                        case 5    :setvalue(10575 /*[Scripte\Robomower\Automower Henriette\Webcontrol\Status]*/,"Hinterer Schleifensensor defekt"); break;
                                                        case 8    :setvalue(10575 /*[Scripte\Robomower\Automower Henriette\Webcontrol\Status]*/,"Falscher Pin"); break;
                                                        case 9    :setvalue(10575 /*[Scripte\Robomower\Automower Henriette\Webcontrol\Status]*/,"Eingeklemmt"); break;
                                                        case 10   :setvalue(10575 /*[Scripte\Robomower\Automower Henriette\Webcontrol\Status]*/,"Umgedreht"); break;
                                                        case 11   :setvalue(10575 /*[Scripte\Robomower\Automower Henriette\Webcontrol\Status]*/,"Batterie schwach"); break;
                                                        case 12   :setvalue(10575 /*[Scripte\Robomower\Automower Henriette\Webcontrol\Status]*/,"Batterie leer"); break;
                                                        case 13   :setvalue(10575 /*[Scripte\Robomower\Automower Henriette\Webcontrol\Status]*/,"Kein Antrieb"); break;
                                                        case 15   :setvalue(10575 /*[Scripte\Robomower\Automower Henriette\Webcontrol\Status]*/,"Angehoben"); break;
                                                        case 16   :setvalue(10575 /*[Scripte\Robomower\Automower Henriette\Webcontrol\Status]*/,"Steckt in Ladestation fest"); break;
                                                        case 17   :setvalue(10575 /*[Scripte\Robomower\Automower Henriette\Webcontrol\Status]*/,"Ladestation blockiert"); break;
                                                        case 18   :setvalue(10575 /*[Scripte\Robomower\Automower Henriette\Webcontrol\Status]*/,"Stoss Sensor defekt"); break;
                                                        case 20   :setvalue(10575 /*[Scripte\Robomower\Automower Henriette\Webcontrol\Status]*/,"Rechter Antriebmotor blockiert"); break;
                                                        case 21   :setvalue(10575 /*[Scripte\Robomower\Automower Henriette\Webcontrol\Status]*/,"Linker Antriebsmotor blockiert"); break;
                                                        case 22   :setvalue(10575 /*[Scripte\Robomower\Automower Henriette\Webcontrol\Status]*/,"Rechtes Antriebsrad defekt"); break;
                                                        case 23   :setvalue(10575 /*[Scripte\Robomower\Automower Henriette\Webcontrol\Status]*/,"Linkes Antriebsrad defekt"); break;
                                                        case 24   :setvalue(10575 /*[Scripte\Robomower\Automower Henriette\Webcontrol\Status]*/,"Messer Motor defekt"); break;
                                                        case 25   :setvalue(10575 /*[Scripte\Robomower\Automower Henriette\Webcontrol\Status]*/,"Mäheinheit blockiert"); break;
                                                        case 27   :setvalue(10575 /*[Scripte\Robomower\Automower Henriette\Webcontrol\Status]*/,"Einstellungen zurückgesetzt"); break;
                                                        case 28   :setvalue(10575 /*[Scripte\Robomower\Automower Henriette\Webcontrol\Status]*/,"Speicherkreisproblem"); break;
                                                        case 30   :setvalue(10575 /*[Scripte\Robomower\Automower Henriette\Webcontrol\Status]*/,"Batterie Leer/defekt"); break;
                                                        case 32   :setvalue(10575 /*[Scripte\Robomower\Automower Henriette\Webcontrol\Status]*/,"Kippsensor defekt"); break;
                                                        case 33   :setvalue(10575 /*[Scripte\Robomower\Automower Henriette\Webcontrol\Status]*/,"Gekippt"); break;
                                                        case 34   :setvalue(10575 /*[Scripte\Robomower\Automower Henriette\Webcontrol\Status]*/,"Mäher hochgehoben"); break;
                                                        case 35   :setvalue(10575 /*[Scripte\Robomower\Automower Henriette\Webcontrol\Status]*/,"Rechter Radmotor überlastet"); break;
                                                        case 36   :setvalue(10575 /*[Scripte\Robomower\Automower Henriette\Webcontrol\Status]*/,"Linker Radmotor überlastet"); break;
                                                        case 37   :setvalue(10575 /*[Scripte\Robomower\Automower Henriette\Webcontrol\Status]*/,"Ladestrom zu hoch"); break;
                                                        case 54   :setvalue(10575 /*[Scripte\Robomower\Automower Henriette\Webcontrol\Status]*/,"PIN abgelaufen"); break;
                                                        case 501  :setvalue(10575 /*[Scripte\Robomower\Automower Henriette\Webcontrol\Status]*/,"Elektrischer Defekt"); break;
                                                        case 502  :setvalue(10575 /*[Scripte\Robomower\Automower Henriette\Webcontrol\Status]*/,"Elektrischer Defekt"); break;
                                                        case 503  :setvalue(10575 /*[Scripte\Robomower\Automower Henriette\Webcontrol\Status]*/,"Elektrischer Defekt"); break;
                                                        case 504  :setvalue(10575 /*[Scripte\Robomower\Automower Henriette\Webcontrol\Status]*/,"Elektrischer Defekt"); break;
                                                        case 505  :setvalue(10575 /*[Scripte\Robomower\Automower Henriette\Webcontrol\Status]*/,"Elektrischer Defekt"); break;
                                                        case 1000 :setvalue(10575 /*[Scripte\Robomower\Automower Henriette\Webcontrol\Status]*/,"Ladestation verlassen"); break;
                                                        case 1002 :setvalue(10575 /*[Scripte\Robomower\Automower Henriette\Webcontrol\Status]*/,"Mähen"); break;
                                                        case 1006 :setvalue(10575 /*[Scripte\Robomower\Automower Henriette\Webcontrol\Status]*/,"Mähwerk starten"); break;
                                                        case 1008 :setvalue(10575 /*[Scripte\Robomower\Automower Henriette\Webcontrol\Status]*/,"Mähwerk gestartet"); break;
                                                        case 1012 :setvalue(10575 /*[Scripte\Robomower\Automower Henriette\Webcontrol\Status]*/,"Signal Mähwerk starten"); break;
                                                        case 1014 :setvalue(10575 /*[Scripte\Robomower\Automower Henriette\Webcontrol\Status]*/,"In Ladestation am aufladen"); break;
                                                        case 1016 :setvalue(10575 /*[Scripte\Robomower\Automower Henriette\Webcontrol\Status]*/,"in Ladestation warten"); break;
                                                        case 1024 :setvalue(10575 /*[Scripte\Robomower\Automower Henriette\Webcontrol\Status]*/,"Aus Ladestation ausfahren"); break;
                                                        case 1036 :setvalue(10575 /*[Scripte\Robomower\Automower Henriette\Webcontrol\Status]*/,"Viereckmodus"); break;
                                                        case 1038 :setvalue(10575 /*[Scripte\Robomower\Automower Henriette\Webcontrol\Status]*/,"Festgefahren"); break;
                                                        case 1040 :setvalue(10575 /*[Scripte\Robomower\Automower Henriette\Webcontrol\Status]*/,"Kollission / Schleife erreicht"); break;
                                                        case 1042 :setvalue(10575 /*[Scripte\Robomower\Automower Henriette\Webcontrol\Status]*/,"Suche Ladestation"); break;
                                                        case 1044 :setvalue(10575 /*[Scripte\Robomower\Automower Henriette\Webcontrol\Status]*/,"Stop"); break;
                                                        case 1048 :setvalue(10575 /*[Scripte\Robomower\Automower Henriette\Webcontrol\Status]*/,"Andocken"); break;
                                                        case 1050 :setvalue(10575 /*[Scripte\Robomower\Automower Henriette\Webcontrol\Status]*/,"Aus Ladestation fahren"); break;
                                                        case 1052 :setvalue(10575 /*[Scripte\Robomower\Automower Henriette\Webcontrol\Status]*/,"Bitte Yes drücken"); break;
                                                        case 1056 :setvalue(10575 /*[Scripte\Robomower\Automower Henriette\Webcontrol\Status]*/,"Wartend (Manuell/Home)"); break;
                                                        case 1058 :setvalue(10575 /*[Scripte\Robomower\Automower Henriette\Webcontrol\Status]*/,"Bregrenzung folgend"); break;
                                                        case 1060 :setvalue(10575 /*[Scripte\Robomower\Automower Henriette\Webcontrol\Status]*/,"N-Signal gefunden"); break;
                                                        case 1064 :setvalue(10575 /*[Scripte\Robomower\Automower Henriette\Webcontrol\Status]*/,"Suche Ladestation"); break;
                                                        case 1070 :setvalue(10575 /*[Scripte\Robomower\Automower Henriette\Webcontrol\Status]*/,"Suchschleife folgen"); break;
                                                        case 1072 :setvalue(10575 /*[Scripte\Robomower\Automower Henriette\Webcontrol\Status]*/,"Schleife folgen"); break;
                                                        default: setvalue(10575 /*[Scripte\Robomower\Automower Henriette\Webcontrol\Status]*/,$werte);break;
                                                     }
        case chr(0x2e).chr(0xfe):    if ((int)$werte/1000 < 25){(setvalue(22840 /*[Scripte\Robomower\Automower Henriette\Webcontrol\Spannung]*/,$werte/1000));} break;//Spannung [V]
        case chr(0x02).chr(0x33):    if ((int)$werte < 50){(setvalue(10343 /*[Scripte\Robomower\Automower Henriette\Webcontrol\Akku Temperatur]*/,(int)$werte));} break;//Akku A Temperatur
        case chr(0x2e).chr(0xe0):    if ((int)$werte < 2500){(setvalue(35935 /*[Scripte\Robomower\Automower Henriette\Webcontrol\Kapazität]*/,(int)$werte));}break;//Kapazität [mAh]
        default: setvalue(36168 /*[Scripte\Robomower\Automower Henriette\Webcontrol\Werte]*/,"Adr: ".(dechex(ord(substr($data,1,1))))." ".(dechex(ord(substr($data,2,1))))." - Werte: ".$werte ); break;
     }
   }

hallo,

super, danke. nur zur Sicherheit: sind die über das Connect-Modul von Husqvarna angeschlossen oder zB. über Robonect?
In der json-Struktur habe ich bislang solche Codes nicht gesehen, nur einen ErrorCode, der aber bislang immer 0 war …

gruß
demel

Ich habe ein WLAN Modul das die serielle Schnittelle im Mäher (220AC und Solar Hybrid) ausliest.

Die Codes habe ich von einem Forum (weiss nicht mehr genau woher ist zu lange her)

Hallo demel,

klasse Modul, hat prompt funktioniert.

Hatte gestern selbst gebastet, deines ist aber deutlich komfortabler!! Danke! Ich werde ausgiebig testen und ggf. berichten.

Hast Du schon probiert die GPS-Daten in IPS zu visualisieren?

Gruß
hardlog

Prima, freut mich.

Nein, bisher noch nicht. So in der Richtung habe ich auch noch nie was gemacht, müsste ich mich mal reinfuchsen.

Mit den Daten werden die letzten 50 Positionen geliefert, ich nehme an, das Husqvarna diese Daten auch benutzt, um in der App das Bewegungsmuster zu zeichnen.
Ich habe aber keine Ahnung, wie man so etwas macht - hast Du da eine Info, ggfs ein anderes Modul, wo ich mal nachsehen kann?

gruß
demel

Hi,

ich versuche mich gerade mal mit OpenMaps, damit kann man vom Prinzip Koordinaten in eine Karte eintragen. Erste Versuche sehen ganz gut aus. Nur wie bekomme ich das ins Webfront. Html krieg ich in eine String-Var, aber die darin enthaltenen Scripte …

Kann da jemand helfen oder hat was ähnliches schon realisiert?

Erster Versuch: akutelle Position (bzw. letzte GPS-Koordinanten) können in Map angezeigt werden. Weiter gehts noch nicht. ISt ein wenig gefrickelt:

(1) String mit profil HTML-BOx anlegen
(2) Script mit folgendem Inhalt

<?
$lon=getvalue(37631 /*[Hardware\Automover API\Automover demel42\Tinkabell\letzter Längengrad]*/);
$lat=getvalue(41115 /*[Hardware\Automover API\Automover demel42\Tinkabell\letzter Breitengrad]*/);

$lonMulti=0.0000105; // halbe Ausschnittweite für die "Länge"  
$latMulti=0.000109;  // halbe Ausschnittweite für die "breite"

$html='
<html>
  <iframe width="500" height="350" frameborder="0" scrolling="no" marginheight="0" marginwidth="0" src="https://www.openstreetmap.org/export/embed.html?bbox='.($lon-$lonMulti).'%2C'.($lat-$latMulti).'%2C'.($lon+$lonMulti).'%2C'.($lat+$latMulti).'&layer=mapnik&marker='.$lat.'%2C'.$lon.'" style="border: 1px solid black"></iframe><br/>
</html>';

setvalue(42585 /*[Gebäude\Licht\Links\Map]*/,$html);
?>

in den zweiten, dritten und vorletzten script-Zeile die IDs anpassen.

Ausführen…

Bei mir siehts dann so aus:
map.JPG

sieht doch gut aus. kann man damit auch mehrere punkte setzen und verbinden?

gruß
demel

ich habe das Modul erweitert

  1. es wird die Arbeitszeit, d.h. die Zeit, in der der Mäher unterwegs war (fahren und mähen). Dieser Wert wird pro Tag in einer Variable ‚DailyWorking‘ abgelegt.

  2. es wird der ‚LastErrorCode‘ mitgeführt und via Variablenprofil (soweit bekannt) in Text übersetzt. Da ich nur eine kleine Handvoll Codes gefunden habe, muss das mit Sicherheit aus Erfahrung wachsen.

Hi,

bastel gerade an der Karte. So sieht’s derzeit aus:

Kannst Du die letzten 50 Koordinaten-Paare (die werden im Status glaub ich auch übertragen) in eine String-Var legen, damit ich sie mir wieder per script in ein Array zerlegen kann und in der Karte einzeichnen kann?
Z.B: im Format „L1/B1;L2/B2;…;L50/B50“

Gruß
Hardlog

schick.

ja, allerdings etwas anders als in einer Variablen, sonder mit einer Zugriffsfunktion.


$cdata = AutomowerDevice_GetRawData(24687 /*[Rasenmäher\Automower]*/, 'LastLocations');
$lastLocations = json_decode($cdata, true);
foreach ($lastLocations as $lastLocation) {
	echo print_r($lastLocation, true) . "
";
}

output ist dann

Array
(
[latitude] => 51,460873333333
[longitude] => 7,1585816666667
[gpsStatus] => USING_GPS_MAP
)

Grund: solche Rohdaten gehören ja eigentlich nicht in Variablen und so gehts auch. Einziges Problem: nach einer Reboot ist das erstmal leer bis zu dem ersten Datenabruf …

Erweiterung habe ich gerade gepushed, kannst also ein Update machen.

gruß
demel

Cool!

Komme der Sache näher.

map.JPG

Wie der Automower unter mein Haus kommt bleibt noch zu klären :eek:

Liegt aber scheinbar am automower, denn in der Original-App sieht die Karte leider ähnlich aus. Habt ihr da Erfahrung? Ist es bei euch genauso ungenau? oder kann es ein technischer Fehler sein, oder zu schlechte Satelliten-Empfang? Macht es bei solch einer Ungenauigkeit überhaupt Sinn mit GPS-Hilfe zu mähen? Da ich eine recht komplexe Rasenfläche (mit 2 Engpässen und durchgängigem Hang habe dachte ich das GPS hilfreich sein könnte?!

Gruß hardlog

Hallo Demel,

klinke mich hier mal mit ein.
Nutze IPS schon sehr lange und hatte einen 12 Jahre alten Automower,
der letzte Woche durch einen neuen 315X ersetzt wurde.
Habe gerade dein Modul entdeckt, installiert und es funktioniert auf Anhieb.

Teste gerne mit und kann evtl. Ideen beitragen.

Gruß
Didi

Hallo Hardlog,

hier mal der aktuelle Fahrweg meines 315X:
Fahrstrecke.jpg

Die Positionen sind recht genau.
Manche liegen mal ein paar (2-3) Meter daneben.
Mehr geben die GPS-Signale auch nicht her.

Gruß
Didi

Hmm,

nichts geht mehr:

IPS-Dienst schon beendet und neu gestartet. Unverändert scheint das Modul nicht zu laufen?

Wo kann ich nach Fehlern bzw. der Lösung suchen?

hardlog

sorry, gerade erst gesehen.

hmm, das ist schon die richtige Funktion und die gibt es in den aktuellen Quellen (AutomowerDevice/module.php)

Versuch doch mal das Modul (in Kern Instanzen -> Modules) löschen und wieder hat hinzufügen. Die installierte Instanz bleibt ja erhalten.

Es scheint so, das das Funktionsverzeichnis (__generated.inc.php in symcon/scripts) etwas durcheinander ist.

Das mit dem Löschen des des Modules hat funktioniert!

Danke demel. :slight_smile:

Woran kann das Problem liegen?
Genau das passiert auch immer mal wieder mit deinem NetatmoWeather-Modul.
`
Ich hab noch nicht herausbekommen, wann das Problem auftaucht (nach IPS-Update? nach Reboot des Servers?..)

gut das es geholfen hat, aber keine ahnung woher das kommt.

beim nächsten mal schau doch mal nach, ob die fehlende Funktion in __generated.inc.php enthalten ist.

Dann gibt es die Funktion MC_ReloadModule(<InstanceID von Modules>, ‚<ModuleName>‘); die eigentlich dafür sorgt, das das Modul neu analysiert wird. versuch das dann mal.

@paresy: hast du eine Idee zur Fehlersuche?

Hallo,

erstmal ein Kompliment an das geschriebene Modul.
Hat bei mir auf Anhieb funktioniert dies zu integrieren.

Wäre schön, wenn die Karten-Funktion oder auch Zeitplan-Funktion noch mit eingebaut würde.

Vielen Dank.