zigbee-herdsman-converters 14.0.345 → 14.0.346
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 +15 -0
- package/converters/toZigbee.js +10 -0
- package/devices/custom_devices_diy.js +21 -0
- package/devices/danfoss.js +10 -4
- package/devices/robb.js +22 -0
- package/devices/schneider_electric.js +36 -0
- package/devices/schwaiger.js +7 -0
- package/devices/sinope.js +2 -2
- package/devices/tuya.js +1 -0
- 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
|
}
|
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/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
|
];
|
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
|
@@ -490,6 +490,7 @@ module.exports = [
|
|
|
490
490
|
model: 'TS0201',
|
|
491
491
|
vendor: 'TuYa',
|
|
492
492
|
description: 'Temperature & humidity sensor with display',
|
|
493
|
+
whiteLabel: [{vendor: 'BlitzWolf', model: 'BW-IS4'}],
|
|
493
494
|
fromZigbee: [fz.battery, fz.temperature, fz.humidity],
|
|
494
495
|
toZigbee: [],
|
|
495
496
|
exposes: [e.battery(), e.temperature(), e.humidity(), e.battery_voltage()],
|
package/npm-shrinkwrap.json
CHANGED