zigbee-herdsman-converters 14.0.296 → 14.0.297
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/converters/fromZigbee.js +121 -0
- package/converters/toZigbee.js +84 -2
- package/devices/danfoss.js +8 -1
- package/devices/eurotronic.js +4 -4
- package/devices/tuya.js +44 -2
- package/lib/tuya.js +24 -0
- package/npm-shrinkwrap.json +1 -1
- package/package.json +1 -1
package/converters/fromZigbee.js
CHANGED
|
@@ -3024,6 +3024,12 @@ const converters = {
|
|
|
3024
3024
|
result[postfixWithEndpointName('running_state', msg, model)] = 'idle';
|
|
3025
3025
|
}
|
|
3026
3026
|
}
|
|
3027
|
+
if (msg.data.hasOwnProperty('danfossLoadBalancingEnable')) {
|
|
3028
|
+
result[postfixWithEndpointName('load_balancing_enable', msg, model)] = (msg.data['danfossLoadBalancingEnable'] === 1);
|
|
3029
|
+
}
|
|
3030
|
+
if (msg.data.hasOwnProperty('danfossLoadRoomMean')) {
|
|
3031
|
+
result[postfixWithEndpointName('load_room_mean', msg, model)] = msg.data['danfossLoadRoomMean'];
|
|
3032
|
+
}
|
|
3027
3033
|
if (msg.data.hasOwnProperty('danfossLoadEstimate')) {
|
|
3028
3034
|
result[postfixWithEndpointName('load_estimate', msg, model)] = msg.data['danfossLoadEstimate'];
|
|
3029
3035
|
}
|
|
@@ -3532,6 +3538,121 @@ const converters = {
|
|
|
3532
3538
|
}
|
|
3533
3539
|
},
|
|
3534
3540
|
},
|
|
3541
|
+
haozee_thermostat: {
|
|
3542
|
+
cluster: 'manuSpecificTuya',
|
|
3543
|
+
type: ['commandGetData', 'commandSetDataResponse'],
|
|
3544
|
+
convert: (model, msg, publish, options, meta) => {
|
|
3545
|
+
const dp = msg.data.dp; // First we get the data point ID
|
|
3546
|
+
const value = tuya.getDataValue(msg.data.datatype, msg.data.data);
|
|
3547
|
+
const presetLookup = {0: 'auto', 1: 'manual', 2: 'off', 3: 'on'};
|
|
3548
|
+
switch (dp) {
|
|
3549
|
+
case tuya.dataPoints.haozeeSystemMode:
|
|
3550
|
+
return {preset: presetLookup[value]};
|
|
3551
|
+
case tuya.dataPoints.haozeeHeatingSetpoint:
|
|
3552
|
+
return {current_heating_setpoint: (value / 10).toFixed(1)};
|
|
3553
|
+
case tuya.dataPoints.haozeeLocalTemp:
|
|
3554
|
+
return {local_temperature: (value / 10).toFixed(1)};
|
|
3555
|
+
case tuya.dataPoints.haozeeBoostHeatingCountdown:
|
|
3556
|
+
// quick heating countdown
|
|
3557
|
+
return {boost_heating_countdown: value};
|
|
3558
|
+
case tuya.dataPoints.haozeeWindowDetection:
|
|
3559
|
+
// window check
|
|
3560
|
+
return {window_detection: value ? 'ON' : 'OFF'};
|
|
3561
|
+
case tuya.dataPoints.haozeeWindowState:
|
|
3562
|
+
// window state
|
|
3563
|
+
return {window: value ? 'OPEN' : 'CLOSED'};
|
|
3564
|
+
case tuya.dataPoints.haozeeChildLock:
|
|
3565
|
+
return {child_lock: value ? 'LOCK' : 'UNLOCK'};
|
|
3566
|
+
case tuya.dataPoints.haozeeBattery:
|
|
3567
|
+
// battery
|
|
3568
|
+
return {battery: value};
|
|
3569
|
+
case tuya.dataPoints.haozeeFaultAlarm:
|
|
3570
|
+
return {error: value ? 'ON': 'OFF'};
|
|
3571
|
+
case tuya.dataPoints.haozeeScheduleMonday:
|
|
3572
|
+
// Monday
|
|
3573
|
+
return {
|
|
3574
|
+
'monday_schedule': ' ' + value[1] + 'h:' + value[2] + 'm ' + value[4] / 10 + '°C' +
|
|
3575
|
+
', ' + value[5] + 'h:' + value[6] + 'm ' + value[8] / 10 + '°C' +
|
|
3576
|
+
', ' + value[9] + 'h:' + value[10] + 'm ' + value[12] / 10 + '°C' +
|
|
3577
|
+
', ' + value[13] + 'h:' + value[14] + 'm ' + value[16] / 10 + '°C ',
|
|
3578
|
+
};
|
|
3579
|
+
case tuya.dataPoints.haozeeScheduleTuesday:
|
|
3580
|
+
// Tuesday
|
|
3581
|
+
return {
|
|
3582
|
+
'tuesday_schedule': ' ' + value[1] + 'h:' + value[2] + 'm ' + value[4] / 10 + '°C' +
|
|
3583
|
+
', ' + value[5] + 'h:' + value[6] + 'm ' + value[8] / 10 + '°C' +
|
|
3584
|
+
', ' + value[9] + 'h:' + value[10] + 'm ' + value[12] / 10 + '°C' +
|
|
3585
|
+
', ' + value[13] + 'h:' + value[14] + 'm ' + value[16] / 10 + '°C ',
|
|
3586
|
+
};
|
|
3587
|
+
case tuya.dataPoints.haozeeScheduleWednesday:
|
|
3588
|
+
// wednesday
|
|
3589
|
+
return {
|
|
3590
|
+
'wednesday_schedule': ' ' + value[1] + 'h:' + value[2] + 'm ' + value[4] / 10 + '°C' +
|
|
3591
|
+
', ' + value[5] + 'h:' + value[6] + 'm ' + value[8] / 10 + '°C' +
|
|
3592
|
+
', ' + value[9] + 'h:' + value[10] + 'm ' + value[12] / 10 + '°C' +
|
|
3593
|
+
', ' + value[13] + 'h:' + value[14] + 'm ' + value[16] / 10 + '°C ',
|
|
3594
|
+
};
|
|
3595
|
+
case tuya.dataPoints.haozeeScheduleThursday:
|
|
3596
|
+
// Thursday
|
|
3597
|
+
return {
|
|
3598
|
+
'thursday_schedule': ' ' + value[1] + 'h:' + value[2] + 'm ' + value[4] / 10 + '°C' +
|
|
3599
|
+
', ' + value[5] + 'h:' + value[6] + 'm ' + value[8] / 10 + '°C' +
|
|
3600
|
+
', ' + value[9] + 'h:' + value[10] + 'm ' + value[12] / 10 + '°C' +
|
|
3601
|
+
', ' + value[13] + 'h:' + value[14] + 'm ' + value[16] / 10 + '°C ',
|
|
3602
|
+
};
|
|
3603
|
+
case tuya.dataPoints.haozeeScheduleFriday:
|
|
3604
|
+
// Friday
|
|
3605
|
+
return {
|
|
3606
|
+
'friday_schedule': ' ' + value[1] + 'h:' + value[2] + 'm ' + value[4] / 10 + '°C' +
|
|
3607
|
+
', ' + value[5] + 'h:' + value[6] + 'm ' + value[8] / 10 + '°C' +
|
|
3608
|
+
', ' + value[9] + 'h:' + value[10] + 'm ' + value[12] / 10 + '°C' +
|
|
3609
|
+
', ' + value[13] + 'h:' + value[14] + 'm ' + value[16] / 10 + '°C ',
|
|
3610
|
+
};
|
|
3611
|
+
case tuya.dataPoints.haozeeScheduleSaturday:
|
|
3612
|
+
// Saturday
|
|
3613
|
+
return {
|
|
3614
|
+
'saturday_schedule': ' ' + value[1] + 'h:' + value[2] + 'm ' + value[4] / 10 + '°C' +
|
|
3615
|
+
', ' + value[5] + 'h:' + value[6] + 'm ' + value[8] / 10 + '°C' +
|
|
3616
|
+
', ' + value[9] + 'h:' + value[10] + 'm ' + value[12] / 10 + '°C' +
|
|
3617
|
+
', ' + value[13] + 'h:' + value[14] + 'm ' + value[16] / 10 + '°C ',
|
|
3618
|
+
};
|
|
3619
|
+
case tuya.dataPoints.haozeeScheduleSunday:
|
|
3620
|
+
|
|
3621
|
+
// Sunday
|
|
3622
|
+
return {
|
|
3623
|
+
'sunday_schedule': ' ' + value[1] + 'h:' + value[2] + 'm ' + value[4] / 10 + '°C' +
|
|
3624
|
+
', ' + value[5] + 'h:' + value[6] + 'm ' + value[8] / 10 + '°C' +
|
|
3625
|
+
', ' + value[9] + 'h:' + value[10] + 'm ' + value[12] / 10 + '°C' +
|
|
3626
|
+
', ' + value[13] + 'h:' + value[14] + 'm ' + value[16] / 10 + '°C ',
|
|
3627
|
+
};
|
|
3628
|
+
|
|
3629
|
+
case tuya.dataPoints.haozeeRunningState:
|
|
3630
|
+
// working status 0 - pause 1 -working
|
|
3631
|
+
return {'heating': value ? 'ON' : 'OFF'};
|
|
3632
|
+
case tuya.dataPoints.haozeeBoostHeating:
|
|
3633
|
+
// rapid heating -> boolean
|
|
3634
|
+
break;
|
|
3635
|
+
case tuya.dataPoints.haozeeTempCalibration:
|
|
3636
|
+
// temperature calibration
|
|
3637
|
+
break;
|
|
3638
|
+
case tuya.dataPoints.haozeeValvePosition:
|
|
3639
|
+
// valve position
|
|
3640
|
+
return {'position': value};
|
|
3641
|
+
case tuya.dataPoints.haozeeMinTemp:
|
|
3642
|
+
// lower limit temperature
|
|
3643
|
+
return {'min_temperature': ( value/10 ).toFixed(1)};
|
|
3644
|
+
case tuya.dataPoints.haozeeMaxTemp:
|
|
3645
|
+
// max limit temperature
|
|
3646
|
+
return {'max_temperature': ( value/10 ).toFixed(1)};
|
|
3647
|
+
case tuya.dataPoints.haozeeSoftVersion:
|
|
3648
|
+
// software
|
|
3649
|
+
break;
|
|
3650
|
+
default:
|
|
3651
|
+
meta.logger.warn(`zigbee-herdsman-converters:haozee: NOT RECOGNIZED DP #${
|
|
3652
|
+
dp} with data ${JSON.stringify(msg.data)}`);
|
|
3653
|
+
}
|
|
3654
|
+
},
|
|
3655
|
+
},
|
|
3535
3656
|
tuya_air_quality: {
|
|
3536
3657
|
cluster: 'manuSpecificTuya',
|
|
3537
3658
|
type: ['commandSetDataResponse', 'commandGetData'],
|
package/converters/toZigbee.js
CHANGED
|
@@ -2510,6 +2510,26 @@ const converters = {
|
|
|
2510
2510
|
await entity.read('hvacThermostat', ['danfossWindowOpenExternal'], manufacturerOptions.danfoss);
|
|
2511
2511
|
},
|
|
2512
2512
|
},
|
|
2513
|
+
danfoss_load_balancing_enable: {
|
|
2514
|
+
key: ['load_balancing_enable'],
|
|
2515
|
+
convertSet: async (entity, key, value, meta) => {
|
|
2516
|
+
await entity.write('hvacThermostat', {'danfossLoadBalancingEnable': value}, manufacturerOptions.danfoss);
|
|
2517
|
+
return {readAfterWriteTime: 200, state: {'load_balancing_enable': value}};
|
|
2518
|
+
},
|
|
2519
|
+
convertGet: async (entity, key, meta) => {
|
|
2520
|
+
await entity.read('hvacThermostat', ['danfossLoadBalancingEnable'], manufacturerOptions.danfoss);
|
|
2521
|
+
},
|
|
2522
|
+
},
|
|
2523
|
+
danfoss_load_room_mean: {
|
|
2524
|
+
key: ['load_room_mean'],
|
|
2525
|
+
convertSet: async (entity, key, value, meta) => {
|
|
2526
|
+
await entity.write('hvacThermostat', {'danfossLoadRoomMean': value}, manufacturerOptions.danfoss);
|
|
2527
|
+
return {readAfterWriteTime: 200, state: {'load_room_mean': value}};
|
|
2528
|
+
},
|
|
2529
|
+
convertGet: async (entity, key, meta) => {
|
|
2530
|
+
await entity.read('hvacThermostat', ['danfossLoadRoomMean'], manufacturerOptions.danfoss);
|
|
2531
|
+
},
|
|
2532
|
+
},
|
|
2513
2533
|
danfoss_load_estimate: {
|
|
2514
2534
|
key: ['load_estimate'],
|
|
2515
2535
|
convertGet: async (entity, key, meta) => {
|
|
@@ -2712,6 +2732,68 @@ const converters = {
|
|
|
2712
2732
|
await tuya.sendDataPointValue(entity, tuya.dataPoints.moesSminTempSet, temp);
|
|
2713
2733
|
},
|
|
2714
2734
|
},
|
|
2735
|
+
haozee_thermostat_system_mode: {
|
|
2736
|
+
key: ['preset'],
|
|
2737
|
+
convertSet: async (entity, key, value, meta) => {
|
|
2738
|
+
const lookup = {0: 'auto', 1: 'manual', 2: 'off', 3: 'on'};
|
|
2739
|
+
await tuya.sendDataPointEnum(entity, tuya.dataPoints.haozeeSystemMode, lookup[value]);
|
|
2740
|
+
},
|
|
2741
|
+
},
|
|
2742
|
+
haozee_thermostat_current_heating_setpoint: {
|
|
2743
|
+
key: ['current_heating_setpoint'],
|
|
2744
|
+
convertSet: async (entity, key, value, meta) => {
|
|
2745
|
+
const temp = Math.round(value*10);
|
|
2746
|
+
await tuya.sendDataPointValue(entity, tuya.dataPoints.haozeeHeatingSetpoint, temp);
|
|
2747
|
+
},
|
|
2748
|
+
},
|
|
2749
|
+
haozee_thermostat_boost_heating: {
|
|
2750
|
+
key: ['boost_heating'],
|
|
2751
|
+
convertSet: async (entity, key, value, meta) => {
|
|
2752
|
+
await tuya.sendDataPointBool(entity, tuya.dataPoints.haozeeBoostHeating, value === 'ON');
|
|
2753
|
+
},
|
|
2754
|
+
},
|
|
2755
|
+
haozee_thermostat_boost_heating_countdown: {
|
|
2756
|
+
key: ['boost_heating_countdown'],
|
|
2757
|
+
convertSet: async (entity, key, value, meta) => {
|
|
2758
|
+
await tuya.sendDataPointValue(entity, tuya.dataPoints.haozeeBoostHeatingCountdown, value);
|
|
2759
|
+
},
|
|
2760
|
+
},
|
|
2761
|
+
haozee_thermostat_window_detection: {
|
|
2762
|
+
key: ['window_detection'],
|
|
2763
|
+
convertSet: async (entity, key, value, meta) => {
|
|
2764
|
+
await tuya.sendDataPointBool(entity, tuya.dataPoints.haozeeWindowDetection, value === 'ON');
|
|
2765
|
+
},
|
|
2766
|
+
},
|
|
2767
|
+
haozee_thermostat_child_lock: {
|
|
2768
|
+
key: ['child_lock'],
|
|
2769
|
+
convertSet: async (entity, key, value, meta) => {
|
|
2770
|
+
await tuya.sendDataPointBool(entity, tuya.dataPoints.haozeeChildLock, value === 'LOCK');
|
|
2771
|
+
},
|
|
2772
|
+
},
|
|
2773
|
+
haozee_thermostat_temperature_calibration: {
|
|
2774
|
+
key: ['local_temperature_calibration'],
|
|
2775
|
+
convertSet: async (entity, key, value, meta) => {
|
|
2776
|
+
let temp = Math.round(value * 1);
|
|
2777
|
+
if (temp < 0) {
|
|
2778
|
+
temp = 0xFFFFFFFF + temp + 1;
|
|
2779
|
+
}
|
|
2780
|
+
await tuya.sendDataPointValue(entity, tuya.dataPoints.haozeeTempCalibration, temp);
|
|
2781
|
+
},
|
|
2782
|
+
},
|
|
2783
|
+
haozee_thermostat_max_temperature: {
|
|
2784
|
+
key: ['max_temperature'],
|
|
2785
|
+
convertSet: async (entity, key, value, meta) => {
|
|
2786
|
+
const temp = Math.round(value*10);
|
|
2787
|
+
await tuya.sendDataPointValue(entity, tuya.dataPoints.haozeeMaxTemp, temp);
|
|
2788
|
+
},
|
|
2789
|
+
},
|
|
2790
|
+
haozee_thermostat_min_temperature: {
|
|
2791
|
+
key: ['min_temperature'],
|
|
2792
|
+
convertSet: async (entity, key, value, meta) => {
|
|
2793
|
+
const temp = Math.round(value*10);
|
|
2794
|
+
await tuya.sendDataPointValue(entity, tuya.dataPoints.haozeeMinTemp, temp);
|
|
2795
|
+
},
|
|
2796
|
+
},
|
|
2715
2797
|
hgkg_thermostat_standby: {
|
|
2716
2798
|
key: ['system_mode'],
|
|
2717
2799
|
convertSet: async (entity, key, value, meta) => {
|
|
@@ -3206,7 +3288,7 @@ const converters = {
|
|
|
3206
3288
|
},
|
|
3207
3289
|
},
|
|
3208
3290
|
eurotronic_valve_position: {
|
|
3209
|
-
key: ['eurotronic_valve_position'],
|
|
3291
|
+
key: ['eurotronic_valve_position', 'valve_position'],
|
|
3210
3292
|
convertSet: async (entity, key, value, meta) => {
|
|
3211
3293
|
const payload = {0x4001: {value, type: 0x20}};
|
|
3212
3294
|
await entity.write('hvacThermostat', payload, manufacturerOptions.eurotronic);
|
|
@@ -3216,7 +3298,7 @@ const converters = {
|
|
|
3216
3298
|
},
|
|
3217
3299
|
},
|
|
3218
3300
|
eurotronic_trv_mode: {
|
|
3219
|
-
key: ['eurotronic_trv_mode'],
|
|
3301
|
+
key: ['eurotronic_trv_mode', 'trv_mode'],
|
|
3220
3302
|
convertSet: async (entity, key, value, meta) => {
|
|
3221
3303
|
const payload = {0x4000: {value, type: 0x30}};
|
|
3222
3304
|
await entity.write('hvacThermostat', payload, manufacturerOptions.eurotronic);
|
package/devices/danfoss.js
CHANGED
|
@@ -20,7 +20,7 @@ module.exports = [
|
|
|
20
20
|
tz.danfoss_heat_available, tz.danfoss_heat_required, tz.danfoss_day_of_week, tz.danfoss_trigger_time,
|
|
21
21
|
tz.danfoss_window_open_internal, tz.danfoss_window_open_external, tz.danfoss_load_estimate,
|
|
22
22
|
tz.danfoss_viewing_direction, tz.danfoss_external_measured_room_sensor, tz.thermostat_keypad_lockout,
|
|
23
|
-
tz.thermostat_system_mode],
|
|
23
|
+
tz.thermostat_system_mode, tz.danfoss_load_balancing_enable, tz.danfoss_load_room_mean],
|
|
24
24
|
exposes: [e.battery(), e.keypad_lockout(),
|
|
25
25
|
exposes.binary('mounted_mode_active', ea.STATE_GET, true, false)
|
|
26
26
|
.withDescription('Is the unit in mounting mode. This is set to `false` for mounted (already on ' +
|
|
@@ -57,6 +57,11 @@ module.exports = [
|
|
|
57
57
|
exposes.numeric('algorithm_scale_factor', ea.ALL).withValueMin(1).withValueMax(10)
|
|
58
58
|
.withDescription('Scale factor of setpoint filter timeconstant ("aggressiveness" of control algorithm) '+
|
|
59
59
|
'1= Quick ... 5=Moderate ... 10=Slow'),
|
|
60
|
+
exposes.binary('load_balancing_enable', ea.ALL, true, false)
|
|
61
|
+
.withDescription('Whether or not the thermostat acts as standalone thermostat or shares load with other ' +
|
|
62
|
+
'thermostats in the room. The gateway must update load_room_mean if enabled.'),
|
|
63
|
+
exposes.numeric('load_room_mean', ea.ALL)
|
|
64
|
+
.withDescription('Mean radiator load for room calculated by gateway for load balancing purposes'),
|
|
60
65
|
exposes.numeric('load_estimate', ea.STATE_GET)
|
|
61
66
|
.withDescription('Load estimate on this radiator')],
|
|
62
67
|
ota: ota.zigbeeOTA,
|
|
@@ -106,6 +111,8 @@ module.exports = [
|
|
|
106
111
|
'danfossMountedModeControl',
|
|
107
112
|
'danfossMountedModeActive',
|
|
108
113
|
'danfossExternalMeasuredRoomSensor',
|
|
114
|
+
'danfossLoadBalancingEnable',
|
|
115
|
+
'danfossLoadRoomMean',
|
|
109
116
|
], options);
|
|
110
117
|
|
|
111
118
|
// read systemMode to have an initial value
|
package/devices/eurotronic.js
CHANGED
|
@@ -21,13 +21,13 @@ module.exports = [
|
|
|
21
21
|
exposes: [e.battery(), exposes.climate().withSetpoint('occupied_heating_setpoint', 5, 30, 0.5).withLocalTemperature()
|
|
22
22
|
.withSystemMode(['off', 'auto', 'heat']).withRunningState(['idle', 'heat']).withLocalTemperatureCalibration()
|
|
23
23
|
.withPiHeatingDemand(),
|
|
24
|
-
exposes.enum('
|
|
25
|
-
.withDescription('Select between direct control of the valve via the `
|
|
24
|
+
exposes.enum('trv_mode', exposes.access.ALL, [1, 2])
|
|
25
|
+
.withDescription('Select between direct control of the valve via the `valve_position` or automatic control of the '+
|
|
26
26
|
'valve based on the `current_heating_setpoint`. For manual control set the value to 1, for automatic control set the value '+
|
|
27
27
|
'to 2 (the default). When switched to manual mode the display shows a value from 0 (valve closed) to 100 (valve fully open) '+
|
|
28
28
|
'and the buttons on the device are disabled.'),
|
|
29
|
-
exposes.numeric('
|
|
30
|
-
.withDescription('Directly control the radiator valve when `
|
|
29
|
+
exposes.numeric('valve_position', exposes.access.ALL).withValueMin(0).withValueMax(255)
|
|
30
|
+
.withDescription('Directly control the radiator valve when `trv_mode` is set to 1. The values range from 0 (valve '+
|
|
31
31
|
'closed) to 255 (valve fully open)')],
|
|
32
32
|
ota: ota.zigbeeOTA,
|
|
33
33
|
configure: async (device, coordinatorEndpoint, logger) => {
|
package/devices/tuya.js
CHANGED
|
@@ -109,7 +109,9 @@ module.exports = [
|
|
|
109
109
|
{modelID: 'TS0505B', manufacturerName: '_TZ3000_x2fqbdun'},
|
|
110
110
|
{modelID: 'TS0505B', manufacturerName: '_TZ3000_589kq4ul'},
|
|
111
111
|
{modelID: 'TS0505B', manufacturerName: '_TZ3000_1mtktxdk'},
|
|
112
|
-
{modelID: 'TS0505B', manufacturerName: '_TZ3210_bicjqpg4'}
|
|
112
|
+
{modelID: 'TS0505B', manufacturerName: '_TZ3210_bicjqpg4'},
|
|
113
|
+
{modelID: 'TS0505B', manufacturerName: '_TZ3000_cmaky9gq'},
|
|
114
|
+
{modelID: 'TS0505B', manufacturerName: '_TZ3000_tza2vjxx'}],
|
|
113
115
|
model: 'TS0505B',
|
|
114
116
|
vendor: 'TuYa',
|
|
115
117
|
description: 'Zigbee RGB+CCT light',
|
|
@@ -608,7 +610,7 @@ module.exports = [
|
|
|
608
610
|
},
|
|
609
611
|
},
|
|
610
612
|
{
|
|
611
|
-
fingerprint: [{modelID: 'TS0002', manufacturerName: '_TZ3000_01gpyda5'}],
|
|
613
|
+
fingerprint: [{modelID: 'TS0002', manufacturerName: '_TZ3000_01gpyda5'}, {modelID: 'TS0002', manufacturerName: '_TZ3000_bvrlqyj7'}],
|
|
612
614
|
model: 'TS0002_switch_module',
|
|
613
615
|
vendor: 'TuYa',
|
|
614
616
|
description: '2 gang switch module',
|
|
@@ -820,6 +822,46 @@ module.exports = [
|
|
|
820
822
|
.withSystemMode(['off', 'heat', 'auto'], ea.STATE_SET).withRunningState(['idle', 'heat'], ea.STATE),
|
|
821
823
|
],
|
|
822
824
|
},
|
|
825
|
+
{
|
|
826
|
+
fingerprint: [{modelID: 'TS0601', manufacturerName: '_TZE200_a4bpgplm'}],
|
|
827
|
+
model: 'TS0601',
|
|
828
|
+
vendor: 'TS0601_thermostat_1',
|
|
829
|
+
description: 'Thermostatic radiator valve',
|
|
830
|
+
onEvent: tuya.onEventSetLocalTime,
|
|
831
|
+
fromZigbee: [fz.ignore_basic_report, fz.ignore_tuya_set_time, fz.haozee_thermostat],
|
|
832
|
+
toZigbee: [
|
|
833
|
+
tz.haozee_thermostat_system_mode, tz.haozee_thermostat_current_heating_setpoint, tz.haozee_thermostat_boost_heating,
|
|
834
|
+
tz.haozee_thermostat_boost_heating_countdown, tz.haozee_thermostat_window_detection,
|
|
835
|
+
tz.haozee_thermostat_child_lock, tz.haozee_thermostat_temperature_calibration, tz.haozee_thermostat_max_temperature,
|
|
836
|
+
tz.haozee_thermostat_min_temperature,
|
|
837
|
+
],
|
|
838
|
+
exposes: [
|
|
839
|
+
e.battery(), e.child_lock(), e.max_temperature(), e.min_temperature(),
|
|
840
|
+
e.position(), e.window_detection(),
|
|
841
|
+
exposes.binary('window', ea.STATE, 'CLOSED', 'OPEN').withDescription('Window status closed or open '),
|
|
842
|
+
exposes.binary('heating', ea.STATE, 'ON', 'OFF').withDescription('Device valve is open or closed (heating or not)'),
|
|
843
|
+
exposes.climate()
|
|
844
|
+
.withLocalTemperature(ea.STATE).withSetpoint('current_heating_setpoint', 5, 35, 0.5, ea.STATE_SET)
|
|
845
|
+
.withLocalTemperatureCalibration(ea.STATE_SET).withPreset(['auto', 'manual', 'off', 'on'],
|
|
846
|
+
'MANUAL MODE ☝ - In this mode, the device executes manual temperature setting. ' +
|
|
847
|
+
'When the set temperature is lower than the "minimum temperature", the valve is closed (forced closed). ' +
|
|
848
|
+
'AUTO MODE ⏱ - In this mode, the device executes a preset week programming temperature time and temperature. ' +
|
|
849
|
+
'ON - In this mode, the thermostat stays open ' +
|
|
850
|
+
'OFF - In this mode, the thermostat stays closed'),
|
|
851
|
+
exposes.composite('programming_mode').withDescription('Auto MODE ⏱ - In this mode, ' +
|
|
852
|
+
'the device executes a preset week programming temperature time and temperature. ')
|
|
853
|
+
.withFeature(exposes.text('monday_schedule', ea.STATE))
|
|
854
|
+
.withFeature(exposes.text('tuesday_schedule', ea.STATE))
|
|
855
|
+
.withFeature(exposes.text('wednesday_schedule', ea.STATE))
|
|
856
|
+
.withFeature(exposes.text('thursday_schedule', ea.STATE))
|
|
857
|
+
.withFeature(exposes.text('friday_schedule', ea.STATE))
|
|
858
|
+
.withFeature(exposes.text('saturday_schedule', ea.STATE))
|
|
859
|
+
.withFeature(exposes.text('sunday_schedule', ea.STATE)),
|
|
860
|
+
exposes.binary('boost_heating', ea.STATE_SET, 'ON', 'OFF').withDescription('Boost Heating: press and hold "+" for 3 seconds, ' +
|
|
861
|
+
'the device will enter the boost heating mode, and the ▷╵◁ will flash. The countdown will be displayed in the APP'),
|
|
862
|
+
exposes.numeric('boost_heating_countdown', ea.STATE_SET).withUnit('min').withDescription('Countdown in minutes'),
|
|
863
|
+
],
|
|
864
|
+
},
|
|
823
865
|
{
|
|
824
866
|
zigbeeModel: ['TS0121'],
|
|
825
867
|
model: 'TS0121_plug',
|
package/lib/tuya.js
CHANGED
|
@@ -423,6 +423,30 @@ const dataPoints = {
|
|
|
423
423
|
tvThursdaySchedule: 113,
|
|
424
424
|
tvSaturdaySchedule: 114,
|
|
425
425
|
tvBoostMode: 115,
|
|
426
|
+
// Haozee TS0601 TRV
|
|
427
|
+
haozeeSystemMode: 1,
|
|
428
|
+
haozeeHeatingSetpoint: 2,
|
|
429
|
+
haozeeLocalTemp: 3,
|
|
430
|
+
haozeeBoostHeating: 4,
|
|
431
|
+
haozeeBoostHeatingCountdown: 5,
|
|
432
|
+
haozeeRunningState: 6,
|
|
433
|
+
haozeeWindowState: 7,
|
|
434
|
+
haozeeWindowDetection: 8,
|
|
435
|
+
haozeeChildLock: 12,
|
|
436
|
+
haozeeBattery: 13,
|
|
437
|
+
haozeeFaultAlarm: 14,
|
|
438
|
+
haozeeMinTemp: 15,
|
|
439
|
+
haozeeMaxTemp: 16,
|
|
440
|
+
haozeeScheduleMonday: 17,
|
|
441
|
+
haozeeScheduleTuesday: 18,
|
|
442
|
+
haozeeScheduleWednesday: 19,
|
|
443
|
+
haozeeScheduleThursday: 20,
|
|
444
|
+
haozeeScheduleFriday: 21,
|
|
445
|
+
haozeeScheduleSaturday: 22,
|
|
446
|
+
haozeeScheduleSunday: 23,
|
|
447
|
+
haozeeTempCalibration: 101,
|
|
448
|
+
haozeeValvePosition: 102,
|
|
449
|
+
haozeeSoftVersion: 150,
|
|
426
450
|
// HOCH / WDYK DIN Rail
|
|
427
451
|
hochCountdownTimer: 9,
|
|
428
452
|
hochFaultCode: 26,
|
package/npm-shrinkwrap.json
CHANGED