diff --git a/.coveragerc b/.coveragerc index f34b0baac17e..83e6971cc6a4 100644 --- a/.coveragerc +++ b/.coveragerc @@ -418,6 +418,7 @@ omit = homeassistant/components/mpchc/media_player.py homeassistant/components/mpd/media_player.py homeassistant/components/mqtt_room/sensor.py + homeassistant/components/msteams/notify.py homeassistant/components/mvglive/sensor.py homeassistant/components/mychevy/* homeassistant/components/mycroft/* diff --git a/CODEOWNERS b/CODEOWNERS index a5ad222323b8..eb29ee289157 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -190,6 +190,7 @@ homeassistant/components/monoprice/* @etsinko homeassistant/components/moon/* @fabaff homeassistant/components/mpd/* @fabaff homeassistant/components/mqtt/* @home-assistant/core +homeassistant/components/msteams/* @peroyvind homeassistant/components/mysensors/* @MartinHjelmare homeassistant/components/mystrom/* @fabaff homeassistant/components/neato/* @dshokouhi @Santobert diff --git a/homeassistant/components/msteams/__init__.py b/homeassistant/components/msteams/__init__.py new file mode 100644 index 000000000000..42423887fa6b --- /dev/null +++ b/homeassistant/components/msteams/__init__.py @@ -0,0 +1 @@ +"""The Microsoft Teams component.""" diff --git a/homeassistant/components/msteams/manifest.json b/homeassistant/components/msteams/manifest.json new file mode 100644 index 000000000000..f907cf570bb9 --- /dev/null +++ b/homeassistant/components/msteams/manifest.json @@ -0,0 +1,8 @@ +{ + "domain": "msteams", + "name": "Microsoft Teams", + "documentation": "https://www.home-assistant.io/integrations/msteams", + "requirements": ["pymsteams==0.1.12"], + "dependencies": [], + "codeowners": ["@peroyvind"] +} diff --git a/homeassistant/components/msteams/notify.py b/homeassistant/components/msteams/notify.py new file mode 100644 index 000000000000..c986f1d2363a --- /dev/null +++ b/homeassistant/components/msteams/notify.py @@ -0,0 +1,67 @@ +"""Microsoft Teams platform for notify component.""" +import logging + +import pymsteams +import voluptuous as vol + +from homeassistant.components.notify import ( + ATTR_DATA, + ATTR_TITLE, + ATTR_TITLE_DEFAULT, + PLATFORM_SCHEMA, + BaseNotificationService, +) +from homeassistant.const import CONF_URL +import homeassistant.helpers.config_validation as cv + +_LOGGER = logging.getLogger(__name__) + +ATTR_FILE_URL = "image_url" + +PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({vol.Required(CONF_URL): cv.url}) + + +def get_service(hass, config, discovery_info=None): + """Get the Microsoft Teams notification service.""" + webhook_url = config.get(CONF_URL) + + try: + return MSTeamsNotificationService(webhook_url) + + except RuntimeError as err: + _LOGGER.exception("Error in creating a new Microsoft Teams message: %s", err) + return None + + +class MSTeamsNotificationService(BaseNotificationService): + """Implement the notification service for Microsoft Teams.""" + + def __init__(self, webhook_url): + """Initialize the service.""" + self._webhook_url = webhook_url + self.teams_message = pymsteams.connectorcard(self._webhook_url) + + def send_message(self, message=None, **kwargs): + """Send a message to the webhook.""" + title = kwargs.get(ATTR_TITLE, ATTR_TITLE_DEFAULT) + data = kwargs.get(ATTR_DATA) + + self.teams_message.title(title) + + self.teams_message.text(message) + + if data is not None: + file_url = data.get(ATTR_FILE_URL) + + if file_url is not None: + if not file_url.startswith("http"): + _LOGGER.error("URL should start with http or https") + return + + message_section = pymsteams.cardsection() + message_section.addImage(file_url) + self.teams_message.addSection(message_section) + try: + self.teams_message.send() + except RuntimeError as err: + _LOGGER.error("Could not send notification. Error: %s", err) diff --git a/requirements_all.txt b/requirements_all.txt index 207b955f2494..8f22d229f561 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -1318,6 +1318,9 @@ pymodbus==1.5.2 # homeassistant.components.monoprice pymonoprice==0.3 +# homeassistant.components.msteams +pymsteams==0.1.12 + # homeassistant.components.yamaha_musiccast pymusiccast==0.1.6