""" Exports sensor values via RSS feed. For more details about this platform, please refer to the documentation at https://home-assistant.io/components/rss_feed_template/ """ import asyncio from html import escape from aiohttp import web import voluptuous as vol from homeassistant.components.http import HomeAssistantView import homeassistant.helpers.config_validation as cv CONTENT_TYPE_XML = 'text/xml' DEPENDENCIES = ['http'] DOMAIN = 'rss_feed_template' CONFIG_SCHEMA = vol.Schema({ DOMAIN: vol.Schema({ cv.match_all: vol.Schema({ vol.Optional('requires_api_password', default=True): cv.boolean, vol.Optional('title'): cv.template, vol.Required('items'): vol.All( cv.ensure_list, [{ vol.Optional('title'): cv.template, vol.Optional('description'): cv.template, }] ) }) }) }, extra=vol.ALLOW_EXTRA) def setup(hass, config): """Set up the RSS feed template component.""" for (feeduri, feedconfig) in config[DOMAIN].items(): url = '/api/rss_template/%s' % feeduri requires_auth = feedconfig.get('requires_api_password') title = feedconfig.get('title') if title is not None: title.hass = hass items = feedconfig.get('items') for item in items: if 'title' in item: item['title'].hass = hass if 'description' in item: item['description'].hass = hass rss_view = RssView(url, requires_auth, title, items) hass.http.register_view(rss_view) return True class RssView(HomeAssistantView): """Export states and other values as RSS.""" requires_auth = True url = None name = 'rss_template' _title = None _items = None def __init__(self, url, requires_auth, title, items): """Initialize the rss view.""" self.url = url self.requires_auth = requires_auth self._title = title self._items = items @asyncio.coroutine def get(self, request, entity_id=None): """Generate the RSS view XML.""" response = '\n\n' response += '\n' if self._title is not None: response += (' %s\n' % escape(self._title.async_render())) for item in self._items: response += ' \n' if 'title' in item: response += ' ' response += escape(item['title'].async_render()) response += '\n' if 'description' in item: response += ' ' response += escape(item['description'].async_render()) response += '\n' response += ' \n' response += '\n' return web.Response( body=response, content_type=CONTENT_TYPE_XML, status=200)