Skip to content

genericmiot: skip properties with invalid values - #1830

Merged
rytilahti merged 1 commit into
masterfrom
genericmiot/fix/skip_missing_values
Sep 24, 2023
Merged

genericmiot: skip properties with invalid values#1830
rytilahti merged 1 commit into
masterfrom
genericmiot/fix/skip_missing_values

Conversation

@rytilahti

@rytilahti rytilahti commented Sep 24, 2023

Copy link
Copy Markdown
Owner

GenericMiotStatus now ignores invalid properties (i.e., ones with missing values) and properties where the error code != 0.

Seen at #1822 (comment)

@codecov

codecov Bot commented Sep 24, 2023

Copy link
Copy Markdown

Codecov Report

Merging #1830 (d66f35f) into master (8f567fe) will increase coverage by 0.07%.
The diff coverage is 100.00%.

@@            Coverage Diff             @@
##           master    #1830      +/-   ##
==========================================
+ Coverage   80.80%   80.88%   +0.07%     
==========================================
  Files         192      193       +1     
  Lines       18546    18594      +48     
  Branches     4012     4019       +7     
==========================================
+ Hits        14986    15039      +53     
+ Misses       3282     3277       -5     
  Partials      278      278              
Files Changed Coverage Δ
miio/integrations/genericmiot/status.py 47.95% <100.00%> (+26.33%) ⬆️
miio/integrations/genericmiot/tests/test_status.py 100.00% <100.00%> (ø)

... and 1 file with indirect coverage changes

📣 We’re building smart automated test selection to slash your CI/CD build times. Learn more

@f-vicente

Copy link
Copy Markdown

It works!

But if I run multiple times, sometimes I receive "user ack timeout" error, and the following stack trace:

Running command status
DEBUG:miio.click_common:Unknown model, trying autodetection
DEBUG:miio.protocol:Unable to decrypt, returning raw bytes: b''
DEBUG:miio.miioprotocol:Got a response: Container:
    data = Container:
        data = b'' (total 0)
        value = b'' (total 0)
        offset1 = 32
        offset2 = 32
        length = 0
    header = Container:
        data = b'!1\x00 \x00\x00\x00\x00>\xe1\x13\xba\x00\x0b{r' (total 16)
        value = Container:
            length = 32
            unknown = 0
            device_id = unhexlify('3ee113ba')
            ts = 1970-01-09 17:01:38+00:00
        offset1 = 0
        offset2 = 16
        length = 16
    checksum = b'\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff' (total 16)
DEBUG:miio.miioprotocol:Discovered 3ee113ba with ts: 1970-01-09 17:01:38+00:00, token: b'ffffffffffffffffffffffffffffffff'
DEBUG:miio.miioprotocol:192.168.1.183:54321 >>: {'id': 1, 'method': 'miIO.info', 'params': []}
DEBUG:miio.miioprotocol:192.168.1.183:54321 (ts: 1970-01-09 17:01:38+00:00, id: 1) << {'exe_time': 3,
 'id': 1,
 'result': {'MemFree': 206668,
            'VmPeak': 57012,
            'VmRSS': 2160,
            'VmSize': 57012,
            'ap': {'bssid': 'b4:5f:84:f0:4c:c4',
                   'freq': 2427,
                   'rssi': '-36',
                   'ssid': 'FranN'},
            'fw_ver': '4.3.3_0016',
            'hw_ver': 'Linux',
            'ipflag': 1,
            'life': 752498,
            'mac': 'dc:ed:83:12:78:e9',
            'miio_client_ver': '4.3.3',
            'miio_times': [752497, 14, 16795, 724893],
            'miio_ver': '0.0.9',
            'model': 'xiaomi.vacuum.b106eu',
            'netif': {'gw': '192.168.1.1',
                      'localIp': '192.168.1.183',
                      'mask': '255.255.255.0'},
            'token': '554168566c3941625067637367376553',
            'uid': 27549465,
            'uptime': 752506}}
DEBUG:miio.device:Detected model xiaomi.vacuum.b106eu
DEBUG:miio.miot_cloud:Cache hit, returning contents of /home/fran/.cache/python-miio/xiaomi.vacuum.b106eu.json
DEBUG:miio.integrations.genericmiot.genericmiot:Initialized: description='Robot Cleaner' urn=<URN urn:miot-spec-v2:device:vacuum:0000A006:xiaomi-b106eu:1 parent:None>
DEBUG:miio.miot_models:Created enum <enum 'Status'>
DEBUG:miio.miot_models:Created enum <enum 'Mode'>
DEBUG:miio.miot_models:Created enum <enum 'Sweep Type'>
DEBUG:miio.integrations.genericmiot.genericmiot:vacuum:room-ids (Room IDs) reported no access information
DEBUG:miio.miot_models:Created enum <enum ''>
DEBUG:miio.miot_models:Created enum <enum ''>
DEBUG:miio.miot_models:Created enum <enum ''>
DEBUG:miio.miot_models:Created enum <enum ''>
DEBUG:miio.miot_models:Created enum <enum ''>
DEBUG:miio.miot_models:Created enum <enum ''>
DEBUG:miio.miot_models:Created enum <enum ''>
DEBUG:miio.miot_models:Created enum <enum ''>
DEBUG:miio.miot_models:Created enum <enum ''>
DEBUG:miio.miot_models:Created enum <enum ''>
DEBUG:miio.miot_models:Created enum <enum ''>
DEBUG:miio.miot_models:Created enum <enum ''>
DEBUG:miio.miot_models:Created enum <enum ''>
DEBUG:miio.integrations.genericmiot.genericmiot:sweep:consumable-index () reported no access information
DEBUG:miio.integrations.genericmiot.genericmiot:sweep:clean-room-ids () reported no access information
DEBUG:miio.integrations.genericmiot.genericmiot:sweep:clean-room-mode () reported no access information
DEBUG:miio.integrations.genericmiot.genericmiot:sweep:clean-room-oper () reported no access information
DEBUG:miio.integrations.genericmiot.genericmiot:sweep:record-start-time () reported no access information
DEBUG:miio.integrations.genericmiot.genericmiot:sweep:record-use-time () reported no access information
DEBUG:miio.integrations.genericmiot.genericmiot:sweep:record-clean-area () reported no access information
DEBUG:miio.integrations.genericmiot.genericmiot:sweep:record-map-url () reported no access information
DEBUG:miio.integrations.genericmiot.genericmiot:sweep:record-clean-mode () reported no access information
DEBUG:miio.integrations.genericmiot.genericmiot:sweep:record-clean-way () reported no access information
DEBUG:miio.integrations.genericmiot.genericmiot:sweep:clean-current-map () reported no access information
DEBUG:miio.integrations.genericmiot.genericmiot:sweep:clean-preference () reported no access information
DEBUG:miio.miot_models:Created enum <enum ''>
DEBUG:miio.miot_models:Created enum <enum ''>
DEBUG:miio.integrations.genericmiot.genericmiot:sweep:record-task-status () reported no access information
DEBUG:miio.integrations.genericmiot.genericmiot:sweep:clean-prefer-type () reported no access information
DEBUG:miio.integrations.genericmiot.genericmiot:sweep:clean-prefer-on () reported no access information
DEBUG:miio.integrations.genericmiot.genericmiot:sweep:clean-preference-ii () reported no access information
DEBUG:miio.integrations.genericmiot.genericmiot:sweep:clean-prefer-on-ii () reported no access information
DEBUG:miio.miot_models:Created enum <enum ''>
DEBUG:miio.integrations.genericmiot.genericmiot:sweep:go-charging () reported no access information
DEBUG:miio.miot_models:Created enum <enum ''>
DEBUG:miio.integrations.genericmiot.genericmiot:sweep:sd () reported no access information
DEBUG:miio.miot_models:Created enum <enum ''>
DEBUG:miio.miot_models:Created enum <enum ''>
DEBUG:miio.miot_models:Created enum <enum ''>
DEBUG:miio.miot_models:Created enum <enum ''>
DEBUG:miio.miot_models:Created enum <enum ''>
DEBUG:miio.miot_models:Created enum <enum ''>
DEBUG:miio.miot_models:Created enum <enum ''>
DEBUG:miio.miot_models:Created enum <enum ''>
DEBUG:miio.miot_models:Created enum <enum ''>
DEBUG:miio.miot_models:Created enum <enum ''>
DEBUG:miio.miot_models:Created enum <enum ''>
DEBUG:miio.miot_models:Created enum <enum ''>
DEBUG:miio.miot_models:Created enum <enum ''>
DEBUG:miio.miot_models:Created enum <enum ''>
DEBUG:miio.miot_models:Created enum <enum ''>
DEBUG:miio.miot_models:Created enum <enum ''>
DEBUG:miio.miot_models:Created enum <enum ''>
DEBUG:miio.miot_models:Created enum <enum ''>
DEBUG:miio.miot_models:Created enum <enum ''>
DEBUG:miio.miot_models:Created enum <enum ''>
DEBUG:miio.integrations.genericmiot.genericmiot:order:orderdata () reported no access information
DEBUG:miio.integrations.genericmiot.genericmiot:order:room-preference () reported no access information
DEBUG:miio.integrations.genericmiot.genericmiot:order:prefer-type () reported no access information
DEBUG:miio.integrations.genericmiot.genericmiot:order:is-global () reported no access information
DEBUG:miio.integrations.genericmiot.genericmiot:order:now-order-count () reported no access information
DEBUG:miio.miot_models:Created enum <enum ''>
DEBUG:miio.miot_models:Created enum <enum ''>
DEBUG:miio.integrations.genericmiot.genericmiot:point-zone:pause-type () reported no access information
DEBUG:miio.integrations.genericmiot.genericmiot:point-zone:beauty-point () reported no access information
DEBUG:miio.integrations.genericmiot.genericmiot:point-zone:map-id () reported no access information
DEBUG:miio.integrations.genericmiot.genericmiot:point-zone:map-type () reported no access information
DEBUG:miio.integrations.genericmiot.genericmiot:point-zone:timestamp () reported no access information
DEBUG:miio.miot_models:Created enum <enum ''>
DEBUG:miio.miot_models:Created enum <enum ''>
DEBUG:miio.miot_models:Created enum <enum ''>
DEBUG:miio.miot_models:Created enum <enum ''>
DEBUG:miio.miot_models:Created enum <enum ''>
DEBUG:miio.integrations.genericmiot.genericmiot:map:map-list () reported no access information
DEBUG:miio.integrations.genericmiot.genericmiot:map:upload-id () reported no access information
DEBUG:miio.integrations.genericmiot.genericmiot:map:upload-type () reported no access information
DEBUG:miio.integrations.genericmiot.genericmiot:map:map-name () reported no access information
DEBUG:miio.integrations.genericmiot.genericmiot:map:room-id () reported no access information
DEBUG:miio.integrations.genericmiot.genericmiot:map:room-name () reported no access information
DEBUG:miio.integrations.genericmiot.genericmiot:map:arrange-room-ids () reported no access information
DEBUG:miio.integrations.genericmiot.genericmiot:map:split-points () reported no access information
DEBUG:miio.integrations.genericmiot.genericmiot:map:lang () reported no access information
DEBUG:miio.miot_models:Created enum <enum ''>
DEBUG:miio.integrations.genericmiot.genericmiot:map:start-cleaning-point () reported no access information
DEBUG:miio.integrations.genericmiot.genericmiot:map:end-cleaning-point () reported no access information
DEBUG:miio.integrations.genericmiot.genericmiot:map:room-id-name-list () reported no access information
DEBUG:miio.integrations.genericmiot.genericmiot:map:timestamp () reported no access information
DEBUG:miio.miot_models:Created enum <enum ''>
DEBUG:miio.integrations.genericmiot.genericmiot:map:test-for-upload-map () reported no access information
DEBUG:miio.integrations.genericmiot.genericmiot:map:renew-map () reported no access information
DEBUG:miio.integrations.genericmiot.genericmiot:map:mijia-room-list () reported no access information
DEBUG:miio.miot_models:Created enum <enum ''>
DEBUG:miio.miot_models:Created enum <enum ''>
DEBUG:miio.miot_models:Created enum <enum ''>
DEBUG:miio.integrations.genericmiot.genericmiot:disturb:dnd-timezone () reported no access information
DEBUG:miio.integrations.genericmiot.genericmiot:language:target-voice () reported no access information
DEBUG:miio.integrations.genericmiot.genericmiot:language:cur-voice () reported no access information
DEBUG:miio.integrations.genericmiot.genericmiot:language:download-status () reported no access information
DEBUG:miio.integrations.genericmiot.genericmiot:language:download-progress () reported no access information
DEBUG:miio.integrations.genericmiot.genericmiot:language:voice-url () reported no access information
DEBUG:miio.integrations.genericmiot.genericmiot:language:voice-mdfive () reported no access information
DEBUG:miio.integrations.genericmiot.genericmiot:Created 52 actions
DEBUG:miio.integrations.genericmiot.genericmiot:        ActionDescriptor(id='vacuum:start-sweep', name='Start Sweep', type=None, unit=None, status_attribute=None, inputs=[], access=<AccessFlags.Execute: 4>)
DEBUG:miio.integrations.genericmiot.genericmiot:        ActionDescriptor(id='vacuum:stop-sweeping', name='Stop Sweeping', type=None, unit=None, status_attribute=None, inputs=[], access=<AccessFlags.Execute: 4>)
DEBUG:miio.integrations.genericmiot.genericmiot:        ActionDescriptor(id='vacuum:start-only-sweep', name='Start Only Sweep', type=None, unit=None, status_attribute=None, inputs=[], access=<AccessFlags.Execute: 4>)
DEBUG:miio.integrations.genericmiot.genericmiot:        ActionDescriptor(id='vacuum:start-sweep-mop', name='Start Sweep Mop', type=None, unit=None, status_attribute=None, inputs=[], access=<AccessFlags.Execute: 4>)
DEBUG:miio.integrations.genericmiot.genericmiot:        ActionDescriptor(id='vacuum:start-mop', name='Start Mop', type=None, unit=None, status_attribute=None, inputs=[], access=<AccessFlags.Execute: 4>)
DEBUG:miio.integrations.genericmiot.genericmiot:        ActionDescriptor(id='vacuum:start-room-sweep', name='Start Room Sweep', type=None, unit=None, status_attribute=None, inputs=[PropertyDescriptor(id='vacuum:room-ids', name='Room IDs', type=<class 'str'>, unit=None, status_attribute='vacuum_room_ids', access=<AccessFlags.0: 0>, constraint=<PropertyConstraint.Unset: 1>)], access=<AccessFlags.Execute: 4>)
DEBUG:miio.integrations.genericmiot.genericmiot:        ActionDescriptor(id='battery:start-charge', name='Start Charge', type=None, unit=None, status_attribute=None, inputs=[], access=<AccessFlags.Execute: 4>)
DEBUG:miio.integrations.genericmiot.genericmiot:        ActionDescriptor(id='sweep:reset-consumable', name='reset-consumable', type=None, unit=None, status_attribute=None, inputs=[EnumDescriptor(id='sweep:consumable-index', name='', type=<class 'int'>, unit=None, status_attribute='sweep_consumable_index', access=<AccessFlags.0: 0>, constraint=<PropertyConstraint.Choice: 3>)], access=<AccessFlags.Execute: 4>)
DEBUG:miio.integrations.genericmiot.genericmiot:        ActionDescriptor(id='sweep:set-calibration', name='set-calibration', type=None, unit=None, status_attribute=None, inputs=[], access=<AccessFlags.Execute: 4>)
DEBUG:miio.integrations.genericmiot.genericmiot:        ActionDescriptor(id='sweep:set-room-clean', name='set-room-clean', type=None, unit=None, status_attribute=None, inputs=[PropertyDescriptor(id='sweep:clean-room-ids', name='', type=<class 'str'>, unit=None, status_attribute='sweep_clean_room_ids', access=<AccessFlags.0: 0>, constraint=<PropertyConstraint.Unset: 1>), EnumDescriptor(id='sweep:clean-room-mode', name='', type=<class 'int'>, unit=None, status_attribute='sweep_clean_room_mode', access=<AccessFlags.0: 0>, constraint=<PropertyConstraint.Choice: 3>), EnumDescriptor(id='sweep:clean-room-oper', name='', type=<class 'int'>, unit=None, status_attribute='sweep_clean_room_oper', access=<AccessFlags.0: 0>, constraint=<PropertyConstraint.Choice: 3>)], access=<AccessFlags.Execute: 4>)
DEBUG:miio.integrations.genericmiot.genericmiot:        ActionDescriptor(id='sweep:set-preference-clean', name='set-preference-clean', type=None, unit=None, status_attribute=None, inputs=[PropertyDescriptor(id='sweep:clean-preference', name='', type=<class 'str'>, unit=None, status_attribute='sweep_clean_preference', access=<AccessFlags.0: 0>, constraint=<PropertyConstraint.Unset: 1>), RangeDescriptor(id='sweep:clean-current-map', name='', unit=None, status_attribute='sweep_clean_current_map', access=<AccessFlags.0: 0>, min_value=0, max_value=4294967295, step=1, range_attribute=None, type=<class 'int'>, constraint=<PropertyConstraint.Range: 2>)], access=<AccessFlags.Execute: 4>)
DEBUG:miio.integrations.genericmiot.genericmiot:        ActionDescriptor(id='sweep:get-preference-clean', name='get-preference-clean', type=None, unit=None, status_attribute=None, inputs=[RangeDescriptor(id='sweep:clean-current-map', name='', unit=None, status_attribute='sweep_clean_current_map', access=<AccessFlags.0: 0>, min_value=0, max_value=4294967295, step=1, range_attribute=None, type=<class 'int'>, constraint=<PropertyConstraint.Range: 2>)], access=<AccessFlags.Execute: 4>)
DEBUG:miio.integrations.genericmiot.genericmiot:        ActionDescriptor(id='sweep:set-preference-type', name='set-preference-type', type=None, unit=None, status_attribute=None, inputs=[EnumDescriptor(id='sweep:clean-prefer-type', name='', type=<class 'int'>, unit=None, status_attribute='sweep_clean_prefer_type', access=<AccessFlags.0: 0>, constraint=<PropertyConstraint.Choice: 3>)], access=<AccessFlags.Execute: 4>)
DEBUG:miio.integrations.genericmiot.genericmiot:        ActionDescriptor(id='sweep:set-go-charging', name='set-go-charging', type=None, unit=None, status_attribute=None, inputs=[EnumDescriptor(id='sweep:go-charging', name='', type=<class 'int'>, unit=None, status_attribute='sweep_go_charging', access=<AccessFlags.0: 0>, constraint=<PropertyConstraint.Choice: 3>)], access=<AccessFlags.Execute: 4>)
DEBUG:miio.integrations.genericmiot.genericmiot:        ActionDescriptor(id='sweep:erase-preference', name='erase-preference', type=None, unit=None, status_attribute=None, inputs=[PropertyDescriptor(id='sweep:clean-room-ids', name='', type=<class 'str'>, unit=None, status_attribute='sweep_clean_room_ids', access=<AccessFlags.0: 0>, constraint=<PropertyConstraint.Unset: 1>), RangeDescriptor(id='sweep:clean-current-map', name='', unit=None, status_attribute='sweep_clean_current_map', access=<AccessFlags.0: 0>, min_value=0, max_value=4294967295, step=1, range_attribute=None, type=<class 'int'>, constraint=<PropertyConstraint.Range: 2>), EnumDescriptor(id='sweep:clean-prefer-type', name='', type=<class 'int'>, unit=None, status_attribute='sweep_clean_prefer_type', access=<AccessFlags.0: 0>, constraint=<PropertyConstraint.Choice: 3>)], access=<AccessFlags.Execute: 4>)
DEBUG:miio.integrations.genericmiot.genericmiot:        ActionDescriptor(id='sweep:set-preference-ii', name='set-preference-ii', type=None, unit=None, status_attribute=None, inputs=[PropertyDescriptor(id='sweep:clean-preference', name='', type=<class 'str'>, unit=None, status_attribute='sweep_clean_preference', access=<AccessFlags.0: 0>, constraint=<PropertyConstraint.Unset: 1>), RangeDescriptor(id='sweep:clean-current-map', name='', unit=None, status_attribute='sweep_clean_current_map', access=<AccessFlags.0: 0>, min_value=0, max_value=4294967295, step=1, range_attribute=None, type=<class 'int'>, constraint=<PropertyConstraint.Range: 2>)], access=<AccessFlags.Execute: 4>)
DEBUG:miio.integrations.genericmiot.genericmiot:        ActionDescriptor(id='sweep:get-preference-ii', name='get-preference-ii', type=None, unit=None, status_attribute=None, inputs=[RangeDescriptor(id='sweep:clean-current-map', name='', unit=None, status_attribute='sweep_clean_current_map', access=<AccessFlags.0: 0>, min_value=0, max_value=4294967295, step=1, range_attribute=None, type=<class 'int'>, constraint=<PropertyConstraint.Range: 2>)], access=<AccessFlags.Execute: 4>)
DEBUG:miio.integrations.genericmiot.genericmiot:        ActionDescriptor(id='order:add', name='add', type=None, unit=None, status_attribute=None, inputs=[RangeDescriptor(id='order:order-id', name='', unit=None, status_attribute='order_order_id', access=<AccessFlags.Write: 2>, min_value=0, max_value=7258089600000, step=1, range_attribute=None, type=<class 'int'>, constraint=<PropertyConstraint.Range: 2>), EnumDescriptor(id='order:enable', name='', type=<class 'int'>, unit=None, status_attribute='order_enable', access=<AccessFlags.Write: 2>, constraint=<PropertyConstraint.Choice: 3>), RangeDescriptor(id='order:day', name='', unit=None, status_attribute='order_day', access=<AccessFlags.Write: 2>, min_value=0, max_value=255, step=1, range_attribute=None, type=<class 'int'>, constraint=<PropertyConstraint.Range: 2>), RangeDescriptor(id='order:hour', name='', unit=None, status_attribute='order_hour', access=<AccessFlags.Write: 2>, min_value=0, max_value=23, step=1, range_attribute=None, type=<class 'int'>, constraint=<PropertyConstraint.Range: 2>), RangeDescriptor(id='order:minute', name='', unit=None, status_attribute='order_minute', access=<AccessFlags.Write: 2>, min_value=0, max_value=59, step=1, range_attribute=None, type=<class 'int'>, constraint=<PropertyConstraint.Range: 2>), EnumDescriptor(id='order:repeat', name='', type=<class 'int'>, unit=None, status_attribute='order_repeat', access=<AccessFlags.Write: 2>, constraint=<PropertyConstraint.Choice: 3>), RangeDescriptor(id='order:mapid', name='', unit=None, status_attribute='order_mapid', access=<AccessFlags.Write: 2>, min_value=0, max_value=4294967295, step=1, range_attribute=None, type=<class 'int'>, constraint=<PropertyConstraint.Range: 2>), RangeDescriptor(id='order:time-zone', name='time-zone', unit=None, status_attribute='order_time_zone', access=<AccessFlags.Write: 2>, min_value=-99999, max_value=99999, step=1, range_attribute=None, type=<class 'int'>, constraint=<PropertyConstraint.Range: 2>), RangeDescriptor(id='order:room-count', name='', unit=None, status_attribute='order_room_count', access=<AccessFlags.Write: 2>, min_value=0, max_value=64, step=1, range_attribute=None, type=<class 'int'>, constraint=<PropertyConstraint.Range: 2>), PropertyDescriptor(id='order:room-preference', name='', type=<class 'str'>, unit=None, status_attribute='order_room_preference', access=<AccessFlags.0: 0>, constraint=<PropertyConstraint.Unset: 1>)], access=<AccessFlags.Execute: 4>)
DEBUG:miio.integrations.genericmiot.genericmiot:        ActionDescriptor(id='order:del', name='del', type=None, unit=None, status_attribute=None, inputs=[RangeDescriptor(id='order:order-id', name='', unit=None, status_attribute='order_order_id', access=<AccessFlags.Write: 2>, min_value=0, max_value=7258089600000, step=1, range_attribute=None, type=<class 'int'>, constraint=<PropertyConstraint.Range: 2>)], access=<AccessFlags.Execute: 4>)
DEBUG:miio.integrations.genericmiot.genericmiot:        ActionDescriptor(id='order:get', name='get', type=None, unit=None, status_attribute=None, inputs=[], access=<AccessFlags.Execute: 4>)
DEBUG:miio.integrations.genericmiot.genericmiot:        ActionDescriptor(id='order:add-ii', name='add-ii', type=None, unit=None, status_attribute=None, inputs=[RangeDescriptor(id='order:order-id', name='', unit=None, status_attribute='order_order_id', access=<AccessFlags.Write: 2>, min_value=0, max_value=7258089600000, step=1, range_attribute=None, type=<class 'int'>, constraint=<PropertyConstraint.Range: 2>), EnumDescriptor(id='order:enable', name='', type=<class 'int'>, unit=None, status_attribute='order_enable', access=<AccessFlags.Write: 2>, constraint=<PropertyConstraint.Choice: 3>), RangeDescriptor(id='order:day', name='', unit=None, status_attribute='order_day', access=<AccessFlags.Write: 2>, min_value=0, max_value=255, step=1, range_attribute=None, type=<class 'int'>, constraint=<PropertyConstraint.Range: 2>), RangeDescriptor(id='order:hour', name='', unit=None, status_attribute='order_hour', access=<AccessFlags.Write: 2>, min_value=0, max_value=23, step=1, range_attribute=None, type=<class 'int'>, constraint=<PropertyConstraint.Range: 2>), RangeDescriptor(id='order:minute', name='', unit=None, status_attribute='order_minute', access=<AccessFlags.Write: 2>, min_value=0, max_value=59, step=1, range_attribute=None, type=<class 'int'>, constraint=<PropertyConstraint.Range: 2>), EnumDescriptor(id='order:repeat', name='', type=<class 'int'>, unit=None, status_attribute='order_repeat', access=<AccessFlags.Write: 2>, constraint=<PropertyConstraint.Choice: 3>), RangeDescriptor(id='order:mapid', name='', unit=None, status_attribute='order_mapid', access=<AccessFlags.Write: 2>, min_value=0, max_value=4294967295, step=1, range_attribute=None, type=<class 'int'>, constraint=<PropertyConstraint.Range: 2>), RangeDescriptor(id='order:room-count', name='', unit=None, status_attribute='order_room_count', access=<AccessFlags.Write: 2>, min_value=0, max_value=64, step=1, range_attribute=None, type=<class 'int'>, constraint=<PropertyConstraint.Range: 2>), RangeDescriptor(id='order:time-zone', name='time-zone', unit=None, status_attribute='order_time_zone', access=<AccessFlags.Write: 2>, min_value=-99999, max_value=99999, step=1, range_attribute=None, type=<class 'int'>, constraint=<PropertyConstraint.Range: 2>), PropertyDescriptor(id='order:room-preference', name='', type=<class 'str'>, unit=None, status_attribute='order_room_preference', access=<AccessFlags.0: 0>, constraint=<PropertyConstraint.Unset: 1>), EnumDescriptor(id='order:prefer-type', name='', type=<class 'int'>, unit=None, status_attribute='order_prefer_type', access=<AccessFlags.0: 0>, constraint=<PropertyConstraint.Choice: 3>), EnumDescriptor(id='order:is-global', name='', type=<class 'int'>, unit=None, status_attribute='order_is_global', access=<AccessFlags.0: 0>, constraint=<PropertyConstraint.Choice: 3>)], access=<AccessFlags.Execute: 4>)
DEBUG:miio.integrations.genericmiot.genericmiot:        ActionDescriptor(id='order:get-map-order-count', name='get-map-order-count', type=None, unit=None, status_attribute=None, inputs=[RangeDescriptor(id='order:mapid', name='', unit=None, status_attribute='order_mapid', access=<AccessFlags.Write: 2>, min_value=0, max_value=4294967295, step=1, range_attribute=None, type=<class 'int'>, constraint=<PropertyConstraint.Range: 2>)], access=<AccessFlags.Execute: 4>)
DEBUG:miio.integrations.genericmiot.genericmiot:        ActionDescriptor(id='order:add-iii', name='add-iii', type=None, unit=None, status_attribute=None, inputs=[RangeDescriptor(id='order:order-id', name='', unit=None, status_attribute='order_order_id', access=<AccessFlags.Write: 2>, min_value=0, max_value=7258089600000, step=1, range_attribute=None, type=<class 'int'>, constraint=<PropertyConstraint.Range: 2>), EnumDescriptor(id='order:enable', name='', type=<class 'int'>, unit=None, status_attribute='order_enable', access=<AccessFlags.Write: 2>, constraint=<PropertyConstraint.Choice: 3>), RangeDescriptor(id='order:day', name='', unit=None, status_attribute='order_day', access=<AccessFlags.Write: 2>, min_value=0, max_value=255, step=1, range_attribute=None, type=<class 'int'>, constraint=<PropertyConstraint.Range: 2>), RangeDescriptor(id='order:hour', name='', unit=None, status_attribute='order_hour', access=<AccessFlags.Write: 2>, min_value=0, max_value=23, step=1, range_attribute=None, type=<class 'int'>, constraint=<PropertyConstraint.Range: 2>), RangeDescriptor(id='order:minute', name='', unit=None, status_attribute='order_minute', access=<AccessFlags.Write: 2>, min_value=0, max_value=59, step=1, range_attribute=None, type=<class 'int'>, constraint=<PropertyConstraint.Range: 2>), EnumDescriptor(id='order:repeat', name='', type=<class 'int'>, unit=None, status_attribute='order_repeat', access=<AccessFlags.Write: 2>, constraint=<PropertyConstraint.Choice: 3>), RangeDescriptor(id='order:mapid', name='', unit=None, status_attribute='order_mapid', access=<AccessFlags.Write: 2>, min_value=0, max_value=4294967295, step=1, range_attribute=None, type=<class 'int'>, constraint=<PropertyConstraint.Range: 2>), RangeDescriptor(id='order:room-count', name='', unit=None, status_attribute='order_room_count', access=<AccessFlags.Write: 2>, min_value=0, max_value=64, step=1, range_attribute=None, type=<class 'int'>, constraint=<PropertyConstraint.Range: 2>), RangeDescriptor(id='order:time-zone', name='time-zone', unit=None, status_attribute='order_time_zone', access=<AccessFlags.Write: 2>, min_value=-99999, max_value=99999, step=1, range_attribute=None, type=<class 'int'>, constraint=<PropertyConstraint.Range: 2>), PropertyDescriptor(id='order:room-preference', name='', type=<class 'str'>, unit=None, status_attribute='order_room_preference', access=<AccessFlags.0: 0>, constraint=<PropertyConstraint.Unset: 1>), EnumDescriptor(id='order:prefer-type', name='', type=<class 'int'>, unit=None, status_attribute='order_prefer_type', access=<AccessFlags.0: 0>, constraint=<PropertyConstraint.Choice: 3>), EnumDescriptor(id='order:is-global', name='', type=<class 'int'>, unit=None, status_attribute='order_is_global', access=<AccessFlags.0: 0>, constraint=<PropertyConstraint.Choice: 3>)], access=<AccessFlags.Execute: 4>)
DEBUG:miio.integrations.genericmiot.genericmiot:        ActionDescriptor(id='point-zone:start-point-clean', name='start-point-clean', type=None, unit=None, status_attribute=None, inputs=[], access=<AccessFlags.Execute: 4>)
DEBUG:miio.integrations.genericmiot.genericmiot:        ActionDescriptor(id='point-zone:pause-point-clean', name='pause-point-clean', type=None, unit=None, status_attribute=None, inputs=[EnumDescriptor(id='point-zone:pause-type', name='', type=<class 'int'>, unit=None, status_attribute='point_zone_pause_type', access=<AccessFlags.0: 0>, constraint=<PropertyConstraint.Choice: 3>)], access=<AccessFlags.Execute: 4>)
DEBUG:miio.integrations.genericmiot.genericmiot:        ActionDescriptor(id='point-zone:start-zone-clean', name='start-zone-clean', type=None, unit=None, status_attribute=None, inputs=[], access=<AccessFlags.Execute: 4>)
DEBUG:miio.integrations.genericmiot.genericmiot:        ActionDescriptor(id='point-zone:pause-zone-clean', name='pause-zone-clean', type=None, unit=None, status_attribute=None, inputs=[EnumDescriptor(id='point-zone:pause-type', name='', type=<class 'int'>, unit=None, status_attribute='point_zone_pause_type', access=<AccessFlags.0: 0>, constraint=<PropertyConstraint.Choice: 3>)], access=<AccessFlags.Execute: 4>)
DEBUG:miio.integrations.genericmiot.genericmiot:        ActionDescriptor(id='point-zone:set-beauty-wall', name='set-beauty-wall', type=None, unit=None, status_attribute=None, inputs=[PropertyDescriptor(id='point-zone:beauty-point', name='', type=<class 'str'>, unit=None, status_attribute='point_zone_beauty_point', access=<AccessFlags.0: 0>, constraint=<PropertyConstraint.Unset: 1>)], access=<AccessFlags.Execute: 4>)
DEBUG:miio.integrations.genericmiot.genericmiot:        ActionDescriptor(id='point-zone:set-virtual-wall', name='set-virtual-wall', type=None, unit=None, status_attribute=None, inputs=[PropertyDescriptor(id='point-zone:restrict-points', name='', type=<class 'str'>, unit=None, status_attribute='point_zone_restrict_points', access=<AccessFlags.Write: 2>, constraint=<PropertyConstraint.Unset: 1>)], access=<AccessFlags.Execute: 4>)
DEBUG:miio.integrations.genericmiot.genericmiot:        ActionDescriptor(id='point-zone:set-zone-point', name='set-zone-point', type=None, unit=None, status_attribute=None, inputs=[PropertyDescriptor(id='point-zone:zone-points', name='', type=<class 'str'>, unit=None, status_attribute='point_zone_zone_points', access=<AccessFlags.Write: 2>, constraint=<PropertyConstraint.Unset: 1>)], access=<AccessFlags.Execute: 4>)
DEBUG:miio.integrations.genericmiot.genericmiot:        ActionDescriptor(id='point-zone:start-point-clean-ii', name='start-point-clean-ii', type=None, unit=None, status_attribute=None, inputs=[PropertyDescriptor(id='point-zone:target-point', name='', type=<class 'str'>, unit=None, status_attribute='point_zone_target_point', access=<AccessFlags.Write|Read: 3>, constraint=<PropertyConstraint.Unset: 1>)], access=<AccessFlags.Execute: 4>)
DEBUG:miio.integrations.genericmiot.genericmiot:        ActionDescriptor(id='map:get-map-list', name='get-map-list', type=None, unit=None, status_attribute=None, inputs=[], access=<AccessFlags.Execute: 4>)
DEBUG:miio.integrations.genericmiot.genericmiot:        ActionDescriptor(id='map:upload-by-mapid', name='upload-by-mapid', type=None, unit=None, status_attribute=None, inputs=[RangeDescriptor(id='map:upload-id', name='', unit=None, status_attribute='map_upload_id', access=<AccessFlags.0: 0>, min_value=0, max_value=4294967295, step=1, range_attribute=None, type=<class 'int'>, constraint=<PropertyConstraint.Range: 2>)], access=<AccessFlags.Execute: 4>)
DEBUG:miio.integrations.genericmiot.genericmiot:        ActionDescriptor(id='map:set-cur-map', name='set-cur-map', type=None, unit=None, status_attribute=None, inputs=[RangeDescriptor(id='map:upload-id', name='', unit=None, status_attribute='map_upload_id', access=<AccessFlags.0: 0>, min_value=0, max_value=4294967295, step=1, range_attribute=None, type=<class 'int'>, constraint=<PropertyConstraint.Range: 2>)], access=<AccessFlags.Execute: 4>)
DEBUG:miio.integrations.genericmiot.genericmiot:        ActionDescriptor(id='map:del-map', name='del-map', type=None, unit=None, status_attribute=None, inputs=[RangeDescriptor(id='map:upload-id', name='', unit=None, status_attribute='map_upload_id', access=<AccessFlags.0: 0>, min_value=0, max_value=4294967295, step=1, range_attribute=None, type=<class 'int'>, constraint=<PropertyConstraint.Range: 2>)], access=<AccessFlags.Execute: 4>)
DEBUG:miio.integrations.genericmiot.genericmiot:        ActionDescriptor(id='map:rename-map', name='rename-map', type=None, unit=None, status_attribute=None, inputs=[RangeDescriptor(id='map:upload-id', name='', unit=None, status_attribute='map_upload_id', access=<AccessFlags.0: 0>, min_value=0, max_value=4294967295, step=1, range_attribute=None, type=<class 'int'>, constraint=<PropertyConstraint.Range: 2>), PropertyDescriptor(id='map:map-name', name='', type=<class 'str'>, unit=None, status_attribute='map_map_name', access=<AccessFlags.0: 0>, constraint=<PropertyConstraint.Unset: 1>)], access=<AccessFlags.Execute: 4>)
DEBUG:miio.integrations.genericmiot.genericmiot:        ActionDescriptor(id='map:upload-by-maptype', name='upload-by-maptype', type=None, unit=None, status_attribute=None, inputs=[EnumDescriptor(id='map:upload-type', name='', type=<class 'int'>, unit=None, status_attribute='map_upload_type', access=<AccessFlags.0: 0>, constraint=<PropertyConstraint.Choice: 3>)], access=<AccessFlags.Execute: 4>)
DEBUG:miio.integrations.genericmiot.genericmiot:        ActionDescriptor(id='map:rename-room', name='rename-room', type=None, unit=None, status_attribute=None, inputs=[RangeDescriptor(id='map:upload-id', name='', unit=None, status_attribute='map_upload_id', access=<AccessFlags.0: 0>, min_value=0, max_value=4294967295, step=1, range_attribute=None, type=<class 'int'>, constraint=<PropertyConstraint.Range: 2>), RangeDescriptor(id='map:room-id', name='', unit=None, status_attribute='map_room_id', access=<AccessFlags.0: 0>, min_value=0, max_value=255, step=1, range_attribute=None, type=<class 'int'>, constraint=<PropertyConstraint.Range: 2>), PropertyDescriptor(id='map:room-name', name='', type=<class 'str'>, unit=None, status_attribute='map_room_name', access=<AccessFlags.0: 0>, constraint=<PropertyConstraint.Unset: 1>)], access=<AccessFlags.Execute: 4>)
DEBUG:miio.integrations.genericmiot.genericmiot:        ActionDescriptor(id='map:arrange-room', name='arrange-room', type=None, unit=None, status_attribute=None, inputs=[RangeDescriptor(id='map:upload-id', name='', unit=None, status_attribute='map_upload_id', access=<AccessFlags.0: 0>, min_value=0, max_value=4294967295, step=1, range_attribute=None, type=<class 'int'>, constraint=<PropertyConstraint.Range: 2>), PropertyDescriptor(id='map:arrange-room-ids', name='', type=<class 'str'>, unit=None, status_attribute='map_arrange_room_ids', access=<AccessFlags.0: 0>, constraint=<PropertyConstraint.Unset: 1>), PropertyDescriptor(id='map:lang', name='', type=<class 'str'>, unit=None, status_attribute='map_lang', access=<AccessFlags.0: 0>, constraint=<PropertyConstraint.Unset: 1>)], access=<AccessFlags.Execute: 4>)
DEBUG:miio.integrations.genericmiot.genericmiot:        ActionDescriptor(id='map:split-room', name='split-room', type=None, unit=None, status_attribute=None, inputs=[RangeDescriptor(id='map:upload-id', name='', unit=None, status_attribute='map_upload_id', access=<AccessFlags.0: 0>, min_value=0, max_value=4294967295, step=1, range_attribute=None, type=<class 'int'>, constraint=<PropertyConstraint.Range: 2>), RangeDescriptor(id='map:room-id', name='', unit=None, status_attribute='map_room_id', access=<AccessFlags.0: 0>, min_value=0, max_value=255, step=1, range_attribute=None, type=<class 'int'>, constraint=<PropertyConstraint.Range: 2>), PropertyDescriptor(id='map:split-points', name='', type=<class 'str'>, unit=None, status_attribute='map_split_points', access=<AccessFlags.0: 0>, constraint=<PropertyConstraint.Unset: 1>), PropertyDescriptor(id='map:lang', name='', type=<class 'str'>, unit=None, status_attribute='map_lang', access=<AccessFlags.0: 0>, constraint=<PropertyConstraint.Unset: 1>)], access=<AccessFlags.Execute: 4>)
DEBUG:miio.integrations.genericmiot.genericmiot:        ActionDescriptor(id='map:reset-map', name='reset-map', type=None, unit=None, status_attribute=None, inputs=[], access=<AccessFlags.Execute: 4>)
DEBUG:miio.integrations.genericmiot.genericmiot:        ActionDescriptor(id='map:build-new-map', name='build-new-map', type=None, unit=None, status_attribute=None, inputs=[EnumDescriptor(id='map:build-map', name='', type=<class 'int'>, unit=None, status_attribute='map_build_map', access=<AccessFlags.Read: 1>, constraint=<PropertyConstraint.Choice: 3>)], access=<AccessFlags.Execute: 4>)
DEBUG:miio.integrations.genericmiot.genericmiot:        ActionDescriptor(id='map:get-cur-path', name='get-cur-path', type=None, unit=None, status_attribute=None, inputs=[RangeDescriptor(id='map:start-cleaning-point', name='', unit=None, status_attribute='map_start_cleaning_point', access=<AccessFlags.0: 0>, min_value=0, max_value=4294967295, step=1, range_attribute=None, type=<class 'int'>, constraint=<PropertyConstraint.Range: 2>), RangeDescriptor(id='map:end-cleaning-point', name='', unit=None, status_attribute='map_end_cleaning_point', access=<AccessFlags.0: 0>, min_value=0, max_value=4294967295, step=1, range_attribute=None, type=<class 'int'>, constraint=<PropertyConstraint.Range: 2>)], access=<AccessFlags.Execute: 4>)
DEBUG:miio.integrations.genericmiot.genericmiot:        ActionDescriptor(id='map:get-map-room-list', name='get-map-room-list', type=None, unit=None, status_attribute=None, inputs=[RangeDescriptor(id='map:cur-map-id', name='', unit=None, status_attribute='map_cur_map_id', access=<AccessFlags.Read: 1>, min_value=0, max_value=4294967295, step=1, range_attribute=None, type=<class 'int'>, constraint=<PropertyConstraint.Range: 2>)], access=<AccessFlags.Execute: 4>)
DEBUG:miio.integrations.genericmiot.genericmiot:        ActionDescriptor(id='map:upload-by-mapid-ii', name='upload-by-mapid-ii', type=None, unit=None, status_attribute=None, inputs=[RangeDescriptor(id='map:upload-id', name='', unit=None, status_attribute='map_upload_id', access=<AccessFlags.0: 0>, min_value=0, max_value=4294967295, step=1, range_attribute=None, type=<class 'int'>, constraint=<PropertyConstraint.Range: 2>)], access=<AccessFlags.Execute: 4>)
DEBUG:miio.integrations.genericmiot.genericmiot:        ActionDescriptor(id='map:upload-by-maptype-ii', name='upload-by-maptype-ii', type=None, unit=None, status_attribute=None, inputs=[EnumDescriptor(id='map:upload-type', name='', type=<class 'int'>, unit=None, status_attribute='map_upload_type', access=<AccessFlags.0: 0>, constraint=<PropertyConstraint.Choice: 3>)], access=<AccessFlags.Execute: 4>)
DEBUG:miio.integrations.genericmiot.genericmiot:        ActionDescriptor(id='map:reset-map-ii', name='reset-map-ii', type=None, unit=None, status_attribute=None, inputs=[], access=<AccessFlags.Execute: 4>)
DEBUG:miio.integrations.genericmiot.genericmiot:        ActionDescriptor(id='map:build-map-ii', name='build-map-ii', type=None, unit=None, status_attribute=None, inputs=[EnumDescriptor(id='map:build-map', name='', type=<class 'int'>, unit=None, status_attribute='map_build_map', access=<AccessFlags.Read: 1>, constraint=<PropertyConstraint.Choice: 3>)], access=<AccessFlags.Execute: 4>)
DEBUG:miio.integrations.genericmiot.genericmiot:        ActionDescriptor(id='map:set-mijia-room-list', name='set-mijia-room-list', type=None, unit=None, status_attribute=None, inputs=[RangeDescriptor(id='map:upload-id', name='', unit=None, status_attribute='map_upload_id', access=<AccessFlags.0: 0>, min_value=0, max_value=4294967295, step=1, range_attribute=None, type=<class 'int'>, constraint=<PropertyConstraint.Range: 2>), PropertyDescriptor(id='map:mijia-room-list', name='', type=<class 'str'>, unit=None, status_attribute='map_mijia_room_list', access=<AccessFlags.0: 0>, constraint=<PropertyConstraint.Unset: 1>)], access=<AccessFlags.Execute: 4>)
DEBUG:miio.integrations.genericmiot.genericmiot:        ActionDescriptor(id='disturb:set-notdisturb', name='set-notdisturb', type=None, unit=None, status_attribute=None, inputs=[EnumDescriptor(id='disturb:dnd-enable', name='', type=<class 'int'>, unit=None, status_attribute='disturb_dnd_enable', access=<AccessFlags.Read: 1>, constraint=<PropertyConstraint.Choice: 3>), RangeDescriptor(id='disturb:dnd-start-hour', name='', unit=None, status_attribute='disturb_dnd_start_hour', access=<AccessFlags.Read: 1>, min_value=0, max_value=23, step=1, range_attribute=None, type=<class 'int'>, constraint=<PropertyConstraint.Range: 2>), RangeDescriptor(id='disturb:dnd-start-minute', name='', unit=None, status_attribute='disturb_dnd_start_minute', access=<AccessFlags.Read: 1>, min_value=0, max_value=59, step=1, range_attribute=None, type=<class 'int'>, constraint=<PropertyConstraint.Range: 2>), RangeDescriptor(id='disturb:dnd-end-hour', name='', unit=None, status_attribute='disturb_dnd_end_hour', access=<AccessFlags.Read: 1>, min_value=0, max_value=23, step=1, range_attribute=None, type=<class 'int'>, constraint=<PropertyConstraint.Range: 2>), RangeDescriptor(id='disturb:dnd-end-minute', name='', unit=None, status_attribute='disturb_dnd_end_minute', access=<AccessFlags.Read: 1>, min_value=0, max_value=59, step=1, range_attribute=None, type=<class 'int'>, constraint=<PropertyConstraint.Range: 2>), RangeDescriptor(id='disturb:dnd-timezone', name='', unit=None, status_attribute='disturb_dnd_timezone', access=<AccessFlags.0: 0>, min_value=-99999, max_value=99999, step=1, range_attribute=None, type=<class 'int'>, constraint=<PropertyConstraint.Range: 2>)], access=<AccessFlags.Execute: 4>)
DEBUG:miio.integrations.genericmiot.genericmiot:        ActionDescriptor(id='language:download-voice', name='download-voice', type=None, unit=None, status_attribute=None, inputs=[PropertyDescriptor(id='language:target-voice', name='', type=<class 'str'>, unit=None, status_attribute='language_target_voice', access=<AccessFlags.0: 0>, constraint=<PropertyConstraint.Unset: 1>), PropertyDescriptor(id='language:voice-url', name='', type=<class 'str'>, unit=None, status_attribute='language_voice_url', access=<AccessFlags.0: 0>, constraint=<PropertyConstraint.Unset: 1>), PropertyDescriptor(id='language:voice-mdfive', name='', type=<class 'str'>, unit=None, status_attribute='language_voice_mdfive', access=<AccessFlags.0: 0>, constraint=<PropertyConstraint.Unset: 1>)], access=<AccessFlags.Execute: 4>)
DEBUG:miio.integrations.genericmiot.genericmiot:        ActionDescriptor(id='language:get-download-status', name='get-download-status', type=None, unit=None, status_attribute=None, inputs=[], access=<AccessFlags.Execute: 4>)
DEBUG:miio.integrations.genericmiot.genericmiot:Created 67 properties
DEBUG:miio.integrations.genericmiot.genericmiot:        EnumDescriptor(id='vacuum:status', name='Status', type=<class 'int'>, unit=None, status_attribute='vacuum_status', access=<AccessFlags.Read: 1>, constraint=<PropertyConstraint.Choice: 3>)
DEBUG:miio.integrations.genericmiot.genericmiot:        RangeDescriptor(id='vacuum:fault', name='Device Fault', unit=None, status_attribute='vacuum_fault', access=<AccessFlags.Read: 1>, min_value=0, max_value=3000, step=1, range_attribute=None, type=<class 'int'>, constraint=<PropertyConstraint.Range: 2>)
DEBUG:miio.integrations.genericmiot.genericmiot:        EnumDescriptor(id='vacuum:mode', name='Mode', type=<class 'int'>, unit=None, status_attribute='vacuum_mode', access=<AccessFlags.Write|Read: 3>, constraint=<PropertyConstraint.Choice: 3>)
DEBUG:miio.integrations.genericmiot.genericmiot:        EnumDescriptor(id='vacuum:sweep-type', name='Sweep Type', type=<class 'int'>, unit=None, status_attribute='vacuum_sweep_type', access=<AccessFlags.Write|Read: 3>, constraint=<PropertyConstraint.Choice: 3>)
DEBUG:miio.integrations.genericmiot.genericmiot:        PropertyDescriptor(id='vacuum:restricted-walls', name='Restricted Walls', type=<class 'str'>, unit=None, status_attribute='vacuum_restricted_walls', access=<AccessFlags.Write|Read: 3>, constraint=<PropertyConstraint.Unset: 1>)
DEBUG:miio.integrations.genericmiot.genericmiot:        RangeDescriptor(id='battery:battery-level', name='Battery Level', unit='percentage', status_attribute='battery_battery_level', access=<AccessFlags.Read: 1>, min_value=0, max_value=100, step=1, range_attribute=None, type=<class 'int'>, constraint=<PropertyConstraint.Range: 2>)
DEBUG:miio.integrations.genericmiot.genericmiot:        PropertyDescriptor(id='alarm:alarm', name='Alarm', type=<class 'bool'>, unit=None, status_attribute='alarm_alarm', access=<AccessFlags.Write|Read: 3>, constraint=<PropertyConstraint.Unset: 1>)
DEBUG:miio.integrations.genericmiot.genericmiot:        RangeDescriptor(id='alarm:volume', name='Volume', unit='percentage', status_attribute='alarm_volume', access=<AccessFlags.Write|Read: 3>, min_value=0, max_value=10, step=1, range_attribute=None, type=<class 'int'>, constraint=<PropertyConstraint.Range: 2>)
DEBUG:miio.integrations.genericmiot.genericmiot:        EnumDescriptor(id='sweep:repeat-state', name='', type=<class 'int'>, unit=None, status_attribute='sweep_repeat_state', access=<AccessFlags.Write|Read: 3>, constraint=<PropertyConstraint.Choice: 3>)
DEBUG:miio.integrations.genericmiot.genericmiot:        EnumDescriptor(id='sweep:door-state', name='', type=<class 'int'>, unit=None, status_attribute='sweep_door_state', access=<AccessFlags.Read: 1>, constraint=<PropertyConstraint.Choice: 3>)
DEBUG:miio.integrations.genericmiot.genericmiot:        EnumDescriptor(id='sweep:cloth-state', name='', type=<class 'int'>, unit=None, status_attribute='sweep_cloth_state', access=<AccessFlags.Read: 1>, constraint=<PropertyConstraint.Choice: 3>)
DEBUG:miio.integrations.genericmiot.genericmiot:        EnumDescriptor(id='sweep:suction-state', name='', type=<class 'int'>, unit=None, status_attribute='sweep_suction_state', access=<AccessFlags.Write|Read: 3>, constraint=<PropertyConstraint.Choice: 3>)
DEBUG:miio.integrations.genericmiot.genericmiot:        EnumDescriptor(id='sweep:water-state', name='', type=<class 'int'>, unit=None, status_attribute='sweep_water_state', access=<AccessFlags.Write|Read: 3>, constraint=<PropertyConstraint.Choice: 3>)
DEBUG:miio.integrations.genericmiot.genericmiot:        EnumDescriptor(id='sweep:mop-route', name='', type=<class 'int'>, unit=None, status_attribute='sweep_mop_route', access=<AccessFlags.Write|Read: 3>, constraint=<PropertyConstraint.Choice: 3>)
DEBUG:miio.integrations.genericmiot.genericmiot:        RangeDescriptor(id='sweep:side-brush-life', name='', unit='percentage', status_attribute='sweep_side_brush_life', access=<AccessFlags.Read: 1>, min_value=0, max_value=100, step=1, range_attribute=None, type=<class 'int'>, constraint=<PropertyConstraint.Range: 2>)
DEBUG:miio.integrations.genericmiot.genericmiot:        RangeDescriptor(id='sweep:side-brush-hours', name='', unit='hours', status_attribute='sweep_side_brush_hours', access=<AccessFlags.Read: 1>, min_value=0, max_value=180, step=1, range_attribute=None, type=<class 'int'>, constraint=<PropertyConstraint.Range: 2>)
DEBUG:miio.integrations.genericmiot.genericmiot:        RangeDescriptor(id='sweep:main-brush-life', name='', unit='percentage', status_attribute='sweep_main_brush_life', access=<AccessFlags.Read: 1>, min_value=0, max_value=100, step=1, range_attribute=None, type=<class 'int'>, constraint=<PropertyConstraint.Range: 2>)
DEBUG:miio.integrations.genericmiot.genericmiot:        RangeDescriptor(id='sweep:main-brush-hours', name='', unit='hours', status_attribute='sweep_main_brush_hours', access=<AccessFlags.Read: 1>, min_value=0, max_value=360, step=1, range_attribute=None, type=<class 'int'>, constraint=<PropertyConstraint.Range: 2>)
DEBUG:miio.integrations.genericmiot.genericmiot:        RangeDescriptor(id='sweep:hypa-life', name='', unit='percentage', status_attribute='sweep_hypa_life', access=<AccessFlags.Read: 1>, min_value=0, max_value=100, step=1, range_attribute=None, type=<class 'int'>, constraint=<PropertyConstraint.Range: 2>)
DEBUG:miio.integrations.genericmiot.genericmiot:        RangeDescriptor(id='sweep:hypa-hours', name='', unit='hours', status_attribute='sweep_hypa_hours', access=<AccessFlags.Read: 1>, min_value=0, max_value=180, step=1, range_attribute=None, type=<class 'int'>, constraint=<PropertyConstraint.Range: 2>)
DEBUG:miio.integrations.genericmiot.genericmiot:        RangeDescriptor(id='sweep:mop-life', name='', unit='percentage', status_attribute='sweep_mop_life', access=<AccessFlags.Read: 1>, min_value=0, max_value=100, step=1, range_attribute=None, type=<class 'int'>, constraint=<PropertyConstraint.Range: 2>)
DEBUG:miio.integrations.genericmiot.genericmiot:        RangeDescriptor(id='sweep:mop-hours', name='', unit='hours', status_attribute='sweep_mop_hours', access=<AccessFlags.Read: 1>, min_value=0, max_value=180, step=1, range_attribute=None, type=<class 'int'>, constraint=<PropertyConstraint.Range: 2>)
DEBUG:miio.integrations.genericmiot.genericmiot:        EnumDescriptor(id='sweep:direction', name='', type=<class 'int'>, unit=None, status_attribute='sweep_direction', access=<AccessFlags.Write: 2>, constraint=<PropertyConstraint.Choice: 3>)
DEBUG:miio.integrations.genericmiot.genericmiot:        RangeDescriptor(id='sweep:time-zone', name='', unit=None, status_attribute='sweep_time_zone', access=<AccessFlags.Write|Read: 3>, min_value=-99999, max_value=99999, step=1, range_attribute=None, type=<class 'int'>, constraint=<PropertyConstraint.Range: 2>)
DEBUG:miio.integrations.genericmiot.genericmiot:        PropertyDescriptor(id='sweep:cur-lang', name='', type=<class 'str'>, unit=None, status_attribute='sweep_cur_lang', access=<AccessFlags.Write|Read: 3>, constraint=<PropertyConstraint.Unset: 1>)
DEBUG:miio.integrations.genericmiot.genericmiot:        RangeDescriptor(id='sweep:cleaning-time', name='', unit=None, status_attribute='sweep_cleaning_time', access=<AccessFlags.Read: 1>, min_value=0, max_value=360, step=1, range_attribute=None, type=<class 'int'>, constraint=<PropertyConstraint.Range: 2>)
DEBUG:miio.integrations.genericmiot.genericmiot:        RangeDescriptor(id='sweep:cleaning-area', name='', unit=None, status_attribute='sweep_cleaning_area', access=<AccessFlags.Read: 1>, min_value=0, max_value=1200, step=1, range_attribute=None, type=<class 'int'>, constraint=<PropertyConstraint.Range: 2>)
DEBUG:miio.integrations.genericmiot.genericmiot:        EnumDescriptor(id='sweep:dirt-recognize', name='', type=<class 'int'>, unit=None, status_attribute='sweep_dirt_recognize', access=<AccessFlags.Write|Read: 3>, constraint=<PropertyConstraint.Choice: 3>)
DEBUG:miio.integrations.genericmiot.genericmiot:        EnumDescriptor(id='sweep:pet-recognize', name='', type=<class 'int'>, unit=None, status_attribute='sweep_pet_recognize', access=<AccessFlags.Write|Read: 3>, constraint=<PropertyConstraint.Choice: 3>)
DEBUG:miio.integrations.genericmiot.genericmiot:        EnumDescriptor(id='sweep:ai-recognize', name='', type=<class 'int'>, unit=None, status_attribute='sweep_ai_recognize', access=<AccessFlags.Write|Read: 3>, constraint=<PropertyConstraint.Choice: 3>)
DEBUG:miio.integrations.genericmiot.genericmiot:        EnumDescriptor(id='sweep:carpet-booster', name='', type=<class 'int'>, unit=None, status_attribute='sweep_carpet_booster', access=<AccessFlags.Write|Read: 3>, constraint=<PropertyConstraint.Choice: 3>)
DEBUG:miio.integrations.genericmiot.genericmiot:        PropertyDescriptor(id='sweep:multi-prop-vacuum', name='', type=<class 'str'>, unit=None, status_attribute='sweep_multi_prop_vacuum', access=<AccessFlags.Read: 1>, constraint=<PropertyConstraint.Unset: 1>)
DEBUG:miio.integrations.genericmiot.genericmiot:        EnumDescriptor(id='sweep:carpet-avoid', name='', type=<class 'int'>, unit=None, status_attribute='sweep_carpet_avoid', access=<AccessFlags.Write: 2>, constraint=<PropertyConstraint.Choice: 3>)
DEBUG:miio.integrations.genericmiot.genericmiot:        EnumDescriptor(id='sweep:tank-shake', name='', type=<class 'int'>, unit=None, status_attribute='sweep_tank_shake', access=<AccessFlags.Write|Read: 3>, constraint=<PropertyConstraint.Choice: 3>)
DEBUG:miio.integrations.genericmiot.genericmiot:        EnumDescriptor(id='sweep:shake-shift', name='', type=<class 'int'>, unit=None, status_attribute='sweep_shake_shift', access=<AccessFlags.Write|Read: 3>, constraint=<PropertyConstraint.Choice: 3>)
DEBUG:miio.integrations.genericmiot.genericmiot:        EnumDescriptor(id='sweep:map-encrypt', name='', type=<class 'int'>, unit=None, status_attribute='sweep_map_encrypt', access=<AccessFlags.Read: 1>, constraint=<PropertyConstraint.Choice: 3>)
DEBUG:miio.integrations.genericmiot.genericmiot:        RangeDescriptor(id='order:order-id', name='', unit=None, status_attribute='order_order_id', access=<AccessFlags.Write: 2>, min_value=0, max_value=7258089600000, step=1, range_attribute=None, type=<class 'int'>, constraint=<PropertyConstraint.Range: 2>)
DEBUG:miio.integrations.genericmiot.genericmiot:        EnumDescriptor(id='order:enable', name='', type=<class 'int'>, unit=None, status_attribute='order_enable', access=<AccessFlags.Write: 2>, constraint=<PropertyConstraint.Choice: 3>)
DEBUG:miio.integrations.genericmiot.genericmiot:        RangeDescriptor(id='order:day', name='', unit=None, status_attribute='order_day', access=<AccessFlags.Write: 2>, min_value=0, max_value=255, step=1, range_attribute=None, type=<class 'int'>, constraint=<PropertyConstraint.Range: 2>)
DEBUG:miio.integrations.genericmiot.genericmiot:        RangeDescriptor(id='order:hour', name='', unit=None, status_attribute='order_hour', access=<AccessFlags.Write: 2>, min_value=0, max_value=23, step=1, range_attribute=None, type=<class 'int'>, constraint=<PropertyConstraint.Range: 2>)
DEBUG:miio.integrations.genericmiot.genericmiot:        RangeDescriptor(id='order:minute', name='', unit=None, status_attribute='order_minute', access=<AccessFlags.Write: 2>, min_value=0, max_value=59, step=1, range_attribute=None, type=<class 'int'>, constraint=<PropertyConstraint.Range: 2>)
DEBUG:miio.integrations.genericmiot.genericmiot:        EnumDescriptor(id='order:repeat', name='', type=<class 'int'>, unit=None, status_attribute='order_repeat', access=<AccessFlags.Write: 2>, constraint=<PropertyConstraint.Choice: 3>)
DEBUG:miio.integrations.genericmiot.genericmiot:        EnumDescriptor(id='order:clean-way', name='', type=<class 'int'>, unit=None, status_attribute='order_clean_way', access=<AccessFlags.Write: 2>, constraint=<PropertyConstraint.Choice: 3>)
DEBUG:miio.integrations.genericmiot.genericmiot:        EnumDescriptor(id='order:suction', name='', type=<class 'int'>, unit=None, status_attribute='order_suction', access=<AccessFlags.Write: 2>, constraint=<PropertyConstraint.Choice: 3>)
DEBUG:miio.integrations.genericmiot.genericmiot:        EnumDescriptor(id='order:water', name='', type=<class 'int'>, unit=None, status_attribute='order_water', access=<AccessFlags.Write: 2>, constraint=<PropertyConstraint.Choice: 3>)
DEBUG:miio.integrations.genericmiot.genericmiot:        EnumDescriptor(id='order:twice-clean', name='', type=<class 'int'>, unit=None, status_attribute='order_twice_clean', access=<AccessFlags.Write: 2>, constraint=<PropertyConstraint.Choice: 3>)
DEBUG:miio.integrations.genericmiot.genericmiot:        RangeDescriptor(id='order:mapid', name='', unit=None, status_attribute='order_mapid', access=<AccessFlags.Write: 2>, min_value=0, max_value=4294967295, step=1, range_attribute=None, type=<class 'int'>, constraint=<PropertyConstraint.Range: 2>)
DEBUG:miio.integrations.genericmiot.genericmiot:        RangeDescriptor(id='order:room-count', name='', unit=None, status_attribute='order_room_count', access=<AccessFlags.Write: 2>, min_value=0, max_value=64, step=1, range_attribute=None, type=<class 'int'>, constraint=<PropertyConstraint.Range: 2>)
DEBUG:miio.integrations.genericmiot.genericmiot:        PropertyDescriptor(id='order:room-data', name='', type=<class 'str'>, unit=None, status_attribute='order_room_data', access=<AccessFlags.Write: 2>, constraint=<PropertyConstraint.Unset: 1>)
DEBUG:miio.integrations.genericmiot.genericmiot:        RangeDescriptor(id='order:time-zone', name='time-zone', unit=None, status_attribute='order_time_zone', access=<AccessFlags.Write: 2>, min_value=-99999, max_value=99999, step=1, range_attribute=None, type=<class 'int'>, constraint=<PropertyConstraint.Range: 2>)
DEBUG:miio.integrations.genericmiot.genericmiot:        PropertyDescriptor(id='order:all-enable-count', name='', type=<class 'str'>, unit=None, status_attribute='order_all_enable_count', access=<AccessFlags.Read: 1>, constraint=<PropertyConstraint.Unset: 1>)
DEBUG:miio.integrations.genericmiot.genericmiot:        PropertyDescriptor(id='point-zone:zone-points', name='', type=<class 'str'>, unit=None, status_attribute='point_zone_zone_points', access=<AccessFlags.Write: 2>, constraint=<PropertyConstraint.Unset: 1>)
DEBUG:miio.integrations.genericmiot.genericmiot:        PropertyDescriptor(id='point-zone:restrict-points', name='', type=<class 'str'>, unit=None, status_attribute='point_zone_restrict_points', access=<AccessFlags.Write: 2>, constraint=<PropertyConstraint.Unset: 1>)
DEBUG:miio.integrations.genericmiot.genericmiot:        PropertyDescriptor(id='point-zone:target-point', name='', type=<class 'str'>, unit=None, status_attribute='point_zone_target_point', access=<AccessFlags.Write|Read: 3>, constraint=<PropertyConstraint.Unset: 1>)
DEBUG:miio.integrations.genericmiot.genericmiot:        EnumDescriptor(id='map:remember-state', name='', type=<class 'int'>, unit=None, status_attribute='map_remember_state', access=<AccessFlags.Write|Read: 3>, constraint=<PropertyConstraint.Choice: 3>)
DEBUG:miio.integrations.genericmiot.genericmiot:        RangeDescriptor(id='map:cur-map-id', name='', unit=None, status_attribute='map_cur_map_id', access=<AccessFlags.Read: 1>, min_value=0, max_value=4294967295, step=1, range_attribute=None, type=<class 'int'>, constraint=<PropertyConstraint.Range: 2>)
DEBUG:miio.integrations.genericmiot.genericmiot:        RangeDescriptor(id='map:map-num', name='', unit=None, status_attribute='map_map_num', access=<AccessFlags.Read: 1>, min_value=0, max_value=5, step=1, range_attribute=None, type=<class 'int'>, constraint=<PropertyConstraint.Range: 2>)
DEBUG:miio.integrations.genericmiot.genericmiot:        PropertyDescriptor(id='map:cur-cleaning-path', name='', type=<class 'str'>, unit=None, status_attribute='map_cur_cleaning_path', access=<AccessFlags.Read: 1>, constraint=<PropertyConstraint.Unset: 1>)
DEBUG:miio.integrations.genericmiot.genericmiot:        EnumDescriptor(id='map:build-map', name='', type=<class 'int'>, unit=None, status_attribute='map_build_map', access=<AccessFlags.Read: 1>, constraint=<PropertyConstraint.Choice: 3>)
DEBUG:miio.integrations.genericmiot.genericmiot:        EnumDescriptor(id='map:has-new-map', name='', type=<class 'int'>, unit=None, status_attribute='map_has_new_map', access=<AccessFlags.Read: 1>, constraint=<PropertyConstraint.Choice: 3>)
DEBUG:miio.integrations.genericmiot.genericmiot:        EnumDescriptor(id='map:map-uploads', name='', type=<class 'int'>, unit=None, status_attribute='map_map_uploads', access=<AccessFlags.Write: 2>, constraint=<PropertyConstraint.Choice: 3>)
DEBUG:miio.integrations.genericmiot.genericmiot:        EnumDescriptor(id='disturb:dnd-enable', name='', type=<class 'int'>, unit=None, status_attribute='disturb_dnd_enable', access=<AccessFlags.Read: 1>, constraint=<PropertyConstraint.Choice: 3>)
DEBUG:miio.integrations.genericmiot.genericmiot:        RangeDescriptor(id='disturb:dnd-start-hour', name='', unit=None, status_attribute='disturb_dnd_start_hour', access=<AccessFlags.Read: 1>, min_value=0, max_value=23, step=1, range_attribute=None, type=<class 'int'>, constraint=<PropertyConstraint.Range: 2>)
DEBUG:miio.integrations.genericmiot.genericmiot:        RangeDescriptor(id='disturb:dnd-start-minute', name='', unit=None, status_attribute='disturb_dnd_start_minute', access=<AccessFlags.Read: 1>, min_value=0, max_value=59, step=1, range_attribute=None, type=<class 'int'>, constraint=<PropertyConstraint.Range: 2>)
DEBUG:miio.integrations.genericmiot.genericmiot:        RangeDescriptor(id='disturb:dnd-end-hour', name='', unit=None, status_attribute='disturb_dnd_end_hour', access=<AccessFlags.Read: 1>, min_value=0, max_value=23, step=1, range_attribute=None, type=<class 'int'>, constraint=<PropertyConstraint.Range: 2>)
DEBUG:miio.integrations.genericmiot.genericmiot:        RangeDescriptor(id='disturb:dnd-end-minute', name='', unit=None, status_attribute='disturb_dnd_end_minute', access=<AccessFlags.Read: 1>, min_value=0, max_value=59, step=1, range_attribute=None, type=<class 'int'>, constraint=<PropertyConstraint.Range: 2>)
DEBUG:miio.integrations.genericmiot.genericmiot:        PropertyDescriptor(id='disturb:multi-prop-dnd', name='', type=<class 'str'>, unit=None, status_attribute='disturb_multi_prop_dnd', access=<AccessFlags.Read: 1>, constraint=<PropertyConstraint.Unset: 1>)
DEBUG:miio.miioprotocol:192.168.1.183:54321 >>: {'id': 2,
 'method': 'get_properties',
 'params': [{'did': 'vacuum:status', 'piid': 1, 'siid': 2},
            {'did': 'vacuum:fault', 'piid': 2, 'siid': 2},
            {'did': 'vacuum:mode', 'piid': 4, 'siid': 2},
            {'did': 'vacuum:sweep-type', 'piid': 8, 'siid': 2},
            {'did': 'vacuum:restricted-walls', 'piid': 9, 'siid': 2},
            {'did': 'battery:battery-level', 'piid': 1, 'siid': 3},
            {'did': 'alarm:alarm', 'piid': 1, 'siid': 4},
            {'did': 'alarm:volume', 'piid': 2, 'siid': 4},
            {'did': 'sweep:repeat-state', 'piid': 1, 'siid': 7},
            {'did': 'sweep:door-state', 'piid': 3, 'siid': 7}]}
DEBUG:miio.miioprotocol:192.168.1.183:54321 (ts: 1970-01-09 17:01:42+00:00, id: 2) << {'error': {'code': -9999, 'message': 'user ack timeout'},
 'exe_time': 4163,
 'id': 2}
DEBUG:miio.miioprotocol:Retrying to send failed command, retries left: 3
DEBUG:miio.miioprotocol:192.168.1.183:54321 >>: {'id': 3,
 'method': 'get_properties',
 'params': [{'did': 'vacuum:status', 'piid': 1, 'siid': 2},
            {'did': 'vacuum:fault', 'piid': 2, 'siid': 2},
            {'did': 'vacuum:mode', 'piid': 4, 'siid': 2},
            {'did': 'vacuum:sweep-type', 'piid': 8, 'siid': 2},
            {'did': 'vacuum:restricted-walls', 'piid': 9, 'siid': 2},
            {'did': 'battery:battery-level', 'piid': 1, 'siid': 3},
            {'did': 'alarm:alarm', 'piid': 1, 'siid': 4},
            {'did': 'alarm:volume', 'piid': 2, 'siid': 4},
            {'did': 'sweep:repeat-state', 'piid': 1, 'siid': 7},
            {'did': 'sweep:door-state', 'piid': 3, 'siid': 7}]}
DEBUG:miio.miioprotocol:192.168.1.183:54321 (ts: 1970-01-09 17:01:46+00:00, id: 3) << {'error': {'code': -9999, 'message': 'user ack timeout'},
 'exe_time': 4164,
 'id': 3}
DEBUG:miio.miioprotocol:Retrying to send failed command, retries left: 2
DEBUG:miio.miioprotocol:192.168.1.183:54321 >>: {'id': 4,
 'method': 'get_properties',
 'params': [{'did': 'vacuum:status', 'piid': 1, 'siid': 2},
            {'did': 'vacuum:fault', 'piid': 2, 'siid': 2},
            {'did': 'vacuum:mode', 'piid': 4, 'siid': 2},
            {'did': 'vacuum:sweep-type', 'piid': 8, 'siid': 2},
            {'did': 'vacuum:restricted-walls', 'piid': 9, 'siid': 2},
            {'did': 'battery:battery-level', 'piid': 1, 'siid': 3},
            {'did': 'alarm:alarm', 'piid': 1, 'siid': 4},
            {'did': 'alarm:volume', 'piid': 2, 'siid': 4},
            {'did': 'sweep:repeat-state', 'piid': 1, 'siid': 7},
            {'did': 'sweep:door-state', 'piid': 3, 'siid': 7}]}
DEBUG:miio.miioprotocol:192.168.1.183:54321 (ts: 1970-01-09 17:01:50+00:00, id: 4) << {'error': {'code': -9999, 'message': 'user ack timeout'},
 'exe_time': 4167,
 'id': 4}
DEBUG:miio.miioprotocol:Retrying to send failed command, retries left: 1
DEBUG:miio.miioprotocol:192.168.1.183:54321 >>: {'id': 5,
 'method': 'get_properties',
 'params': [{'did': 'vacuum:status', 'piid': 1, 'siid': 2},
            {'did': 'vacuum:fault', 'piid': 2, 'siid': 2},
            {'did': 'vacuum:mode', 'piid': 4, 'siid': 2},
            {'did': 'vacuum:sweep-type', 'piid': 8, 'siid': 2},
            {'did': 'vacuum:restricted-walls', 'piid': 9, 'siid': 2},
            {'did': 'battery:battery-level', 'piid': 1, 'siid': 3},
            {'did': 'alarm:alarm', 'piid': 1, 'siid': 4},
            {'did': 'alarm:volume', 'piid': 2, 'siid': 4},
            {'did': 'sweep:repeat-state', 'piid': 1, 'siid': 7},
            {'did': 'sweep:door-state', 'piid': 3, 'siid': 7}]}
DEBUG:miio.miioprotocol:192.168.1.183:54321 (ts: 1970-01-09 17:01:55+00:00, id: 5) << {'error': {'code': -9999, 'message': 'user ack timeout'},
 'exe_time': 4172,
 'id': 5}
ERROR:miio.miioprotocol:Got error when receiving: {'code': -9999, 'message': 'user ack timeout'}
ERROR:miio.click_common:Exception: Unable to recover failed command
Traceback (most recent call last):
  File "/home/fran/.local/lib/python3.10/site-packages/miio/miioprotocol.py", line 215, in send
    self._handle_error(payload["error"])
  File "/home/fran/.local/lib/python3.10/site-packages/miio/miioprotocol.py", line 275, in _handle_error
    raise RecoverableError(error)
miio.exceptions.RecoverableError: {'code': -9999, 'message': 'user ack timeout'}

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/fran/.local/lib/python3.10/site-packages/miio/miioprotocol.py", line 215, in send
    self._handle_error(payload["error"])
  File "/home/fran/.local/lib/python3.10/site-packages/miio/miioprotocol.py", line 275, in _handle_error
    raise RecoverableError(error)
miio.exceptions.RecoverableError: {'code': -9999, 'message': 'user ack timeout'}

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/fran/.local/lib/python3.10/site-packages/miio/miioprotocol.py", line 215, in send
    self._handle_error(payload["error"])
  File "/home/fran/.local/lib/python3.10/site-packages/miio/miioprotocol.py", line 275, in _handle_error
    raise RecoverableError(error)
miio.exceptions.RecoverableError: {'code': -9999, 'message': 'user ack timeout'}

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/fran/.local/lib/python3.10/site-packages/miio/miioprotocol.py", line 215, in send
    self._handle_error(payload["error"])
  File "/home/fran/.local/lib/python3.10/site-packages/miio/miioprotocol.py", line 275, in _handle_error
    raise RecoverableError(error)
miio.exceptions.RecoverableError: {'code': -9999, 'message': 'user ack timeout'}

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/home/fran/.local/lib/python3.10/site-packages/miio/click_common.py", line 54, in __call__
    return self.main(*args, **kwargs)
  File "/usr/lib/python3/dist-packages/click/core.py", line 1053, in main
    rv = self.invoke(ctx)
  File "/usr/lib/python3/dist-packages/click/core.py", line 1659, in invoke
    return _process_result(sub_ctx.command.invoke(sub_ctx))
  File "/usr/lib/python3/dist-packages/click/core.py", line 1659, in invoke
    return _process_result(sub_ctx.command.invoke(sub_ctx))
  File "/usr/lib/python3/dist-packages/click/core.py", line 1395, in invoke
    return ctx.invoke(self.callback, **ctx.params)
  File "/usr/lib/python3/dist-packages/click/core.py", line 754, in invoke
    return __callback(*args, **kwargs)
  File "/home/fran/.local/lib/python3.10/site-packages/miio/click_common.py", line 305, in wrap
    result = kwargs["result"] = func(*args, **kwargs)
  File "/usr/lib/python3/dist-packages/click/decorators.py", line 84, in new_func
    return ctx.invoke(f, obj, *args, **kwargs)
  File "/usr/lib/python3/dist-packages/click/core.py", line 754, in invoke
    return __callback(*args, **kwargs)
  File "/home/fran/.local/lib/python3.10/site-packages/miio/click_common.py", line 270, in command_callback
    return miio_command.call(miio_device, *args, **kwargs)
  File "/home/fran/.local/lib/python3.10/site-packages/miio/click_common.py", line 218, in call
    return method(*args, **kwargs)
  File "/home/fran/.local/lib/python3.10/site-packages/miio/click_common.py", line 185, in _wrap
    return func(self, *args, **kwargs)
  File "/home/fran/.local/lib/python3.10/site-packages/miio/integrations/genericmiot/genericmiot.py", line 83, in status
    response = self.get_properties(
  File "/home/fran/.local/lib/python3.10/site-packages/miio/device.py", line 308, in get_properties
    values.extend(self.send(property_getter, _props[:max_properties]))
  File "/home/fran/.local/lib/python3.10/site-packages/miio/device.py", line 122, in send
    return self._protocol.send(
  File "/home/fran/.local/lib/python3.10/site-packages/miio/miioprotocol.py", line 249, in send
    return self.send(
  File "/home/fran/.local/lib/python3.10/site-packages/miio/miioprotocol.py", line 249, in send
    return self.send(
  File "/home/fran/.local/lib/python3.10/site-packages/miio/miioprotocol.py", line 249, in send
    return self.send(
  File "/home/fran/.local/lib/python3.10/site-packages/miio/miioprotocol.py", line 257, in send
    raise DeviceException("Unable to recover failed command") from ex
miio.exceptions.DeviceException: Unable to recover failed command

@rytilahti

Copy link
Copy Markdown
Owner Author

Thanks for reporting back, I'll merge this now then!

The issue with those 'user ack timeouts' is might be related to #1751. Basically the device might think that it has already answered to the query with a specific 'message id'. As why info query still keeps working, it might be handled differently in the firmware.

To confirm if the issue is with the message ids, you could try a script like this to see if it keeps working:

from miio import DeviceFactory
import time

dev = DeviceFactory.create("127.0.0.1", "0"*32, force_generic_miot=True)
while True:
    print(dev.status())
    time.sleep(1) 

@rytilahti
rytilahti merged commit 76808d8 into master Sep 24, 2023
@rytilahti
rytilahti deleted the genericmiot/fix/skip_missing_values branch September 24, 2023 15:27
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants