zigbee-herdsman-converters 14.0.574 → 14.0.577

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/devices/bitron.js CHANGED
@@ -186,7 +186,8 @@ module.exports = [
186
186
  vendor: 'SMaBiT (Bitron Video)',
187
187
  description: 'Wireless wall thermostat with relay',
188
188
  fromZigbee: [fz.legacy.bitron_thermostat_att_report, fz.battery, fz.hvac_user_interface],
189
- toZigbee: [tz.thermostat_occupied_heating_setpoint, tz.thermostat_local_temperature_calibration, tz.thermostat_local_temperature,
189
+ toZigbee: [tz.thermostat_control_sequence_of_operation, tz.thermostat_occupied_heating_setpoint,
190
+ tz.thermostat_occupied_cooling_setpoint, tz.thermostat_local_temperature_calibration, tz.thermostat_local_temperature,
190
191
  tz.thermostat_running_state, tz.thermostat_temperature_display_mode, tz.thermostat_keypad_lockout, tz.thermostat_system_mode],
191
192
  exposes: [e.battery(), exposes.climate().withSetpoint('occupied_heating_setpoint', 7, 30, 0.5).withLocalTemperature()
192
193
  .withSystemMode(['off', 'auto', 'heat']).withRunningState(['idle', 'heat', 'cool'])
@@ -201,6 +202,7 @@ module.exports = [
201
202
  await reporting.thermostatTemperature(endpoint);
202
203
  await reporting.thermostatTemperatureCalibration(endpoint);
203
204
  await reporting.thermostatOccupiedHeatingSetpoint(endpoint);
205
+ await reporting.thermostatOccupiedCoolingSetpoint(endpoint);
204
206
  await reporting.thermostatRunningState(endpoint);
205
207
  await reporting.batteryAlarmState(endpoint);
206
208
  await reporting.batteryVoltage(endpoint);
@@ -23,4 +23,12 @@ module.exports = [
23
23
  description: 'ZigBee Light Link wireless electronic ballast color temperature',
24
24
  extend: extend.light_onoff_brightness_colortemp(),
25
25
  },
26
+ {
27
+ zigbeeModel: ['Kobold'],
28
+ model: 'BN-600110',
29
+ vendor: 'Dresden Elektronik',
30
+ description: 'Zigbee 3.0 dimm actuator',
31
+ extend: extend.light_onoff_brightness(),
32
+ ota: ota.zigbeeOTA,
33
+ },
26
34
  ];
package/devices/heiman.js CHANGED
@@ -699,4 +699,21 @@ module.exports = [
699
699
  },
700
700
  exposes: [e.battery(), e.action(['pressed']), e.battery_low(), e.tamper()],
701
701
  },
702
+ {
703
+ zigbeeModel: ['HS3AQ-EFA-3.0'],
704
+ model: 'HS3AQ',
705
+ vendor: 'HEIMAN',
706
+ description: 'Smart air quality monitor',
707
+ fromZigbee: [fz.co2, fz.humidity, fz.battery, fz.temperature],
708
+ toZigbee: [],
709
+ configure: async (device, coordinatorEndpoint, logger) => {
710
+ const endpoint = device.getEndpoint(1);
711
+ await reporting.bind(endpoint, coordinatorEndpoint, ['msRelativeHumidity', 'genPowerCfg', 'msTemperatureMeasurement', 'msCO2']);
712
+ await reporting.batteryPercentageRemaining(endpoint);
713
+ await reporting.temperature(endpoint, {min: 1, max: constants.repInterval.MINUTES_5, change: 10}); // 0.1 degree change
714
+ await reporting.humidity(endpoint, {min: 1, max: constants.repInterval.MINUTES_5, change: 10}); // 0.1 % change
715
+ await reporting.co2(endpoint, {min: 5, max: constants.repInterval.MINUTES_5, change: 0.00005}); // 50 ppm change
716
+ },
717
+ exposes: [e.co2(), e.battery(), e.humidity(), e.temperature()],
718
+ },
702
719
  ];
@@ -0,0 +1,21 @@
1
+ const tz = require('../converters/toZigbee');
2
+ const exposes = require('../lib/exposes');
3
+ const extend = require('../lib/extend');
4
+ const e = exposes.presets;
5
+
6
+ const extendData = extend.light_onoff_brightness_colortemp_color({colorTempRange: [250, 454]});
7
+
8
+
9
+ module.exports = [
10
+ {
11
+ zigbeeModel: ['ZB-CL01'],
12
+ model: 'ZB-CL01',
13
+ vendor: 'KURVIA',
14
+ description: 'GU10 GRBWC built from AliExpress',
15
+ exposes: extendData.exposes.concat(e.power_on_behavior()),
16
+ toZigbee: [tz.on_off].concat(extendData.toZigbee),
17
+ fromZigbee: extendData.fromZigbee,
18
+ meta: {applyRedFix: true, enhancedHue: false},
19
+ },
20
+ ];
21
+
@@ -21,6 +21,31 @@ const fzLocal = {
21
21
  }
22
22
  },
23
23
  },
24
+ led_trading_9125: {
25
+ cluster: 'greenPower',
26
+ type: ['commandNotification', 'commandCommisioningNotification'],
27
+ convert: (model, msg, publish, options, meta) => {
28
+ const commandID = msg.data.commandID;
29
+ if (utils.hasAlreadyProcessedMessage(msg, msg.data.frameCounter, `${msg.device.ieeeAddr}_${commandID}`)) return;
30
+ if (commandID === 104) return; // Skip commisioning command.
31
+
32
+ // Button 1: A0 (top left)
33
+ // Button 2: A1 (bottom left)
34
+ // Button 3: B0 (top right)
35
+ // Button 4: B1 (bottom right)
36
+ const lookup = {
37
+ 0x10: 'press_1', 0x14: 'release_1', 0x11: 'press_2', 0x15: 'release_2', 0x13: 'press_3', 0x17: 'release_3',
38
+ 0x12: 'press_4', 0x16: 'release_4', 0x64: 'press_1_and_3', 0x65: 'release_1_and_3', 0x62: 'press_2_and_4',
39
+ 0x63: 'release_2_and_4',
40
+ };
41
+
42
+ if (!lookup.hasOwnProperty(commandID)) {
43
+ meta.logger.error(`LED Trading 9125: missing command '${commandID}'`);
44
+ } else {
45
+ return {action: lookup[commandID]};
46
+ }
47
+ },
48
+ },
24
49
  };
25
50
 
26
51
  module.exports = [
@@ -66,4 +91,15 @@ module.exports = [
66
91
  await reporting.bind(device.getEndpoint(5), coordinatorEndpoint, ['genOnOff']);
67
92
  },
68
93
  },
94
+ {
95
+ fingerprint: [{modelID: 'GreenPower_2', ieeeAddr: /^0x00000000017.....$/, manufId: null}],
96
+ model: '9125',
97
+ vendor: 'LED Trading',
98
+ description: 'FOH smart switch',
99
+ whiteLabel: [{vendor: 'Sunricher', model: 'SR-ZGP2801K4-FOH-E'}],
100
+ fromZigbee: [fzLocal.led_trading_9125],
101
+ toZigbee: [],
102
+ exposes: [e.action(['press_1', 'release_1', 'press_2', 'release_2', 'press_3', 'release_3', 'press_4', 'release_4',
103
+ 'press_1_and_3', 'release_1_and_3', 'press_2_and_4', 'release_2_and_4'])],
104
+ },
69
105
  ];
package/devices/osram.js CHANGED
@@ -83,7 +83,7 @@ module.exports = [
83
83
  model: 'AC03642',
84
84
  vendor: 'OSRAM',
85
85
  description: 'SMART+ CLASSIC A 60 TW',
86
- extend: extend.ledvance.light_onoff_brightness_colortemp(),
86
+ extend: extend.ledvance.light_onoff_brightness_colortemp({colorTempRange: [153, 370]}),
87
87
  ota: ota.ledvance,
88
88
  },
89
89
  {
@@ -2455,6 +2455,13 @@ module.exports = [
2455
2455
  description: 'Akari downlight',
2456
2456
  extend: hueExtend.light_onoff_brightness_colortemp_color({colorTempRange: [153, 500]}),
2457
2457
  },
2458
+ {
2459
+ zigbeeModel: ['LCD004'],
2460
+ model: '8719514382350',
2461
+ vendor: 'Philips',
2462
+ description: 'Akari downlight',
2463
+ extend: hueExtend.light_onoff_brightness_colortemp_color({colorTempRange: [153, 500]}),
2464
+ },
2458
2465
  {
2459
2466
  zigbeeModel: ['LCD006'],
2460
2467
  model: '9290031346',
package/devices/robb.js CHANGED
@@ -195,7 +195,7 @@ module.exports = [
195
195
  whiteLabel: [{vendor: 'Sunricher', model: 'SR-ZG2835'}],
196
196
  },
197
197
  {
198
- zigbeeModel: ['ROB_200-017-0'],
198
+ zigbeeModel: ['ROB_200-017-0', 'HK-PLUG-A'],
199
199
  model: 'ROB_200-017-0',
200
200
  vendor: 'ROBB',
201
201
  description: 'Zigbee smart plug',
@@ -2,9 +2,11 @@ const exposes = require('../lib/exposes');
2
2
  const fz = {...require('../converters/fromZigbee'), legacy: require('../lib/legacy').fromZigbee};
3
3
  const tz = require('../converters/toZigbee');
4
4
  const reporting = require('../lib/reporting');
5
+ const constants = require('../lib/constants');
5
6
  const extend = require('../lib/extend');
6
7
  const utils = require('../lib/utils');
7
8
  const e = exposes.presets;
9
+ const ea = exposes.access;
8
10
 
9
11
  const fzLocal = {
10
12
  sunricher_SRZGP2801K45C: {
@@ -344,4 +346,190 @@ module.exports = [
344
346
  exposes: [e.action(['press_on', 'press_off', 'press_high', 'press_low', 'hold_high', 'hold_low', 'high_low_release',
345
347
  'cw_ww_release', 'cw_dec_ww_inc', 'ww_inc_cw_dec', 'r_g_b', 'b_g_r', 'rgb_release'])],
346
348
  },
349
+ {
350
+ zigbeeModel: ['ZG9092'],
351
+ model: 'SR-ZG9092A',
352
+ vendor: 'Sunricher',
353
+ description: 'Touch thermostat',
354
+ fromZigbee: [fz.thermostat, fz.namron_thermostat, fz.metering, fz.electrical_measurement],
355
+ toZigbee: [tz.thermostat_occupied_heating_setpoint, tz.thermostat_unoccupied_heating_setpoint, tz.thermostat_occupancy,
356
+ tz.thermostat_local_temperature_calibration, tz.thermostat_local_temperature, tz.thermostat_outdoor_temperature,
357
+ tz.thermostat_system_mode, tz.thermostat_control_sequence_of_operation, tz.thermostat_running_state,
358
+ tz.namron_thermostat],
359
+ exposes: [
360
+ e.local_temperature(),
361
+ exposes.numeric('outdoor_temperature', ea.STATE_GET).withUnit('°C')
362
+ .withDescription('Current temperature measured from the floor sensor'),
363
+ exposes.climate()
364
+ .withSetpoint('occupied_heating_setpoint', 0, 40, 0.1)
365
+ .withSetpoint('unoccupied_heating_setpoint', 0, 40, 0.1)
366
+ .withLocalTemperature()
367
+ .withLocalTemperatureCalibration(-3, 3, 0.1)
368
+ .withSystemMode(['off', 'auto', 'heat'])
369
+ .withRunningState(['idle', 'heat']),
370
+ exposes.binary('away_mode', ea.ALL, 'ON', 'OFF')
371
+ .withDescription('Enable/disable away mode'),
372
+ e.power(), e.current(), e.voltage(), e.energy(),
373
+ exposes.enum('button_vibration_level', ea.ALL, ['off', 'low', 'high'])
374
+ .withDescription('Key beep volume and vibration level. Default: Low.'),
375
+ exposes.enum('floor_sensor_type', ea.ALL, ['10k', '15k', '50k', '100k', '12k'])
376
+ .withDescription('Type of the external floor sensor. Default: NTC 10K/25.'),
377
+ exposes.enum('sensor', ea.ALL, ['air', 'floor', 'both'])
378
+ .withDescription('The sensor used for heat control. Default: Room Sensor.'),
379
+ exposes.enum('powerup_status', ea.ALL, ['default', 'last_status'])
380
+ .withDescription('The mode after a power reset. Default: Previous Mode.'),
381
+ exposes.numeric('floor_sensor_calibration', ea.ALL)
382
+ .withUnit('°C')
383
+ .withValueMin(-3).withValueMax(3).withValueStep(0.1)
384
+ .withDescription('The tempearatue calibration for the exernal floor sensor, between -3 and 3 in 0.1°C. Default: 0.'),
385
+ exposes.numeric('dry_time', ea.ALL)
386
+ .withUnit('min')
387
+ .withValueMin(5).withValueMax(100)
388
+ .withDescription('The duration of Dry Mode, between 5 and 100 minutes. Default: 5.'),
389
+ exposes.enum('mode_after_dry', ea.ALL, ['off', 'manual', 'auto', 'away'])
390
+ .withDescription('The mode after Dry Mode. Default: Auto.'),
391
+ exposes.enum('temperature_display', ea.ALL, ['room', 'floor'])
392
+ .withDescription('The temperature on the display. Default: Room Temperature.'),
393
+ exposes.numeric('window_open_check', ea.ALL)
394
+ .withUnit('°C')
395
+ .withValueMin(0).withValueMax(8).withValueStep(0.5)
396
+ .withDescription('The threshold to detect window open, between 0.0 and 8.0 in 0.5 °C. Default: 0 (disabled).'),
397
+ exposes.numeric('hysterersis', ea.ALL)
398
+ .withUnit('°C')
399
+ .withValueMin(0.5).withValueMax(2).withValueStep(0.1)
400
+ .withDescription('Hysteresis setting, between 0.5 and 2 in 0.1 °C. Default: 0.5.'),
401
+ exposes.numeric('alarm_airtemp_overvalue', ea.ALL)
402
+ .withUnit('°C')
403
+ .withValueMin(20).withValueMax(60)
404
+ .withDescription('Room temperature alarm threshold, between 20 and 60 in °C. 0 means disabled. Default: 45.'),
405
+ ],
406
+ configure: async (device, coordinatorEndpoint, logger) => {
407
+ const endpoint = device.getEndpoint(1);
408
+ const binds = [
409
+ 'genBasic', 'genIdentify', 'hvacThermostat', 'seMetering', 'haElectricalMeasurement', 'genAlarms',
410
+ 'msOccupancySensing', 'genTime', 'hvacUserInterfaceCfg',
411
+ ];
412
+ await reporting.bind(endpoint, coordinatorEndpoint, binds);
413
+
414
+ // standard ZCL attributes
415
+ await reporting.thermostatTemperature(endpoint);
416
+ await reporting.thermostatOccupiedHeatingSetpoint(endpoint);
417
+ await reporting.thermostatUnoccupiedHeatingSetpoint(endpoint);
418
+
419
+ await endpoint.configureReporting('hvacThermostat', [{
420
+ attribute: 'ocupancy',
421
+ minimumReportInterval: 0,
422
+ maximumReportInterval: constants.repInterval.HOUR,
423
+ reportableChange: null,
424
+ }]);
425
+
426
+ await endpoint.read('haElectricalMeasurement', ['acVoltageMultiplier', 'acVoltageDivisor', 'acCurrentMultiplier']);
427
+ await endpoint.read('haElectricalMeasurement', ['acCurrentDivisor']);
428
+
429
+ await reporting.activePower(endpoint);
430
+ await reporting.rmsCurrent(endpoint, {min: 10, change: 10});
431
+ await reporting.rmsVoltage(endpoint, {min: 10});
432
+ await reporting.currentSummDelivered(endpoint);
433
+
434
+ // Custom attributes
435
+ const options = {manufacturerCode: 0x1224}; // Sunricher Manufacturer Code
436
+
437
+ // OperateDisplayLcdBrightnesss - removed as it has no effect
438
+ // ButtonVibrationLevel
439
+ await endpoint.configureReporting('hvacThermostat', [{
440
+ attribute: {ID: 0x1001, type: 0x30},
441
+ minimumReportInterval: 0,
442
+ maximumReportInterval: constants.repInterval.HOUR,
443
+ reportableChange: null}],
444
+ options);
445
+ // FloorSensorType
446
+ await endpoint.configureReporting('hvacThermostat', [{
447
+ attribute: {ID: 0x1002, type: 0x30},
448
+ minimumReportInterval: 0,
449
+ maximumReportInterval: constants.repInterval.HOUR,
450
+ reportableChange: null}],
451
+ options);
452
+ // ControlType
453
+ await endpoint.configureReporting('hvacThermostat', [{
454
+ attribute: {ID: 0x1003, type: 0x30},
455
+ minimumReportInterval: 0,
456
+ maximumReportInterval: constants.repInterval.HOUR,
457
+ reportableChange: null}],
458
+ options);
459
+ // PowerUpStatus
460
+ await endpoint.configureReporting('hvacThermostat', [{
461
+ attribute: {ID: 0x1004, type: 0x30},
462
+ minimumReportInterval: 0,
463
+ maximumReportInterval: constants.repInterval.HOUR,
464
+ reportableChange: null}],
465
+ options);
466
+ // FloorSensorCalibration
467
+ await endpoint.configureReporting('hvacThermostat', [{
468
+ attribute: {ID: 0x1005, type: 0x28},
469
+ minimumReportInterval: 0,
470
+ maximumReportInterval: constants.repInterval.HOUR,
471
+ reportableChange: 0}],
472
+ options);
473
+ // DryTime
474
+ await endpoint.configureReporting('hvacThermostat', [{
475
+ attribute: {ID: 0x1006, type: 0x20},
476
+ minimumReportInterval: 0,
477
+ maximumReportInterval: constants.repInterval.HOUR,
478
+ reportableChange: 0}],
479
+ options);
480
+ // ModeAfterDry
481
+ await endpoint.configureReporting('hvacThermostat', [{
482
+ attribute: {ID: 0x1007, type: 0x30},
483
+ minimumReportInterval: 0,
484
+ maximumReportInterval: constants.repInterval.HOUR,
485
+ reportableChange: null}],
486
+ options);
487
+ // TemperatureDisplay
488
+ await endpoint.configureReporting('hvacThermostat', [{
489
+ attribute: {ID: 0x1008, type: 0x30},
490
+ minimumReportInterval: 0,
491
+ maximumReportInterval: constants.repInterval.HOUR,
492
+ reportableChange: null}],
493
+ options);
494
+ // WindowOpenCheck
495
+ await endpoint.configureReporting('hvacThermostat', [{
496
+ attribute: {ID: 0x1009, type: 0x20},
497
+ minimumReportInterval: 0,
498
+ maximumReportInterval: constants.repInterval.HOUR,
499
+ reportableChange: 0}],
500
+ options);
501
+
502
+ // Hysterersis
503
+ await endpoint.configureReporting('hvacThermostat', [{
504
+ attribute: {ID: 0x100A, type: 0x20},
505
+ minimumReportInterval: 0,
506
+ maximumReportInterval: constants.repInterval.HOUR,
507
+ reportableChange: 0}],
508
+ options);
509
+
510
+ // AlarmAirTempOverValue
511
+ await endpoint.configureReporting('hvacThermostat', [{
512
+ attribute: {ID: 0x2001, type: 0x20},
513
+ minimumReportInterval: 0,
514
+ maximumReportInterval: constants.repInterval.HOUR,
515
+ reportableChange: 0}],
516
+ options);
517
+ // Away Mode Set
518
+ await endpoint.configureReporting('hvacThermostat', [{
519
+ attribute: {ID: 0x2002, type: 0x30},
520
+ minimumReportInterval: 0,
521
+ maximumReportInterval: constants.repInterval.HOUR,
522
+ reportableChange: null}],
523
+ options);
524
+
525
+ // Device does not asks for the time with binding, we need to write time during configure
526
+
527
+ // Trigger initial read
528
+ await endpoint.read('hvacThermostat', ['systemMode', 'runningState', 'occupiedHeatingSetpoint']);
529
+ await endpoint.read('hvacThermostat', [0x1001, 0x1002, 0x1003], options);
530
+ await endpoint.read('hvacThermostat', [0x1004, 0x1005, 0x1006, 0x1007], options);
531
+ await endpoint.read('hvacThermostat', [0x1008, 0x1009, 0x100A], options);
532
+ await endpoint.read('hvacThermostat', [0x2001, 0x2002], options);
533
+ },
534
+ },
347
535
  ];
package/devices/tuya.js CHANGED
@@ -467,6 +467,10 @@ module.exports = [
467
467
  return {'l1': 1, 'l2': 2};
468
468
  },
469
469
  meta: {multiEndpoint: true},
470
+ configure: async (device, coordinatorEndpoint, logger) => {
471
+ const endpoint = device.getEndpoint(1);
472
+ await endpoint.read('genBasic', ['manufacturerName', 'zclVersion', 'appVersion', 'modelId', 'powerSource', 0xfffe]);
473
+ },
470
474
  },
471
475
  {
472
476
  fingerprint: [{modelID: 'TS011F', manufacturerName: '_TZ3000_rk2yzt0u'},
@@ -912,6 +916,10 @@ module.exports = [
912
916
  fromZigbee: [fz.command_emergency, fz.battery],
913
917
  exposes: [e.battery(), e.action(['emergency'])],
914
918
  toZigbee: [],
919
+ configure: async (device, coordinatorEndpoint, logger) => {
920
+ const endpoint = device.getEndpoint(1);
921
+ await reporting.bind(endpoint, coordinatorEndpoint, ['genPowerCfg', 'genTime', 'genBasic', 'ssIasAce', 'ssIasZone']);
922
+ },
915
923
  },
916
924
  {
917
925
  fingerprint: [{modelID: 'TS0215A', manufacturerName: '_TZ3000_p6ju8myv'},
@@ -1022,7 +1030,6 @@ module.exports = [
1022
1030
  fingerprint: [
1023
1031
  {modelID: 'TS0201', manufacturerName: '_TZ3000_bguser20'},
1024
1032
  {modelID: 'TS0201', manufacturerName: '_TZ3000_fllyghyj'},
1025
- {modelID: 'TS0201', manufacturerName: '_TZ3000_dowj6gyi'},
1026
1033
  {modelID: 'TS0201', manufacturerName: '_TZ3000_yd2e749y'},
1027
1034
  {modelID: 'TS0201', manufacturerName: '_TZ3000_6uzkisv2'},
1028
1035
  ],
@@ -1037,6 +1044,21 @@ module.exports = [
1037
1044
  await endpoint.read('genBasic', ['manufacturerName', 'zclVersion', 'appVersion', 'modelId', 'powerSource', 0xfffe]);
1038
1045
  },
1039
1046
  },
1047
+ {
1048
+ fingerprint: [
1049
+ {modelID: 'TS0201', manufacturerName: '_TZ3000_dowj6gyi'},
1050
+ ],
1051
+ model: 'IH-K009',
1052
+ vendor: 'TuYa',
1053
+ description: 'Temperature & humidity sensor',
1054
+ fromZigbee: [fzLocal.TS0201_battery, fz.temperature, fz.humidity],
1055
+ toZigbee: [],
1056
+ exposes: [e.battery(), e.temperature(), e.humidity(), e.battery_voltage()],
1057
+ configure: async (device, coordinatorEndpoint, logger) => {
1058
+ const endpoint = device.getEndpoint(1);
1059
+ await endpoint.read('genBasic', ['manufacturerName', 'zclVersion', 'appVersion', 'modelId', 'powerSource', 0xfffe]);
1060
+ },
1061
+ },
1040
1062
  {
1041
1063
  fingerprint: [{modelID: 'SM0201', manufacturerName: '_TYZB01_cbiezpds'}],
1042
1064
  model: 'SM0201',
package/devices/xiaomi.js CHANGED
@@ -1313,7 +1313,7 @@ module.exports = [
1313
1313
  'the normal monitoring state, the green indicator light flashes every 60 seconds'),
1314
1314
  exposes.binary('linkage_alarm', ea.ALL, true, false).withDescription('When this option is enabled and a smoke ' +
1315
1315
  'is detected, other detectors with this option enabled will also sound the alarm buzzer'),
1316
- e.device_temperature(), e.battery(), e.battery_voltage(), e.power_outage_count(false)],
1316
+ e.battery(), e.battery_voltage(), e.power_outage_count(false)],
1317
1317
  meta: {battery: {voltageToPercentage: '3V_2850_3200'}},
1318
1318
  configure: async (device, coordinatorEndpoint, logger) => {
1319
1319
  const endpoint = device.getEndpoint(1);
package/lib/exposes.js CHANGED
@@ -372,7 +372,7 @@ class Climate extends Base {
372
372
 
373
373
  withSetpoint(property, min, max, step, access=a.ALL) {
374
374
  assert(!this.endpoint, 'Cannot add feature after adding endpoint');
375
- assert(['occupied_heating_setpoint', 'current_heating_setpoint', 'occupied_cooling_setpoint'].includes(property));
375
+ assert(['occupied_heating_setpoint', 'current_heating_setpoint', 'occupied_cooling_setpoint', 'unoccupied_heating_setpoint', 'unoccupied_cooling_setpoint'].includes(property));
376
376
  this.features.push(new Numeric(property, access)
377
377
  .withValueMin(min).withValueMax(max).withValueStep(step).withUnit('°C').withDescription('Temperature setpoint'));
378
378
  return this;
package/lib/ota/ubisys.js CHANGED
@@ -1,5 +1,5 @@
1
- const firmwareHtmlPageUrl = 'https://www.ubisys.de/en/support/firmware/';
2
- const imageRegex = /[^"\s]*\/10F2-([0-9a-f]{4})-([0-9a-f]{4})-([0-9a-f]{4})-([0-9a-f]{8})\S*ota1?\.zigbee/gi;
1
+ const firmwareHtmlPageUrl = 'http://fwu.ubisys.de/smarthome/OTA/release/index';
2
+ const imageRegex = /10F2-([0-9a-f]{4})-([0-9a-f]{4})-([0-9a-f]{4})-([0-9a-f]{8})\S*ota1?\.zigbee/gi;
3
3
  const assert = require('assert');
4
4
  const url = require('url');
5
5
  const common = require('./common');
package/lib/reporting.js CHANGED
@@ -94,6 +94,10 @@ module.exports = {
94
94
  const p = payload('measuredValue', 10, repInterval.HOUR, 100, overrides);
95
95
  await endpoint.configureReporting('msTemperatureMeasurement', p);
96
96
  },
97
+ co2: async (endpoint, overrides) => {
98
+ const p = payload('measuredValue', 10, repInterval.HOUR, 1, overrides);
99
+ await endpoint.configureReporting('msCO2', p);
100
+ },
97
101
  deviceTemperature: async (endpoint, overrides) => {
98
102
  const p = payload('currentTemperature', 300, repInterval.HOUR, 1, overrides);
99
103
  await endpoint.configureReporting('genDeviceTempCfg', p);
package/lib/xiaomi.js CHANGED
@@ -158,10 +158,11 @@ const numericAttributes2Payload = (msg, meta, model, options, dataObject) => {
158
158
  }
159
159
  break;
160
160
  case '3':
161
- if (['WXCJKG11LM', 'WXCJKG12LM', 'WXCJKG13LM', 'MCCGQ14LM', 'GZCGQ01LM'].includes(model.model)) {
161
+ if (['WXCJKG11LM', 'WXCJKG12LM', 'WXCJKG13LM', 'MCCGQ14LM', 'GZCGQ01LM', 'JY-GZ-01AQ'].includes(model.model)) {
162
162
  // The temperature value is constant 25 °C and does not change, so we ignore it
163
163
  // https://github.com/Koenkk/zigbee2mqtt/issues/11126
164
164
  // https://github.com/Koenkk/zigbee-herdsman-converters/pull/3585
165
+ // https://github.com/Koenkk/zigbee2mqtt/issues/13253
165
166
  } else {
166
167
  payload.device_temperature = calibrateAndPrecisionRoundOptions(value, options, 'device_temperature'); // 0x03
167
168
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "zigbee-herdsman-converters",
3
- "version": "14.0.574",
3
+ "version": "14.0.577",
4
4
  "description": "Collection of device converters to be used with zigbee-herdsman",
5
5
  "main": "index.js",
6
6
  "files": [