Adds pyproject.toml.
[python_utils.git] / smart_home / lights.py
index 240e7da84412f089702b7b50bd4ce5b5080ca0eb..908fe8d3ed3550c809af1678fa905b1311336728 100644 (file)
@@ -55,11 +55,13 @@ def tplink_light_command(command: str) -> bool:
             logger.warning(msg)
             logging_utils.hlog(msg)
             return False
-    logger.debug(f'{command} succeeded.')
+    logger.debug('%s succeeded.', command)
     return True
 
 
 class BaseLight(dev.Device):
+    """A base class representing a smart light."""
+
     def __init__(self, name: str, mac: str, keywords: str = "") -> None:
         super().__init__(name.strip(), mac.strip(), keywords)
 
@@ -111,8 +113,7 @@ class BaseLight(dev.Device):
 
 
 class GoogleLight(BaseLight):
-    def __init__(self, name: str, mac: str, keywords: str = "") -> None:
-        super().__init__(name, mac, keywords)
+    """A smart light controlled by talking to Google."""
 
     def goog_name(self) -> str:
         name = self.get_name()
@@ -124,15 +125,11 @@ class GoogleLight(BaseLight):
 
     @overrides
     def turn_on(self) -> bool:
-        return GoogleLight.parse_google_response(
-            ask_google(f"turn {self.goog_name()} on")
-        )
+        return GoogleLight.parse_google_response(ask_google(f"turn {self.goog_name()} on"))
 
     @overrides
     def turn_off(self) -> bool:
-        return GoogleLight.parse_google_response(
-            ask_google(f"turn {self.goog_name()} off")
-        )
+        return GoogleLight.parse_google_response(ask_google(f"turn {self.goog_name()} off"))
 
     @overrides
     def status(self) -> str:
@@ -187,12 +184,12 @@ class GoogleLight(BaseLight):
 
     @overrides
     def make_color(self, color: str) -> bool:
-        return GoogleLight.parse_google_response(
-            ask_google(f"make {self.goog_name()} {color}")
-        )
+        return GoogleLight.parse_google_response(ask_google(f"make {self.goog_name()} {color}"))
 
 
 class TuyaLight(BaseLight):
+    """A Tuya smart light."""
+
     ids_by_mac = {
         '68:C6:3A:DE:1A:94': '8844664268c63ade1a94',
         '68:C6:3A:DE:27:1A': '8844664268c63ade271a',
@@ -257,14 +254,14 @@ class TuyaLight(BaseLight):
 
     @overrides
     def set_dimmer_level(self, level: int) -> bool:
-        logger.debug(f'Setting brightness to {level}')
+        logger.debug('Setting brightness to %d', level)
         self.bulb.set_brightness(level)
         return True
 
     @overrides
     def make_color(self, color: str) -> bool:
         rgb = BaseLight.parse_color_string(color)
-        logger.debug(f'Light color: {color} -> {rgb}')
+        logger.debug('Light color: %s -> %s', color, rgb)
         if rgb is not None:
             self.bulb.set_colour(rgb[0], rgb[1], rgb[2])
             return True
@@ -272,16 +269,19 @@ class TuyaLight(BaseLight):
 
 
 class TPLinkLight(BaseLight):
+    """A TPLink smart light."""
+
     def __init__(self, name: str, mac: str, keywords: str = "") -> None:
         super().__init__(name, mac, keywords)
         self.children: List[str] = []
         self.info: Optional[Dict] = None
         self.info_ts: Optional[datetime.datetime] = None
-        if "children" in self.keywords:
-            self.info = self.get_info()
-            if self.info is not None:
-                for child in self.info["children"]:
-                    self.children.append(child["id"])
+        if self.keywords is not None:
+            if "children" in self.keywords:
+                self.info = self.get_info()
+                if self.info is not None:
+                    for child in self.info["children"]:
+                        self.children.append(child["id"])
 
     @memoized
     def get_tplink_name(self) -> Optional[str]:
@@ -306,7 +306,7 @@ class TPLinkLight(BaseLight):
         cmd = self.get_cmdline(child) + f"-c {cmd}"
         if extra_args is not None:
             cmd += f" {extra_args}"
-        logger.debug(f'About to execute {cmd}')
+        logger.debug('About to execute: %s', cmd)
         return tplink_light_command(cmd)
 
     @overrides
@@ -335,13 +335,14 @@ class TPLinkLight(BaseLight):
     @timeout(10.0, use_signals=False, error_message="Timed out waiting for tplink.py")
     def get_info(self) -> Optional[Dict]:
         cmd = self.get_cmdline() + "-c info"
+        logger.debug('Getting status of %s via "%s"...', self.mac, cmd)
         out = subprocess.getoutput(cmd)
-        logger.debug(f'RAW OUT> {out}')
+        logger.debug('RAW OUT> %s', out)
         out = re.sub("Sent:.*\n", "", out)
         out = re.sub("Received: *", "", out)
         try:
             self.info = json.loads(out)["system"]["get_sysinfo"]
-            logger.debug(json.dumps(self.info, indent=4, sort_keys=True))
+            logger.debug("%s", json.dumps(self.info, indent=4, sort_keys=True))
             self.info_ts = datetime.datetime.now()
             return self.info
         except Exception as e: