@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,805 @@
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 e = exposes.presets;
8
+ const ea = exposes.access;
9
+ const tuya = require('../lib/tuya');
10
+
11
+ module.exports = [
12
+ {
13
+ fingerprint: [{modelID: 'TS0212', manufacturerName: '_TYZB01_wpmo3ja3'}],
14
+ zigbeeModel: ['CO_V15', 'CO_YDLV10', 'CO_V16', '1ccaa94c49a84abaa9e38687913947ba', 'CO_CTPG'],
15
+ model: 'HS1CA-M',
16
+ description: 'Smart carbon monoxide sensor',
17
+ vendor: 'HEIMAN',
18
+ fromZigbee: [fz.ias_carbon_monoxide_alarm_1, fz.battery],
19
+ toZigbee: [],
20
+ configure: async (device, coordinatorEndpoint, logger) => {
21
+ const endpoint = device.getEndpoint(1);
22
+ await reporting.bind(endpoint, coordinatorEndpoint, ['genPowerCfg']);
23
+ await reporting.batteryPercentageRemaining(endpoint);
24
+ await reporting.batteryAlarmState(endpoint);
25
+ },
26
+ exposes: [e.carbon_monoxide(), e.battery_low(), e.battery()],
27
+ },
28
+ {
29
+ zigbeeModel: ['PIRSensor-N', 'PIRSensor-EM', 'PIRSensor-EF-3.0', 'PIR_TPV13'],
30
+ model: 'HS3MS',
31
+ vendor: 'HEIMAN',
32
+ description: 'Smart motion sensor',
33
+ fromZigbee: [fz.ias_occupancy_alarm_1],
34
+ toZigbee: [],
35
+ exposes: [e.occupancy(), e.battery_low(), e.tamper()],
36
+ },
37
+ {
38
+ zigbeeModel: ['SmartPlug', 'SmartPlug-EF-3.0'],
39
+ model: 'HS2SK',
40
+ description: 'Smart metering plug',
41
+ vendor: 'HEIMAN',
42
+ fromZigbee: [fz.on_off, fz.electrical_measurement, fz.metering],
43
+ toZigbee: [tz.on_off],
44
+ configure: async (device, coordinatorEndpoint, logger) => {
45
+ const endpoint = device.getEndpoint(1);
46
+ await reporting.bind(endpoint, coordinatorEndpoint, ['genOnOff', 'haElectricalMeasurement', 'seMetering']);
47
+ await reporting.onOff(endpoint);
48
+ await reporting.readEletricalMeasurementMultiplierDivisors(endpoint);
49
+ await reporting.rmsVoltage(endpoint);
50
+ await reporting.rmsCurrent(endpoint);
51
+ await reporting.activePower(endpoint);
52
+ await reporting.readMeteringMultiplierDivisor(endpoint);
53
+ await reporting.currentSummDelivered(endpoint);
54
+ },
55
+ exposes: [e.switch(), e.power(), e.current(), e.voltage(), e.energy()],
56
+ },
57
+ {
58
+ fingerprint: [{modelID: 'SmartPlug-N', manufacturerName: 'HEIMAN'}],
59
+ model: 'HS2SK_nxp',
60
+ description: 'Smart metering plug',
61
+ vendor: 'HEIMAN',
62
+ fromZigbee: [fz.on_off, fz.electrical_measurement],
63
+ toZigbee: [tz.on_off],
64
+ options: [exposes.options.measurement_poll_interval()],
65
+ configure: async (device, coordinatorEndpoint, logger) => {
66
+ const endpoint = device.getEndpoint(1);
67
+ await reporting.bind(endpoint, coordinatorEndpoint, ['genOnOff', 'haElectricalMeasurement']);
68
+ await reporting.onOff(endpoint);
69
+ await reporting.readEletricalMeasurementMultiplierDivisors(endpoint);
70
+ },
71
+ onEvent: tuya.onEventMeasurementPoll,
72
+ exposes: [e.switch(), e.power(), e.current(), e.voltage()],
73
+ },
74
+ {
75
+ zigbeeModel: ['SMOK_V16', 'SMOK_V15', 'b5db59bfd81e4f1f95dc57fdbba17931', '98293058552c49f38ad0748541ee96ba', 'SMOK_YDLV10',
76
+ 'FB56-SMF02HM1.4', 'SmokeSensor-N-3.0', '319fa36e7384414a9ea62cba8f6e7626', 'c3442b4ac59b4ba1a83119d938f283ab',
77
+ 'SmokeSensor-EF-3.0', 'SMOK_HV14'],
78
+ model: 'HS1SA',
79
+ vendor: 'HEIMAN',
80
+ description: 'Smoke detector',
81
+ fromZigbee: [fz.ias_smoke_alarm_1, fz.battery],
82
+ toZigbee: [],
83
+ configure: async (device, coordinatorEndpoint, logger) => {
84
+ const endpoint = device.getEndpoint(1);
85
+ await reporting.bind(endpoint, coordinatorEndpoint, ['genPowerCfg']);
86
+ await reporting.batteryPercentageRemaining(endpoint);
87
+ },
88
+ exposes: [e.smoke(), e.battery_low(), e.battery()],
89
+ },
90
+ {
91
+ zigbeeModel: ['SmokeSensor-N', 'SmokeSensor-EM'],
92
+ model: 'HS3SA',
93
+ vendor: 'HEIMAN',
94
+ description: 'Smoke detector',
95
+ fromZigbee: [fz.ias_smoke_alarm_1, fz.battery],
96
+ toZigbee: [],
97
+ configure: async (device, coordinatorEndpoint, logger) => {
98
+ const endpoint = device.getEndpoint(1);
99
+ await reporting.bind(endpoint, coordinatorEndpoint, ['genPowerCfg']);
100
+ await reporting.batteryPercentageRemaining(endpoint);
101
+ },
102
+ exposes: [e.smoke(), e.battery_low(), e.battery()],
103
+ },
104
+ {
105
+ zigbeeModel: ['GASSensor-N', 'GASSensor-N-3.0'],
106
+ model: 'HS3CG',
107
+ vendor: 'HEIMAN',
108
+ description: 'Combustible gas sensor',
109
+ fromZigbee: [fz.ias_gas_alarm_2],
110
+ toZigbee: [],
111
+ exposes: [e.gas(), e.battery_low(), e.tamper()],
112
+ },
113
+ {
114
+ zigbeeModel: ['GASSensor-EN'],
115
+ model: 'HS1CG-M',
116
+ vendor: 'HEIMAN',
117
+ description: 'Combustible gas sensor',
118
+ fromZigbee: [fz.ias_gas_alarm_1],
119
+ toZigbee: [],
120
+ exposes: [e.gas(), e.battery_low(), e.tamper()],
121
+ },
122
+ {
123
+ zigbeeModel: ['RH3070'],
124
+ model: 'HS1CG',
125
+ vendor: 'HEIMAN',
126
+ description: 'Smart combustible gas sensor',
127
+ fromZigbee: [fz.ias_gas_alarm_1],
128
+ toZigbee: [],
129
+ exposes: [e.gas(), e.battery_low(), e.tamper()],
130
+ },
131
+ {
132
+ zigbeeModel: ['GAS_V15'],
133
+ model: 'HS1CG_M',
134
+ vendor: 'HEIMAN',
135
+ description: 'Combustible gas sensor',
136
+ fromZigbee: [fz.ias_gas_alarm_2],
137
+ toZigbee: [],
138
+ exposes: [e.gas(), e.battery_low(), e.tamper()],
139
+ },
140
+ {
141
+ zigbeeModel: ['DoorSensor-N', 'DoorSensor-N-3.0'],
142
+ model: 'HS3DS',
143
+ vendor: 'HEIMAN',
144
+ description: 'Door sensor',
145
+ fromZigbee: [fz.ias_contact_alarm_1, fz.battery],
146
+ toZigbee: [],
147
+ configure: async (device, coordinatorEndpoint, logger) => {
148
+ const endpoint = device.getEndpoint(1);
149
+ await reporting.bind(endpoint, coordinatorEndpoint, ['genPowerCfg']);
150
+ await reporting.batteryPercentageRemaining(endpoint);
151
+ await endpoint.read('genPowerCfg', ['batteryPercentageRemaining']);
152
+ },
153
+ exposes: [e.contact(), e.battery(), e.battery_low(), e.tamper()],
154
+ },
155
+ {
156
+ zigbeeModel: ['DoorSensor-EM', 'DoorSensor-EF-3.0'],
157
+ model: 'HS1DS',
158
+ vendor: 'HEIMAN',
159
+ description: 'Door sensor',
160
+ fromZigbee: [fz.ias_contact_alarm_1, fz.battery],
161
+ toZigbee: [],
162
+ configure: async (device, coordinatorEndpoint, logger) => {
163
+ const endpoint = device.getEndpoint(1);
164
+ await reporting.bind(endpoint, coordinatorEndpoint, ['genPowerCfg']);
165
+ await reporting.batteryPercentageRemaining(endpoint);
166
+ await endpoint.read('genPowerCfg', ['batteryPercentageRemaining']);
167
+ },
168
+ exposes: [e.contact(), e.battery_low(), e.tamper(), e.battery()],
169
+ },
170
+ {
171
+ zigbeeModel: ['DOOR_TPV13', 'DOOR_TPV12'],
172
+ model: 'HEIMAN-M1',
173
+ vendor: 'HEIMAN',
174
+ description: 'Door sensor',
175
+ fromZigbee: [fz.ias_contact_alarm_1],
176
+ toZigbee: [],
177
+ exposes: [e.contact(), e.battery_low(), e.tamper()],
178
+ },
179
+ {
180
+ zigbeeModel: ['WaterSensor-N', 'WaterSensor-EM', 'WaterSensor-N-3.0', 'WaterSensor-EF-3.0'],
181
+ model: 'HS1WL/HS3WL',
182
+ vendor: 'HEIMAN',
183
+ description: 'Water leakage sensor',
184
+ fromZigbee: [fz.ias_water_leak_alarm_1, fz.battery],
185
+ toZigbee: [],
186
+ configure: async (device, coordinatorEndpoint, logger) => {
187
+ const endpoint = device.getEndpoint(1);
188
+ await reporting.bind(endpoint, coordinatorEndpoint, ['genPowerCfg']);
189
+ await reporting.batteryPercentageRemaining(endpoint);
190
+ await endpoint.read('genPowerCfg', ['batteryPercentageRemaining']);
191
+ },
192
+ exposes: [e.water_leak(), e.battery_low(), e.tamper(), e.battery()],
193
+ },
194
+ {
195
+ fingerprint: [{modelID: 'RC-N', manufacturerName: 'HEIMAN'}],
196
+ model: 'HS1RC-N',
197
+ vendor: 'HEIMAN',
198
+ description: 'Smart remote controller',
199
+ fromZigbee: [fz.battery, fz.legacy.heiman_smart_controller_armmode, fz.command_emergency],
200
+ toZigbee: [],
201
+ exposes: [e.battery(), e.action(['emergency', 'disarm', 'arm_partial_zones', 'arm_all_zones'])],
202
+ configure: async (device, coordinatorEndpoint, logger) => {
203
+ const endpoint = device.getEndpoint(1);
204
+ await reporting.bind(endpoint, coordinatorEndpoint, ['genPowerCfg']);
205
+ await reporting.batteryPercentageRemaining(endpoint);
206
+ await endpoint.read('genPowerCfg', ['batteryPercentageRemaining']);
207
+ },
208
+ },
209
+ {
210
+ fingerprint: [{modelID: 'RC-EF-3.0', manufacturerName: 'HEIMAN'}],
211
+ model: 'HM1RC-2-E',
212
+ vendor: 'HEIMAN',
213
+ description: 'Smart remote controller',
214
+ fromZigbee: [fz.battery, fz.command_arm, fz.command_emergency],
215
+ toZigbee: [],
216
+ exposes: [e.battery(), e.action(['emergency', 'disarm', 'arm_day_zones', 'arm_all_zones'])],
217
+ configure: async (device, coordinatorEndpoint, logger) => {
218
+ const endpoint = device.getEndpoint(1);
219
+ await reporting.bind(endpoint, coordinatorEndpoint, ['genPowerCfg']);
220
+ await reporting.batteryPercentageRemaining(endpoint);
221
+ await endpoint.read('genPowerCfg', ['batteryPercentageRemaining']);
222
+ },
223
+ onEvent: async (type, data, device) => {
224
+ // Since arm command has a response zigbee-herdsman doesn't send a default response.
225
+ // This causes the remote to repeat the arm command, so send a default response here.
226
+ if (data.type === 'commandArm' && data.cluster === 'ssIasAce') {
227
+ await data.endpoint.defaultResponse(0, 0, 1281, data.meta.zclTransactionSequenceNumber);
228
+ }
229
+ },
230
+ },
231
+ {
232
+ fingerprint: [{modelID: 'RC-EM', manufacturerName: 'HEIMAN'}],
233
+ model: 'HS1RC-EM',
234
+ vendor: 'HEIMAN',
235
+ description: 'Smart remote controller',
236
+ fromZigbee: [fz.battery, fz.legacy.heiman_smart_controller_armmode, fz.command_emergency],
237
+ toZigbee: [],
238
+ exposes: [e.battery(), e.action(['emergency', 'disarm', 'arm_partial_zones', 'arm_all_zones'])],
239
+ configure: async (device, coordinatorEndpoint, logger) => {
240
+ const endpoint = device.getEndpoint(1);
241
+ await reporting.bind(endpoint, coordinatorEndpoint, ['genPowerCfg']);
242
+ await reporting.batteryPercentageRemaining(endpoint);
243
+ await endpoint.read('genPowerCfg', ['batteryPercentageRemaining']);
244
+ },
245
+ },
246
+ {
247
+ zigbeeModel: ['COSensor-EM', 'COSensor-N', 'COSensor-EF-3.0'],
248
+ model: 'HS1CA-E',
249
+ vendor: 'HEIMAN',
250
+ description: 'Smart carbon monoxide sensor',
251
+ fromZigbee: [fz.ias_carbon_monoxide_alarm_1, fz.battery],
252
+ toZigbee: [],
253
+ configure: async (device, coordinatorEndpoint, logger) => {
254
+ const endpoint = device.getEndpoint(1);
255
+ await reporting.bind(endpoint, coordinatorEndpoint, ['genPowerCfg']);
256
+ await reporting.batteryPercentageRemaining(endpoint);
257
+ },
258
+ exposes: [e.carbon_monoxide(), e.battery_low(), e.battery()],
259
+ },
260
+ {
261
+ fingerprint: [{modelID: 'TS0216', manufacturerName: '_TYZB01_8scntis1'},
262
+ {modelID: 'TS0216', manufacturerName: '_TYZB01_4obovpbi'}],
263
+ zigbeeModel: ['WarningDevice', 'WarningDevice-EF-3.0', 'SRHMP-I1'],
264
+ model: 'HS2WD-E',
265
+ vendor: 'HEIMAN',
266
+ description: 'Smart siren',
267
+ fromZigbee: [fz.battery, fz.ignore_basic_report],
268
+ toZigbee: [tz.warning],
269
+ meta: {disableDefaultResponse: true},
270
+ configure: async (device, coordinatorEndpoint, logger) => {
271
+ const endpoint = device.getEndpoint(1);
272
+ await reporting.bind(endpoint, coordinatorEndpoint, ['genPowerCfg']);
273
+ await reporting.batteryPercentageRemaining(endpoint);
274
+ },
275
+ exposes: [e.battery(), e.warning()],
276
+ },
277
+ {
278
+ zigbeeModel: ['SOHM-I1'],
279
+ model: 'SOHM-I1',
280
+ vendor: 'HEIMAN',
281
+ description: 'Door contact sensor',
282
+ fromZigbee: [fz.ias_contact_alarm_1],
283
+ toZigbee: [],
284
+ exposes: [e.contact(), e.battery_low(), e.tamper()],
285
+ },
286
+ {
287
+ zigbeeModel: ['SWHM-I1'],
288
+ model: 'SWHM-I1',
289
+ vendor: 'HEIMAN',
290
+ description: 'Water leakage sensor',
291
+ fromZigbee: [fz.ias_water_leak_alarm_1],
292
+ toZigbee: [],
293
+ exposes: [e.water_leak(), e.battery_low(), e.tamper()],
294
+ },
295
+ {
296
+ zigbeeModel: ['SMHM-I1', 'PIR_TPV12'],
297
+ model: 'SMHM-I1',
298
+ vendor: 'HEIMAN',
299
+ description: 'Smart motion sensor',
300
+ fromZigbee: [fz.ias_occupancy_alarm_1, fz.battery],
301
+ toZigbee: [],
302
+ exposes: [e.occupancy(), e.battery_low(), e.battery(), e.battery_voltage(), e.tamper()],
303
+ meta: {battery: {voltageToPercentage: '3V_2500'}},
304
+ configure: async (device, coordinatorEndpoint, logger) => {
305
+ const endpoint = device.getEndpoint(1);
306
+ const bindClusters = ['genPowerCfg'];
307
+ await reporting.bind(endpoint, coordinatorEndpoint, bindClusters);
308
+ await reporting.batteryPercentageRemaining(endpoint);
309
+ await reporting.batteryVoltage(endpoint);
310
+ },
311
+ },
312
+ {
313
+ zigbeeModel: ['HT-EM', 'TH-EM', 'TH-T_V14'],
314
+ model: 'HS1HT',
315
+ vendor: 'HEIMAN',
316
+ description: 'Smart temperature & humidity Sensor',
317
+ exposes: [e.battery(), e.temperature(), e.humidity()],
318
+ fromZigbee: [fz.temperature, fz.humidity, fz.battery],
319
+ toZigbee: [],
320
+ meta: {battery: {voltageToPercentage: '3V_2500'}},
321
+ whiteLabel: [{vendor: 'Ferguson', model: 'TH-T_V14'}],
322
+ configure: async (device, coordinatorEndpoint, logger) => {
323
+ const endpoint1 = device.getEndpoint(1);
324
+ await reporting.bind(endpoint1, coordinatorEndpoint, ['msTemperatureMeasurement']);
325
+ const endpoint2 = device.getEndpoint(2);
326
+ await reporting.bind(endpoint2, coordinatorEndpoint, ['msRelativeHumidity', 'genPowerCfg']);
327
+ await reporting.temperature(endpoint1);
328
+ await reporting.humidity(endpoint2);
329
+ await reporting.batteryVoltage(endpoint2);
330
+ await reporting.batteryPercentageRemaining(endpoint2);
331
+ },
332
+ },
333
+ {
334
+ zigbeeModel: ['HT-N', 'HT-EF-3.0'],
335
+ model: 'HS1HT-N',
336
+ vendor: 'HEIMAN',
337
+ description: 'Smart temperature & humidity Sensor',
338
+ fromZigbee: [fz.temperature, fz.humidity, fz.battery],
339
+ toZigbee: [],
340
+ configure: async (device, coordinatorEndpoint, logger) => {
341
+ const endpoint1 = device.getEndpoint(1);
342
+ await reporting.bind(endpoint1, coordinatorEndpoint, ['msTemperatureMeasurement', 'genPowerCfg']);
343
+ await reporting.temperature(endpoint1);
344
+ await reporting.batteryPercentageRemaining(endpoint1);
345
+ await endpoint1.read('genPowerCfg', ['batteryPercentageRemaining']);
346
+
347
+ const endpoint2 = device.getEndpoint(2);
348
+ await reporting.bind(endpoint2, coordinatorEndpoint, ['msRelativeHumidity']);
349
+ await reporting.humidity(endpoint2);
350
+ },
351
+ exposes: [e.temperature(), e.humidity(), e.battery()],
352
+ },
353
+ {
354
+ zigbeeModel: ['SKHMP30-I1'],
355
+ model: 'SKHMP30-I1',
356
+ description: 'Smart metering plug',
357
+ vendor: 'HEIMAN',
358
+ fromZigbee: [fz.on_off, fz.electrical_measurement],
359
+ exposes: [e.switch(), e.power(), e.current(), e.voltage()],
360
+ toZigbee: [tz.on_off],
361
+ configure: async (device, coordinatorEndpoint, logger) => {
362
+ const endpoint = device.getEndpoint(1);
363
+ await reporting.bind(endpoint, coordinatorEndpoint, ['genOnOff', 'haElectricalMeasurement']);
364
+ await reporting.onOff(endpoint);
365
+ await reporting.rmsVoltage(endpoint);
366
+ await reporting.rmsCurrent(endpoint);
367
+ await reporting.activePower(endpoint);
368
+ endpoint.saveClusterAttributeKeyValue('haElectricalMeasurement', {
369
+ acVoltageMultiplier: 1, acVoltageDivisor: 100,
370
+ acCurrentMultiplier: 1, acCurrentDivisor: 100,
371
+ acPowerMultiplier: 1, acPowerDivisor: 10,
372
+ });
373
+ },
374
+ },
375
+ {
376
+ zigbeeModel: ['E_Socket'],
377
+ model: 'HS2ESK-E',
378
+ vendor: 'HEIMAN',
379
+ description: 'Smart in wall plug',
380
+ fromZigbee: [fz.on_off, fz.electrical_measurement],
381
+ toZigbee: [tz.on_off],
382
+ configure: async (device, coordinatorEndpoint, logger) => {
383
+ const endpoint = device.getEndpoint(1);
384
+ await reporting.bind(endpoint, coordinatorEndpoint, ['genOnOff', 'haElectricalMeasurement']);
385
+ await reporting.onOff(endpoint);
386
+ await reporting.readEletricalMeasurementMultiplierDivisors(endpoint);
387
+ await reporting.rmsVoltage(endpoint);
388
+ await reporting.rmsCurrent(endpoint);
389
+ await reporting.activePower(endpoint);
390
+ },
391
+ exposes: [e.switch(), e.power(), e.current(), e.voltage()],
392
+ },
393
+ {
394
+ zigbeeModel: ['SGMHM-I1'],
395
+ model: 'SGMHM-I1',
396
+ vendor: 'HEIMAN',
397
+ description: 'Methane gas sensor',
398
+ fromZigbee: [fz.ias_gas_alarm_2],
399
+ toZigbee: [],
400
+ exposes: [e.gas()],
401
+ },
402
+ {
403
+ zigbeeModel: ['STHM-I1H'],
404
+ model: 'STHM-I1H',
405
+ vendor: 'HEIMAN',
406
+ description: 'Temperature & humidity sensor',
407
+ fromZigbee: [fz.temperature, fz.humidity, fz.battery],
408
+ toZigbee: [],
409
+ meta: {battery: {voltageToPercentage: '3V_2500'}},
410
+ configure: async (device, coordinatorEndpoint, logger) => {
411
+ const endpoint = device.getEndpoint(1);
412
+ const bindClusters = ['msTemperatureMeasurement', 'msRelativeHumidity', 'genPowerCfg'];
413
+ await reporting.bind(endpoint, coordinatorEndpoint, bindClusters);
414
+ await reporting.temperature(endpoint);
415
+ await reporting.humidity(endpoint);
416
+ await reporting.batteryVoltage(endpoint);
417
+ },
418
+ exposes: [e.temperature(), e.humidity(), e.battery()],
419
+ },
420
+ {
421
+ fingerprint: [{modelID: 'SOS-EM', manufacturerName: 'HEIMAN'}, {modelID: 'SOS-EF-3.0', manufacturerName: 'HEIMAN'}],
422
+ model: 'HS1EB/HS1EB-E',
423
+ vendor: 'HEIMAN',
424
+ description: 'Smart emergency button',
425
+ fromZigbee: [fz.command_status_change_notification_action, fz.legacy.st_button_state, fz.battery],
426
+ toZigbee: [],
427
+ exposes: [e.battery(), e.action(['off', 'single', 'double', 'hold'])],
428
+ configure: async (device, coordinatorEndpoint, logger) => {
429
+ const endpoint = device.getEndpoint(1);
430
+ await reporting.bind(endpoint, coordinatorEndpoint, ['genPowerCfg']);
431
+ await reporting.batteryPercentageRemaining(endpoint);
432
+ await endpoint.read('genPowerCfg', ['batteryPercentageRemaining']);
433
+ },
434
+ },
435
+ {
436
+ fingerprint: [{modelID: 'SceneSwitch-EM-3.0', manufacturerName: 'HEIMAN'}],
437
+ model: 'HS2SS',
438
+ vendor: 'HEIMAN',
439
+ description: 'Smart scene switch',
440
+ fromZigbee: [fz.battery, fz.heiman_scenes],
441
+ exposes: [e.battery(), e.action(['cinema', 'at_home', 'sleep', 'go_out', 'repast'])],
442
+ toZigbee: [],
443
+ configure: async (device, coordinatorEndpoint, logger) => {
444
+ const endpoint = device.getEndpoint(1);
445
+ await reporting.bind(endpoint, coordinatorEndpoint, ['genPowerCfg', 'heimanSpecificScenes']);
446
+ await reporting.batteryPercentageRemaining(endpoint);
447
+ },
448
+ },
449
+ {
450
+ zigbeeModel: ['TempDimmerSw-EM-3.0'],
451
+ model: 'HS2WDSC-E',
452
+ vendor: 'HEIMAN',
453
+ description: 'Remote dimmer and temperature control',
454
+ fromZigbee: [fz.battery, fz.command_on, fz.command_off, fz.command_move, fz.command_stop, fz.command_move_to_color,
455
+ fz.command_move_to_color_temp],
456
+ exposes: [e.battery(), e.action(['on', 'off', 'move', 'stop', 'color_move', 'color_temperature_move'])],
457
+ toZigbee: [],
458
+ configure: async (device, coordinatorEndpoint, logger) => {
459
+ const endpoint = device.getEndpoint(1);
460
+ await reporting.bind(endpoint, coordinatorEndpoint, ['genPowerCfg', 'genOnOff', 'genLevelCtrl', 'lightingColorCtrl']);
461
+ await reporting.batteryPercentageRemaining(endpoint, {min: constants.repInterval.MINUTES_5, max: constants.repInterval.HOUR});
462
+ },
463
+ },
464
+ {
465
+ fingerprint: [{modelID: 'ColorDimmerSw-EM-3.0', manufacturerName: 'HEIMAN'}],
466
+ model: 'HS2WDSR-E',
467
+ vendor: 'HEIMAN',
468
+ description: 'Remote dimmer and color control',
469
+ fromZigbee: [fz.battery, fz.command_on, fz.command_off, fz.command_move, fz.command_stop, fz.command_move_to_color],
470
+ exposes: [e.battery(), e.action(['on', 'off', 'move', 'stop', 'color_move'])],
471
+ toZigbee: [],
472
+ configure: async (device, coordinatorEndpoint, logger) => {
473
+ const endpoint = device.getEndpoint(1);
474
+ await reporting.bind(endpoint, coordinatorEndpoint, ['genPowerCfg', 'genOnOff', 'genLevelCtrl', 'lightingColorCtrl']);
475
+ await reporting.batteryPercentageRemaining(endpoint, {min: constants.repInterval.MINUTES_5, max: constants.repInterval.HOUR});
476
+ },
477
+ },
478
+ {
479
+ zigbeeModel: ['HS3HT-EFA-3.0'],
480
+ model: 'HS3HT',
481
+ vendor: 'HEIMAN',
482
+ description: 'Temperature & humidity sensor with display',
483
+ fromZigbee: [fz.temperature, fz.humidity, fz.battery],
484
+ toZigbee: [],
485
+ configure: async (device, coordinatorEndpoint, logger) => {
486
+ const endpoint1 = device.getEndpoint(1);
487
+ await reporting.bind(endpoint1, coordinatorEndpoint, ['msTemperatureMeasurement', 'genPowerCfg']);
488
+ await reporting.temperature(endpoint1);
489
+ await reporting.batteryPercentageRemaining(endpoint1);
490
+ await endpoint1.read('genPowerCfg', ['batteryPercentageRemaining']);
491
+ const endpoint2 = device.getEndpoint(2);
492
+ await reporting.bind(endpoint2, coordinatorEndpoint, ['msRelativeHumidity']);
493
+ await reporting.humidity(endpoint2);
494
+ },
495
+ exposes: [e.battery(), e.temperature(), e.humidity()],
496
+ },
497
+ {
498
+ zigbeeModel: ['GASSensor-EM', '358e4e3e03c644709905034dae81433e'],
499
+ model: 'HS1CG-E',
500
+ vendor: 'HEIMAN',
501
+ description: 'Combustible gas sensor',
502
+ fromZigbee: [fz.ias_gas_alarm_1],
503
+ toZigbee: [],
504
+ whiteLabel: [{vendor: 'Piri', model: 'HSIO18008'}],
505
+ exposes: [e.gas(), e.battery_low(), e.tamper()],
506
+ },
507
+ {
508
+ zigbeeModel: ['GASSensor-EFR-3.0', 'GASSensor-EF-3.0'],
509
+ model: 'HS1CG-E_3.0',
510
+ vendor: 'HEIMAN',
511
+ description: 'Combustible gas sensor',
512
+ fromZigbee: [fz.ias_gas_alarm_2],
513
+ toZigbee: [],
514
+ exposes: [e.gas(), e.battery_low(), e.tamper()],
515
+ },
516
+ {
517
+ zigbeeModel: ['SGPHM-I1'],
518
+ model: 'SGPHM-I1',
519
+ vendor: 'HEIMAN',
520
+ description: 'Propane gas sensor',
521
+ fromZigbee: [fz.ias_gas_alarm_1],
522
+ toZigbee: [],
523
+ exposes: [e.gas(), e.battery_low(), e.tamper()],
524
+ },
525
+ {
526
+ fingerprint: [{modelID: 'Vibration-N', manufacturerName: 'HEIMAN'}],
527
+ model: 'HS1VS-N',
528
+ vendor: 'HEIMAN',
529
+ description: 'Vibration sensor',
530
+ fromZigbee: [fz.ias_vibration_alarm_1, fz.battery],
531
+ toZigbee: [],
532
+ configure: async (device, coordinatorEndpoint, logger) => {
533
+ const endpoint = device.getEndpoint(1);
534
+ await reporting.bind(endpoint, coordinatorEndpoint, ['genPowerCfg']);
535
+ await reporting.batteryPercentageRemaining(endpoint);
536
+ await endpoint.read('genPowerCfg', ['batteryPercentageRemaining']);
537
+ },
538
+ exposes: [e.vibration(), e.battery_low(), e.tamper(), e.battery()],
539
+ },
540
+ {
541
+ fingerprint: [{modelID: 'Vibration-EF_3.0', manufacturerName: 'HEIMAN'}, {modelID: 'Vibration-EF-3.0', manufacturerName: 'HEIMAN'}],
542
+ model: 'HS1VS-EF',
543
+ vendor: 'HEIMAN',
544
+ description: 'Vibration sensor',
545
+ fromZigbee: [fz.ias_vibration_alarm_1, fz.battery],
546
+ toZigbee: [],
547
+ configure: async (device, coordinatorEndpoint, logger) => {
548
+ const endpoint = device.getEndpoint(1);
549
+ await reporting.bind(endpoint, coordinatorEndpoint, ['genPowerCfg']);
550
+ await reporting.batteryPercentageRemaining(endpoint);
551
+ await endpoint.read('genPowerCfg', ['batteryPercentageRemaining']);
552
+ },
553
+ exposes: [e.vibration(), e.battery_low(), e.tamper(), e.battery()],
554
+ },
555
+ {
556
+ fingerprint: [{modelID: 'HS2AQ-EM', manufacturerName: 'HEIMAN'}],
557
+ model: 'HS2AQ-EM',
558
+ vendor: 'HEIMAN',
559
+ description: 'Air quality monitor',
560
+ fromZigbee: [fz.battery, fz.temperature, fz.humidity, fz.pm25, fz.heiman_hcho, fz.heiman_air_quality],
561
+ toZigbee: [],
562
+ configure: async (device, coordinatorEndpoint, logger) => {
563
+ const heiman = {
564
+ configureReporting: {
565
+ pm25MeasuredValue: async (endpoint, overrides) => {
566
+ const payload = reporting.payload('measuredValue', 0, constants.repInterval.HOUR, 1, overrides);
567
+ await endpoint.configureReporting('pm25Measurement', payload);
568
+ },
569
+ formAldehydeMeasuredValue: async (endpoint, overrides) => {
570
+ const payload = reporting.payload('measuredValue', 0, constants.repInterval.HOUR, 1, overrides);
571
+ await endpoint.configureReporting('heimanSpecificFormaldehydeMeasurement', payload);
572
+ },
573
+ batteryState: async (endpoint, overrides) => {
574
+ const payload = reporting.payload('batteryState', 0, constants.repInterval.HOUR, 1, overrides);
575
+ await endpoint.configureReporting('heimanSpecificAirQuality', payload);
576
+ },
577
+ pm10measuredValue: async (endpoint, overrides) => {
578
+ const payload = reporting.payload('pm10measuredValue', 0, constants.repInterval.HOUR, 1, overrides);
579
+ await endpoint.configureReporting('heimanSpecificAirQuality', payload);
580
+ },
581
+ tvocMeasuredValue: async (endpoint, overrides) => {
582
+ const payload = reporting.payload('tvocMeasuredValue', 0, constants.repInterval.HOUR, 1, overrides);
583
+ await endpoint.configureReporting('heimanSpecificAirQuality', payload);
584
+ },
585
+ aqiMeasuredValue: async (endpoint, overrides) => {
586
+ const payload = reporting.payload('aqiMeasuredValue', 0, constants.repInterval.HOUR, 1, overrides);
587
+ await endpoint.configureReporting('heimanSpecificAirQuality', payload);
588
+ },
589
+ },
590
+ };
591
+
592
+ const endpoint = device.getEndpoint(1);
593
+ await reporting.bind(endpoint, coordinatorEndpoint, [
594
+ 'genPowerCfg', 'genTime', 'msTemperatureMeasurement', 'msRelativeHumidity', 'pm25Measurement',
595
+ 'heimanSpecificFormaldehydeMeasurement', 'heimanSpecificAirQuality']);
596
+
597
+ await reporting.batteryPercentageRemaining(endpoint);
598
+ await reporting.temperature(endpoint);
599
+ await reporting.humidity(endpoint);
600
+
601
+ await heiman.configureReporting.pm25MeasuredValue(endpoint);
602
+ await heiman.configureReporting.formAldehydeMeasuredValue(endpoint);
603
+ await heiman.configureReporting.batteryState(endpoint);
604
+ await heiman.configureReporting.pm10measuredValue(endpoint);
605
+ await heiman.configureReporting.tvocMeasuredValue(endpoint);
606
+ await heiman.configureReporting.aqiMeasuredValue(endpoint);
607
+
608
+ await endpoint.read('genPowerCfg', ['batteryPercentageRemaining']);
609
+
610
+ // Seems that it is bug in HEIMAN, device does not asks for the time with binding
611
+ // So, we need to write time during configure
612
+ const time = Math.round(((new Date()).getTime() - constants.OneJanuary2000) / 1000);
613
+ // Time-master + synchronised
614
+ const values = {timeStatus: 3, time: time, timeZone: ((new Date()).getTimezoneOffset() * -1) * 60};
615
+ endpoint.write('genTime', values);
616
+ },
617
+ exposes: [e.battery(), e.temperature(), e.humidity(), e.pm25(), e.hcho(), e.voc(), e.aqi(), e.pm10(),
618
+ exposes.enum('battery_state', ea.STATE, ['not_charging', 'charging', 'charged'])],
619
+ },
620
+ {
621
+ fingerprint: [{modelID: 'IRControl-EM', manufacturerName: 'HEIMAN'}],
622
+ model: 'HS2IRC',
623
+ vendor: 'HEIMAN',
624
+ description: 'Smart IR Control',
625
+ fromZigbee: [fz.battery, fz.heiman_ir_remote],
626
+ toZigbee: [tz.heiman_ir_remote],
627
+ exposes: [e.battery()],
628
+ configure: async (device, coordinatorEndpoint, logger) => {
629
+ const endpoint = device.getEndpoint(1);
630
+ await reporting.bind(endpoint, coordinatorEndpoint, ['genPowerCfg', 'heimanSpecificInfraRedRemote']);
631
+ await reporting.batteryPercentageRemaining(endpoint);
632
+ },
633
+ },
634
+ {
635
+ zigbeeModel: ['BDHM8E27W70-I1'],
636
+ model: 'BDHM8E27W70-I1',
637
+ vendor: 'GS', // actually it is HEIMAN.
638
+ description: 'Active light, warm to cool white (E27 & B22)',
639
+ extend: extend.light_onoff_brightness_colortemp(),
640
+ },
641
+ {
642
+ zigbeeModel: ['HS2SW1L-EF-3.0', 'HS2SW1L-EFR-3.0', 'HS2SW1A-N'],
643
+ fingerprint: [
644
+ {modelID: 'HS2SW1A-EF-3.0', manufacturerName: 'HEIMAN'},
645
+ {modelID: 'HS2SW1A-EFR-3.0', manufacturerName: 'HEIMAN'},
646
+ ],
647
+ model: 'HS2SW1A/HS2SW1A-N',
648
+ vendor: 'HEIMAN',
649
+ description: 'Smart switch - 1 gang with neutral wire',
650
+ fromZigbee: [fz.ignore_basic_report, fz.on_off, fz.device_temperature],
651
+ toZigbee: [tz.on_off],
652
+ configure: async (device, coordinatorEndpoint, logger) => {
653
+ const endpoint = device.getEndpoint(1);
654
+ await reporting.bind(endpoint, coordinatorEndpoint, ['genOnOff', 'genDeviceTempCfg']);
655
+ await reporting.onOff(endpoint);
656
+ await reporting.deviceTemperature(endpoint);
657
+ },
658
+ exposes: [e.switch(), e.device_temperature()],
659
+ },
660
+ {
661
+ zigbeeModel: ['HS2SW2L-EF-3.0', 'HS2SW2L-EFR-3.0', 'HS2SW2A-N'],
662
+ fingerprint: [
663
+ {modelID: 'HS2SW2A-EF-3.0', manufacturerName: 'HEIMAN'},
664
+ {modelID: 'HS2SW2A-EFR-3.0', manufacturerName: 'HEIMAN'},
665
+ ],
666
+ model: 'HS2SW2A/HS2SW2A-N',
667
+ vendor: 'HEIMAN',
668
+ description: 'Smart switch - 2 gang with neutral wire',
669
+ fromZigbee: [fz.ignore_basic_report, fz.on_off, fz.device_temperature],
670
+ toZigbee: [tz.on_off],
671
+ endpoint: (device) => {
672
+ return {left: 1, right: 2};
673
+ },
674
+ meta: {multiEndpoint: true},
675
+ configure: async (device, coordinatorEndpoint, logger) => {
676
+ await reporting.bind(device.getEndpoint(1), coordinatorEndpoint, ['genOnOff', 'genDeviceTempCfg']);
677
+ await reporting.bind(device.getEndpoint(2), coordinatorEndpoint, ['genOnOff']);
678
+ await reporting.deviceTemperature(device.getEndpoint(1));
679
+ },
680
+ exposes: [e.switch().withEndpoint('left'), e.switch().withEndpoint('right'), e.device_temperature()],
681
+ },
682
+ {
683
+ zigbeeModel: ['HS2SW3L-EF-3.0', 'HS2SW3L-EFR-3.0', 'HS2SW3A-N'],
684
+ fingerprint: [
685
+ {modelID: 'HS2SW3A-EF-3.0', manufacturerName: 'HEIMAN'},
686
+ {modelID: 'HS2SW3A-EFR-3.0', manufacturerName: 'HEIMAN'},
687
+ ],
688
+ model: 'HS2SW3A/HS2SW3A-N',
689
+ vendor: 'HEIMAN',
690
+ description: 'Smart switch - 3 gang with neutral wire',
691
+ fromZigbee: [fz.ignore_basic_report, fz.on_off, fz.device_temperature],
692
+ toZigbee: [tz.on_off],
693
+ endpoint: (device) => {
694
+ return {left: 1, center: 2, right: 3};
695
+ },
696
+ meta: {multiEndpoint: true},
697
+ configure: async (device, coordinatorEndpoint, logger) => {
698
+ await reporting.bind(device.getEndpoint(1), coordinatorEndpoint, ['genOnOff', 'genDeviceTempCfg']);
699
+ await reporting.bind(device.getEndpoint(2), coordinatorEndpoint, ['genOnOff']);
700
+ await reporting.bind(device.getEndpoint(3), coordinatorEndpoint, ['genOnOff']);
701
+ await reporting.deviceTemperature(device.getEndpoint(1));
702
+ },
703
+ exposes: [e.switch().withEndpoint('left'), e.switch().withEndpoint('center'), e.switch().withEndpoint('right'),
704
+ e.device_temperature()],
705
+ },
706
+ {
707
+ zigbeeModel: ['TemperLight'],
708
+ model: 'HS2WDS',
709
+ vendor: 'HEIMAN',
710
+ description: 'LED 9W CCT E27',
711
+ extend: extend.light_onoff_brightness_colortemp({colorTempRange: [153, 370]}),
712
+ },
713
+ {
714
+ zigbeeModel: ['CurtainMo-EF-3.0', 'CurtainMo-EF'],
715
+ model: 'HS2CM-N-DC',
716
+ vendor: 'HEIMAN',
717
+ description: 'Gear window shade motor',
718
+ fromZigbee: [fz.cover_position_via_brightness],
719
+ toZigbee: [tz.cover_via_brightness],
720
+ configure: async (device, coordinatorEndpoint, logger) => {
721
+ const endpoint = device.getEndpoint(1);
722
+ await reporting.bind(endpoint, coordinatorEndpoint, ['genLevelCtrl', 'genPowerCfg']);
723
+ await reporting.brightness(endpoint);
724
+ },
725
+ exposes: [e.cover_position().setAccess('state', ea.ALL)],
726
+ },
727
+ {
728
+ zigbeeModel: ['PIR_TPV16'],
729
+ model: 'HS1MS-M',
730
+ vendor: 'HEIMAN',
731
+ description: 'Smart motion sensor',
732
+ fromZigbee: [fz.ias_occupancy_alarm_1],
733
+ toZigbee: [],
734
+ exposes: [e.occupancy(), e.battery_low(), e.tamper()],
735
+ },
736
+ {
737
+ zigbeeModel: ['TY0202'],
738
+ model: 'HS1MS-EF',
739
+ vendor: 'HEIMAN',
740
+ description: 'Smart motion sensor',
741
+ fromZigbee: [fz.ias_occupancy_alarm_1],
742
+ toZigbee: [],
743
+ exposes: [e.occupancy(), e.battery_low(), e.tamper()],
744
+ },
745
+ {
746
+ fingerprint: [{modelID: 'DoorBell-EM', manufacturerName: 'HEIMAN'}],
747
+ model: 'HS2DB',
748
+ vendor: 'HEIMAN',
749
+ description: 'Smart doorbell button',
750
+ fromZigbee: [fz.battery, fz.heiman_doorbell_button, fz.ignore_basic_report],
751
+ toZigbee: [],
752
+ configure: async (device, coordinatorEndpoint, logger) => {
753
+ const endpoint = device.getEndpoint(1);
754
+ await reporting.bind(endpoint, coordinatorEndpoint, ['genPowerCfg']);
755
+ await reporting.batteryPercentageRemaining(endpoint);
756
+ },
757
+ exposes: [e.battery(), e.action(['pressed']), e.battery_low(), e.tamper()],
758
+ },
759
+ {
760
+ fingerprint: [{modelID: 'DoorBell-EF-3.0', manufacturerName: 'HEIMAN'}],
761
+ model: 'HS2SS-E_V03',
762
+ vendor: 'HEIMAN',
763
+ description: 'Smart doorbell button',
764
+ fromZigbee: [fz.battery, fz.heiman_doorbell_button, fz.ignore_basic_report],
765
+ toZigbee: [],
766
+ configure: async (device, coordinatorEndpoint, logger) => {
767
+ const endpoint = device.getEndpoint(1);
768
+ await reporting.bind(endpoint, coordinatorEndpoint, ['genPowerCfg']);
769
+ await reporting.batteryPercentageRemaining(endpoint);
770
+ },
771
+ exposes: [e.battery(), e.action(['pressed']), e.battery_low(), e.tamper()],
772
+ },
773
+ {
774
+ zigbeeModel: ['HS3AQ-EFA-3.0'],
775
+ model: 'HS3AQ',
776
+ vendor: 'HEIMAN',
777
+ description: 'Smart air quality monitor',
778
+ fromZigbee: [fz.co2, fz.humidity, fz.battery, fz.temperature],
779
+ toZigbee: [],
780
+ configure: async (device, coordinatorEndpoint, logger) => {
781
+ const endpoint = device.getEndpoint(1);
782
+ await reporting.bind(endpoint, coordinatorEndpoint, ['msRelativeHumidity', 'genPowerCfg', 'msTemperatureMeasurement', 'msCO2']);
783
+ await reporting.batteryPercentageRemaining(endpoint);
784
+ await reporting.temperature(endpoint, {min: 1, max: constants.repInterval.MINUTES_5, change: 10}); // 0.1 degree change
785
+ await reporting.humidity(endpoint, {min: 1, max: constants.repInterval.MINUTES_5, change: 10}); // 0.1 % change
786
+ await reporting.co2(endpoint, {min: 5, max: constants.repInterval.MINUTES_5, change: 0.00005}); // 50 ppm change
787
+ },
788
+ exposes: [e.co2(), e.battery(), e.humidity(), e.temperature()],
789
+ },
790
+ {
791
+ zigbeeModel: ['RouteLight-EF-3.0'],
792
+ model: 'HS2RNL',
793
+ vendor: 'HEIMAN',
794
+ description: 'Smart repeater & night light',
795
+ fromZigbee: [fz.on_off, fz.battery],
796
+ toZigbee: [tz.on_off],
797
+ configure: async (device, coordinatorEndpoint, logger) => {
798
+ const endpoint = device.getEndpoint(1);
799
+ await reporting.bind(endpoint, coordinatorEndpoint, ['genPowerCfg', 'genOnOff', 'genLevelCtrl']);
800
+ await reporting.onOff(endpoint); // switch the night light on/off
801
+ await reporting.batteryPercentageRemaining(endpoint); // internal backup battery in case of power outage
802
+ },
803
+ exposes: [e.switch(), e.battery()],
804
+ },
805
+ ];