core/homeassistant/components/escea/discovery.py

77 lines
2.4 KiB
Python

"""Internal discovery service for Escea Fireplace."""
from __future__ import annotations
from pescea import (
AbstractDiscoveryService,
Controller,
Listener,
discovery_service as pescea_discovery_service,
)
from homeassistant.core import HomeAssistant
from homeassistant.helpers.dispatcher import async_dispatcher_send
from .const import (
DATA_DISCOVERY_SERVICE,
DISPATCH_CONTROLLER_DISCONNECTED,
DISPATCH_CONTROLLER_DISCOVERED,
DISPATCH_CONTROLLER_RECONNECTED,
DISPATCH_CONTROLLER_UPDATE,
)
class DiscoveryServiceListener(Listener):
"""Discovery data and interfacing with pescea library."""
def __init__(self, hass: HomeAssistant) -> None:
"""Initialise discovery service."""
super().__init__()
self.hass = hass
# Listener interface
def controller_discovered(self, ctrl: Controller) -> None:
"""Handle new controller discoverery."""
async_dispatcher_send(self.hass, DISPATCH_CONTROLLER_DISCOVERED, ctrl)
def controller_disconnected(self, ctrl: Controller, ex: Exception) -> None:
"""On disconnect from controller."""
async_dispatcher_send(self.hass, DISPATCH_CONTROLLER_DISCONNECTED, ctrl, ex)
def controller_reconnected(self, ctrl: Controller) -> None:
"""On reconnect to controller."""
async_dispatcher_send(self.hass, DISPATCH_CONTROLLER_RECONNECTED, ctrl)
def controller_update(self, ctrl: Controller) -> None:
"""System update message is received from the controller."""
async_dispatcher_send(self.hass, DISPATCH_CONTROLLER_UPDATE, ctrl)
async def async_start_discovery_service(
hass: HomeAssistant,
) -> AbstractDiscoveryService:
"""Set up the pescea internal discovery."""
discovery_service = hass.data.get(DATA_DISCOVERY_SERVICE)
if discovery_service:
# Already started
return discovery_service
# discovery local services
listener = DiscoveryServiceListener(hass)
discovery_service = pescea_discovery_service(listener)
hass.data[DATA_DISCOVERY_SERVICE] = discovery_service
await discovery_service.start_discovery()
return discovery_service
async def async_stop_discovery_service(hass: HomeAssistant) -> None:
"""Stop the discovery service."""
discovery_service = hass.data.get(DATA_DISCOVERY_SERVICE)
if not discovery_service:
return
await discovery_service.close()
del hass.data[DATA_DISCOVERY_SERVICE]