Home Assistant Unofficial Reference 2024.12.1
__init__.py
Go to the documentation of this file.
1 """Support to export sensor values via RSS feed."""
2 
3 from __future__ import annotations
4 
5 from html import escape
6 
7 from aiohttp import web
8 import voluptuous as vol
9 
10 from homeassistant.components.http import HomeAssistantView
11 from homeassistant.core import HomeAssistant
13 from homeassistant.helpers.template import Template
14 from homeassistant.helpers.typing import ConfigType
15 
16 CONTENT_TYPE_XML = "text/xml"
17 DOMAIN = "rss_feed_template"
18 
19 CONFIG_SCHEMA = vol.Schema(
20  {
21  DOMAIN: vol.Schema(
22  {
23  cv.match_all: vol.Schema(
24  {
25  vol.Optional("requires_api_password", default=True): cv.boolean,
26  vol.Optional("title"): cv.template,
27  vol.Required("items"): vol.All(
28  cv.ensure_list,
29  [
30  {
31  vol.Optional("title"): cv.template,
32  vol.Optional("description"): cv.template,
33  }
34  ],
35  ),
36  }
37  )
38  }
39  )
40  },
41  extra=vol.ALLOW_EXTRA,
42 )
43 
44 
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}"
49 
50  requires_auth: bool = feedconfig["requires_api_password"]
51 
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)
55 
56  return True
57 
58 
59 class RssView(HomeAssistantView):
60  """Export states and other values as RSS."""
61 
62  name = "rss_template"
63 
64  def __init__(
65  self,
66  url: str,
67  requires_auth: bool,
68  title: Template | None,
69  items: list[dict[str, Template]],
70  ) -> None:
71  """Initialize the rss view."""
72  self.urlurl = url
73  self.requires_authrequires_auth = requires_auth
74  self._title_title = title
75  self._items_items = items
76 
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'
80 
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"
85  else:
86  response += " <title>Home Assistant</title>\n"
87 
88  response += " <link>https://www.home-assistant.io/integrations/rss_feed_template/</link>\n"
89  response += " <description>Home automation feed</description>\n"
90 
91  for item in self._items_items:
92  response += " <item>\n"
93  if "title" in item:
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"
102 
103  response += " </channel>\n"
104  response += "</rss>\n"
105 
106  return web.Response(body=response, content_type=CONTENT_TYPE_XML)
None __init__(self, str url, bool requires_auth, Template|None title, list[dict[str, Template]] items)
Definition: __init__.py:70
web.Response get(self, web.Request request)
Definition: __init__.py:77
bool setup(HomeAssistant hass, ConfigType config)
Definition: __init__.py:45