Installer Lirc et les outils complémentaires

A noter qu'en marge de ce tuto, vous pouvez vous documenter sur LIRC et son installation, par exemple sur https://wiki.archlinux.org/title/LIRC ou https://www.sigmdel.ca/michel/ha/opi/ir_02_en.html.

Installation des paquets Debian

  • Installation de lirc et des outils complémentaires
sudo apt install -y lirc setserial ir-keytable
  • Vérification des services lirc installés et de leur état :
root@debian10:~# sudo systemctl status lirc*
● lircd.socket
   Loaded: loaded (/lib/systemd/system/lircd.socket; enabled; vendor preset: enabled)
   Active: active (running) since Thu 2021-04-29 08:27:09 CEST; 3 days ago
   Listen: /run/lirc/lircd (Stream)
   CGroup: /system.slice/lircd.socket

Warning: Journal has been rotated since unit was started. Log output is incomplete or unavailable.

● lircd.service - Flexible IR remote input/output application support
   Loaded: loaded (/lib/systemd/system/lircd.service; enabled; vendor preset: enabled)
   Active: active (running) since Thu 2021-04-29 08:27:11 CEST; 3 days ago
     Docs: man:lircd(8)
           http://lirc.org/html/configure.html
 Main PID: 785 (lircd)
    Tasks: 2 (limit: 2065)
   Memory: 1.9M
   CGroup: /system.slice/lircd.service
           └─785 /usr/sbin/lircd --nodaemon

Les fichiers de configuration de lirc sont dans /etc/lirc.

  • /etc/lirc/lirc_options.conf : configuration générale du driver et du périphérique de capture
  • /etc/lirc/lircd.conf.d/ : répertoire contenant les configurations des différentes télécommandes supportées.

Première configuration de LIRC pour périphérique de capture Agirs

Il va donc nous falloir repérer la liaison série sur laquelle le périphérique Agirs est détecté, vérifier son bon fonctionnement puis l'intégrer dans les fichier de config. Il faut tout d'abord le brancher sur un port USB de disponible, puis :

  • Détection du périphérique sur lequel est vu Agirs
dmesg | egrep --color 'serial|ttyS|ttyA'
  • Le périphérique détecté apparait comme suit :
 [    5.015854] systemd[1]: Created slice system-serial\x2dgetty.slice.
 [338051.139147] cdc_acm 7-1:1.0: __ttyACM0__: USB ACM device
  • Ici il est donc détecté en /dev/ttyACM0
  • Ouvrir le terminal via screen
 screen /dev/ttyACM0
  • Vous devriez être accueilli par la bannière de Girs
 GirsLite 1.0.3
  • Vérifier la liste des modules supportés sur Agirs
modules
  • Agirs renvoie la liste des modules supportés
 Base Transmit Capture Receive Decoder Led Parameters Pronto
  • Lancer une reconnaissance de code IR (et appuyer sur une touche de la télécommande pointée vers le dispositif de capture...)
Receive
  • Agirs répond avec les timings de la touche. Un + correspond à un front montant et un - à un front descendant. Le chiffre correspond au temps en microsecondes.
 +8900 -4500 +550 -1650 +550 -550 +550 -550 +600 -550 +550 -550 +550 -550 +550 -600 +500 -600 +550 -550 +550 -1700 +550 -1650 +550 -1650 +600 -1650 +550 -1700 +550 -1650 +550 -1700 +550 -550 +550 -550 +550 -600 +500 -600 +550 -550 +550 -550 +550 -550 +600 -1650 +550 -1700 +500 -1700 +550 -1700 +550 -1650 +550 -1650 +600 -1650 +550 -1700 +500 -600 +550 -39500 +8900 -2200 +600 -50100
  • Quitter screen: Taper Ctr]+a puis :quit et ENTREE
  • Tester la bonne réception avec le bon driver sur agirs
 mode2 --driver girs --device /dev/ttyACM0
  • Doit renvoyer une liste de pulses au format LIRC:
 ...
 space 39500
 pulse 8900
 space 2250
 pulse 500
 space 50100
 ...
  • Quitter mode 2 avec CTRL + C

A ce stade, nous avons pu vérifier qu'Agirs fonctionne convenablement et est bien vu par le système et LIRC. Il nous reste à l'intégrer dans le fichier de config de LIRC. Pour ce faire, éditer /etc/lirc/lirc_options.conf et remplacer les 2 lignes suivantes (en adaptant avec votre propre port bien sur)

driver          = girs
device          = /dev/ttyACM0

Il ne reste plus qu'à redémarrer LIRC pour prendre en compte la config :

 systemctl stop lircd.service
 systemctl stop lircd.socket
 systemctl start lircd.socket
 systemctl start lircd.service
 systemctl restart lircd-uinput.service

OU première configuration de LIRC pour récepteur IR intégré (Orange PI)

Si vous disposez d'une Orange Pi avec récepteur infrarouge intégré, vous pouvez bien sur ajouter Agirs comme à l'étape précédent OU utiliser ce récepteur intégré. Vous y perdrez la capacité d'émission, mais par contre vous utiliserez un périphérique interne, donc sans ajouter de hardware... A vous de voir en fonction du scénario d'usage que vous envisagez.

OrangePiPcPlus.jpg, mai 2021

Il faut tout d'abord activer le périphérique de capture LIRC dans le noyau. Pour ce faire, lancer la commande

 armbian-config

Puis aller dans "System" / "Hardware" / "CIR" et l'activer. Quitter et rebooter l'Orange PI

L'activation dans la config se fait en éditant le fichier /etc/lirc/lirc_options.conf

 driver          = default
 device          = /dev/lirc0

Il ne reste plus qu'à redémarrer LIRC pour prendre en compte la config :

 systemctl stop lircd.service
 systemctl stop lircd.socket
 systemctl start lircd.socket
 systemctl start lircd.service
 systemctl restart lircd-uinput.service

Configuration de LIRC

Intégration des configurations de vos télécommandes

C'est l'étape un peu critique dans LIRC. Nous avons vu dans l'article précédent comment utiliser Agirs pour reconnaitre les codes de votre télécommande.

A partir d'une télécommande recensée en base de données

LIRC dispose d'une base de données en ligne avec un certain nombre de télécommande. On ne va pas se mentir, la base de données n'est pas fabuleusement bien maintenue. Il n'y a pas toutes les télécommandes, et parfois les fichiers de config sont un peu fantaisistes. Nous avons vu que l'on peut générer des signaux soit en mode intelligent en précisant un protocole et les données, soit en mode 'raw' ou les signaux sont émis comme une suite de 0 et de 1, sans comprendre à quoi ils servent (comme lorsqu'une télécommande programmable fonctionne en mode apprentissage). Si vous avez la chance que votre télécommande soit supportée et que le contributeur ait fait l'effort de décrire le fichier de config de façon à utiliser le protocole, c'est clairement le mieux.

Pour rechercher dans la base de données, c'est assez simple, il suffit de taper irdb-get find suivi d'une chaine à chercher. Ce peut être la marque ou le modèle. Supposons que je cherche le fichier pour une télécommande NAD AVR-2 :

root@debian10:~# irdb-get find nad
morgan's_daytona/Tornado.lircd.conf
nad/451.lircd.conf
nad/AVR2.lircd.conf
nad/AVR2.lircd.conf
nad/CDP-5425.lircd.conf
nad/RC512.lircd.conf
nad/SR6.lircd.conf
nad/SR712.lircd.conf

ou

root@debian10:~# irdb-get find AVR2
harman_kardon/AVR210.irman.lircd.conf
harman_kardon/AVR240.lircd.conf
harman_kardon/AVR25.lircd.conf
nad/AVR2.lircd.conf
nad/AVR2.lircd.conf

J'ai de la chance, le modèle est supporté et est dans nad/AVR2.lircd.conf. Je vais donc pouvoir le récupérer :

 irdb-get download  nad/AVR2.lircd.conf
 Downloaded https://sourceforge.net/p/lirc-remotes/code/ci/master/tree/remotes/nad/AVR2.lircd.conf as AVR2.lircd.conf

Je vous encourage à revoir le fichier de config, avant de le copier dans /etc/lirc/lircd.conf.d/

Il existe d'autres bases de données de codes de télécommande en ligne, mais qui vont nécessiter un peu de travail pour créer le fichier de config LIRC. https://github.com/probonopd/irdb par exemple. Si je reprend mon exemple de télécommande NAD, en parcourant les répertoires par marque je trouve le fichier https://github.com/probonopd/irdb/blob/master/codes/NAD/Surround%20Processor/135%2C124.csv . Il décrit effectivement la plupart des commandes de ma télécommande en protocole NEC. Comme c'est un tableur CSV, il faut utiliser IR Scrutinizer pour créer chacun des codes (onglet generate), les copier dans l'onglet de génération de configuration ("To Param Remote"), puis lorsque la description de la télécommande est complete, l'exporter au format LIRC ("Export Param Remote" format "LIRC".

Remote Central (http://www.remotecentral.com) a pas mal de codes également, mais au format "pronto". IL faut ensuite les convertir dans IR Scrutinizer, puis les décoder avec Scrutinize pour en faire quelque chose...

à Partir de votre propre config

Vous pouvez également fabriquer votre propre fichier de configuration avec IR Scrutinizer (voir le premier article de la série pour les bases de l'usage). Tout d'abord, il peut être de bon ton d'utiliser des noms de fonctions standard dans linux. L'interfaçage avec des fonctions du système en sera simplifié. Si vous ne souhaitze pas déclencher des actions dans linux par votre télécommande, ce n'est pas indispensable, vous pouvez les nommer comme bon vous semble.

Pour obtenir la liste des codes standards dans LIRC, il vous suffit de faire :

irrecord --list-namespace

Une longue liste de noms s'en suivra.. Vous pouvez la copier coller dans un fichier texte pour référence lors de la constitution de votre fichier de configuration de télécommande.

Une fois la configuration de toutes les touches décrite dans l'onglet Scrutinize Remote, soit dans l'onglet "Parametric remote" si le protocole est connu/supporté, soit dans l'onglet "Raw remote" si le protocole est inconnu, vous allez pouvoir aller dans l'onglet d'exportation et choisir le format LIRC Raw (pour une télécommande "Raw", ou une sortie "Raw" sur une télécommande "Parametric"), soit le format LIRC (pour une télécommande "Parametric" uniquement ) puis cliquer sur le bouton correspondant à votre formar ("Export Parametric Remote" ou "Export Raw remote"). Une boite de dialogue va s'ouvrir pour vous demander de documenter votre format :

export-name.png, mai 2021

A l'issue de l'export, la fenêtre de status vous indique ou le fichier a été écrit et comment ils se nomme :

File C:\Users\jpcivade\Documents\IrScrutinizer\lirc_2021-05-06_07-20-01.lircd.conf was successfully written

Si l'on ouvre ce fichier avec un éditeur de texte, on va pouvoir voir plusieurs sections. Le documentation est ici : https://www.lirc.org/html/lircd.conf.html . La première est une section de commentaires, basées sur les informations d’identification saisies précédemment :

# IrScrutinizer parametric export
#
# Creating tool: IrScrutinizer version 2.3.0
# Creating user: jpcivade
# Creating date: Thu May 06 07:20:01 CEST 2021
# Encoding: WINDOWS-1252
#
# Manufacturer: NONAME
# Model: IR-005
# Displayname: LED-IR-005
# Device Class: 
# Remotename: 
#

# Protocol name: NEC1

La seconde est une section de description du protocole. La voici agrémentée de commentaires pour vous aider à comprendre les différentes directives :

# Début de la configuration d'une télécommande
begin remote
# Nom dans LIRC
	name		LED-IR-005-nec1
# Le format fait 32 bits
	bits		32
# L'encodage utilisé repose sur la longeur de l'espace après l'impulsion de bit. 
# La trame est de longeur constante quelle que soient les données. 
	flags		SPACE_ENC|CONST_LENGTH
# tolérance relative d'erreur en  %
	eps		30
# tolérance d'erreur absulue en  uS
	aeps		100
#  Longeur de l'impulsion et de l'espace qui définissent un zéro (en microsecondes)
	zero		564	564
#  Idem pour un 1
	one		564	1692
# Impulsion précédant les données utiles (longueur de l’impulsion puis de l'espace en microsecondes)
	header		9024	4512
# Impulsion de fin, qui suit les données (longueur en us).
	ptrail		564
# Format de l’impulsion qui code une répétition de code (longueur de l’impulsion puis de l'espace en microsecondes)
	repeat		9024	2256
# espacement minimum entre 2 codes
	gap		108000
# Fréquence d'émission.  Il peut pourrait être sage de le corrige et mettre 38000 (38Khz) qui est plus standard.
	frequency	38400
# Ici commencent les codes
	begin codes
# Pour chaque touche, le code à transmettre.
		KEY_POWER		0x00000000807F01FE
		KEY_MODE		0x00000000807F41BE
		KEY_VOLUMEUP		0x00000000807F21DE
		KEY_BRIGHTNESSUP	0x00000000807FA15E
		KEY_DELAY		0x00000000807F619E
		KEY_VOLUMEDOWN		0x00000000807F11EE
		KEY_BRIGHTNESSDOWN	0x00000000807F916E
		KEY_CLEARDELAY		0x00000000807F51AE
		KEY_REDPLUS		0x00000000807F31CE
		KEY_GREENPLUS		0x00000000807FB14E
		KEY_BLUEPLUS		0x00000000807F718E
		KEY_REDMINUS		0x00000000807F09F6
		KEY_GREENMINUS		0x00000000807F8976
		KEY_BLUEMINUS		0x00000000807F49B6
		KEY_CLEAR		0x00000000807F29D6
		KEY_COLOR		0x00000000807FA956
		KEY_SAVE		0x00000000807F6996
	end codes
end remote

J'ai plusieurs remarques à faire sur le format. Ici, il s'agit d'une petite télécommande format carte de crédit qui était livrée avec des bandeaux de Led. C'est au format NEC1 (2 octets). Chaque touche, est exprimée en 4 octets (les 2 octets et leur complément à 1, voir article précédent de la série pour un décodage NEC expliqué). Or, le code d'équipement est constant sur toutes les touches (807F). Il aurait probablement été plus simple de le matérialiser avec un entête constant de 16 bits (code équipement) pour ne garder que 16 bits sur les codes de touche.

Voici la configuration (sans les commentaires) remaniée pour tenir compte de ces remarques. A noter le passage en 16 bits au lieu de 32, et l'ajout d'un "pre_data" de 16 bits avec le code de l'équipement. Les codes quand à eux sont exprimés sur 16 bits également au lieu des 64 bits vus précédemment. C'est quand même plus lisible non? :

begin remote
	name		LED-IR-005
	bits		16
	flags		SPACE_ENC|CONST_LENGTH
	eps		30
	aeps		100
	zero		564	564
	one		564	1692
	header		9024	4512
	ptrail		564
	repeat		9024	2256
	gap		108000
#	Equipement code 0x80 0d128
	pre_data_bits   16
	pre_data       	0x807F

	frequency	38000
	begin codes
		KEY_POWER		0x01FE
		KEY_MODE		0x41BE
		KEY_VOLUMEUP		0x21DE
		KEY_BRIGHTNESSUP	0xA15E
		KEY_DELAY		0x619E
		KEY_VOLUMEDOWN		0x11EE
		KEY_BRIGHTNESSDOWN	0x916E
		KEY_CLEARDELAY		0x51AE
		KEY_REDPLUS		0x31CE
		KEY_GREENPLUS		0xB14E
		KEY_BLUEPLUS		0x718E
		KEY_REDMINUS		0x09F6
		KEY_GREENMINUS		0x8976
		KEY_BLUEMINUS		0x49B6
		KEY_CLEAR		0x29D6
		KEY_COLOR		0xA956
		KEY_SAVE		0x6996
	end codes
end remote

Cela n'apporte rien d'un point de vue fonctionnel, à part la correction sur la fréquence de transmission que l'on a remise à 38Khz. Par contre, c'est plus facile à lire et maintenir.

Cette télécommande étant sérigraphiée "LED-IR-005", nous allons nommer ce fichier led-ir005.lircd.conf et le copier dans /etc/lirc/lircd.conf.d/ pour l'intégrer à LIRC.

Vérification des codes supportés

A l'étape précédente, nous avons copié au moins un fichier dans le répertoire /etc/lirc/lircd.conf.d/ qui contient les configurations des télécommandes. Il ne reste plus qu'à redémarrer LIRC pour prendre en compte la config :

 systemctl stop lircd.service
 systemctl stop lircd.socket
 systemctl start lircd.socket
 systemctl start lircd.service
 systemctl restart lircd-uinput.service

Tests

Tout d'abord, nous allons interroger la configuration mise en place pour savoir quels sont les télécommandes dont la configuration a été intégrée/comprise dans lirc aux étapes précédentes. Ici nous avons 4 télécommandes, dont 2 comprises dans un même fichier (NAD) car c'est une télécommande multifonction avec un petit interrupteur pour passer du mode DVD au mode AMPLI.

root@debian10:/etc/lirc/lircd.conf.d# irsend LIST "" ""

DENON_RC920-denon
LED-IR-005
NAD_AVR2-RCVR
NAD_AVR2-DVD

On peut descendre plus bas, en listant les codes supportés par une télécommande en particulier. Ici nous allons demander les codes de la petite télécommande format carte de crédit qui était utilisée sur le pilotage d'un bandeau de led :

root@debian10:/etc/lirc/lircd.conf.d# irsend LIST "LED-IR-005" ""

00000000807f01fe KEY_POWER
00000000807f41be KEY_MODE
00000000807f21de KEY_VOLUMEUP
00000000807fa15e KEY_BRIGHTNESSUP
00000000807f619e KEY_DELAY
00000000807f11ee KEY_VOLUMEDOWN
00000000807f916e KEY_BRIGHTNESSDOWN
00000000807f51ae KEY_CLEARDELAY
00000000807f31ce KEY_REDPLUS
00000000807fb14e KEY_GREENPLUS
00000000807f718e KEY_BLUEPLUS
00000000807f09f6 KEY_REDMINUS
00000000807f8976 KEY_GREENMINUS
00000000807f49b6 KEY_BLUEMINUS
00000000807f29d6 KEY_CLEAR
00000000807fa956 KEY_COLOR
00000000807f6996 KEY_SAVE

Si vous avez mis en périphérique réalisé dans le premier article du tuto (Agirs) et que celui-ci est bien configuré, vous pourez envoyer des codes infrarouge par la commande suivante. Cela ne sera bien sur pas supporté avec le récepteur intégré à l'orange pi, car il n'y a pas la fonction émission :

irsend SEND_ONCE NAD_AVR2-RCVR RCVR_POWER

Ici, nous allons envoyer une fois (SEND_ONCE ) un code d'allumage/extinction de l'appareil "RCVR_POWER" à l'ampli NAD "NAD_AVR2". Toutes les constantes de nom de code ou de télécommande auront bien sur été relevées par les commandes précédentes.

Il est également possible de tester la réception de codes infrarouge. Une commande spécifique permet de lire le socket et d'afficher les codes reçus. Il suffit de lancer "irw" et de pointer l'une des télécommandes configurées sur le récepteur. Le code est affiché à chaque réception ;

root@debian10:~# irw
00000000e13e01fe 00 RCVR_POWER NAD_AVR2-RCVR
00000000e13e01fe 01 RCVR_POWER NAD_AVR2-RCVR
00000000e13e01fe 02 RCVR_POWER NAD_AVR2-RCVR

Le premier nombre, nous donne le code recu sur la télécommande. Ici (protocole NEC2), le code Apareil est E1, le code fonction est 3E, et le code touche 01FE,. L'octet seul ensuite, nous donne le nombre de répétition. COMme je me suis un peu endori sur la touche, il voit l'appui (00) initial et 2 répétitions (01 et 02). Enfin, viennent en clair le nom la touche (RCVR_POWER ) et de l'appareil (NAD_AVR2-RCVR).

Notre LIRC recoit désormais les codes infrarouges émis par nos télécommandes!

Utilisation avancée

Déclencher des actions dans l'OS par des codes infrarouges

Il est possible de déclencher des actions dans le système d'exploitation via la télécommande infrarouge. Pour ce faire, il faut créer un fichier de configuration /etc/lirc/irexec.lircrc qui va contenir autant de bloc comme celui ci que de commandes souhaitées.

begin
    prog = irexec
    remote = LED-IR-005
    button = KEY_MODE
    config = /usr/sbin/shutdown -h now
    repeat = 1
end

begin
    prog = irexec
    remote = LED-IR-005
    button = KEY_POWER
    config = /usr/sbin/shutdown -r now
    repeat = 1
end

Ici, j'ai assigné le bouton Power à l'arrêt du système, et le bouton mode à un reboot. En adaptant 'button' et 'config' vous pouvez pratiquement faire n'importe quoi. Peut être pour éviter de rebooter une commande "echo KEY_POWER" pourrait être une bonne idée...

Pour que cela fonctione, il faut lancer irexec en mode daemon avec

 irexec -d

Si tout fonctionne il ne vous reste plus qu'à rendre permanent le démarrage du service avec

systemctl inlircd-uinput.service

Maintenant, votre télécommande contrôle certaines fonctions du système et notamment permet d'arrêter ou de redémarrer une raspberry sans se logger. Pratique !

Cet tout pour ce 2e volet, mais vous pourrez encore creuser le sujet qui offre de nombreuses possibilités en consultant la documentation de LIRC.

Sommaire des articles de la série: