89 lines
2.6 KiB
Python

import logging
from homeassistant.components import bluetooth
from homeassistant.components.bluetooth.match import BluetoothCallbackMatcher
from homeassistant import config_entries
from homeassistant.helpers.event import async_track_point_in_utc_time
from homeassistant.const import EVENT_HOMEASSISTANT_STOP
import homeassistant.util.dt as dt_util
from . import pyplejd
_LOGGER = logging.getLogger(__name__)
DOMAIN = "plejd"
async def async_setup(hass, config):
_LOGGER.error("Setting up plejd")
if not hass.config_entries.async_entries("plejd"):
hass.async_create_task(
hass.config_entries.flow.async_init(
"plejd", context={"source": config_entries.SOURCE_IMPORT}, data={}
)
)
return True
async def async_setup_entry(hass, config_entry):
plejdManager = pyplejd.PlejdManager(config_entry.data)
devices = await plejdManager.get_devices()
for dev in devices.values():
ble_device = bluetooth.async_ble_device_from_address(
hass, dev.BLE_address, True
)
if ble_device:
await plejdManager.close_stale(ble_device)
hass.data.setdefault(DOMAIN, {}).update(
{
"stopping": False,
"manager": plejdManager,
"devices": devices,
}
)
await hass.config_entries.async_forward_entry_setups(config_entry, ["light", "switch"])
async def _ping(now=None):
if hass.data[DOMAIN]["stopping"]: return
if not await plejdManager.keepalive():
_LOGGER.debug("Ping failed")
hass.data[DOMAIN]["ping_timer"] = async_track_point_in_utc_time(
hass,
_ping,
dt_util.utcnow() + plejdManager.keepalive_interval
)
hass.async_create_task(_ping())
bluetooth.async_register_callback(
hass,
plejdManager.discover_plejd,
BluetoothCallbackMatcher(
connectable=True,
service_uuid=pyplejd.const.PLEJD_SERVICE.lower()
),
bluetooth.BluetoothScanningMode.PASSIVE
)
async def _stop(ev):
hass.data[DOMAIN]["stopping"] = True
if "ping_timer" in hass.data[DOMAIN]:
hass.data[DOMAIN]["ping_timer"]()
await plejdManager.disconnect()
config_entry.async_on_unload(
hass.bus.async_listen_once(EVENT_HOMEASSISTANT_STOP, _stop)
)
for service_info in bluetooth.async_discovered_service_info(hass, True):
if pyplejd.PLEJD_SERVICE.lower() in service_info.advertisement.service_uuids:
plejdManager.discover_plejd(service_info)
return True