"""Support for tracking MySensors devices.""" from homeassistant.components import mysensors from homeassistant.components.device_tracker import DOMAIN from homeassistant.helpers.dispatcher import async_dispatcher_connect from homeassistant.util import slugify async def async_setup_scanner(hass, config, async_see, discovery_info=None): """Set up the MySensors device scanner.""" new_devices = mysensors.setup_mysensors_platform( hass, DOMAIN, discovery_info, MySensorsDeviceScanner, device_args=(hass, async_see), ) if not new_devices: return False for device in new_devices: gateway_id = id(device.gateway) dev_id = (gateway_id, device.node_id, device.child_id, device.value_type) async_dispatcher_connect( hass, mysensors.const.CHILD_CALLBACK.format(*dev_id), device.async_update_callback, ) async_dispatcher_connect( hass, mysensors.const.NODE_CALLBACK.format(gateway_id, device.node_id), device.async_update_callback, ) return True class MySensorsDeviceScanner(mysensors.device.MySensorsDevice): """Represent a MySensors scanner.""" def __init__(self, hass, async_see, *args): """Set up instance.""" super().__init__(*args) self.async_see = async_see self.hass = hass async def _async_update_callback(self): """Update the device.""" await self.async_update() node = self.gateway.sensors[self.node_id] child = node.children[self.child_id] position = child.values[self.value_type] latitude, longitude, _ = position.split(",") await self.async_see( dev_id=slugify(self.name), host_name=self.name, gps=(latitude, longitude), battery=node.battery_level, attributes=self.device_state_attributes, )