diff --git a/.coveragerc b/.coveragerc index d5536795e9c..b4f05ee01a3 100644 --- a/.coveragerc +++ b/.coveragerc @@ -272,6 +272,7 @@ omit = homeassistant/components/notify/telegram.py homeassistant/components/notify/telstra.py homeassistant/components/notify/twilio_sms.py + homeassistant/components/notify/twilio_call.py homeassistant/components/notify/twitter.py homeassistant/components/notify/xmpp.py homeassistant/components/nuimo_controller.py diff --git a/homeassistant/components/notify/twilio_call.py b/homeassistant/components/notify/twilio_call.py new file mode 100644 index 00000000000..374e77b9507 --- /dev/null +++ b/homeassistant/components/notify/twilio_call.py @@ -0,0 +1,74 @@ +""" +Twilio Call platform for notify component. + +For more details about this platform, please refer to the documentation at +https://home-assistant.io/components/notify.twilio_call/ +""" +import logging +import urllib + +import voluptuous as vol + +import homeassistant.helpers.config_validation as cv +from homeassistant.components.notify import ( + ATTR_TARGET, PLATFORM_SCHEMA, BaseNotificationService) + +_LOGGER = logging.getLogger(__name__) +REQUIREMENTS = ["twilio==5.7.0"] + + +CONF_ACCOUNT_SID = "account_sid" +CONF_AUTH_TOKEN = "auth_token" +CONF_FROM_NUMBER = "from_number" + +PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ + vol.Required(CONF_ACCOUNT_SID): cv.string, + vol.Required(CONF_AUTH_TOKEN): cv.string, + vol.Required(CONF_FROM_NUMBER): + vol.All(cv.string, vol.Match(r"^\+?[1-9]\d{1,14}$")), +}) + + +def get_service(hass, config, discovery_info=None): + """Get the Twilio Call notification service.""" + # pylint: disable=import-error + from twilio.rest import TwilioRestClient + + twilio_client = TwilioRestClient(config[CONF_ACCOUNT_SID], + config[CONF_AUTH_TOKEN]) + + return TwilioCallNotificationService(twilio_client, + config[CONF_FROM_NUMBER]) + + +class TwilioCallNotificationService(BaseNotificationService): + """Implement the notification service for the Twilio Call service.""" + + def __init__(self, twilio_client, from_number): + """Initialize the service.""" + self.client = twilio_client + self.from_number = from_number + + def send_message(self, message="", **kwargs): + """Call to specified target users.""" + from twilio import TwilioRestException + + targets = kwargs.get(ATTR_TARGET) + + if not targets: + _LOGGER.info("At least 1 target is required") + return + + if message.startswith(("http://", "https://")): + twimlet_url = message + else: + twimlet_url = "http://twimlets.com/message?Message=" + twimlet_url += urllib.parse.quote(message, safe="") + + for target in targets: + try: + self.client.calls.create(to=target, + url=twimlet_url, + from_=self.from_number) + except TwilioRestException as exc: + _LOGGER.error(exc) diff --git a/homeassistant/components/notify/twilio_sms.py b/homeassistant/components/notify/twilio_sms.py index 950e0eed221..ab3ac89e6b2 100644 --- a/homeassistant/components/notify/twilio_sms.py +++ b/homeassistant/components/notify/twilio_sms.py @@ -13,7 +13,7 @@ from homeassistant.components.notify import ( ATTR_TARGET, PLATFORM_SCHEMA, BaseNotificationService) _LOGGER = logging.getLogger(__name__) -REQUIREMENTS = ["twilio==5.4.0"] +REQUIREMENTS = ["twilio==5.7.0"] CONF_ACCOUNT_SID = "account_sid" diff --git a/requirements_all.txt b/requirements_all.txt index 247a12a455c..2e983ea0f54 100755 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -635,8 +635,9 @@ tikteck==0.4 # homeassistant.components.switch.transmission transmissionrpc==0.11 +# homeassistant.components.notify.twilio_call # homeassistant.components.notify.twilio_sms -twilio==5.4.0 +twilio==5.7.0 # homeassistant.components.sensor.uber uber_rides==0.2.7