diff --git a/.coveragerc b/.coveragerc index e85c97ef80c411f11f8d6d5bc033d9e17327cbb1..b974356e0fe0aa34ed003a6235e60221d0f509bc 100644 --- a/.coveragerc +++ b/.coveragerc @@ -611,6 +611,8 @@ omit = homeassistant/components/shodan/sensor.py homeassistant/components/sht31/sensor.py homeassistant/components/sigfox/sensor.py + homeassistant/components/signal_messenger/__init__.py + homeassistant/components/signal_messenger/notify.py homeassistant/components/simplepush/notify.py homeassistant/components/simplisafe/__init__.py homeassistant/components/simplisafe/alarm_control_panel.py diff --git a/CODEOWNERS b/CODEOWNERS index 472798f72a6b2c61e511e3037700ce7b46c2aeb8..6723244c089ef667cd585e48b2688d1e6fec94fa 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -281,6 +281,7 @@ homeassistant/components/seventeentrack/* @bachya homeassistant/components/shell_command/* @home-assistant/core homeassistant/components/shiftr/* @fabaff homeassistant/components/shodan/* @fabaff +homeassistant/components/signal_messenger/* @bbernhard homeassistant/components/simplisafe/* @bachya homeassistant/components/sinch/* @bendikrb homeassistant/components/slide/* @ualex73 diff --git a/homeassistant/components/signal_messenger/__init__.py b/homeassistant/components/signal_messenger/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..045eb95f1b31afeb7e4b80652a593ce59c9c5c3e --- /dev/null +++ b/homeassistant/components/signal_messenger/__init__.py @@ -0,0 +1 @@ +"""The signalmessenger component.""" diff --git a/homeassistant/components/signal_messenger/manifest.json b/homeassistant/components/signal_messenger/manifest.json new file mode 100644 index 0000000000000000000000000000000000000000..b3494ce8bab8894031ec020280fee9e4fd7027e7 --- /dev/null +++ b/homeassistant/components/signal_messenger/manifest.json @@ -0,0 +1,10 @@ +{ + "domain": "signal_messenger", + "name": "signal_messenger", + "documentation": "https://www.home-assistant.io/integrations/signal_messenger", + "dependencies": [], + "codeowners": ["@bbernhard"], + "requirements": [ + "pysignalclirestapi==0.1.4" + ] +} diff --git a/homeassistant/components/signal_messenger/notify.py b/homeassistant/components/signal_messenger/notify.py new file mode 100644 index 0000000000000000000000000000000000000000..8fbf9c708734d86cb6ce8a518ef8d9c0a7f545f3 --- /dev/null +++ b/homeassistant/components/signal_messenger/notify.py @@ -0,0 +1,71 @@ +"""Signal Messenger for notify component.""" +import logging + +from pysignalclirestapi import SignalCliRestApi, SignalCliRestApiError +import voluptuous as vol + +from homeassistant.components.notify import ( + ATTR_DATA, + PLATFORM_SCHEMA, + BaseNotificationService, +) +import homeassistant.helpers.config_validation as cv + +_LOGGER = logging.getLogger(__name__) + +CONF_SENDER_NR = "number" +CONF_RECP_NR = "recipients" +CONF_SIGNAL_CLI_REST_API = "url" +ATTR_FILENAME = "attachment" + +PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend( + { + vol.Required(CONF_SENDER_NR): cv.string, + vol.Required(CONF_SIGNAL_CLI_REST_API): cv.string, + vol.Required(CONF_RECP_NR): vol.All(cv.ensure_list, [cv.string]), + } +) + + +def get_service(hass, config, discovery_info=None): + """Get the SignalMessenger notification service.""" + + sender_nr = config[CONF_SENDER_NR] + recp_nrs = config[CONF_RECP_NR] + signal_cli_rest_api_url = config[CONF_SIGNAL_CLI_REST_API] + + signal_cli_rest_api = SignalCliRestApi( + signal_cli_rest_api_url, sender_nr, api_version=1 + ) + + return SignalNotificationService(recp_nrs, signal_cli_rest_api) + + +class SignalNotificationService(BaseNotificationService): + """Implement the notification service for SignalMessenger.""" + + def __init__(self, recp_nrs, signal_cli_rest_api): + """Initialize the service.""" + + self._recp_nrs = recp_nrs + self._signal_cli_rest_api = signal_cli_rest_api + + def send_message(self, message="", **kwargs): + """Send a message to a one or more recipients. + + Additionally a file can be attached. + """ + + _LOGGER.debug("Sending signal message") + + data = kwargs.get(ATTR_DATA) + + filename = None + if data is not None and ATTR_FILENAME in data: + filename = data[ATTR_FILENAME] + + try: + self._signal_cli_rest_api.send_message(message, self._recp_nrs, filename) + except SignalCliRestApiError as ex: + _LOGGER.error("%s", ex) + raise ex diff --git a/requirements_all.txt b/requirements_all.txt index 87ca2a46177f4b15e43dacdaa3b157096aa75b5b..e59839722439529d5e343113e5b3858ad610037f 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -1482,6 +1482,9 @@ pysesame2==1.0.1 # homeassistant.components.goalfeed pysher==1.0.1 +# homeassistant.components.signal_messenger +pysignalclirestapi==0.1.4 + # homeassistant.components.sma pysma==0.3.4