More cleanup.
[python_utils.git] / smart_home / outlets.py
index d29fc4adb44335dce5772a504b539a2b2803faa9..60b98a63534e6897f6b448edaedebe9bb9c638b1 100644 (file)
@@ -58,11 +58,13 @@ def tplink_outlet_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 BaseOutlet(dev.Device):
+    """An abstract base class for smart outlets."""
+
     def __init__(self, name: str, mac: str, keywords: str = "") -> None:
         super().__init__(name.strip(), mac.strip(), keywords)
 
@@ -84,6 +86,8 @@ class BaseOutlet(dev.Device):
 
 
 class TPLinkOutlet(BaseOutlet):
+    """A TPLink smart outlet."""
+
     def __init__(self, name: str, mac: str, keywords: str = '') -> None:
         super().__init__(name, mac, keywords)
         self.info: Optional[Dict] = None
@@ -150,11 +154,15 @@ class TPLinkOutlet(BaseOutlet):
 
 
 class TPLinkOutletWithChildren(TPLinkOutlet):
+    """A TPLink outlet where the top and bottom plus are individually
+    controllable."""
+
     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
+        assert self.keywords is not None
         assert "children" in self.keywords
         self.info = self.get_info()
         if self.info is not None:
@@ -177,7 +185,7 @@ class TPLinkOutletWithChildren(TPLinkOutlet):
         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_outlet_command(cmd)
 
     def get_children(self) -> List[str]:
@@ -207,6 +215,8 @@ class TPLinkOutletWithChildren(TPLinkOutlet):
 
 
 class GoogleOutlet(BaseOutlet):
+    """A smart outlet controlled via Google Assistant."""
+
     def __init__(self, name: str, mac: str, keywords: str = "") -> None:
         super().__init__(name.strip(), mac.strip(), keywords)
         self.info = None
@@ -221,15 +231,11 @@ class GoogleOutlet(BaseOutlet):
 
     @overrides
     def turn_on(self) -> bool:
-        return GoogleOutlet.parse_google_response(
-            ask_google(f'turn {self.goog_name()} on')
-        )
+        return GoogleOutlet.parse_google_response(ask_google(f'turn {self.goog_name()} on'))
 
     @overrides
     def turn_off(self) -> bool:
-        return GoogleOutlet.parse_google_response(
-            ask_google(f'turn {self.goog_name()} off')
-        )
+        return GoogleOutlet.parse_google_response(ask_google(f'turn {self.goog_name()} off'))
 
     @overrides
     def is_on(self) -> bool:
@@ -258,9 +264,7 @@ class MerossWrapper(object):
     def __init__(self):
         self.loop = asyncio.get_event_loop()
         self.email = os.environ.get('MEROSS_EMAIL') or scott_secrets.MEROSS_EMAIL
-        self.password = (
-            os.environ.get('MEROSS_PASSWORD') or scott_secrets.MEROSS_PASSWORD
-        )
+        self.password = os.environ.get('MEROSS_PASSWORD') or scott_secrets.MEROSS_PASSWORD
         self.devices = self.loop.run_until_complete(self.find_meross_devices())
         atexit.register(self.loop.close)
 
@@ -290,6 +294,8 @@ class MerossWrapper(object):
 
 
 class MerossOutlet(BaseOutlet):
+    """A Meross smart outlet class."""
+
     def __init__(self, name: str, mac: str, keywords: str = '') -> None:
         super().__init__(name, mac, keywords)
         self.meross_wrapper: Optional[MerossWrapper] = None