Use manual discovery if no device has been set ul
This commit is contained in:
@@ -25,6 +25,7 @@ from .const import ( # pylint: disable=unused-import
|
|||||||
DOMAIN,
|
DOMAIN,
|
||||||
PLATFORMS,
|
PLATFORMS,
|
||||||
)
|
)
|
||||||
|
from .discovery import discover
|
||||||
|
|
||||||
_LOGGER = logging.getLogger(__name__)
|
_LOGGER = logging.getLogger(__name__)
|
||||||
|
|
||||||
@@ -209,7 +210,11 @@ class LocaltuyaConfigFlow(config_entries.ConfigFlow, domain=DOMAIN):
|
|||||||
self.selected_device = user_input[DISCOVERED_DEVICE].split(" ")[0]
|
self.selected_device = user_input[DISCOVERED_DEVICE].split(" ")[0]
|
||||||
return await self.async_step_basic_info()
|
return await self.async_step_basic_info()
|
||||||
|
|
||||||
devices = self.hass.data[DOMAIN][DATA_DISCOVERY].devices
|
# Use cache if available or fallback to manual discovery
|
||||||
|
if DOMAIN in self.hass.data:
|
||||||
|
devices = self.hass.data[DOMAIN][DATA_DISCOVERY].devices
|
||||||
|
else:
|
||||||
|
devices = await discover()
|
||||||
self.devices = {
|
self.devices = {
|
||||||
ip: dev
|
ip: dev
|
||||||
for ip, dev in devices.items()
|
for ip, dev in devices.items()
|
||||||
|
@@ -16,6 +16,8 @@ _LOGGER = logging.getLogger(__name__)
|
|||||||
|
|
||||||
UDP_KEY = md5(b"yGAdlopoPVldABfn").digest()
|
UDP_KEY = md5(b"yGAdlopoPVldABfn").digest()
|
||||||
|
|
||||||
|
DEFAULT_TIMEOUT = 6.0
|
||||||
|
|
||||||
|
|
||||||
def decrypt_udp(message):
|
def decrypt_udp(message):
|
||||||
"""Decrypt encrypted UDP broadcasts."""
|
"""Decrypt encrypted UDP broadcasts."""
|
||||||
@@ -31,7 +33,7 @@ def decrypt_udp(message):
|
|||||||
class TuyaDiscovery(asyncio.DatagramProtocol):
|
class TuyaDiscovery(asyncio.DatagramProtocol):
|
||||||
"""Datagram handler listening for Tuya broadcast messages."""
|
"""Datagram handler listening for Tuya broadcast messages."""
|
||||||
|
|
||||||
def __init__(self, callback):
|
def __init__(self, callback=None):
|
||||||
"""Initialize a new BaseDiscovery."""
|
"""Initialize a new BaseDiscovery."""
|
||||||
self.devices = {}
|
self.devices = {}
|
||||||
self._listeners = []
|
self._listeners = []
|
||||||
@@ -52,6 +54,7 @@ class TuyaDiscovery(asyncio.DatagramProtocol):
|
|||||||
|
|
||||||
def close(self):
|
def close(self):
|
||||||
"""Stop discovery."""
|
"""Stop discovery."""
|
||||||
|
self.callback = None
|
||||||
for transport, _ in self.listeners:
|
for transport, _ in self.listeners:
|
||||||
transport.close()
|
transport.close()
|
||||||
|
|
||||||
@@ -72,4 +75,18 @@ class TuyaDiscovery(asyncio.DatagramProtocol):
|
|||||||
self.devices[device.get("ip")] = device
|
self.devices[device.get("ip")] = device
|
||||||
_LOGGER.debug("Discovered device: %s", device)
|
_LOGGER.debug("Discovered device: %s", device)
|
||||||
|
|
||||||
self._callback(device)
|
if self._callback:
|
||||||
|
self._callback(device)
|
||||||
|
|
||||||
|
|
||||||
|
async def discover():
|
||||||
|
"""Discover and return devices on local network."""
|
||||||
|
discover = TuyaDiscovery()
|
||||||
|
try:
|
||||||
|
await discover.start()
|
||||||
|
await asyncio.sleep(DEFAULT_TIMEOUT)
|
||||||
|
except Exception:
|
||||||
|
_LOGGER.exception("failed to discover devices")
|
||||||
|
finally:
|
||||||
|
discover.close()
|
||||||
|
return discover.devices
|
||||||
|
Reference in New Issue
Block a user