Hallo Freunde des gepflegten Rasens!
Nachdem ich oft Nutznießer Eurer Hilfe und Kenntnisse oder Skripte bin wollte ich etwas zurückgeben.
Ich habe jetzt eine funktionierende Variante um den Worx Landroid in IPS zu integrieren und wollte diese mit euch teilen:
(Geht nur mit Windows-Server, bzw. einem Windows-Rechner der die JSON für IPS zugänglich speichert)
Zuerst braucht Ihr aus dem Roboter-Forum die Software von Eisha, zu finden hier:
Desktop App (exe) – Google Drive
Diese liegt bei mir im Odner IP-Symcon/Landroid_Win_v15.
Das Programm selbst in den Autostart übernehmen und Zugangsdaten eingeben.
Dazu dann unter „Plugins“ die Haken setzen:
Das Programm kann minimiert werden.
Im Programmordner taucht nun eine CmdOut.json auf, hier kommen die Daten an.
Wir benötigen einige Variablen um den Status zu erfassen:
Diese lesen wir hiermit ein (ggf. den Programmpfad anpassen):
<?
$landroid = file_get_contents("C://IP-symcon/Landroid_Win_v15/CmdOut.json");
$data = json_decode($landroid, true);
$run = $data["dat"]["ls"];
If ($run == 0) {
SetValueString(10059 /*[Komponenten\Landroid\Landroid-Aktion]*/, "In Station (Idle)");}
Elseif ($run == 1) {
SetValueString(10059 /*[Komponenten\Landroid\Landroid-Aktion]*/, "In Station (Home)");}
Elseif ($run == 5) {
SetValueString(10059 /*[Komponenten\Landroid\Landroid-Aktion]*/, "Sucht Begrenzungsdraht");}
Elseif ($run == 7) {
SetValueString(10059 /*[Komponenten\Landroid\Landroid-Aktion]*/, "Mähen");}
Elseif ($run == 30) {
SetValueString(10059 /*[Komponenten\Landroid\Landroid-Aktion]*/, "Heimfahrt");}
Elseif ($run == 32) {
SetValueString(10059 /*[Komponenten\Landroid\Landroid-Aktion]*/, "Kantenschnitt");}
Elseif ($run == 33) {
SetValueString(10059 /*[Komponenten\Landroid\Landroid-Aktion]*/, "Suche Mähbereich");}
Elseif ($run == 34) {
SetValueString(10059 /*[Komponenten\Landroid\Landroid-Aktion]*/, "Pause / gestoppt");}
$signal = $data["dat"]["rsi"]; //Wifi-Signal
SetValueInteger(10063 /*[Komponenten\Landroid\Wifi-Signal]*/, $signal);
If ($signal <= -90) {
SetValueString(37303 /*[Komponenten\Landroid\Wifi-Signalgüte]*/, "Verbindung kaum möglich (-)");}
If (($signal >= -89) AND ($signal <=80)) {
SetValueString(37303 /*[Komponenten\Landroid\Wifi-Signalgüte]*/, "Signal unzuverlässig (6)");}
If (($signal >= -79) AND ($signal <=70)) {
SetValueString(37303 /*[Komponenten\Landroid\Wifi-Signalgüte]*/, "Signal ausreichend (5)");}
If (($signal >= -69) AND ($signal <=67)) {
SetValueString(37303 /*[Komponenten\Landroid\Wifi-Signalgüte]*/, "Signal normal (4)");}
If (($signal >= -66) AND ($signal <=60)) {
SetValueString(37303 /*[Komponenten\Landroid\Wifi-Signalgüte]*/, "Signal gut (3)");}
If (($signal >= -59) AND ($signal <=50)) {
SetValueString(37303 /*[Komponenten\Landroid\Wifi-Signalgüte]*/, "Signal exzellent (2)");}
If (($signal >= -49) AND ($signal <=30)) {
SetValueString(37303 /*[Komponenten\Landroid\Wifi-Signalgüte]*/, "Signal perfekt (1)");}
$akku = $data["dat"]["bt"]["p"];
SetValueInteger(16534 /*[Komponenten\Landroid\Ladestand Landroid]*/, $akku);
$akkutemp = $data["dat"]["bt"]["t"];
SetValueFloat(29048 /*[Komponenten\Landroid\Akkutemperatur Landroid]*/, $akkutemp);
$spannung = $data["dat"]["bt"]["v"];
SetValueFloat(37298 /*[Komponenten\Landroid\Akkuspannung Landroid]*/, $spannung);
$weg = $data["dat"]["st"]["d"];
SetValueInteger(29772 /*[Komponenten\Landroid\Gesamtstrecke Landroid]*/,$weg);
$zeit = $data["dat"]["st"]["b"];
SetValueFloat(40234 /*[Komponenten\Landroid\Arbeitszeit Landroid]*/, round((($zeit/60)/24),2));
$time = $data["cfg"]["tm"];
SetValueString(16535 /*[Komponenten\Landroid\Aktualisierungszeit]*/, $time);
$error = $data["dat"]["le"];
If ($error == 0) {
SetValueString(10068 /*[Komponenten\Landroid\Landroid Fehlerzustand]*/, "kein Fehler");}
Elseif ($error == 1) {
SetValueString(10068 /*[Komponenten\Landroid\Landroid Fehlerzustand]*/, "Mäher festgefahren");}
Elseif ($error == 2) {
SetValueString(10068 /*[Komponenten\Landroid\Landroid Fehlerzustand]*/, "Mäher angehoben");}
Elseif ($error == 3) {
SetValueString(10068 /*[Komponenten\Landroid\Landroid Fehlerzustand]*/, "Draht fehlt");}
Elseif ($error == 4) {
SetValueString(10068 /*[Komponenten\Landroid\Landroid Fehlerzustand]*/, "ausserh. der Begrenzung");}
Elseif ($error == 5) {
SetValueString(10068 /*[Komponenten\Landroid\Landroid Fehlerzustand]*/, "wegen Regen gestoppt");}
Elseif ($error == 8) {
SetValueString(10068 /*[Komponenten\Landroid\Landroid Fehlerzustand]*/, "Fehler Messermotor");}
Elseif ($error == 9) {
SetValueString(10068 /*[Komponenten\Landroid\Landroid Fehlerzustand]*/, "Fehler Fahrmotor");}
Elseif ($error == 11) {
SetValueString(10068 /*[Komponenten\Landroid\Landroid Fehlerzustand]*/, "Mäher umgekippt");}
Elseif ($error == 12) {
SetValueString(10068 /*[Komponenten\Landroid\Landroid Fehlerzustand]*/, "Akku leer");}
Elseif ($error == 13) {
SetValueString(10068 /*[Komponenten\Landroid\Landroid Fehlerzustand]*/, "Draht vertauscht");}
Elseif ($error == 14) {
SetValueString(10068 /*[Komponenten\Landroid\Landroid Fehlerzustand]*/, "Akku Ladefehler");}
Elseif ($error == 15) {
SetValueString(10068 /*[Komponenten\Landroid\Landroid Fehlerzustand]*/, "Station n. gefunden");}
Elseif ($error == 16) {
SetValueString(10068 /*[Komponenten\Landroid\Landroid Fehlerzustand]*/, "Mäher gesperrt");}
Elseif ($error == 17) {
SetValueString(10068 /*[Komponenten\Landroid\Landroid Fehlerzustand]*/, "Akkutemp. zu hoch");}
?>
Die Variablen-ID’s müsst Ihr durch Eure ersetzen. (Sollte klar sein, aber ganz, ganz früher wusste ich das auch mal nicht )
Anschließend müssen wir eine zyklische Abfrage erstellen, generell gibts alle 10min ein Update der JSON, aber wenn sich der Status ändert, dann auch früher.
Das machen wir über den Timestamp der JSON-Datei, hier ggf. den Pfad und den Pfad zum Skript (IPS_RunScript) anpassen.:
<?
$datei = "C://IP-symcon/Landroid_Win_v15/CmdOut.json";
$zeit = filemtime ( $datei );
$zeit_alt = GetValueinteger(35210 /*[Komponenten\Landroid\Änderungsüberwachung Landroid CmdOut\Timestamp CmdOut]*/);
If ($zeit > $zeit_alt){
SetValueInteger(35210 /*[Komponenten\Landroid\Änderungsüberwachung Landroid CmdOut\Timestamp CmdOut]*/, $zeit);
IPS_RunScript(29044 /*[Komponenten\Landroid\Landroid_Read]*/);}
?>
Das o.g. Skript muss dann zyklisch ausgeführt werden, ich denke 10s reicht - das Skript ist klein und flott abgearbeitet und alle 10s ist schnell genug als Update. Timer wie im Screenshot anlegen. Das Landroid_Read Skript braucht keinen Timer, es wird nur ausgeführt, falls die JSON geändert wurde.
Um den Landroid zu steuern brauchen wir noch ein Skript.
(ich habe mich auf Start, Stop und Heimfahren beschränkt, Einstellungen mache ich mit der Desktop oder Android-App)
<?
$command = GetValueInteger(29053 /*[Komponenten\Landroid\Landroid-Command\Betriebsmodus Landroid]*/);
$cfg = array("cmd" => $command);
$Pfad = "C://IP-symcon/Landroid_Win_v15/CmdIn.json";
$Attribut = "ab";
$open = fopen($Pfad,$Attribut); //Öffnen
file_put_contents($Pfad, ''); //Datei leeren, sonst wird angehangen!)
fwrite($open, json_encode($cfg)); //Daten schreiben
fclose($open); //schließen
echo json_encode($cfg);
?>
Zu guter Letzt fehlt noch ein Trigger, dieser startet das Landroid_Command Skript, wenn die „Steuervariable“, welche den Modus festlegt, aktualisiert wird. (Also nicht auf Variablenänderung sondern auf Aktualisierung setzen)
Ich nutze die IPS-App nicht, stattdessen geht bei mir alles in IPS-View, dort habe ich drei Buttons für „Start“, „Home“, „Stop“. Diese Buttons ändern die Variable „Betriebsmodus Landroid“ in 1, 2 oder 3. Diese Änderung führt dann das Command-Skript aus.
So siehts bei mir in IPS-View aus:
Nachdem der Befehl abgegeben wurde, wird der Timestamp der Datei von der Landroid-Desktop-App erfasst und nur 1x interpretiert, bis es einen neuen Timestamp gibt. Also kein Grund die Datei zu leeren oder löschen.
Ich würde mich über Feedback freuen, bzw schreibt mal wenn Ihr die Skripte nutzt.
Hier noch ein paar Quellen (ist ja ausser den Skripten usw. nicht zu 100% auf meinem Mist gewachsen.):
Roboter-Forum, Software von Eisha, ab Seite 48 gehts mit der aktuellen Version los:
Entwicklungsprojekt: Landroid-S Windows App
Landroid-Thread, ich hatte mal geplant den MQTT Broker zu nutzen - bringt mir aber so erstmal nichts:
Worx Landroid CSV wie Werte in einzelne Variablen schreiben
Hier noch wie die JSON erzeugt wird:
Daten als JSON ausgeben
Viel Spaß damit!
Gruß,
Maeffjus