raise NotImplementedError
def get_info(self) -> Optional[Dict]:
- cmd = self.get_cmdline() + "-c info"
- self.info = tplink.tplink_get_info(cmd)
- if self.info is not None:
- self.info_ts = datetime.datetime.now()
- else:
- self.info_ts = None
- return self.info
+ ip = self.get_ip()
+ if ip is not None:
+ self.info = tplink.tplink_get_info(ip)
+ if self.info is not None:
+ self.info_ts = datetime.datetime.now()
+ else:
+ self.info_ts = None
+ return self.info
+ return None
@overrides
def status(self) -> str:
return not self.is_on()
def get_info(self) -> Optional[Dict]:
- cmd = self.get_cmdline() + "-c info"
- self.info = tplink.tplink_get_info(cmd)
- if self.info is not None:
- self.info_ts = datetime.datetime.now()
- else:
- self.info_ts = None
- return self.info
+ ip = self.get_ip()
+ if ip is not None:
+ self.info = tplink.tplink_get_info(ip)
+ if self.info is not None:
+ self.info_ts = datetime.datetime.now()
+ else:
+ self.info_ts = None
+ return self.info
+ return None
def get_on_duration_seconds(self) -> int:
self.info = self.get_info()
import json
import logging
import os
-import re
import socket
-import subprocess
-import sys
import time
from struct import pack
from typing import Dict, List, Optional, Tuple
return True
-@timeout(10.0, use_signals=False, error_message="Timed out waiting for tplink.py")
-def tplink_get_info(cmd: str) -> Optional[Dict]:
- logger.debug('Getting tplink device status via "%s"', cmd)
- try:
- out = subprocess.getoutput(cmd)
- logger.debug('RAW OUT> %s', out)
- out = re.sub("Sent:.*\n", "", out)
- out = re.sub("Received: *", "", out)
- info = json.loads(out)["system"]["get_sysinfo"]
+def tplink_get_info(ip: str, port: int = 9999) -> Optional[Dict]:
+ success, response = communicate_with_device(ip, port, commands['info'], quiet=True)
+ if success:
+ assert len(response) == 1
+ info = json.loads(response[0])["system"]["get_sysinfo"]
logger.debug("%s", json.dumps(info, indent=4, sort_keys=True))
return info
- except Exception as e:
- logger.exception(e)
- print(out, file=sys.stderr)
- return None
+ return None
def encrypt(string: str) -> bytes: