diff --git a/homeassistant/components/device_tracker/asuswrt.py b/homeassistant/components/device_tracker/asuswrt.py index 495e377077f..f49f54b3622 100644 --- a/homeassistant/components/device_tracker/asuswrt.py +++ b/homeassistant/components/device_tracker/asuswrt.py @@ -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()