Domotique

De Tasker au Karotz

Cet article est une explication approfondie de ce que j’introduisais dans la présentation du Karotz.

Dans le but de bien me faire la main sur les concepts de requêtes HTTP et pour tâter du javascript version Karotz, j’ai fait un petit ensemble de petits scénarios dépendants les uns des autres qui arrivent à ce résultat:
quand j’approche de la maison avec le GPS du téléphone allumé, Shirley prononce une phrase pré-programmée.

Bien sûr, le but final n’est pas de faire parler le lapin… C’est un peu gadget de ne faire que ça. Le but serait plutôt de changer l’état de la maison à l’entrée dans une zone géographique: si l’alarme est en route, alors il faut la désactiver, puis ouvrir la porte du garage, allumer la lumière s’il fait nuit, et prévenir de ces actions avec le message vocal du Karotz. On verra plus tard quand les capteurs seront en place et que la box domotique (la Vera 3) sera opérationnelle. Pour l’instant, je vais expliquer comment j’ai fait pour faire parler Shirley quand j’approche de la maison.

I. Le Karotz

Il faut interagir avec le Karotz depuis l’extérieur. A la base prévu pour faire sa vie tout seul avec des applications téléchargées depuis le site, on va quand même avoir plein de solutions.
On peut utiliser un service de notifications (PushingBox) ou alors utiliser une API pour accéder au Karotz (wizz.cc). On pourra aussi se faire sa propre API avec un hébergement php, on y reviendra dans un prochain article.

I.a. PushingBox

PushingBox est un service de notification qui regroupe de nombreux services: on peut envoyer des mails, des tweets, des notifications Push (que ce soit vers l’iPhone, Android, ou même Windows Phone), mais également des messages vocaux vers le Karotz.

Sur la page des services, nous choisirons le service Karotz. Il nous faut installer l’application PushingBox sur le Karotz. Une fois installée, l’application nous indique un Install id qui ressemble à xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx et qu’on va recopier dans la configuration du service sur PushingBox. On doit aussi donner un nom au service, je conseille d’indiquer le pseudo que vous avez assigné à votre lapin, histoire de le reconnaitre si vous en avez plusieurs. On a lié notre lapin au site PushingBox, maintenant, voyons comment lui assigner une action.

Sur la page des scénarios, on entre un nom du style Entrée dans la zone de la maison, puis on ajoute une action en choisissant un service parmis ceux qu’on a installé, ici, Karotz. Il nous faut ensuite indiquer le message que prononcera le Karotz, j’ai indiqué Bonjour, Shaigan arrive vers la maison.

Une fois validé, on peut trouver un DeviceID qui ressemble à vXXXXXXXXXXXXXXX. On le recopie dans un coin, on en aura besoin plus tard dans Tasker, c’est lui qu’il faudra appeler pour déclencher l’action sur le Karotz.

Cette solution conviendra à tous ceux qui veulent pouvoir faire parler leur Karotz depuis plusieurs sources avec des scénarios pré-établis, mais aussi effectuer plusieurs actions avec une seule requête. C’est la solution la plus simple, mais aussi la moins souple: elle ne peut que faire parler notre lapin, et le message est figé.

I.b. API unifiée de wizz.cc

Wizz.cc a écrit une API qui s’apparente à celle publiée par Aldebaran, mais qui permet d’envoyer des messages push directement sur notre lapin à travers une adresse HTTP. On a une documentation détaillée sur le blog de wizz.cc.

Il nous faut installer l’application Karotz Live! sur le lapin. On doit ensuite donner un pseudo à notre Karotz, et lui donner un token, comprenez « une sorte de mot de passe ». A partir de là, on peut attaquer notre Karotz avec ces deux infos grâce à l’url .

Le gros reproche que je lui fait est l’obligation d’utiliser la voix « calm » du Karotz, l’API nous l’impose et rien ne nous permet de le changer.

Maintenant qu’on a préparé le lapin à recevoir nos ordres, il faut les lui envoyer. Dans la page suivante, on va voir comment faire un profil avec Tasker pour faire causer notre Karotz.

II. Tasker

J’en ai déjà parlé par le passé, Tasker sur Android est une application (payante, mais qui vaut vraiment la peine) qui permet d’automatiser des actions si des conditions prédéfinies sont réunies. Ici, on va demander d’envoyer une requête HTTP si on entre dans zone géographique. Si on sort, on n’a pas besoin de prévenir.

II.a. Profil et Contexte

On lance Tasker, on clique sur le + vert et on donne un nom à notre futur profil, Proche Maison par exemple puis on valide. On se retrouve avec un profil vide dans lequel il faut ajouter un contexte. On choisi Lieu, puis Nouvel emplacement. Une carte s’ouvre alors, sur laquelle vous pouvez choisir un point de référence, avec deux options: Réseau et GPS. Ces options dictent sur quelle source de localisation l’application doit s’appuyer. Je déconseille d’utiliser GPS parce que Tasker va régulièrement allumer le GPS pour tester la position, et ça flingue la batterie. Ne garder que Réseau et donc, il faut décocher GPS Une fois le point choisi, vous pouvez ensuite établir un rayon. J’ai opté pour 300m car ça correspond à peu près au diamètre du quartier où j’habite, mais c’est à adapter en fonction de la localisation, je vous laisse juger vous-même. Une fois que c’est fait, on valide.

II.b. Tâche d’entrée

L’appli nous demande de créer une nouvelle tâche, alors on en fait une. On lui donne un nom du genre Entrée dans la zone Maison. On clique ensuite sur + pour ajouter une action. On va d’abord tester une variable qui servira de trigger pour d’autres scènarios. On va donc faire un « interrupteur ». On choisi la case Tâche dans la liste, puis la case Si. On écrit %dansZoneMaison dans le nom de la variable, et on entre off dans la valeur. On laisse l’opérateur sur ~ qui signifie « correspond ». On valide et on ajoute une acton avec le +. On va changer notre variable et la passer à on: on choisi Variable dans la liste, puis Affecter une variable, on tape %dansZoneMaison dans le nom et on passe on dans la case A. Le symbole % permet de reconnaitre les variables dans tasker, comme le $ pour php.

On ajoute une nouvelle action avec le +, on va dans Réseaux et on choisi Get HTTP. En fonction de la solution retenue pour accéder au Karotz, on aura:

Pour PushingBox:
Dans la case Serveur:Port, on va indiquer notre serveur php sans le http://, avec api.pushingbox.com.
Dans la case Chemin, on va indiquer l’emplacement du script, soit: pushingbox.
Enfin, dans la case Attributs, on indique seulement le DeviceID qu’on a recopié plus tôt quand on a configuré le service: devid=vXXXXXXXXXXXXXXX.

Pour l’API wizz.cc:
Dans la case Serveur:Port, on va indiquer notre serveur php sans le http://, avec: api.wizz.cc.
Il n’y a pas de chemin à renseigner, l’API s’attaque directement après le nom de serveur. Dans la case Attributs, on indique chaque paramètre, il en faut un par ligne. On aura donc:
sn=pseudo_du_lapin
token=token_du_lapin
tts=Bonjour, Shaigan arrive vers la maison.
voice=fr

On peut changer le délai si jamais on a une connexion un peu lente, du genre 30 secondes.

On ajoute une dernière action pour clôturer le si avec le +, puis Tâche, et enfin Fin de si. On valide et on a notre profil avec sa tâche d’entrée.

II.b. Tâche de sortie

Maintenant qu’on sait passer une valeur dans une variable et qu’on sait faire parler notre Karotz en arrivant dans la zone, vous vous doutez bien que notre tâche de sortie va faire exactement l’inverse que la tâche d’entrée, sans faire parler le Karotz. C’est parti!

On appuie longtemps sur la tâche en face de notre profil, celle qui a une flèche verte devant son nom. On choisi Ajouter une tâche de sortie dans le menu, et on lui donne un nom du genre Sortie de la zone Maison. On clique ensuite sur le + pour ajouter une action. On teste la variable avec Tâche dans la liste, puis la case Si. On entre %dansZoneMaison dans le nom de la variable (ou alors on la choisi dans la liste en appuyant sur la bouton en forme d’étiquette jaune/orange), et on entre on dans la valeur. On laisse l’opérateur sur ~. On valide et on ajoute une action avec le +. On choisi Variable dans la liste, puis Affecter une variable, on tape %dansZoneMaison dans le nom et on tape off dans la case A. Enfin, on clôture le si avec le +, puis Tâche, et enfin Fin de si. Et on termine en validant.

Voilà, on a notre profil qui est complet avec son contexte et ses deux tâches d’entrée et de sortie.

Le fait de tester la position via le réseau permet d’économiser la batterie parce que le Tasker ne cherchera pas à allumer le GPS à intervalles réguliers pour tester la position. Par contre, quand je suis en voiture, j’ai le GPS allumé (et le téléphone branché sur l’allume-cigare), donc j’aurais une meilleure précision et je ne flinguerai pas la batterie (puisqu’en charge).

III. En conclusion

J’en parlais en introduction, ces services imbriqués sont quand même bien compliqués pour simplement faire prononcer au lapin une phrase pré-programmée. La prochaine étape sera de lui faire dire une phrase aléatoire en utilisant notre propre application hébergée sur un serveur php. Dans le futur, il faudra héberger cette application directement dans la box domotique, et ainsi connaître précisément l’état de la maison et agir sur n’importe quel micro-module (lumière, porte de garage, volet roulant). Il faudra trouver un moyen de gérer la présence des occupants de la maison, pour que la box sache si elle est vide ou non. Les actions ne seront pas les mêmes s’il reste quelqu’un: l’alarme ne se mettra pas en route, par exemple. A contrario, toutes les lumières devront s’éteindre, l’alarme devra s’activer et les volets se fermer s’il ne reste personne.

Les solutions pour gérer la présence/absence des occupants de la maisons sont nombreuses:

  • Utiliser un réseau de détecteurs infrarouge couplé à un réseau de capteurs de mouvements. Si rien ne bouge et qu’il y a pas de chaleur, alors c’est que la maison est vide. Ça ne fonctionne pas bien si on a des animaux domestiques…
  • Utiliser un capteur RFID proche de la porte d’entrée et attribuer un porte-clefs RFID à chaque occupant. A chaque passage d’un porte-clefs devant le capteur, le système compte les personnes présentes (voir ici).
  • Utiliser nos téléphones avec la détection du WiFi de la maison (Tasker sait faire). Si le téléphone capte le wifi, c’est qu’on est présent. Problème : une panne du WiFi ou du téléphone et l’alarme se mettra en marche alors qu’on est bel et bien présent… 120dB dans les oreilles garantis…

Dans tous les cas, il faudra affiner les seuils de détection des capteurs à cause du chien et du chat, il ne faut pas déclencher l’alarme parce qu’il a bougé…

7 commentaires

  • FABRE Christian

    je ne suis pas d’accord avec toi au sujet de l’appli Wizz, on peut donner des voix différentes au lapin .. je l’utilise dans mes scenes Vera pour faire parler le lapin avec la voix Acapela Margaux

    D’autre part je cherche à embarquer un appli sur la Vera3 pour pouvoir faire parler le lapin directement sans passer par des serveurs … ce serait plus judicieux.
    je ne sais pas si on peut installer un plugin java directement sur la Vera ? si tu as une idée …

    • Shaigan

      Oui, à partir du moment où on change la voix du Karotz, ce n’est plus la voix par défaut (logique), mais on perd les émotions (j’en ai pas parlé, remarque, mais c’est expliqué).

      Mais si on ne change pas le style de voix, il y a toujours ce « voice emotion=’calm' » qui traîne. Je n’ai pas compris pourquoi, d’ailleurs.

      Je suis justement en train d’essayer de coder une page php qui gère les events, en suivant ce code https://groups.google.com/g/karotzdev mais en essayant de me passer de la classe php, ou plutôt en l’intégrant en dur dans le code. L’idée est ensuite de traduire tout ça en LUA. On pourra piloter le Karotz via la Vera sans avoir besoin de fixer un délai pour couper le lien après les actions.

      Sinon, je crois qu’il y a déjà un plugin avec tout inclus pour la Vera qui pilote le Karotz, avec un délai de 15 minutes (sic!) ; et un autre avec un proxy php et un délai de 10 secondes https://code.google.com/archive/p/karotz-for-vera)

    • Jorge

      Cette histoire est intéressante, car elle montre que tout objet lié à un service en ligne est dépendant de l’état de la société qui héberge ce service. Tant que la société va bien et vends des produits alors elle a les fonds pour continuer le service. Mais si par malheur elle n’a plus les moyens d’entretenir le service (cout important, ventes faibles alors la pyramide s’effondre). Je pense que, c’est facile de le dire après coup vous me direz, Violet et Mindscape dans un second temps on fait une grosse erreur: vouloir en permanence garder le contrôle de l’infrastructure et ne pas booster la communautée de développeurs motivées qu’il y avait à l’époque. Du coup toutes les personnes motivés de l’époque qui ont finis par passer leur chemin. Pour finir il me reste deux questions:
      – qu’allez vous faire des serveurs? Les donner à une association d’utilisateurs qui se monterait?
      – qu’allez vous faire du nom de domaine Nabaztag.com vers lequel tous nos lapins pointent? Le garder, le prêter le temps de migrer vers une autre infrastructure, le donner? Vais-je en dépit de la opposition, très intéressante acheter le nouveau karotz? Non, déja car la couverture wifi de là ou je suis est médiocre (ce n’est pas une raison, je sais 🙂 ) mais aussi car les sources ne sont pas ouvertes. Si les sources étaient ouvertes, je pense que je franchirais le pas car il y aurais moyen de fonder une communauté solide dés le début. Il ne me reste qu’à vous souhaiter bon courage, et je souhaite, trés fortement que vous vous en sortiez! BON COURRAGE!

  • domotique34

    bonjour,
    j’aurais aimé être un peu(beaucoup) aiguillé sur l’application TASKER.
    Je m’explique, j’ai des capteurs sur mes portes (gérés par l’eedomus et le karotz) qui me donnent des alertes via pushingbox.
    Mais pour activer l’alarme je souhaite que mon portable et celui de ma femme puisse l’activer celle ci lorsque je quitte mon domicile. Et à l’inverse lorsque j’approche de chez moi que cela désactive l’alarme.
    Je souhaiterais donc envoyer une requête HTTP quand le portable est déconnecté du wifi de la maison. Cette requête HTTP changerait l’état d’un périphérique virtuel sous la box eedomus.
    Est ce que tu aurais une idée de la façon de faire ?
    Merci

    • Shaigan

      Salut,

      Rien de plus simple si tu connais la requête à envoyer. Il suffit de cocher la case « inverser » dans le contexte du profil « wifi connecté » avec le nom du réseau (SSID). A chaque perte de connexion, tasker enverra la requete. On pourrait envisager d’attendre d’être connecté en 3G pour être sûr que la requête ne parte pas dans le vide.

      La version simple pour activer l’alarme:
      Créé un nouveau profil -> État -> Réseaux -> Wifi connecté
      * appuie sur la loupe pour chercher les réseaux à portée et choisi le tient
      * coche la case « inverser » et valide
      Dans la boite qui s’ouvre, appuie sur « Nouvelle tache » -> Réseau -> Get HTTP -> entre la requête d’activation dans la case « serveur port ». La requête s’effectuera à chaque perte du wifi de ta maison (ça peut être embêtant si ton wifi est instable ou si ton smartphone capte mal). Enfin, valide

      Après, suffit de faire l’inverse pour désactiver l’alarme

      La version compliquée:
      Créé un nouveau profil -> Etat -> Réseaux -> Wifi connecté
      * appuie sur la loupe pour chercher les réseaux à portée et choisi le tient
      Dans la boite qui s’ouvre, appuie sur « Nouvelle tache » -> Variable -> Affecter une variable -> tape « $wifiMaison » dans le Nom et tape « on » dans la Valeur, puis valide
      Laisse appuyé sur la tache (avec la flèche verte) pour faire ouvrir un boite. Choisi « ajouter une tache de sortie » -> Variable -> Affecter une variable -> tape « $wifiMaison » dans le nom et tape « off » dans la valeur, puis valide

      Crée un nouveau profil -> Etat -> Réseaux -> Réseau mobile -> coche tout sauf « inverser » puis valide
      Dans la boite qui s’ouvre, appuie sur « Nouvelle tache » -> Variable -> Affecter une variable -> tape « $dataMobile » dans le Nom et tape  » on  » dans la Valeur, puis valide
      Laisse appuyé sur la tache (avec la flèche verte) pour faire ouvrir un boite. Choisi « ajouter une tache de sortie » -> Variable -> Affecter une variable -> tape « $dataMobile » dans le nom et tape « off » dans la valeur, puis valide

      Crée un nouveau profil -> Etat -> Variable -> Valeur de variable -> tape « $wifiMaison » dans Nom, choisi « correspond » dans Op et « off » dans Valeur, puis valide
      Dans la boite qui s’ouvre, appuie sur « Nouvelle tache » -> Réseau -> Get HTTP -> entre la requête d’activation de l’alarme dans la case « serveur port ».
      Appuie longtemps sur le contexte « variable » et choisi « Ajouter » -> Etat -> Variable -> Valeur de variable -> tape « $dataMobile » dans Nom, choisi « correspond » dans Op et « on » dans Valeur, puis valide.
      La requête s’effectuera à chaque fois que le wifi de ta maison sera perdu et que la 3G sera acquise (donc, déconnecté de la maison mais connecté au réseau mobile).

      Crée un nouveau profil -> Etat -> Variable -> Valeur de variable -> tape « $wifiMaison » dans Nom, choisi « correspond » dans Op et « on » dans Valeur, puis valide
      Dans la boite qui s’ouvre, appuie sur « Nouvelle tache » -> Réseau -> Get HTTP -> entre la requête d’activation de l’alarme dans la case « serveur port ».
      Appuie longtemps sur le contexte « variable » et choisi « Ajouter » -> Etat -> Variable -> Valeur de variable -> tape « $dataMobile » dans Nom, choisi « correspond » dans Op et « off » dans Valeur, puis valide.
      La requête s’effectuera à chaque fois que le wifi de ta maison sera connecté et que la 3G sera perdue (donc, connecté à la maison).

      J’espère que ça t’éclaire un peu 😉
      Bon courage et n’hésite pas à me redemander si tu bloque quelque part 😉