diff options
Diffstat (limited to 'netdisco/discovery.py')
-rw-r--r-- | netdisco/discovery.py | 148 |
1 files changed, 148 insertions, 0 deletions
diff --git a/netdisco/discovery.py b/netdisco/discovery.py new file mode 100644 index 0000000..27bce19 --- /dev/null +++ b/netdisco/discovery.py @@ -0,0 +1,148 @@ +"""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) |