zigbee-herdsman-converters 15.0.44 → 15.0.45
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 +0 -117
- package/converters/toZigbee.js +12 -74
- package/devices/bitron.js +39 -8
- package/devices/custom_devices_diy.js +2 -2
- package/devices/frankever.js +1 -1
- package/devices/ikea.js +0 -1
- package/devices/mercator.js +4 -0
- package/devices/moes.js +2 -2
- package/devices/neo.js +2 -2
- package/devices/philips.js +27 -31
- package/devices/sengled.js +5 -3
- package/devices/tuya.js +56 -27
- package/lib/exposes.js +8 -0
- package/lib/philips.js +3 -3
- package/lib/tuya.js +11 -24
- package/package.json +1 -1
package/converters/fromZigbee.js
CHANGED
|
@@ -4150,123 +4150,6 @@ const converters = {
|
|
|
4150
4150
|
}
|
|
4151
4151
|
},
|
|
4152
4152
|
},
|
|
4153
|
-
haozee_thermostat: {
|
|
4154
|
-
cluster: 'manuSpecificTuya',
|
|
4155
|
-
type: ['commandDataResponse', 'commandDataReport'],
|
|
4156
|
-
convert: (model, msg, publish, options, meta) => {
|
|
4157
|
-
const dpValue = tuya.firstDpValue(msg, meta, 'haozee_thermostat');
|
|
4158
|
-
const dp = dpValue.dp; // First we get the data point ID
|
|
4159
|
-
const value = tuya.getDataValue(dpValue);
|
|
4160
|
-
const presetLookup = {0: 'auto', 1: 'manual', 2: 'off', 3: 'on'};
|
|
4161
|
-
const systemModeLookup = {0: 'auto', 1: 'auto', 2: 'off', 3: 'heat'};
|
|
4162
|
-
switch (dp) {
|
|
4163
|
-
case tuya.dataPoints.haozeeSystemMode:
|
|
4164
|
-
return {preset: presetLookup[value], system_mode: systemModeLookup[value]};
|
|
4165
|
-
case tuya.dataPoints.haozeeHeatingSetpoint:
|
|
4166
|
-
return {current_heating_setpoint: (value / 10).toFixed(1)};
|
|
4167
|
-
case tuya.dataPoints.haozeeLocalTemp:
|
|
4168
|
-
return {local_temperature: (value / 10).toFixed(1)};
|
|
4169
|
-
case tuya.dataPoints.haozeeBoostHeatingCountdown:
|
|
4170
|
-
// quick heating countdown - not supported by this device
|
|
4171
|
-
return {boost_heating_countdown: value};
|
|
4172
|
-
case tuya.dataPoints.haozeeWindowDetection:
|
|
4173
|
-
// window check
|
|
4174
|
-
return {window_detection: value ? 'ON' : 'OFF'};
|
|
4175
|
-
case tuya.dataPoints.haozeeWindowState:
|
|
4176
|
-
// window state
|
|
4177
|
-
return {window: value ? 'OPEN' : 'CLOSED'};
|
|
4178
|
-
case tuya.dataPoints.haozeeChildLock:
|
|
4179
|
-
return {child_lock: value ? 'LOCK' : 'UNLOCK'};
|
|
4180
|
-
case tuya.dataPoints.haozeeBattery:
|
|
4181
|
-
// battery
|
|
4182
|
-
return {battery: value};
|
|
4183
|
-
case tuya.dataPoints.haozeeFaultAlarm:
|
|
4184
|
-
return {error: value ? 'ON': 'OFF'};
|
|
4185
|
-
case tuya.dataPoints.haozeeScheduleMonday:
|
|
4186
|
-
// Monday
|
|
4187
|
-
return {
|
|
4188
|
-
'monday_schedule': ' ' + value[1] + 'h:' + value[2] + 'm ' + value[4] / 10 + '°C' +
|
|
4189
|
-
', ' + value[5] + 'h:' + value[6] + 'm ' + value[8] / 10 + '°C' +
|
|
4190
|
-
', ' + value[9] + 'h:' + value[10] + 'm ' + value[12] / 10 + '°C' +
|
|
4191
|
-
', ' + value[13] + 'h:' + value[14] + 'm ' + value[16] / 10 + '°C ',
|
|
4192
|
-
};
|
|
4193
|
-
case tuya.dataPoints.haozeeScheduleTuesday:
|
|
4194
|
-
// Tuesday
|
|
4195
|
-
return {
|
|
4196
|
-
'tuesday_schedule': ' ' + value[1] + 'h:' + value[2] + 'm ' + value[4] / 10 + '°C' +
|
|
4197
|
-
', ' + value[5] + 'h:' + value[6] + 'm ' + value[8] / 10 + '°C' +
|
|
4198
|
-
', ' + value[9] + 'h:' + value[10] + 'm ' + value[12] / 10 + '°C' +
|
|
4199
|
-
', ' + value[13] + 'h:' + value[14] + 'm ' + value[16] / 10 + '°C ',
|
|
4200
|
-
};
|
|
4201
|
-
case tuya.dataPoints.haozeeScheduleWednesday:
|
|
4202
|
-
// wednesday
|
|
4203
|
-
return {
|
|
4204
|
-
'wednesday_schedule': ' ' + value[1] + 'h:' + value[2] + 'm ' + value[4] / 10 + '°C' +
|
|
4205
|
-
', ' + value[5] + 'h:' + value[6] + 'm ' + value[8] / 10 + '°C' +
|
|
4206
|
-
', ' + value[9] + 'h:' + value[10] + 'm ' + value[12] / 10 + '°C' +
|
|
4207
|
-
', ' + value[13] + 'h:' + value[14] + 'm ' + value[16] / 10 + '°C ',
|
|
4208
|
-
};
|
|
4209
|
-
case tuya.dataPoints.haozeeScheduleThursday:
|
|
4210
|
-
// Thursday
|
|
4211
|
-
return {
|
|
4212
|
-
'thursday_schedule': ' ' + value[1] + 'h:' + value[2] + 'm ' + value[4] / 10 + '°C' +
|
|
4213
|
-
', ' + value[5] + 'h:' + value[6] + 'm ' + value[8] / 10 + '°C' +
|
|
4214
|
-
', ' + value[9] + 'h:' + value[10] + 'm ' + value[12] / 10 + '°C' +
|
|
4215
|
-
', ' + value[13] + 'h:' + value[14] + 'm ' + value[16] / 10 + '°C ',
|
|
4216
|
-
};
|
|
4217
|
-
case tuya.dataPoints.haozeeScheduleFriday:
|
|
4218
|
-
// Friday
|
|
4219
|
-
return {
|
|
4220
|
-
'friday_schedule': ' ' + value[1] + 'h:' + value[2] + 'm ' + value[4] / 10 + '°C' +
|
|
4221
|
-
', ' + value[5] + 'h:' + value[6] + 'm ' + value[8] / 10 + '°C' +
|
|
4222
|
-
', ' + value[9] + 'h:' + value[10] + 'm ' + value[12] / 10 + '°C' +
|
|
4223
|
-
', ' + value[13] + 'h:' + value[14] + 'm ' + value[16] / 10 + '°C ',
|
|
4224
|
-
};
|
|
4225
|
-
case tuya.dataPoints.haozeeScheduleSaturday:
|
|
4226
|
-
// Saturday
|
|
4227
|
-
return {
|
|
4228
|
-
'saturday_schedule': ' ' + value[1] + 'h:' + value[2] + 'm ' + value[4] / 10 + '°C' +
|
|
4229
|
-
', ' + value[5] + 'h:' + value[6] + 'm ' + value[8] / 10 + '°C' +
|
|
4230
|
-
', ' + value[9] + 'h:' + value[10] + 'm ' + value[12] / 10 + '°C' +
|
|
4231
|
-
', ' + value[13] + 'h:' + value[14] + 'm ' + value[16] / 10 + '°C ',
|
|
4232
|
-
};
|
|
4233
|
-
case tuya.dataPoints.haozeeScheduleSunday:
|
|
4234
|
-
|
|
4235
|
-
// Sunday
|
|
4236
|
-
return {
|
|
4237
|
-
'sunday_schedule': ' ' + value[1] + 'h:' + value[2] + 'm ' + value[4] / 10 + '°C' +
|
|
4238
|
-
', ' + value[5] + 'h:' + value[6] + 'm ' + value[8] / 10 + '°C' +
|
|
4239
|
-
', ' + value[9] + 'h:' + value[10] + 'm ' + value[12] / 10 + '°C' +
|
|
4240
|
-
', ' + value[13] + 'h:' + value[14] + 'm ' + value[16] / 10 + '°C ',
|
|
4241
|
-
};
|
|
4242
|
-
|
|
4243
|
-
case tuya.dataPoints.haozeeRunningState:
|
|
4244
|
-
// working status 0 - pause 1 -working
|
|
4245
|
-
return {'heating': value ? 'ON' : 'OFF'};
|
|
4246
|
-
case tuya.dataPoints.haozeeBoostHeating:
|
|
4247
|
-
// rapid heating -> boolean - not supported by this device
|
|
4248
|
-
return {'boost_heating': value ? 'ON' : 'OFF'};
|
|
4249
|
-
case tuya.dataPoints.haozeeTempCalibration:
|
|
4250
|
-
// temperature calibration
|
|
4251
|
-
return {'local_temperature_calibration': ( value/10 ).toFixed(1)};
|
|
4252
|
-
case tuya.dataPoints.haozeeValvePosition:
|
|
4253
|
-
// valve position
|
|
4254
|
-
return {'position': ( value/10 ).toFixed(1)};
|
|
4255
|
-
case tuya.dataPoints.haozeeMinTemp:
|
|
4256
|
-
// lower limit temperature
|
|
4257
|
-
return {'min_temperature': ( value/10 ).toFixed(1)};
|
|
4258
|
-
case tuya.dataPoints.haozeeMaxTemp:
|
|
4259
|
-
// max limit temperature
|
|
4260
|
-
return {'max_temperature': ( value/10 ).toFixed(1)};
|
|
4261
|
-
case tuya.dataPoints.haozeeSoftVersion:
|
|
4262
|
-
// software
|
|
4263
|
-
break;
|
|
4264
|
-
default:
|
|
4265
|
-
meta.logger.warn(`zigbee-herdsman-converters:haozee: NOT RECOGNIZED DP #${
|
|
4266
|
-
dp} with data ${JSON.stringify(dpValue)}`);
|
|
4267
|
-
}
|
|
4268
|
-
},
|
|
4269
|
-
},
|
|
4270
4153
|
tuya_air_quality: {
|
|
4271
4154
|
cluster: 'manuSpecificTuya',
|
|
4272
4155
|
type: ['commandDataReport', 'commandDataResponse'],
|
package/converters/toZigbee.js
CHANGED
|
@@ -102,6 +102,12 @@ const converters = {
|
|
|
102
102
|
await entity.read('genPowerCfg', ['batteryPercentageRemaining']);
|
|
103
103
|
},
|
|
104
104
|
},
|
|
105
|
+
battery_voltage: {
|
|
106
|
+
key: ['battery', 'voltage'],
|
|
107
|
+
convertGet: async (entity, key, meta) => {
|
|
108
|
+
await entity.read('genPowerCfg', ['batteryVoltage']);
|
|
109
|
+
},
|
|
110
|
+
},
|
|
105
111
|
power_on_behavior: {
|
|
106
112
|
key: ['power_on_behavior'],
|
|
107
113
|
convertSet: async (entity, key, value, meta) => {
|
|
@@ -1260,7 +1266,12 @@ const converters = {
|
|
|
1260
1266
|
if (val === undefined) {
|
|
1261
1267
|
val = utils.getKey(constants.thermostatControlSequenceOfOperations, value, value, Number);
|
|
1262
1268
|
}
|
|
1263
|
-
|
|
1269
|
+
const attributes = {ctrlSeqeOfOper: val};
|
|
1270
|
+
await entity.write('hvacThermostat', attributes);
|
|
1271
|
+
// NOTE: update the cluster attribute we store as this is used by
|
|
1272
|
+
// SMaBiT AV2010/32's dynamic expose function.
|
|
1273
|
+
entity.saveClusterAttributeKeyValue('hvacThermostat', attributes);
|
|
1274
|
+
return {readAfterWriteTime: 250, state: {control_sequence_of_operation: value}};
|
|
1264
1275
|
},
|
|
1265
1276
|
convertGet: async (entity, key, meta) => {
|
|
1266
1277
|
await entity.read('hvacThermostat', ['ctrlSeqeOfOper']);
|
|
@@ -3474,79 +3485,6 @@ const converters = {
|
|
|
3474
3485
|
return tuya.sendDataPointRaw(entity, tuya.dataPoints.moesSschedule, payload);
|
|
3475
3486
|
},
|
|
3476
3487
|
},
|
|
3477
|
-
haozee_thermostat_preset: {
|
|
3478
|
-
key: ['preset'],
|
|
3479
|
-
convertSet: async (entity, key, value, meta) => {
|
|
3480
|
-
const lookup = {'auto': 0, 'manual': 1, 'off': 2, 'on': 3};
|
|
3481
|
-
await tuya.sendDataPointEnum(entity, tuya.dataPoints.haozeeSystemMode, lookup[value]);
|
|
3482
|
-
},
|
|
3483
|
-
},
|
|
3484
|
-
haozee_thermostat_system_mode: {
|
|
3485
|
-
key: ['system_mode'],
|
|
3486
|
-
convertSet: async (entity, key, value, meta) => {
|
|
3487
|
-
// mapping 'heat' system mode to 100% heating (same as preset 'ON'),
|
|
3488
|
-
// mapping 'auto' system mode to heating up to the set point temperature (same as preset 'MANUAL')
|
|
3489
|
-
// mapping 'off' system mode to idle (same as preset 'OFF')
|
|
3490
|
-
// programmed schedule can be enabled by using preset mode 'AUTO' instead of 'MANUAL'
|
|
3491
|
-
const lookup = {'auto': 1, 'off': 2, 'heat': 3};
|
|
3492
|
-
await tuya.sendDataPointEnum(entity, tuya.dataPoints.haozeeSystemMode, lookup[value]);
|
|
3493
|
-
},
|
|
3494
|
-
},
|
|
3495
|
-
haozee_thermostat_current_heating_setpoint: {
|
|
3496
|
-
key: ['current_heating_setpoint'],
|
|
3497
|
-
convertSet: async (entity, key, value, meta) => {
|
|
3498
|
-
const temp = Math.round(value*10);
|
|
3499
|
-
await tuya.sendDataPointValue(entity, tuya.dataPoints.haozeeHeatingSetpoint, temp);
|
|
3500
|
-
},
|
|
3501
|
-
},
|
|
3502
|
-
haozee_thermostat_boost_heating: {
|
|
3503
|
-
key: ['boost_heating'],
|
|
3504
|
-
convertSet: async (entity, key, value, meta) => {
|
|
3505
|
-
await tuya.sendDataPointBool(entity, tuya.dataPoints.haozeeBoostHeating, value === 'ON');
|
|
3506
|
-
},
|
|
3507
|
-
},
|
|
3508
|
-
haozee_thermostat_boost_heating_countdown: {
|
|
3509
|
-
key: ['boost_heating_countdown'],
|
|
3510
|
-
convertSet: async (entity, key, value, meta) => {
|
|
3511
|
-
await tuya.sendDataPointValue(entity, tuya.dataPoints.haozeeBoostHeatingCountdown, value);
|
|
3512
|
-
},
|
|
3513
|
-
},
|
|
3514
|
-
haozee_thermostat_window_detection: {
|
|
3515
|
-
key: ['window_detection'],
|
|
3516
|
-
convertSet: async (entity, key, value, meta) => {
|
|
3517
|
-
await tuya.sendDataPointBool(entity, tuya.dataPoints.haozeeWindowDetection, value === 'ON');
|
|
3518
|
-
},
|
|
3519
|
-
},
|
|
3520
|
-
haozee_thermostat_child_lock: {
|
|
3521
|
-
key: ['child_lock'],
|
|
3522
|
-
convertSet: async (entity, key, value, meta) => {
|
|
3523
|
-
await tuya.sendDataPointBool(entity, tuya.dataPoints.haozeeChildLock, value === 'LOCK');
|
|
3524
|
-
},
|
|
3525
|
-
},
|
|
3526
|
-
haozee_thermostat_temperature_calibration: {
|
|
3527
|
-
key: ['local_temperature_calibration'],
|
|
3528
|
-
convertSet: async (entity, key, value, meta) => {
|
|
3529
|
-
let temp = Math.round(value * 10);
|
|
3530
|
-
if (temp < 0) {
|
|
3531
|
-
temp = 0xFFFFFFFF + temp + 1;
|
|
3532
|
-
}
|
|
3533
|
-
await tuya.sendDataPointValue(entity, tuya.dataPoints.haozeeTempCalibration, temp);
|
|
3534
|
-
},
|
|
3535
|
-
},
|
|
3536
|
-
haozee_thermostat_max_temperature: {
|
|
3537
|
-
key: ['max_temperature'],
|
|
3538
|
-
convertSet: async (entity, key, value, meta) => {
|
|
3539
|
-
const temp = Math.round(value*10);
|
|
3540
|
-
await tuya.sendDataPointValue(entity, tuya.dataPoints.haozeeMaxTemp, temp);
|
|
3541
|
-
},
|
|
3542
|
-
},
|
|
3543
|
-
haozee_thermostat_min_temperature: {
|
|
3544
|
-
key: ['min_temperature'],
|
|
3545
|
-
convertSet: async (entity, key, value, meta) => {
|
|
3546
|
-
const temp = Math.round(value*10);
|
|
3547
|
-
await tuya.sendDataPointValue(entity, tuya.dataPoints.haozeeMinTemp, temp);
|
|
3548
|
-
},
|
|
3549
|
-
},
|
|
3550
3488
|
hgkg_thermostat_standby: {
|
|
3551
3489
|
key: ['system_mode'],
|
|
3552
3490
|
convertSet: async (entity, key, value, meta) => {
|
package/devices/bitron.js
CHANGED
|
@@ -4,6 +4,7 @@ const tz = require('../converters/toZigbee');
|
|
|
4
4
|
const reporting = require('../lib/reporting');
|
|
5
5
|
const extend = require('../lib/extend');
|
|
6
6
|
const e = exposes.presets;
|
|
7
|
+
const ea = exposes.access;
|
|
7
8
|
|
|
8
9
|
module.exports = [
|
|
9
10
|
{
|
|
@@ -190,13 +191,43 @@ module.exports = [
|
|
|
190
191
|
vendor: 'SMaBiT (Bitron Video)',
|
|
191
192
|
description: 'Wireless wall thermostat with relay',
|
|
192
193
|
fromZigbee: [fz.legacy.thermostat_att_report, fz.battery, fz.hvac_user_interface],
|
|
193
|
-
toZigbee: [
|
|
194
|
-
tz.
|
|
195
|
-
tz.
|
|
196
|
-
|
|
197
|
-
.
|
|
198
|
-
|
|
199
|
-
|
|
194
|
+
toZigbee: [
|
|
195
|
+
tz.thermostat_control_sequence_of_operation, tz.thermostat_occupied_heating_setpoint,
|
|
196
|
+
tz.thermostat_occupied_cooling_setpoint, tz.thermostat_local_temperature_calibration,
|
|
197
|
+
tz.thermostat_local_temperature, tz.thermostat_running_state, tz.thermostat_temperature_display_mode,
|
|
198
|
+
tz.thermostat_keypad_lockout, tz.thermostat_system_mode, tz.battery_voltage,
|
|
199
|
+
],
|
|
200
|
+
exposes: (device, options) => {
|
|
201
|
+
const dynExposes = [];
|
|
202
|
+
let ctrlSeqeOfOper = device ? device.getEndpoint(1).getClusterAttributeValue('hvacThermostat', 'ctrlSeqeOfOper') : null;
|
|
203
|
+
const modes = [];
|
|
204
|
+
|
|
205
|
+
// NOTE: ctrlSeqeOfOper defaults to 2 for this device (according to the manual)
|
|
206
|
+
if (ctrlSeqeOfOper == null) ctrlSeqeOfOper = 2;
|
|
207
|
+
|
|
208
|
+
// NOTE: set cool and/or heat support based on ctrlSeqeOfOper (see lib/constants -> thermostatControlSequenceOfOperations)
|
|
209
|
+
// WARN: a restart of zigbee2mqtt is required after changing ctrlSeqeOfOper for expose data to be re-calculated
|
|
210
|
+
if (ctrlSeqeOfOper >= 2) {
|
|
211
|
+
modes.push('heat');
|
|
212
|
+
}
|
|
213
|
+
if (ctrlSeqeOfOper < 2 || ctrlSeqeOfOper > 3) {
|
|
214
|
+
modes.push('cool');
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
dynExposes.push(exposes.climate()
|
|
218
|
+
.withSetpoint('occupied_heating_setpoint', 7, 30, 0.5)
|
|
219
|
+
.withLocalTemperature()
|
|
220
|
+
.withSystemMode(['off'].concat(modes))
|
|
221
|
+
.withRunningState(['idle'].concat(modes))
|
|
222
|
+
.withLocalTemperatureCalibration()
|
|
223
|
+
.withControlSequenceOfOperation(['heating_only', 'cooling_only'], ea.ALL));
|
|
224
|
+
dynExposes.push(e.keypad_lockout());
|
|
225
|
+
dynExposes.push(e.battery().withAccess(ea.STATE_GET));
|
|
226
|
+
dynExposes.push(e.battery_low());
|
|
227
|
+
dynExposes.push(e.linkquality());
|
|
228
|
+
return dynExposes;
|
|
229
|
+
},
|
|
230
|
+
meta: {battery: {voltageToPercentage: '3V_2500'}},
|
|
200
231
|
configure: async (device, coordinatorEndpoint, logger) => {
|
|
201
232
|
const endpoint = device.getEndpoint(1);
|
|
202
233
|
const binds = [
|
|
@@ -204,12 +235,12 @@ module.exports = [
|
|
|
204
235
|
];
|
|
205
236
|
await reporting.bind(endpoint, coordinatorEndpoint, binds);
|
|
206
237
|
await reporting.thermostatTemperature(endpoint);
|
|
207
|
-
await reporting.thermostatTemperatureCalibration(endpoint);
|
|
208
238
|
await reporting.thermostatOccupiedHeatingSetpoint(endpoint);
|
|
209
239
|
await reporting.thermostatOccupiedCoolingSetpoint(endpoint);
|
|
210
240
|
await reporting.thermostatRunningState(endpoint);
|
|
211
241
|
await reporting.batteryAlarmState(endpoint);
|
|
212
242
|
await reporting.batteryVoltage(endpoint);
|
|
243
|
+
await endpoint.read('hvacThermostat', ['ctrlSeqeOfOper', 'localTemperatureCalibration']);
|
|
213
244
|
},
|
|
214
245
|
},
|
|
215
246
|
{
|
|
@@ -473,7 +473,7 @@ module.exports = [
|
|
|
473
473
|
await firstEndpoint.configureReporting('genPowerCfg', payload1);
|
|
474
474
|
},
|
|
475
475
|
exposes: [e.soil_moisture(), e.battery(), e.temperature(),
|
|
476
|
-
exposes.numeric('report_delay', ea.STATE_SET).withUnit('
|
|
476
|
+
exposes.numeric('report_delay', ea.STATE_SET).withUnit('min').withValueMin(1).withValueMax(240)
|
|
477
477
|
.withDescription('Adjust Report Delay. Setting the time in minutes, by default 15 minutes')],
|
|
478
478
|
},
|
|
479
479
|
{
|
|
@@ -823,7 +823,7 @@ module.exports = [
|
|
|
823
823
|
await reporting.batteryPercentageRemaining(endpoint, overides);
|
|
824
824
|
},
|
|
825
825
|
exposes: [e.battery(), e.temperature(), e.humidity(),
|
|
826
|
-
exposes.numeric('report_delay', ea.STATE_SET).withUnit('
|
|
826
|
+
exposes.numeric('report_delay', ea.STATE_SET).withUnit('min')
|
|
827
827
|
.withDescription('Adjust Report Delay. Setting the time in minutes, by default 5 minutes')
|
|
828
828
|
.withValueMin(1).withValueMax(60),
|
|
829
829
|
exposes.binary('enable_temperature', ea.STATE_SET, 'ON', 'OFF').withDescription('Enable Temperature Control'),
|
package/devices/frankever.js
CHANGED
|
@@ -17,7 +17,7 @@ module.exports = [
|
|
|
17
17
|
exposes: [e.switch().setAccess('state', ea.STATE_SET),
|
|
18
18
|
exposes.numeric('threshold', exposes.access.STATE_SET).withValueMin(0).withValueMax(100).withUnit('%')
|
|
19
19
|
.withDescription('Valve open percentage (multiple of 10)'),
|
|
20
|
-
exposes.numeric('timer', exposes.access.STATE_SET).withValueMin(0).withValueMax(600).withUnit('
|
|
20
|
+
exposes.numeric('timer', exposes.access.STATE_SET).withValueMin(0).withValueMax(600).withUnit('min')
|
|
21
21
|
.withDescription('Countdown timer in minutes')],
|
|
22
22
|
},
|
|
23
23
|
];
|
package/devices/ikea.js
CHANGED
|
@@ -741,7 +741,6 @@ module.exports = [
|
|
|
741
741
|
exposes.binary('illuminance_above_threshold', ea.STATE, true, false)
|
|
742
742
|
.withDescription('Indicates whether the device detected bright light (works only in night mode)')],
|
|
743
743
|
ota: ota.tradfri,
|
|
744
|
-
meta: {battery: {dontDividePercentage: true}},
|
|
745
744
|
configure: async (device, coordinatorEndpoint, logger) => {
|
|
746
745
|
const endpoint = device.getEndpoint(1);
|
|
747
746
|
await reporting.bind(endpoint, coordinatorEndpoint, ['genPowerCfg']);
|
package/devices/mercator.js
CHANGED
|
@@ -183,6 +183,10 @@ module.exports = [
|
|
|
183
183
|
await reporting.bind(endpoint, coordinatorEndpoint, ['genOnOff', 'genIdentify', 'manuSpecificTuya', 'hvacFanCtrl']);
|
|
184
184
|
await reporting.onOff(endpoint);
|
|
185
185
|
await reporting.fanMode(endpoint);
|
|
186
|
+
|
|
187
|
+
// Device ships with {fanModeSequence: 1} which restricts physical speed
|
|
188
|
+
// button to low/high. Set to 0 to allow low/med/high from physical press.
|
|
189
|
+
await endpoint.write('hvacFanCtrl', {fanModeSequence: 0});
|
|
186
190
|
},
|
|
187
191
|
},
|
|
188
192
|
{
|
package/devices/moes.js
CHANGED
|
@@ -308,9 +308,9 @@ module.exports = [
|
|
|
308
308
|
'You can set up to 4 stages of temperature every for WEEKDAY ➀➁➂➃➄, SATURDAY ➅ and SUNDAY ➆.'),
|
|
309
309
|
exposes.binary('boost_heating', ea.STATE_SET, 'ON', 'OFF').withDescription('Boost Heating: press and hold "+" for 3 seconds, ' +
|
|
310
310
|
'the device will enter the boost heating mode, and the ▷╵◁ will flash. The countdown will be displayed in the APP'),
|
|
311
|
-
exposes.numeric('boost_heating_countdown', ea.STATE).withUnit('
|
|
311
|
+
exposes.numeric('boost_heating_countdown', ea.STATE).withUnit('min').withDescription('Countdown in minutes')
|
|
312
312
|
.withValueMin(0).withValueMax(15),
|
|
313
|
-
exposes.numeric('boost_heating_countdown_time_set', ea.STATE_SET).withUnit('
|
|
313
|
+
exposes.numeric('boost_heating_countdown_time_set', ea.STATE_SET).withUnit('s')
|
|
314
314
|
.withDescription('Boost Time Setting 100 sec - 900 sec, (default = 300 sec)').withValueMin(100)
|
|
315
315
|
.withValueMax(900).withValueStep(100)],
|
|
316
316
|
},
|
package/devices/neo.js
CHANGED
|
@@ -19,7 +19,7 @@ module.exports = [
|
|
|
19
19
|
exposes.binary('temperature_alarm', ea.STATE_SET, true, false),
|
|
20
20
|
exposes.binary('alarm', ea.STATE_SET, true, false),
|
|
21
21
|
exposes.enum('melody', ea.STATE_SET, Array.from(Array(18).keys()).map((x)=>(x+1).toString())),
|
|
22
|
-
exposes.numeric('duration', ea.STATE_SET).withUnit('
|
|
22
|
+
exposes.numeric('duration', ea.STATE_SET).withUnit('s').withValueMin(0).withValueMax(1800),
|
|
23
23
|
exposes.numeric('temperature_min', ea.STATE_SET).withUnit('°C').withValueMin(-20).withValueMax(80),
|
|
24
24
|
exposes.numeric('temperature_max', ea.STATE_SET).withUnit('°C').withValueMin(-20).withValueMax(80),
|
|
25
25
|
exposes.numeric('humidity_min', ea.STATE_SET).withUnit('%').withValueMin(1).withValueMax(100),
|
|
@@ -46,7 +46,7 @@ module.exports = [
|
|
|
46
46
|
e.battery_low(),
|
|
47
47
|
exposes.binary('alarm', ea.STATE_SET, true, false),
|
|
48
48
|
exposes.enum('melody', ea.STATE_SET, Array.from(Array(18).keys()).map((x)=>(x+1).toString())),
|
|
49
|
-
exposes.numeric('duration', ea.STATE_SET).withUnit('
|
|
49
|
+
exposes.numeric('duration', ea.STATE_SET).withUnit('s').withValueMin(0).withValueMax(1800),
|
|
50
50
|
exposes.enum('volume', ea.STATE_SET, ['low', 'medium', 'high']),
|
|
51
51
|
exposes.numeric('battpercentage', ea.STATE).withUnit('%'),
|
|
52
52
|
],
|
package/devices/philips.js
CHANGED
|
@@ -57,7 +57,7 @@ module.exports = [
|
|
|
57
57
|
model: '929002994901',
|
|
58
58
|
vendor: 'Philips',
|
|
59
59
|
description: 'Hue gradient lightstrip',
|
|
60
|
-
extend: philips.extend.light_onoff_brightness_colortemp_color_gradient({
|
|
60
|
+
extend: philips.extend.light_onoff_brightness_colortemp_color_gradient({colorTempRange: [153, 500]}),
|
|
61
61
|
},
|
|
62
62
|
{
|
|
63
63
|
zigbeeModel: ['929003045401'],
|
|
@@ -351,14 +351,14 @@ module.exports = [
|
|
|
351
351
|
model: '4090331P9',
|
|
352
352
|
vendor: 'Philips',
|
|
353
353
|
description: 'Hue Ensis (white)',
|
|
354
|
-
extend: philips.extend.light_onoff_brightness_colortemp_color({
|
|
354
|
+
extend: philips.extend.light_onoff_brightness_colortemp_color({colorTempRange: [153, 500]}),
|
|
355
355
|
},
|
|
356
356
|
{
|
|
357
357
|
zigbeeModel: ['4090330P9_01', '4090330P9_02', '929003052501_01', '929003052501_02'],
|
|
358
358
|
model: '4090330P9',
|
|
359
359
|
vendor: 'Philips',
|
|
360
360
|
description: 'Hue Ensis (black)',
|
|
361
|
-
extend: philips.extend.light_onoff_brightness_colortemp_color({
|
|
361
|
+
extend: philips.extend.light_onoff_brightness_colortemp_color({colorTempRange: [153, 500]}),
|
|
362
362
|
},
|
|
363
363
|
{
|
|
364
364
|
zigbeeModel: ['929003055901', '929003055901_01', '929003055901_02', '929003055901_03'],
|
|
@@ -442,7 +442,7 @@ module.exports = [
|
|
|
442
442
|
model: '7602031P7',
|
|
443
443
|
vendor: 'Philips',
|
|
444
444
|
description: 'Hue Go with Bluetooth',
|
|
445
|
-
extend: philips.extend.light_onoff_brightness_colortemp_color(
|
|
445
|
+
extend: philips.extend.light_onoff_brightness_colortemp_color(),
|
|
446
446
|
},
|
|
447
447
|
{
|
|
448
448
|
zigbeeModel: ['LCF002', 'LCF001'],
|
|
@@ -596,9 +596,7 @@ module.exports = [
|
|
|
596
596
|
model: '929001953101',
|
|
597
597
|
vendor: 'Philips',
|
|
598
598
|
description: 'Hue White and Color Ambiance GU10',
|
|
599
|
-
extend: philips.extend.light_onoff_brightness_colortemp_color({
|
|
600
|
-
colorTempRange: [153, 500], disableHueEffects: false,
|
|
601
|
-
}),
|
|
599
|
+
extend: philips.extend.light_onoff_brightness_colortemp_color({colorTempRange: [153, 500]}),
|
|
602
600
|
},
|
|
603
601
|
{
|
|
604
602
|
zigbeeModel: ['LWA003', 'LWW002'],
|
|
@@ -766,7 +764,7 @@ module.exports = [
|
|
|
766
764
|
model: '9290022267A',
|
|
767
765
|
vendor: 'Philips',
|
|
768
766
|
description: 'Hue white ambiance E27 with Bluetooth',
|
|
769
|
-
extend: philips.extend.light_onoff_brightness_colortemp({colorTempRange: [153, 434]
|
|
767
|
+
extend: philips.extend.light_onoff_brightness_colortemp({colorTempRange: [153, 434]}),
|
|
770
768
|
},
|
|
771
769
|
{
|
|
772
770
|
zigbeeModel: ['LCP003'],
|
|
@@ -843,7 +841,7 @@ module.exports = [
|
|
|
843
841
|
model: '8718699703424',
|
|
844
842
|
vendor: 'Philips',
|
|
845
843
|
description: 'Hue white and color ambiance LightStrip plus',
|
|
846
|
-
extend: philips.extend.light_onoff_brightness_colortemp_color(
|
|
844
|
+
extend: philips.extend.light_onoff_brightness_colortemp_color(),
|
|
847
845
|
},
|
|
848
846
|
{
|
|
849
847
|
zigbeeModel: ['LCL002'],
|
|
@@ -857,37 +855,35 @@ module.exports = [
|
|
|
857
855
|
model: '9290022166',
|
|
858
856
|
vendor: 'Philips',
|
|
859
857
|
description: 'Hue white and color ambiance E26/E27',
|
|
860
|
-
extend: philips.extend.light_onoff_brightness_colortemp_color({
|
|
858
|
+
extend: philips.extend.light_onoff_brightness_colortemp_color({colorTempRange: [153, 500]}),
|
|
861
859
|
},
|
|
862
860
|
{
|
|
863
861
|
zigbeeModel: ['LCA004'],
|
|
864
862
|
model: '9290024896',
|
|
865
863
|
vendor: 'Philips',
|
|
866
864
|
description: 'Hue white and color ambiance E27',
|
|
867
|
-
extend: philips.extend.light_onoff_brightness_colortemp_color({
|
|
865
|
+
extend: philips.extend.light_onoff_brightness_colortemp_color({colorTempRange: [153, 500]}),
|
|
868
866
|
},
|
|
869
867
|
{
|
|
870
868
|
zigbeeModel: ['LCA006'],
|
|
871
869
|
model: '9290024689',
|
|
872
870
|
vendor: 'Philips',
|
|
873
871
|
description: 'Hue white and color ambiance B22 1100lm',
|
|
874
|
-
extend: philips.extend.light_onoff_brightness_colortemp_color({
|
|
872
|
+
extend: philips.extend.light_onoff_brightness_colortemp_color({colorTempRange: [153, 500]}),
|
|
875
873
|
},
|
|
876
874
|
{
|
|
877
875
|
zigbeeModel: ['LCA008'],
|
|
878
876
|
model: '929002471601',
|
|
879
877
|
vendor: 'Philips',
|
|
880
878
|
description: 'Hue white and color ambiance E26/E27 1600lm',
|
|
881
|
-
extend: philips.extend.light_onoff_brightness_colortemp_color({
|
|
882
|
-
colorTempRange: [153, 500], disableHueEffects: false,
|
|
883
|
-
}),
|
|
879
|
+
extend: philips.extend.light_onoff_brightness_colortemp_color({colorTempRange: [153, 500]}),
|
|
884
880
|
},
|
|
885
881
|
{
|
|
886
882
|
zigbeeModel: ['LCA009'],
|
|
887
883
|
model: '9290024717',
|
|
888
884
|
vendor: 'Philips',
|
|
889
885
|
description: 'Hue white and color ambiance E26/A19 1600lm',
|
|
890
|
-
extend: philips.extend.light_onoff_brightness_colortemp_color({
|
|
886
|
+
extend: philips.extend.light_onoff_brightness_colortemp_color({colorTempRange: [153, 500]}),
|
|
891
887
|
},
|
|
892
888
|
{
|
|
893
889
|
zigbeeModel: ['LCT001', 'LCT007', 'LCT010', 'LCT012', 'LCT014', 'LCT015', 'LCT016', 'LCT021'],
|
|
@@ -897,11 +893,11 @@ module.exports = [
|
|
|
897
893
|
extend: philips.extend.light_onoff_brightness_colortemp_color({colorTempRange: [153, 500]}),
|
|
898
894
|
},
|
|
899
895
|
{
|
|
900
|
-
zigbeeModel: ['1743930P7', '1744030P7', '1744030V7'],
|
|
896
|
+
zigbeeModel: ['1743930P7', '1744030P7', '1744030V7', '1743930V7'],
|
|
901
897
|
model: '1743930P7',
|
|
902
898
|
vendor: 'Philips',
|
|
903
899
|
description: 'Hue Outdoor Econic wall lantern',
|
|
904
|
-
extend: philips.extend.light_onoff_brightness_colortemp_color({
|
|
900
|
+
extend: philips.extend.light_onoff_brightness_colortemp_color({colorTempRange: [153, 500]}),
|
|
905
901
|
},
|
|
906
902
|
{
|
|
907
903
|
zigbeeModel: ['929003053001'],
|
|
@@ -999,7 +995,7 @@ module.exports = [
|
|
|
999
995
|
model: '929001953301',
|
|
1000
996
|
vendor: 'Philips',
|
|
1001
997
|
description: 'Hue white ambiance GU10 with Bluetooth',
|
|
1002
|
-
extend: philips.extend.light_onoff_brightness_colortemp({colorTempRange: [153, 454]
|
|
998
|
+
extend: philips.extend.light_onoff_brightness_colortemp({colorTempRange: [153, 454]}),
|
|
1003
999
|
},
|
|
1004
1000
|
{
|
|
1005
1001
|
zigbeeModel: ['LTD005'],
|
|
@@ -1181,7 +1177,7 @@ module.exports = [
|
|
|
1181
1177
|
model: '4090230P9',
|
|
1182
1178
|
vendor: 'Philips',
|
|
1183
1179
|
description: 'Hue Liane (black)',
|
|
1184
|
-
extend: philips.extend.light_onoff_brightness_colortemp_color({colorTempRange: [153, 500]
|
|
1180
|
+
extend: philips.extend.light_onoff_brightness_colortemp_color({colorTempRange: [153, 500]}),
|
|
1185
1181
|
},
|
|
1186
1182
|
{
|
|
1187
1183
|
zigbeeModel: ['929003053201'],
|
|
@@ -1209,14 +1205,14 @@ module.exports = [
|
|
|
1209
1205
|
model: '3261030P6',
|
|
1210
1206
|
vendor: 'Philips',
|
|
1211
1207
|
description: 'Hue Being black',
|
|
1212
|
-
extend: philips.extend.light_onoff_brightness_colortemp(
|
|
1208
|
+
extend: philips.extend.light_onoff_brightness_colortemp(),
|
|
1213
1209
|
},
|
|
1214
1210
|
{
|
|
1215
1211
|
zigbeeModel: ['3261031P6', '929003055001', '929003055101'],
|
|
1216
1212
|
model: '3261031P6',
|
|
1217
1213
|
vendor: 'Philips',
|
|
1218
1214
|
description: 'Hue Being white',
|
|
1219
|
-
extend: philips.extend.light_onoff_brightness_colortemp({colorTempRange: [153, 454]
|
|
1215
|
+
extend: philips.extend.light_onoff_brightness_colortemp({colorTempRange: [153, 454]}),
|
|
1220
1216
|
},
|
|
1221
1217
|
{
|
|
1222
1218
|
zigbeeModel: ['3261048P6'],
|
|
@@ -1496,7 +1492,7 @@ module.exports = [
|
|
|
1496
1492
|
model: '1742930P7',
|
|
1497
1493
|
vendor: 'Philips',
|
|
1498
1494
|
description: 'Hue outdoor Impress wall lamp',
|
|
1499
|
-
extend: philips.extend.light_onoff_brightness_colortemp_color(
|
|
1495
|
+
extend: philips.extend.light_onoff_brightness_colortemp_color(),
|
|
1500
1496
|
},
|
|
1501
1497
|
{
|
|
1502
1498
|
zigbeeModel: ['1743030P7'],
|
|
@@ -1524,7 +1520,7 @@ module.exports = [
|
|
|
1524
1520
|
model: '1746430P7',
|
|
1525
1521
|
vendor: 'Philips',
|
|
1526
1522
|
description: 'Hue outdoor Resonate wall lamp (black)',
|
|
1527
|
-
extend: philips.extend.light_onoff_brightness_colortemp_color({colorTempRange: [153, 500]
|
|
1523
|
+
extend: philips.extend.light_onoff_brightness_colortemp_color({colorTempRange: [153, 500]}),
|
|
1528
1524
|
},
|
|
1529
1525
|
{
|
|
1530
1526
|
zigbeeModel: ['1746447P7'],
|
|
@@ -2187,7 +2183,7 @@ module.exports = [
|
|
|
2187
2183
|
model: '1741530P7',
|
|
2188
2184
|
vendor: 'Philips',
|
|
2189
2185
|
description: 'Hue Lily outdoor spot light',
|
|
2190
|
-
extend: philips.extend.light_onoff_brightness_colortemp_color({colorTempRange: [153, 500]
|
|
2186
|
+
extend: philips.extend.light_onoff_brightness_colortemp_color({colorTempRange: [153, 500]}),
|
|
2191
2187
|
},
|
|
2192
2188
|
{
|
|
2193
2189
|
zigbeeModel: ['1741730V7'],
|
|
@@ -2390,7 +2386,7 @@ module.exports = [
|
|
|
2390
2386
|
model: '929002422702',
|
|
2391
2387
|
vendor: 'Philips',
|
|
2392
2388
|
description: 'Hue Play gradient lightstrip 55',
|
|
2393
|
-
extend: philips.extend.light_onoff_brightness_colortemp_color_gradient({
|
|
2389
|
+
extend: philips.extend.light_onoff_brightness_colortemp_color_gradient({colorTempRange: [153, 500]}),
|
|
2394
2390
|
},
|
|
2395
2391
|
{
|
|
2396
2392
|
zigbeeModel: ['LCX002'],
|
|
@@ -2488,7 +2484,7 @@ module.exports = [
|
|
|
2488
2484
|
model: '9290024687',
|
|
2489
2485
|
vendor: 'Philips',
|
|
2490
2486
|
description: 'Hue White and Color Ambiance A19 1100 lumen',
|
|
2491
|
-
extend: philips.extend.light_onoff_brightness_colortemp_color({
|
|
2487
|
+
extend: philips.extend.light_onoff_brightness_colortemp_color({colorTempRange: [153, 500]}),
|
|
2492
2488
|
},
|
|
2493
2489
|
{
|
|
2494
2490
|
zigbeeModel: ['RDM002'],
|
|
@@ -2527,7 +2523,7 @@ module.exports = [
|
|
|
2527
2523
|
model: '9290022266A',
|
|
2528
2524
|
vendor: 'Philips',
|
|
2529
2525
|
description: 'Hue White and color ambiance A19 800 lumen',
|
|
2530
|
-
extend: philips.extend.light_onoff_brightness_colortemp_color({
|
|
2526
|
+
extend: philips.extend.light_onoff_brightness_colortemp_color({colorTempRange: [153, 500]}),
|
|
2531
2527
|
},
|
|
2532
2528
|
{
|
|
2533
2529
|
zigbeeModel: ['LWE003'],
|
|
@@ -2611,7 +2607,7 @@ module.exports = [
|
|
|
2611
2607
|
model: '929002966501',
|
|
2612
2608
|
vendor: 'Philips',
|
|
2613
2609
|
description: 'Hue White and Color Ambiance Surimu rectangle panel',
|
|
2614
|
-
extend: philips.extend.light_onoff_brightness_colortemp_color({
|
|
2610
|
+
extend: philips.extend.light_onoff_brightness_colortemp_color({colorTempRange: [153, 500]}),
|
|
2615
2611
|
},
|
|
2616
2612
|
{
|
|
2617
2613
|
zigbeeModel: ['5060930P7_01', '5060930P7_02', '5060930P7_03', '5060930P7_04'],
|
|
@@ -3039,13 +3035,13 @@ module.exports = [
|
|
|
3039
3035
|
model: '915005988101',
|
|
3040
3036
|
vendor: 'Philips',
|
|
3041
3037
|
description: 'Hue Gradient light tube large',
|
|
3042
|
-
extend: philips.extend.light_onoff_brightness_colortemp_color_gradient({
|
|
3038
|
+
extend: philips.extend.light_onoff_brightness_colortemp_color_gradient({colorTempRange: [153, 500]}),
|
|
3043
3039
|
},
|
|
3044
3040
|
{
|
|
3045
3041
|
zigbeeModel: ['915005987901'],
|
|
3046
3042
|
model: '915005987901',
|
|
3047
3043
|
vendor: 'Philips',
|
|
3048
3044
|
description: 'Hue Gradient light tube compact',
|
|
3049
|
-
extend: philips.extend.light_onoff_brightness_colortemp_color_gradient({
|
|
3045
|
+
extend: philips.extend.light_onoff_brightness_colortemp_color_gradient({colorTempRange: [153, 500]}),
|
|
3050
3046
|
},
|
|
3051
3047
|
];
|
package/devices/sengled.js
CHANGED
|
@@ -9,10 +9,12 @@ const e = exposes.presets;
|
|
|
9
9
|
const extendDontUse = require('../lib/extend');
|
|
10
10
|
const extend = {switch: extendDontUse.switch};
|
|
11
11
|
const sengledExtend = {
|
|
12
|
-
light_onoff_brightness: (options={}) => extendDontUse.light_onoff_brightness(
|
|
13
|
-
|
|
12
|
+
light_onoff_brightness: (options={}) => extendDontUse.light_onoff_brightness(
|
|
13
|
+
{disableEffect: true, disablePowerOnBehavior: true, ...options}),
|
|
14
|
+
light_onoff_brightness_colortemp: (options={}) => extendDontUse.light_onoff_brightness_colortemp(
|
|
15
|
+
{disableEffect: true, disablePowerOnBehavior: true, ...options}),
|
|
14
16
|
light_onoff_brightness_colortemp_color: (options={}) =>
|
|
15
|
-
extendDontUse.light_onoff_brightness_colortemp_color({disableEffect: true, ...options}),
|
|
17
|
+
extendDontUse.light_onoff_brightness_colortemp_color({disableEffect: true, disablePowerOnBehavior: true, ...options}),
|
|
16
18
|
};
|
|
17
19
|
|
|
18
20
|
module.exports = [
|
package/devices/tuya.js
CHANGED
|
@@ -2473,41 +2473,69 @@ module.exports = [
|
|
|
2473
2473
|
{vendor: 'Unknown/id3.pl', model: 'GTZ06'},
|
|
2474
2474
|
],
|
|
2475
2475
|
onEvent: tuya.onEventSetLocalTime,
|
|
2476
|
-
fromZigbee: [
|
|
2477
|
-
toZigbee: [
|
|
2478
|
-
|
|
2479
|
-
tz.haozee_thermostat_boost_heating_countdown, tz.haozee_thermostat_window_detection,
|
|
2480
|
-
tz.haozee_thermostat_child_lock, tz.haozee_thermostat_temperature_calibration, tz.haozee_thermostat_max_temperature,
|
|
2481
|
-
tz.haozee_thermostat_min_temperature, tz.haozee_thermostat_preset,
|
|
2482
|
-
],
|
|
2476
|
+
fromZigbee: [tuya.fzDataPoints],
|
|
2477
|
+
toZigbee: [tuya.tzDataPoints],
|
|
2478
|
+
configure: tuya.configureMagicPacket,
|
|
2483
2479
|
exposes: [
|
|
2484
2480
|
e.battery(), e.child_lock(), e.max_temperature(), e.min_temperature(),
|
|
2485
2481
|
e.position(), e.window_detection(),
|
|
2486
2482
|
exposes.binary('window', ea.STATE, 'CLOSED', 'OPEN').withDescription('Window status closed or open '),
|
|
2487
|
-
exposes.binary('
|
|
2483
|
+
exposes.binary('alarm_switch', ea.STATE, 'ON', 'OFF').withDescription('Thermostat in error state'),
|
|
2488
2484
|
exposes.climate()
|
|
2489
2485
|
.withLocalTemperature(ea.STATE).withSetpoint('current_heating_setpoint', 5, 35, 0.5, ea.STATE_SET)
|
|
2490
|
-
.withLocalTemperatureCalibration(-30, 30, 0.1, ea.STATE_SET)
|
|
2486
|
+
.withLocalTemperatureCalibration(-30, 30, 0.1, ea.STATE_SET)
|
|
2487
|
+
.withPreset(['auto', 'manual', 'off', 'on'],
|
|
2491
2488
|
'MANUAL MODE ☝ - In this mode, the device executes manual temperature setting. ' +
|
|
2492
|
-
|
|
2493
|
-
|
|
2494
|
-
|
|
2495
|
-
|
|
2496
|
-
.withSystemMode(['auto', 'heat', 'off'], ea.
|
|
2497
|
-
|
|
2498
|
-
|
|
2499
|
-
|
|
2500
|
-
.
|
|
2501
|
-
.withFeature(exposes.text('wednesday_schedule', ea.STATE))
|
|
2502
|
-
.withFeature(exposes.text('thursday_schedule', ea.STATE))
|
|
2503
|
-
.withFeature(exposes.text('friday_schedule', ea.STATE))
|
|
2504
|
-
.withFeature(exposes.text('saturday_schedule', ea.STATE))
|
|
2505
|
-
.withFeature(exposes.text('sunday_schedule', ea.STATE)),
|
|
2506
|
-
exposes.binary('boost_heating', ea.STATE_SET, 'ON', 'OFF').withDescription('Boost Heating: press and hold "+" for 3 seconds, ' +
|
|
2489
|
+
'When the set temperature is lower than the "minimum temperature", the valve is closed (forced closed). ' +
|
|
2490
|
+
'AUTO MODE ⏱ - In this mode, the device executes a preset week programming temperature time and temperature. ' +
|
|
2491
|
+
'ON - In this mode, the thermostat stays open ' +
|
|
2492
|
+
'OFF - In this mode, the thermostat stays closed')
|
|
2493
|
+
.withSystemMode(['auto', 'heat', 'off'], ea.STATE)
|
|
2494
|
+
.withRunningState(['idle', 'heat'], ea.STATE),
|
|
2495
|
+
...tuya.exposes.scheduleAllDays(ea.STATE_SET, 'HH:MM/C HH:MM/C HH:MM/C HH:MM/C'),
|
|
2496
|
+
exposes.binary('boost_heating', ea.STATE_SET, 'ON', 'OFF')
|
|
2497
|
+
.withDescription('Boost Heating: press and hold "+" for 3 seconds, ' +
|
|
2507
2498
|
'the device will enter the boost heating mode, and the ▷╵◁ will flash. The countdown will be displayed in the APP'),
|
|
2508
|
-
exposes.numeric('
|
|
2499
|
+
exposes.numeric('boost_time', ea.STATE_SET).withUnit('min').withDescription('Countdown in minutes')
|
|
2509
2500
|
.withValueMin(0).withValueMax(1000),
|
|
2510
2501
|
],
|
|
2502
|
+
meta: {
|
|
2503
|
+
tuyaDatapoints: [
|
|
2504
|
+
[1, null,
|
|
2505
|
+
{
|
|
2506
|
+
from: (v) => {
|
|
2507
|
+
const presetLookup = {0: 'auto', 1: 'manual', 2: 'off', 3: 'on'};
|
|
2508
|
+
const systemModeLookup = {0: 'auto', 1: 'auto', 2: 'off', 3: 'heat'};
|
|
2509
|
+
return {preset: presetLookup[v], system_mode: systemModeLookup[v]};
|
|
2510
|
+
},
|
|
2511
|
+
},
|
|
2512
|
+
],
|
|
2513
|
+
[1, 'system_mode', tuya.valueConverterBasic.lookup({'auto': tuya.enum(1), 'off': tuya.enum(2), 'on': tuya.enum(3)})],
|
|
2514
|
+
[1, 'preset', tuya.valueConverterBasic.lookup(
|
|
2515
|
+
{'auto': tuya.enum(0), 'manual': tuya.enum(1), 'off': tuya.enum(2), 'on': tuya.enum(3)})],
|
|
2516
|
+
[2, 'current_heating_setpoint', tuya.valueConverter.divideBy10],
|
|
2517
|
+
[3, 'local_temperature', tuya.valueConverter.divideBy10],
|
|
2518
|
+
[4, 'boost_heating', tuya.valueConverter.onOff],
|
|
2519
|
+
[5, 'boost_time', tuya.valueConverter.countdown],
|
|
2520
|
+
[6, 'running_state', tuya.valueConverterBasic.lookup({'heat': 1, 'idle': 0})],
|
|
2521
|
+
[7, 'window', tuya.valueConverterBasic.lookup({'OPEN': 1, 'CLOSE': 0})],
|
|
2522
|
+
[8, 'window_detection', tuya.valueConverter.onOff],
|
|
2523
|
+
[12, 'child_lock', tuya.valueConverter.lockUnlock],
|
|
2524
|
+
[13, 'battery', tuya.valueConverter.raw],
|
|
2525
|
+
[14, 'alarm_switch', tuya.valueConverter.onOff],
|
|
2526
|
+
[15, 'min_temperature', tuya.valueConverter.divideBy10],
|
|
2527
|
+
[16, 'max_temperature', tuya.valueConverter.divideBy10],
|
|
2528
|
+
[17, 'schedule_monday', tuya.valueConverter.thermostatScheduleDayMultiDPWithDayNumber(1)],
|
|
2529
|
+
[18, 'schedule_tuesday', tuya.valueConverter.thermostatScheduleDayMultiDPWithDayNumber(2)],
|
|
2530
|
+
[19, 'schedule_wednesday', tuya.valueConverter.thermostatScheduleDayMultiDPWithDayNumber(3)],
|
|
2531
|
+
[20, 'schedule_thursday', tuya.valueConverter.thermostatScheduleDayMultiDPWithDayNumber(4)],
|
|
2532
|
+
[21, 'schedule_friday', tuya.valueConverter.thermostatScheduleDayMultiDPWithDayNumber(5)],
|
|
2533
|
+
[22, 'schedule_saturday', tuya.valueConverter.thermostatScheduleDayMultiDPWithDayNumber(6)],
|
|
2534
|
+
[23, 'schedule_sunday', tuya.valueConverter.thermostatScheduleDayMultiDPWithDayNumber(7)],
|
|
2535
|
+
[101, 'local_temperature_calibration', tuya.valueConverter.localTempCalibration1],
|
|
2536
|
+
[102, 'position', tuya.valueConverter.divideBy10],
|
|
2537
|
+
],
|
|
2538
|
+
},
|
|
2511
2539
|
},
|
|
2512
2540
|
{
|
|
2513
2541
|
zigbeeModel: ['TS0121'],
|
|
@@ -3266,6 +3294,7 @@ module.exports = [
|
|
|
3266
3294
|
fingerprint: [{modelID: 'TS0210', manufacturerName: '_TYZB01_3zv6oleo'},
|
|
3267
3295
|
{modelID: 'TS0210', manufacturerName: '_TYZB01_j9xxahcl'},
|
|
3268
3296
|
{modelID: 'TS0210', manufacturerName: '_TYZB01_kulduhbj'},
|
|
3297
|
+
{modelID: 'TS0210', manufacturerName: '_TYZB01_cc3jzhlj'},
|
|
3269
3298
|
{modelID: 'TS0210', manufacturerName: '_TZ3000_bmfw9ykl'},
|
|
3270
3299
|
{modelID: 'TS0210', manufacturerName: '_TZ3000_fkxmyics'}],
|
|
3271
3300
|
model: 'TS0210',
|
|
@@ -3790,9 +3819,9 @@ module.exports = [
|
|
|
3790
3819
|
toZigbee: [tzLocal.hpsz],
|
|
3791
3820
|
onEvent: tuya.onEventSetLocalTime,
|
|
3792
3821
|
exposes: [e.presence(),
|
|
3793
|
-
exposes.numeric('duration_of_attendance', ea.STATE).withUnit('
|
|
3822
|
+
exposes.numeric('duration_of_attendance', ea.STATE).withUnit('min')
|
|
3794
3823
|
.withDescription('Shows the presence duration in minutes'),
|
|
3795
|
-
exposes.numeric('duration_of_absence', ea.STATE).withUnit('
|
|
3824
|
+
exposes.numeric('duration_of_absence', ea.STATE).withUnit('min')
|
|
3796
3825
|
.withDescription('Shows the duration of the absence in minutes'),
|
|
3797
3826
|
exposes.binary('led_state', ea.STATE_SET, true, false)
|
|
3798
3827
|
.withDescription('Turns the onboard LED on or off'),
|
package/lib/exposes.js
CHANGED
|
@@ -449,6 +449,14 @@ class Climate extends Base {
|
|
|
449
449
|
return this;
|
|
450
450
|
}
|
|
451
451
|
|
|
452
|
+
withControlSequenceOfOperation(modes, access=a.STATE) {
|
|
453
|
+
assert(!this.endpoint, 'Cannot add feature after adding endpoint');
|
|
454
|
+
const allowed = ['cooling_only', 'cooling_with_reheat', 'heating_only', 'heating_with_reheat', 'cooling_and_heating_4-pipes', 'cooling_and_heating_4-pipes_with_reheat'];
|
|
455
|
+
modes.forEach((m) => assert(allowed.includes(m)));
|
|
456
|
+
this.features.push(new Enum('control_sequence_of_operation', access, modes).withDescription('Operating environment of the thermostat'));
|
|
457
|
+
return this;
|
|
458
|
+
}
|
|
459
|
+
|
|
452
460
|
withAcLouverPosition(positions, access=a.ALL) {
|
|
453
461
|
assert(!this.endpoint, 'Cannot add feature after adding endpoint');
|
|
454
462
|
const allowed = ['fully_open', 'fully_closed', 'half_open', 'quarter_open', 'three_quarters_open'];
|
package/lib/philips.js
CHANGED
|
@@ -66,7 +66,7 @@ const extend = {
|
|
|
66
66
|
return result;
|
|
67
67
|
},
|
|
68
68
|
light_onoff_brightness_colortemp: (options={}) => {
|
|
69
|
-
options = {disableHueEffects:
|
|
69
|
+
options = {disableHueEffects: false, ...options};
|
|
70
70
|
if (!options.disableHueEffects) options.disableEffect = true;
|
|
71
71
|
const result = extendDontUse.light_onoff_brightness_colortemp(options);
|
|
72
72
|
result['ota'] = ota.zigbeeOTA;
|
|
@@ -80,7 +80,7 @@ const extend = {
|
|
|
80
80
|
return result;
|
|
81
81
|
},
|
|
82
82
|
light_onoff_brightness_color: (options={}) => {
|
|
83
|
-
options = {disableHueEffects:
|
|
83
|
+
options = {disableHueEffects: false, ...options};
|
|
84
84
|
if (!options.disableHueEffects) options.disableEffect = true;
|
|
85
85
|
const result = extendDontUse.light_onoff_brightness_color({supportsHS: true, ...options});
|
|
86
86
|
result['ota'] = ota.zigbeeOTA;
|
|
@@ -97,7 +97,7 @@ const extend = {
|
|
|
97
97
|
return result;
|
|
98
98
|
},
|
|
99
99
|
light_onoff_brightness_colortemp_color: (options={}) => {
|
|
100
|
-
options = {disableHueEffects:
|
|
100
|
+
options = {disableHueEffects: false, ...options};
|
|
101
101
|
if (!options.disableHueEffects) options.disableEffect = true;
|
|
102
102
|
const result = extendDontUse.light_onoff_brightness_colortemp_color({supportsHS: true, ...options});
|
|
103
103
|
result['ota'] = ota.zigbeeOTA;
|
package/lib/tuya.js
CHANGED
|
@@ -690,30 +690,6 @@ const dataPoints = {
|
|
|
690
690
|
tvThursdaySchedule: 113,
|
|
691
691
|
tvSaturdaySchedule: 114,
|
|
692
692
|
tvBoostMode: 115,
|
|
693
|
-
// Haozee TS0601 TRV
|
|
694
|
-
haozeeSystemMode: 1,
|
|
695
|
-
haozeeHeatingSetpoint: 2,
|
|
696
|
-
haozeeLocalTemp: 3,
|
|
697
|
-
haozeeBoostHeating: 4,
|
|
698
|
-
haozeeBoostHeatingCountdown: 5,
|
|
699
|
-
haozeeRunningState: 6,
|
|
700
|
-
haozeeWindowState: 7,
|
|
701
|
-
haozeeWindowDetection: 8,
|
|
702
|
-
haozeeChildLock: 12,
|
|
703
|
-
haozeeBattery: 13,
|
|
704
|
-
haozeeFaultAlarm: 14,
|
|
705
|
-
haozeeMinTemp: 15,
|
|
706
|
-
haozeeMaxTemp: 16,
|
|
707
|
-
haozeeScheduleMonday: 17,
|
|
708
|
-
haozeeScheduleTuesday: 18,
|
|
709
|
-
haozeeScheduleWednesday: 19,
|
|
710
|
-
haozeeScheduleThursday: 20,
|
|
711
|
-
haozeeScheduleFriday: 21,
|
|
712
|
-
haozeeScheduleSaturday: 22,
|
|
713
|
-
haozeeScheduleSunday: 23,
|
|
714
|
-
haozeeTempCalibration: 101,
|
|
715
|
-
haozeeValvePosition: 102,
|
|
716
|
-
haozeeSoftVersion: 150,
|
|
717
693
|
// HOCH / WDYK DIN Rail
|
|
718
694
|
hochCountdownTimer: 9,
|
|
719
695
|
hochFaultCode: 26,
|
|
@@ -1487,6 +1463,16 @@ const valueConverter = {
|
|
|
1487
1463
|
return payload;
|
|
1488
1464
|
},
|
|
1489
1465
|
},
|
|
1466
|
+
thermostatScheduleDayMultiDPWithDayNumber: (dayNum) => {
|
|
1467
|
+
return {
|
|
1468
|
+
from: (v) => valueConverter.thermostatScheduleDayMultiDP.from(v),
|
|
1469
|
+
to: (v) => {
|
|
1470
|
+
const data = valueConverter.thermostatScheduleDayMultiDP.to(v);
|
|
1471
|
+
data[0] = dayNum;
|
|
1472
|
+
return data;
|
|
1473
|
+
},
|
|
1474
|
+
};
|
|
1475
|
+
},
|
|
1490
1476
|
TV02SystemMode: {
|
|
1491
1477
|
to: async (v, meta) => {
|
|
1492
1478
|
const entity = meta.device.endpoints[0];
|
|
@@ -1628,6 +1614,7 @@ const tuyaTz = {
|
|
|
1628
1614
|
'week_schedule_programming', 'online', 'holiday_mode_date', 'schedule', 'schedule_monday', 'schedule_tuesday',
|
|
1629
1615
|
'schedule_wednesday', 'schedule_thursday', 'schedule_friday', 'schedule_saturday', 'schedule_sunday', 'clear_fault',
|
|
1630
1616
|
'scale_protection', 'error', 'radar_scene', 'radar_sensitivity', 'tumble_alarm_time', 'tumble_switch', 'fall_sensitivity',
|
|
1617
|
+
'min_temperature', 'max_temperature', 'window_detection', 'boost_heating',
|
|
1631
1618
|
],
|
|
1632
1619
|
convertSet: async (entity, key, value, meta) => {
|
|
1633
1620
|
// A set converter is only called once; therefore we need to loop
|