Image Sonos
Envoyer du son sur Sonos via Crontab

Posséder des enceintes connectées et une domotique, c’est avoir la possibilité d’automatiser des annonces.

Image Sonos
Image Sonos

Au quotidien, il y a des choses que nous ne voulons pas rater, et je vais parler pour un exemple bête, du jour ou il faut sortir les poubelles pour que le camion les récupère. Chez moi, c’est le lundi soir pour une levée le mardi matin.

Le lien avec la domotique, l’automatisation : quoi qu’il se passe dans ma journée, le soir, une annonce sera diffusée dans la maison et ce grâce à python et au module « soco-cli »

Les pré requis, du moins dans ma version : une enceinte sonos et un actionneur domotique (j’utilise une tache Cron) , voici la préparation du puzzle :

A- Installer les outils sonos et trouver la commande

sudo apt-get update
sudo apt-get install -y pip
sudo -H pip install -U soco-cli 

B- Créer les sons et les tester

À défaut d’avoir un mp3 qui vous plaise, vous pouvez créer un son vous même avec une voix de synthèse. Pour cela, utilisons la commande espeak : (qui peut etre installée via « apt-get install espeak »)

espeak -v fr "les enfants, il faut mettre le couvert !" --stdout | ffmpeg -y -i - -acodec libmp3lame mettrelecouvert.mp3

Pour jouer ce mp3, il faut une enceinte, alors exécutez la commande « sonos-discover » pour lister les enceintes du réseau local. Un beau tableau avec le nom, l’adresse IP, le modèle apparaîtra..

Ensuite, par exemple, pour envoyer le fichier mettrelecouvert.mp3 sur l’enceinte Bureau :

sonos Bureau play_file mettrelecouvert.mp3

Il existe plein d’options, pour ajouter une temporisation, grouper ou séparer des enceintes, gérer le volume.. par exemple pour grouper, gérer le volume, lancer un mp3, les re-séparer et remettre un volume acceptable (j’ai ajouté une pause d’une seconde à chaque fois pour les délais liés aux commandes) :

sonos Cuisine if_stopped party_mode : wait 1s : _all_ volume 45 : wait 1s : Cuisine if_stopped play_file ilest20h30.mp3 : wait 1s : _all_ volume  15 : wait 1s : Parent ungroup : wait 1s : Chambre ungroup

Lister les favoris et jouer le premier :
sonos Cuisine list_favourite
sonos Cuisine play_favourite 1

C- Ajouter les taches dans Cron

Pour la v1 de mon installation, j’utilisais intégralement Cron, comme ce ci :

# Sonos Crontab pour rappel - sortir les poubelles -
## Le lundi soir 20h05 et 20h30
0,25 20 * * 1  /usr/local/bin/sonos Kitchen play_file  /home/pi/firewalla/config/ilfautsortirlapoubelle.mp3 

A titre d’information, voici les autres entrée ..

## Programme du matin en semaine
0 7 * * 1-5  sonos Kitchen if_stopped play_file ilest7hBonjour.mp3
0 8 * * 1-5  sonos Kitchen play_file ilest8h.mp3
## Programme du soir en semaine
30 18 * * 1-5  sonos Kitchen play_file ilest18h20.mp3 
0 19 * * 1-5  sonos Kitchen play_file mettrelatable.mp3
## Programme du weekend
0 19 * * 6,0  sonos Kitchen play_file ilest19h.mp3 
30 20 * * *    sonos Kitchen play_file ilest20h30.mp3 
45 11 * * 6,0  sonos Kitchen 

J’ai vite rencontré des limites car sur mon système, la Crontab est chargée au démarrage et nést ensuite, pas modifiable. Pour la prendre en compte, il basiquement, redémarrer le PC pour qu’elle soit actualisée.

J’ai donc décidé de lancer une commande bash chaque 10 minutes, ce bash va lui vérifier l’heure et effectuer la tache souhaitée. Voici la tache Cron

*/10 * * * *    /home/pi/sonos.sh  > /dev/null

Et le fichier sonos.sh :

#!/bin/bash
# Programme du matin en semaine

alias sbd="sonos Cuisine : 'living room' group Cuisine : wait 1s : Cheminee group Cuisine : wait 1s : Bureau group Cuisine"
alias bye="sonos Cuisine if_stopped volume 10 : wait 1s : Bureau if_stopped ungroup : wait 1s : Chambre if_stopped ungroup"

#Set default configuration
sonos 'living room' group Cuisine : wait 1s : Cheminee group Cuisine 

if [[ $(date +%u) -le 5 ]]; then
    if [[ $(date +%H%M) -eq 700 ]]; then
        sonos Cuisine play_file ilest7hBonjour.mp3
    elif [[ $(date +%H%M) -eq 800 ]]; then
		sonos Cuisine 31 : Cuisine play_file ilest8h.mp3
    fi
fi

# Programme de tous les midis & soirs
if [[ $(date +%H%M) -eq 1150 ]]; then
	sonos Bureau group Cuisine
	sonos Cuisine if_stopped volume 40 : Cuisine if_stopped play_file mettrelatable.mp3
elif [[ $(date +%H%M) -eq 2030 ]]; then
	sonos Cuisine if_stopped volume 31 : Cuisine if_stopped play_file ilest20h30.mp3
fi

# Programme du weekend
#if [[ $(date +%u) -eq 6 || $(date +%u) -eq 7 ]]; then
    #if [[ $(date +%H%M) -eq 1145 ]]; then
    #fi
#fi

# Le lundi soir 19h10 et 19h20 et 20h10 et 20h20
if [[ $(date +%u) -eq 1 ]]; then
    if [[ $(date +%H%M) -eq 1940 || $(date +%H%M) -eq 2010 || $(date +%H%M) -eq 2020 ]]; then
		sonos Cuisine if_stopped volume 12 : Cuisine if_stopped play_file ilfautsortirlapoubelle.mp3
    fi
fi
#Reset default configuration
sonos Cuisine if_stopped volume 10 : wait 1s : Bureau if_stopped ungroup : wait 1s : Chambre if_stopped ungroup

C’est déjà pas mal, mais c’est tout.. vous pouvez maintenant il n’y a qu’à profiter 😉

interrupteur
Timelapse pendant une impression 3D sans Octoprint pour 0 euros !

Amis lecteurs, voici un tutoriel plus technique que les précédents, et il sera ici question de la mise en place d’un outil permettant de faire des timelapse sans y dédier un ordinateur (même si ce n’est qu’un Raspberry Pi) à ce rôle.

De mon coté, j’ai déjà un ordinateur pour effectuer des Timelapse, je me suis donc demandé, comment mutualiser ce besoin sans associer davantage de resources mais surtout comment partager l’état d’avancement si internet est accessible 😉

Info : Le timelapse, c’est une technique permettant la prise de photos à intervalles de temps définies dans l’idée d’en faire un film à effet ‘rapide’. J’ai déjà fait un article dessus ici.

But : Via un script python, via le contact d’un port GPIO, effectuer une capture d’image via l’appareil photo et envoyer des notifications sur l’avancement. Il est important de rentre le Raspberry pi amovible, tout comme la rapidité d’installation, cruciale.

Le temps d’installation / préparation dépendra de vos compétences mais ne devrait pas excéder 10 minutes !

Octoprint via Octolapse fait cela très bien mais demande l’utilisation d’un Raspberry Pi dédié à l’impression. Octoprint permet de gérer l’imprimante à distance, mais, je n’ai pas besoin de tout cela.. et je n’ai qu’un pi zéro dispo de toutes façons, ne permettant pas l’exécution d’Octoprint+Octolapse.

Pré requis :

  • un raspberry Pi avec un OS installé
  • une Pi caméra connectée au Pi
  • une imprimante 3D, Cura comme slicer
  • une paire de cables
  • un fer à souder

1- Imprimante 3D :

Pour de se déplacer dans un volume, toutes les imprimantes 3D sont initialisées via des capteurs de fin (début) de course. C’est douvent un interrupteur, à contact sec définissant l’origine est x=0, y=0, z=0.

Sur ces capteurs, la plupart du temps, il y a 3 bornes, la masse, et contacts NO / NC (normalement ouvert ou normalement fermé).

interrupteur
Exemple d’interrupteur de fin de course

L’imprimante utilise le moment ou la tête d’impression appuie sur l’interrupteur pour s’initialiser. Cela fait un contact entre deux des pattes et le signale (normalement ouvert devient fermé). Pour ce projet de 3dlapse, et initialiser l’ordre de prise de photo, nous allons donc, pour ne pas embetter l’imprimante ni le Pi dans les contacts, utiliser le même interrupteur, mais contact inverse (normalement ouvert, qui envoie un signal quand le contact se défait).

Après avoir testé avec un multimétre quels contacts utiliser, voici la soudure de deux cables sur l’interrupteur de fin de course de X. Utilisant des connecteur Dupont sur le Pi, j’ai laissé une fiche male au bout du cable de chaque coté. C’est tout.

Capteur de fin de course est relié à la carte mère (câbles noirs) et à la camera Timelapse (câbles rouge+noir)

2- Sur le Raspberry Pi :

Voici le script de Timelapse/ 3dlapse. Ce script de 120 lignes, est partagé sur mon Github et je ne vais pas le détailler, étant donné qu’il est déjà extrémement commenté. Si vous y voyez des soucis, je suis preneur de commentaires cependant.

Copier le script Timelapse.py sur le Pi, dans le dossier ‘home’ via l’outil de votre choix (j’utilise FileZilla)

Exécution : Ce script une fois lancé en fonction de l’état du GPIO 27, arbitrairement choisi (borne 13&14), va démarrer en mode Timelapse (photo toutes les 3 secondes) ou 3dlapse (photo lors d’un contact GPIO27)

Bornes GPIO pour Raspberry Pi

Le Raspberry Pi Zero dans sa splandeur :

Pi Zero avec port GPIO 27 pour Timelapse / 3dlapse – Coque sur mesure designée par mes soins !

Lancer et tester pour valider que les dépendances sont présentes (keyboard, requests, socket, RPi.GPIO, gpiozero, Picamera2)

Chaque nouveau lancement crée un nouveau dossier, incrémentalement, dans /home/pi/pictures et y enregistre les clichés, ainsi qu’un fichier de log.

Pour tester chaque option, vous pouvez commuter la borne GPIO27, aussi le lancer avec l’argument « 3d » / « 3dlapse » ou « tl » / « timelapse ».

Exemple : Python3 Timelapse.py 3dlapse

Note: Vous pourrez constater que j’ai utilisé sur ce projet une camera à AutoFocus, et défini sa position en ‘automatique’ pour la partie Timelapse (ligne 99), et focale fixe pour la partie 3dlapse (ligne 102). Dans le cas ou vous souhaiteriez tester le focus à différentes ouvertures, manipulez le script pour utiliser la fonction ‘testFocus’ )

Libre à vous de changer l’ID notify (lignes 28/39/40) si vous souhaitez l’utiliser mais aussi recevoir les photos à chaque centaine, ou les notifications sur l’espace disque restant.

Option : lancer le script automatiquement au démarrage

Faire en sorte que le raspberry pi démarre en mode ligne de commande avec ouverture de session automatique, ajouter en dernière ligne du fichier /home/pi/.bashrc la commande de lancement du script Python « Python3 Timelapse.py »

3- Dernière partie : le Slicer (Cura)

Cura dispose de modules pour modifier les impressions. En l’occurence nous allons installer le module Timelapse, qui permet le staitonnement de la tête à chaque niveau d’impression pendant une durée définie.

  1. Menu Extensions -> Post Processing -> Modifier G-Code
  2. “Ajouter un script”
  3. Selectionner « Time Lapse »

Avant de lancer la création du G-code valider les paramètres du script, voici les miens :

Configuration Cura

Note: Le ‘park print head’ va demander à aller au point donné X/Y, mais comme nous avons utilisé un capteur NC (normallement fermé), il faut décaller la tête d’impression au delà du capteur, et donc, modifier le script de Cura (pour Windows, dans le dossier C:\Program Files\Ultimaker Cura 5.VERSION\share\cura\plugins\PostProcessingPlugin\scripts). Voici ma version modifiée:

  • Le changement est un ajout des lignes 107&108 pour libérer le capteur et attendre que l’opération se finisse.

Pour finir, cet ajout de prise photos, va nécéssairement rajouter du temps d’impression, quelques secondes par niveau, et risque de provoquer du ‘stringing’. Pour contrer cela, il est nécéssaire de comprendre la rétractation 😉

Voilà, une fois que le Pi à trouvé sa place sur l’imprimante, et que le focus à été ajusté correctement, il suffit juste de le brancher et alimenter pour qu’il démarre.. et prenne les photos, alternativement, démarré avec un powerbank en direction d’un coucher de soleil, il pendra tranquillement en photo une fin de journée et ca, un appareil pour deux utilisations, c’est la cerise sur le gâteau !!!

J’espère que cette partie un peu plus technique aura apporté un peu de lumière sur cette solution, portable, pratique et rapide à mettre en place pour immortaliser vos impressions; Dans tous les cas, n’hésitez pas à me contacter pour tout commentaire, ou toute idée !