3

FHEM et OpenKarotz – part 1

En attendant l’écriture d’un module FHEM un peu plus propre pour OpenKarotz, voici comment j’ai intégré celui-ci dans ma domotique.

OpenKarotz

OpenKarotzOpenKarotz est un ensemble de scripts CGI écrits en shell script (sous licence WTFTL) par massalia. Ils permettent de piloter un Karotz indépendamment des serveurs du constructeur, au travers d’une API REST

L’intérêt est triple :

  • d’une part ce qui se passe entre le lapin et vous ne transite pas par un serveur externe, ce qui du point de vue de la sécurité d’une installation domotique me semble assez sain
  • d’autre part il n’y a pas de dépendance vis à vis de services qui peuvent être arrêtés à tout moment. L’expérience nabatztag (prédécesseur du karotz) a montré que le risque est bien réel. Vive le logiciel libre!
  • enfin le temps de réponse est meilleur et il n’y a pas de dépendance vis à vis de l’état de la connexion internet hormis pour la synthèse vocale (Text To Speech – TTS)

Fonctionnalités

on peut à l’heure actuelle :

  • faire bouger ses oreilles
  • le faire parler (TTS)
  • le faire fonctionner comme une squeezebox (intégration de squeezeslave comme précédemment expérimenté par SiegfriedWtg )
  • lui faire jouer des flux MP3 en streaming (webradio)
  • contrôler sa led ventrale
  • le faire photographier voire filmer avec son capteur VGA
  • gérer les tag RFID compatibles. En particulier, associer à un tag une action locale (oreilles, led …) ou un appel d’URL (ce qui permet de lancer une action sur un contrôleur domotique).

Utilisation en domotique

OpenKarotz peut être utilisé comme le karotz de base comme :

  • système de notification local :
    • par la voix en TTS ou avec les « humeurs » (ex : Plugin OpenKarotz pour SARAH)
    • ou par l’état de la led ou des oreilles, en définissant des conventions (ex: alarme activée si le lapin clignote en rouge)
  • actionneur :
    • en utilisant les tags RFID, on peut déclencher des actions. Cette fonction est actuellement limitée par le fait qu’il faut  un tag par action. Une fonction intéressante serait de pouvoir en lancer des différentes en fonction de la position des oreilles, par exemple.
    • reconnaissance vocale. La fonction devrait être bientôt implémentée sur OpenKarotz (existe sur le lapin de base connecté aux serveurs karotz)
  • caméra de surveillance : prendre une photo sur événement

Yapluka

Intégration basique dans FHEM

karotz - musiqueSqueezeslave

La fonction squeezeslave est découverte automatiquement par le module FHEM Squeezebox , si vous avez activé ce dernier. Pour ce faire ([update 26/10/2016]), il faut

récupérer le module dans github en passant la ligne de commande suivante dans la console FHEM :

update force https://raw.githubusercontent.com/ChrisD70/FHEM-Modules/master/autoupdate/sb/controls_squeezebox.txt

et définir votre serveur LMS (serveur squeezebox) avec
define monLMS SB_SERVER adresseIPduLMS
La fonction talk (TTS google) ne fonctionne pas correctement (génère un gargouilli incompréhensible), mais ce n’est pas grave car on peut utiliser celle d’OpenKarotz .

API OpenKarotz

Editer /opt/fhem/FHEM/99_myUtils.pm et y intégrer la fonction suivante (ou celle-ci , décrite plus bas, qui est la même en plus efficace) :
sub karotz(@) {
my ($ip,$cmd) = @_;
my $url = "http://"."$ip"."/cgi-bin/".$cmd;
my $ret = GetFileFromURL($url,3,undef,1,1);
return $ret;
}

Il est maintenant possible d’appeler l’API de la manière suivante dans fhem :

{ karotz( adresseIPduKarotz, api );; }

adresseIPduKarotz est l’adresse IP du karotz ou son nom DNS.

Par exemple (faire telnet monFHEM 7072 pour passer les commandes à la main de manière à tester les commandes) :
fhem> { karotz("192.168.0.20","ears_random");;}
fhem> { karotz("192.168.0.20","ears?left=1&right=9");;}
fhem> { karotz("192.168.0.20","tts?voice=alice&text=salu%20les%20copin&nocache=0");;}
fhem> { karotz("192.168.0.20","sound?url=http://broadcast.infomaniak.net:80/tsfjazz-high.mp3");;}
fhem> { karotz("192.168.0.20","apps/moods?id=2");;}

C’est rustique mais ça marche.

Tags RFID

On va définir dans FHEM un device de type « dummy »  représentant le lecteur de tags RFID du Karotz, dont l’état sera l’identifiant du dernier tag RFID reconnu par le lapin

# lecteur de tags du lapin
define roger_rabbit_rfid dummy
attr roger_rabbit_rfid alias lecteur RFID karotz
attr roger_rabbit_rfid group Roger Rabbit

Puis on définit les tags RFID :
nanoztag-vert# tags rfid
define tag_vert dummy
attr tag_vert group RFID

Enfin on associe à chaque changement d’état du lecteur de tags une notification qui lancera une série d’actions

define roger_rabbit_tag_vert_n notify roger_rabbit_rfid:tag_vert { karotz("192.168.0.20","ears_random");; fhem("set lumiere on");; }

Il reste à configurer OpenKarotz pour envoyer la notification :

  1. Faire reconnaître le tag par OpenKarotz : appui long sur le bouton puis passer le tag devant son nez
  2. configurer l’URL de callback vers FHEM : choisir « External Action » pour le tag concerné dans l’interface web d’OpenKarotz puis compléter le formulaire :

Name : ce que vous voulez (mnémotechnique pour reconnaître le tag dans la liste des tags)
URL : http://myFHEM:8083/fhem (où myFHEM est l’adresse IP ou le nom du serveur FHEM)
Parameters : cmd=set+roger_rabbit_rfid+tag_vert (où roger_rabbit_rfid est le nom du lecteur RFID et tag_vert le nom du tag dans FHEM)

openkarotz-config-rfid

Remarque : on aurait pu lancer directement une action FHEM dans l’URL de callback mais cette indirection permet de tracer les actions au niveau du device « lecteur de tags ».

Exemple d’utilisation

On va recréer l’application « Humeurs » permettant au lapin de causer de manière aléatoire. Le prérequis est de charger l’app « moods » OpenKarotz sur le lapin (onglet « moods »).

On utilise la fonction FHEM RandomTimer

define roger_rabbit_moods RandomTimer 9:00:00 roger_rabbit 21:00:00 900
attr roger_rabbit_moods comment cause (ou pas) toutes les 15mn entre 9h et 21h
attr roger_rabbit_moods onCmd { karotz("192.168.0.20","apps/moods");; }
attr roger_rabbit_moods offCmd { karotz("192.168.0.20","ears_random");; }

On peut sophistiquer si nécessaire (ex: heures de présence seulement et quand personne ne dort)

Icône OpenKarotz pour FHEM

Visualisation icone karotz avvec les styles "default", "black", IOS7

Visualisation icone karotz avvec les styles « default », « black », IOS7

Voir FHEM et les fichiers SVG pour l’icone SVG OpenKarotz

En savoir plus : les appels HTTP dans FHEM

API bloquante

On a vu ci-dessus comment utiliser l’API HTTP de FHEM en mode bloquant, avec la fonction GetFileFromURL :

# Parameter: $url, $timeout, $data, $noshutdown, $loglevel
# - if data (which is urlEncoded) is set, then a POST is performed, else a GET.
# - noshutdown must be set e.g. if calling the Fritz!Box Webserver

L’API est bloquante, c’est à dire que l’appel de la fonction se met en attente d’une réponse ou d’un timeout). Remarque : cette fonction existe toujours mais est maintenant dépréciée et remplacée par la fonction HttpUtils_BlockingGet qui a les même paramètres que son équivalente non bloquante décrite plus loin.

Certains utilisent la fonction shell system (sous Linux) pour appeler la commande curl. C’est un peu moins efficace car on lance un process externe. Si on est juste en mémoire comme dans mon cas (plate-forme Dockstar), ce n’est pas l’idéal.

API non bloquante

Une solution plus efficace est d’utiliser l’API FHEM en mode non bloquant, avec la fonction HttpUtils_NonblockingGet. Elle permet de rendre la main sans délai à FHEM, et de définir un call-back qui s’exécute en cas d’erreur. Cela permet d’éviter de bloquer les traitements de manière à ne pas allonger les temps de réponse de FHEM. Il est assez irritant d’attendre des plombes que la lumière s’allume quand on appuie sur un bouton … surtout quand on n’est pas le bidouilleur qui a mis en place la solution 😉

# Parameters :
#  mandatory:
#    url, callback
#  optional(default):
#    hideurl(0),timeout(4),data(""),loglevel(4),header(""),
#    noshutdown(1),shutdown(0),httpversion("1.0")
#    method($data ? "POST" : "GET")
# Example:
#   HttpUtils_NonblockingGet({
#     url=>"http://192.168.178.112:8888/fhem",
#     myParam=>7,
#     callback=>sub($$$){ Log 1,"$_[0]->{myParam} ERR:$_[1] DATA:$_[2]" }
#   })

Voici ce que ça donne dans notre exemple :

sub karotz(@) {
  my ($ip,$cmd) = @_;

  my $url = "http://"."$ip"."/cgi-bin/".$cmd;

  my $hash = { url => $url,
               callback=>sub($$$){ Log 1,"karotz: $url\nERR:$_[1] DATA:$_[2]" },
             };

  my ($err, $ret) = HttpUtils_NonblockingGet($hash);
  if($err) {
    Log3 undef, $hash->{loglevel}, "karotz: $err";
    return undef;
  }
  return $ret;
}

 

Références

 

 

3 Comments

  1. Bonjour, qui donne la solution pour faire donner l’heure par le lapin .. en OpenKarotz?

    Mon lapin est désespérément silencieux ..

  2. Bonjour,

    Concernant les tags, savez vous comment on pourrait déclencher un message TTS à partir du reniflage d’une puce RFID?
    Je ne trouve rien sur le site d’Open Karotz qui le permette mais peut-être est-il possible dele faire quand même avec un peu de code?

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *