zigbee-herdsman-converters 14.0.668 → 14.0.670
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/converters/toZigbee.js +2 -1
- package/devices/acova.js +4 -1
- package/devices/bosch.js +24 -1
- package/devices/connecte.js +1 -5
- package/devices/datek.js +9 -0
- package/devices/develco.js +21 -13
- package/devices/ecosmart.js +1 -1
- package/devices/fantem.js +1 -1
- package/devices/ge.js +7 -2
- package/devices/innr.js +1 -0
- package/devices/legrand.js +21 -4
- package/devices/lellki.js +3 -5
- package/devices/lidl.js +1 -2
- package/devices/makegood.js +2 -1
- package/devices/mecrator.js +2 -1
- package/devices/miboxer.js +1 -1
- package/devices/moes.js +1 -2
- package/devices/neo.js +1 -1
- package/devices/philips.js +9 -2
- package/devices/siterwell.js +1 -1
- package/devices/tuya.js +28 -121
- package/devices/useelink.js +2 -2
- package/devices/woox.js +1 -4
- package/devices/zemismart.js +4 -8
- package/lib/tuya.js +1 -1
- package/package.json +2 -2
package/converters/toZigbee.js
CHANGED
|
@@ -1370,6 +1370,7 @@ const converters = {
|
|
|
1370
1370
|
}
|
|
1371
1371
|
const unoccupiedHeatingSetpoint = result;
|
|
1372
1372
|
await entity.write('hvacThermostat', {unoccupiedHeatingSetpoint});
|
|
1373
|
+
return {state: {unoccupied_heating_setpoint: value}};
|
|
1373
1374
|
},
|
|
1374
1375
|
convertGet: async (entity, key, meta) => {
|
|
1375
1376
|
await entity.read('hvacThermostat', ['unoccupiedHeatingSetpoint']);
|
|
@@ -1405,7 +1406,7 @@ const converters = {
|
|
|
1405
1406
|
}
|
|
1406
1407
|
const unoccupiedCoolingSetpoint = result;
|
|
1407
1408
|
await entity.write('hvacThermostat', {unoccupiedCoolingSetpoint});
|
|
1408
|
-
return {state: {
|
|
1409
|
+
return {state: {unoccupied_cooling_setpoint: value}};
|
|
1409
1410
|
},
|
|
1410
1411
|
convertGet: async (entity, key, meta) => {
|
|
1411
1412
|
await entity.read('hvacThermostat', ['unoccupiedCoolingSetpoint']);
|
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/connecte.js
CHANGED
|
@@ -14,11 +14,7 @@ module.exports = [
|
|
|
14
14
|
fromZigbee: [fz.connecte_thermostat],
|
|
15
15
|
toZigbee: [tz.connecte_thermostat],
|
|
16
16
|
onEvent: tuya.onEventSetTime,
|
|
17
|
-
configure:
|
|
18
|
-
const endpoint = device.getEndpoint(1);
|
|
19
|
-
// Do a "magic" read on the basic cluster to trigger the thermostat start reporting.
|
|
20
|
-
await endpoint.read('genBasic', ['manufacturerName', 'zclVersion', 'appVersion', 'modelId', 'powerSource', 0xfffe]);
|
|
21
|
-
},
|
|
17
|
+
configure: tuya.configureMagicPacket,
|
|
22
18
|
exposes: [
|
|
23
19
|
exposes.binary('state', ea.STATE_SET, 'ON', 'OFF')
|
|
24
20
|
.withDescription('On/off state of the switch'),
|
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/ecosmart.js
CHANGED
|
@@ -47,7 +47,7 @@ module.exports = [
|
|
|
47
47
|
},
|
|
48
48
|
{
|
|
49
49
|
// eslint-disable-next-line
|
|
50
|
-
zigbeeModel: ['\u0000\u0002\u0000\u0004\u0000\f]�\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u000e', '\u0000\u0002\u0000\u0004\"�T\u0004\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u000e', '\u0000\u0002\u0000\u0004\u0000\f^�\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u000e','\u0000\u0002\u0000\u0004\u0011�\"�\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u000e','\u0000\u0002\u0000\u0004� �P\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u000e','\u0000\u0002\u0000\u0004\u0000\f^\u0014\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u000e'],
|
|
50
|
+
zigbeeModel: ['\u0000\u0002\u0000\u0004T\u0002\u000eZ\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u000e', '\u0000\u0002\u0000\u0004\u0000\f]�\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u000e', '\u0000\u0002\u0000\u0004\"�T\u0004\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u000e', '\u0000\u0002\u0000\u0004\u0000\f^�\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u000e','\u0000\u0002\u0000\u0004\u0011�\"�\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u000e','\u0000\u0002\u0000\u0004� �P\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u000e','\u0000\u0002\u0000\u0004\u0000\f^\u0014\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u000e'],
|
|
51
51
|
model: 'D1533',
|
|
52
52
|
vendor: 'EcoSmart',
|
|
53
53
|
description: 'PAR20/A19 bright white bulb',
|
package/devices/fantem.js
CHANGED
|
@@ -42,7 +42,7 @@ module.exports = [
|
|
|
42
42
|
const endpoint = device.getEndpoint(1);
|
|
43
43
|
// Enables reporting of physical state changes
|
|
44
44
|
// https://github.com/Koenkk/zigbee2mqtt/issues/9057#issuecomment-1007742130
|
|
45
|
-
await
|
|
45
|
+
await tuya.configureMagicPacket(device, coordinatorEndpoint, logger);
|
|
46
46
|
await reporting.bind(endpoint, coordinatorEndpoint, ['genOnOff', 'genLevelCtrl']);
|
|
47
47
|
},
|
|
48
48
|
},
|
package/devices/ge.js
CHANGED
|
@@ -61,11 +61,16 @@ module.exports = [
|
|
|
61
61
|
model: '45856GE',
|
|
62
62
|
vendor: 'GE',
|
|
63
63
|
description: 'In-wall smart switch',
|
|
64
|
-
|
|
64
|
+
fromZigbee: [fz.on_off, fz.metering],
|
|
65
|
+
toZigbee: [tz.on_off],
|
|
66
|
+
exposes: [e.switch(), e.energy(), e.power()],
|
|
65
67
|
configure: async (device, coordinatorEndpoint, logger) => {
|
|
66
68
|
const endpoint = device.getEndpoint(1);
|
|
67
|
-
await reporting.bind(endpoint, coordinatorEndpoint, ['genOnOff']);
|
|
69
|
+
await reporting.bind(endpoint, coordinatorEndpoint, ['genOnOff', 'seMetering']);
|
|
68
70
|
await reporting.onOff(endpoint);
|
|
71
|
+
await reporting.instantaneousDemand(endpoint);
|
|
72
|
+
await reporting.currentSummDelivered(endpoint);
|
|
73
|
+
endpoint.saveClusterAttributeKeyValue('seMetering', {divisor: 10000, multiplier: 1});
|
|
69
74
|
},
|
|
70
75
|
},
|
|
71
76
|
{
|
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/legrand.js
CHANGED
|
@@ -15,6 +15,18 @@ const readInitialBatteryState = async (type, data, device) => {
|
|
|
15
15
|
}
|
|
16
16
|
};
|
|
17
17
|
|
|
18
|
+
const tzLocal = {
|
|
19
|
+
auto_mode: {
|
|
20
|
+
key: ['auto_mode'],
|
|
21
|
+
convertSet: async (entity, key, value, meta) => {
|
|
22
|
+
const mode = {'off': 0x00, 'auto': 0x02, 'on_override': 0x03};
|
|
23
|
+
const payload = {data: Buffer.from([mode[value]])};
|
|
24
|
+
await entity.command('manuSpecificLegrandDevices3', 'command0', payload);
|
|
25
|
+
return {state: {'auto_mode': value}};
|
|
26
|
+
},
|
|
27
|
+
},
|
|
28
|
+
};
|
|
29
|
+
|
|
18
30
|
module.exports = [
|
|
19
31
|
{
|
|
20
32
|
zigbeeModel: [' Dry contact\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000'+
|
|
@@ -46,16 +58,20 @@ module.exports = [
|
|
|
46
58
|
vendor: 'Legrand',
|
|
47
59
|
extend: extend.switch(),
|
|
48
60
|
fromZigbee: [fz.identify, fz.on_off, fz.electrical_measurement, fz.legrand_cluster_fc01, fz.ignore_basic_report, fz.ignore_genOta],
|
|
49
|
-
toZigbee: [tz.legrand_deviceMode, tz.on_off, tz.legrand_identify, tz.electrical_measurement_power],
|
|
61
|
+
toZigbee: [tz.legrand_deviceMode, tz.on_off, tz.legrand_identify, tz.electrical_measurement_power, tzLocal.auto_mode],
|
|
50
62
|
exposes: [exposes.switch().withState('state', true, 'On/off (works only if device is in "switch" mode)'),
|
|
51
|
-
e.power().withAccess(ea.STATE_GET),
|
|
52
|
-
|
|
63
|
+
e.power().withAccess(ea.STATE_GET),
|
|
64
|
+
exposes.enum('device_mode', ea.ALL, ['switch', 'auto'])
|
|
65
|
+
.withDescription('Switch: allow manual on/off, auto uses contact\'s C1/C2 wired actions for Peak/Off-Peak ' +
|
|
66
|
+
'electricity rates'),
|
|
67
|
+
exposes.enum('auto_mode', ea.STATE_SET, ['off', 'auto', 'on_override'])
|
|
68
|
+
.withDescription('Off/auto/on (override) (works only if device is set to "auto" mode)')],
|
|
53
69
|
configure: async (device, coordinatorEndpoint, logger) => {
|
|
54
70
|
const endpoint = device.getEndpoint(1);
|
|
55
71
|
await reporting.bind(endpoint, coordinatorEndpoint, ['genIdentify', 'genOnOff', 'haElectricalMeasurement']);
|
|
56
72
|
await reporting.onOff(endpoint);
|
|
57
|
-
await reporting.readEletricalMeasurementMultiplierDivisors(endpoint);
|
|
58
73
|
await reporting.activePower(endpoint);
|
|
74
|
+
await reporting.readEletricalMeasurementMultiplierDivisors(endpoint);
|
|
59
75
|
},
|
|
60
76
|
},
|
|
61
77
|
{
|
|
@@ -238,6 +254,7 @@ module.exports = [
|
|
|
238
254
|
ota: ota.zigbeeOTA,
|
|
239
255
|
fromZigbee: [fz.identify, fz.on_off],
|
|
240
256
|
toZigbee: [tz.on_off, tz.legrand_identify],
|
|
257
|
+
whiteLabel: [{vendor: 'Bticino', model: '3584C'}],
|
|
241
258
|
configure: async (device, coordinatorEndpoint, logger) => {
|
|
242
259
|
const endpoint = device.getEndpoint(1);
|
|
243
260
|
await reporting.bind(endpoint, coordinatorEndpoint, ['genOnOff', 'genBinaryInput']);
|
package/devices/lellki.js
CHANGED
|
@@ -23,9 +23,7 @@ module.exports = [
|
|
|
23
23
|
return {l1: 1, l2: 2, l3: 3, l4: 4, l5: 5};
|
|
24
24
|
},
|
|
25
25
|
configure: async (device, coordinatorEndpoint, logger) => {
|
|
26
|
-
await
|
|
27
|
-
'manufacturerName', 'zclVersion', 'appVersion', 'modelId', 'powerSource', 0xfffe]);
|
|
28
|
-
|
|
26
|
+
await tuya.configureMagicPacket(device, coordinatorEndpoint, logger);
|
|
29
27
|
for (const ID of [1, 2, 3, 4, 5]) {
|
|
30
28
|
await reporting.bind(device.getEndpoint(ID), coordinatorEndpoint, ['genOnOff']);
|
|
31
29
|
}
|
|
@@ -115,7 +113,7 @@ module.exports = [
|
|
|
115
113
|
toZigbee: [tz.on_off, tz.tuya_switch_power_outage_memory],
|
|
116
114
|
configure: async (device, coordinatorEndpoint, logger) => {
|
|
117
115
|
const endpoint = device.getEndpoint(1);
|
|
118
|
-
await
|
|
116
|
+
await tuya.configureMagicPacket(device, coordinatorEndpoint, logger);
|
|
119
117
|
await reporting.bind(endpoint, coordinatorEndpoint, ['genOnOff']);
|
|
120
118
|
endpoint.saveClusterAttributeKeyValue('haElectricalMeasurement', {acCurrentDivisor: 1000, acCurrentMultiplier: 1});
|
|
121
119
|
endpoint.saveClusterAttributeKeyValue('seMetering', {divisor: 100, multiplier: 1});
|
|
@@ -138,7 +136,7 @@ module.exports = [
|
|
|
138
136
|
toZigbee: [tz.on_off, tz.tuya_switch_power_outage_memory],
|
|
139
137
|
configure: async (device, coordinatorEndpoint, logger) => {
|
|
140
138
|
const endpoint = device.getEndpoint(1);
|
|
141
|
-
await
|
|
139
|
+
await tuya.configureMagicPacket(device, coordinatorEndpoint, logger);
|
|
142
140
|
for (const ep of [1, 2, 3]) {
|
|
143
141
|
await reporting.bind(device.getEndpoint(ep), coordinatorEndpoint, ['genOnOff']);
|
|
144
142
|
await reporting.onOff(device.getEndpoint(ep));
|
package/devices/lidl.js
CHANGED
|
@@ -515,8 +515,7 @@ module.exports = [
|
|
|
515
515
|
extend: extend.switch(),
|
|
516
516
|
meta: {multiEndpoint: true},
|
|
517
517
|
configure: async (device, coordinatorEndpoint, logger) => {
|
|
518
|
-
|
|
519
|
-
await endpoint.read('genBasic', ['manufacturerName', 'zclVersion', 'appVersion', 'modelId', 'powerSource', 0xfffe]);
|
|
518
|
+
await tuya.configureMagicPacket(device, coordinatorEndpoint, logger);
|
|
520
519
|
for (const ID of [1, 2, 3]) {
|
|
521
520
|
await reporting.bind(device.getEndpoint(ID), coordinatorEndpoint, ['genOnOff']);
|
|
522
521
|
}
|
package/devices/makegood.js
CHANGED
|
@@ -2,6 +2,7 @@ const exposes = require('../lib/exposes');
|
|
|
2
2
|
const fz = require('../converters/fromZigbee');
|
|
3
3
|
const tz = require('../converters/toZigbee');
|
|
4
4
|
const reporting = require('../lib/reporting');
|
|
5
|
+
const tuya = require('../lib/tuya');
|
|
5
6
|
const utils = require('../lib/utils');
|
|
6
7
|
const e = exposes.presets;
|
|
7
8
|
const ea = exposes.access;
|
|
@@ -36,7 +37,7 @@ module.exports = [
|
|
|
36
37
|
},
|
|
37
38
|
configure: async (device, coordinatorEndpoint, logger) => {
|
|
38
39
|
const endpoint = device.getEndpoint(1);
|
|
39
|
-
await
|
|
40
|
+
await tuya.configureMagicPacket(device, coordinatorEndpoint, logger);
|
|
40
41
|
await reporting.bind(endpoint, coordinatorEndpoint, ['genOnOff', 'haElectricalMeasurement', 'seMetering']);
|
|
41
42
|
await reporting.bind(device.getEndpoint(2), coordinatorEndpoint, ['genOnOff']);
|
|
42
43
|
await reporting.rmsVoltage(endpoint, {change: 5});
|
package/devices/mecrator.js
CHANGED
|
@@ -2,6 +2,7 @@ const exposes = require('../lib/exposes');
|
|
|
2
2
|
const fz = require('../converters/fromZigbee');
|
|
3
3
|
const tz = require('../converters/toZigbee');
|
|
4
4
|
const reporting = require('../lib/reporting');
|
|
5
|
+
const tuya = require('../lib/tuya');
|
|
5
6
|
const e = exposes.presets;
|
|
6
7
|
const ea = exposes.access;
|
|
7
8
|
|
|
@@ -24,7 +25,7 @@ module.exports = [
|
|
|
24
25
|
meta: {multiEndpoint: true},
|
|
25
26
|
configure: async (device, coordinatorEndpoint, logger) => {
|
|
26
27
|
const endpoint = device.getEndpoint(1);
|
|
27
|
-
await
|
|
28
|
+
await tuya.configureMagicPacket(device, coordinatorEndpoint, logger);
|
|
28
29
|
endpoint.saveClusterAttributeKeyValue('haElectricalMeasurement', {acCurrentDivisor: 1000, acCurrentMultiplier: 1});
|
|
29
30
|
endpoint.saveClusterAttributeKeyValue('seMetering', {divisor: 100, multiplier: 1});
|
|
30
31
|
device.save();
|
package/devices/miboxer.js
CHANGED
|
@@ -77,7 +77,7 @@ module.exports = [
|
|
|
77
77
|
exposes: [e.battery(), e.battery_voltage()],
|
|
78
78
|
configure: async (device, coordinatorEndpoint, logger) => {
|
|
79
79
|
const endpoint = device.getEndpoint(1);
|
|
80
|
-
await
|
|
80
|
+
await tuya.configureMagicPacket(device, coordinatorEndpoint, logger);
|
|
81
81
|
await endpoint.command('genGroups', 'miboxerSetZones', {zones: [
|
|
82
82
|
{zoneNum: 1, groupId: 101},
|
|
83
83
|
{zoneNum: 2, groupId: 102},
|
package/devices/moes.js
CHANGED
|
@@ -38,8 +38,7 @@ module.exports = [
|
|
|
38
38
|
},
|
|
39
39
|
meta: {multiEndpoint: true},
|
|
40
40
|
configure: async (device, coordinatorEndpoint, logger) => {
|
|
41
|
-
await
|
|
42
|
-
['manufacturerName', 'zclVersion', 'appVersion', 'modelId', 'powerSource', 0xfffe]);
|
|
41
|
+
await tuya.configureMagicPacket(device, coordinatorEndpoint, logger);
|
|
43
42
|
await reporting.bind(device.getEndpoint(1), coordinatorEndpoint, ['genOnOff']);
|
|
44
43
|
await reporting.bind(device.getEndpoint(2), coordinatorEndpoint, ['genOnOff']);
|
|
45
44
|
await reporting.onOff(device.getEndpoint(1));
|
package/devices/neo.js
CHANGED
|
@@ -79,7 +79,7 @@ module.exports = [
|
|
|
79
79
|
],
|
|
80
80
|
configure: async (device, coordinatorEndpoint, logger) => {
|
|
81
81
|
const endpoint = device.getEndpoint(1);
|
|
82
|
-
await
|
|
82
|
+
await tuya.configureMagicPacket(device, coordinatorEndpoint, logger);
|
|
83
83
|
await endpoint.command('manuSpecificTuya', 'mcuVersionRequest', {'seq': 0x0002});
|
|
84
84
|
},
|
|
85
85
|
},
|
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',
|
|
@@ -2914,4 +2914,11 @@ module.exports = [
|
|
|
2914
2914
|
description: 'Hue White ambiance BR30 E26',
|
|
2915
2915
|
extend: hueExtend.light_onoff_brightness_colortemp({colorTempRange: [153, 454]}),
|
|
2916
2916
|
},
|
|
2917
|
+
{
|
|
2918
|
+
zigbeeModel: ['LCX012'],
|
|
2919
|
+
model: '929003535301',
|
|
2920
|
+
vendor: 'Philips',
|
|
2921
|
+
description: 'Hue Festivia gradient light string 250',
|
|
2922
|
+
extend: hueExtend.light_onoff_brightness_colortemp_color({colorTempRange: [153, 500]}),
|
|
2923
|
+
},
|
|
2917
2924
|
];
|
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/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: {
|
|
@@ -665,6 +665,7 @@ module.exports = [
|
|
|
665
665
|
model: 'TS0204',
|
|
666
666
|
vendor: 'TuYa',
|
|
667
667
|
description: 'Gas sensor',
|
|
668
|
+
whiteLabel: [{vendor: 'Tesla Smart', model: 'TSL-SEN-GAS'}],
|
|
668
669
|
fromZigbee: [fz.ias_gas_alarm_1, fz.ignore_basic_report],
|
|
669
670
|
toZigbee: [],
|
|
670
671
|
exposes: [e.gas(), e.tamper()],
|
|
@@ -674,6 +675,7 @@ module.exports = [
|
|
|
674
675
|
model: 'TS0205',
|
|
675
676
|
vendor: 'TuYa',
|
|
676
677
|
description: 'Smoke sensor',
|
|
678
|
+
whiteLabel: [{vendor: 'Tesla Smart', model: 'TSL-SEN-SMOKE'}],
|
|
677
679
|
fromZigbee: [fz.ias_smoke_alarm_1, fz.battery, fz.ignore_basic_report],
|
|
678
680
|
toZigbee: [],
|
|
679
681
|
exposes: [e.smoke(), e.battery_low(), e.tamper(), e.battery()],
|
|
@@ -702,7 +704,11 @@ module.exports = [
|
|
|
702
704
|
fromZigbee: [fz.ias_contact_alarm_1, fz.battery, fz.ignore_basic_report, fz.ias_contact_alarm_1_report],
|
|
703
705
|
toZigbee: [],
|
|
704
706
|
exposes: [e.contact(), e.battery_low(), e.tamper(), e.battery(), e.battery_voltage()],
|
|
705
|
-
whiteLabel: [
|
|
707
|
+
whiteLabel: [
|
|
708
|
+
{vendor: 'CR Smart Home', model: 'TS0203'},
|
|
709
|
+
{vendor: 'TuYa', model: 'iH-F001'},
|
|
710
|
+
{vendor: 'Tesla Smart', model: 'TSL-SEN-DOOR'},
|
|
711
|
+
],
|
|
706
712
|
configure: async (device, coordinatorEndpoint, logger) => {
|
|
707
713
|
try {
|
|
708
714
|
const endpoint = device.getEndpoint(1);
|
|
@@ -807,13 +813,14 @@ module.exports = [
|
|
|
807
813
|
{modelID: 'TS0001', manufacturerName: '_TZ3000_5ng23zjs'},
|
|
808
814
|
{modelID: 'TS0001', manufacturerName: '_TZ3000_rmjr4ufz'},
|
|
809
815
|
{modelID: 'TS0001', manufacturerName: '_TZ3000_v7gnj3ad'},
|
|
816
|
+
{modelID: 'TS0001', manufacturerName: '_TZ3000_3a9beq8a'},
|
|
810
817
|
{modelID: 'TS0001', manufacturerName: '_TZ3000_ark8nv4y'},
|
|
811
818
|
{modelID: 'TS0001', manufacturerName: '_TZ3000_mx3vgyea'},
|
|
812
819
|
{modelID: 'TS0001', manufacturerName: '_TZ3000_qsp2pwtf'},
|
|
813
820
|
{modelID: 'TS0001', manufacturerName: '_TZ3000_46t1rvdu'}],
|
|
814
821
|
model: 'WHD02',
|
|
815
822
|
vendor: 'TuYa',
|
|
816
|
-
whiteLabel: [{vendor: 'TuYa', model: 'iHSW02'}],
|
|
823
|
+
whiteLabel: [{vendor: 'TuYa', model: 'iHSW02'}, {vendor: 'Aubess', model: 'TMZ02'}],
|
|
817
824
|
description: 'Wall switch module',
|
|
818
825
|
toZigbee: extend.switch().toZigbee.concat([tz.moes_power_on_behavior, tz.tuya_switch_type]),
|
|
819
826
|
fromZigbee: extend.switch().fromZigbee.concat([fz.moes_power_on_behavior, fz.tuya_switch_type]),
|
|
@@ -875,54 +882,7 @@ module.exports = [
|
|
|
875
882
|
whiteLabel: [{vendor: 'KTNNKG', model: 'ZB1248-10A'}],
|
|
876
883
|
},
|
|
877
884
|
{
|
|
878
|
-
|
|
879
|
-
{modelID: 'TS0505B', manufacturerName: '_TZ3000_jtmhndw2'},
|
|
880
|
-
{modelID: 'TS0505B', manufacturerName: '_TZ3000_ezlg0pht'},
|
|
881
|
-
{modelID: 'TS0505B', manufacturerName: '_TZ3210_3lbtuxgp'},
|
|
882
|
-
{modelID: 'TS0505B', manufacturerName: '_TZ3210_5snkkrxw'},
|
|
883
|
-
{modelID: 'TS0505B', manufacturerName: '_TZ3000_12sxjap4'},
|
|
884
|
-
{modelID: 'TS0505B', manufacturerName: '_TZ3000_x2fqbdun'},
|
|
885
|
-
{modelID: 'TS0505B', manufacturerName: '_TZ3000_589kq4ul'},
|
|
886
|
-
{modelID: 'TS0505B', manufacturerName: '_TZ3000_1mtktxdk'},
|
|
887
|
-
{modelID: 'TS0505B', manufacturerName: '_TZ3210_remypqqm'},
|
|
888
|
-
{modelID: 'TS0505B', manufacturerName: '_TZ3000_kohbva1f'},
|
|
889
|
-
{modelID: 'TS0505B', manufacturerName: '_TZ3000_luit1t00'},
|
|
890
|
-
{modelID: 'TS0505B', manufacturerName: '_TZ3210_r5afgmkl'},
|
|
891
|
-
{modelID: 'TS0505B', manufacturerName: '_TZ3210_wslkvrau'},
|
|
892
|
-
{modelID: 'TS0505B', manufacturerName: '_TZ3210_0rn9qhnu'},
|
|
893
|
-
{modelID: 'TS0505B', manufacturerName: '_TZ3210_ejctepku'},
|
|
894
|
-
{modelID: 'TS0505B', manufacturerName: '_TZ3210_bicjqpg4'},
|
|
895
|
-
{modelID: 'TS0505B', manufacturerName: '_TZ3210_jmiuubkz'},
|
|
896
|
-
{modelID: 'TS0505B', manufacturerName: '_TZ3000_cmaky9gq'},
|
|
897
|
-
{modelID: 'TS0505B', manufacturerName: '_TZ3000_tza2vjxx'},
|
|
898
|
-
{modelID: 'TS0505B', manufacturerName: '_TZ3210_it1u8ahz'},
|
|
899
|
-
{modelID: 'TS0505B', manufacturerName: '_TZ3210_k1pe6ibm'},
|
|
900
|
-
{modelID: 'TS0505B', manufacturerName: '_TZB210_1ecortg6'},
|
|
901
|
-
{modelID: 'TS0505B', manufacturerName: '_TZ3210_e020aaaj'},
|
|
902
|
-
{modelID: 'TS0505B', manufacturerName: '_TZ3210_bfwvfyx1'},
|
|
903
|
-
{modelID: 'TS0505B', manufacturerName: '_TZ3210_leyz4rju'},
|
|
904
|
-
{modelID: 'TS0505B', manufacturerName: '_TZ3210_jd3z4yig'},
|
|
905
|
-
{modelID: 'TS0505B', manufacturerName: '_TZ3210_dgdjiw1c'},
|
|
906
|
-
{modelID: 'TS0505B', manufacturerName: '_TZ3210_mzdax7ha'},
|
|
907
|
-
{modelID: 'TS0505B', manufacturerName: '_TZB210_tmi0rihb'},
|
|
908
|
-
{modelID: 'TS0505B', manufacturerName: '_TZ3210_a4s41wm4'},
|
|
909
|
-
{modelID: 'TS0505B', manufacturerName: '_TZ3210_awrucboq'},
|
|
910
|
-
{modelID: 'TS0505B', manufacturerName: '_TZ3210_ijczzg9h'},
|
|
911
|
-
{modelID: 'TS0505B', manufacturerName: '_TZ3210_qxenlrin'},
|
|
912
|
-
{modelID: 'TS0505B', manufacturerName: '_TZ3210_vaiyrvd1'},
|
|
913
|
-
{modelID: 'TS0505B', manufacturerName: '_TZ3210_iwbaamgh'},
|
|
914
|
-
{modelID: 'TS0505B', manufacturerName: '_TZ3210_klv2wul0'},
|
|
915
|
-
{modelID: 'TS0505B', manufacturerName: '_TZ3210_s6zec0of'},
|
|
916
|
-
{modelID: 'TS0505B', manufacturerName: '_TZ3210_y5fjkn7x'},
|
|
917
|
-
{modelID: 'TS0505B', manufacturerName: '_TZ3210_cuqkfz2q'},
|
|
918
|
-
{modelID: 'TS0505B', manufacturerName: '_TZ3210_6amjviba'},
|
|
919
|
-
{modelID: 'TS0505B', manufacturerName: '_TZ3000_xr5m6kfg'},
|
|
920
|
-
{modelID: 'TS0505B', manufacturerName: '_TZ3210_xr5m6kfg'},
|
|
921
|
-
{modelID: 'TS0505B', manufacturerName: '_TZ3210_bf175wi4'},
|
|
922
|
-
{modelID: 'TS0505B', manufacturerName: '_TZB210_3zfp8mki'},
|
|
923
|
-
{modelID: 'TS0505B', manufacturerName: '_TZ3000_y1vbo44x'},
|
|
924
|
-
{modelID: 'TS0505B', manufacturerName: '_TZ3210_mny0zvkm'},
|
|
925
|
-
{modelID: 'TS0505B', manufacturerName: '_TZ3210_pfupy2pg'}],
|
|
885
|
+
zigbeeModel: ['TS0505B'],
|
|
926
886
|
model: 'TS0505B',
|
|
927
887
|
vendor: 'TuYa',
|
|
928
888
|
description: 'Zigbee RGB+CCT light',
|
|
@@ -937,31 +897,17 @@ module.exports = [
|
|
|
937
897
|
meta: {applyRedFix: true, enhancedHue: false},
|
|
938
898
|
},
|
|
939
899
|
{
|
|
940
|
-
|
|
941
|
-
{modelID: 'TS0503B', manufacturerName: '_TZ3210_a5fxguxr'},
|
|
942
|
-
{modelID: 'TS0503B', manufacturerName: '_TZ3210_778drfdt'},
|
|
943
|
-
{modelID: 'TS0503B', manufacturerName: '_TZ3000_g5xawfcq'},
|
|
944
|
-
{modelID: 'TS0503B', manufacturerName: '_TZ3210_trm3l2aw'},
|
|
945
|
-
{modelID: 'TS0503B', manufacturerName: '_TZ3210_95txyzbx'},
|
|
946
|
-
{modelID: 'TS0503B', manufacturerName: '_TZ3210_odlghna1'},
|
|
947
|
-
{modelID: 'TS0503B', manufacturerName: '_TZB210_nfzrlz29'},
|
|
948
|
-
{modelID: 'TS0503B', manufacturerName: '_TZ3220_wp1k8xws'},
|
|
949
|
-
{modelID: 'TS0503B', manufacturerName: '_TZ3210_wp1k8xws'}],
|
|
900
|
+
zigbeeModel: ['TS0503B'],
|
|
950
901
|
model: 'TS0503B',
|
|
951
902
|
vendor: 'TuYa',
|
|
952
903
|
description: 'Zigbee RGB light',
|
|
904
|
+
whiteLabel: [{vendor: 'BTF-Lighting', model: 'C03Z'}],
|
|
953
905
|
extend: extend.light_onoff_brightness_color(),
|
|
954
906
|
// Requires red fix: https://github.com/Koenkk/zigbee2mqtt/issues/5962#issue-796462106
|
|
955
907
|
meta: {applyRedFix: true, enhancedHue: false},
|
|
956
908
|
},
|
|
957
909
|
{
|
|
958
|
-
|
|
959
|
-
{modelID: 'TS0504B', manufacturerName: '_TZ3210_bfvybixd'},
|
|
960
|
-
{modelID: 'TS0504B', manufacturerName: '_TZ3210_i2i0bsnv'},
|
|
961
|
-
{modelID: 'TS0504B', manufacturerName: '_TZ3210_elzv6aia'},
|
|
962
|
-
{modelID: 'TS0504B', manufacturerName: '_TZ3210_1elppmba'},
|
|
963
|
-
{modelID: 'TS0504B', manufacturerName: '_TZB210_5jn6an2y'},
|
|
964
|
-
{modelID: 'TS0504B', manufacturerName: '_TZ3210_onejz0gt'}],
|
|
910
|
+
zigbeeModel: ['TS0504B'],
|
|
965
911
|
model: 'TS0504B',
|
|
966
912
|
vendor: 'TuYa',
|
|
967
913
|
description: 'Zigbee RGBW light',
|
|
@@ -970,25 +916,14 @@ module.exports = [
|
|
|
970
916
|
meta: {applyRedFix: true},
|
|
971
917
|
},
|
|
972
918
|
{
|
|
973
|
-
|
|
919
|
+
zigbeeModel: ['TS0501A'],
|
|
974
920
|
model: 'TS0501A',
|
|
975
921
|
description: 'Zigbee light',
|
|
976
922
|
vendor: 'TuYa',
|
|
977
923
|
extend: extend.light_onoff_brightness(),
|
|
978
924
|
},
|
|
979
925
|
{
|
|
980
|
-
|
|
981
|
-
{modelID: 'TS0501B', manufacturerName: '_TZ3210_4whigl8i'},
|
|
982
|
-
{modelID: 'TS0501B', manufacturerName: '_TZ3210_9q49basr'},
|
|
983
|
-
{modelID: 'TS0501B', manufacturerName: '_TZ3210_i680rtja'},
|
|
984
|
-
{modelID: 'TS0501B', manufacturerName: '_TZ3210_grnwgegn'},
|
|
985
|
-
{modelID: 'TS0501B', manufacturerName: '_TZ3210_nehayyhx'},
|
|
986
|
-
{modelID: 'TS0501B', manufacturerName: '_TZ3210_wuheofsg'},
|
|
987
|
-
{modelID: 'TS0501B', manufacturerName: '_TZ3210_e5t9bfdv'},
|
|
988
|
-
{modelID: 'TS0501B', manufacturerName: '_TZ3210_19qb27da'},
|
|
989
|
-
{modelID: 'TS0501B', manufacturerName: '_TZ3210_aurnbfv4'},
|
|
990
|
-
{modelID: 'TS0501B', manufacturerName: '_TZ3210_4zinq6io'},
|
|
991
|
-
{modelID: 'TS0501B', manufacturerName: '_TZ3210_93gnbdgz'}],
|
|
926
|
+
zigbeeModel: ['TS0501B'],
|
|
992
927
|
model: 'TS0501B',
|
|
993
928
|
description: 'Zigbee light',
|
|
994
929
|
vendor: 'TuYa',
|
|
@@ -1139,11 +1074,11 @@ module.exports = [
|
|
|
1139
1074
|
exposes: [e.water_leak(), e.battery_low(), e.battery()],
|
|
1140
1075
|
},
|
|
1141
1076
|
{
|
|
1142
|
-
fingerprint:
|
|
1077
|
+
fingerprint: tuya.fingerprint('TS0101', ['_TYZB01_ijihzffk', '_TZ3210_tfxwxklq']),
|
|
1143
1078
|
model: 'TS0101',
|
|
1144
1079
|
vendor: 'TuYa',
|
|
1145
1080
|
description: 'Zigbee Socket',
|
|
1146
|
-
whiteLabel: [{vendor: 'Larkkey', model: 'PS080'}],
|
|
1081
|
+
whiteLabel: [{vendor: 'Larkkey', model: 'PS080'}, {vendor: 'Mercator', model: 'SPBS01G'}],
|
|
1147
1082
|
extend: extend.switch(),
|
|
1148
1083
|
meta: {disableDefaultResponse: true},
|
|
1149
1084
|
},
|
|
@@ -1518,31 +1453,7 @@ module.exports = [
|
|
|
1518
1453
|
extend: extend.light_onoff_brightness_colortemp(),
|
|
1519
1454
|
},
|
|
1520
1455
|
{
|
|
1521
|
-
|
|
1522
|
-
{modelID: 'TS0502B', manufacturerName: '_TZ3210_s1x7gcq0'},
|
|
1523
|
-
{modelID: 'TS0502B', manufacturerName: '_TZ3210_hi1ym4bl'},
|
|
1524
|
-
{modelID: 'TS0502B', manufacturerName: '_TZ3000_muqovqv0'},
|
|
1525
|
-
{modelID: 'TS0502B', manufacturerName: '_TZ3210_qjdimezy'},
|
|
1526
|
-
{modelID: 'TS0502B', manufacturerName: '_TZ3210_psgq7ysz'},
|
|
1527
|
-
{modelID: 'TS0502B', manufacturerName: '_TZ3000_zw7wr5uo'},
|
|
1528
|
-
{modelID: 'TS0502B', manufacturerName: '_TZ3210_ok08rifa'},
|
|
1529
|
-
{modelID: 'TS0502B', manufacturerName: '_TZ3210_pz9zmxjj'},
|
|
1530
|
-
{modelID: 'TS0502B', manufacturerName: '_TZ3000_fzwhym79'},
|
|
1531
|
-
{modelID: 'TS0502B', manufacturerName: '_TZ3000_ogceypug'},
|
|
1532
|
-
{modelID: 'TS0502B', manufacturerName: '_TZ3210_rm0hthdo'},
|
|
1533
|
-
{modelID: 'TS0502B', manufacturerName: '_TZ3210_zwqnazkb'},
|
|
1534
|
-
{modelID: 'TS0502B', manufacturerName: '_TZ3210_ijsj2evj'},
|
|
1535
|
-
{modelID: 'TS0502B', manufacturerName: '_TZ3210_pgq2qvyv'},
|
|
1536
|
-
{modelID: 'TS0502B', manufacturerName: '_TZ3210_nvaik6gk'},
|
|
1537
|
-
{modelID: 'TS0502B', manufacturerName: '_TZB210_rkgngb5o'},
|
|
1538
|
-
{modelID: 'TS0502B', manufacturerName: '_TZ3000_armwcncd'},
|
|
1539
|
-
{modelID: 'TS0502B', manufacturerName: '_TZ3210_2p6wbry3'},
|
|
1540
|
-
{modelID: 'TS0502B', manufacturerName: '_TZB210_nfzrlz29'},
|
|
1541
|
-
{modelID: 'TS0502B', manufacturerName: '_TZ3210_qamcypen'},
|
|
1542
|
-
{modelID: 'TS0502B', manufacturerName: '_TZ3210_zdrhqmo0'},
|
|
1543
|
-
{modelID: 'TS0502B', manufacturerName: '_TZ3210_2cjfbpy0'},
|
|
1544
|
-
{modelID: 'TS0502B', manufacturerName: '_TZ3000_bujv0r9b'},
|
|
1545
|
-
],
|
|
1456
|
+
zigbeeModel: ['TS0502B'],
|
|
1546
1457
|
model: 'TS0502B',
|
|
1547
1458
|
vendor: 'TuYa',
|
|
1548
1459
|
description: 'Light controller',
|
|
@@ -1553,7 +1464,7 @@ module.exports = [
|
|
|
1553
1464
|
extend: extend.light_onoff_brightness_colortemp({colorTempRange: [153, 500]}),
|
|
1554
1465
|
},
|
|
1555
1466
|
{
|
|
1556
|
-
|
|
1467
|
+
zigbeeModel: ['TS0504A'],
|
|
1557
1468
|
model: 'TS0504A',
|
|
1558
1469
|
vendor: 'TuYa',
|
|
1559
1470
|
description: 'RGBW LED controller',
|
|
@@ -1801,14 +1712,13 @@ module.exports = [
|
|
|
1801
1712
|
configure: async (device, coordinatorEndpoint, logger) => {
|
|
1802
1713
|
const endpoint = device.getEndpoint(1);
|
|
1803
1714
|
await tuya.configureMagicPacket(device, coordinatorEndpoint, logger);
|
|
1804
|
-
await reporting.bind(endpoint, coordinatorEndpoint, ['genOnOff', 'haElectricalMeasurement']);
|
|
1715
|
+
await reporting.bind(endpoint, coordinatorEndpoint, ['genOnOff', 'haElectricalMeasurement', 'seMetering']);
|
|
1805
1716
|
await reporting.rmsVoltage(endpoint, {change: 5});
|
|
1806
|
-
await reporting.
|
|
1717
|
+
await reporting.rmsCurrent(endpoint, {change: 50});
|
|
1718
|
+
await reporting.currentSummDelivered(endpoint);
|
|
1807
1719
|
endpoint.saveClusterAttributeKeyValue('seMetering', {divisor: 100, multiplier: 1});
|
|
1808
1720
|
device.save();
|
|
1809
1721
|
},
|
|
1810
|
-
options: [exposes.options.measurement_poll_interval().withDescription('Only the energy value is polled for this device.')],
|
|
1811
|
-
onEvent: (type, data, device, options) => tuya.onEventMeasurementPoll(type, data, device, options, false, true),
|
|
1812
1722
|
whiteLabel: [{vendor: 'Aubess', model: 'WDH02'}],
|
|
1813
1723
|
exposes: [e.switch(), e.power(), e.voltage().withAccess(ea.STATE), e.energy(), e.power_on_behavior(), e.switch_type_2()],
|
|
1814
1724
|
},
|
|
@@ -1837,12 +1747,7 @@ module.exports = [
|
|
|
1837
1747
|
},
|
|
1838
1748
|
meta: {multiEndpoint: true},
|
|
1839
1749
|
configure: async (device, coordinatorEndpoint, logger) => {
|
|
1840
|
-
|
|
1841
|
-
try {
|
|
1842
|
-
await ep1.read('genBasic', ['manufacturerName', 'zclVersion', 'appVersion', 'modelId', 'powerSource', 0xfffe]);
|
|
1843
|
-
} catch (e) {
|
|
1844
|
-
// Fails for some: https://github.com/Koenkk/zigbee2mqtt/discussions/13368
|
|
1845
|
-
}
|
|
1750
|
+
await tuya.configureMagicPacket(device, coordinatorEndpoint, logger);
|
|
1846
1751
|
await reporting.bind(device.getEndpoint(1), coordinatorEndpoint, ['genOnOff']);
|
|
1847
1752
|
await reporting.bind(device.getEndpoint(2), coordinatorEndpoint, ['genOnOff']);
|
|
1848
1753
|
},
|
|
@@ -2393,7 +2298,8 @@ module.exports = [
|
|
|
2393
2298
|
vendor: 'TuYa',
|
|
2394
2299
|
whiteLabel: [{vendor: 'LELLKI', model: 'TS011F_plug'}, {vendor: 'NEO', model: 'NAS-WR01B'},
|
|
2395
2300
|
{vendor: 'BlitzWolf', model: 'BW-SHP15'}, {vendor: 'Nous', model: 'A1Z'}, {vendor: 'BlitzWolf', model: 'BW-SHP13'},
|
|
2396
|
-
{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'}],
|
|
2397
2303
|
ota: ota.zigbeeOTA,
|
|
2398
2304
|
fromZigbee: [fz.on_off, fzLocal.electrical_measurement_skip_duplicate, fzLocal.metering_skip_duplicate, fz.ignore_basic_report,
|
|
2399
2305
|
fz.tuya_switch_power_outage_memory, fz.ts011f_plug_indicator_mode, fz.ts011f_plug_child_mode],
|
|
@@ -2465,7 +2371,8 @@ module.exports = [
|
|
|
2465
2371
|
.withDescription('Recover state after power outage'),
|
|
2466
2372
|
exposes.enum('indicator_mode', ea.ALL, ['off', 'off/on', 'on/off', 'on'])
|
|
2467
2373
|
.withDescription('Plug LED indicator mode'), e.child_lock()],
|
|
2468
|
-
onEvent:
|
|
2374
|
+
onEvent: (type, data, device, options) =>
|
|
2375
|
+
tuya.onEventMeasurementPoll(type, data, device, options, true, device.applicationVersion === 160),
|
|
2469
2376
|
},
|
|
2470
2377
|
{
|
|
2471
2378
|
fingerprint: tuya.fingerprint('TS0601', ['_TZE200_ntcy3xu1']),
|
package/devices/useelink.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
const exposes = require('../lib/exposes');
|
|
2
2
|
const reporting = require('../lib/reporting');
|
|
3
3
|
const extend = require('../lib/extend');
|
|
4
|
+
const tuya = require('../lib/tuya');
|
|
4
5
|
const e = exposes.presets;
|
|
5
6
|
|
|
6
7
|
module.exports = [
|
|
@@ -32,8 +33,7 @@ module.exports = [
|
|
|
32
33
|
extend: extend.switch(),
|
|
33
34
|
meta: {multiEndpoint: true},
|
|
34
35
|
configure: async (device, coordinatorEndpoint, logger) => {
|
|
35
|
-
await
|
|
36
|
-
['manufacturerName', 'zclVersion', 'appVersion', 'modelId', 'powerSource', 0xfffe]);
|
|
36
|
+
await tuya.configureMagicPacket(device, coordinatorEndpoint, logger);
|
|
37
37
|
for (const ID of [1, 2, 3, 4, 5]) {
|
|
38
38
|
await reporting.bind(device.getEndpoint(ID), coordinatorEndpoint, ['genOnOff']);
|
|
39
39
|
}
|
package/devices/woox.js
CHANGED
|
@@ -107,10 +107,7 @@ module.exports = [
|
|
|
107
107
|
onEvent: tuya.onEventSetTime,
|
|
108
108
|
exposes: [e.switch(), e.battery()],
|
|
109
109
|
meta: {disableDefaultResponse: true},
|
|
110
|
-
configure:
|
|
111
|
-
const endpoint = device.getEndpoint(1);
|
|
112
|
-
await endpoint.read('genBasic', ['manufacturerName', 'zclVersion', 'appVersion', 'modelId', 'powerSource', 0xfffe]);
|
|
113
|
-
},
|
|
110
|
+
configure: tuya.configureMagicPacket,
|
|
114
111
|
},
|
|
115
112
|
{
|
|
116
113
|
fingerprint: [{modelID: 'TS0505A', manufacturerName: '_TZ3000_keabpigv'}],
|
package/devices/zemismart.js
CHANGED
|
@@ -70,8 +70,7 @@ module.exports = [
|
|
|
70
70
|
whiteLabel: [{vendor: 'BSEED', model: 'TS0003', description: 'Zigbee switch'}],
|
|
71
71
|
meta: {multiEndpoint: true, disableDefaultResponse: true},
|
|
72
72
|
configure: async (device, coordinatorEndpoint, logger) => {
|
|
73
|
-
await
|
|
74
|
-
['manufacturerName', 'zclVersion', 'appVersion', 'modelId', 'powerSource', 0xfffe]);
|
|
73
|
+
await tuya.configureMagicPacket(device, coordinatorEndpoint, logger);
|
|
75
74
|
await reporting.bind(device.getEndpoint(1), coordinatorEndpoint, ['genOnOff']);
|
|
76
75
|
await reporting.bind(device.getEndpoint(2), coordinatorEndpoint, ['genOnOff']);
|
|
77
76
|
await reporting.bind(device.getEndpoint(3), coordinatorEndpoint, ['genOnOff']);
|
|
@@ -91,9 +90,8 @@ module.exports = [
|
|
|
91
90
|
return {'left': 1, 'center': 2, 'right': 3};
|
|
92
91
|
},
|
|
93
92
|
meta: {multiEndpoint: true},
|
|
94
|
-
configure: async (device, coordinatorEndpoint) => {
|
|
95
|
-
await
|
|
96
|
-
['manufacturerName', 'zclVersion', 'appVersion', 'modelId', 'powerSource', 0xfffe]);
|
|
93
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
94
|
+
await tuya.configureMagicPacket(device, coordinatorEndpoint, logger);
|
|
97
95
|
for (const endpointID of [1, 2, 3]) {
|
|
98
96
|
const endpoint = device.getEndpoint(endpointID);
|
|
99
97
|
await reporting.bind(endpoint, coordinatorEndpoint, ['genOnOff']);
|
|
@@ -144,9 +142,7 @@ module.exports = [
|
|
|
144
142
|
},
|
|
145
143
|
meta: {multiEndpoint: true},
|
|
146
144
|
configure: async (device, coordinatorEndpoint, logger) => {
|
|
147
|
-
await
|
|
148
|
-
'manufacturerName', 'zclVersion', 'appVersion', 'modelId', 'powerSource', 0xfffe]);
|
|
149
|
-
|
|
145
|
+
await tuya.configureMagicPacket(device, coordinatorEndpoint, logger);
|
|
150
146
|
await reporting.bind(device.getEndpoint(1), coordinatorEndpoint, ['genOnOff']);
|
|
151
147
|
await reporting.bind(device.getEndpoint(2), coordinatorEndpoint, ['genOnOff']);
|
|
152
148
|
await reporting.onOff(device.getEndpoint(1));
|
package/lib/tuya.js
CHANGED
|
@@ -1517,7 +1517,7 @@ const fzDataPoints = {
|
|
|
1517
1517
|
result = {...result, ...dpEntry[2].from(value, meta)};
|
|
1518
1518
|
}
|
|
1519
1519
|
} else {
|
|
1520
|
-
meta.logger.
|
|
1520
|
+
meta.logger.debug(`Datapoint ${dpId} not defined for '${meta.device.manufacturerName}' ` +
|
|
1521
1521
|
`with data ${JSON.stringify(dpValue)}`);
|
|
1522
1522
|
}
|
|
1523
1523
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "zigbee-herdsman-converters",
|
|
3
|
-
"version": "14.0.
|
|
3
|
+
"version": "14.0.670",
|
|
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": "*",
|