105 lines
3.0 KiB
Python
105 lines
3.0 KiB
Python
"""
|
|
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 = '<?xml version="1.0" encoding="utf-8"?>\n\n'
|
|
|
|
response += '<rss>\n'
|
|
if self._title is not None:
|
|
response += (' <title>%s</title>\n' %
|
|
escape(self._title.async_render()))
|
|
|
|
for item in self._items:
|
|
response += ' <item>\n'
|
|
if 'title' in item:
|
|
response += ' <title>'
|
|
response += escape(item['title'].async_render())
|
|
response += '</title>\n'
|
|
if 'description' in item:
|
|
response += ' <description>'
|
|
response += escape(item['description'].async_render())
|
|
response += '</description>\n'
|
|
response += ' </item>\n'
|
|
|
|
response += '</rss>\n'
|
|
|
|
return web.Response(
|
|
body=response, content_type=CONTENT_TYPE_XML, status=200)
|