Ma Raspberry Pi MusicBox

On m’a récemment demandé de trouver une façon de faire jouer une liste Spotify en continu.

Au début, on me proposait d’utiliser une tablette, mais on voulait quelque chose qui pouvait être automatisé et configuré avec plus de flexibilité. Après quelques recherches, je suis tombé sur le projet Pi MusicBox qui répondait à mes besoins. Après quelques essais et erreurs, j’ai réussi à me faire une configuration plutôt stable. Un problème que j’ai eu à de multiples reprises, fut la corruption de la carte mircoSD (due à une interruption impromptue du Raspberry Pi), ce qui m’obligeait à recharger mon image et refaire toutes les configurations. J’ai fini par mettre mon Raspberry Pi en mode lecture seule, afin d’éviter que ce problème revienne.

Voici une procédure étape par étape de ma configuration.

Note : Pour pouvoir utiliser Spotify, vous devez disposer d’un compte premium.

Matériel utilisé :

Étape 1 configuration de la carte microSD

Puisque j’étais sous Windows, j’ai utilisé l’utilitaire Win32 Disk Imager. Il suffit de télécharger l’image de Pi MusicBox, disponible sur la page référée ci-dessus ou directement, en suivant ce lien https://github.com/pimusicbox/pimusicbox/releases/tag/v0.7.0RC6.

Sous Linux, vous pouvez utiliser l’utilitaire dd pour écrire l’image sur la carte microSD.

dd bs=4M if=musicbox_v0.7.0RC5.img of=/dev/sdX conv=fsync

/dev/sdX correspond au chemin vers votre carte microSD, en prenant pour acquis que vous êtes dans le répertoire où se trouve le fichier image.

Étape 2 connexion de la Raspberry Pi

Il est assez simple de brancher la Raspberry Pi, il suffit de brancher le fil réseau à la Pi, d’y connecter la prise analogue à votre amplificateur en utilisant le fil Jack à RCA, et d’y brancher le courant.

Il peut être pratique d’y connecter un écran et un clavier, mais ce n’était pas nécessaire (dans mon cas).

Étape 3 configuration (de base)

Vous devez d’abord identifier l’adresse IP de votre Pi. Personnellement, j’ai regardé l’attribution faite par mon serveur DHCP faite à ma Pi. Elle est facilement identifiable, son nom est MusicBox. Si vous avez branché un moniteur à la Pi, l’adresse IP devrait être affichée à l’écran.

Disons que l’adresse identifiée est : 192.168.0.10

Dans un fureteur, entrez l’adresse http://192.168.0.10 dans la barre d’adresse.

Vous devriez tomber sur l’interface web de la MusicBox.

  1. Dans la section Settings, nous allons d’abord configurer un mot de passe pour l’utilisateur root.
      1. Ouvrir l’onglet MusicBox.
      2. Mettre un mot de passe.
      3. Enregistrer les modifications.
      4. Appliquer les modifications et redémarrer le Pi.
    1. Effectuer les autres configurations possible via l’interface web (note : vos configurations peuvent varier). Retournez sur la Settings de l’interface web, puis :
      1. Dans l’onglet Network, activer la connexion SSH.
      2. Dans l’onglet MusicBox :
        1. Configurer l’URL de lecteur automatique (dans mon cas, pour Spotfiy) : spotify:user:Nom-d’utilisateur:playlist:Id-de-la-liste.
        2. Mettre le Autoplay Timeout à 600 secondes.
        3. Activer le Stream Watchdog.
      3. Dans l’onglet Audio, choisir la sortie Analog.
    2. Dans l’onglet Spotify :
      1. Activer l’option Enable playing music form Spotify.
      2. Entrer le nom d’utilisateur et le mot de passe de votre compte Spotify.
      3. Activer l’option Spotify Connect.
      4. Activer l’option Spotify Web.
      5. Suivre le lien https://www.mopidy.com/authenticate
      6. Copier le Client ID et le Client Secret dans les cases à cet effet.
    3. Enregistrer les modifications.
    4. Appliquer les modifications et redémarrer le Pi.

Si tout s’est bien passé, la musique de votre liste Spotify devrait jouer au redémarrage de la Pi.

Étape 4 configuration (avancée)

Vous devez d’abord vous connecter à la Pi, si vous y avez branché un moniteur et un clavier, il est possible de faire les configurations suivante directement sur la Pi, personnellement, je préfaire utiliser SSH pour faire ceci. Vous pouvez donc vous connecter à votre Pi en utilisant Putty (sous Windows) ou SSH (sous Linux).

Sous  Linux, utilisez la ligne de commande suivante pour vous connecter à votre Pi.

ssh -l root 192.168.0.10
  1. Configurer le fuseau horaire.
    dpkg-reconfigure tzdata
  2. Puisque je voulais que la liste Spotify joue de façon aléatoire et en boucle, j’ai aussi ajouter les lignes suivantes au fichier /opt/musicbox/startup.sh
    nano /opt/musicbox/startup.sh
    # trouver la ligne mpc add "$INI__musicbox__autoplay" et ajouter les deux lignes suivantes sous cette ligne.
                mpc random on
                mpc repeat on
    

Voilà! Tout est configuré. Mais, nous avions dit que nous voulions que la Pi soit en lecture seule, afin d’éviter la corruption de la carte microSD.

Étape 5 configuration de la Pi en lecture seule

Afin de me guider dans la configuration de ma Pi en lecture seule, je me suis basé sur les deux pages suivantes :

Le deuxième réfère à une installation Raspbian de base (utilisant Jessie), puisque nous utilisons Pi MusicBox (Wheezy), il faut en prendre et en laisser, voici ce que j’ai fait.

Désactivation de la swap et de la vérification du système de fichiers.

Il faut pour ce faire ajouter les paramètres fastboot noswap ro à la ligne de commande du fichier /boot/cmdline.txt.

Mon fichier original était comme ceci :

#                                             dwc_otg.lpm_enable=0 console=ttyAMA0,115200 kgdboc=ttyAMA0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait
dwc_otg.fiq_enable=1 dwc_otg.fiq_fsm_enable=1 dwc_otg.lpm_enable=0 console=ttyAMA0,115200 kgdboc=ttyAMA0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait

Mon fichier modifié est donc comme ceci :

#                                             dwc_otg.lpm_enable=0 console=ttyAMA0,115200 kgdboc=ttyAMA0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait
dwc_otg.fiq_enable=1 dwc_otg.fiq_fsm_enable=1 dwc_otg.lpm_enable=0 console=ttyAMA0,115200 kgdboc=ttyAMA0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait fastboot noswap ro

Déplacement de fichiers dans le système de fichier temporaire.

rm -rf /var/lib/dhcp/ /var/lib/dhcpcd5 /var/run /var/spool /var/lock
ln -s /tmp /var/lib/dhcp
ln -s /tmp /var/lib/dhcpcd5
ln -s /tmp /var/run
ln -s /tmp /var/spool
ln -s /tmp /var/lock

Installation du paquet resolvconf.

Afin de permettre la mise à jour des serveurs de noms par l’entremise de DHCP, nous devons installer le paquet resolvconf.

apt-get install resolvconf

Modification de la synchronisation de l’horloge internet.

Premièrement, installons le service ntp (Network Time Protocol).

apt-get install ntp

Puis, il faut modifier le fichier de configuration du service ntp pour permettre l’écriture (temporairement) lorsque l’heure est mise à jour. Pour ce faire, nous devons ajouter des lignes au fichier /etc/cron.hourly/fakehwclock.

Mon fichier original était comme ceci :

#!/bin/sh
#
# Simple cron script - save the current clock periodically in case of
# a power failure or other crash
 
if (command -v fake-hwclock >/dev/null 2>&1) ; then
  fake-hwclock save
fi

Mon fichier modifié est comme ceci :

#!/bin/sh
#
# Simple cron script - save the current clock periodically in case of
# a power failure or other crash
 
if (command -v fake-hwclock >/dev/null 2>&1) ; then
  mount -o remount,rw /
  fake-hwclock save
  mount -o remount,ro /
fi

Noter les modifications aux lignes 7 et 9 du fichier modifié.

Ensuite, nous devons rediriger le driftfile du fichier /etc/ntp.conf vers une zone inscriptible.

Mon fichier original contenait la ligne suivante :

driftfile /var/lib/ntp/ntp.drift

que j’ai commentée, puis j’ai ajouté une ligne comme ceci :

#driftfile /var/lib/ntp/ntp.drift
driftfile /var/tmp/ntp.drift

Modification de l’emplacement des logs de mopidy.

Afin de permettre l’écriture du fichier log de Mopidy, nous devons modifier l’emplacement du fichier en question. Pour ce faire, nous enlevons simplement le sous-répertoire mopidy du chemin du fichier de journalisation dans le fichier de configuration /etc/mopidy/logging.conf.

Mon fichier original était comme ceci :

[loggers]
keys = root

[handlers]
keys = fileHandler

[formatters]
keys = simpleFormatter

[logger_root]
#level = INFO
level = WARNING
handlers = fileHandler

[handler_fileHandler]
class = FileHandler

#level = INFO
level = WARNING
formatter = simpleFormatter
args = ('/var/log/mopidy/mopidy.log',)

[formatter_simpleFormatter]
format = %(asctime)s - %(levelname)-8s %(message)s
datefmt =

Mon fichier modifié est comme ceci :

[loggers]
keys = root

[handlers]
keys = fileHandler

[formatters]
keys = simpleFormatter

[logger_root]
#level = INFO
level = WARNING
handlers = fileHandler

[handler_fileHandler]
class = FileHandler

#level = INFO
level = WARNING
formatter = simpleFormatter
args = ('/var/log/mopidy.log',)

[formatter_simpleFormatter]
format = %(asctime)s - %(levelname)-8s %(message)s
datefmt =

Noter la modification de la ligne 21 de mon fichier.

Altération du démarrage

Tout d’abord, nous enlevons 2 scripts de démarrage en utilisant la ligne de commande suivante :

 insserv -r bootlogs; insserv -r console-setup

Finalement, nous modifions le fichier /etc/fstab afin de lui indiquer de monter les partitions en lecture seule.

Mon fichier original était comme ceci :

proc            /proc           proc    defaults          0       0
/dev/mmcblk0p1  /boot           vfat    defaults,user,rw,umask=000          0       2
/dev/mmcblk0p2  /               ext4    defaults,noatime  0       1
# a swapfile is not a swap partition, so no using swapon|off from here on, use  dphys-swapfile swap[on|off]  for that
/dev/mmcblk0p3  none            swap    sw                0       0

Mon fichier modifié est comme ceci :

proc            /proc           proc    defaults          0       0
/dev/mmcblk0p1  /boot           vfat    defaults,user,umask=000,ro          0       2
/dev/mmcblk0p2  /               ext4    defaults,noatime,ro  0       1
# a swapfile is not a swap partition, so no using swapon|off from here on, use  dphys-swapfile swap[on|off]  for that
#/dev/mmcblk0p3  none            swap    sw                0       0

# Tmpfs
tmpfs          /tmp             tmpfs   nosuid,nodev      0       0
tmpfs          /var/log         tmpfs   nosuid,nodev      0       0
tmpfs          /var/log         tmpfs   nosuid,nodev      0       0

Noter les modifications  aux lignes 2 et 3 (ajout du paramètre ro pour readonly) ainsi qu’à la ligne 5 que j’ai commentée. Je ne suis pas certain que la modification de la ligne 5 était nécessaire, mais tout semble bien tourner avec cette configuration.

Redémarrer

Nous avons terminé, il ne reste qu’à redémarrer la Raspberry Pi afin d’appliquer toutes les modifications.

Comment passer du mode lecture seule au mode lecture/écriture

Si vous devez passer en mode lecture/écriture afin de modifier une configuration ou pour toute autre raison. Vous pouvez utiliser la ligne de commande suivante :

mount -o remount,rw /

Pour retourner en mode lecture seule, utilisez la commande suivante :

mount -o remount,ro /

Voilà!

Tout est configuré, vous pouvez maintenant profiter de votre MusicBox.

Mon script de message du jour perso pour Debian.

Consulter le référentiel GitLab.

#!/bin/bash

PROCCOUNT=`ps -Afl | wc -l`
PROCCOUNT=`expr $PROCCOUNT - 5`
GROUPZ=`groups`
USER=`whoami`
ADMINS=`cat /etc/group | grep --regex "^sudo" | awk -F: '{print $4}' | tr ',' '|'`
ADMINSLIST=`grep -E $ADMINS /etc/passwd | tr ':' ' ' | tr ',' ' ' | awk {'print $5,$6,"("$1")"'} | tr '\n' ',' | sed '$s/.$//'`

if [[ $GROUPZ == "$USER sudo" ]]; then
USERGROUP="Administrator"
elif [[ $USER = "root" ]]; then
USERGROUP="Root"
elif [[ $USER = "$USER" ]]; then
USERGROUP="Regular User"
else
USERGROUP="$GROUPZ"
fi
echo -e "
\033[1;31m                                      ╔═════════════════════════[\033[1;37mSystem Data\033[1;31m]═════════════════════════════════════
\033[1;31m                                      ║\033[1;37m       Hostname\033[1;31m: \033[1;37m`hostname`
\033[1;31m          _,met\$\$\$\$\$gg.               ║\033[1;37m   IPv4 Address\033[1;31m: \033[1;37m`ip addr show eth0 | grep "inet\ " | awk {'print $2'}`
\033[1;31m       ,g\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$P.            ║\033[1;37m   IPv6 Address\033[1;31m: \033[1;37m`ip addr show eth0 | grep -m 1 "inet6\ " | awk {'print $2'}`
\033[1;31m     ,g\$\$P\"\"       \"\"\"Y\$\$.\".          ║\033[1;37m         Kernel\033[1;31m: \033[1;37m`uname -r`
\033[1;31m    ,\$\$P'              \\`\$\$\$.          ║\033[1;37m         Distro\033[1;31m: \033[1;37m`cat /etc/*release | grep \"PRETTY_NAME\" | cut -d "=" -f 2- | sed 's/\"//g'`
\033[1;31m  ',\$\$P       ,ggs.     \\`\$\$b:         ║\033[1;37m         Uptime\033[1;31m: \033[1;37m`uptime | sed 's/.*up ([^,]*), .*/1/'`
\033[1;31m  \\`d\$\$'     ,\$P\"'   .    \$\$\$          ║\033[1;37m           Time\033[1;31m: \033[1;37m`date`
\033[1;31m   \$\$P      d\$'     ,    \$\$P          ║\033[1;37m            CPU\033[1;31m: \033[1;37m`cat /proc/cpuinfo | grep "model name" | cut -d ' ' -f3- | awk {'print $1,$2,$3,$4,$5,$6,$7,$8,$9,$10'} | head -1`
\033[1;31m   \$\$:      \$\$.   -    ,d\$\$'          ║\033[1;37m         Memory\033[1;31m: \033[1;37m`free -t -m | grep "Mem" | awk {'print $4'}`MB Available, `free -t -m | grep "Mem" | awk {'print $3'}`MB Used, `free -t -m | grep "Mem" | awk {'print $2'}`MB Total
\033[1;31m   \$\$;      Y\$b._   _,d\$P'            ║\033[1;37m      HDD Usage\033[1;31m: \033[1;37m`df -T $HOME | awk '{ SUM += $3} END { printf("%.2f\n", SUM/1024/1024) }'`GB Available, `df -T $HOME | awk '{ SUM += $4} END { printf("%.2f\n", SUM/1024/1024) }'`GB Used, `df -T $HOME | awk '{ SUM += $5} END { printf("%.2f\n", SUM/1024/1024) }'`GB Total
\033[1;31m   Y\$\$.    \\`.\\`\"Y\$\$\$\$P\"'               ╠═════════════════════════[\033[1;37mUser Data\033[1;31m]═══════════════════════════════════════
\033[1;31m   \\`\$\$b      \"-.__                    ║\033[1;37m       Username\033[1;31m: \033[1;37m`whoami`
\033[1;31m    \\`Y\$\$b                             ║\033[1;37m      Usergroup\033[1;31m: \033[1;37m$USERGROUP
\033[1;31m     \\`Y\$\$.                            ║\033[1;37m     Last Login\033[1;31m: \033[1;37m`last -a $USER | head -2 | awk 'NR==2{print $3,$4,$5,$6}'` from `last -a $USER | head -2 | awk 'NR==2{print $10}'`
\033[1;31m       \\`\$\$b.                          ║\033[1;37m       Sessions\033[1;31m: \033[1;37m`who | grep $USER | wc -l`
\033[1;31m         \\`Y\$\$b.                       ║\033[1;37m      Processes\033[1;31m: \033[1;37m$PROCCOUNT of `ulimit -u` max
\033[1;31m           \\`\"Y\$b._                    ║\033[1;37m        Screens\033[1;31m: \033[1;37m`screen -ls | sed ':a;N;$!ba;s/\\n/ /g'`
\033[1;31m               \\`\"\"\"\"                  ╠═════════════════════════[\033[1;37mHelpful info\033[1;31m]════════════════════════════════════
\033[1;31m                                      ║\033[1;37m Administrators\033[1;31m: \033[1;37m$ADMINSLIST
\033[1;31m                                      ╚═══════════════════════════════════════════════════════════════════════════\e[0m
"

Comment régler les problèmes de connexions refusées sur ps.outlook.com.

Lorsque vous tentez de vous connecter à la console Exchange d’Office 365 en utilisant PowerShell et que vous recevez le message suivant :

New-PSSession : [ps.outlook.com] La connexion au serveur distant ps.outlook.com a échoué avec le message d’erreur suivant: […] Access Denied […].

Office 365 PowerShell Access Denied -2144108477

Assurez-vous d’abord que les informations de connexion sont valides. Si le problème persiste, il est possible que votre utilisateur n’ait pas l’autorisation pour gérer l’organisation; voici comment y remédier.

  1. Ouvrez le portail web d’administration d’Office 365.
    1. https://portal.office.com/
  2. Accédez à l’administration d’Exchange.
  3. Ouvrez l’onglet des autorisations.
  4. Modifier les autorisations pour Organisation Management.
  5. Ajouter l’adresse courriel utilisée pour vous connecter à Office 365 avec PowerShell dans la section Membres.
  6. Enregistrer les changements.

Voilà! Vous devriez pouvoir vous connecter à Office 365 en utilisant PowerShell.

Manuel d’utilisation du multimètre Autoranging 052-0052-2

Je cherchais le manuel d’utilisation de mon multimètre Mastercraft Autoranging 052-0052-2. Puisqu’il m’a fallu une quinzaine de minutes à le trouver, je me suis dit que je pourrais le mettre en ligne au format PDF.

Télécharger le guide utilisateur 52-0052EN

Note : Ce guide est pour la version 1 (j’ai la version 2), je dois donc remplacer les 10A par 20A dans le guide.