[BETA] Tuya Zigbee mmWave Sensors

seems to be related to the OS upgrade
2.3.9.200 - fading was at 1, working amazingly; moving out of the room, in a second lights dimmed

2.4.3.137 no change, with fading at 20, motion status often conflicting with physical state. Often reporting as inactive for present nad vice versa, but it's not always inverted

illuminance reporting is working still flawlessly, within seconds

It would be really weird if the HE platform version is the reason for this strange behavior…. I still think that it is more likely the reason to be in the driver, there were a lot of changes in it.

Can you download and try the Last ‘hardcoded’ mmWave driver version 3.5.2 from this Google Drive archive?

The name of the driver will contain 3.5.2. Change the ‘device type’ to the old driver and load the defaults. if your device works with the old driver version, then the problem is not in the HE platform.

  • downgraded the platform, managed to get the sensor to respond
    BUT: motion value is INVERTED :smiley: ?!
  • platform upgrade: functioning but inverted motion remained

  • downgraded driver 3.5.2 reports motion properly
  • upgraded driver to latest : motion inversion returned
1 Like

I have moved this device back to the TS0601_TUYA_RADAR profile, so the motion state being inverted problem should be fixed now.

Click on the "Load Standard Profiles From Local Storage" command button. The "deviceProfilesV4_mmWave.json" file version is 4.0.8, "timestamp": "2025-10-18 11:13 AM".

Hi @andrea.veroni @njanda ,

This is a new device, not included in the base device profiles JSON file.
Lets try to troubleshoot and fine-tune the device using a custom profile.

On your PC, create a file named for example "deviceProfilesV4_mmWave_NAS_PS10B2.json" and then copy and paste the JSON below:

{
  "deviceProfiles": {
    "CUSTOM_NAS_PS10B2": {
      "description": "Human Presence Sensor Light Switch",
      "device": { "powerSource": "dc", "tuyaDelay": "2000" },
      "capabilities": { "MotionSensor": true, "HumanMotionState": true, "DistanceMeasurement": true, "IlluminanceMeasurement": true, "Switch": true },
      "preferences": { "radarSensitivity": "15", "maximumDistance": "13", "staticDetectionSensitivity": "16", "fadingTime": "12", "ledIndicator": "105", "switch": "101", "switchOnTime": "103" },
      "commands": { "resetStats": "" },
      "fingerprints": [
        { "profileId": "0104", "endpointId": "01", "inClusters": "0000,0004,0005,EF00", "outClusters": "0019,000A", "model": "TS0601", "manufacturer": "_TZE204_1youk3hj", "deviceJoinName": "Haozee Human Presence Sensor Light Switch" },
        { "profileId": "0104", "endpointId": "01", "inClusters": "0000,0004,0005,EF00", "outClusters": "0019,000A", "model": "TS0601", "manufacturer": "_TZE284_1youk3hj", "deviceJoinName": "NEO NAS-PS10B2 Human Presence Sensor" }
      ],
      "tuyaDPs": [
        { "dp": 1, "name": "motion", "type": "enum", "rw": "ro", "min": 0, "max": 1, "defVal": "0", "map": { "0": "inactive", "1": "active" }, "description": "Presence state" },
        { "dp": 11, "name": "humanMotionState", "type": "enum", "rw": "ro",  "min": 0, "max": 2, "defVal": "0", "map": { "0": "none", "1": "small", "2": "large" }, "description": "Human Motion State" },
        { "dp": 12, "name": "fadingTime", "type": "number", "rw": "rw", "min": 3, "max": 600, "defVal": 60, "scale": 1, "unit": "seconds", "title": "<b>Fading time</b>", "description": "<i>Presence Timeout (motion keep time)</i>" },
		{ "dp": 13, "name": "maximumDistance", "type": "decimal", "rw": "rw", "min": 1.5, "max": 6.0, "defVal": 6.0, "scale": 100, "unit": "meters", "title": "<b>Detection distance</b>", "description": "<i>Detection distance</i>" },
		{ "dp": 15, "name": "radarSensitivity", "type": "number", "rw": "rw", "min": 0, "max": 7, "defVal": 5, "scale": 1, "unit": "", "title": "<b>Motion Detection Sensitivity</b>", "description": "<i>Motion Sensitivity</i>" },
        { "dp": 16, "name": "staticDetectionSensitivity", "type": "number", "rw": "rw", "min": 0, "max": 7, "defVal": 3, "scale": 1, "unit": "x", "title": "<b>Static Detection Sensitivity</b>", "description": "<i>Motionless Detection Sensitivity</i>" },
        { "dp": 19, "name": "distance", "type": "decimal", "rw": "ro", "min": 0.0, "max": 6.0, "defVal": 0.0, "scale": 100, "unit": "meters", "description": "Distance to target" },
        { "dp": 101, "name": "switch", "type": "enum", "rw": "rw", "map": { "0": "manual", "1": "auto" }, "defVal": "1", "title": "<b>Switch Work Mode</b>", "description": "<i>Switch Work Mode</i>" },
        { "dp": 102, "name": "illuminance", "type": "enum", "rw": "ro", "map": { "0": "10", "1": "20", "2": "50", "3": "100" }, "title": "<b>Illuminance</b>", "description": "<i>Illuminance threshold for automation</i>" },
		{ "dp": 103, "name": "switchOnTime", "type": "number", "rw": "rw", "min": 10, "max": 1800, "defVal": 30, "scale": 1, "unit": "seconds", "title": "<b>Switch ON time</b>", "description": "<i>Switch On timeout</i>" },
		{ "dp": 104, "name": "switchState", "type": "enum", "rw": "ro",  "min": 0, "max": 1, "defVal": "0", "map": { "0": "OFF", "1": "ON" }, "title": "<b>Switch</b>", "description": "<i>Switch state</i>" },
		{ "dp": 105, "name": "ledIndicator", "type": "enum", "rw": "rw", "map": { "0": "OFF", "1": "ON" }, "defVal": "1", "title": "<b>LED indicator</b>", "description": "<i>Power LED indicator</i>" }
      ],
      "refresh": ["queryAllTuyaDP"],
      "spammyDPsToIgnore": [19],
      "spammyDPsToNotTrace": [19],
      "comments": [
        "NEO NAS-PS10B2 Human presence sensor",
        "https://www.zigbee2mqtt.io/devices/NAS-PS10B2.html",
        "https://github.com/Koenkk/zigbee-herdsman-converters/blob/master/src/devices/neo.ts#L438",
        "https://community.hubitat.com/t/beta-tuya-zigbee-mmwave-sensors/137410/401?u=kkossev"
      ] 
    }
  },
  "version": "1.0.2",
  "timestamp": "2025-10-18 5:56 PM",
  "description": "CUSTOM Device profile for NEO NAS-PS10B2 Human presence sensor",
  "author": "andrea.veroni & kkossev"
}


EDIT: updated to ver 1.0.1
EDIT: updated to ver 1.0.2 "2025-10-18 5:56 PM"


Then, copy the "deviceProfilesV4_mmWave_NAS_PS10B2.json" file to your HE hub File Manager.

Enter the file name (including the .json extension) into the 'Load User Custom Profiles From Local Storage' parameter field and click on the Run button:
image

If the custom device profile JSON was parsed successfuly, you should see this :
image

Refresh the page and check whether the new device profile was selected automatically :
image


Let me know if the steps above were succesful and what is working or not.

if not (as in my case. because I don't have the exact device and the automatic matching will not work) - set the device profile manually :

1 Like

@andrea.veroni @njanda please hold on until the next update, now I realize that you both have the same device, but built on two different Tuya-OS chipsets : _TZE204_1youk3hj and _TZE284_1youk3hj
I will change the custom JSON datapaints names to match Adrea's custom JSON 'data points' and attributes definitions, and will also look at the delay between the commands issue.

1 Like

@kkossev my device is actually working correctly other than having to set properties individually via single command, but that’s not a big issue for me since once tuned for the room I kinda never touch it again :sweat_smile:

I guess it will work the same for @njanda with my json, though the one you posted should work too…

Just let me know when you will release next beta version so I can test and give you some feedback, at least with the sensors I own.

1 Like

Ok, many thanks.
I’ll take a crack at this in a few hours.
FYI: using @andrea.veroni earlier .json file, basic motion detection seemed to be the only thing that worked so any improvement on that will be awesome as I have 2 of these sensors, destined for bathrooms. I’m hoping that we can get some sort of illumination reporting happening so at night, lights can be triggered at a lower level.

You can try the custom JSON pasted in the post above.

I am not sure whether this device reports the illuminance (to be used in hub automation ), or this is a kind of threshold setting that determines an automatic activation of the built in relay when the ‘switch’ preference is set to ‘automatic’ ?

1 Like

I can report that the 1st step went well...
image

But the driver was not automatically detected...
image

but it was selectable from 'preferences page'
image

and it now looks like...

Sensor only detects motion (active) and goes to (inactive) after some period.
Current States shows :
Fading Time : (changeable via pref's)
Human Motion State (always as none)
Humidity (always as 1)
Power Source (always as DC) note: this is AC powered device

Ok, I was using the v1.0.1 file
image

1 Like

Ah yes, I think you are correct because in the little 31 page manual that came with the sensor it does mention "Light Value".
It says
(5) Light Value
can be set to 10lux, 20lux, 50lux and 24h; the output switch will be activated when the light value is equal to or less than the set value

Interestingly I see an actual relay, on the PCB

1 Like

I have updated both the custom JSON (ver 1.0.2) and the driver code (ver 4.2.1).

There is a new 'tuyaDelay' settings in the device profile @andrea.veroni
image

@njanda send a 'LOAD ALL DEFAULTS' command from the Configure drop-down menu and then re-load the new custom JSON file. There should not be a humidity attribute for this device, most probably it is a leftover from other device profiles that you have tested.

If this setting only applies when the 'work mode' is set to automatic, it's better to remove the IlluminanceMeasurement capability for this device profile.

1 Like

Unfortunately I don’t see a way this relay could be controlled from the hub, independently from what the current illumination measurement is. Seems it was designed for fully offline lights control, same operation as the dumb light sensor & switch control devices.

1 Like

The json file has been updated and the driver cleaned out as below....
image

I was about to say that I tried setting the Fading Time and it appeared that it is not updating , as it shows "30" where as logs show that I updated it to 76..


BUT
Fading Time is updated if 'Advanced Options' is selected and saved. Maybe it should only be visible when 'Advanced Options' is enabled ?

Please update manually the driver code as well, should be 4.2.1.
This version supports configurable delay between the Zigbee commands - something that I suspect that may be a reason for some configuration commands to fail.

1 Like

Thank you.
I have it loaded now....

Motion and Switch State change now, when motion is detected

1 Like

Hi @kkossev,

Thansk again for your work! Could you please add support to this device:

fingerprint profileId:"0104", endpointId:"01", inClusters:"0000,0003,0500,EF00,0402,0405,0001,0400", outClusters:"0003", model:"TS0601", manufacturer:"_TZE200_vuqzj1ej", controllerType: "ZGB"

Thank you again!

1 Like

The inClusters list is matching the HOBEIAN radar model ZG-204ZV ...

Download this custom JSON file :
https://raw.githubusercontent.com/kkossev/Hubitat/refs/heads/development/Drivers/Tuya%20Zigbee%20mmWave%20Sensor/customDeviceProfiles/deviceProfilesV4_mmWave_TS0601_HOBEIAN_RADAR.json

Store it on your PC as "deviceProfilesV4_mmWave_TS0601_HOBEIAN_RADAR.json".

Then, transfer it to your Hub Local File Manager

Copy the "deviceProfilesV4_mmWave_TS0601_HOBEIAN_RADAR.json" filanameme and paste it into the "Load User Custom Profiles ..." input field, then click on the Run button :
image

The 'Current States' status attribute should show a success message :
image

Refresh the HE device web page, then go to the Preferences tab. If the HOBEIAN custom profile is not selected automatically in the 'Device Profile' preference, select it manually :

Double-check that the TS0601_HOBEIAN_RADAR is shown in the State Variables section :
image


If you click on the 'Refresh' button, do you see the current device preferences/attributes populated in the 'Current States'? (Some Tuya devices will respond to this Refresh command, others will not...)

If Refresh is not working, power off the sensor for 15 seconds and then power it back on. Do you see a lot of Zigbee messages in the live log? The current states should be updated as well. Refresh the browser web page and make a screenshot of the Current States - this is needed to catch the factory default settings when a new device is paired to HE for the first time.

The latest driver version should also show the temperature and the humidity readings if reported by the device.

1 Like

Thanks for you detailed message. It worked for the motion (partialy), iluminance and humidity (but it doesn't show as a humidity device for another app I'm trying to use with) and the power source (I'm using it connected to a USB C Cable but Current State says Battery). I can't control the detection distance neither even with the advanced options enabled. This is the log I get as soon as I disconnect and connect it again:


For the motion inactive I get this in the log but the driver it shows like active:
Human Presence Bathroom First Floor New motion is inactive (raw:0) (no change)

Hi @kkossev, You must have the patience of a saint and thank you again for all your efforts as it sure looks like there is something very erratic with these Tuya Human sensors.
Unfortunately, there are so many variables at play that I am finding it difficult to pin something down to repeatable patterns of events.
e.g. I have 2 of the same sensors, which were both reset to DEVICE and cleared of any data before I started updating them using your latest driver and profile (or so I thought)
Yet, 1 of the sensors turns on its indicator LED when motion is detected and the other 1 does not. Its LED just stays dark BUT the sensor detects and registers motion very nicely.
I thought to use the 'LED Indicator' parameter but despite what I do on the Preferences page, it always is showing in 'Current Status' as 1.
And overnight, or was it because I turned "Switch Work Mode' to Manual, illuminace value changed

But probably most weird is changing Fading Time (FT) does not appear to 'register' in 'Current Status' unless LED Indicator is toggled ON/OFF and saved. (the logs show it changed)
FT= 60. set FT as 38 & LED Off + Save then..refresh......FT still shows 60
FT= 60. set FT as 38 & LED ON + Save then..refresh......FT still shows 60
FT= 60. set FT as 38 & LED Off + Save then..refresh......FT still shows 60
FT=60. set FT as 38 & LED ON + save = FT showing as 38
Having said that I do not see the actual FT as relating to any actual seconds in operation !
Rather the more motion there is infront of a sensor, the longer it takes to reset to 'inactive'

As it stands, I can make use of the motion detection function in my Guest bathroom and rather than cut a hole in the wall or ceiling for the semsor, I've dremel'd a plugin solution that is working well.

1 Like