Driver Support for Zigbee Model TS110E Zigbee Manufacturer _TZ3210_ngqk6jia

I have seen community based drivers for this device but they don't seem to support the model ending in E. I can turn on and off with generic dimmer driver, but no luck on dimmer. Any advice.

Is it this module?

You can try this test driver version : (link)

First, make sure the Debug logging option is on. Next, click on the Configure button.
The driver will create two child devices if they did not exist.

Please copy and paste here what is in the debug logs when you press the physical S1 and S2 buttons for more than 2-3 seconds. I suppose the bulbs brightness should go up or down?
Can you confirm that you can control the bulbs levels from the switch physical buttons?

1 Like

I have the dual gang version of the E and this driver doesn't seem to enumerate the second channel.

Also surprisingly the switch inputs seem to only support momentary and not toggle. I hope that something I can resolve!

Most probably your device is different than these, which are already supported in this driver.
Please post the information from the device web page 'Data' section (Model, Manufacturer, etc...)

So, i modified the driver and added the mfg ID below in place of _TZ3210_ngqk6jia in the @Field static def modelConfigs

  • endpointId: 01
  • application: 40
  • manufacturer: _TZ3210_3mpwqzuu
  • model: TS110E

Seems to work good now.

This is the module I got. My only gripes are that it doesn't support toggle, and parameters like switch state isn't passed (likely a driver issue)

Also, for others, in case you didn't know, you can easily convert Decora toggle switches to momentary switches. Here's a tutorial

1 Like

also, I've noticed that control of parent doesn't control channel 2. (eg: on\off\setlevel on parent controls ch1, but not ch2)

Have you paired the dimmer with the modified driver?
The best approach will be to delete the device from HE ('REMOVE DEVICE' button), then pair it again. The modified driver must be selected automatically during the pairing process. Only during the pairing process short time window the TuyaMagic spell will have an effect, allowing the two channels to be controlled individually.

EDIT: I see now you describe another problem. Anyway, pairing with this driver selected automatically must be done at least once.

Yup, I've paired it w/ modified driver. No dice

OK, will continue troubleshooting in the next days.

@marcopolo did you manage to make this dimmer work?

Which Device profile/group? (Tuya, Girier or Lonsonho ) ?

Hi @kkossev !

Been playing around with the _TZ3210_3mpwqzuu as well.
Driver ver 0.6.2 2023/09/09 kkossev

Paired and configured OK, physical switch change reflects well for me, only issue I see now is the level setting.

I set it to 30%, it shows the change under Current States, then when I click Refresh it changes to 100. Happens on both parent/EP01 and EP02.

Here is a log dump:

dev:20112023-09-23 18:09:20.742infotest dimmer2 test dimmer2 was turned on [digital]
dev:20112023-09-23 18:09:20.739tracetest dimmer2 parse: replicating switchState in parent
dev:20112023-09-23 18:09:20.737infotest dimmer2 test dimmer2 level was set to 100 [digital]
dev:20112023-09-23 18:09:20.731tracetest dimmer2 onSwitchLevel: Value=255 level=100 (value=255)
dev:20112023-09-23 18:09:20.729tracetest dimmer2 valueToLevel: raw value:255 reScaled=100 (isParent=true, isTS0601=false)
dev:20112023-09-23 18:09:20.727debugtest dimmer2 parse: replicating switchLevel in parent
dev:20122023-09-23 18:09:20.725infoTuya 2-gang Dimmer module (CH01) Tuya 2-gang Dimmer module (CH01) was turned on [physical]
dev:20122023-09-23 18:09:20.722infoTuya 2-gang Dimmer module (CH01) Tuya 2-gang Dimmer module (CH01) level was set to 100 [physical]
dev:20112023-09-23 18:09:20.720tracetest dimmer2 on/off endpoint=01 isFirst=true this=test dimmer2 child=Tuya 2-gang Dimmer module (CH01) value=1
dev:20112023-09-23 18:09:20.717tracetest dimmer2 parse: on/off cluster 0x0006 command 0A attribute 0000 value 1
dev:20112023-09-23 18:09:20.700tracetest dimmer2 sendHealthStatusEventAll: online DW=test dimmer2 size = 2
dev:20112023-09-23 18:09:20.697tracetest dimmer2 getChildByEndpointId(01) returning getChildDevice: Tuya 2-gang Dimmer module (CH01) (childDNI=E130-01)
dev:20112023-09-23 18:09:20.695tracetest dimmer2 getChildByEndpointId endpointId=01
dev:20112023-09-23 18:09:20.692tracetest dimmer2 parse: received descMap: [raw:E1300100060800001001, dni:E130, endpoint:01, cluster:0006, size:08, attrId:0000, encoding:10, command:0A, value:01, clusterInt:6, attrInt:0]
dev:20112023-09-23 18:09:20.687debugtest dimmer2 parse: received raw description: read attr - raw: E1300100060800001001, dni: E130, endpoint: 01, cluster: 0006, size: 08, attrId: 0000, encoding: 10, command: 0A, value: 01
dev:20112023-09-23 18:09:20.679debugtest dimmer2 parse: Tuya/Girier/OEM: child.onSwitchLevel value=255 child=Tuya 2-gang Dimmer module (CH01)
dev:20112023-09-23 18:09:20.676debugtest dimmer2 parse: switch level cluster 0x0008 endpoint 01 command 0A attrId 0000 value raw 255)
dev:20112023-09-23 18:09:20.659tracetest dimmer2 sendHealthStatusEventAll: online DW=test dimmer2 size = 2
dev:20112023-09-23 18:09:20.657tracetest dimmer2 getChildByEndpointId(01) returning getChildDevice: Tuya 2-gang Dimmer module (CH01) (childDNI=E130-01)
dev:20112023-09-23 18:09:20.654tracetest dimmer2 getChildByEndpointId endpointId=01
dev:20112023-09-23 18:09:20.652tracetest dimmer2 parse: received descMap: [raw:E13001000808000020FF, dni:E130, endpoint:01, cluster:0008, size:08, attrId:0000, encoding:20, command:0A, value:FF, clusterInt:8, attrInt:0]
dev:20112023-09-23 18:09:20.649debugtest dimmer2 parse: received raw description: read attr - raw: E13001000808000020FF, dni: E130, endpoint: 01, cluster: 0008, size: 08, attrId: 0000, encoding: 20, command: 0A, value: FF
dev:20112023-09-23 18:09:19.905debugtest dimmer2 parse: catchall received confirmation from clusterId=0006 for command=0B data=[01, 00]
dev:20112023-09-23 18:09:19.903tracetest dimmer2 parse: catchall clusterId=0006 command=0B data=[01, 00]
dev:20112023-09-23 18:09:19.901tracetest dimmer2 parse: received descMap: [raw:catchall: 0104 0006 01 01 0040 00 E130 00 00 0000 0B 01 0100, profileId:0104, clusterId:0006, clusterInt:6, sourceEndpoint:01, destinationEndpoint:01, options:0040, messageType:00, dni:E130, isClusterSpecific:false, isManufacturerSpecific:false, manufacturerId:0000, command:0B, direction:01, data:[01, 00]]
dev:20112023-09-23 18:09:19.897debugtest dimmer2 parse: received raw description: catchall: 0104 0006 01 01 0040 00 E130 00 00 0000 0B 01 0100
dev:20112023-09-23 18:09:19.854debugtest dimmer2 parse: catchall received confirmation from clusterId=0008 for command=0B data=[04, 00]
dev:20112023-09-23 18:09:19.852tracetest dimmer2 parse: catchall clusterId=0008 command=0B data=[04, 00]
dev:20112023-09-23 18:09:19.850tracetest dimmer2 parse: received descMap: [raw:catchall: 0104 0008 01 01 0040 00 E130 00 00 0000 0B 01 0400, profileId:0104, clusterId:0008, clusterInt:8, sourceEndpoint:01, destinationEndpoint:01, options:0040, messageType:00, dni:E130, isClusterSpecific:false, isManufacturerSpecific:false, manufacturerId:0000, command:0B, direction:01, data:[04, 00]]
dev:20112023-09-23 18:09:19.847debugtest dimmer2 parse: received raw description: catchall: 0104 0008 01 01 0040 00 E130 00 00 0000 0B 01 0400
dev:20112023-09-23 18:09:19.804debugtest dimmer2 sendZigbeeCommands: [he cmd 0xE130 0x01 0x0008 4 { 0xFF 0x0000 }, he cmd 0xE130 0x01 0x0006 1 {}]
dev:20112023-09-23 18:09:19.802debugtest dimmer2 cmdSetLevel: sending cmdTS011=[he cmd 0xE130 0x01 0x0008 4 { 0xFF 0x0000 }, he cmd 0xE130 0x01 0x0006 1 {}]
dev:20112023-09-23 18:09:19.793debugtest dimmer2 GIRIER/others: cmdSetLevel: sending value 255 cmdTS011=[he cmd 0xE130 0x01 0x0008 4 { 0xFF 0x0000 }]
dev:20112023-09-23 18:09:19.791tracetest dimmer2 cmdSetLevel: child=Tuya 2-gang Dimmer module (CH01) childDni=E130-01 value=255 duration=0
dev:20112023-09-23 18:09:19.788tracetest dimmer2 getChildByEndpointId(01) returning getChildDevice: Tuya 2-gang Dimmer module (CH01) (childDNI=E130-01)
dev:20112023-09-23 18:09:19.786tracetest dimmer2 getChildByEndpointId endpointId=01
dev:20112023-09-23 18:09:19.784tracetest dimmer2 childDniToEndpointId: childDni=E130-01 childDniPattern=^([0-9A-Za-z]+)-([0-9A-Za-z]+)$ match[0][1]=E130 match[0][2]=01 device.deviceNetworkId=E130 match=java.util.regex.Matcher[pattern=^([0-9A-Za-z]+)-([0-9A-Za-z]+)$ region=0,7 lastmatch=E130-01]
dev:20112023-09-23 18:09:19.781tracetest dimmer2 childDniToEndpointId: childDni=E130-01 childDniPattern=^([0-9A-Za-z]+)-([0-9A-Za-z]+)$ match[0][1]=E130 match[0][2]=01 device.deviceNetworkId=E130 match=java.util.regex.Matcher[pattern=^([0-9A-Za-z]+)-([0-9A-Za-z]+)$ region=0,7 lastmatch=E130-01]
dev:20112023-09-23 18:09:19.778tracetest dimmer2 levelToValue: level=100 reScaled=255 (mult=2.55, minLevel100=0, maxLevel100=255)
dev:20112023-09-23 18:09:19.752tracetest dimmer2 scheduleCommandTimeoutCheck: delay=10 isParent=true
dev:20112023-09-23 18:09:15.981infotest dimmer2 test dimmer2 level was set to 10 [digital]
dev:20112023-09-23 18:09:15.978tracetest dimmer2 onSwitchLevel: Value=26 level=10 (value=26)
dev:20112023-09-23 18:09:15.976tracetest dimmer2 valueToLevel: raw value:26 reScaled=10 (isParent=true, isTS0601=false)
dev:20112023-09-23 18:09:15.973debugtest dimmer2 parse: replicating switchLevel in parent
dev:20112023-09-23 18:09:15.971infotest dimmer2 test dimmer2 was turned on [digital]
dev:20112023-09-23 18:09:15.967tracetest dimmer2 parse: replicating switchState in parent
dev:20122023-09-23 18:09:15.948infoTuya 2-gang Dimmer module (CH01) Tuya 2-gang Dimmer module (CH01) was turned on [physical]
dev:20122023-09-23 18:09:15.946infoTuya 2-gang Dimmer module (CH01) Tuya 2-gang Dimmer module (CH01) level was set to 10 [physical]
dev:20112023-09-23 18:09:15.938tracetest dimmer2 on/off endpoint=01 isFirst=true this=test dimmer2 child=Tuya 2-gang Dimmer module (CH01) value=1
dev:20112023-09-23 18:09:15.935tracetest dimmer2 parse: on/off cluster 0x0006 command 0A attribute 0000 value 1
dev:20112023-09-23 18:09:15.902tracetest dimmer2 sendHealthStatusEventAll: online DW=test dimmer2 size = 2
dev:20112023-09-23 18:09:15.900tracetest dimmer2 getChildByEndpointId(01) returning getChildDevice: Tuya 2-gang Dimmer module (CH01) (childDNI=E130-01)
dev:20112023-09-23 18:09:15.895tracetest dimmer2 getChildByEndpointId endpointId=01
dev:20112023-09-23 18:09:15.893tracetest dimmer2 parse: received descMap: [raw:E1300100060800001001, dni:E130, endpoint:01, cluster:0006, size:08, attrId:0000, encoding:10, command:0A, value:01, clusterInt:6, attrInt:0]
dev:20112023-09-23 18:09:15.890debugtest dimmer2 parse: received raw description: read attr - raw: E1300100060800001001, dni: E130, endpoint: 01, cluster: 0006, size: 08, attrId: 0000, encoding: 10, command: 0A, value: 01
dev:20112023-09-23 18:09:15.882debugtest dimmer2 parse: Tuya/Girier/OEM: child.onSwitchLevel value=26 child=Tuya 2-gang Dimmer module (CH01)
dev:20112023-09-23 18:09:15.879debugtest dimmer2 parse: switch level cluster 0x0008 endpoint 01 command 0A attrId 0000 value raw 26)
dev:20112023-09-23 18:09:15.862tracetest dimmer2 sendHealthStatusEventAll: online DW=test dimmer2 size = 2
dev:20112023-09-23 18:09:15.859tracetest dimmer2 getChildByEndpointId(01) returning getChildDevice: Tuya 2-gang Dimmer module (CH01) (childDNI=E130-01)
dev:20112023-09-23 18:09:15.857tracetest dimmer2 getChildByEndpointId endpointId=01
dev:20112023-09-23 18:09:15.854tracetest dimmer2 parse: received descMap: [raw:E130010008080000201A, dni:E130, endpoint:01, cluster:0008, size:08, attrId:0000, encoding:20, command:0A, value:1A, clusterInt:8, attrInt:0]
dev:20112023-09-23 18:09:15.851debugtest dimmer2 parse: received raw description: read attr - raw: E130010008080000201A, dni: E130, endpoint: 01, cluster: 0008, size: 08, attrId: 0000, encoding: 20, command: 0A, value: 1A
dev:20112023-09-23 18:09:15.129debugtest dimmer2 parse: catchall received confirmation from clusterId=0006 for command=0B data=[01, 00]
dev:20112023-09-23 18:09:15.127tracetest dimmer2 parse: catchall clusterId=0006 command=0B data=[01, 00]
dev:20112023-09-23 18:09:15.124tracetest dimmer2 parse: received descMap: [raw:catchall: 0104 0006 01 01 0040 00 E130 00 00 0000 0B 01 0100, profileId:0104, clusterId:0006, clusterInt:6, sourceEndpoint:01, destinationEndpoint:01, options:0040, messageType:00, dni:E130, isClusterSpecific:false, isManufacturerSpecific:false, manufacturerId:0000, command:0B, direction:01, data:[01, 00]]
dev:20112023-09-23 18:09:15.121debugtest dimmer2 parse: received raw description: catchall: 0104 0006 01 01 0040 00 E130 00 00 0000 0B 01 0100
dev:20112023-09-23 18:09:15.081debugtest dimmer2 parse: catchall received confirmation from clusterId=0008 for command=0B data=[04, 00]
dev:20112023-09-23 18:09:15.079tracetest dimmer2 parse: catchall clusterId=0008 command=0B data=[04, 00]
dev:20112023-09-23 18:09:15.053tracetest dimmer2 parse: received descMap: [raw:catchall: 0104 0008 01 01 0040 00 E130 00 00 0000 0B 01 0400, profileId:0104, clusterId:0008, clusterInt:8, sourceEndpoint:01, destinationEndpoint:01, options:0040, messageType:00, dni:E130, isClusterSpecific:false, isManufacturerSpecific:false, manufacturerId:0000, command:0B, direction:01, data:[04, 00]]
dev:20112023-09-23 18:09:15.050debugtest dimmer2 parse: received raw description: catchall: 0104 0008 01 01 0040 00 E130 00 00 0000 0B 01 0400
dev:20112023-09-23 18:09:14.973debugtest dimmer2 sendZigbeeCommands: [he cmd 0xE130 0x01 0x0008 4 { 0x1A 0x0000 }, he cmd 0xE130 0x01 0x0006 1 {}]
dev:20112023-09-23 18:09:14.971debugtest dimmer2 cmdSetLevel: sending cmdTS011=[he cmd 0xE130 0x01 0x0008 4 { 0x1A 0x0000 }, he cmd 0xE130 0x01 0x0006 1 {}]
dev:20112023-09-23 18:09:14.965debugtest dimmer2 GIRIER/others: cmdSetLevel: sending value 26 cmdTS011=[he cmd 0xE130 0x01 0x0008 4 { 0x1A 0x0000 }]
dev:20112023-09-23 18:09:14.961tracetest dimmer2 cmdSetLevel: child=Tuya 2-gang Dimmer module (CH01) childDni=E130-01 value=26 duration=0
dev:20112023-09-23 18:09:14.959tracetest dimmer2 getChildByEndpointId(01) returning getChildDevice: Tuya 2-gang Dimmer module (CH01) (childDNI=E130-01)
dev:20112023-09-23 18:09:14.956tracetest dimmer2 getChildByEndpointId endpointId=01
dev:20112023-09-23 18:09:14.954tracetest dimmer2 childDniToEndpointId: childDni=E130-01 childDniPattern=^([0-9A-Za-z]+)-([0-9A-Za-z]+)$ match[0][1]=E130 match[0][2]=01 device.deviceNetworkId=E130 match=java.util.regex.Matcher[pattern=^([0-9A-Za-z]+)-([0-9A-Za-z]+)$ region=0,7 lastmatch=E130-01]
dev:20112023-09-23 18:09:14.950tracetest dimmer2 childDniToEndpointId: childDni=E130-01 childDniPattern=^([0-9A-Za-z]+)-([0-9A-Za-z]+)$ match[0][1]=E130 match[0][2]=01 device.deviceNetworkId=E130 match=java.util.regex.Matcher[pattern=^([0-9A-Za-z]+)-([0-9A-Za-z]+)$ region=0,7 lastmatch=E130-01]
dev:20112023-09-23 18:09:14.947tracetest dimmer2 levelToValue: level=10 reScaled=26 (mult=2.55, minLevel100=0, maxLevel100=255)
dev:20112023-09-23 18:09:14.919tracetest dimmer2 scheduleCommandTimeoutCheck: delay=10 isParent=true

My pairing info:

Manufacturer:	_TZ3210_3mpwqzuu
Endpoint 01 application:	40
Endpoint 01 endpointId:	01
Endpoint 01 idAsInt:	1
Endpoint 01 inClusters:	0004,0005,0003,0006,0008,EF00,0000
Endpoint 01 initialized:	true
Endpoint 01 manufacturer:	_TZ3210_3mpwqzuu
Endpoint 01 model:	TS110E
Endpoint 01 outClusters:	0019,000A
Endpoint 01 profileId:	0104
Endpoint 01 stage:	4
Endpoint 02 application:	unknown
Endpoint 02 endpointId:	02
Endpoint 02 idAsInt:	2
Endpoint 02 inClusters:	0004,0005,0003,0006,0008,EF00
Endpoint 02 initialized:	true
Endpoint 02 manufacturer:	unknown
Endpoint 02 model:	unknown
Endpoint 02 profileId:	0104
Endpoint 02 stage:	4

A getInfo() dump and Data:

dev:20112023-09-23 18:14:26.408infoCOPY AND PASTE THIS ROW TO THE DEVELOPER: fingerprint model:"TS110E", manufacturer:"_TZ3210_3mpwqzuu", profileId:"0104", endpointId:"01", inClusters:"0004,0005,0003,0006,0008,EF00,0000", outClusters:"0019,000A", application:"40"
dev:20112023-09-23 18:14:26.406traceApplication: 40
dev:20112023-09-23 18:14:26.403traceModel: TS110E
dev:20112023-09-23 18:14:26.400traceManufacturer: _TZ3210_3mpwqzuu
Data	
endpointId: 01
application: 40
endpointId: 01
inClusters: 0004,0005,0003,0006,0008,EF00,0000
manufacturer: _TZ3210_3mpwqzuu
model: TS110E
outClusters: 0019,000A
profileId: 0104

If you don’t click on the Refresh button, is the brightness set correctly from the Level command? Also, if the level is changed from the dimmer knobs, is it reflected correctly in HE?

I may need to filter some commands in the Refresh function for this particular device.

Hi Krassimir,

I've tested and here are my notes:
If I don't click the refresh button all is good, BUT after a while it jumps to a weird value, as follows:
Under level 100 jumps to 100
At level 100 jumps to exactly 30

My guess, something is up with the 100<>254 value conversion.

When using a momentary button, a short push turns the channel on/off; a long push while off does nothing; a long push while on starts dimming up on the first long press, down on the next long press. The level change is reflected IMMEDIATELY, in steps of 1 (IMHO this is too spammy, but I don't know if something can be done about it -- Ikea blinds for example report in steps of 10-15 percent, perhaps on a timer, but I suspect it's hardcoded).

I have the relay connected and ready for any other test you may need.

The problem is that there are at least 4 different ways that the different Tuya dimmers report the brightness level, and for your particular manufacturer we must filter out only one of the data formats.

As I am alway from home till the end and T this week, we can do it in the next week.

Hi. I live in the UK but I've got a house in Poland. I've used the above driver over a year ago and it's been working fine but now I went to Poland for Christmas and I've found out that I've lost ch1 and ch2 it's like a single channel dimmer switch now. Any ideas?

Give some more details - device model. manufacturer and the driver version.
Has anything changed lately?


Hi,

I hve somre trouble adding a 2CH Zigbee Dimmer Module.

the Device pairing info is:

Manufacturer: _TZ3210_wdexaypg
Endpoint 01 application: 41
Endpoint 01 endpointId: 01
Endpoint 01 idAsInt: 1
Endpoint 01 inClusters: 0004,0005,0003,0006,0008,EF00,0000
Endpoint 01 initialized: true
Endpoint 01 manufacturer: _TZ3210_wdexaypg
Endpoint 01 model: TS110E
Endpoint 01 outClusters: 0019,000A
Endpoint 01 profileId: 0104
Endpoint 01 stage: 4
Endpoint 02 application: unknown
Endpoint 02 endpointId: 02
Endpoint 02 idAsInt: 2
Endpoint 02 inClusters: 0004,0005,0003,0006,0008,EF00
Endpoint 02 initialized: true
Endpoint 02 manufacturer: unknown
Endpoint 02 model: unknown
Endpoint 02 profileId: 0104
Endpoint 02 stage: 4

In the beginning, I used the drivers from this github:

https://raw.githubusercontent.com/kkossev/hubitat-matt-hammond-fork/master/drivers/tuya-zigbee-dimmer-module.groovy

once the device is added using the driver no child device is created after clicking on configure. So I checked the code looking for the manufacturer based on the device pairing info.I don’t find the manufacturer TZ3210_wdexaypg but I do find this part of the model TS110E TZ3210

I’m not a programmer and I don’t know what to change to make it work.

@kkossev could you please help me sorting this out.

thanks

1 Like

Please update the driver manually to the dev. branch version "0.7.3" "2024/09/27 7:44 AM" and let me know whether it works.

https://raw.githubusercontent.com/kkossev/hubitat-matt-hammond-fork/development/drivers/tuya-zigbee-dimmer-module.groovy

Hello KKosev,

The driver worked.

The only problem that I have is that the mechanical switch should be like the one here that you commented before on an other post:

Is there any way to chage the external switch operating mode from momentarily to on/off.
I just got back from the store and I cant find a switch momentary for the same plate color and my wife will kill me if I dont match all her plates.
thanks

I was reading about the on/off and looks like there isno way to do so in the driver. @kkossev am I correct that can not be changed?