"""PiSugar helper class for Inkycal.""" import logging import subprocess from inkycal.settings import Settings settings = Settings() logger = logging.getLogger(__name__) class PiSugar: def __init__(self): # replace "command" with actual command self.command_template = 'echo "command" | nc -q 0 127.0.0.1 8423' self.allowed_commands = ["get battery", "get model", "get rtc_time", "get rtc_alarm_enabled", "get rtc_alarm_time", "get alarm_repeat", "rtc_pi2rtc"] def _get_output(self, command): if command not in self.allowed_commands: logger.error(f"Command {command} not allowed") return None cmd = self.command_template.replace("command", command) try: result = subprocess.run(cmd, shell=True, text=True, capture_output=True) if result.returncode != 0: print(f"Command failed with {result.stderr}") return None output = result.stdout.strip() return output except Exception as e: logger.error(f"Error executing command: {e}") return None def get_battery(self) -> int or None: """Get the battery level in percentage. Returns: int or None: The battery level in percentage or None if the command fails. """ battery_output = self._get_output("get battery") if battery_output: for line in battery_output.splitlines(): if 'battery:' in line: return int(line.split(':')[1].strip()) return None def get_model(self) -> str or None: """Get the PiSugar model.""" model_output = self._get_output("get model") if model_output: for line in model_output.splitlines(): if 'model:' in line: return line.split(':')[1].strip() return None def get_rtc_time(self) -> str or None: """Get the RTC time.""" result = self._get_output("get rtc_time") if result: second_line = result.splitlines()[1] return second_line.split('rtc_time: ')[1].strip() return None def get_rtc_alarm_enabled(self) -> str or None: """Get the RTC alarm enabled status.""" result = self._get_output("get rtc_alarm_enabled") if result: second_line = result.splitlines()[1] return second_line.split('rtc_alarm_enabled: ')[1].strip() return None def get_rtc_alarm_time(self) -> str or None: """Get the RTC alarm time.""" result = self._get_output("get rtc_alarm_time") if result: second_line = result.splitlines()[1] return second_line.split('rtc_alarm_time: ')[1].strip() return None def get_alarm_repeat(self) -> dict or None: """Get the alarm repeat status. Returns: dict or None: A dictionary with the alarm repeating days or None if the command fails. """ result = self._get_output("get alarm_repeat") if result: second_line = result.splitlines()[1] repeating_days = f"{int(second_line.split('alarm_repeat: ')[1].strip()):8b}".strip() data = {"Monday": False, "Tuesday": False, "Wednesday": False, "Thursday": False, "Friday": False, "Saturday": False, "Sunday": False} if repeating_days[0] == "1": data["Monday"] = True if repeating_days[1] == "1": data["Tuesday"] = True if repeating_days[2] == "1": data["Wednesday"] = True if repeating_days[3] == "1": data["Thursday"] = True if repeating_days[4] == "1": data["Friday"] = True if repeating_days[5] == "1": data["Saturday"] = True if repeating_days[6] == "1": data["Sunday"] = True return data return None def rtc_pi2rtc(self) -> bool: """Sync the Pi time to RTC. Returns: bool: True if the sync was successful, False otherwise. """ result = self._get_output("rtc_pi2rtc") if result: second_line = result.splitlines()[1] status = second_line.split('rtc_pi2rtc: ')[1].strip() if status == "done": return True return False