natekspencer / pylitterbot

Python package for controlling a Whisker connected self-cleaning litter boxes and feeders
MIT License
87 stars 11 forks source link

sleep_mode_active[1:] in litterrobot3.py causes "object is not subscriptable" #159

Closed ianatha closed 1 year ago

ianatha commented 1 year ago

Attempting to run the example from the README using 2023.4.2 causes this error:

Traceback (most recent call last):
  File "~/cat.py", line 28, in <module>
    asyncio.run(main())
  File "~/.asdf/installs/python/3.11.4/lib/python3.11/asyncio/runners.py", line 190, in run
    return runner.run(main)
           ^^^^^^^^^^^^^^^^
  File "~/.asdf/installs/python/3.11.4/lib/python3.11/asyncio/runners.py", line 118, in run
    return self._loop.run_until_complete(task)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "~/.asdf/installs/python/3.11.4/lib/python3.11/asyncio/base_events.py", line 653, in run_until_complete
    return future.result()
           ^^^^^^^^^^^^^^^
  File "~/cat.py", line 16, in main
    await account.connect(username=username, password=password, load_robots=True)
  File "~/.asdf/installs/python/3.11.4/lib/python3.11/site-packages/pylitterbot/account.py", line 88, in connect
    await self.load_robots(subscribe_for_updates)
  File "~/.asdf/installs/python/3.11.4/lib/python3.11/site-packages/pylitterbot/account.py", line 154, in load_robots
    await update_or_create_robot(LitterRobot3, robot_data)
  File "~/.asdf/installs/python/3.11.4/lib/python3.11/site-packages/pylitterbot/account.py", line 148, in update_or_create_robot
    robot = robot_cls(data=data, account=self)
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "~/.asdf/installs/python/3.11.4/lib/python3.11/site-packages/pylitterbot/robot/litterrobot3.py", line 40, in __init__
    super().__init__(data, account)
  File "~/.asdf/installs/python/3.11.4/lib/python3.11/site-packages/pylitterbot/robot/__init__.py", line 47, in __init__
    self._update_data(data)
  File "~/.asdf/installs/python/3.11.4/lib/python3.11/site-packages/pylitterbot/robot/litterrobot.py", line 152, in _update_data
    super()._update_data(data, partial, _callback)
  File "~/.asdf/installs/python/3.11.4/lib/python3.11/site-packages/pylitterbot/robot/__init__.py", line 185, in _update_data
    callback()
  File "~/.asdf/installs/python/3.11.4/lib/python3.11/site-packages/pylitterbot/robot/litterrobot.py", line 149, in _callback
    self._parse_sleep_info()
  File "~/.asdf/installs/python/3.11.4/lib/python3.11/site-packages/pylitterbot/robot/litterrobot3.py", line 133, in _parse_sleep_info
    map(int, sleep_mode_active[1:].split(":"))
             ~~~~~~~~~~~~~~~~~^^^^
TypeError: 'NoneType' object is not subscriptable

With LOGLEVEL=debug I get the following:

DEBUG:asyncio:Using selector: KqueueSelector
DEBUG:pylitterbot.session:Making POST request to https://42nk7qrhdg.execute-api.us-east-1.amazonaws.com/prod/login
DEBUG:pylitterbot.session:Received 200 response: {'token': '**REDACTED**'}
DEBUG:pylitterbot.session:Making POST request to https://www.googleapis.com/identitytoolkit/v3/relyingparty/verifyCustomToken
DEBUG:pylitterbot.session:Received 200 response: {'kind': 'identitytoolkit#VerifyCustomTokenResponse', 'idToken': '**REDACTED**', 'refreshToken': '**REDACTED**', 'expiresIn': '3600', 'isNewUser': False}
DEBUG:pylitterbot.session:Making GET request to https://v2.api.whisker.iothings.site/users
DEBUG:pylitterbot.session:Received 200 response: {'user': {'userId': '**REDACTED**', 'userEmail': '**REDACTED**', 'firstName': '**REDACTED**', 'lastName': '**REDACTED**'}, 'litterRobots': [{'userId': '**REDACTED**', 'litterRobotId': '**REDACTED**', 'litterRobotSerial': '**REDACTED**', 'litterRobotNickname': 'Cosmonaut'}], 'mobileDevices': [{'userId': '**REDACTED**', 'oneSignalPlayerId': '**REDACTED**', 'deviceId': '**REDACTED**', 'version': '3.0'}, {'userId': '**REDACTED**', 'oneSignalPlayerId': '**REDACTED**', 'deviceId': '**REDACTED**', 'version': '1.0'}], 'settings': {'all_notifications': '1', 'general_notifications': '1', 'fault_notifications': '1', 'DFI_notifications': '1', 'CCC_notifications': '1', 'CSI_notifications': '1', 'CSF_notifications': '1', 'PD_notifications': '1', 'OTF_notifications': '1', 'DHF_notifications': '1', 'BR_notifications': '1', 'offline_notifications': '1', 'userId': '**REDACTED**'}}
DEBUG:pylitterbot.session:Making GET request to https://v2.api.whisker.iothings.site/users/**REDACTED**/robots
DEBUG:pylitterbot.session:Making POST request to https://lr4.iothings.site/graphql
DEBUG:pylitterbot.session:Making POST request to https://graphql.whisker.iothings.site/v1/graphql
DEBUG:pylitterbot.session:Received 200 response: [{'litterRobotId': '**REDACTED**', 'litterRobotSerial': None, 'litterRobotNickname': 'Cosmonaut', 'deviceType': 'udp', 'cycleCount': None, 'totalCycleCount': None, 'cycleCapacity': None, 'newCycleCapacity': None, 'savedCycleCapacity': None, 'isDFITriggered': None, 'isDf1Triggered': None, 'isDf2Triggered': None, 'isDfsTriggered': None, 'isManualReset': None, 'savedIsManualReset': None, 'previousDFITriggered': None, 'DFICycleCount': None, 'savedCycleCount': None, 'cleanCycleWaitTimeMinutes': None, 'cyclesAfterDrawerFull': None, 'nightLightActive': None, 'panelLockActive': None, 'sleepModeActive': None, 'sleepModeTime': None, 'powerStatus': None, 'unitStatus': None, 'sleepModeEndTime': None, 'sleepModeStartTime': None, 'lastSeen': None, 'setupDate': None, 'isOnboarded': False, 'didNotifyOffline': None, 'autoOfflineDisabled': True}]
DEBUG:pylitterbot.session:Received 200 response: {'data': {'getLitterRobot4ByUser': [{'unitId': '**REDACTED**', 'name': 'Litter-Robot 4', 'serial': '**REDACTED**', 'userId': '**REDACTED**', 'espFirmware': '1.1.66', 'picFirmwareVersion': '10500.3072.2.84', 'picFirmwareVersionHex': '2904.C00.254 (Production)', 'laserBoardFirmwareVersion': '5.0.1.1', 'laserBoardFirmwareVersionHex': '5.0.11 (Production)', 'wifiRssi': -45.0, 'unitPowerType': 'AC', 'catWeight': 3.92, 'displayCode': 'DC_MODE_IDLE', 'unitTimezone': 'Europe/Athens', 'unitTime': None, 'cleanCycleWaitTime': 15, 'isKeypadLockout': False, 'nightLightMode': 'AUTO', 'nightLightBrightness': 100, 'isPanelSleepMode': False, 'panelSleepTime': 0, 'panelWakeTime': 0, 'weekdaySleepModeEnabled': {'Sunday': {'sleepTime': 0, 'wakeTime': 0, 'isEnabled': False}, 'Monday': {'sleepTime': 0, 'wakeTime': 0, 'isEnabled': False}, 'Tuesday': {'sleepTime': 0, 'wakeTime': 0, 'isEnabled': False}, 'Wednesday': {'sleepTime': 0, 'wakeTime': 0, 'isEnabled': False}, 'Thursday': {'sleepTime': 0, 'wakeTime': 0, 'isEnabled': False}, 'Friday': {'sleepTime': 0, 'wakeTime': 0, 'isEnabled': False}, 'Saturday': {'sleepTime': 0, 'wakeTime': 0, 'isEnabled': False}}, 'unitPowerStatus': 'ON', 'sleepStatus': 'WAKE', 'robotStatus': 'ROBOT_IDLE', 'globeMotorFaultStatus': 'FAULT_CLEAR', 'pinchStatus': 'CLEAR', 'catDetect': 'CAT_DETECT_CLEAR', 'isBonnetRemoved': False, 'isNightLightLEDOn': False, 'odometerPowerCycles': 11, 'odometerCleanCycles': 3, 'panelBrightnessHigh': 0, 'panelBrightnessLow': 0, 'smartWeightEnabled': True, 'odometerEmptyCycles': 1, 'odometerFilterCycles': 0, 'isDFIResetPending': False, 'DFINumberOfCycles': 7, 'DFILevelPercent': 15, 'isDFIFull': False, 'DFIFullCounter': 0, 'DFITriggerCount': 0, 'litterLevel': 441, 'DFILevelMM': 21, 'isCatDetectPending': False, 'globeMotorRetractFaultStatus': 'FAULT_CLEAR', 'robotCycleStatus': 'CYCLE_IDLE', 'robotCycleState': 'CYCLE_STATE_WAIT_ON', 'weightSensor': 2.0, 'isOnline': True, 'isOnboarded': True, 'isProvisioned': True, 'isDebugModeActive': False, 'lastSeen': '2023-07-20T10:49:11.305Z', 'sessionId': '**REDACTED**', 'setupDateTime': '2023-07-20T10:17:05.636Z', 'isFirmwareUpdateTriggered': False, 'firmwareUpdateStatus': 'PICTRIGGERED', 'wifiModeStatus': 'ROUTER_CONNECTED', 'isUSBPowerOn': True, 'USBFaultStatus': 'CLEAR', 'isDFIPartialFull': False, 'isLaserDirty': False}]}}
DEBUG:pylitterbot.session:Received 200 response: {'data': {'feeder_unit': []}}