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.
@@ -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.sensor_mode = sensorModeLookup[data[0x0403]];
1522
+ result.sensor = sensorModeLookup[data[0x0403]];
1523
1523
  }
1524
1524
 
1525
- if (data.hasOwnProperty(0x0406)) {
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(0x0412)) {
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).
@@ -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: ['sensor_mode'],
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: {sensor_mode: value}};
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', ['elkoSensor']);
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/34'],
12
- model: 'AV2010/34',
13
- vendor: 'Bitron',
14
- description: '4-Touch single click buttons',
15
- fromZigbee: [fz.ignore_power_report, fz.command_recall, fz.legacy.AV2010_34_click],
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.action(['recall_*'])],
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, ['genPowerCfg']);
38
+ await reporting.bind(endpoint, coordinatorEndpoint, ['genOnOff']);
21
39
  },
22
40
  },
23
41
  {
24
- zigbeeModel: ['902010/22', 'IR_00.00.03.12TC'],
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: 'Wireless motion detector',
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: 'Wireless motion detector',
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/25'],
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: 'Video wireless socket',
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 and brightness regulator',
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: '902010/128',
69
- vendor: 'Bitron',
70
- description: 'Home wireless socket',
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/29A'],
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: 'SMaBiT Zigbee outdoor siren',
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']).withLocalTemperatureCalibration()],
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/21A'],
113
- model: 'AV2010/21A',
114
- vendor: 'Bitron',
115
- description: 'Compact magnetic contact sensor',
116
- fromZigbee: [fz.ias_contact_alarm_1],
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.contact(), e.battery_low(), e.tamper()],
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/23'],
149
- model: '902010/23',
150
- vendor: 'Bitron',
151
- description: '4 button Zigbee remote control',
152
- fromZigbee: [fz.ias_no_alarm, fz.command_on, fz.command_off, fz.command_step, fz.command_recall],
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(['on', 'off', 'brightness_step_up', 'brightness_step_down', 'recall_*']), e.battery_low()],
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, ['genPowerCfg', 'genBasic', 'genOnOff', 'genLevelCtrl']);
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).withSystemMode(['off', 'heat']).withRunningState(['idle', 'heat'])
36
- .withLocalTemperatureCalibration(),
37
- exposes.enum('sensor_mode', ea.ALL, ['air', 'floor', 'supervisor_floor'])
38
- .withDescription('"air" = Thermostat uses air sensor.' +
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
  ];
@@ -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', 'genBinaryInput']);
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
  },
@@ -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
@@ -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',
@@ -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: extend.light_onoff_brightness_colortemp_color({colorTempRange: [153, 500]}),
1967
+ extend: hueExtend.light_onoff_brightness_colortemp_color({colorTempRange: [153, 500]}),
1968
1968
  ota: ota.zigbeeOTA,
1969
1969
  },
1970
1970
  {
@@ -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
+ ];
@@ -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: [{vendor: 'Vrey', model: 'VR-X712U-0013'}, {vendor: 'TUYATEC', model: 'GDKES-01TZXD'},
890
- {vendor: 'Lonsonho', model: 'QS-Zigbee-S05-L', description: '1 gang smart switch module without neutral wire'}],
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 Binary('keypad_lockout', access.ALL, 'lock1', 'unlock').withDescription('Enables/disables physical input on the device'),
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'])),
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "zigbee-herdsman-converters",
3
- "version": "14.0.245",
3
+ "version": "14.0.249",
4
4
  "lockfileVersion": 1,
5
5
  "requires": true,
6
6
  "dependencies": {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "zigbee-herdsman-converters",
3
- "version": "14.0.245",
3
+ "version": "14.0.249",
4
4
  "description": "Collection of device converters to be used with zigbee-herdsman",
5
5
  "main": "index.js",
6
6
  "files": [
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
- ];