Using Bluetooth Speaker and White noise with Home Assistant

So since the child was born my wife had this idea that we need white noise in bedroom. I’ve made a quick dirty implementation with small speakers + usb-bluetooth <-> AUX adapter and Android phone connected over bluetooth.
Problem being that if you had to stop/start or change volume you had to carry phone with you (and charge it) or keep it on charger constantly and reach over to it to change sounds and volume.
I was looking into solution from my Smart Home standpoint - a way to play using Home Assistant. I had some experience using MPD and PI MusicBox with playing radio stations on my Rpi Zero W, but it was too laggy for 1 CPU.
I recommend reading GUIDE for detailed instructions on installation. I will just provide high level guide.
Building all pre-requesites (checklist)
We would need few tools/packages for it to work:
- bluez
- bluealsa
- mopidy
- bluetoothctl
Installing bluez
If you don’t have already - grab latest distributive (or one that is known to be bug-free) from http://www.bluez.org. (Follow GUIDE for details)
Installing bluealsa
For me bluealsa was not available as a package so I had to grab a source code, compile and install it. After that I had to create service to be able to start it with os and control it:
[Unit]
Description=BluezALSA proxy
Requires=bluetooth.service
After=bluetooth.service
[Service]
Type=simple
User=root
ExecStart=/usr/bin/bluealsa --device=hci0
Checking your bluetooth hardware
Check if your adapter is connected and is up and working:
hciconfig list
hciconfig hci0 -a
sudo hciconfig hci0 up
Connecting speaker and testing it:
You would need to use bluetoothctl utility in order for all bluetooth-pairing stuff.
list # lists your BT devices
select <mac> # select your BT device (adapter)
power on
agent on
scan on <scan>
# find your device mac in list
scan off
pair <mac>
trust <mac>
connect <mac>
exit
Check if everything is ok:
aplay -D bluealsa:HCI=hci<index like 0>,DEV=<bt mac>,PROFILE=a2dp /usr/share/sounds/alsa/Front_Center.wav
If you can hear sound continue.
Now let’s save this speaker for permanent use inside /etc/asound.conf so you would not need to specify it each time you play music:
pcm.!default {
type asym
playback.pcm "btspeaker"
}
pcm.btspeaker {
type plug
slave.pcm {
type bluealsa
device "00:11:22:33:44:55"
profile "a2dp"
}
hint {
show on
description "My Bluetooth Speaker"
}
}
if everything goes fine you can run script and hear music:
aplay -D bluealsa:DEV=<device>,PROFILE=a2dp /usr/share/sounds/alsa/Rear_Left.wav
Installing mopidy
If you are lucky enough and have latest installation of OS, you can try (and probably would be sucesfull):
apt install mopidy
Otherwise you can visit my Mopidy installation and issues article and do.
pip2 install --upgrade --force-reinstall mopidy==2.1.0
Troubleshooting
Check logs before doing anything - it would give you hints on what’s wrong:
journalctl -u bluetooth -b
journalctl -u bluealsa -b
journalctl -u mopidy -b
dmesg -w
a2dp-sink profile connect failed for : Protocol not available
Reason: bluealsa not started properly, or is misconfigured
If you have more than one bluetooth adapter (or even if you have one, just to be sure) put device parameter into bluealsa.service. See installing bluealsa section for example.
To find out which adapter id to use - list them using
hciconfig list command
/usr/bin/bluealsa: E: Couldn’t release transport: GDBus.Error:org.freedesktop.DBus.Error.UnknownObject: Method “Release” with signature “” on interface “org.bluez.MediaTransport1” doesn’t exist
I just restart bluealsa here - usually it helps.
“Operation not possible due to RF-kill (132)” or something is fishy with adapter
1) I would check if it’s not blocked with rfkill application. Unblock it if it was blocked:
rfkill list all
rfkill unblock <index of adapter>
restart your bluealsa and bluetooth services.
Bluetooth device is disconnected after some timeout if no music is playing
I ended up using this script to re-connect (thankfully bluetoothctl can be ran as bash script):
#!/usr/bin/env bash
sudo bluetoothctl disconnect
sudo bluetoothctl agent off
sudo bluetoothctl power off
sleep 3
sudo bluetoothctl power on
sudo bluetoothctl agent on
sudo bluetoothctl connect 00:11:22:33:44:55
New tracks added to mopidy local folder cannot be played
Run local scan and restart mopidy (without restart it would not see those tracks):
sudo mopidyctl local scan
systemctl restart mopidy
also ensure that your media files belong to mopidy:audio user and group.
Tracks are not looped
mpc single on
mpc repeat on
Integrating into Home Assistant
First - you need to configure Media player (mopidy in our case) - this would allow us to control speaker:
media_player:
- platform: mpd
name: mopidy
host: 127.0.0.1
port: 6600
If you want to play local tracks (for white noise for example) - copy them to /var/lib/mopidy/media/white_noise.
Add to config file (for example track that is located in folder /var/lib/mopidy/media/white_noise/cat.m4a):
mopidy_white_noise_cat:
sequence:
- service: media_player.play_media
data:
entity_id: media_player.mopidy
media_content_type: music
media_content_id: local:track:white_noise/cat.m4a
If you want to listen to radio stations - you can also configure like this:
mopidy_stream_rock:
sequence:
- service: media_player.play_media
data:
entity_id: media_player.mopidy
media_content_type: audio/mpeg
media_content_id: http://live.radioec.com.ua:8000/rock.m3u
Also remember the script from troulbeshooting part? I’ve also added it as a button:
shell_command:
restart_white_noise: /opt/white_noise/restart_speaker.sh