### Link
https://nedis.de/de-de/product/haushalt-und-wohnen/klima/heizung/55078…6152/smartlife-heizkorpersteuerung-zigbee-30-batteriebetrieben-led-android-ios
### Database entry
{ "id": 2, "type": "EndDevice", "ieeeAddr": "0xa4c138a9adee5729", "nwkAddr": 51184, "manufId": 4417, "manufName": "_TZE200_ne4pikwm", "powerSource": "Battery", "modelId": "TS0601", "epList": [ 1 ], "endpoints": { "1": { "profId": 260, "epId": 1, "devId": 81, "inClusterList": [ 4, 5, 61184, 0 ], "outClusterList": [ 25, 10 ], "clusters": { "genBasic": { "attributes": { "65503": "\u0000\u0000\u0000\u0000\u0011\u0004\u0000\u0000\u0000f~9Q-\u0012", "65506": 55, "65508": 0, "65534": 0, "stackVersion": 0, "dateCode": "", "manufacturerName": "_TZE200_ne4pikwm", "zclVersion": 3, "appVersion": 67, "modelId": "TS0601", "powerSource": 3 } } }, "binds": [], "configuredReportings": [], "meta": {} } }, "appVersion": 67, "stackVersion": 0, "hwVersion": 1, "dateCode": "", "zclVersion": 3, "interviewCompleted": true, "meta": { "configured": -708457359 }, }
### Comments
Hi, today i spend the day trying to get a Nedis ZBHTR20WT Smart Thermostatic Radiator Value working.
As i don't have access to a tuya gateway, i cannot perform the recommended steps (see [supporting new tuya devices](https://www.zigbee2mqtt.io/advanced/support-new-devices/02_support_new_tuya_devices.html)) and had to rely on guesswork and testing with implementations of other tuya converters for comparable (maybe whitelabel) products.
This is as far as i got with the adapted external definition (see below).

I need help from someone who maybe has a working setup to get extended functions like Battery State, Anti-Scaling, Window Open Sensor going.
Testing State:
- Current Temperatur (works and verified)
- Setpoint Temp (works and verified)
- Child Lock (works and verified)
- Window Open (shown, could not be verified)
- Anti Feeeze (shown, could not be verified - it's currently not cold enough for that)
- Local Temperature Calibration (shown, not verified)
If someone is currently tinkering with these, I hope writing my current progress down will help you completing this integration. My current feeling is, that the Nedis TRV is just a whitelabel of one of the below products.
Sadly they seem to have scambled the datapoint id's. Once these are known, you can probably copy and paste all the converters from existing implementations.
Comparable Products used as sources and inspiration for testing:
- [Siterwell](https://github.com/Koenkk/zigbee-herdsman-converters/blob/1761d8bf9bfabb6143ec14e6790aae5aee7a3a69/src/devices/siterwell.ts)
- [Sonoff TRVZB](https://github.com/Koenkk/zigbee-herdsman-converters/blob/1761d8bf9bfabb6143ec14e6790aae5aee7a3a69/src/devices/sonoff.ts#L532)
- [Tuya TV02](https://github.com/Koenkk/zigbee-herdsman-converters/blob/1761d8bf9bfabb6143ec14e6790aae5aee7a3a69/src/devices/tuya.ts#L3062)
- [Tuya TS0601_thermostat_2 to 4](https://github.com/Koenkk/zigbee-herdsman-converters/blob/1761d8bf9bfabb6143ec14e6790aae5aee7a3a69/src/devices/tuya.ts#L3165)
PS: I had some Datapoints I could not make heads or tails from. Log Lines from Debug log are in Definition as comments.
### External defintion
```shell
const fz = require('zigbee-herdsman-converters/converters/fromZigbee');
const tz = require('zigbee-herdsman-converters/converters/toZigbee');
const legacy = require('zigbee-herdsman-converters/lib/legacy');
const exposes = require('zigbee-herdsman-converters/lib/exposes');
const reporting = require('zigbee-herdsman-converters/lib/reporting');
const extend = require('zigbee-herdsman-converters/lib/extend');
const e = exposes.presets;
const ea = exposes.access;
const tuya = require("zigbee-herdsman-converters/lib/tuya");
const definition = {
fingerprint: tuya.fingerprint('TS0601', [
'_TZE200_ne4pikwm', /* modell: 'ZBHTR20WT', vendor: 'Nedis' */
]),
model: 'ZBTHR20WT',
vendor: 'Nedis',
description: '(TESTING) Thermostat radiator valve',
fromZigbee: [tuya.fz.datapoints],
toZigbee: [tuya.tz.datapoints],
onEvent: tuya.onEventSetLocalTime,
configure: tuya.configureMagicPacket,
exposes: [
e.battery_low(),
e.child_lock(),
e.open_window(),
//e.open_window_temperature().withValueMin(5).withValueMax(30),
e.climate()
.withLocalTemperatureCalibration(-5, 5, 0.1, ea.STATE_SET)
.withLocalTemperature(ea.STATE)
.withSetpoint('current_heating_setpoint', 5, 30, 0.5, ea.STATE_SET),
tuya.exposes.frostProtection('When Anti-Freezing function is activated, the temperature in the house is kept '+
'at 8 °C, the device display "AF".press the pair button to cancel.'),
// what about anti scale?
e.binary('online', ea.STATE_SET, 'ON', 'OFF').withDescription('The current data request from the device.'),
tuya.exposes.errorStatus(),
],
meta: {
tuyaDatapoints: [
[2, 'preset', tuya.valueConverter.tv02Preset()],
//Datapoint 3 not defined for '_TZE200_ne4pikwm' with value 1
[8, 'open_window', tuya.valueConverter.onOff],
[10, 'frost_protection', tuya.valueConverter.TV02FrostProtection],
//[24, 'local_temperature', tuya.valueConverter.divideBy10],
[27, 'local_temperature_calibration', tuya.valueConverter.localTempCalibration1],
//[35, 'battery_low', tuya.valueConverter.trueFalse0],
[40, 'child_lock', tuya.valueConverter.lockUnlock],
//[45, 'error_status', tuya.valueConverter.raw],
[101, 'schedule_mode', tuya.valueConverter.onOff],
[102, 'local_temperature', tuya.valueConverter.divideBy10],
[103, 'current_heating_setpoint', tuya.valueConverter.divideBy10],
[107, 'system_mode', tuya.valueConverter.TV02SystemMode],
[107, 'heating_stop', tuya.valueConverter.TV02SystemMode],
//Datapoint 110 not defined for '_TZE200_ne4pikwm' with value
//"dpValues":[{"data":{"data":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,21,15,0,0,0,0,0],"type":"Buffer"},"datatype":0,"dp":110}],"seq":3328}
[115, 'online', tuya.valueConverter.onOffNotStrict],
//Datapoint 119 not defined for '_TZE200_ne4pikwm' with value
//{"dpValues":[{"data":{"data":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,2,0,0,0,0,0],"type":"Buffer"},"datatype":0,"dp":119}],"seq":4352}
// Datapoint 132 not defined for _ with value 8 {"dpValues":[{"data":{"data":[1,24,2,3,18,56,0,6],"type":"Buffer"},"datatype":0,"dp":132}],"seq":7680}
],
},
}
module.exports = definition;
```