X-Git-Url: https://wannabe.guru.org/gitweb/?a=blobdiff_plain;f=smart_home%2Fregistry.py;h=8ca7f3b96dad4cc25807b59d948803e95e8c72ca;hb=HEAD;hp=f79ae90c15f5f7c881ae1acecaee434681aaf2aa;hpb=cce8d58af187c0a7fb7585eab5bda9fed731b719;p=python_utils.git diff --git a/smart_home/registry.py b/smart_home/registry.py index f79ae90..8ca7f3b 100644 --- a/smart_home/registry.py +++ b/smart_home/registry.py @@ -1,5 +1,7 @@ #!/usr/bin/env python3 +# © Copyright 2021-2022, Scott Gasch + """A searchable registry of known smart home devices and a factory for constructing our wrappers around them.""" @@ -81,9 +83,9 @@ class SmartHomeRegistry(object): self._keywords_by_name[name] = keywords self._keywords_by_mac[mac] = keywords self._names_by_mac[mac] = name - self.index_device(name, keywords, mac) + self._index_device(name, keywords, mac) - def index_device(self, name: str, keywords: str, mac: str) -> None: + def _index_device(self, name: str, keywords: str, mac: str) -> None: properties = [("name", name)] tags = set() for kw in keywords.split(): @@ -109,9 +111,30 @@ class SmartHomeRegistry(object): return s def get_keywords_by_name(self, name: str) -> Optional[str]: + """Given the name of a device, get its keywords. + + >>> reg = SmartHomeRegistry('/home/scott/bin/network_mac_addresses.txt') + >>> reg.get_keywords_by_name('near_kitchen_lamp') + 'wifi smart light goog meross test' + + >>> reg.get_keywords_by_name('unknown') is None + True + + """ return self._keywords_by_name.get(name, None) def get_macs_by_name(self, name: str) -> Set[str]: + """Given the name of a device, get its MAC address(es) + + >>> reg = SmartHomeRegistry('/home/scott/bin/network_mac_addresses.txt') + >>> reg.get_macs_by_name('near_kitchen_lamp') + {'34:29:8F:12:34:8E'} + + >>> reg.get_macs_by_name('unknown') + set() + + """ + retval = set() for (mac, lname) in self._names_by_mac.items(): if name in lname: @@ -119,6 +142,19 @@ class SmartHomeRegistry(object): return retval def get_macs_by_keyword(self, keyword: str) -> Set[str]: + """Given a keyword, return the set of MAC address(es) that have + that keyword. + + >>> reg = SmartHomeRegistry('/home/scott/bin/network_mac_addresses.txt') + >>> r = reg.get_macs_by_keyword('test') + >>> e = set(['34:29:8F:12:26:74' , '34:29:8F:12:34:8E']) + >>> r == e + True + + >>> reg.get_macs_by_keyword('unknown') + set() + + """ retval = set() for (mac, keywords) in self._keywords_by_mac.items(): if keyword in keywords: @@ -126,11 +162,15 @@ class SmartHomeRegistry(object): return retval def get_device_by_name(self, name: str) -> Optional[device.Device]: + """Given a name, return its Device object.""" + if name in self._macs_by_name: return self.get_device_by_mac(self._macs_by_name[name]) return None def get_all_devices(self) -> List[device.Device]: + """Return a list of all known devices.""" + retval = [] for mac, _ in self._keywords_by_mac.items(): if mac is not None: @@ -140,6 +180,8 @@ class SmartHomeRegistry(object): return retval def get_device_by_mac(self, mac: str) -> Optional[device.Device]: + """Given a MAC address, return its Device object.""" + if mac in self._keywords_by_mac: name = self._names_by_mac[mac] kws = self._keywords_by_mac[mac] @@ -195,7 +237,7 @@ class SmartHomeRegistry(object): return None def query(self, query: str) -> List[device.Device]: - """Evaluates a lighting query expression formed of keywords to search + """Evaluates a device query expression formed of keywords to search for, logical operators (and, or, not), and parenthesis. Returns a list of matching lights. """ @@ -209,3 +251,9 @@ class SmartHomeRegistry(object): if dev is not None: retval.append(dev) return retval + + +if __name__ == '__main__': + import doctest + + doctest.testmod()