Ce billet est consacré à l'utilisation des télécommandes à infrarouge sur
un Orange Pi Zero à l'aide d'une bibliothèque Python,
python-evdev
, crée par Georgi Valkov. Si l'exemple qu'on
retrouve en fin de ce papier roule actuellement sur un Orange Pi Zero
exécutant Armbian Stretch, presque tout ce qu'on
retrouve ici est valable pour le Raspberry Pi avec Raspbian
Stretch. D'ailleurs la révision de ce qui suit a été faite avec un
Raspberry Pi 3 auquel était branché un récepteur IR connecté par USB, car le
Orange Pi Zero est déjà en service.
Avant d'utiliser python-evdev
, il faut s'assurer
que télécommandes IR qu'on veut utiliser sont prises en charge par le noyau
Linux. Il serait aussi préférable d'avoir une table
de traduction de codes de balayage en codes de clavier pour chaque télécommande,
mais ce n'est pas absolument nécessaire. Consultez le billet précédent
Configuration de télécommandes à infrarouge sur l'Orange Pi Zero
pour les détails.
Table des matières
- Prérequis Python
- Gestion des événements IR
- Première utilisation de
python-evdev
- Exemple pratique avec Domoticz
- Conclusion
Prérequis Python
Python 3.5 est installé par défaut dans Armbian
Stretch. Ce n'est cependant pas le cas pour pip3
le
programme d'installation de paquets Python et ses outils associés qui seront
utilisés pour installer la bibliothèque nécessaire.
Maintenant pip3
(pip
pour Python 3) peut être
utilisé pour obtenir la bibliothèque evdev
.
C'est la seule bibliothèque qui sera utilisée.
Gestion des événements IR
La documentation de la bibliothèque evdev
est disponible sur
Read the Docs. Je vais commencer par une session interactive
Python pour tout tester avec la télécommande KEYES. Je commence en effaçant
tous les enregistrements de conversion de codes de balayages en codes de
clavier et en utilisant le bon protocole pour la télécommande.
Appuyez sur la combinaison de touches CtrlC pour interrompre la boucle. Le premier champ affiché par
evdev
lorsqu'un événement est lu du périphérique d'entrée
input0
est un code temporel,
puis viennent les champs code
, type
et
value
. Tout cela a déjà été vu avec evtest
(voir Obtenir les codes de
balayage de la télécommande) et avec ir-keytable -t
(voir L'utilitaire
ir-keytable). Les marques de synchronisation (EV_SYN
) ne
sont pas très utiles et elles peuvent être escamotées avec le reste de
l'information pour n'afficher que les codes de balayage des boutons
activés.
Ce qui précède ne contient que des variantes de quelques-uns des sujets abordés dans le tutoriel rédigé par Georgi Valkov.
Première utilisation de python-evdev
Ce simple script lira tous les événements du périphérique d’entrée et affichera le nom des boutons enfoncés sur la télécommande KEYES en fonction de leurs codes de balayage uniquement.
Version pouvant être téléchargée: test_ir.py.
Si j'avais écrit cela en Pascal, j'aurais créé un tableau d'enregistrements, avec le code de balayage comme premier champ et le nom du bouton comme deuxième champ. Le tableau serait trié selon le code de balayage et une recherche binaire serait utilisée pour trouver le nom du bouton en fonction du code lue. Il me reste à trouver le moyen idiomatique de faire cela en Python.
Voici la production du script. On note que la table de conversion est vidée et que le bon protocole IR pour la télécommande est fixé avant d'exécuter le programme.
Le script peut se comporter comme s'il s'agissait d'un programme. Sous
Windows, l’extension .py
devrait
suffire, car elle devrait être associée à l’interpréteur Python dans le
registre. L'extension ne joue aucun rôle dans Linux, mais il faut que le fichier soit marqué comme
exécutable et le « shebang » qui commence avec #!
qui
identifie le programme qui exécutera le script doit être la première ligne du
fichier.
Il existe une version
asynchrone du script. En exécutant htop
dans une deuxième
session pour surveiller chaque script, j'ai été surpris de constater que la
version asynchrone semblait un peu plus lente quand un bouton était activé.
Cependant, aucune des deux versions ne prenait beaucoup de temps processeur
quand la télécommande n'était pas utilisée et que le traitement d'une
séquence d'événements liés à l'activation d'un bouton prenait à peine 1% du
temps processeur dans la version asynchrone plus lente.
Exemple pratique avec Domoticz
On pourrait facilement modifier l'exemple précédent pour envoyer des requêtes HTML au serveur de domotique Domoticz pour qu'il bascule l'état de dispositifs IdO. Ce ne serait pas très pratique. Qu'arriverait-il s'il y avait plus de dispositifs que de boutons sur la télécommande? Et qu'arriverait-il si l'on remplaçait la télécommande.
Vu le billet précédent, la solution au deuxième problème est évidente.
Il est préférable d'utiliser les codes clavier plutôt que les codes de
balayage. Alors si l'on change de télécommande, il suffit d'utiliser
sa table de conversion de codes avec ir-keytable
, quitte à
la modifier si nécessaire.
Pour ce qui est du premier problème, on peut entrer un nombre d'un ou de plusieurs chiffres et affecter un bouton (OK est tout désigné sur la télécommande KEYES) à l'envoi de la requête. Ou l'on pourrait faire comme les télécommandes de plusieurs téléviseurs et décodeurs; si aucun bouton n'est activé pendant un certain temps, la chaîne dont le nombre est déjà entré est affichée. Je n'aime pas tellement cette dernière façon de faire, ayant souvent entré un 896 plutôt que 563 dans le noir. Le décodeur prend un temps fou à m'informer que je ne suis pas abonné à la chaîne 896. J'ai donc opté pour l'autre approche dans le script Python 3 que j'utilise actuellement. Avant d'examiner le code, voici ce qu'il affiche à la console en mode verbeux, alors que je veux basculer les dispositifs 5 puis 10. L'indice du dispositif est affiché à chaque activation d'un bouton sur la télécommande.
Voici le code source qu'on peut aussi télécharger: ir_rem.py.
Le code n'est pas complexe. Il ne contient qu'une boucle qui normalement
s'exécute sans fin. Au début de la boucle, tout événement disponible du
périphérique d'entrée est lu. S'il est de type EV_KEY
,
c'est-à-dire si c'est un code de clavier produit par le noyau en réponse à un
code de balayage provenant du relâchement d'un bouton de la télécommande
alors on en tient compte. Si le bouton était KEY_OK
et si le
nombre saisi à partir de la télécommande est un indice valide alors une
requête HTTP est envoyée à Domoticz. Si le bouton
était un chiffre alors le nombre déjà saisi est multiplié par 10 et le
chiffre est ajouté au nombre. Si un bouton autre qu'un chiffre est saisi,
l'indice est remis à zéro.
Ce script n'est qu'un exemple. Il ne devrait pas contenir les indices des dispositifs Domoticz à contrôler. Ces indices devraient est consignés dans un fichier de configuration pour qu'il soit possible de modifier la liste de dispositifs sans changer le script.
Je pense qu'avec l'Orange Pi Zero et aussi le Raspberry Pi Zero, il est
possible de supposer que le périphérique d'événement associé au pilote IR est
/dev/input/event0
si aucun autre périphérique n'est connecté. Ce
n'est pas le cas sur mon ordinateur de bureau où le lecteur IR est connecté
par un interface USB ainsi que le clavier, la souris et d'autres appareils.
J'ai vu qu'il fallait vérifier, car selon les circonstances, le périphérique
d'entrée pouvait être input1
ou input2
. Voici
comment je règle ce problème en utilisant l'identificateur USB de récepteur
IR.
L'identificateur USB du lecteur IR devrait aussi être un élément du fichier de configuration. Dans l'Orange Pi Zero, on peut utiliser le nom du module.
On peut voir que le programme contient trois fonctions qui ne font rien:
showDeviceIndex
, showStartRequest
et
showEndRequest
. J'aimerais rajouter un écran pour afficher le
nombre saisi ainsi qu'une indication qu'une requête HTML a été acheminée.
Cependant, le script fonctionne très bien avec la télécommande Hauppauge et
ce ne sera pas nécessaire de confirmer la réception des signaux IR. Si je
devais utiliser la télécommande KEYES, le besoin d'une rétroaction serait
beaucoup plus grand.
Conclusion
J'envisageais de continuer avec l'utilisation de LIRC
. Grâce au
programme irexec
, utilisé en conjonction avec le service
lircd
, il est possible de prendre en charge une télécommande IR
sans créer un programme Python pour autant que ce que l'on désire faire n'est
pas trop complexe. Cette discussion est reportée à plus tard, j'ai rencontré
un problème très vexant. La belle solution que j'avais trouvée n'a pas
survécu à un redémarrage (ceci étant dit, IR Remote for Domoticz using irexec est toujours
valable. Entre temps j'ai plusieurs projets en chantier bien
plus amusants : le VPN WireGuard sur le Raspberry Pi (ça semble bien
fonctionner), la reprogrammation de de
prise connectées WiFi de type Tuya (une réussite pour 3 des 4 achetées),
remplacement d'une télécommande IR en piteux état et introuvable
(ça fonctionne avec ir-ctl
de v4l-utils
...