Home Assistant Unofficial Reference 2024.12.1
addon_panel.py
Go to the documentation of this file.
1 """Implement the Ingress Panel feature for Hass.io Add-ons."""
2 
3 from http import HTTPStatus
4 import logging
5 from typing import Any
6 
7 from aiohttp import web
8 
9 from homeassistant.components import frontend, panel_custom
10 from homeassistant.components.http import HomeAssistantView
11 from homeassistant.const import ATTR_ICON
12 from homeassistant.core import HomeAssistant
13 
14 from .const import ATTR_ADMIN, ATTR_ENABLE, ATTR_PANELS, ATTR_TITLE
15 from .handler import HassIO, HassioAPIError
16 
17 _LOGGER = logging.getLogger(__name__)
18 
19 
20 async def async_setup_addon_panel(hass: HomeAssistant, hassio: HassIO) -> None:
21  """Add-on Ingress Panel setup."""
22  hassio_addon_panel = HassIOAddonPanel(hass, hassio)
23  hass.http.register_view(hassio_addon_panel)
24 
25  # If panels are exists
26  if not (panels := await hassio_addon_panel.get_panels()):
27  return
28 
29  # Register available panels
30  for addon, data in panels.items():
31  if not data[ATTR_ENABLE]:
32  continue
33  # _register_panel never suspends and is only
34  # a coroutine because it would be a breaking change
35  # to make it a normal function
36  await _register_panel(hass, addon, data)
37 
38 
39 class HassIOAddonPanel(HomeAssistantView):
40  """Hass.io view to handle base part."""
41 
42  name = "api:hassio_push:panel"
43  url = "/api/hassio_push/panel/{addon}"
44 
45  def __init__(self, hass: HomeAssistant, hassio: HassIO) -> None:
46  """Initialize WebView."""
47  self.hasshass = hass
48  self.hassiohassio = hassio
49 
50  async def post(self, request: web.Request, addon: str) -> web.Response:
51  """Handle new add-on panel requests."""
52  panels = await self.get_panelsget_panels()
53 
54  # Panel exists for add-on slug
55  if addon not in panels or not panels[addon][ATTR_ENABLE]:
56  _LOGGER.error("Panel is not enable for %s", addon)
57  return web.Response(status=HTTPStatus.BAD_REQUEST)
58  data = panels[addon]
59 
60  # Register panel
61  await _register_panel(self.hasshass, addon, data)
62  return web.Response()
63 
64  async def delete(self, request: web.Request, addon: str) -> web.Response:
65  """Handle remove add-on panel requests."""
66  frontend.async_remove_panel(self.hasshass, addon)
67  return web.Response()
68 
69  async def get_panels(self) -> dict:
70  """Return panels add-on info data."""
71  try:
72  data = await self.hassiohassio.get_ingress_panels()
73  return data[ATTR_PANELS]
74  except HassioAPIError as err:
75  _LOGGER.error("Can't read panel info: %s", err)
76  return {}
77 
78 
79 async def _register_panel(
80  hass: HomeAssistant, addon: str, data: dict[str, Any]
81 ) -> None:
82  """Init coroutine to register the panel."""
83  await panel_custom.async_register_panel(
84  hass,
85  frontend_url_path=addon,
86  webcomponent_name="hassio-main",
87  sidebar_title=data[ATTR_TITLE],
88  sidebar_icon=data[ATTR_ICON],
89  js_url="/api/hassio/app/entrypoint.js",
90  embed_iframe=True,
91  require_admin=data[ATTR_ADMIN],
92  config={"ingress": addon},
93  )
None __init__(self, HomeAssistant hass, HassIO hassio)
Definition: addon_panel.py:45
web.Response delete(self, web.Request request, str addon)
Definition: addon_panel.py:64
web.Response post(self, web.Request request, str addon)
Definition: addon_panel.py:50
None async_setup_addon_panel(HomeAssistant hass, HassIO hassio)
Definition: addon_panel.py:20
None _register_panel(HomeAssistant hass, str addon, dict[str, Any] data)
Definition: addon_panel.py:81