Installation d’OLA et prise en main du DMX à travers python & php

Maintenant que notre contrôleur compatible Open DMX, nous allons pouvoir l’exploiter logicielement.
Mon but étant de pouvoir changer la couleur (ce qui reviens à allumer/éteindre) en quelques clics ; ainsi que de voir ce qu’il est possible de faire en ligne de commande et idéalement de changer la couleur depuis une page web.

La platine de test DMX

Mon installation est composée de :

  • DMX USB PC V3 (Contrôleur USB / DMX) → 36,50 €.
  • Câble XLR de récup → 0 €.
  • Décodeur DMX RGB → 23,08 €.
  • Alim 12V de récup → 0 €.
  • Câble pour connecter les bandeaux RGB → 1,50 €.
  • 2x Bandeau RGB 12V 5050 30cm → 1,35 € / pièce.
  • Bouchon DMX , livré avec le DMX USB PC → 0 €.

Soit  environ 67 € le tout, frais de ports inclus.

Platine de tests DMX

Platine de tests DMX

Un petit schéma de principe :

Schéma de principe de la phase de tests

Schéma de principe de la phase de tests

En phase final, je compte remplacer le XLR par de l’Ethernet et le strip RGB par des spots encastrables LED RGB de ce style :

Spot encastrable LED RGB 10mm

Spot encastrable LED RGB 10mm

Le revendeur est l’ancien Eurolite.de, devenu Steinigke Showtechnic : la fiche produit du spot encastable LED RGB 10mm.

Installation de Open Lighting Architecture (OLA)

Toujours depuis une Debian Wheezy, on commence par installer différents paquets qui seront nécessaire pour la compilation.

# apt-get install flex libmicrohttpd5 bison libprotobuf-dev protobuf-compiler uuid uuid-dev libcppunit-dev python python-protobuf build-essential
# ldconfig

Et on récupère l’archive d’OLA.

# cd /usr/src/
# wget http://linux-lighting.googlecode.com/files/ola-0.8.18.tar.gz
# tar zxvf ola-0.8.18.tar.gz
# cd ola-0.8.18
# ./configure --enable-python-libs --enable-http

Le « enable-python-libs » permettra d’envoyer des commandes DMX à partir d’un script python.
Le « enable-http » permettra d’utiliser de tester ola à travers une page http.

# make
# make install
# ldconfig

Et voila ! C’est installé.
Ola exige d’être démarré avec un utilisateur non root.

# adduser --disabled-password ola
# su ola

Avant cette première exécution, il est important de veiller à ce que le contrôleur USB/DMX soit reconnu en tant que /dev/dmx0.

# olad -l 3

Le 3 (/4) correspond au niveau de verbosity.

Vous devriez voir au moins ces lignes apparaîtrent :

PluginManager.cpp:74: Trying to start Enttec Open DMX
DeviceManager.cpp:111: Installed device: OpenDmx USB Device:6-0
PluginManager.cpp:78: Started Enttec Open DMX

Si vous avez installez libmicrohttpd5, vous devriez pouvoir accéder à la page http://ip_du_serveur_ola:9090 .
Et configurer votre fixture aka « universe« .

Page de configuration des univers

Page de configuration des univers

J’ai attribué au contrôleur RGB l’adressage DMX 1.
Dont la notice a été scannée.

adressage DMX du contrôleur RGB

adressage DMX du contrôleur RGB

Dans l’onglet Console, je peux modifier la valeur de mes trois canaux RGB et donc chacune des trois couleurs.

Console ola pour contrôleur RGB

Console ola pour contrôleur RGB

Ce qui donne :

Rendu instantané entre OLA et le strip RGB

Rendu instantané entre OLA et le strip RGB

Youpi !
De quoi être tranquille au démarrage de la machine, j’ai pondu ce petit init.d script pour ola à partir du skeleton.

# vi /etc/init.d/olad
#! /bin/sh
### BEGIN INIT INFO
# Provides:          olad
# Required-Start:    $remote_fs $syslog
# Required-Stop:     $remote_fs $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: olad initscript
# Description:       Open Lighting Architecture init script
### END INIT INFO

# Author: Lionel / domolio.fr
#

# Do NOT "set -e"

# PATH should only include /usr/* if it runs after the mountnfs.sh script
PATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/local/bin/
DESC="Open Lighting Architecture Daemon"
NAME=olad
DAEMON=/usr/local/bin/$NAME
DAEMON_ARGS="-f"
PIDFILE=/var/run/$NAME.pid
SCRIPTNAME=/etc/init.d/$NAME
USER=olad

# Exit if the package is not installed
[ -x "$DAEMON" ] || exit 0

# Read configuration variable file if it is present
[ -r /etc/default/$NAME ] && . /etc/default/$NAME

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

# Define LSB log_* functions.
# Depend on lsb-base (>= 3.2-14) to ensure that this file is present
# and status_of_proc is working.
. /lib/lsb/init-functions

#
# Function that starts the daemon/service
#
do_start()
{
        # Return
        #   0 if daemon has been started
        #   1 if daemon was already running
        #   2 if daemon could not be started
        start-stop-daemon --start --chuid $USER --quiet --pidfile $PIDFILE --exec $DAEMON --test > /dev/null \
                || return 1
        start-stop-daemon --start --chuid $USER --quiet --pidfile $PIDFILE --exec $DAEMON -- \
                $DAEMON_ARGS \
                || return 2
        # Add code here, if necessary, that waits for the process to be ready
        # to handle requests from services started subsequently which depend
        # on this one.  As a last resort, sleep for some time.
}

#
# Function that stops the daemon/service
#
do_stop()
{
        # Return
        #   0 if daemon has been stopped
        #   1 if daemon was already stopped
        #   2 if daemon could not be stopped
        #   other if a failure occurred
        start-stop-daemon --chuid $USER --stop --quiet --retry=TERM/10/KILL/5 --pidfile $PIDFILE --name $NAME
        RETVAL="$?"
        [ "$RETVAL" = 2 ] && return 2
        # Wait for children to finish too if this is a daemon that forks
        # and if the daemon is only ever run from this initscript.
        # If the above conditions are not satisfied then add some other code
        # that waits for the process to drop all resources that could be
        # needed by services started subsequently.  A last resort is to
        # sleep for some time.
        start-stop-daemon --chuid $USER --stop --quiet --oknodo --retry=0/10/KILL/5 --exec $DAEMON
        [ "$?" = 2 ] && return 2
        # Many daemons don't delete their pidfiles when they exit.
        rm -f $PIDFILE
        return "$RETVAL"
}

#
# Function that sends a SIGHUP to the daemon/service
#
do_reload() {
        #
        # If the daemon can reload its configuration without
        # restarting (for example, when it is sent a SIGHUP),
        # then implement that here.
        #
        start-stop-daemon --chuid $USER --stop --signal 1 --quiet --pidfile $PIDFILE --name $NAME
        return 0
}

case "$1" in
  start)
        [ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC" "$NAME"
        do_start
        case "$?" in
                0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
                2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
        esac
        ;;
  stop)
        [ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME"
        do_stop
        case "$?" in
                0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
                2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
        esac
        ;;
  status)
        status_of_proc "$DAEMON" "$NAME" && exit 0 || exit $?
        ;;
  #reload|force-reload)
        #
        # If do_reload() is not implemented then leave this commented out
        # and leave 'force-reload' as an alias for 'restart'.
        #
        #log_daemon_msg "Reloading $DESC" "$NAME"
        #do_reload
        #log_end_msg $?
        #;;
  restart|force-reload)
        #
        # If the "reload" option is implemented then remove the
        # 'force-reload' alias
        #
        log_daemon_msg "Restarting $DESC" "$NAME"
        do_stop
        case "$?" in
          0|1)
                do_start
                case "$?" in
                        0) log_end_msg 0 ;;
                        1) log_end_msg 1 ;; # Old process is still running
                        *) log_end_msg 1 ;; # Failed to start
                esac
                ;;
          *)
                # Failed to stop
                log_end_msg 1
                ;;
        esac
        ;;
  *)
        #echo "Usage: $SCRIPTNAME {start|stop|restart|reload|force-reload}" >&2
        echo "Usage: $SCRIPTNAME {start|stop|status|restart|force-reload}" >&2
        exit 3
        ;;
esac

:
# chmod +x /etc/init.d/olad
# insserv olad

Ainsi Open Lighting Architecture sera lancé à chaque démarrage.

Conclusion d’OLA

Cool, ça prend forme !
Il manque un gros détail : ça ne me semble pas viable de contrôler les couleurs à travers l’interface d’administration d’OLA, j’ai besoin de le faire en dehors de cette interface.
D’où l’intérêt d’avoir installé les libraires python d’Open Lighting Architecture.

Prise de contrôle du DMX par PHP & Python

Mon idée est de pouvoir disposer d’une roue chromatique depuis mon smartphone et pouvoir changer les couleurs de mon escalier, par exemple, pour la frime par challenge.
OLA a été installé avec des librairies python, servons-nous en.
Le wiki d’OLA fait part de scripts simple en pyhton.

# vi testcolor.py
import array
from ola.ClientWrapper import ClientWrapper

def DmxSent(state):
  wrapper.Stop()

universe = 1
data = array.array('B')
data.append(10)
data.append(50)
data.append(255)
wrapper = ClientWrapper()
client = wrapper.Client()
client.SendDmx(universe, data, DmxSent)
wrapper.Run()

En ayant olad d’exécuté, on lance :

# python testcolor.py

Si le script ne vous retourne rien et vous éclaire d’un joli bleu, tant mieux !

A l’inverse, si le script python retourne ceci :

Traceback (most recent call last):
  File "testor.py", line 2, in 
    from ola.ClientWrapper import ClientWrapper
ImportError: No module named ola.ClientWrapper

C’est que libraires d’OLA ne sont pas importables par le script.
L’une des solutions consiste à copier les libraires dans le script de travail de python.

# cp -r /usr/local/lib/python2.7/site-packages/ola /usr/lib/python2.7/

Relancez le script et la vie est bleue !
Voila pour la partie pyhton -> DMX.

Color Picker pour DMX

Color Picker pour DMX


Place maintenant à la partie PHP Python.
Dans mon délire d’avoir une roue chromatique ou quelque chose qui y ressemble, j’ai utilisé un script jQuery.

J’ai modifié le script pyhton pour lui passer les couleurs RGB en argument :

#!/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()

Script nommé dmxchangecolor.py placé dans /usr/local/bin/ avec droit en éxecution.

Ma page php :

<?php
function html2rgb($color) {
    if ($color[0] == '#')
        $color = substr($color, 1);
    if (strlen($color) == 6)
        list($r, $g, $b) = array($color[0].$color[1],
                                 $color[2].$color[3],
                                 $color[4].$color[5]);
    elseif (strlen($color) == 3)
        list($r, $g, $b) = array($color[0].$color[0], $color[1].$color[1], $color[2].$color[2]);
    else
        return false;
    $r = hexdec($r); $g = hexdec($g); $b = hexdec($b);
    return array($r, $g, $b);
}

if(isset($_POST['envoyer'])) {
        $htmlcolor = $_POST['htmlcolor'];
        $rgb = html2rgb($htmlcolor);
        exec("dmxchangecolor.py $rgb[0] $rgb[1] $rgb[2]");
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
    <link rel="stylesheet" href="css/colorpicker.css" type="text/css" />
    <link rel="stylesheet" media="screen" type="text/css" href="css/layout.css" />
    <title>ColorPicker DMX - jQuery plugin</title>
    <script type="text/javascript" src="js/jquery.js"></script>
    <script type="text/javascript" src="js/colorpicker.js"></script>
    <script type="text/javascript" src="js/eye.js"></script>
    <script type="text/javascript" src="js/utils.js"></script>
    <script type="text/javascript" src="js/layout.js?ver=1.0.2"></script>
</head>
<body>
<form action="" method="post" >
        <input type="text" maxlength="6" size="6" id="colorpickerField" name="htmlcolor" value="<?php echo $htmlcolor ?>" /><br />
        <input type="submit" value="Envoyer" name="envoyer" />
</form>
</body>
</html>

Simple et efficace, je choisis ma couleur, valide le formulaire, la fonction php convertit la couleur HTML en RGB qui la soumet au script python.

Télécharger le script PHP/jQuery/DMX.

Et voila ! J’aurais préféré une libraire PHP comme pour le KNX et le 1-wire, mais je n’en ai pas trouvé malheureusement.
Passer les couleurs à un script python lui même appelé commande php, ça fera l’affaire pour ma future machine à gaz.

Php Show Controller

Autrement, j’ai découvert Php Show Controller (PSC) et son sympathique créateur Laurent.
https://github.com/RenZ0/php-show-controller

L’outil est très intéressant si l’on souhaite scénariser ses lumières.
Le principe est résumé dans le README :

With php interface you change sql data.
Python engine reads sql data, and send it to OLA.
OLA use your hardware to send DMX signal.

Le paquet a un petit défaut, il n’est pas encore compatible PHP 5.4 car il exige les register_globals (qui ont disparus depuis php 5.4)
Mais d’après l’auteur, les modifications sont pour très bientôt, pour les impatients, en modifiant les quelques GET et POST vous pourrez vite vous faire une idée de la puissance de PSC.

Voici comment l’installer :
Il faut dans un premier temps python-mysqldb et bien sûr un serveur MySQL.

# apt-get install python-mysqldb mysql-server
# wget "http://www.imaginux.com/ccount/click.php?id=148" -O php-show-controller_1.1.1.tar.gz
# tar zxvf php-show-controller_1.1.1.tar.gz
# cd php-show-controller

On crée une base nommée psc.

mysql -p
create database psc;
quit;

On importe la structure et les paramètres de base :

# gzip -d sql/psc_base.sql.gz
# mysql -p psc < sql/psc_base.sql

Puis on copie les fichiers web pour apache2

# cp -r psc/ /var/www/
# cd /var/www/
# chown -R www-data:www-data psc

On modifie le fichier des paramètres MySQL pour que PHP s’en serve :

# vi psc/config.php

Et les paramètres MySQL pour que pyton utilise également MySQL :

# cd /usr/src/php-show-controller/engine/
# vi config.py

Et rendez-vous sur la page web de votre installation pour découvrir PSC.
N’oubliez pas de vous aider de README pour le paramétrage de votre scénario.

Conclusion

Après avoir installé les drivers Open DMX USB, après avoir installé Open Lighting Architecture et ses libraires, après avoir testé un scripts python et php.
Je suis sûr et certain de pouvoir introduire des lumières d’ambiances dans mon projet domotique.
Escalier, pièces à vivre, informations lumineuses, les idées sont nombreuses, mais je sais que je pourrais le faire et introduire les interactions dans mon usine à gaz par l’intermédiaire de pages php.

Ce billet est posté dans Debian, dmx, led, Open DMX. Mettre en favoris le permalien.

9 réponses à Installation d’OLA et prise en main du DMX à travers python & php

  1. RenZO says:

    Salut,

    Merci de ton intérêt pour PSC ! Comme tu l’as indiqué, il n’était pas encore compatible avec PHP 5.4, mais je viens de publier PSC 1.1.2 qui régle ce soucis 🙂

  2. Pingback: Installation du contrôleur USB DMX (OpenDMX) sur Debian Wheezy | Domolio, la domotique et pas que…

  3. Ferllings says:

    Salut,

    Je pense comme toi à mixer mon installation KNX avec du DMX.
    J’aimerais aussi animer l’éclairage de mes escalier en DMX.
    Je connais le principe du DMX, par contre, je séche un peu coté matériel:

    Si j’ai 15 marches (donc 15 spots), j’aurais donc besoin de 15 décodeurs DMX/RGB, pour les commander individuellement?
    C’est une quantité importante à encastrer.
    Aurais-je loupé un détail?

    Merci,

  4. Ferllings says:

    Merci,

    C’est ce que je pensais plus ou moins.
    Je trouve que le matos est encombrant, et cher pour le résultat.

    Je vais voir à interfacer une autre techno, genre, comme tu le suggères un bandeau LED adressable, avec peut-être un raspberrypi dans une boite de dérivation.

    Tu parles de DMX via Zennio? mais le Lumento c’est du KNX pur, je vois pas trop comment tu veux utiliser le DMX dans ce cas.
    A moins que tu ne parles du controleur, pour sélectionner les couleurs?

  5. Daduke says:

    Bonjour,
    perso je compte faire TOUT l’eclairage en DMX uniquement sur des leds MR16 + washers RGB (+ strips addressables, mais pas en DMX).
    J’ai acheté des décodeurs DMX 27 channels en anode commune qui permettent de passer 15 amperes en 12V repartis sur les 27 channels, ces decodeur ne sont pas cher et ils sont livrés « nu ».
    Reste a le monter dans un boitier, proteger l’entree avec des fusibles 12V DC (fusibles de voiture 😉 ), et empiler les modules d’alim pour cracher les Watts suffisants.
    Je vais tester des alims de PC (capables de fournir >40A sur un rail 12V) et des alims specifiques LED.
    Je pense mettre 2-3 décodeurs par étage pour tout controler.
    J’ai déja fait des tests avec une vielle alim de PC, mais pas assez stable pour les leds quand il y a peu de charge

    Mon idee et de faire un routeur KNX -> OSC
    Puis OSC -> DMX et de mettre toute l’intelligence au niveau de la couche OSC.
    Ca permet ensuite d’utiliser tous les outils de controle OSC pour mes eclairages (sur tablette tactile notamment pour controler les points lumineux sans se lever/sortir du lit avec une interface par piece).
    OSC est vraiment bien supporté et fait pour le réseau contrairement au DMX/midi/…

    En tout cas, merci pour ton site c’est vraiment génial!!

  6. Joel says:

    Bonjour a tous
    Comment installer libmicrohttpd5 ?
    Je débute et l’idée de ce projet me plais.
    Cordialement.
    Jo

  7. algo says:

    ola gere t-il arnet ?

Laisser un commentaire

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