Repository: zigpy/zha-device-handlers

Issue:
[Device Support Request] Develco Frient SMSZB-120 Intelligent Smoke Alarm
**Is your feature request related to a problem? Please describe.**
I am able to pair the device, the temperature sensor works, but the battery sensor does not. Unclear on the binary_sensor.
Upon investigation, found errors in logs.

**Describe the solution you'd like**
Add quirks for the Frient devices as needed. There is apparently [ZigBee2MQTT support](https://www.zigbee2mqtt.io/devices/SMSZB-120.html).

**Device signature - this can be acquired by removing the device from ZHA and pairing it again from the add devices screen. Be sure to add the entire content of the log panel after pairing the device to a code block below this line.**
```
{
  "node_descriptor": "NodeDescriptor(byte1=2, byte2=64, mac_capability_flags=0, manufacturer_code=4117, maximum_buffer_size=80, maximum_incoming_transfer_size=80, server_mask=0, maximum_outgoing_transfer_size=80, descriptor_capability_field=0, *allocate_address=False, *complex_descriptor_available=False, *is_alternate_pan_coordinator=False, *is_coordinator=False, *is_end_device=True, *is_full_function_device=False, *is_mains_powered=False, *is_receiver_on_when_idle=False, *is_router=False, *is_security_capable=False, *is_valid=True, *logical_type=<LogicalType.EndDevice: 2>, *user_descriptor_available=False)",
  "endpoints": {
    "1": {
      "profile_id": 49353,
      "device_type": "0x0001",
      "in_clusters": [
        "0x0003",
        "0x0005",
        "0x0006"
      ],
      "out_clusters": []
    },
    "35": {
      "profile_id": 260,
      "device_type": "0x0402",
      "in_clusters": [
        "0x0000",
        "0x0001",
        "0x0003",
        "0x000f",
        "0x0020",
        "0x0500",
        "0x0502"
      ],
      "out_clusters": [
        "0x000a",
        "0x0019"
      ]
    },
    "38": {
      "profile_id": 260,
      "device_type": "0x0302",
      "in_clusters": [
        "0x0000",
        "0x0003",
        "0x0402"
      ],
      "out_clusters": [
        "0x0003"
      ]
    }
  },
  "manufacturer": "frient A/S",
  "model": "SMSZB-120",
  "class": "zigpy.device.Device"
}
```

**Additional context**
ZHA Issue: https://github.com/home-assistant/core/issues/49127
Zigbee-Herdsman Converter: https://github.com/Koenkk/zigbee-herdsman-converters/blob/master/devices/develco.js
```
2021-04-16 17:43:50 DEBUG (MainThread) [zigpy.zcl] [0x17e8:35:0x0500] ZCL deserialize: <ZCLHeader frame_control=<FrameControl frame_type=CLUSTER_COMMAND manufacturer_specific=False is_reply=True disable_default_response=False> manufacturer=None tsn=61 command_id=0>
2021-04-16 17:43:50 DEBUG (MainThread) [zigpy.zcl] [0x17e8:35:0x0500] ZCL request 0x0000: [<ZoneStatus.Restore_reports|Supervision_reports: 48>, <bitmap8.0: 0>, 0, 65535]
2021-04-16 17:43:50 DEBUG (MainThread) [zigpy.zcl] [0x17e8:35:0x0500] No handler for cluster command 0
...
2021-04-16 17:48:50 DEBUG (MainThread) [zigpy.zcl] [0x17e8:35:0x0500] ZCL deserialize: <ZCLHeader frame_control=<FrameControl frame_type=CLUSTER_COMMAND manufacturer_specific=False is_reply=True disable_default_response=False> manufacturer=None tsn=62 command_id=0>
2021-04-16 17:48:50 DEBUG (MainThread) [zigpy.zcl] [0x17e8:35:0x0500] ZCL request 0x0000: [<ZoneStatus.Restore_reports|Supervision_reports: 48>, <bitmap8.0: 0>, 0, 65535]
2021-04-16 17:48:50 DEBUG (MainThread) [zigpy.zcl] [0x17e8:35:0x0500] No handler for cluster command 0
```



Discussion:
I am very much interested in this one as well - I have 7 of these I want to connect.
I see the exact same behavior as in the issue: [#49127](https://github.com/home-assistant/core/issues/49127) 

If I can do anything to help, please let me know!
I am also very interested in this device and its sibiling the [Develco/Frient Heat detector HESZB-120](https://www.develcoproducts.com/products/sensors-and-alarms/heat-alarm/). They have the funcionality of being used as Warning Device (cluster 0x0502), which is quite unique among all the other zigbee smoke detectors. Sending the right message you can get all the detectors to sound at once, either when fire is detected by one of them, or for burglar alarm purpouses.

Develco publish at their site the technical documentation for the [SMSZB-120](https://www.develcoproducts.com/media/1742/smszb-120-technical-manual-smoke-alarm.pdf) and the [HESZB-120](https://www.develcoproducts.com/media/1708/heszb-120-technical-manual-heat-alarm.pdf). With this and the information at the zigbee2mqqt site I have been able to send `zha.issue_zigbee_cluster_command` to cluster 0x0502 and start/stop the warning at the devices.

Start command (3 seconds warning, 2nd arg) `{
   "ieee":"xx:xx:xx:xx:xx:xx:xx:xx",
   "endpoint_id":35,
   "cluster_id":1282,
   "cluster_type":"in",
   "command":0,
   "command_type":"server",
   "args":[1,3,0,0]
}`

Stop command `
{
   "ieee":"xx:xx:xx:xx:xx:xx:xx:xx",
   "endpoint_id":35,
   "cluster_id":1282,
   "cluster_type":"in",
   "command":0,
   "command_type":"server",
   "args":[0,0,0,0]
}`

Putting the Sonoff ZbBridge at module 75 gives me following mqtt messages. The 0500<00 messages come quite often, I guess it is the "everything OK, no fire" message. If this helps in any way I can try to fetch other messages like "fire detected" or "test button pressed". Just tell me if you need that.
```
{"ZbReceived":{{"Device":"0x2895","Manufacturer":"frient A/S","ModelId":"SMSZB-120","Endpoint":38,"LinkQuality":58}}}
{"ZbReceived":{{"Device":"0x2895","0019!01":"001510510219040300","Endpoint":35,"LinkQuality":58}}}
{"ZbReceived":{{"Device":"0x2895","0020<00":"","Endpoint":35,"LinkQuality":10}}}
{"ZbReceived":{{"Device":"0x2895","0500<00":"30000000FFFF","ZoneStatusChange":48,"Endpoint":35,"LinkQuality":21}}}
{"ZbReceived":{{"Device":"0x2895","0500<00":"300000","ZoneStatusChange":48,"Endpoint":35,"LinkQuality":26}}}
{"ZbReceived":{{"Device":"0x2895","BatteryVoltage":3.1,"0001/003E":0,"BatteryPercentage":100,"Endpoint":35,"LinkQuality":18}}}
{"ZbReceived":{{"Device":"0x2895","Temperature":20.37,"Endpoint":38,"LinkQuality":29}}}

{"ZbReceived":{{"Device":"0xEA9E","Manufacturer":"frient A/S","ModelId":"HESZB-120","Endpoint":38,"LinkQuality":68}}}
{"ZbReceived":{{"Device":"0xEA9E","0019!01":"001510510219040300","Endpoint":35,"LinkQuality":73}}}
{"ZbReceived":{{"Device":"0xEA9E","0020<00":"","Endpoint":35,"LinkQuality":31}}}
{"ZbReceived":{{"Device":"0xEA9E","0500<00":"30010000FFFF","ZoneStatusChange":304,"Endpoint":35,"LinkQuality":29}}}
{"ZbReceived":{{"Device":"0xEA9E","0500<00":"300100","ZoneStatusChange":304,"Endpoint":35,"LinkQuality":26}}}
{"ZbReceived":{{"Device":"0xEA9E","BatteryVoltage":3.1,"0001/003E":0,"BatteryPercentage":100,"Endpoint":35,"LinkQuality":31}}}
{"ZbReceived":{{"Device":"0xEA9E","Temperature":20.56,"Endpoint":38,"LinkQuality":29}}}
```
>They have the funcionality of being used as Warning Device (cluster 0x0502), which is quite unique among all the other zigbee smoke detectors

@BusinessClaes, And this is a great feature, eliminating the need for HA to bind everything together in software. Defenetly a must for me, not having safety in my house relying on HA to properly work.


>With this and the information at the zigbee2mqqt site I have been able to send `zha.issue_zigbee_cluster_command` to cluster 0x0502 and start/stop the warning at the devices.
> 
> Start command (3 seconds warning, 2nd arg) `{ "ieee":"xx:xx:xx:xx:xx:xx:xx:xx", "endpoint_id":35, "cluster_id":1282, "cluster_type":"in", "command":0, "command_type":"server", "args":[1,3,0,0] }`
> 
> Stop command ` { "ieee":"xx:xx:xx:xx:xx:xx:xx:xx", "endpoint_id":35, "cluster_id":1282, "cluster_type":"in", "command":0, "command_type":"server", "args":[0,0,0,0] }`

Out of curiosity, where do you send these commands from ZHA?

> Putting the Sonoff ZbBridge at module 75 gives me following mqtt messages. The 0500<00 messages come quite often, I guess it is the "everything OK, no fire" message. If this helps in any way I can try to fetch other messages like "fire detected" or "test button pressed". Just tell me if you need that.

Also for curiosity, what does it mean that you put the Sonoff ZbBridge at module 75? 
I have flashed my SonoffZBBridge with Tasmota and connected to ZHA. 



> Out of curiosity, where do you send these commands from ZHA?

I send them from Node-RED with a `call service` node (triggered by an inject node)
Domain: `zha`
Service: `issue_zigbee_cluster_command`
Data:
```
{
   "ieee":"your:device:ieee",
   "endpoint_id":35,
   "cluster_id":1282,
   "cluster_type":"in",
   "command":0,
   "command_type":"server",
   "args":[1,3,0,0]
}
```

> Also for curiosity, what does it mean that you put the Sonoff ZbBridge at module 75?
> I have flashed my SonoffZBBridge with Tasmota and connected to ZHA.

After flashing the ZbBridge with Tasmota you made a couple of configurations at the tasmotas console in the bridge. One of the commands was `module 0`, which puts the bridge in kind of "pass through" mode, giving to ZHA direct control of the zigbee radio. The default after flashing the bridge is `module 75` which activates Tasmotas own [Zigbee2Tasmota (Z2T)](https://tasmota.github.io/docs/Zigbee/). With this default configuration, the zigbee traffic is monitored and controlled directly from Tasmota, without sending it to ZHA. 

Tasmota sends then mqtt messages to your broker to inform about what is happening in the zigbee network. Then you can if you want (as I did) listen to these mqtt messages in Node-RED, log them to a file and analize them later.

With `module 75` you can send messages to the zigbee network directly from the Tasmotas console. The command 
`ZbSend {"Device":"0x2895","endpoint":35,"Send":"0502!00/010300"}` has the same result as `zha.issue_zigbee_cluster_command` with `module 0` (triggers the sound in the smoke detector for 3 seconds). You can swap back and forth between `module 75` and `module 0` without breaking anything. Just remember to swap back to `module 0` if you want your zigbee lights to work with HA :)

Hi,

I would really like this to work properly with zHA.
Can anyone help me in creating the Quirk? Or guide me to getting started.

i have read the "readme" of the Zigpy repo, and looked at previously qirks - but it still a bit confusing haw exactly I need to handle the task..

Wondering if the root cause is the same as that described by dmulcahey in https://github.com/zigpy/zha-device-handlers/issues/605 issue? That is, a a limitation in [ZHA integration](https://www.home-assistant.io/integrations/zha/) for Home Assistant which currently only support 1 sensor per cluster, and these type of devices requiring 2 or more sensor per cluster?
@Adminiuga hello Alexei, I know you are working like an hell on other ZHA task, when you have some time on your side, could you take a look at this request, this smoke sensor is really promising, it exposes:

- Temperature: measured temperature value
- Battery: remaining battery in %
- Smoke: indicates whether the device detected smoke
- Battery_low: indicates if the battery of this device is almost empty
- Test: indicates whether the device is being tested
- Max_duration: duration of siren
- Alarm: manual start of siren
- Linkquality: link quality (signal strength)
> @Adminiuga hello Alexei, I know you are working like an hell on other ZHA task, when you have some time on your side, could you take a look at this request, this smoke sensor is really promising, it exposes:
> 
> * Temperature: measured temperature value
> * Battery: remaining battery in %
> * Smoke: indicates whether the device detected smoke
> * Battery_low: indicates if the battery of this device is almost empty
> * Test: indicates whether the device is being tested
> * Max_duration: duration of siren
> * Alarm: manual start of siren
> * Linkquality: link quality (signal strength)

I really second that!
To be, the best feature of them is the IAS alarm, which should let them talk together directly.

I bought 8 of these smoke alarms, because they looked so promising - and I got into ZHA because of them.
 - but was sad to see they didn't work.
 
 I hope someone will help bringing this up to a working order - and I will do what I can do to help!

I just got one of these, and here's what I'm seeing :

- on_off cluster, turning it on does nothing and it resets itself to off after a few seconds, as if the set timed out.
- binary_input, seems to be off normally and turn on when doing a long press on the physical test button.
- IAS Zone sensor, always clear. I haven't tried putting the alarm next to a real fire yet, so it might be working as expected, will have to test it. I've never seen of these, as I understand it that would be the actual smoke detector ?
- Battery, showing unknown but it may not have had time to update yet, I just paired it less than an hour ago.

Using `zha.issue_zigbee_cluster_command` as suggested above I can make it ring once, which is neat. It stops itself though which is unfortunate for an alarm.
I would expect the on_off cluster to control the burglar alarm mode, but it doesn't seem to.

My guess now is I should create an automation to notify me on either binary_input or ias_zone turning on, since that would indicate a fire. Does that sound right ?
My device paired months ago, still no battery level..
When you check the HA logs, you'll probably see errors similar to this one:

```
Logger: zigpy.device
Source: /usr/local/lib/python3.9/site-packages/zigpy/device.py:320
First occurred: 11:58:51 (198 occurrences)
Last logged: 20:19:34

Failed to parse message (b'190100300000') on cluster 1280, because Data is too short to contain 1 bytes
Failed to parse message (b'19da00300000') on cluster 1280, because Data is too short to contain 1 bytes
Failed to parse message (b'190300300000') on cluster 1280, because Data is too short to contain 1 bytes
Failed to parse message (b'19db00300000') on cluster 1280, because Data is too short to contain 1 bytes
Failed to parse message (b'190500300000') on cluster 1280, because Data is too short to contain 1 bytes
```

It is however detecting smoke and working as expected in that area. I have an automation working that sends notifications when smoke is detected. Here's the yaml config of that automation

```
alias: Smoke Detected
description: ''
trigger:
  - type: smoke
    platform: device
    device_id: 8c6be332d5c951f878427e4d6d71b5a8
    entity_id: binary_sensor.frient_a_s_smszb_120_e8960031_ias_zone
    domain: binary_sensor
  - type: smoke
    platform: device
    device_id: 3a9f8d856ca7e2f272xxxxxxxxxxxxxxx
    entity_id: binary_sensor.frient_a_s_smszb_120_50990031_ias_zone
    domain: binary_sensor
condition: []
action:
  - service: notify.mobile_app_deviceXXX
    data:
      message: SMOKE !!!
      title: Smokedetector
mode: single
````
Interesting. I don't see these errors on mine, but maybe that'll come later, I'll keep an eye on it.

I see you are using the ias_zone one in your automation, I'll do the same, thanks!
I would really like these to work too. have 5 of them. The temperature seems to work, and they do report smoke detected. But No battery state. and no way to program them together ot trigger them, the switch entity doesnt do anything. I know they work with deconz, and zigbee2mqtt. But I'll rather stay with ZHA. At least for now..

Anyone got it working? I tried to read up on how to make a quirk.. doesnt seem too easy..
you should request OTA update file, because the firmware from `20210625 00:54` sends correctly formatted ZoneStatus updates
![image](https://user-images.githubusercontent.com/5826160/142527846-03ac5e18-7452-49f8-82d8-5eb0979ab3b4.png)

```
2021-11-18 20:16:11 DEBUG (MainThread) [bellows.zigbee.application] Received incomingMessageHandler frame with [<EmberIncomingMessageType.INCOMING_UNICAST: 0>, EmberApsFrame(profileId=260, clusterId=1280, sourceEndpoint=35, destinationEndpoint=1, options=<EmberApsOption.APS_OPTION_ENABLE_ROUTE_DISCOVERY: 256>, groupId=0, sequence=153), 128, -68, 0x443e, 255, 255, b'\x19\x11\x000\x00\x00\x00\xf0\t']
2021-11-18 20:16:11 DEBUG (MainThread) [zigpy.zcl] [0x443e:35:0x0500] ZCL deserialize: <ZCLHeader frame_control=<FrameControl frame_type=CLUSTER_COMMAND manufacturer_specific=False is_reply=True disable_default_response=True> manufacturer=None tsn=17 command_id=0>
2021-11-18 20:16:11 DEBUG (MainThread) [zigpy.zcl] [0x443e:35:0x0500] ZCL request 0x0000: [<ZoneStatus.Restore_reports|Supervision_reports: 48>, <bitmap8.0: 0>, 0, 2544]
2021-11-18 20:16:11 DEBUG (MainThread) [homeassistant.components.zha.core.channels.base] [0x443E:35:0x0500]: Updated alarm state: ZoneStatus.0
```

Device Signature
```
{
  "node_descriptor": "NodeDescriptor(logical_type=<LogicalType.EndDevice: 2>, complex_descriptor_available=0, user_descriptor_available=0, reserved=0, aps_flags=0, frequency_band=<FrequencyBand.Freq2400MHz: 8>, mac_capability_flags=<MACCapabilityFlags.NONE: 0>, manufacturer_code=4117, maximum_buffer_size=80, maximum_incoming_transfer_size=80, server_mask=10752, maximum_outgoing_transfer_size=80, descriptor_capability_field=<DescriptorCapability.NONE: 0>, *allocate_address=False, *is_alternate_pan_coordinator=False, *is_coordinator=False, *is_end_device=True, *is_full_function_device=False, *is_mains_powered=False, *is_receiver_on_when_idle=False, *is_router=False, *is_security_capable=False)",
  "endpoints": {
    "1": {
      "profile_id": 49353,
      "device_type": "0x0001",
      "in_clusters": [
        "0x0003",
        "0x0005",
        "0x0006"
      ],
      "out_clusters": []
    },
    "35": {
      "profile_id": 260,
      "device_type": "0x0402",
      "in_clusters": [
        "0x0000",
        "0x0001",
        "0x0003",
        "0x000f",
        "0x0020",
        "0x0500",
        "0x0502"
      ],
      "out_clusters": [
        "0x000a",
        "0x0019"
      ]
    },
    "38": {
      "profile_id": 260,
      "device_type": "0x0302",
      "in_clusters": [
        "0x0000",
        "0x0003",
        "0x0402"
      ],
      "out_clusters": [
        "0x0003"
      ]
    }
  },
  "manufacturer": "frient A/S",
  "model": "SMSZB-120",
  "class": "zigpy.device.Device"
}
```


@TexTown  can you read the date code of the basic cluster of your device? And post device signature?

Resolving patch:
diff --git a/zhaquirks/develco/__init__.py b/zhaquirks/develco/__init__.py
--- a/zhaquirks/develco/__init__.py
+++ b/zhaquirks/develco/__init__.py
@@ -6,6 +6,7 @@
 
 from zhaquirks import PowerConfigurationCluster
 
+FRIENT = "frient A/S"
 DEVELCO = "Develco Products A/S"
 
 
@@ -19,14 +20,16 @@ class DevelcoPowerConfiguration(PowerConfigurationCluster):
 class DevelcoIasZone(CustomCluster, IasZone):
     """Custom IasZone for Develco."""
 
-    server_commands = {
-        0x0000: ("status_change_notification", (t.uint16_t,), False),
-        0x0001: (
-            "zone_enroll_request",
+    client_commands = {
+        0x0000: (
+            "status_change_notification",
             (
-                t.enum16,
-                t.uint16_t,
+                IasZone.ZoneStatus,
+                t.Optional(t.bitmap8),
+                t.Optional(t.uint8_t),
+                t.Optional(t.uint16_t),
             ),
             False,
         ),
+        0x0001: ("enroll", (IasZone.ZoneType, t.uint16_t), False),
     }
diff --git a/zhaquirks/develco/smoke_alarm.py b/zhaquirks/develco/smoke_alarm.py
new file mode 100644
--- /dev/null
+++ b/zhaquirks/develco/smoke_alarm.py
@@ -0,0 +1,120 @@
+"""Develco Heat Alarm."""
+import zigpy.profiles.zha
+from zigpy.quirks import CustomDevice
+from zigpy.zcl.clusters.general import (
+    Basic,
+    BinaryInput,
+    Identify,
+    OnOff,
+    Ota,
+    PollControl,
+    PowerConfiguration,
+    Scenes,
+    Time,
+)
+from zigpy.zcl.clusters.measurement import TemperatureMeasurement
+from zigpy.zcl.clusters.security import IasWd, IasZone
+
+from zhaquirks.const import (
+    DEVICE_TYPE,
+    ENDPOINTS,
+    INPUT_CLUSTERS,
+    MODELS_INFO,
+    OUTPUT_CLUSTERS,
+    PROFILE_ID,
+)
+
+from . import FRIENT, DevelcoIasZone, DevelcoPowerConfiguration
+
+MANUFACTURER = 0x1015
+
+
+class SMSZB120(CustomDevice):
+    """Custom device heat alarm."""
+
+    manufacturer_id_override = MANUFACTURER
+
+    signature = {
+        # <SimpleDescriptor endpoint=1 profile=49353 device_type=1 device_version=1
+        # input_clusters=[3, 5, 6] output_clusters=[]>
+        # <SimpleDescriptor endpoint=35 profile=260 device_type=1026 device_version=0
+        # input_clusters=[0, 1, 3, 15, 32, 1280, 1282] output_clusters=[10, 25]>
+        # <SimpleDescriptor endpoint=38 profile=260 device_type=770 device_version=0
+        # input_clusters=[0, 3, 1026] output_clusters=[3]>
+        MODELS_INFO: [(FRIENT, "SMSZB-120")],
+        ENDPOINTS: {
+            1: {
+                PROFILE_ID: 49353,
+                DEVICE_TYPE: 1,
+                INPUT_CLUSTERS: [
+                    Identify.cluster_id,
+                    Scenes.cluster_id,
+                    OnOff.cluster_id,
+                ],
+                OUTPUT_CLUSTERS: [],
+            },
+            35: {
+                PROFILE_ID: zigpy.profiles.zha.PROFILE_ID,
+                DEVICE_TYPE: zigpy.profiles.zha.DeviceType.IAS_ZONE,
+                INPUT_CLUSTERS: [
+                    Basic.cluster_id,
+                    PowerConfiguration.cluster_id,
+                    Identify.cluster_id,
+                    BinaryInput.cluster_id,
+                    PollControl.cluster_id,
+                    IasZone.cluster_id,
+                    IasWd.cluster_id,
+                ],
+                OUTPUT_CLUSTERS: [Time.cluster_id, Ota.cluster_id],
+            },
+            38: {
+                PROFILE_ID: zigpy.profiles.zha.PROFILE_ID,
+                DEVICE_TYPE: zigpy.profiles.zha.DeviceType.TEMPERATURE_SENSOR,
+                INPUT_CLUSTERS: [
+                    Basic.cluster_id,
+                    Identify.cluster_id,
+                    TemperatureMeasurement.cluster_id,
+                ],
+                OUTPUT_CLUSTERS: [Identify.cluster_id],
+            },
+        },
+    }
+
+    replacement = {
+        ENDPOINTS: {
+            1: {
+                PROFILE_ID: 49353,
+                DEVICE_TYPE: 1,
+                INPUT_CLUSTERS: [
+                    Identify.cluster_id,
+                    Scenes.cluster_id,
+                    OnOff.cluster_id,
+                ],
+                OUTPUT_CLUSTERS: [],
+            },
+            35: {
+                PROFILE_ID: zigpy.profiles.zha.PROFILE_ID,
+                DEVICE_TYPE: zigpy.profiles.zha.DeviceType.IAS_ZONE,
+                INPUT_CLUSTERS: [
+                    Basic.cluster_id,
+                    DevelcoPowerConfiguration,
+                    Identify.cluster_id,
+                    BinaryInput.cluster_id,
+                    PollControl.cluster_id,
+                    DevelcoIasZone,
+                    IasWd.cluster_id,
+                ],
+                OUTPUT_CLUSTERS: [Time.cluster_id, Ota.cluster_id],
+            },
+            38: {
+                PROFILE_ID: zigpy.profiles.zha.PROFILE_ID,
+                DEVICE_TYPE: zigpy.profiles.zha.DeviceType.TEMPERATURE_SENSOR,
+                INPUT_CLUSTERS: [
+                    Basic.cluster_id,
+                    Identify.cluster_id,
+                    TemperatureMeasurement.cluster_id,
+                ],
+                OUTPUT_CLUSTERS: [Identify.cluster_id],
+            },
+        },
+    }


Test patch: