J’ai un Raspberry Pi qui collecte des données issues de capteurs reliés à un arduino. Actuellement les données sont archivées dans des fichiers textes sur le Pi. Je veux envoyer les données à ma box Eedomus pour qu’elle en assure l’archivage et l’affichage.
Il faut donc que je réalise les actions suivantes :
- sur l’Eedomus : créer des « éléments de programmation » de type « état » pour chaque donnée à collecter.
- Sur le Raspberry Pi : lire les fichiers texte des données collectées et les envoyer à l’Eedomus tous les quarts d’heure.
Eedomus : créer des éléments de programmation de type « état »
Sur un navigateur internet, accéder à la console eedomus (https://secure.eedomus.com/).
- Cliquer sur l’onglet « configuration » puis sur le bouton « ajouter ou supprimer un périphérique ».
- Dans la nouvelle fenêtre, cliquer sur le bouton « ajouter un autre type de périphérique ».
Régler le nouveau capteur d’état et noter son code API (450118) pour le capteur ci-dessous :
Une fois qu’on a cliqué sur le bouton « Sauver », le capteur est créé. Il est classé dans les périphériques virtuels.
Le capteur ne contient aucune valeur. Il faut lui en donner par des commandes HTTP via l’API d’Eedomus.
Raspberry Pi : envoyer une valeur au capteur créé
Voir la documentation Eedomus sur la manière de définir la valeur d’un capteur ici.
En manuel, pour envoyer une donnée à ce capteur, il me suffit d’envoyer une commande HTTP via un navigateur :
https://api.eedomus.com/set?action=periph.value&api_user=xxx&api_secret=xxx&periph_id=450118&value=24.2&value_date=2016-08-17 08:47:00
Et le navigateur affiche un message de succès :
{ "success": 1, "body": { "result": "[OK]" } }
Et dans la box Eedomus, la dernière valeur du capteur est maintenant 24.2°C à 8h47 le 17 août.
Raspberry Pi : lire un fichier texte et envoyer à l’Eedomus
J’explore les scripts PHP à faire dans l’article « Manipuler des fichiers en PHP« . Ici, je vais lire un fichier texte qui contient les températures mesurées dans mon bureau.
Localisation du fichier : /home/jf/temp/temperatures.log
Les données sont archivées sous la forme (11 dernières lignes) :
28-00043d87b4ff 24.25 Wed, 17 Aug 2016 06:58:25 GMT 28-00043d87b4ff 24.25 Wed, 17 Aug 2016 06:58:35 GMT 28-00043d87b4ff 24.312 Wed, 17 Aug 2016 07:05:52 GMT 28-00043d87b4ff 24.312 Wed, 17 Aug 2016 07:06:05 GMT 28-00043d87b4ff 24.25 Wed, 17 Aug 2016 07:06:16 GMT
Il va falloir que mon script php aille chercher la dernière ligne non vide puis en sorte la température (24.25) et la date au format compréhensible par l’Eedomus (AAAA-MM-JJ HH:MM:SS).
Pour lire le fichier à partir de la fin : voir cette question sur stackoverflow.
J’ai complété le fichier eedomus.php , créé dans l’article précédent de cette série « Un tableau de bord domotique« , avec la fonction suivante :
/****************************************************************** * appel de l'API eedomus en PHP pour donner une valeur une donnée * * $id = 450118 * $val = 24.2 * $date = '2016-08-17 08:47:00' * mettra la valeur 24.2, à la date 2016-08-17 08:47:00 dans le capteur "état" d'ID 450118 * *****************************************************************/ //&value=24.2&value_date=2016-08-17 08:47:00 function al_set_eedomus_sensor( $id, $val, $date ) { global $api_user ; global $api_secret ; // eedomus date must be url encoded before it is sent $date = urlencode( $date ); // construction de l'URL de l'API $url = "https://api.eedomus.com/set?action=periph.value"; $url .= "&api_user=$api_user"; $url .= "&api_secret=$api_secret"; $url .= "&periph_id=$id"; $url .= "&value=$val"; $url .= "&value_date=$date"; echo "http command --------------- \n\r" ; echo $url ; echo "\n --------------------------- \n\r" ; // appel de l'API $result = file_get_contents( $url ); // on controle le résultat if (strpos($result, '"success": 1') == false) { echo "Une erreur est survenue : [".$result."]\n"; } else { // Tout s'est bien passé echo "OK, la valeur a été transmise [".$result."] \n"; } }
et j’ai créé un fichier send-temp-to-eedomus.php (droits 740), placé comme eedomus.php dans le répertoire ‘/home/jf/eedomus ‘ du Pi « alradio ». Ce script contient :
#!/usr/bin/php <?php /**************************************************** * read last non blank line from file ****************************************************/ $directory = '/home/jf/temp/'; $log_file = 'temperatures.log' ; $pos = -10; // number of lines to read at end of file $t = ""; $handle = fopen( $directory . DIRECTORY_SEPARATOR . $log_file, 'r' ); // source : http://stackoverflow.com/questions/6451232/reading-large-files-from-end while ( $t != "\n" ) { fseek( $handle, $pos, SEEK_END ); $t = fgetc( $handle ); $pos = $pos - 1; } $lastline = fgets( $handle ); echo " last line : " . $lastline ; fclose( $handle ); /**************************************************** * now get each individual values ****************************************************/ date_default_timezone_set ( 'Europe/Paris' ) ; $val = explode( "\t", $lastline ); // echo "---------------------------- \n\r" ; // var_dump( $val ) ; $date_var = explode( " ", $val[2] ) ; $day = $date_var[1] ; // for month conversion from text to number, see http://stackoverflow.com/questions/3283550/convert-month-from-name-to-number $date = date_parse( $date_var[2] ); // echo "month --------------------- \n\r" ; // var_dump( $date["month"] ); $month = $date["month"] ; $year = $date_var[3] ; $time = explode( ":", $date_var[4] ) ; $heure = $time[0] ; $minute = $time[1] ; $seconde = $time[2] ; $fuseau = $date_var[5] ; // convertir en timestamp GMT (utiliser mktime si l'heure n'est pas GMT) $gmt_timestamp = gmmktime( $heure, $minute, $seconde, $month, $day, $year ) ; // convertir timestamp GMT en heure locale lisible par Eedomus 2016-08-17 08:47:00 $date_humain = date ( "d/m/Y H:i:s" , $gmt_timestamp ) ; $date_eedomus = date ( "Y-m-d H:i:s" , $gmt_timestamp ) ; // echo "time --------------------- \n\r" ; // var_dump( $time ) ; // echo "date_var --------------------- \n\r" ; // var_dump( $date_var ) ; echo "---------------------------- \n\r" ; echo "°C : " . $val[1] . " date : " . $date_humain . "\n\r" ; echo "---------------------------- \n\r" ; /**************************************************** * now send the value to the Eedomus * with al_set_eedomus_sensor( $id, $val, $date ) ****************************************************/ include 'eedomus.php'; $id = 450118 ; // capteur eedomus 'température bureau' al_set_eedomus_sensor( $id, $val[1], $date_eedomus ) ; ?>
Dans le Pi alradio, si je tape les commandes :
cd /home/jf/eedomus ./send-temp-to-eedomus.php
La console affiche les informations suivantes :
Et dans le tableau de bord Eedomus, la valeur a effectivement été modifiée.
Exécuter automatiquement le script d’envoi de données
Je vais utiliser le cron, comme dans l’article Supprimer les fichiers vidéo et image de plus de deux jours , à ceci près que c’est un fichier PHP que je vais exécuter.
J’utilise le générateur http://crontab-generator.org/ pour simplifier les choses.
J’ajoute donc la ligne suivante (SHIFT + INSER pour coller) au cron du Pi via crontab -e :
*/15 * * * * /usr/bin/php /home/jf/eedomus/send-temp-to-eedomus.php
Puis « reboot » à 14h17. Logiquement je devrais avoir une nouvelle valeur vers 14h30.
Ca fonctionne. Le capteur est effectivement mis à jour toutes les 15 minutes sur l’Eedomus.