core/homeassistant/components/pushover/notify.py

113 lines
4.1 KiB
Python
Raw Normal View History

"""Pushover platform for notify component."""
import logging
from pushover import Client, InitError, RequestError
2019-10-14 08:56:40 +00:00
import requests
2016-08-27 00:43:59 +00:00
import voluptuous as vol
from homeassistant.components.notify import (
2019-07-31 19:25:30 +00:00
ATTR_DATA,
ATTR_TARGET,
ATTR_TITLE,
ATTR_TITLE_DEFAULT,
PLATFORM_SCHEMA,
BaseNotificationService,
)
from homeassistant.const import CONF_API_KEY
import homeassistant.helpers.config_validation as cv
_LOGGER = logging.getLogger(__name__)
2019-07-31 19:25:30 +00:00
ATTR_ATTACHMENT = "attachment"
2019-07-31 19:25:30 +00:00
CONF_USER_KEY = "user_key"
2019-07-31 19:25:30 +00:00
PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend(
{vol.Required(CONF_USER_KEY): cv.string, vol.Required(CONF_API_KEY): cv.string}
)
2016-08-27 00:43:59 +00:00
def get_service(hass, config, discovery_info=None):
2016-03-08 10:46:32 +00:00
"""Get the Pushover notification service."""
try:
return PushoverNotificationService(
2019-07-31 19:25:30 +00:00
hass, config[CONF_USER_KEY], config[CONF_API_KEY]
)
except InitError:
_LOGGER.error("Wrong API key supplied")
2015-11-09 06:15:34 +00:00
return None
class PushoverNotificationService(BaseNotificationService):
2016-03-08 10:46:32 +00:00
"""Implement the notification service for Pushover."""
def __init__(self, hass, user_key, api_token):
2016-03-08 10:46:32 +00:00
"""Initialize the service."""
self._hass = hass
self._user_key = user_key
self._api_token = api_token
2019-07-31 19:25:30 +00:00
self.pushover = Client(self._user_key, api_token=self._api_token)
2019-07-31 19:25:30 +00:00
def send_message(self, message="", **kwargs):
2016-03-08 10:46:32 +00:00
"""Send a message to a user."""
# Make a copy and use empty dict if necessary
data = dict(kwargs.get(ATTR_DATA) or {})
2019-07-31 19:25:30 +00:00
data["title"] = kwargs.get(ATTR_TITLE, ATTR_TITLE_DEFAULT)
# Check for attachment.
if ATTR_ATTACHMENT in data:
# If attachment is a URL, use requests to open it as a stream.
2019-07-31 19:25:30 +00:00
if data[ATTR_ATTACHMENT].startswith("http"):
try:
response = requests.get(
2019-07-31 19:25:30 +00:00
data[ATTR_ATTACHMENT], stream=True, timeout=5
)
if response.status_code == 200:
# Replace the attachment identifier with file object.
data[ATTR_ATTACHMENT] = response.content
else:
_LOGGER.error(
"Failed to download image %s, response code: %d",
data[ATTR_ATTACHMENT],
response.status_code,
)
# Remove attachment key to send without attachment.
del data[ATTR_ATTACHMENT]
except requests.exceptions.RequestException as ex_val:
_LOGGER.error(ex_val)
# Remove attachment key to try sending without attachment
del data[ATTR_ATTACHMENT]
else:
# Not a URL, check valid path first
if self._hass.config.is_allowed_path(data[ATTR_ATTACHMENT]):
# try to open it as a normal file.
try:
2019-07-31 19:25:30 +00:00
file_handle = open(data[ATTR_ATTACHMENT], "rb")
# Replace the attachment identifier with file object.
data[ATTR_ATTACHMENT] = file_handle
except OSError as ex_val:
_LOGGER.error(ex_val)
# Remove attachment key to send without attachment.
del data[ATTR_ATTACHMENT]
else:
2019-07-31 19:25:30 +00:00
_LOGGER.error("Path is not whitelisted")
# Remove attachment key to send without attachment.
del data[ATTR_ATTACHMENT]
targets = kwargs.get(ATTR_TARGET)
if not isinstance(targets, list):
targets = [targets]
for target in targets:
if target is not None:
2019-07-31 19:25:30 +00:00
data["device"] = target
try:
self.pushover.send_message(message, **data)
except ValueError as val_err:
_LOGGER.error(val_err)
except RequestError:
_LOGGER.exception("Could not send pushover notification")