* fixes per Martin Hjelmare * pylint fix * final fixes per request * fixed unit tests for new config flow * Added unit-tests to increase coverage. at 97% now * Added unit tests for 100% coverage of component * removed configured_host function and updated config_flow unit tests * added a pylint directive since it tells me by mistake DOMAIN is not used * fixed path (removed __init__) * Update homeassistant/components/dynalite/light.py Co-Authored-By: Martin Hjelmare <marhje52@gmail.com> * Update homeassistant/components/dynalite/light.py Co-Authored-By: Martin Hjelmare <marhje52@gmail.com> * fixed the test as we moved from schedule_update_... to async_schedule * Update homeassistant/components/dynalite/bridge.py Co-Authored-By: Martin Hjelmare <marhje52@gmail.com> * removed context from config_flow changed test_init to use the core methods * moved test_light to also use the core interfaces * moved to config_entries.async_unload * additional fixes for the tests * pylint fix and removed unnecessary code * Update tests/components/dynalite/test_light.py Co-Authored-By: Martin Hjelmare <marhje52@gmail.com> * Update tests/components/dynalite/test_light.py Co-Authored-By: Martin Hjelmare <marhje52@gmail.com> * Update tests/components/dynalite/test_light.py Co-Authored-By: Martin Hjelmare <marhje52@gmail.com> * Update tests/components/dynalite/test_light.py Co-Authored-By: Martin Hjelmare <marhje52@gmail.com> * Update tests/components/dynalite/test_light.py Co-Authored-By: Martin Hjelmare <marhje52@gmail.com> * Update tests/components/dynalite/test_light.py Co-Authored-By: Martin Hjelmare <marhje52@gmail.com> * Update tests/components/dynalite/test_light.py Co-Authored-By: Martin Hjelmare <marhje52@gmail.com> * Update tests/components/dynalite/test_light.py Co-Authored-By: Martin Hjelmare <marhje52@gmail.com> * Update tests/components/dynalite/test_light.py Co-Authored-By: Martin Hjelmare <marhje52@gmail.com> * added break in loop * removed last mock_coro reference pylint fix * added coverage for try_connect * added check for a successful connection before bridge.async_setup succeeds also added a "nowait" config option (default False) that avoids this check * changed log level * fixed accidental chmod I did * fixed accidental change * not storing config in bridge * not patching asyncio * moved CONFIG_SCHEMA into component * moved all logs to start capitalized (and revised some of them) * moved test_config_flow to not patch the DynaliteBridge * also took DynaliteBridge patching out of test_init * removed NO_WAIT * fixes to SCHEMA * changed _ in multi-word CONF moved imports to component const.py * removed tries * removed redundant tests * fixed some small change i broke in the library. only version update * fixed rewuirements * Update tests/components/dynalite/test_config_flow.py Co-Authored-By: Martin Hjelmare <marhje52@gmail.com> * Update tests/components/dynalite/test_light.py Co-Authored-By: Martin Hjelmare <marhje52@gmail.com> * Update tests/components/dynalite/test_config_flow.py Co-Authored-By: Martin Hjelmare <marhje52@gmail.com> * removed HIDDEN_ENTITY removed hass in test fixture * black fixes * removed final piece of hidden_entity from light fix in the library updated config flow so if the entry is already set but with a different config, calls async_update_entry * removed DATA_CONFIGS - no longer necessary * pylint fixes * added coverage * use abort in config_flow * test update * removed logs * test that update actually updates the entry Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
82 lines
2.9 KiB
Python
Executable file
82 lines
2.9 KiB
Python
Executable file
"""Code to handle a Dynalite bridge."""
|
|
|
|
import asyncio
|
|
|
|
from dynalite_devices_lib import DynaliteDevices
|
|
|
|
from homeassistant.core import callback
|
|
from homeassistant.helpers.dispatcher import async_dispatcher_send
|
|
|
|
from .const import CONF_ALL, CONF_HOST, LOGGER
|
|
|
|
CONNECT_TIMEOUT = 30
|
|
CONNECT_INTERVAL = 1
|
|
|
|
|
|
class DynaliteBridge:
|
|
"""Manages a single Dynalite bridge."""
|
|
|
|
def __init__(self, hass, config):
|
|
"""Initialize the system based on host parameter."""
|
|
self.hass = hass
|
|
self.area = {}
|
|
self.async_add_devices = None
|
|
self.waiting_devices = []
|
|
self.host = config[CONF_HOST]
|
|
# Configure the dynalite devices
|
|
self.dynalite_devices = DynaliteDevices(
|
|
config=config,
|
|
newDeviceFunc=self.add_devices_when_registered,
|
|
updateDeviceFunc=self.update_device,
|
|
)
|
|
|
|
async def async_setup(self):
|
|
"""Set up a Dynalite bridge."""
|
|
# Configure the dynalite devices
|
|
return await self.dynalite_devices.async_setup()
|
|
|
|
def update_signal(self, device=None):
|
|
"""Create signal to use to trigger entity update."""
|
|
if device:
|
|
signal = f"dynalite-update-{self.host}-{device.unique_id}"
|
|
else:
|
|
signal = f"dynalite-update-{self.host}"
|
|
return signal
|
|
|
|
@callback
|
|
def update_device(self, device):
|
|
"""Call when a device or all devices should be updated."""
|
|
if device == CONF_ALL:
|
|
# This is used to signal connection or disconnection, so all devices may become available or not.
|
|
log_string = (
|
|
"Connected" if self.dynalite_devices.available else "Disconnected"
|
|
)
|
|
LOGGER.info("%s to dynalite host", log_string)
|
|
async_dispatcher_send(self.hass, self.update_signal())
|
|
else:
|
|
async_dispatcher_send(self.hass, self.update_signal(device))
|
|
|
|
async def try_connection(self):
|
|
"""Try to connect to dynalite with timeout."""
|
|
# Currently by polling. Future - will need to change the library to be proactive
|
|
for _ in range(0, CONNECT_TIMEOUT):
|
|
if self.dynalite_devices.available:
|
|
return True
|
|
await asyncio.sleep(CONNECT_INTERVAL)
|
|
return False
|
|
|
|
@callback
|
|
def register_add_devices(self, async_add_devices):
|
|
"""Add an async_add_entities for a category."""
|
|
self.async_add_devices = async_add_devices
|
|
if self.waiting_devices:
|
|
self.async_add_devices(self.waiting_devices)
|
|
|
|
def add_devices_when_registered(self, devices):
|
|
"""Add the devices to HA if the add devices callback was registered, otherwise queue until it is."""
|
|
if not devices:
|
|
return
|
|
if self.async_add_devices:
|
|
self.async_add_devices(devices)
|
|
else: # handle it later when it is registered
|
|
self.waiting_devices.extend(devices)
|