From 982a0bc19552efceab18ea73b9d8f723701f2713 Mon Sep 17 00:00:00 2001 From: chrom3 Date: Wed, 14 Sep 2016 21:54:45 +0200 Subject: [PATCH] Kodi notification platform (#3403) --- .coveragerc | 1 + homeassistant/components/notify/kodi.py | 70 +++++++++++++++++++++++++ requirements_all.txt | 1 + 3 files changed, 72 insertions(+) create mode 100644 homeassistant/components/notify/kodi.py diff --git a/.coveragerc b/.coveragerc index fdaaf8a12ea..938f42fe222 100644 --- a/.coveragerc +++ b/.coveragerc @@ -186,6 +186,7 @@ omit = homeassistant/components/notify/group.py homeassistant/components/notify/instapush.py homeassistant/components/notify/joaoapps_join.py + homeassistant/components/notify/kodi.py homeassistant/components/notify/llamalab_automate.py homeassistant/components/notify/message_bird.py homeassistant/components/notify/nma.py diff --git a/homeassistant/components/notify/kodi.py b/homeassistant/components/notify/kodi.py new file mode 100644 index 00000000000..60cf307515f --- /dev/null +++ b/homeassistant/components/notify/kodi.py @@ -0,0 +1,70 @@ +""" +Kodi notification service. + +For more details about this platform, please refer to the documentation at +https://home-assistant.io/components/notify.kodi/ +""" +import logging +import voluptuous as vol + +from homeassistant.const import (ATTR_ICON, CONF_HOST, CONF_PORT, + CONF_USERNAME, CONF_PASSWORD) +from homeassistant.components.notify import (ATTR_TITLE, ATTR_TITLE_DEFAULT, + ATTR_DATA, PLATFORM_SCHEMA, + BaseNotificationService) +import homeassistant.helpers.config_validation as cv + +_LOGGER = logging.getLogger(__name__) +REQUIREMENTS = ['jsonrpc-requests==0.3'] + +DEFAULT_PORT = 8080 + +PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ + vol.Required(CONF_HOST): cv.string, + vol.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port, + vol.Optional(CONF_USERNAME): cv.string, + vol.Optional(CONF_PASSWORD): cv.string, +}) + +ATTR_DISPLAYTIME = 'displaytime' + + +def get_service(hass, config): + """Return the notify service.""" + url = '{}:{}'.format(config.get(CONF_HOST), config.get(CONF_PORT)) + + auth = (config.get(CONF_USERNAME), config.get(CONF_PASSWORD)) + + return KODINotificationService( + url, + auth + ) + + +# pylint: disable=too-few-public-methods +class KODINotificationService(BaseNotificationService): + """Implement the notification service for Kodi.""" + + def __init__(self, url, auth=None): + """Initialize the service.""" + import jsonrpc_requests + self._url = url + self._server = jsonrpc_requests.Server( + '{}/jsonrpc'.format(self._url), + auth=auth, + timeout=5) + + def send_message(self, message="", **kwargs): + """Send a message to Kodi.""" + import jsonrpc_requests + try: + data = kwargs.get(ATTR_DATA) or {} + + displaytime = data.get(ATTR_DISPLAYTIME, 10000) + icon = data.get(ATTR_ICON, "info") + title = kwargs.get(ATTR_TITLE, ATTR_TITLE_DEFAULT) + self._server.GUI.ShowNotification(title, message, icon, + displaytime) + + except jsonrpc_requests.jsonrpc.TransportError: + _LOGGER.warning('Unable to fetch Kodi data, Is Kodi online?') diff --git a/requirements_all.txt b/requirements_all.txt index 49f63c6b4b2..400ee949c7f 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -210,6 +210,7 @@ influxdb==3.0.0 insteon_hub==0.4.5 # homeassistant.components.media_player.kodi +# homeassistant.components.notify.kodi jsonrpc-requests==0.3 # homeassistant.scripts.keyring