Premières armes sur Openkarotz et PHP.

Voilà longtemps que je n'avais pas abordé la domotique sur le blog. D'abord parce que j'ai d'autres priorités et un projet associatif qui me prend pas mal de temps, ensuite parce je m'interroge pour diverses raisons sur la pertinence de la mise en place d'un gros système domotique dans la maison où je vis actuellement.

Malgré cela, ayant récupéré un lapin connecté karotz, j'ai commencé à développer quelques scripts lui permettant de participer à la vie du foyer.

Certains me diront qu'Aldebaran a fermé le SAV et les serveurs permettant aux karotzs de fonctionner. C'est vrai, mais de toutes façons je ne me serai pas intéressé à une machine dépendante de son fabricant ou d'un quelconque service centralisé. De plus, depuis 2012 Massalia a créé un firmware alternatif permettant aux karotzs de fonctionner de façon autonome: OpenKarotz.

Vous trouverez toutes les infos nécessaires sur le site pour libérer votre karotz comme je l'ai fait. Notez que ce firmware intègre une API permettant de répondre à des ordres qui lui sont envoyés par une requête http. Une telle requête se fait en utilisant une URL comme celle que vous entrez dans votre navigateur favori. Http://tom23.com en est une. En entrant cette url dans votre navigateur vous envoyez une requête à mon serveur web qui répond en envoyant la page correspondante. Dans le cas présent le lapin répondra à vos requêtes en changeant la couleur de sa LED ventrale, en bougeant ses oreilles, et même en parlant.

Comme je l'ai déjà évoqué ici, j'utilise domoticz comme programme de gestion de mon installation domotique. Fonction intéressante: domoticz peut très facilement envoyer des requêtes http. Il y a une multitude de possibilités à ce niveau. Que ce soit dans l'interface de programmation, ou dans le menu de configuration des actionneurs.

Il est donc très simple de faire dire du texte au karotz juste en actionnant un interrupteur.

Dans mon cas c'est un petit peu plus compliqué. Si les possibilités de domoticz sont nombreuses, elles sont moins souples qu'un véritable langage de programmation. Ayant déjà regardé de loin le PHP, et domoticz pouvant faire des requêtes vers des script utilisant ce langage, j'ai décidé de m'appuyer dessus pour interagir avec le lapin. Que ce soit depuis domoticz ou non. Sans compter que le cloisonnement simplifiera les choses en cas de soucis et me permettra de trouver le coupable plus facilement sans être obligé de suspendre tous les services. Sans compter que l'espace de stockage sur le karotz est assez limité. Mes scripts ne seront donc pas hébergés par le lapin.

[Un script PHP c'est quoi, on en fait quoi ?]{style="text-decoration: underline;"}

C'est tout simplement un fichier dont l'extension est .php et qui contient du code exécutable par un serveur sur lequel il est placé. Comme dit plus haut, tout programme capable de lancer une requête web est capable de lancer un script php.

Dans notre cas ça tombe bien, puisque domoticz et le karotz savent le faire. C'est aussi le cas pour tout navigateur web. Bonus: Openkarotz et domoticz possèdent chacun une API leur permettant de recevoir des requêtes web pour lancer tout un tas d'actions.

Ceci fait que tout ce petit monde peut discuter très facilement sans intervention externe. Chacun pouvant faire des requêtes à l'autre.

Pour le moment je fais discuter domoticz avec le karotz seulement. Je n'en suis qu'au début de mes expérimentations et je n'ai pas encore cherché à faire que le karotz provoque des actions dans domoticz.

J'ai donc mis en place mes 2 premiers scripts. Ceux-ci sont placés sur le serveur apache faisant fonctionner domoticz sur un raspberry pi.

[Sortez les poubelles !]{style="text-decoration: underline;"}

Le premier est lancé par une requête de domoticz à heure fixe chaque jour. Pour cela, j'ai créé un interrupteur virtuel dans domoticz actionné tous les jours à la même heure. Dans la configuration de ce bouton, j'ai entré l'adresse du script dans le champ permettant de le faire (http://ip_du_serveur_web/script-poubelle.php). Suivant le jour de la semaine, le script fera annoncer par le karotz si il faut sortir une poubelle pour le lendemain, et si oui la couleur de la poubelle correspondante sur son ventre. Si il n'y a pas de ramassage le lendemain, le karotz l’annoncera et son ventre prendra une couleur aléatoire. Dans le script suivant, l'adresse IP contenue dans les urls est celle du karotz (192.168.0.123)

Voici le script:

<?php
#Script d'info de sortie des poubelles sur le karotz

//extraire le jour de la semaine de la date 
$jour = date ('l');

//urls contenant le texte à dire par le lapin
$urlbleue = "http://192.168.0.123/cgi-bin/tts?voice=alice&text=iil%20faut%20sortir%20la%20poubelle%20bleue%20pour%20demain%20matin&nocache=1";
$urljaune = "http://192.168.0.123/cgi-bin/tts?voice=alice&text=iil%20faut%20sortir%20la%20poubelle%20jaune%20pour%20demain%20matin&nocache=1";
$urlrienafaire = "http://192.168.0.123/cgi-bin/tts?voice=alice&text=iil%20ni%20a%20pas%20de%20poubelle%20a%20sortir%20ce%20soir&nocache=1";

//url contenant la couleur à afficher sur le ventre du lapin en fonction de la poubelle à sortir
$ventrebleu = "http://192.168.0.123/cgi-bin/leds?color=0015ff";
$ventrejaune = "http://192.168.0.123/cgi-bin/leds?color=FFFF00";

//création d'une variable contenant un nombre aléatoire héxadécimal enttre 0 et 16 millions
$couleuraupif = dechex(mt_rand(0,16000000));

//url contenant la couleur à afficher sur le ventre du lapin. Le code couleur correspondant au contenu de $couleuraupif
$ventreaupif = "http://192.168.0.123/cgi-bin/leds?color=".$couleuraupif."";

//si on est dimanche ou jeudi lancer les ordres au lapin pour la poubelle bleue
if ($jour == Sunday OR $jour == Thursday)
    {
        $ordrebleu1 = file_get_contents("$ventrebleu");
        $ordrebleu2 = file_get_contents("$urlbleue");

    }

//si on est mardi, lancer les ordres au lapin pour la poubelle jaune
elseif ($jour == Tuesday)
    {
        $ordrejaune1 = file_get_contents("$ventrejaune");
        $ordrejaune2 = file_get_contents("$urljaune");

    }

//pour les autres jours lancer les ordres indiquant qu'il n'y a rien à faire
else
        { 
        $ordrerienfaire1 = file_get_contents("$urlrienafaire");
        $ordrerienfaire2 = file_get_contents("$ventreaupif");
        }

?>

[Karotz Gillot-Pétré]{style="text-decoration: underline;"}

Deuxième script permet de faire dire la météo du jour et du lendemain au karotz lorsqu'on lui présente un flatanoz. Les flatanozs sont des petites "figurines" en plastique contenant une puce RFID que le lapin reconnait quand on lui approche du nez. Après avoir enregistré le flatanoz via l'interface du lapin, je l'ai configuré pour qu'il lance une requête vers le script. Comme pour domoticz, il suffit de connaitre l'adresse du script qui est sous la forme http://ip_du_serveur_web/script-meteo.php.

De là, le script va chercher les informations météo pour le jour en cours et le lendemain sur le service de prévision-météo.ch. Ce service gratuit et sans inscription permet de récupérer une grande quantité d'infos météo pour la Suisse, la France et la Belgique au format html ou json. Ces infos sont très nombreuses, et je conseille ce site à tous ceux souhaitant faire du traitement d'information météorologique. L'organisation des données étant en plus très bien documentée.

Le script fait du traitement json via php assez basique, avec extraction des données nécessaires, puis création d'une variable à partir de celle-ci pour créer la partie de l'url fournissant au lapin le texte à dire.

Il m'a fallu contourner 2 soucis lors de la création de ce script. Le premier était que la direction du vent est donnée par les initiales des points cardinaux concernés. Pour un vent d'ouest, la donnée extraite était donc "O". Le karotz indiquait donc que la direction du vent était "O".

J'ai donc utilisé la fonction str_replace pour remplacer ces lettres par des équivalents utilisable pour le lapin. Le "O" devenant "oueste" (avec un "e" pour être bien prononcé).

Ceci fait, un deuxième soucis est apparu: les données d'état du ciel comporte parfois les mêmes signes que les points cardinaux. Ce qui fait que le premier str_replace remplaçait par exemple "Ensoleillé" par "estensoleillé". J'ai donc ajouté un autre str_replace avant le premier pour avoir des infos d'état du ciel non pris en compte par le str_replace des points cardinaux.

Voici le script:

<?php

// Faire passer le ventre du lapin au vert.

$url1 = "http://192.168.0.123/cgi-bin/leds?color=00ff00";
$lapin1 = file_get_contents("$url1");

//récupération et décodage des infos JSON sur le site

$json = file_get_contents('http://www.prevision-meteo.ch/services/json/paris');
$json = json_decode($json);

//création de la phrase en y incluant les infos contenues dans le JSON, et la mettre dans une variable

$today = " A paris, aujourdhui ".$json->fcst_day_0->day_long." Les températures vont de ".$json->fcst_day_0->tmin." degrés a ".$json->fcst_day_0->tmax." degrés. Les conditions sont ".$json->current_condition->condition.". Le vent de ".$json->current_condition->wnd_dir." a une vitesse de ".$json->current_condition->wnd_spd." kilomètre par heure. Demain, les conditions seront ".$json->fcst_day_1->condition." .Les températures iront de ".$json->fcst_day_1->tmin." degrés a ".$json->fcst_day_1->tmax." degrés. ";


//Remplacement des termes non adaptés (points cardinaux et conditions météo)

/// liste points cardinaux à remplacer
$array1 = array("N","NE","E","SE","S","SO","O","NO"); 

///Liste de mots de conditions climatiques à  remplacer
$array2 = array("Eclaircies","Ensoleillé","Nuit","Stratus","Orage","Neige");

/// Liste des mots de remplacement pour les points cardinaux. L'ordre doit correspondre à $array1
$array3 = array("nord","nord%20est","este","sud%20este","sud","sud%20oueste","oueste","nord%20oueste");

/// Liste des mots de remplacement pour les conditions climatiques. L'ordre doit correspondre à $array2
$array4 = array("éclaircies","ensoleillé","nuit","stratus","orage","neige");

///Effectuer le remplacement des conditions météo. A faire en premier pour ne pas que les majuscules soient prises pour des points cardinaux
$today = str_replace($array2,$array4,$today);

/// Effectuer le remplacement des points cardinaux
$today = str_replace($array1,$array3,$today);

/// remplacer les espaces restants par des %20 pour éviter les soucis dans l'url avec les espaces
$replacetoday=str_replace(" ","%20",$today);

// envoi de l'ordre au lapin
$url2 = "http://192.168.0.123/cgi-bin/tts?voice=alice&text=".$replacetoday."&nocache=1";
$lapin2 = file_get_contents("$url2");

// Faire bouger les oreilles du lapin de façon aléatoire
$url3 = "http://192.168.0.123/cgi-bin/ears_random";
$lapin3 = file_get_contents("$url3");
?>

Le lapin annonce donc la météo sur 2 jours à la présentation du flatanoz approprié. Le seul soucis étant les 5 ou 6 secondes de délai avant que le karotz ne se fasse entendre. Ceci correspondant au temps de traitement des données. Je n'ai pas trouvé le moyen de réduire ce temps pour le moment.

Voici une vidéo du script en action:

D'autres scripts devraient voir le jour, je les partagerai ici quand ils en vaudront la peine.