Skip to content

Instantly share code, notes, and snippets.

@grodowski
Last active December 18, 2019 09:40
Show Gist options
  • Save grodowski/9fba926fe0f4e41f6af83a63b4d0d9a9 to your computer and use it in GitHub Desktop.
Save grodowski/9fba926fe0f4e41f6af83a63b4d0d9a9 to your computer and use it in GitHub Desktop.
Home Automation for Bose Soundtouch

Installation

  • install dependencies
  • sudo cp dj.service /etc/systemd/system/
  • sudo systemctl enable dj.service
  • sudo journalctl -fu dj.service

Features

  • alarm clock
  • automatic zone creation
import time
import schedule
import pdb
from random import sample
from libsoundtouch import discover_devices
from libsoundtouch.utils import Source
SPOTIFY_UID = 1158984004
class Automator(object):
def __init__(self):
self.fetch_devices()
self.zone_master_id = None
def alarm_clock(self):
print("[alarm_clock] running alarm clock")
self.fetch_devices()
print("[alarm_clock] %s" % self.devices)
track_id = sample([
"spotify:track:6h9Uu8dPr1nJX73C6JRKe1",
"spotify:track:5CaXxLM568tBh1PwhXdciZ",
"spotify:track:77vLpSAMNzeYL4EBeZxWqI",
"spotify:track:6G32zC3WzSYlBUgUO14tPF",
"spotify:track:6JvG7KVwnfmnXSJW7XMtb6",
"spotify:track:6kVuMP4u1WDFPmGxi1429F"
], 1)[0]
for device in self.devices:
device.power_on()
device.set_volume(10)
self.devices[0].play_media(Source.SPOTIFY, track_id, SPOTIFY_UID)
print("[alarm_clock] done %s" % track_id)
def zone_maker(self):
for i, device in enumerate(self.devices):
zone_status = device.zone_status()
if zone_status:
self.zone_master_id = zone_statu.master_id
else:
self.zone_master_id = None
if device.status().play_status == "PLAY_STATE" and not self.zone_master_id:
print("[zone_maker] starting with master: %s (%s)" % (device.config.name, device.config.device_id))
device.create_zone(self.devices)
self.zone_master_id = device.config.device_id
def fetch_devices(self):
self.devices = discover_devices(timeout=2)
automator = Automator()
schedule.every(10).seconds.do(automator.zone_maker)
schedule.every().day.at("07:00").do(automator.alarm_clock) # system time
while True:
schedule.run_pending()
time.sleep(1)
[Unit]
Description=DJ
After=network.target
[Service]
ExecStart=/usr/bin/python3 app.py
WorkingDirectory=/home/pi/dj
StandardOutput=inherit
StandardError=inherit
Restart=always
User=pi
[Install]
WantedBy=multi-user.target
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment