[Modul] Worx, Kress, Landxcape, Ferrex-Adapter

Hallo Luca,

erstelle einfach eine neue Textdatei und schreibe die Startdaten rein z.B.:

CD\
cd landroid-bridge
start /min node dist/server.js

die Datei benennst du dann Landroid.bat und schiebst sie in den Autostart-Ordner unter Windows.
Beim nächsten Windoes-Start startet das CMD-Fenster automatisch und die Bridge läuft solange, bis du das Fenster schließt.

VG
Alex

Hi Alex,
perfekt, besten Dank, das klappt!

Gruß

Hallo Jürgen,

es geht wieder :wink:

Ich habe ziemlich umfangreiche Tests gemacht :eek::

Problem 1: Die Landroid-Bridge legt die gesamte Internetverbindung lahm :banghead:
Hier (DDoS - Could not finish initialization, retrying… retrying… retrying… retrying… retrying… · Issue #86 · virtualzone/landroid-bridge · GitHub) ist der Fehler perfekt beschrieben. Tritt immer auf, wenn die Bridge nicht tadellos mit dem Mäher (nicht mit der WorxCloud) kommunizieren kann. Ich parse jetzt das Logfile auf „retry“ und beende bei Vorkommen von „retry“ den Task:D - würde ich dringend auch allen anderen Landroid-Bridge Nutzern empfehlen :wink:

Problem 2: Die Kommunikation der Bridge funktioniert nicht einwandfrei (was u.a. zu Problem 1 führt)
Ich kann nicht zurückverfolgen ob die ursächliche Auslösung das seitens der Worx-Webseite „zu unsichere Passwort“ und meine darauffolgende Änderung dessen oder meine erste Änderung an der WLAN-Konfiguration war. Reproduzierbar ist aber -zumindest bei mir- dass jedwede WLAN-Änderung (z.B. SSID-Name) auch wenn diese Änderung wieder zurückgenommen wird - zu diesen Kommunikationsproblemen führt :banghead: Bei mir hilft hier auch NICHT eine erneute Einrichtung des WLANs am Mäher - diese funktioniert nach den Rückmeldungen - stellt aber die Kommunikation nicht wieder her. Komischerweise funktioniert ein Ping immer und der Mäher sendet auch Status-Meldungen artig an die Handy-App - allerdings kann man per App nichts speichern/ausführen.
Ebenfalls funktioniert bei mir definitiv nicht die WLAN-SSID zu verstecken :eek:
Reproduzierbar einen funktionieren Stand erhalte ich bei folgenden Schritten:

  1. Unpairing des Mähers über die Webseite
  2. Neues Pairen über die Handy-App (QR-Code oder Seriennummer) oder Webseite (Seriennummer) auf ein WLAN mit aktiver SSID (logischerweise inkl. WLAN-Einrichtung am Mäher)

Besten Dank nochmal für Deine Arbeit.
Ciao
HerbertF

Hallo Herbertf,
schön, dass es wieder läuft. Ja, die Worx-Cloud ist manchmal schon ziemlich zickig.

Mich würde interessieren, wie Du das mit dem Parsen und dem Beenden der Task gelöst hast. Kannst Du das hier mal posten?
Viele Grüße
Jürgen

Hallo Jürgen,

etwas quick and dirty :smiley: aber Bitte:


<?
$debug=false;
$Par_ID=IPS_GetParent($_IPS['SELF']);
$Name_Kat="Landroid-Bridge Log auf Retrying parsen";  
$Text="";
$ausgabe=array();
//nachfolgend muss das Logfile stehen - ich rufe node.js in einer Batch so auf: node dist/server.js > C:\ProgramData\Symcon\logs\LandroidBridge.log
$Pfad=IPS_GetKernelDir();
$Filename_E=$Pfad."\\logs\\LandroidBridge.log";        
$Fehler=false;
IPS_Sleep(1000);
if (file_exists ($Filename_E)) {
   $array = file($Filename_E);     
   IPS_Sleep(500);    
   if ($debug) echo "$Filename_E existiert
";    
   $Fehlerstring="retry";    
   Goto Auswerten;
}
else {    
   IPS_LogMessage($Name_Kat,"$Filename_E existiert nicht - ENDE (".$_IPS['SELF'].")");    
   if ($debug) echo "$Filename_E existiert nicht
";    
   Goto Ende_Script;
}
Auswerten:
//
//if ($debug) print_r($array );
//
foreach($array as $zeile) {   
   if (strpos($zeile,$Fehlerstring)!==FALSE) {      // FALSE hieße nicht gefunden       
   $ausgabe[]=$zeile;      
   //print_r ($ausgabe);      
   $Fehler=true;   
}   
//else if ($debug) echo "Der Fehlerstring = $Fehlerstring wurde nicht gefunden
";}
//
if ($Fehler==true) {    
   if ($debug) echo "Der Fehlerstring = $Fehlerstring wurde gefunden
";    
   // jetzt sind in $ausgabe alle Zeilen , die dein Wort enthalten    
   for($i=0;$i<count($ausgabe);$i++) {        
   if ($debug) echo $ausgabe[$i]."<br/>";       
   $Text=$Text.$ausgabe[$i]."<br/>";    }        
   if ($debug) echo $Text;    
  //Task beenden    
   exec("taskkill /IM node.exe /f");    
   $Text2="Task \"Node\" wurde beendet um komplette Behinderung des InternetTraffics durch das Landroid-Modul zu verhindern (".$_IPS['SELF'].")";    
    if ($debug) echo $Text2;    
    IPS_LogMessage($Name_Kat,$Text2);    
    SMTP_SendMailEx(46286, "MeineMailadresse",$Name_Kat,$Text2);    
    @unlink($Filename_E);    //löscht das File}
else {    
    if ($debug) echo "$Name_Kat Der Fehlerstring = $Fehlerstring wurde nicht gefunden
";          
    IPS_LogMessage($Name_Kat,"Der Fehlerstring = $Fehlerstring wurde nicht gefunden (".$_IPS['SELF'].")");}
//
Ende_Script:
?>

PS: Der Editor war heute zickig - musste Leerzeichen an Stelle meiner Tabs einfügen :banghead:

Ciao
HerbertF

Hallo Jürgen,

eine Frage, wäre es möglich das direkte Anfahren von Zonen in das Modul zu integrieren? Das wäre noch das Tüpfelchen auf dem i.

Kann das hier evtl. weiterhelfen?

Danke schon mal und Grüße

Stephan

@Herbertf, danke für den Code-Schnipsel. Das ist ein guter Ansatz für alle „retry“-Gebeutelten.
@firewire
Habe ich mir angeguckt und kann ich mir vorstellen. Bin allerdings gerade zeitlich sehr angespannt. Wird also noch dauern.

Viele Grüße
Jürgen

Hallo Jürgen,

Habe ich mir angeguckt und kann ich mir vorstellen. Bin allerdings gerade zeitlich sehr angespannt. Wird also noch dauern.

Kein Problem, würde mich freuen wenn es eingebaut wird, wäre eine enorme Verbesserung für mich. Kein Problem, schau einfach wann es bei dir geht, ich warte gespannt ab.
Zeit ist ein knappes Gut, kennt glaub ich jeder.

Grüße
Stephan

Moin,

hat bereits einer der worx-Nutzer einen Code-Schnipsel zur Aufbereitung des Zeitplans erstellt und mag den teilen?

Kleine Ergänzung für Mitleser, ich möchte den folgenden String aufbereiten, die üblichen JSON oder Array Funktionen klappen noch nicht und wirkliches String-Gefummel wollte ich eigentlich vermeiden.

[["00:00",0,0],["10:00",300,1],["11:00",300,0],["10:00",300,1],["11:00",300,0],["10:00",300,1],["00:00",0,0]]

Zweites Update:
Kugel zwischen den Ohren genutzt und mal richtig mit json_decode probiert, schon kommt etwas sinnvolles raus.

Dann kann ich da mal ein bisschen HTML erzeugen :).

Es müssen die beiden IDs angepasst werden und ein Ereignis auf die Änderung des Zeitplans ergänzt werden.

Update: Und es sollte noch ein zyklisches Ereignis zugefügt werden, der Zeitplan wird nur bei Änderungen aktualisiert und ohne Ereignis wird die Tageshervorhebung nicht aktualisiert :rolleyes:.

<?php

$input = GetValue(26791); // Zeitplan
$array = json_decode($input);

$tage = array( 
0 => "Sonntag", 
1 => "Montag", 
2 => "Dientag", 
3 => "Mittwoch", 
4 => "Donnerstag", 
5 => "Freitag", 
6 => "Samstag");

function boolStringKante($bValue = false) {                      // returns string
  return ($bValue ? 'ein' : '');
}

$header ='
<html>
<head>
<style type="text/css" media="screen">
body {	background:black; 
        color:white; 
        font-family: Arial;
} 
table {
  border-collapse: collapse;
}
table.liste { 	width: 99%; hight: 100%;
                border-collapse: true;
                font-size: 1em; 
} 
table.liste td { 
    border: 1px solid white; 			
} 
table.liste th { border: 1px solid white; }		
</style>
</head>
<body>';
$header.='<table border = "0" class="liste"><tr align="left">';
$header.='<th width=120>Tag</th>';
$header.='<th width=80>Startzeit</th>';
$header.='<th width=200>Dauer [Minuten]</th>';
$header.='<th>Kantenschnitt</th></tr>';
$lines = '';
$footer = '</table>
</body>
</html>';

for ($i = 0; $i < (sizeof($array)); $i++) {
    if (!($array[$i][0] =="00:00")) {
        if ($i == date("w"))
            $lines .='<tr align="left" style="background-color:green;"><td height=30>'.$tage[$i].'</td>';
        else
            $lines .='<tr align="left"><td height=30>'.$tage[$i].'</td>';
        $lines .='<td>'.$array[$i][0].'</td>';
        $lines .='<td>'.$array[$i][1].'</td>';
        $lines .='<td>'.boolStringKante($array[$i][2]).'</td></tr>'."
";
    }
}
$content = $header . $lines . $footer;

SetValueString(22787, $content);

Hallo Ralf,

danke fürs Veröffentlichen, werde ich mir heute mal ansehen.

Grüße
Stephan

Hallo zusammen,

ich wollte auch mal weg von dem Windows Tool und auf die Pi variante wechseln,
Nur leider bekomme ich die Bridge nicht zum Laufen. Ich bekomme beim Starten eine Fehlermeldung.

Die Installation und das starten sieht unter Putty wie folgt aus:

root@raspberrypi:/home/pi/landroid-bridge# nodejs -v
v11.15.0

root@raspberrypi:/home/pi/landroid-bridge# git clone https://github.com/nefiertsrebliS/landroid-bridge.git
Klone nach 'landroid-bridge' ...
remote: Enumerating objects: 567, done.
remote: Total 567 (delta 0), reused 0 (delta 0), pack-reused 567
Empfange Objekte: 100% (567/567), 378.79 KiB | 0 bytes/s, Fertig.
Löse Unterschiede auf: 100% (369/369), Fertig.
root@raspberrypi:/home/pi/landroid-bridge# npm install
npm WARN landroid-bridge@0.1.0 No repository field.
npm WARN optional SKIPPING OPTIONAL DEPENDENCY: fsevents@1.2.13 (node_modules/fsevents):
npm WARN notsup SKIPPING OPTIONAL DEPENDENCY: Unsupported platform for fsevents@1.2.13: wanted {"os":"darwin","arch":"any"} (current: {"os":"linux","arch":"arm"})

audited 539 packages in 21.358s
found 0 vulnerabilities

root@raspberrypi:/home/pi/landroid-bridge# npm run grunt

> landroid-bridge@0.1.0 grunt /home/pi/landroid-bridge
> grunt

Running "tslint:files" (tslint) task
>> 6 files lint free.

Running "ts:app" (ts) task
Compiling...
Cleared fast compile cache for target: app
Using tsc v3.9.5
>> Warning: created src/.baseDir.ts file because `outDir` was specified in the Gruntfile ts `options`, but not `rootDir`.  Add `rootDir`  under the task or target `options` object to fix this warning.


TypeScript compilation complete: 24.48s for 7 TypeScript files.

Done.

root@raspberrypi:/home/pi/landroid-bridge# node dist/server.js
[2020-06-05T21:42:47.216] [INFO] server.ts - Starting Landroid Bridge...
[2020-06-05T21:42:47.611] [INFO] Mqtt - Connecting to MQTT Broker...
[2020-06-05T21:42:47.651] [INFO] LandroidS - Initializing Landroid Cloud Service...
[2020-06-05T21:42:48.484] [WARN] IoBrokerAdapter - Warning Buffer function  is empty, try new Buffer
[2020-06-05T21:42:48.486] [ERROR] App - Unhandled exception: TypeError [ERR_INVALID_ARG_TYPE]: The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type undefined
^C[2020-06-05T21:43:06.647] [INFO] App - Received exit signal...

Kann damit einer etwas anfangen und mir sagen was bei mir falsch läuft?

Vielen Dank schon mal für eure Unterstützung im Voraus

Gruß Stephan

Hallo Stephan,

den Fehler kenne ich leider nicht. Welche Debian-Version nutzt Du auf Deinem Raspi? Buster? Buster ist getestet und sollte funktionieren. Zu anderen Versionen kann ich nichts sagen. Die habe ich nicht probiert.

Viele Grüße
Jürgen

Hallo Jürgen,

vielen Dank für deine Antwort.
Muste feststellen das ich nicht wirklich regestiert habe das mit dem IPS Versions 5.1 auf 5.2 auf Buster umgestellt wurde:banghead:
Ich bin mit er IPS Version 5.4 noch auf einem Stretch System unterwegs.

Stelle jetzt erst mal das system um. Hoffe das geht einigermaßen.

Melde mich wieder ob es dann geht.

Gruß Stephan

Hallo Jürgen,

vielen Dank für deinen Hinweis.
Nach dem ich das System von Stretch auf Buster umgestellt hatte war der Fehler leider immer noch nicht weg.
Erst nach dem ich das Passwort neu gesetzt hatte läuft jetzt zu mindest die Brige

root@Symcon:/home/pi/landroid-bridge# node dist/server.js
[2020-06-07T13:34:46.283] [INFO] server.ts - Starting Landroid Bridge...
[2020-06-07T13:34:46.606] [INFO] Mqtt - Connecting to MQTT Broker...
[2020-06-07T13:34:46.633] [INFO] LandroidS - Initializing Landroid Cloud Service...
[2020-06-07T13:34:46.775] [INFO] Mqtt - Successfully connected to MQTT Broker!
[2020-06-07T13:34:48.345] [INFO] IoBrokerAdapter - mower 0 selected
[2020-06-07T13:34:49.019] [INFO] Mqtt - Publishing MQTT message to topic landroid/: {"cfg":{"id":1,"lg":"it","tm":"13:34:46","dt":"07/06/2020","sc":{"m":1,"p":0,"d":[["17:00",120,1],["00:00",0,1],["17:00",120,1],["15:00",240,0],["00:00",0,1],["00:00",0,1],["17:00",150,1]]},"cmd":0,"mz":[0,0,0,0],"mzv":[0,0,0,0,0,0,0,0,0,0],"rd":240,"sn":"20173019091200207512"},"dat":{"mac":"F0FE6B83398C","fw":3.52,"bt":{"t":18.9,"v":19.31,"p":100,"nr":2347,"c":0,"m":1},"dmp":[0,0.3,74],"st":{"b":28588,"d":512572,"wt":30721},"ls":1,"le":0,"lz":0,"rsi":-57,"lk":0}}
[2020-06-07T13:34:49.021] [INFO] LandroidS - First cloud update received, finishing initialization

Jetzt habe ich aber noch ein Problem mit der Verbindung nach Symcon. Wenn ich den MQTT Server in Symcon auf Port 1883 stelle
bekomme ich die Fehlermeldung

07.06.2020, 13:10:44 | Event Control | Wiederverbinden [Server Socket (MQTT Server #54870)] fehlgeschlagen = bind: Die Adresse wird bereits verwendet

Finde aber keine Weitere Verbindung wo ich den Port 1883 benutz habe.
Hast du hier für mich noch einen Tipp.

Gruß Stephan

Hallo Stephan,

hast Du vielleicht die Landroid-Bridge und IPS auf dem gleichen Raspi? Wenn ja, dann probiere mal den Symcon-MQTT-Port zu öffnen, solange die Landroid-Bridge nicht läuft. Verschwindet der Fehler dann?

Viele Grüße
Jürgen

Hallo Jürgen,

es läuft. Nach langen suchen ist mir aufgefallen das auf dem PI ein ein Dienst mit dem Namen „mosquitto“ aktiv war. Bei dem Update ist irgenwie ein MQTT Server mit installiert. Nach der Deinstalation des PI MQTT Servers konnte ich den IPS ohne probleme die Server starten.

Jetzt läuft alles wie es soll.

Vielen Dank für dein Modul und deine Tipps.

Gruß Stephan

Ich denke ich habe dasselbe Problem. Habe meinen Neuen Worx installiert und die die Kommunikation über die App ist möglich (Starten, Stoppen etc.).
Auf dem Raspberry habe ich dei bridge installiert und in IPS 5.4 das Modul aus dem Store.

Rufe ich die debug Fenster von der Landroid Instanz in der IPS Console sowie vom MQTT Server auf und führe dann den Befehl

WRX_Status(28271 /*[MQTT Landroid]*/);

aus, erscheinen in den Debug Fenstern die Meldungen das was rein und herausgeht. Aber über Putty am Raspbery erscheint nach dem starten von

node dist/server.js

immer nur:

Das Feld topic in der config.json muss also denselben Namen haben wie ich dem Robbi in der App gegeben habe?

Ich tippe mal auf

„url“: „mqtt://SymconServer“,

ist in deiner config falsch ;).

Hallo Ralf,

ich habe jetzt von „localhost“ auf „IP vom Raspberry“ umgestellt. Leider keine Änderung am Fehlerbild.

BTW muss ich nach jeder Änderung am json.conf die Befehle:


sudo service landroid-bridge stop
sudo service landroid-bridge start

ausführen? Habs zwar gemacht, wollte aber noch wissen, ob es überhaupt notwendig ist :wink:

PS.: Ich habe gerade festgestellt, dass die App doch nicht mehr funktioniert. Kann das auch irgendwas mit den Einstellungen zu tun haben?