Update esphome reconnect logic to use newer RecordUpdateListener logic (#57057)

This commit is contained in:
J. Nick Koston 2021-10-04 07:52:08 -10:00 committed by GitHub
parent 723596076d
commit d08b65db7d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -24,7 +24,7 @@ from aioesphomeapi import (
UserServiceArgType, UserServiceArgType,
) )
import voluptuous as vol import voluptuous as vol
from zeroconf import DNSPointer, DNSRecord, RecordUpdateListener, Zeroconf from zeroconf import DNSPointer, RecordUpdate, RecordUpdateListener, Zeroconf
from homeassistant import const from homeassistant import const
from homeassistant.components import zeroconf from homeassistant.components import zeroconf
@ -518,34 +518,40 @@ class ReconnectLogic(RecordUpdateListener):
"""Stop as an async callback function.""" """Stop as an async callback function."""
self._hass.async_create_task(self.stop()) self._hass.async_create_task(self.stop())
@callback def async_update_records(
def _set_reconnect(self) -> None: self, zc: Zeroconf, now: float, records: list[RecordUpdate]
self._reconnect_event.set() ) -> None:
"""Listen to zeroconf updated mDNS records.
def update_record(self, zc: Zeroconf, now: float, record: DNSRecord) -> None: This is a mDNS record from the device and could mean it just woke up.
"""Listen to zeroconf updated mDNS records.""" """
if not isinstance(record, DNSPointer): # Check if already connected, no lock needed for this access and
# We only consider PTR records and match using the alias name # bail if either the entry was already teared down or we haven't received device info yet
return if (
if self._entry_data is None or self._entry_data.device_info is None: self._connected
# Either the entry was already teared down or we haven't received device info yet or self._reconnect_event.is_set()
or self._entry_data is None
or self._entry_data.device_info is None
):
return return
filter_alias = f"{self._entry_data.device_info.name}._esphomelib._tcp.local." filter_alias = f"{self._entry_data.device_info.name}._esphomelib._tcp.local."
if record.alias != filter_alias:
return
# This is a mDNS record from the device and could mean it just woke up for record_update in records:
# Check if already connected, no lock needed for this access # We only consider PTR records and match using the alias name
if self._connected: if (
return not isinstance(record_update.new, DNSPointer)
or record_update.new.alias != filter_alias
):
continue
# Tell reconnection logic to retry connection attempt now (even before reconnect timer finishes) # Tell reconnection logic to retry connection attempt now (even before reconnect timer finishes)
_LOGGER.debug( _LOGGER.debug(
"%s: Triggering reconnect because of received mDNS record %s", "%s: Triggering reconnect because of received mDNS record %s",
self._host, self._host,
record, record_update.new,
) )
self._hass.add_job(self._set_reconnect) self._reconnect_event.set()
return
async def _async_setup_device_registry( async def _async_setup_device_registry(