@willieee802/zigbee-herdsman-converters 19.44.4 → 19.45.0

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 (591) hide show
  1. package/CHANGELOG.md +1101 -0
  2. package/dist/converters/actions.d.ts.map +1 -1
  3. package/dist/converters/actions.js +2 -0
  4. package/dist/converters/actions.js.map +1 -1
  5. package/dist/converters/fromZigbee.d.ts +1 -150
  6. package/dist/converters/fromZigbee.d.ts.map +1 -1
  7. package/dist/converters/fromZigbee.js +183 -3044
  8. package/dist/converters/fromZigbee.js.map +1 -1
  9. package/dist/converters/toZigbee.d.ts +0 -121
  10. package/dist/converters/toZigbee.d.ts.map +1 -1
  11. package/dist/converters/toZigbee.js +289 -2386
  12. package/dist/converters/toZigbee.js.map +1 -1
  13. package/dist/devices/ITCommander.d.ts.map +1 -1
  14. package/dist/devices/ITCommander.js +2 -1
  15. package/dist/devices/ITCommander.js.map +1 -1
  16. package/dist/devices/acova.d.ts.map +1 -1
  17. package/dist/devices/acova.js +69 -2
  18. package/dist/devices/acova.js.map +1 -1
  19. package/dist/devices/adeo.d.ts.map +1 -1
  20. package/dist/devices/adeo.js +35 -3
  21. package/dist/devices/adeo.js.map +1 -1
  22. package/dist/devices/adurosmart.js +1 -1
  23. package/dist/devices/adurosmart.js.map +1 -1
  24. package/dist/devices/amina.d.ts.map +1 -1
  25. package/dist/devices/amina.js +47 -10
  26. package/dist/devices/amina.js.map +1 -1
  27. package/dist/devices/aurora_lighting.d.ts.map +1 -1
  28. package/dist/devices/aurora_lighting.js +15 -0
  29. package/dist/devices/aurora_lighting.js.map +1 -1
  30. package/dist/devices/automaton.d.ts.map +1 -1
  31. package/dist/devices/automaton.js +1 -0
  32. package/dist/devices/automaton.js.map +1 -1
  33. package/dist/devices/avatto.d.ts.map +1 -1
  34. package/dist/devices/avatto.js +29 -24
  35. package/dist/devices/avatto.js.map +1 -1
  36. package/dist/devices/awox.d.ts.map +1 -1
  37. package/dist/devices/awox.js +41 -3
  38. package/dist/devices/awox.js.map +1 -1
  39. package/dist/devices/bacchus.d.ts.map +1 -1
  40. package/dist/devices/bacchus.js +75 -0
  41. package/dist/devices/bacchus.js.map +1 -1
  42. package/dist/devices/bitron.d.ts.map +1 -1
  43. package/dist/devices/bitron.js +29 -2
  44. package/dist/devices/bitron.js.map +1 -1
  45. package/dist/devices/bosch.d.ts.map +1 -1
  46. package/dist/devices/bosch.js +70 -50
  47. package/dist/devices/bosch.js.map +1 -1
  48. package/dist/devices/bticino.d.ts.map +1 -1
  49. package/dist/devices/bticino.js +11 -1
  50. package/dist/devices/bticino.js.map +1 -1
  51. package/dist/devices/byun.d.ts.map +1 -1
  52. package/dist/devices/byun.js +40 -3
  53. package/dist/devices/byun.js.map +1 -1
  54. package/dist/devices/candeo.d.ts.map +1 -1
  55. package/dist/devices/candeo.js +262 -9
  56. package/dist/devices/candeo.js.map +1 -1
  57. package/dist/devices/centralite.d.ts +9 -0
  58. package/dist/devices/centralite.d.ts.map +1 -1
  59. package/dist/devices/centralite.js +44 -5
  60. package/dist/devices/centralite.js.map +1 -1
  61. package/dist/devices/{aubess.d.ts → cigol.d.ts} +1 -1
  62. package/dist/devices/cigol.d.ts.map +1 -0
  63. package/dist/devices/cigol.js +260 -0
  64. package/dist/devices/cigol.js.map +1 -0
  65. package/dist/devices/cleverio.js +2 -2
  66. package/dist/devices/cleverio.js.map +1 -1
  67. package/dist/devices/climax.d.ts.map +1 -1
  68. package/dist/devices/climax.js +15 -1
  69. package/dist/devices/climax.js.map +1 -1
  70. package/dist/devices/ctm.d.ts.map +1 -1
  71. package/dist/devices/ctm.js +845 -496
  72. package/dist/devices/ctm.js.map +1 -1
  73. package/dist/devices/custom_devices_diy.d.ts +183 -1
  74. package/dist/devices/custom_devices_diy.d.ts.map +1 -1
  75. package/dist/devices/custom_devices_diy.js +390 -33
  76. package/dist/devices/custom_devices_diy.js.map +1 -1
  77. package/dist/devices/daewoo.d.ts +3 -0
  78. package/dist/devices/daewoo.d.ts.map +1 -0
  79. package/dist/devices/daewoo.js +198 -0
  80. package/dist/devices/daewoo.js.map +1 -0
  81. package/dist/devices/danfoss.d.ts.map +1 -1
  82. package/dist/devices/danfoss.js +1270 -296
  83. package/dist/devices/danfoss.js.map +1 -1
  84. package/dist/devices/databyte.d.ts.map +1 -1
  85. package/dist/devices/databyte.js +47 -3
  86. package/dist/devices/databyte.js.map +1 -1
  87. package/dist/devices/datek.d.ts.map +1 -1
  88. package/dist/devices/datek.js +202 -41
  89. package/dist/devices/datek.js.map +1 -1
  90. package/dist/devices/dawon_dns.d.ts.map +1 -1
  91. package/dist/devices/dawon_dns.js +14 -1
  92. package/dist/devices/dawon_dns.js.map +1 -1
  93. package/dist/devices/develco.d.ts.map +1 -1
  94. package/dist/devices/develco.js +145 -64
  95. package/dist/devices/develco.js.map +1 -1
  96. package/dist/devices/diyruz.d.ts.map +1 -1
  97. package/dist/devices/diyruz.js +444 -20
  98. package/dist/devices/diyruz.js.map +1 -1
  99. package/dist/devices/domraem.d.ts.map +1 -1
  100. package/dist/devices/domraem.js +7 -0
  101. package/dist/devices/domraem.js.map +1 -1
  102. package/dist/devices/easyaccess.d.ts.map +1 -1
  103. package/dist/devices/easyaccess.js +22 -2
  104. package/dist/devices/easyaccess.js.map +1 -1
  105. package/dist/devices/easyiot.d.ts.map +1 -1
  106. package/dist/devices/easyiot.js +767 -5
  107. package/dist/devices/easyiot.js.map +1 -1
  108. package/dist/devices/echostar.d.ts.map +1 -1
  109. package/dist/devices/echostar.js +25 -1
  110. package/dist/devices/echostar.js.map +1 -1
  111. package/dist/devices/ecodim.d.ts.map +1 -1
  112. package/dist/devices/ecodim.js +8 -0
  113. package/dist/devices/ecodim.js.map +1 -1
  114. package/dist/devices/ecolink.d.ts.map +1 -1
  115. package/dist/devices/ecolink.js +12 -0
  116. package/dist/devices/ecolink.js.map +1 -1
  117. package/dist/devices/efekta.d.ts.map +1 -1
  118. package/dist/devices/efekta.js +1615 -60
  119. package/dist/devices/efekta.js.map +1 -1
  120. package/dist/devices/eglo.d.ts.map +1 -1
  121. package/dist/devices/eglo.js +203 -17
  122. package/dist/devices/eglo.js.map +1 -1
  123. package/dist/devices/elko.d.ts.map +1 -1
  124. package/dist/devices/elko.js +20 -22
  125. package/dist/devices/elko.js.map +1 -1
  126. package/dist/devices/engo.d.ts.map +1 -1
  127. package/dist/devices/engo.js +201 -0
  128. package/dist/devices/engo.js.map +1 -1
  129. package/dist/devices/enocean.d.ts.map +1 -1
  130. package/dist/devices/enocean.js +132 -4
  131. package/dist/devices/enocean.js.map +1 -1
  132. package/dist/devices/ensystec.d.ts +3 -0
  133. package/dist/devices/ensystec.d.ts.map +1 -0
  134. package/dist/devices/ensystec.js +1200 -0
  135. package/dist/devices/ensystec.js.map +1 -0
  136. package/dist/devices/eurotronic.d.ts +78 -1
  137. package/dist/devices/eurotronic.d.ts.map +1 -1
  138. package/dist/devices/eurotronic.js +244 -40
  139. package/dist/devices/eurotronic.js.map +1 -1
  140. package/dist/devices/ewelink.d.ts.map +1 -1
  141. package/dist/devices/ewelink.js +154 -2
  142. package/dist/devices/ewelink.js.map +1 -1
  143. package/dist/devices/fantem.js +1 -1
  144. package/dist/devices/fantem.js.map +1 -1
  145. package/dist/devices/fireangel.d.ts.map +1 -1
  146. package/dist/devices/fireangel.js +12 -1
  147. package/dist/devices/fireangel.js.map +1 -1
  148. package/dist/devices/frankever.d.ts.map +1 -1
  149. package/dist/devices/frankever.js +96 -0
  150. package/dist/devices/frankever.js.map +1 -1
  151. package/dist/devices/frient.d.ts.map +1 -1
  152. package/dist/devices/frient.js +15 -0
  153. package/dist/devices/frient.js.map +1 -1
  154. package/dist/devices/girier.js +1 -1
  155. package/dist/devices/girier.js.map +1 -1
  156. package/dist/devices/gledopto.js +1 -1
  157. package/dist/devices/gledopto.js.map +1 -1
  158. package/dist/devices/gmmts.d.ts.map +1 -1
  159. package/dist/devices/gmmts.js +59 -55
  160. package/dist/devices/gmmts.js.map +1 -1
  161. package/dist/devices/halo_smart_labs.d.ts +3 -0
  162. package/dist/devices/halo_smart_labs.d.ts.map +1 -0
  163. package/dist/devices/halo_smart_labs.js +918 -0
  164. package/dist/devices/halo_smart_labs.js.map +1 -0
  165. package/dist/devices/handshake_finland.d.ts +3 -0
  166. package/dist/devices/handshake_finland.d.ts.map +1 -0
  167. package/dist/devices/handshake_finland.js +15 -0
  168. package/dist/devices/handshake_finland.js.map +1 -0
  169. package/dist/devices/heiman.d.ts.map +1 -1
  170. package/dist/devices/heiman.js +1361 -147
  171. package/dist/devices/heiman.js.map +1 -1
  172. package/dist/devices/heimgard_technologies.d.ts.map +1 -1
  173. package/dist/devices/heimgard_technologies.js +13 -0
  174. package/dist/devices/heimgard_technologies.js.map +1 -1
  175. package/dist/devices/hive.d.ts.map +1 -1
  176. package/dist/devices/hive.js +11 -0
  177. package/dist/devices/hive.js.map +1 -1
  178. package/dist/devices/ikea.d.ts.map +1 -1
  179. package/dist/devices/ikea.js +185 -135
  180. package/dist/devices/ikea.js.map +1 -1
  181. package/dist/devices/iluminize.d.ts.map +1 -1
  182. package/dist/devices/iluminize.js +8 -7
  183. package/dist/devices/iluminize.js.map +1 -1
  184. package/dist/devices/immax.d.ts.map +1 -1
  185. package/dist/devices/immax.js +3 -1
  186. package/dist/devices/immax.js.map +1 -1
  187. package/dist/devices/index.d.ts.map +1 -1
  188. package/dist/devices/index.js +20 -2
  189. package/dist/devices/index.js.map +1 -1
  190. package/dist/devices/innr.d.ts.map +1 -1
  191. package/dist/devices/innr.js +34 -2
  192. package/dist/devices/innr.js.map +1 -1
  193. package/dist/devices/inovelli.d.ts.map +1 -1
  194. package/dist/devices/inovelli.js +41 -2348
  195. package/dist/devices/inovelli.js.map +1 -1
  196. package/dist/devices/iris.d.ts.map +1 -1
  197. package/dist/devices/iris.js +13 -1
  198. package/dist/devices/iris.js.map +1 -1
  199. package/dist/devices/javis.d.ts.map +1 -1
  200. package/dist/devices/javis.js +39 -1
  201. package/dist/devices/javis.js.map +1 -1
  202. package/dist/devices/jxuan.d.ts.map +1 -1
  203. package/dist/devices/jxuan.js +37 -2
  204. package/dist/devices/jxuan.js.map +1 -1
  205. package/dist/devices/kami.d.ts.map +1 -1
  206. package/dist/devices/kami.js +21 -2
  207. package/dist/devices/kami.js.map +1 -1
  208. package/dist/devices/keen_home.d.ts.map +1 -1
  209. package/dist/devices/keen_home.js +13 -3
  210. package/dist/devices/keen_home.js.map +1 -1
  211. package/dist/devices/klikaanklikuit.d.ts.map +1 -1
  212. package/dist/devices/klikaanklikuit.js +7 -0
  213. package/dist/devices/klikaanklikuit.js.map +1 -1
  214. package/dist/devices/kmpcil.d.ts.map +1 -1
  215. package/dist/devices/kmpcil.js +44 -5
  216. package/dist/devices/kmpcil.js.map +1 -1
  217. package/dist/devices/konke.d.ts.map +1 -1
  218. package/dist/devices/konke.js +10 -1
  219. package/dist/devices/konke.js.map +1 -1
  220. package/dist/devices/lds.d.ts.map +1 -1
  221. package/dist/devices/lds.js +7 -0
  222. package/dist/devices/lds.js.map +1 -1
  223. package/dist/devices/led_trading.d.ts.map +1 -1
  224. package/dist/devices/led_trading.js +13 -13
  225. package/dist/devices/led_trading.js.map +1 -1
  226. package/dist/devices/leedarson.d.ts.map +1 -1
  227. package/dist/devices/leedarson.js +140 -1
  228. package/dist/devices/leedarson.js.map +1 -1
  229. package/dist/devices/legrand.d.ts.map +1 -1
  230. package/dist/devices/legrand.js +73 -42
  231. package/dist/devices/legrand.js.map +1 -1
  232. package/dist/devices/lellki.d.ts.map +1 -1
  233. package/dist/devices/lellki.js +3 -1
  234. package/dist/devices/lellki.js.map +1 -1
  235. package/dist/devices/letv.d.ts.map +1 -1
  236. package/dist/devices/letv.js +16 -2
  237. package/dist/devices/letv.js.map +1 -1
  238. package/dist/devices/lidl.d.ts.map +1 -1
  239. package/dist/devices/lidl.js +26 -6
  240. package/dist/devices/lidl.js.map +1 -1
  241. package/dist/devices/lincukoo.d.ts.map +1 -1
  242. package/dist/devices/lincukoo.js +92 -31
  243. package/dist/devices/lincukoo.js.map +1 -1
  244. package/dist/devices/linkind.d.ts.map +1 -1
  245. package/dist/devices/linkind.js +14 -1
  246. package/dist/devices/linkind.js.map +1 -1
  247. package/dist/devices/linptech.d.ts.map +1 -1
  248. package/dist/devices/linptech.js +3 -1
  249. package/dist/devices/linptech.js.map +1 -1
  250. package/dist/devices/livingwise.d.ts.map +1 -1
  251. package/dist/devices/livingwise.js +2 -1
  252. package/dist/devices/livingwise.js.map +1 -1
  253. package/dist/devices/livolo.d.ts.map +1 -1
  254. package/dist/devices/livolo.js +612 -20
  255. package/dist/devices/livolo.js.map +1 -1
  256. package/dist/devices/lixee.d.ts.map +1 -1
  257. package/dist/devices/lixee.js +46 -44
  258. package/dist/devices/lixee.js.map +1 -1
  259. package/dist/devices/lonsonho.d.ts.map +1 -1
  260. package/dist/devices/lonsonho.js +18 -11
  261. package/dist/devices/lonsonho.js.map +1 -1
  262. package/dist/devices/lumi.d.ts.map +1 -1
  263. package/dist/devices/lumi.js +877 -155
  264. package/dist/devices/lumi.js.map +1 -1
  265. package/dist/devices/lytko.d.ts.map +1 -1
  266. package/dist/devices/lytko.js +205 -556
  267. package/dist/devices/lytko.js.map +1 -1
  268. package/dist/devices/makegood.d.ts.map +1 -1
  269. package/dist/devices/makegood.js +5 -1
  270. package/dist/devices/makegood.js.map +1 -1
  271. package/dist/devices/mazda.js +7 -7
  272. package/dist/devices/mazda.js.map +1 -1
  273. package/dist/devices/meazon.d.ts.map +1 -1
  274. package/dist/devices/meazon.js +82 -20
  275. package/dist/devices/meazon.js.map +1 -1
  276. package/dist/devices/megaman.d.ts +4 -0
  277. package/dist/devices/megaman.d.ts.map +1 -0
  278. package/dist/devices/megaman.js +48 -0
  279. package/dist/devices/megaman.js.map +1 -0
  280. package/dist/devices/mercator.d.ts.map +1 -1
  281. package/dist/devices/mercator.js +20 -5
  282. package/dist/devices/mercator.js.map +1 -1
  283. package/dist/devices/miboxer.d.ts.map +1 -1
  284. package/dist/devices/miboxer.js +3 -1
  285. package/dist/devices/miboxer.js.map +1 -1
  286. package/dist/devices/mill.d.ts.map +1 -1
  287. package/dist/devices/mill.js +33 -7
  288. package/dist/devices/mill.js.map +1 -1
  289. package/dist/devices/moes.d.ts.map +1 -1
  290. package/dist/devices/moes.js +89 -15
  291. package/dist/devices/moes.js.map +1 -1
  292. package/dist/devices/msh.d.ts +3 -0
  293. package/dist/devices/msh.d.ts.map +1 -0
  294. package/dist/devices/msh.js +93 -0
  295. package/dist/devices/msh.js.map +1 -0
  296. package/dist/devices/muller_licht.d.ts.map +1 -1
  297. package/dist/devices/muller_licht.js +11 -0
  298. package/dist/devices/muller_licht.js.map +1 -1
  299. package/dist/devices/multir.d.ts.map +1 -1
  300. package/dist/devices/multir.js +12 -1
  301. package/dist/devices/multir.js.map +1 -1
  302. package/dist/devices/multiterm.js +2 -2
  303. package/dist/devices/multiterm.js.map +1 -1
  304. package/dist/devices/namron.d.ts.map +1 -1
  305. package/dist/devices/namron.js +488 -128
  306. package/dist/devices/namron.js.map +1 -1
  307. package/dist/devices/neo.d.ts.map +1 -1
  308. package/dist/devices/neo.js +151 -192
  309. package/dist/devices/neo.js.map +1 -1
  310. package/dist/devices/netica.d.ts +3 -0
  311. package/dist/devices/netica.d.ts.map +1 -0
  312. package/dist/devices/netica.js +153 -0
  313. package/dist/devices/netica.js.map +1 -0
  314. package/dist/devices/niko.d.ts.map +1 -1
  315. package/dist/devices/niko.js +10 -8
  316. package/dist/devices/niko.js.map +1 -1
  317. package/dist/devices/nodon.d.ts.map +1 -1
  318. package/dist/devices/nodon.js +6 -4
  319. package/dist/devices/nodon.js.map +1 -1
  320. package/dist/devices/nous.d.ts.map +1 -1
  321. package/dist/devices/nous.js +160 -61
  322. package/dist/devices/nous.js.map +1 -1
  323. package/dist/devices/nue_3a.d.ts.map +1 -1
  324. package/dist/devices/nue_3a.js +2 -0
  325. package/dist/devices/nue_3a.js.map +1 -1
  326. package/dist/devices/onesti.d.ts +11 -1
  327. package/dist/devices/onesti.d.ts.map +1 -1
  328. package/dist/devices/onesti.js +30 -6
  329. package/dist/devices/onesti.js.map +1 -1
  330. package/dist/devices/onokom.d.ts.map +1 -1
  331. package/dist/devices/onokom.js +1152 -2309
  332. package/dist/devices/onokom.js.map +1 -1
  333. package/dist/devices/orvibo.d.ts +17 -1
  334. package/dist/devices/orvibo.d.ts.map +1 -1
  335. package/dist/devices/orvibo.js +71 -4
  336. package/dist/devices/orvibo.js.map +1 -1
  337. package/dist/devices/owon.d.ts.map +1 -1
  338. package/dist/devices/owon.js +382 -62
  339. package/dist/devices/owon.js.map +1 -1
  340. package/dist/devices/paul_neuhaus.d.ts.map +1 -1
  341. package/dist/devices/paul_neuhaus.js +9 -0
  342. package/dist/devices/paul_neuhaus.js.map +1 -1
  343. package/dist/devices/paulmann.js +2 -2
  344. package/dist/devices/paulmann.js.map +1 -1
  345. package/dist/devices/perenio.d.ts.map +1 -1
  346. package/dist/devices/perenio.js +57 -39
  347. package/dist/devices/perenio.js.map +1 -1
  348. package/dist/devices/philips.d.ts.map +1 -1
  349. package/dist/devices/philips.js +194 -53
  350. package/dist/devices/philips.js.map +1 -1
  351. package/dist/devices/plaid.d.ts.map +1 -1
  352. package/dist/devices/plaid.js +18 -1
  353. package/dist/devices/plaid.js.map +1 -1
  354. package/dist/devices/plugwise.d.ts.map +1 -1
  355. package/dist/devices/plugwise.js +307 -26
  356. package/dist/devices/plugwise.js.map +1 -1
  357. package/dist/devices/profalux.d.ts.map +1 -1
  358. package/dist/devices/profalux.js +25 -1
  359. package/dist/devices/profalux.js.map +1 -1
  360. package/dist/devices/pushok.d.ts.map +1 -1
  361. package/dist/devices/pushok.js +44 -0
  362. package/dist/devices/pushok.js.map +1 -1
  363. package/dist/devices/qa.d.ts.map +1 -1
  364. package/dist/devices/qa.js +80 -32
  365. package/dist/devices/qa.js.map +1 -1
  366. package/dist/devices/repenic_ltd.d.ts +3 -0
  367. package/dist/devices/repenic_ltd.d.ts.map +1 -0
  368. package/dist/devices/repenic_ltd.js +97 -0
  369. package/dist/devices/repenic_ltd.js.map +1 -0
  370. package/dist/devices/robb.d.ts.map +1 -1
  371. package/dist/devices/robb.js +13 -1
  372. package/dist/devices/robb.js.map +1 -1
  373. package/dist/devices/rtx.js +1 -1
  374. package/dist/devices/rtx.js.map +1 -1
  375. package/dist/devices/salus_controls.d.ts.map +1 -1
  376. package/dist/devices/salus_controls.js +44 -17
  377. package/dist/devices/salus_controls.js.map +1 -1
  378. package/dist/devices/samotech.js +2 -2
  379. package/dist/devices/samotech.js.map +1 -1
  380. package/dist/devices/sber.d.ts.map +1 -1
  381. package/dist/devices/sber.js +435 -26
  382. package/dist/devices/sber.js.map +1 -1
  383. package/dist/devices/schneider_electric.d.ts.map +1 -1
  384. package/dist/devices/schneider_electric.js +808 -252
  385. package/dist/devices/schneider_electric.js.map +1 -1
  386. package/dist/devices/securifi.d.ts.map +1 -1
  387. package/dist/devices/securifi.js +24 -1
  388. package/dist/devices/securifi.js.map +1 -1
  389. package/dist/devices/sengled.d.ts.map +1 -1
  390. package/dist/devices/sengled.js +5 -4
  391. package/dist/devices/sengled.js.map +1 -1
  392. package/dist/devices/shada.d.ts +3 -0
  393. package/dist/devices/shada.d.ts.map +1 -0
  394. package/dist/devices/{aubess.js → shada.js} +7 -20
  395. package/dist/devices/shada.js.map +1 -0
  396. package/dist/devices/shelly.d.ts.map +1 -1
  397. package/dist/devices/shelly.js +646 -61
  398. package/dist/devices/shelly.js.map +1 -1
  399. package/dist/devices/shinasystem.d.ts.map +1 -1
  400. package/dist/devices/shinasystem.js +75 -16
  401. package/dist/devices/shinasystem.js.map +1 -1
  402. package/dist/devices/siglis.d.ts.map +1 -1
  403. package/dist/devices/siglis.js +26 -0
  404. package/dist/devices/siglis.js.map +1 -1
  405. package/dist/devices/sinope.d.ts.map +1 -1
  406. package/dist/devices/sinope.js +163 -83
  407. package/dist/devices/sinope.js.map +1 -1
  408. package/dist/devices/slacky_diy.d.ts.map +1 -1
  409. package/dist/devices/slacky_diy.js +3007 -69
  410. package/dist/devices/slacky_diy.js.map +1 -1
  411. package/dist/devices/smarli.d.ts.map +1 -1
  412. package/dist/devices/smarli.js +4 -5
  413. package/dist/devices/smarli.js.map +1 -1
  414. package/dist/devices/smartthings.d.ts +25 -0
  415. package/dist/devices/smartthings.d.ts.map +1 -1
  416. package/dist/devices/smartthings.js +62 -11
  417. package/dist/devices/smartthings.js.map +1 -1
  418. package/dist/devices/somfy.d.ts.map +1 -1
  419. package/dist/devices/somfy.js +14 -1
  420. package/dist/devices/somfy.js.map +1 -1
  421. package/dist/devices/sonoff.d.ts +42 -1
  422. package/dist/devices/sonoff.d.ts.map +1 -1
  423. package/dist/devices/sonoff.js +5161 -2007
  424. package/dist/devices/sonoff.js.map +1 -1
  425. package/dist/devices/sprut.d.ts.map +1 -1
  426. package/dist/devices/sprut.js +5 -4
  427. package/dist/devices/sprut.js.map +1 -1
  428. package/dist/devices/stello.d.ts.map +1 -1
  429. package/dist/devices/stello.js +6 -24
  430. package/dist/devices/stello.js.map +1 -1
  431. package/dist/devices/stelpro.d.ts +51 -1
  432. package/dist/devices/stelpro.d.ts.map +1 -1
  433. package/dist/devices/stelpro.js +86 -23
  434. package/dist/devices/stelpro.js.map +1 -1
  435. package/dist/devices/sunricher.d.ts.map +1 -1
  436. package/dist/devices/sunricher.js +215 -29
  437. package/dist/devices/sunricher.js.map +1 -1
  438. package/dist/devices/tech.d.ts.map +1 -1
  439. package/dist/devices/tech.js +35 -35
  440. package/dist/devices/tech.js.map +1 -1
  441. package/dist/devices/terncy.d.ts.map +1 -1
  442. package/dist/devices/terncy.js +398 -2
  443. package/dist/devices/terncy.js.map +1 -1
  444. package/dist/devices/third_reality.d.ts +42 -1
  445. package/dist/devices/third_reality.d.ts.map +1 -1
  446. package/dist/devices/third_reality.js +521 -110
  447. package/dist/devices/third_reality.js.map +1 -1
  448. package/dist/devices/tuya.d.ts.map +1 -1
  449. package/dist/devices/tuya.js +3139 -814
  450. package/dist/devices/tuya.js.map +1 -1
  451. package/dist/devices/ubisys.d.ts.map +1 -1
  452. package/dist/devices/ubisys.js +11 -8
  453. package/dist/devices/ubisys.js.map +1 -1
  454. package/dist/devices/vesternet.d.ts.map +1 -1
  455. package/dist/devices/vesternet.js +7 -0
  456. package/dist/devices/vesternet.js.map +1 -1
  457. package/dist/devices/viessmann.d.ts.map +1 -1
  458. package/dist/devices/viessmann.js +107 -4
  459. package/dist/devices/viessmann.js.map +1 -1
  460. package/dist/devices/vsmart.d.ts.map +1 -1
  461. package/dist/devices/vsmart.js +11 -0
  462. package/dist/devices/vsmart.js.map +1 -1
  463. package/dist/devices/weiser.d.ts.map +1 -1
  464. package/dist/devices/weiser.js +6 -0
  465. package/dist/devices/weiser.js.map +1 -1
  466. package/dist/devices/wirenboard.d.ts.map +1 -1
  467. package/dist/devices/wirenboard.js +124 -21
  468. package/dist/devices/wirenboard.js.map +1 -1
  469. package/dist/devices/wmun.d.ts.map +1 -1
  470. package/dist/devices/wmun.js +3 -2
  471. package/dist/devices/wmun.js.map +1 -1
  472. package/dist/devices/woolley.d.ts.map +1 -1
  473. package/dist/devices/woolley.js +6 -9
  474. package/dist/devices/woolley.js.map +1 -1
  475. package/dist/devices/woox.js +2 -2
  476. package/dist/devices/woox.js.map +1 -1
  477. package/dist/devices/xyzroe.d.ts.map +1 -1
  478. package/dist/devices/xyzroe.js +16 -4
  479. package/dist/devices/xyzroe.js.map +1 -1
  480. package/dist/devices/yale.d.ts.map +1 -1
  481. package/dist/devices/yale.js +138 -40
  482. package/dist/devices/yale.js.map +1 -1
  483. package/dist/devices/yandex.d.ts.map +1 -1
  484. package/dist/devices/yandex.js +93 -11
  485. package/dist/devices/yandex.js.map +1 -1
  486. package/dist/devices/yokis.d.ts.map +1 -1
  487. package/dist/devices/yokis.js +122 -85
  488. package/dist/devices/yokis.js.map +1 -1
  489. package/dist/devices/zbeacon.d.ts.map +1 -1
  490. package/dist/devices/zbeacon.js +0 -7
  491. package/dist/devices/zbeacon.js.map +1 -1
  492. package/dist/devices/zemismart.d.ts.map +1 -1
  493. package/dist/devices/zemismart.js +148 -11
  494. package/dist/devices/zemismart.js.map +1 -1
  495. package/dist/devices/zigbeetlc.js +1 -1
  496. package/dist/devices/zigbeetlc.js.map +1 -1
  497. package/dist/index.d.ts +1 -1
  498. package/dist/index.d.ts.map +1 -1
  499. package/dist/index.js +40 -35
  500. package/dist/index.js.map +1 -1
  501. package/dist/lib/bosch.d.ts.map +1 -1
  502. package/dist/lib/bosch.js +212 -42
  503. package/dist/lib/bosch.js.map +1 -1
  504. package/dist/lib/constants.d.ts +99 -17
  505. package/dist/lib/constants.d.ts.map +1 -1
  506. package/dist/lib/constants.js +15 -2
  507. package/dist/lib/constants.js.map +1 -1
  508. package/dist/lib/develco.d.ts +11 -0
  509. package/dist/lib/develco.d.ts.map +1 -1
  510. package/dist/lib/develco.js +78 -9
  511. package/dist/lib/develco.js.map +1 -1
  512. package/dist/lib/exposes.d.ts +11 -10
  513. package/dist/lib/exposes.d.ts.map +1 -1
  514. package/dist/lib/exposes.js +7 -48
  515. package/dist/lib/exposes.js.map +1 -1
  516. package/dist/lib/heiman.d.ts.map +1 -1
  517. package/dist/lib/heiman.js +34 -14
  518. package/dist/lib/heiman.js.map +1 -1
  519. package/dist/lib/ikea.d.ts +17 -0
  520. package/dist/lib/ikea.d.ts.map +1 -1
  521. package/dist/lib/ikea.js +46 -20
  522. package/dist/lib/ikea.js.map +1 -1
  523. package/dist/lib/inovelli.d.ts +86 -0
  524. package/dist/lib/inovelli.d.ts.map +1 -0
  525. package/dist/lib/inovelli.js +2580 -0
  526. package/dist/lib/inovelli.js.map +1 -0
  527. package/dist/lib/ledvance.d.ts +4 -4
  528. package/dist/lib/ledvance.d.ts.map +1 -1
  529. package/dist/lib/ledvance.js +23 -7
  530. package/dist/lib/ledvance.js.map +1 -1
  531. package/dist/lib/legacy.d.ts +21 -2
  532. package/dist/lib/legacy.d.ts.map +1 -1
  533. package/dist/lib/legacy.js +29 -2
  534. package/dist/lib/legacy.js.map +1 -1
  535. package/dist/lib/legrand.d.ts +65 -6
  536. package/dist/lib/legrand.d.ts.map +1 -1
  537. package/dist/lib/legrand.js +188 -9
  538. package/dist/lib/legrand.js.map +1 -1
  539. package/dist/lib/light.d.ts +1 -1
  540. package/dist/lib/light.d.ts.map +1 -1
  541. package/dist/lib/light.js +2 -2
  542. package/dist/lib/light.js.map +1 -1
  543. package/dist/lib/lumi.d.ts +88 -44
  544. package/dist/lib/lumi.d.ts.map +1 -1
  545. package/dist/lib/lumi.js +1813 -59
  546. package/dist/lib/lumi.js.map +1 -1
  547. package/dist/lib/modernExtend.d.ts +19 -14
  548. package/dist/lib/modernExtend.d.ts.map +1 -1
  549. package/dist/lib/modernExtend.js +37 -35
  550. package/dist/lib/modernExtend.js.map +1 -1
  551. package/dist/lib/namron.d.ts +131 -28
  552. package/dist/lib/namron.d.ts.map +1 -1
  553. package/dist/lib/namron.js +723 -42
  554. package/dist/lib/namron.js.map +1 -1
  555. package/dist/lib/nodon.d.ts.map +1 -1
  556. package/dist/lib/nodon.js +3 -1
  557. package/dist/lib/nodon.js.map +1 -1
  558. package/dist/lib/philips.d.ts +106 -2
  559. package/dist/lib/philips.d.ts.map +1 -1
  560. package/dist/lib/philips.js +945 -44
  561. package/dist/lib/philips.js.map +1 -1
  562. package/dist/lib/sonoff.d.ts +77 -10
  563. package/dist/lib/sonoff.d.ts.map +1 -1
  564. package/dist/lib/sonoff.js +165 -34
  565. package/dist/lib/sonoff.js.map +1 -1
  566. package/dist/lib/sunricher.d.ts +1 -1
  567. package/dist/lib/sunricher.d.ts.map +1 -1
  568. package/dist/lib/sunricher.js +6 -8
  569. package/dist/lib/sunricher.js.map +1 -1
  570. package/dist/lib/tuya.d.ts +558 -13
  571. package/dist/lib/tuya.d.ts.map +1 -1
  572. package/dist/lib/tuya.js +1518 -10
  573. package/dist/lib/tuya.js.map +1 -1
  574. package/dist/lib/types.d.ts +9 -6
  575. package/dist/lib/types.d.ts.map +1 -1
  576. package/dist/lib/ubisys.d.ts +1 -1
  577. package/dist/lib/ubisys.d.ts.map +1 -1
  578. package/dist/lib/ubisys.js +60 -5
  579. package/dist/lib/ubisys.js.map +1 -1
  580. package/dist/lib/utils.d.ts +5 -8
  581. package/dist/lib/utils.d.ts.map +1 -1
  582. package/dist/lib/utils.js +30 -17
  583. package/dist/lib/utils.js.map +1 -1
  584. package/dist/lib/zosung.d.ts +69 -6
  585. package/dist/lib/zosung.d.ts.map +1 -1
  586. package/dist/lib/zosung.js +113 -1
  587. package/dist/lib/zosung.js.map +1 -1
  588. package/dist/models-index.json +1 -1
  589. package/package.json +2 -2
  590. package/dist/devices/aubess.d.ts.map +0 -1
  591. package/dist/devices/aubess.js.map +0 -1
@@ -42,11 +42,83 @@ const logger_1 = require("../lib/logger");
42
42
  const lumi = __importStar(require("../lib/lumi"));
43
43
  const m = __importStar(require("../lib/modernExtend"));
44
44
  const reporting = __importStar(require("../lib/reporting"));
45
+ const utils_1 = require("../lib/utils");
45
46
  const e = exposes.presets;
46
47
  const ea = exposes.access;
47
- const { lumiAction, lumiOperationMode, lumiPowerOnBehavior, lumiZigbeeOTA, lumiSwitchType, lumiAirQuality, lumiVoc, lumiDisplayUnit, lumiLight, lumiOutageCountRestoreBindReporting, lumiElectricityMeter, lumiPower, lumiOverloadProtection, lumiLedIndicator, lumiButtonLock, lumiMotorSpeed, lumiCurtainSpeed, lumiCurtainManualOpenClose, lumiCurtainAdaptivePullingSpeed, lumiCurtainManualStop, lumiCurtainReverse, lumiCurtainStatus, lumiCurtainLastManualOperation, lumiCurtainPosition, lumiCurtainTraverseTime, lumiCurtainCalibrationStatus, lumiCurtainCalibrated, lumiCurtainIdentifyBeep, lumiOnOff, lumiLedDisabledNight, lumiFlipIndicatorLight, lumiPreventReset, lumiClickMode, lumiSlider, lumiSetEventMode, lumiSwitchMode, lumiVibration, lumiReportInterval, lumiSensitivityAdjustment, lumiKnobRotation, lumiCommandMode, lumiBattery, lumiLockRelay, lumiMultiClick, lumiPreventLeave, lumiExternalSensor, lumiReadPositionOnReport, } = lumi.modernExtend;
48
+ const { lumiAction, lumiOperationMode, lumiPowerOnBehavior, lumiZigbeeOTA, lumiSwitchType, lumiAirQuality, lumiVoc, lumiDisplayUnit, lumiLight, lumiOutageCountRestoreBindReporting, lumiElectricityMeter, lumiPower, lumiOverloadProtection, lumiLedIndicator, lumiButtonLock, lumiMotorSpeed, lumiCurtainSpeed, lumiCurtainManualOpenClose, lumiCurtainAdaptivePullingSpeed, lumiCurtainManualStop, lumiCurtainReverse, lumiCurtainStatus, lumiCurtainLastManualOperation, lumiCurtainPosition, lumiCurtainTraverseTime, lumiCurtainCalibrationStatus, lumiCurtainCalibrated, lumiCurtainIdentifyBeep, lumiOnOff, lumiLedDisabledNight, lumiFlipIndicatorLight, lumiPreventReset, lumiClickMode, lumiSlider, lumiSetEventMode, lumiSwitchMode, lumiVibration, lumiReportInterval, lumiSensitivityAdjustment, lumiKnobRotation, lumiCommandMode, lumiBattery, lumiLockRelay, lumiMultiClick, lumiPreventLeave, lumiExternalSensor, w600ExternalTempSensor, w600Heartbeat, w600PresetTemperatureTable, w600Schedule, w600Thermostat, w600ValvePosition, w600WeeklySchedule, lumiReadPositionOnReport, } = lumi.modernExtend;
48
49
  const NS = "zhc:lumi";
49
50
  const { manufacturerCode } = lumi;
51
+ const aqaraH2EuShutterSwitchEndpoints = { top_wireless_button: 3, bottom_wireless_button: 4 };
52
+ const aqaraH2EuShutterSwitchEndpointNames = ["top_wireless_button", "bottom_wireless_button"];
53
+ const aqaraH2EuShutterSwitchActionLookup = { hold: 0, single: 1, double: 2, release: 255 };
54
+ const aqaraH2EuShutterSwitchMultiEndpointSkip = ["energy", "position", "state", "tilt"];
55
+ const aqaraH2EuShutterSwitchMultiClickAttribute = 0x0286;
56
+ async function configureAqaraH2EuShutterSwitch(device, coordinatorEndpoint) {
57
+ for (const endpointName of aqaraH2EuShutterSwitchEndpointNames) {
58
+ const endpoint = device.getEndpoint(aqaraH2EuShutterSwitchEndpoints[endpointName]);
59
+ await reporting.bind(endpoint, coordinatorEndpoint, ["manuSpecificLumi", "genMultistateInput"]);
60
+ await endpoint.configureReporting("genMultistateInput", reporting.payload("presentValue", 0, 3600, 1));
61
+ // Initialize Aqara's per-button multi-click setting on startup.
62
+ await endpoint.read("manuSpecificLumi", [aqaraH2EuShutterSwitchMultiClickAttribute], {
63
+ manufacturerCode,
64
+ });
65
+ }
66
+ }
67
+ function fp310DetectionRange() {
68
+ return {
69
+ isModernExtend: true,
70
+ exposes: [
71
+ e
72
+ .numeric("detection_range", ea.ALL)
73
+ .withValueMin(0)
74
+ .withValueMax(6)
75
+ .withValueStep(0.25)
76
+ .withUnit("m")
77
+ .withDescription("Specifies the range that is being detected. Press the on-device button to wake the device up and refresh it's settings."),
78
+ ],
79
+ fromZigbee: [
80
+ {
81
+ cluster: "manuSpecificLumi",
82
+ type: ["attributeReport", "readResponse"],
83
+ convert: (model, msg, publish, options, meta) => {
84
+ if (msg.data["410"] && Buffer.isBuffer(msg.data["410"])) {
85
+ const buffer = msg.data["410"];
86
+ const mask = buffer[2] | (buffer[3] << 8) | (buffer[4] << 16);
87
+ let zones = 0;
88
+ let value = mask;
89
+ while (value > 0) {
90
+ zones++;
91
+ value >>= 1;
92
+ }
93
+ // 1 zone = 0.25m
94
+ const detection_range = zones * 0.25;
95
+ return { detection_range };
96
+ }
97
+ },
98
+ },
99
+ ],
100
+ toZigbee: [
101
+ {
102
+ key: ["detection_range"],
103
+ convertSet: async (entity, key, value, meta) => {
104
+ (0, utils_1.assertNumber)(value);
105
+ const distance = Math.max(0, Math.min(6, value));
106
+ const zones = Math.round(distance / 0.25);
107
+ const mask = zones === 0 ? 0 : (1 << zones) - 1;
108
+ const buffer = Buffer.from([0x00, 0x03, mask & 0xff, (mask >> 8) & 0xff, (mask >> 16) & 0xff]);
109
+ await entity.write("manuSpecificLumi", { 410: { value: buffer, type: 0x41 } }, { manufacturerCode: manufacturerCode });
110
+ return {
111
+ state: { detection_range: value },
112
+ };
113
+ },
114
+ convertGet: async (entity, key, meta) => {
115
+ const endpoint = meta.device.getEndpoint(1);
116
+ await endpoint.read("manuSpecificLumi", [0x019a], { manufacturerCode: manufacturerCode });
117
+ },
118
+ },
119
+ ],
120
+ };
121
+ }
50
122
  exports.definitions = [
51
123
  {
52
124
  zigbeeModel: ["lumi.flood.acn001"],
@@ -61,7 +133,7 @@ exports.definitions = [
61
133
  const endpoint = device.getEndpoint(1);
62
134
  await endpoint.read("genPowerCfg", ["batteryVoltage"]);
63
135
  },
64
- extend: [m.quirkCheckinInterval("1_HOUR"), lumiZigbeeOTA()],
136
+ extend: [lumi.modernExtend.addManuSpecificLumiCluster(), m.quirkCheckinInterval("1_HOUR"), lumiZigbeeOTA()],
65
137
  },
66
138
  {
67
139
  zigbeeModel: ["lumi.airm.fhac01"],
@@ -87,6 +159,7 @@ exports.definitions = [
87
159
  await endpoint.read("genPowerCfg", ["batteryVoltage"]);
88
160
  },
89
161
  extend: [
162
+ lumi.modernExtend.addManuSpecificLumiCluster(),
90
163
  m.quirkCheckinInterval("1_HOUR"),
91
164
  // OTA request: "fieldControl":0, "manufacturerCode":4447, "imageType":10635, no available for now
92
165
  // https://github.com/Koenkk/zigbee-OTA/pull/138
@@ -110,7 +183,7 @@ exports.definitions = [
110
183
  .enum("detection_distance", ea.ALL, ["10mm", "20mm", "30mm"])
111
184
  .withDescription('The sensor will be considered "off" within the set distance. Please press the device button before setting'),
112
185
  ],
113
- extend: [m.quirkCheckinInterval("1_HOUR")],
186
+ extend: [lumi.modernExtend.addManuSpecificLumiCluster(), m.quirkCheckinInterval("1_HOUR")],
114
187
  },
115
188
  {
116
189
  zigbeeModel: ["lumi.dimmer.rcbac1"],
@@ -135,21 +208,25 @@ exports.definitions = [
135
208
  e.light_brightness_colortemp([153, 370]).removeFeature("color_temp_startup").withEndpoint("l2"),
136
209
  e.enum("dimmer_mode", ea.ALL, ["rgbw", "dual_ct"]).withDescription("Switch between rgbw mode or dual color temperature mode"),
137
210
  ],
138
- extend: [m.deviceEndpoints({ endpoints: { l1: 1, l2: 2 } }), lumiZigbeeOTA()],
211
+ extend: [lumi.modernExtend.addManuSpecificLumiCluster(), m.deviceEndpoints({ endpoints: { l1: 1, l2: 2 } }), lumiZigbeeOTA()],
139
212
  },
140
213
  {
141
214
  zigbeeModel: ["lumi.light.aqcn02"],
142
215
  model: "ZNLDP12LM",
143
216
  vendor: "Aqara",
144
217
  description: "Light bulb",
145
- extend: [lumiLight({ colorTemp: true, powerOutageMemory: "light" }), lumiZigbeeOTA()],
218
+ extend: [lumi.modernExtend.addManuSpecificLumiCluster(), lumiLight({ colorTemp: true, powerOutageMemory: "light" }), lumiZigbeeOTA()],
146
219
  },
147
220
  {
148
221
  zigbeeModel: ["lumi.light.acn003"],
149
222
  model: "ZNXDD01LM",
150
223
  vendor: "Aqara",
151
224
  description: "Ceiling light L1-350",
152
- extend: [lumiLight({ colorTemp: true, powerOutageMemory: "switch", levelConfig: { features: ["on_level"] } }), lumiZigbeeOTA()],
225
+ extend: [
226
+ lumi.modernExtend.addManuSpecificLumiCluster(),
227
+ lumiLight({ colorTemp: true, powerOutageMemory: "switch", levelConfig: { features: ["on_level"] } }),
228
+ lumiZigbeeOTA(),
229
+ ],
153
230
  },
154
231
  {
155
232
  zigbeeModel: ["lumi.light.cwac02", "lumi.light.acn014"],
@@ -158,6 +235,7 @@ exports.definitions = [
158
235
  description: "Light bulb T1",
159
236
  whiteLabel: [{ vendor: "Aqara", model: "LEDLBT1-L01" }],
160
237
  extend: [
238
+ lumi.modernExtend.addManuSpecificLumiCluster(),
161
239
  lumiZigbeeOTA(),
162
240
  lumiLight({ colorTemp: true, powerOutageMemory: "switch" }),
163
241
  m.forceDeviceType({ type: "Router" }),
@@ -170,7 +248,7 @@ exports.definitions = [
170
248
  vendor: "Aqara",
171
249
  description: "Opple MX960",
172
250
  meta: { turnsOffAtBrightness1: true },
173
- extend: [lumiLight({ colorTemp: true, powerOutageMemory: "switch" }), lumiZigbeeOTA()],
251
+ extend: [lumi.modernExtend.addManuSpecificLumiCluster(), lumiLight({ colorTemp: true, powerOutageMemory: "switch" }), lumiZigbeeOTA()],
174
252
  },
175
253
  {
176
254
  zigbeeModel: ["lumi.light.cwopcn02"],
@@ -178,7 +256,7 @@ exports.definitions = [
178
256
  vendor: "Aqara",
179
257
  description: "Opple MX650",
180
258
  meta: { turnsOffAtBrightness1: true },
181
- extend: [lumiZigbeeOTA(), lumiLight({ colorTemp: true, powerOutageMemory: "switch" })],
259
+ extend: [lumi.modernExtend.addManuSpecificLumiCluster(), lumiZigbeeOTA(), lumiLight({ colorTemp: true, powerOutageMemory: "switch" })],
182
260
  },
183
261
  {
184
262
  zigbeeModel: ["lumi.light.cwopcn03"],
@@ -186,21 +264,25 @@ exports.definitions = [
186
264
  vendor: "Aqara",
187
265
  description: "Opple MX480",
188
266
  meta: { turnsOffAtBrightness1: true },
189
- extend: [lumiLight({ colorTemp: true, powerOutageMemory: "switch", colorTempRange: [175, 370] }), lumiZigbeeOTA()],
267
+ extend: [
268
+ lumi.modernExtend.addManuSpecificLumiCluster(),
269
+ lumiLight({ colorTemp: true, powerOutageMemory: "switch", colorTempRange: [175, 370] }),
270
+ lumiZigbeeOTA(),
271
+ ],
190
272
  },
191
273
  {
192
274
  zigbeeModel: ["lumi.light.cwjwcn01"],
193
275
  model: "JWSP001A",
194
276
  vendor: "Aqara",
195
277
  description: "Jiawen LED Driver & Dimmer",
196
- extend: [lumiLight({ colorTemp: true, powerOutageMemory: "switch" })],
278
+ extend: [lumi.modernExtend.addManuSpecificLumiCluster(), lumiLight({ colorTemp: true, powerOutageMemory: "switch" })],
197
279
  },
198
280
  {
199
281
  zigbeeModel: ["lumi.light.cwjwcn02"],
200
282
  model: "JWDL001A",
201
283
  vendor: "Aqara",
202
284
  description: "Embedded spot led light",
203
- extend: [lumiLight({ colorTemp: true, powerOutageMemory: "switch" })],
285
+ extend: [lumi.modernExtend.addManuSpecificLumiCluster(), lumiLight({ colorTemp: true, powerOutageMemory: "switch" })],
204
286
  },
205
287
  {
206
288
  zigbeeModel: ["lumi.sensor_switch"],
@@ -318,6 +400,7 @@ exports.definitions = [
318
400
  await endpoint.read("genLevelCtrl", [0x0013], {});
319
401
  },
320
402
  extend: [
403
+ lumi.modernExtend.addManuSpecificLumiCluster(),
321
404
  lumiLight({
322
405
  colorTemp: true,
323
406
  color: { modes: ["xy"] },
@@ -442,7 +525,12 @@ exports.definitions = [
442
525
  // set "event" mode
443
526
  await endpoint1.write("manuSpecificLumi", { mode: 1 }, { manufacturerCode: manufacturerCode, disableResponse: true });
444
527
  },
445
- extend: [lumiZigbeeOTA(), lumiPreventReset(), m.forcePowerSource({ powerSource: "Mains (single phase)" })],
528
+ extend: [
529
+ lumi.modernExtend.addManuSpecificLumiCluster(),
530
+ lumiZigbeeOTA(),
531
+ lumiPreventReset(),
532
+ m.forcePowerSource({ powerSource: "Mains (single phase)" }),
533
+ ],
446
534
  },
447
535
  {
448
536
  zigbeeModel: ["lumi.switch.b2laus01"],
@@ -479,9 +567,11 @@ exports.definitions = [
479
567
  return { top: 1, bottom: 2 };
480
568
  },
481
569
  configure: async (device, coordinatorEndpoint) => {
482
- await device.getEndpoint(1).write("manuSpecificLumi", { mode: 1 }, { manufacturerCode: manufacturerCode, disableResponse: true });
570
+ await device
571
+ .getEndpoint(1)
572
+ .write("manuSpecificLumi", { mode: 1 }, { manufacturerCode: manufacturerCode, disableResponse: true });
483
573
  },
484
- extend: [lumiZigbeeOTA(), lumiPreventReset()],
574
+ extend: [lumi.modernExtend.addManuSpecificLumiCluster(), lumiZigbeeOTA(), lumiPreventReset()],
485
575
  },
486
576
  {
487
577
  zigbeeModel: ["lumi.switch.b1naus01"],
@@ -513,7 +603,7 @@ exports.definitions = [
513
603
  // set "event" mode
514
604
  await endpoint1.write("manuSpecificLumi", { mode: 1 }, { manufacturerCode: manufacturerCode, disableResponse: true });
515
605
  },
516
- extend: [lumiZigbeeOTA(), lumiPreventReset()],
606
+ extend: [lumi.modernExtend.addManuSpecificLumiCluster(), lumiZigbeeOTA(), lumiPreventReset()],
517
607
  },
518
608
  {
519
609
  zigbeeModel: ["lumi.switch.b2naus01"],
@@ -550,9 +640,11 @@ exports.definitions = [
550
640
  return { top: 1, bottom: 2 };
551
641
  },
552
642
  configure: async (device, coordinatorEndpoint) => {
553
- await device.getEndpoint(1).write("manuSpecificLumi", { mode: 1 }, { manufacturerCode: manufacturerCode, disableResponse: true });
643
+ await device
644
+ .getEndpoint(1)
645
+ .write("manuSpecificLumi", { mode: 1 }, { manufacturerCode: manufacturerCode, disableResponse: true });
554
646
  },
555
- extend: [lumiZigbeeOTA(), lumiPreventReset()],
647
+ extend: [lumi.modernExtend.addManuSpecificLumiCluster(), lumiZigbeeOTA(), lumiPreventReset()],
556
648
  },
557
649
  {
558
650
  zigbeeModel: ["lumi.switch.l1acn1"],
@@ -582,9 +674,11 @@ exports.definitions = [
582
674
  .withDescription("Anti flicker mode can be used to solve blinking issues of some lights. Quick mode makes the device respond faster."),
583
675
  ],
584
676
  configure: async (device, coordinatorEndpoint) => {
585
- await device.getEndpoint(1).write("manuSpecificLumi", { mode: 1 }, { manufacturerCode: manufacturerCode, disableResponse: true });
677
+ await device
678
+ .getEndpoint(1)
679
+ .write("manuSpecificLumi", { mode: 1 }, { manufacturerCode: manufacturerCode, disableResponse: true });
586
680
  },
587
- extend: [lumiZigbeeOTA(), lumiPreventReset()],
681
+ extend: [lumi.modernExtend.addManuSpecificLumiCluster(), lumiZigbeeOTA(), lumiPreventReset()],
588
682
  },
589
683
  {
590
684
  zigbeeModel: ["lumi.switch.l2acn1"],
@@ -619,9 +713,11 @@ exports.definitions = [
619
713
  .withDescription("Anti flicker mode can be used to solve blinking issues of some lights. Quick mode makes the device respond faster."),
620
714
  ],
621
715
  configure: async (device, coordinatorEndpoint) => {
622
- await device.getEndpoint(1).write("manuSpecificLumi", { mode: 1 }, { manufacturerCode: manufacturerCode, disableResponse: true });
716
+ await device
717
+ .getEndpoint(1)
718
+ .write("manuSpecificLumi", { mode: 1 }, { manufacturerCode: manufacturerCode, disableResponse: true });
623
719
  },
624
- extend: [lumiZigbeeOTA(), lumiPreventReset()],
720
+ extend: [lumi.modernExtend.addManuSpecificLumiCluster(), lumiZigbeeOTA(), lumiPreventReset()],
625
721
  },
626
722
  {
627
723
  zigbeeModel: ["lumi.switch.l3acn1"],
@@ -675,9 +771,11 @@ exports.definitions = [
675
771
  ]),
676
772
  ],
677
773
  configure: async (device, coordinatorEndpoint) => {
678
- await device.getEndpoint(1).write("manuSpecificLumi", { mode: 1 }, { manufacturerCode: manufacturerCode, disableResponse: true });
774
+ await device
775
+ .getEndpoint(1)
776
+ .write("manuSpecificLumi", { mode: 1 }, { manufacturerCode: manufacturerCode, disableResponse: true });
679
777
  },
680
- extend: [lumiPreventReset()],
778
+ extend: [lumi.modernExtend.addManuSpecificLumiCluster(), lumiPreventReset()],
681
779
  },
682
780
  {
683
781
  zigbeeModel: ["lumi.switch.n1acn1"],
@@ -705,7 +803,7 @@ exports.definitions = [
705
803
  e.enum("operation_mode", ea.ALL, ["control_relay", "decoupled"]).withDescription("Decoupled mode"),
706
804
  e.power_outage_count(),
707
805
  ],
708
- extend: [lumiZigbeeOTA(), lumiPreventReset()],
806
+ extend: [lumi.modernExtend.addManuSpecificLumiCluster(), lumiZigbeeOTA(), lumiPreventReset()],
709
807
  },
710
808
  {
711
809
  zigbeeModel: ["lumi.switch.n2acn1"],
@@ -739,7 +837,7 @@ exports.definitions = [
739
837
  e.enum("operation_mode", ea.ALL, ["control_relay", "decoupled"]).withDescription("Decoupled mode for right button").withEndpoint("right"),
740
838
  e.power_outage_count(),
741
839
  ],
742
- extend: [lumiZigbeeOTA(), lumiPreventReset()],
840
+ extend: [lumi.modernExtend.addManuSpecificLumiCluster(), lumiZigbeeOTA(), lumiPreventReset()],
743
841
  },
744
842
  {
745
843
  zigbeeModel: ["lumi.switch.n3acn1"],
@@ -793,7 +891,7 @@ exports.definitions = [
793
891
  .withEndpoint("center"),
794
892
  e.power_outage_count(),
795
893
  ],
796
- extend: [lumiZigbeeOTA(), lumiPreventReset()],
894
+ extend: [lumi.modernExtend.addManuSpecificLumiCluster(), lumiZigbeeOTA(), lumiPreventReset()],
797
895
  },
798
896
  {
799
897
  zigbeeModel: ["lumi.switch.l1aeu1"],
@@ -828,7 +926,7 @@ exports.definitions = [
828
926
  // set "event" mode
829
927
  await endpoint1.write("manuSpecificLumi", { mode: 1 }, { manufacturerCode: manufacturerCode, disableResponse: true });
830
928
  },
831
- extend: [lumiPreventReset()],
929
+ extend: [lumi.modernExtend.addManuSpecificLumiCluster(), lumiPreventReset()],
832
930
  },
833
931
  {
834
932
  zigbeeModel: ["lumi.switch.l2aeu1"],
@@ -864,9 +962,11 @@ exports.definitions = [
864
962
  e.action(["single_left", "double_left", "single_right", "double_right", "single_both", "double_both"]),
865
963
  ],
866
964
  configure: async (device, coordinatorEndpoint) => {
867
- await device.getEndpoint(1).write("manuSpecificLumi", { mode: 1 }, { manufacturerCode: manufacturerCode, disableResponse: true });
965
+ await device
966
+ .getEndpoint(1)
967
+ .write("manuSpecificLumi", { mode: 1 }, { manufacturerCode: manufacturerCode, disableResponse: true });
868
968
  },
869
- extend: [lumiPreventReset()],
969
+ extend: [lumi.modernExtend.addManuSpecificLumiCluster(), lumiPreventReset()],
870
970
  },
871
971
  {
872
972
  zigbeeModel: ["lumi.switch.n1aeu1"],
@@ -899,7 +999,7 @@ exports.definitions = [
899
999
  // set "event" mode
900
1000
  await endpoint1.write("manuSpecificLumi", { mode: 1 }, { manufacturerCode: manufacturerCode, disableResponse: true });
901
1001
  },
902
- extend: [lumiZigbeeOTA(), lumiPreventReset()],
1002
+ extend: [lumi.modernExtend.addManuSpecificLumiCluster(), lumiZigbeeOTA(), lumiPreventReset()],
903
1003
  },
904
1004
  {
905
1005
  zigbeeModel: ["lumi.switch.n2aeu1"],
@@ -938,7 +1038,7 @@ exports.definitions = [
938
1038
  // set "event" mode
939
1039
  await endpoint1.write("manuSpecificLumi", { mode: 1 }, { manufacturerCode: manufacturerCode, disableResponse: true });
940
1040
  },
941
- extend: [lumiZigbeeOTA(), lumiPreventReset()],
1041
+ extend: [lumi.modernExtend.addManuSpecificLumiCluster(), lumiZigbeeOTA(), lumiPreventReset()],
942
1042
  },
943
1043
  {
944
1044
  zigbeeModel: ["lumi.ctrl_neutral1"],
@@ -1208,9 +1308,11 @@ exports.definitions = [
1208
1308
  e.power_outage_count(),
1209
1309
  ],
1210
1310
  configure: async (device, coordinatorEndpoint) => {
1211
- await device.getEndpoint(1).write("manuSpecificLumi", { mode: 1 }, { manufacturerCode: manufacturerCode, disableResponse: true });
1311
+ await device
1312
+ .getEndpoint(1)
1313
+ .write("manuSpecificLumi", { mode: 1 }, { manufacturerCode: manufacturerCode, disableResponse: true });
1212
1314
  },
1213
- extend: [lumiZigbeeOTA(), lumiPreventReset()],
1315
+ extend: [lumi.modernExtend.addManuSpecificLumiCluster(), lumiZigbeeOTA(), lumiPreventReset()],
1214
1316
  },
1215
1317
  {
1216
1318
  zigbeeModel: ["lumi.switch.n3acn3"],
@@ -1264,9 +1366,11 @@ exports.definitions = [
1264
1366
  return { left: 1, center: 2, right: 3 };
1265
1367
  },
1266
1368
  configure: async (device, coordinatorEndpoint) => {
1267
- await device.getEndpoint(1).write("manuSpecificLumi", { mode: 1 }, { manufacturerCode: manufacturerCode, disableResponse: true });
1369
+ await device
1370
+ .getEndpoint(1)
1371
+ .write("manuSpecificLumi", { mode: 1 }, { manufacturerCode: manufacturerCode, disableResponse: true });
1268
1372
  },
1269
- extend: [lumiZigbeeOTA(), lumiPreventReset()],
1373
+ extend: [lumi.modernExtend.addManuSpecificLumiCluster(), lumiZigbeeOTA(), lumiPreventReset()],
1270
1374
  },
1271
1375
  {
1272
1376
  zigbeeModel: ["lumi.switch.b1nacn02"],
@@ -1322,7 +1426,7 @@ exports.definitions = [
1322
1426
  .withDescription("Decoupled mode for right button")
1323
1427
  .withEndpoint("right"),
1324
1428
  ],
1325
- extend: [lumiZigbeeOTA(), lumiPreventReset()],
1429
+ extend: [lumi.modernExtend.addManuSpecificLumiCluster(), lumiZigbeeOTA(), lumiPreventReset()],
1326
1430
  },
1327
1431
  {
1328
1432
  zigbeeModel: ["lumi.switch.b1lacn01"],
@@ -1330,6 +1434,7 @@ exports.definitions = [
1330
1434
  vendor: "Aqara",
1331
1435
  description: "Smart wall switch T1 (no neutral, single rocker)",
1332
1436
  extend: [
1437
+ lumi.modernExtend.addManuSpecificLumiCluster(),
1333
1438
  lumiZigbeeOTA(),
1334
1439
  lumiOnOff({ powerOutageMemory: "binary", operationMode: true }),
1335
1440
  lumiLedDisabledNight(),
@@ -1344,6 +1449,7 @@ exports.definitions = [
1344
1449
  vendor: "Aqara",
1345
1450
  description: "Smart wall switch T1 (no neutral, double rocker)",
1346
1451
  extend: [
1452
+ lumi.modernExtend.addManuSpecificLumiCluster(),
1347
1453
  lumiZigbeeOTA(),
1348
1454
  m.deviceEndpoints({ endpoints: { left: 1, right: 2 } }),
1349
1455
  lumiOnOff({ powerOutageMemory: "binary", operationMode: true, endpointNames: ["left", "right"] }),
@@ -1359,6 +1465,7 @@ exports.definitions = [
1359
1465
  vendor: "Aqara",
1360
1466
  description: "Smart wall switch T1 (with neutral, single rocker)",
1361
1467
  extend: [
1468
+ lumi.modernExtend.addManuSpecificLumiCluster(),
1362
1469
  lumiZigbeeOTA(),
1363
1470
  lumiOnOff({ powerOutageMemory: "binary", operationMode: true }),
1364
1471
  lumiLedDisabledNight(),
@@ -1375,6 +1482,7 @@ exports.definitions = [
1375
1482
  vendor: "Aqara",
1376
1483
  description: "Smart wall switch T1 (with neutral, double rocker)",
1377
1484
  extend: [
1485
+ lumi.modernExtend.addManuSpecificLumiCluster(),
1378
1486
  m.forceDeviceType({ type: "Router" }),
1379
1487
  m.forcePowerSource({ powerSource: "Mains (single phase)" }),
1380
1488
  lumiZigbeeOTA(),
@@ -1394,6 +1502,7 @@ exports.definitions = [
1394
1502
  vendor: "Aqara",
1395
1503
  description: "Smart wall switch T1 (no neutral, triple rocker)",
1396
1504
  extend: [
1505
+ lumi.modernExtend.addManuSpecificLumiCluster(),
1397
1506
  lumiZigbeeOTA(),
1398
1507
  m.deviceEndpoints({ endpoints: { left: 1, center: 2, right: 3 } }),
1399
1508
  lumiOnOff({ powerOutageMemory: "binary", operationMode: true, endpointNames: ["left", "center", "right"] }),
@@ -1420,6 +1529,7 @@ exports.definitions = [
1420
1529
  vendor: "Aqara",
1421
1530
  description: "Smart wall switch T1 (with neutral, triple rocker)",
1422
1531
  extend: [
1532
+ lumi.modernExtend.addManuSpecificLumiCluster(),
1423
1533
  lumiZigbeeOTA(),
1424
1534
  m.deviceEndpoints({ endpoints: { left: 1, center: 2, right: 3 } }),
1425
1535
  lumiOnOff({ powerOutageMemory: "binary", operationMode: true, endpointNames: ["left", "center", "right"] }),
@@ -1487,7 +1597,7 @@ exports.definitions = [
1487
1597
  await reporting.bind(endpoint, coordinatorEndpoint, binds);
1488
1598
  await endpoint.read("genPowerCfg", ["batteryVoltage"]);
1489
1599
  },
1490
- extend: [m.quirkCheckinInterval("1_HOUR"), lumiZigbeeOTA()],
1600
+ extend: [lumi.modernExtend.addManuSpecificLumiCluster(), m.quirkCheckinInterval("1_HOUR"), lumiZigbeeOTA()],
1491
1601
  },
1492
1602
  {
1493
1603
  zigbeeModel: ["lumi.sensor_motion"],
@@ -1545,7 +1655,7 @@ exports.definitions = [
1545
1655
  await endpoint.read("genPowerCfg", ["batteryVoltage"]);
1546
1656
  await endpoint.read("manuSpecificLumi", [0x0102], { manufacturerCode: manufacturerCode });
1547
1657
  },
1548
- extend: [m.quirkCheckinInterval("1_HOUR"), lumiZigbeeOTA()],
1658
+ extend: [lumi.modernExtend.addManuSpecificLumiCluster(), m.quirkCheckinInterval("1_HOUR"), lumiZigbeeOTA()],
1549
1659
  },
1550
1660
  {
1551
1661
  zigbeeModel: ["lumi.motion.agl04"],
@@ -1575,7 +1685,7 @@ exports.definitions = [
1575
1685
  await endpoint.read("manuSpecificLumi", [0x0102], { manufacturerCode: manufacturerCode });
1576
1686
  await endpoint.read("manuSpecificLumi", [0x010c], { manufacturerCode: manufacturerCode });
1577
1687
  },
1578
- extend: [m.quirkCheckinInterval("1_HOUR"), lumiZigbeeOTA()],
1688
+ extend: [lumi.modernExtend.addManuSpecificLumiCluster(), m.quirkCheckinInterval("1_HOUR"), lumiZigbeeOTA()],
1579
1689
  },
1580
1690
  {
1581
1691
  zigbeeModel: ["lumi.motion.ac02"],
@@ -1611,7 +1721,7 @@ exports.definitions = [
1611
1721
  await endpoint.read("manuSpecificLumi", [0x010c], { manufacturerCode: manufacturerCode });
1612
1722
  await endpoint.read("manuSpecificLumi", [0x0152], { manufacturerCode: manufacturerCode });
1613
1723
  },
1614
- extend: [m.quirkCheckinInterval("1_HOUR"), lumiZigbeeOTA()],
1724
+ extend: [lumi.modernExtend.addManuSpecificLumiCluster(), m.quirkCheckinInterval("1_HOUR"), lumiZigbeeOTA()],
1615
1725
  },
1616
1726
  {
1617
1727
  zigbeeModel: ["lumi.motion.acn001"],
@@ -1640,7 +1750,7 @@ exports.definitions = [
1640
1750
  await endpoint.read("genPowerCfg", ["batteryVoltage"]);
1641
1751
  await endpoint.read("manuSpecificLumi", [0x0102], { manufacturerCode: manufacturerCode });
1642
1752
  },
1643
- extend: [m.quirkCheckinInterval("1_HOUR"), lumiZigbeeOTA()],
1753
+ extend: [lumi.modernExtend.addManuSpecificLumiCluster(), m.quirkCheckinInterval("1_HOUR"), lumiZigbeeOTA()],
1644
1754
  },
1645
1755
  {
1646
1756
  zigbeeModel: ["lumi.motion.ac01"],
@@ -1717,7 +1827,7 @@ exports.definitions = [
1717
1827
  await endpoint.read("manuSpecificLumi", [0x0144], { manufacturerCode: manufacturerCode });
1718
1828
  await endpoint.read("manuSpecificLumi", [0x0146], { manufacturerCode: manufacturerCode });
1719
1829
  },
1720
- extend: [lumiZigbeeOTA()],
1830
+ extend: [lumi.modernExtend.addManuSpecificLumiCluster(), lumiZigbeeOTA()],
1721
1831
  },
1722
1832
  {
1723
1833
  zigbeeModel: ["lumi.sensor_occupy.agl1"],
@@ -1738,6 +1848,7 @@ exports.definitions = [
1738
1848
  await endpoint.read("manuSpecificLumi", [0x010c], { manufacturerCode: manufacturerCode });
1739
1849
  },
1740
1850
  extend: [
1851
+ lumi.modernExtend.addManuSpecificLumiCluster(),
1741
1852
  lumiZigbeeOTA(),
1742
1853
  lumi.lumiModernExtend.fp1ePresence(),
1743
1854
  lumi.lumiModernExtend.fp1eMovement(),
@@ -1802,7 +1913,7 @@ exports.definitions = [
1802
1913
  fromZigbee: [lumi.fromZigbee.lumi_basic, fz.ias_water_leak_alarm_1, lumi.fromZigbee.lumi_specific],
1803
1914
  toZigbee: [],
1804
1915
  exposes: [e.battery(), e.water_leak(), e.battery_low(), e.tamper(), e.battery_voltage()],
1805
- extend: [m.quirkCheckinInterval("1_HOUR"), lumiZigbeeOTA()],
1916
+ extend: [lumi.modernExtend.addManuSpecificLumiCluster(), m.quirkCheckinInterval("1_HOUR"), lumiZigbeeOTA()],
1806
1917
  },
1807
1918
  {
1808
1919
  zigbeeModel: ["lumi.sensor_cube", "lumi.sensor_cube.aqgl01"],
@@ -1873,7 +1984,7 @@ exports.definitions = [
1873
1984
  e.auto_off(20),
1874
1985
  e.overload_protection(100, 2300),
1875
1986
  ],
1876
- extend: [lumiZigbeeOTA()],
1987
+ extend: [lumi.modernExtend.addManuSpecificLumiCluster(), lumiZigbeeOTA()],
1877
1988
  },
1878
1989
  {
1879
1990
  zigbeeModel: ["lumi.plug.maus01"],
@@ -1909,7 +2020,7 @@ exports.definitions = [
1909
2020
  e.auto_off(20),
1910
2021
  e.overload_protection(100, 2300),
1911
2022
  ],
1912
- extend: [lumiZigbeeOTA()],
2023
+ extend: [lumi.modernExtend.addManuSpecificLumiCluster(), lumiZigbeeOTA()],
1913
2024
  },
1914
2025
  {
1915
2026
  zigbeeModel: ["lumi.plug.maeu01"],
@@ -1917,6 +2028,7 @@ exports.definitions = [
1917
2028
  description: "Smart plug EU",
1918
2029
  vendor: "Aqara",
1919
2030
  extend: [
2031
+ lumi.modernExtend.addManuSpecificLumiCluster(),
1920
2032
  m.forceDeviceType({ type: "Router" }),
1921
2033
  lumiZigbeeOTA(),
1922
2034
  m.poll({
@@ -2047,6 +2159,7 @@ exports.definitions = [
2047
2159
  .withDescription("Control both relay and usb or only the relay with the physical switch button"),
2048
2160
  ],
2049
2161
  extend: [
2162
+ lumi.modernExtend.addManuSpecificLumiCluster(),
2050
2163
  lumi.lumiModernExtend.lumiZigbeeOTA(),
2051
2164
  lumi.lumiModernExtend.lumiOnOff({ powerOutageMemory: "enum", endpointNames: ["relay", "usb"] }),
2052
2165
  lumi.lumiModernExtend.lumiLedDisabledNight(),
@@ -2095,7 +2208,11 @@ exports.definitions = [
2095
2208
  e.numeric("gas_density", ea.STATE),
2096
2209
  e.enum("selftest", ea.SET, [""]),
2097
2210
  ],
2098
- extend: [m.forceDeviceType({ type: "Router" }), m.forcePowerSource({ powerSource: "Mains (single phase)" })],
2211
+ extend: [
2212
+ lumi.modernExtend.addManuSpecificLumiCluster(),
2213
+ m.forceDeviceType({ type: "Router" }),
2214
+ m.forcePowerSource({ powerSource: "Mains (single phase)" }),
2215
+ ],
2099
2216
  },
2100
2217
  {
2101
2218
  zigbeeModel: ["lumi.sensor_gas.acn02"],
@@ -2158,7 +2275,7 @@ exports.definitions = [
2158
2275
  await endpoint.read("manuSpecificLumi", [0x014b], { manufacturerCode: manufacturerCode });
2159
2276
  await endpoint.read("manuSpecificLumi", [0x0002], { manufacturerCode: manufacturerCode });
2160
2277
  },
2161
- extend: [lumiZigbeeOTA()],
2278
+ extend: [lumi.modernExtend.addManuSpecificLumiCluster(), lumiZigbeeOTA()],
2162
2279
  },
2163
2280
  {
2164
2281
  zigbeeModel: ["lumi.sensor_smoke.acn03"],
@@ -2219,7 +2336,7 @@ exports.definitions = [
2219
2336
  await endpoint.read("manuSpecificLumi", [0x0126], { manufacturerCode: manufacturerCode });
2220
2337
  await endpoint.read("manuSpecificLumi", [0x014b], { manufacturerCode: manufacturerCode });
2221
2338
  },
2222
- extend: [m.quirkCheckinInterval("1_HOUR"), lumiZigbeeOTA()],
2339
+ extend: [lumi.modernExtend.addManuSpecificLumiCluster(), m.quirkCheckinInterval("1_HOUR"), lumiZigbeeOTA()],
2223
2340
  },
2224
2341
  {
2225
2342
  zigbeeModel: ["lumi.lock.v1"],
@@ -2262,6 +2379,7 @@ exports.definitions = [
2262
2379
  vendor: "Aqara",
2263
2380
  description: "Vibration sensor T1",
2264
2381
  extend: [
2382
+ lumi.modernExtend.addManuSpecificLumiCluster(),
2265
2383
  lumiVibration(),
2266
2384
  // lumiMiscellaneous(),
2267
2385
  lumiReportInterval(),
@@ -2271,6 +2389,154 @@ exports.definitions = [
2271
2389
  m.quirkCheckinInterval("1_HOUR"),
2272
2390
  ],
2273
2391
  },
2392
+ {
2393
+ zigbeeModel: ["lumi.vibration.agl002"],
2394
+ model: "DWZTCGQ11LM",
2395
+ vendor: "Aqara",
2396
+ description: "Multi-state sensor P100",
2397
+ extend: [
2398
+ lumi.lumiModernExtend.addManuSpecificLumiCluster(),
2399
+ lumi.lumiModernExtend.lumiPreventReset(),
2400
+ lumi.lumiModernExtend.lumiBattery({
2401
+ voltageAttribute: 0x17,
2402
+ percentageAttribute: 0x18,
2403
+ }),
2404
+ lumi.lumiModernExtend.lumiZigbeeOTA(),
2405
+ m.enumLookup({
2406
+ name: "device_mode",
2407
+ cluster: "manuSpecificLumi",
2408
+ attribute: { ID: 0x0116, type: zigbee_herdsman_1.Zcl.DataType.UINT8 },
2409
+ lookup: { door_window: 3, object: 5 },
2410
+ description: "Device operating mode",
2411
+ access: "STATE_SET",
2412
+ entityCategory: "config",
2413
+ zigbeeCommandOptions: { manufacturerCode },
2414
+ }),
2415
+ m.enumLookup({
2416
+ name: "door_window_type",
2417
+ cluster: "manuSpecificLumi",
2418
+ attribute: { ID: 0x01eb, type: zigbee_herdsman_1.Zcl.DataType.UINT8 },
2419
+ lookup: { casement_window: 1, hopper_window: 2, composite_window: 3, hinged_door: 4 },
2420
+ description: "Door/window type (applies when device_mode = door_window)",
2421
+ access: "STATE_SET",
2422
+ label: "Door/window type",
2423
+ entityCategory: "config",
2424
+ zigbeeCommandOptions: { manufacturerCode },
2425
+ }),
2426
+ m.numeric({
2427
+ name: "sensitivity",
2428
+ cluster: "manuSpecificLumi",
2429
+ attribute: { ID: 0x010c, type: zigbee_herdsman_1.Zcl.DataType.UINT8 },
2430
+ valueMin: 1,
2431
+ valueMax: 10,
2432
+ description: "Detection sensitivity (1 = low, 10 = high)",
2433
+ access: "STATE_SET",
2434
+ entityCategory: "config",
2435
+ zigbeeCommandOptions: { manufacturerCode },
2436
+ }),
2437
+ m.numeric({
2438
+ name: "report_interval",
2439
+ cluster: "manuSpecificLumi",
2440
+ attribute: { ID: 0x01ec, type: zigbee_herdsman_1.Zcl.DataType.UINT32 },
2441
+ unit: "s",
2442
+ valueMin: 5,
2443
+ valueMax: 300,
2444
+ description: "Reporting interval in seconds. Also drives the device's 802.15.4 poll cadence — lower values are more responsive but reduce battery life.",
2445
+ access: "STATE_SET",
2446
+ entityCategory: "config",
2447
+ zigbeeCommandOptions: { manufacturerCode },
2448
+ }),
2449
+ m.binary({
2450
+ name: "orientation_detection",
2451
+ cluster: "manuSpecificLumi",
2452
+ attribute: { ID: 0x01f0, type: zigbee_herdsman_1.Zcl.DataType.BOOLEAN },
2453
+ valueOn: ["ON", 1],
2454
+ valueOff: ["OFF", 0],
2455
+ description: "Enable orientation event detection (object mode, requires device button press)",
2456
+ access: "STATE_SET",
2457
+ zigbeeCommandOptions: { manufacturerCode },
2458
+ }),
2459
+ m.binary({
2460
+ name: "movement_detection",
2461
+ cluster: "manuSpecificLumi",
2462
+ attribute: { ID: 0x01ed, type: zigbee_herdsman_1.Zcl.DataType.BOOLEAN },
2463
+ valueOn: ["ON", 1],
2464
+ valueOff: ["OFF", 0],
2465
+ description: "Enable movement event detection (object mode, requires device button press)",
2466
+ access: "STATE_SET",
2467
+ zigbeeCommandOptions: { manufacturerCode },
2468
+ }),
2469
+ m.binary({
2470
+ name: "fall_detection",
2471
+ cluster: "manuSpecificLumi",
2472
+ attribute: { ID: 0x01d8, type: zigbee_herdsman_1.Zcl.DataType.BOOLEAN },
2473
+ valueOn: ["ON", 1],
2474
+ valueOff: ["OFF", 0],
2475
+ description: "Enable fall event detection (object mode, requires device button press)",
2476
+ access: "STATE_SET",
2477
+ zigbeeCommandOptions: { manufacturerCode },
2478
+ }),
2479
+ m.binary({
2480
+ name: "vibration_detection",
2481
+ cluster: "manuSpecificLumi",
2482
+ attribute: { ID: 0x0107, type: zigbee_herdsman_1.Zcl.DataType.BOOLEAN },
2483
+ valueOn: ["ON", 1],
2484
+ valueOff: ["OFF", 0],
2485
+ description: "Enable vibration event detection (object mode, requires device button press)",
2486
+ access: "STATE_SET",
2487
+ zigbeeCommandOptions: { manufacturerCode },
2488
+ }),
2489
+ m.binary({
2490
+ name: "triple_tap_detection",
2491
+ cluster: "manuSpecificLumi",
2492
+ attribute: { ID: 0x01ef, type: zigbee_herdsman_1.Zcl.DataType.BOOLEAN },
2493
+ valueOn: ["ON", 1],
2494
+ valueOff: ["OFF", 0],
2495
+ description: "Enable triple-tap event detection (object mode, requires device button press)",
2496
+ access: "STATE_SET",
2497
+ zigbeeCommandOptions: { manufacturerCode },
2498
+ }),
2499
+ m.enumLookup({
2500
+ name: "orientation",
2501
+ cluster: "manuSpecificLumi",
2502
+ attribute: { ID: 0x01f1, type: zigbee_herdsman_1.Zcl.DataType.UINT8 },
2503
+ lookup: { face_up: 1, face_down: 2, vertical: 3, tilt: 4 },
2504
+ description: "Last reported orientation (relevant when action = orientation)",
2505
+ access: "STATE",
2506
+ zigbeeCommandOptions: { manufacturerCode },
2507
+ }),
2508
+ // Primary actions on closuresDoorLock 0x0055
2509
+ m.actionEnumLookup({
2510
+ cluster: "closuresDoorLock",
2511
+ attribute: { ID: 0x0055, type: zigbee_herdsman_1.Zcl.DataType.UINT16 },
2512
+ actionLookup: { triple_tap: 0, movement: 1, vibration: 2, orientation: 3, fall: 4 },
2513
+ extraActions: ["static"],
2514
+ }),
2515
+ // and the static-state edge on manuSpecificLumi 0x01F3, declared as an
2516
+ // extraAction above. Emits true transition only (the device does
2517
+ // report the false transition)
2518
+ lumi.lumiModernExtend.lumiStaticStateAction(),
2519
+ m.binary({
2520
+ name: "contact",
2521
+ cluster: "genOnOff",
2522
+ attribute: "onOff",
2523
+ valueOn: [false, 1],
2524
+ valueOff: [true, 0],
2525
+ description: "Door/window state (door/window mode only)",
2526
+ access: "STATE",
2527
+ }),
2528
+ m.enumLookup({
2529
+ name: "device_posture",
2530
+ cluster: "manuSpecificLumi",
2531
+ attribute: { ID: 0x01ee, type: zigbee_herdsman_1.Zcl.DataType.UINT8 },
2532
+ lookup: { normal: 1, abnormal: 2 },
2533
+ description: "Door/window mounting orientation check — 'abnormal' if the sensor is incorrectly installed or needs calibration",
2534
+ access: "STATE",
2535
+ entityCategory: "diagnostic",
2536
+ zigbeeCommandOptions: { manufacturerCode },
2537
+ }),
2538
+ ],
2539
+ },
2274
2540
  {
2275
2541
  zigbeeModel: ["lumi.curtain"],
2276
2542
  model: "ZNCLDJ11LM",
@@ -2373,6 +2639,7 @@ exports.definitions = [
2373
2639
  .withDescription("Performs an automatic calibration process similar to Aqara’s method to set curtain limits."),
2374
2640
  ],
2375
2641
  extend: [
2642
+ lumi.modernExtend.addManuSpecificLumiCluster(),
2376
2643
  m.windowCovering({ controls: ["lift"], coverInverted: true, configureReporting: true }),
2377
2644
  lumiCurtainSpeed(),
2378
2645
  lumiCurtainManualOpenClose(),
@@ -2420,6 +2687,7 @@ exports.definitions = [
2420
2687
  await endpoint.read("manuSpecificLumi", [0x040a], { manufacturerCode: manufacturerCode });
2421
2688
  },
2422
2689
  extend: [
2690
+ lumi.modernExtend.addManuSpecificLumiCluster(),
2423
2691
  m.quirkAddEndpointCluster({
2424
2692
  endpointID: 1,
2425
2693
  inputClusters: ["manuSpecificLumi"],
@@ -2478,7 +2746,7 @@ exports.definitions = [
2478
2746
  await endpoint.read("genBasic", ["powerSource"]);
2479
2747
  await endpoint.read("closuresWindowCovering", ["currentPositionLiftPercentage"]);
2480
2748
  },
2481
- extend: [lumiZigbeeOTA()],
2749
+ extend: [lumi.modernExtend.addManuSpecificLumiCluster(), lumiZigbeeOTA()],
2482
2750
  },
2483
2751
  {
2484
2752
  zigbeeModel: ["lumi.relay.c2acn01"],
@@ -2527,6 +2795,7 @@ exports.definitions = [
2527
2795
  e.device_temperature(),
2528
2796
  ],
2529
2797
  extend: [
2798
+ lumi.modernExtend.addManuSpecificLumiCluster(),
2530
2799
  lumiSwitchType(),
2531
2800
  lumiPowerOnBehavior({ lookup: { on: 0, previous: 1, off: 2, toggle: 3 } }),
2532
2801
  lumiOperationMode({ description: "Decoupled mode for 1st relay", endpointName: "l1" }),
@@ -2695,7 +2964,7 @@ exports.definitions = [
2695
2964
  ],
2696
2965
  toZigbee: [lumi.toZigbee.lumi_operation_mode_opple],
2697
2966
  meta: { battery: { voltageToPercentage: { min: 2850, max: 3000 } } },
2698
- extend: [m.quirkCheckinInterval("1_HOUR")],
2967
+ extend: [lumi.modernExtend.addManuSpecificLumiCluster(), m.quirkCheckinInterval("1_HOUR")],
2699
2968
  configure: async (device, coordinatorEndpoint) => {
2700
2969
  const endpoint = device.getEndpoint(1);
2701
2970
  await endpoint.write("manuSpecificLumi", { mode: 1 }, { manufacturerCode: manufacturerCode });
@@ -2747,7 +3016,7 @@ exports.definitions = [
2747
3016
  ],
2748
3017
  toZigbee: [lumi.toZigbee.lumi_operation_mode_opple],
2749
3018
  meta: { battery: { voltageToPercentage: { min: 2850, max: 3000 } } },
2750
- extend: [m.quirkCheckinInterval("1_HOUR")],
3019
+ extend: [lumi.modernExtend.addManuSpecificLumiCluster(), m.quirkCheckinInterval("1_HOUR")],
2751
3020
  configure: async (device, coordinatorEndpoint) => {
2752
3021
  const endpoint = device.getEndpoint(1);
2753
3022
  await endpoint.write("manuSpecificLumi", { mode: 1 }, { manufacturerCode: manufacturerCode });
@@ -2813,7 +3082,7 @@ exports.definitions = [
2813
3082
  ],
2814
3083
  toZigbee: [lumi.toZigbee.lumi_operation_mode_opple],
2815
3084
  meta: { battery: { voltageToPercentage: { min: 2850, max: 3000 } } },
2816
- extend: [m.quirkCheckinInterval("1_HOUR")],
3085
+ extend: [lumi.modernExtend.addManuSpecificLumiCluster(), m.quirkCheckinInterval("1_HOUR")],
2817
3086
  configure: async (device, coordinatorEndpoint) => {
2818
3087
  const endpoint = device.getEndpoint(1);
2819
3088
  await endpoint.write("manuSpecificLumi", { mode: 1 }, { manufacturerCode: manufacturerCode });
@@ -2828,7 +3097,7 @@ exports.definitions = [
2828
3097
  description: "Mi light sensor",
2829
3098
  fromZigbee: [fz.battery, lumi.fromZigbee.lumi_specific],
2830
3099
  meta: { battery: { voltageToPercentage: { min: 2850, max: 3000 } } },
2831
- extend: [m.quirkCheckinInterval("1_HOUR"), m.illuminance()],
3100
+ extend: [lumi.modernExtend.addManuSpecificLumiCluster(), m.quirkCheckinInterval("1_HOUR"), m.illuminance()],
2832
3101
  exposes: [e.battery(), e.battery_voltage()],
2833
3102
  },
2834
3103
  {
@@ -2842,6 +3111,7 @@ exports.definitions = [
2842
3111
  { vendor: "Aqara", model: "MZTD11LM" },
2843
3112
  ],
2844
3113
  extend: [
3114
+ lumi.modernExtend.addManuSpecificLumiCluster(),
2845
3115
  lumiZigbeeOTA(),
2846
3116
  lumiLight({
2847
3117
  colorTemp: true,
@@ -2883,7 +3153,11 @@ exports.definitions = [
2883
3153
  model: "ZNTGMK12LM",
2884
3154
  vendor: "Aqara",
2885
3155
  description: "Smart color temperature light controller",
2886
- extend: [lumiLight({ colorTemp: true, powerOutageCount: true, deviceTemperature: true }), lumiZigbeeOTA()],
3156
+ extend: [
3157
+ lumi.modernExtend.addManuSpecificLumiCluster(),
3158
+ lumiLight({ colorTemp: true, powerOutageCount: true, deviceTemperature: true }),
3159
+ lumiZigbeeOTA(),
3160
+ ],
2887
3161
  },
2888
3162
  {
2889
3163
  zigbeeModel: ["lumi.light.cbacn1"],
@@ -2897,7 +3171,7 @@ exports.definitions = [
2897
3171
  model: "SSWQD02LM",
2898
3172
  vendor: "Aqara",
2899
3173
  description: "Smart dimmer controller T1 Pro",
2900
- extend: [lumiZigbeeOTA(), lumiLight({ colorTemp: true, powerOutageMemory: "switch" })],
3174
+ extend: [lumi.modernExtend.addManuSpecificLumiCluster(), lumiZigbeeOTA(), lumiLight({ colorTemp: true, powerOutageMemory: "switch" })],
2901
3175
  },
2902
3176
  {
2903
3177
  zigbeeModel: ["lumi.dimmer.acn003"],
@@ -2905,6 +3179,7 @@ exports.definitions = [
2905
3179
  vendor: "Aqara",
2906
3180
  description: "T1 light strip controller",
2907
3181
  extend: [
3182
+ lumi.modernExtend.addManuSpecificLumiCluster(),
2908
3183
  lumi.lumiModernExtend.lumiLight({ colorTemp: true, colorTempRange: [154, 370], color: false, powerOutageMemory: "enum" }),
2909
3184
  m.identify(),
2910
3185
  m.forcePowerSource({ powerSource: "Mains (single phase)" }),
@@ -2922,6 +3197,7 @@ exports.definitions = [
2922
3197
  vendor: "Aqara",
2923
3198
  description: "T1 light strip controller",
2924
3199
  extend: [
3200
+ lumi.modernExtend.addManuSpecificLumiCluster(),
2925
3201
  lumi.lumiModernExtend.lumiLight({ colorTemp: true, colorTempRange: [154, 370], color: false, powerOutageMemory: "enum" }),
2926
3202
  m.identify(),
2927
3203
  m.forcePowerSource({ powerSource: "Mains (single phase)" }),
@@ -2939,6 +3215,7 @@ exports.definitions = [
2939
3215
  vendor: "Aqara",
2940
3216
  description: "T1 light strip controller",
2941
3217
  extend: [
3218
+ lumi.modernExtend.addManuSpecificLumiCluster(),
2942
3219
  lumi.lumiModernExtend.lumiLight({ colorTemp: true, colorTempRange: [154, 370], color: false, powerOutageMemory: "enum" }),
2943
3220
  m.identify(),
2944
3221
  m.forcePowerSource({ powerSource: "Mains (single phase)" }),
@@ -2955,7 +3232,7 @@ exports.definitions = [
2955
3232
  model: "SSWQD03LM",
2956
3233
  vendor: "Aqara",
2957
3234
  description: "Spotlight T2",
2958
- extend: [lumiZigbeeOTA(), lumiLight({ colorTemp: true, powerOutageMemory: "switch" })],
3235
+ extend: [lumi.modernExtend.addManuSpecificLumiCluster(), lumiZigbeeOTA(), lumiLight({ colorTemp: true, powerOutageMemory: "switch" })],
2959
3236
  },
2960
3237
  {
2961
3238
  zigbeeModel: ["lumi.switch.n0agl1"],
@@ -2989,7 +3266,12 @@ exports.definitions = [
2989
3266
  await reporting.onOff(endpoint);
2990
3267
  await reporting.deviceTemperature(endpoint);
2991
3268
  },
2992
- extend: [lumiZigbeeOTA(), m.forceDeviceType({ type: "Router" }), m.forcePowerSource({ powerSource: "Mains (single phase)" })],
3269
+ extend: [
3270
+ lumi.modernExtend.addManuSpecificLumiCluster(),
3271
+ lumiZigbeeOTA(),
3272
+ m.forceDeviceType({ type: "Router" }),
3273
+ m.forcePowerSource({ powerSource: "Mains (single phase)" }),
3274
+ ],
2993
3275
  },
2994
3276
  {
2995
3277
  zigbeeModel: ["lumi.switch.n0acn2"],
@@ -3016,9 +3298,11 @@ exports.definitions = [
3016
3298
  e.switch_type(),
3017
3299
  ],
3018
3300
  configure: async (device, coordinatorEndpoint) => {
3019
- await device.getEndpoint(1).write("manuSpecificLumi", { mode: 1 }, { manufacturerCode: manufacturerCode, disableResponse: true });
3301
+ await device
3302
+ .getEndpoint(1)
3303
+ .write("manuSpecificLumi", { mode: 1 }, { manufacturerCode: manufacturerCode, disableResponse: true });
3020
3304
  },
3021
- extend: [lumiZigbeeOTA(), m.forcePowerSource({ powerSource: "Mains (single phase)" })],
3305
+ extend: [lumi.modernExtend.addManuSpecificLumiCluster(), lumiZigbeeOTA(), m.forcePowerSource({ powerSource: "Mains (single phase)" })],
3022
3306
  },
3023
3307
  {
3024
3308
  zigbeeModel: ["lumi.switch.l0agl1"],
@@ -3028,7 +3312,7 @@ exports.definitions = [
3028
3312
  fromZigbee: [fz.on_off, lumi.fromZigbee.lumi_specific],
3029
3313
  exposes: [e.switch(), e.power_outage_memory(), e.switch_type(), e.power_outage_count(), e.device_temperature()],
3030
3314
  toZigbee: [lumi.toZigbee.lumi_switch_type, tz.on_off, lumi.toZigbee.lumi_switch_power_outage_memory],
3031
- extend: [m.forcePowerSource({ powerSource: "Mains (single phase)" })],
3315
+ extend: [lumi.modernExtend.addManuSpecificLumiCluster(), m.forcePowerSource({ powerSource: "Mains (single phase)" })],
3032
3316
  configure: async (device, coordinatorEndpoint) => {
3033
3317
  const endpoint = device.getEndpoint(1);
3034
3318
  await reporting.bind(endpoint, coordinatorEndpoint, ["genOnOff"]);
@@ -3043,7 +3327,7 @@ exports.definitions = [
3043
3327
  fromZigbee: [fz.on_off, lumi.fromZigbee.lumi_specific],
3044
3328
  exposes: [e.switch(), e.power_outage_memory(), e.switch_type()],
3045
3329
  toZigbee: [lumi.toZigbee.lumi_switch_type, tz.on_off, lumi.toZigbee.lumi_switch_power_outage_memory],
3046
- extend: [m.forcePowerSource({ powerSource: "Mains (single phase)" })],
3330
+ extend: [lumi.modernExtend.addManuSpecificLumiCluster(), m.forcePowerSource({ powerSource: "Mains (single phase)" })],
3047
3331
  configure: async (device, coordinatorEndpoint) => {
3048
3332
  const endpoint = device.getEndpoint(1);
3049
3333
  await reporting.bind(endpoint, coordinatorEndpoint, ["genOnOff"]);
@@ -3122,7 +3406,7 @@ exports.definitions = [
3122
3406
  vendor: "Aqara",
3123
3407
  description: "Wireless remote switch T1 (single rocker)",
3124
3408
  meta: { battery: { voltageToPercentage: { min: 2850, max: 3000 } } },
3125
- extend: [m.quirkCheckinInterval("1_HOUR")],
3409
+ extend: [lumi.modernExtend.addManuSpecificLumiCluster(), m.quirkCheckinInterval("1_HOUR")],
3126
3410
  fromZigbee: [lumi.fromZigbee.lumi_action, lumi.fromZigbee.lumi_action_multistate, fz.battery, lumi.fromZigbee.lumi_specific],
3127
3411
  toZigbee: [],
3128
3412
  exposes: [e.action(["single", "double", "hold"]), e.battery()],
@@ -3136,7 +3420,7 @@ exports.definitions = [
3136
3420
  fromZigbee: [fz.battery, lumi.fromZigbee.lumi_action_multistate, lumi.fromZigbee.lumi_specific, fz.command_toggle],
3137
3421
  toZigbee: [lumi.toZigbee.lumi_switch_click_mode, lumi.toZigbee.lumi_operation_mode_opple],
3138
3422
  meta: { battery: { voltageToPercentage: { min: 2850, max: 3000 } }, multiEndpoint: true },
3139
- extend: [m.quirkCheckinInterval("1_HOUR")],
3423
+ extend: [lumi.modernExtend.addManuSpecificLumiCluster(), m.quirkCheckinInterval("1_HOUR")],
3140
3424
  exposes: [
3141
3425
  e.battery(),
3142
3426
  e.battery_voltage(),
@@ -3202,9 +3486,11 @@ exports.definitions = [
3202
3486
  .withDescription("Anti flicker mode can be used to solve blinking issues of some lights. Quick mode makes the device respond faster."),
3203
3487
  ],
3204
3488
  configure: async (device, coordinatorEndpoint) => {
3205
- await device.getEndpoint(1).write("manuSpecificLumi", { mode: 1 }, { manufacturerCode: manufacturerCode, disableResponse: true });
3489
+ await device
3490
+ .getEndpoint(1)
3491
+ .write("manuSpecificLumi", { mode: 1 }, { manufacturerCode: manufacturerCode, disableResponse: true });
3206
3492
  },
3207
- extend: [lumiZigbeeOTA(), lumiPreventReset()],
3493
+ extend: [lumi.modernExtend.addManuSpecificLumiCluster(), lumiZigbeeOTA(), lumiPreventReset()],
3208
3494
  },
3209
3495
  {
3210
3496
  zigbeeModel: ["lumi.switch.b2lc04"],
@@ -3237,9 +3523,11 @@ exports.definitions = [
3237
3523
  e.flip_indicator_light(),
3238
3524
  ],
3239
3525
  configure: async (device, coordinatorEndpoint) => {
3240
- await device.getEndpoint(1).write("manuSpecificLumi", { mode: 1 }, { manufacturerCode: manufacturerCode, disableResponse: true });
3526
+ await device
3527
+ .getEndpoint(1)
3528
+ .write("manuSpecificLumi", { mode: 1 }, { manufacturerCode: manufacturerCode, disableResponse: true });
3241
3529
  },
3242
- extend: [lumiZigbeeOTA(), lumiPreventReset()],
3530
+ extend: [lumi.modernExtend.addManuSpecificLumiCluster(), lumiZigbeeOTA(), lumiPreventReset()],
3243
3531
  },
3244
3532
  {
3245
3533
  zigbeeModel: ["lumi.airmonitor.acn01"],
@@ -3251,6 +3539,7 @@ exports.definitions = [
3251
3539
  meta: { battery: { voltageToPercentage: { min: 2850, max: 3000 } } },
3252
3540
  exposes: [e.device_temperature(), e.battery(), e.battery_voltage()],
3253
3541
  extend: [
3542
+ lumi.modernExtend.addManuSpecificLumiCluster(),
3254
3543
  m.quirkCheckinInterval("1_HOUR"),
3255
3544
  m.quirkAddEndpointCluster({
3256
3545
  endpointID: 1,
@@ -3298,9 +3587,11 @@ exports.definitions = [
3298
3587
  e.flip_indicator_light(),
3299
3588
  ],
3300
3589
  configure: async (device, coordinatorEndpoint) => {
3301
- await device.getEndpoint(1).write("manuSpecificLumi", { mode: 1 }, { manufacturerCode: manufacturerCode, disableResponse: true });
3590
+ await device
3591
+ .getEndpoint(1)
3592
+ .write("manuSpecificLumi", { mode: 1 }, { manufacturerCode: manufacturerCode, disableResponse: true });
3302
3593
  },
3303
- extend: [lumiZigbeeOTA(), lumiPreventReset()],
3594
+ extend: [lumi.modernExtend.addManuSpecificLumiCluster(), lumiZigbeeOTA(), lumiPreventReset()],
3304
3595
  },
3305
3596
  {
3306
3597
  zigbeeModel: ["lumi.plug.macn01"],
@@ -3328,7 +3619,7 @@ exports.definitions = [
3328
3619
  e.button_lock(),
3329
3620
  e.overload_protection(100, 2500),
3330
3621
  ],
3331
- extend: [lumiZigbeeOTA()],
3622
+ extend: [lumi.modernExtend.addManuSpecificLumiCluster(), lumiZigbeeOTA()],
3332
3623
  },
3333
3624
  {
3334
3625
  zigbeeModel: ["lumi.switch.b1nc01"],
@@ -3351,9 +3642,11 @@ exports.definitions = [
3351
3642
  e.enum("operation_mode", ea.ALL, ["control_relay", "decoupled"]).withDescription("Decoupled mode"),
3352
3643
  ],
3353
3644
  configure: async (device, coordinatorEndpoint) => {
3354
- await device.getEndpoint(1).write("manuSpecificLumi", { mode: 1 }, { manufacturerCode: manufacturerCode, disableResponse: true });
3645
+ await device
3646
+ .getEndpoint(1)
3647
+ .write("manuSpecificLumi", { mode: 1 }, { manufacturerCode: manufacturerCode, disableResponse: true });
3355
3648
  },
3356
- extend: [lumiZigbeeOTA(), lumiPreventReset()],
3649
+ extend: [lumi.modernExtend.addManuSpecificLumiCluster(), lumiZigbeeOTA(), lumiPreventReset()],
3357
3650
  },
3358
3651
  {
3359
3652
  zigbeeModel: ["lumi.remote.b1acn02"],
@@ -3372,7 +3665,7 @@ exports.definitions = [
3372
3665
  const endpoint1 = device.getEndpoint(1);
3373
3666
  await endpoint1.write("manuSpecificLumi", { mode: 1 }, { manufacturerCode: manufacturerCode, disableResponse: true });
3374
3667
  },
3375
- extend: [m.quirkCheckinInterval("1_HOUR"), lumiZigbeeOTA()],
3668
+ extend: [lumi.modernExtend.addManuSpecificLumiCluster(), m.quirkCheckinInterval("1_HOUR"), lumiZigbeeOTA()],
3376
3669
  },
3377
3670
  {
3378
3671
  zigbeeModel: ["lumi.sen_ill.agl01"],
@@ -3394,10 +3687,17 @@ exports.definitions = [
3394
3687
  ],
3395
3688
  configure: async (device, coordinatorEndpoint) => {
3396
3689
  const endpoint = device.getEndpoint(1);
3397
- await device.getEndpoint(1).write("manuSpecificLumi", { mode: 1 }, { manufacturerCode: manufacturerCode, disableResponse: true });
3690
+ await device
3691
+ .getEndpoint(1)
3692
+ .write("manuSpecificLumi", { mode: 1 }, { manufacturerCode: manufacturerCode, disableResponse: true });
3398
3693
  await endpoint.read("manuSpecificLumi", [0x0000], { manufacturerCode: manufacturerCode });
3399
3694
  },
3400
- extend: [m.quirkCheckinInterval("1_HOUR"), lumiZigbeeOTA(), m.illuminance({ reporting: false })],
3695
+ extend: [
3696
+ lumi.modernExtend.addManuSpecificLumiCluster(),
3697
+ m.quirkCheckinInterval("1_HOUR"),
3698
+ lumiZigbeeOTA(),
3699
+ m.illuminance({ reporting: false }),
3700
+ ],
3401
3701
  },
3402
3702
  {
3403
3703
  zigbeeModel: ["lumi.plug.sacn03"],
@@ -3433,7 +3733,7 @@ exports.definitions = [
3433
3733
  .withDescription("Control both relay and usb or only the relay with the physical switch button"),
3434
3734
  e.overload_protection(100, 2500),
3435
3735
  ],
3436
- extend: [lumiZigbeeOTA()],
3736
+ extend: [lumi.modernExtend.addManuSpecificLumiCluster(), lumiZigbeeOTA()],
3437
3737
  },
3438
3738
  {
3439
3739
  zigbeeModel: ["lumi.magnet.agl02"],
@@ -3448,7 +3748,7 @@ exports.definitions = [
3448
3748
  toZigbee: [],
3449
3749
  exposes: [e.contact(), e.battery(), e.battery_voltage()],
3450
3750
  meta: { battery: { voltageToPercentage: { min: 2850, max: 3000 } } },
3451
- extend: [m.quirkCheckinInterval("1_HOUR")],
3751
+ extend: [lumi.modernExtend.addManuSpecificLumiCluster(), m.quirkCheckinInterval("1_HOUR")],
3452
3752
  },
3453
3753
  {
3454
3754
  zigbeeModel: ["lumi.plug.sacn02"],
@@ -3475,7 +3775,7 @@ exports.definitions = [
3475
3775
  e.button_lock(),
3476
3776
  e.overload_protection(100, 2500),
3477
3777
  ],
3478
- extend: [lumiZigbeeOTA()],
3778
+ extend: [lumi.modernExtend.addManuSpecificLumiCluster(), lumiZigbeeOTA()],
3479
3779
  },
3480
3780
  {
3481
3781
  zigbeeModel: ["lumi.remote.rkba01"],
@@ -3483,6 +3783,7 @@ exports.definitions = [
3483
3783
  vendor: "Aqara",
3484
3784
  description: "Smart rotary knob H1 (wireless)",
3485
3785
  extend: [
3786
+ lumi.modernExtend.addManuSpecificLumiCluster(),
3486
3787
  m.quirkCheckinInterval("1_HOUR"),
3487
3788
  lumiPreventReset(),
3488
3789
  lumiCommandMode(),
@@ -3505,7 +3806,7 @@ exports.definitions = [
3505
3806
  vendor: "Aqara",
3506
3807
  description: "Wireless remote switch E1 (single rocker)",
3507
3808
  meta: { battery: { voltageToPercentage: { min: 2850, max: 3000 } } },
3508
- extend: [m.quirkCheckinInterval("1_HOUR")],
3809
+ extend: [lumi.modernExtend.addManuSpecificLumiCluster(), m.quirkCheckinInterval("1_HOUR")],
3509
3810
  fromZigbee: [lumi.fromZigbee.lumi_action_multistate, lumi.fromZigbee.lumi_specific],
3510
3811
  toZigbee: [lumi.toZigbee.lumi_switch_click_mode],
3511
3812
  exposes: [
@@ -3518,7 +3819,9 @@ exports.definitions = [
3518
3819
  "multi: supports more events like double and hold"),
3519
3820
  ],
3520
3821
  configure: async (device, coordinatorEndpoint) => {
3521
- await device.getEndpoint(1).write("manuSpecificLumi", { 293: { value: 0x02, type: 0x20 } }, { manufacturerCode: manufacturerCode });
3822
+ await device
3823
+ .getEndpoint(1)
3824
+ .write("manuSpecificLumi", { 293: { value: 0x02, type: 0x20 } }, { manufacturerCode: manufacturerCode });
3522
3825
  },
3523
3826
  },
3524
3827
  {
@@ -3527,7 +3830,7 @@ exports.definitions = [
3527
3830
  vendor: "Aqara",
3528
3831
  description: "Wireless remote switch E1 (double rocker)",
3529
3832
  meta: { battery: { voltageToPercentage: { min: 2850, max: 3000 } } },
3530
- extend: [m.quirkCheckinInterval("1_HOUR"), lumiPreventReset()],
3833
+ extend: [lumi.modernExtend.addManuSpecificLumiCluster(), m.quirkCheckinInterval("1_HOUR"), lumiPreventReset()],
3531
3834
  exposes: [
3532
3835
  e.battery(),
3533
3836
  e.battery_voltage(),
@@ -3564,7 +3867,7 @@ exports.definitions = [
3564
3867
  .withDescription('Operation mode, select "command" to enable bindings (wake up the device before changing modes!)'),
3565
3868
  ],
3566
3869
  meta: { battery: { voltageToPercentage: { min: 2850, max: 3000 } } },
3567
- extend: [m.quirkCheckinInterval("1_HOUR")],
3870
+ extend: [lumi.modernExtend.addManuSpecificLumiCluster(), m.quirkCheckinInterval("1_HOUR")],
3568
3871
  configure: async (device, coordinatorEndpoint) => {
3569
3872
  const endpoint1 = device.getEndpoint(1);
3570
3873
  await endpoint1.write("manuSpecificLumi", { mode: 1 }, { manufacturerCode: manufacturerCode, disableResponse: true });
@@ -3616,7 +3919,7 @@ exports.definitions = [
3616
3919
  await endpoint.read("manuSpecificLumi", [0x040a], { manufacturerCode: manufacturerCode });
3617
3920
  await endpoint.read("genPowerCfg", ["batteryVoltage"]);
3618
3921
  },
3619
- extend: [m.quirkCheckinInterval("1_HOUR"), lumiZigbeeOTA()],
3922
+ extend: [lumi.modernExtend.addManuSpecificLumiCluster(), m.quirkCheckinInterval("1_HOUR"), lumiZigbeeOTA()],
3620
3923
  },
3621
3924
  {
3622
3925
  zigbeeModel: ["aqara.feeder.acn001"],
@@ -3676,7 +3979,7 @@ exports.definitions = [
3676
3979
  .withUnit("g")
3677
3980
  .withCategory("config"),
3678
3981
  ],
3679
- extend: [lumiZigbeeOTA(), m.forcePowerSource({ powerSource: "Mains (single phase)" })],
3982
+ extend: [lumi.modernExtend.addManuSpecificLumiCluster(), lumiZigbeeOTA(), m.forcePowerSource({ powerSource: "Mains (single phase)" })],
3680
3983
  configure: async (device, coordinatorEndpoint) => {
3681
3984
  const endpoint = device.getEndpoint(1);
3682
3985
  await endpoint.read("manuSpecificLumi", [0xfff1], { manufacturerCode: manufacturerCode });
@@ -3690,7 +3993,7 @@ exports.definitions = [
3690
3993
  fromZigbee: [fz.battery, lumi.fromZigbee.lumi_action_multistate, lumi.fromZigbee.lumi_specific],
3691
3994
  toZigbee: [],
3692
3995
  meta: { battery: { voltageToPercentage: { min: 2850, max: 3000 } } },
3693
- extend: [m.quirkCheckinInterval("1_HOUR")],
3996
+ extend: [lumi.modernExtend.addManuSpecificLumiCluster(), m.quirkCheckinInterval("1_HOUR")],
3694
3997
  exposes: [
3695
3998
  e.battery(),
3696
3999
  e.battery_voltage(),
@@ -3707,7 +4010,7 @@ exports.definitions = [
3707
4010
  fromZigbee: [fz.battery, lumi.fromZigbee.lumi_action_multistate, lumi.fromZigbee.lumi_specific],
3708
4011
  toZigbee: [lumi.toZigbee.lumi_switch_click_mode],
3709
4012
  meta: { battery: { voltageToPercentage: { min: 2850, max: 3000 } } },
3710
- extend: [m.quirkCheckinInterval("1_HOUR")],
4013
+ extend: [lumi.modernExtend.addManuSpecificLumiCluster(), m.quirkCheckinInterval("1_HOUR")],
3711
4014
  exposes: [
3712
4015
  e.battery(),
3713
4016
  e.battery_voltage(),
@@ -3735,7 +4038,7 @@ exports.definitions = [
3735
4038
  fromZigbee: [fz.battery, lumi.fromZigbee.lumi_action_multistate, lumi.fromZigbee.lumi_specific, fz.command_toggle],
3736
4039
  toZigbee: [lumi.toZigbee.lumi_switch_click_mode, lumi.toZigbee.lumi_operation_mode_opple],
3737
4040
  meta: { battery: { voltageToPercentage: { min: 2850, max: 3000 } }, multiEndpoint: true },
3738
- extend: [m.quirkCheckinInterval("1_HOUR")],
4041
+ extend: [lumi.modernExtend.addManuSpecificLumiCluster(), m.quirkCheckinInterval("1_HOUR")],
3739
4042
  exposes: [
3740
4043
  e.battery(),
3741
4044
  e.battery_voltage(),
@@ -3808,7 +4111,7 @@ exports.definitions = [
3808
4111
  "button_3_triple",
3809
4112
  ]),
3810
4113
  ],
3811
- extend: [m.quirkCheckinInterval("1_HOUR"), lumiZigbeeOTA()],
4114
+ extend: [lumi.modernExtend.addManuSpecificLumiCluster(), m.quirkCheckinInterval("1_HOUR"), lumiZigbeeOTA()],
3812
4115
  },
3813
4116
  {
3814
4117
  zigbeeModel: ["lumi.switch.acn048"],
@@ -3816,6 +4119,7 @@ exports.definitions = [
3816
4119
  vendor: "Aqara",
3817
4120
  description: "Smart wall switch Z1 (single rocker)",
3818
4121
  extend: [
4122
+ lumi.modernExtend.addManuSpecificLumiCluster(),
3819
4123
  lumiZigbeeOTA(),
3820
4124
  lumiPreventReset(),
3821
4125
  lumiOnOff({ operationMode: true, powerOutageMemory: "enum", lockRelay: true }),
@@ -3833,6 +4137,7 @@ exports.definitions = [
3833
4137
  vendor: "Aqara",
3834
4138
  description: "Smart wall switch Z1 (double rocker)",
3835
4139
  extend: [
4140
+ lumi.modernExtend.addManuSpecificLumiCluster(),
3836
4141
  lumiZigbeeOTA(),
3837
4142
  lumiPreventReset(),
3838
4143
  m.deviceEndpoints({ endpoints: { top: 1, bottom: 2 } }),
@@ -3859,6 +4164,7 @@ exports.definitions = [
3859
4164
  vendor: "Aqara",
3860
4165
  description: "Smart wall switch Z1 (triple rocker)",
3861
4166
  extend: [
4167
+ lumi.modernExtend.addManuSpecificLumiCluster(),
3862
4168
  lumiZigbeeOTA(),
3863
4169
  lumiPreventReset(),
3864
4170
  m.deviceEndpoints({ endpoints: { top: 1, center: 2, bottom: 3 } }),
@@ -3885,6 +4191,7 @@ exports.definitions = [
3885
4191
  vendor: "Aqara",
3886
4192
  description: "Smart wall switch Z1 (quadruple rocker)",
3887
4193
  extend: [
4194
+ lumi.modernExtend.addManuSpecificLumiCluster(),
3888
4195
  lumiZigbeeOTA(),
3889
4196
  lumiPreventReset(),
3890
4197
  m.deviceEndpoints({ endpoints: { top: 1, center: 2, bottom: 3, wireless: 4 } }),
@@ -3911,6 +4218,7 @@ exports.definitions = [
3911
4218
  vendor: "Aqara",
3912
4219
  description: "Smart wall switch Z1 Pro (single rocker)",
3913
4220
  extend: [
4221
+ lumi.modernExtend.addManuSpecificLumiCluster(),
3914
4222
  lumiZigbeeOTA(),
3915
4223
  lumiPreventReset(),
3916
4224
  lumiOnOff({ operationMode: true, powerOutageMemory: "enum", lockRelay: true }),
@@ -3929,6 +4237,7 @@ exports.definitions = [
3929
4237
  vendor: "Aqara",
3930
4238
  description: "Smart wall switch Z1 Pro (double rocker)",
3931
4239
  extend: [
4240
+ lumi.modernExtend.addManuSpecificLumiCluster(),
3932
4241
  lumiZigbeeOTA(),
3933
4242
  lumiPreventReset(),
3934
4243
  m.deviceEndpoints({ endpoints: { top: 1, bottom: 2 } }),
@@ -3957,6 +4266,7 @@ exports.definitions = [
3957
4266
  vendor: "Aqara",
3958
4267
  description: "Smart wall switch Z1 Pro (triple rocker)",
3959
4268
  extend: [
4269
+ lumi.modernExtend.addManuSpecificLumiCluster(),
3960
4270
  lumiZigbeeOTA(),
3961
4271
  lumiPreventReset(),
3962
4272
  m.deviceEndpoints({ endpoints: { top: 1, center: 2, bottom: 3 } }),
@@ -3985,6 +4295,7 @@ exports.definitions = [
3985
4295
  vendor: "Aqara",
3986
4296
  description: "Smart wall switch Z1 Pro (quadruple rocker)",
3987
4297
  extend: [
4298
+ lumi.modernExtend.addManuSpecificLumiCluster(),
3988
4299
  lumiZigbeeOTA(),
3989
4300
  lumiPreventReset(),
3990
4301
  m.deviceEndpoints({ endpoints: { top: 1, center: 2, bottom: 3, wireless: 4 } }),
@@ -4013,6 +4324,7 @@ exports.definitions = [
4013
4324
  vendor: "Aqara",
4014
4325
  description: "Smart wall switch H1 20A (with neutral, single rocker)",
4015
4326
  extend: [
4327
+ lumi.modernExtend.addManuSpecificLumiCluster(),
4016
4328
  lumiZigbeeOTA(),
4017
4329
  lumiPreventReset(),
4018
4330
  lumiOnOff({ operationMode: true, powerOutageMemory: "binary" }),
@@ -4031,7 +4343,7 @@ exports.definitions = [
4031
4343
  whiteLabel: [{ vendor: "Aqara", model: "MFCZQ12LM" }],
4032
4344
  description: "Cube T1 Pro",
4033
4345
  meta: { battery: { voltageToPercentage: { min: 2850, max: 3000 } } },
4034
- extend: [m.quirkCheckinInterval("1_HOUR"), lumiZigbeeOTA()],
4346
+ extend: [lumi.modernExtend.addManuSpecificLumiCluster(), m.quirkCheckinInterval("1_HOUR"), lumiZigbeeOTA()],
4035
4347
  fromZigbee: [
4036
4348
  lumi.fromZigbee.lumi_specific,
4037
4349
  lumi.fromZigbee.lumi_action_multistate,
@@ -4131,9 +4443,11 @@ exports.definitions = [
4131
4443
  e.flip_indicator_light(),
4132
4444
  ],
4133
4445
  configure: async (device, coordinatorEndpoint) => {
4134
- await device.getEndpoint(1).write("manuSpecificLumi", { mode: 1 }, { manufacturerCode: manufacturerCode, disableResponse: true });
4446
+ await device
4447
+ .getEndpoint(1)
4448
+ .write("manuSpecificLumi", { mode: 1 }, { manufacturerCode: manufacturerCode, disableResponse: true });
4135
4449
  },
4136
- extend: [lumiZigbeeOTA(), lumiPreventReset()],
4450
+ extend: [lumi.modernExtend.addManuSpecificLumiCluster(), lumiZigbeeOTA(), lumiPreventReset()],
4137
4451
  },
4138
4452
  {
4139
4453
  zigbeeModel: ["lumi.switch.acn029"],
@@ -4160,7 +4474,7 @@ exports.definitions = [
4160
4474
  e.led_disabled_night(),
4161
4475
  e.flip_indicator_light(),
4162
4476
  ],
4163
- extend: [lumiZigbeeOTA(), lumiPreventReset()],
4477
+ extend: [lumi.modernExtend.addManuSpecificLumiCluster(), lumiZigbeeOTA(), lumiPreventReset()],
4164
4478
  },
4165
4479
  {
4166
4480
  zigbeeModel: ["lumi.switch.acn030"],
@@ -4203,9 +4517,11 @@ exports.definitions = [
4203
4517
  e.flip_indicator_light(),
4204
4518
  ],
4205
4519
  configure: async (device, coordinatorEndpoint) => {
4206
- await device.getEndpoint(1).write("manuSpecificLumi", { mode: 1 }, { manufacturerCode: manufacturerCode, disableResponse: true });
4520
+ await device
4521
+ .getEndpoint(1)
4522
+ .write("manuSpecificLumi", { mode: 1 }, { manufacturerCode: manufacturerCode, disableResponse: true });
4207
4523
  },
4208
- extend: [lumiZigbeeOTA(), lumiPreventReset()],
4524
+ extend: [lumi.modernExtend.addManuSpecificLumiCluster(), lumiZigbeeOTA(), lumiPreventReset()],
4209
4525
  },
4210
4526
  {
4211
4527
  zigbeeModel: ["lumi.switch.acn031"],
@@ -4259,9 +4575,11 @@ exports.definitions = [
4259
4575
  e.flip_indicator_light(),
4260
4576
  ],
4261
4577
  configure: async (device, coordinatorEndpoint) => {
4262
- await device.getEndpoint(1).write("manuSpecificLumi", { mode: 1 }, { manufacturerCode: manufacturerCode, disableResponse: true });
4578
+ await device
4579
+ .getEndpoint(1)
4580
+ .write("manuSpecificLumi", { mode: 1 }, { manufacturerCode: manufacturerCode, disableResponse: true });
4263
4581
  },
4264
- extend: [lumiZigbeeOTA(), lumiPreventReset()],
4582
+ extend: [lumi.modernExtend.addManuSpecificLumiCluster(), lumiZigbeeOTA(), lumiPreventReset()],
4265
4583
  },
4266
4584
  {
4267
4585
  zigbeeModel: ["lumi.plug.aeu001"],
@@ -4269,6 +4587,7 @@ exports.definitions = [
4269
4587
  vendor: "Aqara",
4270
4588
  description: "Smart wall outlet H2 EU",
4271
4589
  extend: [
4590
+ lumi.modernExtend.addManuSpecificLumiCluster(),
4272
4591
  lumiZigbeeOTA(),
4273
4592
  lumiOnOff({ powerOutageMemory: "enum" }),
4274
4593
  lumiPower(),
@@ -4325,6 +4644,7 @@ exports.definitions = [
4325
4644
  await endpoint.read("genLevelCtrl", [0x0013], {});
4326
4645
  },
4327
4646
  extend: [
4647
+ lumi.modernExtend.addManuSpecificLumiCluster(),
4328
4648
  m.deviceEndpoints({ endpoints: { white: 1, rgb: 2 } }),
4329
4649
  lumiLight({ colorTemp: true, endpointNames: ["white"] }),
4330
4650
  lumiLight({
@@ -4354,6 +4674,7 @@ exports.definitions = [
4354
4674
  vendor: "Aqara",
4355
4675
  description: "Smart rotary knob H1 (with neutral)",
4356
4676
  extend: [
4677
+ lumi.modernExtend.addManuSpecificLumiCluster(),
4357
4678
  lumiPreventReset(),
4358
4679
  m.deviceEndpoints({ endpoints: { left: 1, center: 2, right: 3 } }),
4359
4680
  lumiOnOff({ powerOutageMemory: "binary", endpointNames: ["left", "center", "right"] }),
@@ -4378,6 +4699,7 @@ exports.definitions = [
4378
4699
  vendor: "Aqara",
4379
4700
  description: "Light switch H2 EU (single rocker)",
4380
4701
  extend: [
4702
+ lumi.modernExtend.addManuSpecificLumiCluster(),
4381
4703
  lumiZigbeeOTA(),
4382
4704
  lumiPreventLeave(),
4383
4705
  m.deviceEndpoints({ endpoints: { up: 1, down: 4 } }),
@@ -4427,6 +4749,7 @@ exports.definitions = [
4427
4749
  await endpoint.read("genLevelCtrl", [0x0013], {});
4428
4750
  },
4429
4751
  extend: [
4752
+ lumi.modernExtend.addManuSpecificLumiCluster(),
4430
4753
  lumiLight({ colorTemp: true, color: true, colorTempRange: [111, 500] }),
4431
4754
  lumiPowerOnBehavior({ lookup: { off: 0, on: 1, reverse: 2, restore: 3 } }),
4432
4755
  m.identify(),
@@ -4472,6 +4795,7 @@ exports.definitions = [
4472
4795
  await endpoint.read("genLevelCtrl", [0x0013], {});
4473
4796
  },
4474
4797
  extend: [
4798
+ lumi.modernExtend.addManuSpecificLumiCluster(),
4475
4799
  lumiLight({ colorTemp: true, colorTempRange: [153, 370] }),
4476
4800
  lumiPowerOnBehavior({ lookup: { off: 0, on: 1, reverse: 2, restore: 3 } }),
4477
4801
  m.identify(),
@@ -4492,6 +4816,7 @@ exports.definitions = [
4492
4816
  vendor: "Aqara",
4493
4817
  description: "Light switch H2 EU (double rocker)",
4494
4818
  extend: [
4819
+ lumi.modernExtend.addManuSpecificLumiCluster(),
4495
4820
  lumiZigbeeOTA(),
4496
4821
  lumiPreventLeave(),
4497
4822
  m.deviceEndpoints({ endpoints: { left: 1, right: 2, left_down: 4, right_down: 5 } }),
@@ -4512,6 +4837,36 @@ exports.definitions = [
4512
4837
  lumiMultiClick({ description: "Multi-click mode for right down button", endpointName: "right_down" }),
4513
4838
  ],
4514
4839
  },
4840
+ {
4841
+ zigbeeModel: ["lumi.switch.aeu003"],
4842
+ model: "DS-K02D/DS-K02E",
4843
+ vendor: "Aqara",
4844
+ description: "Aqara Shutter Switch H2 EU",
4845
+ meta: {
4846
+ overrideHaDiscoveryPayload: (payload) => {
4847
+ if (payload.position_topic && payload.set_position_topic) {
4848
+ payload.device_class = "shutter";
4849
+ }
4850
+ },
4851
+ },
4852
+ configure: configureAqaraH2EuShutterSwitch,
4853
+ extend: [
4854
+ lumi.modernExtend.addManuSpecificLumiCluster(),
4855
+ lumiZigbeeOTA(),
4856
+ m.deviceEndpoints({
4857
+ endpoints: aqaraH2EuShutterSwitchEndpoints,
4858
+ multiEndpointSkip: aqaraH2EuShutterSwitchMultiEndpointSkip,
4859
+ }),
4860
+ m.electricityMeter({ cluster: "metering", power: false, energy: { divisor: 1000 } }),
4861
+ m.windowCovering({ controls: ["lift"], coverInverted: true, configureReporting: true }),
4862
+ lumiAction({
4863
+ actionLookup: aqaraH2EuShutterSwitchActionLookup,
4864
+ endpointNames: aqaraH2EuShutterSwitchEndpointNames,
4865
+ }),
4866
+ lumiMultiClick({ description: "Multi-click mode for top wireless button", endpointName: "top_wireless_button" }),
4867
+ lumiMultiClick({ description: "Multi-click mode for bottom wireless button", endpointName: "bottom_wireless_button" }),
4868
+ ],
4869
+ },
4515
4870
  {
4516
4871
  zigbeeModel: ["lumi.switch.agl011"],
4517
4872
  model: "KD-R01D",
@@ -4519,6 +4874,7 @@ exports.definitions = [
4519
4874
  description: "Dimmer switch H2 EU",
4520
4875
  exposes: [e.device_temperature()],
4521
4876
  extend: [
4877
+ lumi.modernExtend.addManuSpecificLumiCluster(),
4522
4878
  lumiZigbeeOTA(),
4523
4879
  lumiPreventLeave(),
4524
4880
  m.bindCluster({ cluster: "genOnOff", clusterType: "input" }),
@@ -4571,6 +4927,105 @@ exports.definitions = [
4571
4927
  }),
4572
4928
  ],
4573
4929
  },
4930
+ {
4931
+ zigbeeModel: ["lumi.switch.agl007"],
4932
+ model: "WS-K05E",
4933
+ vendor: "Aqara",
4934
+ description: "Dimmer Switch H2 US",
4935
+ extend: [
4936
+ lumi.modernExtend.addManuSpecificLumiCluster(),
4937
+ lumiLight({
4938
+ effect: false,
4939
+ powerOnBehavior: false,
4940
+ powerOutageCount: true,
4941
+ deviceTemperature: true,
4942
+ configureReporting: true,
4943
+ levelConfig: {
4944
+ features: ["execute_if_off", "on_transition_time", "off_transition_time", "on_level"],
4945
+ },
4946
+ }),
4947
+ m.deviceEndpoints({
4948
+ endpoints: { power: 1, bright: 2, dim: 3, 21: 21, 71: 71, 72: 72 },
4949
+ }),
4950
+ lumiZigbeeOTA(),
4951
+ lumiPreventLeave(),
4952
+ lumiPreventReset(),
4953
+ m.bindCluster({ cluster: "genOnOff", clusterType: "input" }),
4954
+ m.bindCluster({ cluster: "genLevelCtrl", clusterType: "input" }),
4955
+ m.bindCluster({ cluster: "manuSpecificLumi", clusterType: "input" }),
4956
+ lumiPower(),
4957
+ lumiElectricityMeter(),
4958
+ lumiLedIndicator(),
4959
+ lumiFlipIndicatorLight(),
4960
+ lumiSwitchMode(),
4961
+ lumiSetEventMode(),
4962
+ lumiOperationMode({
4963
+ description: "Decoupled mode for the load relay (decoupling power disables bright/dim buttons)",
4964
+ endpointName: "power",
4965
+ }),
4966
+ lumiOperationMode({
4967
+ description: "Decoupled mode for the brightness up button (disabled when power is decoupled)",
4968
+ endpointName: "bright",
4969
+ }),
4970
+ lumiOperationMode({
4971
+ description: "Decoupled mode for the brightness down button (disabled when power is decoupled)",
4972
+ endpointName: "dim",
4973
+ }),
4974
+ lumiPowerOnBehavior(),
4975
+ lumiAction({
4976
+ actionLookup: { hold: 0, single: 1, double: 2, release: 255 },
4977
+ endpointNames: ["power", "bright", "dim"],
4978
+ }),
4979
+ lumiMultiClick({
4980
+ description: "Multi-click mode for power button",
4981
+ endpointName: "power",
4982
+ }),
4983
+ lumiMultiClick({
4984
+ description: "Multi-click mode for brightness up button",
4985
+ endpointName: "bright",
4986
+ }),
4987
+ lumiMultiClick({
4988
+ description: "Multi-click mode for brightness down button",
4989
+ endpointName: "dim",
4990
+ }),
4991
+ m.enumLookup({
4992
+ name: "phase",
4993
+ lookup: { forward: 0, reverse: 1 },
4994
+ cluster: "manuSpecificLumi",
4995
+ attribute: { ID: 0x030a, type: 0x20 },
4996
+ description: "Dimming phase",
4997
+ zigbeeCommandOptions: { manufacturerCode },
4998
+ }),
4999
+ m.numeric({
5000
+ name: "min_brightness",
5001
+ valueMin: 0,
5002
+ valueMax: 99,
5003
+ unit: "%",
5004
+ access: "STATE_SET",
5005
+ cluster: "manuSpecificLumi",
5006
+ attribute: { ID: 0x0515, type: 0x20 },
5007
+ description: "Minimum brightness level",
5008
+ entityCategory: "config",
5009
+ zigbeeCommandOptions: { manufacturerCode },
5010
+ }),
5011
+ m.numeric({
5012
+ name: "max_brightness",
5013
+ valueMin: 1,
5014
+ valueMax: 100,
5015
+ unit: "%",
5016
+ access: "STATE_SET",
5017
+ cluster: "manuSpecificLumi",
5018
+ attribute: { ID: 0x0516, type: 0x20 },
5019
+ description: "Maximum brightness level",
5020
+ entityCategory: "config",
5021
+ zigbeeCommandOptions: { manufacturerCode },
5022
+ }),
5023
+ ],
5024
+ meta: {
5025
+ multiEndpoint: true,
5026
+ multiEndpointSkip: ["state", "brightness", "level_config"],
5027
+ },
5028
+ },
4574
5029
  {
4575
5030
  zigbeeModel: ["lumi.switch.agl006"],
4576
5031
  model: "WS-K04E",
@@ -4578,6 +5033,7 @@ exports.definitions = [
4578
5033
  description: "Light Switch H2 US (quadruple rocker)",
4579
5034
  fromZigbee: [fz.on_off, lumi.fromZigbee.lumi_action_multistate, lumi.fromZigbee.lumi_specific],
4580
5035
  extend: [
5036
+ lumi.modernExtend.addManuSpecificLumiCluster(),
4581
5037
  lumiZigbeeOTA(),
4582
5038
  lumiPreventReset(),
4583
5039
  m.deviceEndpoints({ endpoints: { top: 1, center: 2, bottom: 3, wireless: 4 } }),
@@ -4607,6 +5063,7 @@ exports.definitions = [
4607
5063
  description: "Light Switch H2 US (double rocker)",
4608
5064
  fromZigbee: [fz.on_off, lumi.fromZigbee.lumi_action_multistate, lumi.fromZigbee.lumi_specific],
4609
5065
  extend: [
5066
+ lumi.modernExtend.addManuSpecificLumiCluster(),
4610
5067
  lumiZigbeeOTA(),
4611
5068
  lumiPreventReset(),
4612
5069
  m.deviceEndpoints({ endpoints: { top: 1, wireless: 4 } }),
@@ -4700,6 +5157,7 @@ exports.definitions = [
4700
5157
  logger_1.logger.info("Aqara W100: configure completed", NS);
4701
5158
  },
4702
5159
  extend: [
5160
+ lumi.modernExtend.addManuSpecificLumiCluster(),
4703
5161
  lumiZigbeeOTA(),
4704
5162
  m.temperature(),
4705
5163
  m.humidity(),
@@ -4875,6 +5333,7 @@ exports.definitions = [
4875
5333
  description: "Light Switch H2 US (2 Buttons, 2 Channels)",
4876
5334
  fromZigbee: [fz.on_off, lumi.fromZigbee.lumi_action_multistate, lumi.fromZigbee.lumi_specific],
4877
5335
  extend: [
5336
+ lumi.modernExtend.addManuSpecificLumiCluster(),
4878
5337
  lumiZigbeeOTA(),
4879
5338
  lumiPreventReset(),
4880
5339
  m.deviceEndpoints({ endpoints: { up: 1, down: 2 } }),
@@ -4908,26 +5367,52 @@ exports.definitions = [
4908
5367
  model: "WT-A03E",
4909
5368
  vendor: "Aqara",
4910
5369
  description: "Radiator thermostat W600",
5370
+ meta: {
5371
+ overrideHaDiscoveryPayload: (payload) => {
5372
+ if (payload.mode_command_topic?.endsWith("/system_mode")) {
5373
+ payload.mode_state_template =
5374
+ "{% if value_json is defined and value_json.system_mode is defined and value_json.system_mode in ['off', 'heat', 'auto'] %}" +
5375
+ "{{ value_json.system_mode }}" +
5376
+ "{% else %}off{% endif %}";
5377
+ payload.preset_mode_value_template =
5378
+ "{% if value_json is defined and value_json.preset is defined and value_json.preset in ['home', 'away', 'sleep', 'vacation', 'wind_down'] %}" +
5379
+ "{{ value_json.preset }}" +
5380
+ "{% else %}none{% endif %}";
5381
+ payload.temperature_state_template =
5382
+ "{% if value_json is defined and value_json.occupied_heating_setpoint is defined and value_json.occupied_heating_setpoint is not none %}" +
5383
+ "{{ value_json.occupied_heating_setpoint }}" +
5384
+ "{% else %}None{% endif %}";
5385
+ payload.current_temperature_template =
5386
+ "{% if value_json is defined and value_json.local_temperature is defined and value_json.local_temperature is not none %}" +
5387
+ "{{ value_json.local_temperature }}" +
5388
+ "{% else %}None{% endif %}";
5389
+ }
5390
+ if (typeof payload.value_template === "string" && payload.value_template.includes("value_json.override_active")) {
5391
+ payload.icon = "mdi:cursor-pointer";
5392
+ }
5393
+ if (typeof payload.value_template === "string" && payload.value_template.includes("value_json.schedule_upload_status")) {
5394
+ payload.icon = "mdi:upload-multiple";
5395
+ }
5396
+ if (typeof payload.value_template === "string" && payload.value_template.includes("value_json.calibrated")) {
5397
+ payload.icon = "mdi:tune";
5398
+ }
5399
+ },
5400
+ },
4911
5401
  extend: [
4912
- m.thermostat({
4913
- setpoints: {
4914
- values: { occupiedHeatingSetpoint: { min: 5, max: 30, step: 0.5 } },
4915
- },
4916
- localTemperatureCalibration: { values: { min: -5, max: 5, step: 0.1 } },
4917
- temperatureSetpointHold: true,
4918
- temperatureSetpointHoldDuration: true,
4919
- setpointsLimit: {
4920
- maxHeatSetpointLimit: { min: 5, max: 30, step: 0.5 },
4921
- minHeatSetpointLimit: { min: 5, max: 30, step: 0.5 },
4922
- },
4923
- }),
5402
+ lumi.modernExtend.addManuSpecificLumiCluster(),
5403
+ m.customTimeResponse("2000_LOCAL"),
5404
+ w600Heartbeat(),
5405
+ w600Thermostat(),
5406
+ w600ExternalTempSensor(),
4924
5407
  m.enumLookup({
4925
5408
  name: "calibrate",
4926
5409
  lookup: { start: 1 },
4927
5410
  cluster: "manuSpecificLumi",
4928
5411
  attribute: { ID: 0x0270, type: zigbee_herdsman_1.Zcl.DataType.UINT8 },
4929
- description: "Calibrates the valve",
4930
- access: "ALL",
5412
+ description: "Start valve calibration",
5413
+ access: "SET",
5414
+ label: "Calibrate",
5415
+ entityCategory: "config",
4931
5416
  zigbeeCommandOptions: { manufacturerCode },
4932
5417
  }),
4933
5418
  m.enumLookup({
@@ -4935,28 +5420,21 @@ exports.definitions = [
4935
5420
  lookup: { not_ready: 0, ready: 1, error: 2, in_progress: 3 },
4936
5421
  cluster: "manuSpecificLumi",
4937
5422
  attribute: { ID: 0x027b, type: zigbee_herdsman_1.Zcl.DataType.UINT8 },
4938
- description: "State of calibrate",
5423
+ description: "Valve calibration state",
4939
5424
  access: "STATE_GET",
5425
+ label: "Calibration status",
4940
5426
  zigbeeCommandOptions: { manufacturerCode },
4941
5427
  }),
4942
5428
  m.binary({
4943
- name: "state",
4944
- valueOn: ["ON", 1],
4945
- valueOff: ["OFF", 0],
4946
- cluster: "manuSpecificLumi",
4947
- attribute: { ID: 0x0271, type: 0x20 },
4948
- description: "Enabling termostat",
4949
- access: "ALL",
4950
- zigbeeCommandOptions: { manufacturerCode },
4951
- }),
4952
- m.binary({
4953
- name: "valve_detection",
5429
+ name: "temperature_control_abnormal_notification",
4954
5430
  valueOn: ["ON", 1],
4955
5431
  valueOff: ["OFF", 0],
4956
5432
  cluster: "manuSpecificLumi",
4957
5433
  attribute: { ID: 0x0274, type: 0x20 },
4958
- description: "Determines if temperature control abnormalities should be detected",
5434
+ description: "Enable or disable reporting of abnormal temperature control status. When enabled, the valve alarm is set to true if an abnormality is detected",
4959
5435
  access: "ALL",
5436
+ label: "Temperature control abnormal notification",
5437
+ entityCategory: "config",
4960
5438
  zigbeeCommandOptions: { manufacturerCode },
4961
5439
  }),
4962
5440
  m.binary({
@@ -4965,28 +5443,23 @@ exports.definitions = [
4965
5443
  valueOff: ["OFF", 0],
4966
5444
  cluster: "manuSpecificLumi",
4967
5445
  attribute: { ID: 0x0330, type: 0x20 },
4968
- description: "Display flip",
4969
- access: "ALL",
4970
- zigbeeCommandOptions: { manufacturerCode },
4971
- }),
4972
- m.binary({
4973
- name: "helper",
4974
- valueOn: ["ON", 1],
4975
- valueOff: ["OFF", 0],
4976
- cluster: "manuSpecificLumi",
4977
- attribute: { ID: 0x027d, type: 0x20 },
4978
- description: "Schedule helper",
5446
+ description: "Flip the display orientation",
4979
5447
  access: "ALL",
5448
+ label: "Display flip",
5449
+ entityCategory: "config",
4980
5450
  zigbeeCommandOptions: { manufacturerCode },
4981
5451
  }),
5452
+ w600Schedule(),
4982
5453
  m.binary({
4983
5454
  name: "window_detection",
4984
5455
  valueOn: ["ON", 1],
4985
5456
  valueOff: ["OFF", 0],
4986
5457
  cluster: "manuSpecificLumi",
4987
5458
  attribute: { ID: 0x0273, type: 0x20 },
4988
- description: "Enables/disables window detection on the device",
5459
+ description: "Enable or disable open window detection. When enabled, the window_open is set to true if an open window is detected",
4989
5460
  access: "ALL",
5461
+ label: "Open window detection",
5462
+ entityCategory: "config",
4990
5463
  zigbeeCommandOptions: { manufacturerCode },
4991
5464
  }),
4992
5465
  m.binary({
@@ -4995,35 +5468,28 @@ exports.definitions = [
4995
5468
  valueOff: ["UNLOCK", 0],
4996
5469
  cluster: "manuSpecificLumi",
4997
5470
  attribute: { ID: 0x0277, type: 0x20 },
4998
- description: "Enables/disables physical input on the device",
5471
+ description: "Lock or unlock the physical controls on the device",
4999
5472
  access: "ALL",
5473
+ label: "Child lock",
5474
+ entityCategory: "config",
5000
5475
  zigbeeCommandOptions: { manufacturerCode },
5001
5476
  }),
5002
5477
  m.numeric({
5003
- name: "away_preset_temperature",
5004
- valueMin: 0,
5005
- valueMax: 30,
5478
+ name: "anti_freeze_temperature",
5479
+ valueMin: 5,
5480
+ valueMax: 15,
5006
5481
  valueStep: 0.5,
5007
5482
  scale: 100,
5008
5483
  unit: "°C",
5009
5484
  cluster: "manuSpecificLumi",
5010
5485
  attribute: { ID: 0x0279, type: zigbee_herdsman_1.Zcl.DataType.UINT32 },
5011
- description: "Away preset temperature",
5012
- zigbeeCommandOptions: { manufacturerCode },
5013
- }),
5014
- m.numeric({
5015
- name: "position",
5016
- valueMin: 0,
5017
- valueMax: 100,
5018
- scale: 1,
5019
- precision: 2,
5020
- unit: "%",
5021
- access: "STATE_GET",
5022
- cluster: "manuSpecificLumi",
5023
- attribute: { ID: 0x0360, type: zigbee_herdsman_1.Zcl.DataType.SINGLE_PREC },
5024
- description: "Position of the valve, 100% is fully open",
5486
+ description: "Minimum temperature limit for frost protection. Turns the thermostat on regardless of setpoint if the temperature drops below this.",
5487
+ entityCategory: "config",
5025
5488
  zigbeeCommandOptions: { manufacturerCode },
5026
5489
  }),
5490
+ w600PresetTemperatureTable(),
5491
+ w600WeeklySchedule(),
5492
+ w600ValvePosition(),
5027
5493
  m.identify(),
5028
5494
  lumiZigbeeOTA(),
5029
5495
  ],
@@ -5034,6 +5500,7 @@ exports.definitions = [
5034
5500
  vendor: "Aqara",
5035
5501
  description: "Floor heating thermostat W500",
5036
5502
  extend: [
5503
+ lumi.modernExtend.addManuSpecificLumiCluster(),
5037
5504
  m.electricityMeter({ current: false, voltage: false, power: { divisor: 1 }, energy: { divisor: 1000 } }),
5038
5505
  m.thermostat({
5039
5506
  setpoints: { values: { occupiedHeatingSetpoint: { min: 5, max: 40, step: 0.5 } }, configure: { skip: true } },
@@ -5140,11 +5607,12 @@ exports.definitions = [
5140
5607
  await endpoint.read("manuSpecificLumi", [0x019a], { manufacturerCode: manufacturerCode }); // Read detection range
5141
5608
  },
5142
5609
  extend: [
5610
+ lumi.modernExtend.addManuSpecificLumiCluster(),
5143
5611
  lumi.lumiModernExtend.lumiPreventLeave(),
5144
5612
  lumi.lumiModernExtend.lumiBattery({
5145
5613
  voltageToPercentage: { min: 2850, max: 3000 },
5146
5614
  voltageAttribute: 0x0017, // Attribute: 23
5147
- //percentageAtrribute: 0x0018 // Attribute: 24 // TODO: Should confirm to be sure
5615
+ //percentageAttribute: 0x0018 // Attribute: 24 // TODO: Should confirm to be sure
5148
5616
  }),
5149
5617
  lumi.lumiModernExtend.fp1ePresence(),
5150
5618
  lumi.lumiModernExtend.fp300PIRDetection(),
@@ -5258,7 +5726,7 @@ exports.definitions = [
5258
5726
  m.numeric({
5259
5727
  name: "humidity_reporting_threshold",
5260
5728
  valueMin: 2, // Min: 2%
5261
- valueMax: 10, // Max: 10%
5729
+ valueMax: 15, // Max: 15%
5262
5730
  valueStep: 0.5, // Step: 0,5%
5263
5731
  scale: 100,
5264
5732
  unit: "%",
@@ -5341,5 +5809,259 @@ exports.definitions = [
5341
5809
  lumi.lumiModernExtend.lumiZigbeeOTA(),
5342
5810
  ],
5343
5811
  },
5812
+ {
5813
+ zigbeeModel: ["aqara.toilet.acn002", "lumi.sen_gas.hrcn01"], // The reason for adding lumi.sen_gas.hrcn01 is that the model number reported by a toilet is exactly this
5814
+ model: "ACN002",
5815
+ vendor: "Aqara",
5816
+ description: "Smart Toilet T1",
5817
+ fromZigbee: [lumi.fromZigbee.lumi_toilet],
5818
+ toZigbee: [lumi.toZigbee.lumi_toilet],
5819
+ exposes: [
5820
+ e.binary("lid_switch", ea.STATE_SET, "OPEN", "CLOSE").withDescription("Lid status"),
5821
+ e.binary("seat_switch", ea.STATE_SET, "OPEN", "CLOSE").withDescription("Seat status"),
5822
+ e.binary("night_light", ea.STATE_SET, "ON", "OFF").withDescription("Night light"),
5823
+ e
5824
+ .enum("seat_temp", ea.STATE_SET, ["Off", "Temp_31C", "Temp_33C", "Temp_35C", "Temp_37C", "Temp_39C"])
5825
+ .withDescription("Seat heating temperature"),
5826
+ e
5827
+ .enum("cleaning_mode", ea.STATE_SET, ["Stop", "Rear", "Rear_Moving", "Female", "Female_Moving", "Child"])
5828
+ .withDescription("Cleaning mode"),
5829
+ e
5830
+ .enum("water_temp", ea.STATE_SET, ["Off", "Temp_31C", "Temp_33C", "Temp_35C", "Temp_37C", "Temp_39C"])
5831
+ .withDescription("Cleaning water temperature"),
5832
+ e
5833
+ .enum("water_pressure", ea.STATE_SET, ["Weak", "Slightly_Weak", "Middle", "Slightly_Strong", "Strong"])
5834
+ .withDescription("Water pressure"),
5835
+ e
5836
+ .enum("nozzle_position", ea.STATE_SET, ["Back", "Slightly_Back", "Middle", "Slightly_Front", "Front"])
5837
+ .withDescription("Nozzle position"),
5838
+ e
5839
+ .enum("dryer_temp", ea.STATE_SET, ["Off", "Normal", "Low", "Mid_Low", "Middle", "Mid_High", "High"])
5840
+ .withDescription("Dryer wind temperature"),
5841
+ e.enum("nozzle_clean", ea.STATE_SET, ["Off", "Auto", "Manual"]).withDescription("Nozzle self-cleaning"),
5842
+ e.binary("occupancy_status", ea.STATE, true, false).withDescription("Occupancy status"),
5843
+ e.enum("stop_button", ea.SET, ["STOP"]).withDescription("Stop operation"),
5844
+ e.enum("flush_big", ea.SET, ["FLUSH"]).withDescription("Full flush"),
5845
+ e.enum("flush_small", ea.SET, ["FLUSH"]).withDescription("Small flush"),
5846
+ e.enum("foam_shield", ea.SET, ["RELEASE"]).withDescription("Release splash-proof foam"),
5847
+ e.binary("pre_mist_switch", ea.STATE_SET, "ON", "OFF").withDescription("Pre-mist when sitting").withCategory("config"),
5848
+ e.binary("auto_foam_on_sit", ea.STATE_SET, "ON", "OFF").withDescription("Automatic foam when sitting").withCategory("config"),
5849
+ e.binary("auto_foam_on_leave", ea.STATE_SET, "ON", "OFF").withDescription("Automatic foam when leaving").withCategory("config"),
5850
+ e.binary("child_seat_mode", ea.STATE_SET, "ON", "OFF").withDescription("Child seat mode").withCategory("config"),
5851
+ e.binary("foot_sensor_switch", ea.STATE_SET, "ON", "OFF").withDescription("Foot sensor").withCategory("config"),
5852
+ e.binary("auto_flush_after_leave", ea.STATE_SET, "ON", "OFF").withDescription("Auto flush after leaving").withCategory("config"),
5853
+ e.binary("beeper_switch", ea.STATE_SET, "ON", "OFF").withDescription("Beeper sound").withCategory("config"),
5854
+ ],
5855
+ extend: [lumi.modernExtend.addManuSpecificLumiCluster(), lumiZigbeeOTA(), m.forcePowerSource({ powerSource: "Mains (single phase)" })],
5856
+ configure: async (device, coordinatorEndpoint) => {
5857
+ const endpoint = device.getEndpoint(1);
5858
+ await endpoint.read("manuSpecificLumi", [0xfff1], { manufacturerCode: manufacturerCode });
5859
+ },
5860
+ },
5861
+ {
5862
+ zigbeeModel: ["lumi.sensor_occupy.acn1"],
5863
+ model: "FP310",
5864
+ vendor: "Aqara",
5865
+ description: "Presence sensor FP310",
5866
+ fromZigbee: [lumi.fromZigbee.lumi_specific],
5867
+ configure: async (device, coordinatorEndpoint) => {
5868
+ const endpoint = device.getEndpoint(1);
5869
+ await endpoint.read("manuSpecificLumi", [0x00ee], { manufacturerCode: manufacturerCode }); // Read OTA data; makes the device expose more attributes related to OTA
5870
+ await endpoint.read("manuSpecificLumi", [0x010c], { manufacturerCode: manufacturerCode }); // Read motion sensitivity
5871
+ await endpoint.read("manuSpecificLumi", [0x0142], { manufacturerCode: manufacturerCode }); // Read current presence
5872
+ await endpoint.read("manuSpecificLumi", [0x0197], { manufacturerCode: manufacturerCode }); // Read current absence delay timer value
5873
+ await endpoint.read("manuSpecificLumi", [0x019a], { manufacturerCode: manufacturerCode }); // Read detection range
5874
+ },
5875
+ extend: [
5876
+ lumi.modernExtend.addManuSpecificLumiCluster(),
5877
+ lumi.lumiModernExtend.lumiPreventLeave(),
5878
+ lumi.lumiModernExtend.lumiBattery({
5879
+ voltageToPercentage: { min: 2850, max: 3000 },
5880
+ voltageAttribute: 0x0017, // Attribute: 23
5881
+ //percentageAttribute: 0x0018 // Attribute: 24 // TODO: Should confirm to be sure
5882
+ }),
5883
+ lumi.lumiModernExtend.fp1ePresence(),
5884
+ m.illuminance(),
5885
+ m.humidity(),
5886
+ m.temperature(),
5887
+ m.enumLookup({
5888
+ name: "presence_sensitivity",
5889
+ lookup: { low: 1, medium: 2, high: 3 },
5890
+ cluster: "manuSpecificLumi",
5891
+ attribute: { ID: 0x010c, type: zigbee_herdsman_1.Zcl.DataType.UINT8 },
5892
+ description: "Presence Detection Sensitivity",
5893
+ zigbeeCommandOptions: { manufacturerCode },
5894
+ }),
5895
+ m.numeric({
5896
+ name: "absence_delay_timer",
5897
+ valueMin: 10,
5898
+ valueMax: 300,
5899
+ valueStep: 5,
5900
+ scale: 1,
5901
+ unit: "sec",
5902
+ cluster: "manuSpecificLumi",
5903
+ attribute: { ID: 0x0197, type: zigbee_herdsman_1.Zcl.DataType.UINT32 }, // Attribute: 407
5904
+ description: "Value for delay before the device reports absence when no presence is detected",
5905
+ zigbeeCommandOptions: { manufacturerCode },
5906
+ }),
5907
+ lumi.lumiModernExtend.fp1eSpatialLearning(),
5908
+ lumi.lumiModernExtend.fp1eRestartDevice(),
5909
+ // AI
5910
+ lumi.lumiModernExtend.fp1eAIInterference(),
5911
+ lumi.lumiModernExtend.fp1eAdaptiveSensitivity(),
5912
+ // Sampling parameters
5913
+ m.enumLookup({
5914
+ name: "temp_and_humidity_sampling",
5915
+ lookup: { off: 0, low: 1, medium: 2, high: 3, custom: 4 },
5916
+ cluster: "manuSpecificLumi",
5917
+ attribute: { ID: 0x0170, type: zigbee_herdsman_1.Zcl.DataType.UINT8 }, // Attribute: 368
5918
+ description: "Sampling time frequency, increasing affects battery life. Setting to custom allows specifying period, interval & threshold.",
5919
+ zigbeeCommandOptions: { manufacturerCode },
5920
+ }),
5921
+ m.numeric({
5922
+ name: "temp_and_humidity_sampling_period",
5923
+ valueMin: 0.5, // Min: 500ms
5924
+ valueMax: 3600, // Max: 1h = 3600s
5925
+ valueStep: 0.5, // Step: 500ms
5926
+ scale: 1000,
5927
+ unit: "sec",
5928
+ cluster: "manuSpecificLumi",
5929
+ attribute: { ID: 0x0162, type: zigbee_herdsman_1.Zcl.DataType.UINT32 }, // Attribute: 354
5930
+ description: "How often temp & humidity readings are taken on the device when in custom mode.",
5931
+ zigbeeCommandOptions: { manufacturerCode },
5932
+ }),
5933
+ // Temperature
5934
+ m.numeric({
5935
+ name: "temp_reporting_interval",
5936
+ valueMin: 600, // Min: 10min = 600s
5937
+ valueMax: 3600, // Max: 1h = 3600s
5938
+ valueStep: 600, // Step: 10min = 600s
5939
+ scale: 1000,
5940
+ unit: "sec",
5941
+ cluster: "manuSpecificLumi",
5942
+ attribute: { ID: 0x0163, type: zigbee_herdsman_1.Zcl.DataType.UINT32 }, // Attribute: 355
5943
+ description: "Custom time interval for temperature data reporting.",
5944
+ zigbeeCommandOptions: { manufacturerCode },
5945
+ }),
5946
+ m.numeric({
5947
+ name: "temp_reporting_threshold",
5948
+ valueMin: 0.2, // Min: 0,2 C
5949
+ valueMax: 3, // Max: 3,0 C
5950
+ valueStep: 0.1, // Step: 0,1 C
5951
+ scale: 100,
5952
+ unit: "°C",
5953
+ cluster: "manuSpecificLumi",
5954
+ attribute: { ID: 0x0164, type: zigbee_herdsman_1.Zcl.DataType.UINT16 }, // Attribute: 356
5955
+ description: "Reporting will trigger as temperature change reaches this value when in custom mode.",
5956
+ zigbeeCommandOptions: { manufacturerCode },
5957
+ }),
5958
+ m.enumLookup({
5959
+ name: "temp_reporting_mode",
5960
+ lookup: { threshold: 1, "reporting interval": 2, "threshold and interval": 3 },
5961
+ cluster: "manuSpecificLumi",
5962
+ attribute: { ID: 0x0165, type: zigbee_herdsman_1.Zcl.DataType.UINT8 }, // Attribute: 357
5963
+ description: "Temperature reporting type when in custom mode.",
5964
+ zigbeeCommandOptions: { manufacturerCode },
5965
+ }),
5966
+ // Humidity
5967
+ m.numeric({
5968
+ name: "humidity_reporting_interval",
5969
+ valueMin: 600, // Min: 10min = 600s
5970
+ valueMax: 3600, // Max: 1h = 3600s
5971
+ valueStep: 600, // Step: 10min = 600s
5972
+ scale: 1000,
5973
+ unit: "sec",
5974
+ cluster: "manuSpecificLumi",
5975
+ attribute: { ID: 0x016a, type: zigbee_herdsman_1.Zcl.DataType.UINT32 }, // Attribute: 362
5976
+ description: "Custom time interval for humidity data reporting.",
5977
+ zigbeeCommandOptions: { manufacturerCode },
5978
+ }),
5979
+ m.numeric({
5980
+ name: "humidity_reporting_threshold",
5981
+ valueMin: 2, // Min: 2%
5982
+ valueMax: 15, // Max: 15%
5983
+ valueStep: 0.5, // Step: 0,5%
5984
+ scale: 100,
5985
+ unit: "%",
5986
+ cluster: "manuSpecificLumi",
5987
+ attribute: { ID: 0x016b, type: zigbee_herdsman_1.Zcl.DataType.UINT16 }, // Attribute: 363
5988
+ description: "Reporting will trigger as humidity change reaches this value when in custom mode.",
5989
+ zigbeeCommandOptions: { manufacturerCode },
5990
+ }),
5991
+ m.enumLookup({
5992
+ name: "humidity_report_mode",
5993
+ lookup: { threshold: 1, "reporting interval": 2, "threshold and interval": 3 },
5994
+ cluster: "manuSpecificLumi",
5995
+ attribute: { ID: 0x016c, type: zigbee_herdsman_1.Zcl.DataType.UINT8 }, // Attribute: 364
5996
+ description: "Humidity reporting type when in custom mode.",
5997
+ zigbeeCommandOptions: { manufacturerCode },
5998
+ }),
5999
+ // Illuminance
6000
+ m.enumLookup({
6001
+ name: "light_sampling",
6002
+ lookup: { off: 0, low: 1, medium: 2, high: 3, custom: 4 },
6003
+ cluster: "manuSpecificLumi",
6004
+ attribute: { ID: 0x0192, type: zigbee_herdsman_1.Zcl.DataType.UINT8 }, // Attribute: 402
6005
+ description: "Sampling time frequency, increasing affects battery life. Setting to custom allows specifying period, interval & threshold.",
6006
+ zigbeeCommandOptions: { manufacturerCode },
6007
+ }),
6008
+ m.numeric({
6009
+ name: "light_sampling_period",
6010
+ valueMin: 0.5, // Min: 500ms
6011
+ valueMax: 3600, // Max: 1h = 3600s
6012
+ valueStep: 0.5, // Step: 500ms
6013
+ scale: 1000,
6014
+ unit: "sec",
6015
+ cluster: "manuSpecificLumi",
6016
+ attribute: { ID: 0x0193, type: zigbee_herdsman_1.Zcl.DataType.UINT32 }, // Attribute: 403
6017
+ description: "How often illumination readings are taken on the device when in custom mode.",
6018
+ zigbeeCommandOptions: { manufacturerCode },
6019
+ }),
6020
+ m.numeric({
6021
+ name: "light_reporting_interval",
6022
+ valueMin: 20, // Min: 20s
6023
+ valueMax: 3600, // Max: 1h = 3600s
6024
+ valueStep: 20, // Step: 20s
6025
+ scale: 1000,
6026
+ unit: "sec",
6027
+ cluster: "manuSpecificLumi",
6028
+ attribute: { ID: 0x0194, type: zigbee_herdsman_1.Zcl.DataType.UINT32 }, // attribute 404
6029
+ description: "Custom interval for illumination data reporting.",
6030
+ zigbeeCommandOptions: { manufacturerCode },
6031
+ }),
6032
+ m.numeric({
6033
+ name: "light_reporting_threshold",
6034
+ valueMin: 3, // Min: 3%
6035
+ valueMax: 20, /// Max: 20%
6036
+ valueStep: 0.5, // Step: 0,5%
6037
+ scale: 100,
6038
+ unit: "%",
6039
+ cluster: "manuSpecificLumi",
6040
+ attribute: { ID: 0x0195, type: zigbee_herdsman_1.Zcl.DataType.UINT16 }, // Attribute: 405
6041
+ description: "Reporting will trigger as illumination percentage change reaches this value when in custom mode.",
6042
+ zigbeeCommandOptions: { manufacturerCode },
6043
+ }),
6044
+ m.enumLookup({
6045
+ name: "light_report_mode",
6046
+ lookup: { threshold: 1, "reporting interval": 2, "threshold and interval": 3 },
6047
+ cluster: "manuSpecificLumi",
6048
+ attribute: { ID: 0x0196, type: zigbee_herdsman_1.Zcl.DataType.UINT8 }, // Attribute: 406
6049
+ description: "illumination reporting type when in custom mode.",
6050
+ zigbeeCommandOptions: { manufacturerCode },
6051
+ }),
6052
+ // Read current target distance
6053
+ lumi.lumiModernExtend.fp300TrackDistance(),
6054
+ lumi.lumiModernExtend.fp1eTargetDistance(), // Same attribute. Need to send 0x0198 to start tracking
6055
+ // Set detection range
6056
+ fp310DetectionRange(),
6057
+ // LED Indicator
6058
+ lumi.lumiModernExtend.lumiLedDisabledNight(),
6059
+ lumi.lumiModernExtend.lumiLedDisabledNightTime(),
6060
+ m.identify(),
6061
+ // OTA
6062
+ m.quirkCheckinInterval("1_HOUR"),
6063
+ lumi.lumiModernExtend.lumiZigbeeOTA(),
6064
+ ],
6065
+ },
5344
6066
  ];
5345
6067
  //# sourceMappingURL=lumi.js.map