jaraco / jaraco.abode

MIT License
11 stars 9 forks source link

Streaming updates to panel state result in an Exception #21

Closed evanmoses-okta closed 1 year ago

evanmoses-okta commented 1 year ago

Version: main (d768c45c4bd82e51c6684475757c50e883026b60)

To reproduce, run abode -u <username> -p <password> --mfa <my mfa> --debug --listen, then change the alarm state via the keypad or app. You'll see the following exception. Note that there's no 'mac' key in the panel update JSON response:


2023-02-02 10:07:20 DEBUG (SocketIOThread) [lomond]  SRV -> CLI : <frame TEXT (974 bytes) fin=1>
2023-02-02 10:07:20 DEBUG (SocketIOThread) [jaraco.abode.socketio] Received: 42["com.goabode.gateway.timeline",{"mac":"B0:C5:CA:3B:17:C9","id":4100831488,"date":"02/02/2023","time":"10:07 AM","event_utc":1675361239,"event_cid":"","event_code":"1401","device_id":"","device_type_id":"1","device_type":"Panel","nest_has_motion":"","nest_has_sound":"","nest_has_person":"","video_length":"","hasFaults":"0","device_name":"Gateway","file_path":"","deep_link":"","file_name":"","file_size":"","file_count":"","file_is_del":0,"file_is_video":"","event_type":"Disarmed - Standby","severity":"4","pos":"l","color":"#000000","person":0,"package":0,"pet":0,"is_alarm":"0","icon":"assets/email/standby.png","user_id":"","user_name":"","mobile_name":"","parent_tid":"","app_type":"","viewed_by_uid":"","verified_by_tid":"","event_name":"Gateway Disarmed - Standby","event_by":"","la_applied_by":"","la_event_type":"","la_culprit_mobiles":"","la_executed":"","triggered_by_str":"","la_applied_at":"","has_actions":0,"action_type":"","action_by":"","action_at":""}]
2023-02-02 10:07:20 DEBUG (SocketIOThread) [jaraco.abode.event_controller] Timeline event received: Gateway Disarmed - Standby - Disarmed - Standby (1401)
2023-02-02 10:07:20 INFO (SocketIOThread) [abodecl] Gateway Disarmed - Standby - Disarmed - Standby at 02/02/2023 10:07 AM
2023-02-02 10:07:20 DEBUG (SocketIOThread) [lomond]  SRV -> CLI : <frame TEXT (40 bytes) fin=1>
2023-02-02 10:07:20 DEBUG (SocketIOThread) [jaraco.abode.socketio] Received: 42["com.goabode.gateway.mode","standby"]
2023-02-02 10:07:20 DEBUG (SocketIOThread) [jaraco.abode.event_controller] Alarm mode change event to: standby
2023-02-02 10:07:20 DEBUG (SocketIOThread) [jaraco.abode.devices.base] Device Refresh Response: {"site_id":"<redacted>","version":"ABGW-2 0.0.2.22I_6.8F_homekit_2.0.9_s2 BG_U-ITR-F1-BD_BL.A30.20201225 4.1.2.6.2","report_account":"<redacted>","online":"1","initialized":"1","net_version":"0.0.2.22I_6.8F_homekit_2.0.9_s2","rf_version":"BG_U-ITR-F1-BD_BL.A30.20201225","zigbee_version":"4.1.2.6.2","z_wave_version":"","timezone":"America\/Los_Angeles","ac_fail":"0","battery":"0","ip":"192.168.2.110","jam":"0","rssi":"1","is_real":"1","setup_zone_1":"1","setup_zone_2":"1","setup_zone_3":"1","setup_zone_4":"1","setup_zone_5":"1","setup_zone_6":"1","setup_zone_7":"1","setup_zone_8":"1","setup_zone_9":"1","setup_zone_10":"1","setup_gateway":"1","setup_contacts":"1","setup_billing":"1","setup_users":"1","is_cellular":"0","plan_set_id":"8","dealer_id":"0","tz_diff":"-8:00","model":"F1","gateway_model":"ABGW-2","has_wifi":"0","has_s2_support":"0","mode":{"area_1":"standby","area_1_label":"Standby","area_2":"standby","area_2_label":"Standby"},"areas":{"1":{"modes":{"0":{"area":"1","mode":"0","read_only":"1","is_set":"1","name":"standby","color":null,"icon_id":null,"entry1":null,"entry2":null,"exit":null,"icon_path":null},"1":{"area":"1","mode":"1","read_only":"1","is_set":"1","name":"away","color":null,"icon_id":null,"entry1":"60","entry2":"60","exit":"60","icon_path":null},"2":{"area":"1","mode":"2","read_only":"1","is_set":"1","name":"home","color":null,"icon_id":null,"entry1":"10","entry2":"60","exit":"0","icon_path":null},"3":{"area":"1","mode":"3","read_only":"0","is_set":"0","name":null,"color":null,"icon_id":null,"entry1":"60","entry2":"60","exit":"60","icon_path":null},"4":{"area":"1","mode":"4","read_only":"0","is_set":"0","name":null,"color":null,"icon_id":null,"entry1":"60","entry2":"60","exit":"60","icon_path":null}}},"2":{"modes":{"0":{"area":"2","mode":"0","read_only":"1","is_set":"1","name":"standby","color":null,"icon_id":null,"entry1":null,"entry2":null,"exit":null,"icon_path":null},"1":{"area":"2","mode":"1","read_only":"1","is_set":"1","name":"away","color":null,"icon_id":null,"entry1":"60","entry2":"60","exit":"60","icon_path":null},"2":{"area":"2","mode":"2","read_only":"1","is_set":"1","name":"home","color":null,"icon_id":null,"entry1":"60","entry2":"60","exit":"60","icon_path":null},"3":{"area":"2","mode":"3","read_only":"0","is_set":"0","name":null,"color":null,"icon_id":null,"entry1":"60","entry2":"60","exit":"60","icon_path":null},"4":{"area":"2","mode":"4","read_only":"0","is_set":"0","name":null,"color":null,"icon_id":null,"entry1":"60","entry2":"60","exit":"60","icon_path":null}}}}}
2023-02-02 10:07:20 ERROR (SocketIOThread) [jaraco.abode.socketio] Captured exception during SocketIO event callback: 'NoneType' object has no attribute 'replace'
Traceback (most recent call last):
  File "/Users/evan.moses@okta.com/dev/jaraco.abode/abode/lib/python3.10/site-packages/jaraco/abode/socketio.py", line 316, in _handle_event
    callback(*args)
  File "/Users/evan.moses@okta.com/dev/jaraco.abode/abode/lib/python3.10/site-packages/jaraco/abode/event_controller.py", line 243, in _on_mode_change
    alarm_device = self._client.get_alarm(refresh=True)
  File "/Users/evan.moses@okta.com/dev/jaraco.abode/abode/lib/python3.10/site-packages/jaraco/abode/client.py", line 274, in get_alarm
    return self.get_device(ALARM.id(area), refresh)
  File "/Users/evan.moses@okta.com/dev/jaraco.abode/abode/lib/python3.10/site-packages/jaraco/abode/client.py", line 231, in get_device
    device.refresh()
  File "/Users/evan.moses@okta.com/dev/jaraco.abode/abode/lib/python3.10/site-packages/jaraco/abode/devices/alarm.py", line 95, in refresh
    response_object = super().refresh(url)
  File "/Users/evan.moses@okta.com/dev/jaraco.abode/abode/lib/python3.10/site-packages/jaraco/abode/devices/base.py", line 111, in refresh
    self.update(device)
  File "/Users/evan.moses@okta.com/dev/jaraco.abode/abode/lib/python3.10/site-packages/jaraco/abode/devices/alarm.py", line 102, in update
    super().update(state_from_panel(state, area=self._area))
  File "/Users/evan.moses@okta.com/dev/jaraco.abode/abode/lib/python3.10/site-packages/jaraco/abode/devices/alarm.py", line 26, in state_from_panel
    alarm_state['uuid'] = alarm_state.get('mac').replace(':', '').lower()
AttributeError: 'NoneType' object has no attribute 'replace'
evanmoses-okta commented 1 year ago

This appears to be the cause of https://github.com/home-assistant/core/issues/86765

jaraco commented 1 year ago

I've confirmed this issue was introduced in #9. Unfortunately, due to #17, there's poor coverage of tests for events.