summaryrefslogtreecommitdiff
path: root/netdisco/discovery.py
diff options
context:
space:
mode:
Diffstat (limited to 'netdisco/discovery.py')
-rw-r--r--netdisco/discovery.py148
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)