[TUTORIEL] Connexion gladys audio bluetooth

Hello !

Je voulais connecter gladys en bluetooth sur mon home cinéma sony, et je me suis dit que cela pourrait intérésser d’autres personnes. Donc je vous donne ce que j’ai fais pour que cela fonctionne

Installation des paquets :

sudo apt-get install blueman pulseaudio pulseaudio-module-bluetooth

Ajout de l’utilisateur pi dans le groupe lp

Cela permet à l’utilisateur pi de “jouer” avec le bluetooth

sudo usermod -a -G lp pi

J’ai redémarrer le raspberry, pas sur que ce soit nécessaire mais comme on dit ça ne mange pas de pain

reboot

Lancement de pulseaudio

pulseaudio --start

Dans les logs il est très propable de voir des erreurs en rapport avec le serveur X, je voulais voir comment le corriger, mais ces erreurs n’empêche pas le fonctionnement :wink:

Configuration du bluetooth

bluetoothctl

power on

agent on

default-agent

scan on

Niveau du retour de commande, ça devrait donner ça

[email protected]:~ $ bluetoothctl
[NEW] Controller B8:27:EB:04:83:99 gladys [default]
[bluetooth]# power on
Changing power on succeeded
[bluetooth]# agent on
Agent registered
[bluetooth]# default-agent
Default agent request successful
[bluetooth]# scan on
Discovery started
[CHG] Controller B8:27:EB:04:83:99 Discovering: yes
[NEW] Device FC:3C:80:16:FD:D8 nut
[NEW] Device 5C:EA:1D:66:A9:C2 5C-EA-1D-66-A9-C2
[CHG] Device 5C:EA:1D:66:A9:C2 RSSI: -86
[CHG] Device 5C:EA:1D:66:A9:C2 Name: BLU-RAY
[CHG] Device 5C:EA:1D:66:A9:C2 Alias: BLU-RAY
[CHG] Device 5C:EA:1D:66:A9:C2 UUIDs: 0000110c-0000-1000-8000-00805f9b34fb
[CHG] Device 5C:EA:1D:66:A9:C2 UUIDs: 0000110e-0000-1000-8000-00805f9b34fb
[CHG] Device 5C:EA:1D:66:A9:C2 UUIDs: 0000110b-0000-1000-8000-00805f9b34fb
[CHG] Device FC:3C:80:16:FD:D8 RSSI: -87

Connexion bluetooth

pair 5C:EA:1D:66:A9:C2
trust 5C:EA:1D:66:A9:C2
connect 5C:EA:1D:66:A9:C2

Retour des commandes

[bluetooth]# pair 5C:EA:1D:66:A9:C2
Attempting to pair with 5C:EA:1D:66:A9:C2
[CHG] Device 5C:EA:1D:66:A9:C2 Connected: yes
[CHG] Device 5C:EA:1D:66:A9:C2 UUIDs: 0000110b-0000-1000-8000-00805f9b34fb
[CHG] Device 5C:EA:1D:66:A9:C2 UUIDs: 0000110c-0000-1000-8000-00805f9b34fb
[CHG] Device 5C:EA:1D:66:A9:C2 UUIDs: 0000110e-0000-1000-8000-00805f9b34fb
[CHG] Device 5C:EA:1D:66:A9:C2 ServicesResolved: yes
[CHG] Device 5C:EA:1D:66:A9:C2 Paired: yes
Pairing successful
[CHG] Device 5C:EA:1D:66:A9:C2 ServicesResolved: no
[CHG] Device 5C:EA:1D:66:A9:C2 Connected: no
[bluetooth]# trust 5C:EA:1D:66:A9:C2
[CHG] Device 5C:EA:1D:66:A9:C2 Trusted: yes
Changing 5C:EA:1D:66:A9:C2 trust succeeded
[bluetooth]# connect 5C:EA:1D:66:A9:C2
Attempting to connect to 5C:EA:1D:66:A9:C2
[CHG] Device 5C:EA:1D:66:A9:C2 Connected: yes
Connection successful
[CHG] Device 5C:EA:1D:66:A9:C2 ServicesResolved: yes

Maintenant qu’on est bon niveau bluetooth, va falloir dire au raspberry de sortir le son en bluetooth

Gestion des cartes audio

Avoir la liste

pacmd list-cards

Notre carte bluetooth est la suivante (dans mon cas)

index: 1
name: <bluez_card.5C_EA_1D_66_A9_C2>
driver: <module-bluez5-device.c>
owner module: 22
properties:
  device.description = "BLU-RAY"
  device.string = "5C:EA:1D:66:A9:C2"
  device.api = "bluez"
  device.class = "sound"
  device.bus = "bluetooth"
  device.form_factor = "speaker"
  bluez.path = "/org/bluez/hci0/dev_5C_EA_1D_66_A9_C2"
  bluez.class = "0x240414"
  bluez.alias = "BLU-RAY"
  device.icon_name = "audio-speakers-bluetooth"
profiles:
  a2dp_sink: High Fidelity Playback (A2DP Sink) (priority 10, available: unknown)
  off: Off (priority 0, available: yes)
active profile: <a2dp_sink>
sinks:
  bluez_sink.5C_EA_1D_66_A9_C2.a2dp_sink/#1: BLU-RAY
sources:
  bluez_sink.5C_EA_1D_66_A9_C2.a2dp_sink.monitor/#1: Monitor of BLU-RAY
ports:
  speaker-output: Speaker (priority 0, latency offset 0 usec, available: unknown)
    properties:

  speaker-input: Bluetooth Input (priority 0, latency offset 0 usec, available: no)
    properties:

On modifie le profile

pacmd set-card-profile bluez_card.5C_EA_1D_66_A9_C2 a2dp_sink

On la met par défaut

pacmd set-default-sink bluez_sink.5C_EA_1D_66_A9_C2.a2dp_sink

Vous pouvez lancer une musique, normalement cela devrait sortir en blueutooth :slight_smile:
Maintenant il ne me reste plus cas trouver comment démarrer le home cinéma tout seul (en python c’est done, mais voir pour du http) et surtout le passer en source bluetooth pour pouvoir connecter le raspberry dessus.

Scripts

Au besoin, dans mon cas gladys n’est pas connecter en permanance au device bluetooth, du coup plutôt que de passer en ligne de commande pour connecter le raspberry au device bluetooth, je vais passer par un script shell qui sera utiliser avec le module shell :

Script de connexion :

#!/bin/bash
bluetoothctl << EOF
connect 5C:EA:1D:66:A9:C2
EOF

pacmd set-card-profile bluez_card.5C_EA_1D_66_A9_C2 a2dp_sink
pacmd set-default-sink bluez_sink.5C_EA_1D_66_A9_C2.a2dp_sink

L’adresse mac est bien entendu à remplacer par la vôtre :slight_smile:

Script de deconnexion :

#!/bin/bash
bluetoothctl << EOF
disconnect 5C:EA:1D:66:A9:C2
EOF

Maintenant il ne reste plus cas faire des devices suivant la doc du module shell avec le chemin de vos script :slight_smile:
Si vous avez des retours si cela fonctionne pour vous c’est bon à prendre :slight_smile:

@pierre-gilles est-ce que cela pourrait être géré nativement par gladys ? Dans e style un paramétrage qui pemetterais de scanner et se connecter à un device et choisir la sortie audio à utiliser

3 Likes

Super tuto @Totof c’est propre

Ce qui est valable pour un pi ne l’est pas pour un autre system/os , pas simple mais pas impossible

Tu peux peut-être t’inspirer de mon module Yamaha ou de celui Onkyo de @VonOx :wink:

Je dirais plutôt que c’est valable pour un debian & dériver qui possède une puce bluetooth. Forcément si tu fais l’installation sur un windows tu l’as dans le C** ! Oh mais que de vulgarité :slight_smile:

@Pti_Nico … pour le moment dev je suis au ras des paquerette, la logique ça va, mais la pratique beaucoup moins lol (pour le moment)

En trouvant une lib python sur le net j’ai réussi à le faire démarrer, et je peux “simuler” des touches de la télécommande youhouhouuu. Après y’a la possibilité de passer par du http, j’ai un peu regarder ce que faisait le python et j’ai trouver des url avec les xml action & co… sauf que pour le moment je ne vais pas encore plus loin :slight_smile:

D’ailleurs si quelqu’un à des conseils / piste à me donner… il y a un topic qui traine quelque part :stuck_out_tongue:

Y’a pas d’api ( enfin si mais pas documenté) :pensive:

Je pense que ça serait utile oui de gérer par défaut le cas du Raspberry Pi, après à voir comment ça peut s’intégrer dans Gladys…

Je pense c’est une réflexion intéressante à avoir dans Gladys 4, ça pourrait être un “module natif” comme je dis dans le manifeste.

Merci bien @Totof ça fonctionne nickel dès le départ :+1:

Bon par contre après un reboot du rpi plus rien il faut refaire la parti trust et connect pour ravoir l’enceinte connectée au raspi

Aussi, ça avait fonctionné nickel aussi avec le module speak mais depuis le reboot l’enceinte ne communique plus alors que gladys envoie bien la requête

0|gladys   | brain : classify : Identified label brain;greeting
0|gladys   | Getting conversation 924bc3cf-fd91-4546-8941-bb849726bd3f, found 1 messages.
0|gladys   | Brain : answer : Answering with label greeting in language fr-FR
0|gladys   | Brain : answer : Found 2 possible.
0|gladys   | Brain : answer : Trying to contact socket
0|gladys   | Message sent with success with socket.
0|gladys   | Brain : answer : Trying to contact speak
0|gladys   | Message sent with success with speak.
0|gladys   | brain : classify : Answered in 0s, 328.292 ms

Salut @Jean34

Je viens à l’instant de la tester avec voicerss :slight_smile:

Effectivement après un reboot du raspberri il va falloir se reconnecter à l’enceinte.
Je pense que pour un redémarrage de l’enceinte il faut aussi se reconnecter à l’enceinte.

Je vais essayer de faire un truc avec le fake module de @piznel + le module shell : Faire un device connexion-bluetooth par exemple, puis quand tu le change d’état, il déclenche un script shell qui te connecte automatiquement en bluetooth à l’enceinte.

Comme ça si tu déconnecter le rpi ou l’enceinte, tu peux te connecter avec ce device virtuelle :slight_smile:

Tu as essayer avec le module mp3-player ? J’ai l’impression que cela ne fonctionne pas correctement :frowning: . Via télégrame je lui demande de lancer la musique je n’ai rien, mais avec un script + voicerss il me parle bien

EDIT : Je viens de tester ce scripts chez moi c’est OK pour une reconnexion une fois que tu à fait un pair + trust

#!/bin/bash
bluetoothctl << EOF
connect 5C:EA:1D:66:A9:C2
EOF

Remplace la mac et tu me dis si c’est bon pour toi :slight_smile:

j’ai exécuté ces commandes pour réactiver l’enceinte, je pense bien faire non ?

[email protected]:~ $ bluetoothctl
[NEW] Controller B8:27:EB:16:74:60 gladys [default]
[NEW] Device FC:58:FA:65:2F:C1 Pocketgroove
[bluetooth]# trust FC:58:FA:65:2F:C1
Changing FC:58:FA:65:2F:C1 trust succeeded
[bluetooth]# connect FC:58:FA:65:2F:C1
Attempting to connect to FC:58:FA:65:2F:C1
[CHG] Device FC:58:FA:65:2F:C1 Connected: yes
Connection successful
[CHG] Device FC:58:FA:65:2F:C1 ServicesResolved: yes
[Pocketgroove]# quit
[DEL] Controller B8:27:EB:16:74:60 gladys [default]

Comme dit plus haut, moi j’ai le module speak et quand je lance un simple script

gladys.modules.speak.say({language: 'fr', text: 'salut ! comment va ?.'});

ça ne sort pas de l’enceinte depuis le reboot du rpi. Est-ce que ce message y serait pour quelque chose

[DEL] Controller B8:27:EB:16:74:60 gladys [default]

Quand je quitte bluetoothctl j’ai ce message.

par contre si je lance aplay avec un fichier mp3 ça fonctionne bien.

D’après ce que je vois, ton rpi se met bien sur l’enceinte

[CHG] Device FC:58:FA:65:2F:C1 Connected: yes
Connection successful

SI je comprends bien, c’est le module speak qui ne fonctionne plus, mais si tu lance un aplay avec un fichier mp3 le son passe bien dans l’enceinte ?

Je viens de faire un reboot du rpi, lancer le script que je t’ai mis plus haut 1 fois = pas de connexion 2 fois = OK

Par contre pour moi, voicerss fonctionne bien il parle bien sur le home cinéma

Ton script fonctionne à merveille :slight_smile:

[email protected]:~ $ ./bluetooth.sh
[NEW] Controller B8:27:EB:16:74:60 gladys [default]
[NEW] Device FC:58:FA:65:2F:C1 Pocketgroove
[Pocketgroove]# connect FC:58:FA:65:2F:C1
Attempting to connect to FC:58:FA:65:2F:C1
[Pocketgroove]# quit
[DEL] Controller B8:27:EB:16:74:60 gladys [default] 

pour le module speak, je viens de faire un reboot de Gladys et ça fonctionne à nouveau donc tout est bon :+1:

Pour être tranquille maintenant, il faudrait inclure ton script dans une tache cron ? par exemple @reboot ./bluetooth.sh ?

J’ai vu qu’il fallait redémarrer gladys pour qu’il prenne bien ça en compte.
Aussi le refaire le

pacmd set-card-profile bluez_card.5C_EA_1D_66_A9_C2 a2dp_sink

pacmd set-default-sink bluez_sink.5C_EA_1D_66_A9_C2.a2dp_sink

Dans le doute, tu peux ajouter les lignes ci-dessus dans le script, ce qui donnera

#!/bin/bash
bluetoothctl << EOF
connect 5C:EA:1D:66:A9:C2
EOF

pacmd set-card-profile bluez_card.5C_EA_1D_66_A9_C2 a2dp_sink
pacmd set-default-sink bluez_sink.5C_EA_1D_66_A9_C2.a2dp_sink

Je pensais plutôt faire un device qui va lancer le shell de connexion du raspberry, car pour moi je le connecte sur mon home cinéma, sauf qu’il n’y sera pas h24 :stuck_out_tongue:

ça marche pour toi mp3 player ?

@Jean34 je viens d’installer le module shell et ça mache pour la connection ! :wink:

J’ai fais un device :

  • ConnectBluetooth
  • /home/pi/scripts/connect-bluetooth.sh
  • shell
  • shell
  • fictive (Nom de ma pièce :slight_smile: )

Ensuite dans ce device tu mets un type binary et les valeurs 0 à 1

Lorsque tu actives ce device il te connecte bien au bluetooth :slight_smile:

Et pour le fun j’ai fais un script de déconnexion du bluetooth

#!/bin/bash
bluetoothctl << EOF
disconnect 5C:EA:1D:66:A9:C2
EOF

Oui mp3 player fonctionne bien j’ecoute depuis quelques minute déjà, bon par contre si je change de musique sur l’interface ça reste sur la chanson 1 mais je le signalerais sur le module en question :wink:

du coup avec les manips que tu cites plus haut, la connection se fera automatiquement et directement par Gladys ?

Avec la manip de faire un device pour le liée au script de connexion ça te permet d’activé ce device pour connecter le raspberry à l’enceinte bluetooth. Comme ça si tu redémarrre le raspberry ou l’enceinte tu à juste à passer ce device à On pour te reconnecter dessus et plus besoins de passer en ssh sur le raspberry.

A mince, moi le mp3 player ne fonctionne pas à priori. Dans ton répertoire de musique tu as uniquement des mp3 ou des folders ?

Autant pour moi j’avais oublier le / de fin ! ça marche impecable !

ok jvais faire ça alors, encore merci à toi pour ce tuto qui est maintenant complet :slight_smile: :+1:

Si il fonctionne le module mp3 player, bon faut que j’applique le correctif à la main pour le bouton stop, le bug que je rencontre est quand je suis sur l’interface et que je change de musique, il me la change bien mais sur l’interface ça reste à la première musique (je parle du titre affiché)

Tu as fait comment pour le mettre à jour manuellement pour le bug du stop ?

Faut que j’édite le poste du haut pour rajouter les scripts + les devices shell pour permettre la connexion / deconnexion du bluetooth

En tout cas ça fait exacement ce que je voulais, on peux dire que c’est un bon dimanche :slight_smile:

le device est bien créé mais dans le device, je met seulement le type et les valeur dans min max ? c’est la première fois que je créé un device …

pour le correctif du module mp3 player ==> Bug fixed sur le module MP3 Player :wink: en attendant la PR

Oui j’ai juste renseigné binary min = 0 max = 1 et pour moi c’est OK en tout cas :slight_smile:

Bon bah la dernière étape pour moi va être d’arrivé à comprendre comment envoyé une requette HTTP à mon home cinéma pour l’allumer et le passe en mode bluetooth…

La finalité sera démarrage home cinéma + passage en mode bluetooth + gladys basculera sur le home cinéma + un petit changement de lumière + lancement de la musique + une bière et un apéro = Au top en rentrant du boulot :smiley:

2 Likes