@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,1039 @@
|
|
|
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 extend = require('../lib/extend');
|
|
7
|
+
const utils = require('../lib/utils');
|
|
8
|
+
const ota = require('../lib/ota');
|
|
9
|
+
const e = exposes.presets;
|
|
10
|
+
const ea = exposes.access;
|
|
11
|
+
|
|
12
|
+
const tzLocal = {
|
|
13
|
+
lift_duration: {
|
|
14
|
+
key: ['lift_duration'],
|
|
15
|
+
convertSet: async (entity, key, value, meta) => {
|
|
16
|
+
await entity.write(0x0102, {0xe000: {value, type: 0x21}}, {manufacturerCode: 0x105e});
|
|
17
|
+
return {state: {lift_duration: value}};
|
|
18
|
+
},
|
|
19
|
+
},
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
const fzLocal = {
|
|
23
|
+
schneider_powertag: {
|
|
24
|
+
cluster: 'greenPower',
|
|
25
|
+
type: ['commandNotification', 'commandCommisioningNotification'],
|
|
26
|
+
convert: async (model, msg, publish, options, meta) => {
|
|
27
|
+
if (msg.type !== 'commandNotification') {
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
const commandID = msg.data.commandID;
|
|
32
|
+
if (utils.hasAlreadyProcessedMessage(msg, model, msg.data.frameCounter, `${msg.device.ieeeAddr}_${commandID}`)) return;
|
|
33
|
+
|
|
34
|
+
const rxAfterTx = (msg.data.options & (1<<11));
|
|
35
|
+
const ret = {};
|
|
36
|
+
|
|
37
|
+
switch (commandID) {
|
|
38
|
+
case 0xA1: {
|
|
39
|
+
const attr = msg.data.commandFrame.attributes;
|
|
40
|
+
const clusterID = msg.data.commandFrame.clusterID;
|
|
41
|
+
|
|
42
|
+
switch (clusterID) {
|
|
43
|
+
case 2820: { // haElectricalMeasurement
|
|
44
|
+
const acCurrentDivisor = attr['acCurrentDivisor'];
|
|
45
|
+
const acVoltageDivisor = attr['acVoltageDivisor'];
|
|
46
|
+
const acFrequencyDivisor = attr['acFrequencyDivisor'];
|
|
47
|
+
const powerDivisor = attr['powerDivisor'];
|
|
48
|
+
|
|
49
|
+
if (attr.hasOwnProperty('rmsVoltage')) {
|
|
50
|
+
ret['voltage_phase_a'] = attr['rmsVoltage'] / acVoltageDivisor;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
if (attr.hasOwnProperty('rmsVoltagePhB')) {
|
|
54
|
+
ret['voltage_phase_b'] = attr['rmsVoltagePhB'] / acVoltageDivisor;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
if (attr.hasOwnProperty('rmsVoltagePhC')) {
|
|
58
|
+
ret['voltage_phase_c'] = attr['rmsVoltagePhC'] / acVoltageDivisor;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
if (attr.hasOwnProperty('19200')) {
|
|
62
|
+
ret['voltage_phase_ab'] = attr['19200'] / acVoltageDivisor;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
if (attr.hasOwnProperty('19456')) {
|
|
66
|
+
ret['voltage_phase_bc'] = attr['19456'] / acVoltageDivisor;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
if (attr.hasOwnProperty('19712')) {
|
|
70
|
+
ret['voltage_phase_ca'] = attr['19712'] / acVoltageDivisor;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
if (attr.hasOwnProperty('rmsCurrent')) {
|
|
74
|
+
ret['current_phase_a'] = attr['rmsCurrent'] / acCurrentDivisor;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
if (attr.hasOwnProperty('rmsCurrentPhB')) {
|
|
78
|
+
ret['current_phase_b'] = attr['rmsCurrentPhB'] / acCurrentDivisor;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
if (attr.hasOwnProperty('rmsCurrentPhC')) {
|
|
82
|
+
ret['current_phase_c'] = attr['rmsCurrentPhC'] / acCurrentDivisor;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
if (attr.hasOwnProperty('totalActivePower')) {
|
|
86
|
+
ret['power'] = attr['totalActivePower'] * 1000 / powerDivisor;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
if (attr.hasOwnProperty('totalApparentPower')) {
|
|
90
|
+
ret['power_apparent'] = attr['totalApparentPower'] * 1000 / powerDivisor;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
if (attr.hasOwnProperty('acFrequency')) {
|
|
94
|
+
ret['ac_frequency'] = attr['acFrequency'] / acFrequencyDivisor;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
if (attr.hasOwnProperty('activePower')) {
|
|
98
|
+
ret['power_phase_a'] = attr['activePower'] * 1000 / powerDivisor;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
if (attr.hasOwnProperty('activePowerPhB')) {
|
|
102
|
+
ret['power_phase_b'] = attr['activePowerPhB'] * 1000 / powerDivisor;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
if (attr.hasOwnProperty('activePowerPhC')) {
|
|
106
|
+
ret['power_phase_c'] = attr['activePowerPhC'] * 1000 / powerDivisor;
|
|
107
|
+
}
|
|
108
|
+
break;
|
|
109
|
+
}
|
|
110
|
+
case 1794: { // seMetering
|
|
111
|
+
const divisor = attr['divisor'];
|
|
112
|
+
|
|
113
|
+
if (attr.hasOwnProperty('currentSummDelivered')) {
|
|
114
|
+
const val = attr['currentSummDelivered'];
|
|
115
|
+
ret['energy'] = ((parseInt(val[0]) << 32) + parseInt(val[1])) / divisor;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
if (attr.hasOwnProperty('16652')) {
|
|
119
|
+
const val = attr['16652'];
|
|
120
|
+
ret['energy_phase_a'] = ((parseInt(val[0]) << 32) + parseInt(val[1])) / divisor;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
if (attr.hasOwnProperty('16908')) {
|
|
124
|
+
const val = attr['16908'];
|
|
125
|
+
ret['energy_phase_b'] = ((parseInt(val[0]) << 32) + parseInt(val[1])) / divisor;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
if (attr.hasOwnProperty('17164')) {
|
|
129
|
+
const val = attr['17164'];
|
|
130
|
+
ret['energy_phase_c'] = ((parseInt(val[0]) << 32) + parseInt(val[1])) / divisor;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
if (attr.hasOwnProperty('powerFactor')) {
|
|
134
|
+
ret['power_factor'] = attr['powerFactor'];
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
break;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
break;
|
|
142
|
+
}
|
|
143
|
+
case 0xA3:
|
|
144
|
+
// Should handle this cluster as well
|
|
145
|
+
break;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
if (rxAfterTx) {
|
|
149
|
+
// Send Schneider specific ACK to make PowerTag happy
|
|
150
|
+
const networkParameters = await msg.device.zh.constructor.adapter.getNetworkParameters();
|
|
151
|
+
const payload = {
|
|
152
|
+
options: 0b000,
|
|
153
|
+
tempMaster: msg.data.gppNwkAddr,
|
|
154
|
+
tempMasterTx: networkParameters.channel - 11,
|
|
155
|
+
srcID: msg.data.srcID,
|
|
156
|
+
gpdCmd: 0xFE,
|
|
157
|
+
gpdPayload: {
|
|
158
|
+
commandID: 0xFE,
|
|
159
|
+
buffer: Buffer.alloc(1), // I hope it's zero initialised
|
|
160
|
+
},
|
|
161
|
+
};
|
|
162
|
+
|
|
163
|
+
await msg.endpoint.commandResponse('greenPower', 'response', payload,
|
|
164
|
+
{
|
|
165
|
+
srcEndpoint: 242,
|
|
166
|
+
disableDefaultResponse: true,
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
return ret;
|
|
171
|
+
},
|
|
172
|
+
},
|
|
173
|
+
};
|
|
174
|
+
|
|
175
|
+
module.exports = [
|
|
176
|
+
{
|
|
177
|
+
zigbeeModel: ['PUCK/SHUTTER/1'],
|
|
178
|
+
model: 'CCT5015-0001',
|
|
179
|
+
vendor: 'Schneider Electric',
|
|
180
|
+
description: 'Roller shutter module',
|
|
181
|
+
fromZigbee: [fz.cover_position_tilt],
|
|
182
|
+
toZigbee: [tz.cover_position_tilt, tz.cover_state, tzLocal.lift_duration],
|
|
183
|
+
exposes: [e.cover_position(), exposes.numeric('lift_duration', ea.STATE_SET).withUnit('seconds')
|
|
184
|
+
.withValueMin(0).withValueMax(300).withDescription('Duration of lift')],
|
|
185
|
+
meta: {coverInverted: true},
|
|
186
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
187
|
+
const endpoint = device.getEndpoint(5);
|
|
188
|
+
await reporting.bind(endpoint, coordinatorEndpoint, ['closuresWindowCovering']);
|
|
189
|
+
await reporting.currentPositionLiftPercentage(endpoint);
|
|
190
|
+
},
|
|
191
|
+
},
|
|
192
|
+
{
|
|
193
|
+
zigbeeModel: ['NHPB/SHUTTER/1'],
|
|
194
|
+
model: 'S520567',
|
|
195
|
+
vendor: 'Schneider Electric',
|
|
196
|
+
description: 'Roller shutter',
|
|
197
|
+
fromZigbee: [fz.cover_position_tilt],
|
|
198
|
+
toZigbee: [tz.cover_position_tilt, tz.cover_state, tzLocal.lift_duration],
|
|
199
|
+
exposes: [e.cover_position(), exposes.numeric('lift_duration', ea.STATE_SET).withUnit('seconds')
|
|
200
|
+
.withValueMin(0).withValueMax(300).withDescription('Duration of lift')],
|
|
201
|
+
meta: {coverInverted: true},
|
|
202
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
203
|
+
const endpoint = device.getEndpoint(5);
|
|
204
|
+
await reporting.bind(endpoint, coordinatorEndpoint, ['closuresWindowCovering']);
|
|
205
|
+
await reporting.currentPositionLiftPercentage(endpoint);
|
|
206
|
+
},
|
|
207
|
+
},
|
|
208
|
+
{
|
|
209
|
+
zigbeeModel: ['iTRV'],
|
|
210
|
+
model: 'WV704R0A0902',
|
|
211
|
+
vendor: 'Schneider Electric',
|
|
212
|
+
description: 'Wiser radiator thermostat',
|
|
213
|
+
fromZigbee: [fz.ignore_basic_report, fz.ignore_haDiagnostic, fz.ignore_genOta, fz.ignore_zclversion_read,
|
|
214
|
+
fz.legacy.wiser_thermostat, fz.legacy.wiser_itrv_battery, fz.hvac_user_interface, fz.wiser_device_info],
|
|
215
|
+
toZigbee: [tz.thermostat_occupied_heating_setpoint, tz.thermostat_keypad_lockout],
|
|
216
|
+
exposes: [exposes.climate().withSetpoint('occupied_heating_setpoint', 7, 30, 1).withLocalTemperature(ea.STATE)
|
|
217
|
+
.withRunningState(['idle', 'heat'], ea.STATE).withPiHeatingDemand()],
|
|
218
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
219
|
+
const endpoint = device.getEndpoint(1);
|
|
220
|
+
const binds = ['genBasic', 'genPowerCfg', 'hvacThermostat', 'haDiagnostic'];
|
|
221
|
+
await reporting.bind(endpoint, coordinatorEndpoint, binds);
|
|
222
|
+
await reporting.batteryVoltage(endpoint);
|
|
223
|
+
await reporting.thermostatTemperature(endpoint);
|
|
224
|
+
await reporting.thermostatOccupiedHeatingSetpoint(endpoint);
|
|
225
|
+
await reporting.thermostatPIHeatingDemand(endpoint);
|
|
226
|
+
// bind of hvacUserInterfaceCfg fails with 'Table Full', does this have any effect?
|
|
227
|
+
await endpoint.configureReporting('hvacUserInterfaceCfg', [{attribute: 'keypadLockout', reportableChange: 1,
|
|
228
|
+
minimumReportInterval: constants.repInterval.MINUTE, maximumReportInterval: constants.repInterval.HOUR}]);
|
|
229
|
+
},
|
|
230
|
+
},
|
|
231
|
+
{
|
|
232
|
+
zigbeeModel: ['U202DST600ZB'],
|
|
233
|
+
model: 'U202DST600ZB',
|
|
234
|
+
vendor: 'Schneider Electric',
|
|
235
|
+
description: 'EZinstall3 2 gang 2x300W dimmer module',
|
|
236
|
+
extend: extend.light_onoff_brightness({noConfigure: true}),
|
|
237
|
+
exposes: [e.light_brightness().withEndpoint('l1'), e.light_brightness().withEndpoint('l2')],
|
|
238
|
+
meta: {multiEndpoint: true},
|
|
239
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
240
|
+
await extend.light_onoff_brightness().configure(device, coordinatorEndpoint, logger);
|
|
241
|
+
const endpoint1 = device.getEndpoint(10);
|
|
242
|
+
await reporting.bind(endpoint1, coordinatorEndpoint, ['genOnOff', 'genLevelCtrl']);
|
|
243
|
+
await reporting.onOff(endpoint1);
|
|
244
|
+
await reporting.brightness(endpoint1);
|
|
245
|
+
const endpoint2 = device.getEndpoint(11);
|
|
246
|
+
await reporting.bind(endpoint2, coordinatorEndpoint, ['genOnOff', 'genLevelCtrl']);
|
|
247
|
+
await reporting.onOff(endpoint2);
|
|
248
|
+
await reporting.brightness(endpoint2);
|
|
249
|
+
},
|
|
250
|
+
endpoint: (device) => {
|
|
251
|
+
return {l1: 10, l2: 11};
|
|
252
|
+
},
|
|
253
|
+
},
|
|
254
|
+
{
|
|
255
|
+
zigbeeModel: ['PUCK/DIMMER/1'],
|
|
256
|
+
model: 'CCT5010-0001',
|
|
257
|
+
vendor: 'Schneider Electric',
|
|
258
|
+
description: 'Micro module dimmer',
|
|
259
|
+
fromZigbee: [...extend.light_onoff_brightness().fromZigbee, fz.wiser_lighting_ballast_configuration],
|
|
260
|
+
toZigbee: [...extend.light_onoff_brightness().toZigbee, tz.ballast_config, tz.wiser_dimmer_mode],
|
|
261
|
+
exposes: [e.light_brightness().withLevelConfig(),
|
|
262
|
+
exposes.numeric('ballast_minimum_level', ea.ALL).withValueMin(1).withValueMax(254)
|
|
263
|
+
.withDescription('Specifies the minimum light output of the ballast'),
|
|
264
|
+
exposes.numeric('ballast_maximum_level', ea.ALL).withValueMin(1).withValueMax(254)
|
|
265
|
+
.withDescription('Specifies the maximum light output of the ballast'),
|
|
266
|
+
exposes.enum('dimmer_mode', ea.ALL, ['auto', 'rc', 'rl', 'rl_led'])
|
|
267
|
+
.withDescription('Sets dimming mode to autodetect or fixed RC/RL/RL_LED mode (max load is reduced in RL_LED)')],
|
|
268
|
+
whiteLabel: [{vendor: 'Elko', model: 'EKO07090'}],
|
|
269
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
270
|
+
await extend.light_onoff_brightness().configure(device, coordinatorEndpoint, logger);
|
|
271
|
+
const endpoint = device.getEndpoint(3);
|
|
272
|
+
await reporting.bind(endpoint, coordinatorEndpoint, ['genOnOff', 'genLevelCtrl', 'lightingBallastCfg']);
|
|
273
|
+
await reporting.onOff(endpoint);
|
|
274
|
+
await reporting.brightness(endpoint);
|
|
275
|
+
},
|
|
276
|
+
},
|
|
277
|
+
{
|
|
278
|
+
zigbeeModel: ['PUCK/SWITCH/1'],
|
|
279
|
+
model: 'CCT5011-0001/CCT5011-0002/MEG5011-0001',
|
|
280
|
+
vendor: 'Schneider Electric',
|
|
281
|
+
description: 'Micro module switch',
|
|
282
|
+
extend: extend.switch({disablePowerOnBehavior: true}),
|
|
283
|
+
whiteLabel: [{vendor: 'Elko', model: 'EKO07144'}],
|
|
284
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
285
|
+
const endpoint = device.getEndpoint(1);
|
|
286
|
+
await reporting.bind(endpoint, coordinatorEndpoint, ['genOnOff']);
|
|
287
|
+
await reporting.onOff(endpoint);
|
|
288
|
+
},
|
|
289
|
+
},
|
|
290
|
+
{
|
|
291
|
+
zigbeeModel: ['NHROTARY/DIMMER/1'],
|
|
292
|
+
model: 'WDE002334',
|
|
293
|
+
vendor: 'Schneider Electric',
|
|
294
|
+
description: 'Rotary dimmer',
|
|
295
|
+
fromZigbee: [fz.on_off, fz.brightness, fz.level_config, fz.wiser_lighting_ballast_configuration],
|
|
296
|
+
toZigbee: [tz.light_onoff_brightness, tz.level_config, tz.ballast_config, tz.wiser_dimmer_mode],
|
|
297
|
+
exposes: [e.light_brightness().withLevelConfig(),
|
|
298
|
+
exposes.numeric('ballast_minimum_level', ea.ALL).withValueMin(1).withValueMax(254)
|
|
299
|
+
.withDescription('Specifies the minimum light output of the ballast'),
|
|
300
|
+
exposes.numeric('ballast_maximum_level', ea.ALL).withValueMin(1).withValueMax(254)
|
|
301
|
+
.withDescription('Specifies the maximum light output of the ballast'),
|
|
302
|
+
exposes.enum('dimmer_mode', ea.ALL, ['auto', 'rc', 'rl', 'rl_led'])
|
|
303
|
+
.withDescription('Sets dimming mode to autodetect or fixed RC/RL/RL_LED mode (max load is reduced in RL_LED)')],
|
|
304
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
305
|
+
const endpoint = device.getEndpoint(3);
|
|
306
|
+
await reporting.bind(endpoint, coordinatorEndpoint, ['genOnOff', 'genLevelCtrl', 'lightingBallastCfg']);
|
|
307
|
+
await reporting.onOff(endpoint);
|
|
308
|
+
await reporting.brightness(endpoint);
|
|
309
|
+
},
|
|
310
|
+
},
|
|
311
|
+
{
|
|
312
|
+
zigbeeModel: ['NHROTARY/UNIDIM/1'],
|
|
313
|
+
model: 'WDE002961',
|
|
314
|
+
vendor: 'Schneider Electric',
|
|
315
|
+
description: 'Rotary dimmer',
|
|
316
|
+
fromZigbee: [fz.on_off, fz.brightness, fz.level_config, fz.wiser_lighting_ballast_configuration],
|
|
317
|
+
toZigbee: [tz.light_onoff_brightness, tz.level_config, tz.ballast_config, tz.wiser_dimmer_mode],
|
|
318
|
+
exposes: [e.light_brightness().withLevelConfig(),
|
|
319
|
+
exposes.numeric('ballast_minimum_level', ea.ALL).withValueMin(1).withValueMax(254)
|
|
320
|
+
.withDescription('Specifies the minimum light output of the ballast'),
|
|
321
|
+
exposes.numeric('ballast_maximum_level', ea.ALL).withValueMin(1).withValueMax(254)
|
|
322
|
+
.withDescription('Specifies the maximum light output of the ballast'),
|
|
323
|
+
exposes.enum('dimmer_mode', ea.ALL, ['auto', 'rc', 'rl', 'rl_led'])
|
|
324
|
+
.withDescription('Sets dimming mode to autodetect or fixed RC/RL/RL_LED mode (max load is reduced in RL_LED)')],
|
|
325
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
326
|
+
const endpoint = device.getEndpoint(3);
|
|
327
|
+
await reporting.bind(endpoint, coordinatorEndpoint, ['genOnOff', 'genLevelCtrl', 'lightingBallastCfg']);
|
|
328
|
+
await reporting.onOff(endpoint);
|
|
329
|
+
await reporting.brightness(endpoint);
|
|
330
|
+
},
|
|
331
|
+
},
|
|
332
|
+
{
|
|
333
|
+
zigbeeModel: ['NHPB/DIMMER/1'],
|
|
334
|
+
model: 'WDE002386',
|
|
335
|
+
vendor: 'Schneider Electric',
|
|
336
|
+
description: 'Push button dimmer',
|
|
337
|
+
fromZigbee: [fz.on_off, fz.brightness, fz.level_config, fz.lighting_ballast_configuration],
|
|
338
|
+
toZigbee: [tz.light_onoff_brightness, tz.level_config, tz.ballast_config],
|
|
339
|
+
exposes: [e.light_brightness().withLevelConfig(),
|
|
340
|
+
exposes.numeric('ballast_minimum_level', ea.ALL).withValueMin(1).withValueMax(254)
|
|
341
|
+
.withDescription('Specifies the minimum light output of the ballast'),
|
|
342
|
+
exposes.numeric('ballast_maximum_level', ea.ALL).withValueMin(1).withValueMax(254)
|
|
343
|
+
.withDescription('Specifies the maximum light output of the ballast')],
|
|
344
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
345
|
+
const endpoint = device.getEndpoint(3);
|
|
346
|
+
await reporting.bind(endpoint, coordinatorEndpoint, ['genOnOff', 'genLevelCtrl', 'lightingBallastCfg']);
|
|
347
|
+
await reporting.onOff(endpoint);
|
|
348
|
+
await reporting.brightness(endpoint);
|
|
349
|
+
},
|
|
350
|
+
},
|
|
351
|
+
{
|
|
352
|
+
zigbeeModel: ['CH/DIMMER/1'],
|
|
353
|
+
model: '41EPBDWCLMZ/354PBDMBTZ',
|
|
354
|
+
vendor: 'Schneider Electric',
|
|
355
|
+
description: 'Wiser 40/300-Series Module Dimmer',
|
|
356
|
+
fromZigbee: [fz.on_off, fz.brightness, fz.level_config, fz.lighting_ballast_configuration],
|
|
357
|
+
toZigbee: [tz.light_onoff_brightness, tz.level_config, tz.ballast_config],
|
|
358
|
+
exposes: [e.light_brightness(),
|
|
359
|
+
exposes.numeric('ballast_minimum_level', ea.ALL).withValueMin(1).withValueMax(254)
|
|
360
|
+
.withDescription('Specifies the minimum light output of the ballast'),
|
|
361
|
+
exposes.numeric('ballast_maximum_level', ea.ALL).withValueMin(1).withValueMax(254)
|
|
362
|
+
.withDescription('Specifies the maximum light output of the ballast')],
|
|
363
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
364
|
+
const endpoint = device.getEndpoint(3);
|
|
365
|
+
await reporting.bind(endpoint, coordinatorEndpoint, ['genOnOff', 'genLevelCtrl', 'lightingBallastCfg']);
|
|
366
|
+
await reporting.onOff(endpoint);
|
|
367
|
+
await reporting.brightness(endpoint);
|
|
368
|
+
},
|
|
369
|
+
},
|
|
370
|
+
{
|
|
371
|
+
zigbeeModel: ['CH2AX/SWITCH/1'],
|
|
372
|
+
model: '41E2PBSWMZ/356PB2MBTZ',
|
|
373
|
+
vendor: 'Schneider Electric',
|
|
374
|
+
description: 'Wiser 40/300-Series module switch 2A',
|
|
375
|
+
extend: extend.switch(),
|
|
376
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
377
|
+
const endpoint = device.getEndpoint(1);
|
|
378
|
+
await reporting.bind(endpoint, coordinatorEndpoint, ['genOnOff']);
|
|
379
|
+
await reporting.onOff(endpoint);
|
|
380
|
+
},
|
|
381
|
+
},
|
|
382
|
+
{
|
|
383
|
+
zigbeeModel: ['CH10AX/SWITCH/1'],
|
|
384
|
+
model: '41E10PBSWMZ-VW',
|
|
385
|
+
vendor: 'Schneider Electric',
|
|
386
|
+
description: 'Wiser 40/300-Series module switch 10A with ControlLink',
|
|
387
|
+
extend: extend.switch(),
|
|
388
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
389
|
+
const endpoint = device.getEndpoint(1);
|
|
390
|
+
await reporting.bind(endpoint, coordinatorEndpoint, ['genOnOff']);
|
|
391
|
+
await reporting.onOff(endpoint);
|
|
392
|
+
},
|
|
393
|
+
},
|
|
394
|
+
{
|
|
395
|
+
zigbeeModel: ['SMARTPLUG/1'],
|
|
396
|
+
model: 'CCT711119',
|
|
397
|
+
vendor: 'Schneider Electric',
|
|
398
|
+
description: 'Wiser smart plug',
|
|
399
|
+
fromZigbee: [fz.on_off, fz.electrical_measurement, fz.metering, fz.power_on_behavior],
|
|
400
|
+
toZigbee: [tz.on_off, tz.power_on_behavior, tz.electrical_measurement_power],
|
|
401
|
+
exposes: [e.switch(), e.power().withAccess(ea.STATE_GET), e.energy(),
|
|
402
|
+
exposes.enum('power_on_behavior', ea.ALL, ['off', 'previous', 'on'])
|
|
403
|
+
.withDescription('Controls the behaviour when the device is powered on')],
|
|
404
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
405
|
+
const endpoint = device.getEndpoint(1);
|
|
406
|
+
await reporting.bind(endpoint, coordinatorEndpoint, ['genOnOff', 'haElectricalMeasurement', 'seMetering']);
|
|
407
|
+
await reporting.onOff(endpoint);
|
|
408
|
+
// only activePower seems to be support, although compliance document states otherwise
|
|
409
|
+
await endpoint.read('haElectricalMeasurement', ['acPowerMultiplier', 'acPowerDivisor']);
|
|
410
|
+
await reporting.activePower(endpoint);
|
|
411
|
+
await reporting.readMeteringMultiplierDivisor(endpoint);
|
|
412
|
+
await reporting.currentSummDelivered(endpoint, {min: 60, change: 1});
|
|
413
|
+
},
|
|
414
|
+
},
|
|
415
|
+
{
|
|
416
|
+
zigbeeModel: ['U201DST600ZB'],
|
|
417
|
+
model: 'U201DST600ZB',
|
|
418
|
+
vendor: 'Schneider Electric',
|
|
419
|
+
description: 'EZinstall3 1 gang 550W dimmer module',
|
|
420
|
+
extend: extend.light_onoff_brightness({noConfigure: true}),
|
|
421
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
422
|
+
await extend.light_onoff_brightness().configure(device, coordinatorEndpoint, logger);
|
|
423
|
+
const endpoint = device.getEndpoint(10);
|
|
424
|
+
await reporting.bind(endpoint, coordinatorEndpoint, ['genOnOff', 'genLevelCtrl']);
|
|
425
|
+
await reporting.onOff(endpoint);
|
|
426
|
+
await reporting.brightness(endpoint);
|
|
427
|
+
},
|
|
428
|
+
},
|
|
429
|
+
{
|
|
430
|
+
zigbeeModel: ['U201SRY2KWZB'],
|
|
431
|
+
model: 'U201SRY2KWZB',
|
|
432
|
+
vendor: 'Schneider Electric',
|
|
433
|
+
description: 'Ulti 240V 9.1 A 1 gang relay switch impress switch module, amber LED',
|
|
434
|
+
extend: extend.switch(),
|
|
435
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
436
|
+
const endpoint = device.getEndpoint(10);
|
|
437
|
+
await reporting.bind(endpoint, coordinatorEndpoint, ['genOnOff']);
|
|
438
|
+
await reporting.onOff(endpoint);
|
|
439
|
+
},
|
|
440
|
+
},
|
|
441
|
+
{
|
|
442
|
+
zigbeeModel: ['NHPB/SWITCH/1'],
|
|
443
|
+
model: 'S520530W',
|
|
444
|
+
vendor: 'Schneider Electric',
|
|
445
|
+
description: 'Odace connectable relay switch 10A',
|
|
446
|
+
extend: extend.switch(),
|
|
447
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
448
|
+
const endpoint = device.getEndpoint(21);
|
|
449
|
+
await reporting.bind(endpoint, coordinatorEndpoint, ['genOnOff']);
|
|
450
|
+
await reporting.onOff(endpoint);
|
|
451
|
+
},
|
|
452
|
+
},
|
|
453
|
+
{
|
|
454
|
+
zigbeeModel: ['U202SRY2KWZB'],
|
|
455
|
+
model: 'U202SRY2KWZB',
|
|
456
|
+
vendor: 'Schneider Electric',
|
|
457
|
+
description: 'Ulti 240V 9.1 A 2 gangs relay switch impress switch module, amber LED',
|
|
458
|
+
extend: extend.switch(),
|
|
459
|
+
exposes: [e.switch().withEndpoint('l1'), e.switch().withEndpoint('l2')],
|
|
460
|
+
meta: {multiEndpoint: true},
|
|
461
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
462
|
+
const endpoint1 = device.getEndpoint(10);
|
|
463
|
+
await reporting.bind(endpoint1, coordinatorEndpoint, ['genOnOff']);
|
|
464
|
+
await reporting.onOff(endpoint1);
|
|
465
|
+
const endpoint2 = device.getEndpoint(11);
|
|
466
|
+
await reporting.bind(endpoint2, coordinatorEndpoint, ['genOnOff']);
|
|
467
|
+
await reporting.onOff(endpoint2);
|
|
468
|
+
},
|
|
469
|
+
endpoint: (device) => {
|
|
470
|
+
return {l1: 10, l2: 11};
|
|
471
|
+
},
|
|
472
|
+
},
|
|
473
|
+
{
|
|
474
|
+
zigbeeModel: ['1GANG/SHUTTER/1'],
|
|
475
|
+
model: 'MEG5113-0300/MEG5165-0000',
|
|
476
|
+
vendor: 'Schneider Electric',
|
|
477
|
+
description: 'Merten MEG5165 PlusLink Shutter insert with Merten Wiser System M Push Button (1fold)',
|
|
478
|
+
fromZigbee: [fz.cover_position_tilt, fz.command_cover_close, fz.command_cover_open, fz.command_cover_stop],
|
|
479
|
+
toZigbee: [tz.cover_position_tilt, tz.cover_state, tzLocal.lift_duration],
|
|
480
|
+
exposes: [e.cover_position(), exposes.numeric('lift_duration', ea.STATE_SET).withUnit('seconds')
|
|
481
|
+
.withValueMin(0).withValueMax(300).withDescription('Duration of lift')],
|
|
482
|
+
meta: {coverInverted: true},
|
|
483
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
484
|
+
const endpoint = device.getEndpoint(1) || device.getEndpoint(5);
|
|
485
|
+
await reporting.bind(endpoint, coordinatorEndpoint, ['closuresWindowCovering']);
|
|
486
|
+
await reporting.currentPositionLiftPercentage(endpoint);
|
|
487
|
+
},
|
|
488
|
+
},
|
|
489
|
+
{
|
|
490
|
+
zigbeeModel: ['1GANG/SWITCH/1'],
|
|
491
|
+
model: 'MEG5161-0000',
|
|
492
|
+
vendor: 'Schneider Electric',
|
|
493
|
+
description: 'Merten PlusLink relay insert with Merten Wiser system M push button (1fold)',
|
|
494
|
+
extend: extend.switch(),
|
|
495
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
496
|
+
const endpoint = device.getEndpoint(1);
|
|
497
|
+
await reporting.bind(endpoint, coordinatorEndpoint, ['genOnOff']);
|
|
498
|
+
await reporting.onOff(endpoint);
|
|
499
|
+
},
|
|
500
|
+
},
|
|
501
|
+
{
|
|
502
|
+
zigbeeModel: ['LK Switch'],
|
|
503
|
+
model: '545D6514',
|
|
504
|
+
vendor: 'Schneider Electric',
|
|
505
|
+
description: 'LK FUGA wiser wireless double relay',
|
|
506
|
+
meta: {multiEndpoint: true},
|
|
507
|
+
fromZigbee: [fz.on_off, fz.command_on, fz.command_off],
|
|
508
|
+
toZigbee: [tz.on_off],
|
|
509
|
+
endpoint: (device) => {
|
|
510
|
+
return {'l1': 1, 'l2': 2, 's1': 21, 's2': 22, 's3': 23, 's4': 24};
|
|
511
|
+
},
|
|
512
|
+
exposes: [e.switch().withEndpoint('l1'), e.switch().withEndpoint('l2'), e.action(['on_s*', 'off_s*'])],
|
|
513
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
514
|
+
device.endpoints.forEach(async (ep) => {
|
|
515
|
+
if (ep.outputClusters.includes(6) || ep.ID <= 2) {
|
|
516
|
+
await reporting.bind(ep, coordinatorEndpoint, ['genOnOff']);
|
|
517
|
+
if (ep.ID <= 2) {
|
|
518
|
+
await reporting.onOff(ep);
|
|
519
|
+
}
|
|
520
|
+
}
|
|
521
|
+
});
|
|
522
|
+
},
|
|
523
|
+
},
|
|
524
|
+
{
|
|
525
|
+
zigbeeModel: ['LK Dimmer'],
|
|
526
|
+
model: '545D6102',
|
|
527
|
+
vendor: 'Schneider Electric',
|
|
528
|
+
description: 'LK FUGA wiser wireless dimmer',
|
|
529
|
+
fromZigbee: [fz.on_off, fz.brightness, fz.level_config, fz.schneider_lighting_ballast_configuration, fz.command_recall,
|
|
530
|
+
fz.command_on, fz.command_off, fz.command_move, fz.command_stop],
|
|
531
|
+
toZigbee: [tz.light_onoff_brightness, tz.level_config, tz.ballast_config, tz.schneider_dimmer_mode],
|
|
532
|
+
endpoint: (device) => {
|
|
533
|
+
return {'l1': 3, 's1': 21, 's2': 22, 's3': 23, 's4': 24};
|
|
534
|
+
},
|
|
535
|
+
meta: {multiEndpoint: true},
|
|
536
|
+
exposes: [e.light_brightness().withLevelConfig().withEndpoint('l1'),
|
|
537
|
+
exposes.numeric('ballast_minimum_level', ea.ALL).withValueMin(1).withValueMax(254)
|
|
538
|
+
.withDescription('Specifies the minimum light output of the ballast')
|
|
539
|
+
.withEndpoint('l1'),
|
|
540
|
+
exposes.numeric('ballast_maximum_level', ea.ALL).withValueMin(1).withValueMax(254)
|
|
541
|
+
.withDescription('Specifies the maximum light output of the ballast')
|
|
542
|
+
.withEndpoint('l1'),
|
|
543
|
+
exposes.enum('dimmer_mode', ea.ALL, ['RC', 'RL']).withDescription('Controls Capacitive or Inductive Dimming Mode')
|
|
544
|
+
.withEndpoint('l1'),
|
|
545
|
+
e.action(['on', 'off', 'brightness_move_up', 'brightness_move_down', 'brightness_stop', 'recall_*'])],
|
|
546
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
547
|
+
// Configure the dimmer actuator endpoint
|
|
548
|
+
await extend.light_onoff_brightness().configure(device, coordinatorEndpoint, logger);
|
|
549
|
+
const endpoint = device.getEndpoint(3);
|
|
550
|
+
await reporting.bind(endpoint, coordinatorEndpoint, ['genOnOff', 'genLevelCtrl', 'lightingBallastCfg']);
|
|
551
|
+
await reporting.onOff(endpoint);
|
|
552
|
+
await reporting.brightness(endpoint);
|
|
553
|
+
// Configure the four front switches
|
|
554
|
+
device.endpoints.forEach(async (ep) => {
|
|
555
|
+
if (21 <= ep.ID && ep.ID <= 22) {
|
|
556
|
+
await reporting.bind(ep, coordinatorEndpoint, ['genOnOff', 'genLevelCtrl']);
|
|
557
|
+
} else if (23 <= ep.ID && ep.ID <= 24) {
|
|
558
|
+
await reporting.bind(ep, coordinatorEndpoint, ['genScenes']);
|
|
559
|
+
}
|
|
560
|
+
});
|
|
561
|
+
},
|
|
562
|
+
onEvent: async (type, data, device) => {
|
|
563
|
+
// Record the factory default bindings for easy removal/change after deviceInterview
|
|
564
|
+
if (type === 'deviceInterview') {
|
|
565
|
+
const dimmer = device.getEndpoint(3);
|
|
566
|
+
device.endpoints.forEach(async (ep) => {
|
|
567
|
+
if (21 <= ep.ID && ep.ID <= 22) {
|
|
568
|
+
ep.addBinding('genOnOff', dimmer);
|
|
569
|
+
ep.addBinding('genLevelCtrl', dimmer);
|
|
570
|
+
}
|
|
571
|
+
if (23 <= ep.ID && ep.ID <= 24) {
|
|
572
|
+
ep.addBinding('genScenes', dimmer);
|
|
573
|
+
}
|
|
574
|
+
});
|
|
575
|
+
}
|
|
576
|
+
},
|
|
577
|
+
},
|
|
578
|
+
{
|
|
579
|
+
zigbeeModel: ['FLS/AIRLINK/4'],
|
|
580
|
+
model: '550D6001',
|
|
581
|
+
vendor: 'Schneider Electric',
|
|
582
|
+
description: 'LK FUGA wiser wireless battery 4 button switch',
|
|
583
|
+
fromZigbee: [fz.command_on, fz.command_off, fz.command_move, fz.command_stop],
|
|
584
|
+
toZigbee: [],
|
|
585
|
+
endpoint: (device) => {
|
|
586
|
+
return {'top': 21, 'bottom': 22};
|
|
587
|
+
},
|
|
588
|
+
whiteLabel: [{vendor: 'Elko', model: 'EKO07117'}],
|
|
589
|
+
meta: {multiEndpoint: true},
|
|
590
|
+
exposes: [e.action(['on_top', 'off_top', 'on_bottom', 'off_bottom', 'brightness_move_up_top', 'brightness_stop_top',
|
|
591
|
+
'brightness_move_down_top', 'brightness_stop_top', 'brightness_move_up_bottom', 'brightness_stop_bottom',
|
|
592
|
+
'brightness_move_down_bottom', 'brightness_stop_bottom'])],
|
|
593
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
594
|
+
// When in 2-gang operation mode, unit operates out of endpoints 21 and 22, otherwise just 21
|
|
595
|
+
const topButtonsEndpoint = device.getEndpoint(21);
|
|
596
|
+
await reporting.bind(topButtonsEndpoint, coordinatorEndpoint, ['genOnOff', 'genLevelCtrl']);
|
|
597
|
+
const bottomButtonsEndpoint = device.getEndpoint(22);
|
|
598
|
+
await reporting.bind(bottomButtonsEndpoint, coordinatorEndpoint, ['genOnOff', 'genLevelCtrl']);
|
|
599
|
+
},
|
|
600
|
+
},
|
|
601
|
+
{
|
|
602
|
+
fingerprint: [{modelID: 'CCTFR6700', manufacturerName: 'Schneider Electric'}],
|
|
603
|
+
model: 'CCTFR6700',
|
|
604
|
+
vendor: 'Schneider Electric',
|
|
605
|
+
description: 'Heating thermostat',
|
|
606
|
+
fromZigbee: [fz.thermostat, fz.metering, fz.schneider_pilot_mode],
|
|
607
|
+
toZigbee: [tz.schneider_temperature_measured_value, tz.thermostat_system_mode, tz.thermostat_running_state,
|
|
608
|
+
tz.thermostat_local_temperature, tz.thermostat_occupied_heating_setpoint, tz.thermostat_control_sequence_of_operation,
|
|
609
|
+
tz.schneider_pilot_mode, tz.schneider_temperature_measured_value],
|
|
610
|
+
exposes: [e.power(), e.energy(),
|
|
611
|
+
exposes.enum('schneider_pilot_mode', ea.ALL, ['contactor', 'pilot']).withDescription('Controls piloting mode'),
|
|
612
|
+
exposes.climate().withSetpoint('occupied_heating_setpoint', 4, 30, 0.5).withLocalTemperature()
|
|
613
|
+
.withSystemMode(['off', 'auto', 'heat']).withPiHeatingDemand()],
|
|
614
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
615
|
+
const endpoint1 = device.getEndpoint(1);
|
|
616
|
+
const endpoint2 = device.getEndpoint(2);
|
|
617
|
+
await reporting.bind(endpoint1, coordinatorEndpoint, ['hvacThermostat']);
|
|
618
|
+
await reporting.thermostatOccupiedHeatingSetpoint(endpoint1);
|
|
619
|
+
await reporting.thermostatPIHeatingDemand(endpoint1);
|
|
620
|
+
await reporting.bind(endpoint2, coordinatorEndpoint, ['seMetering']);
|
|
621
|
+
await reporting.instantaneousDemand(endpoint2, {min: 0, max: 60, change: 1});
|
|
622
|
+
await reporting.currentSummDelivered(endpoint2, {min: 0, max: 60, change: 1});
|
|
623
|
+
},
|
|
624
|
+
},
|
|
625
|
+
{
|
|
626
|
+
fingerprint: [{modelID: 'Thermostat', manufacturerName: 'Schneider Electric'}],
|
|
627
|
+
model: 'CCTFR6400',
|
|
628
|
+
vendor: 'Schneider Electric',
|
|
629
|
+
description: 'Temperature/Humidity measurement with thermostat interface',
|
|
630
|
+
fromZigbee: [fz.battery, fz.schneider_temperature, fz.humidity, fz.thermostat, fz.schneider_ui_action],
|
|
631
|
+
toZigbee: [tz.schneider_thermostat_system_mode, tz.schneider_thermostat_occupied_heating_setpoint,
|
|
632
|
+
tz.schneider_thermostat_control_sequence_of_operation, tz.schneider_thermostat_pi_heating_demand,
|
|
633
|
+
tz.schneider_thermostat_keypad_lockout],
|
|
634
|
+
exposes: [e.keypad_lockout().withAccess(ea.STATE_SET), e.humidity(), e.battery(), e.battery_voltage(),
|
|
635
|
+
e.action(['screen_sleep', 'screen_wake', 'button_press_plus_down', 'button_press_center_down', 'button_press_minus_down']),
|
|
636
|
+
exposes.climate().withSetpoint('occupied_heating_setpoint', 4, 30, 0.5, ea.SET).withLocalTemperature(ea.STATE)
|
|
637
|
+
.withPiHeatingDemand(ea.SET)],
|
|
638
|
+
meta: {battery: {dontDividePercentage: true}},
|
|
639
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
640
|
+
const endpoint1 = device.getEndpoint(1);
|
|
641
|
+
await reporting.bind(endpoint1, coordinatorEndpoint,
|
|
642
|
+
['genPowerCfg', 'hvacThermostat', 'msTemperatureMeasurement', 'msRelativeHumidity']);
|
|
643
|
+
await reporting.temperature(endpoint1);
|
|
644
|
+
await reporting.humidity(endpoint1);
|
|
645
|
+
await reporting.batteryPercentageRemaining(endpoint1);
|
|
646
|
+
endpoint1.saveClusterAttributeKeyValue('genBasic', {zclVersion: 3});
|
|
647
|
+
endpoint1.saveClusterAttributeKeyValue('hvacThermostat', {schneiderWiserSpecific: 1, systemMode: 4, ctrlSeqeOfOper: 2});
|
|
648
|
+
endpoint1.saveClusterAttributeKeyValue('hvacUserInterfaceCfg', {keypadLockout: 0});
|
|
649
|
+
},
|
|
650
|
+
},
|
|
651
|
+
{
|
|
652
|
+
zigbeeModel: ['EH-ZB-SPD-V2'],
|
|
653
|
+
model: 'EER40030',
|
|
654
|
+
vendor: 'Schneider Electric',
|
|
655
|
+
description: 'Zigbee smart plug with power meter',
|
|
656
|
+
fromZigbee: [fz.on_off, fz.metering],
|
|
657
|
+
toZigbee: [tz.on_off],
|
|
658
|
+
exposes: [e.switch(), e.power(), e.energy()],
|
|
659
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
660
|
+
const endpoint = device.getEndpoint(11);
|
|
661
|
+
const options = {disableDefaultResponse: true};
|
|
662
|
+
await reporting.bind(endpoint, coordinatorEndpoint, ['genOnOff', 'seMetering']);
|
|
663
|
+
await reporting.onOff(endpoint);
|
|
664
|
+
await reporting.readMeteringMultiplierDivisor(endpoint);
|
|
665
|
+
await reporting.instantaneousDemand(endpoint);
|
|
666
|
+
await endpoint.write('genBasic', {0xe050: {value: 1, type: 0x10}}, options);
|
|
667
|
+
},
|
|
668
|
+
},
|
|
669
|
+
{
|
|
670
|
+
zigbeeModel: ['EH-ZB-LMACT'],
|
|
671
|
+
model: 'EER42000',
|
|
672
|
+
vendor: 'Schneider Electric',
|
|
673
|
+
description: 'Zigbee load actuator with power meter',
|
|
674
|
+
fromZigbee: [fz.on_off, fz.metering],
|
|
675
|
+
toZigbee: [tz.on_off],
|
|
676
|
+
exposes: [e.switch(), e.power(), e.energy()],
|
|
677
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
678
|
+
const endpoint = device.getEndpoint(11);
|
|
679
|
+
await reporting.bind(endpoint, coordinatorEndpoint, ['genOnOff', 'seMetering']);
|
|
680
|
+
await reporting.onOff(endpoint);
|
|
681
|
+
await reporting.readMeteringMultiplierDivisor(endpoint);
|
|
682
|
+
await reporting.instantaneousDemand(endpoint);
|
|
683
|
+
},
|
|
684
|
+
},
|
|
685
|
+
{
|
|
686
|
+
zigbeeModel: ['2GANG/SWITCH/2'],
|
|
687
|
+
model: 'MEG5126-0300',
|
|
688
|
+
vendor: 'Schneider Electric',
|
|
689
|
+
description: 'Merten MEG5165 PlusLink relais insert with Merten Wiser System M push button (2fold)',
|
|
690
|
+
extend: extend.switch(),
|
|
691
|
+
exposes: [e.switch().withEndpoint('l1'), e.switch().withEndpoint('l2')],
|
|
692
|
+
meta: {multiEndpoint: true},
|
|
693
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
694
|
+
const endpoint1 = device.getEndpoint(1);
|
|
695
|
+
await reporting.bind(endpoint1, coordinatorEndpoint, ['genOnOff']);
|
|
696
|
+
await reporting.onOff(endpoint1);
|
|
697
|
+
const endpoint2 = device.getEndpoint(2);
|
|
698
|
+
await reporting.bind(endpoint2, coordinatorEndpoint, ['genOnOff']);
|
|
699
|
+
await reporting.onOff(endpoint2);
|
|
700
|
+
},
|
|
701
|
+
endpoint: (device) => {
|
|
702
|
+
return {l1: 1, l2: 2};
|
|
703
|
+
},
|
|
704
|
+
},
|
|
705
|
+
{
|
|
706
|
+
zigbeeModel: ['EH-ZB-VACT'],
|
|
707
|
+
model: 'EER53000',
|
|
708
|
+
vendor: 'Schneider Electric',
|
|
709
|
+
description: 'Wiser radiator thermostat (VACT)',
|
|
710
|
+
fromZigbee: [fz.ignore_basic_report, fz.ignore_genOta, fz.ignore_zclversion_read, fz.battery, fz.hvac_user_interface,
|
|
711
|
+
fz.wiser_smart_thermostat, fz.wiser_smart_thermostat_client, fz.wiser_smart_setpoint_command_client],
|
|
712
|
+
toZigbee: [tz.wiser_sed_thermostat_local_temperature_calibration, tz.wiser_sed_occupied_heating_setpoint,
|
|
713
|
+
tz.wiser_sed_thermostat_keypad_lockout, tz.wiser_vact_calibrate_valve, tz.wiser_sed_zone_mode],
|
|
714
|
+
exposes: [e.battery(),
|
|
715
|
+
exposes.binary('keypad_lockout', ea.STATE_SET, 'lock1', 'unlock')
|
|
716
|
+
.withDescription('Enables/disables physical input on the device'),
|
|
717
|
+
exposes.binary('calibrate_valve', ea.STATE_SET, 'calibrate', 'idle')
|
|
718
|
+
.withDescription('Calibrates valve on next wakeup'),
|
|
719
|
+
exposes.enum('valve_calibration_status',
|
|
720
|
+
ea.STATE, ['ongoing', 'successful', 'uncalibrated', 'failed_e1', 'failed_e2', 'failed_e3']),
|
|
721
|
+
exposes.enum('zone_mode',
|
|
722
|
+
ea.STATE_SET, ['manual', 'schedule', 'energy_saver', 'holiday'])
|
|
723
|
+
.withDescription('Icon shown on device displays'),
|
|
724
|
+
exposes.climate()
|
|
725
|
+
.withSetpoint('occupied_heating_setpoint', 7, 30, 0.5, ea.STATE_SET)
|
|
726
|
+
.withLocalTemperature(ea.STATE)
|
|
727
|
+
.withLocalTemperatureCalibration(-12.8, 12.7, 0.1, ea.STATE_SET)
|
|
728
|
+
.withPiHeatingDemand()],
|
|
729
|
+
meta: {battery: {voltageToPercentage: '3V_2500'}},
|
|
730
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
731
|
+
const endpoint = device.getEndpoint(11);
|
|
732
|
+
// Insert default values for client requested attributes
|
|
733
|
+
endpoint.saveClusterAttributeKeyValue('hvacThermostat', {minHeatSetpointLimit: 7*100});
|
|
734
|
+
endpoint.saveClusterAttributeKeyValue('hvacThermostat', {maxHeatSetpointLimit: 30*100});
|
|
735
|
+
endpoint.saveClusterAttributeKeyValue('hvacThermostat', {occupiedHeatingSetpoint: 20*100});
|
|
736
|
+
endpoint.saveClusterAttributeKeyValue('hvacThermostat', {systemMode: 4});
|
|
737
|
+
// VACT needs binding to endpoint 11 due to some hardcoding in the device
|
|
738
|
+
const coordinatorEndpointB = coordinatorEndpoint.getDevice().getEndpoint(11);
|
|
739
|
+
const binds = ['genBasic', 'genPowerCfg', 'hvacThermostat'];
|
|
740
|
+
await reporting.bind(endpoint, coordinatorEndpointB, binds);
|
|
741
|
+
await reporting.batteryVoltage(endpoint);
|
|
742
|
+
await reporting.thermostatTemperature(endpoint);
|
|
743
|
+
await reporting.thermostatOccupiedHeatingSetpoint(endpoint);
|
|
744
|
+
await endpoint.configureReporting('hvacUserInterfaceCfg', [{attribute: 'keypadLockout',
|
|
745
|
+
minimumReportInterval: constants.repInterval.MINUTE,
|
|
746
|
+
maximumReportInterval: constants.repInterval.HOUR,
|
|
747
|
+
reportableChange: 1}]);
|
|
748
|
+
},
|
|
749
|
+
},
|
|
750
|
+
{
|
|
751
|
+
zigbeeModel: ['EH-ZB-RTS'],
|
|
752
|
+
model: 'EER51000',
|
|
753
|
+
vendor: 'Schneider Electric',
|
|
754
|
+
description: 'Wiser thermostat (RTS)',
|
|
755
|
+
fromZigbee: [fz.ignore_basic_report, fz.ignore_genOta, fz.ignore_zclversion_read, fz.battery, fz.hvac_user_interface,
|
|
756
|
+
fz.wiser_smart_thermostat_client, fz.wiser_smart_setpoint_command_client, fz.schneider_temperature],
|
|
757
|
+
toZigbee: [tz.wiser_sed_zone_mode, tz.wiser_sed_occupied_heating_setpoint],
|
|
758
|
+
exposes: [e.battery(),
|
|
759
|
+
exposes.climate().withSetpoint('occupied_heating_setpoint', 7, 30, 0.5, ea.STATE_SET)
|
|
760
|
+
.withLocalTemperature(ea.STATE),
|
|
761
|
+
exposes.enum('zone_mode',
|
|
762
|
+
ea.STATE_SET, ['manual', 'schedule', 'energy_saver', 'holiday'])
|
|
763
|
+
.withDescription('Icon shown on device displays')],
|
|
764
|
+
meta: {battery: {voltageToPercentage: '4LR6AA1_5v'}},
|
|
765
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
766
|
+
const endpoint = device.getEndpoint(11);
|
|
767
|
+
// Insert default values for client requested attributes
|
|
768
|
+
endpoint.saveClusterAttributeKeyValue('hvacThermostat', {minHeatSetpointLimit: 7*100});
|
|
769
|
+
endpoint.saveClusterAttributeKeyValue('hvacThermostat', {maxHeatSetpointLimit: 30*100});
|
|
770
|
+
endpoint.saveClusterAttributeKeyValue('hvacThermostat', {occupiedHeatingSetpoint: 20*100});
|
|
771
|
+
endpoint.saveClusterAttributeKeyValue('hvacThermostat', {systemMode: 4});
|
|
772
|
+
// RTS needs binding to endpoint 11 due to some hardcoding in the device
|
|
773
|
+
const coordinatorEndpointB = coordinatorEndpoint.getDevice().getEndpoint(11);
|
|
774
|
+
const binds = ['genBasic', 'genPowerCfg', 'genIdentify', 'genAlarms', 'genOta', 'hvacThermostat',
|
|
775
|
+
'hvacUserInterfaceCfg', 'msTemperatureMeasurement'];
|
|
776
|
+
await reporting.bind(endpoint, coordinatorEndpointB, binds);
|
|
777
|
+
// Battery reports without config once a day, do the first read manually
|
|
778
|
+
await endpoint.read('genPowerCfg', ['batteryVoltage']);
|
|
779
|
+
await endpoint.configureReporting('msTemperatureMeasurement', [{attribute: 'measuredValue',
|
|
780
|
+
minimumReportInterval: constants.repInterval.MINUTE,
|
|
781
|
+
maximumReportInterval: constants.repInterval.MINUTES_10,
|
|
782
|
+
reportableChange: 50}]);
|
|
783
|
+
},
|
|
784
|
+
},
|
|
785
|
+
{
|
|
786
|
+
zigbeeModel: ['EH-ZB-HACT'],
|
|
787
|
+
model: 'EER50000',
|
|
788
|
+
vendor: 'Schneider Electric',
|
|
789
|
+
description: 'Wiser H-Relay (HACT)',
|
|
790
|
+
fromZigbee: [fz.ignore_basic_report, fz.ignore_genOta, fz.ignore_zclversion_read, fz.wiser_smart_thermostat, fz.metering,
|
|
791
|
+
fz.identify],
|
|
792
|
+
toZigbee: [tz.thermostat_local_temperature, tz.thermostat_occupied_heating_setpoint, tz.wiser_fip_setting,
|
|
793
|
+
tz.wiser_hact_config, tz.wiser_zone_mode, tz.identify],
|
|
794
|
+
exposes: [exposes.climate().withSetpoint('occupied_heating_setpoint', 7, 30, 0.5).withLocalTemperature(),
|
|
795
|
+
e.power(), e.energy(),
|
|
796
|
+
exposes.enum('identify', ea.SET, ['0', '30', '60', '600', '900']).withDescription('Flash green tag for x seconds'),
|
|
797
|
+
exposes.enum('zone_mode',
|
|
798
|
+
ea.ALL, ['manual', 'schedule', 'energy_saver', 'holiday']),
|
|
799
|
+
exposes.enum('hact_config',
|
|
800
|
+
ea.ALL, ['unconfigured', 'setpoint_switch', 'setpoint_fip', 'fip_fip'])
|
|
801
|
+
.withDescription('Input (command) and output (control) behavior of actuator'),
|
|
802
|
+
exposes.enum('fip_setting',
|
|
803
|
+
ea.ALL, ['comfort', 'comfort_-1', 'comfort_-2', 'energy_saving', 'frost_protection', 'off'])
|
|
804
|
+
.withDescription('Output signal when operating in fil pilote mode (fip_fip)')],
|
|
805
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
806
|
+
const endpoint = device.getEndpoint(11);
|
|
807
|
+
const binds = ['genBasic', 'genPowerCfg', 'hvacThermostat', 'msTemperatureMeasurement', 'seMetering'];
|
|
808
|
+
await reporting.bind(endpoint, coordinatorEndpoint, binds);
|
|
809
|
+
await reporting.thermostatOccupiedHeatingSetpoint(endpoint);
|
|
810
|
+
await reporting.readMeteringMultiplierDivisor(endpoint);
|
|
811
|
+
await reporting.instantaneousDemand(endpoint);
|
|
812
|
+
},
|
|
813
|
+
},
|
|
814
|
+
{
|
|
815
|
+
zigbeeModel: ['FLS/SYSTEM-M/4'],
|
|
816
|
+
model: 'WDE002906',
|
|
817
|
+
vendor: 'Schneider Electric',
|
|
818
|
+
description: 'Wiser wireless switch 1-gang or 2-gang',
|
|
819
|
+
fromZigbee: [fz.command_on, fz.command_off, fz.command_move, fz.command_stop, fz.battery],
|
|
820
|
+
toZigbee: [],
|
|
821
|
+
endpoint: (device) => {
|
|
822
|
+
return {'right': 21, 'left': 22};
|
|
823
|
+
},
|
|
824
|
+
meta: {multiEndpoint: true},
|
|
825
|
+
exposes: [e.action(['on_left', 'off_left', 'on_right', 'off_right', 'brightness_move_up_left', 'brightness_stop_left',
|
|
826
|
+
'brightness_move_down_left', 'brightness_stop_left', 'brightness_move_up_right', 'brightness_stop_right',
|
|
827
|
+
'brightness_move_down_right', 'brightness_stop_right']), e.battery()],
|
|
828
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
829
|
+
// When in 2-gang operation mode, unit operates out of endpoints 21 and 22, otherwise just 21
|
|
830
|
+
const leftButtonsEndpoint = device.getEndpoint(21);
|
|
831
|
+
await reporting.bind(leftButtonsEndpoint, coordinatorEndpoint, ['genOnOff', 'genLevelCtrl', 'genPowerCfg']);
|
|
832
|
+
const rightButtonsEndpoint = device.getEndpoint(22);
|
|
833
|
+
await reporting.bind(rightButtonsEndpoint, coordinatorEndpoint, ['genOnOff', 'genLevelCtrl']);
|
|
834
|
+
await reporting.batteryPercentageRemaining(leftButtonsEndpoint);
|
|
835
|
+
},
|
|
836
|
+
},
|
|
837
|
+
{
|
|
838
|
+
zigbeeModel: ['SOCKET/OUTLET/2'],
|
|
839
|
+
model: 'EKO09738',
|
|
840
|
+
vendor: 'Schneider Electric',
|
|
841
|
+
description: 'Zigbee smart socket with power meter',
|
|
842
|
+
fromZigbee: [fz.on_off, fz.electrical_measurement, fz.EKO09738_metering, fz.power_on_behavior],
|
|
843
|
+
toZigbee: [tz.on_off, tz.power_on_behavior],
|
|
844
|
+
exposes: [e.switch(), e.power(), e.energy(), exposes.enum('power_on_behavior', ea.ALL, ['off', 'previous', 'on'])
|
|
845
|
+
.withDescription('Controls the behaviour when the device is powered on'), e.current(), e.voltage()],
|
|
846
|
+
whiteLabel: [{vendor: 'Elko', model: 'EKO09738', description: 'SmartStikk'}],
|
|
847
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
848
|
+
const endpoint = device.getEndpoint(6);
|
|
849
|
+
await reporting.bind(endpoint, coordinatorEndpoint, ['genOnOff', 'haElectricalMeasurement', 'seMetering']);
|
|
850
|
+
await reporting.onOff(endpoint);
|
|
851
|
+
// Unit supports acVoltage and acCurrent, but only acCurrent divisor/multiplier can be read
|
|
852
|
+
await endpoint.read('haElectricalMeasurement', ['acCurrentDivisor', 'acCurrentMultiplier']);
|
|
853
|
+
await reporting.readMeteringMultiplierDivisor(endpoint);
|
|
854
|
+
},
|
|
855
|
+
},
|
|
856
|
+
{
|
|
857
|
+
zigbeeModel: ['SOCKET/OUTLET/1'],
|
|
858
|
+
model: 'EKO09716',
|
|
859
|
+
vendor: 'Schneider Electric',
|
|
860
|
+
description: 'Zigbee smart socket with power meter',
|
|
861
|
+
fromZigbee: [fz.on_off, fz.electrical_measurement, fz.EKO09738_metering, fz.power_on_behavior],
|
|
862
|
+
toZigbee: [tz.on_off, tz.power_on_behavior],
|
|
863
|
+
exposes: [e.switch(), e.power(), e.energy(), exposes.enum('power_on_behavior', ea.ALL, ['off', 'previous', 'on'])
|
|
864
|
+
.withDescription('Controls the behaviour when the device is powered on'), e.current(), e.voltage()],
|
|
865
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
866
|
+
const endpoint = device.getEndpoint(6);
|
|
867
|
+
await reporting.bind(endpoint, coordinatorEndpoint, ['genOnOff', 'haElectricalMeasurement', 'seMetering']);
|
|
868
|
+
await reporting.onOff(endpoint);
|
|
869
|
+
// Unit supports acVoltage and acCurrent, but only acCurrent divisor/multiplier can be read
|
|
870
|
+
await endpoint.read('haElectricalMeasurement', ['acCurrentDivisor', 'acCurrentMultiplier']);
|
|
871
|
+
await reporting.readMeteringMultiplierDivisor(endpoint);
|
|
872
|
+
},
|
|
873
|
+
},
|
|
874
|
+
{
|
|
875
|
+
zigbeeModel: ['LK/OUTLET/1'],
|
|
876
|
+
model: '545D6115',
|
|
877
|
+
vendor: 'Schneider Electric',
|
|
878
|
+
description: 'LK FUGA wiser wireless socket outlet',
|
|
879
|
+
fromZigbee: [fz.on_off, fz.electrical_measurement, fz.EKO09738_metering, fz.power_on_behavior],
|
|
880
|
+
toZigbee: [tz.on_off, tz.power_on_behavior],
|
|
881
|
+
exposes: [e.switch(), e.power(), e.energy(), e.current(), e.voltage(),
|
|
882
|
+
exposes.enum('power_on_behavior', ea.ALL, ['off', 'previous', 'on'])
|
|
883
|
+
.withDescription('Controls the behaviour when the device is powered on')],
|
|
884
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
885
|
+
const endpoint = device.getEndpoint(6);
|
|
886
|
+
await reporting.bind(endpoint, coordinatorEndpoint, ['genOnOff', 'haElectricalMeasurement', 'seMetering']);
|
|
887
|
+
await reporting.onOff(endpoint);
|
|
888
|
+
// Unit supports acVoltage and acCurrent, but only acCurrent divisor/multiplier can be read
|
|
889
|
+
await endpoint.read('haElectricalMeasurement', ['acCurrentDivisor', 'acCurrentMultiplier']);
|
|
890
|
+
await reporting.readMeteringMultiplierDivisor(endpoint);
|
|
891
|
+
await reporting.currentSummDelivered(endpoint, {min: 60, change: 1});
|
|
892
|
+
},
|
|
893
|
+
},
|
|
894
|
+
{
|
|
895
|
+
zigbeeModel: ['NHMOTION/SWITCH/1'],
|
|
896
|
+
model: '545D6306',
|
|
897
|
+
vendor: 'Schneider Electric',
|
|
898
|
+
description: 'LK FUGA Wiser wireless PIR with relay',
|
|
899
|
+
fromZigbee: [fz.on_off, fz.illuminance, fz.occupancy, fz.occupancy_timeout],
|
|
900
|
+
exposes: [e.switch().withEndpoint('l1'), e.occupancy(), e.illuminance_lux(), e.illuminance(),
|
|
901
|
+
exposes.numeric('occupancy_timeout', ea.ALL).withUnit('second').withValueMin(0).withValueMax(3600)
|
|
902
|
+
.withDescription('Time in seconds after which occupancy is cleared after detecting it')],
|
|
903
|
+
toZigbee: [tz.on_off, tz.occupancy_timeout],
|
|
904
|
+
endpoint: (device) => {
|
|
905
|
+
return {'default': 37, 'l1': 1, 'l2': 37};
|
|
906
|
+
},
|
|
907
|
+
meta: {multiEndpoint: true},
|
|
908
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
909
|
+
const endpoint1 = device.getEndpoint(1);
|
|
910
|
+
const binds1 = ['genBasic', 'genIdentify', 'genOnOff'];
|
|
911
|
+
await reporting.bind(endpoint1, coordinatorEndpoint, binds1);
|
|
912
|
+
await reporting.onOff(endpoint1);
|
|
913
|
+
// read switch state
|
|
914
|
+
await endpoint1.read('genOnOff', ['onOff']);
|
|
915
|
+
|
|
916
|
+
const endpoint37 = device.getEndpoint(37);
|
|
917
|
+
const binds37 = ['msIlluminanceMeasurement', 'msOccupancySensing'];
|
|
918
|
+
await reporting.bind(endpoint37, coordinatorEndpoint, binds37);
|
|
919
|
+
await reporting.occupancy(endpoint37);
|
|
920
|
+
await reporting.illuminance(endpoint37);
|
|
921
|
+
// read occupancy_timeout
|
|
922
|
+
await endpoint37.read('msOccupancySensing', ['pirOToUDelay']);
|
|
923
|
+
},
|
|
924
|
+
},
|
|
925
|
+
{
|
|
926
|
+
zigbeeModel: ['CCT595011_AS'],
|
|
927
|
+
model: 'CCT595011',
|
|
928
|
+
vendor: 'Schneider Electric',
|
|
929
|
+
description: 'Wiser motion sensor',
|
|
930
|
+
fromZigbee: [fz.battery, fz.ias_enroll, fz.ias_occupancy_only_alarm_2, fz.illuminance],
|
|
931
|
+
toZigbee: [],
|
|
932
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
933
|
+
const endpoint = device.getEndpoint(1);
|
|
934
|
+
const binds = ['genPowerCfg', 'msIlluminanceMeasurement'];
|
|
935
|
+
await reporting.bind(endpoint, coordinatorEndpoint, binds);
|
|
936
|
+
await reporting.batteryPercentageRemaining(endpoint);
|
|
937
|
+
await reporting.illuminance(endpoint, {min: 15, max: constants.repInterval.HOUR, change: 500});
|
|
938
|
+
},
|
|
939
|
+
exposes: [e.battery(), e.illuminance(), e.illuminance_lux(), e.occupancy()],
|
|
940
|
+
},
|
|
941
|
+
{
|
|
942
|
+
zigbeeModel: ['CH/Socket/2'],
|
|
943
|
+
model: '3025CSGZ',
|
|
944
|
+
vendor: 'Schneider Electric',
|
|
945
|
+
description: 'Dual connected smart socket',
|
|
946
|
+
extend: extend.switch(),
|
|
947
|
+
exposes: [e.switch().withEndpoint('l1'), e.switch().withEndpoint('l2')],
|
|
948
|
+
meta: {multiEndpoint: true},
|
|
949
|
+
endpoint: (device) => {
|
|
950
|
+
return {'l1': 1, 'l2': 2};
|
|
951
|
+
},
|
|
952
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
953
|
+
const endpoint1 = device.getEndpoint(1);
|
|
954
|
+
await reporting.bind(endpoint1, coordinatorEndpoint, ['genOnOff']);
|
|
955
|
+
await reporting.onOff(endpoint1);
|
|
956
|
+
const endpoint2 = device.getEndpoint(2);
|
|
957
|
+
await reporting.bind(endpoint2, coordinatorEndpoint, ['genOnOff']);
|
|
958
|
+
await reporting.onOff(endpoint2);
|
|
959
|
+
},
|
|
960
|
+
},
|
|
961
|
+
{
|
|
962
|
+
zigbeeModel: ['CCT592011_AS'],
|
|
963
|
+
model: 'CCT592011',
|
|
964
|
+
vendor: 'Schneider Electric',
|
|
965
|
+
description: 'Wiser water leakage sensor',
|
|
966
|
+
fromZigbee: [fz.ias_water_leak_alarm_1],
|
|
967
|
+
toZigbee: [],
|
|
968
|
+
exposes: [e.battery_low(), e.water_leak(), e.tamper()],
|
|
969
|
+
},
|
|
970
|
+
{
|
|
971
|
+
fingerprint: [{modelID: 'GreenPower_254', ieeeAddr: /^0x00000000e.......$/}],
|
|
972
|
+
model: 'A9MEM1570',
|
|
973
|
+
vendor: 'Schneider Electric',
|
|
974
|
+
description: 'PowerTag power sensor',
|
|
975
|
+
fromZigbee: [fzLocal.schneider_powertag],
|
|
976
|
+
toZigbee: [],
|
|
977
|
+
exposes: [
|
|
978
|
+
e.power(),
|
|
979
|
+
e.power_apparent(),
|
|
980
|
+
exposes.numeric('power_phase_a', ea.STATE).withUnit('W').withDescription('Instantaneous measured power on phase A'),
|
|
981
|
+
exposes.numeric('power_phase_b', ea.STATE).withUnit('W').withDescription('Instantaneous measured power on phase B'),
|
|
982
|
+
exposes.numeric('power_phase_c', ea.STATE).withUnit('W').withDescription('Instantaneous measured power on phase C'),
|
|
983
|
+
e.power_factor(),
|
|
984
|
+
e.energy(),
|
|
985
|
+
exposes.numeric('energy_phase_a', ea.STATE).withUnit('kWh').withDescription('Sum of consumed energy on phase A'),
|
|
986
|
+
exposes.numeric('energy_phase_b', ea.STATE).withUnit('kWh').withDescription('Sum of consumed energy on phase B'),
|
|
987
|
+
exposes.numeric('energy_phase_c', ea.STATE).withUnit('kWh').withDescription('Sum of consumed energy on phase C'),
|
|
988
|
+
e.ac_frequency(),
|
|
989
|
+
exposes.numeric('voltage_phase_a', ea.STATE).withUnit('V').withDescription('Measured electrical potential value on phase A'),
|
|
990
|
+
exposes.numeric('voltage_phase_b', ea.STATE).withUnit('V').withDescription('Measured electrical potential value on phase B'),
|
|
991
|
+
exposes.numeric('voltage_phase_c', ea.STATE).withUnit('V').withDescription('Measured electrical potential value on phase C'),
|
|
992
|
+
exposes.numeric('voltage_phase_ab', ea.STATE)
|
|
993
|
+
.withUnit('V').withDescription('Measured electrical potential value between phase A and B'),
|
|
994
|
+
exposes.numeric('voltage_phase_bc', ea.STATE)
|
|
995
|
+
.withUnit('V').withDescription('Measured electrical potential value between phase B and C'),
|
|
996
|
+
exposes.numeric('voltage_phase_ca', ea.STATE)
|
|
997
|
+
.withUnit('V').withDescription('Measured electrical potential value between phase C and A'),
|
|
998
|
+
exposes.numeric('current_phase_a', ea.STATE)
|
|
999
|
+
.withUnit('A').withDescription('Instantaneous measured electrical current on phase A'),
|
|
1000
|
+
exposes.numeric('current_phase_b', ea.STATE)
|
|
1001
|
+
.withUnit('A').withDescription('Instantaneous measured electrical current on phase B'),
|
|
1002
|
+
exposes.numeric('current_phase_c', ea.STATE)
|
|
1003
|
+
.withUnit('A').withDescription('Instantaneous measured electrical current on phase C'),
|
|
1004
|
+
],
|
|
1005
|
+
},
|
|
1006
|
+
{
|
|
1007
|
+
zigbeeModel: ['W599001'],
|
|
1008
|
+
model: 'W599001',
|
|
1009
|
+
vendor: 'Schneider Electric',
|
|
1010
|
+
description: 'Wiser smoke alarm',
|
|
1011
|
+
fromZigbee: [fz.temperature, fz.battery, fz.ias_enroll, fz.ias_smoke_alarm_1],
|
|
1012
|
+
toZigbee: [],
|
|
1013
|
+
ota: ota.zigbeeOTA, // local OTA updates are untested
|
|
1014
|
+
exposes: [e.smoke(), e.battery_low(), e.tamper(), e.battery(), e.battery_voltage(),
|
|
1015
|
+
// the temperature readings are unreliable and may need more investigation.
|
|
1016
|
+
e.temperature(),
|
|
1017
|
+
],
|
|
1018
|
+
configure: async (device, coordinatorEndpoint, logger) => {
|
|
1019
|
+
const endpoint = device.getEndpoint(20);
|
|
1020
|
+
const binds = ['msTemperatureMeasurement', 'ssIasZone', 'genPowerCfg'];
|
|
1021
|
+
await reporting.bind(endpoint, coordinatorEndpoint, binds);
|
|
1022
|
+
await reporting.batteryPercentageRemaining(endpoint);
|
|
1023
|
+
await reporting.batteryVoltage(endpoint);
|
|
1024
|
+
await reporting.temperature(endpoint);
|
|
1025
|
+
await endpoint.read('msTemperatureMeasurement', ['measuredValue']);
|
|
1026
|
+
await endpoint.read('ssIasZone', ['iasCieAddr', 'zoneState', 'zoneStatus', 'zoneId']);
|
|
1027
|
+
await endpoint.read('genPowerCfg', ['batteryVoltage', 'batteryPercentageRemaining']);
|
|
1028
|
+
},
|
|
1029
|
+
},
|
|
1030
|
+
{
|
|
1031
|
+
zigbeeModel: ['CCT591011_AS'],
|
|
1032
|
+
model: 'CCT591011_AS',
|
|
1033
|
+
vendor: 'Schneider Electric',
|
|
1034
|
+
description: 'Wiser window/door sensor',
|
|
1035
|
+
fromZigbee: [fz.ias_contact_alarm_1, fz.ias_contact_alarm_1_report],
|
|
1036
|
+
toZigbee: [],
|
|
1037
|
+
exposes: [e.battery_low(), e.contact(), e.tamper()],
|
|
1038
|
+
},
|
|
1039
|
+
];
|