@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
@@ -265,9 +265,10 @@ const shellyModernExtend = {
265
265
  // Shelly Gen4 devices report haElectricalMeasurement.powerFactor (0x0510) as INT16 (0x29)
266
266
  // while zigbee-herdsman defines it as INT8 (0x28). This breaks configureReporting (INVALID_DATA_TYPE).
267
267
  return m.deviceAddCustomCluster("haElectricalMeasurement", {
268
+ name: "haElectricalMeasurement",
268
269
  ID: HA_ELECTRICAL_MEASUREMENT_CLUSTER_ID,
269
270
  attributes: {
270
- powerFactor: { ID: HA_ELECTRICAL_MEASUREMENT_POWER_FACTOR_ATTR_ID, type: zigbee_herdsman_1.Zcl.DataType.INT16 },
271
+ powerFactor: { name: "powerFactor", ID: HA_ELECTRICAL_MEASUREMENT_POWER_FACTOR_ATTR_ID, type: zigbee_herdsman_1.Zcl.DataType.INT16 },
271
272
  },
272
273
  commands: {},
273
274
  commandsResponse: {},
@@ -276,31 +277,33 @@ const shellyModernExtend = {
276
277
  shellyCustomClusters() {
277
278
  return [
278
279
  m.deviceAddCustomCluster("shellyRPCCluster", {
280
+ name: "shellyRPCCluster",
279
281
  ID: 0xfc01,
280
282
  manufacturerCode: zigbee_herdsman_1.Zcl.ManufacturerCode.SHELLY,
281
283
  attributes: {
282
- data: { ID: 0x0000, type: zigbee_herdsman_1.Zcl.DataType.CHAR_STR, write: true },
283
- txCtl: { ID: 0x0001, type: zigbee_herdsman_1.Zcl.DataType.UINT32, write: true, max: 0xffffffff },
284
- rxCtl: { ID: 0x0002, type: zigbee_herdsman_1.Zcl.DataType.UINT32, write: true, max: 0xffffffff },
284
+ data: { name: "data", ID: 0x0000, type: zigbee_herdsman_1.Zcl.DataType.CHAR_STR, write: true },
285
+ txCtl: { name: "txCtl", ID: 0x0001, type: zigbee_herdsman_1.Zcl.DataType.UINT32, write: true, max: 0xffffffff },
286
+ rxCtl: { name: "rxCtl", ID: 0x0002, type: zigbee_herdsman_1.Zcl.DataType.UINT32, write: true, max: 0xffffffff },
285
287
  },
286
288
  commands: {},
287
289
  commandsResponse: {},
288
290
  }),
289
291
  m.deviceAddCustomCluster("shellyWiFiSetupCluster", {
292
+ name: "shellyWiFiSetupCluster",
290
293
  ID: 0xfc02,
291
294
  manufacturerCode: zigbee_herdsman_1.Zcl.ManufacturerCode.SHELLY,
292
295
  attributes: {
293
- status: { ID: 0x0000, type: zigbee_herdsman_1.Zcl.DataType.CHAR_STR, write: true },
294
- ip: { ID: 0x0001, type: zigbee_herdsman_1.Zcl.DataType.CHAR_STR, write: true },
295
- actionCode: { ID: 0x0002, type: zigbee_herdsman_1.Zcl.DataType.UINT8, write: true, max: 0xff },
296
- dhcp: { ID: 0x0003, type: zigbee_herdsman_1.Zcl.DataType.BOOLEAN, write: true },
297
- enabled: { ID: 0x0004, type: zigbee_herdsman_1.Zcl.DataType.BOOLEAN, write: true },
298
- ssid: { ID: 0x0005, type: zigbee_herdsman_1.Zcl.DataType.CHAR_STR, write: true },
299
- password: { ID: 0x0006, type: zigbee_herdsman_1.Zcl.DataType.CHAR_STR, write: true },
300
- staticIp: { ID: 0x0007, type: zigbee_herdsman_1.Zcl.DataType.CHAR_STR, write: true },
301
- netMask: { ID: 0x0008, type: zigbee_herdsman_1.Zcl.DataType.CHAR_STR, write: true },
302
- gateway: { ID: 0x0009, type: zigbee_herdsman_1.Zcl.DataType.CHAR_STR, write: true },
303
- nameServer: { ID: 0x000a, type: zigbee_herdsman_1.Zcl.DataType.CHAR_STR, write: true },
296
+ status: { name: "status", ID: 0x0000, type: zigbee_herdsman_1.Zcl.DataType.CHAR_STR, write: true },
297
+ ip: { name: "ip", ID: 0x0001, type: zigbee_herdsman_1.Zcl.DataType.CHAR_STR, write: true },
298
+ actionCode: { name: "actionCode", ID: 0x0002, type: zigbee_herdsman_1.Zcl.DataType.UINT8, write: true, max: 0xff },
299
+ dhcp: { name: "dhcp", ID: 0x0003, type: zigbee_herdsman_1.Zcl.DataType.BOOLEAN, write: true },
300
+ enabled: { name: "enabled", ID: 0x0004, type: zigbee_herdsman_1.Zcl.DataType.BOOLEAN, write: true },
301
+ ssid: { name: "ssid", ID: 0x0005, type: zigbee_herdsman_1.Zcl.DataType.CHAR_STR, write: true },
302
+ password: { name: "password", ID: 0x0006, type: zigbee_herdsman_1.Zcl.DataType.CHAR_STR, write: true },
303
+ staticIp: { name: "staticIp", ID: 0x0007, type: zigbee_herdsman_1.Zcl.DataType.CHAR_STR, write: true },
304
+ netMask: { name: "netMask", ID: 0x0008, type: zigbee_herdsman_1.Zcl.DataType.CHAR_STR, write: true },
305
+ gateway: { name: "gateway", ID: 0x0009, type: zigbee_herdsman_1.Zcl.DataType.CHAR_STR, write: true },
306
+ nameServer: { name: "nameServer", ID: 0x000a, type: zigbee_herdsman_1.Zcl.DataType.CHAR_STR, write: true },
304
307
  },
305
308
  commands: {},
306
309
  commandsResponse: {},
@@ -312,6 +315,9 @@ const shellyModernExtend = {
312
315
  const shellyRPCBugFixed = false; // For firmware 20250819-150402/ga0def2d
313
316
  const featureDev = features.includes("Dev");
314
317
  const featurePowerstripUI = features.includes("PowerstripUI");
318
+ const featurePowerstripPowerOnBehavior = features.includes("PowerstripPowerOnBehavior");
319
+ const featureTwoPMInputMode = features.includes("2PMInputMode");
320
+ const featureOnePMInputMode = features.includes("1PMInputMode");
315
321
  // Generic helper functions
316
322
  const validateTime = (value) => {
317
323
  const hhmmRegex = /^([01][0-9]|2[0-3]):[0-5][0-9]$/;
@@ -433,13 +439,27 @@ const shellyModernExtend = {
433
439
  state.rpc_rxctl = msg.data.rxCtl;
434
440
  state.rpc_data = "";
435
441
  }
436
- if (msg.data.data !== undefined)
437
- state.rpc_data = meta.state.rpc_data + msg.data.data;
442
+ if (msg.data.data !== undefined) {
443
+ const accumulated = (meta.state.rpc_data ?? "") + msg.data.data;
444
+ state.rpc_data = accumulated;
445
+ const expectedLen = meta.state.rpc_rxctl;
446
+ if (expectedLen > 0 && accumulated.length >= expectedLen) {
447
+ try {
448
+ const response = JSON.parse(accumulated);
449
+ if (response.result?.in_mode !== undefined) {
450
+ const epName = response.result.id === 0 ? "sw1" : "sw2";
451
+ state[`switch_mode_${epName}`] = response.result.in_mode;
452
+ }
453
+ }
454
+ catch { }
455
+ }
456
+ }
438
457
  return state;
439
458
  },
440
459
  },
441
460
  ];
442
461
  const toZigbee = [];
462
+ const configure = [];
443
463
  const toZigbeeDev = [
444
464
  {
445
465
  key: ["rpc_rxctl", "rpc_data"],
@@ -574,7 +594,108 @@ const shellyModernExtend = {
574
594
  exposes.push(...exposesPowerstripUI);
575
595
  toZigbee.push(...toZigbeePowerstripUI);
576
596
  }
577
- return { exposes, fromZigbee, toZigbee, isModernExtend: true };
597
+ if (featurePowerstripPowerOnBehavior) {
598
+ const powerOnBehaviorValues = ["off", "on", "previous", "match_input"];
599
+ for (const channel of [1, 2, 3, 4]) {
600
+ exposes.push(e
601
+ .enum("power_on_behavior", ea.STATE_SET, powerOnBehaviorValues)
602
+ .withDescription("Behavior of the socket after a power outage. 'previous' restores the last known state.")
603
+ .withCategory("config")
604
+ .withEndpoint(String(channel)));
605
+ }
606
+ toZigbee.push({
607
+ key: ["power_on_behavior"],
608
+ convertSet: async (entity, key, value, meta) => {
609
+ utils.assertString(value, key);
610
+ utils.assertString(meta.endpoint_name, "endpoint_name");
611
+ utils.assertEndpoint(entity);
612
+ const switchId = Number(meta.endpoint_name) - 1;
613
+ // shellyRPCCluster lives on a dedicated endpoint (239), but this expose is per-channel.
614
+ // determineEndpoint() would return the per-channel endpoint when endpoint_name is set,
615
+ // so we explicitly resolve the RPC endpoint via the device.
616
+ const ep = entity.getDevice().getEndpoint(SHELLY_ENDPOINT_ID);
617
+ if (!ep)
618
+ throw new Error(`Shelly RPC endpoint ${SHELLY_ENDPOINT_ID} not found`);
619
+ const shellyValue = value === "previous" ? "restore_last" : value;
620
+ await rpcSend(ep, "Switch.SetConfig", { id: switchId, config: { initial_state: shellyValue } });
621
+ return { state: { power_on_behavior: value } };
622
+ },
623
+ });
624
+ }
625
+ if (featureTwoPMInputMode) {
626
+ const inModeValues = ["follow", "flip", "detached", "cycle", "activation"];
627
+ exposes.push((device, _options) => {
628
+ if (utils.isDummyDevice(device) || !device.getEndpoint(SHELLY_ENDPOINT_ID))
629
+ return [];
630
+ return [
631
+ e.enum("switch_mode", ea.ALL, inModeValues).withDescription("Switch input mode").withCategory("config").withEndpoint("sw1"),
632
+ e.enum("switch_mode", ea.ALL, inModeValues).withDescription("Switch input mode").withCategory("config").withEndpoint("sw2"),
633
+ ];
634
+ });
635
+ toZigbee.push({
636
+ key: ["switch_mode"],
637
+ convertSet: async (entity, key, value, meta) => {
638
+ const switchId = meta.endpoint_name === "sw1" ? 0 : 1;
639
+ const ep = (0, utils_1.determineEndpoint)(entity, meta, "shellyRPCCluster");
640
+ await rpcSend(ep, "Switch.SetConfig", { id: switchId, config: { in_mode: value } });
641
+ return { state: { switch_mode: value } };
642
+ },
643
+ convertGet: async (entity, key, meta) => {
644
+ const switchId = meta.endpoint_name === "sw1" ? 0 : 1;
645
+ const ep = (0, utils_1.determineEndpoint)(entity, meta, "shellyRPCCluster");
646
+ await rpcSend(ep, "Switch.GetConfig", { id: switchId });
647
+ await rpcReceive(ep, "rpc_rxctl");
648
+ },
649
+ });
650
+ configure.push(async (device) => {
651
+ const ep = device.getEndpoint(SHELLY_ENDPOINT_ID);
652
+ if (!ep)
653
+ return;
654
+ try {
655
+ for (const id of [0, 1]) {
656
+ await rpcSend(ep, "Switch.GetConfig", { id });
657
+ await rpcReceive(ep, "rpc_rxctl");
658
+ }
659
+ }
660
+ catch (e) {
661
+ logger_1.logger.warning(`Failed to read switch_mode during configure, use get to retry: ${e}`, NS);
662
+ }
663
+ });
664
+ }
665
+ if (featureOnePMInputMode) {
666
+ const inModeValues = ["follow", "flip", "detached", "cycle", "activation"];
667
+ exposes.push((device, _options) => {
668
+ if (utils.isDummyDevice(device) || !device.getEndpoint(SHELLY_ENDPOINT_ID))
669
+ return [];
670
+ return [e.enum("switch_mode", ea.ALL, inModeValues).withDescription("Switch input mode").withCategory("config").withEndpoint("sw1")];
671
+ });
672
+ toZigbee.push({
673
+ key: ["switch_mode"],
674
+ convertSet: async (entity, key, value, meta) => {
675
+ const ep = (0, utils_1.determineEndpoint)(entity, meta, "shellyRPCCluster");
676
+ await rpcSend(ep, "Switch.SetConfig", { id: 0, config: { in_mode: value } });
677
+ return { state: { switch_mode: value } };
678
+ },
679
+ convertGet: async (entity, key, meta) => {
680
+ const ep = (0, utils_1.determineEndpoint)(entity, meta, "shellyRPCCluster");
681
+ await rpcSend(ep, "Switch.GetConfig", { id: 0 });
682
+ await rpcReceive(ep, "rpc_rxctl");
683
+ },
684
+ });
685
+ configure.push(async (device) => {
686
+ const ep = device.getEndpoint(SHELLY_ENDPOINT_ID);
687
+ if (!ep)
688
+ return;
689
+ try {
690
+ await rpcSend(ep, "Switch.GetConfig", { id: 0 });
691
+ await rpcReceive(ep, "rpc_rxctl");
692
+ }
693
+ catch (e) {
694
+ logger_1.logger.warning(`Failed to read switch_mode during configure, use get to retry: ${e}`, NS);
695
+ }
696
+ });
697
+ }
698
+ return { exposes, fromZigbee, toZigbee, configure, isModernExtend: true };
578
699
  },
579
700
  shellyWiFiSetup() {
580
701
  // biome-ignore lint/suspicious/noExplicitAny: generic
@@ -826,10 +947,61 @@ const shellyModernExtend = {
826
947
  ];
827
948
  return { exposes, fromZigbee, isModernExtend: true };
828
949
  },
950
+ shellyLightLevel(args) {
951
+ const reporting = args?.reporting ?? { min: "1_MINUTE", max: 900, change: 0 };
952
+ return [
953
+ m.deviceAddCustomCluster("shellyLightLevel", {
954
+ name: "shellyLightLevel",
955
+ ID: 0xfc21,
956
+ manufacturerCode: zigbee_herdsman_1.Zcl.ManufacturerCode.SHELLY,
957
+ attributes: {
958
+ lightLevel: { name: "lightLevel", ID: 0x0000, type: zigbee_herdsman_1.Zcl.DataType.UINT8 },
959
+ darkThreshold: { name: "darkThreshold", ID: 0x0001, type: zigbee_herdsman_1.Zcl.DataType.UINT24, write: true },
960
+ brightThreshold: { name: "brightThreshold", ID: 0x0002, type: zigbee_herdsman_1.Zcl.DataType.UINT24, write: true },
961
+ },
962
+ commands: {},
963
+ commandsResponse: {},
964
+ }),
965
+ m.enumLookup({
966
+ name: "light_level",
967
+ cluster: "shellyLightLevel",
968
+ attribute: "lightLevel",
969
+ lookup: { dark: 0, twilight: 1, bright: 2 },
970
+ description: "Coarse light level",
971
+ reporting,
972
+ access: "STATE_GET",
973
+ }),
974
+ m.numeric({
975
+ name: "dark_threshold",
976
+ cluster: "shellyLightLevel",
977
+ attribute: "darkThreshold",
978
+ valueMin: 0,
979
+ valueMax: 65535,
980
+ reporting: false,
981
+ description: "Lux threshold below which light level is dark",
982
+ unit: "lx",
983
+ access: "ALL",
984
+ }),
985
+ m.numeric({
986
+ name: "bright_threshold",
987
+ cluster: "shellyLightLevel",
988
+ attribute: "brightThreshold",
989
+ valueMin: 0,
990
+ valueMax: 65535,
991
+ reporting: false,
992
+ description: "Lux threshold above which light level is bright",
993
+ unit: "lx",
994
+ access: "ALL",
995
+ }),
996
+ ];
997
+ },
829
998
  };
830
999
  // =============================================================================
831
1000
  // Local From Zigbee Converters
832
1001
  // =============================================================================
1002
+ const handlePosition = e
1003
+ .enum("handle_position", ea.STATE, ["closed", "tilted", "open"])
1004
+ .withDescription("Handle position: closed, tilted (partly open), or open");
833
1005
  const fzLocal = {
834
1006
  one_button_events: {
835
1007
  cluster: "genOnOff",
@@ -839,15 +1011,27 @@ const fzLocal = {
839
1011
  return { action: event };
840
1012
  },
841
1013
  },
1014
+ one_button_scene_events: {
1015
+ cluster: "genScenes",
1016
+ type: ["commandRecall"],
1017
+ convert: (model, msg, publish, options, meta) => {
1018
+ const event = utils.getFromLookup(`${msg.endpoint.ID}`, { "1": "single_long", "2": "double_long", "3": "triple_long" });
1019
+ return { action: event };
1020
+ },
1021
+ },
842
1022
  four_buttons_single_events: {
843
1023
  cluster: "genOnOff",
844
- type: ["commandOn", "commandOff"],
1024
+ type: ["commandOn", "commandOff", "commandToggle"],
845
1025
  convert: (model, msg, publish, options, meta) => {
846
1026
  const event = utils.getFromLookup(`${msg.endpoint.ID}_${msg.type}`, {
847
1027
  "1_commandOn": "1_single",
848
1028
  "1_commandOff": "2_single",
849
1029
  "2_commandOn": "3_single",
850
1030
  "2_commandOff": "4_single",
1031
+ "1_commandToggle": "1_single",
1032
+ "2_commandToggle": "2_single",
1033
+ "3_commandToggle": "3_single",
1034
+ "4_commandToggle": "4_single",
851
1035
  });
852
1036
  return { action: event };
853
1037
  },
@@ -865,6 +1049,141 @@ const fzLocal = {
865
1049
  return { action: event };
866
1050
  },
867
1051
  },
1052
+ four_buttons_scene_events: {
1053
+ cluster: "genScenes",
1054
+ type: ["commandRecall"],
1055
+ convert: (model, msg, publish, options, meta) => {
1056
+ const event = utils.getFromLookup(`${msg.endpoint.ID}_${msg.data.sceneid}`, {
1057
+ "1_1": "1_double",
1058
+ "2_1": "2_double",
1059
+ "3_1": "3_double",
1060
+ "4_1": "4_double",
1061
+ "1_2": "1_triple",
1062
+ "2_2": "2_triple",
1063
+ "3_2": "3_triple",
1064
+ "4_2": "4_triple",
1065
+ "1_11": "1_single_long",
1066
+ "2_11": "2_single_long",
1067
+ "3_11": "3_single_long",
1068
+ "4_11": "4_single_long",
1069
+ "1_12": "1_double_long",
1070
+ "2_12": "2_double_long",
1071
+ "3_12": "3_double_long",
1072
+ "4_12": "4_double_long",
1073
+ "1_13": "1_triple_long",
1074
+ "2_13": "2_triple_long",
1075
+ "3_13": "3_triple_long",
1076
+ "4_13": "4_triple_long",
1077
+ });
1078
+ return { action: event };
1079
+ },
1080
+ },
1081
+ two_switch_inputs_events: {
1082
+ cluster: "genOnOff",
1083
+ type: ["commandOn", "commandOff", "commandToggle"],
1084
+ convert: (model, msg, publish, options, meta) => {
1085
+ const event = utils.getFromLookup(`${msg.endpoint.ID}_${msg.type}`, {
1086
+ "3_commandOn": "input_1_on",
1087
+ "3_commandOff": "input_1_off",
1088
+ "3_commandToggle": "input_1_toggle",
1089
+ "4_commandOn": "input_2_on",
1090
+ "4_commandOff": "input_2_off",
1091
+ "4_commandToggle": "input_2_toggle",
1092
+ });
1093
+ return { action: event };
1094
+ },
1095
+ },
1096
+ two_switch_inputs_scene_events: {
1097
+ cluster: "genScenes",
1098
+ type: ["commandRecall"],
1099
+ convert: (model, msg, publish, options, meta) => {
1100
+ const event = utils.getFromLookup(`${msg.endpoint.ID}_${msg.data.sceneid}`, {
1101
+ "3_5": "input_1_toggle",
1102
+ "4_5": "input_2_toggle",
1103
+ "3_11": "input_1_hold",
1104
+ "4_11": "input_2_hold",
1105
+ });
1106
+ return { action: event };
1107
+ },
1108
+ },
1109
+ one_switch_input_events: {
1110
+ cluster: "genOnOff",
1111
+ type: ["commandOn", "commandOff", "commandToggle"],
1112
+ convert: (model, msg, publish, options, meta) => {
1113
+ if (msg.endpoint.ID !== 2)
1114
+ return {};
1115
+ const event = utils.getFromLookup(msg.type, {
1116
+ commandOn: "input_1_on",
1117
+ commandOff: "input_1_off",
1118
+ commandToggle: "input_1_toggle",
1119
+ });
1120
+ return { action: event };
1121
+ },
1122
+ },
1123
+ one_switch_input_scene_events: {
1124
+ cluster: "genScenes",
1125
+ type: ["commandRecall"],
1126
+ convert: (model, msg, publish, options, meta) => {
1127
+ if (msg.endpoint.ID !== 2)
1128
+ return {};
1129
+ const event = utils.getFromLookup(`${msg.data.sceneid}`, { "5": "input_1_toggle", "11": "input_1_hold" });
1130
+ return { action: event };
1131
+ },
1132
+ },
1133
+ switch_input_type: {
1134
+ cluster: "genOnOffSwitchCfg",
1135
+ type: ["attributeReport", "readResponse"],
1136
+ convert: (model, msg, publish, options, meta) => {
1137
+ if (!Object.hasOwn(msg.data, "switchType"))
1138
+ return {};
1139
+ const epName = utils.getFromLookup(msg.endpoint.ID, { 2: "sw1", 3: "sw1", 4: "sw2" });
1140
+ if (!epName)
1141
+ return {};
1142
+ return { [`switch_type_${epName}`]: utils.getFromLookup(msg.data.switchType, { 0: "toggle", 1: "momentary" }) };
1143
+ },
1144
+ },
1145
+ blu_door_window: {
1146
+ cluster: "ssIasZone",
1147
+ type: ["commandStatusChangeNotification", "attributeReport", "readResponse"],
1148
+ convert: (model, msg, publish, options, meta) => {
1149
+ const zoneStatus = "zonestatus" in msg.data ? msg.data.zonestatus : msg.data.zoneStatus;
1150
+ if (zoneStatus === undefined)
1151
+ return;
1152
+ const alarm1 = (zoneStatus & 1) > 0;
1153
+ const alarm2 = (zoneStatus & (1 << 1)) > 0;
1154
+ // Zone type 0x0016 (door/window handle) per ZigBee spec Table 8-7:
1155
+ // alarm1=0, alarm2=0 -> closed
1156
+ // alarm1=1, alarm2=0 -> tilted (partly open)
1157
+ // alarm1=1, alarm2=1 -> open
1158
+ let position;
1159
+ if (!alarm1 && !alarm2)
1160
+ position = "closed";
1161
+ else if (alarm1 && !alarm2)
1162
+ position = "tilted";
1163
+ else
1164
+ position = "open";
1165
+ return {
1166
+ contact: position === "closed",
1167
+ handle_position: position,
1168
+ battery_low: (zoneStatus & (1 << 3)) > 0,
1169
+ };
1170
+ },
1171
+ },
1172
+ };
1173
+ const tzLocal = {
1174
+ switch_input_type: {
1175
+ key: ["switch_type"],
1176
+ convertSet: async (entity, key, value, meta) => {
1177
+ const lookup = { toggle: 0, momentary: 1 };
1178
+ const ep = (0, utils_1.determineEndpoint)(entity, meta, "genOnOffSwitchCfg");
1179
+ await ep.write("genOnOffSwitchCfg", { switchType: utils.getFromLookup(value, lookup) });
1180
+ return { state: { switch_type: value } };
1181
+ },
1182
+ convertGet: async (entity, key, meta) => {
1183
+ const ep = (0, utils_1.determineEndpoint)(entity, meta, "genOnOffSwitchCfg");
1184
+ await ep.read("genOnOffSwitchCfg", ["switchType"]);
1185
+ },
1186
+ },
868
1187
  };
869
1188
  // =============================================================================
870
1189
  // Device Definitions
@@ -875,40 +1194,116 @@ exports.definitions = [
875
1194
  model: "S4SW-001X8EU",
876
1195
  vendor: "Shelly",
877
1196
  description: "1 Mini Gen 4",
878
- extend: [m.onOff({ powerOnBehavior: false }), ...shellyModernExtend.shellyCustomClusters(), shellyModernExtend.shellyWiFiSetup()],
1197
+ ota: true,
1198
+ fromZigbee: [fzLocal.one_switch_input_events, fzLocal.one_switch_input_scene_events, fzLocal.switch_input_type],
1199
+ toZigbee: [tzLocal.switch_input_type],
1200
+ exposes: [
1201
+ e.action(["input_1_on", "input_1_off", "input_1_toggle", "input_1_hold"]),
1202
+ e.enum("switch_type", ea.ALL, ["toggle", "momentary"]).withDescription("Switch input type").withCategory("config").withEndpoint("sw1"),
1203
+ ],
1204
+ extend: [
1205
+ m.deviceEndpoints({ endpoints: { sw1: 2 } }),
1206
+ m.onOff({ powerOnBehavior: false }),
1207
+ ...shellyModernExtend.shellyCustomClusters(),
1208
+ shellyModernExtend.shellyRPCSetup(["1PMInputMode"]),
1209
+ shellyModernExtend.shellyWiFiSetup(),
1210
+ ],
1211
+ configure: async (device, coordinatorEndpoint) => {
1212
+ const ep = device.getEndpoint(2);
1213
+ if (ep) {
1214
+ await ep.bind("genOnOff", coordinatorEndpoint);
1215
+ await ep.bind("genScenes", coordinatorEndpoint);
1216
+ await ep.read("genOnOffSwitchCfg", ["switchType"]);
1217
+ }
1218
+ },
879
1219
  },
880
1220
  {
881
1221
  fingerprint: [{ modelID: "1", manufacturerName: "Shelly" }],
882
1222
  model: "S4SW-001X16EU",
883
1223
  vendor: "Shelly",
884
1224
  description: "1 Gen 4",
885
- extend: [m.onOff({ powerOnBehavior: false }), ...shellyModernExtend.shellyCustomClusters(), shellyModernExtend.shellyWiFiSetup()],
1225
+ ota: true,
1226
+ fromZigbee: [fzLocal.one_switch_input_events, fzLocal.one_switch_input_scene_events, fzLocal.switch_input_type],
1227
+ toZigbee: [tzLocal.switch_input_type],
1228
+ exposes: [
1229
+ e.action(["input_1_on", "input_1_off", "input_1_toggle", "input_1_hold"]),
1230
+ e.enum("switch_type", ea.ALL, ["toggle", "momentary"]).withDescription("Switch input type").withCategory("config").withEndpoint("sw1"),
1231
+ ],
1232
+ extend: [
1233
+ m.deviceEndpoints({ endpoints: { sw1: 2 } }),
1234
+ m.onOff({ powerOnBehavior: false }),
1235
+ ...shellyModernExtend.shellyCustomClusters(),
1236
+ shellyModernExtend.shellyRPCSetup(["1PMInputMode"]),
1237
+ shellyModernExtend.shellyWiFiSetup(),
1238
+ ],
1239
+ configure: async (device, coordinatorEndpoint) => {
1240
+ const ep = device.getEndpoint(2);
1241
+ if (ep) {
1242
+ await ep.bind("genOnOff", coordinatorEndpoint);
1243
+ await ep.bind("genScenes", coordinatorEndpoint);
1244
+ await ep.read("genOnOffSwitchCfg", ["switchType"]);
1245
+ }
1246
+ },
886
1247
  },
887
1248
  {
888
1249
  zigbeeModel: ["Mini1PM", "1PM Mini"],
889
1250
  model: "S4SW-001P8EU",
890
1251
  vendor: "Shelly",
891
1252
  description: "1PM Mini Gen 4",
1253
+ ota: true,
1254
+ fromZigbee: [fzLocal.one_switch_input_events, fzLocal.one_switch_input_scene_events, fzLocal.switch_input_type],
1255
+ toZigbee: [tzLocal.switch_input_type],
1256
+ exposes: [
1257
+ e.action(["input_1_on", "input_1_off", "input_1_toggle", "input_1_hold"]),
1258
+ e.enum("switch_type", ea.ALL, ["toggle", "momentary"]).withDescription("Switch input type").withCategory("config").withEndpoint("sw1"),
1259
+ ],
892
1260
  extend: [
1261
+ m.deviceEndpoints({ endpoints: { sw1: 2 } }),
893
1262
  m.onOff({ powerOnBehavior: false }),
894
1263
  m.electricityMeter({ producedEnergy: true, acFrequency: true }),
895
1264
  shellyModernExtend.shellyPowerFactorInt16Fix(),
896
1265
  ...shellyModernExtend.shellyCustomClusters(),
1266
+ shellyModernExtend.shellyRPCSetup(["1PMInputMode"]),
897
1267
  shellyModernExtend.shellyWiFiSetup(),
898
1268
  ],
1269
+ configure: async (device, coordinatorEndpoint) => {
1270
+ const ep = device.getEndpoint(2);
1271
+ if (ep) {
1272
+ await ep.bind("genOnOff", coordinatorEndpoint);
1273
+ await ep.bind("genScenes", coordinatorEndpoint);
1274
+ await ep.read("genOnOffSwitchCfg", ["switchType"]);
1275
+ }
1276
+ },
899
1277
  },
900
1278
  {
901
1279
  zigbeeModel: ["1PM"],
902
1280
  model: "S4SW-001P16EU",
903
1281
  vendor: "Shelly",
904
1282
  description: "1PM Gen 4",
1283
+ ota: true,
1284
+ fromZigbee: [fzLocal.one_switch_input_events, fzLocal.one_switch_input_scene_events, fzLocal.switch_input_type],
1285
+ toZigbee: [tzLocal.switch_input_type],
1286
+ exposes: [
1287
+ e.action(["input_1_on", "input_1_off", "input_1_toggle", "input_1_hold"]),
1288
+ e.enum("switch_type", ea.ALL, ["toggle", "momentary"]).withDescription("Switch input type").withCategory("config").withEndpoint("sw1"),
1289
+ ],
905
1290
  extend: [
1291
+ m.deviceEndpoints({ endpoints: { sw1: 2 } }),
906
1292
  m.onOff({ powerOnBehavior: false }),
907
1293
  m.electricityMeter({ producedEnergy: true, acFrequency: true }),
908
1294
  shellyModernExtend.shellyPowerFactorInt16Fix(),
909
1295
  ...shellyModernExtend.shellyCustomClusters(),
1296
+ shellyModernExtend.shellyRPCSetup(["1PMInputMode"]),
910
1297
  shellyModernExtend.shellyWiFiSetup(),
911
1298
  ],
1299
+ configure: async (device, coordinatorEndpoint) => {
1300
+ const ep = device.getEndpoint(2);
1301
+ if (ep) {
1302
+ await ep.bind("genOnOff", coordinatorEndpoint);
1303
+ await ep.bind("genScenes", coordinatorEndpoint);
1304
+ await ep.read("genOnOffSwitchCfg", ["switchType"]);
1305
+ }
1306
+ },
912
1307
  },
913
1308
  {
914
1309
  zigbeeModel: ["EM Mini"],
@@ -922,6 +1317,25 @@ exports.definitions = [
922
1317
  shellyModernExtend.shellyWiFiSetup(),
923
1318
  ],
924
1319
  },
1320
+ {
1321
+ fingerprint: [{ modelID: "EM", manufacturerName: "Shelly" }],
1322
+ model: "S4EM-002CXCEU",
1323
+ vendor: "Shelly",
1324
+ description: "EM Gen4",
1325
+ extend: [
1326
+ m.deviceEndpoints({ endpoints: { "1": 1, "2": 2, "3": 3 } }),
1327
+ m.onOff({ powerOnBehavior: false, endpointNames: ["1"] }),
1328
+ m.electricityMeter({
1329
+ endpointNames: ["2", "3"],
1330
+ producedEnergy: true,
1331
+ acFrequency: true,
1332
+ }),
1333
+ m.forcePowerSource({ powerSource: "Mains (single phase)" }),
1334
+ shellyModernExtend.shellyPowerFactorInt16Fix(),
1335
+ ...shellyModernExtend.shellyCustomClusters(),
1336
+ shellyModernExtend.shellyWiFiSetup(),
1337
+ ],
1338
+ },
925
1339
  {
926
1340
  fingerprint: [
927
1341
  {
@@ -934,11 +1348,48 @@ exports.definitions = [
934
1348
  { ID: 242, profileID: 41440, deviceID: 97, inputClusters: [], outputClusters: [33] },
935
1349
  ],
936
1350
  },
1351
+ {
1352
+ type: "Router",
1353
+ manufacturerName: "Shelly",
1354
+ modelID: "2PM",
1355
+ endpoints: [
1356
+ { ID: 1, profileID: 260, deviceID: 514, inputClusters: [0, 3, 4, 5, 258], outputClusters: [25] },
1357
+ { ID: 2, inputClusters: [7], outputClusters: [3, 4, 5, 6] },
1358
+ { ID: 3, inputClusters: [7], outputClusters: [3, 4, 5, 6] },
1359
+ { ID: 4, inputClusters: [], outputClusters: [3, 4, 6, 8, 258] },
1360
+ { ID: 239, profileID: 49153, deviceID: 8193, inputClusters: [64513, 64514], outputClusters: [] },
1361
+ { ID: 242, profileID: 41440, deviceID: 97, inputClusters: [], outputClusters: [33] },
1362
+ ],
1363
+ },
937
1364
  ],
938
1365
  model: "S4SW-002P16EU-COVER",
939
1366
  vendor: "Shelly",
940
1367
  description: "2PM Gen4 (Cover mode)",
941
- extend: [m.windowCovering({ controls: ["lift", "tilt"] }), ...shellyModernExtend.shellyCustomClusters(), shellyModernExtend.shellyWiFiSetup()],
1368
+ ota: true,
1369
+ fromZigbee: [fzLocal.two_switch_inputs_events, fzLocal.two_switch_inputs_scene_events, fzLocal.switch_input_type],
1370
+ toZigbee: [tzLocal.switch_input_type],
1371
+ exposes: [
1372
+ e.action(["input_1_on", "input_1_off", "input_1_toggle", "input_1_hold", "input_2_on", "input_2_off", "input_2_toggle", "input_2_hold"]),
1373
+ e.enum("switch_type", ea.ALL, ["toggle", "momentary"]).withDescription("Switch input type").withCategory("config").withEndpoint("sw1"),
1374
+ e.enum("switch_type", ea.ALL, ["toggle", "momentary"]).withDescription("Switch input type").withCategory("config").withEndpoint("sw2"),
1375
+ ],
1376
+ extend: [
1377
+ m.deviceEndpoints({ endpoints: { sw1: 2, sw2: 3 } }),
1378
+ m.windowCovering({ controls: ["lift", "tilt"] }),
1379
+ ...shellyModernExtend.shellyCustomClusters(),
1380
+ shellyModernExtend.shellyRPCSetup(["2PMInputMode"]),
1381
+ shellyModernExtend.shellyWiFiSetup(),
1382
+ ],
1383
+ configure: async (device, coordinatorEndpoint) => {
1384
+ for (const epID of [2, 3]) {
1385
+ const ep = device.getEndpoint(epID);
1386
+ if (ep) {
1387
+ await ep.bind("genOnOff", coordinatorEndpoint);
1388
+ await ep.bind("genScenes", coordinatorEndpoint);
1389
+ await ep.read("genOnOffSwitchCfg", ["switchType"]);
1390
+ }
1391
+ }
1392
+ },
942
1393
  },
943
1394
  {
944
1395
  fingerprint: [
@@ -953,18 +1404,51 @@ exports.definitions = [
953
1404
  { ID: 242, profileID: 41440, deviceID: 97, inputClusters: [], outputClusters: [33] },
954
1405
  ],
955
1406
  },
1407
+ {
1408
+ type: "Router",
1409
+ manufacturerName: "Shelly",
1410
+ modelID: "2PM",
1411
+ endpoints: [
1412
+ { ID: 1, profileID: 260, deviceID: 266, inputClusters: [0, 3, 4, 5, 6, 2820, 1794], outputClusters: [25] },
1413
+ { ID: 2, profileID: 260, deviceID: 266, inputClusters: [4, 5, 6, 2820, 1794], outputClusters: [] },
1414
+ { ID: 3, inputClusters: [7], outputClusters: [3, 4, 5, 6] },
1415
+ { ID: 4, inputClusters: [7], outputClusters: [3, 4, 5, 6] },
1416
+ { ID: 5, inputClusters: [], outputClusters: [3, 4, 6, 8, 258] },
1417
+ { ID: 239, profileID: 49153, deviceID: 8193, inputClusters: [64513, 64514], outputClusters: [] },
1418
+ { ID: 242, profileID: 41440, deviceID: 97, inputClusters: [], outputClusters: [33] },
1419
+ ],
1420
+ },
956
1421
  ],
957
1422
  model: "S4SW-002P16EU-SWITCH",
958
1423
  vendor: "Shelly",
959
1424
  description: "2PM Gen4 (Switch mode)",
1425
+ ota: true,
1426
+ fromZigbee: [fzLocal.two_switch_inputs_events, fzLocal.two_switch_inputs_scene_events, fzLocal.switch_input_type],
1427
+ toZigbee: [tzLocal.switch_input_type],
1428
+ exposes: [
1429
+ e.action(["input_1_on", "input_1_off", "input_1_toggle", "input_1_hold", "input_2_on", "input_2_off", "input_2_toggle", "input_2_hold"]),
1430
+ e.enum("switch_type", ea.ALL, ["toggle", "momentary"]).withDescription("Switch input type").withCategory("config").withEndpoint("sw1"),
1431
+ e.enum("switch_type", ea.ALL, ["toggle", "momentary"]).withDescription("Switch input type").withCategory("config").withEndpoint("sw2"),
1432
+ ],
960
1433
  extend: [
961
- m.deviceEndpoints({ endpoints: { l1: 1, l2: 2 } }),
1434
+ m.deviceEndpoints({ endpoints: { l1: 1, l2: 2, sw1: 3, sw2: 4 } }),
962
1435
  m.onOff({ powerOnBehavior: false, endpointNames: ["l1", "l2"] }),
963
1436
  m.electricityMeter({ producedEnergy: true, acFrequency: true, endpointNames: ["l1", "l2"] }),
964
1437
  shellyModernExtend.shellyPowerFactorInt16Fix(),
965
1438
  ...shellyModernExtend.shellyCustomClusters(),
1439
+ shellyModernExtend.shellyRPCSetup(["2PMInputMode"]),
966
1440
  shellyModernExtend.shellyWiFiSetup(),
967
1441
  ],
1442
+ configure: async (device, coordinatorEndpoint) => {
1443
+ for (const epID of [3, 4]) {
1444
+ const ep = device.getEndpoint(epID);
1445
+ if (ep) {
1446
+ await ep.bind("genOnOff", coordinatorEndpoint);
1447
+ await ep.bind("genScenes", coordinatorEndpoint);
1448
+ await ep.read("genOnOffSwitchCfg", ["switchType"]);
1449
+ }
1450
+ }
1451
+ },
968
1452
  },
969
1453
  {
970
1454
  fingerprint: [{ modelID: "Plug US", manufacturerName: "Shelly" }],
@@ -984,13 +1468,23 @@ exports.definitions = [
984
1468
  model: "S4PL-00416EU",
985
1469
  vendor: "Shelly",
986
1470
  description: "Power strip 4 Gen4",
1471
+ version: "0.0.1",
987
1472
  extend: [
988
1473
  m.deviceEndpoints({ endpoints: { "1": 1, "2": 2, "3": 3, "4": 4 } }),
989
1474
  m.onOff({ powerOnBehavior: false, endpointNames: ["1", "2", "3", "4"] }),
990
- m.electricityMeter({ endpointNames: ["1", "2", "3", "4"] }),
1475
+ m.electricityMeter({
1476
+ endpointNames: ["1", "2", "3", "4"],
1477
+ // Reduce reporting to prevent crashes
1478
+ // https://github.com/Koenkk/zigbee2mqtt/issues/31183
1479
+ acFrequency: { change: 125 },
1480
+ current: { change: 60 },
1481
+ voltage: { change: 625 },
1482
+ power: { change: 6 },
1483
+ energy: { change: 125000 },
1484
+ }),
991
1485
  shellyModernExtend.shellyPowerFactorInt16Fix(),
992
1486
  ...shellyModernExtend.shellyCustomClusters(),
993
- shellyModernExtend.shellyRPCSetup(["PowerstripUI"]),
1487
+ shellyModernExtend.shellyRPCSetup(["PowerstripUI", "PowerstripPowerOnBehavior"]),
994
1488
  shellyModernExtend.shellyWiFiSetup(),
995
1489
  ],
996
1490
  },
@@ -1000,8 +1494,8 @@ exports.definitions = [
1000
1494
  vendor: "Shelly",
1001
1495
  description: "Flood Gen 4",
1002
1496
  extend: [
1003
- m.battery(),
1004
- m.iasZoneAlarm({ zoneType: "water_leak", zoneAttributes: ["alarm_1", "tamper", "battery_low"] }),
1497
+ m.battery({ percentageReportingConfig: false }),
1498
+ m.iasZoneAlarm({ zoneType: "water_leak", zoneAttributes: ["alarm_1", "tamper", "battery_low", "trouble"] }),
1005
1499
  ...shellyModernExtend.shellyCustomClusters(),
1006
1500
  shellyModernExtend.shellyWiFiSetup(),
1007
1501
  ],
@@ -1018,12 +1512,13 @@ exports.definitions = [
1018
1512
  m.pressure(),
1019
1513
  m.humidity(),
1020
1514
  m.deviceAddCustomCluster("shellyWS90Wind", {
1515
+ name: "shellyWS90Wind",
1021
1516
  ID: 0xfc01,
1022
1517
  manufacturerCode: zigbee_herdsman_1.Zcl.ManufacturerCode.SHELLY,
1023
1518
  attributes: {
1024
- windSpeed: { ID: 0x0000, type: zigbee_herdsman_1.Zcl.DataType.UINT16 },
1025
- windDirection: { ID: 0x0004, type: zigbee_herdsman_1.Zcl.DataType.UINT16 },
1026
- gustSpeed: { ID: 0x0007, type: zigbee_herdsman_1.Zcl.DataType.UINT16 },
1519
+ windSpeed: { name: "windSpeed", ID: 0x0000, type: zigbee_herdsman_1.Zcl.DataType.UINT16 },
1520
+ windDirection: { name: "windDirection", ID: 0x0004, type: zigbee_herdsman_1.Zcl.DataType.UINT16 },
1521
+ gustSpeed: { name: "gustSpeed", ID: 0x0007, type: zigbee_herdsman_1.Zcl.DataType.UINT16 },
1027
1522
  },
1028
1523
  commands: {},
1029
1524
  commandsResponse: {},
@@ -1065,10 +1560,11 @@ exports.definitions = [
1065
1560
  access: "STATE_GET",
1066
1561
  }),
1067
1562
  m.deviceAddCustomCluster("shellyWS90UV", {
1563
+ name: "shellyWS90UV",
1068
1564
  ID: 0xfc02,
1069
1565
  manufacturerCode: zigbee_herdsman_1.Zcl.ManufacturerCode.SHELLY,
1070
1566
  attributes: {
1071
- uvIndex: { ID: 0x0000, type: zigbee_herdsman_1.Zcl.DataType.UINT8 },
1567
+ uvIndex: { name: "uvIndex", ID: 0x0000, type: zigbee_herdsman_1.Zcl.DataType.UINT8 },
1072
1568
  },
1073
1569
  commands: {},
1074
1570
  commandsResponse: {},
@@ -1085,11 +1581,12 @@ exports.definitions = [
1085
1581
  access: "STATE_GET",
1086
1582
  }),
1087
1583
  m.deviceAddCustomCluster("shellyWS90Rain", {
1584
+ name: "shellyWS90Rain",
1088
1585
  ID: 0xfc03,
1089
1586
  manufacturerCode: zigbee_herdsman_1.Zcl.ManufacturerCode.SHELLY,
1090
1587
  attributes: {
1091
- rainStatus: { ID: 0x0000, type: zigbee_herdsman_1.Zcl.DataType.BOOLEAN },
1092
- precipitation: { ID: 0x0001, type: zigbee_herdsman_1.Zcl.DataType.UINT24 },
1588
+ rainStatus: { name: "rainStatus", ID: 0x0000, type: zigbee_herdsman_1.Zcl.DataType.BOOLEAN },
1589
+ precipitation: { name: "precipitation", ID: 0x0001, type: zigbee_herdsman_1.Zcl.DataType.UINT24 },
1093
1590
  },
1094
1591
  commands: {},
1095
1592
  commandsResponse: {},
@@ -1121,7 +1618,10 @@ exports.definitions = [
1121
1618
  ],
1122
1619
  },
1123
1620
  {
1124
- fingerprint: [{ modelID: "Dimmer", manufacturerName: "Shelly" }],
1621
+ fingerprint: [
1622
+ { modelID: "Dimmer", manufacturerName: "Shelly" },
1623
+ { modelID: "Dimmer US", manufacturerName: "Shelly" },
1624
+ ],
1125
1625
  model: "S4DM-0A101WWL",
1126
1626
  vendor: "Shelly",
1127
1627
  description: "Dimmer Gen4",
@@ -1145,7 +1645,7 @@ exports.definitions = [
1145
1645
  model: "SBHT-103C",
1146
1646
  vendor: "Shelly",
1147
1647
  description: "BLU H&T display Zigbee",
1148
- extend: [m.battery(), m.temperature(), m.humidity()],
1648
+ extend: [m.battery(), m.temperature(), m.humidity(), ...shellyModernExtend.shellyLightLevel()],
1149
1649
  },
1150
1650
  {
1151
1651
  fingerprint: [{ modelID: "BLU Remote Control ZB", manufacturerName: "Shelly" }],
@@ -1170,8 +1670,8 @@ exports.definitions = [
1170
1670
  model: "SBBT-102C",
1171
1671
  vendor: "Shelly",
1172
1672
  description: "BLU Button Tough 1 ZB",
1173
- fromZigbee: [fzLocal.one_button_events],
1174
- exposes: [e.action(["single", "double", "triple"])],
1673
+ fromZigbee: [fzLocal.one_button_events, fzLocal.one_button_scene_events],
1674
+ exposes: [e.action(["single", "double", "triple", "single_long", "double_long", "triple_long"])],
1175
1675
  extend: [m.battery(), m.deviceEndpoints({ endpoints: { "1": 1, "2": 2, "3": 3 } }), m.identify()],
1176
1676
  version: "0.0.2",
1177
1677
  configure: async (device, coordinatorEndpoint, definition) => {
@@ -1182,30 +1682,47 @@ exports.definitions = [
1182
1682
  },
1183
1683
  },
1184
1684
  {
1185
- fingerprint: [{ modelID: "BLU RC Button 4 ZB", manufacturerName: "Shelly" }],
1685
+ zigbeeModel: ["BLU RC Button 4 ZB", "BLU Wall Switch 4 ZB", "BLU Wall Switch 4 ZB DK"],
1186
1686
  model: "SBBT-104CUS",
1187
1687
  vendor: "Shelly",
1188
1688
  description: "BLU RC Button 4 ZB",
1189
- fromZigbee: [fzLocal.four_buttons_single_events, fzLocal.four_buttons_hold_events],
1190
- exposes: [e.action(["1_single", "2_single", "3_single", "4_single", "1_hold", "2_hold", "3_hold", "4_hold"])],
1191
- extend: [m.battery(), m.deviceEndpoints({ endpoints: { "1": 1, "2": 2, "3": 3, "4": 4 } }), m.identify()],
1192
- version: "0.0.2",
1193
- configure: async (device, coordinatorEndpoint, definition) => {
1194
- for (const endpoint of device.endpoints) {
1195
- await endpoint.bind("genOnOff", coordinatorEndpoint);
1196
- await endpoint.bind("genLevelCtrl", coordinatorEndpoint);
1197
- await endpoint.bind("genScenes", coordinatorEndpoint);
1198
- }
1199
- },
1200
- },
1201
- {
1202
- zigbeeModel: ["BLU Wall Switch 4 ZB"],
1203
- model: "SBBT-004CEU",
1204
- vendor: "Shelly",
1205
- description: "BLU Wall Switch 4 ZB",
1206
- whiteLabel: [{ vendor: "Shelly", model: "SBBT-104CEU", description: "BLU Wall Switch 4 ZB DK" }],
1207
- fromZigbee: [fzLocal.four_buttons_single_events, fzLocal.four_buttons_hold_events],
1208
- exposes: [e.action(["1_single", "2_single", "3_single", "4_single", "1_hold", "2_hold", "3_hold", "4_hold"])],
1689
+ whiteLabel: [
1690
+ { vendor: "Shelly", model: "SBBT-004CEU", fingerprint: [{ modelID: "BLU Wall Switch 4 ZB" }], description: "BLU Wall Switch 4 ZB" },
1691
+ { vendor: "Shelly", model: "SBBT-104CEU", fingerprint: [{ modelID: "BLU Wall Switch 4 ZB DK" }], description: "BLU Wall Switch 4 ZB DK" },
1692
+ ],
1693
+ fromZigbee: [fzLocal.four_buttons_single_events, fzLocal.four_buttons_hold_events, fzLocal.four_buttons_scene_events],
1694
+ exposes: [
1695
+ e.action([
1696
+ "1_single",
1697
+ "2_single",
1698
+ "3_single",
1699
+ "4_single",
1700
+ "1_double",
1701
+ "2_double",
1702
+ "3_double",
1703
+ "4_double",
1704
+ "1_triple",
1705
+ "2_triple",
1706
+ "3_triple",
1707
+ "4_triple",
1708
+ "1_single_long",
1709
+ "2_single_long",
1710
+ "3_single_long",
1711
+ "4_single_long",
1712
+ "1_double_long",
1713
+ "2_double_long",
1714
+ "3_double_long",
1715
+ "4_double_long",
1716
+ "1_triple_long",
1717
+ "2_triple_long",
1718
+ "3_triple_long",
1719
+ "4_triple_long",
1720
+ "1_hold",
1721
+ "2_hold",
1722
+ "3_hold",
1723
+ "4_hold",
1724
+ ]),
1725
+ ],
1209
1726
  extend: [m.battery(), m.deviceEndpoints({ endpoints: { "1": 1, "2": 2, "3": 3, "4": 4 } }), m.identify()],
1210
1727
  version: "0.0.2",
1211
1728
  configure: async (device, coordinatorEndpoint, definition) => {
@@ -1266,14 +1783,15 @@ exports.definitions = [
1266
1783
  piHeatingDemand: { values: true },
1267
1784
  }),
1268
1785
  m.deviceAddCustomCluster("shellyTRVManualMode", {
1786
+ name: "shellyTRVManualMode",
1269
1787
  ID: 0xfc24,
1270
1788
  manufacturerCode: zigbee_herdsman_1.Zcl.ManufacturerCode.SHELLY,
1271
1789
  attributes: {
1272
- manualMode: { ID: 0x0000, type: zigbee_herdsman_1.Zcl.DataType.UINT8 },
1273
- position: { ID: 0x0001, type: zigbee_herdsman_1.Zcl.DataType.UINT8 },
1790
+ manualMode: { name: "manualMode", ID: 0x0000, type: zigbee_herdsman_1.Zcl.DataType.UINT8 },
1791
+ position: { name: "position", ID: 0x0001, type: zigbee_herdsman_1.Zcl.DataType.UINT8 },
1274
1792
  },
1275
1793
  commands: {
1276
- calibrate: { ID: 0x0000, parameters: [] },
1794
+ calibrate: { name: "calibrate", ID: 0x0000, parameters: [] },
1277
1795
  },
1278
1796
  commandsResponse: {},
1279
1797
  }),
@@ -1300,5 +1818,72 @@ exports.definitions = [
1300
1818
  m.identify(),
1301
1819
  ],
1302
1820
  },
1821
+ {
1822
+ fingerprint: [{ modelID: "Presence", manufacturerName: "Shelly" }],
1823
+ model: "S4SN-0U61X",
1824
+ vendor: "Shelly",
1825
+ description: "Presence Gen4 Zigbee",
1826
+ extend: [
1827
+ m.deviceEndpoints({ endpoints: { "1": 1, "2": 2, "3": 3, "4": 4, "5": 5, "6": 6, "7": 7, "8": 8, "9": 9, "10": 10 } }),
1828
+ m.occupancy({ reporting: false, endpointNames: ["1"] }),
1829
+ m.occupancy({ reporting: false, endpointNames: ["2"] }),
1830
+ m.occupancy({ reporting: false, endpointNames: ["3"] }),
1831
+ m.occupancy({ reporting: false, endpointNames: ["4"] }),
1832
+ m.occupancy({ reporting: false, endpointNames: ["5"] }),
1833
+ m.occupancy({ reporting: false, endpointNames: ["6"] }),
1834
+ m.occupancy({ reporting: false, endpointNames: ["7"] }),
1835
+ m.occupancy({ reporting: false, endpointNames: ["8"] }),
1836
+ m.occupancy({ reporting: false, endpointNames: ["9"] }),
1837
+ m.occupancy({ reporting: false, endpointNames: ["10"] }),
1838
+ ...shellyModernExtend.shellyLightLevel(),
1839
+ m.identify(),
1840
+ ...shellyModernExtend.shellyCustomClusters(),
1841
+ shellyModernExtend.shellyWiFiSetup(),
1842
+ ],
1843
+ },
1844
+ {
1845
+ fingerprint: [{ modelID: "BLU DoorWindow ZB", manufacturerName: "Shelly" }],
1846
+ model: "SBDW-103C",
1847
+ vendor: "Shelly",
1848
+ description: "BLU DoorWindow ZB",
1849
+ fromZigbee: [fzLocal.blu_door_window],
1850
+ toZigbee: [],
1851
+ exposes: [e.contact(), handlePosition, e.battery_low()],
1852
+ extend: [m.battery(), ...shellyModernExtend.shellyLightLevel(), m.identify()],
1853
+ configure: async (device, coordinatorEndpoint) => {
1854
+ const endpoint = device.getEndpoint(1);
1855
+ if (endpoint) {
1856
+ await endpoint.read("ssIasZone", ["zoneStatus"]);
1857
+ }
1858
+ },
1859
+ },
1860
+ {
1861
+ fingerprint: [{ modelID: "BLU Motion ZB", manufacturerName: "Shelly" }],
1862
+ model: "SBMO-103Z",
1863
+ vendor: "Shelly",
1864
+ description: "BLU Motion ZB",
1865
+ extend: [
1866
+ m.iasZoneAlarm({ zoneType: "occupancy", zoneAttributes: ["alarm_1", "battery_low"] }),
1867
+ m.battery(),
1868
+ ...shellyModernExtend.shellyLightLevel(),
1869
+ m.enumLookup({
1870
+ name: "motion_sensitivity",
1871
+ cluster: "ssIasZone",
1872
+ attribute: "currentZoneSensitivityLevel",
1873
+ lookup: { low: 1, medium: 2, high: 3 },
1874
+ description: "Motion sensor sensitivity",
1875
+ access: "ALL",
1876
+ reporting: false,
1877
+ entityCategory: "config",
1878
+ }),
1879
+ m.identify(),
1880
+ ],
1881
+ configure: async (device, coordinatorEndpoint) => {
1882
+ const endpoint = device.getEndpoint(1);
1883
+ if (endpoint) {
1884
+ await endpoint.read("ssIasZone", ["currentZoneSensitivityLevel"]);
1885
+ }
1886
+ },
1887
+ },
1303
1888
  ];
1304
1889
  //# sourceMappingURL=shelly.js.map