mirror of
https://github.com/home-assistant/core.git
synced 2025-07-15 09:17:10 +00:00
Fix for asuswrt, telnet not working and presence-detection for router mode (#11422)
* Fix for telnet mode Fix for presence detection closes #11349 #10231 * Optimisation when device is disconnected
This commit is contained in:
parent
a23f60315f
commit
6b103cc9b9
@ -177,10 +177,10 @@ class AsusWrtDeviceScanner(DeviceScanner):
|
||||
"""
|
||||
devices = {}
|
||||
devices.update(self._get_wl())
|
||||
devices.update(self._get_arp())
|
||||
devices.update(self._get_neigh())
|
||||
devices = self._get_arp(devices)
|
||||
devices = self._get_neigh(devices)
|
||||
if not self.mode == 'ap':
|
||||
devices.update(self._get_leases())
|
||||
devices.update(self._get_leases(devices))
|
||||
return devices
|
||||
|
||||
def _get_wl(self):
|
||||
@ -194,7 +194,7 @@ class AsusWrtDeviceScanner(DeviceScanner):
|
||||
devices[mac] = Device(mac, None, None)
|
||||
return devices
|
||||
|
||||
def _get_leases(self):
|
||||
def _get_leases(self, cur_devices):
|
||||
lines = self.connection.run_command(_LEASES_CMD)
|
||||
if not lines:
|
||||
return {}
|
||||
@ -208,30 +208,45 @@ class AsusWrtDeviceScanner(DeviceScanner):
|
||||
if host == '*':
|
||||
host = ''
|
||||
mac = device['mac'].upper()
|
||||
devices[mac] = Device(mac, device['ip'], host)
|
||||
if mac in cur_devices:
|
||||
devices[mac] = Device(mac, device['ip'], host)
|
||||
return devices
|
||||
|
||||
def _get_neigh(self):
|
||||
def _get_neigh(self, cur_devices):
|
||||
lines = self.connection.run_command(_IP_NEIGH_CMD)
|
||||
if not lines:
|
||||
return {}
|
||||
result = _parse_lines(lines, _IP_NEIGH_REGEX)
|
||||
devices = {}
|
||||
for device in result:
|
||||
mac = device['mac'].upper()
|
||||
devices[mac] = Device(mac, None, None)
|
||||
return devices
|
||||
if device['mac']:
|
||||
mac = device['mac'].upper()
|
||||
devices[mac] = Device(mac, None, None)
|
||||
else:
|
||||
cur_devices = {
|
||||
k: v for k, v in
|
||||
cur_devices.items() if v.ip != device['ip']
|
||||
}
|
||||
cur_devices.update(devices)
|
||||
return cur_devices
|
||||
|
||||
def _get_arp(self):
|
||||
def _get_arp(self, cur_devices):
|
||||
lines = self.connection.run_command(_ARP_CMD)
|
||||
if not lines:
|
||||
return {}
|
||||
result = _parse_lines(lines, _ARP_REGEX)
|
||||
devices = {}
|
||||
for device in result:
|
||||
mac = device['mac'].upper()
|
||||
devices[mac] = Device(mac, device['ip'], None)
|
||||
return devices
|
||||
if device['mac']:
|
||||
mac = device['mac'].upper()
|
||||
devices[mac] = Device(mac, device['ip'], None)
|
||||
else:
|
||||
cur_devices = {
|
||||
k: v for k, v in
|
||||
cur_devices.items() if v.ip != device['ip']
|
||||
}
|
||||
cur_devices.update(devices)
|
||||
return cur_devices
|
||||
|
||||
|
||||
class _Connection:
|
||||
@ -348,8 +363,9 @@ class TelnetConnection(_Connection):
|
||||
self.connect()
|
||||
|
||||
self._telnet.write('{}\n'.format(command).encode('ascii'))
|
||||
return (self._telnet.read_until(self._prompt_string).
|
||||
data = (self._telnet.read_until(self._prompt_string).
|
||||
split(b'\n')[1:-1])
|
||||
return [line.decode('utf-8') for line in data]
|
||||
except EOFError:
|
||||
_LOGGER.error("Unexpected response from router")
|
||||
self.disconnect()
|
||||
|
Loading…
x
Reference in New Issue
Block a user