TS0301 rollershade

Some of the only remaining Zigbee devices I have are TS0301 roller shades. Just kind of sick of the perpetual chasing clear space in a crowded spectrum for Zigbee when I cannot control my neighbors Wi-Fi…so until I hardwire replacement I have three of these and the Zigbee coordinator is about 4 feet from them, LQI/RSSI is fine. They respond fine.

The issue is that the battery and position are not reported well. As I said, they respond fine, but they report the wrong battery and rarely report back the right position. I am wondering if anyone has any idea how to make a quirk and if it might help. I have tried to follow various how-tos but no luck in improving the situation. I started with trying to get the batter to report right - there is clearly a parameter that is called battery percentage, but no matter what I do ZHA wont grab that variable.

Anyone out there who knows something about this know if this is even worth figuring out? will it improve?

command: scan_device
command_data: null
start_time: "2025-10-22T21:08:09.552645+00:00"
errors: []
params:
  dir: 0
  tries: 1
  expect_reply: true
  args: []
  kwargs: {}
  event_success: scan_device_success
  event_fail: scan_device_fail
  read_before_write: true
  read_after_write: true
scan:
  ieee: 
  nwk: "0xeda3"
  model: TS0301
  manufacturer: _TZE210_h3l0cjqb
  manufacturer_id: "0x4098"
  endpoints:
    - id: 1
      device_type: "0x0202"
      profile: "0x0104"
      in_clusters:
        "0x0000":
          cluster_id: "0x0000"
          title: Basic
          name: basic
          attributes:
            "0x0000":
              attribute_id: "0x0000"
              attribute_name: zcl_version
              value_type:
                - "0x20"
                - uint8_t
                - Analog
              access: READ|REPORT
              access_acl: 5
              attribute_value: 3
            "0x0001":
              attribute_id: "0x0001"
              attribute_name: app_version
              value_type:
                - "0x20"
                - uint8_t
                - Analog
              access: READ|REPORT
              access_acl: 5
              attribute_value: 66
            "0x0002":
              attribute_id: "0x0002"
              attribute_name: stack_version
              value_type:
                - "0x20"
                - uint8_t
                - Analog
              access: READ|REPORT
              access_acl: 5
              attribute_value: 1
            "0x0003":
              attribute_id: "0x0003"
              attribute_name: hw_version
              value_type:
                - "0x20"
                - uint8_t
                - Analog
              access: READ|REPORT
              access_acl: 5
              attribute_value: 1
            "0x0004":
              attribute_id: "0x0004"
              attribute_name: manufacturer
              value_type:
                - "0x42"
                - CharacterString
                - Discrete
              access: READ|REPORT
              access_acl: 5
              attribute_value: _TZE210_h3l0cjqb
            "0x0005":
              attribute_id: "0x0005"
              attribute_name: model
              value_type:
                - "0x42"
                - CharacterString
                - Discrete
              access: READ|REPORT
              access_acl: 5
              attribute_value: TS0301
            "0x0006":
              attribute_id: "0x0006"
              attribute_name: date_code
              value_type:
                - "0x42"
                - CharacterString
                - Discrete
              access: READ|REPORT
              access_acl: 5
              attribute_value: ""
            "0x0007":
              attribute_id: "0x0007"
              attribute_name: power_source
              value_type:
                - "0x30"
                - enum8
                - Discrete
              access: READ|REPORT
              access_acl: 5
              attribute_value: 3
            "0xffde":
              attribute_id: "0xffde"
              attribute_name: "65502"
              value_type:
                - "0x20"
                - uint8_t
                - Analog
              access: READ|WRITE|REPORT
              access_acl: 7
            "0xffe0":
              attribute_id: "0xffe0"
              attribute_name: "65504"
              value_type:
                - "0x48"
                - Array
                - Discrete
              access: READ|REPORT
              access_acl: 5
            "0xffe1":
              attribute_id: "0xffe1"
              attribute_name: "65505"
              value_type:
                - "0x48"
                - Array
                - Discrete
              access: READ|REPORT
              access_acl: 5
            "0xffe2":
              attribute_id: "0xffe2"
              attribute_name: "65506"
              value_type:
                - "0x20"
                - uint8_t
                - Analog
              access: READ|REPORT
              access_acl: 5
            "0xffe3":
              attribute_id: "0xffe3"
              attribute_name: "65507"
              value_type:
                - "0x42"
                - CharacterString
                - Discrete
              access: READ|REPORT
              access_acl: 5
            "0xfffd":
              attribute_id: "0xfffd"
              attribute_name: cluster_revision
              value_type:
                - "0x21"
                - uint16_t
                - Analog
              access: READ|REPORT
              access_acl: 5
            "0xfffe":
              attribute_id: "0xfffe"
              attribute_name: reporting_status
              value_type:
                - "0x30"
                - enum8
                - Discrete
              access: READ|REPORT
              access_acl: 5
          commands_received:
            "0x00":
              command_id: "0x00"
              command_name: reset_fact_default
              command_arguments: <class 'zigpy.zcl.foundation.reset_fact_default'>
          commands_generated: {}
        "0x0001":
          cluster_id: "0x0001"
          title: Power Configuration
          name: power
          attributes:
            "0x0000":
              attribute_id: "0x0000"
              attribute_name: mains_voltage
              value_type:
                - "0x21"
                - uint16_t
                - Analog
              access: READ|REPORT
              access_acl: 5
              attribute_value: 0
            "0x0020":
              attribute_id: "0x0020"
              attribute_name: battery_voltage
              value_type:
                - "0x20"
                - uint8_t
                - Analog
              access: READ|REPORT
              access_acl: 5
              attribute_value: 0
            "0x0021":
              attribute_id: "0x0021"
              attribute_name: battery_percentage_remaining
              value_type:
                - "0x20"
                - uint8_t
                - Analog
              access: READ|REPORT
              access_acl: 5
              attribute_value: 68
            "0xfffd":
              attribute_id: "0xfffd"
              attribute_name: cluster_revision
              value_type:
                - "0x21"
                - uint16_t
                - Analog
              access: READ|REPORT
              access_acl: 5
              attribute_value: 1
          commands_received: {}
          commands_generated: {}
        "0x0003":
          cluster_id: "0x0003"
          title: Identify
          name: identify
          attributes:
            "0x0000":
              attribute_id: "0x0000"
              attribute_name: identify_time
              value_type:
                - "0x21"
                - uint16_t
                - Analog
              access: READ|WRITE|REPORT
              access_acl: 7
              attribute_value: 0
            "0xfffd":
              attribute_id: "0xfffd"
              attribute_name: cluster_revision
              value_type:
                - "0x21"
                - uint16_t
                - Analog
              access: READ|REPORT
              access_acl: 5
              attribute_value: 1
          commands_received:
            "0x00":
              command_id: "0x00"
              command_name: identify
              command_arguments: <class 'zigpy.zcl.foundation.identify'>
            "0x01":
              command_id: "0x01"
              command_name: identify_query
              command_arguments: <class 'zigpy.zcl.foundation.identify_query'>
          commands_generated:
            "0x00":
              command_id: "0x00"
              command_name: identify_query_response
              command_args: <class 'zigpy.zcl.foundation.identify_query_response'>
        "0x0004":
          cluster_id: "0x0004"
          title: Groups
          name: groups
          attributes:
            "0x0000":
              attribute_id: "0x0000"
              attribute_name: name_support
              value_type:
                - "0x18"
                - bitmap8
                - Discrete
              access: READ|REPORT
              access_acl: 5
              attribute_value: 0
            "0xfffd":
              attribute_id: "0xfffd"
              attribute_name: cluster_revision
              value_type:
                - "0x21"
                - uint16_t
                - Analog
              access: READ|REPORT
              access_acl: 5
              attribute_value: 2
          commands_received: {}
          commands_generated: {}
        "0x0005":
          cluster_id: "0x0005"
          title: Scenes
          name: scenes
          attributes:
            "0x0000":
              attribute_id: "0x0000"
              attribute_name: count
              value_type:
                - "0x20"
                - uint8_t
                - Analog
              access: READ|REPORT
              access_acl: 5
              attribute_value: 0
            "0x0001":
              attribute_id: "0x0001"
              attribute_name: current_scene
              value_type:
                - "0x20"
                - uint8_t
                - Analog
              access: READ|REPORT
              access_acl: 5
              attribute_value: 0
            "0x0002":
              attribute_id: "0x0002"
              attribute_name: current_group
              value_type:
                - "0x21"
                - uint16_t
                - Analog
              access: READ|REPORT
              access_acl: 5
              attribute_value: 0
            "0x0003":
              attribute_id: "0x0003"
              attribute_name: scene_valid
              value_type:
                - "0x10"
                - Bool
                - Discrete
              access: READ|REPORT
              access_acl: 5
              attribute_value: 0
            "0x0004":
              attribute_id: "0x0004"
              attribute_name: name_support
              value_type:
                - "0x18"
                - bitmap8
                - Discrete
              access: READ|REPORT
              access_acl: 5
              attribute_value: 0
            "0xfffd":
              attribute_id: "0xfffd"
              attribute_name: cluster_revision
              value_type:
                - "0x21"
                - uint16_t
                - Analog
              access: READ|REPORT
              access_acl: 5
              attribute_value: 2
          commands_received: {}
          commands_generated: {}
        "0x0102":
          cluster_id: "0x0102"
          title: Window Covering
          name: window_covering
          attributes:
            "0x0000":
              attribute_id: "0x0000"
              attribute_name: window_covering_type
              value_type:
                - "0x30"
                - enum8
                - Discrete
              access: READ|REPORT
              access_acl: 5
              attribute_value: 0
            "0x0001":
              attribute_id: "0x0001"
              attribute_name: physical_closed_limit_lift
              value_type:
                - "0x21"
                - uint16_t
                - Analog
              access: READ|REPORT
              access_acl: 5
              attribute_value: 0
            "0x0002":
              attribute_id: "0x0002"
              attribute_name: physical_closed_limit_tilt
              value_type:
                - "0x21"
                - uint16_t
                - Analog
              access: READ|REPORT
              access_acl: 5
              attribute_value: 0
            "0x0003":
              attribute_id: "0x0003"
              attribute_name: current_position_lift
              value_type:
                - "0x21"
                - uint16_t
                - Analog
              access: READ|REPORT
              access_acl: 5
              attribute_value: 0
            "0x0004":
              attribute_id: "0x0004"
              attribute_name: current_position_tilt
              value_type:
                - "0x21"
                - uint16_t
                - Analog
              access: READ|REPORT
              access_acl: 5
              attribute_value: 0
            "0x0007":
              attribute_id: "0x0007"
              attribute_name: config_status
              value_type:
                - "0x18"
                - bitmap8
                - Discrete
              access: READ|REPORT
              access_acl: 5
              attribute_value: 3
            "0x0008":
              attribute_id: "0x0008"
              attribute_name: current_position_lift_percentage
              value_type:
                - "0x20"
                - uint8_t
                - Analog
              access: READ|REPORT
              access_acl: 5
              attribute_value: 0
            "0x0009":
              attribute_id: "0x0009"
              attribute_name: current_position_tilt_percentage
              value_type:
                - "0x20"
                - uint8_t
                - Analog
              access: READ|REPORT
              access_acl: 5
              attribute_value: 0
            "0x0010":
              attribute_id: "0x0010"
              attribute_name: installed_open_limit_lift
              value_type:
                - "0x21"
                - uint16_t
                - Analog
              access: READ|REPORT
              access_acl: 5
              attribute_value: 0
            "0x0011":
              attribute_id: "0x0011"
              attribute_name: installed_closed_limit_lift
              value_type:
                - "0x21"
                - uint16_t
                - Analog
              access: READ|REPORT
              access_acl: 5
              attribute_value: 65535
            "0x0012":
              attribute_id: "0x0012"
              attribute_name: installed_open_limit_tilt
              value_type:
                - "0x21"
                - uint16_t
                - Analog
              access: READ|REPORT
              access_acl: 5
              attribute_value: 0
            "0x0013":
              attribute_id: "0x0013"
              attribute_name: installed_closed_limit_tilt
              value_type:
                - "0x21"
                - uint16_t
                - Analog
              access: READ|REPORT
              access_acl: 5
              attribute_value: 65535
            "0x0017":
              attribute_id: "0x0017"
              attribute_name: window_covering_mode
              value_type:
                - "0x18"
                - bitmap8
                - Discrete
              access: READ|WRITE|REPORT
              access_acl: 7
              attribute_value: 0
            "0xf000":
              attribute_id: "0xf000"
              attribute_name: "61440"
              value_type:
                - "0x10"
                - Bool
                - Discrete
              access: READ|REPORT
              access_acl: 5
              attribute_value: 0
            "0xf001":
              attribute_id: "0xf001"
              attribute_name: "61441"
              value_type:
                - "0x10"
                - Bool
                - Discrete
              access: READ|WRITE|REPORT
              access_acl: 7
              attribute_value: 0
            "0xf002":
              attribute_id: "0xf002"
              attribute_name: "61442"
              value_type:
                - "0x30"
                - enum8
                - Discrete
              access: READ|REPORT
              access_acl: 5
              attribute_value: 0
            "0xf004":
              attribute_id: "0xf004"
              attribute_name: "61444"
              value_type:
                - "0x23"
                - uint32_t
                - Analog
              access: READ|REPORT
              access_acl: 5
              attribute_value: 0
            "0xf005":
              attribute_id: "0xf005"
              attribute_name: "61445"
              value_type:
                - "0x23"
                - uint32_t
                - Analog
              access: READ|REPORT
              access_acl: 5
              attribute_value: 0
            "0xf006":
              attribute_id: "0xf006"
              attribute_name: "61446"
              value_type:
                - "0x30"
                - enum8
                - Discrete
              access: READ|REPORT
              access_acl: 5
              attribute_value: 0
            "0xf007":
              attribute_id: "0xf007"
              attribute_name: "61447"
              value_type:
                - "0x1b"
                - bitmap32
                - Discrete
              access: READ|REPORT
              access_acl: 5
              attribute_value: 0
            "0xf008":
              attribute_id: "0xf008"
              attribute_name: "61448"
              value_type:
                - "0x30"
                - enum8
                - Discrete
              access: READ|WRITE|REPORT
              access_acl: 7
              attribute_value: 0
            "0xf009":
              attribute_id: "0xf009"
              attribute_name: "61449"
              value_type:
                - "0x20"
                - uint8_t
                - Analog
              access: READ|WRITE|REPORT
              access_acl: 7
              attribute_value: 0
            "0xfffd":
              attribute_id: "0xfffd"
              attribute_name: "65533"
              value_type:
                - "0x21"
                - uint16_t
                - Analog
              access: READ|REPORT
              access_acl: 5
              attribute_value: 2
          commands_received: {}
          commands_generated: {}
        "0xef00":
          cluster_id: "0xef00"
          title: Tuya Manufacturer Specicific
          name: tuya_manufacturer
          attributes:
            "0x0000":
              attribute_id: "0x0000"
              attribute_name: "0"
              value_type:
                - "0x20"
                - uint8_t
                - Analog
              access: READ|REPORT
              access_acl: 5
              attribute_value: 0
            "0xfffd":
              attribute_id: "0xfffd"
              attribute_name: "65533"
              value_type:
                - "0x21"
                - uint16_t
                - Analog
              access: READ|REPORT
              access_acl: 5
              attribute_value: 2
          commands_received: {}
          commands_generated: {}
      out_clusters:
        "0x000a":
          cluster_id: "0x000a"
          title: Time
          name: time
          attributes:
            "0xfffd":
              attribute_id: "0xfffd"
              attribute_name: cluster_revision
              value_type:
                - "0x21"
                - uint16_t
                - Analog
              access: READ|REPORT
              access_acl: 5
              attribute_value: 1
          commands_received: {}
          commands_generated: {}
        "0x0019":
          cluster_id: "0x0019"
          title: Ota
          name: ota
          attributes:
            "0x0000":
              attribute_id: "0x0000"
              attribute_name: upgrade_server_id
              value_type:
                - "0xf0"
                - EUI64
                - Discrete
              access: READ|REPORT
              access_acl: 5
              attribute_value:
                - 255
                - 255
                - 255
                - 255
                - 255
                - 255
                - 255
                - 255
            "0x0001":
              attribute_id: "0x0001"
              attribute_name: file_offset
              value_type:
                - "0x23"
                - uint32_t
                - Analog
              access: READ|REPORT
              access_acl: 5
              attribute_value: 4294967295
            "0x0006":
              attribute_id: "0x0006"
              attribute_name: image_upgrade_status
              value_type:
                - "0x30"
                - enum8
                - Discrete
              access: READ|REPORT
              access_acl: 5
              attribute_value: 0
            "0xfffd":
              attribute_id: "0xfffd"
              attribute_name: cluster_revision
              value_type:
                - "0x21"
                - uint16_t
                - Analog
              access: READ|REPORT
              access_acl: 5
              attribute_value: 3
          commands_received: {}
          commands_generated:
            "0x01":
              command_id: "0x01"
              command_name: "1"
              command_args: not_in_zcl
            "0x03":
              command_id: "0x03"
              command_name: "3"
              command_args: not_in_zcl
            "0x06":
              command_id: "0x06"
              command_name: "6"
              command_args: not_in_zcl
success: true

See this attribute? It should be easy to get it to report the percentage (it returns the right value when I query it manually) but I am at a loss as to how this works…