From 13b0beee3185b5b3e5ccbb91ee677524d4759b3a Mon Sep 17 00:00:00 2001 From: happyleavesaoc Date: Tue, 9 Feb 2016 18:29:28 -0500 Subject: [PATCH] snapcast --- .coveragerc | 1 + .../components/media_player/snapcast.py | 85 +++++++++++++++++++ requirements_all.txt | 3 + 3 files changed, 89 insertions(+) create mode 100644 homeassistant/components/media_player/snapcast.py diff --git a/.coveragerc b/.coveragerc index b8a5457f69b0..06cfc7d7471d 100644 --- a/.coveragerc +++ b/.coveragerc @@ -99,6 +99,7 @@ omit = homeassistant/components/media_player/mpd.py homeassistant/components/media_player/plex.py homeassistant/components/media_player/samsungtv.py + homeassistant/components/media_player/snapcast.py homeassistant/components/media_player/sonos.py homeassistant/components/media_player/squeezebox.py homeassistant/components/notify/free_mobile.py diff --git a/homeassistant/components/media_player/snapcast.py b/homeassistant/components/media_player/snapcast.py new file mode 100644 index 000000000000..23ce1515f397 --- /dev/null +++ b/homeassistant/components/media_player/snapcast.py @@ -0,0 +1,85 @@ +""" +homeassistant.components.media_player.snapcast +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Provides functionality to interact with Snapcast clients. + +For more details about this platform, please refer to the documentation at +https://home-assistant.io/components/media_player.snapcast/ +""" + +import logging +import socket + +from homeassistant.const import ( + STATE_ON, STATE_OFF) + +from homeassistant.components.media_player import ( + MediaPlayerDevice, + SUPPORT_VOLUME_SET, SUPPORT_VOLUME_MUTE) + +SUPPORT_SNAPCAST = SUPPORT_VOLUME_SET | SUPPORT_VOLUME_MUTE +DOMAIN = 'snapcast' +REQUIREMENTS = ['snapcast==1.1.1'] +_LOGGER = logging.getLogger(__name__) + + +# pylint: disable=unused-argument +def setup_platform(hass, config, add_devices, discovery_info=None): + """ Sets up the Snapcast platform. """ + import snapcast.control + host = config.get('host') + port = config.get('port', snapcast.control.CONTROL_PORT) + if not host: + _LOGGER.error('No snapserver host specified') + return + try: + server = snapcast.control.Snapserver(host, port) + except socket.gaierror: + _LOGGER.error('Could not connect to Snapcast server at %s:%d', + host, port) + return + add_devices([SnapcastDevice(client) for client in server.clients]) + + +class SnapcastDevice(MediaPlayerDevice): + """ Represents a Snapcast client device. """ + + # pylint: disable=abstract-method + + def __init__(self, client): + self._client = client + + @property + def name(self): + """ Device name. """ + return self._client.identifier + + @property + def volume_level(self): + """ Volume level. """ + return self._client.volume / 100 + + @property + def is_volume_muted(self): + """ Volume muted. """ + return self._client.muted + + @property + def supported_media_commands(self): + """ Flags of media commands that are supported. """ + return SUPPORT_SNAPCAST + + @property + def state(self): + """ State of the player. """ + if self._client.connected: + return STATE_ON + return STATE_OFF + + def mute_volume(self, mute): + """ Mute status. """ + self._client.muted = mute + + def set_volume_level(self, volume): + """ Volume level. """ + self._client.volume = round(volume * 100) diff --git a/requirements_all.txt b/requirements_all.txt index 377a06ab21d3..1a0994258bd2 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -227,6 +227,9 @@ slacker==0.6.8 # homeassistant.components.notify.xmpp sleekxmpp==1.3.1 +# homeassistant.components.media_player.snapcast +snapcast==1.1.1 + # homeassistant.components.sensor.speedtest speedtest-cli==0.3.4