""" Lannouncer platform for notify component. For more details about this platform, please refer to the documentation at https://home-assistant.io/components/notify.lannouncer/ """ import logging from urllib.parse import urlencode import socket import voluptuous as vol from homeassistant.components.notify import ( PLATFORM_SCHEMA, ATTR_DATA, BaseNotificationService) from homeassistant.const import (CONF_HOST, CONF_PORT) import homeassistant.helpers.config_validation as cv ATTR_METHOD = 'method' ATTR_METHOD_DEFAULT = 'speak' ATTR_METHOD_ALLOWED = ['speak', 'alarm'] DEFAULT_PORT = 1035 PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ vol.Required(CONF_HOST): cv.string, vol.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port, }) _LOGGER = logging.getLogger(__name__) def get_service(hass, config, discovery_info=None): """Get the Lannouncer notification service.""" host = config.get(CONF_HOST) port = config.get(CONF_PORT) return LannouncerNotificationService(hass, host, port) class LannouncerNotificationService(BaseNotificationService): """Implementation of a notification service for Lannouncer.""" def __init__(self, hass, host, port): """Initialize the service.""" self._hass = hass self._host = host self._port = port def send_message(self, message="", **kwargs): """Send a message to Lannouncer.""" data = kwargs.get(ATTR_DATA) if data is not None and ATTR_METHOD in data: method = data.get(ATTR_METHOD) else: method = ATTR_METHOD_DEFAULT if method not in ATTR_METHOD_ALLOWED: _LOGGER.error("Unknown method %s", method) return cmd = urlencode({method: message}) try: # Open socket sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.settimeout(10) sock.connect((self._host, self._port)) # Send message _LOGGER.debug("Sending message: %s", cmd) sock.sendall(cmd.encode()) sock.sendall("&@DONE@\n".encode()) # Check response buffer = sock.recv(1024) if buffer != b'LANnouncer: OK': _LOGGER.error("Error sending data to Lannnouncer: %s", buffer.decode()) # Close socket sock.close() except socket.gaierror: _LOGGER.error("Unable to connect to host %s", self._host) except socket.error: _LOGGER.exception("Failed to send data to Lannnouncer")