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.
@@ -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'],
@@ -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
- await entity.write('hvacThermostat', {ctrlSeqeOfOper: val});
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: [tz.thermostat_control_sequence_of_operation, tz.thermostat_occupied_heating_setpoint,
194
- tz.thermostat_occupied_cooling_setpoint, tz.thermostat_local_temperature_calibration, tz.thermostat_local_temperature,
195
- tz.thermostat_running_state, tz.thermostat_temperature_display_mode, tz.thermostat_keypad_lockout, tz.thermostat_system_mode],
196
- exposes: [e.battery(), exposes.climate().withSetpoint('occupied_heating_setpoint', 7, 30, 0.5).withLocalTemperature()
197
- .withSystemMode(['off', 'heat']).withRunningState(['idle', 'heat'])
198
- .withLocalTemperatureCalibration(), e.keypad_lockout()],
199
- meta: {battery: {voltageToPercentage: '3V_2500_3200'}},
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('Minutes').withValueMin(1).withValueMax(240)
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('Minutes')
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'),
@@ -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('minutes')
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']);
@@ -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('minutes').withDescription('Countdown in minutes')
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('seconds')
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('second').withValueMin(0).withValueMax(1800),
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('second').withValueMin(0).withValueMax(1800),
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
  ],
@@ -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({disableHueEffects: false, colorTempRange: [153, 500]}),
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({disableHueEffects: false, colorTempRange: [153, 500]}),
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({disableHueEffects: false, colorTempRange: [153, 500]}),
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({disableHueEffects: false}),
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], disableHueEffects: false}),
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({disableHueEffects: false}),
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({disableHueEffects: false, colorTempRange: [153, 500]}),
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({disableHueEffects: false, colorTempRange: [153, 500]}),
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({disableHueEffects: false, colorTempRange: [153, 500]}),
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({disableHueEffects: false, colorTempRange: [153, 500]}),
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({disableHueEffects: false, colorTempRange: [153, 500]}),
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], disableHueEffects: false}),
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], disableHueEffects: false}),
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({disableHueEffects: false}),
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], disableHueEffects: false}),
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({disableHueEffects: false}),
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], disableHueEffects: false}),
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], disableHueEffects: false}),
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({disableHueEffects: false, colorTempRange: [153, 500]}),
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({disableHueEffects: false, colorTempRange: [153, 500]}),
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({disableHueEffects: false, colorTempRange: [153, 500]}),
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({disableHueEffects: false, colorTempRange: [153, 500]}),
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({disableHueEffects: false, colorTempRange: [153, 500]}),
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({disableHueEffects: false, colorTempRange: [153, 500]}),
3045
+ extend: philips.extend.light_onoff_brightness_colortemp_color_gradient({colorTempRange: [153, 500]}),
3050
3046
  },
3051
3047
  ];
@@ -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({disableEffect: true, ...options}),
13
- light_onoff_brightness_colortemp: (options={}) => extendDontUse.light_onoff_brightness_colortemp({disableEffect: true, ...options}),
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: [fz.ignore_basic_report, fz.ignore_tuya_set_time, fz.haozee_thermostat],
2477
- toZigbee: [
2478
- tz.haozee_thermostat_system_mode, tz.haozee_thermostat_current_heating_setpoint, tz.haozee_thermostat_boost_heating,
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('heating', ea.STATE, 'ON', 'OFF').withDescription('Device valve is open or closed (heating or not)'),
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).withPreset(['auto', 'manual', 'off', 'on'],
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
- 'When the set temperature is lower than the "minimum temperature", the valve is closed (forced closed). ' +
2493
- 'AUTO MODE ⏱ - In this mode, the device executes a preset week programming temperature time and temperature. ' +
2494
- 'ON - In this mode, the thermostat stays open ' +
2495
- 'OFF - In this mode, the thermostat stays closed')
2496
- .withSystemMode(['auto', 'heat', 'off'], ea.STATE_SET),
2497
- exposes.composite('programming_mode', 'programming_mode', ea.STATE).withDescription('Auto MODE ⏱ - In this mode, ' +
2498
- 'the device executes a preset week programming temperature time and temperature. ')
2499
- .withFeature(exposes.text('monday_schedule', ea.STATE))
2500
- .withFeature(exposes.text('tuesday_schedule', ea.STATE))
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('boost_heating_countdown', ea.STATE_SET).withUnit('min').withDescription('Countdown in minutes')
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('minutes')
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('minutes')
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: true, ...options};
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: true, ...options};
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: true, ...options};
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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "zigbee-herdsman-converters",
3
- "version": "15.0.44",
3
+ "version": "15.0.45",
4
4
  "description": "Collection of device converters to be used with zigbee-herdsman",
5
5
  "main": "index.js",
6
6
  "files": [