Worx Landroid hih über ioBroker und Node Red

Welchen Mäher hast Du? Bei mir ist es ein WR102SI (wurde unter der Bezeichnung Landroid S verkauft). Sollte das wirklich mäherabhängig sein - was ich nicht glauben kann - dann haben wir natürlich die Arsc$%& gezogen. In diesem Fall könnte ich nur den für mein Modell funktionierenden Flow zur Verfügung stellen.

Ich habe den Landroid S WR106SI.
Klar sollten die anders sein - wie es aktuell aber aussieht , muss die Stati halt jeder für sich selbst anpassen.

Ich habe den Status über ein Changenode bewerkstelligt. Jetzt klappt es hier auch…

Nein- ich wechsel die Klingen genau 1x pro Saison bei Inbetriebnahme. Es gibt einen Wert totalBladeTime auch in der Worx App, aber da man den nicht zurücksetzen kann …
Aus oben genannten Gründen bin ich allerdings raus . Wenn überhaupt, dann ist ein Wechsel während der Saison bei schlechtem Schnittbild nötig, aber woran will man das festmachen? Mowingtime?

Na super. Ich hab nen Landroid S WR105SI. Dann decken wir ja zumindest schon mal 3 Varianten ab. :wink:

Den Bedarf zum Wechseln der Klingen sieht man wohl, weil das Gras aussieht, als hätte es Spliss. Ich würde wohl auch über Betriebstunden gehen. Der Counter in der App ist halt der WItz.

:grimacing: :triumph: :rage:

Was denn das ?
Hast du den zu oft abgerufen oder zu oft ne Verbindung aufgebaut ?

Schreib doch den Kundenservice mal an - vielleicht helfen die ja sogar beim Reverse Engineering. :slight_smile:

Erst einmal Danke für die Vorarbeit @chiroptera.
Ich habe den Flow erfolgreich zum Laufen gebracht, und meinen Landroid M500 WR141E angebunden.
Anfangs funktionierten die Schalter in virtuellen Gerät nicht. Ich bin sicherlich kein Node-Red oder JS Pro, aber mir war aufgefallen, dass der Status als String gesendet wird, also habe ich die Abfragefunktion angepasst, danach funktionierte es.

Die Anzeige des Betriebsmodus funktioniert aus meiner Sicht insofern, dass der Schalter 1 „an“ ist, wenn der Landroid sich in irgendeiner Art bewegt (ich habe dazu alle relevanten Stati zusammengefasst), ansonsten „aus“
Im www.roboter-forum.com habe ich ein paar Anregungen zur Regensteuerung geholt. Ich frage einen Homematic Regensensor ab, und setze bei Regen die mowTimeExtend auf -100, somit startet der Landroid erst gar nicht das Mähen, Falls er unterwegs ist, sende ich ihn mit dem State Befehl Stop nachhause. Zusätzlich könnte man noch die Temperatur hinzuziehen.
Es ist sicherlich noch nicht alles perfekt und muss noch ausführlich getestet werden, aber ich bin echt begeistert.
Und zur manuellen Fernsteuerung gibt es immer noch die Landroid App. Übrigens im o.g. Forum gibt es auch eine Desktop App, die ich sehr gelungen finden und auch die baugleichen Landxcape Mäher steuern kann.

Habe jetzt auch die Warnung: (18464) Connection blocked from Worx, please try again in 24h .
Ich denke mal, dass ist ein Throttling in AWS. Habe die letzten Tage zuviel rumgespielt und zeitweise Werte jede Minute an den Landroid gesendet. Damit habe ich wahrscheinlich einen Threshold
Überschritten.
@chiroptera war das Blocking dann nach 24h bei Dir wieder weg?

Ich bin überhaupt noch nicht dazu gekommen zu schauen - wie sieht’s jetzt bei Dir aus?

Bei mir funktionierte auch die App nicht mehr, keinerlei Schreibzugriff auf den Droiden.
Ich habe mir in den diversen IoBroker Foren (wo Du das Problem ja auch gepostet hast) die Antworten angeschaut. Ich deinstallierte den Adapter, aber auch nach 2 Tagen keine Änderung. Dann folgte ich dem Rat, den Landroid übers Worx Web Portal zu entkoppeln und wieder neu anzulernen. Das hatte insofern funktioniert, dass die App (inkl. Desktop App) wieder sauber funktionierten.
Nach Neuinstallation des Adapters in IoBroker kam die Nachricht, dass die AWS Adresse auf Port 443 nicht aufgelöst werden kann (GetAddressInfo Error). Nach ca. 4 Stunden Wartezeit startete ich den Adapter neu und siehe da, es funktioniert wieder :smiley:
So wie es aussieht, wurde der MQTT Zugriff auf den Landroid in der Cloud gesperrt und ein Entsperren nach 24h ist nicht garantiert. Nach dem Ent/Neukoppeln des Mähers wurde das IoT Gerät wohl in AWS gelöscht und neu erstellt, das dauerte einige Zeit.
Ich habe jetzt einige Vorkehrungen getroffen, dass ich nicht wieder unkontrolliert Werte an den Landroid absende. Werde die nächsten Tage alles testen.

Hatte das Problem , als ich homebridge Adapter Landroid nutzen wollte.

War dann auch 48h gesperrt. Habe alle Adapter deaktiviert und auch die App komplett geschlossen und zwar für 48h.

Das Ganze verlängert sich dann wohl immer wieder sobald man drauf zugreifen möchte…

Wartet mal 48h, schließt alle Apps und stoppt die Adapter.
Danach ging’s bei mir wieder .

Hallo @fisch,

Danke für die Info. Wie gesagt, unpair und neu koppeln war für mich die schnellere aber etwas aufwändigere Lösung.
Die automatische Verlängerung des Blocking auch bei Benutzung der regulären App ist schon ziemlich, sagen wir mal, kundenunfreundlich. Zumal die App dann „Landroid ist offline“ meldet. Und den Kundenservice braucht man erst gar nicht anrufen, ewige erfolglose Wartezeiten.
Das Device in Homee funktioniert bei mir soweit gut, aber die fehlende Möglichkeit die Schalter zu benennen nervt, da leider in der iOS App die Benennung via Einheit Nicht angezeigt wird.

Hat eigentlich schonmal jemand darüber nachgedacht, eine Akku Cam auf den Landroid zu installieren, und die dann mit in Homee einzubauen? Somit könnte man sehen, wo der Droid gerade fährt bzw. Sich festgefahren hat.

Ich hab mal an der Landroid Anbindung weiter gearbeitet. Ich lasse mir jetzt über einen Schieberegler den Status anzeigen.
Über einen anderen Schieberegler kann ich die Mähzone setzen. Das hat mich in der App immer schon geärgert, dass die nur über die Prozente beeinflusst aber nicht wirklich ausgewählt werden kann.
Der Schieberegler setzt 1-4 die Areas, indem ich die Startsequenz verändere, also für Auswahl der Zone 3 setze ich „2,2,2,2,2,2,2,2,2,2“ usw. Somit können alle andere Werte unverändert bleiben, und der Droid fährt die gewünschte Zone beim nächsten Mähen an. Setze ich den Schieberegler auf 0 wird die originale Sequenz geschrieben, und die Multizonen werden wieder „automatisch“ ausgewählt. Letzteres setze ich automatisch jede Nacht, um nicht auf der letzten manuell gewählten Zone stehen zu bleiben. Bisher setze ich die Zeiten noch in der Landroid App, könnte man theoretisch auch über weitere Schieberegler setzen. Ich befürchte aber, dann wird das Gerät in Homee langsam unübersichtlich.

Ich musste den Adapter jetzt deaktivieren, da ich immer wieder gesperrt wurde und anschließend den Mähroboter bei Worx immer wieder repairen musste - komisch, dass das scheinbar nur bei mir so ist :face_with_monocle:

Das verstehe ich nicht? Was mußte denn am Mähroboter repariert werden, wenn Dein Account gesperrt wurde?

Nicht „repariert“, sondern „repaired“ :sweat_smile:
Vom Worx Server abmelden und wieder komplett neu anmelden.
Ich beginne allerdings gerade von 0, was meine ioBroker und NodeRed Installation angeht. Bisher war alles Spielkram, aber da nun Rollos dazu gekommen sind, soll das auch ordentlich und dauerhaft funktionieren. Wenn alles andere läuft, dann versuche ich mein Glück noch mal mit dem Mähroboter.

Ah ok @chiroptera , Missverständnis meinerseits.
Seitdem ich eine Logik eingebaut habe, dass ich keine Werte wiederholt schreibe und somit zu häufiges schreiben in die Worx/AWS Cloud vermeide, wurde ich glücklicherweise nicht wieder geblockt.
Mittlerweile habe ich Weichen oder Sperren im BK eingebaut, mit dem ich den Roboter in der jeweiligen Mähzone „einfangen“ kann, und nach dem Mähen auf kürzesten Weg zur LS schicke. Die Mähzone setze ich manuell über das virtuelle Device in Homee, und steuere dann die Sperren je nach Status (über Homematic Schaltaktoren).
Um den Landroid-Status öfters als alle 10 min. zu bekommen, ohne aus Node-Red aktiv abzufragen, verwende ich den Online Datenpunkt des ioBroker Adapters als Trigger.

Ok zugegeben, das wird hier im Forum langsam zum Off-topic. Ich muss zugeben, dass ich mich mittlerweile mehr und länger im Roboter-Forum als hier aufhalte :zipper_mouth_face: (oh weh, Schande über mich :stuck_out_tongue_winking_eye: ).
Aber die Steuerung des Roboters macht echt „süchtig“. :crazy_face:

VG
Möllo

1 „Gefällt mir“

Erzähl uns mehr. :slight_smile:

:coffee:

1 „Gefällt mir“

Ich habe einen Subflow eingefügt, der abhängig von der Temperatur, dem Regen, dem Wait after Rain, dem Status und dem Error Code, den Landroid anweist, ob er losfahren soll oder nicht. Die Anweisung Go/Wait wird nur einmal gegeben, solange sich der Wert nicht ändert.
Der Input kommt von einem Temperatur- und Regensensor, sowie dem Worx Landroid ioBorker Adapter.

[
    {
        "id": "59f4d5e1.fe00ac",
        "type": "subflow",
        "name": "Landroid Control",
        "info": "",
        "category": "",
        "in": [
            {
                "x": 60,
                "y": 360,
                "wires": [
                    {
                        "id": "6d8fcf7c.6c524"
                    }
                ]
            }
        ],
        "out": [
            {
                "x": 1580,
                "y": 220,
                "wires": [
                    {
                        "id": "13f03ec0.bd0e71",
                        "port": 0
                    }
                ]
            },
            {
                "x": 960,
                "y": 180,
                "wires": [
                    {
                        "id": "9fc99c3c.3ab2a",
                        "port": 0
                    }
                ]
            }
        ],
        "env": [],
        "color": "#DDAA99",
        "status": {
            "x": 1340,
            "y": 300,
            "wires": [
                {
                    "id": "e1ca1d1b.aeae5",
                    "port": 1
                }
            ]
        }
    },
    {
        "id": "6d8fcf7c.6c524",
        "type": "switch",
        "z": "59f4d5e1.fe00ac",
        "name": "Input Topics",
        "property": "topic",
        "propertyType": "msg",
        "rules": [
            {
                "t": "eq",
                "v": "rain",
                "vt": "str"
            },
            {
                "t": "eq",
                "v": "temp",
                "vt": "str"
            },
            {
                "t": "eq",
                "v": "status",
                "vt": "str"
            },
            {
                "t": "eq",
                "v": "waittime",
                "vt": "str"
            },
            {
                "t": "eq",
                "v": "error",
                "vt": "str"
            },
            {
                "t": "else"
            }
        ],
        "checkall": "true",
        "repair": false,
        "outputs": 6,
        "x": 190,
        "y": 360,
        "wires": [
            [
                "2a56b507.070cda"
            ],
            [
                "fab5e082.e59d8"
            ],
            [
                "53fbb0fe.b43f9"
            ],
            [
                "766de554.ca110c"
            ],
            [
                "e5eb11d0.cad85"
            ],
            []
        ]
    },
    {
        "id": "d64a5b9c.e0f538",
        "type": "change",
        "z": "59f4d5e1.fe00ac",
        "name": "set rain",
        "rules": [
            {
                "t": "set",
                "p": "rain",
                "pt": "flow",
                "to": "payload.val",
                "tot": "msg"
            }
        ],
        "action": "",
        "property": "",
        "from": "",
        "to": "",
        "reg": false,
        "x": 720,
        "y": 220,
        "wires": [
            [
                "e1ca1d1b.aeae5"
            ]
        ]
    },
    {
        "id": "fab5e082.e59d8",
        "type": "change",
        "z": "59f4d5e1.fe00ac",
        "name": "set temp",
        "rules": [
            {
                "t": "set",
                "p": "temp",
                "pt": "flow",
                "to": "payload",
                "tot": "msg"
            }
        ],
        "action": "",
        "property": "",
        "from": "",
        "to": "",
        "reg": false,
        "x": 720,
        "y": 300,
        "wires": [
            [
                "e1ca1d1b.aeae5"
            ]
        ]
    },
    {
        "id": "53fbb0fe.b43f9",
        "type": "change",
        "z": "59f4d5e1.fe00ac",
        "name": "set status",
        "rules": [
            {
                "t": "set",
                "p": "status",
                "pt": "flow",
                "to": "payload",
                "tot": "msg"
            }
        ],
        "action": "",
        "property": "",
        "from": "",
        "to": "",
        "reg": false,
        "x": 720,
        "y": 340,
        "wires": [
            [
                "e1ca1d1b.aeae5"
            ]
        ]
    },
    {
        "id": "2a56b507.070cda",
        "type": "function",
        "z": "59f4d5e1.fe00ac",
        "name": "Check if rain stopped",
        "func": "let rain = flow.get(\"rain\");\nlet newRain = msg.payload.val;\nlet wait = flow.get(\"wait\");\n\nif(rain === undefined) rain = 0;\nif(wait === undefined) wait = false;\n\nif(rain == 1 && newRain == 0) {\n    var waitMsg = {...msg, reset: true}\n    return [msg, [waitMsg, msg]];\n}\n\nreturn [msg, null];",
        "outputs": 2,
        "noerr": 0,
        "x": 460,
        "y": 220,
        "wires": [
            [
                "d64a5b9c.e0f538"
            ],
            [
                "479ab16b.fa3cf",
                "c1d06dc4.f7375",
                "9fc99c3c.3ab2a"
            ]
        ]
    },
    {
        "id": "c1d06dc4.f7375",
        "type": "change",
        "z": "59f4d5e1.fe00ac",
        "name": "set wait",
        "rules": [
            {
                "t": "set",
                "p": "wait",
                "pt": "flow",
                "to": "true",
                "tot": "bool"
            }
        ],
        "action": "",
        "property": "",
        "from": "",
        "to": "",
        "reg": false,
        "x": 720,
        "y": 260,
        "wires": [
            [
                "e1ca1d1b.aeae5",
                "5385cdee.4ef3c4"
            ]
        ]
    },
    {
        "id": "add27acc.02a138",
        "type": "change",
        "z": "59f4d5e1.fe00ac",
        "name": "set wait",
        "rules": [
            {
                "t": "set",
                "p": "wait",
                "pt": "flow",
                "to": "false",
                "tot": "bool"
            }
        ],
        "action": "",
        "property": "",
        "from": "",
        "to": "",
        "reg": false,
        "x": 1280,
        "y": 420,
        "wires": [
            [
                "e1ca1d1b.aeae5"
            ]
        ]
    },
    {
        "id": "e1ca1d1b.aeae5",
        "type": "function",
        "z": "59f4d5e1.fe00ac",
        "name": "Check if should go",
        "func": "// Get all required flow variables\nvar rain = Number(flow.get(\"rain\"));\nvar temp = Number(flow.get(\"temp\"));\nvar wait = flow.get(\"wait\");\nvar wait_time = flow.get(\"waittime\");\nvar landroid_status = flow.get(\"status\");\nvar landroid_error = flow.get(\"error\");\n\n// Assign default values if undefined\nif(rain === undefined) rain = 0;\nif(temp === undefined) temp = 15;\nif(wait === undefined) wait = false;\n\nvar go = !wait && temp >= 10 && rain == 0;\n\nmsg.topic = \"go\";\nmsg.payload = go;\n\nlet status = `Rain:${Number(rain)} Temp:${temp} Status:${landroid_status} Error:${landroid_error} Go:${Number(go)} Wait:${Number(wait)} Time: ${Number(wait_time)}`;\n\nreturn [msg, {payload: status}];",
        "outputs": 2,
        "noerr": 0,
        "x": 1190,
        "y": 220,
        "wires": [
            [
                "13f03ec0.bd0e71"
            ],
            []
        ]
    },
    {
        "id": "13f03ec0.bd0e71",
        "type": "function",
        "z": "59f4d5e1.fe00ac",
        "name": "Check if should update",
        "func": "// Get required variables\nvar go = msg.payload;\nvar lastGo = flow.get(\"go\");\nvar status = Number(flow.get(\"status\"));\n\n// Update go variable\nflow.set(\"go\", go);\n\n// Set the ouput (if go: 0 else -100)\nmsg.payload = go ? 0 : -100;\n\nif((go != lastGo && status == 1) || (go != lastGo && error == 5)) {\n    return msg;\n}\nelse {\n    return null;\n}",
        "outputs": 1,
        "noerr": 0,
        "x": 1400,
        "y": 220,
        "wires": [
            []
        ]
    },
    {
        "id": "479ab16b.fa3cf",
        "type": "function",
        "z": "59f4d5e1.fe00ac",
        "name": "Log \"Rain Stopped\"",
        "func": "node.warn(\"Rain Stopped\")\nreturn msg;",
        "outputs": 1,
        "noerr": 0,
        "x": 730,
        "y": 500,
        "wires": [
            []
        ]
    },
    {
        "id": "86a0c6c0.76b708",
        "type": "change",
        "z": "59f4d5e1.fe00ac",
        "name": "set waittime",
        "rules": [
            {
                "t": "set",
                "p": "waittime",
                "pt": "flow",
                "to": "payload",
                "tot": "msg"
            }
        ],
        "action": "",
        "property": "",
        "from": "",
        "to": "",
        "reg": false,
        "x": 730,
        "y": 380,
        "wires": [
            [
                "e1ca1d1b.aeae5"
            ]
        ]
    },
    {
        "id": "537c3d6c.b78ad4",
        "type": "delay",
        "z": "59f4d5e1.fe00ac",
        "name": "variable delay",
        "pauseType": "delayv",
        "timeout": "0",
        "timeoutUnits": "minutes",
        "rate": "1",
        "nbRateUnits": "1",
        "rateUnits": "second",
        "randomFirst": "1",
        "randomLast": "5",
        "randomUnits": "seconds",
        "drop": false,
        "x": 1120,
        "y": 420,
        "wires": [
            [
                "add27acc.02a138"
            ]
        ]
    },
    {
        "id": "5385cdee.4ef3c4",
        "type": "change",
        "z": "59f4d5e1.fe00ac",
        "name": "",
        "rules": [
            {
                "t": "set",
                "p": "delay",
                "pt": "msg",
                "to": "waittime",
                "tot": "flow"
            }
        ],
        "action": "",
        "property": "",
        "from": "",
        "to": "",
        "reg": false,
        "x": 940,
        "y": 420,
        "wires": [
            [
                "537c3d6c.b78ad4"
            ]
        ]
    },
    {
        "id": "766de554.ca110c",
        "type": "function",
        "z": "59f4d5e1.fe00ac",
        "name": "Set wait time min to ms",
        "func": "var waittime = Number(msg.payload);\nwaittime = waittime * 60000;\nmsg.payload = waittime;\nreturn msg;",
        "outputs": 1,
        "noerr": 0,
        "x": 530,
        "y": 380,
        "wires": [
            [
                "86a0c6c0.76b708"
            ]
        ]
    },
    {
        "id": "9fc99c3c.3ab2a",
        "type": "function",
        "z": "59f4d5e1.fe00ac",
        "name": "Trigger Wait Time Countdown",
        "func": "var wait_time = flow.get(\"waittime\") / 1000;\nmsg.payload = {payload:\"on\",timeout:wait_time,warning:0}\nreturn msg;",
        "outputs": 1,
        "noerr": 0,
        "x": 790,
        "y": 180,
        "wires": [
            []
        ]
    },
    {
        "id": "e5eb11d0.cad85",
        "type": "change",
        "z": "59f4d5e1.fe00ac",
        "name": "set error",
        "rules": [
            {
                "t": "set",
                "p": "error",
                "pt": "flow",
                "to": "payload",
                "tot": "msg"
            }
        ],
        "action": "",
        "property": "",
        "from": "",
        "to": "",
        "reg": false,
        "x": 720,
        "y": 420,
        "wires": [
            [
                "e1ca1d1b.aeae5"
            ]
        ]
    }
]
4 „Gefällt mir“