[Tuto] Worx : landroid et la nouvelle application

Vous avez créé un script LUA dont vous êtes fier, un .sh génial, un programme Python hors du commun, un Tuto, c'est ici que vous pouvez les partager.
macben
Messages : 59
Inscription : 18 mars 2015, 09:41

[Tuto] Worx : landroid et la nouvelle application

Message par macben »

Bonjour,

Worx produits des robots tondeuses connectés (le mien un M). L'avantage est de pouvoir le piloter depuis une application "Worx Landroid", or cela a ses limites.

Dans mes scénarios idéaux, il y aurait : lundi il a plut donc le robot n'a pas tondu (je ne le fais pas tondre sous la pluie) ! Or la pelouse a poussé, je voudrais donc que le mardi il tourne un petit peu plus que la programmation horaire le prévois.

Pour cela il faut : récupérer les informations sur le temps de tonte, et pouvoir déclencher automatiquement le robot depuis domoticz.

Pour l'instant la technique est encore artisanale, et de bonnes connaissances en shell / lua et api domoticz sont nécessaires pour la mettre en place mais le plus difficile est fait. Je mets donc ici les premiers éléments permettant à chacun de se construire sa propre solution.

Depuis un Linux.
Landroid M version firmware 5.18

Variables à remplacer :
  • <login_application_LANDROID>
    <password_application_LANDROID>
    <numero_de_serie_ROBOT>
Outils :
  • curl
    jq
    openssl
    mosquitto (Attention sur raspberry si la version est wheezy 7, la version de mosquitto est trop ancienne, il faut une version 1.5.8.)
Connexion api api.worxlandroid.com pour récupérer les infos :

DEBUT MODIFICATION 10/10/2022 (merci à lacha007)

La partie en rouge écrite tout petit est juste pour "archive", cette méthode ne fonctionne plus suite à mise à jour de l'application.

TOKEN=$(curl -v -X POST -d '{"client_id": 1, "grant_type": "password", "scope": "*", "client_secret": "nCH3A0WvMYn66vGorjSrnGZ2YtjQWDiCvjg7jNxK", "username": "<login_application_LANDROID>", "password":"<password_application_LANDROID>"}' -H 'Content-Type: application/json' https://api.worxlandroid.com/api/v2/oauth/token | jq -r '.access_token')
curl -X GET -H 'Accept: application/json' -H 'Content-Type: application/json' -H "Authorization: Bearer $TOKEN" https://api.worxlandroid.com/api/v2/product-items
curl -X GET -H 'Accept: application/json' -H 'Content-Type: application/json' -H "Authorization: Bearer $TOKEN" https://api.worxlandroid.com/api/v2/pro ... OT>/status


Suite à une évolution de l'application il faut désormais mettre :

Code : Tout sélectionner

TOKEN=$(curl -v -X POST -d '{"client_id": "150da4d2-bb44-433b-9429-3773adc70a2a", "grant_type": "password", "scope": "*", "client_secret": "nCH3A0WvMYn66vGorjSrnGZ2YtjQWDiCvjg7jNxK", "username": "<login_application_LANDROID>", "password":"<password_application_LANDROID>"}' -H 'Content-Type: application/json' https://id.eu.worx.com/oauth/token | jq -r '.access_token')
curl -X GET -H 'Accept: application/json' -H 'Content-Type: application/json' -H "Authorization: Bearer $TOKEN" https://api.worxlandroid.com/api/v2/product-items
curl -X GET -H 'Accept: application/json' -H 'Content-Type: application/json' -H "Authorization: Bearer $TOKEN" https://api.worxlandroid.com/api/v2/product-items/<numero_de_serie_ROBOT>?status=1
FIN MODIFICATION 10/10/2022

Récupération du certificat pour se connecter au mqtt :

Code : Tout sélectionner

curl -X GET -H 'Accept: application/json' -H 'Content-Type: application/json' -H "Authorization: Bearer $TOKEN" https://api.worxlandroid.com/api/v2/users/certificate | jq -r '.pkcs12' | base64 --decode > certif.p12

Code : Tout sélectionner

openssl pkcs12 -in certif.p12 -nocerts -nodes -out key.pem
(à la demande du mot de passe faire entrer pour mot de passe vide)

Code : Tout sélectionner

openssl pkcs12 -in certif.p12 -clcerts -nokeys -out certificate.pem
(à la demande du mot de passe faire entrer pour mot de passe vide)

Récupérer le certificat CA amazon :

Code : Tout sélectionner

curl -O https://www.amazontrust.com/repository/AmazonRootCA1.pem
Récupérer le nom du topic pour faire l'envoi des msg mqtt :

Code : Tout sélectionner

curl -X GET -H 'Accept: application/json' -H 'Content-Type: application/json' -H "Authorization: Bearer $TOKEN" https://api.worxlandroid.com/api/v2/product-items | jq ".[] | {id: .id, command_in: .mqtt_topics }"
La valeur Correspondra au paramètre "-t" des commandes ci-dessous ex : -t 'DB505/0023A7E5G3CB/commandOut'

Souscrire à la queue mqtt :

Code : Tout sélectionner

mosquitto_sub -d --cert certificate.pem --key key.pem --cafile AmazonRootCA1.pem -h a1optpg91s0ydf-ats.iot.eu-west-1.amazonaws.com -p 8883 -t 'DB505/0023A7E5G3CB/commandOut'  --id android-123456
Arrêter la tondeuse :

Code : Tout sélectionner

mosquitto_pub -d --cert certificate.pem --key key.pem --cafile AmazonRootCA1.pem -h a1optpg91s0ydf-ats.iot.eu-west-1.amazonaws.com -p 8883 -t 'DB505/0023A7E5G3CB/commandIn' -m '{"cmd": 2}' --id android-123456
Lancer la tondeuse :

Code : Tout sélectionner

mosquitto_pub -d --cert certificate.pem --key key.pem --cafile AmazonRootCA1.pem -h a1optpg91s0ydf-ats.iot.eu-west-1.amazonaws.com -p 8883 -t 'DB505/0023A7E5G3CB/commandIn' -m '{"cmd": 1}' --id android-123456
Rentrer la tondeuse :

Code : Tout sélectionner

mosquitto_pub -d --cert certificate.pem --key key.pem --cafile AmazonRootCA1.pem -h a1optpg91s0ydf-ats.iot.eu-west-1.amazonaws.com -p 8883 -t 'DB505/0023A7E5G3CB/commandIn' -m '{"cmd": 3}' --id android-123456
Puis depuis domoticz avec le matériel virtual dummy, j'ai créé des capteurs (compteurs) que je mets à jour depuis un script shell :

(bien sûr les idx des capteurs sont à remplacer)

Code : Tout sélectionner

#!/bin/sh

TOKEN=$(curl -v -X POST -d '{"client_id": "150da4d2-bb44-433b-9429-3773adc70a2a", "grant_type": "password", "scope": "*", "client_secret": "nCH3A0WvMYn66vGorjSrnGZ2YtjQWDiCvjg7jNxK", "username": "<login_application_LANDROID>", "password":"<password_application_LANDROID>"}' -H 'Content-Type: application/json' https://id.eu.worx.com/oauth/token | jq -r '.access_token')

curl -X GET -H 'Accept: application/json' -H 'Content-Type: application/json' -H "Authorization: Bearer $TOKEN" https://api.worxlandroid.com/api/v2/product-items > /home/pi/domoticz/scripts/shell/worx_curl1.json

DISTANCE_COVERED=`cat /home/pi/domoticz/scripts/shell/worx_curl1.json | jq '.[].distance_covered'`
echo "EXEC"
exec="http://127.0.0.1:8080/json.htm?type=command&param=udevice&idx=3299&svalue=${DISTANCE_COVERED}"
echo $exec
curl $exec

MOWER_WORK_TIME=`cat /home/pi/domoticz/scripts/shell/worx_curl1.json | jq '.[].mower_work_time'`
echo "EXEC"
exec="http://127.0.0.1:8080/json.htm?type=command&param=udevice&idx=3300&svalue=${MOWER_WORK_TIME}"
echo $exec
curl $exec

BLADE_WORK_TIME=`cat /home/pi/domoticz/scripts/shell/worx_curl1.json | jq '.[].blade_work_time'`
echo "EXEC"
exec="http://127.0.0.1:8080/json.htm?type=command&param=udevice&idx=3301&svalue=${BLADE_WORK_TIME}"
echo $exec
curl $exec

BATTERY_CHARGE_CYCLES=`cat /home/pi/domoticz/scripts/shell/worx_curl1.json | jq '.[].battery_charge_cycles'`
echo "EXEC"
exec="http://127.0.0.1:8080/json.htm?type=command&param=udevice&idx=3302&svalue=${BATTERY_CHARGE_CYCLES}"
echo $exec
curl $exec

curl -X GET -H 'Accept: application/json' -H 'Content-Type: application/json' -H "Authorization: Bearer $TOKEN" https://api.worxlandroid.com/api/v2/product-items/201830173205000071DB?status=1 > /home/pi/domoticz/scripts/shell/worx_curl2.json

POURCENTAGEBATTERIE=`cat /home/pi/domoticz/scripts/shell/worx_curl2.json | jq .last_status.payload.dat.bt.p`
echo "EXEC"
exec="http://127.0.0.1:8080/json.htm?type=command&param=udevice&idx=3298&svalue=${POURCENTAGEBATTERIE}"
echo $exec
curl $exec
Pour l'instant je n'ai fait que la remontée d'informations, je ne déclenche pas encore automatiquement le robot. Je réfléchis aux scénarios et je stabilise la solution.

Remerciements particuliers à un ami qui a réalisé toute la partie permettant la connectivité aux robot.
Dernière modification par macben le 10 oct. 2022, 11:12, modifié 6 fois.
Koala45
Messages : 46
Inscription : 28 mai 2015, 19:54

Re: Worx : landroid et la nouvelle application

Message par Koala45 »

Hello,
Merci beaucoup d'avoir partagé ces scripts, je vais enfin de nouveau pouvoir avoir les infos de mon robot Worx (2017) sur mon domoticz :)
(J'ai pas encore testé la partie d'envoi de commandes)
yellowsky1
Messages : 7
Inscription : 25 juin 2019, 11:59

Re: Worx : landroid et la nouvelle application

Message par yellowsky1 »

Petit ajout, il est possible de modifier les horaires avec la commande:

Code : Tout sélectionner

mosquitto_pub -d --cert certificate.pem --key key.pem --cafile AmazonRootCA1.pem -h a1optpg91s0ydf-ats.iot.eu-west-1.amazonaws.com -p 8883 -t 'PRM100/AMODIFIER/commandIn' -m '{"sc":{"d":[["11:00",120,0],["11:00",240,0],["09:00",0,0],["11:00",120,0],["11:00",300,0],["09:00",0,0],["09:00",0,0]]}}' --id android-123456
En gros les trois chiffres correspondent à :
- l'heure de début
- la durée (en minutes, je n'ai pas testé avec d'autres valeurs que des multiples de 60)
- le fait de fait les bords ou non

Attention que la première série de chiffres correspond au dimanche, puis lundi, mardi,...

Reste plus qu'à implémenter un capteur d'humidité de pelouse et il sera possible de la faire tourner uniquement lorsque le sol est sec (pour améliorer la coupe) et lorsque le soleil ne tape pas (pour limiter les éventuels dommages sur la batterie)
tektek
Messages : 2
Inscription : 08 oct. 2018, 13:45

Re: Worx : landroid et la nouvelle application

Message par tektek »

Salut,

Pour compléter, j'ai rajouté la ligne suivante à ton script:

Code : Tout sélectionner

curl -X GET -H 'Accept: application/json' -H 'Content-Type: application/json' -H "Authorization: Bearer $TOKEN" https://api.worxlandroid.com/api/v2/product-items/xx/status > /home/pi/domoticz/scripts/shell/worx_curl2.json
Cela m'a permis d'avoir un second fichier dans lequel je retrouve la configuration de mon robot:

Code : Tout sélectionner

{"cfg":{"id":0,"lg":"it","tm":"22:09:30","dt":"12\/07\/2019","sc":{"m":1,"p":0,"d":[["00:00",0,0],["10:00",210,1],["10:00",150,0],["10:00",150,0],["10:00",210,0],["10:00",210,1],["00:00",0,0]]},"cmd":0,"mz":[14,51,75,0],"mzv":[0,1,2,0,1,2,1,1,1,1],"rd":0,"sn":"xx"},"dat":{"mac":"98D863310B32","fw":2.87,"bt":{"t":23.4,"v":19.71,"p":100,"nr":14,"c":0,"m":1},"dmp":[1.4,-3.4,46.8],"st":{"b":1100,"d":19299,"wt":1158,"bl":112},"ls":1,"le":0,"lz":1,"rsi":-66,"lk":1,"act":1,"conn":"wifi"}}
Intéressant car je peux voir les jours de travail, l'état du robot (charge/tonte), etc.

Malheureusement après bon nombre de recherche je ne trouve pas comment extraire ces données. J'ai essayé en recopiant ton code mais cela me renvoie "null".

Code : Tout sélectionner

STATE_STATUS=`cat /home/pi/domoticz/scripts/shell/worx_curl2.json | jq '.[]|."t"'`
As-tu une idée?

Bonne soirée
macben
Messages : 59
Inscription : 18 mars 2015, 09:41

Re: Worx : landroid et la nouvelle application

Message par macben »

Salut

Le format du fichier est du JSON, je t'invite à regarder sur internet comment parcourir du JSON.

Je m'y mets difficilement également...
tektek
Messages : 2
Inscription : 08 oct. 2018, 13:45

Re: Worx : landroid et la nouvelle application

Message par tektek »

Salut et merci pour ta réponse.

Après des essais de grep, awk et autre jq, j'ai trouvé!

Je renseignais .cfg.dat ou rien alors qu'il ne faut pas car c'est .dat tout court. J'ai aussi intégré les états et erreurs.

Voici mon code (peut être pas sur beau mais fonctionnel):

Code : Tout sélectionner

#!/bin/sh
TOKEN=$(curl -v -X POST -d '{"client_id": 1, "grant_type": "password", "scope": "*", "client_secret": "nCH3A0WvMYn66vGorjSrnGZ2YtjQWDiCvjg7jNxK", "username": "XX@XX.XX", "password":"XX"}' -H 'Content-Type: application/json' https://api.worxlandroid.com/api/v2/oauth/token | jq -r '.access_token')

curl -X GET -H 'Accept: application/json' -H 'Content-Type: application/json' -H "Authorization: Bearer $TOKEN" https://api.worxlandroid.com/api/v2/product-items/XX/status > /home/pi/domoticz/scripts/shell/worx_curl2.json
curl -X GET -H 'Accept: application/json' -H 'Content-Type: application/json' -H "Authorization: Bearer $TOKEN" https://api.worxlandroid.com/api/v2/product-items > /home/pi/domoticz/scripts/shell/worx_curl1.json

DISTANCE_COVERED=`cat /home/pi/domoticz/scripts/shell/worx_curl1.json | jq '.[]|.distance_covered'/1000` // divisé par 1000 pour avoir les km, Dummy Custom sensor
echo "EXEC"
exec="http://192.168.1.19:8080/json.htm?type=command&param=udevice&idx=XX&svalue=${DISTANCE_COVERED}"
echo $exec
curl $exec

MOWER_WORKED=`cat /home/pi/domoticz/scripts/shell/worx_curl1.json | jq '.[]|.mower_work_time'/60` // divisé par 60 pour l'avoir en heure, Dummy Custom sensor
echo "EXEC"
exec="http://192.168.1.19:8080/json.htm?type=command&param=udevice&idx=XX&svalue=${MOWER_WORKED}"
echo $exec
curl $exec

BLADE_WORKED=`cat /home/pi/domoticz/scripts/shell/worx_curl1.json | jq '.[]|.blade_work_time'/60` // Idem au dessus
echo "EXEC"
exec="http://192.168.1.19:8080/json.htm?type=command&param=udevice&idx=XX&svalue=${BLADE_WORKED}"
echo $exec
curl $exec

TEMP_BAT=`cat /home/pi/domoticz/scripts/shell/worx_curl2.json | jq .dat.bt."t"` // Température batterie, Dummy Custom sensor
echo "EXEC"
exec="http://192.168.1.19:8080/json.htm?type=command&param=udevice&idx=XX&svalue=${TEMP_BAT}"
echo $exec
curl $exec

NB_CHARGE=`cat /home/pi/domoticz/scripts/shell/worx_curl2.json | jq .dat.bt."nr"` // Nombre de cycles de la batterie
echo "EXEC"
exec="http://192.168.1.19:8080/json.htm?type=command&param=udevice&idx=XX&svalue=${NB_CHARGE}"
echo $exec
curl $exec
TENSION_BAT=`cat /home/pi/domoticz/scripts/shell/worx_curl2.json | jq .dat.bt."v"` // Tension batterie, Dummy Custom sensor
echo "EXEC"
exec="http://192.168.1.19:8080/json.htm?type=command&param=udevice&idx=XX&svalue=${TENSION_BAT}"
echo $exec
curl $exec
STATE_STATE=`cat /home/pi/domoticz/scripts/shell/worx_curl2.json | jq '.dat.ls'*10` // Etat batterie, Interrupteur selecteur, la fonction test ne fonctionne pas encore pour le moment, j'ai une coquille quelque part
test STATE_STATE="0" || STATE_STATE=0
test STATE_STATE="1" || STATE_STATE=10
test STATE_STATE="2" || STATE_STATE=20
test STATE_STATE="3" || STATE_STATE=30
test STATE_STATE="4" || STATE_STATE=40
test STATE_STATE="5" || STATE_STATE=50
test STATE_STATE="6" || STATE_STATE=60
test STATE_STATE="7" || STATE_STATE=70
test STATE_STATE="8" || STATE_STATE=80
test STATE_STATE="9" || STATE_STATE=90
test STATE_STATE="10" || STATE_STATE=100
test STATE_STATE="11" || STATE_STATE=110
test STATE_STATE="12" || STATE_STATE=120
test STATE_STATE="30" || STATE_STATE=130
test STATE_STATE="31" || STATE_STATE=140
test STATE_STATE="32" || STATE_STATE=150
echo "EXEC"
exec="http://192.168.1.19:8080/json.htm?type=command&param=udevice&idx=XX&svalue=${STATE_STATE}"
echo $exec
curl $exec
LANDROID_ERROR=`cat /home/pi/domoticz/scripts/shell/worx_curl2.json | jq '.dat.le'*10` // Erreurs Landroid, interrupteur selecteur, *10 pile poil avec Domoticz
echo "EXEC"
exec="http://192.168.1.19:8080/json.htm?type=command&param=udevice&idx=XX&svalue=${LANDROID_ERROR}"
echo $exec
curl $exec
Etat Landroid sur Domoticz:

0 Inactif
10 Maison
20 Démarrage
30 Départ maison
40 Suit le câble
50 Recherche la base
60 Recherche le câble
70 Tonte
80 Soulevée
90 Bloquée
100 Lames bloquées
110 Debug
120 Remote control
130 Retour maison
140 Création zones tonte
150 Coupe la bordure

Erreur Landroid sur Domoticz:

0 RAS
10 Bloquée
20 Soulevée
30 Câble non trouvé
40 En dehors des limites
50 Délai pluie
60 Fermer capot pour tondre
70 Fermer capot pour retour maison
80 Moteur lames bloqué
90 Moteur roues bloqué
100 Timeout après blocage
110 Renversée
120 Batterie faible
130 Câble inversé
140 Erreur charge batterie
150 Delai recherche station dépassé

J'ai aussi mis un lancement automatique au boot et toutes les 5 minutes avec crontab car à la minute j'ai eu un 403 au bout d'un moment.

Les XX a remplacer avec tes valeurs et renseigner l'IP du raspberry car localhost n'allait pas.

Si tu veux essayer, j'aimerai avoir ton retour.

Bonne journée
macben
Messages : 59
Inscription : 18 mars 2015, 09:41

Re: Worx : landroid et la nouvelle application

Message par macben »

yellowsky1 a écrit : 25 juin 2019, 13:53 Petit ajout, il est possible de modifier les horaires avec la commande:

Code : Tout sélectionner

mosquitto_pub -d --cert certificate.pem --key key.pem --cafile AmazonRootCA1.pem -h a1optpg91s0ydf-ats.iot.eu-west-1.amazonaws.com -p 8883 -t 'PRM100/AMODIFIER/commandIn' -m '{"sc":{"d":[["11:00",120,0],["11:00",240,0],["09:00",0,0],["11:00",120,0],["11:00",300,0],["09:00",0,0],["09:00",0,0]]}}' --id android-123456
En gros les trois chiffres correspondent à :
- l'heure de début
- la durée (en minutes, je n'ai pas testé avec d'autres valeurs que des multiples de 60)
- le fait de fait les bords ou non

Attention que la première série de chiffres correspond au dimanche, puis lundi, mardi,...

Reste plus qu'à implémenter un capteur d'humidité de pelouse et il sera possible de la faire tourner uniquement lorsque le sol est sec (pour améliorer la coupe) et lorsque le soleil ne tape pas (pour limiter les éventuels dommages sur la batterie)
TOP ça !!!

Je me suis fait de nouveaux scénarios du coup.
da_Peda
Messages : 6
Inscription : 14 août 2019, 23:17

Re: Worx : landroid et la nouvelle application

Message par da_Peda »

Bonjour,

s'il vous plaît pardonnez ma langue, je suis d'Autriche et j'ai utilisé Goole pour la traduction ...

Je suis en quête de connecter mon Landroid à Domoticz sur ce fil.
J'ai malheureusement déjà mon premier problème avec la première commande du manuel
(TOKEN=$(curl -v -X POST -d '{"client_id": 1, "grant_type": "password",..........)
(23) Échec du corps d'écriture ((23) Failed writing body)
J'ai déjà essayé d'annuler la commande avec SUDO, mais malheureusement, aucun changement.

Je serais très heureux si je pouvais être aidé ici.

Merci beaucoup

Cordialement
Peter
macben
Messages : 59
Inscription : 18 mars 2015, 09:41

Re: Worx : landroid et la nouvelle application

Message par macben »

Bonjour,

Peux-tu nous donner une capture d'écran (screenshot) de tes manipulations ?
da_Peda
Messages : 6
Inscription : 14 août 2019, 23:17

Re: Worx : landroid et la nouvelle application

Message par da_Peda »

Bonjour,

merci pour votre réponse,

Je viens de réinstaller ceci et cela fonctionne maintenant. La tondeuse peut maintenant afficher les valeurs nous Domoticz et peut être démarrée et arrêtée.

Ce qui me manque encore, c’est l’instruction de démarrer la tondeuse avec EdgeCutting.
avec .... {"cmd": 3} '... je m'arrête et avec ... {"cmd": 1}' ... je démarre la tondeuse. puis j'ai testé de cmd: 1 à cmd: 10, mais EdgeCutting ne fonctionnait pas.

N'est-ce pas possible ici?

Merci!
Peter
Répondre