zigbee-herdsman-converters 14.0.669 → 14.0.671
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/acova.js +4 -1
- package/devices/bosch.js +24 -1
- package/devices/datek.js +9 -0
- package/devices/develco.js +21 -13
- package/devices/ge.js +1 -0
- package/devices/innr.js +1 -0
- package/devices/namron.js +5 -3
- package/devices/philips.js +2 -2
- package/devices/siterwell.js +1 -1
- package/devices/sunricher.js +9 -3
- package/devices/tuya.js +18 -113
- package/devices/ubisys.js +1 -1
- package/devices/xiaomi.js +196 -0
- package/lib/exposes.js +6 -4
- package/lib/reporting.js +1 -1
- package/package.json +2 -2
package/devices/acova.js
CHANGED
|
@@ -5,7 +5,7 @@ const reporting = require('../lib/reporting');
|
|
|
5
5
|
|
|
6
6
|
module.exports = [
|
|
7
7
|
{
|
|
8
|
-
zigbeeModel: ['PERCALE2 D1.00P1.01Z1.00', 'PERCALE2 D1.00P1.02Z1.00'],
|
|
8
|
+
zigbeeModel: ['PERCALE2 D1.00P1.01Z1.00', 'PERCALE2 D1.00P1.02Z1.00', 'PERCALE2 D1.00P1.03Z1.00'],
|
|
9
9
|
model: 'PERCALE2',
|
|
10
10
|
vendor: 'Acova',
|
|
11
11
|
description: 'Percale 2 heater',
|
|
@@ -21,6 +21,7 @@ module.exports = [
|
|
|
21
21
|
exposes: [
|
|
22
22
|
exposes.climate()
|
|
23
23
|
.withSetpoint('occupied_heating_setpoint', 7, 28, 0.5)
|
|
24
|
+
.withSetpoint('unoccupied_heating_setpoint', 7, 28, 0.5)
|
|
24
25
|
.withLocalTemperature()
|
|
25
26
|
.withSystemMode(['off', 'heat', 'auto'])
|
|
26
27
|
.withRunningState(['idle', 'heat']),
|
|
@@ -50,6 +51,7 @@ module.exports = [
|
|
|
50
51
|
exposes: [
|
|
51
52
|
exposes.climate()
|
|
52
53
|
.withSetpoint('occupied_heating_setpoint', 7, 28, 0.5)
|
|
54
|
+
.withSetpoint('unoccupied_heating_setpoint', 7, 28, 0.5)
|
|
53
55
|
.withLocalTemperature()
|
|
54
56
|
.withSystemMode(['off', 'heat', 'auto'])
|
|
55
57
|
.withRunningState(['idle', 'heat']),
|
|
@@ -81,6 +83,7 @@ module.exports = [
|
|
|
81
83
|
exposes: [
|
|
82
84
|
exposes.climate()
|
|
83
85
|
.withSetpoint('occupied_heating_setpoint', 7, 28, 0.5)
|
|
86
|
+
.withSetpoint('unoccupied_heating_setpoint', 7, 28, 0.5)
|
|
84
87
|
.withLocalTemperature()
|
|
85
88
|
.withSystemMode(['off', 'heat', 'auto'])
|
|
86
89
|
.withRunningState(['idle', 'heat']),
|
package/devices/bosch.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
const exposes = require('../lib/exposes');
|
|
2
|
-
const fz =
|
|
2
|
+
const fz = require('../converters/fromZigbee');
|
|
3
|
+
const tz = require('../converters/toZigbee');
|
|
3
4
|
const reporting = require('../lib/reporting');
|
|
4
5
|
const e = exposes.presets;
|
|
5
6
|
|
|
@@ -38,4 +39,26 @@ module.exports = [
|
|
|
38
39
|
},
|
|
39
40
|
exposes: [e.temperature(), e.battery(), e.occupancy(), e.battery_low(), e.tamper()],
|
|
40
41
|
},
|
|
42
|
+
{
|
|
43
|
+
zigbeeModel: ['RBSH-TRV0-ZB-EU'],
|
|
44
|
+
model: 'BTH-RA',
|
|
45
|
+
vendor: 'Bosch',
|
|
46
|
+
description: 'Radiator thermostat II',
|
|
47
|
+
fromZigbee: [fz.thermostat, fz.battery],
|
|
48
|
+
toZigbee: [tz.thermostat_occupied_heating_setpoint, tz.thermostat_local_temperature_calibration, tz.thermostat_local_temperature],
|
|
49
|
+
exposes: [
|
|
50
|
+
e.battery(),
|
|
51
|
+
exposes.climate()
|
|
52
|
+
.withSetpoint('occupied_heating_setpoint', 5, 30, 0.5)
|
|
53
|
+
.withLocalTemperature()
|
|
54
|
+
.withLocalTemperatureCalibration(-30, 30, 0.1),
|
|
55
|
+
],
|
|
56
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
57
|
+
const endpoint = device.getEndpoint(1);
|
|
58
|
+
await reporting.bind(endpoint, coordinatorEndpoint, ['genPowerCfg', 'hvacThermostat']);
|
|
59
|
+
await reporting.thermostatOccupiedHeatingSetpoint(endpoint);
|
|
60
|
+
await reporting.thermostatTemperature(endpoint);
|
|
61
|
+
await reporting.batteryPercentageRemaining(endpoint);
|
|
62
|
+
},
|
|
63
|
+
},
|
|
41
64
|
];
|
package/devices/datek.js
CHANGED
|
@@ -84,6 +84,15 @@ module.exports = [
|
|
|
84
84
|
exposes: [e.power(), e.energy(), e.current(), e.voltage(), e.current_phase_b(), e.voltage_phase_b(), e.current_phase_c(),
|
|
85
85
|
e.voltage_phase_c(), e.temperature()],
|
|
86
86
|
},
|
|
87
|
+
{
|
|
88
|
+
fingerprint: [{modelID: 'Motion Sensor', manufacturerName: 'Eva'}],
|
|
89
|
+
model: 'HSE2927E',
|
|
90
|
+
vendor: 'Datek',
|
|
91
|
+
description: 'Eva Zigbee motion sensor',
|
|
92
|
+
fromZigbee: [fz.ias_occupancy_alarm_1, fz.ias_occupancy_alarm_1_with_timeout, fz.illuminance, fz.temperature],
|
|
93
|
+
toZigbee: [],
|
|
94
|
+
exposes: [e.occupancy(), e.battery_low(), e.tamper(), e.illuminance(), e.illuminance_lux(), e.temperature()],
|
|
95
|
+
},
|
|
87
96
|
{
|
|
88
97
|
zigbeeModel: ['ID Lock 150'],
|
|
89
98
|
model: '0402946',
|
package/devices/develco.js
CHANGED
|
@@ -49,7 +49,7 @@ const develco = {
|
|
|
49
49
|
},
|
|
50
50
|
},
|
|
51
51
|
fz: {
|
|
52
|
-
//
|
|
52
|
+
// Some Develco devices report strange values sometimes
|
|
53
53
|
// https://github.com/Koenkk/zigbee2mqtt/issues/13329
|
|
54
54
|
electrical_measurement: {
|
|
55
55
|
...fz.electrical_measurement,
|
|
@@ -67,6 +67,14 @@ const develco = {
|
|
|
67
67
|
}
|
|
68
68
|
},
|
|
69
69
|
},
|
|
70
|
+
temperature: {
|
|
71
|
+
...fz.temperature,
|
|
72
|
+
convert: (model, msg, publish, options, meta) => {
|
|
73
|
+
if (msg.data.measuredValue !== -0x8000 && msg.data.measuredValue !== 0xFFFF) {
|
|
74
|
+
return fz.temperature.convert(model, msg, publish, options, meta);
|
|
75
|
+
}
|
|
76
|
+
},
|
|
77
|
+
},
|
|
70
78
|
metering: {
|
|
71
79
|
...fz.metering,
|
|
72
80
|
convert: (model, msg, publish, options, meta) => {
|
|
@@ -299,7 +307,7 @@ module.exports = [
|
|
|
299
307
|
model: 'SPLZB-132',
|
|
300
308
|
vendor: 'Develco',
|
|
301
309
|
description: 'Power plug',
|
|
302
|
-
fromZigbee: [fz.on_off, fz.electrical_measurement, fz.metering, fz.device_temperature],
|
|
310
|
+
fromZigbee: [fz.on_off, develco.fz.electrical_measurement, develco.fz.metering, develco.fz.device_temperature],
|
|
303
311
|
toZigbee: [tz.on_off],
|
|
304
312
|
exposes: [e.switch(), e.power(), e.current(), e.voltage(), e.energy(), e.device_temperature(), e.ac_frequency()],
|
|
305
313
|
options: [exposes.options.precision(`ac_frequency`)],
|
|
@@ -352,7 +360,7 @@ module.exports = [
|
|
|
352
360
|
model: 'SMRZB-143',
|
|
353
361
|
vendor: 'Develco',
|
|
354
362
|
description: 'Smart cable',
|
|
355
|
-
fromZigbee: [fz.on_off, fz.electrical_measurement, fz.metering, fz.device_temperature],
|
|
363
|
+
fromZigbee: [fz.on_off, develco.fz.electrical_measurement, develco.fz.metering, develco.fz.device_temperature],
|
|
356
364
|
toZigbee: [tz.on_off],
|
|
357
365
|
exposes: [e.switch(), e.power(), e.current(), e.voltage(), e.energy(), e.device_temperature()],
|
|
358
366
|
configure: async (device, coordinatorEndpoint, logger) => {
|
|
@@ -417,7 +425,7 @@ module.exports = [
|
|
|
417
425
|
model: 'SMSZB-120',
|
|
418
426
|
vendor: 'Develco',
|
|
419
427
|
description: 'Smoke detector with siren',
|
|
420
|
-
fromZigbee: [fz.temperature, fz.battery, fz.ias_smoke_alarm_1_develco, fz.ignore_basic_report,
|
|
428
|
+
fromZigbee: [develco.fz.temperature, fz.battery, fz.ias_smoke_alarm_1_develco, fz.ignore_basic_report,
|
|
421
429
|
fz.ias_enroll, fz.ias_wd, develco.fz.fault_status],
|
|
422
430
|
toZigbee: [tz.warning, tz.ias_max_duration, tz.warning_simple],
|
|
423
431
|
ota: ota.zigbeeOTA,
|
|
@@ -452,7 +460,7 @@ module.exports = [
|
|
|
452
460
|
model: 'HESZB-120',
|
|
453
461
|
vendor: 'Develco',
|
|
454
462
|
description: 'Fire detector with siren',
|
|
455
|
-
fromZigbee: [fz.temperature, fz.battery, fz.ias_smoke_alarm_1_develco, fz.ignore_basic_report,
|
|
463
|
+
fromZigbee: [develco.fz.temperature, fz.battery, fz.ias_smoke_alarm_1_develco, fz.ignore_basic_report,
|
|
456
464
|
fz.ias_enroll, fz.ias_wd, develco.fz.fault_status],
|
|
457
465
|
toZigbee: [tz.warning, tz.ias_max_duration, tz.warning_simple],
|
|
458
466
|
meta: {battery: {voltageToPercentage: '3V_2500'}},
|
|
@@ -486,7 +494,7 @@ module.exports = [
|
|
|
486
494
|
model: 'WISZB-120',
|
|
487
495
|
vendor: 'Develco',
|
|
488
496
|
description: 'Window sensor',
|
|
489
|
-
fromZigbee: [fz.ias_contact_alarm_1, fz.battery, fz.temperature],
|
|
497
|
+
fromZigbee: [fz.ias_contact_alarm_1, fz.battery, develco.fz.temperature],
|
|
490
498
|
toZigbee: [],
|
|
491
499
|
exposes: [e.contact(), e.battery(), e.battery_low(), e.tamper(), e.temperature()],
|
|
492
500
|
meta: {battery: {voltageToPercentage: '3V_2500'}},
|
|
@@ -525,7 +533,7 @@ module.exports = [
|
|
|
525
533
|
vendor: 'Develco',
|
|
526
534
|
description: 'Motion sensor',
|
|
527
535
|
fromZigbee: [
|
|
528
|
-
fz.temperature, fz.illuminance, fz.ias_occupancy_alarm_1, fz.battery,
|
|
536
|
+
develco.fz.temperature, fz.illuminance, fz.ias_occupancy_alarm_1, fz.battery,
|
|
529
537
|
develco.fz.led_control, develco.fz.ias_occupancy_timeout,
|
|
530
538
|
],
|
|
531
539
|
toZigbee: [develco.tz.led_control, develco.tz.ias_occupancy_timeout],
|
|
@@ -591,7 +599,7 @@ module.exports = [
|
|
|
591
599
|
model: 'HMSZB-110',
|
|
592
600
|
vendor: 'Develco',
|
|
593
601
|
description: 'Temperature & humidity sensor',
|
|
594
|
-
fromZigbee: [fz.battery, fz.temperature, fz.humidity],
|
|
602
|
+
fromZigbee: [fz.battery, develco.fz.temperature, fz.humidity],
|
|
595
603
|
toZigbee: [],
|
|
596
604
|
exposes: [e.battery(), e.battery_low(), e.temperature(), e.humidity()],
|
|
597
605
|
meta: {battery: {voltageToPercentage: '3V_2500_3200'}},
|
|
@@ -609,7 +617,7 @@ module.exports = [
|
|
|
609
617
|
model: 'ZHEMI101',
|
|
610
618
|
vendor: 'Develco',
|
|
611
619
|
description: 'Energy meter',
|
|
612
|
-
fromZigbee: [fz.metering, develco.fz.pulse_configuration, develco.fz.interface_mode],
|
|
620
|
+
fromZigbee: [develco.fz.metering, develco.fz.pulse_configuration, develco.fz.interface_mode],
|
|
613
621
|
toZigbee: [develco.tz.pulse_configuration, develco.tz.interface_mode, develco.tz.current_summation],
|
|
614
622
|
endpoint: (device) => {
|
|
615
623
|
return {'default': 2};
|
|
@@ -640,7 +648,7 @@ module.exports = [
|
|
|
640
648
|
model: 'SMRZB-332',
|
|
641
649
|
vendor: 'Develco',
|
|
642
650
|
description: 'Smart relay DIN',
|
|
643
|
-
fromZigbee: [fz.on_off, fz.metering],
|
|
651
|
+
fromZigbee: [fz.on_off, develco.fz.metering],
|
|
644
652
|
toZigbee: [tz.on_off],
|
|
645
653
|
exposes: [e.power(), e.energy(), e.switch()],
|
|
646
654
|
endpoint: (device) => {
|
|
@@ -658,7 +666,7 @@ module.exports = [
|
|
|
658
666
|
model: 'FLSZB-110',
|
|
659
667
|
vendor: 'Develco',
|
|
660
668
|
description: 'Flood alarm device ',
|
|
661
|
-
fromZigbee: [fz.ias_water_leak_alarm_1, fz.temperature, fz.battery],
|
|
669
|
+
fromZigbee: [fz.ias_water_leak_alarm_1, develco.fz.temperature, fz.battery],
|
|
662
670
|
toZigbee: [],
|
|
663
671
|
exposes: [e.battery_low(), e.tamper(), e.water_leak(), e.temperature(), e.battery_voltage()],
|
|
664
672
|
configure: async (device, coordinatorEndpoint, logger) => {
|
|
@@ -673,7 +681,7 @@ module.exports = [
|
|
|
673
681
|
model: 'AQSZB-110',
|
|
674
682
|
vendor: 'Develco',
|
|
675
683
|
description: 'Air quality sensor',
|
|
676
|
-
fromZigbee: [develco.fz.voc, develco.fz.voc_battery, fz.temperature, fz.humidity],
|
|
684
|
+
fromZigbee: [develco.fz.voc, develco.fz.voc_battery, develco.fz.temperature, fz.humidity],
|
|
677
685
|
toZigbee: [],
|
|
678
686
|
ota: ota.zigbeeOTA,
|
|
679
687
|
exposes: [
|
|
@@ -703,7 +711,7 @@ module.exports = [
|
|
|
703
711
|
model: 'SIRZB-110',
|
|
704
712
|
vendor: 'Develco',
|
|
705
713
|
description: 'Customizable siren',
|
|
706
|
-
fromZigbee: [fz.temperature, fz.battery, fz.ias_enroll, fz.ias_wd, fz.ias_siren],
|
|
714
|
+
fromZigbee: [develco.fz.temperature, fz.battery, fz.ias_enroll, fz.ias_wd, fz.ias_siren],
|
|
707
715
|
toZigbee: [tz.warning, tz.warning_simple, tz.ias_max_duration, tz.squawk],
|
|
708
716
|
meta: {battery: {voltageToPercentage: '3V_2500'}},
|
|
709
717
|
configure: async (device, coordinatorEndpoint, logger) => {
|
package/devices/ge.js
CHANGED
|
@@ -67,6 +67,7 @@ module.exports = [
|
|
|
67
67
|
configure: async (device, coordinatorEndpoint, logger) => {
|
|
68
68
|
const endpoint = device.getEndpoint(1);
|
|
69
69
|
await reporting.bind(endpoint, coordinatorEndpoint, ['genOnOff', 'seMetering']);
|
|
70
|
+
await reporting.onOff(endpoint);
|
|
70
71
|
await reporting.instantaneousDemand(endpoint);
|
|
71
72
|
await reporting.currentSummDelivered(endpoint);
|
|
72
73
|
endpoint.saveClusterAttributeKeyValue('seMetering', {divisor: 10000, multiplier: 1});
|
package/devices/innr.js
CHANGED
|
@@ -572,6 +572,7 @@ module.exports = [
|
|
|
572
572
|
vendor: 'Innr',
|
|
573
573
|
description: 'Smart plug',
|
|
574
574
|
extend: extend.switch(),
|
|
575
|
+
ota: ota.zigbeeOTA,
|
|
575
576
|
configure: async (device, coordinatorEndpoint, logger) => {
|
|
576
577
|
const endpoint = device.getEndpoint(1);
|
|
577
578
|
await reporting.bind(endpoint, coordinatorEndpoint, ['genOnOff']);
|
package/devices/namron.js
CHANGED
|
@@ -280,9 +280,11 @@ module.exports = [
|
|
|
280
280
|
vendor: 'Namron',
|
|
281
281
|
description: 'Remote control',
|
|
282
282
|
fromZigbee: [fz.command_on, fz.command_off, fz.command_step, fz.command_step_color_temperature, fz.command_recall,
|
|
283
|
-
fz.command_move_to_color_temp, fz.battery],
|
|
284
|
-
exposes: [e.battery(), e.action([
|
|
285
|
-
'
|
|
283
|
+
fz.command_move_to_color_temp, fz.battery, fz.command_move_to_hue],
|
|
284
|
+
exposes: [e.battery(), e.action([
|
|
285
|
+
'on', 'off', 'brightness_step_up', 'brightness_step_down', 'color_temperature_step_up',
|
|
286
|
+
'color_temperature_step_down', 'recall_*', 'color_temperature_move',
|
|
287
|
+
'move_to_hue_l1', 'move_to_hue_l2', 'move_to_hue_l3', 'move_to_hue_l4'])],
|
|
286
288
|
toZigbee: [],
|
|
287
289
|
meta: {multiEndpoint: true},
|
|
288
290
|
endpoint: (device) => {
|
package/devices/philips.js
CHANGED
|
@@ -211,7 +211,7 @@ module.exports = [
|
|
|
211
211
|
extend: hueExtend.light_onoff_brightness_colortemp({colorTempRange: [153, 454]}),
|
|
212
212
|
},
|
|
213
213
|
{
|
|
214
|
-
zigbeeModel: ['LWA018'],
|
|
214
|
+
zigbeeModel: ['LWA018', 'LWA028'],
|
|
215
215
|
model: '9290024693',
|
|
216
216
|
vendor: 'Philips',
|
|
217
217
|
description: 'Hue white A60 bulb B22 1055lm with Bluetooth',
|
|
@@ -561,7 +561,7 @@ module.exports = [
|
|
|
561
561
|
extend: hueExtend.light_onoff_brightness(),
|
|
562
562
|
},
|
|
563
563
|
{
|
|
564
|
-
zigbeeModel: ['LCT026', '7602031P7', '7602031U7', '7602031PU'],
|
|
564
|
+
zigbeeModel: ['LCT026', '7602031P7', '7602031U7', '7602031PU', '7602031J6'],
|
|
565
565
|
model: '7602031P7',
|
|
566
566
|
vendor: 'Philips',
|
|
567
567
|
description: 'Hue Go with Bluetooth',
|
package/devices/siterwell.js
CHANGED
|
@@ -30,7 +30,7 @@ module.exports = [
|
|
|
30
30
|
{vendor: 'TuYa', description: 'Głowica termostatyczna', model: 'GTZ02'},
|
|
31
31
|
{vendor: 'Revolt', description: 'Thermostatic Radiator Valve Controller', model: 'NX-4911'},
|
|
32
32
|
{vendor: 'Unitec', description: 'Thermostatic Radiator Valve Controller', model: '30946'},
|
|
33
|
-
{vendor: 'Tesla', description: 'Thermostatic Radiator Valve Controller', model: 'TSL-TRV-GS361A'},
|
|
33
|
+
{vendor: 'Tesla Smart', description: 'Thermostatic Radiator Valve Controller', model: 'TSL-TRV-GS361A'},
|
|
34
34
|
{vendor: 'Nedis', description: 'Thermostatic Radiator Valve Controller', model: 'ZBHTR10WT'},
|
|
35
35
|
{vendor: 'TCP Smart', description: 'Smart Thermostatic Radiator Valve', model: 'TBUWTRV'},
|
|
36
36
|
{vendor: 'Brennenstuhl', description: 'Radiator Thermostat', model: 'HT CZ 01'}],
|
package/devices/sunricher.js
CHANGED
|
@@ -41,11 +41,11 @@ const fzLocal = {
|
|
|
41
41
|
},
|
|
42
42
|
};
|
|
43
43
|
|
|
44
|
-
function syncTime(endpoint) {
|
|
44
|
+
async function syncTime(endpoint) {
|
|
45
45
|
try {
|
|
46
46
|
const time = Math.round(((new Date()).getTime() - constants.OneJanuary2000) / 1000 + ((new Date()).getTimezoneOffset() * -1) * 60);
|
|
47
47
|
const values = {time: time};
|
|
48
|
-
endpoint.write('genTime', values);
|
|
48
|
+
await endpoint.write('genTime', values);
|
|
49
49
|
} catch (error) {/* Do nothing*/}
|
|
50
50
|
}
|
|
51
51
|
|
|
@@ -462,7 +462,13 @@ module.exports = [
|
|
|
462
462
|
await reporting.thermostatTemperature(endpoint);
|
|
463
463
|
await reporting.thermostatOccupiedHeatingSetpoint(endpoint);
|
|
464
464
|
await reporting.thermostatUnoccupiedHeatingSetpoint(endpoint);
|
|
465
|
-
|
|
465
|
+
try {
|
|
466
|
+
await reporting.thermostatKeypadLockMode(endpoint);
|
|
467
|
+
} catch (error) {
|
|
468
|
+
// Fails for some
|
|
469
|
+
// https://github.com/Koenkk/zigbee2mqtt/issues/15025
|
|
470
|
+
logger.debug(`Failed to setup keypadLockout reporting`);
|
|
471
|
+
}
|
|
466
472
|
|
|
467
473
|
await endpoint.configureReporting('hvacThermostat', [{
|
|
468
474
|
attribute: 'occupancy',
|
package/devices/tuya.js
CHANGED
|
@@ -22,7 +22,7 @@ const TS011Fplugs = ['_TZ3000_5f43h46b', '_TZ3000_cphmq0q7', '_TZ3000_dpo1ysak',
|
|
|
22
22
|
'_TZ3000_zloso4jk', '_TZ3000_r6buo8ba', '_TZ3000_iksasdbv', '_TZ3000_idrffznf', '_TZ3000_okaz9tjs', '_TZ3210_q7oryllx',
|
|
23
23
|
'_TZ3000_ss98ec5d', '_TZ3000_gznh2xla', '_TZ3000_hdopuwv6', '_TZ3000_gvn91tmx', '_TZ3000_dksbtrzs', '_TZ3000_b28wrpvx',
|
|
24
24
|
'_TZ3000_aim0ztek', '_TZ3000_mlswgkc3', '_TZ3000_7dndcnnb', '_TZ3000_waho4jtj', '_TZ3000_nmsciidq', '_TZ3000_jtgxgmks',
|
|
25
|
-
'_TZ3000_rdfh8cfs', '_TZ3000_yujkchbz', '_TZ3000_fgwhjm9j', '_TZ3000_qeuvnohg'];
|
|
25
|
+
'_TZ3000_rdfh8cfs', '_TZ3000_yujkchbz', '_TZ3000_fgwhjm9j', '_TZ3000_qeuvnohg', '_TZ3000_rul9yxcc'];
|
|
26
26
|
|
|
27
27
|
const tzLocal = {
|
|
28
28
|
SA12IZL_silence_siren: {
|
|
@@ -813,13 +813,14 @@ module.exports = [
|
|
|
813
813
|
{modelID: 'TS0001', manufacturerName: '_TZ3000_5ng23zjs'},
|
|
814
814
|
{modelID: 'TS0001', manufacturerName: '_TZ3000_rmjr4ufz'},
|
|
815
815
|
{modelID: 'TS0001', manufacturerName: '_TZ3000_v7gnj3ad'},
|
|
816
|
+
{modelID: 'TS0001', manufacturerName: '_TZ3000_3a9beq8a'},
|
|
816
817
|
{modelID: 'TS0001', manufacturerName: '_TZ3000_ark8nv4y'},
|
|
817
818
|
{modelID: 'TS0001', manufacturerName: '_TZ3000_mx3vgyea'},
|
|
818
819
|
{modelID: 'TS0001', manufacturerName: '_TZ3000_qsp2pwtf'},
|
|
819
820
|
{modelID: 'TS0001', manufacturerName: '_TZ3000_46t1rvdu'}],
|
|
820
821
|
model: 'WHD02',
|
|
821
822
|
vendor: 'TuYa',
|
|
822
|
-
whiteLabel: [{vendor: 'TuYa', model: 'iHSW02'}],
|
|
823
|
+
whiteLabel: [{vendor: 'TuYa', model: 'iHSW02'}, {vendor: 'Aubess', model: 'TMZ02'}],
|
|
823
824
|
description: 'Wall switch module',
|
|
824
825
|
toZigbee: extend.switch().toZigbee.concat([tz.moes_power_on_behavior, tz.tuya_switch_type]),
|
|
825
826
|
fromZigbee: extend.switch().fromZigbee.concat([fz.moes_power_on_behavior, fz.tuya_switch_type]),
|
|
@@ -881,54 +882,7 @@ module.exports = [
|
|
|
881
882
|
whiteLabel: [{vendor: 'KTNNKG', model: 'ZB1248-10A'}],
|
|
882
883
|
},
|
|
883
884
|
{
|
|
884
|
-
|
|
885
|
-
{modelID: 'TS0505B', manufacturerName: '_TZ3000_jtmhndw2'},
|
|
886
|
-
{modelID: 'TS0505B', manufacturerName: '_TZ3000_ezlg0pht'},
|
|
887
|
-
{modelID: 'TS0505B', manufacturerName: '_TZ3210_3lbtuxgp'},
|
|
888
|
-
{modelID: 'TS0505B', manufacturerName: '_TZ3210_5snkkrxw'},
|
|
889
|
-
{modelID: 'TS0505B', manufacturerName: '_TZ3000_12sxjap4'},
|
|
890
|
-
{modelID: 'TS0505B', manufacturerName: '_TZ3000_x2fqbdun'},
|
|
891
|
-
{modelID: 'TS0505B', manufacturerName: '_TZ3000_589kq4ul'},
|
|
892
|
-
{modelID: 'TS0505B', manufacturerName: '_TZ3000_1mtktxdk'},
|
|
893
|
-
{modelID: 'TS0505B', manufacturerName: '_TZ3210_remypqqm'},
|
|
894
|
-
{modelID: 'TS0505B', manufacturerName: '_TZ3000_kohbva1f'},
|
|
895
|
-
{modelID: 'TS0505B', manufacturerName: '_TZ3000_luit1t00'},
|
|
896
|
-
{modelID: 'TS0505B', manufacturerName: '_TZ3210_r5afgmkl'},
|
|
897
|
-
{modelID: 'TS0505B', manufacturerName: '_TZ3210_wslkvrau'},
|
|
898
|
-
{modelID: 'TS0505B', manufacturerName: '_TZ3210_0rn9qhnu'},
|
|
899
|
-
{modelID: 'TS0505B', manufacturerName: '_TZ3210_ejctepku'},
|
|
900
|
-
{modelID: 'TS0505B', manufacturerName: '_TZ3210_bicjqpg4'},
|
|
901
|
-
{modelID: 'TS0505B', manufacturerName: '_TZ3210_jmiuubkz'},
|
|
902
|
-
{modelID: 'TS0505B', manufacturerName: '_TZ3000_cmaky9gq'},
|
|
903
|
-
{modelID: 'TS0505B', manufacturerName: '_TZ3000_tza2vjxx'},
|
|
904
|
-
{modelID: 'TS0505B', manufacturerName: '_TZ3210_it1u8ahz'},
|
|
905
|
-
{modelID: 'TS0505B', manufacturerName: '_TZ3210_k1pe6ibm'},
|
|
906
|
-
{modelID: 'TS0505B', manufacturerName: '_TZB210_1ecortg6'},
|
|
907
|
-
{modelID: 'TS0505B', manufacturerName: '_TZ3210_e020aaaj'},
|
|
908
|
-
{modelID: 'TS0505B', manufacturerName: '_TZ3210_bfwvfyx1'},
|
|
909
|
-
{modelID: 'TS0505B', manufacturerName: '_TZ3210_leyz4rju'},
|
|
910
|
-
{modelID: 'TS0505B', manufacturerName: '_TZ3210_jd3z4yig'},
|
|
911
|
-
{modelID: 'TS0505B', manufacturerName: '_TZ3210_dgdjiw1c'},
|
|
912
|
-
{modelID: 'TS0505B', manufacturerName: '_TZ3210_mzdax7ha'},
|
|
913
|
-
{modelID: 'TS0505B', manufacturerName: '_TZB210_tmi0rihb'},
|
|
914
|
-
{modelID: 'TS0505B', manufacturerName: '_TZ3210_a4s41wm4'},
|
|
915
|
-
{modelID: 'TS0505B', manufacturerName: '_TZ3210_awrucboq'},
|
|
916
|
-
{modelID: 'TS0505B', manufacturerName: '_TZ3210_ijczzg9h'},
|
|
917
|
-
{modelID: 'TS0505B', manufacturerName: '_TZ3210_qxenlrin'},
|
|
918
|
-
{modelID: 'TS0505B', manufacturerName: '_TZ3210_vaiyrvd1'},
|
|
919
|
-
{modelID: 'TS0505B', manufacturerName: '_TZ3210_iwbaamgh'},
|
|
920
|
-
{modelID: 'TS0505B', manufacturerName: '_TZ3210_klv2wul0'},
|
|
921
|
-
{modelID: 'TS0505B', manufacturerName: '_TZ3210_s6zec0of'},
|
|
922
|
-
{modelID: 'TS0505B', manufacturerName: '_TZ3210_y5fjkn7x'},
|
|
923
|
-
{modelID: 'TS0505B', manufacturerName: '_TZ3210_cuqkfz2q'},
|
|
924
|
-
{modelID: 'TS0505B', manufacturerName: '_TZ3210_6amjviba'},
|
|
925
|
-
{modelID: 'TS0505B', manufacturerName: '_TZ3000_xr5m6kfg'},
|
|
926
|
-
{modelID: 'TS0505B', manufacturerName: '_TZ3210_xr5m6kfg'},
|
|
927
|
-
{modelID: 'TS0505B', manufacturerName: '_TZ3210_bf175wi4'},
|
|
928
|
-
{modelID: 'TS0505B', manufacturerName: '_TZB210_3zfp8mki'},
|
|
929
|
-
{modelID: 'TS0505B', manufacturerName: '_TZ3000_y1vbo44x'},
|
|
930
|
-
{modelID: 'TS0505B', manufacturerName: '_TZ3210_mny0zvkm'},
|
|
931
|
-
{modelID: 'TS0505B', manufacturerName: '_TZ3210_pfupy2pg'}],
|
|
885
|
+
zigbeeModel: ['TS0505B'],
|
|
932
886
|
model: 'TS0505B',
|
|
933
887
|
vendor: 'TuYa',
|
|
934
888
|
description: 'Zigbee RGB+CCT light',
|
|
@@ -943,31 +897,17 @@ module.exports = [
|
|
|
943
897
|
meta: {applyRedFix: true, enhancedHue: false},
|
|
944
898
|
},
|
|
945
899
|
{
|
|
946
|
-
|
|
947
|
-
{modelID: 'TS0503B', manufacturerName: '_TZ3210_a5fxguxr'},
|
|
948
|
-
{modelID: 'TS0503B', manufacturerName: '_TZ3210_778drfdt'},
|
|
949
|
-
{modelID: 'TS0503B', manufacturerName: '_TZ3000_g5xawfcq'},
|
|
950
|
-
{modelID: 'TS0503B', manufacturerName: '_TZ3210_trm3l2aw'},
|
|
951
|
-
{modelID: 'TS0503B', manufacturerName: '_TZ3210_95txyzbx'},
|
|
952
|
-
{modelID: 'TS0503B', manufacturerName: '_TZ3210_odlghna1'},
|
|
953
|
-
{modelID: 'TS0503B', manufacturerName: '_TZB210_nfzrlz29'},
|
|
954
|
-
{modelID: 'TS0503B', manufacturerName: '_TZ3220_wp1k8xws'},
|
|
955
|
-
{modelID: 'TS0503B', manufacturerName: '_TZ3210_wp1k8xws'}],
|
|
900
|
+
zigbeeModel: ['TS0503B'],
|
|
956
901
|
model: 'TS0503B',
|
|
957
902
|
vendor: 'TuYa',
|
|
958
903
|
description: 'Zigbee RGB light',
|
|
904
|
+
whiteLabel: [{vendor: 'BTF-Lighting', model: 'C03Z'}],
|
|
959
905
|
extend: extend.light_onoff_brightness_color(),
|
|
960
906
|
// Requires red fix: https://github.com/Koenkk/zigbee2mqtt/issues/5962#issue-796462106
|
|
961
907
|
meta: {applyRedFix: true, enhancedHue: false},
|
|
962
908
|
},
|
|
963
909
|
{
|
|
964
|
-
|
|
965
|
-
{modelID: 'TS0504B', manufacturerName: '_TZ3210_bfvybixd'},
|
|
966
|
-
{modelID: 'TS0504B', manufacturerName: '_TZ3210_i2i0bsnv'},
|
|
967
|
-
{modelID: 'TS0504B', manufacturerName: '_TZ3210_elzv6aia'},
|
|
968
|
-
{modelID: 'TS0504B', manufacturerName: '_TZ3210_1elppmba'},
|
|
969
|
-
{modelID: 'TS0504B', manufacturerName: '_TZB210_5jn6an2y'},
|
|
970
|
-
{modelID: 'TS0504B', manufacturerName: '_TZ3210_onejz0gt'}],
|
|
910
|
+
zigbeeModel: ['TS0504B'],
|
|
971
911
|
model: 'TS0504B',
|
|
972
912
|
vendor: 'TuYa',
|
|
973
913
|
description: 'Zigbee RGBW light',
|
|
@@ -976,25 +916,14 @@ module.exports = [
|
|
|
976
916
|
meta: {applyRedFix: true},
|
|
977
917
|
},
|
|
978
918
|
{
|
|
979
|
-
|
|
919
|
+
zigbeeModel: ['TS0501A'],
|
|
980
920
|
model: 'TS0501A',
|
|
981
921
|
description: 'Zigbee light',
|
|
982
922
|
vendor: 'TuYa',
|
|
983
923
|
extend: extend.light_onoff_brightness(),
|
|
984
924
|
},
|
|
985
925
|
{
|
|
986
|
-
|
|
987
|
-
{modelID: 'TS0501B', manufacturerName: '_TZ3210_4whigl8i'},
|
|
988
|
-
{modelID: 'TS0501B', manufacturerName: '_TZ3210_9q49basr'},
|
|
989
|
-
{modelID: 'TS0501B', manufacturerName: '_TZ3210_i680rtja'},
|
|
990
|
-
{modelID: 'TS0501B', manufacturerName: '_TZ3210_grnwgegn'},
|
|
991
|
-
{modelID: 'TS0501B', manufacturerName: '_TZ3210_nehayyhx'},
|
|
992
|
-
{modelID: 'TS0501B', manufacturerName: '_TZ3210_wuheofsg'},
|
|
993
|
-
{modelID: 'TS0501B', manufacturerName: '_TZ3210_e5t9bfdv'},
|
|
994
|
-
{modelID: 'TS0501B', manufacturerName: '_TZ3210_19qb27da'},
|
|
995
|
-
{modelID: 'TS0501B', manufacturerName: '_TZ3210_aurnbfv4'},
|
|
996
|
-
{modelID: 'TS0501B', manufacturerName: '_TZ3210_4zinq6io'},
|
|
997
|
-
{modelID: 'TS0501B', manufacturerName: '_TZ3210_93gnbdgz'}],
|
|
926
|
+
zigbeeModel: ['TS0501B'],
|
|
998
927
|
model: 'TS0501B',
|
|
999
928
|
description: 'Zigbee light',
|
|
1000
929
|
vendor: 'TuYa',
|
|
@@ -1145,11 +1074,11 @@ module.exports = [
|
|
|
1145
1074
|
exposes: [e.water_leak(), e.battery_low(), e.battery()],
|
|
1146
1075
|
},
|
|
1147
1076
|
{
|
|
1148
|
-
fingerprint:
|
|
1077
|
+
fingerprint: tuya.fingerprint('TS0101', ['_TYZB01_ijihzffk', '_TZ3210_tfxwxklq']),
|
|
1149
1078
|
model: 'TS0101',
|
|
1150
1079
|
vendor: 'TuYa',
|
|
1151
1080
|
description: 'Zigbee Socket',
|
|
1152
|
-
whiteLabel: [{vendor: 'Larkkey', model: 'PS080'}],
|
|
1081
|
+
whiteLabel: [{vendor: 'Larkkey', model: 'PS080'}, {vendor: 'Mercator', model: 'SPBS01G'}],
|
|
1153
1082
|
extend: extend.switch(),
|
|
1154
1083
|
meta: {disableDefaultResponse: true},
|
|
1155
1084
|
},
|
|
@@ -1524,31 +1453,7 @@ module.exports = [
|
|
|
1524
1453
|
extend: extend.light_onoff_brightness_colortemp(),
|
|
1525
1454
|
},
|
|
1526
1455
|
{
|
|
1527
|
-
|
|
1528
|
-
{modelID: 'TS0502B', manufacturerName: '_TZ3210_s1x7gcq0'},
|
|
1529
|
-
{modelID: 'TS0502B', manufacturerName: '_TZ3210_hi1ym4bl'},
|
|
1530
|
-
{modelID: 'TS0502B', manufacturerName: '_TZ3000_muqovqv0'},
|
|
1531
|
-
{modelID: 'TS0502B', manufacturerName: '_TZ3210_qjdimezy'},
|
|
1532
|
-
{modelID: 'TS0502B', manufacturerName: '_TZ3210_psgq7ysz'},
|
|
1533
|
-
{modelID: 'TS0502B', manufacturerName: '_TZ3000_zw7wr5uo'},
|
|
1534
|
-
{modelID: 'TS0502B', manufacturerName: '_TZ3210_ok08rifa'},
|
|
1535
|
-
{modelID: 'TS0502B', manufacturerName: '_TZ3210_pz9zmxjj'},
|
|
1536
|
-
{modelID: 'TS0502B', manufacturerName: '_TZ3000_fzwhym79'},
|
|
1537
|
-
{modelID: 'TS0502B', manufacturerName: '_TZ3000_ogceypug'},
|
|
1538
|
-
{modelID: 'TS0502B', manufacturerName: '_TZ3210_rm0hthdo'},
|
|
1539
|
-
{modelID: 'TS0502B', manufacturerName: '_TZ3210_zwqnazkb'},
|
|
1540
|
-
{modelID: 'TS0502B', manufacturerName: '_TZ3210_ijsj2evj'},
|
|
1541
|
-
{modelID: 'TS0502B', manufacturerName: '_TZ3210_pgq2qvyv'},
|
|
1542
|
-
{modelID: 'TS0502B', manufacturerName: '_TZ3210_nvaik6gk'},
|
|
1543
|
-
{modelID: 'TS0502B', manufacturerName: '_TZB210_rkgngb5o'},
|
|
1544
|
-
{modelID: 'TS0502B', manufacturerName: '_TZ3000_armwcncd'},
|
|
1545
|
-
{modelID: 'TS0502B', manufacturerName: '_TZ3210_2p6wbry3'},
|
|
1546
|
-
{modelID: 'TS0502B', manufacturerName: '_TZB210_nfzrlz29'},
|
|
1547
|
-
{modelID: 'TS0502B', manufacturerName: '_TZ3210_qamcypen'},
|
|
1548
|
-
{modelID: 'TS0502B', manufacturerName: '_TZ3210_zdrhqmo0'},
|
|
1549
|
-
{modelID: 'TS0502B', manufacturerName: '_TZ3210_2cjfbpy0'},
|
|
1550
|
-
{modelID: 'TS0502B', manufacturerName: '_TZ3000_bujv0r9b'},
|
|
1551
|
-
],
|
|
1456
|
+
zigbeeModel: ['TS0502B'],
|
|
1552
1457
|
model: 'TS0502B',
|
|
1553
1458
|
vendor: 'TuYa',
|
|
1554
1459
|
description: 'Light controller',
|
|
@@ -1559,7 +1464,7 @@ module.exports = [
|
|
|
1559
1464
|
extend: extend.light_onoff_brightness_colortemp({colorTempRange: [153, 500]}),
|
|
1560
1465
|
},
|
|
1561
1466
|
{
|
|
1562
|
-
|
|
1467
|
+
zigbeeModel: ['TS0504A'],
|
|
1563
1468
|
model: 'TS0504A',
|
|
1564
1469
|
vendor: 'TuYa',
|
|
1565
1470
|
description: 'RGBW LED controller',
|
|
@@ -1807,14 +1712,13 @@ module.exports = [
|
|
|
1807
1712
|
configure: async (device, coordinatorEndpoint, logger) => {
|
|
1808
1713
|
const endpoint = device.getEndpoint(1);
|
|
1809
1714
|
await tuya.configureMagicPacket(device, coordinatorEndpoint, logger);
|
|
1810
|
-
await reporting.bind(endpoint, coordinatorEndpoint, ['genOnOff', 'haElectricalMeasurement']);
|
|
1715
|
+
await reporting.bind(endpoint, coordinatorEndpoint, ['genOnOff', 'haElectricalMeasurement', 'seMetering']);
|
|
1811
1716
|
await reporting.rmsVoltage(endpoint, {change: 5});
|
|
1812
|
-
await reporting.
|
|
1717
|
+
await reporting.rmsCurrent(endpoint, {change: 50});
|
|
1718
|
+
await reporting.currentSummDelivered(endpoint);
|
|
1813
1719
|
endpoint.saveClusterAttributeKeyValue('seMetering', {divisor: 100, multiplier: 1});
|
|
1814
1720
|
device.save();
|
|
1815
1721
|
},
|
|
1816
|
-
options: [exposes.options.measurement_poll_interval().withDescription('Only the energy value is polled for this device.')],
|
|
1817
|
-
onEvent: (type, data, device, options) => tuya.onEventMeasurementPoll(type, data, device, options, false, true),
|
|
1818
1722
|
whiteLabel: [{vendor: 'Aubess', model: 'WDH02'}],
|
|
1819
1723
|
exposes: [e.switch(), e.power(), e.voltage().withAccess(ea.STATE), e.energy(), e.power_on_behavior(), e.switch_type_2()],
|
|
1820
1724
|
},
|
|
@@ -2394,7 +2298,8 @@ module.exports = [
|
|
|
2394
2298
|
vendor: 'TuYa',
|
|
2395
2299
|
whiteLabel: [{vendor: 'LELLKI', model: 'TS011F_plug'}, {vendor: 'NEO', model: 'NAS-WR01B'},
|
|
2396
2300
|
{vendor: 'BlitzWolf', model: 'BW-SHP15'}, {vendor: 'Nous', model: 'A1Z'}, {vendor: 'BlitzWolf', model: 'BW-SHP13'},
|
|
2397
|
-
{vendor: 'MatSee Plus', model: 'PJ-ZSW01'}, {vendor: 'MODEMIX', model: 'MOD037'}, {vendor: 'MODEMIX', model: 'MOD048'}
|
|
2301
|
+
{vendor: 'MatSee Plus', model: 'PJ-ZSW01'}, {vendor: 'MODEMIX', model: 'MOD037'}, {vendor: 'MODEMIX', model: 'MOD048'},
|
|
2302
|
+
{vendor: 'Coswall', model: 'CS-AJ-DE2U-ZG-11'}],
|
|
2398
2303
|
ota: ota.zigbeeOTA,
|
|
2399
2304
|
fromZigbee: [fz.on_off, fzLocal.electrical_measurement_skip_duplicate, fzLocal.metering_skip_duplicate, fz.ignore_basic_report,
|
|
2400
2305
|
fz.tuya_switch_power_outage_memory, fz.ts011f_plug_indicator_mode, fz.ts011f_plug_child_mode],
|
package/devices/ubisys.js
CHANGED
|
@@ -825,7 +825,7 @@ module.exports = [
|
|
|
825
825
|
await reporting.thermostatOccupiedHeatingSetpoint(endpoint,
|
|
826
826
|
{min: 0, max: constants.repInterval.HOUR, change: 50});
|
|
827
827
|
await reporting.thermostatPIHeatingDemand(endpoint);
|
|
828
|
-
await reporting.
|
|
828
|
+
await reporting.thermostatOccupancy(endpoint);
|
|
829
829
|
await reporting.batteryPercentageRemaining(endpoint,
|
|
830
830
|
{min: constants.repInterval.HOUR, max: 43200, change: 1});
|
|
831
831
|
|
package/devices/xiaomi.js
CHANGED
|
@@ -9,6 +9,7 @@ const e = exposes.presets;
|
|
|
9
9
|
const ea = exposes.access;
|
|
10
10
|
const globalStore = require('../lib/store');
|
|
11
11
|
const xiaomi = require('../lib/xiaomi');
|
|
12
|
+
const utils = require('../lib/utils');
|
|
12
13
|
|
|
13
14
|
const xiaomiExtend = {
|
|
14
15
|
light_onoff_brightness_colortemp: (options={disableColorTempStartup: true}) => ({
|
|
@@ -40,6 +41,21 @@ const preventReset = async (type, data, device) => {
|
|
|
40
41
|
await device.getEndpoint(1).write('genBasic', payload, options);
|
|
41
42
|
};
|
|
42
43
|
|
|
44
|
+
const daysLookup = {
|
|
45
|
+
0x7f: 'everyday',
|
|
46
|
+
0x1f: 'workdays',
|
|
47
|
+
0x60: 'weekend',
|
|
48
|
+
0x01: 'mon',
|
|
49
|
+
0x02: 'tue',
|
|
50
|
+
0x04: 'wed',
|
|
51
|
+
0x08: 'thu',
|
|
52
|
+
0x10: 'fri',
|
|
53
|
+
0x20: 'sat',
|
|
54
|
+
0x40: 'sun',
|
|
55
|
+
0x55: 'mon-wed-fri-sun',
|
|
56
|
+
0x2a: 'tue-thu-sat',
|
|
57
|
+
};
|
|
58
|
+
|
|
43
59
|
|
|
44
60
|
const fzLocal = {
|
|
45
61
|
aqara_trv: {
|
|
@@ -98,6 +114,87 @@ const fzLocal = {
|
|
|
98
114
|
return result;
|
|
99
115
|
},
|
|
100
116
|
},
|
|
117
|
+
aqara_feeder: {
|
|
118
|
+
cluster: 'aqaraOpple',
|
|
119
|
+
type: ['attributeReport', 'readResponse'],
|
|
120
|
+
convert: (model, msg, publish, options, meta) => {
|
|
121
|
+
const result = {};
|
|
122
|
+
Object.entries(msg.data).forEach(([key, value]) => {
|
|
123
|
+
switch (parseInt(key)) {
|
|
124
|
+
case 0xfff1: {
|
|
125
|
+
const attr = value.slice(3, 7);
|
|
126
|
+
const len = value.slice(7, 8).readUInt8();
|
|
127
|
+
const val = value.slice(8, 8 + len);
|
|
128
|
+
switch (attr.readInt32BE()) {
|
|
129
|
+
case 0x04150055: // feeding
|
|
130
|
+
result['feed'] = '';
|
|
131
|
+
break;
|
|
132
|
+
case 0x041502bc: { // feeding report
|
|
133
|
+
const report = val.toString();
|
|
134
|
+
result['feeding_source'] = {1: 'manual', 2: 'remote'}[parseInt(report.slice(0, 2))];
|
|
135
|
+
result['feeding_size'] = parseInt(report.slice(3, 4));
|
|
136
|
+
break;
|
|
137
|
+
}
|
|
138
|
+
case 0x0d680055: // portions per day
|
|
139
|
+
result['portions_per_day'] = val.readUInt16BE();
|
|
140
|
+
break;
|
|
141
|
+
case 0x0d690055: // weight per day
|
|
142
|
+
result['weight_per_day'] = val.readUInt32BE();
|
|
143
|
+
break;
|
|
144
|
+
case 0x0d0b0055: // error ?
|
|
145
|
+
result['error'] = {1: true, 0: false}[val.readUInt8()];
|
|
146
|
+
break;
|
|
147
|
+
case 0x080008c8: { // schedule string
|
|
148
|
+
const schlist = val.toString().split(',');
|
|
149
|
+
const schedule = [];
|
|
150
|
+
schlist.forEach((str) => { // 7f13000100
|
|
151
|
+
const feedtime = Buffer.from(str, 'hex');
|
|
152
|
+
schedule.push({
|
|
153
|
+
'days': daysLookup[feedtime[0]],
|
|
154
|
+
'hour': feedtime[1],
|
|
155
|
+
'minute': feedtime[2],
|
|
156
|
+
'size': feedtime[3],
|
|
157
|
+
});
|
|
158
|
+
});
|
|
159
|
+
result['schedule'] = schedule;
|
|
160
|
+
break;
|
|
161
|
+
}
|
|
162
|
+
case 0x04170055: // indicator
|
|
163
|
+
result['led_indicator'] = {1: 'ON', 0: 'OFF'}[val.readUInt8()];
|
|
164
|
+
break;
|
|
165
|
+
case 0x04160055: // child lock
|
|
166
|
+
result['child_lock'] = {1: 'LOCK', 0: 'UNLOCK'}[val.readUInt8()];
|
|
167
|
+
break;
|
|
168
|
+
case 0x04180055: // mode
|
|
169
|
+
result['mode'] = {1: 'schedule', 0: 'manual'}[val.readUInt8()];
|
|
170
|
+
break;
|
|
171
|
+
case 0x0e5c0055: // serving size
|
|
172
|
+
result['serving_size'] = val.readUInt8();
|
|
173
|
+
break;
|
|
174
|
+
case 0x0e5f0055: // portion weight
|
|
175
|
+
result['portion_weight'] = val.readUInt8();
|
|
176
|
+
break;
|
|
177
|
+
case 0x080007d1: // ? 64
|
|
178
|
+
case 0x0d090055: // ? 00
|
|
179
|
+
meta.logger.warn(`zigbee-herdsman-converters:aqara_feeder: Unhandled attribute ${attr} = ${val}`);
|
|
180
|
+
break;
|
|
181
|
+
default:
|
|
182
|
+
meta.logger.warn(`zigbee-herdsman-converters:aqara_feeder: Unknown attribute ${attr} = ${val}`);
|
|
183
|
+
}
|
|
184
|
+
break;
|
|
185
|
+
}
|
|
186
|
+
case 0x00ff: // 80:13:58:91:24:33:20:24:58:53:44:07:05:97:75:17
|
|
187
|
+
case 0x0007: // 00:00:00:00:1d:b5:a6:ed
|
|
188
|
+
case 0x00f7: // 05:21:14:00:0d:23:21:25:00:00:09:21:00:01
|
|
189
|
+
meta.logger.debug(`zigbee-herdsman-converters:aqara_feeder: Unhandled key ${key} = ${value}`);
|
|
190
|
+
break;
|
|
191
|
+
default:
|
|
192
|
+
meta.logger.warn(`zigbee-herdsman-converters:aqara_feeder: Unknown key ${key} = ${value}`);
|
|
193
|
+
}
|
|
194
|
+
});
|
|
195
|
+
return result;
|
|
196
|
+
},
|
|
197
|
+
},
|
|
101
198
|
};
|
|
102
199
|
|
|
103
200
|
const tzLocal = {
|
|
@@ -235,6 +332,73 @@ const tzLocal = {
|
|
|
235
332
|
await entity.read('aqaraOpple', [0x0114], {manufacturerCode: 0x115F, disableDefaultResponse: true});
|
|
236
333
|
},
|
|
237
334
|
},
|
|
335
|
+
aqara_feeder: {
|
|
336
|
+
key: ['feed', 'schedule', 'led_indicator', 'child_lock', 'mode', 'serving_size', 'portion_weight'],
|
|
337
|
+
convertSet: async (entity, key, value, meta) => {
|
|
338
|
+
const sendAttr = async (attrCode, value, length) => {
|
|
339
|
+
entity.sendSeq = ((entity.sendSeq || 0)+1) % 256;
|
|
340
|
+
const val = Buffer.from([0x00, 0x02, entity.sendSeq, 0, 0, 0, 0, 0]);
|
|
341
|
+
entity.sendSeq += 1;
|
|
342
|
+
val.writeInt32BE(attrCode, 3);
|
|
343
|
+
val.writeUInt8(length, 7);
|
|
344
|
+
let v = Buffer.alloc(length);
|
|
345
|
+
switch (length) {
|
|
346
|
+
case 1:
|
|
347
|
+
v.writeUInt8(value);
|
|
348
|
+
break;
|
|
349
|
+
case 2:
|
|
350
|
+
v.writeUInt16BE(value);
|
|
351
|
+
break;
|
|
352
|
+
case 4:
|
|
353
|
+
v.writeUInt32BE(value);
|
|
354
|
+
break;
|
|
355
|
+
default:
|
|
356
|
+
v = value;
|
|
357
|
+
}
|
|
358
|
+
await entity.write('aqaraOpple', {0xfff1: {value: Buffer.concat([val, v]), type: 0x41}},
|
|
359
|
+
{manufacturerCode: 0x115f});
|
|
360
|
+
};
|
|
361
|
+
switch (key) {
|
|
362
|
+
case 'feed':
|
|
363
|
+
sendAttr(0x04150055, 1, 1);
|
|
364
|
+
break;
|
|
365
|
+
case 'schedule': {
|
|
366
|
+
const schedule = [];
|
|
367
|
+
value.forEach((item) => {
|
|
368
|
+
const schedItem = Buffer.from([
|
|
369
|
+
utils.getKey(daysLookup, item.days, 0x7f),
|
|
370
|
+
item.hour,
|
|
371
|
+
item.minute,
|
|
372
|
+
item.size,
|
|
373
|
+
0,
|
|
374
|
+
]);
|
|
375
|
+
schedule.push(schedItem.toString('hex'));
|
|
376
|
+
});
|
|
377
|
+
const val = Buffer.concat([Buffer.from(schedule.join(',')), Buffer.from([0])]);
|
|
378
|
+
sendAttr(0x080008c8, val, val.length);
|
|
379
|
+
break;
|
|
380
|
+
}
|
|
381
|
+
case 'led_indicator':
|
|
382
|
+
sendAttr(0x04170055, {'OFF': 0, 'ON': 1}[value], 1);
|
|
383
|
+
break;
|
|
384
|
+
case 'child_lock':
|
|
385
|
+
sendAttr(0x04160055, {'UNLOCK': 0, 'LOCK': 1}[value], 1);
|
|
386
|
+
break;
|
|
387
|
+
case 'mode':
|
|
388
|
+
sendAttr(0x04180055, {'manual': 0, 'schedule': 1}[value], 1);
|
|
389
|
+
break;
|
|
390
|
+
case 'serving_size':
|
|
391
|
+
sendAttr(0x0e5c0055, value, 4);
|
|
392
|
+
break;
|
|
393
|
+
case 'portion_weight':
|
|
394
|
+
sendAttr(0x0e5f0055, value, 4);
|
|
395
|
+
break;
|
|
396
|
+
default: // Unknown key
|
|
397
|
+
meta.logger.warn(`zigbee-herdsman-converters:aqara_feeder: Unhandled key ${key}`);
|
|
398
|
+
}
|
|
399
|
+
return {state: {[key]: value}};
|
|
400
|
+
},
|
|
401
|
+
},
|
|
238
402
|
};
|
|
239
403
|
|
|
240
404
|
module.exports = [
|
|
@@ -2409,6 +2573,38 @@ module.exports = [
|
|
|
2409
2573
|
await endpoint.read('aqaraOpple', [0x040a], {manufacturerCode: 0x115f});
|
|
2410
2574
|
},
|
|
2411
2575
|
},
|
|
2576
|
+
{
|
|
2577
|
+
zigbeeModel: ['aqara.feeder.acn001'],
|
|
2578
|
+
model: 'ZNCWWSQ01LM',
|
|
2579
|
+
vendor: 'Xiaomi',
|
|
2580
|
+
description: 'Aqara pet feeder C1',
|
|
2581
|
+
fromZigbee: [fzLocal.aqara_feeder],
|
|
2582
|
+
toZigbee: [tzLocal.aqara_feeder],
|
|
2583
|
+
exposes: [
|
|
2584
|
+
exposes.enum('feed', ea.STATE_SET, ['START']).withDescription('Start feeding'),
|
|
2585
|
+
exposes.enum('feeding_source', ea.STATE, ['manual', 'remote']).withDescription('Feeding source'),
|
|
2586
|
+
exposes.numeric('feeding_size', ea.STATE).withDescription('Feeding size').withUnit('portion'),
|
|
2587
|
+
exposes.numeric('portions_per_day', ea.STATE).withDescription('Portions per day'),
|
|
2588
|
+
exposes.numeric('weight_per_day', ea.STATE).withDescription('Weight per day').withUnit('g'),
|
|
2589
|
+
exposes.binary('error', ea.STATE, true, false)
|
|
2590
|
+
.withDescription('Indicates wether there is an error with the feeder'),
|
|
2591
|
+
exposes.list('schedule', ea.STATE_SET, exposes.composite('dayTime', exposes.access.STATE_SET)
|
|
2592
|
+
.withFeature(exposes.enum('days', exposes.access.STATE_SET, [
|
|
2593
|
+
'everyday', 'workdays', 'weekend', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat', 'sun',
|
|
2594
|
+
'mon-wed-fri-sun', 'tue-thu-sat']))
|
|
2595
|
+
.withFeature(exposes.numeric('hour', exposes.access.STATE_SET))
|
|
2596
|
+
.withFeature(exposes.numeric('minute', exposes.access.STATE_SET))
|
|
2597
|
+
.withFeature(exposes.numeric('size', exposes.access.STATE_SET)),
|
|
2598
|
+
).withDescription('Feeding schedule'),
|
|
2599
|
+
exposes.switch().withState('led_indicator', true, 'Led indicator', ea.STATE_SET, 'ON', 'OFF'),
|
|
2600
|
+
e.child_lock(),
|
|
2601
|
+
exposes.enum('mode', ea.STATE_SET, ['schedule', 'manual']).withDescription('Feeding mode'),
|
|
2602
|
+
exposes.numeric('serving_size', ea.STATE_SET).withValueMin(1).withValueMax(10).withDescription('One serving size')
|
|
2603
|
+
.withUnit('portion'),
|
|
2604
|
+
exposes.numeric('portion_weight', ea.STATE_SET).withValueMin(1).withValueMax(20).withDescription('Portion weight')
|
|
2605
|
+
.withUnit('g'),
|
|
2606
|
+
],
|
|
2607
|
+
},
|
|
2412
2608
|
{
|
|
2413
2609
|
zigbeeModel: ['lumi.remote.acn007'],
|
|
2414
2610
|
model: 'WXKG20LM',
|
package/lib/exposes.js
CHANGED
|
@@ -115,13 +115,14 @@ class Binary extends Base {
|
|
|
115
115
|
}
|
|
116
116
|
|
|
117
117
|
class List extends Base {
|
|
118
|
-
constructor(name, access) {
|
|
118
|
+
constructor(name, access, itemType) {
|
|
119
119
|
super();
|
|
120
120
|
this.type = 'list';
|
|
121
121
|
this.name = name;
|
|
122
122
|
this.property = name;
|
|
123
123
|
this.access = access;
|
|
124
|
-
this.item_type =
|
|
124
|
+
this.item_type = itemType;
|
|
125
|
+
delete this.item_type.property;
|
|
125
126
|
}
|
|
126
127
|
}
|
|
127
128
|
|
|
@@ -487,6 +488,7 @@ module.exports = {
|
|
|
487
488
|
numeric: (name, access) => new Numeric(name, access),
|
|
488
489
|
switch: () => new Switch(),
|
|
489
490
|
text: (name, access) => new Text(name, access),
|
|
491
|
+
list: (name, access, itemType) => new List(name, access, itemType),
|
|
490
492
|
options: {
|
|
491
493
|
calibration: (name, type='absolute') => new Numeric(`${name}_calibration`, access.SET).withDescription(`Calibrates the ${name} value (${type} offset), takes into effect on next report of device.`),
|
|
492
494
|
precision: (name) => new Numeric(`${name}_precision`, access.SET).withValueMin(0).withValueMax(3).withDescription(`Number of digits after decimal point for ${name}, takes into effect on next report of device.`),
|
|
@@ -501,8 +503,8 @@ module.exports = {
|
|
|
501
503
|
.withDescription(`Simulate a brightness value. If this device provides a brightness_move_up or brightness_move_down action it is possible to specify the update interval and delta. The action_brightness_delta indicates the delta for each interval. ${extraNote}`)
|
|
502
504
|
.withFeature(new Numeric('delta', access.SET).withValueMin(0).withDescription('Delta per interval, 20 by default'))
|
|
503
505
|
.withFeature(new Numeric('interval', access.SET).withValueMin(0).withUnit('ms').withDescription('Interval duration')),
|
|
504
|
-
no_occupancy_since_true: () => new List(`no_occupancy_since`, access.SET).withDescription('Sends a message the last time occupancy (occupancy: true) was detected. When setting this for example to [10, 60] a `{"no_occupancy_since": 10}` will be send after 10 seconds and a `{"no_occupancy_since": 60}` after 60 seconds.'),
|
|
505
|
-
no_occupancy_since_false: () => new List(`no_occupancy_since`, access.SET).withDescription('Sends a message after the last time no occupancy (occupancy: false) was detected. When setting this for example to [10, 60] a `{"no_occupancy_since": 10}` will be send after 10 seconds and a `{"no_occupancy_since": 60}` after 60 seconds.'),
|
|
506
|
+
no_occupancy_since_true: () => new List(`no_occupancy_since`, access.SET, new Numeric('time', access.STATE_SET)).withDescription('Sends a message the last time occupancy (occupancy: true) was detected. When setting this for example to [10, 60] a `{"no_occupancy_since": 10}` will be send after 10 seconds and a `{"no_occupancy_since": 60}` after 60 seconds.'),
|
|
507
|
+
no_occupancy_since_false: () => new List(`no_occupancy_since`, access.SET, new Numeric('time', access.STATE_SET)).withDescription('Sends a message after the last time no occupancy (occupancy: false) was detected. When setting this for example to [10, 60] a `{"no_occupancy_since": 10}` will be send after 10 seconds and a `{"no_occupancy_since": 60}` after 60 seconds.'),
|
|
506
508
|
presence_timeout: () => new Numeric(`presence_timeout`).withValueMin(0).withDescription('Time in seconds after which presence is cleared after detecting it (default 100 seconds).'),
|
|
507
509
|
no_position_support: () => new Binary('no_position_support', access.SET, true, false).withDescription('Set to true when your device only reports position 0, 100 and 50 (in this case your device has an older firmware) (default false).'),
|
|
508
510
|
transition: () => new Numeric(`transition`, access.SET).withValueMin(0).withDescription('Controls the transition time (in seconds) of on/off, brightness, color temperature (if applicable) and color (if applicable) changes. Defaults to `0` (no transition).'),
|
package/lib/reporting.js
CHANGED
|
@@ -178,7 +178,7 @@ module.exports = {
|
|
|
178
178
|
const p = payload('runningMode', 10, repInterval.HOUR, null, overrides);
|
|
179
179
|
await endpoint.configureReporting('hvacThermostat', p);
|
|
180
180
|
},
|
|
181
|
-
|
|
181
|
+
thermostatOccupancy: async (endpoint, overrides) => {
|
|
182
182
|
const p = payload('occupancy', 0, repInterval.HOUR, 0, overrides);
|
|
183
183
|
await endpoint.configureReporting('hvacThermostat', p);
|
|
184
184
|
},
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "zigbee-herdsman-converters",
|
|
3
|
-
"version": "14.0.
|
|
3
|
+
"version": "14.0.671",
|
|
4
4
|
"description": "Collection of device converters to be used with zigbee-herdsman",
|
|
5
5
|
"main": "index.js",
|
|
6
6
|
"files": [
|
|
@@ -38,7 +38,7 @@
|
|
|
38
38
|
"buffer-crc32": "^0.2.13",
|
|
39
39
|
"https-proxy-agent": "^5.0.1",
|
|
40
40
|
"tar-stream": "^2.2.0",
|
|
41
|
-
"zigbee-herdsman": "^0.14.
|
|
41
|
+
"zigbee-herdsman": "^0.14.73"
|
|
42
42
|
},
|
|
43
43
|
"devDependencies": {
|
|
44
44
|
"eslint": "*",
|