Category Archives: Web

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.

Posté dans 1-wire, Debian, php, Web | 6 Commentaires

Prise en main du KNX en php

Une page teste originale

Une page tests très originale.

Ou comment allumer une lampe depuis une page web.

Après avoir testé linknx et knxweb, via le LiveCD de Ziki, je n’ai pas trop adhéré au principe du duo linknx + knxweb.
C’est sympa, mais pas assez souple par rapport à ce que je souhaite faire avec le 1-wire et le DMX, j’ai donc le choix entre monter une usine à gaz à partir de knxweb ou  partir de zéro.
J’ai choisi de partir de zéro.

J’ai furtivement étudié le fonctionnement de linknx via la page d’example php, je prends note de ce fonctionnement xml.

En tirant un trait à linknx, je perdrai la notion de « rules », cette façon de gérer très rapidement des conditions.
A ce moment précis, je ne sais pas comment je vais faire sans.

En compilant eibnetmux, j’ai constaté qu’il embarqué un package php, en cherchant un peu, j’ai trouvé un paquet de samples :

# cd /usr/src/
# wget "http://downloads.sourceforge.net/project/eibnetmux/Sample%20client%20applications/1.7.0/eibnetmuxclientsamples-1.7.0.tar.gz?r=http%3A%2F%2Fsourceforge.net%2Fprojects%2Feibnetmux%2Ffiles%2FSample%2520client%2520applications%2F1.7.0%2F&ts=1334692571&use_mirror=freefr" -O eibnetmuxclientsamples-1.7.0.tar.gz
# tar zxvf eibnetmuxclientsamples-1.7.0.tar.gz

Je ne prends que la partie php, donc je ne compile rien.

# cd /usr/src/eibnetmuxclientsamples-1.7.0/php/
# cp *.php /var/www/

Et le fichier php comprenant les class provient de la compilation.

# cp /usr/local/eibnetmux.php /var/www/

Hum hum ! writegroup.php et readgroup.php on l’air sympa, voyons voir ça …

# php writegroup.php
Usage: writegroup.php "hostname" "group" "eis" "value" [group eis value ...]
# php writegroup.php 127.0.0.1 0/0/11 1 1

la lampe s’allume !

# php writegroup.php 127.0.0.1 0/0/11 1 0

la lampe s’éteint.

0/0/11 étant un groupe d’adresse correspondant à on/off d’une lampe relié sur un TXA213.

eis étant le type de format, dont les valeurs possibles sont très bien reprises dans une doc d’ABB (page 15).

J’ai repris ces 2 fichiers php pour réaliser une page de test avec des fonctions php.


<?php
include( "eibnetmux.php" );
$hostname = "127.0.0.1";

function readgroup($groupaddress,$eis) {
 global $hostname;
 $c = new eibnetmux( "php_client", $hostname, 4390 );
 $groupaddress = new KNXgroup( $groupaddress, $eis );
 $value = $groupaddress->read( $c );
 return $value;
 $c->close();
}

function readgroupboolean($groupaddress) {
 global $hostname;
 $c = new eibnetmux( "php_client", $hostname, 4390 );
 $groupaddress = new KNXgroup( $groupaddress,1);
 $value = $groupaddress->read( $c );
 //return $value;
 if ($value == 1) return true;
 elseif ($value == 0) return false;
 $c->close();
}

function writegroup($groupaddress,$eis,$value) {
 global $hostname;
 $c = new eibnetmux( "php_client", $hostname, 4390 );
 $groupaddress = new KNXgroup( $groupaddress, $eis );
 $r = $groupaddress->write( $c, $value);
 return true;
 //$value = $groupaddress->read( $c );
 //print "New value of $argv[$idx]: $value\n";
 $c->close();
}

if($_POST['action'] == 'on') writegroup($_POST['groupaddress'],1,1);
if($_POST['action'] == 'off') writegroup($_POST['groupaddress'],1,0);

?>
La lampe est <?php echo (readgroupboolean('0/0/11'))?"allumée":"eteinte"; ?><br />
<br />
<form action="#" method="POST">
<input type="hidden" readonly="readonly" name="action" value="<?php echo (readgroupboolean('0/0/11'))?"off":"on"; ?>" />
<input type="hidden" readonly="readonly" name="groupaddress" value="0/0/11" />
<input type="submit" name="toggle" value="<?php echo (readgroupboolean('0/0/11'))?"Eteindre":"Allumer"; ?> la lampe" />
</form>

Je voyais cette montagne plus impressionnante qu’elle l’est réellement, maintenant que j’ai franchi ce cap, je suis davantage d’attaque pour des fonctions avancées du KNX à travers PHP.
Affaire à suivre !

Posté dans Debian, KNX, Web | 5 Commentaires

Tonido sur Debian Wheezy

Logo Tonido

Logo Tonido

Voila bientôt un an que j’utilise régulièrement DropBox.
Très pratique, sauf que, à moins d’aligner, je suis limité à 2,5Go, de plus, je ne sais pas où sont stockées mes données personnelles.

A ce jour, il existe quelques alternatives sympathiques :

  • hubiC d’OVH : 25Go gratuit, mais je ne suis toujours pas garant de mes données.
  • syncany : Projet Open Source prometteur, mais rien de disponible à ce jour.
  • SparkleShare : Open Source, installable sur son propre serveur, très bon projet
  • Google Drive : Rumeurs ? Quelle confidentialité ?
  • OwnCloud : Open Source, très complet, full web (+ webdav), Android en cours, très bidouillable, prometteur.
  • Tonido : Freeware (hmm) fouilli et bien complet.
Mon utilisation tourne essentiellement autour de l’échange privé entre différents postes, quelques partages publics, sauvegardes de téléphones, fichiers à avoir sous le coude.
Mes besoins :
  • Client Windows.
  • Client Android.
  • Installable sur mon propre serveur.
  • Une interface web.

Le projet se rapprochant le plus est SparkleShare, c’est également le projet le plus soutenu par la communauté, celui qui évolue le plus à mon goût.
Sauf qu’après l’avoir essayé, l’interface web (SparkleShare Dashboard) est trop légère, ne permet pas l’upload, idem pour le jeune soft Android : pas d’upload et interface légère. L’ensemble du projet semble trop jeune malheureusement.
J’étais parti pour faire un billet sur SparkleShare et son DashBoard pour Android, mais en l’installant et à l’utilisation, je me suis rendu compte qu’il n’était pas encore assez mature pour répondre à mes besoins.
C’est un bon projet, il y ‘a une grosse communauté, il devrait continuer à faire parler de lui.

Même discours OwnCloud, ça bouge beaucoup, mais ça manque de finalité sur l’ensemble.
L’interface web est parfaite, le synchro Windows / Cloud se fait via un lecteur réseau grâce à webdav.
L’appli Android est en développement.

Je possède un serveur kimsufi qui fait serveur mx, hébergement, backup, etc … Donc disposer d’un DropBox like sur mon serveur signifie un espace de stockage largement suffisant, des données sécurisées, et la fierté de dire SAYMOAQUILAIFAIT !!

Donc à défaut d’utiliser SparkleShare et OwnCloud, je m’oriente vers Tonido, le Freeware *sigh*.
Choisir entre Tonido, le dropbox like Freeware et DropBox lui même, limité, avec des données  « quelque part », des questions se posent, mais… Tonido win !

# wget "http://www.tonido.com/download.php?TonidoSetup_i686.deb" -O TonidoSetup_i686.deb

Installation du package et des dépendances.

# dpkg -i TonidoSetup_i686.deb
Selecting previously unselected package tonido.
(Lecture de la base de données... 41497 fichiers et répertoires déjà installés.)
Dépaquetage de tonido (à partir de TonidoSetup_i686.deb) ...
dpkg : des problèmes de dépendance empêchent la configuration de tonido :
tonido dépend de libjpeg62 ; cependant :
Le paquet libjpeg62 n'est pas installé.
dpkg : erreur de traitement de tonido (--install) :
problèmes de dépendance - laissé non configuré
Des erreurs ont été rencontrées pendant l'exécution :
tonido
# apt-get install -f
Lecture des listes de paquets... Fait
Construction de l'arbre des dépendances
Lecture des informations d'état... Fait
Les NOUVEAUX paquets suivants seront installés :
libjpeg62
0 mis à jour, 1 nouvellement installé, 0 à enlever et 0 non mis à jour.
1 partiellement installé ou enlevé.
Il est nécessaire de prendre 93,7 ko dans les archives.
Après cette opération, 221 ko d'espace disque supplémentaires seront utilisés.
Réception de : 1 http://ftp.fr.debian.org/debian/ wheezy/main libjpeg62 i386 6b1-2 [93,7 kB]
93,7 ko réceptionnés en 0s (1 238 ko/s)
Selecting previously unselected package libjpeg62.
(Lecture de la base de données... 41583 fichiers et répertoires déjà installés.)
Dépaquetage de libjpeg62 (à partir de .../libjpeg62_6b1-2_i386.deb) ...
Paramétrage de libjpeg62 (6b1-2) ...
Paramétrage de tonido (2.37.0.17274) ...

Le répertoire de travail : /usr/local/tonido/

# cd /usr/local/tonido
# ./tonido.sh start
Starting Tonido Service:  nohup: redirige stderr sur stdout

Suivi de messages d’erreurs bizarres.

Pour l’arrêter.

# ps aux | grep tonido
# kill -9 du PID

Le script de démarrage est vraiment bizarre, j’en ai crée un autre inspiré d’un forum ArchLinux.

# vi /etc/init.d/tonido
#!/bin/bash

### BEGIN INIT INFO
# Provides: tonido
# Required-Start: $local_fs $remote_fs
# Required-Stop: $local_fs $remote_fs
# Should-Start: $all
# Should-Stop: $all
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Start/stop Tonido
# Description: Start/stop Tonido
### END INIT INFO

# Debian init script for Tonido
# Inspired by Nick Davis : Arch Linux init script for Tonido Plug application @ Created 1-15-12
# 25/03/2012

USER=tonido
TONIDODIR=/usr/local/tonido
LOGFILE=/var/log/tonido.log

PID=`pidof $TONIDODIR/tonidoconsole`

case "$1" in
 start)
 echo -n "Starting Tonido Services"
 if [[ -z ${PID} ]] && su $USER -c "( cd $TONIDODIR && \
 export LD_LIBRARY_PATH=. \
 && $TONIDODIR/tonidoconsole &>$LOGFILE &)" &> /dev/null;
 then
 echo " done"
 else
 echo " failed"
 fi
 ;;
 stop)
 echo "Stopping Tonido Services"
 kill $PID &> /dev/null;
 ;;
 restart)
 $0 stop
 sleep 1
 $0 start
 ;;
 *)
 echo "usage: $0 {start|stop|restart}"
 exit 1
 ;;
esac
# chmod +x /etc/init.d/tonido
# insserv tonido

Et je choisis de lancer tonido avec un utilisateur appelé tonido

# adduser --disabled-password tonido
# chown -R tonidot:staff /usr/local/tonido/
# touch /var/log/tonido.log
# chown tonido:root /var/log/tonido.log

Il faut avoir lancer Tonido au moins une fois pour avoir un fichier de config

# /etc/init.d/tonido start
# /etc/init.d/tonido stop
# vi /home/tonido/tonido/data/configex.xml

On autorise l’administration à distance.

RemoteAdmin
bool
1
# /etc/init.d/tonido start

Limiter les accès à un seul répertoireEt direction http://<votre_adresse>:10001 pour la configuration du premier compte admin.

Le truc qui m’embête tout de suite, c’est que tonido tappe dans le home de l’utilisation avec lequel il est lancé. Ainsi que l’ensemble des fichiers du serveur depuis sa racine.
Je ne trouve pas ça super de mélanger utilisateur système et données personnelles, c’est pour cette raison que j’ai choisi de créer un utilisateur dédié à Tonido.
Heureusement, on peut également au forcer l’utilisation d’un seul répertoire :

# mkdir /home/tonido/files/
# chown -R tonido:tonido files

Rendez-vous dans Tools > Settings > Misc > « Add Allowed Folder » sauf que … Cannot Perform Operation Remotely.

Cannot Perform Operation Remotely

Cannot Perform Operation Remotely

La solution est de monter un tunneling VPN, et oui, pour les opérations déliquates, seule une IP LAN peut modifier les paramètres.
Un mal pour un bien, ça me réconforte que Tonido semble sécurisé.

Tunneling Putty pour Tonido

Tunneling Putty pour Tonido

Tonido permet uniquement certains changement en LAN

Tonido permet uniquement certains changement en LAN

Ah, sur cette même page, on peut le passer en Français, cool.
De nombreuses erreurs de traduction malgré tout.

A ce stade, Tonido est déjà bien configuré, il reste à adapter, créer des utilisateurs si nécessaire, installer les plugins gratuits.

L’application TonidoSync Client se compare à celle de DropBox.
Un répertoire dans « Mes Documents » correspondant à celui distant.

TonidoSync l'application DropBox like

TonidoSync l'application DropBox like

Coté Android, l’application est moins jolie que celle de DropBox mais tout aussi performante, à voir sur Google Play.

Application Android Tonido

Application Android Tonido

En bonus, Tonido nous fait Streaming pour de la musique.

Tonido Steam la musique

Tonido Steam la musique

OwnCloud sait en faire de même grâce à une application interne nommée MiniSub

Conclusion

Tonido est relativement sympa dans son ensemble, je l’ai choisi à défaut d’avoir une solution OpenSource convenable.
Dès qu’on souhaite utiliser des fonctions évoluées, le soft nous rappel bien qu’il s’agit d’un Freeware en proposant d’acheter une version Pro à 29 $.
A voir à l’usage, pas de coup de coeur pour Tonido à ce jour, je garde un oeil discret sur le twitter OwnCloud dans l’espoir d’y voir un apk beta du git android ou une application Android webdav qui me convienne.

Posté dans Debian, Sysadmin, Tonido, Web | Laisser un commentaire

Migration Lenny vers Wheezy : passage d’apache2 vers nginx

Aucun rapport avec la domotique.
J’ai changé de machine pour mes hébergements personnels, j’en ai profité pour abandonner Apache2 au profit NginX.

Deux petits mots pour dire que ça se passe super bien… du moment où c’est bien préparé…
Le gros du boulot a été l’abandon des .htaccess.
Les RewriteRules se placent dans la config du VirtualHost.
J’ai utilisé ce chouette script qui simplifie la vie.

Quand on a :
RewriteRule ^news/(.*)\+([0-9]+)$ /index.php?page=c_news_detail&news_id=$2 [L]

Ça Devient :
rewrite ^/news/(.*)\+([0-9]+)$ /index.php?page=c_news_detail&news_id=$2 last;

Rien de dramatique… Y’a juste à s’assurer que c’est bien transformé.
Quoi que … Les RewriteCond sont très différents…

RewriteCond %{HTTP_HOST} !^www.tfhq.fr$
 RewriteCond %{HTTP_HOST} !^tfhq$
 RewriteCond %{REQUEST_URI} !^/data/.*$
 RewriteCond %{REQUEST_URI} !^/images/.*$
 RewriteCond %{REQUEST_URI} !^(.*)\.css$
 RewriteCond %{REQUEST_URI} !^(.*)\.js$
 RewriteRule ^(.*) http://www.tfhq.fr/$1 [L,R=301]

Devient sous Nginx :

if ($http_host !~ "^www.tfhq.fr$"){
 set $rule_0 1$rule_0;
 }
 if ($http_host !~ "^tfhq$"){
 set $rule_0 2$rule_0;
 }
 if ($uri !~ "^/data/.*$"){
 set $rule_0 3$rule_0;
 }
 if ($uri !~ "^/images/.*$"){
 set $rule_0 4$rule_0;
 }
 if ($uri !~ "^(.*)\.css$"){
 set $rule_0 5$rule_0;
 }
 if ($uri !~ "^(.*)\.js$"){
 set $rule_0 6$rule_0;
 }
 if ($rule_0 = "654321"){
 rewrite ^/(.*) http://www.tfhq.fr/$1 permanent;
 break;
 }

La config gzip dans nginx.conf

gzip on;
gzip_disable "msie6";
gzip_vary on;
gzip_proxied any;
gzip_comp_level 8;
gzip_buffers 16 8k;
gzip_http_version 1.1;
gzip_types text/plain text/xml text/css image/svg+xml application/xhtml+xml application/xml application/rss+xml application/atom_xml application/x-javascript application/javascript application/x-httpd-php application/x-httpd-fastphp application/x-httpd-eruby;

Et pour terminer, la prise en compte de php-fpm pour les configs des VirtualHost :

location ~ \.php$ {
 fastcgi_pass 127.0.0.1:9000;
 fastcgi_index index.php;
 fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
 fastcgi_param PATH_INFO $fastcgi_script_name;
 include /etc/nginx/fastcgi_params;
 }

La seule mauvaise surprise étant la fin du package « ffmpeg-php ».
Voila voila, une bonne chose de faite !

Posté dans Debian, Web | 1 Commentaire

Ouverture de Domolio.fr

Bienvenue sur domolio.fr,

Domolio, c’est quoi ?

Outre la contraction de domotique et Lionel (mon prénom), Domolio est un blog sous forme de laboratoire réel, je pars d’idées, d’envies concrètes, jusqu’à la mise en oeuvre au sein de mon projet de construction.
Le but est de découvrir la possibilité de faire, ainsi que le cheminement de l’idée jusqu’à la réalisation définitive.
Je m’attarderai sur l’aspect du blog plus tard, pour égayer ce bleu et blanc.

Pourquoi ce blog ?

J’ouvre aujourd’hui ce blog pour deux raisons principales :
–  J’estime qu’il existe un manque parmi les blogs domotiques, nombreux sont ceux traitant de solutions « clé en mains » – j’achète, je découvre, je bidouille un peu, je profite – tandis que d’autres blogs abordent des sujets super intéressant techniquement mais des systèmes rarement installés dans une maison.
– Pour moi : il m’arrive de bosser une semaine  sur la domotique, de laisser mon travail sur un coin de table, de revenir dessus trois semaines plus tard et d’avoir oublié les points essentiels du travail précédent … Là, j’ai une trace.

Pour parler de quoi ?

De domotique réalisable par la plus part des êtres humains. Une tendance au Do It Yourself mais raisonnable…
Je pense qu’avec de la bidouille et de bonnes idées, il est possible de faire de chouettes réalisations !
Ce blog pour également parler  de sujets que j’estime « intéressant », bons à savoir, de vécu personnel, de trucs de geek, de SysAdmin, et web…

Qui suis-je ?

En quelques mots : Lionel, 27 ans, SysAdmin.
Projet de construction de maison individuelle, à ce jour (10/03/2012), l’espoir d’acquérir un terrain pour y bâtir une maison.

Posté dans Web | 2 Commentaires