zigbee-herdsman-converters 14.0.333 → 14.0.337
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/converters/fromZigbee.js +62 -1
- package/devices/acova.js +34 -0
- package/devices/custom_devices_diy.js +19 -0
- package/devices/danfoss.js +5 -3
- package/devices/gledopto.js +31 -21
- package/devices/hive.js +2 -2
- package/devices/icasa.js +1 -0
- package/devices/ikea.js +4 -2
- package/devices/immax.js +19 -0
- package/devices/leedarson.js +1 -1
- package/devices/lidl.js +3 -2
- package/devices/owon.js +19 -0
- package/devices/perenio.js +15 -0
- package/devices/popp.js +2 -2
- package/devices/shinasystem.js +17 -0
- package/devices/sunricher.js +18 -0
- package/devices/sylvania.js +8 -0
- package/devices/tuya.js +40 -18
- package/devices/xiaomi.js +24 -0
- package/lib/exposes.js +1 -1
- package/lib/tuya.js +6 -0
- package/npm-shrinkwrap.json +450 -493
- package/package.json +2 -2
package/converters/fromZigbee.js
CHANGED
|
@@ -1757,6 +1757,29 @@ const converters = {
|
|
|
1757
1757
|
}
|
|
1758
1758
|
},
|
|
1759
1759
|
},
|
|
1760
|
+
tuya_illuminance_temperature_humidity_sensor: {
|
|
1761
|
+
cluster: 'manuSpecificTuya',
|
|
1762
|
+
type: ['commandSetDataResponse', 'commandGetData'],
|
|
1763
|
+
options: [exposes.options.precision('temperature'), exposes.options.calibration('temperature'),
|
|
1764
|
+
exposes.options.precision('humidity'), exposes.options.calibration('humidity')],
|
|
1765
|
+
convert: (model, msg, publish, options, meta) => {
|
|
1766
|
+
const dp = msg.data.dp;
|
|
1767
|
+
const value = tuya.getDataValue(msg.data.datatype, msg.data.data);
|
|
1768
|
+
switch (dp) {
|
|
1769
|
+
case tuya.dataPoints.thitTemperature:
|
|
1770
|
+
return {temperature: calibrateAndPrecisionRoundOptions(value / 10, options, 'temperature')};
|
|
1771
|
+
case tuya.dataPoints.thitHumidity:
|
|
1772
|
+
return {humidity: calibrateAndPrecisionRoundOptions(value, options, 'humidity')};
|
|
1773
|
+
case tuya.dataPoints.thitBatteryPercentage:
|
|
1774
|
+
return {battery: value};
|
|
1775
|
+
case tuya.dataPoints.thitIlluminanceLux:
|
|
1776
|
+
return {illuminance_lux: value};
|
|
1777
|
+
default:
|
|
1778
|
+
meta.logger.warn(`zigbee-herdsman-converters:tuya_illuminance_temperature_humidity_sensor: NOT RECOGNIZED ` +
|
|
1779
|
+
`DP #${dp} with data ${JSON.stringify(msg.data)}`);
|
|
1780
|
+
}
|
|
1781
|
+
},
|
|
1782
|
+
},
|
|
1760
1783
|
ts0201_temperature_humidity_alarm: {
|
|
1761
1784
|
cluster: 'manuSpecificTuya_2',
|
|
1762
1785
|
type: ['attributeReport', 'readResponse'],
|
|
@@ -2448,7 +2471,7 @@ const converters = {
|
|
|
2448
2471
|
buttonMapping = {1: '1', 2: '2'};
|
|
2449
2472
|
} else if (model.model === 'TS0043') {
|
|
2450
2473
|
buttonMapping = {1: '1', 2: '2', 3: '3'};
|
|
2451
|
-
} else if (['TS0044', 'YSR-MINI-Z'].includes(model.model)) {
|
|
2474
|
+
} else if (['TS0044', 'YSR-MINI-Z', 'TS004F'].includes(model.model)) {
|
|
2452
2475
|
buttonMapping = {1: '1', 2: '2', 3: '3', 4: '4'};
|
|
2453
2476
|
}
|
|
2454
2477
|
const button = buttonMapping ? `${buttonMapping[msg.endpoint.ID]}_` : '';
|
|
@@ -7487,6 +7510,44 @@ const converters = {
|
|
|
7487
7510
|
}
|
|
7488
7511
|
},
|
|
7489
7512
|
},
|
|
7513
|
+
sunricher_switch2801K2: {
|
|
7514
|
+
cluster: 'greenPower',
|
|
7515
|
+
type: ['commandNotification', 'commandCommisioningNotification'],
|
|
7516
|
+
convert: (model, msg, publish, options, meta) => {
|
|
7517
|
+
const commandID = msg.data.commandID;
|
|
7518
|
+
if (hasAlreadyProcessedMessage(msg, msg.data.frameCounter, `${msg.device.ieeeAddr}_${commandID}`)) return;
|
|
7519
|
+
if (commandID === 224) return;
|
|
7520
|
+
const lookup = {0x21: 'press_on', 0x20: 'press_off', 0x34: 'release', 0x35: 'hold_on', 0x36: 'hold_off'};
|
|
7521
|
+
if (!lookup.hasOwnProperty(commandID)) {
|
|
7522
|
+
meta.logger.error(`Sunricher: missing command '${commandID}'`);
|
|
7523
|
+
} else {
|
|
7524
|
+
return {action: lookup[commandID]};
|
|
7525
|
+
}
|
|
7526
|
+
},
|
|
7527
|
+
},
|
|
7528
|
+
sunricher_switch2801K4: {
|
|
7529
|
+
cluster: 'greenPower',
|
|
7530
|
+
type: ['commandNotification', 'commandCommisioningNotification'],
|
|
7531
|
+
convert: (model, msg, publish, options, meta) => {
|
|
7532
|
+
const commandID = msg.data.commandID;
|
|
7533
|
+
if (hasAlreadyProcessedMessage(msg, msg.data.frameCounter, `${msg.device.ieeeAddr}_${commandID}`)) return;
|
|
7534
|
+
if (commandID === 224) return;
|
|
7535
|
+
const lookup = {
|
|
7536
|
+
0x21: 'press_on',
|
|
7537
|
+
0x20: 'press_off',
|
|
7538
|
+
0x37: 'press_high',
|
|
7539
|
+
0x38: 'press_low',
|
|
7540
|
+
0x35: 'hold_high',
|
|
7541
|
+
0x36: 'hold_low',
|
|
7542
|
+
0x34: 'release',
|
|
7543
|
+
};
|
|
7544
|
+
if (!lookup.hasOwnProperty(commandID)) {
|
|
7545
|
+
meta.logger.error(`Sunricher: missing command '${commandID}'`);
|
|
7546
|
+
} else {
|
|
7547
|
+
return {action: lookup[commandID]};
|
|
7548
|
+
}
|
|
7549
|
+
},
|
|
7550
|
+
},
|
|
7490
7551
|
// #endregion
|
|
7491
7552
|
|
|
7492
7553
|
// #region Ignore converters (these message dont need parsing).
|
package/devices/acova.js
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
const exposes = require('../lib/exposes');
|
|
2
|
+
const fz = require('../converters/fromZigbee');
|
|
3
|
+
const tz = require('../converters/toZigbee');
|
|
4
|
+
const reporting = require('../lib/reporting');
|
|
5
|
+
|
|
6
|
+
module.exports = [{
|
|
7
|
+
zigbeeModel: ['PERCALE2 D1.00P1.01Z1.00'],
|
|
8
|
+
model: 'PERCALE2',
|
|
9
|
+
vendor: 'Acova',
|
|
10
|
+
description: 'Percale 2 heater',
|
|
11
|
+
fromZigbee: [fz.thermostat, fz.hvac_user_interface],
|
|
12
|
+
toZigbee: [
|
|
13
|
+
tz.thermostat_local_temperature,
|
|
14
|
+
tz.thermostat_system_mode,
|
|
15
|
+
tz.thermostat_occupied_heating_setpoint,
|
|
16
|
+
tz.thermostat_unoccupied_heating_setpoint,
|
|
17
|
+
tz.thermostat_occupied_cooling_setpoint,
|
|
18
|
+
tz.thermostat_running_state,
|
|
19
|
+
],
|
|
20
|
+
exposes: [
|
|
21
|
+
exposes.climate()
|
|
22
|
+
.withSetpoint('occupied_heating_setpoint', 7, 28, 0.5)
|
|
23
|
+
.withLocalTemperature()
|
|
24
|
+
.withSystemMode(['off', 'heat', 'auto'])
|
|
25
|
+
.withRunningState(['idle', 'heat']),
|
|
26
|
+
],
|
|
27
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
28
|
+
const endpoint = device.getEndpoint(1);
|
|
29
|
+
await reporting.bind(endpoint, coordinatorEndpoint, ['genPowerCfg', 'hvacThermostat']);
|
|
30
|
+
await reporting.thermostatTemperature(endpoint);
|
|
31
|
+
await reporting.thermostatOccupiedHeatingSetpoint(endpoint);
|
|
32
|
+
await reporting.thermostatUnoccupiedHeatingSetpoint(endpoint);
|
|
33
|
+
},
|
|
34
|
+
}];
|
|
@@ -233,4 +233,23 @@ module.exports = [
|
|
|
233
233
|
},
|
|
234
234
|
exposes: [e.soil_moisture(), e.battery(), e.temperature()],
|
|
235
235
|
},
|
|
236
|
+
{
|
|
237
|
+
zigbeeModel: ['EFEKTA_eON213z'],
|
|
238
|
+
model: 'EFEKTA_eON213z',
|
|
239
|
+
vendor: 'Custom devices (DiY)',
|
|
240
|
+
description: '[Temperature and humidity sensor with e-ink2.13](http://efektalab.com/eON213z)',
|
|
241
|
+
fromZigbee: [fz.temperature, fz.humidity, fz.battery],
|
|
242
|
+
toZigbee: [tz.factory_reset],
|
|
243
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
244
|
+
const endpoint = device.getEndpoint(1);
|
|
245
|
+
await reporting.bind(endpoint, coordinatorEndpoint, [
|
|
246
|
+
'genPowerCfg', 'msTemperatureMeasurement', 'msRelativeHumidity']);
|
|
247
|
+
const overides = {min: 0, max: 21600, change: 0};
|
|
248
|
+
await reporting.batteryVoltage(endpoint, overides);
|
|
249
|
+
await reporting.batteryPercentageRemaining(endpoint, overides);
|
|
250
|
+
await reporting.temperature(endpoint, overides);
|
|
251
|
+
await reporting.humidity(endpoint, overides);
|
|
252
|
+
},
|
|
253
|
+
exposes: [e.battery(), e.temperature(), e.humidity()],
|
|
254
|
+
},
|
|
236
255
|
];
|
package/devices/danfoss.js
CHANGED
|
@@ -34,7 +34,9 @@ module.exports = [
|
|
|
34
34
|
exposes.binary('viewing_direction', ea.ALL, true, false)
|
|
35
35
|
.withDescription('Viewing/Display Direction. `false` Horizontal or `true` Vertical'),
|
|
36
36
|
exposes.binary('heat_available', ea.ALL, true, false)
|
|
37
|
-
.withDescription('Not clear how this affects operation.
|
|
37
|
+
.withDescription('Not clear how this affects operation. However, it would appear that the device does not execute any ' +
|
|
38
|
+
'motor functions if this is set to false. This may be a means to conserve battery during periods that the heating ' +
|
|
39
|
+
'system is not energized (e.g. during summer). `false` No Heat Available or `true` Heat Available'),
|
|
38
40
|
exposes.binary('heat_required', ea.STATE_GET, true, false)
|
|
39
41
|
.withDescription('Whether or not the unit needs warm water. `false` No Heat Request or `true` Heat Request'),
|
|
40
42
|
exposes.enum('setpoint_change_source', ea.STATE, ['manual', 'schedule', 'externally'])
|
|
@@ -42,8 +44,8 @@ module.exports = [
|
|
|
42
44
|
exposes.climate().withSetpoint('occupied_heating_setpoint', 5, 32, 0.5).withLocalTemperature().withPiHeatingDemand()
|
|
43
45
|
.withSystemMode(['heat']).withRunningState(['idle', 'heat'], ea.STATE),
|
|
44
46
|
exposes.numeric('external_measured_room_sensor', ea.ALL)
|
|
45
|
-
.withDescription('Set at maximum 3 hours interval but not more often than every 30 minutes
|
|
46
|
-
'
|
|
47
|
+
.withDescription('Set at maximum 3 hours interval but not more often than every 30 minutes and 0.1 ' +
|
|
48
|
+
'degrees difference. Resets every 3hours to standard. e.g. 21C = 2100 (-8000=undefined).'),
|
|
47
49
|
exposes.numeric('window_open_internal', ea.STATE_GET).withValueMin(0).withValueMax(4)
|
|
48
50
|
.withDescription('0=Quarantine, 1=Windows are closed, 2=Hold - Windows are maybe about to open, ' +
|
|
49
51
|
'3=Open window detected, 4=In window open state from external but detected closed locally'),
|
package/devices/gledopto.js
CHANGED
|
@@ -39,6 +39,27 @@ const gledoptoExtend = {
|
|
|
39
39
|
[tz.gledopto_light_onoff_brightness, tz.gledopto_light_color_colortemp],
|
|
40
40
|
),
|
|
41
41
|
}),
|
|
42
|
+
switch: (options={}) => ({
|
|
43
|
+
...extend.switch(options),
|
|
44
|
+
onEvent: async (type, data, device) => {
|
|
45
|
+
// This device doesn't support reporting.
|
|
46
|
+
// Therefore we read the on/off state every 5 seconds.
|
|
47
|
+
// This is the same way as the Hue bridge does it.
|
|
48
|
+
if (type === 'stop') {
|
|
49
|
+
clearInterval(globalStore.getValue(device, 'interval'));
|
|
50
|
+
globalStore.clearValue(device, 'interval');
|
|
51
|
+
} else if (!globalStore.hasValue(device, 'interval')) {
|
|
52
|
+
const interval = setInterval(async () => {
|
|
53
|
+
try {
|
|
54
|
+
await device.endpoints[0].read('genOnOff', ['onOff']);
|
|
55
|
+
} catch (error) {
|
|
56
|
+
// Do nothing
|
|
57
|
+
}
|
|
58
|
+
}, 5000);
|
|
59
|
+
globalStore.putValue(device, 'interval', interval);
|
|
60
|
+
}
|
|
61
|
+
},
|
|
62
|
+
}),
|
|
42
63
|
};
|
|
43
64
|
|
|
44
65
|
module.exports = [
|
|
@@ -580,32 +601,21 @@ module.exports = [
|
|
|
580
601
|
zigbeeModel: ['GL-G-007Z'],
|
|
581
602
|
model: 'GL-G-007Z',
|
|
582
603
|
vendor: 'Gledopto',
|
|
583
|
-
description: 'Zigbee 9W
|
|
604
|
+
description: 'Zigbee 9W garden lamp RGB+CCT',
|
|
584
605
|
extend: gledoptoExtend.light_onoff_brightness_colortemp_color(),
|
|
585
606
|
},
|
|
586
607
|
{
|
|
587
608
|
zigbeeModel: ['GL-W-001Z'],
|
|
588
609
|
model: 'GL-W-001Z',
|
|
589
610
|
vendor: 'Gledopto',
|
|
590
|
-
description: 'Zigbee
|
|
591
|
-
extend:
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
} else if (!globalStore.hasValue(device, 'interval')) {
|
|
600
|
-
const interval = setInterval(async () => {
|
|
601
|
-
try {
|
|
602
|
-
await device.endpoints[0].read('genOnOff', ['onOff']);
|
|
603
|
-
} catch (error) {
|
|
604
|
-
// Do nothing
|
|
605
|
-
}
|
|
606
|
-
}, 5000);
|
|
607
|
-
globalStore.putValue(device, 'interval', interval);
|
|
608
|
-
}
|
|
609
|
-
},
|
|
611
|
+
description: 'Zigbee on/off wall switch',
|
|
612
|
+
extend: gledoptoExtend.switch(),
|
|
613
|
+
},
|
|
614
|
+
{
|
|
615
|
+
zigbeeModel: ['GL-SD-002'],
|
|
616
|
+
model: 'GL-SD-002',
|
|
617
|
+
vendor: 'Gledopto',
|
|
618
|
+
description: 'Zigbee 3.0 smart home switch',
|
|
619
|
+
extend: gledoptoExtend.switch(),
|
|
610
620
|
},
|
|
611
621
|
];
|
package/devices/hive.js
CHANGED
|
@@ -183,8 +183,8 @@ module.exports = [
|
|
|
183
183
|
exposes.climate().withSetpoint('occupied_heating_setpoint', 5, 32, 0.5).withLocalTemperature().withPiHeatingDemand()
|
|
184
184
|
.withSystemMode(['heat']).withRunningState(['idle', 'heat'], ea.STATE),
|
|
185
185
|
exposes.numeric('external_measured_room_sensor', ea.ALL)
|
|
186
|
-
.withDescription('Set at maximum 3 hours interval but not more often than every 30 minutes
|
|
187
|
-
'
|
|
186
|
+
.withDescription('Set at maximum 3 hours interval but not more often than every 30 minutes and 0.1 ' +
|
|
187
|
+
'degrees difference. Resets every 3hours to standard. e.g. 21C = 2100 (-8000=undefined).'),
|
|
188
188
|
exposes.numeric('window_open_internal', ea.STATE_GET).withValueMin(0).withValueMax(4)
|
|
189
189
|
.withDescription('0=Quarantine, 1=Windows are closed, 2=Hold - Windows are maybe about to open, ' +
|
|
190
190
|
'3=Open window detected, 4=In window open state from external but detected closed locally'),
|
package/devices/icasa.js
CHANGED
|
@@ -81,6 +81,7 @@ module.exports = [
|
|
|
81
81
|
model: 'ICZB-RM11S',
|
|
82
82
|
vendor: 'iCasa',
|
|
83
83
|
description: 'Zigbee 3.0 remote control',
|
|
84
|
+
meta: {battery: {dontDividePercentage: true}},
|
|
84
85
|
fromZigbee: [fz.command_recall, fz.command_on, fz.command_off, fz.command_move, fz.command_stop, fz.battery],
|
|
85
86
|
exposes: [e.battery(), e.action(['recall_*', 'on', 'off', 'brightness_stop', 'brightness_move_up', 'brightness_move_down'])],
|
|
86
87
|
toZigbee: [],
|
package/devices/ikea.js
CHANGED
|
@@ -146,10 +146,12 @@ const ikea = {
|
|
|
146
146
|
convertSet: async (entity, key, value, meta) => {
|
|
147
147
|
if (key == 'fan_state' && value.toLowerCase() == 'on') {
|
|
148
148
|
value = getMetaValue(entity, meta.mapped, 'fanStateOn', 'allEqual', 'on');
|
|
149
|
+
} else {
|
|
150
|
+
value = value.toString().toLowerCase();
|
|
149
151
|
}
|
|
150
152
|
|
|
151
153
|
let fanMode;
|
|
152
|
-
switch (value
|
|
154
|
+
switch (value) {
|
|
153
155
|
case 'off':
|
|
154
156
|
fanMode = 0;
|
|
155
157
|
break;
|
|
@@ -161,7 +163,7 @@ const ikea = {
|
|
|
161
163
|
}
|
|
162
164
|
|
|
163
165
|
await entity.write('manuSpecificIkeaAirPurifier', {'fanMode': fanMode}, manufacturerOptions.ikea);
|
|
164
|
-
return {state: {fan_mode: value
|
|
166
|
+
return {state: {fan_mode: value, fan_state: value === 'off' ? 'OFF' : 'ON'}};
|
|
165
167
|
},
|
|
166
168
|
convertGet: async (entity, key, meta) => {
|
|
167
169
|
await entity.read('manuSpecificIkeaAirPurifier', ['fanMode']);
|
package/devices/immax.js
CHANGED
|
@@ -140,4 +140,23 @@ module.exports = [
|
|
|
140
140
|
description: 'Neo RECUADRO SMART, color temp, dimmable, Zigbee 3.0',
|
|
141
141
|
extend: extend.light_onoff_brightness_colortemp({colorTempRange: [153, 370]}),
|
|
142
142
|
},
|
|
143
|
+
{
|
|
144
|
+
fingerprint: [{modelID: 'TS0202', manufacturerName: '_TZ3210_jijr1sss'}],
|
|
145
|
+
model: '07502L',
|
|
146
|
+
vendor: 'Immax',
|
|
147
|
+
description: '4 in 1 multi sensor',
|
|
148
|
+
fromZigbee: [fz.battery, fz.ignore_basic_report, fz.illuminance, fz.ZB003X, fz.ZB003X_attr, fz.ZB003X_occupancy],
|
|
149
|
+
toZigbee: [tz.ZB003X],
|
|
150
|
+
exposes: [e.occupancy(), e.tamper(), e.battery(), e.illuminance(), e.illuminance_lux().withUnit('lx'), e.temperature(),
|
|
151
|
+
e.humidity(), exposes.numeric('reporting_time', ea.STATE_SET).withDescription('Reporting interval in minutes'),
|
|
152
|
+
exposes.numeric('temperature_calibration', ea.STATE_SET).withDescription('Temperature calibration'),
|
|
153
|
+
exposes.numeric('humidity_calibration', ea.STATE_SET).withDescription('Humidity calibration'),
|
|
154
|
+
exposes.numeric('illuminance_calibration', ea.STATE_SET).withDescription('Illuminance calibration'),
|
|
155
|
+
exposes.binary('pir_enable', ea.STATE_SET, true, false).withDescription('Enable PIR sensor'),
|
|
156
|
+
exposes.binary('led_enable', ea.STATE_SET, true, false).withDescription('Enabled LED'),
|
|
157
|
+
exposes.binary('reporting_enable', ea.STATE_SET, true, false).withDescription('Enabled reporting'),
|
|
158
|
+
exposes.enum('sensitivity', ea.STATE_SET, ['low', 'medium', 'high']).withDescription('PIR sensor sensitivity'),
|
|
159
|
+
// eslint-disable-next-line
|
|
160
|
+
exposes.enum('keep_time', ea.STATE_SET, ['0', '30', '60', '120', '240']).withDescription('PIR keep time in seconds')],
|
|
161
|
+
},
|
|
143
162
|
];
|
package/devices/leedarson.js
CHANGED
|
@@ -85,7 +85,7 @@ module.exports = [
|
|
|
85
85
|
extend: extend.light_onoff_brightness_colortemp(),
|
|
86
86
|
},
|
|
87
87
|
{
|
|
88
|
-
|
|
88
|
+
fingerprint: [{modelID: 'ZHA-PIRSensor', manufacturerName: 'Leedarson'}],
|
|
89
89
|
model: '5AA-SS-ZA-H0',
|
|
90
90
|
vendor: 'Leedarson',
|
|
91
91
|
description: 'Motion sensor',
|
package/devices/lidl.js
CHANGED
|
@@ -417,6 +417,7 @@ module.exports = [
|
|
|
417
417
|
configure: async (device, coordinatorEndpoint, logger) => {
|
|
418
418
|
const endpoint = device.getEndpoint(1);
|
|
419
419
|
await reporting.bind(endpoint, coordinatorEndpoint, ['genPowerCfg']);
|
|
420
|
+
await reporting.batteryPercentageRemaining(endpoint);
|
|
420
421
|
},
|
|
421
422
|
},
|
|
422
423
|
{
|
|
@@ -655,8 +656,8 @@ module.exports = [
|
|
|
655
656
|
fingerprint: [{modelID: 'TS0601', manufacturerName: '_TZE200_chyvmhay'}],
|
|
656
657
|
model: '368308_2010',
|
|
657
658
|
vendor: 'Lidl',
|
|
658
|
-
description: 'Silvercrest
|
|
659
|
-
fromZigbee: [fz.ignore_tuya_set_time, fzLocal.zs_thermostat
|
|
659
|
+
description: 'Silvercrest radiator valve with thermostat',
|
|
660
|
+
fromZigbee: [fz.ignore_tuya_set_time, fzLocal.zs_thermostat],
|
|
660
661
|
toZigbee: [tzLocal.zs_thermostat_current_heating_setpoint, tzLocal.zs_thermostat_child_lock,
|
|
661
662
|
tzLocal.zs_thermostat_comfort_temp, tzLocal.zs_thermostat_eco_temp, tzLocal.zs_thermostat_preset_mode,
|
|
662
663
|
tzLocal.zs_thermostat_system_mode, tzLocal.zs_thermostat_local_temperature_calibration,
|
package/devices/owon.js
CHANGED
|
@@ -83,4 +83,23 @@ module.exports = [
|
|
|
83
83
|
await reporting.thermostatAcLouverPosition(endpoint);
|
|
84
84
|
},
|
|
85
85
|
},
|
|
86
|
+
{
|
|
87
|
+
zigbeeModel: ['THS317'],
|
|
88
|
+
model: 'THS317',
|
|
89
|
+
vendor: 'OWON',
|
|
90
|
+
description: 'Temperature and humidity sensor',
|
|
91
|
+
fromZigbee: [fz.temperature, fz.humidity, fz.battery],
|
|
92
|
+
toZigbee: [],
|
|
93
|
+
exposes: [e.battery(), e.temperature(), e.humidity()],
|
|
94
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
95
|
+
const endpoint = device.getEndpoint(2);
|
|
96
|
+
await reporting.bind(endpoint, coordinatorEndpoint, ['msTemperatureMeasurement', 'msRelativeHumidity', 'genPowerCfg']);
|
|
97
|
+
await reporting.temperature(endpoint);
|
|
98
|
+
await reporting.humidity(endpoint);
|
|
99
|
+
await reporting.batteryVoltage(endpoint);
|
|
100
|
+
await reporting.batteryPercentageRemaining(endpoint);
|
|
101
|
+
device.powerSource = 'Battery';
|
|
102
|
+
device.save();
|
|
103
|
+
},
|
|
104
|
+
},
|
|
86
105
|
];
|
package/devices/perenio.js
CHANGED
|
@@ -33,4 +33,19 @@ module.exports = [
|
|
|
33
33
|
await reporting.batteryPercentageRemaining(endpoint);
|
|
34
34
|
},
|
|
35
35
|
},
|
|
36
|
+
{
|
|
37
|
+
fingerprint: [{modelID: 'ZHA-PirSensor', manufacturerName: 'LDS'}],
|
|
38
|
+
model: 'PECMS01',
|
|
39
|
+
vendor: 'Perenio',
|
|
40
|
+
description: 'Motion sensor',
|
|
41
|
+
fromZigbee: [fz.battery, fz.ias_occupancy_alarm_1],
|
|
42
|
+
toZigbee: [],
|
|
43
|
+
meta: {battery: {dontDividePercentage: true}},
|
|
44
|
+
exposes: [e.occupancy(), e.battery_low(), e.tamper(), e.battery()],
|
|
45
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
46
|
+
const endpoint = device.getEndpoint(1);
|
|
47
|
+
await reporting.bind(endpoint, coordinatorEndpoint, ['genPowerCfg']);
|
|
48
|
+
await reporting.batteryPercentageRemaining(endpoint);
|
|
49
|
+
},
|
|
50
|
+
},
|
|
36
51
|
];
|
package/devices/popp.js
CHANGED
|
@@ -42,8 +42,8 @@ module.exports = [
|
|
|
42
42
|
exposes.climate().withSetpoint('occupied_heating_setpoint', 5, 32, 0.5).withLocalTemperature().withPiHeatingDemand()
|
|
43
43
|
.withSystemMode(['heat']).withRunningState(['idle', 'heat'], ea.STATE),
|
|
44
44
|
exposes.numeric('external_measured_room_sensor', ea.ALL)
|
|
45
|
-
.withDescription('Set at maximum 3 hours interval but not more often than every 30 minutes
|
|
46
|
-
'
|
|
45
|
+
.withDescription('Set at maximum 3 hours interval but not more often than every 30 minutes and 0.1 ' +
|
|
46
|
+
'degrees difference. Resets every 3hours to standard. e.g. 21C = 2100 (-8000=undefined).'),
|
|
47
47
|
exposes.numeric('window_open_internal', ea.STATE_GET).withValueMin(0).withValueMax(4)
|
|
48
48
|
.withDescription('0=Quarantine, 1=Windows are closed, 2=Hold - Windows are maybe about to open, ' +
|
|
49
49
|
'3=Open window detected, 4=In window open state from external but detected closed locally'),
|
package/devices/shinasystem.js
CHANGED
|
@@ -282,4 +282,21 @@ module.exports = [
|
|
|
282
282
|
await reporting.batteryVoltage(endpoint, {min: 30, max: 21600, change: 1});
|
|
283
283
|
},
|
|
284
284
|
},
|
|
285
|
+
{
|
|
286
|
+
zigbeeModel: ['PMM-300Z1'],
|
|
287
|
+
model: 'PMM-300Z1',
|
|
288
|
+
vendor: 'ShinaSystem',
|
|
289
|
+
description: 'SiHAS energy monitor',
|
|
290
|
+
fromZigbee: [fz.electrical_measurement, fz.metering],
|
|
291
|
+
toZigbee: [tz.electrical_measurement_power],
|
|
292
|
+
exposes: [e.power().withAccess(ea.STATE_GET), e.energy()],
|
|
293
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
294
|
+
const endpoint = device.getEndpoint(1);
|
|
295
|
+
await reporting.bind(endpoint, coordinatorEndpoint, ['haElectricalMeasurement', 'seMetering']);
|
|
296
|
+
await reporting.activePower(endpoint, {min: 1, max: 600, change: 5});
|
|
297
|
+
await reporting.instantaneousDemand(endpoint, {min: 1, max: 600, change: 1});
|
|
298
|
+
endpoint.saveClusterAttributeKeyValue('seMetering', {multiplier: 1, divisor: 1000});
|
|
299
|
+
await reporting.currentSummDelivered(endpoint, {min: 1, max: 600, change: 5});
|
|
300
|
+
},
|
|
301
|
+
},
|
|
285
302
|
];
|
package/devices/sunricher.js
CHANGED
|
@@ -234,4 +234,22 @@ module.exports = [
|
|
|
234
234
|
await reporting.currentPositionLiftPercentage(endpoint);
|
|
235
235
|
},
|
|
236
236
|
},
|
|
237
|
+
{
|
|
238
|
+
fingerprint: [{modelID: 'GreenPower_2', ieeeAddr: /^0x00000000010.....$/}],
|
|
239
|
+
model: 'SR-ZGP2801K2-DIM',
|
|
240
|
+
vendor: 'Sunricher',
|
|
241
|
+
description: 'Pushbutton transmitter module',
|
|
242
|
+
fromZigbee: [fz.sunricher_switch2801K2],
|
|
243
|
+
toZigbee: [],
|
|
244
|
+
exposes: [e.action(['press_on', 'press_off', 'hold_on', 'hold_off', 'release'])],
|
|
245
|
+
},
|
|
246
|
+
{
|
|
247
|
+
fingerprint: [{modelID: 'GreenPower_2', ieeeAddr: /^0x000000005d5.....$/}],
|
|
248
|
+
model: 'SR-ZGP2801K4-DIM',
|
|
249
|
+
vendor: 'Sunricher',
|
|
250
|
+
description: 'Pushbutton transmitter module',
|
|
251
|
+
fromZigbee: [fz.sunricher_switch2801K4],
|
|
252
|
+
toZigbee: [],
|
|
253
|
+
exposes: [e.action(['press_on', 'press_off', 'press_high', 'press_low', 'hold_high', 'hold_low', 'release'])],
|
|
254
|
+
},
|
|
237
255
|
];
|
package/devices/sylvania.js
CHANGED
|
@@ -189,4 +189,12 @@ module.exports = [
|
|
|
189
189
|
extend: extend.ledvance.light_onoff_brightness(),
|
|
190
190
|
ota: ota.ledvance,
|
|
191
191
|
},
|
|
192
|
+
{
|
|
193
|
+
zigbeeModel: ['A19 G2 RGBW'],
|
|
194
|
+
model: '75564',
|
|
195
|
+
vendor: 'Sylvania',
|
|
196
|
+
description: 'Smart+ adjustable white and full color bulb A19',
|
|
197
|
+
extend: extend.ledvance.light_onoff_brightness_colortemp_color({colorTempRange: [142, 555]}),
|
|
198
|
+
ota: ota.ledvance,
|
|
199
|
+
},
|
|
192
200
|
];
|
package/devices/tuya.js
CHANGED
|
@@ -36,6 +36,15 @@ module.exports = [
|
|
|
36
36
|
toZigbee: [],
|
|
37
37
|
exposes: [e.temperature(), e.humidity(), e.battery()],
|
|
38
38
|
},
|
|
39
|
+
{
|
|
40
|
+
fingerprint: [{modelID: 'TS0601', manufacturerName: '_TZE200_vzqtvljm'}],
|
|
41
|
+
model: 'TS0601_illuminance_temperature_humidity_sensor',
|
|
42
|
+
vendor: 'TuYa',
|
|
43
|
+
description: 'Illuminance, temperature & humidity sensor',
|
|
44
|
+
fromZigbee: [fz.tuya_illuminance_temperature_humidity_sensor],
|
|
45
|
+
toZigbee: [],
|
|
46
|
+
exposes: [e.temperature(), e.humidity(), e.illuminance_lux(), e.battery()],
|
|
47
|
+
},
|
|
39
48
|
{
|
|
40
49
|
fingerprint: [{modelID: 'TS0601', manufacturerName: '_TZE200_8ygsuhe1'},
|
|
41
50
|
{modelID: 'TS0601', manufacturerName: '_TZE200_yvx5lh6k'}, {modelID: 'TS0601', manufacturerName: '_TZE200_ryfmq5rl'}],
|
|
@@ -57,7 +66,7 @@ module.exports = [
|
|
|
57
66
|
},
|
|
58
67
|
{
|
|
59
68
|
fingerprint: [{modelID: 'TS0001', manufacturerName: '_TZ3000_hktqahrq'}, {manufacturerName: '_TZ3000_hktqahrq'},
|
|
60
|
-
{modelID: 'TS000F', manufacturerName: '_TZ3000_m9af2l6g'}],
|
|
69
|
+
{manufacturerName: '_TZ3000_q6a3tepg'}, {modelID: 'TS000F', manufacturerName: '_TZ3000_m9af2l6g'}],
|
|
61
70
|
model: 'WHD02',
|
|
62
71
|
vendor: 'TuYa',
|
|
63
72
|
description: 'Wall switch module',
|
|
@@ -115,8 +124,8 @@ module.exports = [
|
|
|
115
124
|
model: 'TS0505B',
|
|
116
125
|
vendor: 'TuYa',
|
|
117
126
|
description: 'Zigbee RGB+CCT light',
|
|
118
|
-
whiteLabel: [{vendor: 'Mercator
|
|
119
|
-
{vendor: 'TuYa', model: 'A5C-21F7-01'}, {vendor: 'Mercator
|
|
127
|
+
whiteLabel: [{vendor: 'Mercator Ikuü', model: 'SMD4106W-RGB-ZB'},
|
|
128
|
+
{vendor: 'TuYa', model: 'A5C-21F7-01'}, {vendor: 'Mercator Ikuü', model: 'S9E27LED9W-RGB-Z'}],
|
|
120
129
|
extend: extend.light_onoff_brightness_colortemp_color({colorTempRange: [153, 500]}),
|
|
121
130
|
meta: {applyRedFix: true, enhancedHue: false},
|
|
122
131
|
},
|
|
@@ -155,6 +164,8 @@ module.exports = [
|
|
|
155
164
|
{modelID: 'TS0202', manufacturerName: '_TYZB01_dl7cejts'},
|
|
156
165
|
{modelID: 'TS0202', manufacturerName: '_TYZB01_qjqgmqxr'},
|
|
157
166
|
{modelID: 'TS0202', manufacturerName: '_TZ3000_mmtwjmaq'},
|
|
167
|
+
{modelID: 'TS0202', manufacturerName: '_TZ3000_mcxw5ehu'},
|
|
168
|
+
{modelID: 'TS0202', manufacturerName: '_TYZB01_hqbdru35'},
|
|
158
169
|
{modelID: 'WHD02', manufacturerName: '_TZ3000_hktqahrq'}],
|
|
159
170
|
model: 'TS0202',
|
|
160
171
|
vendor: 'TuYa',
|
|
@@ -241,7 +252,7 @@ module.exports = [
|
|
|
241
252
|
{vendor: 'Earda', model: 'EDM-1ZAA-EU'},
|
|
242
253
|
{vendor: 'Earda', model: 'EDM-1ZAB-EU'},
|
|
243
254
|
{vendor: 'Earda', model: 'EDM-1ZBA-EU'},
|
|
244
|
-
{vendor: 'Mercator
|
|
255
|
+
{vendor: 'Mercator Ikuü', model: 'SSWD01'},
|
|
245
256
|
],
|
|
246
257
|
},
|
|
247
258
|
{
|
|
@@ -437,7 +448,7 @@ module.exports = [
|
|
|
437
448
|
model: 'TS0502B',
|
|
438
449
|
vendor: 'TuYa',
|
|
439
450
|
description: 'Light controller',
|
|
440
|
-
whiteLabel: [{vendor: 'Mercator
|
|
451
|
+
whiteLabel: [{vendor: 'Mercator Ikuü', model: 'SMI7040', description: 'Ford Batten Light'}],
|
|
441
452
|
extend: extend.light_onoff_brightness_colortemp({colorTempRange: [153, 500]}),
|
|
442
453
|
},
|
|
443
454
|
{
|
|
@@ -545,16 +556,24 @@ module.exports = [
|
|
|
545
556
|
model: 'TS004F',
|
|
546
557
|
vendor: 'TuYa',
|
|
547
558
|
description: 'Wireless switch with 4 buttons',
|
|
548
|
-
exposes: [e.battery(), e.action(
|
|
549
|
-
|
|
550
|
-
fromZigbee: [fz.battery, fz.
|
|
551
|
-
toZigbee: [],
|
|
559
|
+
exposes: [e.battery(), e.action(['1_single', '1_double', '1_hold', '2_single', '2_double', '2_hold',
|
|
560
|
+
'3_single', '3_double', '3_hold', '4_single', '4_double', '4_hold'])],
|
|
561
|
+
fromZigbee: [fz.battery, fz.tuya_on_off_action],
|
|
562
|
+
toZigbee: [tz.tuya_operation_mode],
|
|
552
563
|
configure: async (device, coordinatorEndpoint, logger) => {
|
|
553
564
|
const endpoint = device.getEndpoint(1);
|
|
554
|
-
await
|
|
565
|
+
await endpoint.read('genBasic', [0x0004, 0x000, 0x0001, 0x0005, 0x0007, 0xfffe]);
|
|
566
|
+
await endpoint.write('genOnOff', {'tuyaOperationMode': 1});
|
|
567
|
+
await endpoint.read('genOnOff', ['tuyaOperationMode']);
|
|
555
568
|
try {
|
|
556
|
-
await
|
|
557
|
-
} catch (
|
|
569
|
+
await endpoint.read(0xE001, [0xD011]);
|
|
570
|
+
} catch (err) {/* do nothing */}
|
|
571
|
+
await endpoint.read('genPowerCfg', ['batteryVoltage', 'batteryPercentageRemaining']);
|
|
572
|
+
await reporting.bind(endpoint, coordinatorEndpoint, ['genPowerCfg']);
|
|
573
|
+
await reporting.bind(device.getEndpoint(1), coordinatorEndpoint, ['genOnOff']);
|
|
574
|
+
await reporting.bind(device.getEndpoint(2), coordinatorEndpoint, ['genOnOff']);
|
|
575
|
+
await reporting.bind(device.getEndpoint(3), coordinatorEndpoint, ['genOnOff']);
|
|
576
|
+
await reporting.bind(device.getEndpoint(4), coordinatorEndpoint, ['genOnOff']);
|
|
558
577
|
},
|
|
559
578
|
},
|
|
560
579
|
{
|
|
@@ -700,6 +719,7 @@ module.exports = [
|
|
|
700
719
|
{modelID: 'TS0601', manufacturerName: '_TZE200_xuzcvlku'},
|
|
701
720
|
{modelID: 'TS0601', manufacturerName: '_TZE200_4vobcgd3'},
|
|
702
721
|
{modelID: 'TS0601', manufacturerName: '_TZE200_nogaemzt'},
|
|
722
|
+
{modelID: 'TS0601', manufacturerName: '_TZE200_r0jdjrvi'},
|
|
703
723
|
{modelID: 'TS0601', manufacturerName: '_TZE200_pk0sfzvr'},
|
|
704
724
|
{modelID: 'TS0601', manufacturerName: '_TZE200_fdtjuw7u'},
|
|
705
725
|
{modelID: 'TS0601', manufacturerName: '_TZE200_zpzndjez'},
|
|
@@ -709,6 +729,7 @@ module.exports = [
|
|
|
709
729
|
{modelID: 'TS0601', manufacturerName: '_TZE200_nueqqe6k'},
|
|
710
730
|
{modelID: 'TS0601', manufacturerName: '_TZE200_xaabybja'},
|
|
711
731
|
{modelID: 'TS0601', manufacturerName: '_TZE200_rmymn92d'},
|
|
732
|
+
{modelID: 'TS0601', manufacturerName: '_TZE200_3i3exuay'},
|
|
712
733
|
{modelID: 'zo2pocs\u0000', manufacturerName: '_TYST11_fzo2pocs'},
|
|
713
734
|
// Roller blinds:
|
|
714
735
|
{modelID: 'TS0601', manufacturerName: '_TZE200_sbordckq'},
|
|
@@ -1185,7 +1206,7 @@ module.exports = [
|
|
|
1185
1206
|
{vendor: 'Vrey', model: 'VR-X712U-0013'},
|
|
1186
1207
|
{vendor: 'TUYATEC', model: 'GDKES-01TZXD'},
|
|
1187
1208
|
{vendor: 'Lonsonho', model: 'QS-Zigbee-S05-L', description: '1 gang smart switch module without neutral wire'},
|
|
1188
|
-
{vendor: 'Mercator
|
|
1209
|
+
{vendor: 'Mercator Ikuü', model: 'SSW01'},
|
|
1189
1210
|
],
|
|
1190
1211
|
configure: async (device, coordinatorEndpoint, logger) => {
|
|
1191
1212
|
await reporting.bind(device.getEndpoint(1), coordinatorEndpoint, ['genOnOff']);
|
|
@@ -1195,7 +1216,7 @@ module.exports = [
|
|
|
1195
1216
|
},
|
|
1196
1217
|
},
|
|
1197
1218
|
{
|
|
1198
|
-
fingerprint: [{modelID: 'TS0011', manufacturerName: '_TZ3000_ji4araar'}],
|
|
1219
|
+
fingerprint: [{modelID: 'TS0011', manufacturerName: '_TZ3000_ji4araar'}, {modelID: 'TS0011', manufacturerName: '_TZ3000_qmi1cfuq'}],
|
|
1199
1220
|
model: 'TS0011_switch_module',
|
|
1200
1221
|
vendor: 'TuYa',
|
|
1201
1222
|
description: '1 gang switch module - (without neutral)',
|
|
@@ -1234,7 +1255,7 @@ module.exports = [
|
|
|
1234
1255
|
},
|
|
1235
1256
|
},
|
|
1236
1257
|
{
|
|
1237
|
-
fingerprint: [{modelID: 'TS0012', manufacturerName: '_TZ3000_jl7qyupf'}],
|
|
1258
|
+
fingerprint: [{modelID: 'TS0012', manufacturerName: '_TZ3000_jl7qyupf'}, {modelID: 'TS0012', manufacturerName: '_TZ3000_nPGIPl5D'}],
|
|
1238
1259
|
model: 'TS0012_switch_module',
|
|
1239
1260
|
vendor: 'TuYa',
|
|
1240
1261
|
description: '2 gang switch module - (without neutral)',
|
|
@@ -1318,7 +1339,7 @@ module.exports = [
|
|
|
1318
1339
|
{
|
|
1319
1340
|
fingerprint: [{modelID: 'TS0014', manufacturerName: '_TZ3000_jr2atpww'}, {modelID: 'TS0014', manufacturerName: '_TYZB01_dvakyzhd'},
|
|
1320
1341
|
{modelID: 'TS0014', manufacturerName: '_TZ3210_w3hl6rao'}, {modelID: 'TS0014', manufacturerName: '_TYZB01_bagt1e4o'},
|
|
1321
|
-
{modelID: 'TS0014', manufacturerName: '_TZ3000_r0pmi2p3'}],
|
|
1342
|
+
{modelID: 'TS0014', manufacturerName: '_TZ3000_r0pmi2p3'}, {modelID: 'TS0014', manufacturerName: '_TZ3000_fxjdcikv'}],
|
|
1322
1343
|
model: 'TS0014',
|
|
1323
1344
|
vendor: 'TuYa',
|
|
1324
1345
|
description: 'Smart light switch - 4 gang without neutral wire',
|
|
@@ -1329,7 +1350,7 @@ module.exports = [
|
|
|
1329
1350
|
return {'l1': 1, 'l2': 2, 'l3': 3, 'l4': 4};
|
|
1330
1351
|
},
|
|
1331
1352
|
whiteLabel: [{vendor: 'TUYATEC', model: 'GDKES-04TZXD'}, {vendor: 'Vizo', model: 'VZ-222S'},
|
|
1332
|
-
{vendor: 'MakeGood', model: 'MG-ZG04W/B/G'}],
|
|
1353
|
+
{vendor: 'MakeGood', model: 'MG-ZG04W/B/G'}, {vendor: 'Mercator Ikuü', model: 'SSW04'}],
|
|
1333
1354
|
meta: {multiEndpoint: true},
|
|
1334
1355
|
configure: async (device, coordinatorEndpoint, logger) => {
|
|
1335
1356
|
try {
|
|
@@ -1517,7 +1538,8 @@ module.exports = [
|
|
|
1517
1538
|
exposes: [e.battery(), e.illuminance(), e.illuminance_lux()],
|
|
1518
1539
|
},
|
|
1519
1540
|
{
|
|
1520
|
-
fingerprint: [{modelID: 'TS0210', manufacturerName: '_TYZB01_3zv6oleo'}
|
|
1541
|
+
fingerprint: [{modelID: 'TS0210', manufacturerName: '_TYZB01_3zv6oleo'},
|
|
1542
|
+
{modelID: 'TS0210', manufacturerName: '_TYZB01_j9xxahcl'}],
|
|
1521
1543
|
model: 'TS0210',
|
|
1522
1544
|
vendor: 'TuYa',
|
|
1523
1545
|
description: 'Vibration sensor',
|