PiHomeDashscreen et domotique : températures et humidité

PiHomeDashScreen_domotique_meteo

Quand j’ai débuté le projet PiHomeDashscreen il y a un peu plus de deux ans (déjà ?!?), j’avais déjà en tête de le relier, un jour, à un système domotique. En effet, ce type d’écran d’information domestique ne présente de réel intérêt que si les données affichées sont utiles au quotidien. Quoi de plus pertinent que des informations concernant la maison, les températures intérieures et extérieures, la consommation électrique, l’état de l’alarme anti intrusion, la vidéo-surveillance etc… ?

Aujourd’hui, nous allons voir comment exploiter les données de température et d’humidité d’une installation domotique à base de Raspberry Pi et Domoticz et les afficher sur notre PiHomeDashScreen. Cette méthode, qui se base sur l’API de Domoticz, est générique et peut s’appliquer à n’importe quel type de données ou module domotique (interrupteurs, sondes météo, capteur de luminosité, chauffage…).

Prérequis

IMG_8255Avant de pouvoir afficher la température et l’humidité de l’intérieur et l’extérieur de votre maison, vous devez au préalable :

Le matériel

Vous pouvez installer le PiHomeDashScreen et votre box Domoticz sur le même Raspberry Pi. Dans ce cas, voici le matériel minimum dont vous aurez besoin :

everspring_st814Vous pouvez utiliser n’importe quel sonde météo compatible z-wave comme les bien connues Everspring ST814.

Pour ma part j’utilise des sondes de température et d’humidité Oregon Scientific, réputées pour leur fiabilité. Pour pouvoir les faire fonctionner avec votre Pi et Domoticz vous devrez vous équiper en plus du module USB RFXtrx433.

Le PiHomeDashScreen

Une fois en possession de tout le matériel nécessaire, vous devrez donc avoir installé et configué le PiHomeDashScreen comme détaillé ici : http://www.magdiblog.fr/boa-pi-homedashscreen/1-raspberry-pi-home-dash-screen/

Domoticz

DomoticzVous devrez également avoir installé et configuré le module z-wave Razberry ou le module USB RFXtrx433 ainsi que Domoticz comme expliqué ici : http://www.magdiblog.fr/domotique/raspberrypi-razberry-rfxtrx433usb-domoticz-le-combo-parfait/

Récupération des données

A ce stade, tout devrait être fonctionnel et vous devriez avoir vos sondes de température opérationnelles dans Domoticz. Pour ma part, j’ai bien mes deux sondes Oregon avec la température et l’humidité comme on peut le voir dans la capture d’écran ci-dessous :

domoticz_sondes_temperature

Si vous n’avez pas vos sondes correctement détectées dans Domoticz c’est que vous avez loupé une étape. Il est inutile de poursuivre tant que tout n’est pas opérationnel, je vous invite donc à bien relire cet article : http://www.magdiblog.fr/domotique/raspberrypi-razberry-rfxtrx433usb-domoticz-le-combo-parfait/

Si tout est ok, alors la suite va se révéler très simple 🙂 En effet, Domoticz propose une API JSON qui permet, entre autres, d’accéder à toutes les données de vos équipements domotique et en particulier vos sondes de température.

Note : Vous trouverez la documentation complète de l’API JSON de Domoticz ici : https://www.domoticz.com/wiki/Domoticz_API/JSON_URL’s

La récupération des données se fait simplement avec une requête HTTP GET sous la forme d’une URL de type :

http://adresse_ip_du_pi:8080/json.htm?type=devices&rid=id_du_module

L’id des modules en question est visible directement dans Domoticz dans l’onglet « setup/devices » :

domoticz_sondes_temperature_ids

Dans cet exemple, j’ai donc ma sonde extérieure (Oregon Outside) avec l’id 116 et ma sonde intérieure (Oregon Inside) avec l’id 117.

Pour récupérer les données de la sonde extérieure par exemple, je vais donc utiliser l’URL suivante :

http://adresse_ip_du_pi:8080/json.htm?type=devices&rid=116

L’API Domoticz va renvoyer une série de données au format JSON :

{
 "ActTime" : 1440510947,
 "ServerTime" : "Aug 25 2015 15:55:47",
 "Sunrise" : "06:52:00",
 "Sunset" : "20:47:00",
 "result" : [
 {
 "AddjMulti" : 1.0,
 "AddjMulti2" : 1.0,
 "AddjValue" : 0.0,
 "AddjValue2" : 0.0,
 "BatteryLevel" : 100,
 "CustomImage" : 0,
 "Data" : "20.2 C, 56 %",
 "DewPoint" : "11.14",
 "Favorite" : 1,
 "HardwareID" : 2,
 "HardwareName" : "RFXCOM",
 "HaveTimeout" : false,
 "Humidity" : 56,
 "HumidityStatus" : "Comfortable",
 "ID" : "FB02",
 "LastUpdate" : "2015-08-25 15:55:13",
 "Name" : "Oregon Outside",
 "Notifications" : "false",
 "PlanID" : "0",
 "Protected" : false,
 "ShowNotifications" : true,
 "SignalLevel" : 5,
 "SubType" : "THGN122/123, THGN132, THGR122/228/238/268",
 "Temp" : 20.20,
 "Timers" : "false",
 "Type" : "Temp + Humidity",
 "TypeImg" : "temperature",
 "Unit" : 2,
 "Used" : 1,
 "XOffset" : "0",
 "YOffset" : "0",
 "idx" : "116"
 }
 ],
 "status" : "OK",
 "title" : "Devices"
}

Note : Les données renvoyées par l’API de Domoticz peuvent varier d’une sonde à une autre mais de manière générale vous devriez identifier rapidement les informations dont vous avez besoin.

Dans cet exemple, on repère facilement le champ « Data » qui contient à la fois la température en degrés Celsius et le taux d’humidité en pourcentage :

"Data" : "20.2 C, 56 %"

On repère également les champs « Humidity » et « Temp » qui présentent ces mêmes données de manière brut, c’est à dire sans unité (plus facile à traiter par la suite) :

"Humidity" : 56
[...]
"Temp" : 20.20

Maintenant que nous savons comment récupérer et identifier précisément les données qui nous intéressent, il ne nous reste plus qu’à créer un module pour notre PiHomeDashScreen 🙂

Code source à implémenter dans le PiHomeDashScreen

Comme pour la plupart des autres modules, il va nous falloir ajouter un conteneur dans la page d’index, puis déclarer les fonctions PHP et JavaScript qui se chargeront de récupérer et d’afficher les informations 🙂

Note : Pour plus d’information sur le fonctionnement des modules du PiHomeDashScreen, je vous invite à lire cet article : http://www.magdiblog.fr/boa-pi-homedashscreen/3-principe-de-base/

index.php

C’est parti ! On commence par le fichier index.php dans lequel il faut placer deux conteneurs principaux (intérieur et exterieur) puis deux sous-conteneurs température et humidité :

<div id="inside">
 In
 <div id="temp_in"></div>
 <div id="hum_in"></div>
</div>

<div id="outside">
 Out
 <div id="temp_out"></div>
 <div id="hum_out"></div>
</div>

style.css

On positionne les deux conteneurs principaux sur l’écran et on ajuste le style d’affichage de la température et de l’humidité :

div#inside
{
 width : 200px;
 height : 270px;
 right : 0px;
 bottom : 0px;
 position : absolute;
 padding : 5px;
 border : solid 0px #D33;
 z-index : 999;
 text-align : center;
 color : #555;
 font-size : 20px;
 font-weight : bold;
}

div#temp_in
{
 width : 200px;
 background-color : rgba(0, 0, 0, 1);
 text-align : center;
 font-size : 60px;
 padding : 0px;
 border : solid 0px #33D;
 margin : 0px auto;
}

div#hum_in
{
 width : 200px;
 background-color : rgba(0, 0, 0, 1);
 text-align : center;
 font-size : 50px;
 padding : 0px;
 border : solid 0px #33D;
 margin : 0px auto;
}

div#outside
{
 width : 200px;
 height : 170px;
 right : 220px;
 bottom : 100px;
 position : absolute;
 padding : 5px;
 border : solid 0px #D33;
 z-index : 999;
 text-align : center;
 color : #555;
 font-size : 20px;
 font-weight : bold;
}

div#temp_out
{
 width : 200px;
 background-color : rgba(0, 0, 0, 1);
 text-align : center;
 font-size : 60px;
 padding : 0px;
 border : solid 0px #33D;
 margin : 0px auto;
}

div#hum_out
{
 width : 200px;
 background-color : rgba(0, 0, 0, 1);
 text-align : center;
 font-size : 50px;
 padding : 0px;
 border : solid 0px #33D;
 margin : 0px auto;
}

span.hum_unit
{
 font-size : 25px;
}

javascript.js

Une seule fonction JavaScript pour récupérer la température et l’humidité des deux sondes :

/* temp */

var temp_timeout;

function temp () {
  $.ajax({
    async : false,
    type: "GET",
    dataType: "json",
    url: "./ajax.php",
    data: "block=temp",
    success: function(html){
      $("#temp_in").html(html.temp_in.temp);
      $("#temp_out").html(html.temp_out.temp);
      $("#hum_in").html(html.temp_in.hum);
      $("#hum_out").html(html.temp_out.hum);
    }
  });

  temp_timeout = setTimeout("temp()", 120000);
}

Note : Une actualisation de l’affichage toutes les deux minutes (120000 ms) est largement suffisante. On peut même pousser à dix minutes, les températures ne variants jamais très brutalement.

ajax.php

Comme pour les autres modules, il suffit d’ajouter l’appel à la bonne fonction PHP :

/////////////////////////////////////////////////
//  TEMP
/////////////////////////////////////////////////

if($block == 'temp'){
  echo tempAll ();
}

inc.php

Petite subtilité ici, nous séparons le travail en deux fonctions. La fonction tempAll() appellera la fonction temp() pour chaque sonde et renverra un array contenant l’ensemble des données. En procédant de la sorte, on factorise un peu le code et on rend plus facile l’ajout d’une troisième sonde.

C’est donc la fonction temp() qui se chargera de contacter l’API Domoticz comme expliqué en début d’article. On utilise pour cela cURL qui est un outil permettant de lancer des requêtes HTTP 🙂 On prendra soin d’adapter les ids des devices/sondes que l’on souhaite atteindre.

  /////////////////////////////////////////////////
  //  TEMP
  /////////////////////////////////////////////////

  function tempAll () {

    $datas = array();

    $temp_in = temp ('in');
    $temp_out = temp ('out');

    $datas['temp_in'] = $temp_in;
    $datas['temp_out'] = $temp_out;
    
    $datas = json_encode($datas);

    return $datas;
  }

  function temp ($location) {

    if($location == 'out') {
      $device_id = 116;
    }
    else if($location == 'in') {
      $device_id = 117;
    }
    else{
      $device_id = "X";
    }

    $url = "http://adresse_ip_domoticz:8080/json.htm?type=devices&rid=".$device_id;
    $curl = curl_init();
    curl_setopt($curl, CURLOPT_URL, $url);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 5);
    $return = curl_exec($curl);
    curl_close($curl);
    $data = array('temp' => '', 'hum' => '');
    if(json_decode($return)->result[0]->Temp) {
      $data['temp'] = json_decode($return)->result[0]->Temp.'°';
    }
    else{
      $data['temp'] = json_decode($return)->result[0]->Temp.'°';
    }
    if(json_decode($return)->result[0]->Humidity){
      $data['hum']  = json_decode($return)->result[0]->Humidity.'<span class="hum_unit">%</span>';
    }
    return $data;
  }

Note : Les données renvoyées par l’API de Domoticz sont au format JSON. Il faut donc veiller à décoder ces données en utilisant la fonction json_decode(). Notez également que nous ré-encodons en JSON les données renvoyées par la fonction tempAll() grâce à la fonction json_encode(), afin qu’elles puissent être facilement lues par la fonction JavaScript.

Et voilà le résultat 🙂

PiHomeDashScreen_temperature_humidite

Le mot de la fin

Comme évoqué plus haut dans l’article, ce principe d’utilisation de l’API Domoticz avec le PiHomeDashScreen peut être décliné pour n’importe quel type de sonde (météo, luminosité, ouverture de porte, état des lumières, système d’alarme…).

Dans cet exemple j’ai utilisé deux sondes de température, mais il est tout à fait possible d’exploiter les données d’autant de sondes et capteurs que vous le souhaitez 🙂 On pourrait même envisager d’afficher un plan de la maison avec la température de chaque pièce par exemple.

A très bientôt pour la suite 🙂

image

43 réflexions au sujet de « PiHomeDashscreen et domotique : températures et humidité »

  1. nico

    encore un excellent article.

    Après avoir honteusement copié une grande partie de ton blog pour créer mon dashscreen, (les planètes et la météo) et m’en être fortement inspiré pour d’autre module (l’heure avec cette autres site: http://pascalmyrta.com/horloge.html) j’avais réussi à y intégrée les températures de toutes les pièces de mon domicile.

    Perso je n’utilise pas domoticz mais z-way (fourni avec le module razberry).
    Pour la différence entre extérieur/intérieur j’avais réalisé une petite image en forme de maison (très basic) sur laquelle j’affiche les temp.

    je te mettrais bien une image mais je ne vois pas comment faire

    Répondre
    1. Olivier Auteur de l’article

      Hello,
      J’utilise également z-way, mais avec Domoticz par dessus pour piloter tout ce qui n’est pas en z-wave 🙂

      Répondre
      1. Milloux

        Débutant dans la domotique et la météo, Je souhaiterais savoir comment sont générées les prévisions (calculées à partir des données récoltées ou données par un site Web…).
        Merci.

        Répondre
        1. Seb

          Salut Nico,
          Ton dash screen est vraiment super!
          Il est possible d’avoir tes fichiers pour en copier une partie?
          Extrèmement novice, je pioche ça et là des infos pour créer mon dash aussi.
          Tout reste privé, je n’ai pas l’intention de me vanter de quoi que ce soit ou que ce soit! Juste me faire plaisir en faisant un peu de domotique « moi-même »…
          Merci bcp! Seb.

          Répondre
  2. Ping : MagdiBlog : PiHomeDashscreen et domotique : températures et humidité - Maison et Domotique

  3. tikismoke

    Faudrait que je montre le miens un de ces 4.

    J’applique la même méthode avec domogik (lecture Json) et affichage sur le plan de ma maison.

    Le tout sur un ecran tactile pour afficher les cameras en plus.

    Répondre
  4. nico

    bonjour

    je viens de me rendre compte en allant sur l’interface de Z-way que mes capteurs affichaient une multitude d’informations qui n’ont pas de sens:

    par exemple mon Everspring ST814 affiche:

    temperature; humidity; power; velocity; temperature (une autre); …

    est ce que quelqu’un a le même souci????

    Répondre
      1. nico

        bonjour.

        Oui je suis certain. Mes économie ne me permettent pas, pour l’instant, d’avoir plus de 3 devices.

        ce qui est bizarre c’est que lorsque je les ré-incluent ils redeviennent normaux pendant un certain laps de temps

        Répondre
  5. Ping : Domotique | Pearltrees

  6. Franck

    Bonjour,
    Etant novicee en programmation, je n’arrives pas à trouver où je me suis trompé, car je n’est rien qui s’affiche.
    Pourtant j’arrive bien à acceder à la page html de domoticz, les valeurs y sont.
    J’essaye de mettre des valeurs en dur dans le tableau $data, mais toujours rien.
    Où se trouve le problème
    Mercide votre aide

    Répondre
  7. Pascal

    Bonjour,

    je tiens dans un premier temps à féliciter pour la clarté de ces tutos
    Je viens de suivre le tutoriel a la lettre je pense avoir rien oublié.
    Par contre rien ne s’affiche sur le dashscreen.
    En rentrant l’URL http://adresse_ip_du_pi:8080/json.htm?type=devices&rid=116 j’obtiens domoticz offline car je me suis pas connecté à l’interface domoticz, par contre si je me connecte et que je réessaie l’URL la ça marche.
    Ma question est : vu que j’ai mis un mot de passe pour accéder a domoticz je me demande si l’URL est bien accessible au dashscreen ?
    Merci pour vos réponses

    Répondre
    1. Pascal

      Alors j’ai essayé en enlevant le mot de passe pour accéder à domoticz, j’arrive à accéder directement à la sonde il n’y a plus de domoticz offline mais sur le dashscreen rien ne s’affiche.
      Est ce que quelqu’un a le même problème ?
      N’y a t’il pas une erreur dans le code ?

      Par avance merci pour vos réponses

      Répondre
      1. Pascal

        Bonsoir à tous,

        Pour ceux qui ont comme moi le problème d’affichage après avoir copier collé le code. Le problème vient qu’il faut dans le javascript.js ajouter en haut du document temp();
        Vous devez donc avoir ca :
        $(document).ready(function() {
        horloge();
        ts3();
        xplanet();
        ifstat();
        meteo();
        vpn();
        ping();
        temp();
        });

        Bonne soirée

        Répondre
  8. Ping : ZWAVE - XBEE | Pearltrees

  9. Ping : Raspberry - Remote things | Pearltrees

  10. Jej

    Bonsoir,

    Superbe tuto qui fonctionne à merveille !
    Seul bémol de mon côté au niveau du rafraichissement des informations sur le dash.
    Les remontées de température par exemple ne varient pas toutes les 2 minutes.
    Je suis obligé de reloader toute la page pour rafraichir les datas.
    Quelqu’un a-t-i rencontré le même pb ?

    Répondre
    1. Olivier Auteur de l’article

      Bonsoir,
      Est ce que les requêtes AJAX passent bien ? En ouvrant la page du dashscreen dans un navigateur vous pourrez voir les requêtes AJAX et leur résultats grâce à un outil de debug type FireBug

      Répondre
  11. Jej

    Mea culpa.
    Une erreur de frappe de mon côté sur l’appel à la fonction temp() dans le fichier ajax.php !
    En tous les cas merci Olivier pour ta réponse rapide qui m’a mis sur la voie.

    Répondre
  12. Guillaume

    Bonjour Olivier,

    Plutôt que d’utiliser crontab pour éteindre le dashscreen, j’ai écrit un script qui éteint proprement le Pi via une commande domoticz (un bouton ou une heure de déclenchement ou les deux), commande qui fait un shutdown du pi puis qui coupe l’alimentation du Pi et de son écran 60 secondes plus tard.

    ______________________________________
    Dans /var/www je crée un fichier shutdown.php :

    On change le mode d’exécution
    sudo chmod +s /var/www/shutdown.php
    ________________________________________
    Je crée un fichier python shutdown.py :

    command = « /usr/bin/sudo /sbin/shutdown -h now »
    import subprocess
    process = subprocess.Popen(command.split(), stdout=subprocess.PIPE)
    output = process.communicate()[0]
    print output

    Attention à ne pas mettre d’indentation (Python les interprète).

    ________________________________________
    On donne les droits au user Apache par défaut d’exécuter la commande système shutdown

    sudo visudo
    et on rajoute les lignes

    www-data ALL=/sbin/shutdown
    www-data ALL=NOPASSWD: /sbin/shutdown

    On sort par X

    ________________________________________
    En appelant depuis n’importe quel machine
    http://Adresse ip du Pi/shutdown.php

    cela éteint le pi
    ________________________________________
    Donc dans Domoticz >>events il n’y a plus qu’à appeler cette page sur évènement :

    if « pression bouton télécommande » ou « il est l’heure d’éteindre le pi »
    then openUrl http://Adresse ip du Pi/shutdown.php
    set prise_commandée_du_pi_et_de_son_écran = Off after 60 seconds

    ________________________________________
    Ne pas oublier de faire le ménage dans crontab pour supprimer les extinctions programmées du
    Pi, maintenant inutiles
    ________________________________________

    Espérant que ça serve !

    Cordialement.

    Répondre
  13. xavier

    Bonsoir,
    ça ne fonctionne pas chez moi (base raspberry avec domoticz installé)
    -> 500 internal server error (en mode debug), sinon rien à l’affichage.
    Il manque curl….
    D’où correction :
    sudo apt-get install php5-curl
    sudo /etc/init.d/apache2 reload
    Et là ça va beaucoup mieux 🙂
    Reste à décortiquer le code, pour le moment je suis perdu.

    @+

    xavier

    Répondre
  14. Seb

    Bonsoir,
    c’est a rien y comprendre.
    Tout est bien copié, l’url avec les id des capteurs sont bien indiqué…
    Mais rien ne s’affiche mise à part IN & OUT. Mais dessous, écran noir!
    J’ai beau chercher l’erreur…
    Une piste pour tenter de trouver ce qu’il ne va pas svp?
    Par avance merci.
    Seb

    Répondre
  15. Seb

    Salut la communauté.
    Bon je comprend vraiment pas!!! Tout mes modules fonctionnent (xplanet, date & heure, météo, fête à souhaiter) mais l’affichage de la température et l’humitidé est absente! J’ai bien IN & OUT, mais aucune mesure.
    Je me demande si il n’y a pas une lib supplémentaire à installer…
    Ou alors, avez-vous une methode pour voir d’où peut venir le problème?
    Merci bien.
    Seb

    Répondre
  16. Seb

    Ah oui, quand le tape l’adresse pour avoir les données de l’API Domoticz, j’ai bien toute la liste des infos…
    SVP aidez moi, ça fait des jours que je cherche, et je trouve rien…

    Répondre
  17. Seb

    La preuve… ;-p

    {
    « ActTime » : 1471680315,
    « ServerTime » : « 2016-08-20 10:05:15 »,
    « Sunrise » : « 06:56 »,
    « Sunset » : « 20:54 »,
    « result » : [
    {
    « AddjMulti » : 1.0,
    « AddjMulti2 » : 1.0,
    « AddjValue » : 0.0,
    « AddjValue2 » : 0.0,
    « BatteryLevel » : 100,
    « CustomImage » : 0,
    « Data » : « 23.1 C, 59 % »,
    « Description » : «  »,
    « DewPoint » : « 14.65 »,
    « Favorite » : 1,
    « HardwareID » : 3,
    « HardwareName » : « RFXtrx433 (USB10) »,
    « HardwareType » : « RFXCOM – RFXtrx433 USB 433.92MHz Transceiver »,
    « HardwareTypeVal » : 1,
    « HaveTimeout » : false,
    « Humidity » : 59,
    « HumidityStatus » : « Comfortable »,
    « ID » : « 6501 »,
    « LastUpdate » : « 2016-08-20 10:04:56 »,
    « Name » : « Salon »,
    « Notifications » : « false »,
    « PlanID » : « 0 »,
    « PlanIDs » : [ 0 ],
    « Protected » : false,
    « ShowNotifications » : true,
    « SignalLevel » : 7,
    « SubType » : « THGN122/123, THGN132, THGR122/228/238/268 »,
    « Temp » : 23.10,
    « Timers » : « false »,
    « Type » : « Temp + Humidity »,
    « TypeImg » : « temperature »,
    « Unit » : 1,
    « Used » : 1,
    « XOffset » : « 0 »,
    « YOffset » : « 0 »,
    « idx » : « 2 »
    }
    ],
    « status » : « OK »,
    « title » : « Devices »
    }

    Répondre
  18. Seb

    Bonjour à vous,
    Bon malgré le manque de réponse, j’ai enfin réussi à résoudre mon probème! (3 semaines de réflexion et de recherche) Je suis extrèmement novice en prog…

    Allez je ne suis pas rancunier et je vous donne ma solution des fois qu’un d’en vous est le même soucis.

    J’ai du légèrement modifier le fichier « inc.php ».
    Le signe ‘°’ bloquait tout. je l’ai simplement remplacé par ‘&deg’! Et hop le tour est joué!

    J’ai aussi supprimé la ligne suivante :
    else{
    $data[‘temp’] = json_decode($return)->result[0]->Temp.’°’;}
    A priori elle ne sert à rien…

    Voilà, merci quand même Olivier pour tes programmes!
    Mon dash commence à avoir une sacré gueule! ;-p

    A bientôt.
    Seb

    Répondre
  19. Ping : RaspberryPi - Arduino / Elec | Pearltrees

  20. Seb

    Bonjour à tous,
    Est-ce que l’un de vous aurai une idée pour afficher la température d’une couleur différente suivant le temps?
    Par exemple, afficher la température extérieure en bleu si inférieur à 0°C et en rouge si supérieur à 30°C?
    Merci à vous.
    Seb

    Répondre
  21. Efix

    Pourquoi passer par PHP et ne pas contacter l’API directements en JS ? Ça simplifierait le code et déporterait la logique métier à un seul endroit plutôt que d’avoir un morceau en PHP et un morceau en JS.

    Répondre

Laisser un commentaire