zigbee-herdsman-converters 15.0.18 → 15.0.20
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 +35 -3
- package/converters/toZigbee.js +58 -0
- package/devices/alchemy.js +7 -0
- package/devices/mercator.js +113 -2
- package/devices/niko.js +48 -7
- package/devices/owon.js +7 -2
- package/devices/philips.js +56 -0
- package/devices/schneider_electric.js +18 -4
- package/devices/sonoff.js +1 -1
- package/devices/tuya.js +0 -1
- package/lib/exposes.js +1 -0
- package/package.json +1 -1
package/converters/fromZigbee.js
CHANGED
|
@@ -794,37 +794,58 @@ const converters = {
|
|
|
794
794
|
on_off: {
|
|
795
795
|
cluster: 'genOnOff',
|
|
796
796
|
type: ['attributeReport', 'readResponse'],
|
|
797
|
+
options: [exposes.options.state_action()],
|
|
797
798
|
convert: (model, msg, publish, options, meta) => {
|
|
798
799
|
if (msg.data.hasOwnProperty('onOff')) {
|
|
800
|
+
const payload = {};
|
|
799
801
|
const property = postfixWithEndpointName('state', msg, model, meta);
|
|
800
|
-
|
|
802
|
+
const state = msg.data['onOff'] === 1 ? 'ON' : 'OFF';
|
|
803
|
+
payload[property] = state;
|
|
804
|
+
if (options && options.state_action) {
|
|
805
|
+
payload['action'] = postfixWithEndpointName(state.toLowerCase(), msg, model, meta);
|
|
806
|
+
}
|
|
807
|
+
return payload;
|
|
801
808
|
}
|
|
802
809
|
},
|
|
803
810
|
},
|
|
804
811
|
on_off_force_multiendpoint: {
|
|
805
812
|
cluster: 'genOnOff',
|
|
806
813
|
type: ['attributeReport', 'readResponse'],
|
|
814
|
+
options: [exposes.options.state_action()],
|
|
807
815
|
convert: (model, msg, publish, options, meta) => {
|
|
808
816
|
// This converted is need instead of `fz.on_off` when no meta: {multiEndpoint: true} can be defined for this device
|
|
809
817
|
// but it is needed for the `state`. E.g. when a switch has 3 channels (state_l1, state_l2, state_l3) but
|
|
810
818
|
// has combined power measurements (power, energy))
|
|
811
819
|
if (msg.data.hasOwnProperty('onOff')) {
|
|
820
|
+
const payload = {};
|
|
812
821
|
const endpointName = model.hasOwnProperty('endpoint') ?
|
|
813
822
|
utils.getKey(model.endpoint(meta.device), msg.endpoint.ID) : msg.endpoint.ID;
|
|
814
|
-
|
|
823
|
+
const state = msg.data['onOff'] === 1 ? 'ON' : 'OFF';
|
|
824
|
+
payload[`state_${endpointName}`] = state;
|
|
825
|
+
if (options && options.state_action) {
|
|
826
|
+
payload['action'] = `${state.toLowerCase()}_${endpointName}`;
|
|
827
|
+
}
|
|
828
|
+
return payload;
|
|
815
829
|
}
|
|
816
830
|
},
|
|
817
831
|
},
|
|
818
832
|
on_off_skip_duplicate_transaction: {
|
|
819
833
|
cluster: 'genOnOff',
|
|
820
834
|
type: ['attributeReport', 'readResponse'],
|
|
835
|
+
options: [exposes.options.state_action()],
|
|
821
836
|
convert: (model, msg, publish, options, meta) => {
|
|
822
837
|
// Device sends multiple messages with the same transactionSequenceNumber,
|
|
823
838
|
// prevent that multiple messages get send.
|
|
824
839
|
// https://github.com/Koenkk/zigbee2mqtt/issues/3687
|
|
825
840
|
if (msg.data.hasOwnProperty('onOff') && !hasAlreadyProcessedMessage(msg, model)) {
|
|
841
|
+
const payload = {};
|
|
826
842
|
const property = postfixWithEndpointName('state', msg, model, meta);
|
|
827
|
-
|
|
843
|
+
const state = msg.data['onOff'] === 1 ? 'ON' : 'OFF';
|
|
844
|
+
payload[property] = state;
|
|
845
|
+
if (options && options.state_action) {
|
|
846
|
+
payload['action'] = postfixWithEndpointName(state.toLowerCase(), msg, model, meta);
|
|
847
|
+
}
|
|
848
|
+
return payload;
|
|
828
849
|
}
|
|
829
850
|
},
|
|
830
851
|
},
|
|
@@ -7431,6 +7452,17 @@ const converters = {
|
|
|
7431
7452
|
const lookup = {1: 'manual', 2: 'schedule', 3: 'energy_saver', 6: 'holiday'};
|
|
7432
7453
|
result['zone_mode'] = lookup[msg.data[0xe010]];
|
|
7433
7454
|
}
|
|
7455
|
+
if (msg.data.hasOwnProperty(0xe011)) {
|
|
7456
|
+
// wiserSmartHactConfig
|
|
7457
|
+
const lookup = {0x00: 'unconfigured', 0x80: 'setpoint_switch', 0x82: 'setpoint_fip', 0x83: 'fip_fip'};
|
|
7458
|
+
result['hact_config'] = lookup[msg.data[0xe011]];
|
|
7459
|
+
}
|
|
7460
|
+
if (msg.data.hasOwnProperty(0xe020)) {
|
|
7461
|
+
// wiserSmartCurrentFilPiloteMode
|
|
7462
|
+
const lookup = {0: 'comfort', 1: 'comfort_-1', 2: 'comfort_-2', 3: 'energy_saving',
|
|
7463
|
+
4: 'frost_protection', 5: 'off'};
|
|
7464
|
+
result['fip_setting'] = lookup[msg.data[0xe020]];
|
|
7465
|
+
}
|
|
7434
7466
|
if (msg.data.hasOwnProperty(0xe030)) {
|
|
7435
7467
|
// wiserSmartValvePosition
|
|
7436
7468
|
result['pi_heating_demand'] = msg.data[0xe030];
|
package/converters/toZigbee.js
CHANGED
|
@@ -61,6 +61,12 @@ const converters = {
|
|
|
61
61
|
await entity.command('genBasic', 'resetFactDefault', {}, utils.getOptions(meta.mapped, entity));
|
|
62
62
|
},
|
|
63
63
|
},
|
|
64
|
+
identify: {
|
|
65
|
+
key: ['identify'],
|
|
66
|
+
convertSet: async (entity, key, value, meta) => {
|
|
67
|
+
await entity.command('genIdentify', 'identify', {identifytime: value}, utils.getOptions(meta.mapped, entity));
|
|
68
|
+
},
|
|
69
|
+
},
|
|
64
70
|
arm_mode: {
|
|
65
71
|
key: ['arm_mode'],
|
|
66
72
|
convertSet: async (entity, key, value, meta) => {
|
|
@@ -6485,6 +6491,58 @@ const converters = {
|
|
|
6485
6491
|
}
|
|
6486
6492
|
},
|
|
6487
6493
|
},
|
|
6494
|
+
wiser_fip_setting: {
|
|
6495
|
+
key: ['fip_setting'],
|
|
6496
|
+
convertSet: async (entity, key, value, meta) => {
|
|
6497
|
+
const zoneLookup = {'manual': 1, 'schedule': 2, 'energy_saver': 3, 'holiday': 6};
|
|
6498
|
+
const zonemodeNum = zoneLookup[meta.state.zone_mode];
|
|
6499
|
+
|
|
6500
|
+
const fipLookup = {'comfort': 0, 'comfort_-1': 1, 'comfort_-2': 2, 'energy_saving': 3,
|
|
6501
|
+
'frost_protection': 4, 'off': 5};
|
|
6502
|
+
value = value.toLowerCase();
|
|
6503
|
+
utils.validateValue(value, Object.keys(fipLookup));
|
|
6504
|
+
const fipmodeNum = fipLookup[value];
|
|
6505
|
+
|
|
6506
|
+
const payload = {
|
|
6507
|
+
zonemode: zonemodeNum,
|
|
6508
|
+
fipmode: fipmodeNum,
|
|
6509
|
+
reserved: 0xff,
|
|
6510
|
+
};
|
|
6511
|
+
await entity.command('hvacThermostat', 'wiserSmartSetFipMode', payload,
|
|
6512
|
+
{srcEndpoint: 11, disableDefaultResponse: true});
|
|
6513
|
+
|
|
6514
|
+
return {state: {'fip_setting': value}};
|
|
6515
|
+
},
|
|
6516
|
+
convertGet: async (entity, key, meta) => {
|
|
6517
|
+
await entity.read('hvacThermostat', [0xe020]);
|
|
6518
|
+
},
|
|
6519
|
+
},
|
|
6520
|
+
wiser_hact_config: {
|
|
6521
|
+
key: ['hact_config'],
|
|
6522
|
+
convertSet: async (entity, key, value, meta) => {
|
|
6523
|
+
const lookup = {'unconfigured': 0x00, 'setpoint_switch': 0x80, 'setpoint_fip': 0x82, 'fip_fip': 0x83};
|
|
6524
|
+
value = value.toLowerCase();
|
|
6525
|
+
utils.validateValue(value, Object.keys(lookup));
|
|
6526
|
+
const mode = lookup[value];
|
|
6527
|
+
await entity.write('hvacThermostat', {0xe011: {value: mode, type: 0x18}});
|
|
6528
|
+
return {state: {'hact_config': value}};
|
|
6529
|
+
},
|
|
6530
|
+
convertGet: async (entity, key, meta) => {
|
|
6531
|
+
await entity.read('hvacThermostat', [0xe011]);
|
|
6532
|
+
},
|
|
6533
|
+
},
|
|
6534
|
+
wiser_zone_mode: {
|
|
6535
|
+
key: ['zone_mode'],
|
|
6536
|
+
convertSet: async (entity, key, value, meta) => {
|
|
6537
|
+
const lookup = {'manual': 1, 'schedule': 2, 'energy_saver': 3, 'holiday': 6};
|
|
6538
|
+
const zonemodeNum = lookup[value];
|
|
6539
|
+
await entity.write('hvacThermostat', {0xe010: {value: zonemodeNum, type: 0x30}});
|
|
6540
|
+
return {state: {'zone_mode': value}};
|
|
6541
|
+
},
|
|
6542
|
+
convertGet: async (entity, key, meta) => {
|
|
6543
|
+
await entity.read('hvacThermostat', [0xe010]);
|
|
6544
|
+
},
|
|
6545
|
+
},
|
|
6488
6546
|
wiser_vact_calibrate_valve: {
|
|
6489
6547
|
key: ['calibrate_valve'],
|
|
6490
6548
|
convertSet: async (entity, key, value, meta) => {
|
package/devices/alchemy.js
CHANGED
|
@@ -8,4 +8,11 @@ module.exports = [
|
|
|
8
8
|
description: 'Downlight with tuneable white',
|
|
9
9
|
extend: extend.light_onoff_brightness_colortemp({colorTempRange: [153, 370]}),
|
|
10
10
|
},
|
|
11
|
+
{
|
|
12
|
+
zigbeeModel: ['AL8RGB13W-AP'],
|
|
13
|
+
model: 'AL8RGB13W-AP',
|
|
14
|
+
vendor: 'Alchemy',
|
|
15
|
+
description: 'Downlight RGBW',
|
|
16
|
+
extend: extend.light_onoff_brightness_colortemp_color({colorTempRange: [153, 370]}),
|
|
17
|
+
},
|
|
11
18
|
];
|
package/devices/mercator.js
CHANGED
|
@@ -3,6 +3,7 @@ const fz = require('../converters/fromZigbee');
|
|
|
3
3
|
const tz = require('../converters/toZigbee');
|
|
4
4
|
const reporting = require('../lib/reporting');
|
|
5
5
|
const tuya = require('../lib/tuya');
|
|
6
|
+
const extend = require('../lib/extend');
|
|
6
7
|
const e = exposes.presets;
|
|
7
8
|
const ea = exposes.access;
|
|
8
9
|
|
|
@@ -30,7 +31,97 @@ module.exports = [
|
|
|
30
31
|
},
|
|
31
32
|
},
|
|
32
33
|
{
|
|
33
|
-
fingerprint:
|
|
34
|
+
fingerprint: [{modelID: 'TS0202', manufacturerName: '_TYZB01_qjqgmqxr'}],
|
|
35
|
+
model: 'SMA02P',
|
|
36
|
+
vendor: 'Mercator',
|
|
37
|
+
description: 'Ikuü battery motion sensor',
|
|
38
|
+
fromZigbee: [fz.ias_occupancy_alarm_1, fz.battery, fz.ignore_basic_report, fz.ias_occupancy_alarm_1_report],
|
|
39
|
+
toZigbee: [],
|
|
40
|
+
exposes: [e.occupancy(), e.battery_low(), e.tamper(), e.battery(), e.battery_voltage()],
|
|
41
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
42
|
+
const endpoint = device.getEndpoint(1);
|
|
43
|
+
await reporting.bind(endpoint, coordinatorEndpoint, ['genPowerCfg']);
|
|
44
|
+
try {
|
|
45
|
+
await reporting.batteryPercentageRemaining(endpoint);
|
|
46
|
+
} catch (error) {/* Fails for some https://github.com/Koenkk/zigbee2mqtt/issues/13708*/}
|
|
47
|
+
},
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
fingerprint: [{modelID: 'TS0201', manufacturerName: '_TZ3000_82ptnsd4'}],
|
|
51
|
+
model: 'SMA03P',
|
|
52
|
+
vendor: 'Mercator',
|
|
53
|
+
description: 'Ikuü temperature & humidity sensor',
|
|
54
|
+
fromZigbee: [fz.battery, fz.temperature, fz.humidity],
|
|
55
|
+
toZigbee: [],
|
|
56
|
+
exposes: [e.battery(), e.temperature(), e.humidity(), e.battery_voltage()],
|
|
57
|
+
configure: tuya.configureMagicPacket,
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
fingerprint: [{modelID: 'TS0203', manufacturerName: '_TZ3000_wbrlnkm9'}],
|
|
61
|
+
model: 'SMA04P',
|
|
62
|
+
vendor: 'Mercator',
|
|
63
|
+
description: 'Ikuü battery contact sensor',
|
|
64
|
+
fromZigbee: [fz.ias_contact_alarm_1, fz.battery, fz.ignore_basic_report, fz.ias_contact_alarm_1_report],
|
|
65
|
+
toZigbee: [],
|
|
66
|
+
exposes: [e.contact(), e.battery_low(), e.tamper(), e.battery(), e.battery_voltage()],
|
|
67
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
68
|
+
try {
|
|
69
|
+
const endpoint = device.getEndpoint(1);
|
|
70
|
+
await reporting.bind(endpoint, coordinatorEndpoint, ['genPowerCfg']);
|
|
71
|
+
await reporting.batteryPercentageRemaining(endpoint);
|
|
72
|
+
await reporting.batteryVoltage(endpoint);
|
|
73
|
+
} catch (error) {/* Fails for some*/}
|
|
74
|
+
},
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
fingerprint: [{modelID: 'TS0502B', manufacturerName: '_TZ3000_6dwfra5l'}],
|
|
78
|
+
model: 'SMCL01-ZB',
|
|
79
|
+
vendor: 'Mercator',
|
|
80
|
+
description: 'Ikuü Ikon ceiling light CCT',
|
|
81
|
+
extend: extend.light_onoff_brightness_colortemp({colorTempRange: [153, 500], disablePowerOnBehavior: true}),
|
|
82
|
+
},
|
|
83
|
+
{
|
|
84
|
+
fingerprint: [{modelID: 'TS0505B', manufacturerName: '_TZ3000_xr5m6kfg'}],
|
|
85
|
+
model: 'SMD4109W-RGB-ZB',
|
|
86
|
+
vendor: 'Mercator',
|
|
87
|
+
description: 'Ikuü Walter downlight RGB + CCT',
|
|
88
|
+
extend: extend.light_onoff_brightness_colortemp_color(
|
|
89
|
+
{colorTempRange: [153, 500], disableColorTempStartup: true, disablePowerOnBehavior: true}),
|
|
90
|
+
meta: {applyRedFix: true, enhancedHue: false},
|
|
91
|
+
},
|
|
92
|
+
{
|
|
93
|
+
fingerprint: [{modelID: 'TS011F', manufacturerName: '_TZ3210_raqjcxo5'}],
|
|
94
|
+
model: 'SPP02G',
|
|
95
|
+
vendor: 'Mercator',
|
|
96
|
+
description: 'Ikuü double indoors power point',
|
|
97
|
+
extend: tuya.extend.switch({powerOutageMemory: true, electricalMeasurements: true, endpoints: ['left', 'right']}),
|
|
98
|
+
exposes: [e.switch().withEndpoint('left'), e.switch().withEndpoint('right'),
|
|
99
|
+
e.power().withEndpoint('left'), e.current().withEndpoint('left'),
|
|
100
|
+
e.voltage().withEndpoint('left').withAccess(ea.STATE), e.energy()],
|
|
101
|
+
endpoint: (device) => {
|
|
102
|
+
return {left: 1, right: 2};
|
|
103
|
+
},
|
|
104
|
+
meta: {multiEndpoint: true},
|
|
105
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
106
|
+
const endpoint1 = device.getEndpoint(1);
|
|
107
|
+
const endpoint2 = device.getEndpoint(2);
|
|
108
|
+
await reporting.bind(endpoint1, coordinatorEndpoint, ['genBasic', 'genOnOff', 'haElectricalMeasurement', 'seMetering']);
|
|
109
|
+
await reporting.bind(endpoint2, coordinatorEndpoint, ['genOnOff']);
|
|
110
|
+
await reporting.onOff(endpoint1);
|
|
111
|
+
await reporting.onOff(endpoint1);
|
|
112
|
+
await reporting.onOff(endpoint1);
|
|
113
|
+
await reporting.rmsVoltage(endpoint1, {change: 5});
|
|
114
|
+
await reporting.rmsCurrent(endpoint1, {change: 50});
|
|
115
|
+
await reporting.activePower(endpoint1, {change: 1});
|
|
116
|
+
await reporting.onOff(endpoint1);
|
|
117
|
+
await reporting.onOff(endpoint2);
|
|
118
|
+
endpoint1.saveClusterAttributeKeyValue('haElectricalMeasurement', {acCurrentDivisor: 1000, acCurrentMultiplier: 1});
|
|
119
|
+
endpoint1.saveClusterAttributeKeyValue('seMetering', {divisor: 100, multiplier: 1});
|
|
120
|
+
device.save();
|
|
121
|
+
},
|
|
122
|
+
},
|
|
123
|
+
{
|
|
124
|
+
fingerprint: [{modelID: 'TS011F', manufacturerName: '_TZ3210_7jnk7l3k'}],
|
|
34
125
|
model: 'SPP02GIP',
|
|
35
126
|
vendor: 'Mercator',
|
|
36
127
|
description: 'Ikuü double outdoors power point',
|
|
@@ -60,11 +151,31 @@ module.exports = [
|
|
|
60
151
|
device.save();
|
|
61
152
|
},
|
|
62
153
|
},
|
|
154
|
+
{
|
|
155
|
+
fingerprint: [{modelID: 'TS0013', manufacturerName: '_TZ3000_khtlvdfc'}],
|
|
156
|
+
model: 'SSW03G',
|
|
157
|
+
vendor: 'Mercator',
|
|
158
|
+
description: 'Ikuü triple switch',
|
|
159
|
+
extend: tuya.extend.switch({backlightModeLowMediumHigh: true, endpoints: ['left', 'center', 'right']}),
|
|
160
|
+
endpoint: (device) => {
|
|
161
|
+
return {'left': 1, 'center': 2, 'right': 3};
|
|
162
|
+
},
|
|
163
|
+
meta: {multiEndpoint: true},
|
|
164
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
165
|
+
await tuya.configureMagicPacket(device, coordinatorEndpoint, logger);
|
|
166
|
+
for (const ID of [1, 2, 3]) {
|
|
167
|
+
const endpoint = device.getEndpoint(ID);
|
|
168
|
+
await reporting.bind(endpoint, coordinatorEndpoint, ['genOnOff']);
|
|
169
|
+
}
|
|
170
|
+
device.powerSource = 'Mains (single phase)';
|
|
171
|
+
device.save();
|
|
172
|
+
},
|
|
173
|
+
},
|
|
63
174
|
{
|
|
64
175
|
fingerprint: [{modelID: 'TS0501', manufacturerName: '_TZ3210_lzqq3u4r'},
|
|
65
176
|
{modelID: 'TS0501', manufacturerName: '_TZ3210_4whigl8i'}],
|
|
66
177
|
model: 'SSWF01G',
|
|
67
|
-
description: 'AC fan controller',
|
|
178
|
+
description: 'Ikuü AC fan controller',
|
|
68
179
|
vendor: 'Mercator',
|
|
69
180
|
fromZigbee: [fz.on_off, fz.fan],
|
|
70
181
|
toZigbee: [tz.fan_mode, tz.on_off],
|
package/devices/niko.js
CHANGED
|
@@ -36,6 +36,20 @@ const local = {
|
|
|
36
36
|
return state;
|
|
37
37
|
},
|
|
38
38
|
},
|
|
39
|
+
switch_status_led: {
|
|
40
|
+
cluster: 'manuSpecificNiko1',
|
|
41
|
+
type: ['attributeReport', 'readResponse'],
|
|
42
|
+
convert: (model, msg, publish, options, meta) => {
|
|
43
|
+
const state = {};
|
|
44
|
+
if (msg.data.hasOwnProperty('outletLedState')) {
|
|
45
|
+
state['led_enable'] = (msg.data['outletLedState'] == 1);
|
|
46
|
+
}
|
|
47
|
+
if (msg.data.hasOwnProperty('outletLedColor')) {
|
|
48
|
+
state['led_state'] = (msg.data['outletLedColor'] == 255 ? 'ON' : 'OFF');
|
|
49
|
+
}
|
|
50
|
+
return state;
|
|
51
|
+
},
|
|
52
|
+
},
|
|
39
53
|
outlet: {
|
|
40
54
|
cluster: 'manuSpecificNiko1',
|
|
41
55
|
type: ['attributeReport', 'readResponse'],
|
|
@@ -69,6 +83,27 @@ const local = {
|
|
|
69
83
|
await entity.read('manuSpecificNiko1', ['switchOperationMode']);
|
|
70
84
|
},
|
|
71
85
|
},
|
|
86
|
+
switch_led_enable: {
|
|
87
|
+
key: ['led_enable'],
|
|
88
|
+
convertSet: async (entity, key, value, meta) => {
|
|
89
|
+
await entity.write('manuSpecificNiko1', {'outletLedState': ((value) ? 1 : 0)});
|
|
90
|
+
await entity.read('manuSpecificNiko1', ['outletLedColor']);
|
|
91
|
+
return {state: {led_enable: ((value) ? true : false)}};
|
|
92
|
+
},
|
|
93
|
+
convertGet: async (entity, key, meta) => {
|
|
94
|
+
await entity.read('manuSpecificNiko1', ['outletLedState']);
|
|
95
|
+
},
|
|
96
|
+
},
|
|
97
|
+
switch_led_state: {
|
|
98
|
+
key: ['led_state'],
|
|
99
|
+
convertSet: async (entity, key, value, meta) => {
|
|
100
|
+
await entity.write('manuSpecificNiko1', {'outletLedColor': ((value.toLowerCase() === 'off') ? 0 : 255)});
|
|
101
|
+
return {state: {led_state: ((value.toLowerCase() === 'off') ? 'OFF' : 'ON')}};
|
|
102
|
+
},
|
|
103
|
+
convertGet: async (entity, key, meta) => {
|
|
104
|
+
await entity.read('manuSpecificNiko1', ['outletLedColor']);
|
|
105
|
+
},
|
|
106
|
+
},
|
|
72
107
|
outlet_child_lock: {
|
|
73
108
|
key: ['child_lock'],
|
|
74
109
|
convertSet: async (entity, key, value, meta) => {
|
|
@@ -198,18 +233,20 @@ module.exports = [
|
|
|
198
233
|
model: '552-721X1',
|
|
199
234
|
vendor: 'Niko',
|
|
200
235
|
description: 'Single connectable switch',
|
|
201
|
-
fromZigbee: [fz.on_off, local.fz.switch_operation_mode, local.fz.switch_action],
|
|
202
|
-
toZigbee: [tz.on_off, local.tz.switch_operation_mode],
|
|
236
|
+
fromZigbee: [fz.on_off, local.fz.switch_operation_mode, local.fz.switch_action, local.fz.switch_status_led],
|
|
237
|
+
toZigbee: [tz.on_off, local.tz.switch_operation_mode, local.tz.switch_led_enable, local.tz.switch_led_state],
|
|
203
238
|
configure: async (device, coordinatorEndpoint, logger) => {
|
|
204
239
|
const endpoint = device.getEndpoint(1);
|
|
205
240
|
await reporting.bind(endpoint, coordinatorEndpoint, ['genOnOff']);
|
|
206
241
|
await reporting.onOff(endpoint);
|
|
207
|
-
await endpoint.read('manuSpecificNiko1', ['switchOperationMode']);
|
|
242
|
+
await endpoint.read('manuSpecificNiko1', ['switchOperationMode', 'outletLedState', 'outletLedColor']);
|
|
208
243
|
},
|
|
209
244
|
exposes: [
|
|
210
245
|
e.switch(),
|
|
211
246
|
e.action(['single', 'hold', 'release']),
|
|
212
247
|
exposes.enum('operation_mode', ea.ALL, ['control_relay', 'decoupled']),
|
|
248
|
+
exposes.binary('led_enable', ea.ALL, true, false).withDescription('Enable LED'),
|
|
249
|
+
exposes.binary('led_state', ea.ALL, 'ON', 'OFF').withDescription('LED State'),
|
|
213
250
|
],
|
|
214
251
|
},
|
|
215
252
|
{
|
|
@@ -217,8 +254,8 @@ module.exports = [
|
|
|
217
254
|
model: '552-721X2',
|
|
218
255
|
vendor: 'Niko',
|
|
219
256
|
description: 'Double connectable switch',
|
|
220
|
-
fromZigbee: [fz.on_off, local.fz.switch_operation_mode, local.fz.switch_action],
|
|
221
|
-
toZigbee: [tz.on_off, local.tz.switch_operation_mode],
|
|
257
|
+
fromZigbee: [fz.on_off, local.fz.switch_operation_mode, local.fz.switch_action, local.fz.switch_status_led],
|
|
258
|
+
toZigbee: [tz.on_off, local.tz.switch_operation_mode, local.tz.switch_led_enable, local.tz.switch_led_state],
|
|
222
259
|
endpoint: (device) => {
|
|
223
260
|
return {'l1': 1, 'l2': 2};
|
|
224
261
|
},
|
|
@@ -230,8 +267,8 @@ module.exports = [
|
|
|
230
267
|
await reporting.bind(ep2, coordinatorEndpoint, ['genOnOff']);
|
|
231
268
|
await reporting.onOff(ep1);
|
|
232
269
|
await reporting.onOff(ep2);
|
|
233
|
-
await ep1.read('manuSpecificNiko1', ['switchOperationMode']);
|
|
234
|
-
await ep2.read('manuSpecificNiko1', ['switchOperationMode']);
|
|
270
|
+
await ep1.read('manuSpecificNiko1', ['switchOperationMode', 'outletLedState', 'outletLedColor']);
|
|
271
|
+
await ep2.read('manuSpecificNiko1', ['switchOperationMode', 'outletLedState', 'outletLedColor']);
|
|
235
272
|
},
|
|
236
273
|
exposes: [
|
|
237
274
|
e.switch().withEndpoint('l1'), e.switch().withEndpoint('l2'),
|
|
@@ -239,6 +276,10 @@ module.exports = [
|
|
|
239
276
|
e.action(['single', 'hold', 'release']).withEndpoint('l2'),
|
|
240
277
|
exposes.enum('operation_mode', ea.ALL, ['control_relay', 'decoupled']).withEndpoint('l1'),
|
|
241
278
|
exposes.enum('operation_mode', ea.ALL, ['control_relay', 'decoupled']).withEndpoint('l2'),
|
|
279
|
+
exposes.binary('led_enable', ea.ALL, true, false).withEndpoint('l1').withDescription('Enable LED'),
|
|
280
|
+
exposes.binary('led_enable', ea.ALL, true, false).withEndpoint('l2').withDescription('Enable LED'),
|
|
281
|
+
exposes.binary('led_state', ea.ALL, 'ON', 'OFF').withEndpoint('l1').withDescription('LED State'),
|
|
282
|
+
exposes.binary('led_state', ea.ALL, 'ON', 'OFF').withEndpoint('l2').withDescription('LED State'),
|
|
242
283
|
],
|
|
243
284
|
},
|
|
244
285
|
{
|
package/devices/owon.js
CHANGED
|
@@ -149,8 +149,13 @@ module.exports = [
|
|
|
149
149
|
configure: async (device, coordinatorEndpoint, logger) => {
|
|
150
150
|
const endpoint2 = device.getEndpoint(2);
|
|
151
151
|
const endpoint3 = device.getEndpoint(3);
|
|
152
|
-
|
|
153
|
-
|
|
152
|
+
if (device.modelID == 'PIR313') {
|
|
153
|
+
await reporting.bind(endpoint2, coordinatorEndpoint, ['msIlluminanceMeasurement']);
|
|
154
|
+
await reporting.bind(endpoint3, coordinatorEndpoint, ['msTemperatureMeasurement', 'msRelativeHumidity']);
|
|
155
|
+
} else {
|
|
156
|
+
await reporting.bind(endpoint3, coordinatorEndpoint, ['msIlluminanceMeasurement']);
|
|
157
|
+
await reporting.bind(endpoint2, coordinatorEndpoint, ['msTemperatureMeasurement', 'msRelativeHumidity']);
|
|
158
|
+
}
|
|
154
159
|
device.powerSource = 'Battery';
|
|
155
160
|
device.save();
|
|
156
161
|
},
|
package/devices/philips.js
CHANGED
|
@@ -1458,6 +1458,13 @@ module.exports = [
|
|
|
1458
1458
|
description: 'Hue white ambiance E26 with Bluetooth',
|
|
1459
1459
|
extend: hueExtend.light_onoff_brightness_colortemp(),
|
|
1460
1460
|
},
|
|
1461
|
+
{
|
|
1462
|
+
zigbeeModel: ['LTO003'],
|
|
1463
|
+
model: '9290024782',
|
|
1464
|
+
vendor: 'Philips',
|
|
1465
|
+
description: 'Hue G125 B22 White Ambiance filament bulb',
|
|
1466
|
+
extend: hueExtend.light_onoff_brightness(),
|
|
1467
|
+
},
|
|
1461
1468
|
{
|
|
1462
1469
|
zigbeeModel: ['LTW010', 'LTW001', 'LTW004'],
|
|
1463
1470
|
model: '8718696548738',
|
|
@@ -3021,6 +3028,13 @@ module.exports = [
|
|
|
3021
3028
|
description: 'Hue White Ambiance E27 filament screw globe',
|
|
3022
3029
|
extend: hueExtend.light_onoff_brightness_colortemp({colorTempRange: [222, 454]}),
|
|
3023
3030
|
},
|
|
3031
|
+
{
|
|
3032
|
+
zigbeeModel: ['LTA006'],
|
|
3033
|
+
model: '8719514301443',
|
|
3034
|
+
vendor: 'Philips',
|
|
3035
|
+
description: 'Hue White Ambiance B22 filament screw globe',
|
|
3036
|
+
extend: hueExtend.light_onoff_brightness_colortemp({colorTempRange: [222, 454]}),
|
|
3037
|
+
},
|
|
3024
3038
|
{
|
|
3025
3039
|
zigbeeModel: ['LWE006'],
|
|
3026
3040
|
model: '929002294102',
|
|
@@ -3309,4 +3323,46 @@ module.exports = [
|
|
|
3309
3323
|
description: 'Hue white ambiance extra bright high lumen dimmable LED smart retrofit recessed 6" downlight',
|
|
3310
3324
|
extend: hueExtend.light_onoff_brightness_colortemp({colorTempRange: [153, 500]}),
|
|
3311
3325
|
},
|
|
3326
|
+
{
|
|
3327
|
+
zigbeeModel: ['929003115901'],
|
|
3328
|
+
model: '929003117101',
|
|
3329
|
+
vendor: 'Philips',
|
|
3330
|
+
description: 'Hue Perifo Ceiling Light, 3 pendant (black)',
|
|
3331
|
+
extend: hueExtend.light_onoff_brightness_colortemp_color({colorTempRange: [153, 500]}),
|
|
3332
|
+
},
|
|
3333
|
+
{
|
|
3334
|
+
zigbeeModel: ['929003117201'],
|
|
3335
|
+
model: '929003117201',
|
|
3336
|
+
vendor: 'Philips',
|
|
3337
|
+
description: 'Hue Perifo Ceiling Light, 3 pendant (white)',
|
|
3338
|
+
extend: hueExtend.light_onoff_brightness_colortemp_color({colorTempRange: [153, 500]}),
|
|
3339
|
+
},
|
|
3340
|
+
{
|
|
3341
|
+
zigbeeModel: ['929003117301'],
|
|
3342
|
+
model: '929003117301',
|
|
3343
|
+
vendor: 'Philips',
|
|
3344
|
+
description: 'Hue Perifo Ceiling Light, 4 spotlights (black)',
|
|
3345
|
+
extend: hueExtend.light_onoff_brightness_colortemp_color({colorTempRange: [153, 500]}),
|
|
3346
|
+
},
|
|
3347
|
+
{
|
|
3348
|
+
zigbeeModel: ['929003117401'],
|
|
3349
|
+
model: '929003117401',
|
|
3350
|
+
vendor: 'Philips',
|
|
3351
|
+
description: 'Hue Perifo Ceiling Light, 4 spotlights (white)',
|
|
3352
|
+
extend: hueExtend.light_onoff_brightness_colortemp_color({colorTempRange: [153, 500]}),
|
|
3353
|
+
},
|
|
3354
|
+
{
|
|
3355
|
+
zigbeeModel: ['929003117701'],
|
|
3356
|
+
model: '929003117701',
|
|
3357
|
+
vendor: 'Philips',
|
|
3358
|
+
description: 'Hue Perifo Wall Light, 3 spotlights (black)',
|
|
3359
|
+
extend: hueExtend.light_onoff_brightness_colortemp_color({colorTempRange: [153, 500]}),
|
|
3360
|
+
},
|
|
3361
|
+
{
|
|
3362
|
+
zigbeeModel: ['929003117801'],
|
|
3363
|
+
model: '929003117801',
|
|
3364
|
+
vendor: 'Philips',
|
|
3365
|
+
description: 'Hue Perifo Wall Light, 3 spotlights (white)',
|
|
3366
|
+
extend: hueExtend.light_onoff_brightness_colortemp_color({colorTempRange: [153, 500]}),
|
|
3367
|
+
},
|
|
3312
3368
|
];
|
|
@@ -766,14 +766,28 @@ module.exports = [
|
|
|
766
766
|
model: 'EER50000',
|
|
767
767
|
vendor: 'Schneider Electric',
|
|
768
768
|
description: 'Wiser H-Relay (HACT)',
|
|
769
|
-
fromZigbee: [fz.ignore_basic_report, fz.ignore_genOta, fz.ignore_zclversion_read, fz.wiser_smart_thermostat
|
|
770
|
-
|
|
771
|
-
|
|
769
|
+
fromZigbee: [fz.ignore_basic_report, fz.ignore_genOta, fz.ignore_zclversion_read, fz.wiser_smart_thermostat, fz.metering,
|
|
770
|
+
fz.identify],
|
|
771
|
+
toZigbee: [tz.thermostat_local_temperature, tz.thermostat_occupied_heating_setpoint, tz.wiser_fip_setting,
|
|
772
|
+
tz.wiser_hact_config, tz.wiser_zone_mode, tz.identify],
|
|
773
|
+
exposes: [exposes.climate().withSetpoint('occupied_heating_setpoint', 7, 30, 0.5).withLocalTemperature(),
|
|
774
|
+
e.power(), e.energy(),
|
|
775
|
+
exposes.enum('identify', ea.SET, ['0', '30', '60', '600', '900']).withDescription('Flash green tag for x seconds'),
|
|
776
|
+
exposes.enum('zone_mode',
|
|
777
|
+
ea.ALL, ['manual', 'schedule', 'energy_saver', 'holiday']),
|
|
778
|
+
exposes.enum('hact_config',
|
|
779
|
+
ea.ALL, ['unconfigured', 'setpoint_switch', 'setpoint_fip', 'fip_fip'])
|
|
780
|
+
.withDescription('Input (command) and output (control) behavior of actuator'),
|
|
781
|
+
exposes.enum('fip_setting',
|
|
782
|
+
ea.ALL, ['comfort', 'comfort_-1', 'comfort_-2', 'energy_saving', 'frost_protection', 'off'])
|
|
783
|
+
.withDescription('Output signal when operating in fil pilote mode (fip_fip)')],
|
|
772
784
|
configure: async (device, coordinatorEndpoint, logger) => {
|
|
773
785
|
const endpoint = device.getEndpoint(11);
|
|
774
|
-
const binds = ['genBasic', 'genPowerCfg', 'hvacThermostat', 'msTemperatureMeasurement'];
|
|
786
|
+
const binds = ['genBasic', 'genPowerCfg', 'hvacThermostat', 'msTemperatureMeasurement', 'seMetering'];
|
|
775
787
|
await reporting.bind(endpoint, coordinatorEndpoint, binds);
|
|
776
788
|
await reporting.thermostatOccupiedHeatingSetpoint(endpoint);
|
|
789
|
+
await reporting.readMeteringMultiplierDivisor(endpoint);
|
|
790
|
+
await reporting.instantaneousDemand(endpoint);
|
|
777
791
|
},
|
|
778
792
|
},
|
|
779
793
|
{
|
package/devices/sonoff.js
CHANGED
|
@@ -78,7 +78,7 @@ module.exports = [
|
|
|
78
78
|
model: 'ZBMINI',
|
|
79
79
|
vendor: 'SONOFF',
|
|
80
80
|
description: 'Zigbee two way smart switch',
|
|
81
|
-
extend: extend.switch(),
|
|
81
|
+
extend: extend.switch({disablePowerOnBehavior: true}),
|
|
82
82
|
configure: async (device, coordinatorEndpoint, logger) => {
|
|
83
83
|
// Has Unknown power source: https://github.com/Koenkk/zigbee2mqtt/issues/5362, force it here.
|
|
84
84
|
device.powerSource = 'Mains (single phase)';
|
package/devices/tuya.js
CHANGED
|
@@ -1084,7 +1084,6 @@ module.exports = [
|
|
|
1084
1084
|
{modelID: 'TS0202', manufacturerName: '_TYZB01_71kfvvma'},
|
|
1085
1085
|
{modelID: 'TS0202', manufacturerName: '_TZE200_bq5c8xfe'},
|
|
1086
1086
|
{modelID: 'TS0202', manufacturerName: '_TYZB01_dl7cejts'},
|
|
1087
|
-
{modelID: 'TS0202', manufacturerName: '_TYZB01_qjqgmqxr'},
|
|
1088
1087
|
{modelID: 'TS0202', manufacturerName: '_TZ3000_nss8amz9'},
|
|
1089
1088
|
{modelID: 'TS0202', manufacturerName: '_TZ3000_mmtwjmaq'},
|
|
1090
1089
|
{modelID: 'TS0202', manufacturerName: '_TYZB01_zwvaj5wy'},
|
package/lib/exposes.js
CHANGED
|
@@ -521,6 +521,7 @@ module.exports = {
|
|
|
521
521
|
legacy: () => new Binary(`legacy`, access.SET, true, false).withDescription(`Set to false to disable the legacy integration (highly recommended), will change structure of the published payload (default true).`),
|
|
522
522
|
measurement_poll_interval: (extraNote='') => new Numeric(`measurement_poll_interval`, access.SET).withValueMin(-1).withDescription(`This device does not support reporting electric measurements so it is polled instead. The default poll interval is 60 seconds, set to -1 to disable.${extraNote}`),
|
|
523
523
|
illuminance_below_threshold_check: () => new Binary(`illuminance_below_threshold_check`, access.SET, true, false).withDescription(`Set to false to also send messages when illuminance is above threshold in night mode (default true).`),
|
|
524
|
+
state_action: () => new Binary(`state_action`, access.SET, true, false).withDescription(`State actions will also be published as 'action' when true (default false).`),
|
|
524
525
|
},
|
|
525
526
|
presets: {
|
|
526
527
|
ac_frequency: () => new Numeric('ac_frequency', access.STATE).withUnit('Hz').withDescription('Measured electrical AC frequency'),
|