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 :
- Premiers pas avec le 1-wire et owserver sous Debian Wheezy
- Découvertes des sondes DS18B20 et DS18B20PAR
- Capteur d’ouverture de fenêtres avec un DS2406
- Capteur d’ouverture de fenêtres avec un DS2401
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.
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
Et mon index.php
<?php require "ownet.php"; $ow=new OWNet("tcp://127.0.0.1:4304"); ?> Température exté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érature inté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ê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ée"; // ------------------ ?> <br /> Fenê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ée":"ouverte"; // ------------------ ?> <br />
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.
Prise en main du KNX en php
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 :
# 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.
# cp *.php /var/www/
Et le fichier php comprenant les class provient de la compilation.
Hum hum ! writegroup.php et readgroup.php on l’air sympa, voyons voir ça …
Usage: writegroup.php "hostname" "group" "eis" "value" [group eis value ...]
la lampe s’allume !
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 !
Tonido sur Debian Wheezy
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.
- 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 !
Installation du package et des dépendances.
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/
# ./tonido.sh start
Starting Tonido Service: nohup: redirige stderr sur stdout
Suivi de messages d’erreurs bizarres.
Pour l’arrêter.
# kill -9 du PID
Le script de démarrage est vraiment bizarre, j’en ai crée un autre inspiré d’un forum ArchLinux.
#!/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
# insserv tonido
Et je choisis de lancer tonido avec un utilisateur appelé 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 stop
# vi /home/tonido/tonido/data/configex.xml
On autorise l’administration à distance.
RemoteAdmin bool 1
Et 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 :
# chown -R tonido:tonido files
Rendez-vous dans Tools > Settings > Misc > « Add Allowed Folder » sauf que … 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é.
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.
Coté Android, l’application est moins jolie que celle de DropBox mais tout aussi performante, à voir sur Google Play.
En bonus, Tonido nous fait Streaming pour de 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.
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 !
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.