diff --git a/.coveragerc b/.coveragerc index af5cf49e02dbd3f64edebde9a841f72eae7ef256..0288fc0d39f28c87b63d8cba4af353b6448ab6e3 100644 --- a/.coveragerc +++ b/.coveragerc @@ -180,6 +180,7 @@ omit = homeassistant/components/sensor/nzbget.py homeassistant/components/sensor/onewire.py homeassistant/components/sensor/openweathermap.py + homeassistant/components/sensor/plex.py homeassistant/components/sensor/rest.py homeassistant/components/sensor/sabnzbd.py homeassistant/components/sensor/snmp.py diff --git a/homeassistant/components/sensor/plex.py b/homeassistant/components/sensor/plex.py new file mode 100644 index 0000000000000000000000000000000000000000..e35cb54cab82b9215877e776d91ab10159adda8e --- /dev/null +++ b/homeassistant/components/sensor/plex.py @@ -0,0 +1,99 @@ +""" +Support for Plex media server monitoring. + +For more details about this platform, please refer to the documentation at +https://home-assistant.io/components/sensor.plex/ +""" +from datetime import timedelta +import logging +import voluptuous as vol + +from homeassistant.const import (CONF_NAME, CONF_PLATFORM, CONF_USERNAME, + CONF_PASSWORD, CONF_HOST, CONF_PORT) +from homeassistant.helpers.entity import Entity +from homeassistant.util import Throttle +import homeassistant.helpers.config_validation as cv + +REQUIREMENTS = ['plexapi==1.1.0'] + +CONF_SERVER = 'server' +MIN_TIME_BETWEEN_UPDATES = timedelta(minutes=1) + +_LOGGER = logging.getLogger(__name__) + +PLATFORM_SCHEMA = vol.Schema({ + vol.Required(CONF_PLATFORM): 'plex', + vol.Optional(CONF_USERNAME): cv.string, + vol.Optional(CONF_PASSWORD): cv.string, + vol.Optional(CONF_SERVER): cv.string, + vol.Optional(CONF_NAME, default='Plex'): cv.string, + vol.Optional(CONF_HOST, default='localhost'): cv.string, + vol.Optional(CONF_PORT, default=32400): vol.All(vol.Coerce(int), + vol.Range(min=1, + max=65535)) +}) + + +# pylint: disable=unused-argument +def setup_platform(hass, config, add_devices, discovery_info=None): + """Setup the Demo sensors.""" + name = config.get(CONF_NAME) + plex_user = config.get(CONF_USERNAME) + plex_password = config.get(CONF_PASSWORD) + plex_server = config.get(CONF_SERVER) + plex_host = config.get(CONF_HOST) + plex_port = config.get(CONF_PORT) + plex_url = 'http://' + plex_host + ':' + str(plex_port) + add_devices([PlexSensor(name, plex_url, plex_user, + plex_password, plex_server)]) + + +class PlexSensor(Entity): + """Plex now playing sensor.""" + + # pylint: disable=too-many-arguments + def __init__(self, name, plex_url, plex_user, plex_password, plex_server): + """Initialize the sensor.""" + self._name = name + self._state = 0 + self._now_playing = [] + + if plex_user and plex_password: + from plexapi.myplex import MyPlexUser + user = MyPlexUser.signin(plex_user, plex_password) + server = plex_server if plex_server else user.resources()[0].name + self._server = user.getResource(server).connect() + else: + from plexapi.server import PlexServer + self._server = PlexServer(plex_url) + + self.update() + + @property + def name(self): + """Return the name of the sensor.""" + return self._name + + @property + def state(self): + """Return the state of the sensor.""" + return self._state + + @property + def unit_of_measurement(self): + """Return the unit this state is expressed in.""" + return "Watching" + + @property + def device_state_attributes(self): + """Return the state attributes.""" + return {content[0]: content[1] for content in self._now_playing} + + @Throttle(MIN_TIME_BETWEEN_UPDATES) + def update(self): + """Update method for plex sensor.""" + sessions = self._server.sessions() + now_playing = [(s.user.title, "{0} ({1})".format(s.title, s.year)) + for s in sessions] + self._state = len(sessions) + self._now_playing = now_playing diff --git a/requirements_all.txt b/requirements_all.txt index d112e3944b60e23e90143a379d15aedfa0897379..069bd4ce48cc4e1abfbe152956ee5fb54c98dc5e 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -202,6 +202,7 @@ pexpect==4.0.1 phue==0.8 # homeassistant.components.media_player.plex +# homeassistant.components.sensor.plex plexapi==1.1.0 # homeassistant.components.thermostat.proliphix