@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.
Files changed (312) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +7 -0
  3. package/converters/fromZigbee.js +8439 -0
  4. package/converters/toZigbee.js +7162 -0
  5. package/devices/ITCommander.js +37 -0
  6. package/devices/RMC002.js +20 -0
  7. package/devices/acova.js +101 -0
  8. package/devices/acuity_brands_lighting.js +11 -0
  9. package/devices/adeo.js +256 -0
  10. package/devices/adurosmart.js +130 -0
  11. package/devices/aeotec.js +13 -0
  12. package/devices/airam.js +59 -0
  13. package/devices/ajax_online.js +49 -0
  14. package/devices/akuvox.js +28 -0
  15. package/devices/alchemy.js +18 -0
  16. package/devices/aldi.js +53 -0
  17. package/devices/alecto.js +98 -0
  18. package/devices/anchor.js +17 -0
  19. package/devices/atlantic.js +110 -0
  20. package/devices/atsmart.js +28 -0
  21. package/devices/aubess.js +21 -0
  22. package/devices/aurora_lighting.js +292 -0
  23. package/devices/automaton.js +44 -0
  24. package/devices/awox.js +184 -0
  25. package/devices/axis.js +22 -0
  26. package/devices/bankamp.js +11 -0
  27. package/devices/bega.js +22 -0
  28. package/devices/belkin.js +11 -0
  29. package/devices/bitron.js +334 -0
  30. package/devices/blaupunkt.js +27 -0
  31. package/devices/blitzwolf.js +47 -0
  32. package/devices/bosch.js +702 -0
  33. package/devices/brimate.js +15 -0
  34. package/devices/bseed.js +17 -0
  35. package/devices/bticino.js +118 -0
  36. package/devices/busch-jaeger.js +140 -0
  37. package/devices/byun.js +24 -0
  38. package/devices/calex.js +37 -0
  39. package/devices/candeo.js +49 -0
  40. package/devices/casaia.js +52 -0
  41. package/devices/centralite.js +359 -0
  42. package/devices/cleode.js +20 -0
  43. package/devices/cleverio.js +36 -0
  44. package/devices/climax.js +138 -0
  45. package/devices/commercial_electric.js +16 -0
  46. package/devices/connecte.js +46 -0
  47. package/devices/cree.js +11 -0
  48. package/devices/ctm.js +999 -0
  49. package/devices/current_products_corp.js +24 -0
  50. package/devices/custom_devices_diy.js +850 -0
  51. package/devices/cy-lighting.js +11 -0
  52. package/devices/danalock.js +26 -0
  53. package/devices/danfoss.js +340 -0
  54. package/devices/databyte.ch.js +55 -0
  55. package/devices/datek.js +246 -0
  56. package/devices/dawon_dns.js +338 -0
  57. package/devices/develco.js +868 -0
  58. package/devices/digi.js +14 -0
  59. package/devices/diyruz.js +305 -0
  60. package/devices/dlink.js +37 -0
  61. package/devices/dnake.js +11 -0
  62. package/devices/dresden_elektronik.js +47 -0
  63. package/devices/easyaccess.js +27 -0
  64. package/devices/eatonhalo_led.js +11 -0
  65. package/devices/echostar.js +25 -0
  66. package/devices/ecodim.js +145 -0
  67. package/devices/ecolink.js +21 -0
  68. package/devices/ecosmart.js +64 -0
  69. package/devices/ecozy.js +31 -0
  70. package/devices/edp.js +39 -0
  71. package/devices/eglo.js +25 -0
  72. package/devices/elko.js +176 -0
  73. package/devices/enbrighten.js +163 -0
  74. package/devices/enocean.js +52 -0
  75. package/devices/envilar.js +73 -0
  76. package/devices/essentialb.js +87 -0
  77. package/devices/eurotronic.js +48 -0
  78. package/devices/evanell.js +29 -0
  79. package/devices/evn.js +31 -0
  80. package/devices/evology.js +24 -0
  81. package/devices/evvr.js +17 -0
  82. package/devices/ewelink.js +184 -0
  83. package/devices/ezex.js +24 -0
  84. package/devices/fantem.js +77 -0
  85. package/devices/feibit.js +172 -0
  86. package/devices/fireangel.js +15 -0
  87. package/devices/frankever.js +23 -0
  88. package/devices/garza.js +11 -0
  89. package/devices/ge.js +111 -0
  90. package/devices/gewiss.js +48 -0
  91. package/devices/gidealed.js +11 -0
  92. package/devices/giderwel.js +11 -0
  93. package/devices/giex.js +222 -0
  94. package/devices/girier.js +19 -0
  95. package/devices/gledopto.js +756 -0
  96. package/devices/gmy.js +11 -0
  97. package/devices/gs.js +29 -0
  98. package/devices/halemeier.js +18 -0
  99. package/devices/hampton_bay.js +37 -0
  100. package/devices/heiman.js +805 -0
  101. package/devices/hej.js +107 -0
  102. package/devices/hfh.js +11 -0
  103. package/devices/hgkg.js +54 -0
  104. package/devices/hilux.js +11 -0
  105. package/devices/hive.js +524 -0
  106. package/devices/home_control_as.js +27 -0
  107. package/devices/hommyn.js +24 -0
  108. package/devices/honyar.js +29 -0
  109. package/devices/hornbach.js +53 -0
  110. package/devices/hzc.js +21 -0
  111. package/devices/hzc_electric.js +42 -0
  112. package/devices/icasa.js +121 -0
  113. package/devices/idinio.js +19 -0
  114. package/devices/ihorn.js +61 -0
  115. package/devices/ikea.js +1168 -0
  116. package/devices/ilightsin.js +11 -0
  117. package/devices/iluminize.js +262 -0
  118. package/devices/ilux.js +11 -0
  119. package/devices/immax.js +203 -0
  120. package/devices/innr.js +705 -0
  121. package/devices/inovelli.js +1315 -0
  122. package/devices/insta.js +110 -0
  123. package/devices/iolloi.js +20 -0
  124. package/devices/iotperfect.js +20 -0
  125. package/devices/iris.js +180 -0
  126. package/devices/istar.js +20 -0
  127. package/devices/jasco.js +55 -0
  128. package/devices/javis.js +37 -0
  129. package/devices/jethome.js +48 -0
  130. package/devices/jiawen.js +18 -0
  131. package/devices/jumitech.js +18 -0
  132. package/devices/jxuan.js +49 -0
  133. package/devices/kami.js +15 -0
  134. package/devices/keen_home.js +80 -0
  135. package/devices/klikaanklikuit.js +17 -0
  136. package/devices/kmpcil.js +148 -0
  137. package/devices/konke.js +141 -0
  138. package/devices/ksentry.js +17 -0
  139. package/devices/kurvia.js +17 -0
  140. package/devices/kwikset.js +120 -0
  141. package/devices/lanesto.js +11 -0
  142. package/devices/lds.js +11 -0
  143. package/devices/led_trading.js +69 -0
  144. package/devices/ledvance.js +353 -0
  145. package/devices/leedarson.js +130 -0
  146. package/devices/legrand.js +554 -0
  147. package/devices/lellki.js +146 -0
  148. package/devices/letsled.js +11 -0
  149. package/devices/letv.js +18 -0
  150. package/devices/leviton.js +142 -0
  151. package/devices/lg.js +18 -0
  152. package/devices/lidl.js +1000 -0
  153. package/devices/lifecontrol.js +92 -0
  154. package/devices/lightsolutions.js +37 -0
  155. package/devices/linkind.js +205 -0
  156. package/devices/livingwise.js +59 -0
  157. package/devices/livolo.js +286 -0
  158. package/devices/lixee.js +779 -0
  159. package/devices/lonsonho.js +218 -0
  160. package/devices/lubeez.js +18 -0
  161. package/devices/lupus.js +74 -0
  162. package/devices/lutron.js +32 -0
  163. package/devices/lux.js +40 -0
  164. package/devices/m-elec.js +18 -0
  165. package/devices/makegood.js +51 -0
  166. package/devices/matcall_bv.js +18 -0
  167. package/devices/meazon.js +47 -0
  168. package/devices/mercator.js +225 -0
  169. package/devices/miboxer.js +72 -0
  170. package/devices/micromatic.js +29 -0
  171. package/devices/moes.js +400 -0
  172. package/devices/mycket.js +11 -0
  173. package/devices/m/303/274ller_licht.js +220 -0
  174. package/devices/namron.js +774 -0
  175. package/devices/nanoleaf.js +11 -0
  176. package/devices/neo.js +86 -0
  177. package/devices/net2grid.js +29 -0
  178. package/devices/netvox.js +35 -0
  179. package/devices/niko.js +314 -0
  180. package/devices/ninja_blocks.js +24 -0
  181. package/devices/niviss.js +11 -0
  182. package/devices/nodon.js +109 -0
  183. package/devices/nordtronic.js +30 -0
  184. package/devices/nous.js +88 -0
  185. package/devices/novo.js +17 -0
  186. package/devices/nue_3a.js +417 -0
  187. package/devices/nyce.js +67 -0
  188. package/devices/onesti.js +59 -0
  189. package/devices/openlumi.js +22 -0
  190. package/devices/orvibo.js +515 -0
  191. package/devices/osram.js +519 -0
  192. package/devices/oujiabao.js +15 -0
  193. package/devices/owon.js +352 -0
  194. package/devices/ozsmartthings.js +11 -0
  195. package/devices/paul_neuhaus.js +96 -0
  196. package/devices/paulmann.js +158 -0
  197. package/devices/peq.js +24 -0
  198. package/devices/perenio.js +413 -0
  199. package/devices/philips.js +3118 -0
  200. package/devices/plaid.js +25 -0
  201. package/devices/plugwise.js +173 -0
  202. package/devices/popp.js +10 -0
  203. package/devices/profalux.js +47 -0
  204. package/devices/prolight.js +54 -0
  205. package/devices/qmotion.js +33 -0
  206. package/devices/qoto.js +113 -0
  207. package/devices/quotra.js +18 -0
  208. package/devices/rademacher.js +18 -0
  209. package/devices/rgb_genie.js +119 -0
  210. package/devices/robb.js +335 -0
  211. package/devices/roome.js +15 -0
  212. package/devices/rtx.js +90 -0
  213. package/devices/salus_controls.js +137 -0
  214. package/devices/samotech.js +93 -0
  215. package/devices/saswell.js +58 -0
  216. package/devices/scanproducts.js +32 -0
  217. package/devices/schlage.js +24 -0
  218. package/devices/schneider_electric.js +1039 -0
  219. package/devices/schwaiger.js +62 -0
  220. package/devices/seastar_intelligence.js +16 -0
  221. package/devices/securifi.js +39 -0
  222. package/devices/sengled.js +332 -0
  223. package/devices/sercomm.js +140 -0
  224. package/devices/shenzhen_homa.js +53 -0
  225. package/devices/shinasystem.js +686 -0
  226. package/devices/siglis.js +440 -0
  227. package/devices/sinope.js +1257 -0
  228. package/devices/siterwell.js +46 -0
  229. package/devices/skydance.js +112 -0
  230. package/devices/slv.js +27 -0
  231. package/devices/smart9.js +27 -0
  232. package/devices/smart_home_pty.js +18 -0
  233. package/devices/smartenit.js +42 -0
  234. package/devices/smartthings.js +495 -0
  235. package/devices/smartwings.js +24 -0
  236. package/devices/sohan_electric.js +13 -0
  237. package/devices/solaredge.js +11 -0
  238. package/devices/somgoms.js +47 -0
  239. package/devices/sonoff.js +262 -0
  240. package/devices/spotmau.js +36 -0
  241. package/devices/sprut.js +317 -0
  242. package/devices/stelpro.js +216 -0
  243. package/devices/sunricher.js +625 -0
  244. package/devices/swann.js +33 -0
  245. package/devices/sylvania.js +200 -0
  246. package/devices/tci.js +25 -0
  247. package/devices/technicolor.js +47 -0
  248. package/devices/terncy.js +64 -0
  249. package/devices/the_light_group.js +70 -0
  250. package/devices/third_reality.js +195 -0
  251. package/devices/titan_products.js +22 -0
  252. package/devices/tplink.js +42 -0
  253. package/devices/trust.js +114 -0
  254. package/devices/tubeszb.js +20 -0
  255. package/devices/tuya.js +4215 -0
  256. package/devices/ubisys.js +938 -0
  257. package/devices/uhome.js +25 -0
  258. package/devices/universal_electronics_inc.js +119 -0
  259. package/devices/urlighting.js +12 -0
  260. package/devices/useelink.js +52 -0
  261. package/devices/vbled.js +18 -0
  262. package/devices/vesternet.js +188 -0
  263. package/devices/viessmann.js +51 -0
  264. package/devices/villeroy_boch.js +18 -0
  265. package/devices/vimar.js +78 -0
  266. package/devices/visonic.js +80 -0
  267. package/devices/vrey.js +18 -0
  268. package/devices/wally.js +25 -0
  269. package/devices/waxman.js +45 -0
  270. package/devices/weiser.js +67 -0
  271. package/devices/weten.js +13 -0
  272. package/devices/wisdom.js +11 -0
  273. package/devices/woox.js +177 -0
  274. package/devices/wyze.js +23 -0
  275. package/devices/xiaomi.js +3223 -0
  276. package/devices/xinghuoyuan.js +11 -0
  277. package/devices/yale.js +227 -0
  278. package/devices/ynoa.js +68 -0
  279. package/devices/yookee.js +23 -0
  280. package/devices/ysrsai.js +26 -0
  281. package/devices/zemismart.js +254 -0
  282. package/devices/zen.js +34 -0
  283. package/devices/zipato.js +11 -0
  284. package/index.js +242 -0
  285. package/lib/color.js +784 -0
  286. package/lib/configureKey.js +944 -0
  287. package/lib/constants.js +316 -0
  288. package/lib/exposes.js +677 -0
  289. package/lib/extend.js +180 -0
  290. package/lib/kelvinToXy.js +1912 -0
  291. package/lib/legacy.js +2223 -0
  292. package/lib/light.js +111 -0
  293. package/lib/ota/OTA_URLs.md +119 -0
  294. package/lib/ota/common.js +476 -0
  295. package/lib/ota/index.js +10 -0
  296. package/lib/ota/inovelli.js +72 -0
  297. package/lib/ota/ledvance.js +52 -0
  298. package/lib/ota/lixee.js +57 -0
  299. package/lib/ota/salus.js +82 -0
  300. package/lib/ota/securifi.js +25 -0
  301. package/lib/ota/tradfri.js +45 -0
  302. package/lib/ota/ubisys.js +61 -0
  303. package/lib/ota/zigbeeOTA.js +161 -0
  304. package/lib/philips.js +667 -0
  305. package/lib/reporting.js +234 -0
  306. package/lib/store.js +57 -0
  307. package/lib/tuya.js +2027 -0
  308. package/lib/utils.js +527 -0
  309. package/lib/xiaomi.d.ts +11 -0
  310. package/lib/xiaomi.js +1288 -0
  311. package/lib/zosung.js +243 -0
  312. package/package.json +39 -0
@@ -0,0 +1,11 @@
1
+ const extend = require('../lib/extend');
2
+
3
+ module.exports = [
4
+ {
5
+ zigbeeModel: ['NL08-0800'],
6
+ model: 'NL08-0800',
7
+ vendor: 'Nanoleaf',
8
+ description: 'Smart Ivy Bulb E27',
9
+ extend: extend.light_onoff_brightness(),
10
+ },
11
+ ];
package/devices/neo.js ADDED
@@ -0,0 +1,86 @@
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 e = exposes.presets;
5
+ const ea = exposes.access;
6
+ const tuya = require('../lib/tuya');
7
+
8
+ module.exports = [
9
+ {
10
+ fingerprint: [{modelID: 'TS0601', manufacturerName: '_TZE200_d0yu2xgi'}],
11
+ zigbeeModel: ['0yu2xgi'],
12
+ model: 'NAS-AB02B0',
13
+ vendor: 'Neo',
14
+ description: 'Temperature & humidity sensor and alarm',
15
+ fromZigbee: [fz.neo_t_h_alarm, fz.ignore_basic_report, fz.ignore_tuya_set_time],
16
+ toZigbee: [tz.neo_t_h_alarm],
17
+ exposes: [
18
+ e.temperature(), e.humidity(), exposes.binary('humidity_alarm', ea.STATE_SET, true, false), e.battery_low(),
19
+ exposes.binary('temperature_alarm', ea.STATE_SET, true, false),
20
+ exposes.binary('alarm', ea.STATE_SET, true, false),
21
+ exposes.enum('melody', ea.STATE_SET, Array.from(Array(18).keys()).map((x)=>(x+1).toString())),
22
+ exposes.numeric('duration', ea.STATE_SET).withUnit('s').withValueMin(0).withValueMax(1800),
23
+ exposes.numeric('temperature_min', ea.STATE_SET).withUnit('°C').withValueMin(-20).withValueMax(80),
24
+ exposes.numeric('temperature_max', ea.STATE_SET).withUnit('°C').withValueMin(-20).withValueMax(80),
25
+ exposes.numeric('humidity_min', ea.STATE_SET).withUnit('%').withValueMin(1).withValueMax(100),
26
+ exposes.numeric('humidity_max', ea.STATE_SET).withUnit('%').withValueMin(1).withValueMax(100),
27
+ exposes.enum('volume', ea.STATE_SET, ['low', 'medium', 'high']),
28
+ exposes.enum('power_type', ea.STATE, ['battery_full', 'battery_high', 'battery_medium', 'battery_low', 'usb']),
29
+ ],
30
+ onEvent: tuya.onEventSetLocalTime,
31
+ configure: async (device, coordinatorEndpoint, logger) => {
32
+ const endpoint = device.getEndpoint(1);
33
+ await endpoint.command('manuSpecificTuya', 'dataQuery', {});
34
+ await endpoint.command('manuSpecificTuya', 'mcuVersionRequest', {'seq': 0x0002});
35
+ },
36
+ },
37
+ {
38
+ fingerprint: [{modelID: 'TS0601', manufacturerName: '_TZE200_t1blo2bj'}, {modelID: 'TS0601', manufacturerName: '_TZE204_t1blo2bj'}],
39
+ zigbeeModel: ['1blo2bj'],
40
+ model: 'NAS-AB02B2',
41
+ vendor: 'Neo',
42
+ description: 'Alarm',
43
+ fromZigbee: [fz.neo_alarm, fz.ignore_basic_report],
44
+ toZigbee: [tz.neo_alarm],
45
+ exposes: [
46
+ e.battery_low(),
47
+ exposes.binary('alarm', ea.STATE_SET, true, false),
48
+ exposes.enum('melody', ea.STATE_SET, Array.from(Array(18).keys()).map((x)=>(x+1).toString())),
49
+ exposes.numeric('duration', ea.STATE_SET).withUnit('s').withValueMin(0).withValueMax(1800),
50
+ exposes.enum('volume', ea.STATE_SET, ['low', 'medium', 'high']),
51
+ exposes.numeric('battpercentage', ea.STATE).withUnit('%'),
52
+ ],
53
+ onEvent: tuya.onEventSetLocalTime,
54
+ configure: async (device, coordinatorEndpoint, logger) => {
55
+ const endpoint = device.getEndpoint(1);
56
+ await endpoint.command('manuSpecificTuya', 'dataQuery', {});
57
+ await endpoint.command('manuSpecificTuya', 'mcuVersionRequest', {'seq': 0x0002});
58
+ },
59
+ },
60
+ {
61
+ fingerprint: [{modelID: 'TS0601', manufacturerName: '_TZE200_7hfcudw5'}],
62
+ model: 'NAS-PD07',
63
+ vendor: 'Neo',
64
+ description: 'Motion, temperature & humidity sensor',
65
+ fromZigbee: [fz.neo_nas_pd07, fz.ignore_tuya_set_time],
66
+ toZigbee: [tz.neo_nas_pd07],
67
+ onEvent: tuya.onEventSetTime,
68
+ exposes: [e.occupancy(), e.humidity(), e.temperature(), e.tamper(), e.battery_low(),
69
+ exposes.enum('power_type', ea.STATE, ['battery_full', 'battery_high', 'battery_medium', 'battery_low', 'usb']),
70
+ exposes.enum('alarm', ea.STATE, ['over_temperature', 'over_humidity', 'below_min_temperature', 'below_min_humdity', 'off'])
71
+ .withDescription('Temperature/humidity alarm status'),
72
+ exposes.numeric('temperature_min', ea.STATE_SET).withUnit('°C').withValueMin(-20).withValueMax(80),
73
+ exposes.numeric('temperature_max', ea.STATE_SET).withUnit('°C').withValueMin(-20).withValueMax(80),
74
+ exposes.binary('temperature_scale', ea.STATE_SET, '°C', '°F').withDescription('Temperature scale (°F/°C)'),
75
+ exposes.numeric('humidity_min', ea.STATE_SET).withUnit('%').withValueMin(1).withValueMax(100),
76
+ exposes.numeric('humidity_max', ea.STATE_SET).withUnit('%').withValueMin(1).withValueMax(100),
77
+ // exposes.binary('unknown_111', ea.STATE_SET, 'ON', 'OFF').withDescription('Unknown datapoint 111 (default: ON)'),
78
+ // exposes.binary('unknown_112', ea.STATE_SET, 'ON', 'OFF').withDescription('Unknown datapoint 112 (default: ON)')
79
+ ],
80
+ configure: async (device, coordinatorEndpoint, logger) => {
81
+ const endpoint = device.getEndpoint(1);
82
+ await tuya.configureMagicPacket(device, coordinatorEndpoint, logger);
83
+ await endpoint.command('manuSpecificTuya', 'mcuVersionRequest', {'seq': 0x0002});
84
+ },
85
+ },
86
+ ];
@@ -0,0 +1,29 @@
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 reporting = require('../lib/reporting');
5
+ const e = exposes.presets;
6
+
7
+ module.exports = [
8
+ {
9
+ zigbeeModel: ['SP31 ', 'SP31'],
10
+ model: 'N2G-SP',
11
+ vendor: 'NET2GRID',
12
+ description: 'White Net2Grid power outlet switch with power meter',
13
+ fromZigbee: [fz.command_on, fz.legacy.genOnOff_cmdOn, fz.command_off, fz.legacy.genOnOff_cmdOff, fz.on_off, fz.metering],
14
+ exposes: [e.switch(), e.power(), e.energy()],
15
+ toZigbee: [tz.on_off],
16
+ configure: async (device, coordinatorEndpoint, logger) => {
17
+ const endpoint1 = device.getEndpoint(1);
18
+ await reporting.bind(endpoint1, coordinatorEndpoint, ['genOnOff']);
19
+ await reporting.onOff(endpoint1);
20
+
21
+ const endpoint10 = device.getEndpoint(10);
22
+ await reporting.bind(endpoint10, coordinatorEndpoint, ['seMetering']);
23
+ await reporting.readMeteringMultiplierDivisor(endpoint10);
24
+ await reporting.instantaneousDemand(endpoint10);
25
+ await reporting.currentSummDelivered(endpoint10);
26
+ await reporting.currentSummReceived(endpoint10);
27
+ },
28
+ },
29
+ ];
@@ -0,0 +1,35 @@
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 reporting = require('../lib/reporting');
5
+ const e = exposes.presets;
6
+
7
+ module.exports = [
8
+ {
9
+ zigbeeModel: ['Z809AE3R'],
10
+ model: 'Z809A',
11
+ vendor: 'Netvox',
12
+ description: 'Power socket with power consumption monitoring',
13
+ fromZigbee: [fz.on_off, fz.electrical_measurement],
14
+ toZigbee: [tz.on_off],
15
+ configure: async (device, coordinatorEndpoint, logger) => {
16
+ const endpoint = device.getEndpoint(1);
17
+ await reporting.bind(endpoint, coordinatorEndpoint, ['genOnOff', 'haElectricalMeasurement']);
18
+ await reporting.onOff(endpoint);
19
+ await reporting.rmsVoltage(endpoint);
20
+ await reporting.rmsCurrent(endpoint);
21
+ await reporting.activePower(endpoint);
22
+ await reporting.powerFactor(endpoint);
23
+ },
24
+ exposes: [e.switch(), e.power(), e.current(), e.voltage()],
25
+ },
26
+ {
27
+ zigbeeModel: ['ZB02AE0ED'],
28
+ model: 'ZB02A',
29
+ vendor: 'Netvox',
30
+ description: 'Wireless wall switch',
31
+ fromZigbee: [fz.command_toggle],
32
+ toZigbee: [],
33
+ exposes: [e.action(['toggle'])],
34
+ },
35
+ ];
@@ -0,0 +1,314 @@
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 reporting = require('../lib/reporting');
5
+ const e = exposes.presets;
6
+ const ea = exposes.access;
7
+
8
+ const local = {
9
+ fz: {
10
+ switch_operation_mode: {
11
+ cluster: 'manuSpecificNiko1',
12
+ type: ['attributeReport', 'readResponse'],
13
+ convert: (model, msg, publish, options, meta) => {
14
+ const state = {};
15
+ if (msg.data.hasOwnProperty('switchOperationMode')) {
16
+ const operationModeProperty = `operation_mode${meta.endpoint_name ? `_${meta.endpoint_name}` : ''}`;
17
+ const operationModeMap = {0x02: 'control_relay', 0x01: 'decoupled', 0x00: 'unknown'};
18
+ state[operationModeProperty] = operationModeMap[msg.data.switchOperationMode];
19
+ }
20
+ return state;
21
+ },
22
+ },
23
+ switch_action: {
24
+ cluster: 'manuSpecificNiko2',
25
+ type: ['attributeReport', 'readResponse'],
26
+ convert: (model, msg, publish, options, meta) => {
27
+ const state = {};
28
+
29
+ if (msg.data.hasOwnProperty('switchAction')) {
30
+ // NOTE: a single press = two seperate values reported, 16 followed by 64
31
+ // a hold/release cyle = three seperate values, 16, 32, and 48
32
+ const actionProperty = `action${meta.endpoint_name ? `_${meta.endpoint_name}` : ''}`;
33
+ const actionMap = {16: null, 64: 'single', 32: 'hold', 48: 'release'};
34
+ state[actionProperty] = actionMap[msg.data.switchAction];
35
+ }
36
+ return state;
37
+ },
38
+ },
39
+ switch_status_led: {
40
+ cluster: 'manuSpecificNiko1',
41
+ type: ['attributeReport', 'readResponse'],
42
+ convert: (model, msg, publish, options, meta) => {
43
+ const state = {};
44
+ if (msg.data.hasOwnProperty('outletLedState')) {
45
+ state['led_enable'] = (msg.data['outletLedState'] == 1);
46
+ }
47
+ if (msg.data.hasOwnProperty('outletLedColor')) {
48
+ state['led_state'] = (msg.data['outletLedColor'] == 255 ? 'ON' : 'OFF');
49
+ }
50
+ return state;
51
+ },
52
+ },
53
+ outlet: {
54
+ cluster: 'manuSpecificNiko1',
55
+ type: ['attributeReport', 'readResponse'],
56
+ convert: (model, msg, publish, options, meta) => {
57
+ const state = {};
58
+ if (msg.data.hasOwnProperty('outletChildLock')) {
59
+ state['child_lock'] = (msg.data['outletChildLock'] == 0 ? 'LOCK' : 'UNLOCK');
60
+ }
61
+ if (msg.data.hasOwnProperty('outletLedState')) {
62
+ state['led_enable'] = (msg.data['outletLedState'] == 1);
63
+ }
64
+ return state;
65
+ },
66
+ },
67
+ },
68
+ tz: {
69
+ switch_operation_mode: {
70
+ key: ['operation_mode'],
71
+ convertSet: async (entity, key, value, meta) => {
72
+ // WARN: while we can technically write 0x00 to the operationMode attribute
73
+ // this seems to brick the device and it will need to be rejoined
74
+ const operationModeLookup = {control_relay: 0x02, decoupled: 0x01};
75
+ if (!operationModeLookup.hasOwnProperty(value)) {
76
+ throw new Error(`operation_mode was called with an invalid value (${value})`);
77
+ } else {
78
+ await entity.write('manuSpecificNiko1', {'switchOperationMode': operationModeLookup[value]});
79
+ return {state: {operation_mode: value.toLowerCase()}};
80
+ }
81
+ },
82
+ convertGet: async (entity, key, meta) => {
83
+ await entity.read('manuSpecificNiko1', ['switchOperationMode']);
84
+ },
85
+ },
86
+ switch_led_enable: {
87
+ key: ['led_enable'],
88
+ convertSet: async (entity, key, value, meta) => {
89
+ await entity.write('manuSpecificNiko1', {'outletLedState': ((value) ? 1 : 0)});
90
+ await entity.read('manuSpecificNiko1', ['outletLedColor']);
91
+ return {state: {led_enable: ((value) ? true : false)}};
92
+ },
93
+ convertGet: async (entity, key, meta) => {
94
+ await entity.read('manuSpecificNiko1', ['outletLedState']);
95
+ },
96
+ },
97
+ switch_led_state: {
98
+ key: ['led_state'],
99
+ convertSet: async (entity, key, value, meta) => {
100
+ await entity.write('manuSpecificNiko1', {'outletLedColor': ((value.toLowerCase() === 'off') ? 0 : 255)});
101
+ return {state: {led_state: ((value.toLowerCase() === 'off') ? 'OFF' : 'ON')}};
102
+ },
103
+ convertGet: async (entity, key, meta) => {
104
+ await entity.read('manuSpecificNiko1', ['outletLedColor']);
105
+ },
106
+ },
107
+ outlet_child_lock: {
108
+ key: ['child_lock'],
109
+ convertSet: async (entity, key, value, meta) => {
110
+ await entity.write('manuSpecificNiko1', {'outletChildLock': ((value.toLowerCase() === 'lock') ? 0 : 1)});
111
+ return {state: {child_lock: ((value.toLowerCase() === 'lock') ? 'LOCK' : 'UNLOCK')}};
112
+ },
113
+ convertGet: async (entity, key, meta) => {
114
+ await entity.read('manuSpecificNiko1', ['outletChildLock']);
115
+ },
116
+ },
117
+ outlet_led_enable: {
118
+ key: ['led_enable'],
119
+ convertSet: async (entity, key, value, meta) => {
120
+ await entity.write('manuSpecificNiko1', {'outletLedState': ((value) ? 1 : 0)});
121
+ return {state: {led_enable: ((value) ? true : false)}};
122
+ },
123
+ convertGet: async (entity, key, meta) => {
124
+ await entity.read('manuSpecificNiko1', ['outletLedState']);
125
+ },
126
+ },
127
+ },
128
+ };
129
+
130
+ module.exports = [
131
+ {
132
+ zigbeeModel: ['Connected socket outlet'],
133
+ model: '170-33505/170-34605',
134
+ vendor: 'Niko',
135
+ description: 'Connected socket outlet',
136
+ fromZigbee: [fz.on_off, fz.electrical_measurement, fz.metering, local.fz.outlet],
137
+ toZigbee: [
138
+ tz.on_off, tz.electrical_measurement_power, tz.currentsummdelivered,
139
+ local.tz.outlet_child_lock, local.tz.outlet_led_enable,
140
+ ],
141
+ configure: async (device, coordinatorEndpoint, logger) => {
142
+ const endpoint = device.getEndpoint(1);
143
+ await reporting.bind(endpoint, coordinatorEndpoint, ['genOnOff', 'haElectricalMeasurement', 'seMetering']);
144
+ await reporting.onOff(endpoint);
145
+
146
+ // NOTE: we read them individually, acFrequency* is not supported
147
+ // so we cannot use readEletricalMeasurementMultiplierDivisors
148
+ await endpoint.read('haElectricalMeasurement', ['acPowerMultiplier', 'acPowerDivisor']);
149
+ await reporting.activePower(endpoint, {min: 5, max: 3600, change: 1000});
150
+ await endpoint.read('haElectricalMeasurement', ['acCurrentDivisor', 'acPowerMultiplier', 'acPowerDivisor']);
151
+ await reporting.rmsCurrent(endpoint, {min: 5, max: 3600, change: 100});
152
+ await endpoint.read('haElectricalMeasurement', ['acVoltageMultiplier', 'acVoltageDivisor', 'acCurrentMultiplier']);
153
+ await reporting.rmsVoltage(endpoint, {min: 5, max: 3600, change: 100});
154
+
155
+ await reporting.readMeteringMultiplierDivisor(endpoint);
156
+ await reporting.currentSummDelivered(endpoint, {min: 60, change: 1});
157
+
158
+ await endpoint.read('manuSpecificNiko1', ['outletChildLock']);
159
+ await endpoint.read('manuSpecificNiko1', ['outletLedState']);
160
+ },
161
+ exposes: [
162
+ e.switch(),
163
+ e.power().withAccess(ea.STATE_GET), e.current(), e.voltage(),
164
+ e.energy().withAccess(ea.STATE_GET),
165
+ exposes.binary('child_lock', ea.ALL, 'LOCK', 'UNLOCK').withDescription('Enables/disables physical input on the device'),
166
+ exposes.binary('led_enable', ea.ALL, true, false).withDescription('Enable LED'),
167
+ ],
168
+ },
169
+ {
170
+ zigbeeModel: ['Smart plug Zigbee SE'],
171
+ model: '552-80698',
172
+ vendor: 'Niko',
173
+ description: 'Smart plug with side earthing pin',
174
+ fromZigbee: [fz.on_off, fz.electrical_measurement, fz.metering, fz.power_on_behavior],
175
+ toZigbee: [tz.on_off, tz.power_on_behavior, tz.electrical_measurement_power, tz.currentsummdelivered],
176
+ configure: async (device, coordinatorEndpoint, logger) => {
177
+ const endpoint = device.getEndpoint(1);
178
+ await reporting.bind(endpoint, coordinatorEndpoint, ['genOnOff', 'haElectricalMeasurement', 'seMetering']);
179
+ await reporting.onOff(endpoint);
180
+ // only activePower seems to be support, although compliance document states otherwise
181
+ await endpoint.read('haElectricalMeasurement', ['acPowerMultiplier', 'acPowerDivisor']);
182
+ await reporting.activePower(endpoint);
183
+ await reporting.readMeteringMultiplierDivisor(endpoint);
184
+ await reporting.currentSummDelivered(endpoint, {min: 60, change: 1});
185
+ },
186
+ exposes: [
187
+ e.switch(), e.power().withAccess(ea.STATE_GET), e.energy().withAccess(ea.STATE_GET),
188
+ exposes.enum('power_on_behavior', ea.ALL, ['off', 'previous', 'on'])
189
+ .withDescription('Controls the behaviour when the device is powered on'),
190
+ ],
191
+ },
192
+ {
193
+ zigbeeModel: ['Smart plug Zigbee PE'],
194
+ model: '552-80699',
195
+ vendor: 'Niko',
196
+ description: 'Smart plug with earthing pin',
197
+ fromZigbee: [fz.on_off, fz.electrical_measurement, fz.metering, fz.power_on_behavior],
198
+ toZigbee: [tz.on_off, tz.power_on_behavior, tz.electrical_measurement_power, tz.currentsummdelivered],
199
+ configure: async (device, coordinatorEndpoint, logger) => {
200
+ const endpoint = device.getEndpoint(1);
201
+ await reporting.bind(endpoint, coordinatorEndpoint, ['genOnOff', 'haElectricalMeasurement', 'seMetering']);
202
+ await reporting.onOff(endpoint);
203
+ // only activePower seems to be support, although compliance document states otherwise
204
+ await endpoint.read('haElectricalMeasurement', ['acPowerMultiplier', 'acPowerDivisor']);
205
+ await reporting.activePower(endpoint);
206
+ await reporting.readMeteringMultiplierDivisor(endpoint);
207
+ await reporting.currentSummDelivered(endpoint, {min: 60, change: 1});
208
+ },
209
+ exposes: [
210
+ e.switch(), e.power().withAccess(ea.STATE_GET), e.energy().withAccess(ea.STATE_GET),
211
+ exposes.enum('power_on_behavior', ea.ALL, ['off', 'previous', 'on'])
212
+ .withDescription('Controls the behaviour when the device is powered on'),
213
+ ],
214
+ },
215
+ {
216
+ zigbeeModel: ['Connectable motion sensor,Zigbee'],
217
+ model: '552-80401',
218
+ vendor: 'Niko',
219
+ description: 'Wireless motion sensor',
220
+ fromZigbee: [fz.ias_occupancy_alarm_1, fz.battery],
221
+ toZigbee: [],
222
+ meta: {battery: {voltageToPercentage: '3V_2100'}},
223
+ configure: async (device, coordinatorEndpoint, logger) => {
224
+ const endpoint = device.getEndpoint(1);
225
+ const bindClusters = ['genPowerCfg'];
226
+ await reporting.bind(endpoint, coordinatorEndpoint, bindClusters);
227
+ await reporting.batteryVoltage(endpoint);
228
+ },
229
+ exposes: [e.occupancy(), e.battery_low(), e.battery()],
230
+ },
231
+ {
232
+ zigbeeModel: ['Single connectable switch,10A'],
233
+ model: '552-721X1',
234
+ vendor: 'Niko',
235
+ description: 'Single connectable switch',
236
+ fromZigbee: [fz.on_off, local.fz.switch_operation_mode, local.fz.switch_action, local.fz.switch_status_led],
237
+ toZigbee: [tz.on_off, local.tz.switch_operation_mode, local.tz.switch_led_enable, local.tz.switch_led_state],
238
+ configure: async (device, coordinatorEndpoint, logger) => {
239
+ const endpoint = device.getEndpoint(1);
240
+ await reporting.bind(endpoint, coordinatorEndpoint, ['genOnOff']);
241
+ await reporting.onOff(endpoint);
242
+ await endpoint.read('manuSpecificNiko1', ['switchOperationMode', 'outletLedState', 'outletLedColor']);
243
+ },
244
+ exposes: [
245
+ e.switch(),
246
+ e.action(['single', 'hold', 'release']),
247
+ exposes.enum('operation_mode', ea.ALL, ['control_relay', 'decoupled']),
248
+ exposes.binary('led_enable', ea.ALL, true, false).withDescription('Enable LED'),
249
+ exposes.binary('led_state', ea.ALL, 'ON', 'OFF').withDescription('LED State'),
250
+ ],
251
+ },
252
+ {
253
+ zigbeeModel: ['Double connectable switch,10A'],
254
+ model: '552-721X2',
255
+ vendor: 'Niko',
256
+ description: 'Double connectable switch',
257
+ fromZigbee: [fz.on_off, local.fz.switch_operation_mode, local.fz.switch_action, local.fz.switch_status_led],
258
+ toZigbee: [tz.on_off, local.tz.switch_operation_mode, local.tz.switch_led_enable, local.tz.switch_led_state],
259
+ endpoint: (device) => {
260
+ return {'l1': 1, 'l2': 2};
261
+ },
262
+ meta: {multiEndpoint: true},
263
+ configure: async (device, coordinatorEndpoint, logger) => {
264
+ const ep1 = device.getEndpoint(1);
265
+ const ep2 = device.getEndpoint(2);
266
+ await reporting.bind(ep1, coordinatorEndpoint, ['genOnOff']);
267
+ await reporting.bind(ep2, coordinatorEndpoint, ['genOnOff']);
268
+ await reporting.onOff(ep1);
269
+ await reporting.onOff(ep2);
270
+ await ep1.read('manuSpecificNiko1', ['switchOperationMode', 'outletLedState', 'outletLedColor']);
271
+ await ep2.read('manuSpecificNiko1', ['switchOperationMode', 'outletLedState', 'outletLedColor']);
272
+ },
273
+ exposes: [
274
+ e.switch().withEndpoint('l1'), e.switch().withEndpoint('l2'),
275
+ e.action(['single', 'hold', 'release']).withEndpoint('l1'),
276
+ e.action(['single', 'hold', 'release']).withEndpoint('l2'),
277
+ exposes.enum('operation_mode', ea.ALL, ['control_relay', 'decoupled']).withEndpoint('l1'),
278
+ exposes.enum('operation_mode', ea.ALL, ['control_relay', 'decoupled']).withEndpoint('l2'),
279
+ exposes.binary('led_enable', ea.ALL, true, false).withEndpoint('l1').withDescription('Enable LED'),
280
+ exposes.binary('led_enable', ea.ALL, true, false).withEndpoint('l2').withDescription('Enable LED'),
281
+ exposes.binary('led_state', ea.ALL, 'ON', 'OFF').withEndpoint('l1').withDescription('LED State'),
282
+ exposes.binary('led_state', ea.ALL, 'ON', 'OFF').withEndpoint('l2').withDescription('LED State'),
283
+ ],
284
+ },
285
+ {
286
+ zigbeeModel: ['Connectable dimmer,3-200W,2-wire'],
287
+ model: '552-72201',
288
+ vendor: 'Niko',
289
+ description: 'Connectable dimmer',
290
+ fromZigbee: [fz.on_off, fz.brightness, fz.level_config, fz.command_move, fz.command_stop],
291
+ toZigbee: [tz.light_onoff_brightness, tz.level_config],
292
+ exposes: [e.light_brightness().withLevelConfig()],
293
+ configure: async (device, coordinatorEndpoint, logger) => {
294
+ const endpoint = device.getEndpoint(1);
295
+ await reporting.bind(endpoint, coordinatorEndpoint, ['genOnOff', 'genLevelCtrl']);
296
+ await reporting.onOff(endpoint);
297
+ await reporting.brightness(endpoint);
298
+ },
299
+ },
300
+ {
301
+ zigbeeModel: ['Connectable motor control,3A'],
302
+ model: '552-72301',
303
+ vendor: 'Niko',
304
+ description: 'Connectable motor control',
305
+ fromZigbee: [fz.cover_position_tilt, fz.battery],
306
+ toZigbee: [tz.cover_state, tz.cover_position_tilt],
307
+ configure: async (device, coordinatorEndpoint, logger) => {
308
+ const endpoint = device.getEndpoint(1);
309
+ await reporting.bind(endpoint, coordinatorEndpoint, ['closuresWindowCovering']);
310
+ await reporting.currentPositionLiftPercentage(endpoint);
311
+ },
312
+ exposes: [e.cover_position()],
313
+ },
314
+ ];
@@ -0,0 +1,24 @@
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 reporting = require('../lib/reporting');
5
+ const e = exposes.presets;
6
+
7
+ module.exports = [
8
+ {
9
+ zigbeeModel: ['Ninja Smart Plug'],
10
+ model: 'Z809AF',
11
+ vendor: 'Ninja Blocks',
12
+ description: 'Zigbee smart plug with power meter',
13
+ fromZigbee: [fz.on_off, fz.metering],
14
+ toZigbee: [tz.on_off],
15
+ configure: async (device, coordinatorEndpoint, logger) => {
16
+ const endpoint = device.getEndpoint(1);
17
+ await reporting.bind(endpoint, coordinatorEndpoint, ['genOnOff', 'seMetering']);
18
+ await reporting.onOff(endpoint);
19
+ await reporting.readMeteringMultiplierDivisor(endpoint);
20
+ await reporting.instantaneousDemand(endpoint);
21
+ },
22
+ exposes: [e.switch(), e.power(), e.energy()],
23
+ },
24
+ ];
@@ -0,0 +1,11 @@
1
+ const extend = require('../lib/extend');
2
+
3
+ module.exports = [
4
+ {
5
+ zigbeeModel: ['NIV-ZC-OFD'],
6
+ model: 'PS-ZIGBEE-SMART-CONTROLER-1CH-DIMMABLE',
7
+ vendor: 'Niviss',
8
+ description: 'Zigbee smart controller',
9
+ extend: extend.light_onoff_brightness(),
10
+ },
11
+ ];
@@ -0,0 +1,109 @@
1
+ const exposes = require('../lib/exposes');
2
+ const reporting = require('../lib/reporting');
3
+ const extend = require('../lib/extend');
4
+ const e = exposes.presets;
5
+ const tz = require('../converters/toZigbee');
6
+ const fz = require('../converters/fromZigbee');
7
+
8
+ module.exports = [
9
+ {
10
+ zigbeeModel: ['SIN-4-RS-20'],
11
+ model: 'SIN-4-RS-20',
12
+ vendor: 'NodOn',
13
+ description: 'Roller shutter controller',
14
+ fromZigbee: [fz.cover_position_tilt],
15
+ toZigbee: [tz.cover_state, tz.cover_position_tilt],
16
+ configure: async (device, coordinatorEndpoint, logger) => {
17
+ const endpoint = device.getEndpoint(1);
18
+ await reporting.bind(endpoint, coordinatorEndpoint, ['genPowerCfg', 'closuresWindowCovering']);
19
+ await reporting.currentPositionLiftPercentage(endpoint);
20
+ await reporting.currentPositionTiltPercentage(endpoint);
21
+ },
22
+ exposes: [e.cover_position()],
23
+ },
24
+ {
25
+ zigbeeModel: ['SIN-4-RS-20_PRO'],
26
+ model: 'SIN-4-RS-20_PRO',
27
+ vendor: 'NodOn',
28
+ description: 'Roller shutter controller',
29
+ fromZigbee: [fz.cover_position_tilt],
30
+ toZigbee: [tz.cover_state, tz.cover_position_tilt],
31
+ configure: async (device, coordinatorEndpoint, logger) => {
32
+ const endpoint = device.getEndpoint(1);
33
+ await reporting.bind(endpoint, coordinatorEndpoint, ['genPowerCfg', 'closuresWindowCovering']);
34
+ await reporting.currentPositionLiftPercentage(endpoint);
35
+ await reporting.currentPositionTiltPercentage(endpoint);
36
+ },
37
+ exposes: [e.cover_position()],
38
+ },
39
+ {
40
+ zigbeeModel: ['SIN-4-1-20'],
41
+ model: 'SIN-4-1-20',
42
+ vendor: 'NodOn',
43
+ description: 'Single LED relay',
44
+ extend: extend.switch(),
45
+ configure: async (device, coordinatorEndpoint, logger) => {
46
+ const ep = device.getEndpoint(1);
47
+ await reporting.bind(ep, coordinatorEndpoint, ['genOnOff']);
48
+ await reporting.onOff(ep);
49
+ },
50
+ endpoint: (device) => {
51
+ return {default: 1};
52
+ },
53
+ },
54
+ {
55
+ zigbeeModel: ['SIN-4-1-20_PRO'],
56
+ model: 'SIN-4-1-20_PRO',
57
+ vendor: 'NodOn',
58
+ description: 'Single LED relay',
59
+ extend: extend.switch(),
60
+ configure: async (device, coordinatorEndpoint, logger) => {
61
+ const ep = device.getEndpoint(1);
62
+ await reporting.bind(ep, coordinatorEndpoint, ['genOnOff']);
63
+ await reporting.onOff(ep);
64
+ },
65
+ endpoint: (device) => {
66
+ return {default: 1};
67
+ },
68
+ },
69
+ {
70
+ zigbeeModel: ['SIN-4-2-20'],
71
+ model: 'SIN-4-2-20',
72
+ vendor: 'NodOn',
73
+ description: 'Double LED relay',
74
+ exposes: [e.switch().withEndpoint('l1'), e.switch().withEndpoint('l2')],
75
+ extend: extend.switch(),
76
+ endpoint: (device) => {
77
+ return {'l1': 1, 'l2': 2};
78
+ },
79
+ meta: {multiEndpoint: true},
80
+ configure: async (device, coordinatorEndpoint, logger) => {
81
+ const ep1 = device.getEndpoint(1);
82
+ const ep2 = device.getEndpoint(2);
83
+ await reporting.bind(ep1, coordinatorEndpoint, ['genOnOff']);
84
+ await reporting.bind(ep2, coordinatorEndpoint, ['genOnOff']);
85
+ await reporting.onOff(ep1);
86
+ await reporting.onOff(ep2);
87
+ },
88
+ },
89
+ {
90
+ zigbeeModel: ['SIN-4-2-20_PRO'],
91
+ model: 'SIN-4-2-20_PRO',
92
+ vendor: 'NodOn',
93
+ description: 'Double LED relay',
94
+ exposes: [e.switch().withEndpoint('l1'), e.switch().withEndpoint('l2')],
95
+ extend: extend.switch(),
96
+ endpoint: (device) => {
97
+ return {'l1': 1, 'l2': 2};
98
+ },
99
+ meta: {multiEndpoint: true},
100
+ configure: async (device, coordinatorEndpoint, logger) => {
101
+ const ep1 = device.getEndpoint(1);
102
+ const ep2 = device.getEndpoint(2);
103
+ await reporting.bind(ep1, coordinatorEndpoint, ['genOnOff']);
104
+ await reporting.bind(ep2, coordinatorEndpoint, ['genOnOff']);
105
+ await reporting.onOff(ep1);
106
+ await reporting.onOff(ep2);
107
+ },
108
+ },
109
+ ];
@@ -0,0 +1,30 @@
1
+ const reporting = require('../lib/reporting');
2
+ const extend = require('../lib/extend');
3
+
4
+ module.exports = [
5
+ {
6
+ zigbeeModel: ['BoxDIM2 98425031', '98425031', 'BoxDIMZ 98425031'],
7
+ model: '98425031',
8
+ vendor: 'Nordtronic',
9
+ description: 'Box Dimmer 2.0',
10
+ extend: extend.light_onoff_brightness({noConfigure: true}),
11
+ configure: async (device, coordinatorEndpoint, logger) => {
12
+ await extend.light_onoff_brightness().configure(device, coordinatorEndpoint, logger);
13
+ const endpoint = device.getEndpoint(1);
14
+ await reporting.bind(endpoint, coordinatorEndpoint, ['genOnOff', 'genLevelCtrl']);
15
+ await reporting.onOff(endpoint);
16
+ },
17
+ },
18
+ {
19
+ zigbeeModel: ['BoxRelayZ 98423051'],
20
+ model: '98423051',
21
+ vendor: 'Nordtronic',
22
+ description: 'Zigbee switch 400W',
23
+ extend: extend.switch(),
24
+ configure: async (device, coordinatorEndpoint, logger) => {
25
+ const endpoint = device.getEndpoint(1) || device.getEndpoint(3);
26
+ await reporting.bind(endpoint, coordinatorEndpoint, ['genOnOff']);
27
+ await reporting.onOff(endpoint);
28
+ },
29
+ },
30
+ ];