Roborock : Automatiser au maximum avec Jeedom : Partie 3 : Mettre en place l’aspiration par zone dans Jeedom

Publié par [Admin] Bastien le

Suite à l’article concernant le Roborock : https://blog.bastiendeterpigny.fr/mon-retour-sur-laspirateur-robot-le-roborock-s50-v2/ je vous propose un tutoriel pour pouvoir intégrer le Roborock dans Jeedom, pour au final pouvoir contrôler entièrement le Roborock S50 v2 et pouvoir programmer facilement sont utilisation.

A la fin de ce tutoriel vous serez en mesures de lancer votre aspirateur dans une zone définie (cuisine, salle par exemple) depuis un bouton sous Jeedom ou alors directement avec votre voix

Le tutoriel va ce divisé en quatre parties (4 articles pour plus de lisibilité) :

Pré requis

Partie 3 : Mettre en place l’aspiration par zone dans Jeedom:

Je vous préviens d’avance tout de suite, cela va surement vous paraitre complexe surtout si vous découvrez jeedom et le php….

Également je tiens à remercier fortement sarakha63 qui à fait un très beau travail et je ne ferais que reprendre ce qu’il m’as appris, mais je trouve toujours cela intéressant d’avoir une “autre approche” peut être plus détaillés sur certains passages, qui ont pu me bloquer lors de mes nombreuses tentative pour mettre cela en place. Si vous êtes passionner par la domotique et jeedom je vous conseille fortement d’aller voir le site de sarakha63 🙂

Allez c’est parti !!!!

Notre objectif est de mettre en place une solution pour nous permettre de définir des zones bien précises, que nous programmerons par la suite pour déclencher l’aspirateur. mais aussi cela nous permet de pouvoir envoyer notre aspi à un point bien précis , comme l’envoyer vers votre poubelle quand le bac est “plein” !! C’est pas beau ça .???!

  • Nous allons donc dans un premier temps trouver les zones
  • Créer un tableau php qui contient les zones (code)
  • Ensuite pour la V1 ils arrivent parfois que la carte subisse une rotation et nos coordonnées ne sont plus bonnes, une fonction va permettre de gérer en partie cette rotation.
  • Pour la V2 que j’utilise depuis 1 mois aucun soucis de rotation
  • Mettre le tout dans un scénario.

Scénario + Coordonnées

  • Créer un nouveau Scénario dans Jeedom :
    • Outils –> Scénario –> Ajouter
  • Donner un nom à votre scénario, le nom à afficher, groupe etc
  • Une fois la partie Général renseigner et sauvegarder (ne vous occupez par pour le moment de la partie mode du scénar et Evénement) cliquer sur Scénario
  • En haut a droite cliquer sur “ajouter bloc” puis sélectionner “code”
  • Pour définir nos zones nous allons créer un tableau en php par exemple :
// Script de contournement des problèmes de rotations de cartes 
// définition des zones
$coordonnees = array();
$coordonnees['ROBOROCK_ENTREE'][] = "27298,18994,28348,22494,1";

// GO THERE POUBELLES
$coordonnees['ROBOROCK_POUBELLE'][] = "22800,18300";

Comme vous pouvez le voir ci-dessous il nous faut quatre coordonnées pour une zone (x haut , x bas, y haut, y bas) et pour un go there donc un envoi à un point précis uniquement deux coordonnées.

Mais alors comment trouver mes coordonnées ?

Et bien c’est pas si complexe que cela grâce à l’application disponible sous android : FloleVac , une fois l’application installer il faut vous connectez avec vos identifiants Xiaomi.

Attention vous devez être sur le même réseau que votre aspirateur, dans l’interface de FloleVac cliquer sur le menu (les 3 barres en haut a gauche) puis sur carte, une fois la carte apparu créer un zone (Zone nettoyé) puis rester appuyé sur le bouton “Nettoyage”, cela copie les coordonnées que nous recherchons, maintenant vous n’avez plus que à remplir votre tableau php des différentes coordonnées possible.

Si une de vos pièces est composer de plusieurs zones par exemple en T, il voilà comment faire

$coordonnees['ROBOROCK_SALON'][] = "279998,18994,28348,22494,1";
$coordonnees['ROBOROCK_SALON'][] = "27788,18994,28348,22494,1";

Pour info, en faisant cela, nous avons créé une zone [‘ROBOROCK_SALON’][0] et une zone [‘ROBOROCK_SALON’][1]

Vous pouvez également créer un zone contenant plusieurs zones attention ceci est limitée a 5 zones maximum le robot n’accepte pas plus

$coordonnees[‘ROBOROCK_SALLE’][] = $coordonnees[‘ROBOROCK_SALON’][0];

$coordonnees[‘ROBOROCK_SALLE’][] = $coordonnees[‘ROBOROCK_SEJOUR’][0];

Bien entendu votre tableau peut contenir autant de ligne que nécessaire

Une fois votre tableau terminer nous allons passé a la création d’un virtuel

Le Virtuel

Nous créons un virtuel pour pouvoir lire est stocker des variables que nous allons utiliser par la suite. Pour créer un virtuel il vous faut bien attendu le plug-in virtuel de jeedom, plus d’infos sur le virtuel par ici

  • Sous jeedom rendez vous dans plugin –> programmation –> virtuel
  • Ajouter il vous demandera un nom, moi il s’appelle Virtuel_Robot, attention si vous voulez mettre un autre nom certaines ligne des différents script sera à modifier par votre nom
  • Remplir les différents champs et n’oubliez pas de cocher activer et visible
  • Cliquez ensuite sur “Commandes”
  • Nous allons maintenant créer plusieurs commandes, des commandes info et des commandes action, pour créer des commandes info il vous suffit de cliquez sur “Ajouter un info virtuelle” et pour faire des commandes action c’est “Ajouter une commande virtuelle
  • Commandes info :
    • Rotation_map contiendra la valeur de l’angle de rotation de la carte
    • 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)
    • Ordres
    • Les coordonnées de notre zone ou GoThere après avoir fait la rotation
    • Et bonus la surface nettoyée si vous voulez mettre en place l’envoi automatique vers votre poubelle lorsque l’aspirateur est plein ici : Roborock_Surface_Clean
  • Commandes action :
    • 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)
    • Les centre X et Y (en lien avec leur commandes info respectives)

Terminer pour le virtuelle nous allons revenir sur notre scénario et plus précisément dans notre bloc code à la suite de notre tableau php..

Le script dans notre scénario

Nous allons récupérer les infos dans notre virtuel avec le code ci-dessous cela va nous permettre de :

  • Lire le contenu de “Ordre”
  • Lire la valeur X,Y du centre de la carte
  • Lire l’angle de rotation au moment où le scénario ce lance
// Récupération des paramètres stockés dans le virtuel :
// rotation relative de la carte == 0 lors de la création initiale des zones
$cmd = cmd::byString("#[Maison][Virtuel_Robot][Rotation map]#");
$rotation = $cmd->execCmd();
// centre X de la carte :
$cmd = cmd::byString("#[Maison][Virtuel_Robot][centre_x]#");
$centre_x = $cmd->execCmd();
// centre Y de la carte :
$cmd = cmd::byString("#[Maison][Virtuel_Robot][centre_y]#");
$centre_y = $cmd->execCmd();
$centre = array($centre_x,$centre_y); // centre X, Y de la carte (25000,25000)

Attention comme vous pouvez le lire, nous demandons ici à lire le contenu de la variable de notre virtuel [Maison][Virtuel_Robot][Rotation map], si votre virtuel s’appelle autrement il va falloir changer le “chemin”.

Maintenant nous allons rajouter différents fonctions la première sert en cas de rotation de votre carte :

function rotate($x,$y, $angle,$centre) {
  if($angle == 0)
    {
    // ajustement facultatif du centre par défaut en cas de léger déplacement de la base :
    // $x = $x - 80;
    // $y = $y + 80;
    return array($x,$y);
  	}
  	$angle *= M_PI / 180;
 	$xM = $x - $centre[0];
    $yM = $y - $centre[1];
    $x = $xM * cos($angle) + $yM * sin($angle) + $centre[0];
    $y = - $xM * sin($angle) + $yM * cos($angle) + $centre[1];
  	return array(round($x), round($y));
    
}

Cette fonction va recevoir les coordonnées X et Y, puis appliquer l’angle de rotation. Comme vous pouvez le lire deux lignes sont commenter elle vous seront utiles si jamais vous changer de place votre base.

Nous ajoutons une nouvelle fonction qui va :

  • Lire les coordonnées de la zone « $quoi »,
  • Lui appliquer l’angle de rotation (défini dans notre virtuel),
  • En se basant sur les centres X et Y de notre carte,
  • Pour générer les coordonnées après (l’éventuelle) rotation
function generer($coordonnees,$quoi,$rotation,$centre)
     {
     if( count($coordonnees[$quoi])<1 ) return "AUCUN";
     $zonedef=array();
     foreach($coordonnees[$quoi] as $lazone)
     	{ // pour chaque zone
        $zone=explode(',', $lazone);
        $coord=array();
        list( $xa , $ya ) = rotate($zone[0],$zone[1],$rotation,$centre);  // Renvoi position debut array(x,y)
        if( $zone[2] > 0 )
            { // Clean zone
            list( $xb , $yb ) = rotate($zone[2],$zone[3],$rotation,$centre); // renvoi position fin array(x,y)
            if( $xa < $xb )
            	{
                $coord[0] = $xa;
                $coord[1] = 0;
                $coord[2] = $xb;
                }
            else{
                $coord[0] = $xb;
                $coord[1] = 0;
                $coord[2] = $xa;
                }
            if( $ya < $yb )
                {
                $coord[1] = $ya;
                $coord[3] = $yb;
                }
            else{ 
                $coord[1] = $yb;
                $coord[3] = $ya;
                }
            $coord[4]=$zone[4];
            $zonedef[]='['.implode(',',$coord).']';
            }
        else{  // Gothere
            $zonedef[] = $xa . "," . $ya;
            }
        }                      
     return implode(',',$zonedef);
   }

Nous avons maintenant toutes le fonctions utiles mais c’est pas encore fini, le script restant va faire tout le boulot en appelant les fonctions crées :

$cmd = cmd::bystring("#[Maison][Virtuel_Robot][Ordre]#");
$job = $cmd->execCmd(); // contient le nom de la zone ou position demandée (tel que défini dans notre tableau)
                                   
// on génère les coordonnées corrigées :
$newpos = generer($coordonnees,$job,$rotation,$centre);
                                   
// et on sauve ces coordonnées dans notre virtuel (pour qu'ils soient exploitables hors de notre bloc de code)
$cmd = cmd::byString("#[Maison][Virtuel_Robot][coordonnees]#");
$cmd->event($newpos);
                                   
// FIN DU SCRIPT 

C’est maintenant terminer pour le bloc code !!! OUF !!!! Mais il nous reste encore quelque truc à faire…..

Nous allons ajouter les derniers bloc à notre scénario en ajoutant un bloc action

Voilà ce que fais le bloc, il lance l’aspirateur en mode “Clean Zone” au coordonnée fourni par mon virtuel, c’est vraiment hyper simplifié vous pouvez bien entendu rajouter des conditions mais je vous laisse découvrir par vous même.

Maintenant il nous reste à indiquer à notre scénario qu’il ce lancera à chaque fois que la commande info “ordre” de notre virtuel sera modifier, il vous suffit de retourner dans “Général” puis de sectionner à droite dans mode du scénario provoqué comme sur la capture ci-dessous :

Et voilà, maintenant pour lancer il me suffit de rajouter dans mon virtuel autant de commandes action que j’ai de zone dans mon tableau :

Et voilà maintenant sur votre dashboard vous avez les différentes zone et su vous cliquer dessus votre aspirateur ira nettoyer la zone défini

Maintenant si vous voulez automatiser certaines zones il vous suffit de créer un nouveau qui sera programmer et qui contiendra une action avec l’emplacement de votre zone (voir capture ci-dessous)

Dans un prochain article nous approfondirons le scénario et nous mettrons en place l’envoi automatique vers votre poubelle quand l’aspi est plein.


Poster un Commentaire

avatar

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.

  Souscrire  
Me notifier des