zha-device-handlers icon indicating copy to clipboard operation
zha-device-handlers copied to clipboard

[Device Support Request] ""TZE204_lzriup1j_TS0601"" Avatto Zigbee thermostat panel [Electric heating]

Open darknessblade opened this issue 1 year ago • 90 comments

Problem description

Device/item link: aliexpress.com/item/1005002960679997.html?

Device is detected by ZHA but does not show any sensor/controls information.

Solution description

Full climate support for the Thermostat panel. with all functions available under ZHA.

Screenshots/Video

Screenshots/Video

[Paste/upload your media here] ts0601

Device signature

Device signature
{
  "node_descriptor": "NodeDescriptor(logical_type=<LogicalType.Router: 1>, complex_descriptor_available=0, user_descriptor_available=0, reserved=0, aps_flags=0, frequency_band=<FrequencyBand.Freq2400MHz: 8>, mac_capability_flags=<MACCapabilityFlags.FullFunctionDevice|MainsPowered|RxOnWhenIdle|AllocateAddress: 142>, manufacturer_code=4417, maximum_buffer_size=66, maximum_incoming_transfer_size=66, server_mask=10752, maximum_outgoing_transfer_size=66, descriptor_capability_field=<DescriptorCapability.NONE: 0>, *allocate_address=True, *is_alternate_pan_coordinator=False, *is_coordinator=False, *is_end_device=False, *is_full_function_device=True, *is_mains_powered=True, *is_receiver_on_when_idle=True, *is_router=True, *is_security_capable=False)",
  "endpoints": {
    "1": {
      "profile_id": "0x0104",
      "device_type": "0x0051",
      "input_clusters": [
        "0x0000",
        "0x0004",
        "0x0005",
        "0xef00"
      ],
      "output_clusters": [
        "0x000a",
        "0x0019"
      ]
    },
    "242": {
      "profile_id": "0xa1e0",
      "device_type": "0x0061",
      "input_clusters": [],
      "output_clusters": [
        "0x0021"
      ]
    }
  },
  "manufacturer": "_TZE204_lzriup1j",
  "model": "TS0601",
  "class": "zigpy.device.Device"
}

Diagnostic information

Diagnostic information
  "data": {
    "ieee": "**REDACTED**",
    "nwk": 49661,
    "manufacturer": "_TZE204_lzriup1j",
    "model": "TS0601",
    "name": "_TZE204_lzriup1j TS0601",
    "quirk_applied": false,
    "quirk_class": "zigpy.device.Device",
    "manufacturer_code": 4417,
    "power_source": "Mains",
    "lqi": 140,
    "rssi": -65,
    "last_seen": "2023-09-16T22:39:49",
    "available": true,
    "device_type": "Router",
    "signature": {
      "node_descriptor": "NodeDescriptor(logical_type=<LogicalType.Router: 1>, complex_descriptor_available=0, user_descriptor_available=0, reserved=0, aps_flags=0, frequency_band=<FrequencyBand.Freq2400MHz: 8>, mac_capability_flags=<MACCapabilityFlags.FullFunctionDevice|MainsPowered|RxOnWhenIdle|AllocateAddress: 142>, manufacturer_code=4417, maximum_buffer_size=66, maximum_incoming_transfer_size=66, server_mask=10752, maximum_outgoing_transfer_size=66, descriptor_capability_field=<DescriptorCapability.NONE: 0>, *allocate_address=True, *is_alternate_pan_coordinator=False, *is_coordinator=False, *is_end_device=False, *is_full_function_device=True, *is_mains_powered=True, *is_receiver_on_when_idle=True, *is_router=True, *is_security_capable=False)",
      "endpoints": {
        "1": {
          "profile_id": "0x0104",
          "device_type": "0x0051",
          "input_clusters": [
            "0x0000",
            "0x0004",
            "0x0005",
            "0xef00"
          ],
          "output_clusters": [
            "0x000a",
            "0x0019"
          ]
        },
        "242": {
          "profile_id": "0xa1e0",
          "device_type": "0x0061",
          "input_clusters": [],
          "output_clusters": [
            "0x0021"
          ]
        }
      },
      "manufacturer": "_TZE204_lzriup1j",
      "model": "TS0601"
    },
    "active_coordinator": false,
    "entities": [],
    "neighbors": [],
    "routes": [],
    "endpoint_names": [
      {
        "name": "SMART_PLUG"
      },
      {
        "name": "PROXY_BASIC"
      }
    ],
    "user_given_name": null,
    "device_reg_id": "ca3af7e440cc19b50985d7e113528db8",
    "area_id": null,
    "cluster_details": {
      "1": {
        "device_type": {
          "name": "SMART_PLUG",
          "id": 81
        },
        "profile_id": 260,
        "in_clusters": {
          "0x0004": {
            "endpoint_attribute": "groups",
            "attributes": {},
            "unsupported_attributes": {}
          },
          "0x0005": {
            "endpoint_attribute": "scenes",
            "attributes": {},
            "unsupported_attributes": {}
          },
          "0xef00": {
            "endpoint_attribute": null,
            "attributes": {},
            "unsupported_attributes": {}
          },
          "0x0000": {
            "endpoint_attribute": "basic",
            "attributes": {
              "0x0001": {
                "attribute_name": "app_version",
                "value": 74
              },
              "0x0004": {
                "attribute_name": "manufacturer",
                "value": "_TZE204_lzriup1j"
              },
              "0x0005": {
                "attribute_name": "model",
                "value": "TS0601"
              }
            },
            "unsupported_attributes": {}
          }
        },
        "out_clusters": {
          "0x0019": {
            "endpoint_attribute": "ota",
            "attributes": {},
            "unsupported_attributes": {}
          },
          "0x000a": {
            "endpoint_attribute": "time",
            "attributes": {},
            "unsupported_attributes": {}
          }
        }
      },
      "242": {
        "device_type": {
          "name": "PROXY_BASIC",
          "id": 97
        },
        "profile_id": 41440,
        "in_clusters": {},
        "out_clusters": {
          "0x0021": {
            "endpoint_attribute": "green_power",
            "attributes": {},
            "unsupported_attributes": {}
          }
        }
      }
    }
  }
}

Logs

System Logs for Cluster info [0xB58F:1:0xef00] Unknown cluster command 2 b'\x00\x16\x02\x02\x00\x04\x00\x00\x00\xe6' [0xB58F:1:0xef00] Unknown cluster command 2 b'\x00\x17\x03\x02\x00\x04\x00\x00\x00\xff' [0xB58F:1:0xef00] Unknown cluster command 2 b'\x00\x18\x02\x02\x00\x04\x00\x00\x00\xeb' [0xB58F:1:0xef00] Unknown cluster command 2 b'\x00\x19\x03\x02\x00\x04\x00\x00\x00\xff' [0xB58F:1:0xef00] Unknown cluster command 2 b'\x00\x1a\x03\x02\x00\x04\x00\x00\x00\xff'

Custom quirk

I have tried adding: https://github.com/zigpy/zha-device-handlers/blob/dev/zhaquirks/tuya/ts0601_electric_heating.py As a custom quirk with the device ID/type of the Avatto thermostat.

This is the sole modification I did to the File

Additional information

No response

darknessblade avatar Sep 16 '23 21:09 darknessblade

Is it loading the zhaquirks.tuya.ts0601_electric_heating.MoesBHT?

It looks like the last input and the output clusters are not covered in this quirk.

ShogunMan avatar Sep 17 '23 07:09 ShogunMan

It is not loading any quirk at all.

I checked my custom quirks and I do not have the moes BHT custom one. do you have a link for it, or is it the same as the default one?

I do have a temp sensor [TS0601 type] that loads a different quirk, so its not a issue with the custom quirk settings.

Trying to add a different one {HAOZEE} does not help either. Still gives the same type of error in the logs

[0xC1FD:1:0xef00] Unknown cluster command 2 b'\x00\x02\x04\x04\x00\x01\x01' [0xF153:1:0xef00] Unknown cluster command 2 b'\x00\x15\x03\x02\x00\x04\x00\x00\x00\xf3' [0xF153:1:0xef00] Unknown cluster command 17 b'\x00\x0f@' [0xF153:1:0xef00] Unknown cluster command 2 b'\x00\x17\x03\x02\x00\x04\x00\x00\x00\xf4' [0xF153:1:0xef00] Unknown cluster command 2 b'\x00\x18\x03\x02\x00\x04\x00\x00\x00\xf4'

But I did notice some effect, the Temperature kept rising up, even though there is no custom quirk loaded under ZHA information

darknessblade avatar Sep 17 '23 08:09 darknessblade

It is the default ts0601_electric_heating quirk. It just adds the MoesBHT class when loaded. It is not loading the quirk because one of the input, and both output clusters does not match the quirk.

It has to be adjusted to support input cluster "0xef00" and output clusters "0x000a" and "0x0019".

ShogunMan avatar Sep 17 '23 10:09 ShogunMan

What changes do I need to make to support those input clusters?

Or could you give me a Custom quirk file that should enable the in/output clusters

darknessblade avatar Sep 17 '23 11:09 darknessblade

@ShogunMan I have received this file from the Manufacturer, My device does not look to be listed, but it does give quite a lot of "Tuya" data-points/cluster info for many devices.

It does list "TS0601_thermostat" entries but these are for thermostat valves

https://github.com/darknessblade/-TZE204_lzriup1j_TS0601-Avatto-Zigbee-thermostat-panel-Electric-heating-/blob/main/tuya%20(1).ts

darknessblade avatar Sep 20 '23 07:09 darknessblade

@darknessblade I've double checked and in fact all clusters on endpoint 1 are handled correctly by the current quirk. However your device also lists endpoint 242 with a single output cluster that is not handled by the current quirk. Can you try this modified quirk (rename extension to .py)

ts0601_heating_avatto.txt

Check if it loads at all, and if not, check the logs at startup to be sure it finds it. Remember to have custom quirks enabled and the file in your custom quirk directory.

ShogunMan avatar Sep 20 '23 09:09 ShogunMan

I have checked but still nothing.

Custom quirks should be enabled config custom quirk2

config

From the logs: Traceback (most recent call last): File "/usr/local/lib/python3.11/site-packages/zhaquirks/__init__.py", line 460, in setup spec.loader.exec_module(module) File "<frozen importlib._bootstrap_external>", line 940, in exec_module File "<frozen importlib._bootstrap>", line 241, in _call_with_frames_removed File "/config/custom_zha_quirks/ts0601_heating_avatto.py", line 180, in <module> class MoesAvatto(TuyaThermostat): File "/config/custom_zha_quirks/ts0601_heating_avatto.py", line 205, in MoesAvatto OUTPUT_CLUSTERS: [GreenPowerProxy.cluster_id], ^^^^^^^^^^^^^^^ NameError: name 'GreenPowerProxy' is not defined

darknessblade avatar Sep 20 '23 09:09 darknessblade

Ok, there was a bug in the previous file. Try this: ts0601_heating_avatto.txt

ShogunMan avatar Sep 20 '23 09:09 ShogunMan

With that last change I can see a CLIMATE entity under controls custom quirk working

I am still unable to control it though, "Temperature runaway bug" still happens.

darknessblade avatar Sep 20 '23 09:09 darknessblade

I'll make a bare minimum quirk, if that does not work we have to call on @TheJulianJES or @javicalle :-)

ShogunMan avatar Sep 20 '23 09:09 ShogunMan

Please do so.

The minimum quirk features, I would like to have 1 Climate [Manual temperature/ define temperature] 2 Child lock

The chidlock is mostly to prevent the "Thermal-runaway" bug from happening. to preven the temperature from going up without reason

This way I can use the device in a way I can work with it. Then We can always later have Julian and Javi take a look at it as well for FULL support.

darknessblade avatar Sep 20 '23 09:09 darknessblade

Try this: ts0601_heating_minimum.txt

If this does not work, then i believe the manufacturer specific cluster is not compatible with Moes and more info is needed.

ShogunMan avatar Sep 20 '23 09:09 ShogunMan

I have checked and it had no effect on controls.

Will ask the manufacturer for the cluster information

darknessblade avatar Sep 20 '23 10:09 darknessblade

But it loaded the minimum quirk? Then we can use that as a starting point for implementing the manufacturer specific cluster.

ShogunMan avatar Sep 20 '23 10:09 ShogunMan

It did load the minimum quirk. but I am unable to do anything else.

The thermal-runaway bug [bug where the temp keeps going up] keeps happening even with the minimal quirk.

{In order to properly load the quirk each time, I removed the device, and rebooted hass}

darknessblade avatar Sep 20 '23 10:09 darknessblade

We could try the Haozee cluster for a test. It seems from your log that it is looking for this. Let me throw something together.

ShogunMan avatar Sep 20 '23 10:09 ShogunMan

OK. please send me some files for me to test, and I will report back

darknessblade avatar Sep 20 '23 10:09 darknessblade

Give this a shot: ts0601_heating_avatto.txt

ShogunMan avatar Sep 20 '23 10:09 ShogunMan

this one does not look to work either

test avatto

darknessblade avatar Sep 20 '23 10:09 darknessblade

Ok, there is one last thing we could try, let me do a little research. I might be able to find the manufacturer cluster spec.

ShogunMan avatar Sep 20 '23 10:09 ShogunMan

OK.

darknessblade avatar Sep 20 '23 10:09 darknessblade

Found a bug, try this instead: ts0601_avatto2.txt

This is based on a known Avatto device and should use the same manufacturer cluster.

ShogunMan avatar Sep 20 '23 11:09 ShogunMan

That one shows much more information:

test avatto

The climate panel still does not work. and the [climate heat/off] does not change status when {DISPLAY ON/OFF } pressed on the panel.

darknessblade avatar Sep 20 '23 11:09 darknessblade

Can you remove/delete the device, then add it again?

ShogunMan avatar Sep 20 '23 11:09 ShogunMan

Tried removing/adding it back, and it did not change anything in the controls/sensors

darknessblade avatar Sep 20 '23 11:09 darknessblade

For full functionality, I believe we need the full spec from the manufacturer. But you are able to control the device from within HA? Child lock works?

ShogunMan avatar Sep 20 '23 11:09 ShogunMan

Child lock does not work. [To activate it on the panel its: HOLD temp-up/temp-down 5 seconds] When activating it on the panel, it does not change the state of the "switch"

I am unable to control the thermostat

"Thermal-runaway still happens. when childlock is off"

darknessblade avatar Sep 20 '23 11:09 darknessblade

Checking the logs:

[0x3887:1:0x0006]: async_initialize: all attempts have failed: [DeliveryError('Failed to deliver message: <EmberStatus.DELIVERY_FAILED: 102>'), DeliveryError('Failed to deliver message: <EmberStatus.DELIVERY_FAILED: 102>'), DeliveryError('Failed to deliver message: <EmberStatus.DELIVERY_FAILED: 102>'), DeliveryError('Failed to deliver message: <EmberStatus.DELIVERY_FAILED: 102>')] [0xD52B:1:0x0102]: async_initialize: all attempts have failed: [DeliveryError('Failed to deliver message: <EmberStatus.DELIVERY_FAILED: 102>'), DeliveryError('Failed to deliver message: <EmberStatus.DELIVERY_FAILED: 102>'), DeliveryError('Failed to deliver message: <EmberStatus.DELIVERY_FAILED: 102>'), DeliveryError('Failed to deliver message: <EmberStatus.DELIVERY_FAILED: 102>')] [0x3887:1:0x0008]: async_initialize: all attempts have failed: [DeliveryError('Failed to deliver message: <EmberStatus.DELIVERY_FAILED: 102>'), DeliveryError('Failed to deliver message: <EmberStatus.DELIVERY_FAILED: 102>'), DeliveryError('Failed to deliver message: <EmberStatus.DELIVERY_FAILED: 102>'), DeliveryError('Failed to deliver message: <EmberStatus.DELIVERY_FAILED: 102>')] [0x3887:1:0x0300]: async_initialize: all attempts have failed: [DeliveryError('Failed to deliver message: <EmberStatus.DELIVERY_FAILED: 102>'), DeliveryError('Failed to deliver message: <EmberStatus.DELIVERY_FAILED: 102>'), DeliveryError('Failed to deliver message: <EmberStatus.DELIVERY_FAILED: 102>'), DeliveryError('Failed to deliver message: <EmberStatus.DELIVERY_FAILED: 102>')] [0xD52B:1:0x0006]: async_initialize: all attempts have failed: [DeliveryError('Failed to deliver message: <EmberStatus.DELIVERY_FAILED: 102>'), DeliveryError('Failed to deliver message: <EmberStatus.DELIVERY_FAILED: 102>'), DeliveryError('Failed to deliver message: <EmberStatus.DELIVERY_FAILED: 102>'), DeliveryError('Failed to deliver message: <EmberStatus.DELIVERY_FAILED: 102>')]

darknessblade avatar Sep 20 '23 11:09 darknessblade

Instead of Thermal runaway, it now keeps triggering the "change time" button

When letting the panel sit on my desk, it stops the change time trigger, and returns to the thermal-runaway

darknessblade avatar Sep 20 '23 11:09 darknessblade

According to the seller the File I linked are the Zigbee2MQTT firmware details they also gave Zigbee2MQTT

darknessblade avatar Sep 20 '23 11:09 darknessblade