J’ai monté un deuxième lecteur RuneAudio ce week-end, pour le rez-de-chaussée. La principale différence, hormis le boîtier physique, est la gestion de l’alimentation.
En effet, sur mon premier lecteur, basculer l’interrupteur coupe le courant brutalement au Raspberry, ce qui peut occasionner des corruptions du système de fichiers de la carte MicroSD (et l’expérience, sur à peine dix jours, montre que la base de données de MPD finit parfois corrompue).
Je voulais donc un système qui me permette d’allumer le Raspberry en basculant l’interrupteur, de l’éteindre proprement en re-basculant le même interrupteur, et de consommer zéro watt lorsqu’il est éteint.
La solution la plus simple que j’ai trouvé est un interrupteur capable de commander deux circuits distincts, tel que celui-ci ou celui-là (chercher DPST, « Double pole single throw »).
L’un des circuits de cet interrupteur coupera l’arrivée d’électricité à l’alimentation et sera mis en parallèle d’un relais contrôlé par le Raspberry, tandis que l’état du deuxième circuit, relié aux GPIO du Raspberry, sera surveillé par celui et déclenchera un shutdown propre.
Sur le schéma ci-dessus, le 220V est sur les fils bleu et marron ; le 5V sur les rouge et noir ; le contrôle du relais en orange, et celui du deuxième circuit de l’interrupteur en violet.
Nous allons écrire un petit script Python qui commencera par configurer la GPIO 5 en sortie, puis la passera à l’état haut, ce qui aura pour effet de fermer le relais. Ensuite, on configure la GPIO 27 en entrée, puis on lit son état dans une boucle infinie. Selon l’état, on continue d’attendre ou bien on éteint proprement.
# cat /root/power-control.py
import RPi.GPIO as GPIO
import os
import time
import sys
GPIO.setmode(GPIO.BCM)
#Setup de la broche de contrôle du relais pour le fermer
GPIO.setup(5, GPIO.OUT)
GPIO.output(5, GPIO.HIGH)
#Setup de la broche de surveillance de l'interrupteur
GPIO.setup(27, GPIO.IN, pull_up_down=GPIO.PUD_UP)
#Boucle infinie de surveillance
while True:
state = GPIO.input(27)
if state == True:
#Interrupteur toujours sur ON
time.sleep(0.5)
else:
#Interrupteur sur OFF, déclenchement de l'extinction
os.system("/var/www/command/rune_shutdown poweroff")
os.system("shutdown -h now")
sys.exit(0)
Deux remarques :
- Selon votre câblage et le type de relais, les GPIO.HIGH seront peut-être des LOW, à adapter.
- On ne réouvre jamais le relais. Cela se fait tout seul, tard dans le processus de shutdown du Pi et cela a pour conséquence de l’éteindre immédiatement, donc autant ne pas le faire en avance.
Il reste à installer ce script en tant que service Systemd :
# cat /usr/lib/systemd /system/power-control.service
[Unit]
Description=Power control
After=multi-user.target
[Service]
Type=idle
ExecStart=/usr/bin/python /root/power-control.py
[Install]
WantedBy=multi-user.target
Et enfin, on l’active et on le démarre :
# systemctl enable power-control
# systemctl start power-control
# systemctl status power-control
Pour le reste de la configuration logicielle, c’est la même que dans ce premier article : Configuration de Runeaudio, un lecteur de musique réseau.
Quelques photos :
J’ai aussi fait une vidéo au montage hyper-propre sur le même sujet :
Bravo, le boîtier a vraiment du style. Je pense que tu peux améliorer ton script power-control.py en remplaçant l’attente active par poll() ou select().
En effet ! Ce qui serait plus optimal :)
https://www.blaess.fr/christophe/2013/04/15/attentes-passives-sur-gpio/
Bonjour,
J’ai mis en œuvre votre solution avec succès. Mais j’ai l’impression (je ne suis pas un spécialiste) qu’on peut encore simplifier le programme en utilisant la commande « dtoverlay=gpio-shutdown,gpio_pin=27,active_low=0 » dans le fichier config.txt du boot (https://github.com/raspberrypi/firmware/blob/master/boot/overlays/README): ça permet de supprimer la boucle… et d’initialiser le relai au boot dans le fichier rc.local.
J’avais eu du mal à faire marcher l’overlay gpio, je ne me souviens pas exactement mais globalement ça voulait pas. Ça marche peut-être mieux avec une distro plus récente !
Bonjour,
Vous avez un problème sur l’affichage des images de tous les articles rune audio.
Cordialement
Effectivement, merci !
Bonjour,
tu devrais placer un diode en parallèle sur le relais, cela va protéger ton GPIO de retour de courant induction voir préférable de passer par un transistor de commande pour ne pas être en direct sur le GPIO .
Bonjour,
J’adapte votre création avec volumio pour le bouton « on/off » et je cherche, cherche… avant de lancer le script.
Pour comprendre : « ExecStart=/usr/bin/python /root/power-control.py » que fait cette ligne de code : utilise la biblioteque python ? et lance le script « toto.py » ?
De plus étant sous Volumio, les lignes suivantes du script me semble pas en adéquation :
os.system(« /var/www/command/rune_shutdown poweroff ») –> je n’ai pas trouvé sous Volumio de répétoire « www »
os.system(« shutdown -h now »)
Est-ce que la commande os.system est propre à runeaudio.
Merci de votre aide.
Salut Maxime,
Oui, la ligne ExecStart= utilise python pour interpréter et faire tourner le script power-control.py. Celui ci continuera à tourner indéfiniment (avec son while true).
Pour adapter le script à Volumio, effectivement, /var/www/command/rune_shutdown poweroff est propre à RuneAudio. C’est un script de Runeaudio qui arrête différents éléments avant d’éteindre le Raspberry. Je ne sais pas si Volumio a un script équivalent. C’est possible que non et que ça ne soit pas un problème : la commande suivante, « shutdown -h now », est universelle (à tous les Linux) et éteint proprement les services puis la machine.
os.system() est une fonction Python, qui permet à Python d’appeler d’autres exécutables sur le système.
Merci.
Dès que j’arrive à faire fonctionner tout cela. Je « posterai » ce que j’ai fait.
pas tout de suite, j’avance très lentement faute de temps….
A cette heure RuneAudio n’est pas développé pour un Raspberry Pi 4, j’ai donc installé Volumio version 2.861-2020-12-22-x86.img.
Après l’installation de ce dernier, on accède à Volumio avec un navigateur en tapant //volumio.local la première fois pour le paramétrage.
Je vous conseille de mettre sur OFF la mise à jour automatique de volumio dans ses paramètres. Pourquoi mettre à jour si cela fonctionne ? Volumio est « free » mais a des modules payants par abonnement.
Si vous câblez un écran tactile à votre Raspberry, Volumio a un plugin « Touch Display » à installer ainsi vous pourrez directement régler l’orientation. Par contre pour configurer la résolution il faudra passer par le fichier /boot/config.txt avec un terminal en SSH.
Nota bene : Attention en mettant une adresse IP fixe sous Volumio vous n’aurez plus accès aux Plugins et aux Webradios (Bug ?) et comme c’est pratique d’avoir une IP fixe, la solution que j’ai trouvée est de laisser Volumio en DHCP et de paramétrer votre Box Internet pour qu’elle attribue à Volumio toujours la même adresse IP.
On peut accéder à volumio par le navigateur (interface graphique) ou même avec un smartphone en installant l’appli Volumio, mais pour installer des scripts il faut passer en mode terminal. Putty est l’outil idéal, C’est juste un executable ! Il n’y a pas d’intallation de logiciel. Et si vous avez forcé votre Box Internet à attribuer toujours la même adresse IP à Volumio, vous pouvez créer un raccourci de putty avec l’adresse IP de volumio et mot de passe. Ainsi quand vous lancerez le raccourci, vous serez directement connecté en SSH à Volumio sans rentrer de Login et Mot de passe.
Par rapport à RuneAudio, j’ai dû modifier quelques lignes de codes.
Pour info, quand on se connecte à Volumio en SSH on ne se retrouve pas directement à la racine du support (Carte Sd, DD,……) mais dans le dossier Volumio, pour aller à la racine il faudra remonter de 2 répertoires.
Dans le Script Python : power-control.py
Notez où vous avez créé ce fichier, je l’ai créé à la racine (attention lire plus haut quand on se connecte en SSH à volumio)
Volumio n’a pas proprement de shutdown comme RuneAudio
On peut donc supprimer la ligne :
os.system(« /var/www/command/rune_shutdown poweroff »)
Pour ma part j’ai du changé la condition if State == True par False car mon Raspberry s’allumait et s’éteignait tout de suite avec True. Merci Colino ! Et si cela vous arrive il faut être rapide pour stopper le service créé avec la commande : systemctl stop power-service
Script power-control.service
Pour créer ce fichier avec les autres fichiers de service le chemin est :
/lib/systemd/system sous Volumio
la commande /root/power-control.py n’étant pas le bon chemin, j’ai modifié par
../../../power-control.py (../ est la commande pour remonter d’un dossier) ce qui donne :
ExecStart=/usr/bin/python ../../../power-control.py
Si vous démarrez le service power-control et que Volumio ne reconnait pas GPIO etc…
il faudra installer la reconnaissance des GPIO et PIP en faisant :
sudo apt-get install python-pip python-dev
puis
sudo pip install -U RPi.GPIO
sudo est juste pour passer la commande en tant qu’administrateur, généralement Volumio va demander le mot de passe : volumio
—————————————————————–
Mes fichiers musiques sont contenus sur une clé USB branchée directement sur le Raspberry. Souvent pour accéder à une clé USB ou DD à distance sous linux il faut installer Samba et configurer plein de trucs. Sous Volumio Samba est déjà installé, une fois que vous aurez dit où se trouve votre support de musique à Volumio, vous pouvez vérifier le fichier smb.conf et regarder si par exemple [USB] est déclaré. Si tel est le cas, depuis Win10 vous pouvez créer un un raccourci réseau (clique droit sur icone, connecteur un lecteur réseau) et tapez dans l’adresse \\volumio-1\USB c’est tout ! Vous avez accès directement au suppport au USB pour pouvoir ajouter supprimer des fichiers. (volumio-1 doit être le nom quand vous êtes relié par RJ45, par WIFI il me semble que c’est juste volumio)
Nota bene : L’écran tactile 7 pouces est trop grand pour l’insérer dans le tuner Sony ST80 ou ST88, il vaut mieux partir sur un écran 5 pouces, ce dernier, sa résolution est de 800×480, pensez à changer donc la résolution dans le fichier /boot/config.txt
Hello Maxime,
Merci beaucoup pour ton commentaire détaillé pour VolumIO, j’espère qu’il sera utile à d’autres :)
Pour l’écran 7″ dans le tuner Sony, ça rentre pile poil, mais en rusant avec un câble HDMI coudé… et faut enlever l’interrupteur Power et en utiliser un autre. Avec l’écran 5″ je pense qu’il y a plus de place effectivement !