zigbee-herdsman-converters 14.0.521 → 14.0.524

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.
@@ -2257,7 +2257,9 @@ const converters = {
2257
2257
  const value = tuya.getDataValue(dpValue);
2258
2258
 
2259
2259
  switch (dp) {
2260
- case tuya.dataPoints.coverPosition: // Started moving to position (triggered from Zigbee)
2260
+ case tuya.dataPoints.coverPosition: { // Started moving to position (triggered from Zigbee)
2261
+ return {running: true};
2262
+ }
2261
2263
  case tuya.dataPoints.coverArrived: { // Arrived at position
2262
2264
  const running = dp === tuya.dataPoints.coverArrived ? false : true;
2263
2265
  const invert = tuya.isCoverInverted(meta.device.manufacturerName) ? !options.invert_cover : options.invert_cover;
@@ -5529,6 +5531,9 @@ const converters = {
5529
5531
  if (definition.exposes.find((e) => e.name === 'temperature')) {
5530
5532
  result.push(exposes.options.precision('temperature'), exposes.options.calibration('temperature'));
5531
5533
  }
5534
+ if (definition.exposes.find((e) => e.name === 'device_temperature')) {
5535
+ result.push(exposes.options.precision('device_temperature'), exposes.options.calibration('device_temperature'));
5536
+ }
5532
5537
  if (definition.exposes.find((e) => e.name === 'illuminance')) {
5533
5538
  result.push(exposes.options.precision('illuminance'), exposes.options.calibration('illuminance', 'percentual'));
5534
5539
  }
@@ -5550,6 +5555,9 @@ const converters = {
5550
5555
  if (definition.exposes.find((e) => e.name === 'temperature')) {
5551
5556
  result.push(exposes.options.precision('temperature'), exposes.options.calibration('temperature'));
5552
5557
  }
5558
+ if (definition.exposes.find((e) => e.name === 'device_temperature')) {
5559
+ result.push(exposes.options.precision('device_temperature'), exposes.options.calibration('device_temperature'));
5560
+ }
5553
5561
  return result;
5554
5562
  },
5555
5563
  convert: (model, msg, publish, options, meta) => {
@@ -5569,6 +5577,9 @@ const converters = {
5569
5577
  if (definition.exposes.find((e) => e.name === 'temperature')) {
5570
5578
  result.push(exposes.options.precision('temperature'), exposes.options.calibration('temperature'));
5571
5579
  }
5580
+ if (definition.exposes.find((e) => e.name === 'device_temperature')) {
5581
+ result.push(exposes.options.precision('device_temperature'), exposes.options.calibration('device_temperature'));
5582
+ }
5572
5583
  if (definition.exposes.find((e) => e.name === 'illuminance')) {
5573
5584
  result.push(exposes.options.precision('illuminance'), exposes.options.calibration('illuminance', 'percentual'));
5574
5585
  }
@@ -161,36 +161,10 @@ module.exports = [
161
161
  extend: extend.light_onoff_brightness(),
162
162
  },
163
163
  {
164
- zigbeeModel: ['3157100'],
164
+ fingerprint: [{modelID: '3157100', manufacturerName: 'Centralite'}, {modelID: '3157100-E', manufacturerName: 'Centralite'}],
165
165
  model: '3157100',
166
166
  vendor: 'Centralite',
167
- description: '3-Series pearl touch thermostat,',
168
- fromZigbee: [fz.battery, fz.legacy.thermostat_att_report, fz.fan, fz.ignore_time_read],
169
- toZigbee: [tz.factory_reset, tz.thermostat_local_temperature, tz.thermostat_local_temperature_calibration,
170
- tz.thermostat_occupied_heating_setpoint, tz.thermostat_occupied_cooling_setpoint,
171
- tz.thermostat_setpoint_raise_lower, tz.thermostat_remote_sensing,
172
- tz.thermostat_control_sequence_of_operation, tz.thermostat_system_mode,
173
- tz.thermostat_relay_status_log, tz.fan_mode, tz.thermostat_running_state],
174
- exposes: [e.battery(), exposes.climate().withSetpoint('occupied_heating_setpoint', 10, 30, 1).withLocalTemperature()
175
- .withSystemMode(['off', 'heat', 'cool', 'emergency_heating'])
176
- .withRunningState(['idle', 'heat', 'cool', 'fan_only']).withFanMode(['auto', 'on'])
177
- .withSetpoint('occupied_cooling_setpoint', 10, 30, 1)
178
- .withLocalTemperatureCalibration(-30, 30, 0.1)],
179
- meta: {battery: {voltageToPercentage: '3V_1500_2800'}},
180
- configure: async (device, coordinatorEndpoint, logger) => {
181
- const endpoint = device.getEndpoint(1);
182
- await reporting.bind(endpoint, coordinatorEndpoint, ['genPowerCfg', 'hvacThermostat', 'hvacFanCtrl']);
183
- await reporting.batteryVoltage(endpoint);
184
- await reporting.thermostatRunningState(endpoint);
185
- await reporting.thermostatTemperature(endpoint);
186
- await reporting.fanMode(endpoint);
187
- },
188
- },
189
- {
190
- zigbeeModel: ['3157100-E'],
191
- model: '3157100-E',
192
- vendor: 'Centralite',
193
- description: '3-Series pearl touch thermostat,',
167
+ description: '3-Series pearl touch thermostat',
194
168
  fromZigbee: [fz.battery, fz.thermostat, fz.fan, fz.ignore_time_read],
195
169
  toZigbee: [tz.factory_reset, tz.thermostat_local_temperature, tz.thermostat_local_temperature_calibration,
196
170
  tz.thermostat_occupied_heating_setpoint, tz.thermostat_occupied_cooling_setpoint,
@@ -200,11 +174,11 @@ module.exports = [
200
174
  exposes: [e.battery(),
201
175
  exposes.binary('temperature_setpoint_hold', ea.ALL, true, false)
202
176
  .withDescription('Prevent changes. `false` = run normally. `true` = prevent from making changes.'),
203
- exposes.climate().withSetpoint('occupied_heating_setpoint', 10, 30, 1).withLocalTemperature()
177
+ exposes.climate().withSetpoint('occupied_heating_setpoint', 7, 30, 1).withLocalTemperature()
204
178
  .withSystemMode(['off', 'heat', 'cool', 'emergency_heating'])
205
179
  .withRunningState(['idle', 'heat', 'cool', 'fan_only']).withFanMode(['auto', 'on'])
206
- .withSetpoint('occupied_cooling_setpoint', 10, 30, 1)
207
- .withLocalTemperatureCalibration(-30, 30, 0.1)],
180
+ .withSetpoint('occupied_cooling_setpoint', 7, 30, 1)
181
+ .withLocalTemperatureCalibration(-2.5, 2.5, 0.1)],
208
182
  meta: {battery: {voltageToPercentage: '3V_1500_2800'}},
209
183
  configure: async (device, coordinatorEndpoint, logger) => {
210
184
  const endpoint = device.getEndpoint(1);
@@ -222,7 +196,7 @@ module.exports = [
222
196
  vendor: 'Centralite',
223
197
  description: 'HA thermostat',
224
198
  fromZigbee: [fz.battery, fz.thermostat, fz.fan, fz.ignore_time_read],
225
- toZigbee: [tz.factory_reset, tz.thermostat_local_temperature, tz.thermostat_local_temperature_calibration,
199
+ toZigbee: [tz.factory_reset, tz.thermostat_local_temperature,
226
200
  tz.thermostat_occupied_heating_setpoint, tz.thermostat_occupied_cooling_setpoint,
227
201
  tz.thermostat_setpoint_raise_lower, tz.thermostat_remote_sensing,
228
202
  tz.thermostat_control_sequence_of_operation, tz.thermostat_system_mode,
@@ -230,11 +204,10 @@ module.exports = [
230
204
  exposes: [e.battery(),
231
205
  exposes.binary('temperature_setpoint_hold', ea.ALL, true, false)
232
206
  .withDescription('Prevent changes. `false` = run normally. `true` = prevent from making changes.'),
233
- exposes.climate().withSetpoint('occupied_heating_setpoint', 6.66, 30, 1).withLocalTemperature()
207
+ exposes.climate().withSetpoint('occupied_heating_setpoint', 7, 30, 1).withLocalTemperature()
234
208
  .withSystemMode(['off', 'heat', 'cool', 'emergency_heating'])
235
209
  .withRunningState(['idle', 'heat', 'cool', 'fan_only']).withFanMode(['auto', 'on'])
236
- .withSetpoint('occupied_cooling_setpoint', 6.66, 30, 1)
237
- .withLocalTemperatureCalibration(-30, 30, 0.1)],
210
+ .withSetpoint('occupied_cooling_setpoint', 7, 30, 1)],
238
211
  meta: {battery: {voltageToPercentage: '3V_1500_2800'}},
239
212
  configure: async (device, coordinatorEndpoint, logger) => {
240
213
  const endpoint = device.getEndpoint(1);
package/devices/innr.js CHANGED
@@ -60,7 +60,8 @@ module.exports = [
60
60
  model: 'OPL 130 C',
61
61
  vendor: 'Innr',
62
62
  description: 'Outdoor smart pedestal light colour',
63
- extend: extend.light_onoff_brightness_colortemp_color({colorTempRange: [153, 555], supportsHS: true}),
63
+ extend: extend.light_onoff_brightness_colortemp_color(
64
+ {colorTempRange: [153, 555], supportsHS: true, disableColorTempStartup: true}),
64
65
  meta: {applyRedFix: true, turnsOffAtBrightness1: true},
65
66
  },
66
67
  {
package/devices/insta.js CHANGED
@@ -21,7 +21,7 @@ module.exports = [
21
21
  ota: ota.zigbeeOTA,
22
22
  },
23
23
  {
24
- zigbeeModel: ['Generic UP Device'],
24
+ zigbeeModel: ['NEXENTRO Blinds Actuator', 'Generic UP Device'],
25
25
  model: '57008000',
26
26
  vendor: 'Insta',
27
27
  description: 'Blinds actor with lift/tilt calibration & with with inputs for wall switches',
package/devices/kmpcil.js CHANGED
@@ -3,8 +3,71 @@ const fz = {...require('../converters/fromZigbee'), legacy: require('../lib/lega
3
3
  const tz = require('../converters/toZigbee');
4
4
  const constants = require('../lib/constants');
5
5
  const reporting = require('../lib/reporting');
6
+ const globalStore = require('../lib/store');
7
+ const utils = require('../lib/utils');
6
8
  const e = exposes.presets;
7
9
 
10
+ const kmpcilOptions={
11
+ presence_timeout_dc: () => {
12
+ return exposes.numeric('presence_timeout_dc').withValueMin(60).withDescription(
13
+ 'Time in seconds after which presence is cleared after detecting it (default 60 seconds) while in DC.');
14
+ },
15
+ presence_timeout_battery: () => {
16
+ return exposes.numeric('presence_timeout_battery').withValueMin(120).withDescription(
17
+ 'Time in seconds after which presence is cleared after detecting it (default 420 seconds) while in Battery.');
18
+ },
19
+ };
20
+
21
+ function handleKmpcilPresence(model, msg, publish, options, meta) {
22
+ const useOptionsTimeoutBattery = options && options.hasOwnProperty('presence_timeout_battery');
23
+ const timeoutBattery = useOptionsTimeoutBattery ? options.presence_timeout_battery : 420; // 100 seconds by default
24
+
25
+ const useOptionsTimeoutDc = options && options.hasOwnProperty('presence_timeout_dc');
26
+ const timeoutDc = useOptionsTimeoutDc ? options.presence_timeout_dc : 60;
27
+
28
+ const mode = meta.state? meta.state['power_state'] : false;
29
+
30
+ const timeout = mode ? timeoutDc : timeoutBattery;
31
+ // Stop existing timer because motion is detected and set a new one.
32
+ clearTimeout(globalStore.getValue(msg.endpoint, 'timer'));
33
+ const timer = setTimeout(() => publish({presence: false}), timeout * 1000);
34
+ globalStore.putValue(msg.endpoint, 'timer', timer);
35
+
36
+ return {presence: true};
37
+ }
38
+
39
+ const kmpcilConverters = {
40
+ presence_binary_input: {
41
+ cluster: 'genBinaryInput',
42
+ type: ['attributeReport', 'readResponse'],
43
+ convert: (model, msg, publish, options, meta) => {
44
+ const payload = handleKmpcilPresence(model, msg, publish, options, meta);
45
+ if (msg.data.hasOwnProperty('presentValue')) {
46
+ const presentValue = msg.data['presentValue'];
47
+ payload.power_state = (presentValue & 0x01)> 0;
48
+ payload.occupancy = (presentValue & 0x04) > 0;
49
+ payload.vibration = (presentValue & 0x02) > 0;
50
+ }
51
+ return payload;
52
+ },
53
+ },
54
+ presence_power: {
55
+ cluster: 'genPowerCfg',
56
+ type: ['attributeReport', 'readResponse'],
57
+ options: [kmpcilOptions.presence_timeout_dc(), kmpcilOptions.presence_timeout_battery()],
58
+ convert: (model, msg, publish, options, meta) => {
59
+ const payload = handleKmpcilPresence(model, msg, publish, options, meta);
60
+ if (msg.data.hasOwnProperty('batteryVoltage')) {
61
+ payload.voltage = msg.data['batteryVoltage'] * 100;
62
+ if (model.meta && model.meta.battery && model.meta.battery.voltageToPercentage) {
63
+ payload.battery = utils.batteryVoltageToPercentage(payload.voltage, model.meta.battery.voltageToPercentage);
64
+ }
65
+ }
66
+ return payload;
67
+ },
68
+ },
69
+ };
70
+
8
71
  module.exports = [
9
72
  {
10
73
  zigbeeModel: ['RES005'],
@@ -47,4 +110,38 @@ module.exports = [
47
110
  await endpoint.configureReporting('genBinaryOutput', payloadBinaryOutput);
48
111
  },
49
112
  },
113
+ {
114
+ zigbeeModel: ['tagv1'],
115
+ model: 'KMPCIL-tag-001',
116
+ vendor: 'KMPCIL',
117
+ description: 'Arrival sensor',
118
+ fromZigbee: [kmpcilConverters.presence_binary_input, kmpcilConverters.presence_power, fz.temperature],
119
+ exposes: [e.battery(), e.presence(), exposes.binary('power_state', exposes.access.STATE, true, false),
120
+ e.occupancy(), e.vibration(), e.temperature()],
121
+ toZigbee: [],
122
+ meta: {battery: {voltageToPercentage: '3V_1500_2800'}},
123
+ configure: async (device, coordinatorEndpoint, logger) => {
124
+ const endpoint = device.getEndpoint(1);
125
+ for (const cluster of ['msTemperatureMeasurement', 'genPowerCfg', 'genBinaryInput']) {
126
+ // This sleep here(and the sleep) after is to allow the command to be
127
+ // fully sent to coordinator. In case repeater involved and the repeater
128
+ // is litted in resources, we may want to give some time so that the sequence of
129
+ // commands does not overwhelm the repeater.
130
+ await utils.sleep(2000);
131
+ await endpoint.bind(cluster, coordinatorEndpoint);
132
+ }
133
+
134
+ await utils.sleep(1000);
135
+ const p = reporting.payload('batteryVoltage', 0, 10, 1);
136
+ await endpoint.configureReporting('genPowerCfg', p);
137
+
138
+ await utils.sleep(1000);
139
+ const p2 = reporting.payload('presentValue', 0, 300, 1);
140
+ await endpoint.configureReporting('genBinaryInput', p2);
141
+
142
+ await utils.sleep(1000);
143
+ await reporting.temperature(endpoint);
144
+ await endpoint.read('genBinaryInput', ['presentValue']);
145
+ },
146
+ },
50
147
  ];
@@ -32,8 +32,8 @@ module.exports = [
32
32
  {
33
33
  zigbeeModel: [' Contactor\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000'+
34
34
  '\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000'],
35
- model: 'FC80CC',
36
- description: 'Legrand (or Bticino) DIN contactor module',
35
+ model: '412171',
36
+ description: 'DIN contactor module ( Bticino FC80CC )',
37
37
  vendor: 'Legrand',
38
38
  extend: extend.switch(),
39
39
  fromZigbee: [fz.identify, fz.on_off, fz.electrical_measurement, fz.legrand_cluster_fc01, fz.ignore_basic_report, fz.ignore_genOta],
@@ -52,8 +52,8 @@ module.exports = [
52
52
  {
53
53
  zigbeeModel: [' Teleruptor\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000'+
54
54
  '\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000'],
55
- model: 'FC80RC',
56
- description: 'Legrand (or Bticino) DIN smart relay for light control (note: Legrand 412170 may be similar to Bticino FC80RC)',
55
+ model: '412170',
56
+ description: 'DIN smart relay for light control ( Bticino FC80RC ) ',
57
57
  vendor: 'Legrand',
58
58
  extend: extend.switch(),
59
59
  fromZigbee: [fz.identify, fz.on_off, fz.electrical_measurement, fz.legrand_cluster_fc01, fz.ignore_basic_report, fz.ignore_genOta],
@@ -14,6 +14,7 @@ module.exports = [
14
14
  description: 'Water leak switch',
15
15
  fromZigbee: [fz.ias_water_leak_alarm_1, fz.battery],
16
16
  toZigbee: [],
17
+ meta: {battery: {dontDividePercentage: true}},
17
18
  exposes: [e.water_leak(), e.battery_low(), e.tamper(), e.battery()],
18
19
  },
19
20
  {
@@ -82,6 +83,7 @@ module.exports = [
82
83
  description: 'Air sensor',
83
84
  fromZigbee: [fz.lifecontrolVoc, fz.battery],
84
85
  toZigbee: [],
86
+ meta: {battery: {dontDividePercentage: true}},
85
87
  exposes: [e.temperature(), e.humidity(), e.voc(), e.eco2(), e.battery()],
86
88
  },
87
89
  ];
@@ -1259,7 +1259,7 @@ module.exports = [
1259
1259
  vendor: 'Philips',
1260
1260
  description: 'Hue white ambiance 5/6" retrofit recessed downlight',
1261
1261
  meta: {turnsOffAtBrightness1: true},
1262
- extend: hueExtend.light_onoff_brightness_colortemp(),
1262
+ extend: hueExtend.light_onoff_brightness_colortemp({colorTempRange: [153, 454]}),
1263
1263
  ota: ota.zigbeeOTA,
1264
1264
  },
1265
1265
  {
@@ -2762,6 +2762,15 @@ module.exports = [
2762
2762
  extend: hueExtend.light_onoff_brightness_colortemp_color({colorTempRange: [153, 500]}),
2763
2763
  ota: ota.zigbeeOTA,
2764
2764
  },
2765
+ {
2766
+ zigbeeModel: ['1745130P7'],
2767
+ model: '1745130P7',
2768
+ vendor: 'Philips',
2769
+ description: 'Hue Calla outdoor',
2770
+ meta: {turnsOffAtBrightness1: true},
2771
+ extend: hueExtend.light_onoff_brightness_colortemp_color({colorTempRange: [153, 500]}),
2772
+ ota: ota.zigbeeOTA,
2773
+ },
2765
2774
  {
2766
2775
  zigbeeModel: ['LTO002'],
2767
2776
  model: '8719514301542',
@@ -25,6 +25,15 @@ module.exports = [
25
25
  toZigbee: [tz.tuya_cover_control, tz.tuya_cover_options],
26
26
  exposes: [e.cover_position().setAccess('position', ea.STATE_SET)],
27
27
  },
28
+ {
29
+ zigbeeModel: ['sbordckq'],
30
+ model: 'SM-1CTW-EU',
31
+ vendor: 'Somgoms',
32
+ description: 'Curtain switch',
33
+ fromZigbee: [fz.tuya_cover, fz.ignore_basic_report],
34
+ toZigbee: [tz.tuya_cover_control, tz.tuya_cover_options],
35
+ exposes: [e.cover_position().setAccess('position', ea.STATE_SET)],
36
+ },
28
37
  {
29
38
  zigbeeModel: ['hpb9yts'],
30
39
  model: 'ZSTY-SM-1DMZG-US-W',
package/devices/tci.js CHANGED
@@ -15,4 +15,11 @@ module.exports = [
15
15
  description: 'LED driver for wireless control (60 watt)',
16
16
  extend: extend.light_onoff_brightness(),
17
17
  },
18
+ {
19
+ zigbeeModel: ['PROFESSIONALE ZB3'],
20
+ model: '122576',
21
+ vendor: 'TCI',
22
+ description: 'Direct current wireless dimmable electronic drivers with DIP-SWITCH',
23
+ extend: extend.light_onoff_brightness(),
24
+ },
18
25
  ];
@@ -98,4 +98,20 @@ module.exports = [
98
98
  await reporting.onOff(endpoint);
99
99
  },
100
100
  },
101
+ {
102
+ zigbeeModel: ['3RSB015BZ'],
103
+ model: '3RSB015BZ',
104
+ vendor: 'Third Reality',
105
+ description: 'Roller shade',
106
+ fromZigbee: [fz.cover_position_tilt, fz.battery],
107
+ toZigbee: [tz.cover_state, tz.cover_position_tilt],
108
+ meta: {battery: {dontDividePercentage: false}},
109
+ configure: async (device, coordinatorEndpoint, logger) => {
110
+ const endpoint = device.getEndpoint(1);
111
+ await reporting.bind(endpoint, coordinatorEndpoint, ['genPowerCfg', 'closuresWindowCovering']);
112
+ await reporting.batteryPercentageRemaining(endpoint);
113
+ await reporting.currentPositionLiftPercentage(endpoint);
114
+ },
115
+ exposes: [e.cover_position(), e.battery()],
116
+ },
101
117
  ];
package/devices/tuya.js CHANGED
@@ -14,7 +14,7 @@ const TS011Fplugs = ['_TZ3000_5f43h46b', '_TZ3000_cphmq0q7', '_TZ3000_dpo1ysak',
14
14
  '_TZ3000_jvzvulen', '_TZ3000_mraovvmm', '_TZ3000_nfnmi125', '_TZ3000_ps3dmato', '_TZ3000_w0qqde0g', '_TZ3000_u5u4cakc',
15
15
  '_TZ3000_rdtixbnu', '_TZ3000_typdpbpg', '_TZ3000_kx0pris5', '_TZ3000_amdymr7l', '_TZ3000_z1pnpsdo', '_TZ3000_ksw8qtmt',
16
16
  '_TZ3000_nzkqcvvs', '_TZ3000_1h2x4akh', '_TZ3000_9vo5icau', '_TZ3000_cehuw1lw', '_TZ3000_ko6v90pg', '_TZ3000_f1bapcit',
17
- '_TZ3000_cjrngdr3', '_TZ3000_zloso4jk'];
17
+ '_TZ3000_cjrngdr3', '_TZ3000_zloso4jk', '_TZ3000_v4mevirn'];
18
18
 
19
19
  const tzLocal = {
20
20
  TS0504B_color: {
@@ -214,7 +214,8 @@ module.exports = [
214
214
  {modelID: 'TS0001', manufacturerName: '_TZ3000_5ng23zjs'},
215
215
  {modelID: 'TS0001', manufacturerName: '_TZ3000_rmjr4ufz'},
216
216
  {modelID: 'TS0001', manufacturerName: '_TZ3000_v7gnj3ad'},
217
- {modelID: 'TS0001', manufacturerName: '_TZ3000_mx3vgyea'}],
217
+ {modelID: 'TS0001', manufacturerName: '_TZ3000_mx3vgyea'},
218
+ {modelID: 'TS0001', manufacturerName: '_TZ3000_qsp2pwtf'}],
218
219
  model: 'WHD02',
219
220
  vendor: 'TuYa',
220
221
  description: 'Wall switch module',
@@ -1099,7 +1100,6 @@ module.exports = [
1099
1100
  {modelID: 'zo2pocs\u0000', manufacturerName: '_TYST11_fzo2pocs'},
1100
1101
  {modelID: 'TS0601', manufacturerName: '_TZE200_cf1sl3tj'},
1101
1102
  // Roller blinds:
1102
- {modelID: 'TS0601', manufacturerName: '_TZE200_sbordckq'},
1103
1103
  {modelID: 'TS0601', manufacturerName: '_TZE200_fctwhugx'},
1104
1104
  {modelID: 'TS0601', manufacturerName: '_TZE200_zah67ekd'},
1105
1105
  {modelID: 'TS0601', manufacturerName: '_TZE200_hsgrhjpf'},
package/devices/vimar.js CHANGED
@@ -26,4 +26,15 @@ module.exports = [
26
26
  toZigbee: [tz.cover_state, tz.cover_position_tilt],
27
27
  exposes: [e.cover_position()],
28
28
  },
29
+ {
30
+ zigbeeModel: ['Mains_Power_Outlet_v1.0'],
31
+ model: '14593',
32
+ vendor: 'Vimar',
33
+ description: '16A outlet IoT connected',
34
+ extend: extend.switch(),
35
+ configure: async (device, coordinatorEndpoint, logger) => {
36
+ const endpoint = device.getEndpoint(10);
37
+ await reporting.bind(endpoint, coordinatorEndpoint, ['genOnOff']);
38
+ },
39
+ },
29
40
  ];
package/devices/woox.js CHANGED
@@ -134,7 +134,7 @@ module.exports = [
134
134
  onEvent: tuya.onEventsetTime,
135
135
  },
136
136
  {
137
- fingerprint: [{modelID: 'TS0219', manufacturerName: '_TYZB01_ynsiasng'}],
137
+ fingerprint: [{modelID: 'TS0219', manufacturerName: '_TYZB01_ynsiasng'}, {modelID: 'TS0219', manufacturerName: '_TYZB01_bwsijaty'}],
138
138
  model: 'R7051',
139
139
  vendor: 'Woox',
140
140
  description: 'Smart siren',
package/devices/xiaomi.js CHANGED
@@ -79,7 +79,7 @@ module.exports = [
79
79
  endpoint: (device) => {
80
80
  return {l1: 1, l2: 2};
81
81
  },
82
- exposes: [e.power(), e.energy(), e.voltage(), e.temperature(), e.power_outage_memory(),
82
+ exposes: [e.power(), e.energy(), e.voltage(), e.device_temperature(), e.power_outage_memory(),
83
83
  // When in rgbw mode, only one of color and colortemp will be valid, and l2 will be invalid
84
84
  // Do not control l2 in rgbw mode
85
85
  e.light_brightness_colortemp_colorxy([153, 370]).removeFeature('color_temp_startup').withEndpoint('l1'),
@@ -178,7 +178,7 @@ module.exports = [
178
178
  description: 'Aqara wireless switch',
179
179
  meta: {battery: {voltageToPercentage: '3V_2850_3000_log'}},
180
180
  exposes: [e.battery(), e.battery_voltage(), e.action(['single', 'double', 'triple', 'quadruple', 'hold', 'release']),
181
- e.temperature(), e.power_outage_count()],
181
+ e.device_temperature(), e.power_outage_count()],
182
182
  fromZigbee: [fz.xiaomi_multistate_action, fz.xiaomi_WXKG11LM_action, fz.xiaomi_basic,
183
183
  fz.legacy.WXKG11LM_click, fz.legacy.xiaomi_action_click_multistate],
184
184
  toZigbee: [],
@@ -337,8 +337,8 @@ module.exports = [
337
337
  fromZigbee: [fz.on_off, fz.xiaomi_power, fz.aqara_opple, fz.xiaomi_multistate_action],
338
338
  toZigbee: [tz.on_off, tz.xiaomi_switch_operation_mode_opple, tz.xiaomi_switch_power_outage_memory,
339
339
  tz.xiaomi_led_disabled_night, tz.xiaomi_flip_indicator_light],
340
- exposes: [e.switch().withEndpoint('left'), e.switch().withEndpoint('right'),
341
- e.power(), e.energy(), e.voltage(), e.temperature(), e.power_outage_memory(), e.led_disabled_night(), e.flip_indicator_light(),
340
+ exposes: [e.switch().withEndpoint('left'), e.switch().withEndpoint('right'), e.power(), e.energy(), e.voltage(),
341
+ e.device_temperature(), e.power_outage_memory(), e.led_disabled_night(), e.flip_indicator_light(),
342
342
  e.action([
343
343
  'single_left', 'single_right', 'single_both',
344
344
  'double_left', 'double_right', 'double_both']),
@@ -398,7 +398,7 @@ module.exports = [
398
398
  toZigbee: [tz.on_off, tz.xiaomi_power, tz.xiaomi_switch_operation_mode_opple, tz.xiaomi_switch_power_outage_memory,
399
399
  tz.xiaomi_flip_indicator_light],
400
400
  exposes: [e.switch(), e.action(['single', 'double']), e.power().withAccess(ea.STATE_GET), e.energy(), e.flip_indicator_light(),
401
- e.power_outage_memory(), e.temperature().withAccess(ea.STATE),
401
+ e.power_outage_memory(), e.device_temperature().withAccess(ea.STATE),
402
402
  exposes.enum('operation_mode', ea.ALL, ['control_relay', 'decoupled']).withDescription('Decoupled mode')],
403
403
  onEvent: preventReset,
404
404
  configure: async (device, coordinatorEndpoint, logger) => {
@@ -425,7 +425,7 @@ module.exports = [
425
425
  exposes.enum('operation_mode', ea.ALL, ['control_relay', 'decoupled']).withDescription('Decoupled mode for right button')
426
426
  .withEndpoint('right'),
427
427
  e.action(['single_left', 'double_left', 'single_right', 'double_right', 'single_both', 'double_both']),
428
- e.temperature().withAccess(ea.STATE), e.power_outage_memory(), e.flip_indicator_light()],
428
+ e.device_temperature().withAccess(ea.STATE), e.power_outage_memory(), e.flip_indicator_light()],
429
429
  onEvent: preventReset,
430
430
  configure: async (device, coordinatorEndpoint, logger) => {
431
431
  const endpoint1 = device.getEndpoint(1);
@@ -466,7 +466,7 @@ module.exports = [
466
466
  fz.legacy.QBKG04LM_QBKG11LM_click, fz.xiaomi_basic, fz.xiaomi_operation_mode_basic,
467
467
  fz.legacy.QBKG11LM_click, fz.ignore_multistate_report, fz.xiaomi_power],
468
468
  exposes: [
469
- e.switch(), e.power().withAccess(ea.STATE_GET), e.temperature(),
469
+ e.switch(), e.power().withAccess(ea.STATE_GET), e.device_temperature(),
470
470
  e.action(['single', 'double', 'release', 'hold']),
471
471
  exposes.enum('operation_mode', ea.ALL, ['control_relay', 'decoupled'])
472
472
  .withDescription('Decoupled mode'),
@@ -488,7 +488,7 @@ module.exports = [
488
488
  exposes: [
489
489
  e.switch().withEndpoint('left'),
490
490
  e.switch().withEndpoint('right'),
491
- e.temperature(),
491
+ e.device_temperature(),
492
492
  e.action(['release_left', 'release_right', 'release_both', 'double_left', 'double_right',
493
493
  'single_left', 'single_right', 'hold_release_left', 'hold_release_left']),
494
494
  exposes.enum('operation_mode', ea.STATE_SET, ['control_left_relay', 'control_right_relay', 'decoupled'])
@@ -522,7 +522,7 @@ module.exports = [
522
522
  exposes: [
523
523
  e.switch().withEndpoint('left'),
524
524
  e.switch().withEndpoint('right'),
525
- e.temperature(),
525
+ e.device_temperature(),
526
526
  e.power().withAccess(ea.STATE_GET),
527
527
  e.action(['single_left', 'single_right', 'single_both', 'double_left', 'double_right', 'double_both',
528
528
  'hold_left', 'hold_right', 'hold_both', 'release_left', 'release_right', 'release_both']),
@@ -638,7 +638,7 @@ module.exports = [
638
638
  exposes.enum('mode_switch', ea.ALL, ['anti_flicker_mode', 'quick_mode'])
639
639
  .withDescription('Anti flicker mode can be used to solve blinking issues of some lights.' +
640
640
  'Quick mode makes the device respond faster.'),
641
- e.power_outage_memory(), e.led_disabled_night(), e.temperature().withAccess(ea.STATE), e.flip_indicator_light(),
641
+ e.power_outage_memory(), e.led_disabled_night(), e.device_temperature().withAccess(ea.STATE), e.flip_indicator_light(),
642
642
  e.action([
643
643
  'left_single', 'left_double', 'center_single', 'center_double', 'right_single', 'right_double',
644
644
  'single_left_center', 'double_left_center', 'single_left_right', 'double_left_right',
@@ -668,7 +668,7 @@ module.exports = [
668
668
  .withDescription('Decoupled mode for right button')
669
669
  .withEndpoint('right'),
670
670
  e.power().withAccess(ea.STATE), e.power_outage_memory(), e.led_disabled_night(),
671
- e.temperature().withAccess(ea.STATE), e.flip_indicator_light(),
671
+ e.device_temperature().withAccess(ea.STATE), e.flip_indicator_light(),
672
672
  e.action([
673
673
  'single_left', 'double_left', 'single_center', 'double_center', 'single_right', 'double_right',
674
674
  'single_left_center', 'double_left_center', 'single_left_right', 'double_left_right',
@@ -699,7 +699,7 @@ module.exports = [
699
699
  onEvent: preventReset,
700
700
  exposes: [
701
701
  e.switch(), e.power().withAccess(ea.STATE_GET),
702
- e.energy(), e.temperature().withAccess(ea.STATE),
702
+ e.energy(), e.device_temperature().withAccess(ea.STATE),
703
703
  e.voltage().withAccess(ea.STATE), e.action(['single', 'release']),
704
704
  exposes.enum('operation_mode', ea.ALL, ['control_relay', 'decoupled'])
705
705
  .withDescription('Decoupled mode'),
@@ -749,7 +749,7 @@ module.exports = [
749
749
  tz.xiaomi_led_disabled_night, tz.xiaomi_flip_indicator_light],
750
750
  exposes: [
751
751
  e.switch(), e.action(['single', 'double']), e.power().withAccess(ea.STATE), e.energy(),
752
- e.voltage().withAccess(ea.STATE), e.temperature().withAccess(ea.STATE),
752
+ e.voltage().withAccess(ea.STATE), e.device_temperature().withAccess(ea.STATE),
753
753
  e.power_outage_memory(), e.led_disabled_night(), e.flip_indicator_light(),
754
754
  exposes.enum('operation_mode', ea.ALL, ['control_relay', 'decoupled'])
755
755
  .withDescription('Decoupled mode for left button'),
@@ -772,7 +772,7 @@ module.exports = [
772
772
  exposes: [
773
773
  e.switch().withEndpoint('left'), e.switch().withEndpoint('right'),
774
774
  e.power().withAccess(ea.STATE), e.energy(), e.voltage().withAccess(ea.STATE), e.flip_indicator_light(),
775
- e.power_outage_memory(), e.led_disabled_night(), e.temperature().withAccess(ea.STATE),
775
+ e.power_outage_memory(), e.led_disabled_night(), e.device_temperature().withAccess(ea.STATE),
776
776
  e.action([
777
777
  'single_left', 'double_left', 'single_right', 'double_right', 'single_both', 'double_both']),
778
778
  exposes.enum('operation_mode', ea.ALL, ['control_relay', 'decoupled'])
@@ -800,7 +800,7 @@ module.exports = [
800
800
  exposes: [
801
801
  e.switch().withEndpoint('left'), e.switch().withEndpoint('center'), e.switch().withEndpoint('right'),
802
802
  e.power().withAccess(ea.STATE), e.energy(), e.voltage().withAccess(ea.STATE), e.flip_indicator_light(),
803
- e.power_outage_memory(), e.led_disabled_night(), e.temperature().withAccess(ea.STATE),
803
+ e.power_outage_memory(), e.led_disabled_night(), e.device_temperature().withAccess(ea.STATE),
804
804
  e.action([
805
805
  'single_left', 'double_left', 'single_center', 'double_center',
806
806
  'single_right', 'double_right', 'single_left_center', 'double_left_center',
@@ -850,7 +850,7 @@ module.exports = [
850
850
  description: 'Aqara T1 temperature, humidity and pressure sensor',
851
851
  fromZigbee: [fz.aqara_opple, fz.temperature, fz.humidity, fz.pressure, fz.battery],
852
852
  toZigbee: [],
853
- exposes: [e.temperature(), e.humidity(), e.pressure(), e.battery(), e.battery_voltage()],
853
+ exposes: [e.temperature(), e.humidity(), e.pressure(), e.device_temperature(), e.battery(), e.battery_voltage()],
854
854
  meta: {battery: {voltageToPercentage: '3V_2850_3000_log'}},
855
855
  configure: async (device, coordinatorEndpoint, logger) => {
856
856
  const endpoint = device.getEndpoint(1);
@@ -878,7 +878,7 @@ module.exports = [
878
878
  meta: {battery: {voltageToPercentage: '3V_2850_3000_log'}},
879
879
  fromZigbee: [fz.xiaomi_basic, fz.occupancy_with_timeout, fz.RTCGQ11LM_illuminance],
880
880
  toZigbee: [],
881
- exposes: [e.battery(), e.occupancy(), e.temperature(), e.battery_voltage(), e.illuminance_lux().withProperty('illuminance'),
881
+ exposes: [e.battery(), e.occupancy(), e.device_temperature(), e.battery_voltage(), e.illuminance_lux().withProperty('illuminance'),
882
882
  e.illuminance().withUnit('lx').withDescription('Measured illuminance in lux')],
883
883
  },
884
884
  {
@@ -891,7 +891,7 @@ module.exports = [
891
891
  exposes: [e.occupancy(), e.illuminance_lux().withProperty('illuminance'),
892
892
  e.illuminance().withUnit('lx').withDescription('Measured illuminance in lux'),
893
893
  exposes.numeric('detection_interval', ea.ALL).withValueMin(2).withValueMax(65535).withUnit('s')
894
- .withDescription('Time interval for detecting actions'), e.temperature(), e.battery()],
894
+ .withDescription('Time interval for detecting actions'), e.device_temperature(), e.battery(), e.battery_voltage()],
895
895
  meta: {battery: {voltageToPercentage: '3V_2850_3000_log'}},
896
896
  configure: async (device, coordinatorEndpoint, logger) => {
897
897
  const endpoint = device.getEndpoint(1);
@@ -909,7 +909,7 @@ module.exports = [
909
909
  toZigbee: [tz.aqara_detection_interval, tz.aqara_motion_sensitivity],
910
910
  exposes: [e.occupancy(), exposes.enum('motion_sensitivity', ea.ALL, ['low', 'medium', 'high']),
911
911
  exposes.numeric('detection_interval', ea.ALL).withValueMin(2).withValueMax(65535).withUnit('s')
912
- .withDescription('Time interval for detecting actions'), e.temperature(), e.battery()],
912
+ .withDescription('Time interval for detecting actions'), e.device_temperature(), e.battery(), e.battery_voltage()],
913
913
  meta: {battery: {voltageToPercentage: '3V_2850_3000_log'}},
914
914
  configure: async (device, coordinatorEndpoint, logger) => {
915
915
  const endpoint = device.getEndpoint(1);
@@ -933,7 +933,7 @@ module.exports = [
933
933
  exposes.numeric('detection_interval', ea.ALL).withValueMin(2).withValueMax(65535).withUnit('s')
934
934
  .withDescription('Time interval for detecting actions'),
935
935
  exposes.binary('trigger_indicator', ea.ALL, true, false).withDescription('When this option is enabled then ' +
936
- 'blue LED will blink once when motion is detected'), e.temperature(), e.battery(), e.battery_voltage()],
936
+ 'blue LED will blink once when motion is detected'), e.device_temperature(), e.battery(), e.battery_voltage()],
937
937
  meta: {battery: {voltageToPercentage: '3V_2850_3000_log'}},
938
938
  configure: async (device, coordinatorEndpoint, logger) => {
939
939
  const endpoint = device.getEndpoint(1);
@@ -952,7 +952,7 @@ module.exports = [
952
952
  fromZigbee: [fz.aqara_opple],
953
953
  toZigbee: [tz.RTCZCGQ11LM_presence, tz.RTCZCGQ11LM_monitoring_mode, tz.RTCZCGQ11LM_approach_distance,
954
954
  tz.aqara_motion_sensitivity, tz.RTCZCGQ11LM_reset_nopresence_status],
955
- exposes: [e.presence().withAccess(ea.STATE_GET), e.power_outage_count(), e.temperature(),
955
+ exposes: [e.presence().withAccess(ea.STATE_GET),
956
956
  exposes.enum('presence_event', ea.STATE, ['enter', 'leave', 'left_enter', 'right_leave', 'right_enter', 'left_leave',
957
957
  'approach', 'away']).withDescription('Presence events: "enter", "leave", "left_enter", "right_leave", ' +
958
958
  '"right_enter", "left_leave", "approach", "away"'),
@@ -963,7 +963,7 @@ module.exports = [
963
963
  exposes.enum('motion_sensitivity', ea.ALL, ['low', 'medium', 'high']).withDescription('Different sensitivities ' +
964
964
  'means different static human body recognition rate and response speed of occupied'),
965
965
  exposes.enum('reset_nopresence_status', ea.SET, ['Reset']).withDescription('Reset the status of no presence'),
966
- ],
966
+ e.device_temperature(), e.power_outage_count()],
967
967
  configure: async (device, coordinatorEndpoint, logger) => {
968
968
  const endpoint = device.getEndpoint(1);
969
969
  await endpoint.read('aqaraOpple', [0x010c], {manufacturerCode: 0x115f});
@@ -991,7 +991,7 @@ module.exports = [
991
991
  meta: {battery: {voltageToPercentage: '3V_2850_3000_log'}},
992
992
  fromZigbee: [fz.xiaomi_basic, fz.xiaomi_contact],
993
993
  toZigbee: [],
994
- exposes: [e.battery(), e.contact(), e.temperature(), e.battery_voltage()],
994
+ exposes: [e.battery(), e.contact(), e.device_temperature(), e.battery_voltage()],
995
995
  configure: async (device) => {
996
996
  device.powerSource = 'Battery';
997
997
  device.save();
@@ -1005,7 +1005,7 @@ module.exports = [
1005
1005
  meta: {battery: {voltageToPercentage: '3V_2850_3000_log'}},
1006
1006
  fromZigbee: [fz.xiaomi_basic, fz.ias_water_leak_alarm_1],
1007
1007
  toZigbee: [],
1008
- exposes: [e.battery(), e.water_leak(), e.battery_low(), e.battery_voltage(), e.temperature(), e.power_outage_count()],
1008
+ exposes: [e.battery(), e.water_leak(), e.battery_low(), e.battery_voltage(), e.device_temperature(), e.power_outage_count()],
1009
1009
  },
1010
1010
  {
1011
1011
  zigbeeModel: ['lumi.flood.agl02'],
@@ -1025,7 +1025,7 @@ module.exports = [
1025
1025
  description: 'Mi/Aqara smart home cube',
1026
1026
  meta: {battery: {voltageToPercentage: '3V_2850_3000_log'}},
1027
1027
  fromZigbee: [fz.xiaomi_basic, fz.MFKZQ01LM_action_multistate, fz.MFKZQ01LM_action_analog],
1028
- exposes: [e.battery(), e.battery_voltage(), e.angle('action_angle'), e.temperature(), e.power_outage_count(),
1028
+ exposes: [e.battery(), e.battery_voltage(), e.angle('action_angle'), e.device_temperature(), e.power_outage_count(),
1029
1029
  e.cube_side('action_from_side'), e.cube_side('action_side'), e.cube_side('action_to_side'),
1030
1030
  e.action(['shake', 'wakeup', 'fall', 'tap', 'slide', 'flip180', 'flip90', 'rotate_left', 'rotate_right'])],
1031
1031
  toZigbee: [],
@@ -1037,7 +1037,7 @@ module.exports = [
1037
1037
  vendor: 'Xiaomi',
1038
1038
  fromZigbee: [fz.on_off, fz.xiaomi_power, fz.xiaomi_basic, fz.ignore_occupancy_report, fz.ignore_illuminance_report],
1039
1039
  toZigbee: [tz.on_off, tz.xiaomi_switch_power_outage_memory, tz.xiaomi_power],
1040
- exposes: [e.switch(), e.power().withAccess(ea.STATE_GET), e.energy(), e.temperature(), e.power_outage_memory()],
1040
+ exposes: [e.switch(), e.power().withAccess(ea.STATE_GET), e.energy(), e.device_temperature(), e.power_outage_memory()],
1041
1041
  ota: ota.zigbeeOTA,
1042
1042
  },
1043
1043
  {
@@ -1047,7 +1047,7 @@ module.exports = [
1047
1047
  vendor: 'Xiaomi',
1048
1048
  fromZigbee: [fz.on_off, fz.xiaomi_power, fz.xiaomi_basic, fz.ignore_occupancy_report, fz.ignore_illuminance_report],
1049
1049
  toZigbee: [tz.on_off, tz.xiaomi_power],
1050
- exposes: [e.switch(), e.power().withAccess(ea.STATE_GET), e.energy(), e.temperature().withAccess(ea.STATE),
1050
+ exposes: [e.switch(), e.power().withAccess(ea.STATE_GET), e.energy(), e.device_temperature().withAccess(ea.STATE),
1051
1051
  e.voltage().withAccess(ea.STATE)],
1052
1052
  },
1053
1053
  {
@@ -1060,7 +1060,7 @@ module.exports = [
1060
1060
  toZigbee: [tz.on_off, tz.xiaomi_power, tz.xiaomi_switch_power_outage_memory, tz.xiaomi_auto_off, tz.xiaomi_led_disabled_night,
1061
1061
  tz.xiaomi_overload_protection],
1062
1062
  exposes: [
1063
- e.switch(), e.power().withAccess(ea.STATE_GET), e.energy(), e.temperature().withAccess(ea.STATE),
1063
+ e.switch(), e.power().withAccess(ea.STATE_GET), e.energy(), e.device_temperature().withAccess(ea.STATE),
1064
1064
  e.voltage().withAccess(ea.STATE), e.current(), e.consumer_connected(), e.led_disabled_night(),
1065
1065
  e.power_outage_memory(), exposes.binary('auto_off', ea.STATE_SET, true, false)
1066
1066
  .withDescription('Turn the device automatically off when attached device consumes less than 2W for 20 minutes'),
@@ -1075,7 +1075,7 @@ module.exports = [
1075
1075
  vendor: 'Xiaomi',
1076
1076
  fromZigbee: [fz.on_off, fz.xiaomi_power, fz.xiaomi_basic, fz.ignore_occupancy_report, fz.ignore_illuminance_report],
1077
1077
  toZigbee: [tz.on_off, tz.xiaomi_power],
1078
- exposes: [e.switch(), e.power().withAccess(ea.STATE_GET), e.energy(), e.temperature().withAccess(ea.STATE),
1078
+ exposes: [e.switch(), e.power().withAccess(ea.STATE_GET), e.energy(), e.device_temperature().withAccess(ea.STATE),
1079
1079
  e.voltage().withAccess(ea.STATE)],
1080
1080
  },
1081
1081
  {
@@ -1147,7 +1147,7 @@ module.exports = [
1147
1147
  fromZigbee: [fz.on_off, fz.xiaomi_power, fz.ignore_occupancy_report, fz.xiaomi_basic],
1148
1148
  toZigbee: [tz.on_off, tz.xiaomi_power, tz.xiaomi_led_disabled_night,
1149
1149
  tz.xiaomi_switch_power_outage_memory, tz.xiaomi_auto_off],
1150
- exposes: [e.switch(), e.power().withAccess(ea.STATE_GET), e.energy(), e.temperature(), e.voltage().withAccess(ea.STATE),
1150
+ exposes: [e.switch(), e.power().withAccess(ea.STATE_GET), e.energy(), e.device_temperature(), e.voltage().withAccess(ea.STATE),
1151
1151
  e.power_outage_memory(), e.led_disabled_night(),
1152
1152
  exposes.binary('auto_off', ea.STATE_SET, true, false)
1153
1153
  .withDescription('If the power is constantly lower than 2W within half an hour, ' +
@@ -1173,7 +1173,7 @@ module.exports = [
1173
1173
  vendor: 'Xiaomi',
1174
1174
  fromZigbee: [fz.on_off, fz.xiaomi_power, fz.xiaomi_basic],
1175
1175
  toZigbee: [tz.on_off, tz.xiaomi_switch_power_outage_memory, tz.xiaomi_power],
1176
- exposes: [e.switch(), e.power().withAccess(ea.STATE_GET), e.energy(), e.temperature().withAccess(ea.STATE),
1176
+ exposes: [e.switch(), e.power().withAccess(ea.STATE_GET), e.energy(), e.device_temperature().withAccess(ea.STATE),
1177
1177
  e.voltage().withAccess(ea.STATE), e.power_outage_memory()],
1178
1178
  ota: ota.zigbeeOTA,
1179
1179
  },
@@ -1259,7 +1259,7 @@ module.exports = [
1259
1259
  'the normal monitoring state, the green indicator light flashes every 60 seconds'),
1260
1260
  exposes.binary('linkage_alarm', ea.ALL, true, false).withDescription('When this option is enabled and a smoke ' +
1261
1261
  'is detected, other detectors with this option enabled will also sound the alarm buzzer'),
1262
- e.temperature(), e.battery()],
1262
+ e.device_temperature(), e.battery(), e.battery_voltage()],
1263
1263
  meta: {battery: {voltageToPercentage: '3V_2850_3000_log'}},
1264
1264
  configure: async (device, coordinatorEndpoint, logger) => {
1265
1265
  const endpoint = device.getEndpoint(1);
@@ -1290,7 +1290,7 @@ module.exports = [
1290
1290
  fromZigbee: [fz.xiaomi_basic, fz.DJT11LM_vibration],
1291
1291
  toZigbee: [tz.DJT11LM_vibration_sensitivity],
1292
1292
  exposes: [
1293
- e.battery(), e.temperature(), e.vibration(), e.action(['vibration', 'tilt', 'drop']),
1293
+ e.battery(), e.device_temperature(), e.vibration(), e.action(['vibration', 'tilt', 'drop']),
1294
1294
  exposes.numeric('strength', ea.STATE), exposes.enum('sensitivity', ea.STATE_SET, ['low', 'medium', 'high']),
1295
1295
  e.angle_axis('angle_x'), e.angle_axis('angle_y'), e.angle_axis('angle_z'), e.battery_voltage(),
1296
1296
  ],
@@ -1366,7 +1366,7 @@ module.exports = [
1366
1366
  await device.getEndpoint(1).read('genAnalogOutput', ['presentValue']);
1367
1367
  }
1368
1368
  },
1369
- exposes: [e.cover_position().setAccess('state', ea.ALL), e.battery().withAccess(ea.STATE_GET), e.temperature(),
1369
+ exposes: [e.cover_position().setAccess('state', ea.ALL), e.battery().withAccess(ea.STATE_GET), e.device_temperature(),
1370
1370
  exposes.binary('charging_status', ea.STATE_GET, true, false)
1371
1371
  .withDescription('The current charging status.'),
1372
1372
  exposes.enum('motor_state', ea.STATE, ['declining', 'rising', 'pause', 'blocked'])
@@ -1392,7 +1392,7 @@ module.exports = [
1392
1392
  endpoint: (device) => {
1393
1393
  return {'l1': 1, 'l2': 2};
1394
1394
  },
1395
- exposes: [e.power().withAccess(ea.STATE_GET), e.energy(), e.temperature(), e.voltage(), e.current(),
1395
+ exposes: [e.power().withAccess(ea.STATE_GET), e.energy(), e.device_temperature(), e.voltage(), e.current(),
1396
1396
  e.switch().withEndpoint('l1'), e.switch().withEndpoint('l2'), e.power_outage_count(false),
1397
1397
  e.power_outage_memory(),
1398
1398
  exposes.binary('interlock', ea.STATE_SET, true, false)
@@ -1470,7 +1470,7 @@ module.exports = [
1470
1470
  vendor: 'Xiaomi',
1471
1471
  description: 'Aqara Opple switch 1 band',
1472
1472
  fromZigbee: [fz.aqara_opple_on, fz.aqara_opple_off, fz.battery, fz.aqara_opple_multistate, fz.aqara_opple],
1473
- exposes: [e.battery(), e.action([
1473
+ exposes: [e.battery(), e.battery_voltage(), e.action([
1474
1474
  'button_1_hold', 'button_1_release', 'button_1_single', 'button_1_double', 'button_1_triple',
1475
1475
  'button_2_hold', 'button_2_release', 'button_2_single', 'button_2_double', 'button_2_triple',
1476
1476
  ]), exposes.enum('operation_mode', ea.ALL, ['command', 'event'])
@@ -1490,7 +1490,7 @@ module.exports = [
1490
1490
  description: 'Aqara Opple switch 2 bands',
1491
1491
  fromZigbee: [fz.aqara_opple_on, fz.aqara_opple_off, fz.aqara_opple_step, fz.aqara_opple_step_color_temp, fz.battery,
1492
1492
  fz.aqara_opple_multistate, fz.aqara_opple],
1493
- exposes: [e.battery(), e.action([
1493
+ exposes: [e.battery(), e.battery_voltage(), e.action([
1494
1494
  'button_1_hold', 'button_1_release', 'button_1_single', 'button_1_double', 'button_1_triple',
1495
1495
  'button_2_hold', 'button_2_release', 'button_2_single', 'button_2_double', 'button_2_triple',
1496
1496
  'button_3_hold', 'button_3_release', 'button_3_single', 'button_3_double', 'button_3_triple',
@@ -1514,7 +1514,7 @@ module.exports = [
1514
1514
  description: 'Aqara Opple switch 3 bands',
1515
1515
  fromZigbee: [fz.aqara_opple_on, fz.aqara_opple_off, fz.aqara_opple_step, fz.aqara_opple_move, fz.aqara_opple_stop,
1516
1516
  fz.aqara_opple_step_color_temp, fz.aqara_opple_move_color_temp, fz.battery, fz.aqara_opple_multistate, fz.aqara_opple],
1517
- exposes: [e.battery(), e.action([
1517
+ exposes: [e.battery(), e.battery_voltage(), e.action([
1518
1518
  'button_1_hold', 'button_1_release', 'button_1_single', 'button_1_double', 'button_1_triple',
1519
1519
  'button_2_hold', 'button_2_release', 'button_2_single', 'button_2_double', 'button_2_triple',
1520
1520
  'button_3_hold', 'button_3_release', 'button_3_single', 'button_3_double', 'button_3_triple',
@@ -1593,7 +1593,7 @@ module.exports = [
1593
1593
  description: 'Aqara single switch module T1 (with neutral)',
1594
1594
  fromZigbee: [fz.on_off, fz.xiaomi_power, fz.aqara_opple],
1595
1595
  toZigbee: [tz.on_off, tz.xiaomi_power, tz.xiaomi_switch_type, tz.xiaomi_switch_power_outage_memory, tz.xiaomi_led_disabled_night],
1596
- exposes: [e.switch(), e.power().withAccess(ea.STATE_GET), e.energy(), e.temperature().withAccess(ea.STATE),
1596
+ exposes: [e.switch(), e.power().withAccess(ea.STATE_GET), e.energy(), e.device_temperature().withAccess(ea.STATE),
1597
1597
  e.voltage().withAccess(ea.STATE), e.power_outage_memory(), e.led_disabled_night(), e.switch_type()],
1598
1598
  configure: async (device, coordinatorEndpoint, logger) => {
1599
1599
  await device.getEndpoint(1).write('aqaraOpple', {'mode': 1}, {manufacturerCode: 0x115f, disableResponse: true});
@@ -1731,7 +1731,7 @@ module.exports = [
1731
1731
  toZigbee: [tz.on_off, tz.xiaomi_switch_operation_mode_opple, tz.xiaomi_switch_power_outage_memory,
1732
1732
  tz.aqara_switch_mode_switch, tz.xiaomi_flip_indicator_light],
1733
1733
  exposes: [e.switch(), e.power_outage_memory(), e.action(['single', 'double']),
1734
- e.temperature(), e.flip_indicator_light(),
1734
+ e.device_temperature(), e.flip_indicator_light(),
1735
1735
  exposes.enum('operation_mode', ea.ALL, ['control_relay', 'decoupled'])
1736
1736
  .withDescription('Decoupled mode for button'),
1737
1737
  exposes.enum('mode_switch', ea.ALL, ['anti_flicker_mode', 'quick_mode'])
@@ -1755,7 +1755,7 @@ module.exports = [
1755
1755
  return {'left': 1, 'right': 2};
1756
1756
  },
1757
1757
  exposes: [
1758
- e.switch().withEndpoint('left'), e.switch().withEndpoint('right'), e.temperature(),
1758
+ e.switch().withEndpoint('left'), e.switch().withEndpoint('right'), e.device_temperature(),
1759
1759
  exposes.enum('operation_mode', ea.ALL, ['control_relay', 'decoupled'])
1760
1760
  .withDescription('Decoupled mode for left button')
1761
1761
  .withEndpoint('left'),
@@ -1782,7 +1782,7 @@ module.exports = [
1782
1782
  fromZigbee: [fz.xiaomi_tvoc, fz.battery, fz.temperature, fz.humidity],
1783
1783
  toZigbee: [],
1784
1784
  meta: {battery: {voltageToPercentage: '3V_2850_3000_log'}},
1785
- exposes: [e.battery(), e.temperature(), e.humidity(), e.voc()],
1785
+ exposes: [e.temperature(), e.humidity(), e.voc(), e.battery(), e.battery_voltage()],
1786
1786
  configure: async (device, coordinatorEndpoint, logger) => {
1787
1787
  const endpoint = device.getEndpoint(1);
1788
1788
  const binds = ['msTemperatureMeasurement', 'msRelativeHumidity', 'genPowerCfg', 'genAnalogInput'];
@@ -1816,7 +1816,7 @@ module.exports = [
1816
1816
  .withDescription('Decoupled mode for right button')
1817
1817
  .withEndpoint('right'),
1818
1818
  e.action(['single_left', 'double_left', 'single_right', 'double_right', 'single_both', 'double_both']),
1819
- e.power_outage_memory(), e.temperature(), e.flip_indicator_light(),
1819
+ e.power_outage_memory(), e.device_temperature(), e.flip_indicator_light(),
1820
1820
  ],
1821
1821
  onEvent: preventReset,
1822
1822
  configure: async (device, coordinatorEndpoint, logger) => {
@@ -1832,7 +1832,7 @@ module.exports = [
1832
1832
  fromZigbee: [fz.on_off, fz.xiaomi_power, fz.aqara_opple],
1833
1833
  toZigbee: [tz.on_off, tz.xiaomi_switch_power_outage_memory, tz.xiaomi_led_disabled_night,
1834
1834
  tz.xiaomi_overload_protection, tz.xiaomi_socket_button_lock],
1835
- exposes: [e.switch(), e.power().withAccess(ea.STATE), e.energy(), e.temperature().withAccess(ea.STATE),
1835
+ exposes: [e.switch(), e.power().withAccess(ea.STATE), e.energy(), e.device_temperature().withAccess(ea.STATE),
1836
1836
  e.voltage().withAccess(ea.STATE), e.current(), e.consumer_connected().withAccess(ea.STATE),
1837
1837
  e.power_outage_memory(), e.led_disabled_night(), e.button_lock(),
1838
1838
  exposes.numeric('overload_protection', exposes.access.ALL).withValueMin(100).withValueMax(2500).withUnit('W')
@@ -1847,7 +1847,7 @@ module.exports = [
1847
1847
  fromZigbee: [fz.on_off, fz.xiaomi_multistate_action, fz.aqara_opple],
1848
1848
  toZigbee: [tz.on_off, tz.xiaomi_switch_operation_mode_opple, tz.xiaomi_switch_power_outage_memory,
1849
1849
  tz.xiaomi_flip_indicator_light],
1850
- exposes: [e.switch(), e.action(['single', 'double']), e.power_outage_memory(), e.temperature(), e.flip_indicator_light(),
1850
+ exposes: [e.switch(), e.action(['single', 'double']), e.power_outage_memory(), e.device_temperature(), e.flip_indicator_light(),
1851
1851
  exposes.enum('operation_mode', ea.ALL, ['control_relay', 'decoupled']).withDescription('Decoupled mode')],
1852
1852
  onEvent: preventReset,
1853
1853
  configure: async (device, coordinatorEndpoint, logger) => {
@@ -1900,7 +1900,7 @@ module.exports = [
1900
1900
  },
1901
1901
  exposes: [
1902
1902
  e.switch().withEndpoint('relay'), e.switch().withEndpoint('usb'),
1903
- e.power().withAccess(ea.STATE), e.energy(), e.temperature().withAccess(ea.STATE), e.voltage().withAccess(ea.STATE),
1903
+ e.power().withAccess(ea.STATE), e.energy(), e.device_temperature().withAccess(ea.STATE), e.voltage().withAccess(ea.STATE),
1904
1904
  e.current(), e.power_outage_memory(), e.led_disabled_night(), e.button_lock(),
1905
1905
  exposes.enum('button_switch_mode', exposes.access.ALL, ['relay', 'relay_and_usb'])
1906
1906
  .withDescription('Control both relay and usb or only the relay with the physical switch button'),
@@ -1928,7 +1928,7 @@ module.exports = [
1928
1928
  tz.xiaomi_overload_protection, tz.xiaomi_socket_button_lock],
1929
1929
  exposes: [
1930
1930
  e.switch(), e.power().withAccess(ea.STATE), e.energy(),
1931
- e.temperature().withAccess(ea.STATE), e.voltage().withAccess(ea.STATE),
1931
+ e.device_temperature().withAccess(ea.STATE), e.voltage().withAccess(ea.STATE),
1932
1932
  e.current(), e.power_outage_memory(), e.led_disabled_night(), e.button_lock(),
1933
1933
  exposes.numeric('overload_protection', exposes.access.ALL).withValueMin(100).withValueMax(2500).withUnit('W')
1934
1934
  .withDescription('Maximum allowed load, turns off if exceeded')],
@@ -2006,6 +2006,7 @@ module.exports = [
2006
2006
  'multi: supports more events like double and hold'),
2007
2007
  exposes.enum('operation_mode', ea.ALL, ['command', 'event'])
2008
2008
  .withDescription('Operation mode, select "command" to enable bindings (wake up the device before changing modes!)')],
2009
+ meta: {battery: {voltageToPercentage: '3V_2850_3000_log'}},
2009
2010
  configure: async (device, coordinatorEndpoint, logger) => {
2010
2011
  const endpoint1 = device.getEndpoint(1);
2011
2012
  await endpoint1.write('aqaraOpple', {'mode': 1}, {manufacturerCode: 0x115f, disableResponse: true});
@@ -70,6 +70,8 @@ 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 device.getEndpoint(1).read('genBasic',
74
+ ['manufacturerName', 'zclVersion', 'appVersion', 'modelId', 'powerSource', 0xfffe]);
73
75
  await reporting.bind(device.getEndpoint(1), coordinatorEndpoint, ['genOnOff']);
74
76
  await reporting.bind(device.getEndpoint(2), coordinatorEndpoint, ['genOnOff']);
75
77
  await reporting.bind(device.getEndpoint(3), coordinatorEndpoint, ['genOnOff']);
package/lib/legacy.js CHANGED
@@ -2107,7 +2107,7 @@ const fromZigbee = {
2107
2107
  hue_dimmer_switch: {
2108
2108
  cluster: 'manuSpecificPhilips',
2109
2109
  type: 'commandHueNotification',
2110
- options: [exposes.options.legacy()],
2110
+ options: [exposes.options.legacy(), exposes.options.simulated_brightness('Only works when legacy is false.')],
2111
2111
  convert: (model, msg, publish, options, meta) => {
2112
2112
  if (!isLegacyEnabled(options)) {
2113
2113
  return fromZigbeeConverters.hue_dimmer_switch.convert(model, msg, publish, options, meta);
package/lib/xiaomi.js CHANGED
@@ -158,12 +158,11 @@ const numericAttributes2Payload = (msg, meta, model, options, dataObject) => {
158
158
  }
159
159
  break;
160
160
  case '3':
161
- if (['WSDCGQ12LM'].includes(model.model)) {
162
- // This temperature value is ignored because with greater accuracy it is reported in key №100
163
- } else if (['SSM-U01'].includes(model.model)) {
164
- payload.device_temperature = value;
165
- } else if (!['WXCJKG11LM', 'WXCJKG12LM', 'WXCJKG13LM'].includes(model.model)) {
166
- payload.temperature = calibrateAndPrecisionRoundOptions(value, options, 'temperature'); // 0x03
161
+ if (['WXCJKG11LM', 'WXCJKG12LM', 'WXCJKG13LM'].includes(model.model)) {
162
+ // The temperature value is constant 25 °C and does not change, so we ignore it
163
+ // https://github.com/Koenkk/zigbee2mqtt/issues/11126
164
+ } else {
165
+ payload.device_temperature = calibrateAndPrecisionRoundOptions(value, options, 'device_temperature'); // 0x03
167
166
  }
168
167
  break;
169
168
  case '4':
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "zigbee-herdsman-converters",
3
- "version": "14.0.521",
3
+ "version": "14.0.524",
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.30"
41
+ "zigbee-herdsman": "^0.14.32"
42
42
  },
43
43
  "devDependencies": {
44
44
  "eslint": "*",