__init__.py 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. from __future__ import annotations
  2. import logging
  3. from pathlib import Path
  4. from homeassistant.config_entries import ConfigEntry
  5. from homeassistant.core import HomeAssistant
  6. from homeassistant.components.http import StaticPathConfig
  7. from .const import DOMAIN
  8. from .coordinator import ZLockCoordinator
  9. from .services import register_services, unregister_services
  10. _LOGGER = logging.getLogger(__name__)
  11. PLATFORMS = ["sensor"]
  12. _CARD_URL = f"/{DOMAIN}/zlock-slots-card.js"
  13. _CARD_PATH = Path(__file__).parent / "frontend" / "zlock-slots-card.js"
  14. async def async_setup(hass: HomeAssistant, config: dict) -> bool:
  15. hass.data.setdefault(DOMAIN, {})
  16. return True
  17. async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
  18. coordinator = ZLockCoordinator(hass, entry)
  19. await coordinator.async_setup()
  20. hass.data.setdefault(DOMAIN, {})[entry.entry_id] = coordinator
  21. await hass.config_entries.async_forward_entry_setups(entry, PLATFORMS)
  22. register_services(hass)
  23. await _async_register_frontend(hass)
  24. entry.async_on_unload(entry.add_update_listener(_async_options_updated))
  25. return True
  26. async def _async_options_updated(hass: HomeAssistant, entry) -> None:
  27. await hass.config_entries.async_reload(entry.entry_id)
  28. async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
  29. unloaded = await hass.config_entries.async_unload_platforms(entry, PLATFORMS)
  30. if unloaded:
  31. coordinator: ZLockCoordinator = hass.data[DOMAIN].pop(entry.entry_id)
  32. coordinator.async_teardown()
  33. if not hass.data[DOMAIN]:
  34. unregister_services(hass)
  35. return unloaded
  36. async def _async_register_frontend(hass: HomeAssistant) -> None:
  37. try:
  38. await hass.http.async_register_static_paths([
  39. StaticPathConfig(_CARD_URL, str(_CARD_PATH), cache_headers=False)
  40. ])
  41. except Exception as err:
  42. _LOGGER.debug("Static path %s already registered: %s", _CARD_URL, err)
  43. try:
  44. lovelace = hass.data["lovelace"]
  45. resources = lovelace["resources"]
  46. if not any(r.get("url") == _CARD_URL for r in resources.async_items()):
  47. await resources.async_create_item({"res_type": "module", "url": _CARD_URL})
  48. _LOGGER.debug("Registered Lovelace resource: %s", _CARD_URL)
  49. except Exception as err:
  50. _LOGGER.error(
  51. "Failed to register Lovelace card resource %s: %s. "
  52. "Add it manually: Settings → Dashboards → ⋮ → Resources → Add Resource, "
  53. "URL: %s, Resource type: JavaScript module.",
  54. _CARD_URL, err, _CARD_URL,
  55. )