Milight Multi-Bridge Emulator (chapitre 2)

Comme je le disais dans mon précédent article, j’ai décidé de créer un émulateur multi bridge pour Milight, pour palier à certaines limitations du bridge officiel.

Création d’un émulateur de bridge Milight

Le C++ n’est pas vraiment un langage que j’apprécie, par contre le Python est un langage qui m’attire. J’ai donc décidé d’apprendre le Python et de « wrapper » le code OpenMilight d’origine créé par Henryk (avec quelques adaptations). Celà offre plusieurs avantages :

  • Le code C++ peut être porté sur d’autres plateformes indépendamment de mon code Python
  • On fait abstraction de la partie « émetteur RF » qui peut toujours être sous-traité à un Arduino ou autres modules électroniques
  • Le lancement du code C++ nécessite les droits root pour accéder au SPI du RPi. Je peux donc lancer « OpenMilight » en root, et mon émulateur de bridge en user non-root.

Il a fallu me « dérouiller » de mes souvenirs d’IUT ! Programmation objet, threading, socket, mutex, piles… Mon Milight Bridge Emulator utilise tout ca !

Mon code est conçu sous forme de 3 objets :

  • MilightRemote : permet d’émuler la télécommande. En agissant sur les différentes fonctions, on modifie les variables et on forge des ordres RF
  • MilightBridge : permet de se mettre en écoute UDP sur un port donné, et de renvoyer les commandes comprises au MilightRemote
  • MilightDriver : permet de gérer les accès concurrents à l’émetteur RF. Chaque MilightRemote écrit dans une pile, qui est dépilée régulièrement vers le code OpenMilight.

Un code « main » permet d’initialiser les objets comme il faut en fonction du nombre de bridges voulus.

Concrètement voici ce qu’est capable de faire mon code :

  • Emulation d’autant de bridges Milight que désiré avec gestion d’accès concurrents (bridges RGBW uniquement)

Et voici les features qui seront implémentées prochainement pour pallier à des défauts de conception des ampoules :

  • Allumage violent : si on demande à une lampe de s’allumer à puissance réduite, mais qu’elle était  à pleine puissance au précédent allumage, elle s’allumera à pleine puissance puis diminuera sa puissance lumineuse. La création d’un mode « fade in / fade out » permettra d’émuler le comportement des lampes  CWW (Cold & Warm White)
  • Absence d’acquitement : les lampes n’envoient pas de confirmation et ne renvoient pas leur état. La création d’un mode « repeat » permettra de renvoyer régulièrement les commandes radio en cas d’inactivité.
  • Rallumage en cas de coupure de courant : fonction de base pratique quand on continue d’utiliser l’interrupteur classique mais qui s’avère très pénible quand on laisse ses lampes sous tension en permanence. La fonction « repeat » indiquée ci-dessus permettra d’éteindre une lampe si elle a été rallumée suite à une coupure de courant.

Et enfin, voici d’autres fonctions farfelues que j’implémentai un jour (ou pas !) :

  • Emulateur Hue vers Milight : pour faire fonctionner ma Logitech Harmony Ultimate et ma télé Philips avec mes Milight
  • Receveur DMX512 vers Milight : pour faire la fête avec FreestylerDMX (les amateurs de sono ou spectacles comprendront !)
  • Prise en charge des lampes CWW : Openmilight ne supporte pas encore ce type d’ampoules, et je n’ai trouvé personne s’y intéressant… je m’y collerai plus tard…
  • Prise en charge des lampes RGBWWCW : Elles sont sorties récemment ! Donc Openmilight ne supporte pas encore ce type d’ampoules, et il n’existe pas non plus de Bridge officiel. Des personnes ont commencé à s’y intéresser… Wait & see…

Le matériel nécessaire

Le matériel nécessaire est simple :

  • Un Raspberry Pi (v2 de préférence)
  • Un Module nRF24L01. Je vous déconseille fortement les versions à 2€ ! En effet elles ne sont pas assez puissantes et un coup sur 2, les ampoules ne réagissent pas. Préférez une version dotée d’un filtre antiparasite et d’un ampli. Elles se nomment « nRF24L01 + PA + LNA ». Vous les trouverez assez facilement sur eBay ou chez des revendeurs de matériel pour Arduino aux alentours de 10€.

24l01withpa

Cablage

Le cablage du nRF24L01 est effectué comme suit :

raspi-nrf241(Un condensateur de 10µF est ajouté pour stabiliser l’alimentation)

Installation sous Raspbian

« Driver » OpenMilight

J’ai trouvé une version améliorée du code Milight sur ce dépot Github. Son auteur a rajouté (entres autres) une écoute en UDP. C’est parfait, nous utiliserons ce moyen pour dialoguer entre le code python et le « driver ». Le code est disponible à cette adresse.

Rien de bien sorcier « git clone », « make » (je vous laisse googler un peu, et pensez à installer gcc, make, git et tout et tout, j’ai la flemme de tester sur un pi vierge… 😉 )

Ensuite on va chercher à le démarrer en mode « démon », donc là rien de bien sorcier, rajoutez la ligne suivante dans votre fichier /etc/rc.local

<path_to_openmilight>/openmilight -u &

C’est crade, mais pour une première phase de test, ca suffit à le démarrer en root à chaque démarrage.

Code Python, version 0.1

On en arrive à mon fameux code « Bridge Emulator », vous pouvez le récupérer ici, en version 0.1. Il est livré « tel quel », sans garantie, sans support. Vous en faites ce que vous voulez tant que vous citez mon blog.

Je suis novice en développement python (et je ne suis pas développeur de métier), donc je vous serai gré de faire preuve de tolérance sur la qualité du code, d’autant plus qu’il s’agit d’une version non finalisée.

Le code fonctionne en Python 3 (donc pensez à l’installer 😉 ). Donc récupérez le code v0.1 ici. :

Milight Multi-Bridge Emulator v0.1 (1098 téléchargements)

Dézippez-le à un endroit, et personnalisez le fichier milight-v0.1.py selon vos besoins (RemoteID, port UDP, …)

Enfin, pour l’exécution crado à chaque démarrage, personnalisez votre fichier /etc/rc.local

sudo -u pi python3 /home/pi/python/milight-v0.1.py &

Pour me contacter…

Si vous avez des propositions d’amélioration, si vous avez des talents de développeur pour améliorer ou optimiser mon code, ou si vous avez des questions, vous pouvez me contacter via l’email indiqué dans les commentaires du code source python 😉

Pour la suite, ca se passe ici 🙂

Laisser un commentaire

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