Raspberry Pi : créer un serveur de musique avec mpd

Raspberry Pi : créer un serveur de musique avec mpd

J’ai de la musique digitalisée sur un disque dur. Je voudrais la partager dans toute la maison sans avoir à laisser un PC gourmand en route 24/24. Je crée donc un serveur de musique sur un Raspberry Pi disposant d’un disque dur externe. J’utilise mpd comme serveur.

Note du 11/1/2018 : ce serveur ne me plaisait pas vraiment car je ne trouvais pas d’application Android vraiment agréable pour le gérer. Et je ne voyais pas comment l’utiliser pour gérer des listes de lecture et des destinations différentes. J’ai donc repris le collier sur le sujet. J’ai créé d’autres articles de la série pour créer un serveur bien mieux, avec mini DLNA et UPnP.

Dernière MAJ : 11 janvier 2018

Comment fonctionne un serveur de musique ?

J’ai eu beaucoup de mal à comprendre quoi choisir…

Je me suis refusée à prendre des systèmes qui arrivent avec la distribution, je voulais apprendre quelque chose en installant un serveur par dessus une distribution Raspbian classique (Jessie Lite dans mon cas).

Lorsqu’on a de la musique sur un disque dur, il nous faut trois éléments pour pouvoir l’entendre quelque part :

  1. un serveur de musique, qui gère les fichiers, les indexe et les met à disposition ;
  2. un client, qui agit sur le serveur pour lui dire quoi jouer, créer des « playlists », lui dire où émettre les sons générés par la playlist.
  3. un « renderer » (je ne vois pas comment traduire ça), qui restitue la musique dans des haut-parleurs.

mpd tient lieu de serveur. Sur le même pi, on place un client (mpc) avec lequel on peut intéragir en ligne de commande. Et si on connecte le Pi contenant mpd à des haut-parleurs (ou à un ampli), c’est mpd qui assure la fonction de « renderer ».

Si je veux jouer de la musique à partir du même disque dur dans d’autres endroits, j’ai deux possibilités :

  1. lire le flux audio du premier Pi et le jouer sur l’équipement qui le lit. Par exemple, je peux l’écouter sur une tablette équipée de MPdroid, qui va tenir lieu de client, mais qui va aussi servir de renderer pour un éventuel flux audio.
  2. installer d’autres Pi équipés de mpd. Dans ce cas, il semblerait (je n’ai pas encore essayé) qu’il faut installer icecast sur le premier Pi et c’est icecast qui se charge de transmettre les fichiers au deuxième Pi.

Préparer le Raspberry Pi

J’utilise un Raspberry Pi B+, avec un dongle wifi Edimax EW-7811Un. Pour le préparer, suivre ces trois autres articles de ce site :

J’ai donc un Pi correctement installé, avec un disque dur externe monté sur le répertoire /media/iomega et partagé par samba.

Note du 2/1/2018 : je l’ai aussi fait sur un Pi 3 sans souci

Installer mpd

J’ai principalement utilisé les sources suivantes :

Installer le serveur mpd, le client mpc et le gestionnaire de son alsa-utils.

apt-get install mpd mc alsa-utils

Installer les codecs qui pourraient être utiles :

apt-get install lame flac faad vorbis-tools

Vérifier que le son sort du Raspberry Pi

brancher des haut-parleurs dans la prise jack audio du Pi. On utilise la carte audio (plutôt mauvaise sur le Pi version 1).

Selon cet article, en anglais, on teste un son comme ça :

aplay /usr/share/sounds/alsa/Front_Right.wav

Si aucun son ne sort, on vérifie que le driver audio Broadcom est bien présent

lsmod | grep snd_bcm2835

S’il y a quelque chose qui s’affiche, c’est bon. Sinon, il faut charger le driver avec

modprobe snd_bcm2835

Si la commande s’éxécute sans message d’erreur c’est que c’est bon.

Mais aucune des deux commandes suivantes ne produit de son dans mes hauts parleurs

speaker-test -t sine -f 440 -c 2 -s 2
aplay /usr/share/sounds/alsa/Front_Center.wav

Je force donc l’utilisation de la sortie analogique dans laquelle les haut-parleurs sont connectés. Sinon c’est la sortie HDMI qui est utilisée par défaut.

amixer cset numid=3 1

Je n’entend toujours rien. Je monte le volume des haut-parleurs et là c’est bon.

configurer mpd

Pour bien comprendre le contenu du fichier de configuration, voir The Music Player Daemon – User’s Manual.

mpd a en principe créé un utilisateur ‘mpd’, qui appartient au groupe ‘audio’.

Modifier la configuration de samba

Les utilisateurs du groupe ‘audio’ doivent pouvoir lire les contenus de /media/iomega/MULTIMEDIA/musique et écrire dans /media/iomega/MULTIMEDIA/mpd.

Dans etc/smb.conf etc/samba/smb.conf (modifié le 2/1/2018)

valid users = @users, @audio  #utilisateurs ayant le droit de lire = de groupes @group
read only = yes
write list = @users, @audio   # utilisateurs ayant droit d’écrire
browseable = yes
public = yes

Je pense que ça ne sert à rien de régler valid users  et write list  puisque j’ai défini public=yes .

Modifier la configuration de mpd

éditer /etc/mpd.conf pour que :

music_directory		"/media/iomega/MULTIMEDIA/musique"
playlist_directory	"/media/iomega/MULTIMEDIA/musique/mpd"
db_file			"/media/iomega/MULTIMEDIA/musique/mpd/mpd.db"
user			« mpd »
#group               	"audio"
auto_update     	"yes"

volume_normalization    "yes"

bind_to_address          "192.168.1.102"
port			 "6600"

audio_output {
	type		"alsa"
	name		"Ampli salon"
#	device		"hw:0,0"	# optional
#	mixer_type      "hardware"      # optional
#	mixer_device	"default"	# optional
#	mixer_control	"PCM"		# optional
#	mixer_index	"0"		# optional
}

auto_update permet une mise à jour automatique de la base de données lorsque les fichiers sont modifiés.

Le réglage de la sortie audio de type « alsa » est identique à la configuration par défaut. La seule différence est le nom de cette sortie (« ampli salon »), qui permet d’identifier les sorties dans les clients.

Note : Si j’utilisais une carte son usb, il faudrait changer la ligne device             « hw:0,0 » , probablement en mettant « hw:1,0 ».

Pour savoir quels sont les numéros de cartes audio, taper :

cat /proc/asound/modules

Ça dit quelque chose comme :

0 snd_bcm2835
1 snd_sub_audio

La carte audio du Pi (driver snd_bcm2835) est numérotée 0. La carte USB (ici driver snd_sub_audio) est n°1.

On peut le vérifier en connectant la carte USB aux haut-parleurs puis en tapant :

aplay -D plughw:1,0 /usr/share/sounds/alsa/Front_Right.wav

Si le volume est suffisant (assez élevé), on entend une voix qui dit « front » puis « right ».

Ca fonctionne avec une carte audio à 2.82 € pièce (livraison gratuite si au moins 3 achetées) achetée sur ce site chinois.

J’ai par erreur laissé le # devant group. Cette instruction n’est donc pas utilisée. Ca n’a pas gêné, sans doute car j’avais réglé le disque comme public avec samba.

Créer les répertoires, fichiers et droits d’accès nécessaires

Créer tous les répertoires ou fichiers listés dans etc/mpd.conf et qui n’existent pas. Ensuite, j’ai placé mon utilisateur windows (alwindows) dans le groupe audio, et l’utilisateur mpd dans le groupe users mais je ne suis pas certaine que ça soit indispensable.

adduser mpd users
adduser mpd audio
adduser alwindows audio

Régler les droits d’accès et les propriétaires de tout ce qui se trouve dans les répertoires utilisés par mpd et définis dans mpd.conf :

chown -R mpd:audio /media/iomega/MULTIMEDIA
chmod -R g+rwx /media/iomega/MULTIMEDIA

chown -R mpd:audio /var/log/mpd
chmod -R g+rwx /var/log/mpd

chown -R mpd:audio /run/mpd
chmod -R g+rwx /run/mpd

chown -R mpd:audio /var/lib/mpd
chmod -R g+rwx /var/lib/mpd

Redémarrer samba :

service smbd restart

lancer mpd

mpd

Si bug « « socket: Failed to bind to ‘192.168.1.102:6600’: Address already in use » arrêter mpd avec :

service mpd stop

Puis le redémarrer avec

mpd --no-daemon --stdout --verbose

On voit la base de données qui se met à jour. Ca défile de 19h45 à 19h53 pour 65 Go de musique.

En cas de problème, il peut être utile de lire le log /var/log/mpd/mpd.log

Normalement, pour lancer mpd comme un service, on tape :

/etc/init.d/mpd start

tester avec MPdroid

MAJ : MPdroid fonctionne correctement mais son interface utilisateur est vraiment compliquée. J’ai installé M.A.L.P. – MPD Client, et c’est plus simple à utiliser.

Il suffit de renseigner l’adresse du serveur (192.168.1.102) et du port (6600) et le client se lance sur une tablette android.

Ca fonctionne : de ma tablette je déclenche de la musique.

Ecouter des radios web avec mpd

Je me suis inspirée de Un serveur musical avec MPD et Installation de MPD sur un raspberry pi !.

Dans le répertoire déclaré en tant que « playlist_directory » lors de la configuration de mpd (« /media/iomega/MULTIMEDIA/musique/mpd »), créer un fichier radios.m3u , dans lequel on place les url des radios sous la forme :

#EXTM3U
#EXTINF:-1,Country
http://streaming.radionomy.com/NashvilleEdge

Les sites European radios  et flux Radio liste les adresses de streaming des radios.

Ensuite, régler le propriétaire et les droits d’accès de ce fichier :

chown -R mpd:audio /media/iomega/MULTIMEDIA/musique/mpd/radios.m3u
chmod -R g+rwx /media/iomega/MULTIMEDIA/musique/mpd/radios.m3u

Réglages et création d’un flux audio

Imaginons que j’aime bien la musique qui se joue dans le salon et que j’ai envie de l’écouter dans mon bureau. Dans ce cas, il me suffit d’écouter le flux audio issu du salon. Mpd peut être configuré pour générer un flux audio qu’on peut écouter avec un navigateur internet ou autre lecteur de musique capable de lire un flux internet. On peut même créer une radio web diffusée à l’extérieur. Mais bon, ce n’est pas ce que je veux faire !

Pour générer un flux audio, éditer etc/mpd.conf et régler le « audio_output » de type « httpd » :

audio_output {
	type		"httpd"
	name		"flux httpd"
	encoder		"lame"			# optional, vorbis or lame
	port		"8000"
	bind_to_address "192.168.1.102"   		# optional, IPv4 or IPv6
	quality		"5.0"			# do not define if bitrate is defined
#	bitrate		"128"			# do not define if quality is defined
	format		"44100:16:1"
	max_clients "0"         # optional 0=no limit
}

redémarrer mpd avec service mpd restart .

Pour accéder au flux ainsi défini, on tape l’adresse suivante dans un navigateur (ou un lecteur capable de lire un flux réseau) :

  • http://192.168.1.102:8000/mpd.mp3 si on a réglé l’encodeur sur « lame »
  • http://192.168.1.102:8000/mpd.ogg si on a réglé l’encodeur sur « vorbis »

Mais cette adresse ne fonctionne que si l’on a lancé la génération d’un flux de streaming avec un client. J’ai utilisé Chimney, disponible gratuitement sur le « store » Windows 10 :

  • lancer la lecture de quelque chose ;
  • dans l’onglet général, cocher « stream to desktop » ;
  • dans l’onglet output, cochés les outputs « ampli salon » et « flux httpd » (ce sont les noms que j’ai défini dans mpd.conf) ;
  • dans l’onglet streaming, rien à faire si on n’a pas modifié le port par défaut (8000).

Ensuite, je peux ouvrir le flux audio, dans VLC ou un navigateur internet.

Utilisation de MPdroid

MPdroid est un client android pour mpd.

MAJ : MPdroid fonctionne correctement mais son interface utilisateur est vraiment compliquée. J’ai installé M.A.L.P. – MPD Client, et c’est plus simple à utiliser.

Une fois que le client est installé, il suffit de renseigner les éléments suivants :

  • Hôte : 192.168.1.102
  • Port : 6600
  • Hôte streaming : 192.168.1.102
  • Port streaming : 8000
  • Mot de passe : rien
  • Suffixe url streaming : mpd.mp3
  • Notification persistante : pas coché

Utilisation de VLC (sur PC) pour lire le flux audio

Pour créer un lien rapide vers le flux, on ouvre le flux une première fois à la main, en indiquant http://192.168.1.102:8000/mpd.mp3 dans Média / ouvrir un flux réseau. On lance la lecture.

Ensuite, dans Média / Enregistrer la liste de lecture, on enregistre, par exemple sous le nom salon-stream.xspf  .

Celà crée un fichier (que l’on peut éditer avec notepad++ par exemple) :

<?xml version="1.0" encoding="UTF-8"?>
<playlist xmlns="http://xspf.org/ns/0/" xmlns:vlc="http://www.videolan.org/vlc/playlist/ns/0/" version="1">
	<title>Liste de lecture</title>
	<trackList>
		<track>
			<location>http://192.168.1.102:8000/mpd.mp3</location>
			<title>flux httpd</title>
			<extension application="http://www.videolan.org/vlc/playlist/0">
				<vlc:id>2</vlc:id>
				<vlc:option>network-caching=1000</vlc:option>
			</extension>
		</track>
	</trackList>
	<extension application="http://www.videolan.org/vlc/playlist/0">
			<vlc:item tid="0"/>
	</extension>
</playlist>

Et voilà, un simple clic et j’accède au flux audio sur mon ordinateur Windows.

Et maintenant ?

Je peux explorer l’intérêt de disposer d’UPnP comme expliqué dans cet article de « lesbonscomptes.com » ou avec un media player spécifique tel que proposé ici sur GitHub.

Il faut aussi que je trouve un client sous Windows 10 plus agréable que Chimney.

Monter un disque dur externe partagé sur un Raspberry Pi

Monter un disque dur externe partagé sur un Raspberry Pi

Je veux disposer d’un disque dur accessible en permanence dans la maison. Mais je ne souhaite pas le connecter à un PC à cause de la consommation d’énergie d’un tel appareil. Je vais donc le connecter à un Raspberry Pi qui pourra rester allumer en permanence et mettre les fichiers à disposition.

31/08/2022 : Je viens de mettre en service un Raspberry Pi 3B et le contenu de cet article est toujours d’actualité. J’ai juste apporté quelques précisions. 

Préparer le Raspberry Pi

J’ai utilisé un Raspberry Pi 3B, avec un dongle wifi Edimax EW-7811Un.

J’ai installé l’OS Raspberry  Lite en 64 bits  (version de fin août 2022) selon la méthode décrite dans Mise en service d’un Raspberry Pi.

Mettre le Pi à jour

Exécuter

apt update

apt upgrade

Connecter un disque dur ou une clé USB

J’ai connecté une clé USB de 32 Go.

Un disque dur doit avoir une alimentation externe. Le Pi ne pourra pas lui fournir assez d’énergie. Le disque est donc connecté d’une part à une source d’énergie, d’autre part à un port USB du Raspberry Pi pour l’échange de données.

On peut connecter le disque au Pi sans manipulations préalables. Mais ensuite il faut faire des réglages pour accéder au disque et le partager avec d’autres équipements du réseau local.

Pour ce qui suit, je me suis inspirée principalement des articles suivants :

identifier le type de disque dur

Pour savoir quel type de disque dur on a, on tape :

blkid

Le Pi nous répond avec la liste des unités de stockage qu’il a identifié. Pour moi, il y a les 3 partitions de la carte SD du Pi et le disque dur IOMEGA_HDD que je viens de connecter :

blkid-pour identifier un disque dur externe

J’apprends ainsi que le disque est monté comme sda1 et qu’il est de type NTFS (le système de fichiers).

Comme le disque utilise le système NTFS, j’installe les drivers correspondants sur le Pi :

apt-get install ntfs-3g

Monter le disque de manière permanente

Si je décide de connecter un autre disque dur, ou une clé USB, le disque Iomega pourrait devenir sda2 et je ne saurai plus comment y accéder. Il faut donc lui donner une « adresse » permanente.

On crée un répertoire sur lequel on va monter le disque dur :

mkdir /media/iomega

Evidemment on peut appeler le répertoire comme on veut, la seule contrainte est que ce soit un sous-répertoire de /media .

Il faut pouvoir donner l’accès à ce répertoire. Dans mon cas, c’est à l’utilisateur al que je veut donner l’accès. Pour savoir quel est l’identifiant de l’utilisateur (-u ) al et du groupe (-g )correspondant, je tape :

id -u al
id -g al

La réponse est 1001 pour les deux. Je sais donc que ‘group id’ est 1001 et ‘user id’ est 1001. Pour donner la propriété d’un répertoire au fichier, on définit d’abord l’utilisateur, ensuite le groupe ([utilisateur]:[groupe] ) :

chown 1001:1001 /media/iomega

Pour monter le disque dur de manière permanente sur /media/iomega :

mount -t ntfs-3g -o uid=1001,gid=1001 /dev/sda1 /media/iomega

Si le disque était en FAT32, j’aurais utilisé -t vfat  à la place de -t ntfs-3g .

02/01/2018 : En entrant cette commande j’ai eu une erreur « Mount is denied because the NTFS volume is already exclusively opened.« . J’ai simplement déconnecté le disque avec la commande umount /dev/sda1  puis exécuté de nouveau la commande précédente.

A partir de maintenant, si je veux déconnecter le disque dur, j’utilise la commande :

umount /media/iomega

Dans /etc/fstab , j’ajoute la ligne suivante :

/dev/sda1     /media/iomega   ntfs   nofail,uid=1001,gid=1001   0       0

Noter la règle nofail , qui permet d’éviter que le Pi ne bloque au démarrage si le disque dur n’est pas connecté ou pas prêt. On vérifie que tout va bien avec mount –a . S’il n’y a pas d’erreur, pas de souci.

Enfin, j’ajuste les paramètres de démarrage du Pi pour laisser le temps au disque dur de démarrer et d’être monté.

On édite /boot/cmdline.txt  et on ajoute rootdelay=5  à la fin de l’unique ligne qu’il contient :

dwc_otg.lpm_enable=0 console=serial0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait rootdelay=5

Je redémarre le Raspberry Pi et je vérifie que tout va bien en allant regarder le contenu de /media/iomega.

A ce stade, je fais une copie de la carte SD.

Accès au disque par Filezilla

A ce stade je peux transférer des fichiers dans la clé USB en utilisant Filezilla pour un accès FTP.

Partager le disque dur avec Samba

Pour cette phase, j’ai suivi les instructions de ces deux sites :

Samba a été installé lors de la mise en service du Pi. Il ne reste plus qu’à le configurer pour partager le disque dur externe. Il vaut mieux créer une copie du fichier de configuration avant de le modifier :

cp /etc/samba/smb.conf /etc/samba/smb.old

On édite ensuite /etc/samba/smb.conf  et on y ajoute tout à la fin :

[MUSIC]
comment = Musique AL
path = /media/iomega
valid users = @users
force group = users
create mask = 0660
directory mask = 0771
read only = no
browseable = yes
public = yes

Je ne suis pas très sûre des raisons d’être de la plupart des lignes. Mais valid users  définit que tous les utilisateurs du groupe users auront droit d’accès.

On redémarre samba pour utiliser les nouveaux paramètres :

service smbd restart

Accéder au disque de l’extérieur

Avec certaines versions de Windows, je peux maintenant voir le disque Iomega dans l’explorateur de fichiers, sous « réseau ». Avec d’autres versions (Windows 10 en particulier), il faudra que je crée une « connexion réseau ». Mais dans tous les cas Windows me demandera un nom d’utilisateur et un mot de passe…

créer un nom d’utilisateur Samba

Sur le Pi, j’ajoute un utilisateur ‘alwindows’ qui fera partie du groupe users, que j’ai précédemment défini comme pouvant accéder au disque (dans smb.conf).

useradd alwindows -m -G users

Je crée un mot de passe samba pour cet utilisateur. Le Pi me demande de l’entrer deux fois :

smbpasswd -a alwindows

Je redémarre samba.

service smbd restart

Sous Windows 10, créer un lecteur réseau

Dans l’ordinateur Windows si je vois le disque dur sous « Réseau », je clique dessus et je met cet utilisateur et le mot de passe.

Le disque dur du Raspberry Pi vu dans l'explorateur Windows

Sous Windows 10 (et dans d’autres cas si mes souvenirs sont bons), il faut créer un lecteur réseau.

Dans l’explorateur de fichier, cliquer à droite sur « Ce PC » et choisir « connecter un lecteur réseau » :

Créer un lecteur réseau sous WIndows 10 - étape 1

Indiquer la localisation du lecteur : \\NomDuPi\NomDuDisqueDansSamba :

Créer un lecteur réseau sous WIndows 10 - étape 2

Entrer le nom d’utilisateur Samba et le mot de passe précédemment défini :

Créer un lecteur réseau sous WIndows 10 - étape 3

J’ai maintenant accès au disque dur géré par le Raspberry Pi sous « Ce PC »

Créer un lecteur réseau sous WIndows 10 - et voilà !

Et voilà. Les fichiers de ce disque sont accessibles 24h sur 24 sans laisser un ordinateur énergivore en fonctionnement !

Une application android pour afficher une page web d’un Raspberry Pi

Une application android pour afficher une page web d’un Raspberry Pi

J’ai un Raspberry Pi réglé en tant que serveur web et qui gère motion, un programme pour configurer et diffuser des flux vidéos. L’un de ces flux vidéos provient d’une vieille tablette android, dont la caméra avant a été transformée en caméra IP (article ici). Ce que je veux maintenant c’est que la tablette, qui sera fixée au mur dans un couloir, affiche en permanence le contenu d’une page web qui montre entre autres les flux vidéos capturés. J’ai donc créé une application android pour la tablette, avec App Inventor.

Je considère ici que le lecteur connaît le fonctionnement d’App Inventor. Si ce n’est pas le cas, cette page en anglais donne les bases.

Document et fichiers de l’application mis à jour le 19/7/2016 pour permettre à l’utilisateur de définir l’url à afficher. Voir paragraphe « la version 3 ».

L’application avec App Inventor

Pour afficher une page web avec une application App Inventor, on a deux solutions possibles :

  1. avec un « web viewer » ;
  2. avec « activity starter », qui démarre alors le navigateur web de l’appareil ;

Et il faut interdire l’écran d’économie d’énergie

Comme la tablette sera constamment branchée, je préfère qu’elle soit toujours visible plutôt que d’avoir à la « tapoter » à chaque fois.

J’ai donc adopté l’astuce issue de cette source, pour garder l’écran allumé en permanence. Une horloge déclenche toutes les x secondes (TimerInterval) une notification d’alerte. Comme l’alerte a été réglé pour que sa couleur de fond et son texte soient transparents, on ne voit pas qu’elle apparaît et elle empêche l’écran de s’éteindre. C’est la partie when Clock1.Timer  des blocs qui suivent.

Solution 1 avec webviewer

En mode « designer » :

  • screen1 est en sizing  « fixed », ScreenOrientation  en « sensor » ;
  • Dans les « non visible components », on trouve trois composants :
    • webviewer, qui visualise une page web ;
    • notifier1 réglé avec BackgroundColor  et TextColor  sur « none » ;
    • clock1 avec TimerAlwaysFires  et TimerEnabled  cochés, TimerInterval  sur 5000 (ce sont des millisecondes en principe, donc ici 5 secondes)

En mode « blocks » :

Application android App Inventor pour une page web d'un Raspberry Pi

Voici le fichier en .aia utilisable sur MIT App Inventor (à renommer en .aia au lieu de .zip) : raspberry_pi_dashboard_webviewer

Et voici l’affichage qui en résulte (malgré les règles de style responsive…), en mode portrait puis paysage :

Solution 2 avec « Activity Starter »

En mode « designer » :

  • screen1 est en sizing  « fixed », ScreenOrientation  en « sensor » et contient un « label » et un bouton ;
  • Dans les « non visible components », on trouve trois composants :
    • activityStarter, dont la propriété action  est « android.intent.action.VIEW » et la propriété DataUri  est « http://192.168.1.30/ » ;
    • notifier1 réglé avec BackgroundColor  et TextColor  sur « none » ;
    • clock1 avec TimerAlwaysFires  et TimerEnabled  cochés, TimerInterval  sur 5000 (ce sont des millisecondes en principe, donc ici 5 secondes)

En mode « blocks » :

Application android App Inventor avec ActivityStarter

Voici le fichier en .aia utilisable sur MIT App Inventor (à renommer en .aia au lieu de .zip) : raspberry_pi_dashboard_activity_starter

Et voici l’affichage qui en résulte. On voit que c’est nettement mieux adapté car les caractéristiques responsive de ma page sont correctement respectées :

La version 3

L'interface utilisateur Je me suis rendu compte que ce n’était pas très pratique : si l’adresse du tableau de bord change, je suis obligée d’aller changer un bloc dans appinventor puis de reconstruire l’application avant de l’installer sur la tablette destinataire. J’ai donc réalisé une version 3, dans laquelle l’utilisateur décide lui-même quelle sera l’adresse de la page à ouvrir.

J’ai mis l’adresse actuelle de mon tableau de bord par défaut (192.168.1.103) mais l’utilisateur peut maintenant en changer sans difficulté. On peut même taper ‘google.com’ et accéder ainsi à la page http://google.com.

L’interface utilisateur (photo à droite) est très simple : lorsqu’on ouvre l’application, on voit écrit une suggestion d’adresse, qui est aussi l’adresse par défaut. L’utilisateur tape ce qu’il veut et clique sur le bouton « voir le dashboard ». L’application vérifie que cette adresse est valide (dans la photo c’est en cours) puis ouvre l’adresse dans un navigateur. Tant que l’application est active, l’écran ne se met jamais en veille.

Par contre, si on se trompe d’adresse locale, il n’y a pas d’erreur de type 404 qui est renvoyée et l’application cherche éternellement. L’utilisateur peut cependant indiquer une nouvelle adresse dans le champs prévu et relancer avec le bouton « voir le dashboard ». C’est irritant mais pas bloquant…

Pour mettre au point le système de vérification, je me suis inspirée de Check Internet Connection In App Inventor.

L’interface de cette application avec appinventor2 (mode designer)

Vue "designer" App Inventor 2
Le composant « notifier » est réglé sur fond transparent et texte transparent pour être invisible.

Les blocs de programmation avec appinventor 2 (mode blocks)

Vue "blocks" App Inventor 2

Les fichiers résultat

la version .aia utilisable sur MIT App Inventorrenommer en .aia au lieu de .zip) : raspberry_pi_dashboard_V3 (zip / aia)

Fichier Version 3 : Application android (apk)

Et maintenant

J’ai appris que seule la solution 2, avec « activity starter » permet de visualiser correctement une page web dans une application android, en respectant les règles de style.

Voici un fichier zip qui contient la page index.php servie par le Raspberry Pi, la feuille de style associée : index-Pi (zip)

Et voici l’application (apk) téléchargeable sur une tablette (mais attention elle ne fonctionnera que pour lire une page index.html ou index.php située à l’adresse 192.168.1.30) : Application android (apk)

Ma vieille tablette samsung est maintenant transformée en caméra IP (cf cet autre article) et affiche en permanence une page web qui contient le flux vidéo de la tablette elle même (mais servie par un raspberry Pi) et d’une autre caméra. C’est chouette, non ?

Raspberry Pi : connexion internet en wifi et/ou IP fixe

Raspberry Pi : connexion internet en wifi et/ou IP fixe

Cet article a été créé le 4 juillet 2016 et mis à jour périodiquement. La dernière version date du 22 avril 2020.

Les distributions Jessie (ou Jessie Lite) du Raspberry Pi sont réglées par défaut en DHCP avec connexion par cable ethernet. Il peut être utile de créer une connexion wifi ou d’imposer une adresse IP fixe. Voyons comment faire ces réglages.

Note du 22/04/2020 : Document mis à jour pour la version Buster de Raspbian et un Pi 3 (équipé de wifi directement sur le Pi, sans dongle)

Régler la connexion ethernet en IP fixe

Selon « Comment configurer une adresse IP statique sur Raspbian Stretch« 

ls /sys/class/net/  m’indique :

eth0  lo  wlan0

ifconfig  m’indique que seule la connexion eth0 dispose d’une adresse IP. Dans mon cas la connexion wifi (wlan0) n’est pas activée.

Editer /etc/dhcpcd.conf .

Copier les lignes suivantes tout à la fin du fichier :

# Example static IP configuration:
#interface eth0
#static ip_address=192.168.0.10/24
#static ip6_address=fd51:42f8:caae:d92e::ff/64
#static routers=192.168.0.1
#static domain_name_servers=192.168.0.1 8.8.8.8 fd51:42f8:caae:d92e::1

Ensuite modifier ce qui a été collé comme suit :

# IP statique AL :
interface eth0
static ip_address=192.168.1.102/24
static routers=192.168.1.1
static domain_name_servers=192.168.1.1 8.8.8.8

Ou static routers et static domain name servers contient l’adresse du routeur local (ou de la box) et static ip address contient l’adresse IP que l’on souhaite attribuer à notre Pi.

Redémarrer le Pi.

Sur mon routeur, je vois que le Pi a maintenant l’adresse 198.168.1.102.

Régler le wifi (Raspberry Pi 3 sous Stretch)

Voir « Setting wifi up via the command line« .

Il faut indiquer un mot de passe crypté. Par exemple si notre réseau a les caractéristiques suivantes (visibles en éditant wpa_supplicant.conf)  dans le répertoire /etc/wpa_supplicant/ :

network={
	ssid="mon-reseau2"
	psk="password2"
	id_str="home 1"
	priority=2
}

Dans la ligne de commande, on tape wpa_passphrase mon-reseau2 password2.
On obtient en retour :

network={ 
	ssid="mon-reseau2" 
	#psk="password2" 
	psk=261066f1ec7164401fbae41235107dc66eaad93ed991abcf 
}

Il nous suffit de copier le mot de passe encodé à la place du mot de passe en clair.

Archives (pour mémoire)

Tout ce qui suit était valable en novembre 2016. Je le conserve pour mémoire.

Connecter un dongle wifi

A ce stade, le Pi est connecté à notre réseau local par un cable ethernet. il dispose aussi d’un dongle Wifi de bonne qualité (genre Edimax EW-7811Un ou le dongle « officiel » vendu depuis peu pour le Raspberry Pi). C’est important d’avoir déjà le dongle wifi pour que wicd-curses l’identifie dès son installation.

Attention aux versions de Raspbian ...

Pour connaître votre version de Linux, taper uname -a en ligne de commande.

J’ai eu beaucoup de difficultés car j’ai installé le wifi en IP fixe sur un premier Raspberry B+ en utilisant la méthode avec wicd-curses décrite plus bas.

Quelques semaines plus tard, j’ai voulu réitérer sur un deuxième Raspberry Pi B+, avec le même dongle wifi. Et ça n’a pas fonctionné. J’y ai passé des heures sans jamais trouver avant de me résoudre à utiliser une autre méthode, sans wicd-curses.

Cet article présente donc deux méthodes :

  • méthode 1, sans wicd-curses : elle fonctionne avec une version plus récente de Jessie (Linux 4.4.14+ #896 Sat Jul 2 14:16:46 BST 2016 armv6l GNU/Linux .
  • méthode 2, avec wicd-curses : elle fonctionne avec Linux 4.4.13+ #893 Wed Jun 8 14:34:50 BST 2016 armv6l GNU/Linux, un peu plus ancienne.

Méthode 1 : sans wicd-curses

Le wifi ne fonctionne pas au départ sur le Pi. J’ai fini par me rendre compte qu’il fonctionnait, mais avec une adresse IPv6… La solution a été d’identifier le problème puis d’obliger le wifi à prendre une adresse IPv4.

La commande ifconfig wlan0  produit entre autres la ligne inet6 addr: fe80::52c6:c538:7c8:640c/64 . C’est une adresse IPv6…

Pour comparer, on peut taper  ifconfig eth0 , qui nous donne les mêmes informations pour la liaison ethernet. La même ligne devient inet addr:192.168.1.8  Bcast:192.168.1.255  Mask:255.255.255.0 , qui est bien une adresse en IPv4…

Faire fonctionner le wifi en IPv4

La solution (qui m’a paru être un miracle après plusieurs heures de recherches et d’essais infructueux) vient de cette page.

Il suffit de créer le fichier local.conf  (droits 644) dans le répertoire /etc/sysctl.d , de l’éditer et d’y placer la ligne net.ipv6.conf.all.disable_ipv6=1  (sans ; à la fin).

On redémarre le Pi et voilà, wlan0 a une adresse en IPv4 si je lui donne les coordonnées de mon réseau wifi.

Pour donner les coordonnées du réseau wifi, il suffit de suivre les instructions de cette page, sur le site officiel du Raspberry Pi : éditer /etc/wpa_supplicant/wpa_supplicant.conf  et y ajouter les informations du réseau

network={
    ssid="monReseau"
    psk="MonMotdePasse"
}

Mon Pi est maintenant accessible en wifi (lorsque j’enlève le cable ethernet).

Attribuer une IP fixe sans Wicd-curses

Fonctionne correctement avec Jessie #896 auquel j’ai fait la manip qui précède.

Editer /etc/dhcpcd.conf  et ajouter tout à la fin :

interface wlan0

static ip_address=192.168.1.102/24

static routers=192.168.1.1

static domain_name_servers=192.168.1.1 8.8.8.8

Noter que j’ai placé 8.8.8.8 dans domain_name_servers, au côté de l’adresse de mon routeur. Ca permet de connecter le Pi à des sites externes sans connaître leur adresse ip. Ainsi ping google.com  se connecte bien à google.

Dernière chose à faire : vérifier que le dongle wifi ne va pas s’éteindre pour économiser l’énergie ! Pour celà, utiliser la commande iwconfig . On voit ainsi tous les paramètres du wifi :

  • Power Management:off signifie que la clé wifi ne s’éteindra pas lorsqu’elle n’est pas utilisée. Ouf, pas besoin de régler autrement !

interdire au wifi de s’éteindre

Bien que Power Management ait semblé correctement réglé, le wifi se déconnectait et ne se remettait en service qu’en redémarrant le Pi ou en y connectant un cable ethernet.

J’ai trouvé la solution ici. Il faut configurer le driver de la clé (un dongle Edimax EW-7811Un 802.11b/g/n, mais ça semble être une méthode utilisable pour d’autres dongles).

Créer un fichier /etc/modprobe.d/8192cu.conf  et y placer les deux lignes suivantes :

# Disable power management
options 8192cu rtw_power_mgnt=0 rtw_enusbss=0

Cette ligne interdit toute gestion de l’énergie par le dongle et interdit aussi la suspension automatique du wifi.

Redémarrer le Pi. Le problème disparaît.

Méthode 2 : avec wicd-curses

Ne fonctionne pas avec les versions de Jessie postérieures à #893 (pour savoir quelle version on a, taper uname -a en ligne de commande)

Pourquoi wicd-curses ?

C’est une solution reconnue pour éviter les déconnexions du wifi. En effet, avec wicd-curses il est simple de régler le wifi pour qu’il se reconnecte automatiquement si nécessaire, y compris après un redémarrage.

Installer wicd-curses

La bonne façon de faire pour régler une connexion wifi, c’est d’installer wicd-curses (la source en anglais est ici) ET enlever dhcpcd5 (source, en anglais). On ne doit pas éditer de fichier tels que  /etc/network/network ou /etc/wpa_supplicant/wpa_supplicant.conf . Tout peut être réalisé en ssh, sans avoir besoin de se connecter à un écran et un clavier – si on dispose d’une connexion ethernet.

Commencer par installer wicd-curses.

apt-get update
apt-get install wicd-cli wicd-curses

Durant l’installation le programme nous demande si l’on veut ajouter un utilisateur au groupe ‘netdev’. On peut ajouter notre utilisateur local (par exemple ‘pi’). Après l’installation on recharge dbus :

service dbus reload

Si une erreur s’affiche, c’est probablement que l’on a déjà installé network-manager. Dans ce cas voir la section correspondante dans ce tutoriel (en anglais).

Démarrer le démon wicd :

service wicd start

Installer rcconf puis le lancer :

apt-get install rcconf
rcconf

Décocher network manager (si il existe), wicd devrait être déjà coché.

Régler le wifi

lsusb  permet de vérifier que le dongle wifi est bien détecté.

On démarre le service wicd puis on lance wicd-curses pour configurer le réseau :

service wicd start
wicd-curses start

Pour configurer le réseau wifi, mettre en surbrillance le réseau auquel on veut se connecter et appuyer sur la touche →. Si aucun réseau wifi n’est listé, appuyer sur [SHIFT] R pour scanner le réseau wifi.

wicd-curses configuration réseau

wicd-curses configuration réseau

  • Use DHCP hostname doit être coché pour que le Pi  conserve son nom ;
  • descendre vers le bas et cocher ‘Automatically connect to this network‘
  • descendre vers le bas et taper la clé de sécurité du réseau wifi
  • Appuyer sur[F10] pour sauvegarder. On retourne à la liste des réseaux wifi, avec notre réseau surligné.
  • Appuyer sur [shift] + c (C) pour se connecter au réseau.
  • Une fois connecté (vérifier le statut en bas à gauche), appuyer sur q pour quitter.

En cas de problème lors de la connexion, aller voir le contenu de /var/log/syslog . Parfois, il suffit de faire les étapes suivantes, redémarrer le Pi et le wifi fonctionne.

On supprime dhcpcd5  :

apt-get remove dhcpcd5

On redémarre le pi (toujours connecté en ethernet, avec le dongle wifi présent) avec reboot .

  • Eteindre le Pi avec init 0 . Enlever le cable ethernet. Lorsqu’on redémarre le Pi, il fonctionne en wifi.
  • Il est possible qu’un ping au « hostname » ne fonctionne pas tout de suite car windows ne met pas à jour la carte du réseau. il faut alors faire un ping sur l’adresse ip du Pi.

Régler une adresse IP fixe (en wifi ou ethernet)

Pour un réseau wifi (c’est semblable en ethernet), on met en surbrillance sur le réseau que l’on veut paramétrer puis on appuie sur touche →.

  • Cocher ‘use static IPs ‘
  • entrer l’adresse IP fixe (vérifier qu’elle n’est pas déjà prise dans votre routeur ou votre box) – pour moi 192.168.1.30. On peut utiliser <SHIFT> Inser pour coller ce qu’on aura copié ailleurs.
  • Entrer le Masque de sous-réseau (vérifier en tapant ipconfig dans l’invite de commande windows) – pour moi, 255.255.255.0
  • Entrer la passerelle (vérifier en tapant ipconfig dans l’invite de commande windows) – pour moi, 192.168.1.1
  • Entrer google.com dans search domain  et 8.8.8.8 pour DNS1 , 8.8.4.4 dans DNS2 .
  • J’ai laissé coché « use DHCP hostname « 
  • Appuyer sur[F10] pour sauvegarder. On retourne à la liste des réseaux wifi, avec notre réseau surligné.
  • vérifier que le réseau est connecté (statut en bas à gauche), appuyer sur q pour quitter.
  • On peut vérifier que tout va bien en tapant ping google.com dans la ligne de commande (<CTRL> C pour en sortir).
  • Redémarrer le Pi avec init 0 .

Ca fonctionne. Le nautilus a une adresse IP fixe.

Et maintenant ?

J’ai appris que les tutoriels ne sont pas universels… Parfois ce qui fonctionne pour un Pi à une date donnée ne fonctionne pas quelques semaines plus tard, après quelques mises à jour du système d’exploitation.

Motion : Régler la sensibilité de détection

Motion : Régler la sensibilité de détection

Dans l’article précédent de cette série , j’indiquais que motion crée beaucoup d’images et vidéos qui ne correspondent pas à de véritables mouvements devant la caméra.

motion permet de nombreux réglages. Je l’ai choisi pour ça. En particulier, il semble efficace pour éliminer les mouvements liés au vent.

Pour comprendre les différents réglages, il faut lire attentivement cette aide (en anglais) sur les réglages de la détection de mouvement avec motion.

La situation initiale

Dans /etc/motion/motion.conf , j’ai entre autres les réglages suivants :

# Je ne comprends pas comment ça fonctionne. Valeur par défaut = EedDl 
despeckle_filter EedDl

# Ignore les changements soudains de lumière - de 0 (arrêt) à 100%.
lightswitch 0

# Smartmask est un masque auto-apprenant qui va bloquer la détection dans les endroits de l'image où il y a des mouvements fréquents, comme des branches qui bougent à cause du vent. 0 (off) à 10 rapide. 
smart_mask_speed 0

# nombre minimum de photos avec du mouvement avant détection : defaut 1 : tous mouvements détectés.
minimum_motion_frames 1

# base pour déclarer un mouvement. C'est le nombre de pixels changés après le filtrage du bruit, le masque et le "despeckle". 
threshold 1500

# réglage automatique du threshold - ne fonctionne pas 
threshold_tune off

# niveau de "bruit" pour distinguer le bruit de la caméra d'un mouvement
noise_level 32

# si on, ajustement automatique du bruit
noise_tune off

Avec ce réglage, j’obtiens (sur une journée avec du vent) beaucoup trop de faux positifs.

Les faux positifs contiennent du « bruit » la nuit, l’éclairage de la lampe à côté de la caméra, et des mouvements liés au vent :

"bruit" la nuit

« bruit » la nuit

Réglages du 1er juillet – soir

J’ai modifié le niveau de lumière qui déclenche un mouvement, le nombre d’images modifiées avant la détection de mouvement, le ‘theshold’ et le niveau de bruit.

despeckle_filter EedDl 
lightswitch 25
smart_mask_speed 5
minimum_motion_frames 3
threshold 3000
noise_level 100
noise_tune off

Nota : après chaque réglage de motion.conf, il faut redémarrer le service motion avec :

service motion restart

Le 2 juillet, de 0h à 14h (heure du réglage suivant, il n’y a eu que 24 fichiers créés ( 1 Mo) et 24 fichiers correspondent à un mouvement effectif (ma voiture qui part puis qui revient).

Mais la caméra ne détecte pas une personne qui se déplace à pied.

Réglages du 2 juillet – 11h45

Je n’ai corrigé que le « threshold ».

despeckle_filter EedDl  
lightswitch 25
smart_mask_speed 5
minimum_motion_frames 3
threshold 1500
noise_level 100
noise_tune off

Pendant la journée tout va bien : pas de fausse détection (mais le système ne détecte toujours pas une personne à pied) mais la nuit, il y a eu plein de faux positifs. Dès que le jour s’est levé, il n’y a plus de souci.

Réglages du 3 juillet – détecter une personne à pied

Pour détecter une personne à pied, j’ai modifié les paramètres suivants successivement jusqu’à ce que je déclenche une détection de mouvement :

minimum_motion_frames 1
noise_level 32
smart_mask_speed 10
motion : détection d'une personne

motion : détection d’une personne

Ce n’est qu’au dernier changement que j’ai détecté le mouvement d’une personne.

Ces paramètres détectent aussi bien une voiture qu’une personne (12h20 = OK) :

despeckle_filter EedDl  
lightswitch 25
smart_mask_speed 10
minimum_motion_frames 3
threshold 1500
noise_level 32
noise_tune off

Je laisse les paramètres suivants en l’état :

despeckle_filter EedDl  
lightswitch 25
smart_mask_speed 10
minimum_motion_frames 3
noise_tune off

et j’étudie l’impact de changements sur threshold ou noise_level :

Threshold Noise_level Détecte ?
1500 100 12h42 ne me détecte pas et fait un faux positif
3000 32 12h26 ME détecte = OK
3000 100 12h34  NON, ne me détecte pas

Les réglages suivants sont donc satisfaisants :

despeckle_filter EedDl  
lightswitch 25
smart_mask_speed 10
minimum_motion_frames 3
threshold 3000
noise_level 32
noise_tune off

Maintenant reste à faire un bilan sur environ 24h (depuis 13h le 3 juillet) :

  • détection d’une personne : Oui
  • détection d’une voiture : oui
  • faux positifs : 2 en une nuit.

Je considère donc que ces réglages sont corrects.

Autres notes :

On peut mettre motion en mode deboguage pour voir comment se passe la détection : voir cette page sur le wiki de motion.

 

une caméra IP avec une vieille tablette android ?

une caméra IP avec une vieille tablette android ?

Dans cet article de la série , nous allons transformer une vieille tablette android en caméra IP dont le flux sera suivi par un Raspberry Pi, avec motion. Nous verrons aussi comment configurer motion pour qu’il suive deux caméras.

transformer une tablette android en caméra IP

Ma tablette est une Samsung Galaxy tab 7.7 (GT-P6210) équipée d’android 4.0.4. Elle n’est plus utilisable comme tablette car sa batterie ne tient plus. Je l’ai changé mais la nouvelle batterie n’a pas duré longtemps. Je vais donc alimenter en permanence cette tablette, l’accrocher à un mur d’où elle filmera le couloir. La détection de présence sera assurée par motion, sur le Raspberry Pi qui gère déjà le flux d’une caméra IP extérieure.

J’ai essayé de mettre une version plus récente d’android sur la tablette mais je n’ai pas réussi. Je reste donc en version 4.0.4.

Pour transformer la tablette en caméra IP, c’est très simple :

  • installer (via google play) l’application gratuite IP Webcam
  • Régler l’application :
    • Main camera : front camera
    • motion and sound detection : « disable » pour tout
    • connection settings : port 8090, login/password not set
    • cloud streaming : off

Application android IP webcam : réglages

Quand les réglages sont faits, tout en bas : Service Control / start server : lance le serveur de la caméra IP.

Et voilà, maintenant si je tape « http://192.168.1.17:8090/video  » dans un navigateur, j’ai accès au flux vidéo de la tablette. Et avec « http://192.168.1.17:8090 « , je vois un écran de réglage.

Donner une adresse IP fixe à la tablette

J’ai trouvé la solution ici (en anglais).

Appuyer sur le réseau wifi auquel on est connecté puis choisir « avancé ». Si l’on règle sur IP statique au lieu de DHCP, on peut entrer l’adresse fixe (pour moi 192.168.1.202).

Selon cette page (en anglais), “Network Prefix length” correspond au « Masque de sous-réseau IP » de notre routeur. « 255.255.255.0 » est entré comme « 24 ». « 255.255.0.0 » comme « 16 ». Pour moi c’est bien 24 qui doit figurer dans cette case.

Tablette android : mettre en IP fixe

On vérifie : « http://192.168.1.202:8090/video  » permet bien de visualiser le flux vidéo de notre tablette.

NOTA : pour que le flux vidéo ait la bonne adresse, il faut redémarrer la tablette une fois.

Réglage de motion sur le Raspberry Pi pour gérer deux caméras

La configuration de motion est faite avec etc/motion/motion.conf lorsqu’il y a une seule caméra. Mais lorsqu’il y en a plusieurs, il faut créer plusieurs configurations. Le principe général (cf wiki de motion) est de laisser motion.conf avec les réglages communs à toutes les caméras et créer des fichiers distincts, nommés threadX.conf , pour chaque caméra (X est le numéro de caméra).

  • Créer les fichiers thread0.conf  et thread1.conf , avec droits 664.
  • A la fin de motion.conf, décommenter les lignes qui y font référence.
thread /etc/motion/thread0.conf
thread /etc/motion/thread1.conf
; thread /etc/motion/thread2.conf
  • dans motion.conf, identifier les lignes qui sont spécifiques à chaque caméra et les copier dans un éditeur de texte. On peut les laisser telles quelles puisqu’elles seront moins prioritaires que les instructions spécifiques des fichiers threadX.conf.
  • Dans chaque fichier threadX.conf, insérer les lignes spécifiques et faire les réglages.

Mon fichier thread1.conf  contient :

# caméra galaxy tab 7.7 GT-P6210
# thread1.conf

videodevice /dev/video1

netcam_url http://192.168.1.202:8090/video

############################################################

threshold 3000
threshold_tune off
noise_level 32
noise_tune off
despeckle_filter EedDl
smart_mask_speed 10
lightswitch 25
minimum_motion_frames 3

############################################################

# Target base directory for pictures and films
target_dir /home/jf/motion/galaxy

snapshot_filename g-%v-%Y%m%d%H%M%S-snapshot
picture_filename g-%v-%Y%m%d%H%M%S-%q
movie_filename g-%v-%Y%m%d%H%M%S
timelapse_filename g-%Y%m%d-timelapse

############################################################

stream_port 8082
webcontrol_port 8086

Le fichier thread0.conf  contient les mêmes lignes avec les paramètres que j’avais réglé dans les articles précédents de cette série . Evidemment stream_port  et webcontrol_port  sont différents (respectivement 8081 et 8085).

Redémarrer le service motion avec

service motion restart

Et maintenant les deux adresses http://nautilus:8082/?action=stream  et http://nautilus:8081/?action=stream  affichent le flux capturé de chacune des deux caméras par le Pi nautilus.

La caméra de la vieille tablette détecte bien les mouvements et stocke les fichiers générés dans le répertoire /home/jf/motion/galaxy . Idem pour la caméra 0 (foscam extérieure).

Modifier le cron de suppression de vieux fichiers

Maintenant au lieux de supprimer les vieux fichiers de /home/jf/motion, il faut supprimer dans /home/jf/motion/foscam et /home/jf/motion/galaxy.

Je modifie donc /home/jf/exec/cameradeletecron.sh qui contient maintenant : 

#!/bin/bash

# efface les fichiers avi et jpg de plus de deux jours 
find /home/jf/motion/foscam -maxdepth 1 -name '*.avi' -type f -mtime +2 -exec rm {} \;
find /home/jf/motion/foscam -maxdepth 1 -name '*.jpg' -type f -mtime +2 -exec rm {} \;

find /home/jf/motion/galaxy -maxdepth 1 -name '*.avi' -type f -mtime +2 -exec rm {} \;
find /home/jf/motion/galaxy -maxdepth 1 -name '*.jpg' -type f -mtime +2 -exec rm {} \;

Mise en veille de la tablette

La tablette se met en veille (l’écran est noir). Mais si les réglages de gestion d’énergie de l’application IP Webcam sont comme sur la copie d’écran ci-dessous (aucune option n’est cochée), la caméra va continuer à travailler même si l’écran est noir.

Réglage gestion d'énergie IP Webcam

Et maintenant ?

Il faudra que je règle la détection de mouvement de la tablette lorsque je l’aurai mise à sa place définitive. En attendant, elle a les mêmes réglages que ceux de la caméra extérieure. D’autres articles de la série sont également disponibles.

Enfin, si vous souhaitez visualiser le flux de la caméra de cette tablette, il suffit de taper http://nautilus:8082/?action=stream  dans n’importe quel navigateur d’un appareil connecté au réseau local.

Moi, j’ai décidé de voir les deux caméras et d’autres informations sur une page « dashboard » et j’ai créé une application android qui permet de la visualiser et d’interdire l’extinction de l’écran de la tablette sur laquelle elle est utilisée. Si ça vous intéresse, c’est ici : Une application android pour afficher une page web d’un Raspberry Pi.

Supprimer les fichiers vidéo et image de plus de deux jours

Supprimer les fichiers vidéo et image de plus de deux jours

Dans le premier article de cette série, , nous avons lu le flux d’une caméra IP dans un Raspberry Pi. Dans cet article, nous allons voir comment supprimer automatiquement les fichiers, vidéos ou images, sauvegardés au fil du temps.

Il y a urgence !

J’ai installé motion sur mon Raspberry Pi le 22 juin. On est le 1er juillet et le répertoire de stockage des images et vidéos représente déjà plus de 1 Go et 40 000 fichiers.

Il faut donc que j’automatise la suppression d’images de plus de deux jours (cet article) et aussi que je règle mieux motion pour qu’il ne stocke que les images et vidéos de véritables mouvements détectés (le prochain article de cette série, .

Supprimer des fichiers manuellement

Dans les FAQ de motion, ici, on voit comment déclencher la suppression de fichiers en fonction de leur localisation, leur extension et leur date. Ainsi, la commande suivante trouve et supprime tous les fichiers en jpg vieux de plus de 1 jour :

find /home/jf/motion -maxdepth 1 -name '*.avi' -type f -mtime +2 -exec rm {} \;

Mais on ne veut pas aller taper cette commande tous les jours dans notre Pi. Il faut donc planifier la commande.

Crontab pour planifier des actions

Comme indiqué dans Wikipedia, « cron est un programme qui permet aux utilisateurs des systèmes Unix d’exécuter automatiquement des scripts, des commandes ou des logiciels à une date et une heure spécifiées à l’avance, ou selon un cycle défini à l’avance. […] crontab est le nom du programme qui permet d’éditer des tables de configuration du programme cron. Ces tables spécifient les tâches à exécuter et leur horaire d’exécution avec éventuellement une périodicité. »

Ce qui suit provient aussi des FAQ de motion, ici :

  • créer un script bash (/home/jf/exec/camera-delete-cron.sh) comme celui-ci (note du 25/01/2018, j’ai corrigé et ça fonctionne correctement maintenant) :
#!/bin/bash

# /home/jf/motion/camera–delete–cron.sh

# connaître les variables d'environnement du cron, pour deboguer
# printenv ;
# me dit que HOME et PWD = /home/jf

# efface les fichiers avi et jpg de plus de 14 jours 
find /home/jf/motion/foscam/ -name '*.avi' -type f -mtime +14 -exec rm {} \;
find /home/jf/motion/foscam/ -name '*.jpg' -type f -mtime +14 -exec rm {} \;

la ligne de commande dans crontab

Le schéma ci-dessous traduit les instructions du site officiel du Pi.

# * * * * * commande à exécuter
# ┬ ┬ ┬ ┬ ┬
# │ │ │ │ │
# │ │ │ │ │
# │ │ │ │ └───── jour de la semaine (0 - 7) (dimanche est 0 ou 7, lundi est 1)
# │ │ │ └────────── mois (1 - 12)
# │ │ └─────────────── jour du mois (1 - 31)
# │ └──────────────────── heure (0 - 23)
# └───────────────────────── minute (0 - 59)
# └───────────────────────── /xx = toutes les xx minutes

J’ai créé le script bash ci-dessus et l’ai appelé camera-delete-cron.sh . Je lui ai donné les droits 764. Evidemment, ses fins de ligne doivent être au format unix.

Je vérifie qu’il fonctionne avec les commandes suivantes :

cd /home/jf/exec
./camera-delete-cron.sh

Je veux l’exécuter tous les jours à 1h00. J’ai utilisé le générateur de commande cron de ce site pour définir ma commande cron. En principe j’écrirai donc :

#env
SHELL=/bin/bash
HOME=/home/jf
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

* 1 * * * bash /home/jf/exec/camera-delete-cron.sh 

Avant j’ai indiqué l’environnement d’exécution des commandes. Voir ci-dessous si vous devez adapter. Attention, il doit y avoir une ligne vide à la fin du crontab

On édite crontab en tapant crontab -e  dans la console. On y ajoute la ligne suivante (SHIFT + INSER pour coller). Attention, il doit obligatoirement y avoir une ligne vide à la fin du contenu de crontab.

Noter le « bash » devant le fichier à exécuter.

Le cron ne s’exécutera automatiquement qu’après un redémarrage du Pi. Donc

Déboguer le cron si nécessaire

Ce n’est pas simple de déboguer si un cron ne s’éxécute pas correctement. Le plus probable est que l’environnement d’éxécution du cron n’est pas le même que celui de la ligne de commande.

Un cron job se déclenche dans un environnement différent de celui d’un lancement manuel !

Dans le script on peut ajouter printenv, qui affiche toutes les variables d’environnement. Un fichier log recueillerales données issues du cron job si la ligne est (ici exécution toutes les 10 minutes d’un script camera-test.sh et envoi des résultats dans un répertoire cron.log) :

*/10 * * * * bash /home/jf/exec/camera-test.sh OK > /home/jf/snd/cron.log 2>&1

 Et le premier job envoie toutes les informations recueillies dans/home/jf/snd/cron.log, ce qui permet de voir ce qui se passe.

Le fichier /var/log/syslog contient également beaucoup d’informations sur ce qui se passe dans le pi.

Dans mon cas le cron fonctionne et efface tous les fichiers de plus de deux jours (c’est à dire 3 jours et plus).

Installer et utiliser Cygwin pour le ssh avec un Pi

Installer et utiliser Cygwin pour le ssh avec un Pi

Août 2022 : L'article ci-dessous est mis à jour sur la façon de sélectionner ce que l'on veut installer. J'ai également ajouté deux liens vers des articles qui exposent d'autres manière de faire fonctionner un raspberry Pi de manière "headless", sans y connecter de clavier, souris et ecran. 

Pour pouvoir communiquer avec un Raspberry Pi sans avoir à le connecter à un clavier, une souris et un écran, le plus simple est d’utiliser une interface pour communiquer en « SSH » (Secure Shell – voir sur Wikipedia) depuis un ordinateur. Voici la méthode pour installer Cygwin sur un ordinateur Windows (7 à 10) et faire sa première connexion au Pi.

Installation de Cygwin

Télécharger setup.exe sur le site de Cygwin.

Exécuter setup.exe (en tant qu’administrateur) et suivre les instructions.

Pendant l’installation, on pourra s’aider de « setting up cygwin« . Voici les principaux choix que j’ai fait :

  • il vaut mieux installer pour « tous les utilisateurs » afin d’éviter d’éventuels problèmes, même si on est seul à utiliser cygwin.
  • install directory : c:/cygwin64
  • Local Package Directory : un répertoire distinct du répertoire d’installation. J’ai utilisé un sous-répertoire de « téléchargement ».

C’est au moment de choisir les paquets à installer que c’est assez difficile. Il ne faut choisir que ce dont on a besoin, dans chaque catégorie de paquets. Pour moi, c’est :

  • Admin                        cygrunsrv
  • Admin                        shutdown
  • Net                              openSSH
  • X11                              tout

J’avoue que je ne suis pas certaine du rôle des deux premiers paquets. Le troisième permet d’utiliser des commandes SSH dans notre console Cygwin. Le quatrième permet d’afficher l’écran du Pi en mode graphique (voir détails ci-dessous).

MAJ d’août 2022 : Pour choisir il faut cliquer sur la flèche à droite des items à installer comme dans la copie d’écran dessous (ici pour l’ensemble des paquets relatifs à X11). Pour les éléments isolés, il faut choisir une version et pas « passe ».

Comment sélectionner des éléments à installer en plus de l'installation par défaut de cygwin.

Ensuite on clique sur « installer » et nous disposons d’une console pour commander le Pi directement dans notre ordinateur habituel.

Se connecter en ssh au Pi

Il suffit de taper la commande ssh pi@nautilus , puis le mot de passe correspondant pour se connecter :

Cygwin : connexion SSH au Raspberry Pi
Que faire en cas d’erreur @    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!  ?

La solution vient d’ici. Il suffit de taper ssh-keygen -R 192.168.1.8  dans l’invite de commande Cygwin. Ensuite, on peut de nouveau se connecter en ssh à l’adresse 192.168.1.8 avec ssh pi@192.168.1.8  et ça fonctionne de nouveau.   

interface graphique avec Cygwin

Voir l’article plus détaillé, en anglais, de La Noia di moo ».

Dans la console Cygwin classique :

cygstart xwin # will open another window for the graphic display
# cygstart xwin -screen 0 1440x900@1 -wgl would open
# a 1440x900 window wirh OpenGL accelerated graphics

export DISPLAY=:0.0 # Cygwin is aware of the new remote display

ssh -Y pi@address # SSH to your PI

lxsession # start the windows manager. 
# it takes a few seconds, then you have the Pi GUI

On peut maintenant interagir avec le Pi en mode graphique :

CygwinGUI (interface graphique) du Raspberry Pi

Dans la copie d’écran ci-dessus, j’ai cliqué sur le bouton en bas à gauche pour pouvoir voir la liste des menus.

Autres méthodes « headless »

Et voilà !

créer une vidéo à partir d’un Powerpoint (2010)

créer une vidéo à partir d’un Powerpoint (2010)

Pour une formation en ligne, j’ai eu besoin de créer une présentation powerpoint (2010), d’enregistrer ma voix et de générer un minutage. Ensuite j’ai transformé cette présentation en vidéo. Je l’avais déjà fait voici quelques années mais j’ai mis beaucoup de temps à me rappeler comment faire. Voici donc un tutoriel détaillé.

étape 1 : créer la présentation

On crée la présentation comme on la ferait normalement. On peut aussi mettre des animations qui se déclenchent au clic de la souris.

Une fois la présentation comme on la souhaite, on l’enregistre (format pptx).

étape 2 : enregistrer la narration

Powerpoint permet d’enregistrer simultanément la narration et le minutage du diaporama. Je trouve très difficile de faire les deux à la fois. Je préfère donc enregistrer ma voix PUIS enregistrer le minutage, en fonction de ma voix. 

solution 1 : avec les outils de Powerpoint

Dans l’onglet diaporama, cliquer sur  « enregistrer le diaporama » puis choisir « commencer l’enregistrement au début »

powerpoint-video-1

Enregistrer le texte, éventuellement avec le minutage (on pourra supprimer ou corriger l’un ou l’autre ensuite). Il faut laisser un petit blanc au moment de la transition vers la diapo suivante.

Pour voir le résultat, vérifier (1) que les cases « lire les narrations » et « utiliser le minutage » sont cochées. On peut donc démarrer le diaporama (2) pour voir et entendre le résultat.

powerpoint-video-2

Si besoin, on peut corriger la narration ou le minutage, pour chaque diapo ou pour l’ensemble.

solution 2 : avec un logiciel externe (audacity)

Audacity est un logiciel libre d’enregistrement et édition de son. Le gros avantage d’un enregistrement via audacity est qu’on peut laisser des blancs qu’on corrigera ensuite à la souris.

On peut également lire à l’écran (les notes du powerpoint ou un fichier distinct) sans se préoccuper d’un minutage précis.

J’enregistre donc ma voix puis, toujours dans audacity, je choisis Fichier/exporter audio. J’ai d’abord essayé le format ‘flac’ mais il n’est pas accepté par Powerpoint. J’enregistre donc au format ‘wav’.

audacity-enregistrement

L’enregistrement est nettement meilleur car je suis moins stressée par l’interface !

Ensuite, il me suffit d’insérer le fichier audio ainsi créé dans la première diapo de la présentation :

  • Sur cette première diapo, dans l’onglet insertion, cliquer sur audio puis ‘audio à partir du fichier’.
  • Sélectionner le fichier à insérer. Un symbole « haut-parleur » apparaît sur la diapo.
  • cliquer une fois sur le symbole « haut-parleur » : dans le menu de powerpoint, deux nouveaux onglets apparaissent à droite : format et lecture.
  • Cliquer sur l’onglet ‘lecture’ puis régler le démarrage (1) sur ‘automatiquement’ si on a un fichier audio par diapo, ‘exécution sur l’ensemble des diapositives’ si on a un seul fichier (mon cas). Cocher aussi la case ‘masquer pendant la présentation’ pour que le symbole haut parleur ne soit pas visible.

powerpoint-video-3

Enfin, il faut que je cale le minutage sur ma voix enregistrée. Je procède comme précédemment (solution 1) mais je décoche « narration et pointeur laser » au moment de démarrer l’enregistrement.

étape 3 : créer une vidéo à partir du diaporama

Dans Fichier / ‘Enregistrer et envoyer’, choisir ‘créer une vidéo’.

Pour une vidéo qui sera ensuite mise en ligne, choisir ‘internet & DVD’ plutôt que ‘qualité HD et ordinateur’. Evidemment, il faut choisir ‘utiliser le minutage et les narrations enregistrés’.

Cliquer sur ‘créer la vidéo’. On ne peut enregistrer qu’au format wmv (windows media video).

étape 4 : mettre la vidéo en ligne

A priori on ne peut pas mettre en ligne une vidéo au format wmv car personne ne pourra la lire dans son navigateur (sauf peut-être avec internet explorer ou edge).

Par ailleurs, il est déconseillé de charger une vidéo directement dans WordPress pour plusieurs raisons :

  • la vidéo consommera de la bande passante de mon site et ralentira le chargement ;
  • l’internaute ne pourra pas choisir la qualité vidéo à utiliser selon le débit dont il dispose ;
  • pour que tous puissent lire la vidéo, quel que soit le navigateur utilisé, il faudra charger au moins deux vidéos au lieu d’une (cf cet article) : une au format mp4 (MPEG H.264 AAC) et l’autre au format WebM (codec vidéo VP8 ou VP9 et le codec audio Vorbis ou Opus).

Il est donc préférable de placer la vidéo sur un site tiers comme Youtube, si on accepte que la vidéo soit publique. On préférera Wistia ou Vimeo si on veut limiter l’accès aux vidéos (solutions payantes). Dans nos pages ou articles WordPress, on incorporera la vidéo à partir de ces sites tiers.

Pour incorporer (embed) la vidéo, il suffit de coller le lien de la vidéo directement dans l’éditeur WordPress.

Dans un second article, j’ai écrit mon mode opératoire précis, visible ici : Mode opératoire pour créer des supports de cours en ligne.

Et voilà !