@willieee802/zigbee-herdsman-converters 15.0.8-4.1
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/LICENSE +21 -0
- package/README.md +7 -0
- package/converters/fromZigbee.js +8439 -0
- package/converters/toZigbee.js +7162 -0
- package/devices/ITCommander.js +37 -0
- package/devices/RMC002.js +20 -0
- package/devices/acova.js +101 -0
- package/devices/acuity_brands_lighting.js +11 -0
- package/devices/adeo.js +256 -0
- package/devices/adurosmart.js +130 -0
- package/devices/aeotec.js +13 -0
- package/devices/airam.js +59 -0
- package/devices/ajax_online.js +49 -0
- package/devices/akuvox.js +28 -0
- package/devices/alchemy.js +18 -0
- package/devices/aldi.js +53 -0
- package/devices/alecto.js +98 -0
- package/devices/anchor.js +17 -0
- package/devices/atlantic.js +110 -0
- package/devices/atsmart.js +28 -0
- package/devices/aubess.js +21 -0
- package/devices/aurora_lighting.js +292 -0
- package/devices/automaton.js +44 -0
- package/devices/awox.js +184 -0
- package/devices/axis.js +22 -0
- package/devices/bankamp.js +11 -0
- package/devices/bega.js +22 -0
- package/devices/belkin.js +11 -0
- package/devices/bitron.js +334 -0
- package/devices/blaupunkt.js +27 -0
- package/devices/blitzwolf.js +47 -0
- package/devices/bosch.js +702 -0
- package/devices/brimate.js +15 -0
- package/devices/bseed.js +17 -0
- package/devices/bticino.js +118 -0
- package/devices/busch-jaeger.js +140 -0
- package/devices/byun.js +24 -0
- package/devices/calex.js +37 -0
- package/devices/candeo.js +49 -0
- package/devices/casaia.js +52 -0
- package/devices/centralite.js +359 -0
- package/devices/cleode.js +20 -0
- package/devices/cleverio.js +36 -0
- package/devices/climax.js +138 -0
- package/devices/commercial_electric.js +16 -0
- package/devices/connecte.js +46 -0
- package/devices/cree.js +11 -0
- package/devices/ctm.js +999 -0
- package/devices/current_products_corp.js +24 -0
- package/devices/custom_devices_diy.js +850 -0
- package/devices/cy-lighting.js +11 -0
- package/devices/danalock.js +26 -0
- package/devices/danfoss.js +340 -0
- package/devices/databyte.ch.js +55 -0
- package/devices/datek.js +246 -0
- package/devices/dawon_dns.js +338 -0
- package/devices/develco.js +868 -0
- package/devices/digi.js +14 -0
- package/devices/diyruz.js +305 -0
- package/devices/dlink.js +37 -0
- package/devices/dnake.js +11 -0
- package/devices/dresden_elektronik.js +47 -0
- package/devices/easyaccess.js +27 -0
- package/devices/eatonhalo_led.js +11 -0
- package/devices/echostar.js +25 -0
- package/devices/ecodim.js +145 -0
- package/devices/ecolink.js +21 -0
- package/devices/ecosmart.js +64 -0
- package/devices/ecozy.js +31 -0
- package/devices/edp.js +39 -0
- package/devices/eglo.js +25 -0
- package/devices/elko.js +176 -0
- package/devices/enbrighten.js +163 -0
- package/devices/enocean.js +52 -0
- package/devices/envilar.js +73 -0
- package/devices/essentialb.js +87 -0
- package/devices/eurotronic.js +48 -0
- package/devices/evanell.js +29 -0
- package/devices/evn.js +31 -0
- package/devices/evology.js +24 -0
- package/devices/evvr.js +17 -0
- package/devices/ewelink.js +184 -0
- package/devices/ezex.js +24 -0
- package/devices/fantem.js +77 -0
- package/devices/feibit.js +172 -0
- package/devices/fireangel.js +15 -0
- package/devices/frankever.js +23 -0
- package/devices/garza.js +11 -0
- package/devices/ge.js +111 -0
- package/devices/gewiss.js +48 -0
- package/devices/gidealed.js +11 -0
- package/devices/giderwel.js +11 -0
- package/devices/giex.js +222 -0
- package/devices/girier.js +19 -0
- package/devices/gledopto.js +756 -0
- package/devices/gmy.js +11 -0
- package/devices/gs.js +29 -0
- package/devices/halemeier.js +18 -0
- package/devices/hampton_bay.js +37 -0
- package/devices/heiman.js +805 -0
- package/devices/hej.js +107 -0
- package/devices/hfh.js +11 -0
- package/devices/hgkg.js +54 -0
- package/devices/hilux.js +11 -0
- package/devices/hive.js +524 -0
- package/devices/home_control_as.js +27 -0
- package/devices/hommyn.js +24 -0
- package/devices/honyar.js +29 -0
- package/devices/hornbach.js +53 -0
- package/devices/hzc.js +21 -0
- package/devices/hzc_electric.js +42 -0
- package/devices/icasa.js +121 -0
- package/devices/idinio.js +19 -0
- package/devices/ihorn.js +61 -0
- package/devices/ikea.js +1168 -0
- package/devices/ilightsin.js +11 -0
- package/devices/iluminize.js +262 -0
- package/devices/ilux.js +11 -0
- package/devices/immax.js +203 -0
- package/devices/innr.js +705 -0
- package/devices/inovelli.js +1315 -0
- package/devices/insta.js +110 -0
- package/devices/iolloi.js +20 -0
- package/devices/iotperfect.js +20 -0
- package/devices/iris.js +180 -0
- package/devices/istar.js +20 -0
- package/devices/jasco.js +55 -0
- package/devices/javis.js +37 -0
- package/devices/jethome.js +48 -0
- package/devices/jiawen.js +18 -0
- package/devices/jumitech.js +18 -0
- package/devices/jxuan.js +49 -0
- package/devices/kami.js +15 -0
- package/devices/keen_home.js +80 -0
- package/devices/klikaanklikuit.js +17 -0
- package/devices/kmpcil.js +148 -0
- package/devices/konke.js +141 -0
- package/devices/ksentry.js +17 -0
- package/devices/kurvia.js +17 -0
- package/devices/kwikset.js +120 -0
- package/devices/lanesto.js +11 -0
- package/devices/lds.js +11 -0
- package/devices/led_trading.js +69 -0
- package/devices/ledvance.js +353 -0
- package/devices/leedarson.js +130 -0
- package/devices/legrand.js +554 -0
- package/devices/lellki.js +146 -0
- package/devices/letsled.js +11 -0
- package/devices/letv.js +18 -0
- package/devices/leviton.js +142 -0
- package/devices/lg.js +18 -0
- package/devices/lidl.js +1000 -0
- package/devices/lifecontrol.js +92 -0
- package/devices/lightsolutions.js +37 -0
- package/devices/linkind.js +205 -0
- package/devices/livingwise.js +59 -0
- package/devices/livolo.js +286 -0
- package/devices/lixee.js +779 -0
- package/devices/lonsonho.js +218 -0
- package/devices/lubeez.js +18 -0
- package/devices/lupus.js +74 -0
- package/devices/lutron.js +32 -0
- package/devices/lux.js +40 -0
- package/devices/m-elec.js +18 -0
- package/devices/makegood.js +51 -0
- package/devices/matcall_bv.js +18 -0
- package/devices/meazon.js +47 -0
- package/devices/mercator.js +225 -0
- package/devices/miboxer.js +72 -0
- package/devices/micromatic.js +29 -0
- package/devices/moes.js +400 -0
- package/devices/mycket.js +11 -0
- package/devices/m/303/274ller_licht.js +220 -0
- package/devices/namron.js +774 -0
- package/devices/nanoleaf.js +11 -0
- package/devices/neo.js +86 -0
- package/devices/net2grid.js +29 -0
- package/devices/netvox.js +35 -0
- package/devices/niko.js +314 -0
- package/devices/ninja_blocks.js +24 -0
- package/devices/niviss.js +11 -0
- package/devices/nodon.js +109 -0
- package/devices/nordtronic.js +30 -0
- package/devices/nous.js +88 -0
- package/devices/novo.js +17 -0
- package/devices/nue_3a.js +417 -0
- package/devices/nyce.js +67 -0
- package/devices/onesti.js +59 -0
- package/devices/openlumi.js +22 -0
- package/devices/orvibo.js +515 -0
- package/devices/osram.js +519 -0
- package/devices/oujiabao.js +15 -0
- package/devices/owon.js +352 -0
- package/devices/ozsmartthings.js +11 -0
- package/devices/paul_neuhaus.js +96 -0
- package/devices/paulmann.js +158 -0
- package/devices/peq.js +24 -0
- package/devices/perenio.js +413 -0
- package/devices/philips.js +3118 -0
- package/devices/plaid.js +25 -0
- package/devices/plugwise.js +173 -0
- package/devices/popp.js +10 -0
- package/devices/profalux.js +47 -0
- package/devices/prolight.js +54 -0
- package/devices/qmotion.js +33 -0
- package/devices/qoto.js +113 -0
- package/devices/quotra.js +18 -0
- package/devices/rademacher.js +18 -0
- package/devices/rgb_genie.js +119 -0
- package/devices/robb.js +335 -0
- package/devices/roome.js +15 -0
- package/devices/rtx.js +90 -0
- package/devices/salus_controls.js +137 -0
- package/devices/samotech.js +93 -0
- package/devices/saswell.js +58 -0
- package/devices/scanproducts.js +32 -0
- package/devices/schlage.js +24 -0
- package/devices/schneider_electric.js +1039 -0
- package/devices/schwaiger.js +62 -0
- package/devices/seastar_intelligence.js +16 -0
- package/devices/securifi.js +39 -0
- package/devices/sengled.js +332 -0
- package/devices/sercomm.js +140 -0
- package/devices/shenzhen_homa.js +53 -0
- package/devices/shinasystem.js +686 -0
- package/devices/siglis.js +440 -0
- package/devices/sinope.js +1257 -0
- package/devices/siterwell.js +46 -0
- package/devices/skydance.js +112 -0
- package/devices/slv.js +27 -0
- package/devices/smart9.js +27 -0
- package/devices/smart_home_pty.js +18 -0
- package/devices/smartenit.js +42 -0
- package/devices/smartthings.js +495 -0
- package/devices/smartwings.js +24 -0
- package/devices/sohan_electric.js +13 -0
- package/devices/solaredge.js +11 -0
- package/devices/somgoms.js +47 -0
- package/devices/sonoff.js +262 -0
- package/devices/spotmau.js +36 -0
- package/devices/sprut.js +317 -0
- package/devices/stelpro.js +216 -0
- package/devices/sunricher.js +625 -0
- package/devices/swann.js +33 -0
- package/devices/sylvania.js +200 -0
- package/devices/tci.js +25 -0
- package/devices/technicolor.js +47 -0
- package/devices/terncy.js +64 -0
- package/devices/the_light_group.js +70 -0
- package/devices/third_reality.js +195 -0
- package/devices/titan_products.js +22 -0
- package/devices/tplink.js +42 -0
- package/devices/trust.js +114 -0
- package/devices/tubeszb.js +20 -0
- package/devices/tuya.js +4215 -0
- package/devices/ubisys.js +938 -0
- package/devices/uhome.js +25 -0
- package/devices/universal_electronics_inc.js +119 -0
- package/devices/urlighting.js +12 -0
- package/devices/useelink.js +52 -0
- package/devices/vbled.js +18 -0
- package/devices/vesternet.js +188 -0
- package/devices/viessmann.js +51 -0
- package/devices/villeroy_boch.js +18 -0
- package/devices/vimar.js +78 -0
- package/devices/visonic.js +80 -0
- package/devices/vrey.js +18 -0
- package/devices/wally.js +25 -0
- package/devices/waxman.js +45 -0
- package/devices/weiser.js +67 -0
- package/devices/weten.js +13 -0
- package/devices/wisdom.js +11 -0
- package/devices/woox.js +177 -0
- package/devices/wyze.js +23 -0
- package/devices/xiaomi.js +3223 -0
- package/devices/xinghuoyuan.js +11 -0
- package/devices/yale.js +227 -0
- package/devices/ynoa.js +68 -0
- package/devices/yookee.js +23 -0
- package/devices/ysrsai.js +26 -0
- package/devices/zemismart.js +254 -0
- package/devices/zen.js +34 -0
- package/devices/zipato.js +11 -0
- package/index.js +242 -0
- package/lib/color.js +784 -0
- package/lib/configureKey.js +944 -0
- package/lib/constants.js +316 -0
- package/lib/exposes.js +677 -0
- package/lib/extend.js +180 -0
- package/lib/kelvinToXy.js +1912 -0
- package/lib/legacy.js +2223 -0
- package/lib/light.js +111 -0
- package/lib/ota/OTA_URLs.md +119 -0
- package/lib/ota/common.js +476 -0
- package/lib/ota/index.js +10 -0
- package/lib/ota/inovelli.js +72 -0
- package/lib/ota/ledvance.js +52 -0
- package/lib/ota/lixee.js +57 -0
- package/lib/ota/salus.js +82 -0
- package/lib/ota/securifi.js +25 -0
- package/lib/ota/tradfri.js +45 -0
- package/lib/ota/ubisys.js +61 -0
- package/lib/ota/zigbeeOTA.js +161 -0
- package/lib/philips.js +667 -0
- package/lib/reporting.js +234 -0
- package/lib/store.js +57 -0
- package/lib/tuya.js +2027 -0
- package/lib/utils.js +527 -0
- package/lib/xiaomi.d.ts +11 -0
- package/lib/xiaomi.js +1288 -0
- package/lib/zosung.js +243 -0
- package/package.json +39 -0
|
@@ -0,0 +1,868 @@
|
|
|
1
|
+
const exposes = require('../lib/exposes');
|
|
2
|
+
const fz = {...require('../converters/fromZigbee'), legacy: require('../lib/legacy').fromZigbee};
|
|
3
|
+
const tz = require('../converters/toZigbee');
|
|
4
|
+
const constants = require('../lib/constants');
|
|
5
|
+
const reporting = require('../lib/reporting');
|
|
6
|
+
const globalStore = require('../lib/store');
|
|
7
|
+
const utils = require('../lib/utils');
|
|
8
|
+
const ota = require('../lib/ota');
|
|
9
|
+
const e = exposes.presets;
|
|
10
|
+
const ea = exposes.access;
|
|
11
|
+
|
|
12
|
+
// develco specific cosntants
|
|
13
|
+
const manufacturerOptions = {manufacturerCode: 0x1015};
|
|
14
|
+
|
|
15
|
+
/* MOSZB-1xx - ledControl - bitmap8 - r/w
|
|
16
|
+
* 0x00 Disable LED when movement is detected.
|
|
17
|
+
* 0x01 Enables periodic fault flashes. These flashes are used to indicate e.g. low battery level.
|
|
18
|
+
* 0x02 Enables green application defined LED. This is e.g. used to indicate motion detection.
|
|
19
|
+
* Default value 0xFF ( seems to be fault + motion)
|
|
20
|
+
*/
|
|
21
|
+
const develcoLedControlMap = {
|
|
22
|
+
0x00: 'off',
|
|
23
|
+
0x01: 'fault_only',
|
|
24
|
+
0x02: 'motion_only',
|
|
25
|
+
0xFF: 'both',
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
// develco specific convertors
|
|
29
|
+
const develco = {
|
|
30
|
+
configure: {
|
|
31
|
+
read_sw_hw_version: async (device, logger) => {
|
|
32
|
+
for (const ep of device.endpoints) {
|
|
33
|
+
if (ep.supportsInputCluster('genBasic')) {
|
|
34
|
+
try {
|
|
35
|
+
const data = await ep.read('genBasic', ['develcoPrimarySwVersion', 'develcoPrimaryHwVersion'],
|
|
36
|
+
manufacturerOptions);
|
|
37
|
+
|
|
38
|
+
if (data.hasOwnProperty('develcoPrimarySwVersion')) {
|
|
39
|
+
device.softwareBuildID = data.develcoPrimarySwVersion.join('.');
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
if (data.hasOwnProperty('develcoPrimaryHwVersion')) {
|
|
43
|
+
device.hardwareVersion = data.develcoPrimaryHwVersion.join('.');
|
|
44
|
+
}
|
|
45
|
+
} catch (error) {/* catch timeouts of sleeping devices */}
|
|
46
|
+
break;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
},
|
|
50
|
+
},
|
|
51
|
+
fz: {
|
|
52
|
+
// Some Develco devices report strange values sometimes
|
|
53
|
+
// https://github.com/Koenkk/zigbee2mqtt/issues/13329
|
|
54
|
+
electrical_measurement: {
|
|
55
|
+
...fz.electrical_measurement,
|
|
56
|
+
convert: (model, msg, publish, options, meta) => {
|
|
57
|
+
if (msg.data.rmsVoltage !== 0xFFFF && msg.data.rmsCurrent !== 0xFFFF && msg.data.activePower !== -0x8000) {
|
|
58
|
+
return fz.electrical_measurement.convert(model, msg, publish, options, meta);
|
|
59
|
+
}
|
|
60
|
+
},
|
|
61
|
+
},
|
|
62
|
+
device_temperature: {
|
|
63
|
+
...fz.device_temperature,
|
|
64
|
+
convert: (model, msg, publish, options, meta) => {
|
|
65
|
+
if (msg.data.currentTemperature !== -0x8000) {
|
|
66
|
+
return fz.device_temperature.convert(model, msg, publish, options, meta);
|
|
67
|
+
}
|
|
68
|
+
},
|
|
69
|
+
},
|
|
70
|
+
temperature: {
|
|
71
|
+
...fz.temperature,
|
|
72
|
+
convert: (model, msg, publish, options, meta) => {
|
|
73
|
+
if (msg.data.measuredValue !== -0x8000 && msg.data.measuredValue !== 0xFFFF) {
|
|
74
|
+
return fz.temperature.convert(model, msg, publish, options, meta);
|
|
75
|
+
}
|
|
76
|
+
},
|
|
77
|
+
},
|
|
78
|
+
metering: {
|
|
79
|
+
...fz.metering,
|
|
80
|
+
convert: (model, msg, publish, options, meta) => {
|
|
81
|
+
if (msg.data.instantaneousDemand !== -0x800000) {
|
|
82
|
+
return fz.metering.convert(model, msg, publish, options, meta);
|
|
83
|
+
}
|
|
84
|
+
},
|
|
85
|
+
},
|
|
86
|
+
pulse_configuration: {
|
|
87
|
+
cluster: 'seMetering',
|
|
88
|
+
type: ['attributeReport', 'readResponse'],
|
|
89
|
+
convert: (model, msg, publish, options, meta) => {
|
|
90
|
+
const result = {};
|
|
91
|
+
if (msg.data.hasOwnProperty('develcoPulseConfiguration')) {
|
|
92
|
+
result[utils.postfixWithEndpointName('pulse_configuration', msg, model, meta)] =
|
|
93
|
+
msg.data['develcoPulseConfiguration'];
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
return result;
|
|
97
|
+
},
|
|
98
|
+
},
|
|
99
|
+
interface_mode: {
|
|
100
|
+
cluster: 'seMetering',
|
|
101
|
+
type: ['attributeReport', 'readResponse'],
|
|
102
|
+
convert: (model, msg, publish, options, meta) => {
|
|
103
|
+
const result = {};
|
|
104
|
+
if (msg.data.hasOwnProperty('develcoInterfaceMode')) {
|
|
105
|
+
result[utils.postfixWithEndpointName('interface_mode', msg, model, meta)] =
|
|
106
|
+
constants.develcoInterfaceMode.hasOwnProperty(msg.data['develcoInterfaceMode']) ?
|
|
107
|
+
constants.develcoInterfaceMode[msg.data['develcoInterfaceMode']] :
|
|
108
|
+
msg.data['develcoInterfaceMode'];
|
|
109
|
+
}
|
|
110
|
+
if (msg.data.hasOwnProperty('status')) {
|
|
111
|
+
result['battery_low'] = (msg.data.status & 2) > 0;
|
|
112
|
+
result['check_meter'] = (msg.data.status & 1) > 0;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
return result;
|
|
116
|
+
},
|
|
117
|
+
},
|
|
118
|
+
fault_status: {
|
|
119
|
+
cluster: 'genBinaryInput',
|
|
120
|
+
type: ['attributeReport', 'readResponse'],
|
|
121
|
+
convert: (model, msg, publish, options, meta) => {
|
|
122
|
+
const result = {};
|
|
123
|
+
if (msg.data.hasOwnProperty('reliability')) {
|
|
124
|
+
const lookup = {0: 'no_fault_detected', 7: 'unreliable_other', 8: 'process_error'};
|
|
125
|
+
result.reliability = lookup[msg.data['reliability']];
|
|
126
|
+
}
|
|
127
|
+
if (msg.data.hasOwnProperty('statusFlags')) {
|
|
128
|
+
result.fault = (msg.data['statusFlags']===1);
|
|
129
|
+
}
|
|
130
|
+
return result;
|
|
131
|
+
},
|
|
132
|
+
},
|
|
133
|
+
voc: {
|
|
134
|
+
cluster: 'develcoSpecificAirQuality',
|
|
135
|
+
type: ['attributeReport', 'readResponse'],
|
|
136
|
+
options: [exposes.options.precision('voc'), exposes.options.calibration('voc')],
|
|
137
|
+
convert: (model, msg, publish, options, meta) => {
|
|
138
|
+
// from Sensirion_Gas_Sensors_SGP3x_TVOC_Concept.pdf
|
|
139
|
+
// "The mean molar mass of this mixture is 110 g/mol and hence,
|
|
140
|
+
// 1 ppb TVOC corresponds to 4.5 μg/m3."
|
|
141
|
+
const vocPpb = parseFloat(msg.data['measuredValue']);
|
|
142
|
+
const voc = vocPpb * 4.5;
|
|
143
|
+
const vocProperty = utils.postfixWithEndpointName('voc', msg, model, meta);
|
|
144
|
+
|
|
145
|
+
// from aqszb-110-technical-manual-air-quality-sensor-04-08-20.pdf page 6, section 2.2 voc
|
|
146
|
+
// this contains a ppb to level mapping table.
|
|
147
|
+
let airQuality;
|
|
148
|
+
const airQualityProperty = utils.postfixWithEndpointName('air_quality', msg, model, meta);
|
|
149
|
+
if (vocPpb <= 65) {
|
|
150
|
+
airQuality = 'excellent';
|
|
151
|
+
} else if (vocPpb <= 220) {
|
|
152
|
+
airQuality = 'good';
|
|
153
|
+
} else if (vocPpb <= 660) {
|
|
154
|
+
airQuality = 'moderate';
|
|
155
|
+
} else if (vocPpb <= 2200) {
|
|
156
|
+
airQuality = 'poor';
|
|
157
|
+
} else if (vocPpb <= 5500) {
|
|
158
|
+
airQuality = 'unhealthy';
|
|
159
|
+
} else if (vocPpb > 5500) {
|
|
160
|
+
airQuality = 'out_of_range';
|
|
161
|
+
} else {
|
|
162
|
+
airQuality = 'unknown';
|
|
163
|
+
}
|
|
164
|
+
return {[vocProperty]: utils.calibrateAndPrecisionRoundOptions(voc, options, 'voc'), [airQualityProperty]: airQuality};
|
|
165
|
+
},
|
|
166
|
+
},
|
|
167
|
+
voc_battery: {
|
|
168
|
+
cluster: 'genPowerCfg',
|
|
169
|
+
type: ['attributeReport', 'readResponse'],
|
|
170
|
+
convert: (model, msg, publish, options, meta) => {
|
|
171
|
+
/*
|
|
172
|
+
* Per the technical documentation for AQSZB-110:
|
|
173
|
+
* To detect low battery the system can monitor the "BatteryVoltage" by setting up a reporting interval of every 12 hour.
|
|
174
|
+
* When a voltage of 2.5V is measured the battery should be replaced.
|
|
175
|
+
* Low batt LED indication–RED LED will blink twice every 60 second.
|
|
176
|
+
*/
|
|
177
|
+
const result = fz.battery.convert(model, msg, publish, options, meta);
|
|
178
|
+
result.battery_low = (result.voltage <= 2500);
|
|
179
|
+
return result;
|
|
180
|
+
},
|
|
181
|
+
},
|
|
182
|
+
led_control: {
|
|
183
|
+
cluster: 'genBasic',
|
|
184
|
+
type: ['attributeReport', 'readResponse'],
|
|
185
|
+
options: [],
|
|
186
|
+
convert: (model, msg, publish, options, meta) => {
|
|
187
|
+
const state = {};
|
|
188
|
+
|
|
189
|
+
if (msg.data.hasOwnProperty('develcoLedControl')) {
|
|
190
|
+
state['led_control'] = develcoLedControlMap[msg.data['develcoLedControl']];
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
return state;
|
|
194
|
+
},
|
|
195
|
+
},
|
|
196
|
+
ias_occupancy_timeout: {
|
|
197
|
+
cluster: 'ssIasZone',
|
|
198
|
+
type: ['attributeReport', 'readResponse'],
|
|
199
|
+
options: [],
|
|
200
|
+
convert: (model, msg, publish, options, meta) => {
|
|
201
|
+
const state = {};
|
|
202
|
+
|
|
203
|
+
if (msg.data.hasOwnProperty('develcoAlarmOffDelay')) {
|
|
204
|
+
state['occupancy_timeout'] = msg.data['develcoAlarmOffDelay'];
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
return state;
|
|
208
|
+
},
|
|
209
|
+
},
|
|
210
|
+
input: {
|
|
211
|
+
cluster: 'genBinaryInput',
|
|
212
|
+
type: ['attributeReport', 'readResponse'],
|
|
213
|
+
convert: (model, msg, publish, options, meta) => {
|
|
214
|
+
const result = {};
|
|
215
|
+
if (msg.data.hasOwnProperty('presentValue')) {
|
|
216
|
+
const value = msg.data['presentValue'];
|
|
217
|
+
result[utils.postfixWithEndpointName('input', msg, model, meta)] = value == 1;
|
|
218
|
+
}
|
|
219
|
+
return result;
|
|
220
|
+
},
|
|
221
|
+
},
|
|
222
|
+
},
|
|
223
|
+
tz: {
|
|
224
|
+
pulse_configuration: {
|
|
225
|
+
key: ['pulse_configuration'],
|
|
226
|
+
convertSet: async (entity, key, value, meta) => {
|
|
227
|
+
await entity.write('seMetering', {'develcoPulseConfiguration': value}, manufacturerOptions);
|
|
228
|
+
return {readAfterWriteTime: 200, state: {'pulse_configuration': value}};
|
|
229
|
+
},
|
|
230
|
+
convertGet: async (entity, key, meta) => {
|
|
231
|
+
await entity.read('seMetering', ['develcoPulseConfiguration'], manufacturerOptions);
|
|
232
|
+
},
|
|
233
|
+
},
|
|
234
|
+
interface_mode: {
|
|
235
|
+
key: ['interface_mode'],
|
|
236
|
+
convertSet: async (entity, key, value, meta) => {
|
|
237
|
+
const payload = {'develcoInterfaceMode': utils.getKey(constants.develcoInterfaceMode, value, undefined, Number)};
|
|
238
|
+
await entity.write('seMetering', payload, manufacturerOptions);
|
|
239
|
+
return {readAfterWriteTime: 200, state: {'interface_mode': value}};
|
|
240
|
+
},
|
|
241
|
+
convertGet: async (entity, key, meta) => {
|
|
242
|
+
await entity.read('seMetering', ['develcoInterfaceMode'], manufacturerOptions);
|
|
243
|
+
},
|
|
244
|
+
},
|
|
245
|
+
current_summation: {
|
|
246
|
+
key: ['current_summation'],
|
|
247
|
+
convertSet: async (entity, key, value, meta) => {
|
|
248
|
+
await entity.write('seMetering', {'develcoCurrentSummation': value}, manufacturerOptions);
|
|
249
|
+
return {state: {'current_summation': value}};
|
|
250
|
+
},
|
|
251
|
+
},
|
|
252
|
+
led_control: {
|
|
253
|
+
key: ['led_control'],
|
|
254
|
+
convertSet: async (entity, key, value, meta) => {
|
|
255
|
+
const ledControl = utils.getKey(develcoLedControlMap, value, value, Number);
|
|
256
|
+
await entity.write('genBasic', {'develcoLedControl': ledControl}, manufacturerOptions);
|
|
257
|
+
return {state: {led_control: value}};
|
|
258
|
+
},
|
|
259
|
+
convertGet: async (entity, key, meta) => {
|
|
260
|
+
await entity.read('genBasic', ['develcoLedControl'], manufacturerOptions);
|
|
261
|
+
},
|
|
262
|
+
},
|
|
263
|
+
ias_occupancy_timeout: {
|
|
264
|
+
key: ['occupancy_timeout'],
|
|
265
|
+
convertSet: async (entity, key, value, meta) => {
|
|
266
|
+
let timeoutValue = value;
|
|
267
|
+
if (timeoutValue < 20) {
|
|
268
|
+
meta.logger.warn(`Minimum occupancy_timeout is 20, using 20 instead of ${timeoutValue}!`);
|
|
269
|
+
timeoutValue = 20;
|
|
270
|
+
}
|
|
271
|
+
await entity.write('ssIasZone', {'develcoAlarmOffDelay': timeoutValue}, manufacturerOptions);
|
|
272
|
+
return {state: {occupancy_timeout: timeoutValue}};
|
|
273
|
+
},
|
|
274
|
+
convertGet: async (entity, key, meta) => {
|
|
275
|
+
await entity.read('ssIasZone', ['develcoAlarmOffDelay'], manufacturerOptions);
|
|
276
|
+
},
|
|
277
|
+
},
|
|
278
|
+
input: {
|
|
279
|
+
key: ['input'],
|
|
280
|
+
convertGet: async (entity, key, meta) => {
|
|
281
|
+
await entity.read('genBinaryInput', ['presentValue']);
|
|
282
|
+
},
|
|
283
|
+
},
|
|
284
|
+
},
|
|
285
|
+
};
|
|
286
|
+
|
|
287
|
+
module.exports = [
|
|
288
|
+
{
|
|
289
|
+
zigbeeModel: ['SPLZB-131'],
|
|
290
|
+
model: 'SPLZB-131',
|
|
291
|
+
vendor: 'Develco',
|
|
292
|
+
description: 'Power plug',
|
|
293
|
+
fromZigbee: [fz.on_off, develco.fz.electrical_measurement, develco.fz.metering],
|
|
294
|
+
toZigbee: [tz.on_off],
|
|
295
|
+
exposes: [e.switch(), e.power(), e.current(), e.voltage(), e.energy()],
|
|
296
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
297
|
+
const endpoint = device.getEndpoint(2);
|
|
298
|
+
await reporting.bind(endpoint, coordinatorEndpoint, ['genOnOff', 'haElectricalMeasurement', 'seMetering']);
|
|
299
|
+
await reporting.onOff(endpoint);
|
|
300
|
+
await reporting.readEletricalMeasurementMultiplierDivisors(endpoint);
|
|
301
|
+
await reporting.activePower(endpoint);
|
|
302
|
+
await reporting.rmsCurrent(endpoint);
|
|
303
|
+
await reporting.rmsVoltage(endpoint);
|
|
304
|
+
await reporting.readMeteringMultiplierDivisor(endpoint);
|
|
305
|
+
await reporting.currentSummDelivered(endpoint);
|
|
306
|
+
},
|
|
307
|
+
endpoint: (device) => {
|
|
308
|
+
return {default: 2};
|
|
309
|
+
},
|
|
310
|
+
},
|
|
311
|
+
{
|
|
312
|
+
zigbeeModel: ['SPLZB-132'],
|
|
313
|
+
model: 'SPLZB-132',
|
|
314
|
+
vendor: 'Develco',
|
|
315
|
+
description: 'Power plug',
|
|
316
|
+
fromZigbee: [fz.on_off, develco.fz.electrical_measurement, develco.fz.metering, develco.fz.device_temperature],
|
|
317
|
+
toZigbee: [tz.on_off],
|
|
318
|
+
exposes: [e.switch(), e.power(), e.current(), e.voltage(), e.energy(), e.device_temperature(), e.ac_frequency()],
|
|
319
|
+
options: [exposes.options.precision(`ac_frequency`)],
|
|
320
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
321
|
+
const endpoint = device.getEndpoint(2);
|
|
322
|
+
await reporting.bind(endpoint, coordinatorEndpoint, ['genOnOff', 'haElectricalMeasurement', 'seMetering', 'genDeviceTempCfg']);
|
|
323
|
+
await reporting.onOff(endpoint);
|
|
324
|
+
await reporting.deviceTemperature(endpoint);
|
|
325
|
+
// Set to true, to access the acFrequencyDivisor and acFrequencyMultiplier attribute. Not all devices support this.
|
|
326
|
+
await reporting.readEletricalMeasurementMultiplierDivisors(endpoint, true);
|
|
327
|
+
await reporting.activePower(endpoint, {change: 10}); // Power reports with every 10W change
|
|
328
|
+
await reporting.rmsCurrent(endpoint, {change: 20}); // Current reports with every 20mA change
|
|
329
|
+
await reporting.rmsVoltage(endpoint, {min: constants.repInterval.MINUTES_5, change: 400}); // Limit reports to every 5m, or 4V
|
|
330
|
+
await reporting.readMeteringMultiplierDivisor(endpoint);
|
|
331
|
+
await reporting.currentSummDelivered(endpoint, {change: [0, 20]}); // Limit reports to once every 5m, or 0.02kWh
|
|
332
|
+
await reporting.instantaneousDemand(endpoint, {min: constants.repInterval.MINUTES_5, change: 10});
|
|
333
|
+
await reporting.acFrequency(endpoint);
|
|
334
|
+
},
|
|
335
|
+
endpoint: (device) => {
|
|
336
|
+
return {default: 2};
|
|
337
|
+
},
|
|
338
|
+
},
|
|
339
|
+
{
|
|
340
|
+
zigbeeModel: ['SPLZB-134'],
|
|
341
|
+
model: 'SPLZB-134',
|
|
342
|
+
vendor: 'Develco',
|
|
343
|
+
description: 'Power plug (type G)',
|
|
344
|
+
fromZigbee: [fz.on_off, develco.fz.electrical_measurement, develco.fz.metering, develco.fz.device_temperature],
|
|
345
|
+
toZigbee: [tz.on_off],
|
|
346
|
+
exposes: [e.switch(), e.power(), e.current(), e.voltage(), e.energy(), e.device_temperature()],
|
|
347
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
348
|
+
const endpoint = device.getEndpoint(2);
|
|
349
|
+
await reporting.bind(endpoint, coordinatorEndpoint, ['genOnOff', 'haElectricalMeasurement', 'seMetering', 'genDeviceTempCfg']);
|
|
350
|
+
await reporting.onOff(endpoint);
|
|
351
|
+
await reporting.deviceTemperature(endpoint, {change: 2}); // Device temperature reports with 2 degree change
|
|
352
|
+
await reporting.readEletricalMeasurementMultiplierDivisors(endpoint);
|
|
353
|
+
await reporting.activePower(endpoint, {change: 10}); // Power reports with every 10W change
|
|
354
|
+
await reporting.rmsCurrent(endpoint, {change: 20}); // Current reports with every 20mA change
|
|
355
|
+
await reporting.rmsVoltage(endpoint, {min: constants.repInterval.MINUTES_5, change: 400}); // Limit reports to every 5m, or 4V
|
|
356
|
+
await reporting.readMeteringMultiplierDivisor(endpoint);
|
|
357
|
+
await reporting.currentSummDelivered(endpoint, {change: [0, 20]}); // Limit reports to once every 5m, or 0.02kWh
|
|
358
|
+
await reporting.instantaneousDemand(endpoint, {min: constants.repInterval.MINUTES_5, change: 10});
|
|
359
|
+
},
|
|
360
|
+
endpoint: (device) => {
|
|
361
|
+
return {default: 2};
|
|
362
|
+
},
|
|
363
|
+
},
|
|
364
|
+
{
|
|
365
|
+
zigbeeModel: ['SMRZB-143'],
|
|
366
|
+
model: 'SMRZB-143',
|
|
367
|
+
vendor: 'Develco',
|
|
368
|
+
description: 'Smart cable',
|
|
369
|
+
fromZigbee: [fz.on_off, develco.fz.electrical_measurement, develco.fz.metering, develco.fz.device_temperature],
|
|
370
|
+
toZigbee: [tz.on_off],
|
|
371
|
+
exposes: [e.switch(), e.power(), e.current(), e.voltage(), e.energy(), e.device_temperature()],
|
|
372
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
373
|
+
const endpoint = device.getEndpoint(2);
|
|
374
|
+
await reporting.bind(endpoint, coordinatorEndpoint, ['genOnOff', 'haElectricalMeasurement', 'seMetering', 'genDeviceTempCfg']);
|
|
375
|
+
await reporting.onOff(endpoint);
|
|
376
|
+
await reporting.deviceTemperature(endpoint, {change: 2}); // Device temperature reports with 2 degree change
|
|
377
|
+
await reporting.readEletricalMeasurementMultiplierDivisors(endpoint);
|
|
378
|
+
await reporting.activePower(endpoint, {change: 10}); // Power reports with every 10W change
|
|
379
|
+
await reporting.rmsCurrent(endpoint, {change: 20}); // Current reports with every 20mA change
|
|
380
|
+
await reporting.rmsVoltage(endpoint, {min: constants.repInterval.MINUTES_5, change: 400}); // Limit reports to every 5m, or 4V
|
|
381
|
+
await reporting.readMeteringMultiplierDivisor(endpoint);
|
|
382
|
+
await reporting.currentSummDelivered(endpoint, {change: [0, 20]}); // Limit reports to once every 5m, or 0.02kWh
|
|
383
|
+
await reporting.instantaneousDemand(endpoint, {min: constants.repInterval.MINUTES_5, change: 10});
|
|
384
|
+
},
|
|
385
|
+
endpoint: (device) => {
|
|
386
|
+
return {default: 2};
|
|
387
|
+
},
|
|
388
|
+
},
|
|
389
|
+
{
|
|
390
|
+
zigbeeModel: ['EMIZB-132'],
|
|
391
|
+
model: 'EMIZB-132',
|
|
392
|
+
vendor: 'Develco',
|
|
393
|
+
description: 'Wattle AMS HAN power-meter sensor',
|
|
394
|
+
fromZigbee: [develco.fz.metering, develco.fz.electrical_measurement],
|
|
395
|
+
toZigbee: [tz.EMIZB_132_mode],
|
|
396
|
+
ota: ota.zigbeeOTA,
|
|
397
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
398
|
+
const endpoint = device.getEndpoint(2);
|
|
399
|
+
await reporting.bind(endpoint, coordinatorEndpoint, ['haElectricalMeasurement', 'seMetering']);
|
|
400
|
+
|
|
401
|
+
try {
|
|
402
|
+
// Some don't support these attributes
|
|
403
|
+
// https://github.com/Koenkk/zigbee-herdsman-converters/issues/974#issuecomment-621465038
|
|
404
|
+
await reporting.readEletricalMeasurementMultiplierDivisors(endpoint);
|
|
405
|
+
await reporting.rmsVoltage(endpoint);
|
|
406
|
+
await reporting.rmsCurrent(endpoint);
|
|
407
|
+
await reporting.activePower(endpoint);
|
|
408
|
+
} catch (e) {
|
|
409
|
+
e;
|
|
410
|
+
}
|
|
411
|
+
|
|
412
|
+
await reporting.readMeteringMultiplierDivisor(endpoint);
|
|
413
|
+
endpoint.saveClusterAttributeKeyValue('seMetering', {divisor: 1000, multiplier: 1});
|
|
414
|
+
await reporting.instantaneousDemand(endpoint);
|
|
415
|
+
await reporting.currentSummDelivered(endpoint);
|
|
416
|
+
await reporting.currentSummReceived(endpoint);
|
|
417
|
+
await develco.configure.read_sw_hw_version(device, logger);
|
|
418
|
+
},
|
|
419
|
+
exposes: [e.power(), e.energy(), e.current(), e.voltage(), e.current_phase_b(), e.voltage_phase_b(), e.current_phase_c(),
|
|
420
|
+
e.voltage_phase_c()],
|
|
421
|
+
onEvent: async (type, data, device) => {
|
|
422
|
+
if (type === 'message' && data.type === 'attributeReport' && data.cluster === 'seMetering' && data.data['divisor']) {
|
|
423
|
+
// Device sends wrong divisior (512) while it should be fixed to 1000
|
|
424
|
+
// https://github.com/Koenkk/zigbee-herdsman-converters/issues/3066
|
|
425
|
+
data.endpoint.saveClusterAttributeKeyValue('seMetering', {divisor: 1000, multiplier: 1});
|
|
426
|
+
}
|
|
427
|
+
},
|
|
428
|
+
},
|
|
429
|
+
{
|
|
430
|
+
zigbeeModel: ['SMSZB-120'],
|
|
431
|
+
model: 'SMSZB-120',
|
|
432
|
+
vendor: 'Develco',
|
|
433
|
+
description: 'Smoke detector with siren',
|
|
434
|
+
fromZigbee: [develco.fz.temperature, fz.battery, fz.ias_smoke_alarm_1_develco, fz.ignore_basic_report,
|
|
435
|
+
fz.ias_enroll, fz.ias_wd, develco.fz.fault_status],
|
|
436
|
+
toZigbee: [tz.warning, tz.ias_max_duration, tz.warning_simple],
|
|
437
|
+
ota: ota.zigbeeOTA,
|
|
438
|
+
meta: {battery: {voltageToPercentage: '3V_2500'}},
|
|
439
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
440
|
+
const endpoint = device.getEndpoint(35);
|
|
441
|
+
|
|
442
|
+
await reporting.bind(endpoint, coordinatorEndpoint, ['genPowerCfg', 'ssIasZone', 'ssIasWd', 'genBasic', 'genBinaryInput']);
|
|
443
|
+
await reporting.batteryVoltage(endpoint);
|
|
444
|
+
await endpoint.read('ssIasZone', ['iasCieAddr', 'zoneState', 'zoneId']);
|
|
445
|
+
await endpoint.read('genBinaryInput', ['reliability', 'statusFlags']);
|
|
446
|
+
await endpoint.read('ssIasWd', ['maxDuration']);
|
|
447
|
+
|
|
448
|
+
const endpoint2 = device.getEndpoint(38);
|
|
449
|
+
await reporting.bind(endpoint2, coordinatorEndpoint, ['msTemperatureMeasurement']);
|
|
450
|
+
await reporting.temperature(endpoint2, {min: constants.repInterval.MINUTE, max: constants.repInterval.MINUTES_10, change: 10});
|
|
451
|
+
|
|
452
|
+
await develco.configure.read_sw_hw_version(device, logger);
|
|
453
|
+
},
|
|
454
|
+
endpoint: (device) => {
|
|
455
|
+
return {default: 35};
|
|
456
|
+
},
|
|
457
|
+
exposes: [e.temperature(), e.battery(), e.smoke(), e.battery_low(), e.test(),
|
|
458
|
+
exposes.numeric('max_duration', ea.ALL).withUnit('s').withValueMin(0).withValueMax(600).withDescription('Duration of Siren'),
|
|
459
|
+
exposes.binary('alarm', ea.SET, 'START', 'OFF').withDescription('Manual Start of Siren'),
|
|
460
|
+
exposes.enum('reliability', ea.STATE, ['no_fault_detected', 'unreliable_other', 'process_error'])
|
|
461
|
+
.withDescription('Indicates reason if any fault'),
|
|
462
|
+
exposes.binary('fault', ea.STATE, true, false).withDescription('Indicates whether the device are in fault state')],
|
|
463
|
+
},
|
|
464
|
+
{
|
|
465
|
+
zigbeeModel: ['HESZB-120'],
|
|
466
|
+
model: 'HESZB-120',
|
|
467
|
+
vendor: 'Develco',
|
|
468
|
+
description: 'Fire detector with siren',
|
|
469
|
+
fromZigbee: [develco.fz.temperature, fz.battery, fz.ias_smoke_alarm_1_develco, fz.ignore_basic_report,
|
|
470
|
+
fz.ias_enroll, fz.ias_wd, develco.fz.fault_status],
|
|
471
|
+
toZigbee: [tz.warning, tz.ias_max_duration, tz.warning_simple],
|
|
472
|
+
meta: {battery: {voltageToPercentage: '3V_2500'}},
|
|
473
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
474
|
+
const endpoint = device.getEndpoint(35);
|
|
475
|
+
|
|
476
|
+
await reporting.bind(endpoint, coordinatorEndpoint, ['genPowerCfg', 'ssIasZone', 'ssIasWd', 'genBasic', 'genBinaryInput']);
|
|
477
|
+
await reporting.batteryVoltage(endpoint);
|
|
478
|
+
await endpoint.read('ssIasZone', ['iasCieAddr', 'zoneState', 'zoneId']);
|
|
479
|
+
await endpoint.read('genBinaryInput', ['reliability', 'statusFlags']);
|
|
480
|
+
await endpoint.read('ssIasWd', ['maxDuration']);
|
|
481
|
+
|
|
482
|
+
const endpoint2 = device.getEndpoint(38);
|
|
483
|
+
await reporting.bind(endpoint2, coordinatorEndpoint, ['msTemperatureMeasurement']);
|
|
484
|
+
await reporting.temperature(endpoint2, {min: constants.repInterval.MINUTE, max: constants.repInterval.MINUTES_10, change: 10});
|
|
485
|
+
|
|
486
|
+
await develco.configure.read_sw_hw_version(device, logger);
|
|
487
|
+
},
|
|
488
|
+
endpoint: (device) => {
|
|
489
|
+
return {default: 35};
|
|
490
|
+
},
|
|
491
|
+
exposes: [e.temperature(), e.battery(), e.smoke(), e.battery_low(), e.test(),
|
|
492
|
+
exposes.numeric('max_duration', ea.ALL).withUnit('s').withValueMin(0).withValueMax(600).withDescription('Duration of Siren'),
|
|
493
|
+
exposes.binary('alarm', ea.SET, 'START', 'OFF').withDescription('Manual Start of Siren'),
|
|
494
|
+
exposes.enum('reliability', ea.STATE, ['no_fault_detected', 'unreliable_other', 'process_error'])
|
|
495
|
+
.withDescription('Indicates reason if any fault'),
|
|
496
|
+
exposes.binary('fault', ea.STATE, true, false).withDescription('Indicates whether the device are in fault state')],
|
|
497
|
+
},
|
|
498
|
+
{
|
|
499
|
+
zigbeeModel: ['WISZB-120'],
|
|
500
|
+
model: 'WISZB-120',
|
|
501
|
+
vendor: 'Develco',
|
|
502
|
+
description: 'Window sensor',
|
|
503
|
+
fromZigbee: [fz.ias_contact_alarm_1, fz.battery, develco.fz.temperature],
|
|
504
|
+
toZigbee: [],
|
|
505
|
+
exposes: [e.contact(), e.battery(), e.battery_low(), e.tamper(), e.temperature()],
|
|
506
|
+
meta: {battery: {voltageToPercentage: '3V_2500'}},
|
|
507
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
508
|
+
const endpoint35 = device.getEndpoint(35);
|
|
509
|
+
const endpoint38 = device.getEndpoint(38);
|
|
510
|
+
await reporting.bind(endpoint35, coordinatorEndpoint, ['genPowerCfg']);
|
|
511
|
+
await reporting.bind(endpoint38, coordinatorEndpoint, ['msTemperatureMeasurement']);
|
|
512
|
+
await reporting.batteryVoltage(endpoint35);
|
|
513
|
+
await reporting.temperature(endpoint38);
|
|
514
|
+
|
|
515
|
+
await develco.configure.read_sw_hw_version(device, logger);
|
|
516
|
+
},
|
|
517
|
+
},
|
|
518
|
+
{
|
|
519
|
+
zigbeeModel: ['WISZB-121'],
|
|
520
|
+
model: 'WISZB-121',
|
|
521
|
+
vendor: 'Develco',
|
|
522
|
+
description: 'Window sensor',
|
|
523
|
+
fromZigbee: [fz.ias_contact_alarm_1],
|
|
524
|
+
toZigbee: [],
|
|
525
|
+
exposes: [e.contact(), e.battery_low()],
|
|
526
|
+
},
|
|
527
|
+
{
|
|
528
|
+
zigbeeModel: ['WISZB-137'],
|
|
529
|
+
model: 'WISZB-137',
|
|
530
|
+
vendor: 'Develco',
|
|
531
|
+
description: 'Vibration sensor',
|
|
532
|
+
fromZigbee: [fz.battery, fz.ias_vibration_alarm_1, fz.temperature],
|
|
533
|
+
toZigbee: [],
|
|
534
|
+
meta: {battery: {voltageToPercentage: '3V_2100'}},
|
|
535
|
+
exposes: [e.battery_low(), e.battery(), e.temperature(), e.vibration(), e.tamper()],
|
|
536
|
+
configure: async (device, coordinatorEndpoint) => {
|
|
537
|
+
const endpoint38 = device.getEndpoint(38);
|
|
538
|
+
await reporting.bind(endpoint38, coordinatorEndpoint, ['msTemperatureMeasurement', 'genPowerCfg']);
|
|
539
|
+
await reporting.temperature(endpoint38);
|
|
540
|
+
await reporting.batteryVoltage(endpoint38);
|
|
541
|
+
},
|
|
542
|
+
},
|
|
543
|
+
{
|
|
544
|
+
zigbeeModel: ['WISZB-138'],
|
|
545
|
+
model: 'WISZB-138',
|
|
546
|
+
vendor: 'Develco',
|
|
547
|
+
description: 'Window sensor',
|
|
548
|
+
fromZigbee: [fz.ias_contact_alarm_1, fz.battery, develco.fz.temperature],
|
|
549
|
+
toZigbee: [],
|
|
550
|
+
exposes: [e.contact(), e.battery(), e.battery_low(), e.temperature()],
|
|
551
|
+
meta: {battery: {voltageToPercentage: '3V_2500'}},
|
|
552
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
553
|
+
const endpoint35 = device.getEndpoint(35);
|
|
554
|
+
const endpoint38 = device.getEndpoint(38);
|
|
555
|
+
await reporting.bind(endpoint35, coordinatorEndpoint, ['genPowerCfg']);
|
|
556
|
+
await reporting.bind(endpoint38, coordinatorEndpoint, ['msTemperatureMeasurement']);
|
|
557
|
+
await reporting.batteryVoltage(endpoint35);
|
|
558
|
+
await reporting.temperature(endpoint38);
|
|
559
|
+
|
|
560
|
+
await develco.configure.read_sw_hw_version(device, logger);
|
|
561
|
+
},
|
|
562
|
+
},
|
|
563
|
+
{
|
|
564
|
+
zigbeeModel: ['MOSZB-130'],
|
|
565
|
+
model: 'MOSZB-130',
|
|
566
|
+
vendor: 'Develco',
|
|
567
|
+
description: 'Motion sensor',
|
|
568
|
+
fromZigbee: [fz.ias_occupancy_alarm_1],
|
|
569
|
+
toZigbee: [],
|
|
570
|
+
exposes: [e.occupancy(), e.battery_low(), e.tamper()],
|
|
571
|
+
},
|
|
572
|
+
{
|
|
573
|
+
zigbeeModel: ['MOSZB-140'],
|
|
574
|
+
model: 'MOSZB-140',
|
|
575
|
+
vendor: 'Develco',
|
|
576
|
+
description: 'Motion sensor',
|
|
577
|
+
fromZigbee: [
|
|
578
|
+
develco.fz.temperature, fz.illuminance, fz.ias_occupancy_alarm_1, fz.battery,
|
|
579
|
+
develco.fz.led_control, develco.fz.ias_occupancy_timeout,
|
|
580
|
+
],
|
|
581
|
+
toZigbee: [develco.tz.led_control, develco.tz.ias_occupancy_timeout],
|
|
582
|
+
exposes: (device, options) => {
|
|
583
|
+
const dynExposes = [];
|
|
584
|
+
dynExposes.push(e.occupancy());
|
|
585
|
+
if (device && device.softwareBuildID && device.softwareBuildID.split('.')[0] >= 3) {
|
|
586
|
+
dynExposes.push(exposes.numeric('occupancy_timeout', ea.ALL).withUnit('second').
|
|
587
|
+
withValueMin(20).withValueMax(65535));
|
|
588
|
+
}
|
|
589
|
+
dynExposes.push(e.temperature());
|
|
590
|
+
dynExposes.push(e.illuminance_lux());
|
|
591
|
+
dynExposes.push(e.tamper());
|
|
592
|
+
dynExposes.push(e.battery_low());
|
|
593
|
+
dynExposes.push(e.battery());
|
|
594
|
+
if (device && device.softwareBuildID && device.softwareBuildID.split('.')[0] >= 4) {
|
|
595
|
+
dynExposes.push(exposes.enum('led_control', ea.ALL, ['off', 'fault_only', 'motion_only', 'both']).
|
|
596
|
+
withDescription('Control LED indicator usage.'));
|
|
597
|
+
}
|
|
598
|
+
dynExposes.push(e.linkquality());
|
|
599
|
+
return dynExposes;
|
|
600
|
+
},
|
|
601
|
+
ota: ota.zigbeeOTA,
|
|
602
|
+
meta: {battery: {voltageToPercentage: '3V_2500'}},
|
|
603
|
+
endpoint: (device) => {
|
|
604
|
+
return {default: 35};
|
|
605
|
+
},
|
|
606
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
607
|
+
const endpoint39 = device.getEndpoint(39);
|
|
608
|
+
await reporting.bind(endpoint39, coordinatorEndpoint, ['msIlluminanceMeasurement']);
|
|
609
|
+
await reporting.illuminance(endpoint39,
|
|
610
|
+
{min: constants.repInterval.MINUTE, max: constants.repInterval.MINUTES_10, change: 500});
|
|
611
|
+
|
|
612
|
+
const endpoint38 = device.getEndpoint(38);
|
|
613
|
+
await reporting.bind(endpoint38, coordinatorEndpoint, ['msTemperatureMeasurement']);
|
|
614
|
+
await reporting.temperature(endpoint38,
|
|
615
|
+
{min: constants.repInterval.MINUTE, max: constants.repInterval.MINUTES_10, change: 100});
|
|
616
|
+
|
|
617
|
+
const endpoint35 = device.getEndpoint(35);
|
|
618
|
+
await reporting.bind(endpoint35, coordinatorEndpoint, ['genPowerCfg']);
|
|
619
|
+
await reporting.batteryVoltage(endpoint35, {min: constants.repInterval.HOUR, max: 43200, change: 100});
|
|
620
|
+
|
|
621
|
+
// zigbee2mqtt#14277 some features are not available on older firmwares
|
|
622
|
+
await develco.configure.read_sw_hw_version(device, logger);
|
|
623
|
+
if (device && device.softwareBuildID && device.softwareBuildID.split('.')[0] >= 3) {
|
|
624
|
+
await endpoint35.read('ssIasZone', ['develcoAlarmOffDelay'], manufacturerOptions);
|
|
625
|
+
}
|
|
626
|
+
if (device && device.softwareBuildID && device.softwareBuildID.split('.')[0] >= 4) {
|
|
627
|
+
await endpoint35.read('genBasic', ['develcoLedControl'], manufacturerOptions);
|
|
628
|
+
}
|
|
629
|
+
},
|
|
630
|
+
},
|
|
631
|
+
{
|
|
632
|
+
zigbeeModel: ['MOSZB-141'],
|
|
633
|
+
model: 'MOSZB-141',
|
|
634
|
+
vendor: 'Develco',
|
|
635
|
+
description: 'Motion sensor',
|
|
636
|
+
fromZigbee: [fz.ias_occupancy_alarm_1],
|
|
637
|
+
toZigbee: [],
|
|
638
|
+
exposes: [e.occupancy(), e.battery_low()],
|
|
639
|
+
},
|
|
640
|
+
{
|
|
641
|
+
zigbeeModel: ['HMSZB-110'],
|
|
642
|
+
model: 'HMSZB-110',
|
|
643
|
+
vendor: 'Develco',
|
|
644
|
+
description: 'Temperature & humidity sensor',
|
|
645
|
+
fromZigbee: [fz.battery, develco.fz.temperature, fz.humidity],
|
|
646
|
+
toZigbee: [],
|
|
647
|
+
exposes: [e.battery(), e.battery_low(), e.temperature(), e.humidity()],
|
|
648
|
+
meta: {battery: {voltageToPercentage: '3V_2500_3200'}},
|
|
649
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
650
|
+
const endpoint = device.getEndpoint(38);
|
|
651
|
+
await reporting.bind(endpoint, coordinatorEndpoint, ['msTemperatureMeasurement', 'msRelativeHumidity', 'genPowerCfg']);
|
|
652
|
+
await reporting.temperature(endpoint, {min: constants.repInterval.MINUTE, max: constants.repInterval.MINUTES_10, change: 10});
|
|
653
|
+
await reporting.humidity(endpoint, {min: constants.repInterval.MINUTE, max: constants.repInterval.MINUTES_10, change: 300});
|
|
654
|
+
await reporting.batteryVoltage(endpoint, {min: constants.repInterval.HOUR, max: 43200, change: 100});
|
|
655
|
+
await develco.configure.read_sw_hw_version(device, logger);
|
|
656
|
+
},
|
|
657
|
+
},
|
|
658
|
+
{
|
|
659
|
+
zigbeeModel: ['ZHEMI101'],
|
|
660
|
+
model: 'ZHEMI101',
|
|
661
|
+
vendor: 'Develco',
|
|
662
|
+
description: 'Energy meter',
|
|
663
|
+
fromZigbee: [develco.fz.metering, develco.fz.pulse_configuration, develco.fz.interface_mode],
|
|
664
|
+
toZigbee: [develco.tz.pulse_configuration, develco.tz.interface_mode, develco.tz.current_summation],
|
|
665
|
+
endpoint: (device) => {
|
|
666
|
+
return {'default': 2};
|
|
667
|
+
},
|
|
668
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
669
|
+
const endpoint = device.getEndpoint(2);
|
|
670
|
+
await reporting.bind(endpoint, coordinatorEndpoint, ['seMetering']);
|
|
671
|
+
await reporting.instantaneousDemand(endpoint);
|
|
672
|
+
await reporting.readMeteringMultiplierDivisor(endpoint);
|
|
673
|
+
},
|
|
674
|
+
exposes: [
|
|
675
|
+
e.power(),
|
|
676
|
+
e.energy(),
|
|
677
|
+
e.battery_low(),
|
|
678
|
+
exposes.numeric('pulse_configuration', ea.ALL).withValueMin(0).withValueMax(65535)
|
|
679
|
+
.withDescription('Pulses per kwh. Default 1000 imp/kWh. Range 0 to 65535'),
|
|
680
|
+
exposes.enum('interface_mode', ea.ALL,
|
|
681
|
+
['electricity', 'gas', 'water', 'kamstrup-kmp', 'linky', 'IEC62056-21', 'DSMR-2.3', 'DSMR-4.0'])
|
|
682
|
+
.withDescription('Operating mode/probe'),
|
|
683
|
+
exposes.numeric('current_summation', ea.SET)
|
|
684
|
+
.withDescription('Current summation value sent to the display. e.g. 570 = 0,570 kWh').withValueMin(0)
|
|
685
|
+
.withValueMax(268435455),
|
|
686
|
+
exposes.binary('check_meter', ea.STATE, true, false)
|
|
687
|
+
.withDescription('Is true if communication problem with meter is experienced'),
|
|
688
|
+
],
|
|
689
|
+
},
|
|
690
|
+
{
|
|
691
|
+
zigbeeModel: ['SMRZB-332'],
|
|
692
|
+
model: 'SMRZB-332',
|
|
693
|
+
vendor: 'Develco',
|
|
694
|
+
description: 'Smart relay DIN',
|
|
695
|
+
fromZigbee: [fz.on_off, develco.fz.metering],
|
|
696
|
+
toZigbee: [tz.on_off],
|
|
697
|
+
exposes: [e.power(), e.energy(), e.switch()],
|
|
698
|
+
endpoint: (device) => {
|
|
699
|
+
return {'default': 2};
|
|
700
|
+
},
|
|
701
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
702
|
+
const endpoint = device.getEndpoint(2);
|
|
703
|
+
await reporting.bind(endpoint, coordinatorEndpoint, ['seMetering']);
|
|
704
|
+
await reporting.instantaneousDemand(endpoint);
|
|
705
|
+
await reporting.readMeteringMultiplierDivisor(endpoint);
|
|
706
|
+
},
|
|
707
|
+
},
|
|
708
|
+
{
|
|
709
|
+
zigbeeModel: ['FLSZB-110'],
|
|
710
|
+
model: 'FLSZB-110',
|
|
711
|
+
vendor: 'Develco',
|
|
712
|
+
description: 'Flood alarm device ',
|
|
713
|
+
fromZigbee: [fz.ias_water_leak_alarm_1, develco.fz.temperature, fz.battery],
|
|
714
|
+
toZigbee: [],
|
|
715
|
+
exposes: [e.battery_low(), e.tamper(), e.water_leak(), e.temperature(), e.battery_voltage()],
|
|
716
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
717
|
+
const endpoint35 = device.getEndpoint(35);
|
|
718
|
+
await reporting.bind(endpoint35, coordinatorEndpoint, ['genPowerCfg']);
|
|
719
|
+
const endpoint38 = device.getEndpoint(38);
|
|
720
|
+
await reporting.temperature(endpoint38);
|
|
721
|
+
},
|
|
722
|
+
},
|
|
723
|
+
{
|
|
724
|
+
zigbeeModel: ['AQSZB-110'],
|
|
725
|
+
model: 'AQSZB-110',
|
|
726
|
+
vendor: 'Develco',
|
|
727
|
+
description: 'Air quality sensor',
|
|
728
|
+
fromZigbee: [develco.fz.voc, develco.fz.voc_battery, develco.fz.temperature, fz.humidity],
|
|
729
|
+
toZigbee: [],
|
|
730
|
+
ota: ota.zigbeeOTA,
|
|
731
|
+
exposes: [
|
|
732
|
+
e.voc(), e.temperature(), e.humidity(),
|
|
733
|
+
e.battery(), e.battery_low(),
|
|
734
|
+
exposes.enum('air_quality', ea.STATE, [
|
|
735
|
+
'excellent', 'good', 'moderate',
|
|
736
|
+
'poor', 'unhealthy', 'out_of_range',
|
|
737
|
+
'unknown']).withDescription('Measured air quality'),
|
|
738
|
+
],
|
|
739
|
+
meta: {battery: {voltageToPercentage: '3V_2500'}},
|
|
740
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
741
|
+
const endpoint = device.getEndpoint(38);
|
|
742
|
+
await reporting.bind(endpoint, coordinatorEndpoint,
|
|
743
|
+
['develcoSpecificAirQuality', 'msTemperatureMeasurement', 'msRelativeHumidity', 'genPowerCfg']);
|
|
744
|
+
await endpoint.configureReporting('develcoSpecificAirQuality', [{attribute: 'measuredValue', minimumReportInterval: 60,
|
|
745
|
+
maximumReportInterval: 3600, reportableChange: 10}], manufacturerOptions);
|
|
746
|
+
await reporting.temperature(endpoint, {min: constants.repInterval.MINUTE, max: constants.repInterval.MINUTES_10, change: 10});
|
|
747
|
+
await reporting.humidity(endpoint, {min: constants.repInterval.MINUTE, max: constants.repInterval.MINUTES_10, change: 300});
|
|
748
|
+
await reporting.batteryVoltage(endpoint, {min: constants.repInterval.HOUR, max: 43200, change: 100});
|
|
749
|
+
|
|
750
|
+
await develco.configure.read_sw_hw_version(device, logger);
|
|
751
|
+
},
|
|
752
|
+
},
|
|
753
|
+
{
|
|
754
|
+
zigbeeModel: ['SIRZB-110'],
|
|
755
|
+
model: 'SIRZB-110',
|
|
756
|
+
vendor: 'Develco',
|
|
757
|
+
description: 'Customizable siren',
|
|
758
|
+
fromZigbee: [develco.fz.temperature, fz.battery, fz.ias_enroll, fz.ias_wd, fz.ias_siren],
|
|
759
|
+
toZigbee: [tz.warning, tz.warning_simple, tz.ias_max_duration, tz.squawk],
|
|
760
|
+
meta: {battery: {voltageToPercentage: '3V_2500'}},
|
|
761
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
762
|
+
const endpoint = device.getEndpoint(43);
|
|
763
|
+
await reporting.bind(endpoint, coordinatorEndpoint, ['genPowerCfg', 'ssIasZone', 'ssIasWd', 'genBasic']);
|
|
764
|
+
await reporting.batteryVoltage(endpoint);
|
|
765
|
+
await endpoint.read('ssIasZone', ['iasCieAddr', 'zoneState', 'zoneId']);
|
|
766
|
+
await endpoint.read('ssIasWd', ['maxDuration']);
|
|
767
|
+
|
|
768
|
+
const endpoint2 = device.getEndpoint(1);
|
|
769
|
+
await reporting.bind(endpoint2, coordinatorEndpoint, ['genOnOff']);
|
|
770
|
+
|
|
771
|
+
await develco.configure.read_sw_hw_version(device, logger);
|
|
772
|
+
},
|
|
773
|
+
endpoint: (device) => {
|
|
774
|
+
return {default: 43};
|
|
775
|
+
},
|
|
776
|
+
exposes: [e.battery(), e.battery_low(), e.test(), e.warning(), e.squawk(),
|
|
777
|
+
exposes.numeric('max_duration', ea.ALL).withUnit('s').withValueMin(0).withValueMax(900)
|
|
778
|
+
.withDescription('Max duration of the siren'),
|
|
779
|
+
exposes.binary('alarm', ea.SET, 'START', 'OFF').withDescription('Manual start of the siren')],
|
|
780
|
+
},
|
|
781
|
+
{
|
|
782
|
+
zigbeeModel: ['KEPZB-110'],
|
|
783
|
+
model: 'KEYZB-110',
|
|
784
|
+
vendor: 'Develco',
|
|
785
|
+
description: 'Keypad',
|
|
786
|
+
whiteLabel: [{vendor: 'Frient', model: 'KEPZB-110'}],
|
|
787
|
+
fromZigbee: [fz.command_arm_with_transaction, fz.battery, fz.command_emergency, fz.ias_no_alarm,
|
|
788
|
+
fz.ignore_iaszone_attreport, fz.ignore_iasace_commandgetpanelstatus],
|
|
789
|
+
toZigbee: [tz.arm_mode],
|
|
790
|
+
exposes: [e.battery(), e.battery_low(), e.battery_voltage(), e.tamper(),
|
|
791
|
+
exposes.text('action_code', ea.STATE).withDescription('Pin code introduced.'),
|
|
792
|
+
exposes.numeric('action_transaction', ea.STATE).withDescription('Last action transaction number.'),
|
|
793
|
+
exposes.text('action_zone', ea.STATE).withDescription('Alarm zone. Default value 23'),
|
|
794
|
+
e.action([
|
|
795
|
+
'disarm', 'arm_day_zones', 'arm_night_zones', 'arm_all_zones', 'exit_delay', 'emergency'])],
|
|
796
|
+
ota: ota.zigbeeOTA,
|
|
797
|
+
meta: {battery: {voltageToPercentage: '4LR6AA1_5v'}},
|
|
798
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
799
|
+
const endpoint = device.getEndpoint(44);
|
|
800
|
+
const clusters = ['genPowerCfg', 'ssIasZone', 'ssIasAce', 'genIdentify'];
|
|
801
|
+
await reporting.bind(endpoint, coordinatorEndpoint, clusters);
|
|
802
|
+
await reporting.batteryVoltage(endpoint);
|
|
803
|
+
},
|
|
804
|
+
endpoint: (device) => {
|
|
805
|
+
return {default: 44};
|
|
806
|
+
},
|
|
807
|
+
onEvent: async (type, data, device) => {
|
|
808
|
+
if (type === 'message' && data.type === 'commandGetPanelStatus' && data.cluster === 'ssIasAce' &&
|
|
809
|
+
globalStore.hasValue(device.getEndpoint(44), 'panelStatus')) {
|
|
810
|
+
const payload = {
|
|
811
|
+
panelstatus: globalStore.getValue(device.getEndpoint(44), 'panelStatus'),
|
|
812
|
+
secondsremain: 0x00, audiblenotif: 0x00, alarmstatus: 0x00,
|
|
813
|
+
};
|
|
814
|
+
await data.endpoint.commandResponse(
|
|
815
|
+
'ssIasAce', 'getPanelStatusRsp', payload, {}, data.meta.zclTransactionSequenceNumber,
|
|
816
|
+
);
|
|
817
|
+
}
|
|
818
|
+
},
|
|
819
|
+
},
|
|
820
|
+
{
|
|
821
|
+
zigbeeModel: ['IOMZB-110'],
|
|
822
|
+
model: 'IOMZB-110',
|
|
823
|
+
vendor: 'Develco',
|
|
824
|
+
description: 'IO module',
|
|
825
|
+
fromZigbee: [fz.on_off, develco.fz.input],
|
|
826
|
+
toZigbee: [tz.on_off, develco.tz.input],
|
|
827
|
+
meta: {multiEndpoint: true},
|
|
828
|
+
exposes: [
|
|
829
|
+
exposes.binary('input', ea.STATE_GET, true, false).withEndpoint('l1').withDescription('State of input 1'),
|
|
830
|
+
exposes.binary('input', ea.STATE_GET, true, false).withEndpoint('l2').withDescription('State of input 2'),
|
|
831
|
+
exposes.binary('input', ea.STATE_GET, true, false).withEndpoint('l3').withDescription('State of input 3'),
|
|
832
|
+
exposes.binary('input', ea.STATE_GET, true, false).withEndpoint('l4').withDescription('State of input 4'),
|
|
833
|
+
exposes.switch().withState('state', true, 'On/off state of switch 1').withEndpoint('l11'),
|
|
834
|
+
exposes.switch().withState('state', true, 'On/off state of switch 2').withEndpoint('l12'),
|
|
835
|
+
],
|
|
836
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
837
|
+
const ep2 = device.getEndpoint(112);
|
|
838
|
+
await reporting.bind(ep2, coordinatorEndpoint, ['genBinaryInput', 'genBasic']);
|
|
839
|
+
await reporting.presentValue(ep2, {min: 0});
|
|
840
|
+
|
|
841
|
+
const ep3 = device.getEndpoint(113);
|
|
842
|
+
await reporting.bind(ep3, coordinatorEndpoint, ['genBinaryInput']);
|
|
843
|
+
await reporting.presentValue(ep3, {min: 0});
|
|
844
|
+
|
|
845
|
+
const ep4 = device.getEndpoint(114);
|
|
846
|
+
await reporting.bind(ep4, coordinatorEndpoint, ['genBinaryInput']);
|
|
847
|
+
await reporting.presentValue(ep4, {min: 0});
|
|
848
|
+
|
|
849
|
+
const ep5 = device.getEndpoint(115);
|
|
850
|
+
await reporting.bind(ep5, coordinatorEndpoint, ['genBinaryInput']);
|
|
851
|
+
await reporting.presentValue(ep5, {min: 0});
|
|
852
|
+
|
|
853
|
+
const ep6 = device.getEndpoint(116);
|
|
854
|
+
await reporting.bind(ep6, coordinatorEndpoint, ['genOnOff', 'genBinaryInput']);
|
|
855
|
+
await reporting.onOff(ep6);
|
|
856
|
+
|
|
857
|
+
const ep7 = device.getEndpoint(117);
|
|
858
|
+
await reporting.bind(ep7, coordinatorEndpoint, ['genOnOff']);
|
|
859
|
+
await reporting.onOff(ep7);
|
|
860
|
+
|
|
861
|
+
await develco.configure.read_sw_hw_version(device, logger);
|
|
862
|
+
},
|
|
863
|
+
|
|
864
|
+
endpoint: (device) => {
|
|
865
|
+
return {'l1': 112, 'l2': 113, 'l3': 114, 'l4': 115, 'l11': 116, 'l12': 117};
|
|
866
|
+
},
|
|
867
|
+
},
|
|
868
|
+
];
|