"""Combine all the different protocols into a simple interface.""" import logging import os import importlib from .ssdp import SSDP from .mdns import MDNS from .gdm import GDM from .lms import LMS from .tellstick import Tellstick from .daikin import Daikin from .smartglass import XboxSmartGlass _LOGGER = logging.getLogger(__name__) class NetworkDiscovery: """Scan the network for devices. mDNS scans in a background thread. SSDP scans in the foreground. GDM scans in the foreground. LMS scans in the foreground. Tellstick scans in the foreground Xbox One scans in the foreground start: is ready to scan scan: scan the network discover: parse scanned data get_in """ # pylint: disable=too-many-instance-attributes def __init__(self): """Initialize the discovery.""" self.mdns = None self.ssdp = None self.gdm = None self.lms = None self.tellstick = None self.daikin = None self.xbox_smartglass = None self.is_discovering = False self.discoverables = None def scan(self): """Start and tells scanners to scan.""" self.is_discovering = True self.mdns = MDNS() # Needs to be after MDNS init self._load_device_support() self.mdns.start() self.ssdp = SSDP() self.ssdp.scan() self.gdm = GDM() self.gdm.scan() self.lms = LMS() self.lms.scan() self.tellstick = Tellstick() self.tellstick.scan() self.daikin = Daikin() self.daikin.scan() self.xbox_smartglass = XboxSmartGlass() self.xbox_smartglass.scan() def stop(self): """Turn discovery off.""" if not self.is_discovering: return self.mdns.stop() # Not removing SSDP because it tracks state self.mdns = None self.gdm = None self.lms = None self.tellstick = None self.daikin = None self.xbox_smartglass = None self.discoverables = None self.is_discovering = False def discover(self): """Return a list of discovered devices and services.""" if not self.is_discovering: raise RuntimeError("Needs to be called after start, before stop") return [dis for dis, checker in self.discoverables.items() if checker.is_discovered()] def get_info(self, dis): """Get a list with the most important info about discovered type.""" return self.discoverables[dis].get_info() def get_entries(self, dis): """Get a list with all info about a discovered type.""" return self.discoverables[dis].get_entries() def _load_device_support(self): """Load the devices and services that can be discovered.""" self.discoverables = {} discoverables_format = __name__.rsplit('.', 1)[0] + '.discoverables.{}' for module_name in os.listdir(os.path.join(os.path.dirname(__file__), 'discoverables')): if module_name[-3:] != '.py' or module_name == '__init__.py': continue module_name = module_name[:-3] module = importlib.import_module( discoverables_format.format(module_name)) self.discoverables[module_name] = module.Discoverable(self) def print_raw_data(self): """Helper method to show what is discovered in your network.""" from pprint import pprint print("Zeroconf") pprint(self.mdns.entries) print("") print("SSDP") pprint(self.ssdp.entries) print("") print("GDM") pprint(self.gdm.entries) print("") print("LMS") pprint(self.lms.entries) print("") print("Tellstick") pprint(self.tellstick.entries) print("") print("Xbox SmartGlass") pprint(self.xbox_smartglass.entries)