Insérer des données dans une box domotique Eedomus

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 »

Eedomus : créer un element de programmation "état"Sur un navigateur internet, accéder à la console eedomus (https://secure.eedomus.com/).

  1. Cliquer sur l’onglet « configuration » puis sur le bouton « ajouter ou supprimer un périphérique ».
  2. 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 :

Réglage d'un capteur d'état sur Eedomus

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 « « , 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 :

PHP : envoi de données à l'Eedomus

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.

Poster un Commentaire

avatar
  S’abonner  
Notifier de