Tuya Zigbee Wall Switch (aka. Lonsonho or Bandi)

Hi, have anyone been able to get this one working? TuYa TS0001 control via MQTT | zigbee2mqtt.io

They have wired and wireless versions.

Here's the device fingerprint:

fingerprint model:"TS0601", manufacturer:"_TZE200_oisqyl4o", profileId:"0104", endpointId:"01", inClusters:"0000,0004,0005,EF00", outClusters:"0019,000A", application:"40"

And event for ON and OFF captured in the log:

OFF: descMap:[raw:catchall: 0104 EF00 01 01 0040 00 FA28 01 00 0000 02 01 00240101000100, profileId:0104, clusterId:EF00, clusterInt:61184, sourceEndpoint:01, destinationEndpoint:01, options:0040, messageType:00, dni:FA28, isClusterSpecific:true, isManufacturerSpecific:false, manufacturerId:0000, command:02, direction:01, data:[00, 24, 01, 01, 00, 01, 00]]
ON: descMap:[raw:catchall: 0104 EF00 01 01 0040 00 FA28 01 00 0000 02 01 00230101000101, profileId:0104, clusterId:EF00, clusterInt:61184, sourceEndpoint:01, destinationEndpoint:01, options:0040, messageType:00, dni:FA28, isClusterSpecific:true, isManufacturerSpecific:false, manufacturerId:0000, command:02, direction:01, data:[00, 23, 01, 01, 00, 01, 01]]

Some had Lonsonho working with Generic Zigbee Switch driver, some with Nue Zigbee Switch driver but none of these seems to be working in my case.

Could you please guide me on what the next steps should be? Should I tweak the Generic Switch Driver and using what I captured handle the device in my own driver?

The calls sent are 100% non-standard. I can add this one and push an update tomorrow, if I forget, just remind me, this is a simple update :slight_smile:

Awesome, thank you! Will you be updating Generic Zigbee Switch driver? I'd like to take a look at the commit :slight_smile:

1 Like

Yes, I will, it will be the the development branch to begin with.

One thing, could you please run some more on and off captures from the log? I want to make sure there's nothing else changing in there I need to keep track of. From the two you have posted it looks straight forward, just want to be certain.

Sure thing! Here's the log

dev:382020-09-24 18:07:53.071 infoUnhandled Event IGNORE THIS - description:catchall: 0104 000A 01 01 0040 00 FA28 00 00 0000 00 00 0700 | msgMap:[raw:catchall: 0104 000A 01 01 0040 00 FA28 00 00 0000 00 00 0700, profileId:0104, clusterId:000A, clusterInt:10, sourceEndpoint:01, destinationEndpoint:01, options:0040, messageType:00, dni:FA28, isClusterSpecific:false, isManufacturerSpecific:false, manufacturerId:0000, command:00, direction:00, data:[07, 00]]
dev:382020-09-24 18:07:30.290 infoUnhandled Event IGNORE THIS - description:catchall: 0104 000A 01 01 0040 00 FA28 00 00 0000 00 00 0700 | msgMap:[raw:catchall: 0104 000A 01 01 0040 00 FA28 00 00 0000 00 00 0700, profileId:0104, clusterId:000A, clusterInt:10, sourceEndpoint:01, destinationEndpoint:01, options:0040, messageType:00, dni:FA28, isClusterSpecific:false, isManufacturerSpecific:false, manufacturerId:0000, command:00, direction:00, data:[07, 00]]
dev:382020-09-24 18:07:14.659 infoUnhandled Event IGNORE THIS - description:catchall: 0104 EF00 01 01 0040 00 FA28 01 00 0000 24 01 0023 | msgMap:[raw:catchall: 0104 EF00 01 01 0040 00 FA28 01 00 0000 24 01 0023, profileId:0104, clusterId:EF00, clusterInt:61184, sourceEndpoint:01, destinationEndpoint:01, options:0040, messageType:00, dni:FA28, isClusterSpecific:true, isManufacturerSpecific:false, manufacturerId:0000, command:24, direction:01, data:[00, 23]]
dev:382020-09-24 18:07:09.226 infoUnhandled Event IGNORE THIS - description:catchall: 0104 000A 01 01 0040 00 FA28 00 00 0000 00 00 0700 | msgMap:[raw:catchall: 0104 000A 01 01 0040 00 FA28 00 00 0000 00 00 0700, profileId:0104, clusterId:000A, clusterInt:10, sourceEndpoint:01, destinationEndpoint:01, options:0040, messageType:00, dni:FA28, isClusterSpecific:false, isManufacturerSpecific:false, manufacturerId:0000, command:00, direction:00, data:[07, 00]]
dev:382020-09-24 18:07:03.039 infoUnhandled Event IGNORE THIS - description:catchall: 0104 EF00 01 01 0040 00 FA28 01 00 0000 02 01 00770101000101 | msgMap:[raw:catchall: 0104 EF00 01 01 0040 00 FA28 01 00 0000 02 01 00770101000101, profileId:0104, clusterId:EF00, clusterInt:61184, sourceEndpoint:01, destinationEndpoint:01, options:0040, messageType:00, dni:FA28, isClusterSpecific:true, isManufacturerSpecific:false, manufacturerId:0000, command:02, direction:01, data:[00, 77, 01, 01, 00, 01, 01]]
dev:382020-09-24 18:07:00.510 infoUnhandled Event IGNORE THIS - description:catchall: 0104 EF00 01 01 0040 00 FA28 01 00 0000 02 01 00760101000100 | msgMap:[raw:catchall: 0104 EF00 01 01 0040 00 FA28 01 00 0000 02 01 00760101000100, profileId:0104, clusterId:EF00, clusterInt:61184, sourceEndpoint:01, destinationEndpoint:01, options:0040, messageType:00, dni:FA28, isClusterSpecific:true, isManufacturerSpecific:false, manufacturerId:0000, command:02, direction:01, data:[00, 76, 01, 01, 00, 01, 00]]
dev:382020-09-24 18:06:58.863 infoUnhandled Event IGNORE THIS - description:catchall: 0104 EF00 01 01 0040 00 FA28 01 00 0000 02 01 00750101000101 | msgMap:[raw:catchall: 0104 EF00 01 01 0040 00 FA28 01 00 0000 02 01 00750101000101, profileId:0104, clusterId:EF00, clusterInt:61184, sourceEndpoint:01, destinationEndpoint:01, options:0040, messageType:00, dni:FA28, isClusterSpecific:true, isManufacturerSpecific:false, manufacturerId:0000, command:02, direction:01, data:[00, 75, 01, 01, 00, 01, 01]]
dev:382020-09-24 18:06:55.893 infoUnhandled Event IGNORE THIS - description:catchall: 0104 EF00 01 01 0040 00 FA28 01 00 0000 02 01 00740101000100 | msgMap:[raw:catchall: 0104 EF00 01 01 0040 00 FA28 01 00 0000 02 01 00740101000100, profileId:0104, clusterId:EF00, clusterInt:61184, sourceEndpoint:01, destinationEndpoint:01, options:0040, messageType:00, dni:FA28, isClusterSpecific:true, isManufacturerSpecific:false, manufacturerId:0000, command:02, direction:01, data:[00, 74, 01, 01, 00, 01, 00]]
dev:382020-09-24 18:06:54.644 infoUnhandled Event IGNORE THIS - description:catchall: 0104 EF00 01 01 0040 00 FA28 01 00 0000 02 01 00730101000101 | msgMap:[raw:catchall: 0104 EF00 01 01 0040 00 FA28 01 00 0000 02 01 00730101000101, profileId:0104, clusterId:EF00, clusterInt:61184, sourceEndpoint:01, destinationEndpoint:01, options:0040, messageType:00, dni:FA28, isClusterSpecific:true, isManufacturerSpecific:false, manufacturerId:0000, command:02, direction:01, data:[00, 73, 01, 01, 00, 01, 01]]
dev:382020-09-24 18:06:53.608 infoUnhandled Event IGNORE THIS - description:catchall: 0104 EF00 01 01 0040 00 FA28 01 00 0000 02 01 00720101000100 | msgMap:[raw:catchall: 0104 EF00 01 01 0040 00 FA28 01 00 0000 02 01 00720101000100, profileId:0104, clusterId:EF00, clusterInt:61184, sourceEndpoint:01, destinationEndpoint:01, options:0040, messageType:00, dni:FA28, isClusterSpecific:true, isManufacturerSpecific:false, manufacturerId:0000, command:02, direction:01, data:[00, 72, 01, 01, 00, 01, 00]]
dev:382020-09-24 18:06:52.752 infoUnhandled Event IGNORE THIS - description:catchall: 0104 EF00 01 01 0040 00 FA28 01 00 0000 02 01 00710101000101 | msgMap:[raw:catchall: 0104 EF00 01 01 0040 00 FA28 01 00 0000 02 01 00710101000101, profileId:0104, clusterId:EF00, clusterInt:61184, sourceEndpoint:01, destinationEndpoint:01, options:0040, messageType:00, dni:FA28, isClusterSpecific:true, isManufacturerSpecific:false, manufacturerId:0000, command:02, direction:01, data:[00, 71, 01, 01, 00, 01, 01]]
dev:382020-09-24 18:06:51.968 infoUnhandled Event IGNORE THIS - description:catchall: 0104 EF00 01 01 0040 00 FA28 01 00 0000 02 01 00700101000100 | msgMap:[raw:catchall: 0104 EF00 01 01 0040 00 FA28 01 00 0000 02 01 00700101000100, profileId:0104, clusterId:EF00, clusterInt:61184, sourceEndpoint:01, destinationEndpoint:01, options:0040, messageType:00, dni:FA28, isClusterSpecific:true, isManufacturerSpecific:false, manufacturerId:0000, command:02, direction:01, data:[00, 70, 01, 01, 00, 01, 00]]
dev:382020-09-24 18:06:51.146 infoUnhandled Event IGNORE THIS - description:catchall: 0104 EF00 01 01 0040 00 FA28 01 00 0000 02 01 006F0101000101 | msgMap:[raw:catchall: 0104 EF00 01 01 0040 00 FA28 01 00 0000 02 01 006F0101000101, profileId:0104, clusterId:EF00, clusterInt:61184, sourceEndpoint:01, destinationEndpoint:01, options:0040, messageType:00, dni:FA28, isClusterSpecific:true, isManufacturerSpecific:false, manufacturerId:0000, command:02, direction:01, data:[00, 6F, 01, 01, 00, 01, 01]]
dev:382020-09-24 18:06:50.365 infoUnhandled Event IGNORE THIS - description:catchall: 0104 000A 01 01 0040 00 FA28 00 00 0000 00 00 0700 | msgMap:[raw:catchall: 0104 000A 01 01 0040 00 FA28 00 00 0000 00 00 0700, profileId:0104, clusterId:000A, clusterInt:10, sourceEndpoint:01, destinationEndpoint:01, options:0040, messageType:00, dni:FA28, isClusterSpecific:false, isManufacturerSpecific:false, manufacturerId:0000, command:00, direction:00, data:[07, 00]]
dev:382020-09-24 18:06:50.283 infoUnhandled Event IGNORE THIS - description:catchall: 0104 EF00 01 01 0040 00 FA28 01 00 0000 02 01 006E0101000100 | msgMap:[raw:catchall: 0104 EF00 01 01 0040 00 FA28 01 00 0000 02 01 006E0101000100, profileId:0104, clusterId:EF00, clusterInt:61184, sourceEndpoint:01, destinationEndpoint:01, options:0040, messageType:00, dni:FA28, isClusterSpecific:true, isManufacturerSpecific:false, manufacturerId:0000, command:02, direction:01, data:[00, 6E, 01, 01, 00, 01, 00]]
dev:382020-09-24 18:06:49.697 infoUnhandled Event IGNORE THIS - description:catchall: 0104 EF00 01 01 0040 00 FA28 01 00 0000 02 01 006D0101000101 | msgMap:[raw:catchall: 0104 EF00 01 01 0040 00 FA28 01 00 0000 02 01 006D0101000101, profileId:0104, clusterId:EF00, clusterInt:61184, sourceEndpoint:01, destinationEndpoint:01, options:0040, messageType:00, dni:FA28, isClusterSpecific:true, isManufacturerSpecific:false, manufacturerId:0000, command:02, direction:01, data:[00, 6D, 01, 01, 00, 01, 01]]
dev:382020-09-24 18:06:49.155 infoUnhandled Event IGNORE THIS - description:catchall: 0104 EF00 01 01 0040 00 FA28 01 00 0000 02 01 006C0101000100 | msgMap:[raw:catchall: 0104 EF00 01 01 0040 00 FA28 01 00 0000 02 01 006C0101000100, profileId:0104, clusterId:EF00, clusterInt:61184, sourceEndpoint:01, destinationEndpoint:01, options:0040, messageType:00, dni:FA28, isClusterSpecific:true, isManufacturerSpecific:false, manufacturerId:0000, command:02, direction:01, data:[00, 6C, 01, 01, 00, 01, 00]]

@markus it's tomorrow here in Poland, so there's a reminder. Thank you for adding the support! Hopefully when I see your change I'll have a grasp :slight_smile:

:slight_smile: It is untested, but should work to at least parse the incoming on/off state. Do test to use on/off from HE, if that doesn't work there will still be some more additions and those might be harder to figure out.

@markus it doesn't work :frowning:

dev:382020-09-25 14:44:28.027 debugsendOnOffEvent(endpoint=1, state=false)
dev:382020-09-25 14:44:28.024 infoON/OFF CATCHALL CLUSTER EVENT - description:catchall: 0104 0006 01 01 0040 00 FA28 00 00 0000 0B 01 00C3 | parseMap:[raw:catchall: 0104 0006 01 01 0040 00 FA28 00 00 0000 0B 01 00C3, profileId:0104, clusterId:0006, clusterInt:6, sourceEndpoint:01, destinationEndpoint:01, options:0040, messageType:00, dni:FA28, isClusterSpecific:false, isManufacturerSpecific:false, manufacturerId:0000, command:0B, direction:01, data:[00, C3]]
dev:382020-09-25 14:44:27.975 debugsendZigbeeCommands(cmd=[he cmd 0xFA28 0x01 0x0006 0x00 {} {}, delay 200])
dev:382020-09-25 14:44:27.970 debugonOffCommand(command=0)
dev:382020-09-25 14:44:27.967 debugoff()
dev:382020-09-25 14:44:27.482 infoUnhandled Event IGNORE THIS - description:catchall: 0104 000A 01 01 0040 00 FA28 00 00 0000 00 00 0700 | msgMap:[raw:catchall: 0104 000A 01 01 0040 00 FA28 00 00 0000 00 00 0700, profileId:0104, clusterId:000A, clusterInt:10, sourceEndpoint:01, destinationEndpoint:01, options:0040, messageType:00, dni:FA28, isClusterSpecific:false, isManufacturerSpecific:false, manufacturerId:0000, command:00, direction:00, data:[07, 00]]
dev:382020-09-25 14:44:24.071 debugsendOnOffEvent(endpoint=1, state=true)
dev:382020-09-25 14:44:24.068 infoON/OFF CATCHALL CLUSTER EVENT - description:catchall: 0104 0006 01 01 0040 00 FA28 00 00 0000 0B 01 01C3 | parseMap:[raw:catchall: 0104 0006 01 01 0040 00 FA28 00 00 0000 0B 01 01C3, profileId:0104, clusterId:0006, clusterInt:6, sourceEndpoint:01, destinationEndpoint:01, options:0040, messageType:00, dni:FA28, isClusterSpecific:false, isManufacturerSpecific:false, manufacturerId:0000, command:0B, direction:01, data:[01, C3]]
dev:382020-09-25 14:44:24.012 debugsendZigbeeCommands(cmd=[he cmd 0xFA28 0x01 0x0006 0x01 {} {}, delay 200])
dev:382020-09-25 14:44:24.008 debugonOffCommand(command=1)
dev:382020-09-25 14:44:24.005 debugon()
dev:382020-09-25 14:44:22.851 debugsendOnOffEvent(endpoint=1, state=false)
dev:382020-09-25 14:44:22.847 infoON/OFF CATCHALL CLUSTER EVENT - description:catchall: 0104 0006 01 01 0040 00 FA28 00 00 0000 0B 01 00C3 | parseMap:[raw:catchall: 0104 0006 01 01 0040 00 FA28 00 00 0000 0B 01 00C3, profileId:0104, clusterId:0006, clusterInt:6, sourceEndpoint:01, destinationEndpoint:01, options:0040, messageType:00, dni:FA28, isClusterSpecific:false, isManufacturerSpecific:false, manufacturerId:0000, command:0B, direction:01, data:[00, C3]]
dev:382020-09-25 14:44:22.799 debugsendZigbeeCommands(cmd=[he cmd 0xFA28 0x01 0x0006 0x00 {} {}, delay 200])
dev:382020-09-25 14:44:22.795 debugonOffCommand(command=0)
dev:382020-09-25 14:44:22.791 debugoff()

Sending on/off doesn't work, but receiving it should, correct?

Yes it is

dev:382020-09-25 15:02:22.413 debugsendOnOffEvent(endpoint=1, state=true)
dev:382020-09-25 15:02:22.414 infoON/OFF CATCHALL EF00 CLUSTER EVENT - description:catchall: 0104 EF00 01 01 0040 00 FA28 01 00 0000 02 01 00B30101000101 | parseMap:[raw:catchall: 0104 EF00 01 01 0040 00 FA28 01 00 0000 02 01 00B30101000101, profileId:0104, clusterId:EF00, clusterInt:61184, sourceEndpoint:01, destinationEndpoint:01, options:0040, messageType:00, dni:FA28, isClusterSpecific:true, isManufacturerSpecific:false, manufacturerId:0000, command:02, direction:01, data:[00, B3, 01, 01, 00, 01, 01]]
dev:382020-09-25 15:02:21.011 debugsendOnOffEvent(endpoint=1, state=false)
dev:382020-09-25 15:02:21.007 infoON/OFF CATCHALL EF00 CLUSTER EVENT - description:catchall: 0104 EF00 01 01 0040 00 FA28 01 00 0000 02 01 00B20101000100 | parseMap:[raw:catchall: 0104 EF00 01 01 0040 00 FA28 01 00 0000 02 01 00B20101000100, profileId:0104, clusterId:EF00, clusterInt:61184, sourceEndpoint:01, destinationEndpoint:01, options:0040, messageType:00, dni:FA28, isClusterSpecific:true, isManufacturerSpecific:false, manufacturerId:0000, command:02, direction:01, data:[00, B2, 01, 01, 00, 01, 00]]
1 Like

@jacubmikita Since I don't have this device and can't listen to the traffic with Wireshark, I'm just taking a stab in the dark with what to send for on and off, please try the newly updated code from the development branch. It's row 423 in the code which is the command. "0001" could possibly be "01".

Whoops, the latest version gives me an error:

dev:382020-09-25 17:54:19.424 errorgroovy.lang.MissingMethodException: No signature of method: user_driver_markusl_Zigbee___Generic_Switch__with_Presence__389.rand() is applicable for argument types: (java.lang.Integer) values: [256]
Possible solutions: run(), run(), any(), find(), any(groovy.lang.Closure), find(groovy.lang.Closure) on line 423 (off)
dev:382020-09-25 17:54:19.381 debugonOffCommand(command=0)
dev:382020-09-25 17:54:19.377 debugoff()
dev:382020-09-25 17:54:12.189 errorgroovy.lang.MissingMethodException: No signature of method: user_driver_markusl_Zigbee___Generic_Switch__with_Presence__389.rand() is applicable for argument types: (java.lang.Integer) values: [256]
Possible solutions: run(), run(), any(), find(), any(groovy.lang.Closure), find(groovy.lang.Closure) on line 423 (on)
dev:382020-09-25 17:54:12.146 debugonOffCommand(command=1)
dev:382020-09-25 17:54:12.141 debugon()

And if I change this rand(256) to just 256 it doesn't give any error but it doesn't work either

PS. Tried with 0001 and 01
PPS. I got that working!

Command for OFF is: 00240101000100 and for ON is: 00230101000101. I think I can wrap it with some decent logic

@markus

this is what I come up with:

String fullData = "00" + zigbee.convertToHexString(36-command, 2) + "01" + "01" + "0001" + zigbee.convertToHexString(command, 2)

But hell, I understand nothing :see_no_evil:

1 Like

I'll have to include the random number part, forgot that.

So with that it works? Then I'll fix the random part and my original would work :slight_smile:

Yes, this is working now :slight_smile:

I have two questions to you if I may:

  1. Is there any compiler you are using to build your goovy files from parts?
  2. How did you learn how to write drivers? Good 'ol studying source code and how other drivers are built or you have any good resource on this subject?

Thanks again!

Yes, I wrote my own build-environment in Python, it has no documentation, but is available here:
https://github.com/markus-li/Hubitat/tree/development/tools

I've developed software my whole life, both professionally and as a hobby. So that of course helps. I don't have any direct sources, I did just start out by reading through other drivers and reading up on the specifics and peculiarities of Groovy as a language. Before November last year I had never even looked a Groovy. I would suggest looking at the examples in the official repo as well as the code from some of the long-time developers here in the community. After that, search here in the forum regarding optimizing Groovy, there's some threads in here about that.

Good luck and create a new thread and tag me if you want to ask more :slight_smile:

2 Likes

@markus how would you approach the 3 gang switch?

Here's the formatted log:

BUTTON 1 ON: debugsendOnOffEvent(endpoint=1, state=true)
BUTTON 1 ON: info ON/OFF CATCHALL EF00 CLUSTER EVENT - description:catchall: 0104 EF00 01 01 0040 00 CC41 01 00 0000 02 01 00390101000101 | parseMap:[raw:catchall: 0104 EF00 01 01 0040 00 CC41 01 00 0000 02 01 00390101000101, profileId:0104, clusterId:EF00, clusterInt:61184, sourceEndpoint:01, destinationEndpoint:01, options:0040, messageType:00, dni:CC41, isClusterSpecific:true, isManufacturerSpecific:false, manufacturerId:0000, command:02, direction:01, data:[00, 39, 01, 01, 00, 01, 01]]

BUTTON 1 OFF: debugsendOnOffEvent(endpoint=1, state=false)
BUTTON 1 OFF: info ON/OFF CATCHALL EF00 CLUSTER EVENT - description:catchall: 0104 EF00 01 01 0040 00 CC41 01 00 0000 02 01 003A0101000100 | parseMap:[raw:catchall: 0104 EF00 01 01 0040 00 CC41 01 00 0000 02 01 003A0101000100, profileId:0104, clusterId:EF00, clusterInt:61184, sourceEndpoint:01, destinationEndpoint:01, options:0040, messageType:00, dni:CC41, isClusterSpecific:true, isManufacturerSpecific:false, manufacturerId:0000, command:02, direction:01, data:[00, 3A, 01, 01, 00, 01, 00]]

BUTTON 2 ON: debugsendOnOffEvent(endpoint=1, state=true)
BUTTON 2 ON: info ON/OFF CATCHALL EF00 CLUSTER EVENT - description:catchall: 0104 EF00 01 01 0040 00 CC41 01 00 0000 02 01 003B0201000101 | parseMap:[raw:catchall: 0104 EF00 01 01 0040 00 CC41 01 00 0000 02 01 003B0201000101, profileId:0104, clusterId:EF00, clusterInt:61184, sourceEndpoint:01, destinationEndpoint:01, options:0040, messageType:00, dni:CC41, isClusterSpecific:true, isManufacturerSpecific:false, manufacturerId:0000, command:02, direction:01, data:[00, 3B, 02, 01, 00, 01, 01]]

BUTTON 2 OFF: debugsendOnOffEvent(endpoint=1, state=false)
BUTTON 2 OFF: info ON/OFF CATCHALL EF00 CLUSTER EVENT - description:catchall: 0104 EF00 01 01 0040 00 CC41 01 00 0000 02 01 003C0201000100 | parseMap:[raw:catchall: 0104 EF00 01 01 0040 00 CC41 01 00 0000 02 01 003C0201000100, profileId:0104, clusterId:EF00, clusterInt:61184, sourceEndpoint:01, destinationEndpoint:01, options:0040, messageType:00, dni:CC41, isClusterSpecific:true, isManufacturerSpecific:false, manufacturerId:0000, command:02, direction:01, data:[00, 3C, 02, 01, 00, 01, 00]]

BUTTON 3 ON: debugsendOnOffEvent(endpoint=1, state=true)
BUTTON 3 ON: info ON/OFF CATCHALL EF00 CLUSTER EVENT - description:catchall: 0104 EF00 01 01 0040 00 CC41 01 00 0000 02 01 003D0301000101 | parseMap:[raw:catchall: 0104 EF00 01 01 0040 00 CC41 01 00 0000 02 01 003D0301000101, profileId:0104, clusterId:EF00, clusterInt:61184, sourceEndpoint:01, destinationEndpoint:01, options:0040, messageType:00, dni:CC41, isClusterSpecific:true, isManufacturerSpecific:false, manufacturerId:0000, command:02, direction:01, data:[00, 3D, 03, 01, 00, 01, 01]]

BUTTON 3 OFF: debugsendOnOffEvent(endpoint=1, state=false)
BUTTON 3 OFF: info ON/OFF CATCHALL EF00 CLUSTER EVENT - description:catchall: 0104 EF00 01 01 0040 00 CC41 01 00 0000 02 01 003E0301000100 | parseMap:[raw:catchall: 0104 EF00 01 01 0040 00 CC41 01 00 0000 02 01 003E0301000100, profileId:0104, clusterId:EF00, clusterInt:61184, sourceEndpoint:01, destinationEndpoint:01, options:0040, messageType:00, dni:CC41, isClusterSpecific:true, isManufacturerSpecific:false, manufacturerId:0000, command:02, direction:01, data:[00, 3E, 03, 01, 00, 01, 00]]```

Sorry, been very busy lately, tthe data would need decoding, from the looks of it the first byte you can ignore, the second byte is a counter and the third is the button number. The last byte is the state, 0 = off, 1 = on

Hey @markus, no worries. I decided to code my own driver but I stuck on the architecture :see_no_evil: been playing with child devices for each switch but this quickly got too complicated

By setting the id according to endpoint number it should make it rather straight forward.

It may not be very straight forward, and looking at my drivers might just confuse things due to how I auto-build them. If you need pointers, feel free to ask though :slight_smile:

1 Like