zigbee-herdsman-converters 14.0.345 → 14.0.349
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 +17 -2
- package/converters/toZigbee.js +10 -0
- package/devices/custom_devices_diy.js +21 -0
- package/devices/danfoss.js +10 -4
- package/devices/ksentry.js +1 -2
- package/devices/ledvance.js +8 -0
- package/devices/osram.js +56 -2
- package/devices/robb.js +22 -0
- package/devices/schneider_electric.js +36 -0
- package/devices/schwaiger.js +7 -0
- package/devices/siglis.js +42 -0
- package/devices/sinope.js +2 -2
- package/devices/tuya.js +15 -32
- package/index.js +1 -3
- package/npm-shrinkwrap.json +1 -1
- package/package.json +1 -1
package/converters/fromZigbee.js
CHANGED
|
@@ -652,6 +652,18 @@ const converters = {
|
|
|
652
652
|
return payload;
|
|
653
653
|
},
|
|
654
654
|
},
|
|
655
|
+
EKO09738_metering: {
|
|
656
|
+
/**
|
|
657
|
+
* Elko EKO09738 and EKO09716 reports power in mW, scale to W
|
|
658
|
+
*/
|
|
659
|
+
cluster: 'seMetering',
|
|
660
|
+
type: ['attributeReport', 'readResponse'],
|
|
661
|
+
convert: (model, msg, publish, options, meta) => {
|
|
662
|
+
const result = converters.metering.convert(model, msg, publish, options, meta);
|
|
663
|
+
result.power /= 1000;
|
|
664
|
+
return result;
|
|
665
|
+
},
|
|
666
|
+
},
|
|
655
667
|
develco_metering: {
|
|
656
668
|
cluster: 'seMetering',
|
|
657
669
|
type: ['attributeReport', 'readResponse'],
|
|
@@ -3104,6 +3116,9 @@ const converters = {
|
|
|
3104
3116
|
result[postfixWithEndpointName('external_measured_room_sensor', msg, model)] =
|
|
3105
3117
|
msg.data['danfossExternalMeasuredRoomSensor'];
|
|
3106
3118
|
}
|
|
3119
|
+
if (msg.data.hasOwnProperty('danfossRadiatorCovered')) {
|
|
3120
|
+
result[postfixWithEndpointName('radiator_covered', msg, model)] = (msg.data['danfossRadiatorCovered'] === 1);
|
|
3121
|
+
}
|
|
3107
3122
|
if (msg.data.hasOwnProperty('danfossViewingDirection')) {
|
|
3108
3123
|
result[postfixWithEndpointName('viewing_direction', msg, model)] = (msg.data['danfossViewingDirection'] === 1);
|
|
3109
3124
|
}
|
|
@@ -7297,9 +7312,9 @@ const converters = {
|
|
|
7297
7312
|
const value = tuya.getDataValue(msg.data.datatype, msg.data.data);
|
|
7298
7313
|
switch (dp) {
|
|
7299
7314
|
case tuya.dataPoints.trsPresenceState:
|
|
7300
|
-
return {presence: {0:
|
|
7315
|
+
return {presence: {0: false, 1: true}[value]};
|
|
7301
7316
|
case tuya.dataPoints.trsMotionState:
|
|
7302
|
-
return {motion: {1:
|
|
7317
|
+
return {motion: {1: false, 2: true}[value]};
|
|
7303
7318
|
case tuya.dataPoints.trsMotionSpeed:
|
|
7304
7319
|
return {motion_speed: value};
|
|
7305
7320
|
case tuya.dataPoints.trsMotionDirection:
|
package/converters/toZigbee.js
CHANGED
|
@@ -2467,6 +2467,16 @@ const converters = {
|
|
|
2467
2467
|
await entity.read('hvacThermostat', ['danfossExternalMeasuredRoomSensor'], manufacturerOptions.danfoss);
|
|
2468
2468
|
},
|
|
2469
2469
|
},
|
|
2470
|
+
danfoss_radiator_covered: {
|
|
2471
|
+
key: ['radiator_covered'],
|
|
2472
|
+
convertSet: async (entity, key, value, meta) => {
|
|
2473
|
+
await entity.write('hvacThermostat', {'danfossRadiatorCovered': value}, manufacturerOptions.danfoss);
|
|
2474
|
+
return {readAfterWriteTime: 200, state: {'radiator_covered': value}};
|
|
2475
|
+
},
|
|
2476
|
+
convertGet: async (entity, key, meta) => {
|
|
2477
|
+
await entity.read('hvacThermostat', ['danfossRadiatorCovered'], manufacturerOptions.danfoss);
|
|
2478
|
+
},
|
|
2479
|
+
},
|
|
2470
2480
|
danfoss_viewing_direction: {
|
|
2471
2481
|
key: ['viewing_direction'],
|
|
2472
2482
|
convertSet: async (entity, key, value, meta) => {
|
|
@@ -311,4 +311,25 @@ module.exports = [
|
|
|
311
311
|
},
|
|
312
312
|
exposes: [e.battery(), e.temperature(), e.humidity(), e.pressure()],
|
|
313
313
|
},
|
|
314
|
+
{
|
|
315
|
+
zigbeeModel: ['EFEKTA_PWS_Max'],
|
|
316
|
+
model: 'EFEKTA_PWS_Max',
|
|
317
|
+
vendor: 'Custom devices (DiY)',
|
|
318
|
+
description: '[Plant watering sensor EFEKTA PWS max](http://efektalab.com/PWS_Max)',
|
|
319
|
+
fromZigbee: [fz.temperature, fz.humidity, fz.illuminance, fz.soil_moisture, fz.battery],
|
|
320
|
+
toZigbee: [tz.factory_reset],
|
|
321
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
322
|
+
const firstEndpoint = device.getEndpoint(1);
|
|
323
|
+
await reporting.bind(firstEndpoint, coordinatorEndpoint, [
|
|
324
|
+
'genPowerCfg', 'msTemperatureMeasurement', 'msRelativeHumidity', 'msIlluminanceMeasurement', 'msSoilMoisture']);
|
|
325
|
+
const overides = {min: 0, max: 21600, change: 0};
|
|
326
|
+
await reporting.batteryVoltage(firstEndpoint, overides);
|
|
327
|
+
await reporting.batteryPercentageRemaining(firstEndpoint, overides);
|
|
328
|
+
await reporting.temperature(firstEndpoint, overides);
|
|
329
|
+
await reporting.humidity(firstEndpoint, overides);
|
|
330
|
+
await reporting.illuminance(firstEndpoint, overides);
|
|
331
|
+
await reporting.soil_moisture(firstEndpoint, overides);
|
|
332
|
+
},
|
|
333
|
+
exposes: [e.soil_moisture(), e.battery(), e.illuminance(), e.temperature(), e.humidity()],
|
|
334
|
+
},
|
|
314
335
|
];
|
package/devices/danfoss.js
CHANGED
|
@@ -20,8 +20,8 @@ module.exports = [
|
|
|
20
20
|
tz.danfoss_mounted_mode_control, tz.danfoss_thermostat_vertical_orientation, tz.danfoss_algorithm_scale_factor,
|
|
21
21
|
tz.danfoss_heat_available, tz.danfoss_heat_required, tz.danfoss_day_of_week, tz.danfoss_trigger_time,
|
|
22
22
|
tz.danfoss_window_open_internal, tz.danfoss_window_open_external, tz.danfoss_load_estimate,
|
|
23
|
-
tz.danfoss_viewing_direction, tz.danfoss_external_measured_room_sensor, tz.
|
|
24
|
-
tz.thermostat_system_mode, tz.danfoss_load_balancing_enable, tz.danfoss_load_room_mean],
|
|
23
|
+
tz.danfoss_viewing_direction, tz.danfoss_external_measured_room_sensor, tz.danfoss_radiator_covered,
|
|
24
|
+
tz.thermostat_keypad_lockout, tz.thermostat_system_mode, tz.danfoss_load_balancing_enable, tz.danfoss_load_room_mean],
|
|
25
25
|
exposes: [e.battery(), e.keypad_lockout(),
|
|
26
26
|
exposes.binary('mounted_mode_active', ea.STATE_GET, true, false)
|
|
27
27
|
.withDescription('Is the unit in mounting mode. This is set to `false` for mounted (already on ' +
|
|
@@ -44,9 +44,14 @@ module.exports = [
|
|
|
44
44
|
exposes.climate().withSetpoint('occupied_heating_setpoint', 5, 32, 0.5).withLocalTemperature().withPiHeatingDemand()
|
|
45
45
|
.withSystemMode(['heat']).withRunningState(['idle', 'heat'], ea.STATE),
|
|
46
46
|
exposes.numeric('external_measured_room_sensor', ea.ALL)
|
|
47
|
-
.withDescription('Set at maximum
|
|
48
|
-
|
|
47
|
+
.withDescription('If `radiator_covered` is `true`: Set at maximum 30 minutes interval but not more often than every ' +
|
|
48
|
+
'5 minutes and 0.1 degrees difference. Resets every 35 minutes to standard. If `radiator_covered` is `false`: ' +
|
|
49
|
+
'Set at maximum 3 hours interval but not more often than every 30 minutes and 0.1 degrees difference. ' +
|
|
50
|
+
'Resets every 3 hours to standard. Value 21C = 2100 (-8000=undefined).')
|
|
49
51
|
.withValueMin(-8000).withValueMax(3500),
|
|
52
|
+
exposes.binary('radiator_covered', ea.ALL, true, false)
|
|
53
|
+
.withDescription('Set if the TRV should solely rely on external_measured_room_sensor or operate in offset mode. ' +
|
|
54
|
+
'`false` = Auto Offset Mode or `true` = Room Sensor Mode'),
|
|
50
55
|
exposes.numeric('window_open_internal', ea.STATE_GET).withValueMin(0).withValueMax(4)
|
|
51
56
|
.withDescription('0=Quarantine, 1=Windows are closed, 2=Hold - Windows are maybe about to open, ' +
|
|
52
57
|
'3=Open window detected, 4=In window open state from external but detected closed locally'),
|
|
@@ -116,6 +121,7 @@ module.exports = [
|
|
|
116
121
|
'danfossMountedModeControl',
|
|
117
122
|
'danfossMountedModeActive',
|
|
118
123
|
'danfossExternalMeasuredRoomSensor',
|
|
124
|
+
'danfossRadiatorCovered',
|
|
119
125
|
'danfossLoadBalancingEnable',
|
|
120
126
|
'danfossLoadRoomMean',
|
|
121
127
|
], options);
|
package/devices/ksentry.js
CHANGED
|
@@ -6,8 +6,7 @@ module.exports = [
|
|
|
6
6
|
zigbeeModel: ['Lamp_01'],
|
|
7
7
|
model: 'KS-SM001',
|
|
8
8
|
vendor: 'Ksentry Electronics',
|
|
9
|
-
description: '
|
|
10
|
-
'/pdtl/ZigBee-module/1162731630/zigbee-on-off-controller-modules.htm)',
|
|
9
|
+
description: 'Zigbee on/off controller',
|
|
11
10
|
extend: extend.switch(),
|
|
12
11
|
configure: async (device, coordinatorEndpoint, logger) => {
|
|
13
12
|
const endpoint = device.getEndpoint(11);
|
package/devices/ledvance.js
CHANGED
|
@@ -98,4 +98,12 @@ module.exports = [
|
|
|
98
98
|
extend: extend.ledvance.light_onoff_brightness_colortemp_color({colorTempRange: [153, 526]}),
|
|
99
99
|
ota: ota.ledvance,
|
|
100
100
|
},
|
|
101
|
+
{
|
|
102
|
+
zigbeeModel: ['Tibea TW Z3'],
|
|
103
|
+
model: '4058075168572',
|
|
104
|
+
vendor: 'LEDVANCE',
|
|
105
|
+
description: 'SMART+ lamp E27 turntable white',
|
|
106
|
+
extend: extend.ledvance.light_onoff_brightness_colortemp({colorTempRange: [153, 370]}),
|
|
107
|
+
ota: ota.ledvance,
|
|
108
|
+
},
|
|
101
109
|
];
|
package/devices/osram.js
CHANGED
|
@@ -391,14 +391,68 @@ module.exports = [
|
|
|
391
391
|
},
|
|
392
392
|
{
|
|
393
393
|
zigbeeModel: ['Zigbee 3.0 DALI CONV LI'],
|
|
394
|
-
model: '
|
|
394
|
+
model: '4062172044776_1',
|
|
395
395
|
vendor: 'OSRAM',
|
|
396
|
-
description: 'Zigbee 3.0 DALI CONV LI dimmer for DALI-based luminaires',
|
|
396
|
+
description: 'Zigbee 3.0 DALI CONV LI dimmer for DALI-based luminaires (only one device)',
|
|
397
397
|
extend: extend.ledvance.light_onoff_brightness(),
|
|
398
|
+
},
|
|
399
|
+
{
|
|
400
|
+
fingerprint: [{modelID: 'Zigbee 3.0 DALI CONV LI', endpoints: [{ID: 10}, {ID: 25}, {ID: 242}]}],
|
|
401
|
+
model: '4062172044776_2',
|
|
402
|
+
vendor: 'OSRAM',
|
|
403
|
+
description: 'Zigbee 3.0 DALI CONV LI dimmer for DALI-based luminaires (one device and pushbutton)',
|
|
404
|
+
extend: extend.ledvance.light_onoff_brightness(),
|
|
405
|
+
onEvent: async (type, data, device) => {
|
|
406
|
+
if (type === 'deviceInterview') {
|
|
407
|
+
device.getEndpoint(25).addBinding('genOnOff', device.getEndpoint(10));
|
|
408
|
+
device.getEndpoint(25).addBinding('genLevelCtrl', device.getEndpoint(10));
|
|
409
|
+
}
|
|
410
|
+
},
|
|
411
|
+
},
|
|
412
|
+
{
|
|
413
|
+
fingerprint: [{modelID: 'Zigbee 3.0 DALI CONV LI', endpoints: [{ID: 10}, {ID: 11}, {ID: 242}]}],
|
|
414
|
+
model: '4062172044776_3',
|
|
415
|
+
vendor: 'OSRAM',
|
|
416
|
+
description: 'Zigbee 3.0 DALI CONV LI dimmer for DALI-based luminaires (with two devices)',
|
|
417
|
+
extend: extend.ledvance.light_onoff_brightness({noConfigure: true}),
|
|
398
418
|
exposes: [e.light_brightness().withEndpoint('l1'), e.light_brightness().withEndpoint('l2')],
|
|
399
419
|
endpoint: (device) => {
|
|
400
420
|
return {'l1': 10, 'l2': 11};
|
|
401
421
|
},
|
|
402
422
|
meta: {multiEndpoint: true},
|
|
423
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
424
|
+
await reporting.bind(device.getEndpoint(10), coordinatorEndpoint, ['genLevelCtrl', 'genOnOff']);
|
|
425
|
+
await reporting.bind(device.getEndpoint(11), coordinatorEndpoint, ['genLevelCtrl', 'genOnOff']);
|
|
426
|
+
await reporting.onOff(device.getEndpoint(10));
|
|
427
|
+
await reporting.brightness(device.getEndpoint(10));
|
|
428
|
+
await reporting.onOff(device.getEndpoint(11));
|
|
429
|
+
await reporting.brightness(device.getEndpoint(11));
|
|
430
|
+
},
|
|
431
|
+
},
|
|
432
|
+
{
|
|
433
|
+
fingerprint: [{modelID: 'Zigbee 3.0 DALI CONV LI', endpoints: [{ID: 10}, {ID: 11}, {ID: 25}, {ID: 242}]}],
|
|
434
|
+
model: '4062172044776_4',
|
|
435
|
+
vendor: 'OSRAM',
|
|
436
|
+
description: 'Zigbee 3.0 DALI CONV LI dimmer for DALI-based luminaires (with two devices and pushbutton)',
|
|
437
|
+
extend: extend.ledvance.light_onoff_brightness({noConfigure: true}),
|
|
438
|
+
exposes: [e.light_brightness().withEndpoint('l1'), e.light_brightness().withEndpoint('l2')],
|
|
439
|
+
endpoint: (device) => {
|
|
440
|
+
return {'l1': 10, 'l2': 11};
|
|
441
|
+
},
|
|
442
|
+
meta: {multiEndpoint: true},
|
|
443
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
444
|
+
await reporting.bind(device.getEndpoint(10), coordinatorEndpoint, ['genLevelCtrl', 'genOnOff']);
|
|
445
|
+
await reporting.bind(device.getEndpoint(11), coordinatorEndpoint, ['genLevelCtrl', 'genOnOff']);
|
|
446
|
+
await reporting.onOff(device.getEndpoint(10));
|
|
447
|
+
await reporting.brightness(device.getEndpoint(10));
|
|
448
|
+
await reporting.onOff(device.getEndpoint(11));
|
|
449
|
+
await reporting.brightness(device.getEndpoint(11));
|
|
450
|
+
},
|
|
451
|
+
onEvent: async (type, data, device) => {
|
|
452
|
+
if (type === 'deviceInterview') {
|
|
453
|
+
device.getEndpoint(25).addBinding('genOnOff', device.getEndpoint(10));
|
|
454
|
+
device.getEndpoint(25).addBinding('genLevelCtrl', device.getEndpoint(10));
|
|
455
|
+
}
|
|
456
|
+
},
|
|
403
457
|
},
|
|
404
458
|
];
|
package/devices/robb.js
CHANGED
|
@@ -162,4 +162,26 @@ module.exports = [
|
|
|
162
162
|
},
|
|
163
163
|
exposes: [e.power(), e.current(), e.voltage().withAccess(ea.STATE), e.switch(), e.energy()],
|
|
164
164
|
},
|
|
165
|
+
{
|
|
166
|
+
zigbeeModel: ['ROB_200-017-1'],
|
|
167
|
+
model: 'ROB_200-017-1',
|
|
168
|
+
vendor: 'ROBB',
|
|
169
|
+
description: 'Zigbee smart plug',
|
|
170
|
+
fromZigbee: [fz.electrical_measurement, fz.on_off, fz.ignore_genLevelCtrl_report, fz.metering, fz.temperature],
|
|
171
|
+
toZigbee: [tz.on_off],
|
|
172
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
173
|
+
const endpoint = device.getEndpoint(1);
|
|
174
|
+
await reporting.bind(endpoint, coordinatorEndpoint,
|
|
175
|
+
['genOnOff', 'haElectricalMeasurement', 'seMetering', 'msTemperatureMeasurement']);
|
|
176
|
+
await reporting.onOff(endpoint);
|
|
177
|
+
await reporting.readEletricalMeasurementMultiplierDivisors(endpoint);
|
|
178
|
+
await reporting.readMeteringMultiplierDivisor(endpoint);
|
|
179
|
+
await reporting.rmsVoltage(endpoint);
|
|
180
|
+
await reporting.rmsCurrent(endpoint);
|
|
181
|
+
await reporting.activePower(endpoint);
|
|
182
|
+
await reporting.temperature(endpoint);
|
|
183
|
+
await reporting.currentSummDelivered(endpoint);
|
|
184
|
+
},
|
|
185
|
+
exposes: [e.power(), e.current(), e.voltage().withAccess(ea.STATE), e.switch(), e.energy(), e.temperature()],
|
|
186
|
+
},
|
|
165
187
|
];
|
|
@@ -533,4 +533,40 @@ module.exports = [
|
|
|
533
533
|
await reporting.batteryPercentageRemaining(endpoint);
|
|
534
534
|
},
|
|
535
535
|
},
|
|
536
|
+
{
|
|
537
|
+
zigbeeModel: ['SOCKET/OUTLET/2'],
|
|
538
|
+
model: 'EKO09738',
|
|
539
|
+
vendor: 'Schneider Electric',
|
|
540
|
+
description: 'Zigbee smart socket with power meter',
|
|
541
|
+
fromZigbee: [fz.on_off, fz.electrical_measurement, fz.EKO09738_metering, fz.power_on_behavior],
|
|
542
|
+
toZigbee: [tz.on_off, tz.power_on_behavior],
|
|
543
|
+
exposes: [e.switch(), e.power(), e.energy(), exposes.enum('power_on_behavior', ea.ALL, ['off', 'previous', 'on'])
|
|
544
|
+
.withDescription('Controls the behaviour when the device is powered on'), e.current(), e.voltage()],
|
|
545
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
546
|
+
const endpoint = device.getEndpoint(6);
|
|
547
|
+
await reporting.bind(endpoint, coordinatorEndpoint, ['genOnOff', 'haElectricalMeasurement', 'seMetering']);
|
|
548
|
+
await reporting.onOff(endpoint);
|
|
549
|
+
// Unit supports acVoltage and acCurrent, but only acCurrent divisor/multiplier can be read
|
|
550
|
+
await endpoint.read('haElectricalMeasurement', ['acCurrentDivisor', 'acCurrentMultiplier']);
|
|
551
|
+
await reporting.readMeteringMultiplierDivisor(endpoint);
|
|
552
|
+
},
|
|
553
|
+
},
|
|
554
|
+
{
|
|
555
|
+
zigbeeModel: ['SOCKET/OUTLET/1'],
|
|
556
|
+
model: 'EKO09716',
|
|
557
|
+
vendor: 'Schneider Electric',
|
|
558
|
+
description: 'Zigbee smart socket with power meter',
|
|
559
|
+
fromZigbee: [fz.on_off, fz.electrical_measurement, fz.EKO09738_metering, fz.power_on_behavior],
|
|
560
|
+
toZigbee: [tz.on_off, tz.power_on_behavior],
|
|
561
|
+
exposes: [e.switch(), e.power(), e.energy(), exposes.enum('power_on_behavior', ea.ALL, ['off', 'previous', 'on'])
|
|
562
|
+
.withDescription('Controls the behaviour when the device is powered on'), e.current(), e.voltage()],
|
|
563
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
564
|
+
const endpoint = device.getEndpoint(6);
|
|
565
|
+
await reporting.bind(endpoint, coordinatorEndpoint, ['genOnOff', 'haElectricalMeasurement', 'seMetering']);
|
|
566
|
+
await reporting.onOff(endpoint);
|
|
567
|
+
// Unit supports acVoltage and acCurrent, but only acCurrent divisor/multiplier can be read
|
|
568
|
+
await endpoint.read('haElectricalMeasurement', ['acCurrentDivisor', 'acCurrentMultiplier']);
|
|
569
|
+
await reporting.readMeteringMultiplierDivisor(endpoint);
|
|
570
|
+
},
|
|
571
|
+
},
|
|
536
572
|
];
|
package/devices/schwaiger.js
CHANGED
|
@@ -38,4 +38,11 @@ module.exports = [
|
|
|
38
38
|
description: 'LED candle bulb E14 470 lumen, dimmable, color, white 2700K',
|
|
39
39
|
extend: extend.light_onoff_brightness(),
|
|
40
40
|
},
|
|
41
|
+
{
|
|
42
|
+
fingerprint: [{modelID: 'ZBT-CCTLight-GU100904', manufacturerName: 'LDS'}],
|
|
43
|
+
model: 'HAL500',
|
|
44
|
+
vendor: 'Schwaiger',
|
|
45
|
+
description: 'LED bulb GU10 350 lumen, dimmable, color, white 2700-6500K',
|
|
46
|
+
extend: extend.light_onoff_brightness_colortemp({colorTempRange: [153, 370]}),
|
|
47
|
+
},
|
|
41
48
|
];
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
const fz = require('zigbee-herdsman-converters/converters/fromZigbee');
|
|
2
|
+
const tz = require('zigbee-herdsman-converters/converters/toZigbee');
|
|
3
|
+
const exposes = require('zigbee-herdsman-converters/lib/exposes');
|
|
4
|
+
const reporting = require('zigbee-herdsman-converters/lib/reporting');
|
|
5
|
+
const e = exposes.presets;
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
module.exports = [
|
|
9
|
+
{
|
|
10
|
+
zigbeeModel: ['zigfred uno'],
|
|
11
|
+
model: 'ZFU-1D-CH',
|
|
12
|
+
vendor: 'Siglis',
|
|
13
|
+
description: 'zigfred uno smart in-wall switch',
|
|
14
|
+
exposes: [e.light_brightness_colorxy().withEndpoint('l1'), e.switch().withEndpoint('l2'), e.light_brightness().withEndpoint('l3')],
|
|
15
|
+
fromZigbee: [fz.color_colortemp, fz.on_off, fz.brightness, fz.level_config, fz.power_on_behavior, fz.ignore_basic_report],
|
|
16
|
+
toZigbee: [tz.light_onoff_brightness, tz.light_color, tz.ignore_transition, tz.ignore_rate, tz.light_brightness_move,
|
|
17
|
+
tz.light_brightness_step, tz.level_config, tz.power_on_behavior, tz.light_hue_saturation_move,
|
|
18
|
+
tz.light_hue_saturation_step, tz.light_color_options, tz.light_color_mode],
|
|
19
|
+
meta: {multiEndpoint: true},
|
|
20
|
+
endpoint: (device) => {
|
|
21
|
+
return {'l1': 5, 'l2': 6, 'l3': 7};
|
|
22
|
+
},
|
|
23
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
24
|
+
const controlEp = device.getEndpoint(5);
|
|
25
|
+
const relayEp = device.getEndpoint(6);
|
|
26
|
+
const dimmerEp = device.getEndpoint(7);
|
|
27
|
+
// Bind Control EP (LED)
|
|
28
|
+
await reporting.bind(controlEp, coordinatorEndpoint, ['genOnOff']);
|
|
29
|
+
await reporting.bind(controlEp, coordinatorEndpoint, ['genLevelCtrl']);
|
|
30
|
+
await reporting.onOff(controlEp);
|
|
31
|
+
await reporting.brightness(controlEp);
|
|
32
|
+
// Bind Relay EP
|
|
33
|
+
await reporting.bind(relayEp, coordinatorEndpoint, ['genOnOff']);
|
|
34
|
+
await reporting.onOff(relayEp);
|
|
35
|
+
// Bind Dimmer EP
|
|
36
|
+
await reporting.bind(dimmerEp, coordinatorEndpoint, ['genOnOff']);
|
|
37
|
+
await reporting.bind(dimmerEp, coordinatorEndpoint, ['genLevelCtrl']);
|
|
38
|
+
await reporting.onOff(dimmerEp);
|
|
39
|
+
await reporting.brightness(dimmerEp);
|
|
40
|
+
},
|
|
41
|
+
},
|
|
42
|
+
];
|
package/devices/sinope.js
CHANGED
|
@@ -56,7 +56,7 @@ module.exports = [
|
|
|
56
56
|
model: 'TH1124ZB',
|
|
57
57
|
vendor: 'Sinopé',
|
|
58
58
|
description: 'Zigbee line volt thermostat',
|
|
59
|
-
fromZigbee: [fz.legacy.
|
|
59
|
+
fromZigbee: [fz.legacy.sinope_thermostat_att_report, fz.legacy.hvac_user_interface, fz.electrical_measurement, fz.metering,
|
|
60
60
|
fz.ignore_temperature_report, fz.legacy.sinope_thermostat_state],
|
|
61
61
|
toZigbee: [tz.thermostat_local_temperature, tz.thermostat_occupied_heating_setpoint, tz.thermostat_unoccupied_heating_setpoint,
|
|
62
62
|
tz.thermostat_temperature_display_mode, tz.thermostat_keypad_lockout, tz.thermostat_system_mode, tz.thermostat_running_state,
|
|
@@ -113,7 +113,7 @@ module.exports = [
|
|
|
113
113
|
model: 'TH1300ZB',
|
|
114
114
|
vendor: 'Sinopé',
|
|
115
115
|
description: 'Zigbee smart floor heating thermostat',
|
|
116
|
-
fromZigbee: [fz.legacy.
|
|
116
|
+
fromZigbee: [fz.legacy.sinope_thermostat_att_report, fz.legacy.hvac_user_interface, fz.ignore_temperature_report,
|
|
117
117
|
fz.legacy.sinope_thermostat_state, fz.sinope_TH1300ZB_specific],
|
|
118
118
|
toZigbee: [tz.thermostat_local_temperature, tz.thermostat_occupied_heating_setpoint, tz.thermostat_unoccupied_heating_setpoint,
|
|
119
119
|
tz.thermostat_temperature_display_mode, tz.thermostat_keypad_lockout, tz.thermostat_system_mode, tz.thermostat_running_state,
|
package/devices/tuya.js
CHANGED
|
@@ -9,6 +9,10 @@ const extend = require('../lib/extend');
|
|
|
9
9
|
const e = exposes.presets;
|
|
10
10
|
const ea = exposes.access;
|
|
11
11
|
|
|
12
|
+
|
|
13
|
+
const TS011Fplugs = ['_TZ3000_5f43h46b', '_TZ3000_cphmq0q7', '_TZ3000_dpo1ysak', '_TZ3000_ew3ldmgx',
|
|
14
|
+
'_TZ3000_jvzvulen', '_TZ3000_mraovvmm', '_TZ3000_nfnmi125', '_TZ3000_ps3dmato', '_TZ3000_w0qqde0g', '_TZ3000_u5u4cakc'];
|
|
15
|
+
|
|
12
16
|
module.exports = [
|
|
13
17
|
{
|
|
14
18
|
zigbeeModel: ['TS0203'],
|
|
@@ -490,6 +494,7 @@ module.exports = [
|
|
|
490
494
|
model: 'TS0201',
|
|
491
495
|
vendor: 'TuYa',
|
|
492
496
|
description: 'Temperature & humidity sensor with display',
|
|
497
|
+
whiteLabel: [{vendor: 'BlitzWolf', model: 'BW-IS4'}],
|
|
493
498
|
fromZigbee: [fz.battery, fz.temperature, fz.humidity],
|
|
494
499
|
toZigbee: [],
|
|
495
500
|
exposes: [e.battery(), e.temperature(), e.humidity(), e.battery_voltage()],
|
|
@@ -1015,17 +1020,9 @@ module.exports = [
|
|
|
1015
1020
|
extend: extend.switch(),
|
|
1016
1021
|
},
|
|
1017
1022
|
{
|
|
1018
|
-
fingerprint:
|
|
1019
|
-
{modelID: 'TS011F', manufacturerName
|
|
1020
|
-
|
|
1021
|
-
{modelID: 'TS011F', manufacturerName: '_TZ3000_dpo1ysak'},
|
|
1022
|
-
{modelID: 'TS011F', manufacturerName: '_TZ3000_ew3ldmgx'},
|
|
1023
|
-
{modelID: 'TS011F', manufacturerName: '_TZ3000_jvzvulen'},
|
|
1024
|
-
{modelID: 'TS011F', manufacturerName: '_TZ3000_mraovvmm'},
|
|
1025
|
-
{modelID: 'TS011F', manufacturerName: '_TZ3000_nfnmi125'},
|
|
1026
|
-
{modelID: 'TS011F', manufacturerName: '_TZ3000_ps3dmato'},
|
|
1027
|
-
{modelID: 'TS011F', manufacturerName: '_TZ3000_w0qqde0g'},
|
|
1028
|
-
],
|
|
1023
|
+
fingerprint: TS011Fplugs.map((manufacturerName) => {
|
|
1024
|
+
return {modelID: 'TS011F', manufacturerName};
|
|
1025
|
+
}),
|
|
1029
1026
|
model: 'TS011F_plug_1',
|
|
1030
1027
|
description: 'Smart plug (with power monitoring)',
|
|
1031
1028
|
vendor: 'TuYa',
|
|
@@ -1065,29 +1062,15 @@ module.exports = [
|
|
|
1065
1062
|
.withDescription('Recover state after power outage')],
|
|
1066
1063
|
},
|
|
1067
1064
|
{
|
|
1068
|
-
fingerprint: [
|
|
1069
|
-
|
|
1070
|
-
|
|
1071
|
-
|
|
1072
|
-
|
|
1073
|
-
{modelID: 'TS011F', manufacturerName: '_TZ3000_ew3ldmgx', applicationVersion: 68},
|
|
1074
|
-
{modelID: 'TS011F', manufacturerName: '_TZ3000_ew3ldmgx', applicationVersion: 69},
|
|
1075
|
-
{modelID: 'TS011F', manufacturerName: '_TZ3000_jvzvulen', applicationVersion: 68},
|
|
1076
|
-
{modelID: 'TS011F', manufacturerName: '_TZ3000_jvzvulen', applicationVersion: 69},
|
|
1077
|
-
{modelID: 'TS011F', manufacturerName: '_TZ3000_mraovvmm', applicationVersion: 68},
|
|
1078
|
-
{modelID: 'TS011F', manufacturerName: '_TZ3000_mraovvmm', applicationVersion: 69},
|
|
1079
|
-
{modelID: 'TS011F', manufacturerName: '_TZ3000_nfnmi125', applicationVersion: 68},
|
|
1080
|
-
{modelID: 'TS011F', manufacturerName: '_TZ3000_nfnmi125', applicationVersion: 69},
|
|
1081
|
-
{modelID: 'TS011F', manufacturerName: '_TZ3000_ps3dmato', applicationVersion: 68},
|
|
1082
|
-
{modelID: 'TS011F', manufacturerName: '_TZ3000_ps3dmato', applicationVersion: 69},
|
|
1083
|
-
{modelID: 'TS011F', manufacturerName: '_TZ3000_w0qqde0g', applicationVersion: 64},
|
|
1084
|
-
{modelID: 'TS011F', manufacturerName: '_TZ3000_w0qqde0g', applicationVersion: 68},
|
|
1085
|
-
{modelID: 'TS011F', manufacturerName: '_TZ3000_w0qqde0g', applicationVersion: 69},
|
|
1086
|
-
],
|
|
1065
|
+
fingerprint: [].concat(...TS011Fplugs.map((manufacturerName) => {
|
|
1066
|
+
return [69, 68, 65, 64].map((applicationVersion) => {
|
|
1067
|
+
return {modelID: 'TS011F', manufacturerName, applicationVersion};
|
|
1068
|
+
});
|
|
1069
|
+
})),
|
|
1087
1070
|
model: 'TS011F_plug_3',
|
|
1088
1071
|
description: 'Smart plug (with power monitoring by polling)',
|
|
1089
1072
|
vendor: 'TuYa',
|
|
1090
|
-
whiteLabel: [{vendor: 'VIKEFON', model: 'TS011F'}],
|
|
1073
|
+
whiteLabel: [{vendor: 'VIKEFON', model: 'TS011F'}, {vendor: 'BlitzWolf', model: 'BW-SHP15'}],
|
|
1091
1074
|
fromZigbee: [fz.on_off, fz.electrical_measurement, fz.metering, fz.ignore_basic_report, fz.tuya_switch_power_outage_memory],
|
|
1092
1075
|
toZigbee: [tz.on_off, tz.tuya_switch_power_outage_memory],
|
|
1093
1076
|
configure: async (device, coordinatorEndpoint, logger) => {
|
|
@@ -1666,7 +1649,7 @@ module.exports = [
|
|
|
1666
1649
|
toZigbee: [tz.tuya_radar_sensor],
|
|
1667
1650
|
exposes: [
|
|
1668
1651
|
e.illuminance_lux(), e.presence(),
|
|
1669
|
-
exposes.
|
|
1652
|
+
exposes.binary('motion', ea.STATE, [true, false]).withDescription('moving inside the range of the sensor'),
|
|
1670
1653
|
exposes.numeric('motion_speed', ea.STATE).withDescription('Speed of movement'),
|
|
1671
1654
|
exposes.enum('motion_direction', ea.STATE, ['standing still', 'moving forward', 'moving backward'])
|
|
1672
1655
|
.withDescription('direction of movement from the point of view of the radar'),
|
package/index.js
CHANGED
|
@@ -75,9 +75,7 @@ function addDefinition(definition) {
|
|
|
75
75
|
};
|
|
76
76
|
}
|
|
77
77
|
|
|
78
|
-
|
|
79
|
-
definition.toZigbee.push(tz.scene_store, tz.scene_recall, tz.scene_add, tz.scene_remove, tz.scene_remove_all, tz.read, tz.write);
|
|
80
|
-
}
|
|
78
|
+
definition.toZigbee.push(tz.scene_store, tz.scene_recall, tz.scene_add, tz.scene_remove, tz.scene_remove_all, tz.read, tz.write);
|
|
81
79
|
|
|
82
80
|
if (definition.exposes) {
|
|
83
81
|
definition.exposes = definition.exposes.concat([exposes.presets.linkquality()]);
|
package/npm-shrinkwrap.json
CHANGED