Dernières nouvelles

Une classe PHP pour s’interfacer avec l’API eeDomus

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("http://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 = "http://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 http://eedomus.ts-box.fr/op.php

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…

A propos de Mickael

Je suis passionné de Domotique depuis des années. J'ai fait du développement en informatique industrielle pendant 12 ans, et un jour ... je me suis lancé ! J'ai créé ma boutique de vente en ligne : http://www.planete-domotique.com

14 commentaires

  1. Bonjour
    Merci pour cet article.
    On peut donc envoyer les données dans une base sql?
    Merci

  2. Une erreur pour la multiplication.

    Ce n’est pas « moins » qu’il faut utiliser mais « multi » (erreur de copier/coller).

  3. @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.

  4. C’est juste GENIAL :D Une des dernières fonctions qu’il manquait à l’eedomus ! Merci Mickael :D

  5. Effectivement, génial ! Merci !

  6. 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.

  7. 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.

    :-)

  8. 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;

  9. Petite correction, code correct :
    case 'echange' :
    $pr = $p1;
    $pr_val = $p2_val;
    $this->copyPeriphValue($p1, $p2);
    break;

  10. 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é :-)

  11. 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.

  12. 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 ?

  13. 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!

Répondre

Votre adresse email ne sera pas publiée. Les champs obligatoires sont marqués d'une étoile *

*

Vous pouvez utiliser ces balises et attributs HTML : <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Revenir en haut de la page