1 """Handler for Hass.io."""
3 from __future__
import annotations
6 from collections.abc
import Callable, Coroutine
7 from http
import HTTPStatus
10 from typing
import Any
12 from aiohasupervisor
import SupervisorClient
27 from .const
import ATTR_MESSAGE, ATTR_RESULT, DOMAIN, X_HASS_SOURCE
29 _LOGGER = logging.getLogger(__name__)
31 KEY_SUPERVISOR_CLIENT =
"supervisor_client"
35 """Return if a API trow a error."""
39 funct: Callable[_P, Coroutine[Any, Any, dict[str, Any]]],
40 ) -> Callable[_P, Coroutine[Any, Any, bool]]:
41 """Return a boolean."""
43 async
def _wrapper(*argv: _P.args, **kwargs: _P.kwargs) -> bool:
46 data = await funct(*argv, **kwargs)
47 return data[
"result"] ==
"ok"
48 except HassioAPIError:
55 funct: Callable[_P, Coroutine[Any, Any, dict[str, Any]]],
56 ) -> Callable[_P, Coroutine[Any, Any, Any]]:
57 """Return data of an api."""
59 async
def _wrapper(*argv: _P.args, **kwargs: _P.kwargs) -> Any:
61 data = await funct(*argv, **kwargs)
62 if data[
"result"] ==
"ok":
64 raise HassioAPIError(data[
"message"])
71 """Update Supervisor diagnostics toggle.
73 The caller of the function should handle HassioAPIError.
75 hassio: HassIO = hass.data[DOMAIN]
76 return await hassio.update_diagnostics(diagnostics)
82 hass: HomeAssistant, payload: dict, partial: bool =
False
84 """Create a full or partial backup.
86 The caller of the function should handle HassioAPIError.
88 hassio: HassIO = hass.data[DOMAIN]
89 backup_type =
"partial" if partial
else "full"
90 command = f
"/backups/new/{backup_type}"
91 return await hassio.send_command(command, payload=payload, timeout=
None)
96 """Return settings specific to Home Assistant Green."""
97 hassio: HassIO = hass.data[DOMAIN]
98 return await hassio.send_command(
"/os/boards/green", method=
"get")
103 hass: HomeAssistant, settings: dict[str, bool]
105 """Set settings specific to Home Assistant Green.
107 Returns an empty dict.
109 hassio: HassIO = hass.data[DOMAIN]
110 return await hassio.send_command(
111 "/os/boards/green", method=
"post", payload=settings
117 """Return settings specific to Home Assistant Yellow."""
118 hassio: HassIO = hass.data[DOMAIN]
119 return await hassio.send_command(
"/os/boards/yellow", method=
"get")
124 hass: HomeAssistant, settings: dict[str, bool]
126 """Set settings specific to Home Assistant Yellow.
128 Returns an empty dict.
130 hassio: HassIO = hass.data[DOMAIN]
131 return await hassio.send_command(
132 "/os/boards/yellow", method=
"post", payload=settings
140 Returns an empty dict.
142 hassio: HassIO = hass.data[DOMAIN]
143 return await hassio.send_command(
"/host/reboot", method=
"post", timeout=60)
147 """Small API wrapper for Hass.io."""
151 loop: asyncio.AbstractEventLoop,
152 websession: aiohttp.ClientSession,
155 """Initialize Hass.io API."""
159 base_url = f
"http://{ip}"
164 """Return base url for Supervisor."""
169 """Return generic Supervisor information.
171 This method returns a coroutine.
173 return self.
send_commandsend_command(
"/info", method=
"get")
177 """Return data for Host.
179 This method returns a coroutine.
181 return self.
send_commandsend_command(
"/host/info", method=
"get")
185 """Return data for the OS.
187 This method returns a coroutine.
189 return self.
send_commandsend_command(
"/os/info", method=
"get")
193 """Return data for Home Asssistant Core.
195 This method returns a coroutine.
197 return self.
send_commandsend_command(
"/core/info", method=
"get")
201 """Return data for the Supervisor.
203 This method returns a coroutine.
205 return self.
send_commandsend_command(
"/supervisor/info", method=
"get")
209 """Return data for the Host Network.
211 This method returns a coroutine.
213 return self.
send_commandsend_command(
"/network/info", method=
"get")
217 """Return stats for the core.
219 This method returns a coroutine.
221 return self.
send_commandsend_command(
"/core/stats", method=
"get")
225 """Return stats for the supervisor.
227 This method returns a coroutine.
229 return self.
send_commandsend_command(
"/supervisor/stats", method=
"get")
233 """Return data for Add-on ingress panels.
235 This method returns a coroutine.
237 return self.
send_commandsend_command(
"/ingress/panels", method=
"get")
241 self, http_config: dict[str, Any], refresh_token: RefreshToken
243 """Update Home Assistant API data on Hass.io."""
244 port = http_config.get(CONF_SERVER_PORT)
or SERVER_PORT
246 "ssl": CONF_SSL_CERTIFICATE
in http_config,
248 "refresh_token": refresh_token.token,
251 if http_config.get(CONF_SERVER_HOST)
is not None:
252 options[
"watchdog"] =
False
254 "Found incompatible HTTP option 'server_host'. Watchdog feature"
258 return await self.
send_commandsend_command(
"/homeassistant/options", payload=options)
262 """Update Home-Assistant timezone data on Hass.io.
264 This method returns a coroutine.
266 return self.
send_commandsend_command(
"/supervisor/options", payload={
"timezone": timezone})
270 """Update Supervisor diagnostics setting.
272 This method returns a coroutine.
275 "/supervisor/options", payload={
"diagnostics": diagnostics}
281 method: str =
"post",
282 payload: Any |
None =
None,
283 timeout: int |
None = 10,
284 return_text: bool =
False,
286 source: str =
"core.handler",
288 """Send API command to Hass.io.
290 This method is a coroutine.
292 joined_url = self.
_base_url_base_url.with_path(command)
298 if joined_url.raw_path != command:
299 _LOGGER.error(
"Invalid request %s", command)
303 response = await self.
websessionwebsession.request(
308 aiohttp.hdrs.AUTHORIZATION: (
309 f
"Bearer {os.environ.get('SUPERVISOR_TOKEN', '')}"
311 X_HASS_SOURCE: source,
313 timeout=aiohttp.ClientTimeout(total=timeout),
316 if response.status != HTTPStatus.OK:
317 error = await response.json(encoding=
"utf-8")
318 if error.get(ATTR_RESULT) ==
"error":
322 "Request to %s method %s returned with code %d",
330 return await response.text(encoding=
"utf-8")
332 return await response.json(encoding=
"utf-8")
335 _LOGGER.error(
"Timeout on %s request", command)
337 except aiohttp.ClientError
as err:
338 _LOGGER.error(
"Client error on %s request %s", command, err)
343 @singleton(KEY_SUPERVISOR_CLIENT)
345 """Return supervisor client."""
346 hassio: HassIO = hass.data[DOMAIN]
347 return SupervisorClient(
348 str(hassio.base_url),
349 os.environ.get(
"SUPERVISOR_TOKEN",
""),
350 session=hassio.websession,
Coroutine update_hass_timezone(self, str timezone)
Any send_command(self, str command, str method="post", Any|None payload=None, int|None timeout=10, bool return_text=False, *str source="core.handler")
Coroutine get_ingress_panels(self)
Coroutine get_supervisor_info(self)
Coroutine update_diagnostics(self, bool diagnostics)
def update_hass_api(self, dict[str, Any] http_config, RefreshToken refresh_token)
Coroutine get_core_stats(self)
Coroutine get_host_info(self)
Coroutine get_supervisor_stats(self)
Coroutine get_core_info(self)
None __init__(self, asyncio.AbstractEventLoop loop, aiohttp.ClientSession websession, str ip)
Coroutine get_os_info(self)
Coroutine get_network_info(self)
dict async_set_yellow_settings(HomeAssistant hass, dict[str, bool] settings)
dict async_reboot_host(HomeAssistant hass)
dict[str, bool] async_get_yellow_settings(HomeAssistant hass)
SupervisorClient get_supervisor_client(HomeAssistant hass)
bool async_update_diagnostics(HomeAssistant hass, bool diagnostics)
dict async_create_backup(HomeAssistant hass, dict payload, bool partial=False)
dict async_set_green_settings(HomeAssistant hass, dict[str, bool] settings)
dict[str, bool] async_get_green_settings(HomeAssistant hass)