diff --git a/roles/music/defaults/main.yaml b/roles/music/defaults/main.yaml index 3b9e2b6..fa95b47 100644 --- a/roles/music/defaults/main.yaml +++ b/roles/music/defaults/main.yaml @@ -1 +1,2 @@ music_audio_user: audio +music_mqtt_mpd_volume: bitlair/music/space/volume diff --git a/roles/music/handlers/main.yaml b/roles/music/handlers/main.yaml index f3d692b..a1b1b18 100644 --- a/roles/music/handlers/main.yaml +++ b/roles/music/handlers/main.yaml @@ -23,3 +23,9 @@ name: soundboard state: restarted daemon_reload: true + +- name: restart mpd-volume-to-mqtt + systemd: + name: mpd-volume-to-mqtt + state: restarted + daemon_reload: true diff --git a/roles/music/tasks/mpd.yaml b/roles/music/tasks/mpd.yaml index 78c9581..31aa7a9 100644 --- a/roles/music/tasks/mpd.yaml +++ b/roles/music/tasks/mpd.yaml @@ -5,3 +5,28 @@ - jackd - mpd state: present + +- name: Install mpd-volume-to-mqtt script + template: + src: mpd-volume-to-mqtt.sh + dest: /opt/mpd-volume-to-mqtt.sh + owner: root + group: root + mode: 0644 + notify: restart mpd-volume-to-mqtt + +- name: Install mpd-volume-to-mqtt service + template: + src: mpd-volume-to-mqtt.service + dest: /etc/systemd/system/mpd-volume-to-mqtt.service + owner: root + group: root + mode: 0644 + notify: restart mpd-volume-to-mqtt + +- name: Enable mpd-volume-to-mqtt + systemd: + name: mpd-volume-to-mqtt + state: started + enabled: true + daemon_reload: true diff --git a/roles/music/templates/mpd-volume-to-mqtt.service b/roles/music/templates/mpd-volume-to-mqtt.service new file mode 100644 index 0000000..e98c32f --- /dev/null +++ b/roles/music/templates/mpd-volume-to-mqtt.service @@ -0,0 +1,16 @@ +# {{ ansible_managed }} + +[Unit] +Description=MPD Volume to MQTT +After=network.target +Requires=mpd.service + +[Service] +Type=simple +Restart=always +RestartSec=2s +ExecStart=/bin/bash /opt/mpd-volume-to-mqtt.sh +DynamicUser=true + +[Install] +WantedBy=multi-user.target diff --git a/roles/music/templates/mpd-volume-to-mqtt.sh b/roles/music/templates/mpd-volume-to-mqtt.sh new file mode 100644 index 0000000..ac3230b --- /dev/null +++ b/roles/music/templates/mpd-volume-to-mqtt.sh @@ -0,0 +1,21 @@ +# {{ ansible_managed }} + +#!/bin/bash + +set -eu +set -o pipefail + + +trap 'mqtt-simple -h {{ mqtt_internal_host }} -p '{{ music_mqtt_mpd_volume }}' -m "" -r' EXIT + +prev_volume=x + +(echo mixer; mpc idleloop) | while read event; do + if [ $event = "mixer" ]; then + volume=`mpc volume | sed -nr 's/^volume: ([0-9]+)%$/\1/p'` + if [ "$prev_volume" != "$volume" ]; then + mqtt-simple -h {{ mqtt_internal_host }} -p '{{ music_mqtt_mpd_volume }} -r' -m "$volume" + fi + prev_volume=$volume + fi +done