aspirateur

 

Et si on pouvait simplement demander (d'un clic ou bien à la voix) à son aspirateur d'aller nettoyer la cuisine, puis d'aspirer le salon ou encore d'aller se placer devant la poubelle pour pouvoir le vider simplement...

C'est ce que vous propose ce tuto...

L’objectif de ce tuto est de mettre en place une solution nous permettant d’envoyer (à partir de Jeedom) notre robot faire le nettoyage d’une zone particulière (ou de plusieurs) mais aussi d’aller se rendre à un point précis (comme par exemple devant la poubelle quand on veut le vider) !

Avant de pouvoir faire tout ça, il y a un certain nombre de difficultés à résoudre à cause de certaines limitations des V1 :

  1. Sur les V1, on ne peut pas mémoriser la carte qui va de temps en temps faire des rotations dont on a aucune maîtrise
  2. Lorsque la carte tourne, toutes nos coordonnées ne sont plus exploitables
  3. Il n’y a aucun outil permettant d’identifier les zones facilement
  4. Le plugin Xiaomi, ne dispose pas nativement (je devrais maintenant dire ne disposait pas) de commandes GotoThere et CleanZone

Concernant les commandes utiles, c’est maintenant déjà réglé, grâce à la réactivité de Ludo (Sarakha63) qui a bien voulu intégrer ces deux nouvelles commandes (indispensables pour exploiter ce tuto sans devoir modifier directement le code du plugin Xiaomi Home) :

nouvelles commandes roborock

si vous ne voyez pas les nouvelles commandes dans Jeedom :
il faut cliquer sur recréer les commandes (en cochant ne pas supprimer les commandes existantes)

1ère étape : Définir les zones de nettoyage

La première des choses à faire maintenant, c’est de définir toutes les zones qui nous intéressent dans un scénario…

Après avoir créé un nouveau scénario, ajoutez un bloc code.

Nous allons créer dans notre bloc Code un petit tableau contenant toutes les zones dont nous pourrions avoir besoin…

Vous pourrez bien-sûr faire évoluer ce tableau par la suite, mais avec un seul impératif :

Toutes les valeurs doivent être définies avec le même angle de rotation, c’est-à-dire un angle égal à zéro lors de la création car nous n’avons pas encore fait de rotation.

Plus tard, quand vous serez confrontés à une rotation de la carte, il faudra juste mettre à jour cette information : le nouvel angle de rotation…


Commençons donc par créer notre tableau PHP avec cette commande :

coderoborock 1

Puis on va pouvoir entrer les coordonnées de chaque zone identifiée selon le format suivant :

$coordonnees['NOM_UNIQUE DE MA ZONE'][] = "Bas_X,Bas_Y,Haut_X,Haut_Y,NbreDePassages";

Exemples :

$coordonnees['R2D2_ENTREE'][] = "27200,29300,29750,30500,1";
$coordonnees['R2D2_CUISINE'][] = "27900,30700,29900,35700,1";
$coordonnees['R2D2_SALON'][] = "26300,24100,29750,29200,1";
$coordonnees['R2D2_SEJOUR'][] = "23400,24100,26150,29200,1";

On peut aussi avoir une zone composée de plusieurs zones (par exemple une zone en L ou en U), dans ce cas, on ajoute la zone supplémentaire sous le même nom :


$coordonnees['R2D2_COULOIR'][] = "26300,30500,27100,31500,1";
$coordonnees['R2D2_COULOIR'][] = "22300,29300,27100,30500,1";


Voici donc une zone nommée 'R2D2_COULOIR' qui contient en fait 2 zones …
Pour info, en faisant cela, nous avons créé une zone ['R2D2_COULOIR'][0] et une zone ['R2D2_COULOIR'][1]


De la même manière, une fois mes zones initiales créées, je vais pouvoir faire de nouvelles zones comportant d’autres zones déjà définies :
Ici une zone contenant deux pièces définies plus haut (vous noterez qu’on indique ici le [0] pour bien avoir l’élément de la zone) :


$coordonnees['R2D2_PIECEDEVIE'][] = $coordonnees['R2D2_SEJOUR'][0];
$coordonnees['R2D2_PIECEDEVIE'][] = $coordonnees['R2D2_SALON'][0];

IMPORTANT : Notez que l'aspirateur ne peut pas enchainer plus de 5 zones dans une seule commande, s'il y en a plus, les autres seront ignorées...

En plus des CleanZone, nous pouvons aussi définir des coordonnées pour envoyer notre robot à un endroit précis avec la commande GoThere.

Dans le cas d'un GoThere, on ne mets que 2 paramètres, la position X,Y de la destination :

$coordonnees['R2D2_POUBELLE'][] ="17100,28900";

Par exemple quand Jeedom me signale que son réservoir est plein (on verra éventuellement comment faire ça plus tard), je l’envoie automatiquement (par commande vocale) se garer devant la poubelle (ce qui m’évite de devoir traverser toutes les pièces avec le bac à poussières) !

 

Passons maintenant à la pratique et créons nos zones !

Pour identifier les coordonnées X,Y de la zone nous connaissons déjà quelques informations :roborock X et Y

  1. Les points identifiant les zones sont toujours définis selon les coordonnées BAS_X, BAS_Y, HAUT_X, HAUT_Y d’un rectangle (ou carré).
     
  2. Le point central théorique de la carte est 25000,25000.
    On verra que ce centre peut légèrement être décalé, mais cela n’a pas d’impact tant que l’on n’a pas fait de rotation de carte (donc on s’en occupera plus tard) …
     
  3. Chaque point recherché se trouve à l’intersection de X et de Y sachant que plus j’augmente X plus je vais vers la droite de la carte, et plus j’augmente Y, plus je vais vers le haut de la carte.
     
  4. En termes d’échelle, 1 mètre équivaut environ à 926 points sur la carte (ou 1000 points représentent environ 108cm)

On va donc rechercher déjà le point (x,y) en bas à gauche du rectangle représentant notre première zone, puis on fera de même avec le point en haut droite…

 

Si on dispose d'un apareil Android, c'est assez facile en installant FloleVac (depuis le PlayStore) :

  1. On définit directement la zone désirée sur l'écran (depuis le menu Carte)
  2. Puis on appuie sur le bouton "Nettoyage"(en bas à droite) pendant deux secondes (et on verra passer un message "copié dans le presse papier" ).
  3. On ouvre n'importe quelle application permettant de coller les coordonnées (par exemple votre application Email) et on fait un "Coller" de notre presse papier.
  4. Il ne reste plus qu'a recopier les coordonnées de la zone dans notre tableau PHP !

 

Si on ne dispose pas d'un apareil Android, Il faut faire cette recherche de manière empirique pour le moment, car je n’ai pas trouvé de solution de récupération de la carte du robot sans devoir le rooter…

Mais pour cela on va pouvoir s’aider de l’application MiHome :

On va rechercher les coordonnées X,Y (inférieur/gauche de la zones) et les saisir dans notre commande GoThere, par exemple 27200, 29300 (les deux valeurs x,y simplement séparées par une virgule).

Puis on clique sur GoThere et simultanément, et on regarde aussitôt sur la carte de notre application mobile pour voir ou tombe notre drapeau (et on peut tout de suite faire pause sur l’appli car il n’est pas utile de faire aller le robot jusque-là, on veut juste identifier la position sur la carte).

Si le drapeau n’est pas bien situé, il suffit d'ajuster ces coordonnées jusqu'à ce que le point (x,y) corresponde bien au bord inférieur gauche de notre zone !

Et on fait de même pour le second point (x,y) en haut à droite…


Ensuite on va vérifier notre zone sur la carte en saisissant dans ZoneClean les 4 valeurs avec des accolades autour, ainsi que la valeur indiquant le nombre de passages que le robot devra faire sur cette zone, sur le modèle :

[BAS X, BAS Y, HAUT X, HAUT Y, Nbre de Passage]

Ce qui pourrait donner par exemple une zone comme ceci :


[27200,29300,29750,30500,1]


roborock creer zone mihome
On valide ensuite pour lancer le ZoneClean et on voit apparaître notre zone sur la carte de l’application mobile afin de vérifier que notre zone est bien comme désirée…


Nous pouvons donc reporter cette zone dans notre tableau PHP :


$coordonnees['R2D2_ENTREE'][] = "27200,29300,29750,30500,1";


… Et on recommence pour définir toutes nos zones !


Donc, à la fin, on se retrouve avec notre tableau qui contient toutes nos « CleanZone », mais aussi éventuellement des « GoThere » (si besoin) :

 code definition zones

Note : vous remarquerez (si vous avez bien suivi depuis le début), que ma dernière zone "R2D2_APPARTEMENT" contient en réalité trop de zones, et qu'en fait seules les 5 premières zones seront traitées par l'aspirateur); c'est parce que je n'ai constaté cette limite du robot qu'après avoir fait ce tuto !

2ème étape : Créer un virtuel et définir les zones de nettoyage

Pour la suite, nous allons avoir besoin de pouvoir lire ou écrire (stoker) quelques informations supplémentaires.

Pour ce faire, on va tout simplement se créer un équipement virtuel (avec le plugin Virtuel bien sûr !) afin de pouvoir facilement intervenir sur ces éléments.


Nous allons avoir besoin de créer les commandes INFO suivantes dans notre Virtuel :

  • Rotation_map contiendra la valeur de l’angle de rotation relative de la carte (égal à 0 lors de la création initiale des zones)
     
  • Le centre X de la carte pour faire notre rotation (par défaut 25000)
     
  • Le centre Y de la carte pour faire notre rotation (par défaut 25000)
     
  • Les coordonnées de notre zone ou GoThere après avoir fait la rotation
     
  • Et optionnellement la surface aspirée depuis la dernière vidange du robot (si on veut être avertit quand le robot est plein) …
     

virtuel commandes info

 

Pendant qu’on y est, et pour se faciliter la vie, on peut aussi en profiter pour créer les commandes ACTION suivantes :

  • Rotation Map qui nous permettra de modifier depuis le dashboard l’angle de rotation de la carte (en lien avec notre commande info rotation_map)
     
  • Et idem pour ajuster si besoin les centre X et Y (en lien avec leur commandes info respectives)
     

virtuel commande action

Ce qui nous donnera sur le Dashboard quelque chose comme ça pour régler facilement le tout sans devoir rentrer dans le code :

virtuel dashboard

 

 

3ème étape : Le script (dans un scénario )

On va pouvoir ainsi récupérer les infos dont nous aurons besoin avec ce petit bout de code dont le rôle sera :

  1. De lire, dans le virtuel, le contenu de « Ordre »,
     
  2. de lire, dans le virtuel, la valeur (X,Y) du centre de la carte,
     
  3. de lire, dans le virtuel, l’angle de rotation au moment où ce lance le scénario...

 

code récuperer info

 

Il ne nous manque plus qu’à ajouter les fonctions utiles dans notre bloc code à commencer par la fonction de rotation  :

code fonction rotation



Cette fonction reçoit en argument les coordonnées X et Y d’une position, l’angle de rotation à appliquer, et la position du centre (x,y), et elle va juste nous retourner un tableau (x,y) de ce point après rotation.


Note : Vous pouvez commenter les lignes 51 et 52 (que j’ai rajouté car j’ai légèrement déplacé mon dock après création des zones)


On va ensuite ajouter une fonction qui va à partir du tableau des coordonnées :

  1. Lire les coordonnées de la zone « $quoi »,
     
  2. Lui appliquer l’angle de rotation (défini dans notre virtuel),
     
  3. En se basant sur les centres X et Y de notre carte,
     
  4. Pour générer les coordonnées après (l’éventuelle) rotation :

code fonction generer

On remarque à partir de la ligne 77, la réorganisation de nos coordonnées pour avoir toujours le bon ordre des valeurs (qui changent après rotation) selon la règle BAS X, BAS Y, HAUT X, HAUT Y …


Nous avons maintenant toutes les fonctions et données nécessaires, pour créer le « Job » qui va utiliser tout ça.


Cette dernière partie est celle qui va faire tout le boulot à chaque appel de ce scénario :

  1. Avec les infos précédemment récupérées dans le virtuel, ce bout de code va maintenant appeler la fonction « générer() » qui se chargera d’appeler la fonction Rotate() ce qui va générer les coordonnées réajusté (après rotation éventuelle)
     
  2. Et, pour finir il va stocker ces nouvelles coordonnées dans la commande INFO « coordonnées » de notre virtuel :

code job



C’est fini pour notre bloc Code !!!

 

4ème étape : Le scénario

Maintenant, ajoutons les derniers blocs à la suite de mon scénario :


Si le scénario est lancé avec ORDRE==SALON, (c’est une zone je lance un CleanZone avec mes coordonnées (qui intègrent les éventuelles rotations de la carte),


Et si le scénario est lancé avec ORDRE==POUBELLE, c’est un GoThere, alors je lance un GoThere, toujours avec mes coordonnées calculées.

Donc mon scénario (à la suite de mon bloc CODE, devrait ressembler à ceci :

bloc scenario

Notez que j’ai simplifié au maximum la fin du scénario, car c’est à vous de vous l’approprier !


Pour finir, il ne me reste plus qu’à indiquer à mon scénario qu’il sera lancé à chaque fois que la commande info « Ordre » (de mon virtuel) sera modifiée :

declenchement scenario

 

Et voilà, pour le lancer, je n’ai plus qu’à rajouter dans mon virtuel autant de commandes ACTION que j’ai de zones (ou positions) dans mon tableau en indiquant en paramètre de l'action le nom de la zone désirée :

action declendeurs

 

J’ai volontairement omis de décrire comment intégrer la gestion du bac de l’aspirateur qu’il faut vider…


D’abord pour ne pas surcharger ce tuto, aussi parce que c’est très facile à implémenter, et qu’ensuite cela fera un bon sujet d’échanges sur le blog de Sarakha63 et sur le forum Jeedom

 

Patrick

Cet article vous a été utile?
Pourcontribuer au développement des plugins et tutos vous pouvez m'encourager : Paypal