Si vous avez trouvé une faute d’orthographe, veuillez nous en informer en sélectionnant le texte en question et en appuyant sur Ctrl + Entrée . (140 caractères max). L’envoi est anonyme.

Dans ce tutoriel, nous allons voir comment gérer les zones pour les aspirateurs robots Xiaomi prise en charge par le plug-in Xiaomi Home de Lunarok et Sarakha63. Ce dernier a d’ailleurs proposé sur son blog un article de Patrick Carl qui a depuis apporté des modifications que je vous invite vivement à regarder.

Si vous utilisez déjà les aspirateurs Mi-Robot ou Roborock de Xiaomi, vous savez déjà ce qu’est le nettoyage par zone. Pour les autres, cela permet de définir des zones de la maison. Ces zones peuvent être des pièces comme la salle de bain ou le salon, mais aussi des zones a proprement parler comme sous la table de la cuisine ou sous la table basse du salon. Nous allons voir comment définir les zones de la maison pour pouvoir démarrer l’aspirateur pour le nettoyage via Jeedom.

Grâce à une carte représentant votre logement, mais aussi grâce à Google Assistant pour utiliser une Google Home ou simplement la commande vocale de votre smartphone.

Création du Virtuel dans Jeedom

Le virtuel contient les commandes pour chacune des zones que vous aurez prédéfinies. Deux commandes, « Base Horizontale » et « Base Verticale » permettent de définir l’emplacement de la base de chargement. Deux commandes « Test Horizontal » et « Test Vertical » permettent de tester l’exactitude des valeurs lors de la création des zones. Une commande « rotation_map » qui permet d’ajuster l’orientation des zones en cas de recréation de la carte dans Mi-Home. 

Zone Aspirateur Robot dans Jeedom
Virtuel Zone Aspirateur Robot (Avant mise en forme)
Zone Aspirateur Robot dans Jeedom
Virtuel Zone Aspirateur Robot (Après mise en forme)
  • Aller dans Plugins/Programmation/Virtuel.
  • Cliquer sur Ajouter.
  • Nommer le virtuel.
    • Exemple : « Zones Aspirateur Robot ».
  • Sélectionner un Objet parent, une Catégorie et cocher Activer & Visible.
  • Sauvegarder.
Virtuel Zone Aspirateur Robot dans Jeedom
Virtuel Zone Aspirateur Robot dans Jeedom

Création des commandes pour les zones.

  • Aller dans l’onglet Commandes.
  • Cliquer sur « Ajouter une commande virtuelle » autant de fois que de zones, plus une.
    • Dans mon cas 10 fois.
  • Nommer les commandes avec le nom de zones « Entrée », « Cuisine », « Salon »… et « Aucune ».
    • Dans Nom information saisir : « Zone ».
    • Dans Sous-Type choisir : « Défaut».
    • Dans Valeur saisir : « le nom de la zone ». Exemple : Entrée.
  • Sauvegarder.
  • Lier la nouvelle commande info « Zone » aux commandes Action.
  • Sélectionner le Sous-Type : « Autre » pour la commande info « Zone ».
  • Sauvegarder.
Virtuel Zone Aspirateur Robot dans Jeedom
Création des Zones

La commande info «Zone», correspond à la zone sélectionnée pour le nettoyage, elle est mise à jour par les commandes actions et permet de déclencher le scénario.

Création des commandes pour la rotation de la carte.

  • Cliquer sur « Ajouter une commande virtuelle ».
  • Nommer la commande « Rotation Map ».
    • Dans Sous-Type choisir : « Curseur ».
    • Dans Nom informationsaisir « rotation_map ».
  • Sauvegarder.
  • Lier la nouvelle commande info « rotation_map » à la commande Action.
    • Sélectionner le Sous-Type : « Numérique ».
    • Dans Unité saisir « ° ».
    • Dans Min Max, saisir « 0 » et « 360 ».
  • Sauvegarder.
Virtuel Zone Aspirateur Robot dans Jeedom
Rotation de la carte

La commande info « rotation-map » correspond à l’angle de rotation de la carte en cas de régénération sur Mi-Home à la suite d’un décalage de la station de recharge ou de la réinitialisation de la carte. La commande action Rotation Map permet de sélectionner l’angle de rotation.

Création des commandes pour le testeur de coordonnées.

  • Cliquer sur « Ajouter une commande virtuelle ».
  • Nommer la commande « Test ».
    • Dans Sous-Type choisir : « Défaut ».
    • Dans Nom information saisir : « Zone ».
    • Dans Valeur saisir : « Test ».
  • Lier la commande à la commande info : « Zone ».
  • Sauvegarder.
  • Cliquer 2 fois sur « Ajouter une commande virtuelle ».
  • Nommer les commandes « Test Horizontal » et « Test Vertical ».
    • Dans Sous-Type choisir : « Message ».
    • Dans Nom information saisir : « TestH» pour Test Horizontal et « TestV » pour Test Vertical.
  • Sauvegarder.
  • Lier les nouvelles commandes infos « TestH et TestV » aux commandes correspondantes.
  • Sélectionner les Sous-Types : « Autre ».
  • Sauvegarder.
Virtuel Zone Aspirateur Robot dans Jeedom
Testeur de coordonnées

La commande action « Test » permet de lancer le scénario pour vérifier les valeurs sur l’application Mi-Home sans que le nettoyage démarre chaque fois, utile pour le paramétrage des zones.

Les commandes action « Test Horizontal » et « Test Vertical » permettent de saisir les valeurs qui seront affichées sur l’application Mi-Home.

Création des commandes pour la base de chargement.

  • Cliquer 2 fois sur « Ajouter une commande virtuelle ».
  • Nommer les commandes « Base Horizontale » et « Base Verticale ».
    • Dans Sous-Type choisir : « Message ».
    • Dans Nom information saisir : « BaseH» pour Test Horizontal et « BaseV » pour Test Vertical.
  • Sauvegarder.
  • Lier les nouvelles commandes infos : « BaseH et BaseV » aux commandes correspondantes.
  • Sélectionner les Sous-Types : « Autre ».
  • Sauvegarder.
Virtuel Zone Aspirateur Robot dans Jeedom
Commandes pour la base de chargement

Les commandes action « Base Horizontale » et « Base Verticale » permettent la saisie des valeurs correspondantes à l’emplacement de la base de rechargement, c’est le point de repère pour le calcul des zones.

Voilà pour le virtuel, pour les commandes « Message » vous pouvez appliquer le widget « Saisie Nombres » que j’ai mis en ligne sur le Market.

Nous verrons plus bas la mise en place de la carte cliquable.

Création du scénario dans Jeedom

Le scénario va contenir des blocs simples, mais aussi des blocs codes pour les fonctions de calcul des zones ou pour le formatage des valeurs envoyées par Google Assistant. Ceux qui ont du mal avec les blocs codes, ne vous inquiétez pas, je vais vous détailler chaque partie. Pour la mise en place de ce tutoriel, je prendrais comme exemple la poubelle pour le nettoyage ciblé et l’entrée pour le nettoyage par zone. J’ai découpé le scénario en plusieurs parties pour que vous puissiez plus facilement vous repérer.

  • Aller dans Outils/Scénarios.
  • Cliquer sur Ajouter.
  • Nommer le scénario « Zone Aspirateur Robot ».
  • Sélectionner un Groupe, Objet parent, une Catégorie et cocher : «Activer» & «Visible».
  • Laisser le Mode de scénario sur « Provoqué ».
  • Cliquer sur « + Déclencher ».
  • Ajouter la commande « Zone » du virtuel « #[Cuisine][Zones Aspirateur Robot][Zone]#».
  • Aller dans l’onglet Scénario.
  • Cliquer sur « + Ajouter Bloc » pour ajouter un nouveau bloc.
  • Sélectionner : « Si/Alors/Sinon ».
  • Enregistrer.

SI #[Appartement][Home Capteurs][Etat_Aspirateur]# == 1 ALORS

  • Ajouter une commande action en cliquant sur « + Ajouter » et « Action ».

Action : #[Cuisine][Mi-Robot 2][Pause]#

Ici, on vérifie si l’aspirateur est en cours d’utilisation. Si c’est le cas, on stoppe l’aspirateur pour qu’il puisse recevoir les nouvelles instructions de nettoyage.

La commande « Etat_Aspirateur » n’est pas disponible dans le plug-in Xiaomi, mais vient d’un virtuel que j’ai créé avec seulement une commande info et qui est mis à jour via un scénario en fonction du statut de l’aspirateur.

Ceci est facultatif, mais beaucoup plus pratique que d’ajouter tous les statuts possibles.

Exemple de scénario pour l’état de l’aspirateur :

SI #[Cuisine][Mi-Robot 2][Statut]# == "En nettoyage" OU #[Cuisine][Mi-Robot 2][Statut]# == "Nettoyage de Zone" OU …
ALORS
Action : event Commande : #[Appartement][Home Capteurs][Etat_Aspirateur]# Valeur : 1
SINON
Action : event Commande : #[Appartement][Home Capteurs][Etat_Aspirateur]# Valeur : 0
Virtuel Zone Aspirateur Robot dans Jeedom
Tableau avec la majorité des statuts des l'aspirateurs robot Xiaomi
  • Cliquer sur « Ajouter Bloc ».
  • Sélectionner « Code ».
  • Enregistrer.

Nous allons maintenant commencer le premier bloc code qui contient les différentes fonctions de calcul.

Fonction pour le nettoyage ciblé

Cette fonction permet de convertir les distances en centimètres que vous aurez mesurées chez vous en coordonnées, utilisés par l’aspirateur pour atteindre la cible à nettoyer.

Pour connaitre sa cible, nous allons fournir à l’aspirateur les coordonnées du point horizontalement et verticalement par rapport à la base de chargement.

Par exemple, je veux que l’aspirateur aille vers la poubelle pour vider le bac à poussières. (Cette bonne idée vient de Sarakha63.)

Je dois donc parcourir 250 cm horizontalement et 200 cm verticalement dans le cas où, le point se situe à droite et en haut de la base de chargement.

Dans le cas où le point se situe à gauche et en haut de la base de chargement, il aurait fallu parcourir – 250 cm horizontalement et 200 cm verticalement.

C’est le même principe si le point se trouve plus bas que la base de chargement il faut parcourir une distance négative. Cette petite gymnastique mentale demande un petit effort au début.

Gauche & Bas = négatif.

Droite & Haut = positif.

function GoThere($H,$V,$baseH,$baseV){
//Point Horizontal.
$H = round($baseH-(($H*1000)/108),0);
//Point Vertical.
$V = round($baseV+(($V*1000)/108),0);
//Résultat de la fonction.
$result =   $H.",".$V;
return $result;
}

La fonction va renvoyer les coordonnées horizontales et verticales du point cible ($H et $V).

Vous allez indiquer la distance en centimètres entre la base de chargement et la cible puis la fonction va faire la conversion en points de coordonnées.

$baseH et $baseV = coordonnées de la base de chargement en centimètres.

$H et $V = coordonnées du point cible.

108 = nombre de centimètres pour 1000 points.

Fonction pour le nettoyage par Zone

Cette fonction a le même but que la précédente sauf cette fois-ci nous aurons besoin de 2 points cible pour générer les zones de nettoyage. Les zones sont représentées sous forme de rectangles, nous allons donc devoir fournir à l’aspirateur un point en bas à gauche et un point en haut à droite pour former ce rectangle.

Par exemple, je veux que l’aspirateur aille nettoyer la zone sous la table de la cuisine (le rectangle rouge). On voit bien que pour le point en bas à gauche la valeur verticale est négative, car, sous la base de chargement.

function CleanZone($Bgx,$BGy,$HDx,$HDy,$baseH,$baseV,$Q) {
//Point Bas Gauche Horizontal.
$Bgx = round($baseH-(($Bgx*1000)/108),0);
//Point Bas Gauche Vertical.
$BGy = round($baseV+(($BGy*1000)/108),0);
//Point Haut Droit Horizontal.
$HDx = round($baseH-(($HDx*1000)/108),0);
//Point Haut Droit Vertical.
$HDy = round($baseV+(($HDy*1000)/108),0);
//Résultat de la fonction.
$result = $Bgx.",".$BGy.",".$HDx.",".$HDy.",".$Q;
return $result;
}
$scénario->setData('Q',1);

La fonction va renvoyer les coordonnées pour le point en bas à gauche et le point en haut à droite de la zone de nettoyage.

Chacun des points aura une valeur Horizontale et une valeur Verticale ce qui fait 4 valeurs pour former le rectangle.

$Bgx = Bas Gauche horizontal.

$BGy = Bas Gauche vertical.

$HDx = Haut Droit horizontal.

$HDy = Haut Droit vertical.

$baseH et $baseV = coordonnées de la base de chargement en centimètres.

$Q = nombre de passage. 

(1 comme valeur par défaut modifiable plus bas si besoin.)

Zone Aspirateur Robot dans Jeedom
Scénario Zone Aspirateur Robot dans Jeedom, les fonctions.

Fonction pour le formatage de la variable Zone

Comme nous l’avons vu plus tôt le scénario est déclenché par la commande zone du virtuel qui renvoie Salon, Cuisine, Table, Poubelle… mais nous pouvons aussi déclencher le scénario via Google Assistant en disant « Ok Google passe l’aspirateur sous la table ». Dans ce cas-là, le scénario ne va pas recevoir « table », comme c’est le cas depuis le virtuel, mais « sous la table ».Cette fonction va donc nous permettre de formater l’information reçue par le scénario lorsqu’il s’agit de Google Assistant en ne gardant que le dernier mot soit « table ».
//On vérifie si le scénario a été provoqué par l’api (HTTP)
$trigger = $scénario->getRealTrigger();
if ($trigger=='api'){
    //On récupère le tag zone
    $cmd = $scénario->getTags();
    $zone = $cmd['#zone#'];
    //On récupère le dernier mot du tag
    $zone=substr($zone,strrpos($zone,' ')+1);
} else {
    //Si ce n’est pas l’api alors on récupère la valeur zone de la commande du virtuel
    $zone = cmd::byString('#[Cuisine][Zones Aspirateur Robot][Zone]#')->execCmd();
}

Pour éviter cela, vous pouvez ajouter un test du genre :

if(stripos($zone,"table")!== FALSE) {
$zone = "table";$scénario->setLog($zone);
} else {
$zone=substr($zone,strrpos($zone,' ')+1);}

Je laisse les plus tatillons faire eux-mêmes le test s’ils ont une table de cuisine et une table basse 🙂

//On met en minuscule
$zone = strtolower($zone);
//On mets à jour la variable zone
$scénario->setData('zone',$zone);
Pour finir le formatage, on met la valeur de la zone en minuscule puis on l’enregistre dans la variable zone.
Zone Aspirateur Robot dans Jeedom
Scénario Zone Aspirateur Robot dans Jeedom, le formatage.

Testeur de coordonnées

Nous arrivons à la fin de ce premier bloc code qui est, je l’avoue, bien chargé. 

Le testeur est déclenché en cliquant sur le bouton « Test » du virtuel. Les valeurs sont à saisir dans les commandes action « Test Horizontal » et « Test Vertical ».

Pour effectuer les tests, pas besoin de créer une nouvelle fonction, nous utiliserons celle que nous venons de créer pour le nettoyage ciblé.

//On vérifie la valeur de la variable zone si elle est bien égale à test.
if ($zone=='test'){
  //On récupère la valeur de rotation
  $cmd = cmd::byString('#[Cuisine][Zones Aspirateur Robot][rotation_map]#');
  $rotation = $cmd->execCmd();
  $rotation *= M_PI/180;

  //On récupère la valeur baseH de la base de recharge saisi dans le virtuel.
  $cmd = cmd::byString('#[Cuisine][Zones Aspirateur Robot][BaseH]#');
  $baseH = $cmd->execCmd(); 

  //On récupère la valeur baseV de la base de recharge saisie dans le virtuel.
  $cmd = cmd::byString('#[Cuisine][Zones Aspirateur Robot][BaseV]#');
  $baseV = $cmd->execCmd();

  //On récupère la valeur TestH saisie dans le virtuel.
  $cmd = cmd::byString('#[Cuisine][Zones Aspirateur Robot][TestH]#');
  $H = $cmd->execCmd();
  $H = $H * cos($rotation) + $V * sin($rotation);

  //On récupère la valeur TestV saisie dans le virtuel.
  $cmd = cmd::byString('#[Cuisine][Zones Aspirateur Robot][TestV]#');
  $V = $cmd->execCmd();
  $V = - $H * sin($rotation) + $V * cos($rotation);

  //On lance la fonction pour le nettoyage ciblé.
  $result = GoThere($H,$V,$baseH,$baseV);
  //On Log le résulta.
  $scénario->setLog($result);

  //On exécute la commande GoThere du plug-in Xiaomi avec les valeurs
  $cmd = cmd::byString('#[Cuisine][Mi-Robot 2][GoThere]#');
  $cmd->execCmd(array('message' => $result));

  //On attend 3 secs et on stop l’aspirateur
  sleep(3);
  $cmd = cmd::byString('#[Cuisine][Mi-Robot 2][Pause]#');
  $cmd->execCmd();
}

Voilà le premier bloc code est fini !

Il ne reste plus qu’a ajouter un test pour stopper le scénario, car la fonction stop() des blocs code ne fonctionne pas.

  • Cliquer sur « Ajouter Bloc ».
  • Sélectionner « Si/Alors/Sinon ».
  • Enregistrer.

SI variable(zone) == "aucune" ou variable(zone) == "test" ALORS

  • Ajouter 1 commande Action en cliquant sur « + Ajouter » et « Action ».

Action : stop

Ce test permet de vérifier si la zone est égale à « aucune » ou à « test », si c’est le cas on Stop le scénario, car on ne veut pas lancer plus d’action.

  • Si la zone est égale à aucune alors l’aspirateur a déjà été mis en pause au début du scénario.
  • Si la zone est égale à test alors l’action a déjà eu lieu dans le bloc code précèdent.

À ce stade, votre scénario est déjà fonctionnel pour la partie testeur de coordonnées, sous réserve que vous ayez rempli les valeurs TestV et TestH ainsi que BaseH et BaseV dans le virtuel.

Zone Aspirateur Robot dans Jeedom
Scénario Zone Aspirateur Robot dans Jeedom, testeur de coordonnées.

Exemple pour un nettoyage ciblé.

Commençons pas créer notre premier nettoyage ciblé.La trame sera la même pour tous les nettoyages ciblés, vous aurez toujours 2 commandes action à créer pour saisir les coordonnées du point cible et un bloc code dans lequel copier un code qui est identique pour toutes les cibles.Nous prendrons la cible « Poubelle » pour l’exemple.
  • Cliquer sur « Ajouter Bloc ».
  • Sélectionner « Si/Alors/Sinon ».
  • Enregistrer.
SI variable(zone) == "poubelle" ALORS
  • Ajouter 2 commandes Action en cliquant 2 fois sur « + Ajouter » et « Action ».
Action : variable
Nom : H
Valeur : distance en cm du point horizontalement

Action : variable
Nom : V
Valeur : distance en cm du point verticalement
Les 2 commandes permettent de saisir les distances en centimètres du point cible.Vous pouvez utiliser le testeur de coordonnées pour trouver le point cible.Rappelez-vous que le point de référence c’est la station de chargement.Dans les cas où le point se situe à droite ou en au-dessus de la base les valeurs sont positives, dans les cas contraires où le point se situe à gauche ou en au-dessous de la base les valeurs sont négatives.
  • Cliquer sur « + Ajouter ».
  • Cliquer sur « Bloc ».
  • Sélectionner « Code ».
  • Enregistrer.
Le bloc code suivant sera le même pour toutes les cibles, il n’y aura rien à modifier il suffira de le copier-coller. Il est très proche de celui utilisé pour les tests que vous pouvez reprendre pour vous simplifier la tâche.
//On récupère la valeur de rotation
$cmd = cmd::byString('#[Cuisine][Zones Aspirateur Robot][rotation_map]#');
$rotation = $cmd->execCmd();
$rotation *= M_PI/180;

//On récupère la valeur baseH de la base de recharge saisie dans le virtuel.
$cmd = cmd::byString('#[Cuisine][Zones Aspirateur Robot][BaseH]#');
$baseH = $cmd->execCmd();

//On récupère la valeur baseV de la base de recharge saisie dans le virtuel.
$cmd = cmd::byString('#[Cuisine][Zones Aspirateur Robot][BaseV]#');
$baseV = $cmd->execCmd();
On récupère la valeur de rotation de la carte puis les coordonnées de la base de rechargement.
//On récupère la valeur de la variable de H
$H = $scénario->getData('H');
$H = $H * cos($rotation) + $V * sin($rotation);
//On récupère la valeur de la variable de V
$V = $scénario->getData('V');
$V = - $H * sin($rotation) + $V * cos($rotation);

Ici on récupère les valeurs que l’on a saisi dans les deux commandes H et V qui correspondent aux coordonnées du point cible en centimètres.

//On lance la fonction GoThere
$result = GoThere($H,$V,$baseH,$baseV);
//On Log
$scénario->setLog($result);

On utilise à présent ces valeurs dans la fonction nettoyage ciblé pour que les distances en centimètres soient converties en point utilisable par l’aspirateur.

Comme nous l’avions fait pour la partie test.

//On exécute la commande GoThere du plugin Xiaomi
$cmd = cmd::byString('#[Cuisine][Mi-Robot 2][GoThere]#');
$cmd->execCmd(array('message' => $result));

Il ne reste plus qu’a exécuter la commande Gothere du plugin Xiaomi avec les valeurs retournées par la fonction nettoyage ciblé.

  • Ajouter 1 commande Action en cliquant sur « + Ajouter » et « Action ».

Action : stop

Pour finir on stop le scénario après l’exécution de la commande.

Zone Aspirateur Robot dans Jeedom
Scénario Zone Aspirateur Robot dans Jeedom, nettoyage ciblé.

Exemple pour un nettoyage de zone.

Maintenant que nous savons envoyer l’aspirateur à un point cible il nous reste à faire les zones de nettoyage.

La trame sera la même pour toutes les zones vous aurez toujours 4 commandes action à créer pour saisir les distances des points bas gauches et haut gauche et un bloc code dans lequel copier un code qui est identique pour toutes les zones.

Nous prendrons la cible « Entrée » pour l’exemple.

  • Cliquer sur « Ajouter Bloc ».
  • Sélectionner « Si/Alors/Sinon ».
  • Enregistrer.

SI variable(zone) == "entrée" ALORS

  • Ajouter 4 commandes Action en cliquant 4 fois sur « + Ajouter » et « Action ».
Action : variable
Nom : BGx
Valeur : distance en cm du point bas gauche horizontalement
Action : variable
Nom : BGy
Valeur : distance en cm du point bas gauche verticalement
Action : variable
Nom : HDx
Valeur : distance en cm du point haut droit horizontalement
Action : variable
Nom : HDy
Valeur : distance en cm du point haut droit verticalement

Les 4 commandes permettent de saisir les distances en centimètres des points hauts et bas.

Vous pouvez utiliser le testeur de coordonnées pour trouver le point cible.

Rappelez-vous que le point de référence c’est la station de chargement.

Dans les cas où le point se situe à droite ou en au-dessus de la base les valeurs sont positives, dans les cas contraires où le point se situe à gauche ou en au-dessous de la base les valeurs sont négatives.

  • Cliquer sur « + Ajouter ».
  • Cliquer sur « Bloc ».
  • Sélectionner « Code ».
  • Enregistrer.

Le bloc code suivant sera le même pour toutes les zones, il n’y aura rien à modifier il suffira de le copier-coller. Il est très proche de celui utilisé pour les tests que vous pouvez reprendre pour vous simplifier la tâche.

//On récupère la valeur de rotation
$cmd = cmd::byString('#[Cuisine][Zones Aspirateur Robot][rotation_map]#');
$rotation = $cmd->execCmd();
$rotation *= M_PI/180;

//On récupère la valeur baseH de la base de recharge saisie dans le virtuel.
$cmd = cmd::byString('#[Cuisine][Zones Aspirateur Robot][BaseH]#');
$baseH = $cmd->execCmd();

//On récupère la valeur baseV de la base de recharge saisie dans le virtuel.
$cmd = cmd::byString('#[Cuisine][Zones Aspirateur Robot][BaseV]#');
$baseV = $cmd->execCmd();

On récupère la valeur de rotation de la carte puis les coordonnées de la base de rechargement.

//On récupère la valeur de la variable Bgx
$Bgx = $scénario->getData('BGx');
$Bgx = $Bgx * cos($rotation) + $Bgy * sin($rotation);
//On récupère la valeur de la variable BGy
$BGy = $scénario->getData('BGy');
$BGy = - $BGx * sin($rotation) + $BGy * cos($rotation);
//On récupère la valeur de la variable HDx
$HDx = $scénario->getData('HDx');
$HDx = $HDx * cos($rotation) + $HDy * sin($rotation);
//On récupère la valeur de la variable HDy
$HDy = $scénario->getData('HDy');
$HDy = - $HDx * sin($rotation) + $HDy * cos($rotation);
Ici, on récupère les valeurs que l’on a saisi dans les quatre commandes Bas Gauche « BG (x,y) » et Haut Droit « HD (x,y) » qui correspondent aux coordonnées en centimètres de la zone.
//On récupère la valeur de la variable Q
$Q = $scénario->getData('Q');
Il faut aussi récupérer la valeur de la variable Q qui correspond au nombre de passages. Nous l’avons enregistrée à 1 dans le premier bloc code.
//On appelle la fonction CleanZone
$result = CleanZone($Bgx, $BGy, $HDx, $HDy,$baseH,$baseV,$Q);
//On log les valeurs 
$scénario->setLog("[".$result."]");

On utilise à présent ces valeurs dans la fonction zone de nettoyage pour que les distances en centimètres soient converties en point utilisable par l’aspirateur.

Comme nous l’avions vu pour le testeur de coordonnés et le nettoyage ciblé.

//On exécute la commande CleanZone
$cmd = cmd::byString('#[Cuisine][Mi-Robot 2][CleanZone]#');
$cmd->execCmd(array('message' => "[".$result."]"));

Il ne reste plus qu’a, exécuter la commande CleanZone du plugin Xiaomi avec les valeurs retournées par la fonction zone de nettoyage.

  • Ajouter 1 commande Action en cliquant sur « + Ajouter » et « Action ».

Action : stop

Pour finir on stoppe le scénario après l’exécution de la commande.

Zone Aspirateur Robot dans Jeedom
Scénario Zone Aspirateur Robot dans Jeedom, nettoyage par zones.

Il ne vous reste plus cas créé d’autre point cible ou zones de nettoyage comme celles-ci.

Nettoyage par zone via Google Home

Maintenant que votre virtuel et votre scénario sont terminés et je l’espère fonctionnel nous allons pouvoir mettre en place la commande vocale pour lancer le nettoyage avec Google Home via IFTTT.

Si ce n’est pas déjà fait, créez un compte sur le site https://ifttt.com.

Une fois connecté :

  • Cliquer sur l’icône « Account » en haut à droite.
  • Sélectionner « Create ».
  • Cliquer sur « + This ».
  • Rechercher « Google » et sélectionner « Google Assistant ».
  • Se connecter au compte Google.
  • Sélectionner « Say a phrase with a text ingredient ».
  • Remplir les 3 premiers champs avec les phrases d’appel.
    • Exemple : « Passe l’aspirateur dans ».
  • Ajouter le signe « $ » à la fin des phrases. Ce signe sera remplacé par la zone.
    • Exemple : « $ = le salon ».
  • Remplir le 4e champ avec la phrase de réponse.
    • Exemple : « Entendu, nettoyage : ».
  • Ajouter le signe « $ » à la fin de la phrase. Ce signe sera remplacé par la zone.
    • Exemple : « $ = le salon ».
  • Sélectionner le langage à « French ».
  • Cliquer sur « Create Trigger ».
  • Cliquer sur « +That ».
  • Rechercher « web » et sélectionner « Webhooks ».
  • Sélectionner « Make a web request ».
  • Dans URL saisir :
    • https://URL_EXTERNE_JEEDOM/core/api/jeeApi.php?apikey=API_JEEDOM&type=scénario&id=NB_SCÉNARIO&action=start&tags=zone%3D »<<<{{TextField}}>>>»
  • Remplacer les 3 valeurs suivantes :
    • URL_EXTERNE_JEEDOM = l’adresse externe de votre Jeedom.
    • API_JEEDOM = l’API de Jeedom qui se trouve dans Configuration, API, Clef API.
    • NB_SCÉNARIO = Le numéro du scénario Zone aspirateur. Il se trouve dans le titre de l’onglet « General ».
  • Sélectionner « GET » dans le champ « Method ».
  • Sélectionner « application/json » dans le champ « Content Type ».
  • Saisir « <<<{{TextField}}>>> » dans le champ « Body ».
  • Cliquer sur « Create Action ».
  • Cliquer sur « Finish ».

Maintenant, lorsque vous dites « Ok Google passe l’aspirateur dans le salon » votre Google home devrait dire « Entendu, nettoyage : dans le salon » puis le scénario devrait se lancer.

Création de la carte cliquable sous Jeedom

On arrive au terme de ce tutoriel qui est, je le conçois, assez long, mais pour les plus téméraires nous allons voir comment créer une carte cliquable directement sur Jeedom.

Le but est d’afficher une carte du logement avec des zones cliquables pour pouvoir lancer le nettoyage. On utilisera l’option « Ajouter une zone » disponible dans le mode Design de Jeedom.

Pour créer la carte, j’ai fait une copie d’écran de la carte générée par l’application Mi-Home puis à l’aide de Photoshop j’ai redessiné les pièces.

  • Créer un nouveau Design.
  • Faire un clic droit puis « Edition ».
  • Faire un clic droit puis « Ajouter une image/caméra ».
  • Faire un clic droit sur l’image puis « Paramètres d’affichage ».
  • Cliquer sur « Envoyer ».
  • Sélectionner la carte du logement.
  • Sauvegarder.
  • Ajuster la taille de la carte.
  • Faire un clic droit puis « Ajouter une zone ».
  • Un petit carré transparent est apparu, l’agrandir et le placer sur la zone de la carte.
  • Faire un clic droit sur la zone puis « Paramètres d’affichage ».
  • Cliquer sur le « + » en face de « Action ».
  • Recommencer pour toutes les zones.

Maintenant, il suffit de cliquer sur les zones pour démarrer le nettoyage dans la zone voulue. Vous pouvez aussi ajouter des commandes depuis le virtuel ou l’équipement Xiaomi en faisant clic droit puis « Ajouter équipement » ou « Ajouter commande ».

Zone Aspirateur Robot dans Jeedom
Virtuel Zone Aspirateur Robot (Après mise en forme)

Voilà j’espère avoir été clair pour ce tutoriel sur le nettoyage par zone dans Jeedom avec commande via Google Home et carte cliquable. Regardez bien les copies d’écrans pour la hiérarchie des blocs et la configuration des différents éléments.

Il y a beaucoup de thèmes abordés dans ce tutoriel que vous pourrez réutiliser pour améliorer Jeedom.

L’utilisation est assez simple en soi.

  • Il faut dans un premier temps remplir les valeurs horizontales et verticales pour la base.
    • Utilisez la fonction de test pour que le drapeau arrive juste sur la base de chargement, c’est la base pour que vos zones soient correctement calculées.
    • Chez moi, je suis à « 25890 » et « 25590 ».
  • Laissez la rotation à « 0° » puis modifiez-la si besoin.
  • Pour chaque cible ou zone de nettoyage, il faudra saisir les valeurs en centimètre dans le scénario.
    • Là encore, je vous conseille d’utiliser la fonction test pour bien positionner vos points et vos zones.
    • Par la suite, si vous voulez modifier les zones ou les points, il suffira d’ajouter ou d’enlever quelques centimètres aux valeurs.

Évidemment, chacun doit adapter le scénario à ses besoins et ses habitudes si vous faites un simple copier-coller du code sans essayer de le comprendre ça ne fonctionnera surement pas.

Si vous avez besoin d’aide ou des questions n’hésitez pas à laisser un commentaire je me ferais un plaisir de vous répondre.

Laisser un commentaire

Ce site est protégé par reCAPTCHA et le GooglePolitique de confidentialité etConditions d'utilisation appliquer.

Cet article a 68 commentaires

  1. Pablo

    Sais-tu si le Roborock S6 est compatible Jeedom?

    1. Guillaume

      Bonjour,
      Je n’ai rien vu a ce sujet.

    2. Mike

      Bonjour,

      Il l’est, mon S6 est interfacé avec Jeedom de la même façon.
      Seule une fonction spécifique n’est pas prise en compte nativement (pour le moment), la fonction « Nettoyage de pièce » qui devrait simplifier énormément les choses, puisqu’on aurait plus qu’à donner un identifiant et plus des coordonnées …

      1. Guillaume

        Super merci pour l’info.

  2. noss

    Super tuto, encore une fois, merci pour tout le travail effectué, quand j’aurai du temps je testerai sûrement ce tuto. Mais avant il faudra que je mette mon aspirateur sur jeedom, chose que je n’est encore pas fait.
    Si on a des idées de scénario peux t’on te demander de l’aide ou pas.

  3. Guillaume

    Bonjour,
    Évidemment il ne faut pas hésiter si je peux aider.
    Pour l’intégration de l’aspirateur il y a un article sur le site.
    Bonne journée.
    Guillaume.

  4. Ikari

    Bonjour Guillaume,
    Super tuto ! Merci bien
    j’ai une question : la première condition de ton scénario, tu écris : SI #[Appartement][Home Capteurs][Etat_Aspirateur]# == 1 ALORS
    je n’ai pas la commande info Etat dans l’aspirateur mais une commande statut, tu utilises au préalable un virtuel Home Capteurs pour avoir cet Etat_Aspirateur ?

    1. Ikari

      Oupss autant pour moi j’ai écrit le commentaire trop vite, je n’avais pas vu la création du virtuel juste après

      1. Guillaume

        Effectivement c’est un virtuel supplémentaire mais rien n’empêche de mettre toutes les conditions dans le scénario.
        N’hésite pas si tu as d’autres questions.

        1. Ikari

          Oui j’en ai une autre : j’ai terminé la configuration des virtuels et du scénario mais ça ne fonctionne pas. D’après le log du scénario, il n’affecte pas la variable zone ([2019-08-04 12:00:42][SCENARIO] Call to a member function setData() on null). Comment puis-je faire pour debugger la partie code du scénario où il affecte la variable ?

          1. Guillaume

            Super, c’est un problème sur la fonction setdata. Il faut regarder dans le testeurs d’expression et sinon on ajouter des log dans le code comme par $scénario->setLog($result).

  5. Michael

    Tout d’abord merci pour cette article, qui es très précis et très bien expliquer.

    Petite question quel est le widget que tu utilise pour la rotation de la map ?

    Merci d’avance

    1. Guillaume

      Merci de suivre mon blog.
      C’est un widget qui est sur le market. J’ai du taper slider. La je suis a la plage du coup je ne peux pas faire la recherche mais si tu ne trouve pas relance moi je te donnerai le lien.

      1. Biarnes64

        Bonjour,
        Je trouve pas ce widget sur le market, il existe toujours?

  6. Jerome

    Merci beaucoup pour ce tuto et tous les autres !
    Faut maintenant que je récupère la carte et que je fasse la carto de la maison.
    Comment est ce que tu récupères les coordonnées de la station ? J’ai lu après des recherches google que c’était 25500,25500 mais je vois que tu as d’autres valeurs (bien que pas très très loin)

    1. Guillaume

      Bonjour et merci de suivre mes tutos.
      Pour avoir les coordonnées exactes de la base de chargement, j’utilise la fonction test que je mets à 0 (horizontal et verticale). Il faut ensuite regarder sur la carte de l’application Mi-home et adapter les valeurs pour que le repaire tombe juste sur la base de chargement.

  7. Biarnes64

    Bonjour et merci pour continuer à nous offrir cette mine d’or qu’est ton site.

    J’ai suivi toutes les instructions mais cela ne fonctionne pas pour le fonction Test et avant d’aller plus loin je cherche à résoudre cela car dur de paramétrer les zones sans ce très astucieux Test.
    En creusant je vois que dans les log du scénario j’ai:
    [2019-09-11 14:47:50][SCENARIO] La commande n’a pas pu être trouvée : #[Cuisine][Aspirateur Robot][GoThere]# => #[Cuisine][Aspirateur Robot][GoThere]#
    Il ne trouve pas la commande GoThere. Et effectivement elle n’existe pas dans les commandes du robot lorsqu’on regarde dans le plugin Xiaomi.
    Ma question est donc : comment la créer?

    Avant de poster j’ai regardé ton tuto pour l’intégration du robot ce qui ressemble à ce que j’avais fait il y a un peu plus de 18mois quand l’est reçu.
    Mon plugin Xiaomi est à jour et le robot fonctionne correctement via les commandes qui ont été crées.
    Si tu as une piste je suis preneur.

    1. Biarnes64

      Je réponds moi-même: il faut cliquer sur recréer les commandes (en cochant ne pas supprimer les commandes existantes) !

      1. Guillaume

        Bonjour et merci pour ton message.
        Effectivement, tu as trouvé la solution. Les commandes pour les zones sont nouvelles et du coup si tu as ajouté ton aspirateur avant tu ne les as pas.
        Merci d’avoir répondu en commentaire cela aidera surement d’autres personnes.
        Bon courage pour la suite et n’hésite pas si tu as besoin d’aide.

  8. Dardevil

    Bonjour je me suis servie beaucoup de tes tuto pour mon jeedom je t’en remercie
    Mais la je bloc sur la partie code du scenario je comprend pas quel valeur mettre dans l’emplacement de la base du virtuel

    1. Guillaume

      Bonjour et merci pour ton commentaire.
      Pour la base en général on est dans les 25000 points donc tu mets 25000 dans les 2 champs et tu les valide. Après dans la fonction Test tu mets 0 et 0 et ton repère sur mi Home devrait tomber sur la base. Si ce n’est pas le cas estime l’écart et modifi les valeurs de test. Une fois que le repère tombe sur la base ajout les chiffre aux champs base et remet les tests a 0. Normalement tu devrais toujours tomber sur la base. Bon courage et n’hésite pas si tu as besoin.

  9. Dardevil

    Donc 25000-25000 ses les valeur du virtuel base
    Et après faut il modifier aussi le code ou alors il récupère dans les virtuel
    En faite ce que je comprend pas c’est a quel moment on entre les donnés de la zone ds le code
    Désoler pour les question bête 😉mes ses la première fois que j’utilise le bloc code

    1. Guillaume

      C’est les variables $baseH,$baseV qui récupèrent les valeurs du virtuel.

    2. Dardevil

      j’ai bien rentrer les information dans le virtuel mais il ne se passe rien sur mi home
      Et je n’est pas les variable $baseH, $BaseV

      Je suis bloquer a cette etape
      La fonction va renvoyer les coordonnées horizontales et verticales du point cible ($H et $V).

      Vous allez indiquer la distance en centimètres entre la base de chargement et la cible puis la fonction va faire la conversion en points de coordonnées.

      $baseH et $baseV = coordonnées de la base de chargement en centimètres.

      $H et $V = coordonnées du point cible.

      108 = nombre de centimètres pour 1000 points.

      1. Guillaume

        Là partie du code qui récupère les valeurs du virtuel pour la base c’est :
        //On récupère la valeur baseH de la base de recharge saisi dans le virtuel.
        $cmd = cmd::byString(‘#[Cuisine][Zones Aspirateur Robot][BaseH]#’);
        $baseH = $cmd->execCmd();
        //On récupère la valeur baseV de la base de recharge saisie dans le virtuel.
        $cmd = cmd::byString(‘#[Cuisine][Zones Aspirateur Robot][BaseV]#’);
        $baseV = $cmd->execCmd();

        1. Dardevil

          le log de mon scenario me dit

          ————————————
          [2019-09-21 14:34:07][SCENARIO] Start : Scenario lance manuellement.
          [2019-09-21 14:34:07][SCENARIO] Exécution du sous-élément de type [condition] : if
          [2019-09-21 14:34:07][SCENARIO] Evaluation de la condition : [0 == 1 ] = Faux
          [2019-09-21 14:34:07][SCENARIO] Exécution du sous-élément de type [action] : else
          [2019-09-21 14:34:07][SCENARIO] Exécution du sous-élément de type [action] : code
          [2019-09-21 14:34:07][SCENARIO] Exécution d’un bloc code
          [2019-09-21 14:34:07][SCENARIO] syntax error, unexpected end of file
          [2019-09-21 14:34:07][SCENARIO] Fin correcte du scénario

  10. Dardevil

    et voici mon code

    function GoThere($H,$V,$baseH,$baseV){
    //Point Horizontal.
    $H = round($baseH-(($H*1000)/108),0);
    //Point Vertical.
    $V = round($baseV+(($V*1000)/108),0);
    //Résultat de la fonction.
    $result = $H. », ».$V;
    return $result;
    }
    function CleanZone($Bgx,$BGy,$HDx,$HDy,$baseH,$baseV,$Q) {
    //Point Bas Gauche Horizontal.
    $Bgx = round($baseH-(($Bgx*1000)/108),0);
    //Point Bas Gauche Vertical.
    $BGy = round($baseV+(($BGy*1000)/108),0);
    //Point Haut Droit Horizontal.
    $HDx = round($baseH-(($HDx*1000)/108),0);
    //Point Haut Droit Vertical.
    $HDy = round($baseV+(($HDy*1000)/108),0);
    //Résultat de la fonction.
    $result = $Bgx. », ».$BGy. », ».$HDx. », ».$HDy. », ».$Q;
    return $result;
    }
    $scénario->setData(‘Q’,1);//On vérifie si le scénario a été provoqué par l’api (HTTP)
    $trigger = $scénario->getRealTrigger();
    if ($trigger==’api’){
    //On récupère le tag zone
    $cmd = $scénario->getTags();
    $zone = $cmd[‘#zone#’];
    //On récupère le dernier mot du tag
    $zone=substr($zone,strrpos($zone,’ ‘)+1);
    } else {
    //Si ce n’est pas l’api alors on récupère la valeur zone de la commande du virtuel
    $zone = cmd::byString(‘#[Maison][Zone Aspirateur][Zone]#’)->execCmd();
    //On met en minuscule
    $zone = strtolower($zone);
    //On mets à jour la variable zone
    $scénario->setData(‘zone’,$zone);
    //On vérifie la valeur de la variable zone si elle est bien égale à test.
    if ($zone==’test’){
    //On récupère la valeur de rotation
    $cmd = cmd::byString(‘#[Maison][Zone Aspirateur][Rotation_Map]#’);
    $rotation = $cmd->execCmd();
    $rotation *= M_PI/180;
    //On récupère la valeur baseH de la base de recharge saisi dans le virtuel.
    $cmd = cmd::byString(‘#[Maison][Zone Aspirateur][BaseH]#’);
    $baseH = $cmd->execCmd();
    //On récupère la valeur baseV de la base de recharge saisie dans le virtuel.
    $cmd = cmd::byString(‘##2075#’);
    $baseV = $cmd->execCmd();
    //On récupère la valeur TestH saisie dans le virtuel.
    $cmd = cmd::byString(‘#[Maison][Zone Aspirateur][TestH]#’);
    $H = $cmd->execCmd();
    $H = $H * cos($rotation) + $V * sin($rotation);
    //On récupère la valeur TestV saisie dans le virtuel.
    $cmd = cmd::byString(‘#[Maison][Zone Aspirateur][TestV ]#’);
    $V = $cmd->execCmd();
    $V = – $H * sin($rotation) + $V * cos($rotation);
    //On lance la fonction pour le nettoyage ciblé.
    $result = GoThere($H,$V,$baseH,$baseV);
    //On Log le résulta.
    $scénario->setLog($result);
    //On exécute la commande GoThere du plug-in Xiaomi avec les valeurs
    $cmd = cmd::byString(‘#[Salle a manger][Aspirateur][GoThere]#’);
    $cmd->execCmd(array(‘message’ => $result));
    //On attend 3 secs et on stop l’aspirateur
    sleep(3);
    $cmd = cmd::byString(‘#[Salle a manger][Aspirateur][Pause]#’);
    $cmd->execCmd();
    }

    1. Guillaume

      Il y a une erreur dans le bloc code.
      Il ne faut pas faire un simple copier coller du tuto il faut comprendre chaque ligne de code.
      Est ce que tes commandes sont bien sous la forme :
      #[Maison][Zone Aspirateur][Zone]# par exemple ? Sinon il fait les modifier dans le code.

  11. Dardevil

    J’ai corriger mes problème de code sa a l’aire de fonctionner sauf que maintenant j’ai le problème cité un peu plus haut en commentaire avec setdata
    Call to a member function setData() on null

    J’ai vu ta reponse mais je ne la comprend pas
    Il faut regarder dans le testeurs d’expression et sinon on ajouter des log dans le code comme par $scénario->setLog($result).

  12. Dardevil

    et si je met a jour la variable manuellement pour tester j’ai cette erreur

    [2019-09-21 16:13:30][SCENARIO] Call to a member function getData() on null

    1. Guillaume

      Get Data permet de récupérer la valeur de la variable il faut donc regarder la variable existe dans la liste des variables.
      Pour le log il faut ajouter $scénario->setLog($result) dans le code en remplaçant $result par la variable ou la commande a afficher.
      Le testeurs de commande permet de voir se qui est récupéré.

  13. Dardevil

    Je suis désolé je ne comprend pas tes explication
    Je ne voie pas ou ajouter $scénario->setLog($result)
    et ma variable V et H sont bien cree
    ( Je ne doit pas encore être prêt pour les bloc code ):)
    Je vais donc essayer de suivre un autre tuto car sinon je vais t’embêter toute la soirée, et je vais remplir cette page de commentaire lol 😉
    Merci beaucoup pour ta patience et surtout les tutos qui sont sur ton site

    1. Guillaume

      Il est vrai que ce n’est pas facile de commencer les bloc code par ce tuto qui est assez complexe. Si quelqu’un a réussi à faire la même chose sans bloc code ce sera peu être plus simple pour toi et tu essayera les bloc code plus tard.
      Bon courage pour la suite.

  14. Nelson

    Bonjour,

    Tout d’abord, merci pour toutes ces infos bien utiles.
    Toutefois, je n’arrive pas à afficher quoi que ce soit sur l’appli Mi Home. J’essaye de faire des tests de coordonnées. J’ai bien le robot qui se balade, qui cherche à plusieurs endroits, mais à chaque fois, il me répond qu’il n’arrive pas à atteindre le point cible.
    Sur quoi doit-on se connecter sur le smartphone pour afficher le soit-disant « drapeau » s’il te plait ?

    Lorsque je clique sur test, j’ai affiché sur mon smartphone l’application mi home sur mon robot, qui me permet de voir la carte. Mais aucun drapeau n’apparait. Je suis bien sur la bonne application ?

    Faut-il cliquer sur un bouton spécifique à ce moment ?

    Merci par avance !
    Nelson

    1. Guillaume

      Bonjour et merci pour ton commentaire.
      Oui c’est bien avec l’application Mi home mais effectivement depuis la dernière mise à jour le drapeau n’apparaît plus lorsque l’on demande un point cible, et c’est bien dommage.

      Il faut donc attendre que l’aspirateur se déplace et s’arrête puis modifier les valeurs pour qu’il s’arrête sur la base de chargement.

      Chez moi en mettant 25890,25590 dans la commande GoThere de l’aspirateur (non affiché par défaut) je tombe sur la base.

      J’ai donc saisi dans le virtuel Base horizontale = 25890 et Base verticale = 25590.

      Une fois que les coordonnées de la base sont trouvées, il suffit de suivre le tuto.

      N’hésite pas si tu as besoin d’aide.

  15. Nelson

    Pour info, Je suis en version :
    – jeedom v3.3.36,
    – Aspirateur roborock S55 en v3.3.9_001886,
    – Version de Xiaomi Home 5.6.9.

    1. Guillaume

      Pour info, Je suis en version :
      – jeedom v4.0.26,
      – Aspirateur roborock S55 en v3.3.9_001886,
      – Version de Xiaomi Home 5.6.13.

  16. Nelson

    Bonjour Guillaume,
    C’est bon, j’ai réussi à localiser ma base et à créer une zone. Je verrais pour la suite.

    En revanche, je rencontre un autre problème. Lorsque je fais appel à Google Home, je donne ma commande vocale : »Ok Google, envoie l’aspirateur dans le salon » par exemple.
    La réponse orale est bien entière avec le « dans le salon ».
    En revanche, le problème est le setData pour déclarer la zone, il n’arrive à extraire de l’URL que « dans ».
    J’ai fait un test en enlevant la partie du code qui consiste à ne conserver que le dernier mot, c’est pareil, il n’extrait que « dans ». Je cherche depuis quelques heures mais je ne comprends pas. SetData est bien capable de transmettre une chaine de caractères avec des espaces, non ?

    Voici mon code pour le premier bloc :

    —————————
    // ********************** FONCTIONS **********************
    // —————————- Fonction pour convertir les distances (cm) en points pour le nettoyage ciblé.
    function GoThere($H,$V,$baseH,$baseV){
    //Point Horizontal.
    $H = round($baseH-(($H*1000)/108),0);
    //Point Vertical.
    $V = round($baseV+(($V*1000)/108),0);
    //Résultat de la fonction.
    $result = $H. », ».$V;
    return $result;
    }

    // La fonction va renvoyer les coordonnées horizontales et verticales du point cible ($H et $V).
    // Vous allez indiquer la distance en centimètres entre la base de chargement et la cible puis la fonction va faire la conversion en points de coordonnées.
    // $baseH et $baseV = coordonnées de la base de chargement en centimètres.
    // $H et $V = coordonnées du point cible.
    // 108 = nombre de centimètres pour 1000 points.

    //////////////////////////////////////////////////////////////////////////////////////

    // Fonction pour convertir les distances en cm en points pour le nettoyage de zone.
    function CleanZone($Bgx,$BGy,$HDx,$HDy,$baseH,$baseV,$Q) {
    //Point Bas Gauche Horizontal.
    $Bgx = round($baseH-(($Bgx*1000)/108),0);
    //Point Bas Gauche Vertical.
    $BGy = round($baseV+(($BGy*1000)/108),0);
    //Point Haut Droit Horizontal.
    $HDx = round($baseH-(($HDx*1000)/108),0);
    //Point Haut Droit Vertical.
    $HDy = round($baseV+(($HDy*1000)/108),0);
    //Résultat de la fonction.
    $result = $Bgx. », ».$BGy. », ».$HDx. », ».$HDy. », ».$Q;
    return $result;
    }
    // Variable Q égale à 1 par défaut à modifier au cas par cas si besoin.
    $scenario->setData(‘Q’,1);

    // $Bgx = Bas Gauche horizontal.
    // $BGy = Bas Gauche vertical.
    // $HDx = Haut Droit horizontal.
    // $HDy = Haut Droit vertical.
    // $baseH et $baseV = coordonnées de la base de chargement en centimètres.
    // $Q = nombre de passage.
    // (1 comme valeur par défaut modifiable plus bas si besoin.)

    //////////////////////////////////////////////////////////////////////////////////////

    // ********************** Formatage de la variable zone (virtuel ou l’API HTTP). **********************

    //On vérifie si le scénario a été provoqué par l’api (HTTP)
    $trigger = $scenario->getRealTrigger();
    $scenario->setLog(‘Le trigger est : ‘);
    $scenario->setLog($trigger);

    if ($trigger==’api’){
    //On récupère le tag zone
    $cmd = $scenario->getTags();
    $zone = $cmd[‘#zone#’];
    $scenario->setLog(‘zone est : ‘);
    $scenario->setLog($zone);

    //On récupère le dernier mot du tag
    // $zone=substr($zone,strrpos($zone,’ ‘)+1);
    // $zone=substr($zone,strrpos($zone,’ ‘)+1);
    } else {
    //Si ce n’est pas l’api alors on récupère la valeur zone de la commande du virtuel
    $zone = cmd::byString(‘#[Domicile][Zones Aspirateur Robot][Zone]#’)->execCmd();
    }

    //On met en minuscule
    $zone = strtolower($zone);
    //On mets à jour la variable zone
    $scenario -> setData(‘zone’, $zone);

    //On vérifie la valeur de la variable zone si elle est bien égale à test.
    if ($zone==’test’){
    //On récupère la valeur de rotation
    $cmd = cmd::byString(‘#[Domicile][Zones Aspirateur Robot][rotation_map]#’);
    $rotation = $cmd->execCmd();
    $rotation *= M_PI/180;
    //On récupère la valeur baseH de la base de recharge saisi dans le virtuel.
    $cmd = cmd::byString(‘#[Domicile][Zones Aspirateur Robot][BaseH]#’);
    $baseH = $cmd->execCmd();
    //On récupère la valeur baseV de la base de recharge saisie dans le virtuel.
    $cmd = cmd::byString(‘#[Domicile][Zones Aspirateur Robot][BaseV]#’);
    $baseV = $cmd->execCmd();
    //On récupère la valeur TestH saisie dans le virtuel.
    $cmd = cmd::byString(‘#[Domicile][Zones Aspirateur Robot][TestH]#’);
    $H = $cmd->execCmd();
    $H = $H * cos($rotation) + $V * sin($rotation);
    //On récupère la valeur TestV saisie dans le virtuel.
    $cmd = cmd::byString(‘#[Domicile][Zones Aspirateur Robot][TestV]#’);
    $V = $cmd->execCmd();
    $V = – $H * sin($rotation) + $V * cos($rotation);
    //On lance la fonction pour le nettoyage ciblé.
    $result = GoThere($H,$V,$baseH,$baseV);
    //On Log le résultat.
    $scenario->setLog($result);
    //On exécute la commande GoThere du plug-in Xiaomi avec les valeurs
    $cmd = cmd::byString(‘#[Salon][aspirateur][GoThere]#’);
    $cmd->execCmd(array(‘message’ => $result));
    //On attend 3 secs et on stop l’aspirateur
    /* sleep(3);
    $cmd = cmd::byString(‘#[Salon][aspirateur][Pause]#’);*/
    $cmd->execCmd();
    }
    —————————

  17. Nelson

    Bonjour Guillaume,

    Je rencontre un nouveau problème avec le tuto. Pour atteindre un point cible comme la poubelle, c’est fonctionnel. Mais je rencontre un souci avec les zones. Quand je lance une zone, l’aspi va à l’un des points déclarés, et hop, il me déclare « nettoyage de zone terminé, retour à la base ». Un aspi fainéant, je ne comprends pas… 😉 Merci pour l’aide !

    1. Guillaume

      Bonjour, j’ai déjà eu le cas et j’ai modifié la taille de la zone. Est ce que la zone est bien visible sur l’application mihome lorsque tu la demande depuis Jeedom ? Est ce qu’il n’a pas enregistré une porte fermé sur le passage ? Essai l’envoyer vers la zone avec la télécommande virtuel de mihome pour qu’il réinitialise la zone.

  18. Olivier

    Hello tout le monde, avant tout merci pour ce tuto mais il je bug sur le début du scénario. je ne suis pas certain de l’endroit où mettre mes valeurs de zone dans le code.
    dans la formule ci dessous, où dois-je mettre mes valeurs de la zone et de la base? ( ma formule devrait ressembler à ceci? $22200 = round($25500-(($22200*1000)/108),0) .)?

    function CleanZone($Bgx,$BGy,$HDx,$HDy,$baseH,$baseV,$Q) {
    //Point Bas Gauche Horizontal.
    $Bgx = round($baseH-(($Bgx*1000)/108),0);
    //Point Bas Gauche Vertical.
    $BGy = round($baseV+(($BGy*1000)/108),0);
    //Point Haut Droit Horizontal.
    $HDx = round($baseH-(($HDx*1000)/108),0);
    //Point Haut Droit Vertical.
    $HDy = round($baseV+(($HDy*1000)/108),0);
    //Résultat de la fonction.
    $result = $Bgx. », ».$BGy. », ».$HDx. », ».$HDy. », ».$Q;
    return $result;
    }
    $scénario->setData(‘Q’,1);

    Merci d’avance

    1. Guillaume

      Bonjour
      Les valeurs de la base sont dans un virtuel. Et les valeurs, en cm, sont dans des variables.
      Aidez vous des copies d’écrans.
      N’hésitez pas a laisser un commentaire si vous n’y arrivez pas.

      1. SmrfYYY

        Salut,

        Je souhaiterais savoir si il est possible de faire ce tuto sans scénario ? je suis passé par FloleVac pour le faire avec Jeedom, du coup je ne possède pas de scénario ( donc pas d’id ). Du coup j’ai plusieurs ID pour les divers endroits de mon domicile. sous vous avez une idée je suis preneur.
        Merci.

  19. SmrfYYY

    Salut,

    Je souhaiterais savoir si il est possible de faire ce tuto sans scénario ? je suis passé par FloleVac pour le faire avec Jeedom, du coup je ne possède pas de scénario ( donc pas d’id ). Du coup j’ai plusieurs ID pour les divers endroits de mon domicile. sous vous avez une idée je suis preneur.
    Merci.

  20. Brice

    Bonjour,

    Un grand merci pour ce tutoriel, il m’a permis de comprendre un peu mieux Jeedom personnellement dans lequel je débute.

    J’ai rencontré un problème lors de l’éxécution du script, avec un setData on Null, et après avoir beaucoup cherché, il semblerait que cela vienne du fait que la variable scénario soit écrite avec un accent dans le tuto, j’ai tout remplacé en enlevant l’accent et visiblement ça passe mieux ! Si ca peut servir à d’autres.

    Encore merci Guillaume,

    1. Guillaume

      Bonjour et merci pour l’info. Effectivement le correcteur d’orthographe a ajouté des accents. C’est bien ca permet de réfléchir et de ne pas faire un copié collé 😜

  21. Lionel

    Bonjour,

    Merci pour le tuto, j’ai tout suivi à la lettre mais lorsque je lance le scenario l’aspirateur demarre quelque seconde pour me dit finish ( pour un lavage de zone )
    Pour un lance type goThere, il demarre et me dit qu’il ne trouve pas la cible.

    Si quelqu’un à le même probleme, je veux bien un peu d’aide.
    Merci

  22. Dig

    Bonjour,

    je n’arrive pas à comprendre le phase des coordonnées pour la base et les zones.
    Dans le virtuel sur les commandes bases horizontales et verticales ont doit rentrer : Base horizontale = 25890 et Base verticale = 25590 si j’ai bien compris.
    par contre je ne comprends pas ou je dois mettre les valeurs que j’ai mesuré pour faire une zone ou aller à un point donné.
    function GoThere($H,$V,$baseH,$baseV){
    //Point Horizontal.
    $H = round($baseH-(($H*1000)/108),0);
    //Point Vertical.
    $V = round($baseV+(($V*1000)/108),0);
    //Point Horizontal.
    $H = round($baseH-(($H*1000)/108),0);
    //Point Vertical.
    $V = round($baseV+(($V*1000)/108),0);
    //Point Horizontal.
    $H = round($baseH-(($H*1000)/108),0);
    //Résultat de la fonction.
    $result = $H. », ».$V;
    return $result;
    }
    function CleanZone($Bgx,$BGy,$HDx,$HDy,$baseH,$baseV,$Q) {
    //Point Bas Gauche Horizontal.
    $Bgx = round($baseH-(($Bgx*1000)/108),0);
    //Point Bas Gauche Vertical.
    $BGy = round($baseV+(($BGy*1000)/108),0);
    //Point Haut Droit Horizontal.
    $HDx = round($baseH-(($HDx*1000)/108),0);
    //Point Haut Droit Vertical.
    $HDy = round($baseV+(($HDy*1000)/108),0);
    //Résultat de la fonction.
    $result = $Bgx. », ».$BGy. », ».$HDx. », ».$HDy. », ».$Q;
    return $result;
    }
    $scénario->setData(‘Q’,1);

    1. Guillaume

      Re bonjour,

      Les valeurs mesurées sont a saisir dans les champs du scénario qui ne sont pas du code, pour chaque zone.
      Ici les valeurs pour les zones ;
      Valeurs pour zones

      Ici pour le gothere :
      Valeurs pour le gothere

      Dans le virtuel les valeurs pour la base de chargement :
      Valeurs base de chargement

      Je sais que le scénario est assez complexe mais tellement pratique a utiliser.
      Bon courage.
      Guilaume.

      1. Dig

        Bonjour,

        merci pour le retour je vais recommencer tout ça à tete reposé. Mais je suis d’accord ton scénario a vraiment l’air top il faut vraiment que j’arrive à la faire fonctionner.
        pour info je suis debutant sur jeedom, dsl si certaines questions pourraient te paraitre un peu simple.

        1. Guillaume

          Pas de problème on est tous des novices qui apprenons tous les jours.

          1. Dig

            Bonjour,

            je viens de refaire l’essai et c’est un peu compliqué pour les petites connaissances que j’ai 🙂 est ce qu’il est possible d’avoir une discussion par message privée ou autre ? pour éviter d’encombrer ce tuto de messages inutile.

            merci pour ton aide

  23. Lionel

    bonjour,
    si je ne me trompe pas, il faut les mettre dans ton scénario dans les valeurs de variables ( H,V ou BGx,BGy ect… ).
    Tiens nous au courant.

    Moi je bloque sur le fait que mon aspi demarre, fait quelques centimetre et me dit nettoyage terminé.
    Quelqu’un a déjà eu le cas ?

    1. Guillaume

      Bonjour,
      Désolé aussi pour le délai de réponse.
      J’ai déjà eu le cas et ça arrive si l’aspirateur pense ne pas pouvoir accéder à la zone demandé. En général il calcul le chemin une fois sortie de sa base de chargement.
      Par exemple si une porte était fermée lors du passage précédent il ne peut pas y aller même si la porte est maintenant ouverte.
      Est ce que le problème est le même si vous demandez d’y aller depuis l’appli mihome?
      C’est peu être aussi un problème de calcul dans le scénario et il peu être envoyé hors de l’appartement.
      La méthode que j’ai décrite dans le message précédent peu aussi vous aider pour ce problème.
      Bon courage et n’hésitez pas à me contacter si besoin.
      Guillaume.

  24. Dig

    bonjour merci pour ton aide
    Je viens d’essayer en remplaçant les variables dans le scénario j’ai fait plusieurs essais.
    j’ai essayer de créer un scénario unique avec le bloc go there et intégrer les différentes variables mais rien ne fonctionne.
    Help 🙂 merci à vous

    1. Guillaume

      Bonjour, désolé pour le temps de réponse mais je suis pas mal occupé en ce moment entre le télétravail et les enfants.

      Déjà pour voir si ce n’est pas un problème de valeurs essayez de mettre 25890 et 25590 dans la commande go there du plugin sans passer par le scénario. Ensuite vous mettez l’aspirateur a distance de la base. Si il revient vers la base, pas forcément en position de recharge mais contre la base, c’est que les valeurs de base sont bonnes sinon il faut refaire la manip en modifiant les valeurs jusqu’à se qui arrive a la base. Ensuite enregistrez dans le scénario les nouvelles valeurs a la place de 25890 et 25590.
      Déjà le point de départ sera bon car se sont les valeurs chez moi, mais certains on 20000 par exemple.
      Ensuite faites un essai en lançant le scénario pour voir si ça fonctionne.
      Si ce n’est pas le cas c’est qu’il y a un problème de calcul dans le scénario. Regardez dans les log les valeurs pour voir si c’est cohérent. Si ce n’est pas le cas il faut reprendre le tuto pour voir d’où ça vient.
      N’hésite pas a mettre dans les log le plus d’info possible pour pouvoir les vérifier avec une calculatrice par exemple.
      Bon courage et n’hésitez pas a me recontacter en cas de besoin.
      Bonne soirée.
      Guillaume.

  25. lolo

    Bonjour,

    tout d’abord, merci pour ce super tuto qui est facile à prendre en main et bien expliqué.

    J’ai une question: est-ce que votre carte change souvent d’orientation? Chez moi c’est assez régulier et en plus, elle prend des orientations pas toujours terrible (ce n’est pas 0,90 ou 180°). Comment faites vous pour trouver l’angle exacte?

    Merci
    ++

    1. Guillaume

      Bonjour et merci pour vos encouragements.
      Pour été honnête je n’ai jamais besoin de faire de rotation de la carte, j’ai ajouté l’option car certains avaient ce problème mais je n’ai jamais vraiment étudié le problème.
      Est ce que vous bougez la base de place ? Est ce qu’elle est contre un mur extérieur ?

      1. lolo

        Bonjour,

        moi c’est super régulier. J’ai meme du mal à faire les réglages ==> Je viens de finir ma première zone (qui marche pas … pas illogique pour un premier essai…) et pendant que je fais mes ajustements, bam, la carte a tourné.

        Non, je ne suis pas sur un mur extérieur, ca peut changer qqchose?

        Merci
        ++

  26. Thierry

    Bonjour,

    Je n’arrive pas à tester le scénario en mode test à chaque fois que je clique sur le bouton « Test », car à prior, ça marche que si la valeur de #[Séjour][Zones Aspirateur Robot][Zone]# change. C’est normal?
    Ou sinon faudrait par exemple, à la fin du scénario, que je l’initialise à une autre valeur comme « aucun » par exemple?

    Merci.

  27. Patrick CARLE

    Bonjour,

    Je viens de parcourir ton tuto…
    Sur l’idée de modifier un script existant pour le faire évoluer et l’améliorer, je trouve cela super, mais la démarche de t’approprier le code des autres sans les citer, j’avoue que cela ne me plait pas du tout !
    Pour info, le script initial, que tu as certes un peu modifié (par exemple en ajoutant la conversion en cm), est un script dont je suis l’auteur initial.
    J’ai publié ce script sur le blog de Sarakha en mars 2019 (http://sarakha63-domotique.fr/piloter-votre-aspirateur-xiaomi-zone-par-zone-meme-apres-une-rotation-de-la-carte/ ).
    Puis j’ai fait quelques évolutions mineures que j’ai postées sur mon site (sans aucune vocation commerciale) pour me faciliter les mises à jour ( https://www.carle.fr/domotique/13-pilotez-votre-aspirateur-roborock-zone-par-zone-et-gerez-les-rotations.html ) …
    Le minimum serait quand même de respecter le droit d’auteur et donc de citer tes sources, tu ne crois pas ?

    1. Guillaume

      Bonjour,
      C’est se que j’ai fait dans l’intro.

      Dans ce tutoriel, nous allons voir comment gérer les zones pour les aspirateurs robots Xiaomi prise en charge par le plug-in Xiaomi Home de Lunarok et Sarakha63. Ce dernier a d’ailleurs proposé sur une autre version sur son blog que je vous invite à regarder.

      Bonne journée.
      Guillaume.

      1. Fouky

        Slt,
        Savez vous si votre méthode est compatible avec le robot Xiaomi viomi V2 pro ?

  28. laimarc

    Bonjour,

    merci pour ce tuto que j’essaye de comprendre étant donné que je débute surtout pour la partie code dans jeedom.
    Je viens d’acquérir un Roborock S7, j’ai réussi à l’intégrer dans jeedom (v2) les cdes fonctionnent.

    Avant de me lancer savez vous si ce scénario fonctionne avec cette version de Roborock ?

    merci d’avance

    1. Guillaume

      Bonjour, théoriquement si il y les mêmes commandes GoThere et Zone le scénario doit fonctionner.

Les liens d’affiliation vers les partenaires nous permettent de recevoir du matériel gratuit afin de proposer plus de tests. Nous refusons les partenaires qui ne nous laissent pas dire ce que nous voulons dans les articles. Les commissions perçues sont réutilisées pour l’achat de matériel et l’entretien du site.
Merci de soutenir les sites amateurs et indépendants !

Merci à ceux qui ont contribué.

Fermer le menu

Rapport de faute d’orthographe

Le texte suivant sera envoyé à nos rédacteurs :