Je vous avez déjà fait un petit article sur l’API eeDomus : eeDomus, une API simple et efficace, je vais aujourd’hui vous parler de l’utilisation de cette API depuis PHP.
L’interaction est très facile, et cela permet vraiment d’étendre à l’infinie les fonctionnalités de la box eedomus en l’associant à un langage de script puissant comme PHP.
Je vais aussi en profiter pour vous proposer un petit service pour faire des opérations arithmétiques sur les périphériques eeDomus… Nous verrons dans un prochain article l’utilisation de la classe pour une bilanterie énergétique grâce au compteur téléinformation EDF.
Les fonctions de la classe PHP :
- Gestion de l’authentification de l’API
- Lecture de la valeur d’un périphérique
- Ecriture de la valeur d’un périphérique
- Opération arithmétique sur les périphériques (+, -, x, /)
- Recopie d’un périphérique dans un autre
Voyons tout d’abord comment utiliser l’API eeDomus en PHP.
Il suffit d’utiliser la fonction file_get_contents avec l’url construite à partir de la documentation de l’API : https://secure.eedomus.com/doc/index.php/API_eedomus
Par exemple, pour changer la valeur d’un périphérique, il suffit de faire :
file_get_contents("https://api.eedomus.com/set?action=periph.value&periph_id=[XXXX]&value=[XXXX]&valued_date=[YYYY-MM-DD HH:MM:SS]&api_user=[XXXX]&api_secret=[XXXX]");
Je vous invite à relire l’article précédent pour les informations d’identification des périphériques et les identifiants API.
La classe eeDomus que je vous propose est assez simple. Elle va gérer automatiquement l’authentification grâce à une récupération des données depuis l’url (en GET) ou en paramètre en POST http.
Voici le code de la classe eedomus.cls.php :
<?php class eeDomus { var $api_user; var $api_secret; var $url_server; var $error; function __construct() { $this->url_server = "https://api.eedomus.com"; $this->error = ""; } function setEeDomusServer($url_server) { $this->url_server = $url_server; } function autoLoginInfo() { if (isset($_GET['api_user'])) $this->api_user = $_GET['api_user']; else if (isset($_POST['api_user'])) $this->api_user = $_POST['api_user']; else $this->api_user = ""; if (isset($_GET['api_secret'])) $this->api_secret = $_GET['api_secret']; else if (isset($_POST['api_secret'])) $this->api_secret = $_POST['api_secret']; else $this->api_secret = ""; } function setLoginInfo($api_user, $api_secret) { $this->api_user = $api_user; $this->api_secret = $api_secret; } function getError() { return $this->error; } function getPeriphValue($periph_id) { $url = $this->url_server."/get?action=periph.caract&periph_id=".$periph_id."&api_user=".$this->api_user."&api_secret=".$this->api_secret; $arr = json_decode(utf8_encode(file_get_contents($url))); print_r($arr); if ($arr->success==1) return $arr->body->last_value; else { $this->error = "Impossible de récupérer la valeur du périphérique (".$periph_id.")"; return 0; } } function setPeriphValue($periph_id, $value) { $url = $this->url_server."/set?action=periph.value&periph_id=".$periph_id."&value=".$value."&api_user=".$this->api_user."&api_secret=".$this->api_secret; return file_get_contents($url); } function setPeriphMath($p1, $p2, $pr, $operator) { $p1_val = $this->getPeriphValue($p1); $p2_val = $this->getPeriphValue($p2); $pr_val = 0; switch ($operator) { case 'egal' : $pr_val = $p1_val; break; case 'plus' : $pr_val = $p1_val + $p2_val; break; case 'moins' : $pr_val = $p1_val - $p2_val; break; case 'div' : if ($p2_val!=0) $pr_val = $p1_val / $p2_val; else $pr_val = $p1_val; break; case 'multi' : $pr_val = $p1_val * $p2_val; break; } $this->setPeriphValue($pr, $pr_val); } function copyPeriphValue($p1, $p2) { $p1_val = $this->getPeriphValue($p1); $this->setPeriphValue($p2, $p1_val); } } ?>
L’utilisation de cette classe est très simple, il suffit d’inclure dans votre code le fichier « eedomus.cls.php », puis ensuite de créer un objet eeDomus.
Si les paramètres d’authentification de l’API ont été passés comme données HTTP, soit par l’url (GET), soit comme donnée de formulaire POST, il suffit d’appeler la fonction autoLoginInfo() :
<?php include ("eedomus.cls.php"); $eedomus = new eeDomus; $eedomus->autoLoginInfo(); ?>
Ensuite par exemple pour faire la différence de deux périphériques (code API 12000 et 12005) avec le résultat dans un Etat virtuel (code API 12200) :
$eedomus->setPeriphMath(12000, 12005, 12200, "moins");
Pour faire la somme :
$eedomus->setPeriphMath(12000, 12005, 12200, "plus");
La division :
$eedomus->setPeriphMath(12000, 12005, 12200, "div");
La multiplication :
$eedomus->setPeriphMath(12000, 12005, 12200, "multi");
Recopier la valeur du périphérique 12000 dans le périphérique 12200 :
$eedomus->setPeriphMath(12000, 0, 12200, "egal");
ou
$eedomus->copyPeriphValue(12000, 12200);
Une multiplication par 1000 :
$val = $eedomus->getPeriphValue(12000); $eedomus->getPeriphValue(12200, $val*1000);
Pour mettre en œuvre cette classe (pour ceux qui ne sont pas développeur), je vous propose un petit service que vous pourrez utiliser directement depuis votre eeDomus.
Il suffit d’utiliser le service
En paramètre il faudra mettre le api_user, le api_secret, le premier périphérique p1, le second périphérique p2 et le périphérique résultat pr. Il faut ensuite l’opérateur (moins, plus, div, multi ou egal)
?api_user=xxxxx&api_secret=xxxxxx&p1=100&p2=9469&pr=2520&operator=moins
Pour l’utiliser avec les règles eedomus, il faut créer un périphérique http de la manière suivante :
Je vous prépare pour bientôt un petit article sur l’utilisation de cette classe dans le cadre de ma bilanterie d’energie chaque jours grâce à mon modem téléinformation EDF.
N’hésitez pas à donner votre avis dans les commentaires, vos idées d’amélioration et vos cas d’utilisation…
Bonjour
Merci pour cet article.
On peut donc envoyer les données dans une base sql?
Merci
Une erreur pour la multiplication.
Ce n’est pas « moins » qu’il faut utiliser mais « multi » (erreur de copier/coller).
@Michael : Oui, aucun soucis, tu peux récupérer les valeurs de tous les périphériques, il suffit ensuite que tu gère le stockage en bdd
@Fabien : Effectivement, merci.
C’est juste GENIAL 😀 Une des dernières fonctions qu’il manquait à l’eedomus ! Merci Mickael 😀
Effectivement, génial ! Merci !
Super cette fonction, peut on l’appliquer à l’Aeon Energy Meter, sachant que celui-ci ne retourne pas d’index mais seulement une indication de conso instantanée?
Si il y a une possibilité d’avoir une estimation du coût en fonction de la conso instantané, ça serait vraiment super.
Une petite idée d’amélioration de la classe : l’ajout d’une option « échange », permettant d’échanger les valeurs de 2 périphériques.
🙂
Aller, la solution, à mettre dans eedomus.cls.php ligne 100 après le break et avant le } :
case 'echange' :
$pr = $p2;
$pr_val = $p2_val;
$this->copyPeriphValue($p1, $p2);
break;
Petite correction, code correct :
case 'echange' :
$pr = $p1;
$pr_val = $p2_val;
$this->copyPeriphValue($p1, $p2);
break;
ou alors plus simple:
case ‘echange’ :
// copie de P1 dans P2
$this->copyPeriphValue($p1, $p2);
//copie de la valeur de P2 dans p1
$this->setPeriphValue($p1,$p2_val);
break;
et ça marche aussi, je l’ai implémenté 🙂
la classe modifiée et plus 🙂 se trouve à http://code.google.com/p/framework-php-eedomus/
Bravo pour cet article,
Je suis impatient de voir la suite : je viens d’acquérir une box eedomus, avec la teleinfo…
Je souhaite avoir sur mon tableau de bord les données « de base » comme la consommation (et la production pour mes panneaux solaires) journalière, hebdo, mensuelle en watt, et l’équivalence en Euros.
Sauf erreur, ce n’est pas possible en natif sur eedomus…?
Bravo encore pour tes articles.
N’ayant pas d’eedomus je n’ai pas tout compris au truc, entre autre où se trouvent les fichiers php que l’on créé.
De mon coté j’ai des détecteur HSP02 et je souhaiterai pouvoir changer la configuration de ces modules pour les activer et désactiver quand j’arme l’alarme ou non. Possible ?
Bonjour,
Est-ce qu’il est envisageable d’intégrer toutes ces valeurs dans un google spreadsheet afin de tracer un historique (et pourquoi pas un widget graph)? Parce que si je comprend bien, nous perdons l’historique au fur et à mesure?
Sinon savez-vous comment récupérer l’adresse du graphique pour le partager sur un site web?
Merci pour votre aide!
Bonjour
le script est t’il toujours d’actualités ? je commence a récupéré les différent état de mes compteurs et je me demandais si je pouvais encore utiliser ce très bon script avec ma box
vu les dernière amélioration de la box ont-il intégré quelque chose de resembblant
Bonjour,
Je viens de rencontrer un léger bug dans l’utilisation de la classe. En effet lorsque le nom de mon périph contient une apostrophe, le nom récupéré est \’ et non ‘.
Du coup il semblerait que la fonction json_decode n’interprète pas cet enchaînement. En forçant un remplaçant le \’ par un &apos (et surement sur d’autres caractères d’échappement).
Il y a surement un façon plus propre de faire mais celle ci fonctionne pour mon besoin.
Je laisse le soin aux ‘pro’ de trouver le bon paramètre qui va bien ^^.
Bonjour Mickaël, je suis nouveau en domotique.
Mon objectif: lancer le chauffage d’une location uniquement des clients sont sur le point d’arriver.
Aujourd’hui toutes mes réservations arrivent sur Beds24 qui agrègent tous mes canaux de réservation (booking, airbnb etc)
Avec Beds24 je sais que quand une résa arrive je peux exécuter une requête http avec les paramètres de la résa (date de début, date de fin etc).J’aimerais pouvoir stocker ces plages et faire en sorte qu’eedomus lance le chauffage quand on est dans une de ces plages. Selon toi est-ce possible ? Si oui comment ferais tu ?