Category Archives: Sysadmin
Alimenter des Raspberry Pi par le réseau
Une petite astuce permettant d’alimenter plusieurs Raspberry Pi à partir du réseau sans utiliser le PoE tel que la norme le défini.
L’avantage du Raspberry, c’est qu’il se glisse partout dans une maison, il consomme peu (650 mA pour le modele B+) ; l’inconvénient est qu’il ne supporte pas le PoE au sens strict de la norme (IEEE 802.3af), à moins d’y rajouter un module très cher.
Ou bien, en PoE passif, avec un peu de câbles, sans devoir toucher au fer à souder 🙂
Actuellement j’utilise 3 Raspberry Pi :
– Compteur téléinfo et contrôle de l’alarme.
– Compteur à impulsion sur le compteur d’eau et monitoring des températures.
– Dans l’atelier, en tant que poste de travail, SSH, web, etc…
Voici le nécessaire utilisé :
Transformateur 5 Volts / 3 Ampères :
Récupéré d’un hub USB.
Avec embout en 3,5mm.
Neuf, comptez entre 2 $ et 6 $.
*Pas de photo*
Splitter DC 3,5mm (arraignée) :
1 femelle 3.5mm vers 4 mâles 3,5 mm.
Nombres de sorties à adapter selon le nombre de Raspberry souhaité.
Comptez environ 5,60 $.
Injecteur/splitter PoE passif :
Se vend par couple, un mâle 3,5mm et une femelle 3,5mm
Environ 3,16 $ mais moins cher si acheté en lot.
Adaptateur DC 3,5 mm vers micro USB :
Et la fin ! L’adaptateur DC 3,5mm vers micro USB mâle à brancher dans le Raspberry Pi.
Environ 2 $ / pièce.
PoE passif pour le Raspberry Pi :
Coté baie de brassage :
L’adaptateur secteur 5V branché au splitter (arraignée) 1 vers 4 fiches.
A chaque sortie de l’araignée : l’injecteur passif, d’un coté le switch (mâle RJ45 dans le switch), de l’autre le câble RJ45 (femelle RJ45 + cordon de brassage dans le panneau).
Coté Raspberry Pi :
Câble réseau raccordé au splitter PoE passif.
Le câble réseau du splitter dans le Raspberry Pi et la fiche mâle DC raccordé à l’adaptateur DC vers micro USB pour alimenter le Raspbery Pi.
Voila, aussi simple que ça pour une seule alimentation pour plusieurs Raspberry Pi et garder une baie de brassage propre.
Virtualiser XPEnology avec Xen pour profiter de Surveillance Station
Dans le choix d’un serveur de vidéo-surveillance (NVR), j’ai longtemps cherché une solution opensource, le premier qui vient, serait ZoneMinder, mais mes tests m’ont permis de le trouver trop lourd, barbant, instable, pas user-friendly.
J’ai continué ma quête du NVR parfait, même dans les freeware et proprio pour un usage habitat. Rien à l’horizon…
Puis je suis tombé sur Surveillance Station disponible sur les NAS Synology, les vidéos Youtube m’ont vendu du rêve (1) (2) …
Acheter un NAS Synology pour la vidéo-surveillance, si ça tourne bien, ok…
Mais les NAS « physique » ont des limites de caméras… C’est marqué en petit dans la caractéristique technique de chaque produit de Synology.
Le DS414j par exemple, supporte au maximum 8 caméras.
Je suppose que du nombre de baie découle la puissance de matériel et donc du nombre de caméras possible.
Je compte installer entre 5 et 8 caméras, donc il faut que je compte ~ 300 € TTC sans disque pour acheter le NAS suffisament performant.
XPEnology
Puis j’ai découvert XPEnology, Korben vous fait les présentations.
Etant donné que j’ai déjà un serveur debian pour usage multimédias et domotique, autant virtualiser XPenology sur ce même serveur !
Excusez le manque d’analyse et d’informations de XPenology, DSM, et autre outils relatfis au NAS. J’ai prodé ça le même jour où je l’ai découvert, on peut parler d’un coup de foudre.
Installer Xen sur Debian Wheezy
Les how-to sont nombreux sur la toile, parfois trop complet, alors je vais droit au but :
On déplace l’ordre de boot des kernel pour booter sur le kernet Xen.
# update-grub
Humm, avant tout, assurez vous d’avoir un processeur capable de virtualiser :
Si vous avez au moins une ligne qui ressort avec les flags, c’est que votre CPU supporte la virtualisation.
Cependant, si vous avez pris de l’avance et exécutez cette commande en étant déjà sur un kernel Xen, le résultat attendu ne s’affichera pas.
Après un reboot, vous devriez vous retrouver sur un kernel Xen. Pour s’en assurer, faites appel à l’un de ses services 😉
Name ID Mem VCPUs State Time(s)
Domain-0 0 2904 4 r----- 67.2
Point important, c’est bien beau d’avoir un processeur pouvant virtualiser, mais assurez vous que l’option est active dans le BIOS, pour cela executez cette commande :
xen-3.0-x86_64 xen-3.0-x86_32p hvm-3.0-x86_32 hvm-3.0-x86_32p hvm-3.0-x86_64
Si la ligne ne fait pas référence à du HVM malgré que vous possédiez un procésseur avec technologie VT-x/AMD-V (flag vmx ou svn), c’est que l’option VT-x/AMD-V est désactivée dans le BIOS (je me suis fait avoir…).
Nous allons faire du HVM (Hardware Virtual Machine), et non de la paravirtualisation, plus de détails sur wikipedia.
Faire de la virtualisation complète, ça permet de ne pas se préoccuper de l’OS sur lequelle XPenology est ‘tiré’, ça a l’air d’être du FreeBSD, bref je m’en moque.
Xen est installé, un peu de paramétrage, je vous affiche brut ma config :
(network-script network-bridge)
(vif-script vif-bridge)
(dom0-min-mem 196)
(enable-dom0-ballooning yes)
(total_available_memory 0)
(dom0-cpus 0)
(vnc-listen '0.0.0.0')
(vncpasswd '')
(keymap 'fr')
Le fichier de configuration tel quel me permet de fonctionner en mode bridge, et de la possibilité de me connecter en VNC à la machine virtuelle.
De nombreuses possibilités avec Xen, j’adore cet outil, comme dit au début, je vais droit au but, mais sachez qu’il possible de faire énormement avec Xen.
Viritualisation de XPenology
Voila le vif du sujet !
Du peu que j’ai regardé au sujet de XPenology, c’est qu’il s’installe sur une petite partie d’un disque du NAS, pour ma part, pour plus de souplesse, je préfère dédié un disque au fonctionnement de XPenology. Je commence par lui créer un disque de 8Go, au format fichier:
Pourquoi 8Go ? Parce que j’ai lu sur xpenology.com/forum qu’il fallait au minium 5Go. Certains parlent de 100Go.
J’admet ne pas avoir tout suivi sur l’emplacement du system d’XPenoloy, où est-ce qu’il se loge, la place qu’il prend, comment il gère le changement de disque.
Autrement, je dédie un disque physique au XPenology.
Dans mon cas /dev/sdd, un disque de 2To.
Cependant, j’ai constaté que je devais partitionner mon disque pour que DSM puisse créer un volume.
J’ai donc crée une partition primaire de 2To -> /dev/sdd1, non formatée, DSM s’en chargera.
Donc 2 supports :
– 1 disque image pour le système.
– 1 disque (ou partition il faudrait dire) de données pour les enregistrements, etc…
Il faut télécharger et mettre sur le serveur, l’image de boot de XPenology, que l’on trouve ici:
http://www.xpenology.nl/boot-images/
→ Gnoboot-10.5 DSM 5.0-4458 X64
Ou bien :
→ Nanoboot-5.0.3.2 DSM 5.0-45XX X64
Gnoboot :
Il a la réputation d’être stable et performant surtout sous environnement virtualisé.
Aucune mise à jour n’a eu lieu depuis longtemps : Aïe !
Les mises à jour de synology se font avec des pincettes, tant que Gnoboot n’évolue pas, peu de possibilités d’upgrader la version 4558.
Nanoboot :
C’est suivi et recommandé par la communauté.
Normalement performant, mais peu s’améliorer ou se dégrader selon la release utilisée.
Les mises à jour de synology se font généralement sans soucis, attendre quelques jours après une nouvelle release pour voir si un fix/problème fait son apparition.
Je stock l’iso dans /root/
Pour créer une machine virtuelle Xen, il faut crée un fichier .cfg
Ma machine virtuelle s’appelle synocam, mon fichier est donc /etc/xen/synocam.cfg et il contient ceci :
Dans le cas d’utilisation de GnoBoot :
kernel = '/usr/lib/xen-4.1/boot/hvmloader' builder = 'hvm' memory = '1024' device_model='/usr/lib/xen-4.1/bin/qemu-dm' # Disks disk = [ 'file:/srv/xpenology.img,hda,w','phy:/dev/sdd1,hdb,w','file:/root/gnoboot_105_xpenology_5.0-4458_bootloader_X64_by_Poechi.iso,hdc:cdrom,r' ] # Hostname name = 'synocam' # Networking vif = [ 'mac=00:11:11:76:75:74,bridge=eth0' ] # Behaviour boot='dc' # VNC vnc=1 vncviewer=1 vncpasswd='' sdl=0 usbdevice='tablet' # Misc localtime=1 # On fail on_poweroff='destroy' on_reboot='restart' on_crash='restart'
Dans le cas d’une utilisation de NanoBoot, la configuration du domU change un peu :
kernel = '/usr/lib/xen-4.1/boot/hvmloader' builder = 'hvm' memory = '1024' device_model='/usr/lib/xen-4.1/bin/qemu-dm' vcpu=2 # Disks disk = [ 'file:/srv/xpenology.img,hda,w','phy:/dev/sdd1,hdb,w','file:/root/NB_x64_5032_DSM_50-4528_Xpenology_nl.iso,hdc:cdrom,r' ] # Hostname name = 'synocam' # Networking vif = [ 'model=e1000,bridge=xenbr0,mac=00:11:11:76:75:74'] # Behaviour boot='dc' # VNC vnc=1 vncviewer=1 vncpasswd='' sdl=0 usbdevice='tablet' # Misc acpi = '1' apic = '1' localtime=1 viridian=1 xen_platform_pci=1 # On fail on_poweroff='destroy' on_reboot='restart' on_crash='restart'
La conf est sortie d’un tiroir, d’un serveur Xen en prod virtualisant du Windows 2008 R2.
L’adresse MAC est modifiée pour simuler un NAS Synology sur le réseau afin d’être détecté par l’assistant Synology.
Le driver virtuel e1000 est utilisé par nanoboot, car le driver par defaut realtek r8169 n’est pas compilé dans nanoboot.
Elle doit commencer par 00:11:11: . Le reste est inventé.
file:/srv/xpenology.img,hda,w correspond à mon disque image de 8Go, en tant que disque primaire, accès en écriture.
phy:/dev/sdd1,hdb,w correspond à mon disque/partition de 2To, en tant que disque secondaire, accès en écriture.
file:/root/gnoboot_105_xpenology_5.0-4458_bootloader_X64_by_Poechi.iso,hdc:cdrom,r correspond au bootloader de Xpenology, simulé dans un lecteur CD, accès en lecteur seul.
boot=’dc’ permet à la machine virtuelle de booter sur le CD.
memory = ‘1024’ peut être augmenté.
Le nombre de CPU dédié à cette machine est de 1, le nombre peut être adapté avec l’option vcpus=2 pour 2 CPUs dédiés par exemple.
Pour le disque dédié également, vous aurez la possibilité de jongler entre disques physiques, raid soft, raid hard, LVM, laisser DSM gérer ou ajoutant simplement des disques, ou gérer vous en amont les disques que vous incluez dans la machine virtuelle. Voir même le tromper en montant un partage d’une autre machine. J’apprécie cette souplesse !
Voila pour l’essentiel de la config de la machine virtuelle.
Installation de XPenology
A ce stade, la configuration de Xen et le fichier de configuration de la machine virtuelle devraient permettre de démarrer celle-ci sans erreur.
Si quelque chose manque, Xen vous le fera très vite savoir, c’est tout bon ou rien. Préparez votre client VNC, ça va aller très vite.
Pour démarrer la VM :
Puis ouvrez vite votre client VNC pour vous connecter au serveur, en indiquant le nom où l’ip du serveur Xen.
Vous devriez voir assez rapidement le menu de selection du bootloader GnoBoot.
Sélectionnez la seconde ligne Install/Upgrade.
Laissez booter, souriez, ça avance !
Lorsque le boot est installé, lancez sur votre PC l’utilitaire Synology Assistant.
Il devrait voir votre faux NAS, faite un clic droit > Installer.
Un wizzard vous guide dans l’installation et vous demande un fichier .pat.
Vous pourrez télécharger le fichier .pat sur le support de Synology :
http://download.synology.com/download/DSM/5.0/4458/
URL et fichier PAT à adapter selon la version que vous cherchez à installer, en rapport avec GnoBoot.
Dans notre cas DSM 5 version 4458 pour le NAS DS3612xs.
♫ Et ça continue encore et encore, c’est que le début d’accord d’accord ♫
Connectez-vous dés à présent en HTTP à votre nouveau NAS entièrement virtualisé sous XEN.
DSM vous aura crée un volume sur votre petit disque de 8Go, vous pourrez supprimer ce volume pour n’utiliser que le disque dédié.
Gérez vos volumes, changez votre mot de passe, le nom de machine, installez vos paquets : Surveillance Station.
Pour terminer
J’utilise le SNMP sur DSM pour les graphs munin, sur DSM : Panneau de configuration > Terminal & SNMP; SNMP v2 avec communauté « public« .
Un petit retour sur notre Debian.
Ajout d’un node munin :
Executez ce que vous avez envie de grapher.
synocam étant le hostname de mon NAS Synology sur mon réseau, à adapter.
Vous pourrez voir l’utilisation des ressources de votre XEN grâce à la commande xm top.
Démarrage automatique de la VM avec le serveur Xen :
# cd /etc/xen/auto/
# ln -s /etc/xen/synocam.cfg .
Pour éteindre votre NAS :
Et voila, une très bonne solution à bon gout pour profiter de Surveillance Station.
Je n’ai pas lancé de benchmark sur le bouzin, mon benchmark va surtout se faire au fur et à mesure des ajouts de caméras.
Frontend PHP pour l’écoute du bus KNX
Dans un précédent article, j’ai décris comment écouter le bus KNX pour allumer une rampe de LED via Open DMX.
En fin d’article, j’ai abordé l’aspect possible d’un frontend en PHP pour avoir une base de données MySQL à jour, en fonction des évènements du KNX.
L’intérêt est quasi le même que linknx, un changement sur le bus est égal à un changement en BDD sur les Groupes d’Adresses qui m’intéressent.
Le but est de pouvoir exploiter ces données sur une page web et d’autres scripts maisons sans faire de requête sur le bus, mais en interrogeant ma BDD.
Une espèce de travail en couche d’applications.
Pour rappel, je n’ai rien contre linknx, j’aurais juste du mal à adapter mon cahier des charges à cet outil, voir mon article :
Se passer de linknx et webknx2, une fausse bonne idée ?
Pour ce front-end, je me suis inspiré de mon premier script avec logtail.
En cherchant des solutions, je suis tombé sur l’extention php inotify et son tail (en commentaire).
La base
Pour commencer, toujours depuis Debian Wheezy, il faut posséder php5, php-pear ainsi qu’une base MySQL évidemment.
inotify s’installe comme ceci au plus simple :
L’extention activée pour php5 pour le cli :
Selon mon premier script pour allumer ma rampe LED, re-modification de mon script d’init.d eibnetmux.
A la différence, que je log tout ce qu’il se passe sur le bus.
# Function that starts the daemon/service # do_start() { echo -n "Starting eibdnetmux" /usr/local/bin/eibnetmux $DAEMON_ARGS echo " done" sleep 2 echo -n "Starting group listen" /usr/local/bin/groupsocketlisten ip:127.0.0.1 > /tmp/knx_groupsocketlisten & echo " done" }
Mon fichier « log » du bus est /tmp/knx_groupsocketlisten
J’ai crée, ce qui est pour l’instant une simple table avec les Groupe Addresses qui m’intéressent, à l’éfigie de linknx :
-- -- Structure de la table `knx_ga` -- CREATE TABLE `knx_ga` ( `knx_ga_id` int(3) NOT NULL AUTO_INCREMENT, `knx_ga_groupaddress` tinytext NOT NULL, `knx_ga_value` text NOT NULL, `knx_ga_comment` text NOT NULL, PRIMARY KEY (`knx_ga_id`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1; -- -- Contenu de la table `knx_ga` -- INSERT INTO `knx_ga` (`knx_ga_id`, `knx_ga_groupaddress`, `knx_ga_value`, `knx_ga_comment`) VALUES (1, '0/0/1', '1', 'Etat de la lumiere'), (2, '0/0/2', '10', 'Valeur d''éclairement'), (3, '0/0/10', '0', 'DMX');
J’ai 3 groupes d’adresses, ça n’a pas de sens sans une mise en situation.
Mise en situation
J’ai un Hager TXA213 (3 sorties variation 300W), un Hager WKT302 (poussoir 2 boutons), une lampe à la sortie 1 du TXA213.
Une simple pression sur le bouton 1 allume ma lampe, une pression continue augmente la luminosité ; une simple pression sur le bouton 2 éteind la lampe, une pression continue diminue la luminosité.
Pour le détail, voici un export de mes Groupes d’Adresses :
Groupes d’adresses pour tests (pdf)
J’ai trois groupes parmis les sept qui m’intéressent :
0/0/1 → Indication d’état.
0/0/2 → Valeur d’éclairement & Indication valeur d’éclairement.
0/0/10 → Allumage DMX.
Le script
Voici la formule magique, à dérouler, parce que c’est vraiment long.
<!--?php $file = "/tmp/knx_groupsocketlisten"; /** * Tail a file (UNIX only!) * Watch a file for changes using inotify and return the changed data * * @param string $file - filename of the file to be watched * @param integer $pos - actual position in the file * @return string */ function tail($file,&$pos) { // get the size of the file if(!$pos) $pos = filesize($file); // Open an inotify instance $fd = inotify_init(); // Watch $file for changes. $watch_descriptor = inotify_add_watch($fd, $file, IN_ALL_EVENTS); // Loop forever (breaks are below) while (true) { // Read events (inotify_read is blocking!) $events = inotify_read($fd); // Loop though the events which occured foreach ($events as $event=-->$evdetails) { // React on the event type switch (true) { // File was modified case ($evdetails['mask'] & IN_MODIFY): // Stop watching $file for changes inotify_rm_watch($fd, $watch_descriptor); // Close the inotify instance fclose($fd); // open the file $fp = fopen($file,'r'); if (!$fp) return false; // seek to the last EOF position fseek($fp,$pos); // read until EOF while (!feof($fp)) { $buf .= fread($fp,8192); } // save the new EOF to $pos $pos = ftell($fp); // (remember: $pos is called by reference) // close the file pointer fclose($fp); // return the new data and leave the function return $buf; // be a nice guy and program good code ;-) break; // File was moved or deleted case ($evdetails['mask'] & IN_MOVE): case ($evdetails['mask'] & IN_MOVE_SELF): case ($evdetails['mask'] & IN_DELETE): case ($evdetails['mask'] & IN_DELETE_SELF): // Stop watching $file for changes inotify_rm_watch($fd, $watch_descriptor); // Close the inotify instance fclose($fd); // Return a failure return false; break; } } } } // Conection avec la base de données mysql $db = mysql_connect("127.0.0.1", "root", "votremotdepassemysql"); $mysql=mysql_select_db("votrebase",$db); $req_sel_ga = "SELECT knx_ga_id,knx_ga_groupaddress FROM knx_ga"; $qur_sel_ga = mysql_query($req_sel_ga) or die (mysql_error()); $ga_bdd = array(); while($dat_sel_ga = mysql_fetch_array($qur_sel_ga)) { $knx_ga_id = $dat_sel_ga['knx_ga_id']; $knx_ga_groupaddress = $dat_sel_ga['knx_ga_groupaddress']; $ga_bdd[$knx_ga_groupaddress] = $knx_ga_id; } // Use it like that: $lastpos = 0; while (true) { // On tail le fichier de log $knxlisten = tail($file,$lastpos); //echo $knxlisten; // On réagit dès qu'on a un Write if (preg_match('#^Write#',$knxlisten)) { // Recup du Groupe d'Addresse et de la valeur qu'on converti preg_match('#[0-9]*\/[0-9]*\/[0-9]*#',$knxlisten,$groupaddr); preg_match("#[A-F0-9]*(.)$#",$knxlisten,$value); $value = hexdec($value[0]); $groupaddr = $groupaddr[0]; // on regarde si ca fait parti des elements à surveiller if (array_key_exists($groupaddr, $ga_bdd)) { // la valeur associé = l'id dans la BDD $knx_ga_id_update = $ga_bdd[$groupaddr]; $req_sel_ga_update = "UPDATE knx_ga SET knx_ga_value = '$value' WHERE knx_ga_id = $knx_ga_id_update"; // Et on update la BDD ! mysql_query($req_sel_ga_update); if ($knx_ga_id_update == "0/0/10" && $value == "01") exec("dmxchangecolorfader.py 255 0 255"); if ($knx_ga_id_update == "0/0/10" && $value == "00") exec("dmxchangecolor.py 0 0 0"); } } }
Abracadabra !
C’est posté sans mise au propre, mon dernier partage de script PHP était pour le 1-wire, il a fallu faire une archive pour un script plus simple, le voici brut, à personnaliser, poser des includes, variables de configuration, etc…
En gros, il fait quoi ce script ?
Il récupère les groupes d’adresses à surveiller dans la BDD.
Il fait un tail sur notre fichier de sortie groupsocketlisten.
Pour chaque nouvel évènement « Write », il regarde si le groupe d’adresse fait parti de ceux dans la BDD.
Si c’est le cas, il y écrit la valeur.
Cas pratique :
Si j’allume ma lumière, 0/0/1 passe à 1 sur mon bus.
groupsocketlisten l’écris dans le fichier /tmp/knx_groupsocketlisten
Ce script voit passer 0/0/1, il sait que sa valeur m’intéresse, il y écrit immédiatement la valeur dans la base de donnée.
Il suffit de lancer ce script par le cron, à la main (en ligne de commande uniquement), par un init.d ou autre.
La mise à jour de la base est quasi instantanée !
Le fonctionnement du script ci-dessous charge les GA de la base MySQL et les place dans une variable puis les compare à GA qui circule sur le bus.
A la fin du script, la partie liée à 0/0/10 est pour reprendre le fonctionnement de l’article de base et l’allumage du DMX.
Je songe à l’intégrer différemment, très certainement par l’ajout d’un champ contenant la spécificité et le script à exécuter.
Et voila ! Ou comment re-inventer la roue : linknx !
Il me reste à personnaliser ce script via des includes, des paramètres, rajouter un champs dans la table pour appeler un GA par un nom, un autre champs IES pour le write, et faire des essais sur une page web.
Communication entre le bus KNX et un serveur Linux
Jusqu’à présent, j’ai découvert comment envoyer des ordres ou obtenir une valeur avec mon bus KNX.
Que ce soit en PHP ou par ligne de commande.
Mon souhait est de pouvoir faire l’inverse : depuis le bus KNX, de donner un autre à mon serveur.
Plusieurs applications possibles, en voici deux concrètes :
- Allumer/couper les lumières d’ambiance DMX, changer les couleurs.
- Allumer/couper le wifi.
C’est sans limite en fait.
Du moment où j’envois une commande (boutton poussoir) au serveur celui-ci peut être interprété comme bon me semble.
Je passe de l’électrique de puissance à l’informatique classique.
Comment ça marche ?
J’ai essayé de faire un schéma :
Coté programmation, j’ai crée un groupe d’adresses 0/0/10 qui ne contient aucune action, le groupe est lié à l’interrupteur bouton poussoir.
Notre serveur, équipé d’eibnetmux (lien vers son installation) utilise grouplisten pour écouter ce qu’il se passe sur le bus KNX pour un Groupe d’Adresse spécifié, ici le GA 0/0/10.
La fonction grouplisten est exécutée en même temps que le démarrage d’eibnetmux, j’ai rajouté quelques lignes à partir de mon script initial.
La sortie de cette commande est redirigée vers un fichier.
# # Function that starts the daemon/service # do_start() { echo -n "Starting eibdnetmux" /usr/local/bin/eibnetmux $DAEMON_ARGS echo " done" sleep 2 echo -n "Starting group listen" /usr/local/bin/grouplisten ip:127.0.0.1 0/0/10 > /tmp/knx_0-0-10 & echo " done" }
Je vais me servir de ce fichier pour surveiller les changements d’état.
J’utilise l’outil logtail pour vérifier les nouveaux évènements.
Pour cet exemple, je souhaite que l’utilisation du bouton poussoir allume mon bandeau RGB, dont j’ai récemment effectué l’installation.
# chmod +x /usr/local/bin/knx2dmx
# vi /usr/local/bin/knx2dmx
#!/bin/bash lockfile=/tmp/knx2dmx.run if [[ -f $lockfile ]] ; then echo "knx2dmx déjà en cours d'exécution ou supprimer le fichier $lockfile" exit fi touch $lockfile groupaddress=$1 file=/tmp/knx_$groupaddress bouclette="yes" # Boucle sans fin while [ $bouclette = "yes" ] do { # Mais on est pas à 1 seconde près sleep 1 value=`/usr/sbin/logtail -f -o $file | grep "Write" | cut -d" " -f4` if [ "$value" == 01 ] then # Ici j'allume mon bandeau RGB, mais toute autre action est envisageable /usr/local/bin/dmxchangecolorfader.py 255 25 100 elif [ "$value" == 00 ] then # Je l'éteinds /usr/local/bin/dmxchangecolor.py 0 0 0 fi } done
Et celui là, je le lance dans le cron.
*/10 * * * * root /usr/local/bin/knx2dmx 0-0-10
Donc si mon script, via logtail, détecte que l’adresse de groupe 0/0/10 KNX passe à 1, il allume le strip RGB DMX.
A l’inverse, s’il détecte un 0, il l’éteint.
A titre de supplément, le script dmxchangecolor.py est celui abordé dans l’installation d’OLA.
#!/usr/bin/python import sys, array from ola.ClientWrapper import ClientWrapper def DmxSent(state): wrapper.Stop() universe = 1 data = array.array('B') data.append(int(sys.argv[1])) data.append(int(sys.argv[2])) data.append(int(sys.argv[3])) wrapper = ClientWrapper() client = wrapper.Client() client.SendDmx(universe, data, DmxSent) wrapper.Run()
Et le script dmxchangecolorfader.py provient aussi de la page wiki d’OLA.
Que j’ai beaucoup bidouillé car je ne sais pas codé en python :
Je n’en suis pas fier, surtout qu’il ne faut pas mettre de valeur à 0.
#!/usr/bin/python import sys, array from ola.ClientWrapper import ClientWrapper red_arg = int(sys.argv[1]) green_arg = int(sys.argv[2]) blue_arg = int(sys.argv[3]) red = 0 green = 0 blue = 0 wrapper = None loop_count = 0 TICK_INTERVAL = 10 # in ms def DmxSent(state): if not state.Succeeded(): wrapper.Stop() def SendDMXFrame(): # schdule a function call in 100ms # we do this first in case the frame computation takes a long time. wrapper.AddEvent(TICK_INTERVAL, SendDMXFrame) # compute frame here data = array.array('B') global loop_count global red global green global blue if red == (red_arg-1): data.append(red_arg) else: red = loop_count % red_arg data.append(red) if green == (green_arg-1): data.append(green_arg) else: green = loop_count % green_arg data.append(green) if blue == (blue_arg-1): data.append(blue_arg) else: blue = loop_count % blue_arg data.append(blue) loop_count += 1 if (red == (red_arg-1)) and (green == (green_arg-1)) and (blue == (blue_arg-1)): exit() # send wrapper.Client().SendDmx(1, data, DmxSent) wrapper = ClientWrapper() wrapper.AddEvent(TICK_INTERVAL, SendDMXFrame) wrapper.Run()
Résultat
Pour aller plus loin avec un frontend php
Et voila ! Une bonne base pour faire interagir le serveur depuis le bus KNX.
Je pourrai rajouter autant de grouplisten que necessaire, mais dans une certaine mesure, il sera certainement préférable d’écouter tout ce qu’il se passe sur le bus via groupsocketlisten.
Avec un principe un petit peu différent :
Dans ce cas, groupsocketlisten écoute tout ce qu’il se passe sur le bus.
Un script PHP est à l’écoute des informations, certainement sur le même principe du logtail.
Il filtre et remplit des informations dans la base de données MySQL.
Cette partie là est intéressante, si par exemple, j’allume une lumière derrière un variateur TXA213, groupsocketlisten y voit défiler deux informations :
Write from 0.2.189 to 0/0/1: 01 Write from 1.1.2 to 0/0/7: 01 Write from 1.1.2 to 0/0/8: AF
Ici, j’ai allumé ma lumière grâce à un « groupswrite ip:127.0.0.1 0/0/1 1 », je le vois sur mon bus (0.2.189).
Et deux autres informations utiles y circulent :
– 0/0/7 correspond à l’indicateur d’état, à 01 donc ma lampe est allumée.
– 0/0/8 correspond à l’indicateur de la valeure d’éclairement en hexadécimale sur FF (255).
Ici la valeur hexa AF (FF étant le max) correspond à 175 en décimale (255 étant le max).
Ainsi, avec un base de données bien pensée, il est possible de faire un filtre intelligent : un type d’objet c’est tant et tant d’information à récolter avec tels et tels groupes d’adresses.
On peut pousser le bouchon plus loin, c’est ce « frontend » PHP qui pourrait exécuter des actions sur le système tel que l’allumage DMX.
Une fois la BDD avec des informations actualisées, il ne reste plus qu’à les exploiter à travers une page web.
Une solution qui me semble bonne pour les fondations d’une bonne usine à gaz.
Je vais commencer quelque chose dans ce principe pour un prochain article.
Se passer de linknx et webknx2, une fausse bonne idée ?
Aujourd’hui, grande réflexion autour de linknx et knxweb2.
Je me suis attardé sur ces deux outils, en plus de leur découverte via une Live CD.
Le but étant, entre autres, de découvrir l’interface de knxweb2 (knxweb v1 sur le LiveCD), et comprendre la communication entre le click et l’ampoule.
KnxWeb2
C’est à peu près démystifié : knxweb2 tourne en AJAX/jQuery qui communique en XML à travers un savant mélange avec linknx.
C’est puissant ! Instantané.
Seul bémol, au jour d’aujourd’hui, je ne me vois pas capable de « maîtriser » linknx et knxweb2, car là dedans, je n’ai pas mes lots :
– Asterisk
– Notifry
– DMX
– 1-wire
– Alarme
– Teleinfo
– ZoneMinder (vidéo surveillance).
C’est très certainement insérable dans knxweb2, mais le temps que je prenne pour intégrer l’ensemble de mon cahier des charges, j’ai mieux fait de partir de zéro.
Je souhaite connaître au maximum le cheminement de mon usine à gaz pour l’adapter et la faire évoluer au grès des besoins.
Mon problème, c’est que jamais je n’arriverai à égaler la réactivité de knxweb2, mais je vais essayer de m’en approcher.
Linknx
J’ai continué l’approche sur linknx avec une page de test php, et les actions en rapports.
Ça permet de bien saisir la communication :
Clic → PHP → linknx → eibnetmux → knx → ampoule.
Mais au final, d’après ce script de test en php, ça revient à la même chose que :
Clic → PHP → Class PHP Eibnetmux → eibnetmux → knx → ampoule.
Pour linknx, la base utilise un fichier le config xml du paquet.
Pour PHP @ eibnetmux, la base utilise une base de données MySQL et des scripts.
C’est kif kif.
Entre la Class PHP KNX et l’utilisation de linknx par PHP, le fonctionnement est semblable : il y’a ouverture d’un socket pour lire et écrire les informations à la couche inférieure.
Donc pour la partie PHP → KNX, avec ou sans linknx, je ne m’évite pas du travail, ne me complique pas plus la tâche.
Pour conclure
Beaucoup de doutes et de questions.
Au jour d’aujourd’hui, je pense remplacer linknx par des scripts PHP et une base MySQL.
Ainsi que knxweb2 par une interface web perso, en sachant que je n’arriverai pas à égaler sa réactivité, mais je gagnerai en maîtrise, souplesse vis à vis de mon cahier des charges.
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.