Home Assistant Unofficial Reference 2024.12.1
__init__.py
Go to the documentation of this file.
1 """The Nanoleaf integration."""
2 
3 from __future__ import annotations
4 
5 import asyncio
6 from contextlib import suppress
7 import logging
8 
9 from aionanoleaf import EffectsEvent, Nanoleaf, StateEvent, TouchEvent
10 
11 from homeassistant.config_entries import ConfigEntry
12 from homeassistant.const import (
13  CONF_DEVICE_ID,
14  CONF_HOST,
15  CONF_TOKEN,
16  CONF_TYPE,
17  Platform,
18 )
19 from homeassistant.core import HomeAssistant
20 from homeassistant.helpers import device_registry as dr
21 from homeassistant.helpers.aiohttp_client import async_get_clientsession
22 from homeassistant.helpers.dispatcher import async_dispatcher_send
23 
24 from .const import DOMAIN, NANOLEAF_EVENT, TOUCH_GESTURE_TRIGGER_MAP, TOUCH_MODELS
25 from .coordinator import NanoleafCoordinator
26 
27 _LOGGER = logging.getLogger(__name__)
28 
29 PLATFORMS = [Platform.BUTTON, Platform.EVENT, Platform.LIGHT]
30 
31 
32 type NanoleafConfigEntry = ConfigEntry[NanoleafCoordinator]
33 
34 
35 async def async_setup_entry(hass: HomeAssistant, entry: NanoleafConfigEntry) -> bool:
36  """Set up Nanoleaf from a config entry."""
37  nanoleaf = Nanoleaf(
38  async_get_clientsession(hass), entry.data[CONF_HOST], entry.data[CONF_TOKEN]
39  )
40 
41  coordinator = NanoleafCoordinator(hass, nanoleaf)
42 
43  await coordinator.async_config_entry_first_refresh()
44 
45  async def light_event_callback(event: StateEvent | EffectsEvent) -> None:
46  """Receive state and effect event."""
47  coordinator.async_set_updated_data(None)
48 
49  if supports_touch := nanoleaf.model in TOUCH_MODELS:
50  device_registry = dr.async_get(hass)
51  device_entry = device_registry.async_get_or_create(
52  config_entry_id=entry.entry_id,
53  identifiers={(DOMAIN, nanoleaf.serial_no)},
54  )
55 
56  async def touch_event_callback(event: TouchEvent) -> None:
57  """Receive touch event."""
58  gesture_type = TOUCH_GESTURE_TRIGGER_MAP.get(event.gesture_id)
59  if gesture_type is None:
60  _LOGGER.warning(
61  "Received unknown touch gesture ID %s", event.gesture_id
62  )
63  return
64  _LOGGER.debug("Received touch gesture %s", gesture_type)
65  hass.bus.async_fire(
66  NANOLEAF_EVENT,
67  {CONF_DEVICE_ID: device_entry.id, CONF_TYPE: gesture_type},
68  )
70  hass, f"nanoleaf_gesture_{nanoleaf.serial_no}", gesture_type
71  )
72 
73  event_listener = asyncio.create_task(
74  nanoleaf.listen_events(
75  state_callback=light_event_callback,
76  effects_callback=light_event_callback,
77  touch_callback=touch_event_callback if supports_touch else None,
78  )
79  )
80 
81  async def _cancel_listener() -> None:
82  event_listener.cancel()
83  with suppress(asyncio.CancelledError):
84  await event_listener
85 
86  entry.async_on_unload(_cancel_listener)
87 
88  entry.runtime_data = coordinator
89 
90  await hass.config_entries.async_forward_entry_setups(entry, PLATFORMS)
91 
92  return True
93 
94 
95 async def async_unload_entry(hass: HomeAssistant, entry: NanoleafConfigEntry) -> bool:
96  """Unload a config entry."""
97  return await hass.config_entries.async_unload_platforms(entry, PLATFORMS)
bool async_unload_entry(HomeAssistant hass, NanoleafConfigEntry entry)
Definition: __init__.py:95
bool async_setup_entry(HomeAssistant hass, NanoleafConfigEntry entry)
Definition: __init__.py:35
aiohttp.ClientSession async_get_clientsession(HomeAssistant hass, bool verify_ssl=True, socket.AddressFamily family=socket.AF_UNSPEC, ssl_util.SSLCipherList ssl_cipher=ssl_util.SSLCipherList.PYTHON_DEFAULT)
None async_dispatcher_send(HomeAssistant hass, str signal, *Any args)
Definition: dispatcher.py:193