1 """Support to export sensor values via RSS feed."""
3 from __future__
import annotations
5 from html
import escape
7 from aiohttp
import web
8 import voluptuous
as vol
16 CONTENT_TYPE_XML =
"text/xml"
17 DOMAIN =
"rss_feed_template"
19 CONFIG_SCHEMA = vol.Schema(
23 cv.match_all: vol.Schema(
25 vol.Optional(
"requires_api_password", default=
True): cv.boolean,
26 vol.Optional(
"title"): cv.template,
27 vol.Required(
"items"): vol.All(
31 vol.Optional(
"title"): cv.template,
32 vol.Optional(
"description"): cv.template,
41 extra=vol.ALLOW_EXTRA,
45 def setup(hass: HomeAssistant, config: ConfigType) -> bool:
46 """Set up the RSS feed template component."""
47 for feeduri, feedconfig
in config[DOMAIN].items():
48 url = f
"/api/rss_template/{feeduri}"
50 requires_auth: bool = feedconfig[
"requires_api_password"]
52 items: list[dict[str, Template]] = feedconfig[
"items"]
53 rss_view =
RssView(url, requires_auth, feedconfig.get(
"title"), items)
54 hass.http.register_view(rss_view)
60 """Export states and other values as RSS."""
68 title: Template |
None,
69 items: list[dict[str, Template]],
71 """Initialize the rss view."""
77 async
def get(self, request: web.Request) -> web.Response:
78 """Generate the RSS view XML."""
79 response =
'<?xml version="1.0" encoding="utf-8"?>\n\n'
81 response +=
'<rss version="2.0">\n'
82 response +=
" <channel>\n"
83 if self.
_title_title
is not None:
84 response += f
" <title>{escape(self._title.async_render(parse_result=False))}</title>\n"
86 response +=
" <title>Home Assistant</title>\n"
88 response +=
" <link>https://www.home-assistant.io/integrations/rss_feed_template/</link>\n"
89 response +=
" <description>Home automation feed</description>\n"
91 for item
in self.
_items_items:
92 response +=
" <item>\n"
94 response +=
" <title>"
95 response += escape(item[
"title"].async_render(parse_result=
False))
96 response +=
"</title>\n"
97 if "description" in item:
98 response +=
" <description>"
99 response += escape(item[
"description"].async_render(parse_result=
False))
100 response +=
"</description>\n"
101 response +=
" </item>\n"
103 response +=
" </channel>\n"
104 response +=
"</rss>\n"
106 return web.Response(body=response, content_type=CONTENT_TYPE_XML)