Category Archives: KNX

Protocole de transmission généralement utilisé dans la partie puissance de la maison domotisée.

Z41 Remote disponible pour Android

Une info peu reprise : l’application Z41 Remote est enfin disponible pour Android.
Depuis bien longtemps les utilisateurs d’iPhone pouvaient contrôler leurs maisons avec leurs téléphones.
C’est maintenant aux utilisateurs Android de pouvoir piloter leurs maisons comme s’ils étaient en face de leur Z41.

Pour rappel, l’application Z41 Remote de Zennio est une application qui permet de dupliquer l’écran du Z41 sur son smartphone.
L’application Android est une Beta.

Elle est grossièrement stable, certaines fonctions sont indisponibles, quelques plantages aléatoires.
Mon Z41 n’est pas encore configuré dans ses plus belles fonctions, mais j’ai d’ors et déjà pu constater que Z41 Remote sur android ne me permet pour l’instant pas :
– D’afficher les graphiques
– De choisir la couleur de mon rail LED RGBW.

Vivement la suite ! (Initialement l’application était prévue pour juillet 2014)

Télécharger Z41 REMOTE pour Android

Page d'accueil Z41 Remote Android

Page d’accueil Z41 Remote

Z41 Remote Android écran principal

Ecran principal Z41

Ecran BSO sur Z41 Remote Android

Ecran BSO

Ecran graphiques Z41 Remote Android

Ecran graphiques Z41 Remote Android

 

Posté dans KNX, Z41 | Tagged , , , | Laisser un commentaire

Dans la maison prête à domotiser

Un an, trois mois et trois jours, c’est le temps qui s’est écoulé depuis mon dernier article, c’est aussi le temps pour construire 4 murs et un toit.
Au-delà de l’achat du terrain, de l’élaboration des plans avec un architecte, et de la construction qui a debutée début novembre, un peu de neuf coté domotique.

 Accompagnement avec un intégrateur : Concept ED

Chose que je conseillerai à toutes les personnes qui veulent se lancer dans la domotique : se faire accompagner.
Parce que les conseils avisés d’un professionnel sont primordiaux ; partir en solo pour faire des bourdes, avoir une maison domotisée mais incomplète, illogique, mal pensée ou mal programmée, ça serait bien dommage par rapport au budget électricité qui y est consacré.
Certes, l’accompagnement avec un intégrateur est un coût supplémentaire, mais c’est la clé pour un projet réussi.
Croyant avoir entassé beaucoup d’infos sur la domotique, et aurais pu partir avec mes propres connaissances, l’aide de forums et de très bonnes Mailings, mais je préfèrais m’engager avec un intégrateur pour son oeil professionnel et son expérience.

Dans ce domaine, mon choix s’est orienté vers Concept-ED.

Logo Concept ED

Concept ED – Intégrateur domotique en Alsace

Pour en savoir pour sur la société :

 Le « qui fait quoi ? » de la maison domotique

Je me suis fait un « tableau » pour évaluer les différents besoins du projet.
Par pièce, chaque lumière est commandée par  tels intervenants. Chaque prise, etc…

Morceau choisi du pseudo cahier des charges

Morceau choisi du pseudo cahier des charges

Bien pratique pour synthétiser le projet, estimer les besoins en modules, interrupteurs, boutons poussoirs.
Le tout en rapport avec un plan sur lequel chaque élement est positionné.
Le travail en amont avec un intégrateur et l’expérience de l’électricien ont permis de peaufiner le projet.

Tableau électrique

AvantPendantAprès
Tableau éléctrique avant

Tableau éléctrique avant

Tableau électrique pendant

Tableau électrique pendant

Tableau electrique terminé

Tableau electrique terminé

Quelques 65 gaines ont été placées.
L’ensemble de mes modules KNX Hager achetés sur eBay on pu être utilisé, sans devoir en ajouter, ni en retirer.

Poêle à pellets domotisable ou presque

Notre maison sera chauffée avec un poêle à pellets.
L’un des critères du choix de poêle, est de pouvoir le domotiser.
Dans ce domaine là, la marque Edilkamin sort du lot. Les howto sont facilement trouvable sur le net, ils se domotisent à l’aide d’un ou deux contacts secs sur une connectique type RS232.

Dans notre cas, RT2012 et confort oblige, nous recherchons un poêle répondant à ces critères:

  • « étanche » RT2012.
  • canalisable avec 2 sorties d’air chaud.
  • 9kW.

Rien ne correspond à ces trois critères supplémentaires chez Edilkamin.

Nous nous tournons ainsi vers la marque CMG (Caminetti Montegrappa).
Le poêle en question dispose également d’une prise USB à l’arrière, mais je n’ai encore trouvé personne qui a apporté la réponse sur l’utilisation de cette prise en domotique.

Carte mère poêle CMG

Carte mère poêle CMG

Les différents fabricants sont muets sur les connectiques de leurs poêles, c’est bien dommage pour ceux, comme moi, dont la domotisation du poêle est un critère important…

J’espère apporter des réponses au cours de cette année.

Achat groupé ETS4

J’ai profité en fin d’année 2013 d’un achat groupé du logiciel de programmation ETS4. La commande groupée a été (comme à son habitude) organisée la communauté Allemande http://knx-user-forum.de.
Ce forum a l’avantage d’être autorisé à organiser des commandes groupées pour l’achat du logiciel ETS4.

Plus d’information, sur le thread dédié du forum :
http://knx-user-forum.de/knx-eib-forum/34958-ets4-sammelbestellung.html

Google Traduction… Pour résumer le prix est avantageux :
ETS4 avec licence en fichier coûte normalement 800 € HT.
Avec une TVA de 21% (belge) : 968 € TTC.
Auquel il faut rajouter 15€ HT de frais de dossier, soit 18,15 € TTC.
Donc normalement la licence ETS4 coûte 986,15 € TTC.

Grâce à la commaunté knx-user-forum.de.
Ils permettent d’obenir un « voucher » d’une réduction de 400 € HT.
La licence ETS4 file m’a coutée 623,15 € TTC.
Soit une réduction de 37 % ! Merci à eux !

Ce genre de vente a lieu environ tous les 6 mois, en espérant que l’opération ne soit pas figé dans l’attente d’ETS5.
Lisez bien le sujet sur le forum de la communauté lié à cette commande groupée si ça vous tente.

Ca reste une sacrée somme pour commencer à mettre les pieds dans le KNX, surtout pour un particulier qui n’aura certainement qu’un seul projet à suivre.
On espèrant ne pas regreter cet achat…

Dans le prochain épisode

Maintenant que le terrain de jeu est en place, y’a plus qu’a…
Le programme est bien chargé :
– Programmation propre des fonctions de bases KNX : lumières, volets, chauffage, etc…
– Programmation évoluée du KNX  : fonction « aurevoir », Z41, store/alerte vent, etc…
– Compteur d’eau à impulsion avec Raspberry Pi.
– Monitoring du ballon thermodynamique.
– Doorphone SIP.
– Vidéo-surveillance.
– Domotisation du poêle à granules.

A bientôt !

Posté dans KNX | 3 Commentaires

Une interface web pour contrôler le bus KNX sur Raspberry Pi

Raspberry Pi logo

Raspberry Pi logo

Pour reprendre mes différents articles sur le bus KNX, j’ai décidé de passer mon projet sur Raspberry pour vérifier que mes lignes de commandes sont toujours d’actualitées, effectuer un point sur ce que j’ai fait, pouvoir partager le schmilblick.

En plus d’être à la mode, le Raspberry Pi a un très belle avenir dans la domotique !

Comme ce blog est rédigé au fil de mes découvertes du KNX, j’ai essayé de synthétiser mon article sur la prise de contrôle du bus via jQuery.
A savoir que ce qui suit peut également être refait sur du i386…

Objectif

Re-partir de zéro et d’arriver à une interface web permettant d’allumer/éteindre une lumière et de régler sa luminosité (TXA213).
Pouvoir lire et écrire à tout va sur le bus KNX ; l’état des élèments soit lisible et modifiable, un max de souplesse !

La base

Dans un premier temps, je pars sur une base de Raspbian wheezy (sans démarrage de X11) – de très bon tutoriaux existent sur la toile – puis c’est parti pour l’installation d’eibnetmux sur Raspberry.
Pourquoi eibnetmux et pas eibd ? Parce qu’au fur et à mesure de l’utilisation je trouve personnellement qu’eibnetmux est plus simple d’utilisation, plus complet, mieux fini.

# sudo passwd
# su
# apt-get update
# apt-get dist-upgrade
# apt-get install build-essential

Coté Raspberry Pi, je fais tout en root, ajoutez vos outils préférés, nano, vim, alias, etc…

Coté KNX je dispose simplement d’un module HAGER TXA213 : 3 sorties variables 300W
Deux groupes d’adresses :
0/0/1 : sortie 1 → On/Off + indication d’état
0/0/2 : sortie 1 → Valeur d’éclairement + indicateur valeur d’éclairement.

Note : C’est un exemple de groupe d’adresses, apriori, j’ai lu qu’il est préférable de séparer l’indication d’état de  la commande on/off, sans savoir pour quelle raison.

Ainsi que du classique : une alimentation KNX, un routeur IP/KNX et son alimentation dédiée.

Schéma de base KNX

Schéma de base KNX

Téléchargement et installation de Zlogger

Quelques libraires nécessaires pour l’installation :

# apt-get install libpth20 libpth-dev libpolarssl0 pkg-config pth-dbg

Zlogger 1.5.0 est nécessaire au fonctionnement d’eibnetmux.

# cd /usr/src/
# wget "http://downloads.sourceforge.net/project/zlogger/zlogger/1.5.0/zlogger-1.5.0.tar.bz2?r=http%3A%2F%2Fsourceforge.net%2Fprojects%2Fzlogger%2F&ts=1334692716&use_mirror=freefr" -O zlogger-1.5.0.tar.bz2
# tar xfv zlogger-1.5.0.tar.bz2
# cd zlogger-1.5.0
# ./configure --with-plugins
# make
# make install
# ldconfig

Télechargement et installation d’eibnetmux

Plus de détails dans l’article dédié à eibnetmux et eibd.
La version d’eibnetmux est la dernière disponible selon le site de son auteur via sourceforge.

# cd /usr/src/
# wget "http://downloads.sourceforge.net/project/eibnetmux/eibnetmux/2.0.1/eibnetmux-2.0.1.tar.gz?r=http%3A%2F%2Fsourceforge.net%2Fprojects%2Feibnetmux%2Ffiles%2Feibnetmux%2F2.0.1%2F&ts=1334739400&use_mirror=netcologne" -O eibnetmux-2.0.1.tar.gz
# tar zxvf eibnetmux-2.0.1.tar.gz
# cd eibnetmux-2.0.1
# ./configure --enable-php
# make
# make install
# ldconfig

On récupère et installe le « Sample client applications » ; ce package contient les fichiers PHP nécessaires pour un lire et écrire sur le bus KNX..

Il contient également les commandes de bases équivalentes à groupread, groupwrite, groupswrite, groupsocketlisten, etc…

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

Pause !
Une grosse modification apportée à un fichier, il s’agit du fichier eibtrace/eibtrace.c :
J’ai modifié le fichier pour retourner à une syntaxe plus simple à traiter :

eibtrace.c

J’ai également ajouté un « fflush(stdout);« , sans cet ajout, eibtrace ne parvient pas à rediriger stdout vers un fichier. Et comme le C++ et moi, ça fait deux, je me contente de cette rustine…

Et on compile les scripts d’exemples d’eibnetmux.

# ./configure
# make
# make install

Le petit souci étant que je n’ai pas trouvé l’astuce pour compiler directement dans /usr/local/bin ou équivalent.
Alors en attendant …

# cp eibcommand/eibcommand /usr/local/bin/
# cp eibmultiread/eibmultiread /usr/local/bin/
# cp eibread/eibread /usr/local/bin/
# cp eibstatus/eibstatus /usr/local/bin/
# cp eibtrace/eibtrace /usr/local/bin/
# cp firereads/firereads /usr/local/bin/
# cp readmemory/readmemory /usr/local/bin/
# cp resetdevice/resetdevice /usr/local/bin/
# cp search/search /usr/local/bin/
# cp writememory/writememory /usr/local/bin/

eibtrace est l’équivalent de groupsocketlisten d’eibd.
eibcommand est l’équivalent groupwrite d’eibd.
eibread est l’équivalent groupread d’eibd.
A noter que groupread, groupwrite, groupswrite, groupsocketlisten et compagnie sont compatible avec eibnetmux.

La librairie PHP se trouve /usr/src/eibnetmux-2.0.1/client_lib/php/eibnetmux.php et les commandes getstatus.php readgroup.php writegroup.php dans /usr/src/eibnetmuxclientsamples-1.7.1/php , je me garde ça sous le coude pour l’instant.

Test intermédiaire de lecture du bus KNX

Il est temps de tester eibnetmux, et ses commandes.
L’IP de mon interface IP/KNX est 192.168.0.51.

# eibnetmux -s -t -u -e -d --pidfile=/var/run/eibnetmux.pid 192.168.0.51 
# ps aux | grep eibnetmux
root 1993 0.0 0.0 3152 912 ? Ss 17:02 0:00 eibnetmux -s -t -u -e -d --pidfile=/var/run/eibnetmux.pid 192.168.0.51
root 2067 0.0 0.0 4060 820 pts/0 S+ 17:20 0:00 grep eibnetmux

Tâchons d’écouter ce qu’il se passe sur le bus :

# eibtrace 127.0.0.1
Connection to eibnetmux '127.0.0.1' established

Puis dans un autre shell, allumons et éteignons la lumière (groupe d’adresse 0/0/1 comme indiqué au début) :

# eibcommand -s 127.0.0.1 0/0/1 1 1
# eibcommand -s 127.0.0.1 0/0/1 1 0

Ce qui renvoit dans notre eibtrace :

2013/04/18 22:38:45:640 – phys addr: 0.2.189 – IND low W group addr: 0/0/1 – value: 1 | 1 | 1 | 1 (81 – eis types: 1, 2, 7, 8)
2013/04/18 22:38:45:686 – phys addr: 1.1.2 – IND low W group addr: 0/0/1 – value: 1 | 1 | 1 | 1 (81 – eis types: 1, 2, 7, 8)
2013/04/18 22:38:45:741 – phys addr: 1.1.2 – IND low W group addr: 0/0/2 – value: 65 | 168 (a8 – eis types: 6, 14)

Puis

2013/04/18 22:38:54:278 – phys addr: 0.2.189 – IND low W group addr: 0/0/1 – value: 0 | 0 | 0 | 0 (80 – eis types: 1, 2, 7, 8)
2013/04/18 22:38:54:366 – phys addr: 1.1.2 – IND low W group addr: 0/0/1 – value: 0 | 0 | 0 | 0 (80 – eis types: 1, 2, 7, 8)
2013/04/18 22:38:54:432 – phys addr: 1.1.2 – IND low W group addr: 0/0/2 – value: 0 | 0 (00 – eis types: 6, 14)

A noter, que sans modifier le ficher eibtrace.c avant sa compilation, nous aurions eu ceci :

2013/04/14 17:28:43:570 – 0.2.189 IND low W 0/0/1 : on | 1 | 1 | 1 (81 – eis types: 1, 2, 7, 8)
2013/04/14 17:28:43:614 – 1.1.2 IND low W 0/0/1 : on | 1 | 1 | 1 (81 – eis types: 1, 2, 7, 8)
2013/04/14 17:28:43:671 – 1.1.2 IND low W 0/0/2 : 65% | 168 (a8 – eis types: 6, 14)

Puis

2013/04/14 17:29:07:316 – 0.2.189 IND low W 0/0/1 : off | 0 | 0 | 0 (80 – eis types: 1, 2, 7, 8)
2013/04/14 17:29:07:403 – 1.1.2 IND low W 0/0/1 : off | 0 | 0 | 0 (80 – eis types: 1, 2, 7, 8)
2013/04/14 17:29:07:480 – 1.1.2 IND low W 0/0/2 : 0% | 0 (00 – eis types: 6, 14)

Pensez à faire un killall eibnetmux.
Bravo, on vient de faire un groupswrite : eibcommand -s <serveur> <group address> <type eis> <valeur>

Avec eibtrace, on trace les valeurs lues sur le bus KNX, lampe allumée, variateur à 65%, puis lampe éteinte, variateur à 0%.
0.2.189 correspond à ma passerelle IP/KNX, 1.1.2 à mon TXA213.
Si l’ordre provient d’un interrupteur, le phénomène est identique.

Ecoute du bus avec eibtrace

Ecoute du bus avec eibtrace

La suite consiste à avaler puis digérer ces valeurs.

Absorbtion des valeurs du bux KNX

J’ai besoin de php5 + mysql-server et tant qu’à faire, apache 2 pour la visualisation des lumières :

# apt-get install php5 php5-cli php5-mysql libapache2-mod-php5 php5-dev apache2 mysql-server php-pear

Mon mot de passe mysql pour suivre cet article : dbpass

Pour les plus « doués », je conseille quelque chose de plus léger qu’Apache2 sur Raspberry Pi, genre Lighttpd, Cherokee, Hiawatha.

Le script d’ init.d pour eibnetmux s’illustre d’une particularité à la ligne 41, en plus de démarrer eibnetmux sur mon interface IP Siemens N146 5WG1 146-1AB01 (192.168.0.51), il lance en fond de tâche un « eibtrace 127.0.0.1 » vers le fichier /tmp/eibtrace . Tout ce qui se passera à partir de l’exécution d’eibnetmux sera loggé dans le fichier /tmp/eibtrace .
Note : sans l’ajout de « fflush(stdout); » sans eibtrace.c, la redirection stdout ne fonctionne pas.

# vi /etc/init.d/eibnetmux

Qui contient :

#! /bin/sh
### BEGIN INIT INFO
# Provides: eibnetmux
# Required-Start: mysql
# Required-Stop: mysql
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Start eibnetmux service at the end of boot
# Description: This services is for communications with knx/eib.
### END INIT INFO

# by Lionel @ domolio.fr

PATH=/sbin:/usr/sbin:/bin:/usr/bin
NAME=eibnetmux
DAEMON=/usr/local/bin/eibnetmux
DAEMON_ARGS="-s -t -u -e -d --pidfile=/var/run/eibnetmux.pid 192.168.0.51"
PIDFILE=/var/run/eibnetmux.pid

# Load the VERBOSE setting and other rcS variables
. /lib/init/vars.sh

# Define LSB log_* functions.
# Depend on lsb-base (>= 3.0-6) to ensure that this file is present.
. /lib/lsb/init-functions

if [ ! -x $DAEMON ]; then
 echo "eibnetmux appears to be uninstalled."
fi

#
# Function that starts the daemon/service
#
do_start()
{
echo -n "Starting eibnetmux"
/usr/local/bin/eibnetmux $DAEMON_ARGS
echo " done"
sleep 2
echo -n "Starting eibtrace"
/usr/local/bin/eibtrace 127.0.0.1 > /tmp/eibtrace &
echo " done"
}

do_stop()
{
echo -n "Stoping eibnetmux"
PID=`cat $PIDFILE`
kill $PID &> /dev/null
echo " done"
}

#
# Function that stops the daemon/service
#

case "$1" in
 start)
 do_start
 ;;
 stop)
 do_stop
 ;;
 restart)
 do_stop
 sleep 1
 do_start
 ;;
 status)
 pid=$(pidofproc -p $PIDFILE $DAEMON)
 ret=$?
 pid=${pid% } # pidofproc() supplies a trailing space, strip it

if [ $ret -eq 0 ]; then
 echo "eibnetmux is running (PID: $pid)"
 exit 0
 elif [ $ret -eq 1 ] || [ $ret -eq 2 ]; then
 echo "eibnetmux is dead, although $PIDFILE exists."
 exit 1
 elif [ $ret -eq 3 ]; then
 echo "eibnetmux is not running."
 exit 3
 fi
 echo "sais pas"
 ;;
 *)
 echo "usage: $0 {start|stop|restart|status}"
 exit 1
esac
# chmod +x /etc/init.d/eibnetmux
# insserv eibnetmux

A ce stade, j’ai un raspberry capable d’écouter et de commander mon bus KNX, je vais y rajouter ma sauce « home made » pour lire et écrire comme je l’entends.
Je le fais en PHP, parce que c’est un des seuls languages que je connais :)
J’installe le paquet php-pear afin d’installer System_Daemon pour me permettre de daemoniser un script PHP et d’avoir des logs.

# pear install -f System_Daemon

Lire le très bon article de Kevin van Zonneveld : Create daemon in PHP.

Le principe

Une fonction forte utile : tail ; bien connue des utilisateurs UNIX, mais pour l’utiliser en PHP, j’utilise le script dispo sur le book php : http://php.net/manual/fr/function.inotify-init.php
Comme signalé dans le premier commentaire, le résultat est identique à un « tail -f » exécuté dans un shell.
J’avais déjà utilisé la commande unix logtail pour arriver à mes fins dans un script permettant de commander un bandeau LED RGB via KNX, toujours en exploitant les logs.
Communication entre un bus KNX et un serveur linux, avec cette fonction PHP, c’est plus propre.

Ces deux outils vont me permettre de faire de mon script un vrai « service » sur mon Rapsberry Pi.
Il va me permettre d’avoir des logs, un service propre à la communication KNX ↔ Raspberry Pi.

Le but étant d’écouter tout ce qui se passe sur le bus (via eibtrace) et de l’écrire dans un fichier.

Eibtrace log dans un fichier

Eibtrace log dans un fichier

Puis, de « parser » ce fichier pour que chaque action qui nous intéresse soit retranscrite dans une table MySQL.
Vient enfin une page qui consulte cette base MySQL, donc : l’état de mes intervenants KNX.

Nous devons installer l’extention php inotify, puis l’activer :

# pecl install inotify
# vi /etc/php5/conf.d/30-inotify.ini

Pour y insérer :

extension=inotify.so

Mise en place

Structure de la base de données

Pourquoi faire simple quand on peut faire compliquer ?
Par souplesse, je split mes données en 2 tables :
– La première regroupe les Group Address → knx_ga .
– La secondes regroupe les EIS possible → knx_eis.

Ma base s’appelle domy.
Un mysqldump :

--
-- Table structure for table `knx_ga`
--

DROP TABLE IF EXISTS `knx_ga`;
CREATE TABLE `knx_ga` (
  `ga_id` int(3) NOT NULL AUTO_INCREMENT,
  `ga_groupaddress` tinytext NOT NULL,
  `ga_eis_id` int(3) NOT NULL,
  `ga_name` mediumtext NOT NULL,
  `ga_value` text NOT NULL,
  `ga_comment` text NOT NULL,
  PRIMARY KEY (`ga_id`)
) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=latin1;

--
-- Table structure for table `knx_eis`
--

DROP TABLE IF EXISTS `knx_eis`;
CREATE TABLE `knx_eis` (
  `eis_id` int(3) NOT NULL AUTO_INCREMENT,
  `eis_code` tinytext NOT NULL,
  `eis_num` int(3) NOT NULL,
  `eis_type` tinytext NOT NULL,
  PRIMARY KEY (`eis_id`)
) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=latin1;
--
-- Dumping data for table `knx_eis`
--

LOCK TABLES `knx_eis` WRITE;
/*!40000 ALTER TABLE `knx_eis` DISABLE KEYS */;
INSERT INTO `knx_eis` VALUES (1,'1.001',1,'Off / Off'),(2,'5.001',2,'Pourcentage');
/*!40000 ALTER TABLE `knx_eis` ENABLE KEYS */;
UNLOCK TABLES;

La table knx_eis contient le numéro de type d’eis, le type de datapoint, et un petit commentaire.
Une fois importé, je renseigne mon premier Group Address du bux KNX, le 0/0/1, correspondant au On/Off + indicateur d’état.

INSERT INTO `domy`.`knx_ga` (`ga_id`, `ga_groupaddress`, `ga_eis_id`, `ga_name`, `ga_value`, `ga_comment`) VALUES (NULL, '0/0/1', '1', 'lampe1_onoff', '0', 'Lampe 1');

Idem avec mon GA 0/0/2, correspondant à la valeur d’éclairage, pour rappel, il s’agit d’un variateur TXA213.

INSERT INTO `domy`.`knx_ga` (`ga_id`, `ga_groupaddress`, `ga_eis_id`, `ga_name`, `ga_value`, `ga_comment`) VALUES (NULL, '0/0/2', '2', 'lampe1_eclairage', '0', 'Lampe 1 : valeur éclairement');

Le champs de la table qui va changer, c’est ga_value, il passera à 1 lorsque la lumière est allumée, à 0 lorsqu’elle est éteinte.
Pour l’éclairage, une valeur entre 0 et 100.
Et voila, les racines sont là, il reste à remplir ces données et les exploiter.

knx-tail2mysql : parcourir l’activité du bus KNX vers table MySQL

Vous mélangez le script System_Daemon + Log Tail + un peu de MySQL pour obtenir ce script (pensez à cliquer pour tout dérouler)

# touch /usr/local/bin/knx-tail2mysql
# chmod +x /usr/local/bin/knx-tail2mysql
# vi /usr/local/bin/knx-tail2mysql

Script qui contient :

#!/usr/bin/php -q
<?php
// --------------------------------------
// --       Daemonise PHP script       --
// --------------------------------------
// D'après http://kvz.io/blog/2009/01/09/create-daemons-in-php/
// Allowed arguments & their defaults
 
$runmode = array(
    'no-daemon' => false,
    'help' => false,
    'write-initd' => false,
);
 
// Scan command line attributes for allowed arguments
foreach ($argv as $k=>$arg) {
    if (substr($arg, 0, 2) == '--' && isset($runmode[substr($arg, 2)])) {
        $runmode[substr($arg, 2)] = true;
    }
}

// Help mode. Shows allowed argumentents and quit directly
if ($runmode['help'] == true) {
    echo 'Usage: '.$argv[0].' [runmode]' . "\n";
    echo 'Available runmodes:' . "\n";
    foreach ($runmode as $runmod=>$val) {
        echo ' --'.$runmod . "\n";
    }
    die();
}

// Make it possible to test in source directory
// This is for PEAR developers only
ini_set('include_path', ini_get('include_path').':..');

// Include Class
error_reporting(E_STRICT);
require_once 'System/Daemon.php';

// Setup
$options = array(
    'appName' => 'knx-tail2mysql',
    'appDir' => dirname(__FILE__),
    'appDescription' => 'Parses KNX logfiles and stores them in MySQL',
    'authorName' => 'Lionel',
    'authorEmail' => 'lionel@chocolio.com',
    'sysMaxExecutionTime' => '0',
    'sysMaxInputTime' => '0',
    'sysMemoryLimit' => '1024M',
    'appRunAsGID' => 0,
    'appRunAsUID' => 0,
);

System_Daemon::setOptions($options);

// This program can also be run in the forground with runmode --no-daemon
if (!$runmode['no-daemon']) {
    // Spawn Daemon
    System_Daemon::start();
}

// With the runmode --write-initd, this program can automatically write a
// system startup file called: 'init.d'
// This will make sure your daemon will be started on reboot
if (!$runmode['write-initd']) {
    System_Daemon::info('not writing an init.d script this time');
} else {
    if (($initd_location = System_Daemon::writeAutoRun()) === false) {
        System_Daemon::notice('unable to write init.d script');
    } else {
        System_Daemon::info(
            'sucessfully written startup script: %s',
            $initd_location
        );
    }
}

// --------------------------------------
// --            function tail         --
// --------------------------------------

// D'après http://php.net/manual/fr/function.inotify-init.php

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 <img class="wp-smiley" alt=";-)" src="http://www.domolio.fr/wp-includes/images/smilies/icon_wink.gif" />
                    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;
            }
        }
    }
}

// ------------------------------------------
// --      MON CODE PERSO COMMENCE ICI     --
// ------------------------------------------

// Connexion avec la base de données mysql
// Egalement possible de faire un include
$MYSQLHOST      = "localhost";
$MYSQLLOGIN     = "root";
$MYSQLPWD       = "dbpass";
$MYSQLBASE      = "domy";
$db = mysql_connect($MYSQLHOST, $MYSQLLOGIN, $MYSQLPWD);
$mysql=mysql_select_db($MYSQLBASE,$db);

if ($mysql!=1) {
  System_Daemon::notice('La connection avec la base de données a échoué.');
  exit();
}

// ---
// D'après http://stackoverflow.com/questions/9668299/extract-part-of-string-with-php
function get_string_between($string, $start, $end){
    $string = " ".$string;
    $ini = strpos($string,$start);
    if ($ini == 0) return "";
    $ini += strlen($start);
    $len = strpos($string,$end,$ini) - $ini;
    return trim(substr($string,$ini,$len));
}

// ---
// Quels sont les GA à surveiller ?

$req_sel_ga     = "SELECT ga_id,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)) {
        $ga_id          = $dat_sel_ga['ga_id'];
        $ga_groupaddress        = $dat_sel_ga['ga_groupaddress'];
        $ga_bdd[$ga_groupaddress]       = $ga_id;
}
// ---

// ---
// parse/tail du fichier du eibtrace
$lastpos = 0;
while (true) {
	// On tail le fichier de log
	$knxlisten = tail("/tmp/eibtrace",$lastpos);
	// On réagit dès qu'on a un Write
	// Pour chaque ligne, on récupère le Groupe d'Addresse et de la valeur qu'on converti
	System_Daemon::notice($knxlisten);
	$groupaddr	= get_string_between($knxlisten,'group addr: ',' -');
	$value		= get_string_between($knxlisten,'value: ',' |');
	System_Daemon::notice("GA : ".$groupaddr." | VALUE : ".$value);
	// on regarde si ca fait partit des elements à surveiller
	if (array_key_exists($groupaddr, $ga_bdd)) {
                        // la valeur associé = l'id dans la BDD
                        $ga_id_update   = $ga_bdd[$groupaddr];
                        //System_Daemon::info($groupaddr." est à surveiller. Mise à jour de sa valeur dans la BDD");
                        System_Daemon::info($groupaddr." -> ".$value);
                        $req_sel_ga_update      = "UPDATE knx_ga SET ga_value = '$value' WHERE ga_id = $ga_id_update";
                        //System_Daemon::info("Requete SQL -> ".$req_sel_ga_update);
                        // Et on update la BDD
                        mysql_query($req_sel_ga_update);
                }
}

?>

Ici, les informations de connexion à la base MySQL sont en dur, à partir de la ligne 143.
On notera le chemin du fichier à parser à la ligne 186.

Egalement ici, on se rend compte de modifier eibtrace, par simplicité, en effet, une ligne de log se présente ainsi :
2013/04/18 22:38:45:741 – phys addr:    1.1.2 – IND low    W group addr:    0/0/2 - value: 65 | 168 (a8  – eis types: 6, 14)
Le script récupère ce qu’il y’a entre « group addr » et « -« , puis entre « value: » et « |« . Plus simple …

Un petit test … Il est nécessaire d’avoir le script init.d/eibnetmux de lancé avec eibtrace qui redirige vers /tmp/eibtrace.

# knx-tail2mysql
[Apr 14 22:53:22] notice: Starting knx-tail2mysql daemon, output in: '/var/log/knx-tail2mysql.log'
# cat /var/log/knx-tail2mysql.log
[Apr 14 22:53:22] notice: Starting knx-tail2mysql daemon, output in: '/var/log/knx-tail2mysql.log'
[Apr 14 22:53:22] info: Changed identify to 'root':'root'
[Apr 14 22:53:22] info: not writing an init.d script this time

Tout va bien … Tuez le processus si il est en fond de tâche.

Script de démarrage

Le script se lance en tant que daemon, pour ne pas oublier, faisons un petit init.d script et le logrotate:

# knx-tail2mysql --write-initd

Et il vous pond un script init.d ! magique !

# vi /etc/init.d/knx-tail2mysql

Une petite modification malgré tout, afin de s’assurer que le parse du fichier de traces se lance après que la connexion au bus soit effective, et donc fichier crée.
Sans quoi, il se lance avant même que mysql ne soit lancé…

# Required-Start:    $remote_fs
# Required-Stop:     $remote_fs

Deviens :

# Required-Start:    eibnetmux
# Required-Stop:     eibnetmux

Et on l’installe en tant que script de démarrage :

# insserv knx-tail2mysql

Logrotate

Coté logrotate, l’on crée un script dans le dossier /etc/logrotate.d/ qui sera automatiquement traité quotidiennement, généralement à 06h25.

# vi /etc/logrotate.d/knx-tail2mysql

Contient :

/var/log/knx-tail2mysql.log {
        weekly
        missingok
        rotate 12
        compress
        delaycompress
        notifempty
        sharedscripts
        postrotate
                /etc/init.d/knx-tail2mysql restart > /dev/null
        endscript
}
# ls -lh /var/log/knx-tail2mysql.log*
-rw-r--r-- 1 root root 449 févr. 21 00:20 /var/log/knx-tail2mysql.log
# logrotate -f /etc/logrotate.d/knx-tail2mysql
# ls -lh /var/log/knx-tail2mysql.log*
-rw-r--r-- 1 root root 306 févr. 21 00:21 /var/log/knx-tail2mysql.log
-rw-r--r-- 1 root root 449 févr. 21 00:20 /var/log/knx-tail2mysql.log.1

L’on passe d’un fichier à deux fichiers, les suivants seront compressés, ce logrotate fonctionne.

Essai d’exécution

Eibtrace doit être en route en fond de tâche (les scripts précédents le lance en même temps qu ‘eibnetmux), avec écriture de la trace dans le fichier /tmp/eibtrace .
Un petit init 6 c’est bien aussi.
On lance knx-tail2mysql et on vérifie qu’un processus tourne en fond de tâche :

# knx-tail2mysql
[Apr 14 23:33:27] notice: Starting knx-tail2mysql daemon, output in: '/var/log/knx-tail2mysql.log'
# ps aux | grep knx-tail2mysql
root 3163 0.2 0.4 39608 5004 pts/0 S 23:33 0:00 /usr/bin/php -q /usr/local/bin/knx-tail2mysql
root 3168 0.0 0.0 4060 816 pts/0 S+ 23:33 0:00 grep knx-tail2mysql

Process en fond de tâche : OK

Si ce n’est pas le cas, et que aucune erreur n’est donnée dans le fichier de log, c’est peut-être que vous n’avez pas activé l’extension inotify.ini.
Pour débugger davantage, placer des System_Daemon::notice(« bla bla bla »);

J’allume ma lampe, en ligne de commande, via un interupteur, le résultat est le même.

# eibcommand -s 127.0.0.1 0/0/1 1 1
# cat /tmp/eibtrace
2013/04/18 22:58:57:598 - phys addr: 0.2.189 - IND low W group addr: 0/0/1 - value: 1 | 1 | 1 | 1 (81 - eis types: 1, 2, 7, 8)
2013/04/18 22:58:57:651 - phys addr: 1.1.2 - IND low W group addr: 0/0/1 - value: 1 | 1 | 1 | 1 (81 - eis types: 1, 2, 7, 8)
2013/04/18 22:58:57:708 - phys addr: 1.1.2 - IND low W group addr: 0/0/2 - value: 65 | 168 (a8 - eis types: 6, 14)

Trace dans le fichier : OK

Normalement, la table s’est mise à jour.

# mysql -pdbpass domy -e "SELECT ga_groupaddress,ga_value FROM knx_ga;"
+-------------------+-------------+
| ga_groupaddress   | ga_value   |
+-------------------+-------------+
| 0/0/1             | 1          |
| 0/0/2             | 65         |
+-------------------+-------------+

Trace dans le fichier : OK

Si la table MySQL ne se met pas à jour, mais que le fichier /tmp/eibtrace est à jour, consulter le fichier de log /var/log/knx-tail2mysql.log :

warning: [PHP Warning] filesize(): stat failed for /tmp/eibtrace [l:86]
warning: [PHP Warning] inotify_add_watch(): No such file or directory [l:90]

Alors que le fichier existe et que knx-tail2mysql tourne.
C’est probablement que l’ordre initialisation des scripts est incorrect.

OK, OK, OK ! L’extinction de la lampe, même effet, parfait, on continue !

Schema avec knx-tail2mysql

Schema avec knx-tail2mysql

Visualisation et contrôle par interface web

A ce stade, on a une table MySQL qui se met à jour selon l’état des actionneurs.
Qu’est-ce qui permet d’afficher en quasi-instantanné le contenu des champs MySQL ?
L’ajax voyons ! Tant mieux, je suis nul en AJAX !

Dans le cadre de gestion du lumière, il y’a 3 actions principales, donc 3 scripts vitaux :
– Récupérer l’état on/off ou la valeur d’éclairage.
– Envoyer un toggle on/off.
– Envoyer une valeur d’éclairage.

Je n’ai pas de volet roulant ou de gestion de chauffage, évidemment, plus il y’a de types d’élements, plus ça se complique ; j’ai voulu séparer dans une autre table les EIS pour cette raison , mais pour l’instant on va s’appliquer à allumer, éteindre et changer la valeur d’éclairage de mon ampoule sur le Hager TXA213.

J’ai choisi d’utiliser jQuery pour communiquer en AJAX, et ainsi profiter de la librairie JQuery-UI pour ce qui est graphique, slider, etc…
jQuery me permettra de travailler avec des noms pour appeler mes lumière, lamp1_onoff, lampe1_eclairage, lampe2cuisine_onoff, etc.. d’où le champs ga_name dans la table knx_ga.
Puis jQuery me permettra également d’utiliser JQuery Mobile pour les mêmes fonctions mais sur mobile.
J’utilise une classe PHP pour débugger, c’est écrit par Joe Fallon et ça s’appel PopupPhpDebug.

Deux div ID, l’un pour une image on/off, l’autre pour un slider avec la valeur d’éclairage.

Les fichiers sont téléchargables ici :
– Pensez à supprimer votre index.html dans /var/www/
- Conservez les droits www-data:www-data sur les fichiers et répertoires.

Telecharger

Je ne vais pas faire de cours de PHP, juste expliquer les grandes lignes du fonctionnement de mon interface web.

De l’AJAX pour piloter une lumière

Un simple div pour une simple lumière :

<img id="toggle_light-lampe1_onoff" alt="chargement" src="images/loading.gif" />

Dans l’attribut id :
toggle_ : sert de préfixe, tout ce qui est toggle_ correspond à une lumière.
lampe1_onoff : nom de la correspondance via ma table MySQL -> 0/0/1 dans ce cas.
Ainsi, autant toggle_* qu’il a de lumière.

Dans le même principe :

<div id="slider-lampe1_eclairage"></div>
<div id="text-lampe1_eclairage" align="center"></div>

slider-* pour un slider à les valeurs variables.
text-* pour afficher la valeur.

Interface jQuery pour KNX

Interface jQuery pour KNX

Et pour contrôler tout ça :


$(function() {
var intervalrefresh = 1000;

// fonction qui recupere la valeur d'un objet selon le nom du GA
$.get_light_value = function(light_name) {
 var result = null
 $.ajax({
 url: 'ajax/knx-get_light_value.php',
 data: 'ga_name='+light_name,
 dataType: 'json',
 async: false,
 success: function(data) {
 result = data['value'];
 //console.log("Valeur de : "+light_name+" -> "+result );
 }
 });
 return result;
}

// fonction qui toggle la valeur d'un object son le nom du GA (on/off)
$.set_light_toggle = function(light_name) {
 $.ajax({
 url: 'ajax/knx-set_light_toggle.php',
 data: 'ga_name='+light_name,
 dataType: 'json',
 async: false,
 success: function(data) {
 //console.log("Mise à jour de : "+light_name);
 }
 });
}

// fonction qui envois une valeur à un GA
$.set_light_value = function(light_name,value) {
 $.ajax({
 url: 'ajax/knx-set_light_value.php',
 data: 'ga_name='+light_name+'&ga_value='+value,
 dataType: 'json',
 async: false,
 success: function(data) {
 //console.log("Mise à jour de : "+light_name);
 }
 });
}

$(document).ready(function(){
 var refreshId = setInterval( function(){

// Refresh des lights
 $('[id^="toggle_light-"]').each(function() {
 var light_name_split = $(this).attr('id').split('-');
 var light_name = light_name_split[1];
 var light_value = $.get_light_value(light_name);
 if (light_value == 1) $('#toggle_light-'+light_name).attr('src',"images/lampes-on.png");
 if (light_value == 0) $('#toggle_light-'+light_name).attr('src',"images/lampes-off.png");
 });

// Refresh des sliders
 $('[id^="slider-"]').each(function() {
 var light_name_split = $(this).attr('id').split('-');
 var light_name = light_name_split[1];
 var light_value = $.get_light_value(light_name);
 $(this).slider( "option", "value", light_value);
 $('#text-'+light_name).html(light_value+"%");

});

}, intervalrefresh);
});

// mise à jour du bus KNX après mouvement du slider
 $('[id^="slider-"]').each(function() {
 var light_name_split = $(this).attr('id').split('-');
 var light_name = light_name_split[1];
 $(this).slider({
 max: 100,
 min: 0,
 stop: function(event,ui) {
 //console.log("nouvelle valeur du slider : "+ui.value);
 $.set_light_value(light_name,ui.value);
 }
 });
 });

// mise à jour des lumières après un click
 $('[id^="toggle_light-"]').click(function() {
 var light_name_split = $(this).attr('id').split('-');
 var light_name = light_name_split[1];
 $.set_light_toggle(light_name);
 });

// fin
});

Oula !
En gros, ça dit que toutes les 1000 ms secondes (1 seconde), pour chaque div qui commence par toggle_ d’executer le fichier ajax/knx-get_light_value.php , qui lui contient (via des includes et functions) une requête MySQL pour chercher la valeur correspondante en base.
Si c’est égal à 1, ça affiche une ampoule jaune, si c’est égal à 0, ça affiche une ampoule grise.
Idem pour le slider, on place le curseur à la valeur correspondante avec affichage sous forme texte.

Tandis qu’un click sur une ampoule, donc un div, a pour action d’exécuter le fichier ajax/knx-set_light_toggle.php , qui lui contient une récupèration de la valeur en base, il l’inverse, et l’applique sur le bus KNX.
Il l’applique sur le bus KNX via la librairie eibnetmux.php, souvenez vous, nous avions compilé eibnetmux avec les librairies PHP, c’est justement là qu’elle nous sert !

Le retour d’état de l’actionneur se fait par le cheminement eibtrace, knx-tail2mysql, ajax ; pas de « mise à jour directe », on évite ainsi les erreurs possibles, mais du coup, l’image s’actualise au pire qu’une seconde plus tard (+ temps de traitement de l’info), d’où le « quasi-instantanné ».

Schéma interaction KNX avec PHP

Schéma interaction KNX avec PHP

Ca marche bien !

Firebug pour surveiller l'AJAX

Firebug pour surveiller l’AJAX

La console firebug permet de visualiser les transactions AJAX -> MySQL, rajoutez des debugs si nécessaire.
Il est possible de diminuer les 1000ms pour obtenir plus de réactivité, c’est au serveur MySQL de pouvoir encaisser.

On peut également faire de l’image mapping sur une photo, grace à des outils tel que http://www.image-maps.com on définit un rectangle sur une lampe, modifie le code HTML pour placer notre « id ».

Créez votre map

Créez votre map

L’outil sert surtout pour créer la zonne au bon endroit.
Le code modifié :

<img id="Image-Maps_8201304191538462" alt="" src="http://www.image-maps.com/uploaded_files/8201304191538462_sketchup.png" usemap="#Image-Maps_8201304191538462" width="716" height="531" border="0" />
<map id="_Image-Maps_8201304191538462" name="Image-Maps_8201304191538462">
<area id="toggle_light-lampe1_onoff" title="Allumer/eteindre" alt="Allumer/eteindre" coords="510,143,579,266" shape="rect" />
</map>

Et un clique sur l’abat-jour de l’image éteind/allume la lumière.

Click pour allumer/eteindre

Click pour allumer/eteindre

Il doit certaiement être possible de modifier l’image de cette petite lampe pour qu’elle paraisse allumée.
Un autre exemple plus généraliste des maps sur image en CSS : cssplay.co.uk .

Les limites de la gestion de la maison deviennent celles du graphisme web, du moment où on a accès à l’état des éléments KNX, qu’on peut les piloter, techniquement c’est presque sans limite ; il faut savoir s’y faire ergonomiquement, c’est essentiel.

Interface mobile pour téléphone et tablette

Pour l’instant, c’est très brouillon, pas d’AJAX, je pars du principe que si je contrôle ma maison avec mon smartphone, c’est parce que je ne suis pas chez moi, donc pas de rafraichissement instantanné.
J’utilise jQuery Mobile, une demo est disponible sur le site officiel.
Mon utilisation est celle d’un formulaire traité en PHP classique, pas très au point pour l’instant, mais fonctionnel pour un début.

Il me semble qu’il est possible de convertir un site web en application iphone/android, il faut que je retrouve le nom de cet outil.
A terme, le tout protégé par htacces ou authentification php.

Inteface mobile

Inteface mobile

Rendu et réactivité

Une vidéo afin de se rendre compte de la réactivité du click et de la remonté d ‘infos, malgré l’utilisation d’une webcam de piètre qualité, avec une mise à niveau de la luminosité catastrophique, je n’ai pas trouvé mieux pour filmer la réaction du click sur la lampe.

Conclusion

Mon but étant d’arriver à contrôler l’installation domotique depuis un serveur par une interface web, c’est en bonne voie  !

Quelques points à approfondir lorsque j’aurai une installation KNX réele et complète :
– Groupe d’adresse différente entre l’état et l’action ? Vraiment ? Reste à voir comment gérer ça.
– Gestion des autres EIS : volets, BSO, chauffage, etc…
– Ajout d’intelligence avec du 1-wire.
– Une interface web ergonomiquement parfaite.

C’est relativement réactif, j’en attends pas plus pour l’instant.

Je n’utilise aucun cache EIBD, voir les commentaires sur l’article Se passer de linknx et webknx2 une fausse bonne idee ?

C’est donc une bonne base pour une plateforme de contrôle et supervision du bus KNX, j’ai hâte d’approfondir sur une installation réel .

Téléchargement

Je met à disposition une image de la carte SD de mon Raspberry Pi.
Attention, c’est très lourd : 7,42 Go. Sauvegardé avec Win32DiskImager, vous devriez pouvoir restaurer avec le même outil.

Mot de passe root : pi
Mot de passe MySQL : dbpass

Telechargerraspberry-domolio-knx.img : 7,42 Go
MD5 : 81a8df6724fea6c8916f6a8e814b908f

Have fun !

Posté dans Debian, KNX, php, Web | 34 Commentaires

Acheter son matériel KNX

Près d’un an et demi que je m’équipe petit à petit de matériel KNX, faute à un chantier qui n’avance pas… J’ai eu l’opportunité de m’équiper en matériel KNX moins cher que ce que l’on peut trouver sur des sites e-commerce.

Où ça ? Ebay Allemagne.

En Allemagne, la domotique a un train d’avance, les chantiers sont plus souvent équipés en domotique, donc plus de revendeurs, plus de concurence, donc des prix plus bas qu’en France.
Etant en Alsace, c’est presque naturel d’aller voir les prix pratiqués chez nos voisins outre-Rhin.

Bref, voici le tour de matériel acquis au bout d’un an et demi d’achats sur eBay :

Matériel KNX acheté sur ebay

Matériel KNX acheté sur ebay

Voici les prix auxquels j’ai acheté ce matériel :

[table “” not found /]

2394,16 € étalé sur 1 an et demi, je ne l’imaginais pas !
Mon tableau hors-ligne, où je maintiens ces chiffres, comporte également des colonnes avec le prix constaté chez un revendeur allemand bien connu, le prix catalogue de la marque, ainsi que deux revendeurs français.
Cette même liste de matériel, m’aurait coûté :
Comparé au e-commerce allemand 4418 € soit 2024 € plus cher.
Comparé aux prix des sites constructeurs : 7522 € soit 5128 € d’économie.
Comparé au e-commerce français : 4677 € soit 2283 €d’économie.

Faire ses emplettes en allemagne, ne demande pas de connaissance en allemand, j’en ai aucune …
Parcontre, vaut mieux avoir un bon suivi des ventes, des frais de ports, et des accords pour l’expédition en France.
3/4 des annonces ebay.de ne mentionnent pas l’expédition de produits vers la France, mais 90% de ces même vendeurs sont prêts à vous l’expédier.
Ainsi, il faut gentillement demander si il est prêt à vous l’envoyer.

Pour gagner un précieux temps, je me suis fait un suivi des réponses des ebayers, car ce sont souvent les mêmes noms qui reviennent lors des ventes.

Suivi des ebayer

Suivi des ebayer

Evidement, ça reste de l’achat sur ebay, avec ses avantages : le prix, mais également avec ses incovénients : pas de SAV (quoi que … à voir …), la plupart du temps il faut payer par virement, délais de livraison plus long, matériel pas souvent neuf.
Ca reste le meilleur moyen de se monter une plateforme de test pour débuter en KNX.

Posté dans KNX | 10 Commentaires

Interagir en jQuery/Ajax avec le bus KNX

Une semaine après mon article sur un frontend php  KNX.
Je bosse sur une interface simple pour visualiser et contrôler des points lumineux.

Pour l’instant, je fais au plus simple, j’ai deux points lumineux :
– Une ampoule sur un TXA213.
– Un bandeau LED RGB contrôlé par OLA.

Je pourrais également paramétrer d’autres ampoules sur mes TXA207C, mais je fais aussi du On/Off avec le TXA213.

J’ai fait un petit screencast aussi simplet que mes scripts, à regarder en 720p.

Il est difficile d’entrer dans les détails du script, cependant, le fonctionnement principal est lié à mon article précédent sur le bus KNX et l’enregistrement des valeurs dans la base MySQL.

La nouveauté provient des scripts jQuery et Ajax pour le rafraîchissement toute les 0,5 secondes des éléments de la page.

Je change un élement à partir de la page web, j’utilise writegroup en php. (Voir mon article : Prise en main du KNX en php ).
Et continue de lire ma BDD, sans y écrire de changement, le frontend php s’en occupe.

Il y’a 3 scripts AJAX/PHP :

  • knx-get_light_value.php : me récupère simplement les valeurs dans la BDD selon le « nom système » écrit dans le div id html.
  • knx-set_light_toggle.php : me change l’état d’une lumière, On ou Off, rien de plus sur un EIS n° 1.
  • knx-set_light_value.php : plus complexe que le précédent script, peut gérer d’autres EIS.

Evidemment, si je change l’état d’une lumière depuis un bouton poussoir, le changement est visible sur la page (ce que je fais à 0:50).

Je partagerai volontiers les sources lorsque j’aurai amélioré le schlimblik en back-end.

Posté dans Debian, KNX, php, Web | 3 Commentaires

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 :

Schéma de principe de l'écoute du bus  KNX

Schéma de principe de l'écoute du bus KNX

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.

Configuration ETS4 avec un groupe vite pour le DMX

Configuration ETS4 avec un groupe vite pour le DMX

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.

# touch /usr/local/bin/knx2dmx
# 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 :

Utilisation de groupsocketlisten pour une interface web

Utilisation de groupsocketlisten pour une interface web

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.

Posté dans Debian, dmx, KNX, led, Sysadmin | 1 Commentaire

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.

Les VM, rien de plus pratique pour essayer sans casser

Les VM, rien de plus pratique pour essayer sans casser

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é.

Test de KNXWEB2

Test de KNXWEB2

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.

Posté dans Debian, KNX, php, Sysadmin | 5 Commentaires

Configuration d’une platine de tests KNX avec ETS

ETS, le Saint Graal du KNX ! Un prix exorbitant pour le simple particulier.
Heureusement, l’association KNX s’adapte.

ETS 4 ?

KNX ETS4 eCampus est un super moyen d’apprendre le principe de programmation du KNX via ETS4.
C’est de l’e-formation bien faite.
Ça semble fastidieux, surtout lorsque les vidéos sont en anglais, la simulation en allemand et les questions en français (ça fait travailler les langues)
Tâchez d’obtenir votre diplôme avec  un niveau d’apprentissage de 85 %.

KNX eCampus

KNX eCampus

La récompense ? Une licence ETS4 Lite, cette licence permet de gérer un projet de 20 éléments KNX.
Suffisant pour savoir si KNX est fait pour vous et si vous êtes fait pour KNX.

Direction l’eCampus pour tout savoir sur ETS  et le KNX : http://wbt4.knx.org/
(j’espère obtenir une licence Pro avec la pub que je leur fait !)

Le seul souci est lié à l’utilisation eibnetmux, vu qu’il ne fonctionne qu’avec ETS3.

Quoi qu’il en soit, l’ETS4 eCampus permet de se familiariser avec ETS et le jour venu d’acquérir une licence.
Je n’ai pas le besoin de rédiger un article sur comment programmer une platine avec ETS4, ce genre de support reprend très bien le b-a ba de la programmation.

Commande groupée ?

Sur certains forums, sont régulièrement organisées des commandes groupées de licence ETS, ce qui permet d’obtenir pas loin de 50% de réduction.
Il faut rester à l’affût et saisir les bonnes occasions.

ETS 3 ?

Il est possible d’obtenir une licence ETS3 par l’intermédiaire d’un autre passionné de domotique, ou si vous êtes suffisamment proche de votre électricien.
Le logiciel est plus ancien, il est théoriquement plus facile d’en trouver.

De temps en temps, on retrouve des ventes eBay pour une license ETS3, de ce style :

eBay licence KNX ETS3 Pro

eBay licence KNX ETS3 Pro

Une opportunité à saisir.

Concernant la programmation avec ETS3, en ayant suivi les cours de l’eCampus ETS4, on s’en sort avec le 3.

Autrement, il existe un très bon dictatiel disponible sur le forum electrotechnique-fr.com.

Posté dans ETS3, ETS4, KNX | Laisser un commentaire

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

Installation de eibd et de eibnetmux sur Wheezy

Enfin un plongeon dans le vif du sujet !

Câblage de la platine

Il est temps de câbler et des profiter des modules achetés (cf article premiers pas en KNX).

Voici ma platine de test :

Platine de test KNX

Platine de test KNX

Bordélique sans rail DIN !
J’utilise du câble RJ45 rigide pour mon bus KNX.

EIBD/EIBNETMUX me servira à communiquer avec mon tableau électrique par l’intermédiaire de mon routeur Siemens IP/KNX .
L’ensemble de mon installation est fait sous Debian Wheezy.

Eibd ou Eibnetmux ?

Pourquoi deux paquets pour le même résultat ? Quelles différences ?

Lorsque eibd a été développé, il n’était pas très stable, c’est à ce moment là, qu’une version parallèle a été développée : eibnetmux.
Eibnetmux n’est pas une surcouche d’eibd, ce sont deux paquets distinct, c’est l’un ou l’autre.

Il y’a différence sur la gestion du tunneling & routing, ces notions ont quasi disparu dans eibnetmux.
Les 2 paquets proposent une utilisation php.
Eibd nécessite d’être exécute avec un utilisateur non root.

Voici un –help des deux outils.

eibd eibnetmux
Usage: eibd [OPTION…] URL
eibd — a commonication stack for EIB
(C) 2005-2011 Martin Koegler <mkoegler@auto.tuwien.ac.at>
supported URLs are:
ft12:/dev/ttySx
ipt:router-ip[:dest-port[:src-port[:nat-ip[:data-port]]]]]
iptn:router-ip[:dest-port[:src-port]]
usb:[bus[:device[:config[:interface]]]]ft12 connects over a serial line without any driver with the FT1.2 Protocol to
a BCU 2ipt connects with the EIBnet/IP Tunneling protocol over an EIBnet/IP gateway.
The gateway must be so configured, that it routes the necessary addressesiptn connects with the EIBnet/IP Tunneling protocol over an EIBnet/IP gateway
using the NAT mode

usb connects over a KNX USB interface

-c, –GroupCache enable caching of group communication network
state
-d, –daemon[=FILE] start the programm as daemon, the output will be
written to FILE, if the argument present
-D, –Discovery enable the EIBnet/IP server to answer discovery
and description requests (SEARCH, DESCRIPTION)
-e, –eibaddr=EIBADDR set our own EIB-address to EIBADDR (default
0.0.1), for drivers, which need an address
-f, –error=LEVEL set error level
-i, –listen-tcp[=PORT] listen at TCP port PORT (default 6720)
–no-tunnel-client-queuing do not assume KNXnet/IP Tunneling bus
interface can handle parallel cEMI requests
-p, –pid-file=FILE write the PID of the process to FILE
-R, –Routing enable EIBnet/IP Routing in the EIBnet/IP server
-S, –Server[=ip[:port]] starts the EIBnet/IP server part
-t, –trace=LEVEL set trace level
-T, –Tunnelling enable EIBnet/IP Tunneling in the EIBnet/IP
server
-u, –listen-local[=FILE] listen at Unix domain socket FILE (default
/tmp/eib)
-?, –help Give this help list
–usage Give a short usage message
-V, –version Print program version

Mandatory or optional arguments to long options are also mandatory or optional
for any corresponding short options.

Usage: eibnetmux [options] hostname[:port]
where:
hostname[:port] defines remote eibnet/ip tunneling server with default port of 3671options:-s –eib_server[=ip:port] activate eibnet/ip server default: no, port=3671
-t –tcp_server[=ip:port] activate tcp server default: no, port=4390
-u –unix_server[=path] activate unix socket server default: no, path=/tmp/eibnetmux
-e –eibd_server[=ip:port] activate eibd server default: no, port=$$$
-l –log_level=level set log level default: 0
(0=none, 1=info, 2=verbose, 4=warning, 8=error, 16=critical)
(32=fatal 64=user 128=debug 256=trace client 512=trace server)
(1024=trace socketserver 2048=trace EIBD 4096=memory)
-L –log_dest=udp:host:port send log to udp receiver host @ port
-L –log_dest=file:filename write log to file
-L –log_dest=syslog:facility send log to syslog using facility
-r –ring_level=level set levels logged to ring buffer default: 128
-R –ring_size=kilobytes set size of debug ring buffer default: 32
-d –daemon run as daemon default: no
-i –user=username run process as user default: –
-g –group=groupname and group default: –
-p –pidfile=file file to write pid to default: –
-S –security=file file with security restrictions default: –
-A –address=ip-address fixed IP address to use default: –
-T –testmode run in testmode default: no

Mon choix s’est porté sur eibnetmux par sa simplicité, son fonctionnement sans problèmes, sa maintenance.
J’ai par ailleurs rencontré des problèmes pour faire fonctionner eibd avec ETS. Problème de tuneling/routing ? probablement, mais le problème ne s’est pas posé avec eibnetmux.

Installation des composants nécessaires

Toujours sur Debian Wheezy (kernel 3.2.0).
Que ça soit eibd ou eibnetmux, il est nécessaire d’installer pthsem, il s’agit d’une libraire multithread dont je n’ai pas trop compris l’utilité, mais nécessaire, donc …

# apt-get install build-essential
# cd /usr/src/

Et on attaque, la compilation de pthsem.

# wget http://www.auto.tuwien.ac.at/~mkoegler/pth/pthsem_2.0.8.tar.gz
# tar zxvf pthsem_2.0.8.tar.gz
# cd pthsem-2.0.8/
# ./configure
# make
# make install

Voila pour le strict nécessaire.

Installation d’eibd

Puis on s’attaque à bcusdk qui contient EIBD :

# cd /usr/src/
# wget "http://downloads.sourceforge.net/project/bcusdk/bcusdk/bcusdk_0.0.5.tar.gz?r=http%3A%2F%2Fsourceforge.net%2Fprojects%2Fbcusdk%2F&amp;ts=1334692790&amp;use_mirror=freefr" -O bcusdk_0.0.5.tar.gz
# tar -zxvf bcusdk_0.0.5.tar.gz
# cd bcusdk-0.0.5/
# export LD_LIBRARY_PATH=/usr/local/lib
# ./configure --enable-onlyeibd --enable-eibnetiptunnel --enable-usb --enable-eibnetipserver --enable-ft12

Le fait de forcer LD_LIBRARY_PATH dans /usr/local/lib induit que certaines librairies d’eibd se trouvent à tort dans ce répertoire.

# ln -s /usr/local/lib/libeibclient.so.0 /usr/lib/libeibclient.so.0
# ln -s /usr/local/lib/libeibclient.so.0 /lib/libeibclient.so.0

Ce qui permet à groupswrite de trouver ses librairies.
groupswrite est l’outil permettant  d’envoyer des données sur le bus KNX.

Test de connexion

D’après mon serveur DHCP, je vois que le routeur IP/KNX a pris l’ip 192.168.0.8.

# adduser --disabled-password eibd
# su eibd
# eibd --trace=1 -u ipt:192.168.0.8:3671
W00000001: EIBD should not run as root
Layer 0(0907EB30,4F897E60) Open
Layer 0(0907EB30,4F897E60) Openend
Layer 0(0907EB30,4F897E60) Send(026): 06 10 02 05 00 1A 08 01 C0 A8 00 32 0E 58 08 01 C0 A8 00 32 0E 58 04 04 02 00
Layer 0(0907EB30,4F897E60) Recv(020): 06 10 02 06 00 14 44 00 08 01 C0 A8 00 08 0E 57 04 04 02 BD

Connecté ! Youpi !

Installation de eibnetmux

Le soucis avec le routeur Siemens N146 5WG1 146-1AB01 tout comme le N148/21, c’est qu’il n’est capable de communiquer qu’avec un seul partenaire.
Je ne peux pas programmer, tester et utiliser en même temps, car ce module est neuneu semblable à une utilisation en unicast.
La solution consiste à utiliser eibnetmux qui va router l’ensemble des connexions vers le routeur Siemens.
Coté programmation, l’utilisation eibnetmux implique l’utilisation d’ETS v3.
A terme, mon routeur Siemens IP/KNX sera invisible.

Schéma de principe d'eibnetmux

Schéma de principe d’eibnetmux (source: eibnetmux @ sourceforge.net)

Ce schéma est clair, c’est LA solution à adopter.
Coup de chance, la version 2.0.0 de eibnetmux est sortie depuis moins de 24 heures à la rédaction de ce billet.

Il faut répondre aux dépendances de eibnetmux, toujours sous Debian Wheezy :

# cd /usr/src/
# wget "http://downloads.sourceforge.net/project/zlogger/zlogger/1.5.0/zlogger-1.5.0.tar.bz2?r=http%3A%2F%2Fsourceforge.net%2Fprojects%2Fzlogger%2F&amp;ts=1334692716&amp;use_mirror=freefr" -O zlogger-1.5.0.tar.bz2
# tar xfv zlogger-1.5.0.tar.bz2
# cd zlogger-1.5.0
# ./configure --with-plugins
# make
# make install
# apt-get install libpth20 libpth-dev libpolarssl0 pkg-config
# cd /usr/src/
# wget "http://downloads.sourceforge.net/project/eibnetmux/eibnetmux/2.0.1/eibnetmux-2.0.1.tar.gz?r=http%3A%2F%2Fsourceforge.net%2Fprojects%2Feibnetmux%2Ffiles%2Feibnetmux%2F2.0.1%2F&amp;ts=1334739400&amp;use_mirror=netcologne" -O eibnetmux-2.0.1.tar.gz
# tar zxvf eibnetmux-2.0.1.tar.gz
# cd eibnetmux-2.0.1
# ./configure --enable-php --with-phpdoc
# make
# make install

Et voila !
Je compile avec la prise en charge php, très important, j’y reviendrai plus tard.
Mon routeur IP/KNX limité à une connexion est devenu ouvert à toutes les connexions.

Pour le tester on lance eibnetmux :

# eibnetmux -s -t -u -e 192.168.0.8

Puis dans un autre shell :

# groupsocketlisten ip:127.0.0.1

Ou bien une connexion ETS, smartphone, etc … autant qu’on veut !
Je rappele juste que l’utilisation eibnetmux implique l’utilisation d’ETS3.

J’ai crée un petit script d’init pour lancer eibnetmux au démarrage.
L’adresse IP 192.168.0.8 est à adapter bien sur.

# vi /etc/init.d/eibnetmux

#! /bin/sh
### BEGIN INIT INFO
# Provides: eibd
# Required-Start: $all
# Required-Stop: $all
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Start eibd service at the end of boot
# Description: This services is for communications with knx/eib.
### END INIT INFO

# by Lionel @ domolio.fr

PATH=/sbin:/usr/sbin:/bin:/usr/bin
NAME=eibnetmux
DAEMON=/usr/local/bin/eibnetmux
DAEMON_ARGS="-s -t -u -e -d --pidfile=/var/run/eibnetmux.pid 192.168.0.8"
PIDFILE=/var/run/eibnetmux.pid

# Load the VERBOSE setting and other rcS variables
. /lib/init/vars.sh

# Define LSB log_* functions.
# Depend on lsb-base (>= 3.0-6) to ensure that this file is present.
. /lib/lsb/init-functions

if [ ! -x $DAEMON ]; then
 echo "eibnetmux appears to be uninstalled."
fi

#
# Function that starts the daemon/service
#
do_start()
{
echo -n "Starting eibdnetmux"
/usr/local/bin/eibnetmux $DAEMON_ARGS
echo " done"
}

do_stop()
{
echo "Stoping eibdnetmux"
PID=`cat $PIDFILE`
kill $PID &> /dev/null
echo "done"
}

#
# Function that stops the daemon/service
#

case "$1" in
 start)
 do_start
 ;;
 stop)
 do_stop
 ;;
 restart)
 do_stop
 sleep 1
 do_start
 ;;
 status)
 pid=$(pidofproc -p $PIDFILE $DAEMON)
 ret=$?
 pid=${pid% } # pidofproc() supplies a trailing space, strip it

if [ $ret -eq 0 ]; then
 echo "eibdnetmux is running (PID: $pid)"
 exit 0
 elif [ $ret -eq 1 ] || [ $ret -eq 2 ]; then
 echo "eibdnetmux is dead, although $PIDFILE exists."
 exit 1
 elif [ $ret -eq 3 ]; then
 echo "eibdnetmux is not running."
 exit 3
 fi
 echo "sais pas"
 ;;
 *)
 echo "usage: $0 {start|stop|restart|status}"
 exit 1
esac
# chmox +x /etc/init.d/eibnetmux
# insserv eibnetmux

Conclusion

A ce stade nous avons une plateforme optimale pour la programmation et des tests avancés.

Posté dans Debian, KNX | 20 Commentaires