"""CLI for PTDevices.""" import argparse import asyncio from asyncio.timeouts import timeout import json import logging from aiohttp import ClientSession, CookieJar import aioptdevices from aioptdevices.configuration import Configuration from aioptdevices.interface import Interface LOGGER = logging.getLogger(__name__) async def connect( deviceID: str, authToken: str, url: str, webSession: ClientSession, ) -> Interface | None: """Set up and Connect to PTDevices.""" # Setup interface to PTDevices interface: Interface = Interface( Configuration( authToken, deviceID, url, webSession, ) ) try: async with timeout(10): data = await interface.get_data() formatted_body: str = json.dumps(data.get("body"), indent=2) LOGGER.info("Data: %s", formatted_body) except aioptdevices.PTDevicesRequestError as err: LOGGER.warning("failed to connect to PTDevices server: %s", err) except aioptdevices.PTDevicesUnauthorizedError as err: LOGGER.warning("Unable to read device data because of bad token: %s", err) except aioptdevices.PTDevicesForbiddenError as err: LOGGER.warning("Unable, device does not belong to the token holder: %s", err) else: return interface return None async def main( deviceID: str, authToken: str, url: str, ) -> None: """Configure a connection and get the token api data from server.""" # ---------- Connecting To PTDevices ----------- LOGGER.info( "\n%s\n", " Connecting To PTDevices ".center(48, "-") ) # Output a section title for connecting # Create a web session for use when connecting session: ClientSession = ClientSession(cookie_jar=CookieJar(unsafe=True)) # session = ClientSession() # Setup connection to PTDevices ptdevicesInterface = await connect(deviceID, authToken, url, session) if not ptdevicesInterface: # Failed connection to PTDevices LOGGER.error("Failed to connect to PTDevices") await session.close() return # ----------------- Connected ------------------ LOGGER.info( "\n%s\n", " Connected ".center(48, "-") ) # Output a section title when connected LOGGER.info("Successfully connected to %s", deviceID) # try: # data = await ptdevicesInterface.get_data() # LOGGER.info(f"Device {deviceID} data: \n{data}") # except aioptdevices.PTDevicesRequestError as err: # LOGGER.warning(f"failed to connect to PTDevices server: {err}") # except aioptdevices.PTDevicesUnauthorizedError as err: # LOGGER.warning(f"Unable, to read device data because of bad token: {err}") # except aioptdevices.PTDevicesForbiddenError as err: # LOGGER.warning(f"Unable, device does not belong to the token holder: {err}") await session.close() return def starter(): """Parse CLI Arguments and fetch device data.""" default_url = "https://api.ptdevices.com/token/v1" # Parse cli args parser = argparse.ArgumentParser() parser.add_argument("authToken", type=str) parser.add_argument("-I", "--id", type=str, default="*") parser.add_argument("-U", "--url", type=str, default=default_url) parser.add_argument("-D", "--debug", action="store_true") args = parser.parse_args() # Set the log level LOG_LEVEL = logging.INFO if args.debug: LOG_LEVEL = logging.DEBUG logging.basicConfig(format="%(message)s", level=LOG_LEVEL) # Output the settings # LOGGER.info( # f"deviceID: {args.deviceID}\nToken: {args.authToken}\nurl: {args.url}\ndebug: {args.debug}\n" # ) # -------------------- ARGS -------------------- LOGGER.info("\n%s\n", " ARGS ".center(48, "-")) # Output a section title for args LOGGER.info("deviceID: %s", args.id) # LOGGER.info("Token: %s", args.authToken) LOGGER.info("url: %s", args.url) LOGGER.info("debug: %s", args.debug) # Run the program try: asyncio.run( main( deviceID=args.id, authToken=args.authToken, url=args.url, ) ) except KeyboardInterrupt: LOGGER.info("Keyboard interrupt") if __name__ == "__main__": starter() # ---------------------- ARGS ------------------