tag:linuxfr.org,2005:/users/toasterLinuxFr.org : les contenus de ToasteR2020-05-26T16:30:36+02:00/favicon.pngtag:linuxfr.org,2005:News/398152020-05-20T13:55:16+02:002020-05-20T13:56:02+02:00Utiliser une des LED d’un Raspberry Pi comme témoin d’enregistrement TVLicence CC By‑SA http://creativecommons.org/licenses/by-sa/4.0/deed.fr<div><p>Utilisant un Raspberry Pi comme enregistreur TV-TNT via un adaptateur DVB‑T et Tvheadend, il m’est déjà arrivé de flinguer un enregistrement (en fait introduire un saut temporel dans l’enregistrement) :</p>
<ul>
<li>parce que lors d’une manipulation ou d’un test, j’avais besoin de redémarrer le Pi et que j’ai quelque peu oublié l’enregistrement en cours ;</li>
<li>parce qu’en trifouillant des branchements derrière la TV, j’ai eu besoin d’éteindre le Pi et que je l’ai débranché de nouveau en oubliant l’enregistrement en cours.</li>
</ul>
<p>Même si cela n’arrive pas si souvent, j’ai songé à une solution de reconversion des DEL/LED afin d’éviter cela. Je vous explique dans cette dépêche comment je m’y suis pris.</p>
</div><ul><li>lien nᵒ 1 : <a title="https://linuxfr.org/users/toaster/journaux/utiliser-une-des-led-d-un-raspberry-pi-comme-temoin-d-enregistrement-tv" hreflang="fr" href="https://linuxfr.org/redirect/106162">Journal à l’origine de la dépêche</a></li></ul><div><h2 class="sommaire">Sommaire</h2>
<ul class="toc">
<li><a href="#toc-la-solution-envisag%C3%A9e">La solution envisagée</a></li>
<li><a href="#toc-voir-l%C3%A9tat-des-led">Voir l’état des LED</a></li>
<li>
<a href="#toc-%C3%89teindre-et-allumer-les-led">Éteindre et allumer les LED</a><ul>
<li><a href="#toc-extinction-via-trigger-none">Extinction via trigger <code>none</code></a></li>
<li><a href="#toc-allumage-permanent-via-trigger-default-on">Allumage permanent via trigger <code>default-on</code></a></li>
<li><a href="#toc-faire-clignoter-une-led">Faire clignoter une LED</a></li>
</ul>
</li>
<li><a href="#toc-sauvegarder-l%C3%A9tat-des-led">Sauvegarder l’état des LED</a></li>
<li><a href="#toc-restaurer-l%C3%A9tat-des-led">Restaurer l’état des LED</a></li>
<li><a href="#toc-autoriser-un-utilisateur-standard-%C3%A0-modifier-l%C3%A9tat-desled">Autoriser un utilisateur standard à modifier l’état des LED</a></li>
<li><a href="#toc-cr%C3%A9er-un-script-recording">Créer un script « recording »</a></li>
<li><a href="#toc-tester">Tester</a></li>
<li><a href="#toc-appeler-le-script-en-d%C3%A9but-et-fin-denregistrement">Appeler le script en début et fin d’enregistrement</a></li>
<li><a href="#toc-tests">Tests</a></li>
<li><a href="#toc-d%C3%A9pannage">Dépannage</a></li>
<li><a href="#toc-r%C3%A9f%C3%A9rences">Références</a></li>
</ul>
<h2 id="toc-la-solution-envisagée">La solution envisagée</h2>
<p>Pour prévenir les redémarrages à distance, on peut imaginer une modification de <code>/etc/motd*</code> ou <code>/etc/issue</code> qui prévienne : « ATTENTION, enregistrement en cours ! » Mais pour les débranchements de câbles, on va utiliser les LED afin de prévenir les personnes aux alentours qu’un enregistrement est en cours.</p>
<p>Par défaut, la LED rouge est allumée (témoin <em>power/PWR</em>), la LED verte, elle, s’allume lorsquNil y a de l’activité sur la carte SD (lecture ou écriture). Il est possible de les éteindre ou de les utiliser pour tout autre chose. C’est ce qu’on va faire ici avec les moyens du bord : utiliser une des LED comme témoin d’enregistrement en cours. Pour ma part, en temps normal, je les désactive au démarrage.</p>
<h2 id="toc-voir-létat-des-led">Voir l’état des LED</h2>
<p>L’état des LED est dans ces répertoires virtuels (<em>kernel filesystem</em>) :</p>
<ul>
<li>
<code>/sys/class/leds/led0/</code> : verte ;</li>
<li>
<code>/sys/class/leds/led1/</code> : rouge.</li>
</ul>
<p>Ces répertoires contiennent, entre autres, ces deux fichiers :</p>
<ul>
<li>
<em>brightness</em> : intensité de la LED (0 pour éteinte, toute autre valeur jusque 255 pour allumée) ;</li>
<li>
<em>trigger</em> : déclencheur, quand et pourquoi la LED s’allume.</li>
</ul>
<pre><code># cat /sys/class/leds/led0/brightness
0
# cat /sys/class/leds/led0/trigger
none rc-feedback kbd-scrolllock kbd-numlock kbd-capslock kbd-kanalock kbd-shiftlock kbd-altgrlock kbd-ctrllock kbd-altlock kbd-shiftllock kbd-shiftrlock kbd-ctrlllock kbd-ctrlrlock timer oneshot heartbeat backlight gpio cpu cpu0 cpu1 cpu2 cpu3 default-on input panic mmc1 [mmc0] rfkill-any rfkill-none rfkill0
# cat /sys/class/leds/led1/brightness
255
# cat /sys/class/leds/led1/trigger
none rc-feedback kbd-scrolllock kbd-numlock kbd-capslock kbd-kanalock kbd-shiftlock kbd-altgrlock kbd-ctrllock kbd-altlock kbd-shiftllock kbd-shiftrlock kbd-ctrlllock kbd-ctrlrlock timer oneshot heartbeat backlight gpio cpu cpu0 cpu1 cpu2 cpu3 default-on [input] panic mmc1 mmc0 rfkill-any rfkill-none rfkill0
</code></pre>
<p>Les <em>triggers</em> sont entre crochets <code>[mmc0]</code> pour <code>led0</code> (verte) et <code>[input]</code> pour <code>led1</code> (rouge). On a donc, la LED verte (led0) qui s’allume en cas d’activité sur la carte SD (mmc0) et la LED rouge allumée lorsqu’il y a de l’alimentation électrique (input).</p>
<h2 id="toc-Éteindre-et-allumer-les-led">Éteindre et allumer les LED</h2>
<p>Ces fichiers virtuels sont lisibles par tous et modifiables par <em>root</em> uniquement :</p>
<pre><code>-rw-r--r-- 1 root root 4096 avril 24 10:54 /sys/class/leds/led0/brightness
-rw-r--r-- 1 root root 4096 avril 24 15:55 /sys/class/leds/led0/trigger
-rw-r--r-- 1 root root 4096 avril 24 10:54 /sys/class/leds/led1/brightness
-rw-r--r-- 1 root root 4096 avril 24 16:03 /sys/class/leds/led1/trigger
</code></pre>
<p>Les commandes suivantes devront donc être exécutées en tant que <em>root</em>.</p>
<h3 id="toc-extinction-via-trigger-none">Extinction via trigger <code>none</code>
</h3>
<p>Éteindre la LED verte (led0) :<br>
<code>echo none > /sys/class/leds/led0/trigger</code></p>
<p>Éteindre la LED rouge (led1) :<br>
<code>echo none > /sys/class/leds/led1/trigger</code></p>
<p>Pourquoi je touche aux fichiers <code>trigger</code> et pas aux fichiers <code>brightness</code> ? Car si le <em>trigger</em> reste mmc0 pour la LED verte, placer un 0 dans <code>/sys/class/leds/led0/brightness</code> va juste éteindre la LED si elle était allumée à cet instant précis, puis la prochaine activité sur <code>mmc0</code> va la faire clignoter encore.</p>
<h3 id="toc-allumage-permanent-via-trigger-default-on">Allumage permanent via trigger <code>default-on</code>
</h3>
<p>Allumer la LED verte (led0) :<br>
<code>echo default-on > /sys/class/leds/led0/trigger</code></p>
<p>Le contenu du fichier <code>brightness</code> correspondant passe à 255 :</p>
<pre><code># cat /sys/class/leds/led0/brightness
255
</code></pre>
<p>Note : placer toute autre valeur que 0 dans <code>brightness</code> allume la LED, mais il n’est pas possible de modifier son intensité.</p>
<h3 id="toc-faire-clignoter-une-led">Faire clignoter une LED</h3>
<p>Maintenant qu’on maîtrise l’allumage et l’extinction, faisons clignoter la LED verte.<br>
Un clignotement, c’est :</p>
<ol>
<li>j’allume la LED verte (j’écris <code>default-on</code> dans le <em>trigger</em>) ;</li>
<li>j’attends une seconde ;</li>
<li>j’éteins la LED verte (j’écris none dans le <em>trigger</em>) ;</li>
<li>j’attends une seconde.</li>
</ol>
<p>Et je recommence tout ça à l’infini.</p>
<p>On peut le faire via le shell, toujours en tant que <em>root</em> :</p>
<pre><code class="bash"><span class="k">while</span> <span class="nb">true</span>
<span class="k">do</span>
<span class="nb">echo</span> default-on > /sys/class/leds/led0/trigger
sleep <span class="m">1</span>
<span class="nb">echo</span> none > /sys/class/leds/led0/trigger
sleep <span class="m">1</span>
<span class="k">done</span></code></pre>
<p><code>Ctrl</code> + <code>C</code> pour arrêter le script.</p>
<p>On peut même imaginer d’autres séquences invoquant les deux LED pour faire un chenillard rapide :</p>
<pre><code class="bash"><span class="k">while</span> <span class="nb">true</span>
<span class="k">do</span>
<span class="nb">echo</span> default-on > /sys/class/leds/led0/trigger
sleep <span class="m">0</span>.1
<span class="nb">echo</span> default-on > /sys/class/leds/led1/trigger
sleep <span class="m">0</span>.1
<span class="nb">echo</span> none > /sys/class/leds/led0/trigger
sleep <span class="m">0</span>.1
<span class="nb">echo</span> none > /sys/class/leds/led1/trigger
sleep <span class="m">0</span>.1
<span class="k">done</span></code></pre>
<p>Ou allumer les LED alternativement à cinq secondes d’intervalle :</p>
<pre><code class="bash"><span class="k">while</span> <span class="nb">true</span>
<span class="k">do</span>
<span class="nb">echo</span> default-on > /sys/class/leds/led0/trigger
sleep <span class="m">5</span>
<span class="nb">echo</span> default-on > /sys/class/leds/led1/trigger
<span class="nb">echo</span> none > /sys/class/leds/led0/trigger
sleep <span class="m">5</span>
<span class="nb">echo</span> none > /sys/class/leds/led1/trigger
<span class="k">done</span></code></pre>
<p>Note — La ou les LED restent dans l’état où elles sont lorsque l’on interrompt le script. Il va nous falloir sauvegarder leur état initial au début du script pour pouvoir restaurer cet état à la fin du script.</p>
<h2 id="toc-sauvegarder-létat-des-led">Sauvegarder l’état des LED</h2>
<p>Afin de nettoyer après notre passage, il sera nécessaire de sauvegarder l’état des LED avant d’y toucher pour les restaurer à la sortie de notre script final.</p>
<p>On peut le faire comme ça : pour chaque LED (0 et 1), lire l’état actuel des fichiers virtuels <strong>trigger</strong> et <strong>brightness</strong>, stocker ces états dans un emplacement temporaire.</p>
<h2 id="toc-restaurer-létat-des-led">Restaurer l’état des LED</h2>
<p>Pour chaque LED (0 et 1), écrire les <em>triggers</em> avec les infos temporaires précédemment enregistrées.</p>
<h2 id="toc-autoriser-un-utilisateur-standard-à-modifier-létat-desled">Autoriser un utilisateur standard à modifier l’état des LED</h2>
<p>Jusqu’ici, nos expérimentations étaient exécutées en tant que <em>root</em> pour pouvoir modifier les fichiers <code>/sys</code> directement. Par la suite, nous allons vouloir lancer ce script en tant que l’utilisateur qui effectue les enregistrements ; avec Tvheadend, c’est l’utilisateur <code>hts:hts</code>. Quelles sont les possibilités pour arriver à faire ça en tant qu’utilisateur, leurs inconvénients s’il y en a :</p>
<ul>
<li>lancer le script avec <code>sudo</code> ;</li>
<li>changer les permissions des fichiers <code>brightness</code> et <code>trigger</code> au démarrage avec un script appelé via <em>systemd</em>.</li>
</ul>
<p>J’avais commencé avec la méthode <em>sudo</em>, même si notre script est au final inoffensif, psychologiquement, la méthode ne m’emballait pas. J’ai préféré par la suite modifier les permissions des fichiers virtuels afin que les membres du groupe <code>hts</code> (donc l’utilisateur <code>hts</code> de Tvheadend) puissent les modifier.</p>
<p>Pour chaque fichier (<code>brightness</code> et <code>trigger</code>), changer le propriétaire vers le groupe <code>hts</code> et autoriser le groupe à modifier les fichiers. En shell, ça donne un script <code>ledpermissions</code> à placer dans <code>/usr/local/sbin</code> (car il sera exécuté par <em>root</em>) :</p>
<pre><code class="bash"><span class="ch">#!/bin/bash</span>
chown :hts /sys/class/leds/led*/<span class="o">{</span>brightness,trigger<span class="o">}</span>
chmod g+w /sys/class/leds/led*/<span class="o">{</span>brightness,trigger<span class="o">}</span></code></pre>
<p>On le rend exécutable :<br>
<code>chmod +x /usr/local/sbin/ledpermissions</code></p>
<p>Accompagné par une fichier Unit <code>ledpermissions.service</code> pour systemd qui appellera ce script au démarrage du système :</p>
<pre><code class="ini"><span class="k">[Unit]</span>
<span class="na">Description</span><span class="o">=</span><span class="s">Set leds permissions</span>
<span class="k">[Service]</span>
<span class="na">Type</span><span class="o">=</span><span class="s">oneshot</span>
<span class="na">User</span><span class="o">=</span><span class="s">root</span>
<span class="na">ExecStart</span><span class="o">=</span><span class="s">/usr/local/sbin/ledpermissions</span>
<span class="k">[Install]</span>
<span class="na">WantedBy</span><span class="o">=</span><span class="s">multi-user.target</span></code></pre>
<p>On vérifie son fonctionnement en affichant les permissions des fichiers avant et après lancement :</p>
<pre><code>$ ls -l /sys/class/leds/led*/{brightness,trigger}`
-rw-r--r-- 1 root root 4096 avril 23 17:40 /sys/class/leds/led0/brightness
-rw-r--r-- 1 root root 4096 avril 23 17:40 /sys/class/leds/led0/trigger
-rw-r--r-- 1 root root 4096 avril 23 17:40 /sys/class/leds/led1/brightness
-rw-r--r-- 1 root root 4096 avril 23 17:40 /sys/class/leds/led1/trigger
</code></pre>
<p>Groupe : <code>root</code>, permissions du groupe : <code>r--</code>.</p>
<pre><code># systemctl start ledpermissions.service
# ls -l /sys/class/leds/led*/{brightness,trigger}
-rw-rw-r-- 1 root hts 4096 avril 23 17:40 /sys/class/leds/led0/brightness
-rw-rw-r-- 1 root hts 4096 avril 23 17:40 /sys/class/leds/led0/trigger
-rw-rw-r-- 1 root hts 4096 avril 23 17:40 /sys/class/leds/led1/brightness
-rw-rw-r-- 1 root hts 4096 avril 23 17:40 /sys/class/leds/led1/trigger
</code></pre>
<p>Groupe : <code>hts</code>, permissions du groupe : <code>rw-</code>.</p>
<p>Et l’on active le service pour le prochain démarrage du système :<br>
<code>systemctl enable ledpermissions.service</code></p>
<h2 id="toc-créer-un-script-recording">Créer un script « recording »</h2>
<p>Ce que je veux pour ce script :</p>
<ul>
<li>qu’il puisse être lancé par l’utilisateur <em>hts</em> (OK si les permissions des LED sont modifiées) ;</li>
<li>qu’il ne se plante pas si on le lance plusieurs fois de suite tout en ne laissant qu’une seule instance s’exécuter ;</li>
<li>qu’il puisse être appelé avec <code>start</code> ou <code>stop</code> pour démarrer ou arrêter le clignotement et restaurer l’état initial de la LED ;</li>
<li>qu’il fasse clignoter la LED verte comme ça : deux secondes allumée, une seconde éteinte, etc.</li>
</ul>
<p>Son déroulement :</p>
<ul>
<li>vérifier la syntaxe, <code>recording start</code> ou <code>recording stop</code>, ignorer les paramètres supplémentaires, et en cas d’erreur de syntaxe, afficher la syntaxe correcte et sortir en erreur ;</li>
<li>si l’argument est « <code>start</code> », vérifier que le script n’est pas déjà en cours d’exécution via un fichier PID, si ce n’est pas le cas, écrire notre PID dans ce fichier, écrire dans un fichier journal la date de début d’enregistrement et appeler la boucle de clignotement ;</li>
<li>boucle de clignotement :
<ul>
<li>sauvegarde dans deux variables des valeurs initiales de <code>brightness</code> et <code>trigger</code> de la LED verte (0),</li>
<li>se préparer à mourir « proprement » si l’on reçoit <code>Ctrl</code> + <code>C</code> ou un autre signal, en appelant si ça arrive une fonction <code>cleanup</code> qui restaurera les valeurs initiales de <code>brightness</code> et <code>trigger</code> de la LED verte (0),</li>
<li>clignoter selon notre volonté.</li>
</ul>
</li>
</ul>
<p><a href="https://git.sekoya.org/mb/recording/-/blob/master/recording"><code>/usr/local/bin/recording</code></a> :</p>
<pre><code class="bash"><span class="ch">#!/bin/bash</span>
<span class="c1"># define PID file</span>
<span class="nv">PID_FILE</span><span class="o">=</span><span class="s2">"/run/shm/</span><span class="k">$(</span>basename <span class="nv">$0</span><span class="k">)</span><span class="s2">"</span>
<span class="c1"># define which LED we will use</span>
<span class="nv">LED_PATH</span><span class="o">=</span><span class="s2">"/sys/class/leds/led0"</span>
<span class="c1"># Define blinking delays in seconds</span>
<span class="nv">ON_DELAY</span><span class="o">=</span><span class="m">2</span>.0
<span class="nv">OFF_DELAY</span><span class="o">=</span><span class="m">1</span>.0
do_start<span class="o">()</span> <span class="o">{</span>
<span class="c1"># are we already running ?</span>
<span class="k">if</span> <span class="o">[</span> -f <span class="nv">$PID_FILE</span> <span class="o">]</span>
<span class="k">then</span>
<span class="nb">printf</span> <span class="s2">"Already running or badly terminated !\n"</span>
<span class="nb">exit</span> <span class="m">1</span>
<span class="k">else</span>
<span class="nb">echo</span> <span class="nv">$$</span> > <span class="nv">$PID_FILE</span>
<span class="nb">echo</span> <span class="o">[</span><span class="k">$(</span>date <span class="s1">'+%F %H:%M:%S'</span><span class="k">)</span><span class="o">]</span> start >> ~/recording.log
blink_loop
<span class="k">fi</span>
<span class="o">}</span>
cleanup<span class="o">()</span> <span class="o">{</span>
<span class="c1"># Restore initial values (BRIGHTNESS and TRIGGER) of the led</span>
<span class="nb">echo</span> <span class="nv">$LED_INITIAL_BRIGHTNESS</span> > <span class="nv">$LED_PATH</span>/brightness
<span class="nb">echo</span> <span class="nv">$LED_INITIAL_TRIGGER</span> > <span class="nv">$LED_PATH</span>/trigger
<span class="c1"># Remove pid file if present</span>
<span class="o">[</span> -f <span class="nv">$PID_FILE</span> <span class="o">]</span> <span class="o">&&</span> rm <span class="nv">$PID_FILE</span>
<span class="nb">exit</span> <span class="m">0</span>
<span class="o">}</span>
blink_loop<span class="o">()</span> <span class="o">{</span>
<span class="c1"># Get initial values (BRIGHTNESS and TRIGGER) of the red led to restore it at</span>
<span class="c1"># exit time</span>
<span class="nv">LED_INITIAL_BRIGHTNESS</span><span class="o">=</span><span class="k">$(</span>cat <span class="nv">$LED_PATH</span>/brightness<span class="k">)</span>
<span class="nv">LED_INITIAL_TRIGGER</span><span class="o">=</span><span class="k">$(</span>sed <span class="s1">'s/.*\[\(.*\)\].*//'</span> < <span class="nv">$LED_PATH</span>/trigger<span class="k">)</span>
<span class="nb">trap</span> <span class="s1">'cleanup'</span> EXIT HUP INT QUIT TERM
<span class="k">while</span> <span class="nb">true</span>
<span class="k">do</span>
<span class="nb">echo</span> default-on > <span class="nv">$LED_PATH</span>/trigger
sleep <span class="nv">$ON_DELAY</span>
<span class="nb">echo</span> none > <span class="nv">$LED_PATH</span>/trigger
sleep <span class="nv">$OFF_DELAY</span>
<span class="k">done</span>
<span class="o">}</span>
do_stop<span class="o">()</span> <span class="o">{</span>
<span class="nb">echo</span> <span class="o">[</span><span class="k">$(</span>date <span class="s1">'+%F %H:%M:%S'</span><span class="k">)</span><span class="o">]</span> stop >> ~/recording.log
<span class="c1"># kill the process otherwise, previous led states are unknown unless writed</span>
<span class="c1"># to a file before blink loop</span>
pkill -TERM -x <span class="k">$(</span>basename <span class="nv">$0</span><span class="k">)</span>
<span class="o">}</span>
print_syntax<span class="o">()</span> <span class="o">{</span>
<span class="nb">printf</span> <span class="s2">"Syntax : </span><span class="k">$(</span>basename <span class="nv">$0</span><span class="k">)</span><span class="s2"> <start|stop>\n"</span>
<span class="o">}</span>
<span class="k">if</span> <span class="o">[</span> <span class="s2">"</span><span class="nv">$#</span><span class="s2">"</span> -ge <span class="s2">"1"</span> <span class="o">]</span>
<span class="k">then</span>
<span class="k">case</span> <span class="si">${</span><span class="nv">1</span><span class="p">,,</span><span class="si">}</span> in
start<span class="o">)</span>
do_start
<span class="p">;;</span>
stop<span class="o">)</span>
do_stop
<span class="p">;;</span>
*<span class="o">)</span>
print_syntax
<span class="nb">exit</span> <span class="m">1</span>
<span class="p">;;</span>
<span class="k">esac</span>
<span class="k">else</span>
print_syntax
<span class="nb">exit</span> <span class="m">1</span>
<span class="k">fi</span></code></pre>
<p>Le rendre exécutable :<br>
<code>chmod +x /usr/local/bin/recording</code></p>
<h2 id="toc-tester">Tester</h2>
<p><code>recording start</code> doit faire clignoter la LED comme convenu, et <code>Ctrl</code> + <code>C</code> doit arrêter le script et restaurer l’état initial de la LED utilisée.</p>
<p>Depuis un autre terminal avec le même utilisateur, <code>recording stop</code> doit arrêter le script et restaurer l’état initial de la LED utilisée.</p>
<h2 id="toc-appeler-le-script-en-début-et-fin-denregistrement">Appeler le script en début et fin d’enregistrement</h2>
<p>Via l’interface Web de Tvheadend, dans la configuration des profils d’enregistrement :</p>
<p><em>Configuration > Recording > Digital Video Recorder Profiles</em><br>
Choisir le profile <em>DVR behavior</em><br>
<em>Pre-processor command:</em> <code>/usr/local/bin/recording start</code><br>
<em>Post-processor command:</em> <code>/usr/local/bin/recording stop</code><br>
<em>Save</em></p>
<p>Seulement entrer ça dans les deux champs concernés ne fonctionne pas ; il ne se passe rien.<br>
Après tatonnements, j’en suis arrivé à la conclusion que les commandes entrées dans ces champs n’acceptent pas d’arguments ?!</p>
<p>On contourne donc en créant deux scripts distincts <code>recording-start</code> et <code>recording-stop</code> qui vont appeler le script <code>recording</code> avec les bons arguments :</p>
<ol>
<li>
<p><code>/usr/local/bin/recording-start</code> :</p>
<pre><code class="bash"><span class="ch">#!/bin/bash</span>
/usr/local/bin/recording start</code></pre>
</li>
<li>
<p><code>/usr/local/bin/recording-stop</code> :</p>
<pre><code class="bash"><span class="ch">#!/bin/bash</span>
/usr/local/bin/recording stop</code></pre>
</li>
</ol>
<p>Les rendre exécutables :<br>
<code>chmod +x /usr/local/bin/recording-*</code></p>
<p><em>Configuration > Recording > Digital Video Recorder Profiles</em><br>
Choisir le profile <em>DVR behavior</em><br>
<em>Pre-processor command:</em> <code>/usr/local/bin/recording-start</code><br>
<em>Post-processor command:</em> <code>/usr/local/bin/recording-stop</code><br>
<em>Save</em></p>
<h2 id="toc-tests">Tests</h2>
<p>Enregistrez avec Tvheadend, Ça fonctionne correctement ? <em>Well done!</em> Sinon, il doit manquer une étape quelque part.</p>
<h2 id="toc-dépannage">Dépannage</h2>
<p>Au détour d’un site parlant de Pi, j’ai trouvé ces paramètres à placer dans <code>/boot/config.txt</code> pour controler les LED :</p>
<pre><code>dtparam=act_led_trigger=none
dtparam=act_led_activelow=off
dtparam=pwr_led_trigger=none
dtparam=pwr_led_activelow=off
</code></pre>
<p>Seulement, au deuxième redémarrage, la LED rouge est restée allumée ! La méthode via script de démarrage et systemd ci‑dessus fonctionne mieux.</p>
<h2 id="toc-références">Références</h2>
<ul>
<li>Raspberry Pi : <a href="https://www.raspberrypi.org">https://www.raspberrypi.org</a> ;</li>
<li>Raspberry Pi LED : <a href="https://mlagerberg.gitbooks.io/raspberry-pi/content/5.2-leds.html">https://mlagerberg.gitbooks.io/raspberry-pi/content/5.2-leds.html</a> ;</li>
<li>DVB-T : <a href="https://www.linuxtv.org/wiki/index.php/DVB-T">https://www.linuxtv.org/wiki/index.php/DVB-T</a> ;</li>
<li>Tvheadend : <a href="https://tvheadend.org">https://tvheadend.org</a> ;</li>
<li>modifier l’état des LED au démarrage du système via systemd : <a href="https://git.sekoya.org/mb/rpi-leds">https://git.sekoya.org/mb/rpi-leds</a>.</li>
</ul>
<p>Voir cet article « chez moi » : <a href="https://www.sekoya.org/#!blog/raspberrypi-tvheadend-recording-led.md">https://www.sekoya.org/#!blog/raspberrypi-tvheadend-recording-led.md</a>.</p>
</div><div><a href="https://linuxfr.org/news/utiliser-une-des-led-d-un-raspberry-pi-comme-temoin-d-enregistrement-tv.epub">Télécharger ce contenu au format EPUB</a></div> <p>
<strong>Commentaires :</strong>
<a href="//linuxfr.org/nodes/120173/comments.atom">voir le flux Atom</a>
<a href="https://linuxfr.org/news/utiliser-une-des-led-d-un-raspberry-pi-comme-temoin-d-enregistrement-tv#comments">ouvrir dans le navigateur</a>
</p>
ToasteRDavy Defaudtisaacbubar🦥Benoît SibaudYsabeau 🧶 🧦https://linuxfr.org/nodes/120173/comments.atomtag:linuxfr.org,2005:Diary/391042020-04-25T01:46:20+02:002020-04-25T01:46:20+02:00Utiliser une des LED d'un Raspberry Pi comme témoin d'enregistrement TVLicence CC By‑SA http://creativecommons.org/licenses/by-sa/4.0/deed.fr<h2 class="sommaire">Sommaire</h2>
<ul class="toc">
<li>
<ul>
<li><a href="#toc-voir-l%C3%A9tat-des-leds">Voir l'état des LEDs</a></li>
<li>
<a href="#toc-%C3%89teindre--allumer-les-leds">Éteindre / allumer les LEDs</a><ul>
<li><a href="#toc-extinction-via-trigger-none">Extinction via trigger 'none'</a></li>
<li><a href="#toc-allumage-permanent-via-trigger-default-on">Allumage permanent via trigger 'default-on'</a></li>
</ul>
</li>
<li><a href="#toc-faire-clignoter-une-led">Faire clignoter une LED</a></li>
<li><a href="#toc-sauvegarder-l%C3%A9tat-des-leds">Sauvegarder l'état des LEDs</a></li>
<li><a href="#toc-restaurer-l%C3%A9tat-des-leds">Restaurer l'état des LEDs</a></li>
<li><a href="#toc-autoriser-un-utilisateur-standard-%C3%A0-modifier-l%C3%A9tat-des-leds">Autoriser un utilisateur standard à modifier l'état des LEDs</a></li>
<li>
<a href="#toc-cr%C3%A9er-un-script-recording">Créer un script "recording"</a><ul>
<li><a href="#toc-tester">Tester</a></li>
</ul>
</li>
<li><a href="#toc-appeler-le-script-en-d%C3%A9but-et-fin-denregistrement">Appeler le script en début et fin d'enregistrement</a></li>
<li><a href="#toc-tests">Tests</a></li>
<li><a href="#toc-troubleshooting">Troubleshooting</a></li>
<li><a href="#toc-references">References</a></li>
</ul>
</li>
</ul>
<p>J'utilise un Raspberry Pi comme enregistreur TV-TNT via un adaptateur DVB-T et tvheadend.</p>
<p>Il m'est déjà arrivé de faire ce genre de chose alors qu'un enregistrement était en cours :</p>
<ul>
<li>lors d'une manipulation ou d'un test, j'ai besoin de rebooter le Pi et PAF, je viens de flinguer l'enregistrement en cours ! Ou plutôt, j'ai inséré un saut temporel dans l'enregistrement en cours.</li>
<li>Je trifouille des branchements derrière la TV et j'ai besoin de powerOff le PI, bah je le débranche et PAF, encore un saut temporel.</li>
</ul>
<p>Bon, ok, ça n'arrive pas souvent, mais ça m'est arrivé et j'étais assez énervé pour penser à une solution à base de reconversion des LEDs qui me permette d'éviter ça !</p>
<p>Pour prévenir les reboot à distance, on peut imaginer une modif de <code>/etc/motd*</code> ou <code>/etc/issue</code> qui prévienne : ATTENTION, enregistrement en cours !</p>
<p>Pour les débranchements de câbles, on va utiliser les LEDs afin de prévenir les personnes aux alentours qu'un enregistrement est en cours.</p>
<p>Par défaut, la LED rouge est allumée (témoin power/PWR), la LED verte, elle, s'allume lorsqu'il y a de l'activité sur la carte SD (lecture ou écriture).</p>
<p>Il est possible de les éteindre ou de les utiliser pour tout autre chose. C'est ce qu'on va faire ici avec les moyens du bord ; utiliser une des LEDs comme témoin d'enregistrement en cours.</p>
<p>Pour ma part, en temps normal, je les désactive au démarrage.</p>
<h3 id="toc-voir-létat-des-leds">Voir l'état des LEDs</h3>
<p>L'état des LEDs est dans ces répertoires virtuels (kernel filesystem) :</p>
<p><strong>/sys/class/leds/led0/</strong> : verte<br>
<strong>/sys/class/leds/led1/</strong> : rouge<br>
Ces répertoires contiennent, entre autres ces 2 fichiers :</p>
<ul>
<li>
<strong>brightness</strong> : intensité de la LED
0 = éteinte, toute autre valeur jusque 255 = allumée.</li>
<li>
<strong>trigger</strong> : déclencheur
Quand / pourquoi la LED s'allume.</li>
</ul>
<p><strong>/sys/class/leds/led0/brightness</strong><br>
<code><br>
0<br>
</code><strong>/sys/class/leds/led0/trigger</strong><br>
<code><br>
none rc-feedback kbd-scrolllock kbd-numlock kbd-capslock kbd-kanalock kbd-shiftlock kbd-altgrlock kbd-ctrllock kbd-altlock kbd-shiftllock kbd-shiftrlock kbd-ctrlllock kbd-ctrlrlock timer oneshot heartbeat backlight gpio cpu cpu0 cpu1 cpu2 cpu3 default-on input panic mmc1 [mmc0] rfkill-any rfkill-none rfkill0<br>
</code><strong>/sys/class/leds/led1/brightness</strong><br>
<code><br>
255<br>
</code><strong>/sys/class/leds/led1/trigger</strong><br>
<code><br>
none rc-feedback kbd-scrolllock kbd-numlock kbd-capslock kbd-kanalock kbd-shiftlock kbd-altgrlock kbd-ctrllock kbd-altlock kbd-shiftllock kbd-shiftrlock kbd-ctrlllock kbd-ctrlrlock timer oneshot heartbeat backlight gpio cpu cpu0 cpu1 cpu2 cpu3 default-on [input] panic mmc1 mmc0 rfkill-any rfkill-none rfkill0<br>
</code>Les triggers sont entre crochets <code>[mmc0]</code> pour led0 (verte) et <code>[input]</code> pour led1 (rouge).<br>
On a donc, la LED verte (led0) qui s'allume en cas d'activité sur la carte SD (mmc0) et la LED rouge allumée lorsqu'il y a de l'alimentation éléctrique (input).</p>
<h3 id="toc-Éteindre--allumer-les-leds">Éteindre / allumer les LEDs</h3>
<p>Ces fichiers virtuels sont lisibles par tous et modifiables par root uniquement :<br>
<code><br>
-rw-r--r-- 1 root root 4096 avril 24 10:54 /sys/class/leds/led0/brightness<br>
-rw-r--r-- 1 root root 4096 avril 24 15:55 /sys/class/leds/led0/trigger<br>
-rw-r--r-- 1 root root 4096 avril 24 10:54 /sys/class/leds/led1/brightness<br>
-rw-r--r-- 1 root root 4096 avril 24 16:03 /sys/class/leds/led1/trigger<br>
</code>Les commandes suivantes devront donc être exécutées en tant que root.</p>
<h4 id="toc-extinction-via-trigger-none">Extinction via trigger 'none'</h4>
<p>Éteindre la LED verte (led0)<br>
<code>echo none > /sys/class/leds/led0/trigger</code><br>
Éteindre la LED rouge (led1)<br>
<code>echo none > /sys/class/leds/led1/trigger</code></p>
<p>Pourquoi je touche aux fichiers <strong>trigger</strong> et pas aux fichiers <strong>brightness</strong> ? Car si le trigger reste mmc0 pour la LED verte, placer un 0 dans <strong>/sys/class/leds/led0/brightness</strong> va juste éteindre la LED si elle était allumée à cet instant précis, puis la prochaine activité sur mmc0 va la faire clignoter encore.</p>
<h4 id="toc-allumage-permanent-via-trigger-default-on">Allumage permanent via trigger 'default-on'</h4>
<p>Allumer la LED verte (led0)<br>
<code>echo default-on > /sys/class/leds/led0/trigger</code></p>
<p>Le contenu du fichier brightness correpondant passe à 255<br>
<code>cat /sys/class/leds/led0/brightness</code></p>
<pre><code>255
</code></pre>
<p>Note: placer tout autre valeur que 0 dans brightness allume la LED, mais il n'est pas possible de modifier son intensité.</p>
<h3 id="toc-faire-clignoter-une-led">Faire clignoter une LED</h3>
<p>Maintenant qu'on maitrise l'allumage et l'extinction, faisont clignoter la LED verte.</p>
<p>Un clignotement, c'est :</p>
<ol>
<li>j'allume la LED verte (j'écris default-on dans le trigger)</li>
<li>j'attends 1 seconde</li>
<li>j'éteint la LED verte (j'écris none dans le trigger)</li>
<li>j'attends 1 seconde
et je recommence tout ça à l'infini.</li>
</ol>
<p>On peut le faire via le shell, toujours en tant que root :<br>
<code><br>
while true<br>
do<br>
echo default-on > /sys/class/leds/led0/trigger<br>
sleep 1<br>
echo none > /sys/class/leds/led0/trigger<br>
sleep 1<br>
done<br>
</code><code>[CTRL] c</code> pour arrêter le script.</p>
<p>On peut même imaginer d'autres séquences invoquant les 2 LEDs pour faire un chenillard rapide :<br>
<code><br>
while true<br>
do<br>
echo default-on > /sys/class/leds/led0/trigger<br>
sleep 0.1<br>
echo default-on > /sys/class/leds/led1/trigger<br>
sleep 0.1<br>
echo none > /sys/class/leds/led0/trigger<br>
sleep 0.1<br>
echo none > /sys/class/leds/led1/trigger<br>
sleep 0.1<br>
done<br>
</code>Ou allumer les LEDs alternativement à 5 secondes d'intervalle :<br>
<code><br>
while true<br>
do<br>
echo default-on > /sys/class/leds/led0/trigger<br>
sleep 5<br>
echo default-on > /sys/class/leds/led1/trigger<br>
echo none > /sys/class/leds/led0/trigger<br>
sleep 5<br>
echo none > /sys/class/leds/led1/trigger<br>
done<br>
</code>Note: la/les LEDs restent dans l'état où elles sont lorsque l'on interrompt le script. Il va nous falloir sauvegarder leur état initial au début du script pour pouvoir restaurer cet état à la fin du script.</p>
<h3 id="toc-sauvegarder-létat-des-leds">Sauvegarder l'état des LEDs</h3>
<p>Afin de nettoyer après notre passage, il sera nécessaire de sauvegarder l'état des LEDs avant d'y toucher pour les restaurer à la sortie de notre script final.</p>
<p>On peut le faire comme ça :<br>
Pour chaque LED (0 et 1), lire l'état actuel des fichiers virtuels <strong>trigger</strong> et <strong>brightness</strong>, stocker ces états dans un emplacement temporaire.</p>
<h3 id="toc-restaurer-létat-des-leds">Restaurer l'état des LEDs</h3>
<p>Pour chaque LED (0 et 1), écrire les triggers avec les infos temporaires précedemment enregistrées.</p>
<h3 id="toc-autoriser-un-utilisateur-standard-à-modifier-létat-des-leds">Autoriser un utilisateur standard à modifier l'état des LEDs</h3>
<p>Jusqu'ici, nos expérimentations étaient exécutées en tant que root pour pouvoir modifier les fichiers /sys directement. Par la suite, nous allons vouloir lancer ce script en tant que l'utilisateur qui effectue les enregistrements ; avec Tvheadend, c'est le user <strong>hts:hts</strong>. Quelles sont les possibilités pour arriver à faire ça en tant que user, leurs inconvénients si il y en a :</p>
<ul>
<li>Lancer le script avec sudo</li>
<li>Changer les permissions des fichiers brightness et trigger au boot avec un script appelé via systemd</li>
</ul>
<p>J'avais commencé avec la méthode sudo, même si notre script est au final innofensif, psychologiquement, la méthode ne m'emballait pas. J'ai préféré par la suite modifier les permissions des fichiers virtuels afin que les membres du groupe <strong>hts</strong> (donc le user hts de Tvheadend) puissent les modifier.</p>
<p>Pour chaque fichier (brightness trigger), changer le propriétaire vers le groupe hts et autoriser le groupe à modifier les fichiers</p>
<p>En shell ça donne un script à placer dans <strong>/usr/local/sbin</strong> (car il sera exécuté par root) :</p>
<p><strong>/usr/local/sbin/ledpermissions</strong></p>
<pre><code class="bash"><span class="ch">#!/bin/bash</span>
chown :hts /sys/class/leds/led*/<span class="o">{</span>brightness,trigger<span class="o">}</span>
chmod g+w /sys/class/leds/led*/<span class="o">{</span>brightness,trigger<span class="o">}</span></code></pre>
<p>On le rend exécutable :<br>
<code>chmod +x /usr/local/sbin/ledpermissions</code></p>
<p>Accompagné par une "Unit" systemd qui appelera ce script au boot</p>
<p><strong>/etc/systemd/system/ledpermissions.service</strong></p>
<pre><code>[Unit]
Description=Set leds permissions
[Service]
Type=oneshot
User=root
ExecStart=/usr/local/sbin/ledpermissions
[Install]
WantedBy=multi-user.target
</code></pre>
<p>On vérifie son fonctionnement en affichant les permissions des fichiers avant et après lancement.</p>
<p><code>ls -l /sys/class/leds/led*/{brightness,trigger}</code><br>
<code><br>
-rw-r--r-- 1 root root 4096 avril 23 17:40 /sys/class/leds/led0/brightness<br>
-rw-r--r-- 1 root root 4096 avril 23 17:40 /sys/class/leds/led0/trigger<br>
-rw-r--r-- 1 root root 4096 avril 23 17:40 /sys/class/leds/led1/brightness<br>
-rw-r--r-- 1 root root 4096 avril 23 17:40 /sys/class/leds/led1/trigger<br>
</code>groupe: <strong>root</strong>, permissions du groupe: <strong>r--</strong>.</p>
<p><code>systemctl start ledpermissions.service</code></p>
<p><code>ls -l /sys/class/leds/led**/{brightness,trigger}</code><br>
<code><br>
-rw-rw-r-- 1 root hts 4096 avril 23 17:40 /sys/class/leds/led0/brightness<br>
-rw-rw-r-- 1 root hts 4096 avril 23 17:40 /sys/class/leds/led0/trigger<br>
-rw-rw-r-- 1 root hts 4096 avril 23 17:40 /sys/class/leds/led1/brightness<br>
-rw-rw-r-- 1 root hts 4096 avril 23 17:40 /sys/class/leds/led1/trigger<br>
</code>groupe: <strong>hts</strong>, permissions du groupe: <strong>rw-</strong>.</p>
<p>Et on active le service pour le prochain boot :<br>
<code>systemctl enable ledpermissions.service</code></p>
<h3 id="toc-créer-un-script-recording">Créer un script "recording"</h3>
<p>Ce que je veux pour ce script :</p>
<ul>
<li>Qu'il puisse être lancé par l'utilisateur hts (ok si les permissions des LEDs sont modifiées)</li>
<li>Qu'il ne se plante pas si on le lance plusieurs fois de suite tout en ne laissant qu'une seule instance s'exécuter</li>
<li>Qu'il puisse être appelé avec start ou stop pour démarrer le clignotement ou arrêter le clignottement et restaurer l'état initial de la LED.</li>
<li>Qu'il fasse clignoter la LED verte comme ça : 2 secondes allumée, 1 seconde éteinte, etc.</li>
</ul>
<p>Son déroulement :</p>
<ul>
<li>Vérifier la syntaxe ; recording start / recording stop. Ignorer les paramètres supplémentaires. en cas d'erreur de syntaxe, afficher la syntaxe correcte et sortir en erreur.</li>
<li>Si l'argument est "start", vérifier que le script n'est pas déjà en cours d'éxécution via un fichier PID, si ce n'est pas le cas, écrire notre PID dans ce fichier, écrire dans un log la date de début d'enregistrement. Appeler la boucle de clignotement.</li>
<li>Boucle de clignotement :
<ul>
<li>sauvegarde dans deux variables des valeurs initiales de brightness et trigger de la LED verte (0).</li>
<li>Se préparer à mourir "proprement" si on reçoit <code>[CTRL] c</code> ou un autre signal en appelant si ça arrive une fonction "cleanup" qui restaurera les valeurs initiales de brightness et trigger de la LED verte (0).</li>
<li>Clignotter selon notre volonté</li>
</ul>
</li>
</ul>
<p><strong>/usr/local/bin/recording</strong></p>
<pre><code class="bash"><span class="ch">#!/bin/bash</span>
<span class="nv">PID_FILE</span><span class="o">=</span><span class="s2">"/run/shm/</span><span class="k">$(</span>basename <span class="nv">$0</span><span class="k">)</span><span class="s2">"</span>
do_start<span class="o">()</span> <span class="o">{</span>
<span class="c1"># are we already running ?</span>
<span class="k">if</span> <span class="o">[</span> -f <span class="nv">$PID_FILE</span> <span class="o">]</span>
<span class="k">then</span>
<span class="nb">printf</span> <span class="s2">"we are already running or badly terminated !\n"</span>
<span class="nb">exit</span> <span class="m">1</span>
<span class="k">else</span>
<span class="nb">echo</span> <span class="nv">$$</span> > <span class="nv">$PID_FILE</span>
<span class="nb">echo</span> <span class="o">[</span><span class="k">$(</span>date <span class="s1">'+%Y-%m-%d %H:%M:%S'</span><span class="k">)</span><span class="o">]</span> start >> ~/recording.log
blink_loop
<span class="k">fi</span>
<span class="o">}</span>
cleanup<span class="o">()</span> <span class="o">{</span>
<span class="c1"># Restore initial values (BRIGHTNESS and TRIGGER) of the red led</span>
<span class="nb">echo</span> <span class="nv">$LED0_INITIAL_BRIGHTNESS</span> > /sys/class/leds/led0/brightness
<span class="nb">echo</span> <span class="nv">$LED0_INITIAL_TRIGGER</span> > /sys/class/leds/led0/trigger
<span class="c1"># Remove pid file if present</span>
<span class="o">[</span> -f <span class="nv">$PID_FILE</span> <span class="o">]</span> <span class="o">&&</span> rm <span class="nv">$PID_FILE</span>
<span class="nb">exit</span> <span class="m">0</span>
<span class="o">}</span>
blink_loop<span class="o">()</span> <span class="o">{</span>
<span class="c1"># Get initial values (BRIGHTNESS and TRIGGER) of the red led to restore it at</span>
<span class="c1"># exit time</span>
<span class="nv">LED0_INITIAL_BRIGHTNESS</span><span class="o">=</span><span class="k">$(</span>cat /sys/class/leds/led0/brightness<span class="k">)</span>
<span class="nv">LED0_INITIAL_TRIGGER</span><span class="o">=</span><span class="k">$(</span>sed <span class="s1">'s/.*\[\(.*\)\].*/\1/'</span> < /sys/class/leds/led0/trigger<span class="k">)</span>
<span class="c1"># Define blinking delays in seconds</span>
<span class="nv">ON_DELAY</span><span class="o">=</span><span class="m">2</span>.0
<span class="nv">OFF_DELAY</span><span class="o">=</span><span class="m">1</span>.0
<span class="nb">trap</span> <span class="s1">'cleanup'</span> EXIT HUP INT QUIT TERM
<span class="k">while</span> <span class="nb">true</span>
<span class="k">do</span>
<span class="nb">echo</span> default-on > /sys/class/leds/led0/trigger
sleep <span class="nv">$ON_DELAY</span>
<span class="nb">echo</span> none > /sys/class/leds/led0/trigger
sleep <span class="nv">$OFF_DELAY</span>
<span class="k">done</span>
<span class="o">}</span>
do_stop<span class="o">()</span> <span class="o">{</span>
<span class="nb">echo</span> <span class="o">[</span><span class="k">$(</span>date <span class="s1">'+%Y-%m-%d %H:%M:%S'</span><span class="k">)</span><span class="o">]</span> stop >> ~/recording.log
<span class="c1"># kill the process otherwise, previous led states are unknown unless writed</span>
<span class="c1"># to a file before blink loop</span>
pkill -x <span class="k">$(</span>basename <span class="nv">$0</span><span class="k">)</span>
<span class="o">}</span>
print_syntax<span class="o">()</span> <span class="o">{</span>
<span class="nb">printf</span> <span class="s2">"Syntax : </span><span class="k">$(</span>basename <span class="nv">$0</span><span class="k">)</span><span class="s2"> <start|stop>\n"</span>
<span class="o">}</span>
<span class="k">if</span> <span class="o">[</span> <span class="s2">"</span><span class="nv">$#</span><span class="s2">"</span> -ge <span class="s2">"1"</span> <span class="o">]</span>
<span class="k">then</span>
<span class="k">case</span> <span class="nv">$1</span> in
start<span class="o">)</span>
do_start
<span class="p">;;</span>
stop<span class="o">)</span>
do_stop
<span class="p">;;</span>
*<span class="o">)</span>
print_syntax
<span class="nb">exit</span> <span class="m">1</span>
<span class="p">;;</span>
<span class="k">esac</span>
<span class="k">else</span>
print_syntax
<span class="nb">exit</span> <span class="m">1</span>
<span class="k">fi</span></code></pre>
<p>Le rendre exécutable :<br>
<code>chmod +x /usr/local/bin/recording</code></p>
<h4 id="toc-tester">Tester</h4>
<p><code>recording start</code> doit faire clignoter la LED comme convenu.<br>
<code>[CTRL] c</code> doit arrêter le script et restaurer l'état initial de la LED utilisée.</p>
<p><code>recording start</code> doit faire clignoter la LED comme convenu.<br>
Depuis un autre terminal avec le même user, <code>recording stop</code> doit arrêter le script et restaurer l'état initial de la LED utilisée.</p>
<h3 id="toc-appeler-le-script-en-début-et-fin-denregistrement">Appeler le script en début et fin d'enregistrement</h3>
<p>Via l'interface web de Tvheadend, dans la configuration des profils d'enregistrements :</p>
<p><em>Configuration > Recording > Digital Video Recorder Profiles</em><br>
Choisir le profile<br>
<em>DVR behavior</em><br>
<em>Pre-processor command:</em> <code>/usr/local/bin/recording start</code><br>
<em>Post-processor command:</em> <code>/usr/local/bin/recording stop</code><br>
<em>Save</em></p>
<p>Seulement entrer ça dans les deux champs concernés ne fonctionne pas ! il ne se passe rien.<br>
Après tatonnements, j'en suis arrivé à la conclusion que les commandes entrées dans ces champs n'acceptent pas d'arguments !?</p>
<p>On contourne donc en créant 2 scripts distincts <strong>recording-start</strong> et <strong>recording-stop</strong> qui vont appeler le script <strong>recording</strong> avec les bons arguments.</p>
<p><strong>/usr/local/bin/recording-start</strong></p>
<pre><code class="bash"><span class="ch">#!/bin/bash</span>
/usr/local/bin/recording start</code></pre>
<p><strong>/usr/local/bin/recording-stop</strong></p>
<pre><code class="bash"><span class="ch">#!/bin/bash</span>
/usr/local/bin/recording stop</code></pre>
<p>Les rendre exécutable :</p>
<p><code>chmod +x /usr/local/bin/recording-*</code></p>
<p><em>Configuration > Recording > Digital Video Recorder Profiles</em><br>
Choisir le profile<br>
<em>DVR behavior</em><br>
<em>Pre-processor command:</em> <code>/usr/local/bin/recording-start</code><br>
<em>Post-processor command:</em> <code>/usr/local/bin/recording-stop</code><br>
<em>Save</em></p>
<h3 id="toc-tests">Tests</h3>
<p>Enregistrez… Ça fonctionne correctement ? tant mieux, sinon, il doit manquer une étape quelque part.</p>
<h3 id="toc-troubleshooting">Troubleshooting</h3>
<p>Au détour d'un site parlant de PI, j'ai trouvé ces paramètres à placer dans <strong>/boot/config.txt</strong> pour controler les LEDs.<br>
<code><br>
dtparam=act_led_trigger=none<br>
dtparam=act_led_activelow=off<br>
dtparam=pwr_led_trigger=none<br>
dtparam=pwr_led_activelow=off<br>
</code>Seulement, au 2eme reboot, la LED rouge est restée allumée ! la méthode via script de démarrage / systemd ci-dessus marche mieux.</p>
<h3 id="toc-references">References</h3>
<p>Raspberry Pi : <a href="https://www.raspberrypi.org">https://www.raspberrypi.org</a><br>
Raspberry Pi LEDs : <a href="https://mlagerberg.gitbooks.io/raspberry-pi/content/5.2-leds.html">https://mlagerberg.gitbooks.io/raspberry-pi/content/5.2-leds.html</a><br>
DVB-T : <a href="https://www.linuxtv.org/wiki/index.php/DVB-T">https://www.linuxtv.org/wiki/index.php/DVB-T</a><br>
Tvheadend : <a href="https://tvheadend.org">https://tvheadend.org</a></p>
<p>Voir cet article "chez moi" : <a href="https://www.sekoya.org/#!blog/raspberrypi-tvheadend-recording-led.md">https://www.sekoya.org/#!blog/raspberrypi-tvheadend-recording-led.md</a></p>
<div><a href="https://linuxfr.org/users/toaster/journaux/utiliser-une-des-led-d-un-raspberry-pi-comme-temoin-d-enregistrement-tv.epub">Télécharger ce contenu au format EPUB</a></div> <p>
<strong>Commentaires :</strong>
<a href="//linuxfr.org/nodes/120169/comments.atom">voir le flux Atom</a>
<a href="https://linuxfr.org/users/toaster/journaux/utiliser-une-des-led-d-un-raspberry-pi-comme-temoin-d-enregistrement-tv#comments">ouvrir dans le navigateur</a>
</p>
ToasteRhttps://linuxfr.org/nodes/120169/comments.atom