You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

148 lines
3.9 KiB

"""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)