Interroger les sondes 1-wire par un script PHP

Un point que je n’avais pour l’instant pas abordé dans mes différents articles sur le 1-wire :

Je n’ai pas abordé le contrôle du 1-wire en PHP.

Pour faire quoi ?

Une grosse usine à gaz !
Utiliser PHP pour interroger les sondes 1-wire, c’est tout simplement ce qu’il y’a de plus logique dans mon projet, vue que je souhaite une interface à la knxweb2 mais home made.
L’affichage d’une température sur un plan et toute autre utilisation des mesures se fera par PHP.

Quels paquets php à installer ?

Comme vu dans la phase de découverte, owserver est désormais disponible en package compilé pour Debian Wheezy.
Pour les librairies PHP, il existe deux paquets aux noms semblables : libow-php5 et libownet-php.

Quelle différence ? La question a été posée au contributeur du package, voici sa réponse :
libownet-php ne peut que communiquer avec owserver, qui, lui-même pourra communiquer avec d’autres owserver et/ou matériel 1-wire.
libow-php5 est un wrapper autour de la bibliothèque C qui permet de communiquer directement avec le matériel 1-wire.

Alors on installe libownet-php.

# apt-get install libownet-php

Ce qui a pour effet d’installer un fichier php de class au chemin suivant :
/usr/share/php/OWNet/ownet.php

Une page d’exemple est disponible au chemin suivant :
/usr/share/doc/libownet-php/examples/ownet_example.php

Cet exemple fait référence à un fichier bcadd.php, il s’agit d’un hack car certaines versions distribuées de php ne permettent pas l’utilisation de cette fonction, fournir cette fonction par un include permet de contourner le problème. Evidemment, sous Debian Wheezy hébergement maison, ce qu’il y’a de plus classique, pas de problème avec bcadd, donc le « require » ne sera pas utilisé.

Récupérer des valeurs en PHP

Pour ce test, j’ai placé sur mon bus 1-wire :

  • 1x DS18B20 : sonde de température à l’extérieur.
  • 1x DS18B20+PAR : sonde de température à l’intérieur.
  • 1x DS2406 : capteur d’ouverture de fenêtre.
  • 1x DS2401 : capteur d’ouverture de fenêtre.

L’ensemble des fonctions ownet php sont visibles sur la page du projet :
http://owfs.org/index.php?page=ownet-php

Je récupère le fichier ownet.php, sans quoi on obtient forcément l’erreur suivante :

PHP Fatal error:  Class 'OWNet' not found
# cp /usr/share/php/OWNet/ownet.php /var/www/1-wire/

Et mon index.php

<?php
require "ownet.php";

$ow=new OWNet("tcp://127.0.0.1:4304");

?>
Temp&eacute;rature ext&eacute;rieure :
<?
$temp_ext = $ow->read("/28.EA54B5030000/temperature");
// Décommenter la ligne suivante pour avoir les détails du composant
//var_dump($ow->dir("/28.EA54B5030000",OWNET_MSG_READ,true));
echo $temp_ext;
// ------------------
?>

<br />
Temp&eacute;rature int&eacute;rieure :
<?php
$temp_int = $ow->get("/28.919277030000/temperature",OWNET_MSG_READ,false);
// Décommenter la ligne suivante pour avoir toutes les infos sur la température
//var_dump($ow->get("/28.919277030000/temperature",OWNET_MSG_READ,true));
echo $temp_int;
// ------------------
?>

<br />
Fen&ecirc;tre DS2406 :
<?php
$fenetre_ds2406 = $ow->read("/12.D0457D000000/sensed.A");
// Décommenter la ligne suivant pour avoir toutes les infos sur le PIO A
//var_dump($ow->get("/12.D0457D000000/sensed.A",OWNET_MSG_READ,true));
echo ($fenetre_ds2406)?"ouverte":"ferm&eacute;e";
// ------------------
?>

<br />
Fen&ecirc;tre DS2401 :
<?php
$fenetre_ds2406 = $ow->presence("/01.DC4343140000");
// Décommencer la ligne suivante pour avoir les détails, minimaliste car c'est une présence
//var_dump($ow->dir("/01.DC4343140000",OWNET_MSG_READ,true));
echo ($fenetre_ds2406)?"ferm&eacute;e":"ouverte";
// ------------------
?>

<br />
Page PHP de requêtes 1-wire

Page PHP de requêtes 1-wire

J’ai laissé les lignes var_dump commentées, elles peuvent servir de débogage.
Le port 4304 à adapter selon votre serveur owserver ( /etc/owfs.conf ).

A noter, comme vue dans mon article sur le DS2406, sensed.A retourne un 1 lorsque l’ILS est ouvert, 0 lorsque qu’un aimant est à proximité, ce qui pourrait porter à confusion.

Read et Get sont sur un bateau

Les read et le get, syntaxé comme ceci, apportent le même résultat.

$ow->get("/28.919277030000/temperature",OWNET_MSG_READ,false);
$ow->read("/28.919277030000/temperature");

D’après la doc de owfs.org le get parcourt chaque valeur de l’élément désiré et y applique une fonction/constante.
Tandis que le read, récupère la valeur demandée, point final.

Dans mes tests, et pour une requête de température il s’avère que le get ne retourne pas toujours de valeurs.
Il semble fonctionner à un niveau plus « bas » que le read.
Donc la fonction read est à privilégier.

Et maintenant ?

L’insertion des données dans une base MySQL, pour un prochain article.

Ce billet est posté dans 1-wire, Debian, php, Web. Mettre en favoris le permalien.

6 réponses à Interroger les sondes 1-wire par un script PHP

  1. Arnaud says:

    Je comprend rien mais il est vrai que je suis débutant.

    Tous me semble ok mais impossible d’avoir la valeur de la température.

  2. Pingback: Insérer les valeurs 1-wire dans une base MySQL | Domolio, la domotique et pas que…

  3. yann says:

    Bjr. Meme pb. je vois bien mes sondes et les temperatures sur localhost:2121; mais rien avec le php

    J’ai copie index.php dans le repertorire \var\www\1wire

    dans le fichier owfs.conf, j’ai bien modifié
    la ligne 16 en #server: FAKE = DS18S20, DS2405
    la ligne 19 server: USB = all

    Note: est ce que c’est bien USB qu’il faut laisser en syntaxe ou bien changer le nom ?

    et dans le fichier index.php, j’ai fait les modifications
    ligne 8, apres temperature exterieure; il manquait un <?php

    j'ai bien modifié le numero de ma sonde, qui est de la forme 28.E7612C06000

    j'ai bien redemarré le serveur php
    ou se trouve l'erreur ? est ce que c'est dans le read, il faut un aure path, par exemple dans \var\www\1wire ?

  4. yann says:

    Salut

    apres moult recherches, ca fonctionne apres la modification suivante

    ur mon serveur owfs, dans le fichier /etc/owfs.conf , j’ai modifié la ligne
    server: port = localhost:4304

    par
    server: port = 4304

    ne pas oublier ensuite de faire un restart de owfs. quel plaisir ensuite de voir les valeurs s’afficher !!!.

    / Yann

  5. Pingback: Suvi de la consommation d'eau avec des compteurs à impulsions en 1-wire | Domolio, la domotique et pas que…

  6. Bruno says:

    Bonjour,

    merci pour cet article. La page fonctionne bien avec mes capteurs de température DS18B20, mais pas avec le totalisateur d’impulsions DS2423. Est ce par que celui ci ne figure pas sur la documentation ? ou que ma ligne de code est mauvaise ? :

    read(« /1D.050A10000000/counters.A »);
    echo $compteur;
    ?>

    Merci !

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *