zigbee-herdsman-converters 14.0.245 → 14.0.249
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/converters/fromZigbee.js +37 -11
- package/converters/toZigbee.js +30 -3
- package/devices/bitron.js +154 -73
- package/devices/custom_devices_diy.js +21 -0
- package/devices/elko.js +37 -13
- package/devices/heiman.js +14 -0
- package/devices/ikea.js +22 -1
- package/devices/legrand.js +12 -4
- package/devices/linkind.js +35 -0
- package/devices/moes.js +6 -0
- package/devices/paulmann.js +7 -0
- package/devices/philips.js +1 -1
- package/devices/plaid.js +23 -0
- package/devices/schlage.js +4 -3
- package/devices/tuya.js +10 -3
- package/lib/exposes.js +1 -1
- package/npm-shrinkwrap.json +1 -1
- package/package.json +1 -1
- package/devices/smabit.js +0 -15
package/converters/fromZigbee.js
CHANGED
|
@@ -1513,44 +1513,56 @@ const converters = {
|
|
|
1513
1513
|
const result = {};
|
|
1514
1514
|
const data = msg.data;
|
|
1515
1515
|
|
|
1516
|
-
if (data.hasOwnProperty(0x0402)) {
|
|
1516
|
+
if (data.hasOwnProperty(0x0402)) { // Display text
|
|
1517
1517
|
result.display_text = data[0x0402];
|
|
1518
1518
|
}
|
|
1519
1519
|
|
|
1520
|
-
if (data.hasOwnProperty(0x0403)) {
|
|
1520
|
+
if (data.hasOwnProperty(0x0403)) { // Sensor
|
|
1521
1521
|
const sensorModeLookup = {'0': 'air', '1': 'floor', '3': 'supervisor_floor'};
|
|
1522
|
-
result.
|
|
1522
|
+
result.sensor = sensorModeLookup[data[0x0403]];
|
|
1523
1523
|
}
|
|
1524
1524
|
|
|
1525
|
-
if (data.hasOwnProperty(
|
|
1525
|
+
if (data.hasOwnProperty(0x0404)) { // Regulator time
|
|
1526
|
+
result.regulator_time = data[0x0404];
|
|
1527
|
+
}
|
|
1528
|
+
|
|
1529
|
+
if (data.hasOwnProperty(0x0405)) { // Regulator mode
|
|
1530
|
+
result.regulator_mode = data[0x0405] ? 'regulator' : 'thermostat';
|
|
1531
|
+
}
|
|
1532
|
+
|
|
1533
|
+
if (data.hasOwnProperty(0x0406)) { // Power status
|
|
1526
1534
|
result.system_mode = data[0x0406] ? 'heat' : 'off';
|
|
1527
1535
|
}
|
|
1528
1536
|
|
|
1529
|
-
if (data.hasOwnProperty(0x0408)) {
|
|
1537
|
+
if (data.hasOwnProperty(0x0408)) { // Mean power
|
|
1530
1538
|
result.mean_power = data[0x0408];
|
|
1531
1539
|
}
|
|
1532
1540
|
|
|
1533
|
-
if (data.hasOwnProperty(0x0409)) {
|
|
1541
|
+
if (data.hasOwnProperty(0x0409)) { // External temp (floor)
|
|
1534
1542
|
result.floor_temp = utils.precisionRound(data[0x0409], 2) /100;
|
|
1535
1543
|
}
|
|
1536
1544
|
|
|
1537
|
-
if (data.hasOwnProperty(
|
|
1545
|
+
if (data.hasOwnProperty(0x0411)) { // Night switching
|
|
1546
|
+
result.night_switching = data[0x0411] ? 'on' : 'off';
|
|
1547
|
+
}
|
|
1548
|
+
|
|
1549
|
+
if (data.hasOwnProperty(0x0412)) { // Frost guard
|
|
1538
1550
|
result.frost_guard = data[0x0412] ? 'on' : 'off';
|
|
1539
1551
|
}
|
|
1540
1552
|
|
|
1541
|
-
if (data.hasOwnProperty(0x0413)) {
|
|
1553
|
+
if (data.hasOwnProperty(0x0413)) { // Child lock
|
|
1542
1554
|
result.child_lock = data[0x0413] ? 'lock' : 'unlock';
|
|
1543
1555
|
}
|
|
1544
1556
|
|
|
1545
|
-
if (data.hasOwnProperty(0x0414)) {
|
|
1557
|
+
if (data.hasOwnProperty(0x0414)) { // Max floor temp
|
|
1546
1558
|
result.max_floor_temp = data[0x0414];
|
|
1547
1559
|
}
|
|
1548
1560
|
|
|
1549
|
-
if (data.hasOwnProperty(0x0415)) {
|
|
1561
|
+
if (data.hasOwnProperty(0x0415)) { // Relay state
|
|
1550
1562
|
result.running_state = data[0x0415] ? 'heat' : 'idle';
|
|
1551
1563
|
}
|
|
1552
1564
|
|
|
1553
|
-
if (data.hasOwnProperty(0x0417)) {
|
|
1565
|
+
if (data.hasOwnProperty(0x0417)) { // Calibration
|
|
1554
1566
|
result.local_temperature_calibration = precisionRound(data[0x0417], 2) / 10;
|
|
1555
1567
|
}
|
|
1556
1568
|
|
|
@@ -6471,6 +6483,20 @@ const converters = {
|
|
|
6471
6483
|
}
|
|
6472
6484
|
},
|
|
6473
6485
|
},
|
|
6486
|
+
heiman_doorbell_button: {
|
|
6487
|
+
cluster: 'ssIasZone',
|
|
6488
|
+
type: 'commandStatusChangeNotification',
|
|
6489
|
+
convert: (model, msg, publish, options, meta) => {
|
|
6490
|
+
if (utils.hasAlreadyProcessedMessage(msg)) return;
|
|
6491
|
+
const lookup = {32768: 'pressed'};
|
|
6492
|
+
const zoneStatus = msg.data.zonestatus;
|
|
6493
|
+
return {
|
|
6494
|
+
action: lookup[zoneStatus],
|
|
6495
|
+
tamper: (zoneStatus & 1<<2) > 0,
|
|
6496
|
+
battery_low: (zoneStatus & 1<<3) > 0,
|
|
6497
|
+
};
|
|
6498
|
+
},
|
|
6499
|
+
},
|
|
6474
6500
|
// #endregion
|
|
6475
6501
|
|
|
6476
6502
|
// #region Ignore converters (these message dont need parsing).
|
package/converters/toZigbee.js
CHANGED
|
@@ -1360,6 +1360,16 @@ const converters = {
|
|
|
1360
1360
|
await entity.read('hvacThermostat', ['elkoFrostGuard']);
|
|
1361
1361
|
},
|
|
1362
1362
|
},
|
|
1363
|
+
elko_night_switching: {
|
|
1364
|
+
key: ['night_switching'],
|
|
1365
|
+
convertSet: async (entity, key, value, meta) => {
|
|
1366
|
+
await entity.write('hvacThermostat', {'elkoNightSwitching': value === 'on'});
|
|
1367
|
+
return {state: {night_switching: value}};
|
|
1368
|
+
},
|
|
1369
|
+
convertGet: async (entity, key, meta) => {
|
|
1370
|
+
await entity.read('hvacThermostat', ['elkoNightSwitching']);
|
|
1371
|
+
},
|
|
1372
|
+
},
|
|
1363
1373
|
elko_relay_state: {
|
|
1364
1374
|
key: ['running_state'],
|
|
1365
1375
|
convertGet: async (entity, key, meta) => {
|
|
@@ -1367,13 +1377,30 @@ const converters = {
|
|
|
1367
1377
|
},
|
|
1368
1378
|
},
|
|
1369
1379
|
elko_sensor_mode: {
|
|
1370
|
-
key: ['
|
|
1380
|
+
key: ['sensor'],
|
|
1371
1381
|
convertSet: async (entity, key, value, meta) => {
|
|
1372
1382
|
await entity.write('hvacThermostat', {'elkoSensor': {'air': '0', 'floor': '1', 'supervisor_floor': '3'}[value]});
|
|
1373
|
-
return {state: {
|
|
1383
|
+
return {state: {sensor: value}};
|
|
1384
|
+
},
|
|
1385
|
+
},
|
|
1386
|
+
elko_regulator_time: {
|
|
1387
|
+
key: ['regulator_time'],
|
|
1388
|
+
convertSet: async (entity, key, value, meta) => {
|
|
1389
|
+
await entity.write('hvacThermostat', {'elkoRegulatorTime': value});
|
|
1390
|
+
return {state: {sensor: value}};
|
|
1391
|
+
},
|
|
1392
|
+
convertGet: async (entity, key, meta) => {
|
|
1393
|
+
await entity.read('hvacThermostat', ['elkoRegulatorTime']);
|
|
1394
|
+
},
|
|
1395
|
+
},
|
|
1396
|
+
elko_regulator_mode: {
|
|
1397
|
+
key: ['regulator_mode'],
|
|
1398
|
+
convertSet: async (entity, key, value, meta) => {
|
|
1399
|
+
await entity.write('hvacThermostat', {'elkoRegulatorMode': value === 'regulator'});
|
|
1400
|
+
return {state: {regulator_mode: value}};
|
|
1374
1401
|
},
|
|
1375
1402
|
convertGet: async (entity, key, meta) => {
|
|
1376
|
-
await entity.read('hvacThermostat', ['
|
|
1403
|
+
await entity.read('hvacThermostat', ['elkoRegulatorMode']);
|
|
1377
1404
|
},
|
|
1378
1405
|
},
|
|
1379
1406
|
elko_local_temperature_calibration: {
|
package/devices/bitron.js
CHANGED
|
@@ -8,42 +8,127 @@ const e = exposes.presets;
|
|
|
8
8
|
|
|
9
9
|
module.exports = [
|
|
10
10
|
{
|
|
11
|
-
zigbeeModel: ['AV2010/
|
|
12
|
-
model: 'AV2010/
|
|
13
|
-
vendor: 'Bitron',
|
|
14
|
-
description: '
|
|
15
|
-
fromZigbee: [fz.
|
|
11
|
+
zigbeeModel: ['AV2010/14', '902010/14'],
|
|
12
|
+
model: 'AV2010/14',
|
|
13
|
+
vendor: 'SMaBiT (Bitron Video)',
|
|
14
|
+
description: 'Curtain motion detector',
|
|
15
|
+
fromZigbee: [fz.ias_occupancy_alarm_1_with_timeout],
|
|
16
16
|
toZigbee: [],
|
|
17
|
-
exposes: [e.
|
|
17
|
+
exposes: [e.occupancy(), e.battery_low()],
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
zigbeeModel: ['AV2010/16', '902010/16'],
|
|
21
|
+
model: 'AV2010/16',
|
|
22
|
+
vendor: 'SMaBiT (Bitron Video)',
|
|
23
|
+
description: 'Wall-mount relay with dimmer',
|
|
24
|
+
extend: extend.light_onoff_brightness({noConfigure: true}),
|
|
25
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
26
|
+
const endpoint = device.getEndpoint(1);
|
|
27
|
+
await reporting.bind(endpoint, coordinatorEndpoint, ['genOnOff', 'genLevelCtrl']);
|
|
28
|
+
},
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
zigbeeModel: ['AV2010/18', '902010/18'],
|
|
32
|
+
model: 'AV2010/18',
|
|
33
|
+
vendor: 'SMaBiT (Bitron Video)',
|
|
34
|
+
description: 'Wall-mount relay',
|
|
35
|
+
extend: extend.switch(),
|
|
18
36
|
configure: async (device, coordinatorEndpoint, logger) => {
|
|
19
37
|
const endpoint = device.getEndpoint(1);
|
|
20
|
-
await reporting.bind(endpoint, coordinatorEndpoint, ['
|
|
38
|
+
await reporting.bind(endpoint, coordinatorEndpoint, ['genOnOff']);
|
|
21
39
|
},
|
|
22
40
|
},
|
|
23
41
|
{
|
|
24
|
-
zigbeeModel: ['
|
|
42
|
+
zigbeeModel: ['AV2010/21A', '902010/21A'],
|
|
43
|
+
model: 'AV2010/21A',
|
|
44
|
+
vendor: 'SMaBiT (Bitron Video)',
|
|
45
|
+
description: 'Compact magnetic contact sensor',
|
|
46
|
+
fromZigbee: [fz.ias_contact_alarm_1],
|
|
47
|
+
toZigbee: [],
|
|
48
|
+
exposes: [e.contact(), e.battery_low(), e.tamper()],
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
zigbeeModel: ['AV2010/21B', '902010/21B'],
|
|
52
|
+
model: 'AV2010/21B',
|
|
53
|
+
vendor: 'SMaBiT (Bitron Video)',
|
|
54
|
+
description: 'Magnetic contact sensor with additional input for wired sensors',
|
|
55
|
+
fromZigbee: [fz.ias_contact_alarm_1],
|
|
56
|
+
toZigbee: [],
|
|
57
|
+
exposes: [e.contact(), e.battery_low(), e.tamper()],
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
zigbeeModel: ['AV2010/21C', '902010/21C'],
|
|
61
|
+
model: 'AV2010/21C',
|
|
62
|
+
vendor: 'SMaBiT (Bitron Video)',
|
|
63
|
+
description: 'Ultra-flat magnetic contact sensor',
|
|
64
|
+
fromZigbee: [fz.ias_contact_alarm_1],
|
|
65
|
+
toZigbee: [],
|
|
66
|
+
exposes: [e.contact(), e.battery_low()],
|
|
67
|
+
},
|
|
68
|
+
{
|
|
69
|
+
zigbeeModel: ['AV2010/22', '902010/22', 'IR_00.00.03.12TC'],
|
|
25
70
|
model: 'AV2010/22',
|
|
26
|
-
vendor: 'Bitron',
|
|
27
|
-
description: '
|
|
71
|
+
vendor: 'SMaBiT (Bitron Video)',
|
|
72
|
+
description: 'Professional motion detector',
|
|
28
73
|
fromZigbee: [fz.ias_occupancy_alarm_1_with_timeout],
|
|
29
74
|
toZigbee: [],
|
|
30
75
|
exposes: [e.occupancy(), e.battery_low(), e.tamper()],
|
|
31
76
|
whiteLabel: [{vendor: 'ClimaxTechnology', model: 'IR-9ZBS-SL'}],
|
|
32
77
|
},
|
|
33
78
|
{
|
|
34
|
-
zigbeeModel: ['AV2010/22A'],
|
|
79
|
+
zigbeeModel: ['AV2010/22A', '902010/22A'],
|
|
35
80
|
model: 'AV2010/22A',
|
|
36
|
-
vendor: 'Bitron',
|
|
37
|
-
description: '
|
|
81
|
+
vendor: 'SMaBiT (Bitron Video)',
|
|
82
|
+
description: 'Design motion detector',
|
|
83
|
+
fromZigbee: [fz.ias_occupancy_alarm_1_with_timeout],
|
|
84
|
+
toZigbee: [],
|
|
85
|
+
exposes: [e.occupancy(), e.battery_low()],
|
|
86
|
+
},
|
|
87
|
+
{
|
|
88
|
+
zigbeeModel: ['AV2010/22B', '902010/22B'],
|
|
89
|
+
model: 'AV2010/22B',
|
|
90
|
+
vendor: 'SMaBiT (Bitron Video)',
|
|
91
|
+
description: 'Outdoor motion detector',
|
|
38
92
|
fromZigbee: [fz.ias_occupancy_alarm_1_with_timeout],
|
|
39
93
|
toZigbee: [],
|
|
40
94
|
exposes: [e.occupancy(), e.battery_low(), e.tamper()],
|
|
41
95
|
},
|
|
42
96
|
{
|
|
43
|
-
zigbeeModel: ['902010/
|
|
97
|
+
zigbeeModel: ['AV2010/23', '902010/23'],
|
|
98
|
+
model: 'AV2010/23',
|
|
99
|
+
vendor: 'SMaBiT (Bitron Video)',
|
|
100
|
+
description: '4 button Zigbee remote control',
|
|
101
|
+
fromZigbee: [fz.ias_no_alarm, fz.command_on, fz.command_off, fz.command_step, fz.command_recall],
|
|
102
|
+
toZigbee: [],
|
|
103
|
+
exposes: [e.action(['on', 'off', 'brightness_step_up', 'brightness_step_down', 'recall_*']), e.battery_low()],
|
|
104
|
+
configure: async (device, coordinatorEndpoint) => {
|
|
105
|
+
const endpoint = device.getEndpoint(1);
|
|
106
|
+
await reporting.bind(endpoint, coordinatorEndpoint, ['genPowerCfg', 'genBasic', 'genOnOff', 'genLevelCtrl']);
|
|
107
|
+
},
|
|
108
|
+
},
|
|
109
|
+
{
|
|
110
|
+
zigbeeModel: ['AV2010/24', '902010/24'],
|
|
111
|
+
model: 'AV2010/24',
|
|
112
|
+
vendor: 'SMaBiT (Bitron Video)',
|
|
113
|
+
description: 'Optical smoke detector (hardware version v1)',
|
|
114
|
+
fromZigbee: [fz.ias_smoke_alarm_1],
|
|
115
|
+
toZigbee: [tz.warning],
|
|
116
|
+
exposes: [e.smoke(), e.battery_low(), e.tamper(), e.warning()],
|
|
117
|
+
},
|
|
118
|
+
{
|
|
119
|
+
zigbeeModel: ['AV2010/24A', '902010/24A'],
|
|
120
|
+
model: 'AV2010/24A',
|
|
121
|
+
vendor: 'SMaBiT (Bitron Video)',
|
|
122
|
+
description: 'Optical smoke detector (hardware version v2)',
|
|
123
|
+
fromZigbee: [fz.ias_smoke_alarm_1],
|
|
124
|
+
toZigbee: [tz.warning],
|
|
125
|
+
exposes: [e.smoke(), e.battery_low(), e.tamper(), e.warning()],
|
|
126
|
+
},
|
|
127
|
+
{
|
|
128
|
+
zigbeeModel: ['AV2010/25', '902010/25'],
|
|
44
129
|
model: 'AV2010/25',
|
|
45
|
-
vendor: 'Bitron',
|
|
46
|
-
description: '
|
|
130
|
+
vendor: 'SMaBiT (Bitron Video)',
|
|
131
|
+
description: 'Wireless socket with metering',
|
|
47
132
|
fromZigbee: [fz.on_off, fz.metering],
|
|
48
133
|
toZigbee: [tz.on_off],
|
|
49
134
|
exposes: [e.switch(), e.power(), e.energy()],
|
|
@@ -57,17 +142,21 @@ module.exports = [
|
|
|
57
142
|
},
|
|
58
143
|
},
|
|
59
144
|
{
|
|
60
|
-
zigbeeModel: ['902010/26'],
|
|
145
|
+
zigbeeModel: ['AV2010/26', '902010/26'],
|
|
61
146
|
model: 'AV2010/26',
|
|
62
|
-
vendor: 'Bitron',
|
|
63
|
-
description: 'Wireless socket
|
|
64
|
-
extend: extend.light_onoff_brightness(),
|
|
147
|
+
vendor: 'SMaBiT (Bitron Video)',
|
|
148
|
+
description: 'Wireless socket with dimmer',
|
|
149
|
+
extend: extend.light_onoff_brightness({noConfigure: true}),
|
|
150
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
151
|
+
const endpoint = device.getEndpoint(1);
|
|
152
|
+
await reporting.bind(endpoint, coordinatorEndpoint, ['genOnOff', 'genLevelCtrl']);
|
|
153
|
+
},
|
|
65
154
|
},
|
|
66
155
|
{
|
|
67
|
-
zigbeeModel: ['902010/28'],
|
|
68
|
-
model: '
|
|
69
|
-
vendor: 'Bitron',
|
|
70
|
-
description: '
|
|
156
|
+
zigbeeModel: ['AV2010/28', '902010/28'],
|
|
157
|
+
model: 'AV2010/28',
|
|
158
|
+
vendor: 'SMaBiT (Bitron Video)',
|
|
159
|
+
description: 'Wireless socket',
|
|
71
160
|
extend: extend.switch(),
|
|
72
161
|
configure: async (device, coordinatorEndpoint, logger) => {
|
|
73
162
|
const endpoint = device.getEndpoint(1);
|
|
@@ -75,24 +164,34 @@ module.exports = [
|
|
|
75
164
|
},
|
|
76
165
|
},
|
|
77
166
|
{
|
|
78
|
-
zigbeeModel: ['AV2010/
|
|
167
|
+
zigbeeModel: ['AV2010/29', '902010/29'],
|
|
168
|
+
model: 'AV2010/29',
|
|
169
|
+
vendor: 'SMaBiT (Bitron Video)',
|
|
170
|
+
description: 'Outdoor siren',
|
|
171
|
+
fromZigbee: [fz.battery],
|
|
172
|
+
toZigbee: [tz.warning],
|
|
173
|
+
exposes: [e.battery_low(), e.tamper(), e.warning()],
|
|
174
|
+
},
|
|
175
|
+
{
|
|
176
|
+
zigbeeModel: ['AV2010/29A', '902010/29A'],
|
|
79
177
|
model: 'AV2010/29A',
|
|
80
|
-
vendor: 'Bitron',
|
|
81
|
-
description: '
|
|
178
|
+
vendor: 'SMaBiT (Bitron Video)',
|
|
179
|
+
description: 'Outdoor siren',
|
|
82
180
|
fromZigbee: [fz.ias_siren],
|
|
83
181
|
toZigbee: [tz.warning, tz.squawk],
|
|
84
182
|
exposes: [e.warning(), e.squawk(), e.battery_low(), e.tamper()],
|
|
85
183
|
},
|
|
86
184
|
{
|
|
87
|
-
zigbeeModel: ['902010/32'],
|
|
185
|
+
zigbeeModel: ['AV2010/32', '902010/32'],
|
|
88
186
|
model: 'AV2010/32',
|
|
89
|
-
vendor: 'Bitron',
|
|
187
|
+
vendor: 'SMaBiT (Bitron Video)',
|
|
90
188
|
description: 'Wireless wall thermostat with relay',
|
|
91
|
-
fromZigbee: [fz.legacy.bitron_thermostat_att_report, fz.battery],
|
|
189
|
+
fromZigbee: [fz.legacy.bitron_thermostat_att_report, fz.battery, fz.hvac_user_interface],
|
|
92
190
|
toZigbee: [tz.thermostat_occupied_heating_setpoint, tz.thermostat_local_temperature_calibration, tz.thermostat_local_temperature,
|
|
93
|
-
tz.thermostat_running_state, tz.thermostat_temperature_display_mode, tz.thermostat_system_mode],
|
|
191
|
+
tz.thermostat_running_state, tz.thermostat_temperature_display_mode, tz.thermostat_keypad_lockout, tz.thermostat_system_mode],
|
|
94
192
|
exposes: [e.battery(), exposes.climate().withSetpoint('occupied_heating_setpoint', 7, 30, 0.5).withLocalTemperature()
|
|
95
|
-
.withSystemMode(['off', 'auto', 'heat']).withRunningState(['idle', 'heat', 'cool'])
|
|
193
|
+
.withSystemMode(['off', 'auto', 'heat']).withRunningState(['idle', 'heat', 'cool'])
|
|
194
|
+
.withLocalTemperatureCalibration(), e.keypad_lockout()],
|
|
96
195
|
meta: {battery: {voltageToPercentage: '3V_2500_3200'}},
|
|
97
196
|
configure: async (device, coordinatorEndpoint, logger) => {
|
|
98
197
|
const endpoint = device.getEndpoint(1);
|
|
@@ -109,52 +208,34 @@ module.exports = [
|
|
|
109
208
|
},
|
|
110
209
|
},
|
|
111
210
|
{
|
|
112
|
-
zigbeeModel: ['902010/
|
|
113
|
-
model: 'AV2010/
|
|
114
|
-
vendor: 'Bitron',
|
|
115
|
-
description: '
|
|
116
|
-
fromZigbee: [fz.
|
|
211
|
+
zigbeeModel: ['AV2010/33', '902010/33'],
|
|
212
|
+
model: 'AV2010/33',
|
|
213
|
+
vendor: 'SMaBiT (Bitron Video)',
|
|
214
|
+
description: 'Vibration sensor',
|
|
215
|
+
fromZigbee: [fz.ias_occupancy_alarm_2],
|
|
117
216
|
toZigbee: [],
|
|
118
|
-
exposes: [e.
|
|
119
|
-
},
|
|
120
|
-
{
|
|
121
|
-
zigbeeModel: ['902010/24A'],
|
|
122
|
-
model: 'AV2010/24A',
|
|
123
|
-
vendor: 'Bitron',
|
|
124
|
-
description: 'Optical smoke detector (hardware version v2)',
|
|
125
|
-
fromZigbee: [fz.ias_smoke_alarm_1],
|
|
126
|
-
toZigbee: [tz.warning],
|
|
127
|
-
exposes: [e.smoke(), e.battery_low(), e.tamper(), e.warning()],
|
|
128
|
-
},
|
|
129
|
-
{
|
|
130
|
-
zigbeeModel: ['902010/24'],
|
|
131
|
-
model: '902010/24',
|
|
132
|
-
vendor: 'Bitron',
|
|
133
|
-
description: 'Optical smoke detector (hardware version v1)',
|
|
134
|
-
fromZigbee: [fz.ias_smoke_alarm_1],
|
|
135
|
-
toZigbee: [tz.warning],
|
|
136
|
-
exposes: [e.smoke(), e.battery_low(), e.tamper(), e.warning()],
|
|
137
|
-
},
|
|
138
|
-
{
|
|
139
|
-
zigbeeModel: ['902010/29'],
|
|
140
|
-
model: '902010/29',
|
|
141
|
-
vendor: 'Bitron',
|
|
142
|
-
description: 'Zigbee outdoor siren',
|
|
143
|
-
fromZigbee: [fz.battery],
|
|
144
|
-
toZigbee: [tz.warning],
|
|
145
|
-
exposes: [e.battery_low(), e.tamper(), e.warning()],
|
|
217
|
+
exposes: [e.occupancy(), e.battery_low()],
|
|
146
218
|
},
|
|
147
219
|
{
|
|
148
|
-
zigbeeModel: ['902010/
|
|
149
|
-
model: '
|
|
150
|
-
vendor: 'Bitron',
|
|
151
|
-
description: '
|
|
152
|
-
fromZigbee: [fz.
|
|
220
|
+
zigbeeModel: ['AV2010/34', '902010/34'],
|
|
221
|
+
model: 'AV2010/34',
|
|
222
|
+
vendor: 'SMaBiT (Bitron Video)',
|
|
223
|
+
description: 'Wall switch with 4 buttons',
|
|
224
|
+
fromZigbee: [fz.command_recall],
|
|
153
225
|
toZigbee: [],
|
|
154
|
-
exposes: [e.action(['
|
|
155
|
-
configure: async (device, coordinatorEndpoint) => {
|
|
226
|
+
exposes: [e.action(['recall_*'])],
|
|
227
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
156
228
|
const endpoint = device.getEndpoint(1);
|
|
157
|
-
await reporting.bind(endpoint, coordinatorEndpoint, ['
|
|
229
|
+
await reporting.bind(endpoint, coordinatorEndpoint, ['genOnOff', 'genScenes']);
|
|
158
230
|
},
|
|
159
231
|
},
|
|
232
|
+
{
|
|
233
|
+
zigbeeModel: ['AV2010/37', '902010/37'],
|
|
234
|
+
model: 'AV2010/37',
|
|
235
|
+
vendor: 'SMaBiT (Bitron Video)',
|
|
236
|
+
description: 'Water detector with siren',
|
|
237
|
+
fromZigbee: [fz.ias_water_leak_alarm_1],
|
|
238
|
+
toZigbee: [],
|
|
239
|
+
exposes: [e.water_leak(), e.battery_low()],
|
|
240
|
+
},
|
|
160
241
|
];
|
|
@@ -195,4 +195,25 @@ module.exports = [
|
|
|
195
195
|
},
|
|
196
196
|
exposes: [e.soil_moisture(), e.battery(), e.temperature()],
|
|
197
197
|
},
|
|
198
|
+
{
|
|
199
|
+
zigbeeModel: ['EFEKTA_THP_LR'],
|
|
200
|
+
model: 'EFEKTA_THP_LR',
|
|
201
|
+
vendor: 'Custom devices (DiY)',
|
|
202
|
+
description: 'DIY outdoor long-range sensor for temperature, humidity and atmospheric pressure',
|
|
203
|
+
fromZigbee: [fz.temperature, fz.humidity, fz.pressure, fz.battery],
|
|
204
|
+
toZigbee: [tz.factory_reset],
|
|
205
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
206
|
+
const endpoint = device.getEndpoint(1);
|
|
207
|
+
await reporting.bind(endpoint, coordinatorEndpoint, [
|
|
208
|
+
'genPowerCfg', 'msTemperatureMeasurement', 'msRelativeHumidity', 'msPressureMeasurement']);
|
|
209
|
+
const overides = {min: 0, max: 64800, change: 0};
|
|
210
|
+
await reporting.batteryVoltage(endpoint, overides);
|
|
211
|
+
await reporting.batteryPercentageRemaining(endpoint, overides);
|
|
212
|
+
await reporting.temperature(endpoint, overides);
|
|
213
|
+
await reporting.humidity(endpoint, overides);
|
|
214
|
+
await reporting.pressureExtended(endpoint, overides);
|
|
215
|
+
await endpoint.read('msPressureMeasurement', ['scale']);
|
|
216
|
+
},
|
|
217
|
+
exposes: [e.battery(), e.temperature(), e.humidity(), e.pressure()],
|
|
218
|
+
},
|
|
198
219
|
];
|
package/devices/elko.js
CHANGED
|
@@ -29,15 +29,21 @@ module.exports = [
|
|
|
29
29
|
fromZigbee: [fz.elko_thermostat, fz.thermostat],
|
|
30
30
|
toZigbee: [tz.thermostat_occupied_heating_setpoint, tz.thermostat_occupied_heating_setpoint,
|
|
31
31
|
tz.elko_display_text, tz.elko_power_status, tz.elko_external_temp, tz.elko_mean_power, tz.elko_child_lock, tz.elko_frost_guard,
|
|
32
|
-
tz.elko_relay_state, tz.elko_sensor_mode, tz.elko_local_temperature_calibration, tz.elko_max_floor_temp
|
|
32
|
+
tz.elko_relay_state, tz.elko_sensor_mode, tz.elko_local_temperature_calibration, tz.elko_max_floor_temp,
|
|
33
|
+
tz.elko_regulator_mode, tz.elko_regulator_time, tz.elko_night_switching],
|
|
33
34
|
exposes: [exposes.text('display_text', ea.ALL).withDescription('Displayed text on thermostat display (zone). Max 14 characters'),
|
|
35
|
+
exposes.binary('regulator_mode', ea.ALL, 'regulator', 'thermostat')
|
|
36
|
+
.withDescription('Device in regulator or thermostat mode.'),
|
|
37
|
+
exposes.numeric('regulator_time', ea.ALL).withUnit('min')
|
|
38
|
+
.withValueMin(5).withValueMax(20).withDescription('When device is in regulator mode this controls the time between each ' +
|
|
39
|
+
'in/out connection. When device is in thermostat mode this controls the time between each in/out switch when measured ' +
|
|
40
|
+
'temperature is within +-0.5 °C set temperature. Choose a long time for (slow) concrete floors and a short time for ' +
|
|
41
|
+
'(quick) wooden floors.'),
|
|
34
42
|
exposes.climate().withSetpoint('occupied_heating_setpoint', 5, 50, 1)
|
|
35
|
-
.withLocalTemperature(ea.STATE)
|
|
36
|
-
.withLocalTemperatureCalibration()
|
|
37
|
-
|
|
38
|
-
.
|
|
39
|
-
'"floor" = Thermostat uses floor sensor. ' +
|
|
40
|
-
'"supervisor_floor" = Thermostat uses air sensor and with max temperatur from "max_floor_temp"'),
|
|
43
|
+
.withLocalTemperature(ea.STATE)
|
|
44
|
+
.withLocalTemperatureCalibration()
|
|
45
|
+
.withSystemMode(['off', 'heat']).withRunningState(['idle', 'heat'])
|
|
46
|
+
.withSensor(['air', 'floor', 'supervisor_floor']),
|
|
41
47
|
exposes.numeric('floor_temp', ea.STATE_GET).withUnit('°C')
|
|
42
48
|
.withDescription('Current temperature measured from the floor sensor'),
|
|
43
49
|
exposes.numeric('max_floor_temp', ea.ALL).withUnit('°C')
|
|
@@ -51,6 +57,8 @@ module.exports = [
|
|
|
51
57
|
.withDescription('When frost guard is ON, it is activated when the thermostat is switched OFF with the ON/OFF button.' +
|
|
52
58
|
'At the same time, the display will fade and the text "Frostsikring x °C" appears in the display and remains until the ' +
|
|
53
59
|
'thermostat is switched on again.'),
|
|
60
|
+
exposes.binary('night_switching', ea.ALL, 'on', 'off')
|
|
61
|
+
.withDescription('Turn on or off night setting.'),
|
|
54
62
|
],
|
|
55
63
|
configure: async (device, coordinatorEndpoint, logger) => {
|
|
56
64
|
const endpoint = device.getEndpoint(1);
|
|
@@ -68,7 +76,6 @@ module.exports = [
|
|
|
68
76
|
maximumReportInterval: constants.repInterval.HOUR,
|
|
69
77
|
reportableChange: null,
|
|
70
78
|
}]);
|
|
71
|
-
|
|
72
79
|
// Power consumption
|
|
73
80
|
await endpoint.configureReporting('hvacThermostat', [{
|
|
74
81
|
attribute: 'elkoMeanPower',
|
|
@@ -76,7 +83,6 @@ module.exports = [
|
|
|
76
83
|
maximumReportInterval: constants.repInterval.HOUR,
|
|
77
84
|
reportableChange: 5,
|
|
78
85
|
}]);
|
|
79
|
-
|
|
80
86
|
// External temp sensor (floor)
|
|
81
87
|
await endpoint.configureReporting('hvacThermostat', [{
|
|
82
88
|
attribute: 'elkoExternalTemp',
|
|
@@ -84,7 +90,6 @@ module.exports = [
|
|
|
84
90
|
maximumReportInterval: constants.repInterval.HOUR,
|
|
85
91
|
reportableChange: 10,
|
|
86
92
|
}]);
|
|
87
|
-
|
|
88
93
|
// Child lock active/inactive
|
|
89
94
|
await endpoint.configureReporting('hvacThermostat', [{
|
|
90
95
|
attribute: 'elkoChildLock',
|
|
@@ -92,14 +97,20 @@ module.exports = [
|
|
|
92
97
|
maximumReportInterval: constants.repInterval.HOUR,
|
|
93
98
|
reportableChange: null,
|
|
94
99
|
}]);
|
|
95
|
-
|
|
100
|
+
// Night switching
|
|
101
|
+
await endpoint.configureReporting('hvacThermostat', [{
|
|
102
|
+
attribute: 'elkoNightSwitching',
|
|
103
|
+
minimumReportInterval: 0,
|
|
104
|
+
maximumReportInterval: constants.repInterval.HOUR,
|
|
105
|
+
reportableChange: null,
|
|
106
|
+
}]);
|
|
107
|
+
// Frost guard
|
|
96
108
|
await endpoint.configureReporting('hvacThermostat', [{
|
|
97
109
|
attribute: 'elkoFrostGuard',
|
|
98
110
|
minimumReportInterval: 0,
|
|
99
111
|
maximumReportInterval: constants.repInterval.HOUR,
|
|
100
112
|
reportableChange: null,
|
|
101
113
|
}]);
|
|
102
|
-
|
|
103
114
|
// Heating active/inactive
|
|
104
115
|
await endpoint.configureReporting('hvacThermostat', [{
|
|
105
116
|
attribute: 'elkoRelayState',
|
|
@@ -107,7 +118,6 @@ module.exports = [
|
|
|
107
118
|
maximumReportInterval: constants.repInterval.HOUR,
|
|
108
119
|
reportableChange: null,
|
|
109
120
|
}]);
|
|
110
|
-
|
|
111
121
|
// Max floor temp
|
|
112
122
|
await endpoint.configureReporting('hvacThermostat', [{
|
|
113
123
|
attribute: 'elkoMaxFloorTemp',
|
|
@@ -116,6 +126,20 @@ module.exports = [
|
|
|
116
126
|
reportableChange: 1,
|
|
117
127
|
}]);
|
|
118
128
|
|
|
129
|
+
// Regulator mode
|
|
130
|
+
await endpoint.configureReporting('hvacThermostat', [{
|
|
131
|
+
attribute: 'elkoRegulatorMode',
|
|
132
|
+
minimumReportInterval: 0,
|
|
133
|
+
maximumReportInterval: constants.repInterval.HOUR,
|
|
134
|
+
reportableChange: null,
|
|
135
|
+
}]);
|
|
136
|
+
// Regulator time
|
|
137
|
+
await endpoint.configureReporting('hvacThermostat', [{
|
|
138
|
+
attribute: 'elkoRegulatorTime',
|
|
139
|
+
minimumReportInterval: 0,
|
|
140
|
+
maximumReportInterval: constants.repInterval.HOUR,
|
|
141
|
+
reportableChange: 1,
|
|
142
|
+
}]);
|
|
119
143
|
// Trigger read
|
|
120
144
|
await endpoint.read('hvacThermostat', ['elkoDisplayText', 'elkoSensor']);
|
|
121
145
|
|
package/devices/heiman.js
CHANGED
|
@@ -669,4 +669,18 @@ module.exports = [
|
|
|
669
669
|
toZigbee: [],
|
|
670
670
|
exposes: [e.occupancy(), e.battery_low(), e.tamper()],
|
|
671
671
|
},
|
|
672
|
+
{
|
|
673
|
+
fingerprint: [{modelID: 'DoorBell-EM', manufacturerName: 'HEIMAN'}],
|
|
674
|
+
model: 'HS2DB',
|
|
675
|
+
vendor: 'HEIMAN',
|
|
676
|
+
description: 'Smart doorbell button',
|
|
677
|
+
fromZigbee: [fz.battery, fz.heiman_doorbell_button, fz.ignore_basic_report],
|
|
678
|
+
toZigbee: [],
|
|
679
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
680
|
+
const endpoint = device.getEndpoint(1);
|
|
681
|
+
await reporting.bind(endpoint, coordinatorEndpoint, ['genPowerCfg']);
|
|
682
|
+
await reporting.batteryPercentageRemaining(endpoint);
|
|
683
|
+
},
|
|
684
|
+
exposes: [e.battery(), e.action(['pressed']), e.battery_low(), e.tamper()],
|
|
685
|
+
},
|
|
672
686
|
];
|
package/devices/ikea.js
CHANGED
|
@@ -340,7 +340,7 @@ module.exports = [
|
|
|
340
340
|
fz.ikea_arrow_release],
|
|
341
341
|
exposes: [e.battery(), e.action(['arrow_left_click', 'arrow_left_hold', 'arrow_left_release', 'arrow_right_click',
|
|
342
342
|
'arrow_right_hold', 'arrow_right_release', 'brightness_down_click', 'brightness_down_hold', 'brightness_down_release',
|
|
343
|
-
'brightness_up_click', 'brightness_up_hold', 'brightness_up_release'])],
|
|
343
|
+
'brightness_up_click', 'brightness_up_hold', 'brightness_up_release', 'toggle'])],
|
|
344
344
|
toZigbee: [],
|
|
345
345
|
ota: ota.tradfri,
|
|
346
346
|
meta: {battery: {dontDividePercentage: true}},
|
|
@@ -599,4 +599,25 @@ module.exports = [
|
|
|
599
599
|
description: 'TRADFRI LED bulb E14 WW clear 250 lumen, dimmable',
|
|
600
600
|
extend: tradfriExtend.light_onoff_brightness(),
|
|
601
601
|
},
|
|
602
|
+
{
|
|
603
|
+
zigbeeModel: ['TTRADFRIbulbGU10WS345lm'],
|
|
604
|
+
model: 'LED2005R5',
|
|
605
|
+
vendor: 'IKEA',
|
|
606
|
+
description: 'TRADFRI LED bulb GU10 345 lumen, dimmable, white spectrum',
|
|
607
|
+
extend: tradfriExtend.light_onoff_brightness_colortemp(),
|
|
608
|
+
},
|
|
609
|
+
{
|
|
610
|
+
zigbeeModel: ['STARKVIND Air purifier'],
|
|
611
|
+
model: 'E3007',
|
|
612
|
+
vendor: 'IKEA',
|
|
613
|
+
description: 'STARKVIND air purifier',
|
|
614
|
+
exposes: [e.fan().withModes(['off', 'low', 'medium', 'high', 'on', 'auto'])],
|
|
615
|
+
fromZigbee: [fz.fan],
|
|
616
|
+
toZigbee: [tz.fan_mode],
|
|
617
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
618
|
+
const endpoint = device.getEndpoint(1);
|
|
619
|
+
await reporting.bind(endpoint, coordinatorEndpoint, ['hvacFanCtrl']);
|
|
620
|
+
await reporting.fanMode(endpoint);
|
|
621
|
+
},
|
|
622
|
+
},
|
|
602
623
|
];
|
package/devices/legrand.js
CHANGED
|
@@ -158,14 +158,22 @@ module.exports = [
|
|
|
158
158
|
// led blink RED when battery is low
|
|
159
159
|
description: 'Wired switch without neutral',
|
|
160
160
|
extend: extend.light_onoff_brightness({noConfigure: true}),
|
|
161
|
-
fromZigbee: [fz.brightness, fz.identify, fz.on_off],
|
|
161
|
+
fromZigbee: [fz.brightness, fz.identify, fz.on_off, fz.lighting_ballast_configuration],
|
|
162
162
|
toZigbee: [tz.light_onoff_brightness, tz.legrand_settingAlwaysEnableLed, tz.legrand_settingEnableLedIfOn,
|
|
163
|
-
tz.legrand_settingEnableDimmer, tz.legrand_identify],
|
|
164
|
-
exposes: [e.light_brightness()
|
|
163
|
+
tz.legrand_settingEnableDimmer, tz.legrand_identify, tz.ballast_config],
|
|
164
|
+
exposes: [e.light_brightness(),
|
|
165
|
+
exposes.numeric('ballast_minimum_level', ea.ALL).withValueMin(1).withValueMax(254)
|
|
166
|
+
.withDescription('Specifies the minimum brightness value'),
|
|
167
|
+
exposes.numeric('ballast_maximum_level', ea.ALL).withValueMin(1).withValueMax(254)
|
|
168
|
+
.withDescription('Specifies the maximum brightness value'),
|
|
169
|
+
exposes.binary('dimmer_enabled', ea.STATE_SET, 'ON', 'OFF').withDescription('Allow the device to change brightness'),
|
|
170
|
+
exposes.binary('permanent_led', ea.STATE_SET, 'ON', 'OFF').withDescription('Enable or disable the permanent blue LED'),
|
|
171
|
+
exposes.binary('led_when_on', ea.STATE_SET, 'ON', 'OFF').withDescription('Enables the LED when the light is on')],
|
|
165
172
|
configure: async (device, coordinatorEndpoint, logger) => {
|
|
166
173
|
await extend.light_onoff_brightness().configure(device, coordinatorEndpoint, logger);
|
|
167
174
|
const endpoint = device.getEndpoint(1);
|
|
168
|
-
await reporting.bind(endpoint, coordinatorEndpoint, ['genIdentify', 'genOnOff', 'genLevelCtrl',
|
|
175
|
+
await reporting.bind(endpoint, coordinatorEndpoint, ['genIdentify', 'genOnOff', 'genLevelCtrl',
|
|
176
|
+
'genBinaryInput', 'lightingBallastCfg']);
|
|
169
177
|
await reporting.onOff(endpoint);
|
|
170
178
|
await reporting.brightness(endpoint);
|
|
171
179
|
},
|
package/devices/linkind.js
CHANGED
|
@@ -5,8 +5,43 @@ const reporting = require('../lib/reporting');
|
|
|
5
5
|
const extend = require('../lib/extend');
|
|
6
6
|
const e = exposes.presets;
|
|
7
7
|
const ea = exposes.access;
|
|
8
|
+
const globalStore = require('../lib/store');
|
|
8
9
|
|
|
9
10
|
module.exports = [
|
|
11
|
+
{
|
|
12
|
+
zigbeeModel: ['ZB-KeypadGeneric-D0002'],
|
|
13
|
+
model: 'ZS130000078',
|
|
14
|
+
vendor: 'Linkind',
|
|
15
|
+
description: 'Security keypad battery',
|
|
16
|
+
meta: {battery: {voltageToPercentage: '3V_2100'}},
|
|
17
|
+
fromZigbee: [fz.command_arm_with_transaction, fz.battery, fz.ias_ace_occupancy_with_timeout,
|
|
18
|
+
fz.ias_smoke_alarm_1, fz.command_panic],
|
|
19
|
+
exposes: [e.battery(), e.battery_voltage(), e.battery_low(), e.occupancy(), e.tamper(),
|
|
20
|
+
exposes.numeric('action_code', ea.STATE).withDescription('Pin code introduced.'),
|
|
21
|
+
exposes.numeric('action_transaction', ea.STATE).withDescription('Last action transaction number.'),
|
|
22
|
+
exposes.text('action_zone', ea.STATE).withDescription('Alarm zone. Default value 23'),
|
|
23
|
+
e.action([
|
|
24
|
+
'panic', 'disarm', 'arm_day_zones', 'arm_all_zones', 'exit_delay', 'entry_delay'])],
|
|
25
|
+
toZigbee: [tz.arm_mode],
|
|
26
|
+
configure: async (device, coordinatorEndpoint) => {
|
|
27
|
+
const endpoint = device.getEndpoint(1);
|
|
28
|
+
const clusters = ['genPowerCfg', 'ssIasZone', 'ssIasAce', 'genBasic', 'genIdentify'];
|
|
29
|
+
await reporting.bind(endpoint, coordinatorEndpoint, clusters);
|
|
30
|
+
await reporting.batteryVoltage(endpoint);
|
|
31
|
+
},
|
|
32
|
+
onEvent: async (type, data, device) => {
|
|
33
|
+
if (type === 'message' && data.type === 'commandGetPanelStatus' && data.cluster === 'ssIasAce' &&
|
|
34
|
+
globalStore.hasValue(device.getEndpoint(1), 'panelStatus')) {
|
|
35
|
+
const payload = {
|
|
36
|
+
panelstatus: globalStore.getValue(device.getEndpoint(1), 'panelStatus'),
|
|
37
|
+
secondsremain: 0x00, audiblenotif: 0x00, alarmstatus: 0x00,
|
|
38
|
+
};
|
|
39
|
+
await device.getEndpoint(1).commandResponse(
|
|
40
|
+
'ssIasAce', 'getPanelStatusRsp', payload, {}, data.meta.zclTransactionSequenceNumber,
|
|
41
|
+
);
|
|
42
|
+
}
|
|
43
|
+
},
|
|
44
|
+
},
|
|
10
45
|
{
|
|
11
46
|
zigbeeModel: ['ZBT-RGBWSwitch-D0801'],
|
|
12
47
|
model: 'ZS230002',
|
package/devices/moes.js
CHANGED
|
@@ -99,8 +99,12 @@ module.exports = [
|
|
|
99
99
|
exposes: [e.switch().setAccess('state', ea.STATE_SET)],
|
|
100
100
|
fromZigbee: [fz.tuya_switch],
|
|
101
101
|
toZigbee: [tz.tuya_switch_state],
|
|
102
|
+
onEvent: tuya.onEventSetLocalTime,
|
|
102
103
|
configure: async (device, coordinatorEndpoint, logger) => {
|
|
103
104
|
await reporting.bind(device.getEndpoint(1), coordinatorEndpoint, ['genOnOff']);
|
|
105
|
+
// Reports itself as battery which is not correct: https://github.com/Koenkk/zigbee2mqtt/issues/6190
|
|
106
|
+
device.powerSource = 'Mains (single phase)';
|
|
107
|
+
device.save();
|
|
104
108
|
},
|
|
105
109
|
},
|
|
106
110
|
{
|
|
@@ -112,6 +116,7 @@ module.exports = [
|
|
|
112
116
|
e.switch().withEndpoint('l2').setAccess('state', ea.STATE_SET)],
|
|
113
117
|
fromZigbee: [fz.ignore_basic_report, fz.tuya_switch],
|
|
114
118
|
toZigbee: [tz.tuya_switch_state],
|
|
119
|
+
onEvent: tuya.onEventSetLocalTime,
|
|
115
120
|
meta: {multiEndpoint: true},
|
|
116
121
|
endpoint: (device) => {
|
|
117
122
|
// Endpoint selection is made in tuya_switch_state
|
|
@@ -134,6 +139,7 @@ module.exports = [
|
|
|
134
139
|
e.switch().withEndpoint('l2').setAccess('state', ea.STATE_SET), e.switch().withEndpoint('l3').setAccess('state', ea.STATE_SET)],
|
|
135
140
|
fromZigbee: [fz.ignore_basic_report, fz.tuya_switch],
|
|
136
141
|
toZigbee: [tz.tuya_switch_state],
|
|
142
|
+
onEvent: tuya.onEventSetLocalTime,
|
|
137
143
|
meta: {multiEndpoint: true},
|
|
138
144
|
endpoint: (device) => {
|
|
139
145
|
// Endpoint selection is made in tuya_switch_state
|
package/devices/paulmann.js
CHANGED
|
@@ -39,6 +39,13 @@ module.exports = [
|
|
|
39
39
|
description: 'Smart Home Zigbee YourLED RGB Controller max. 60W / Smart Home Zigbee LED Reflektor 3,5W GU10 RGBW dimmbar',
|
|
40
40
|
extend: extend.light_onoff_brightness_colortemp_color(),
|
|
41
41
|
},
|
|
42
|
+
{
|
|
43
|
+
zigbeeModel: ['RGBCW_LIGHT'],
|
|
44
|
+
model: '4137',
|
|
45
|
+
vendor: 'Paulmann',
|
|
46
|
+
description: 'Smart Home Zigbee LED bulb 9,3W Matt E27 RGBW',
|
|
47
|
+
extend: extend.light_onoff_brightness_colortemp_color({colorTempRange: [153, 370]}),
|
|
48
|
+
},
|
|
42
49
|
{
|
|
43
50
|
zigbeeModel: ['CCT light'],
|
|
44
51
|
model: '50064',
|
package/devices/philips.js
CHANGED
|
@@ -1964,7 +1964,7 @@ module.exports = [
|
|
|
1964
1964
|
vendor: 'Philips',
|
|
1965
1965
|
description: 'Hue White and Color Ambiance A19 1100 lumen',
|
|
1966
1966
|
meta: {turnsOffAtBrightness1: true},
|
|
1967
|
-
extend:
|
|
1967
|
+
extend: hueExtend.light_onoff_brightness_colortemp_color({colorTempRange: [153, 500]}),
|
|
1968
1968
|
ota: ota.zigbeeOTA,
|
|
1969
1969
|
},
|
|
1970
1970
|
{
|
package/devices/plaid.js
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
const fz = require('zigbee-herdsman-converters/converters/fromZigbee');
|
|
2
|
+
const exposes = require('zigbee-herdsman-converters/lib/exposes');
|
|
3
|
+
const reporting = require('zigbee-herdsman-converters/lib/reporting');
|
|
4
|
+
const e = exposes.presets;
|
|
5
|
+
|
|
6
|
+
module.exports = [
|
|
7
|
+
{
|
|
8
|
+
fingerprint: [{modelID: 'PS-SPRZMS-SLP3', manufacturerName: 'PLAID SYSTEMS'}],
|
|
9
|
+
zigbeeModel: ['PS-SPRZMS-SLP3'],
|
|
10
|
+
model: 'PS-SPRZMS-SLP3',
|
|
11
|
+
vendor: 'PLAID SYSTEMS',
|
|
12
|
+
description: 'Spruce temperature and moisture sensor',
|
|
13
|
+
toZigbee: [],
|
|
14
|
+
fromZigbee: [fz.temperature, fz.humidity],
|
|
15
|
+
exposes: [e.humidity(), e.temperature()],
|
|
16
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
17
|
+
const endpoint = device.getEndpoint(1);
|
|
18
|
+
await reporting.bind(endpoint, coordinatorEndpoint, ['msTemperatureMeasurement', 'msRelativeHumidity']);
|
|
19
|
+
await reporting.temperature(endpoint);
|
|
20
|
+
await reporting.humidity(endpoint);
|
|
21
|
+
},
|
|
22
|
+
},
|
|
23
|
+
];
|
package/devices/schlage.js
CHANGED
|
@@ -10,14 +10,15 @@ module.exports = [
|
|
|
10
10
|
model: 'BE468',
|
|
11
11
|
vendor: 'Schlage',
|
|
12
12
|
description: 'Connect smart deadbolt',
|
|
13
|
-
fromZigbee: [fz.lock, fz.lock_operation_event, fz.battery],
|
|
14
|
-
toZigbee: [tz.lock],
|
|
13
|
+
fromZigbee: [fz.lock, fz.lock_operation_event, fz.battery, fz.lock_pin_code_response, fz.lock_programming_event],
|
|
14
|
+
toZigbee: [tz.lock, tz.pincode_lock],
|
|
15
|
+
meta: {pinCodeCount: 30},
|
|
15
16
|
configure: async (device, coordinatorEndpoint, logger) => {
|
|
16
17
|
const endpoint = device.endpoints[0];
|
|
17
18
|
await reporting.bind(endpoint, coordinatorEndpoint, ['closuresDoorLock', 'genPowerCfg']);
|
|
18
19
|
await reporting.lockState(endpoint);
|
|
19
20
|
await reporting.batteryPercentageRemaining(endpoint);
|
|
20
21
|
},
|
|
21
|
-
exposes: [e.lock(), e.battery()],
|
|
22
|
+
exposes: [e.lock(), e.battery(), e.pincode()],
|
|
22
23
|
},
|
|
23
24
|
];
|
package/devices/tuya.js
CHANGED
|
@@ -132,7 +132,8 @@ module.exports = [
|
|
|
132
132
|
meta: {applyRedFix: true},
|
|
133
133
|
},
|
|
134
134
|
{
|
|
135
|
-
fingerprint: [{modelID: 'TS0501B', manufacturerName: '_TZ3000_4whigl8i'}
|
|
135
|
+
fingerprint: [{modelID: 'TS0501B', manufacturerName: '_TZ3000_4whigl8i'},
|
|
136
|
+
{modelID: 'TS0501B', manufacturerName: '_TZ3210_4whigl8i'}],
|
|
136
137
|
model: 'TS0501B',
|
|
137
138
|
description: 'Zigbee light',
|
|
138
139
|
vendor: 'TuYa',
|
|
@@ -881,14 +882,20 @@ module.exports = [
|
|
|
881
882
|
exposes: [e.humidity(), e.temperature(), e.battery()],
|
|
882
883
|
},
|
|
883
884
|
{
|
|
885
|
+
fingerprint: [{modelID: 'TS0011', manufacturerName: '_TZ3000_l8fsgo6p'}],
|
|
884
886
|
zigbeeModel: ['TS0011'],
|
|
885
887
|
model: 'TS0011',
|
|
886
888
|
vendor: 'TuYa',
|
|
887
889
|
description: 'Smart light switch - 1 gang',
|
|
888
890
|
extend: extend.switch(),
|
|
889
|
-
whiteLabel: [
|
|
890
|
-
{vendor: '
|
|
891
|
+
whiteLabel: [
|
|
892
|
+
{vendor: 'Vrey', model: 'VR-X712U-0013'},
|
|
893
|
+
{vendor: 'TUYATEC', model: 'GDKES-01TZXD'},
|
|
894
|
+
{vendor: 'Lonsonho', model: 'QS-Zigbee-S05-L', description: '1 gang smart switch module without neutral wire'},
|
|
895
|
+
{vendor: 'Mercator ikuü', model: 'SSW01'},
|
|
896
|
+
],
|
|
891
897
|
configure: async (device, coordinatorEndpoint, logger) => {
|
|
898
|
+
await reporting.bind(device.getEndpoint(1), coordinatorEndpoint, ['genOnOff']);
|
|
892
899
|
// Reports itself as battery which is not correct: https://github.com/Koenkk/zigbee2mqtt/issues/6190
|
|
893
900
|
device.powerSource = 'Mains (single phase)';
|
|
894
901
|
device.save();
|
package/lib/exposes.js
CHANGED
|
@@ -494,7 +494,7 @@ module.exports = {
|
|
|
494
494
|
humidity: () => new Numeric('humidity', access.STATE).withUnit('%').withDescription('Measured relative humidity'),
|
|
495
495
|
illuminance: () => new Numeric('illuminance', access.STATE).withDescription('Raw measured illuminance'),
|
|
496
496
|
illuminance_lux: () => new Numeric('illuminance_lux', access.STATE).withUnit('lx').withDescription('Measured illuminance in lux'),
|
|
497
|
-
keypad_lockout: () => new
|
|
497
|
+
keypad_lockout: () => new Enum('keypad_lockout', access.ALL, ['unlock', 'lock1', 'lock2']).withDescription('Enables/disables physical input on the device'),
|
|
498
498
|
led_disabled_night: () => new Binary('led_disabled_night', access.ALL, true, false).withDescription('Enable/disable the LED at night'),
|
|
499
499
|
light_brightness: () => new Light().withBrightness(),
|
|
500
500
|
light_brightness_color: () => new Light().withBrightness().withColor((['xy', 'hs'])),
|
package/npm-shrinkwrap.json
CHANGED
package/package.json
CHANGED
package/devices/smabit.js
DELETED
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
const exposes = require('../lib/exposes');
|
|
2
|
-
const fz = {...require('../converters/fromZigbee'), legacy: require('../lib/legacy').fromZigbee};
|
|
3
|
-
const e = exposes.presets;
|
|
4
|
-
|
|
5
|
-
module.exports = [
|
|
6
|
-
{
|
|
7
|
-
zigbeeModel: ['AV2010/21C'],
|
|
8
|
-
model: 'AV2010/21C',
|
|
9
|
-
vendor: 'SMaBiT',
|
|
10
|
-
description: 'Ultra-flat magnetic contact sensor ',
|
|
11
|
-
fromZigbee: [fz.ias_contact_alarm_1],
|
|
12
|
-
toZigbee: [],
|
|
13
|
-
exposes: [e.contact(), e.battery_low(), e.tamper()],
|
|
14
|
-
},
|
|
15
|
-
];
|