@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
@@ -37,14 +37,331 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
37
37
  };
38
38
  Object.defineProperty(exports, "__esModule", { value: true });
39
39
  exports.definitions = void 0;
40
+ const zigbee_herdsman_1 = require("@willieee802/zigbee-herdsman");
40
41
  const iconv_lite_1 = __importDefault(require("iconv-lite"));
41
42
  const exposes = __importStar(require("../lib/exposes"));
42
43
  const logger_1 = require("../lib/logger");
43
44
  const m = __importStar(require("../lib/modernExtend"));
44
45
  const reporting = __importStar(require("../lib/reporting"));
46
+ const sonoff_1 = require("../lib/sonoff");
47
+ const utils_1 = require("../lib/utils");
45
48
  const NS = "zhc:easyiot";
46
49
  const ea = exposes.access;
47
50
  const e = exposes.presets;
51
+ // protocol utilities for ZB-IR01
52
+ const protocolUtils = {
53
+ /**
54
+ * XOR checksum algorithm - based on ZB-IR01 protocol 1.2.3
55
+ * Perform XOR operation on all bytes
56
+ */
57
+ calculateXor: (data) => {
58
+ let xorResult = 0;
59
+ for (const byte of data) {
60
+ xorResult ^= byte;
61
+ }
62
+ return xorResult;
63
+ },
64
+ /**
65
+ * Convert string to hex byte array
66
+ * Example: "gree_1" -> [0x67, 0x72, 0x65, 0x65, 0x5f, 0x31]
67
+ */
68
+ buildCommand: (commandByte, byte2, byte3, byte4) => {
69
+ const data = [commandByte, byte2, byte3, byte4, 0x00];
70
+ const xor = protocolUtils.calculateXor(data);
71
+ return Buffer.from([...data, xor]);
72
+ },
73
+ /**
74
+ * kfid is derived from brand and model offset. The offset is 1-based index within the brand's model range.
75
+ * Example: brand = "gree", model = "gree_1", offset = 1 -> kfid = 1
76
+ */
77
+ acBrandModels: {
78
+ gree: { name: "gree", name1: "5qC85Yqb", range: [0, 19] },
79
+ haier: { name: "haier", name1: "5rW35bCU", range: [20, 39] },
80
+ midea: { name: "midea", name1: "576O55qE", range: [40, 59] },
81
+ changhong: { name: "changhong", name1: "6ZW/6Jm5", range: [60, 79] },
82
+ chigo: { name: "chigo", name1: "5b+X6auY", range: [80, 99] },
83
+ aux: { name: "aux", name1: "5aWl5YWL5pav", range: [100, 119] },
84
+ tcl: { name: "tcl", name1: "VENM", range: [120, 139] },
85
+ hisense: { name: "hisense", name1: "5rW35L+h", range: [140, 159] },
86
+ kelon: { name: "kelon", name1: "56eR6b6Z", range: [160, 179] },
87
+ xiaomi: { name: "xiaomi", name1: "5bCP57Gz", range: [180, 189] },
88
+ hitachi: { name: "hitachi", name1: "5pel56uL", range: [190, 209] },
89
+ natpanasonic: { name: "natpanasonic", name1: "5p2+5LiL", range: [210, 235] },
90
+ toshiba: { name: "toshiba", name1: "5Lic6Iqd", range: [236, 245] },
91
+ galanz: { name: "galanz", name1: "5qC85YWw5LuV", range: [246, 259] },
92
+ mitsubishiheavy: { name: "mitsubishiheavy", name1: "5LiJ6I+x6YeN5bel", range: [260, 279] },
93
+ mitsubishielectric: { name: "mitsubishielectric", name1: "5LiJ6I+x55S15py6", range: [280, 299] },
94
+ samsung: { name: "samsung", name1: "5LiJ5pif", range: [300, 319] },
95
+ lg: { name: "lg", name1: "TEc=", range: [320, 329] },
96
+ whirlpool: { name: "whirlpool", name1: "5oOg6ICM5rWm", range: [330, 339] },
97
+ electrolux: { name: "electrolux", name1: "5LyK6I6x5YWL5pav", range: [340, 349] },
98
+ konka: { name: "konka", name1: "5bq35L2z", range: [350, 359] },
99
+ daikin: { name: "daikin", name1: "5aSn6YeR", range: [360, 389] },
100
+ sharp: { name: "sharp", name1: "5aSP5pmu", range: [390, 409] },
101
+ trane: { name: "trane", name1: "54m554G1", range: [410, 419] },
102
+ skyworth: { name: "skyworth", name1: "5Yib57u0", range: [420, 429] },
103
+ york: { name: "york", name1: "57qm5YWL", range: [430, 443] },
104
+ fujitsu: { name: "fujitsu", name1: "5a+M5aOr6YCa", range: [444, 459] },
105
+ shinco: { name: "shinco", name1: "5paw56eR", range: [460, 469] },
106
+ yangzi: { name: "yangzi", name1: "5oms5a2Q", range: [470, 479] },
107
+ mbo: { name: "mbo", name1: "576O5Y2a", range: [480, 489] },
108
+ mcquay: { name: "mcquay", name1: "6bqm5YWL57u05bCU", range: [490, 499] },
109
+ frestech: { name: "frestech", name1: "5paw6aOe", range: [500, 506] },
110
+ xiaoya: { name: "xiaoya", name1: "5bCP6bit", range: [507, 509] },
111
+ tica: { name: "tica", name1: "VElDQQ==", range: [510, 515] },
112
+ sast: { name: "sast", name1: "5YWI56eR", range: [516, 519] },
113
+ littleswan: { name: "littleswan", name1: "5bCP5aSp6bmF", range: [520, 529] },
114
+ sanyo: { name: "sanyo", name1: "5LiJ5rSL", range: [530, 559] },
115
+ royalsta: { name: "royalsta", name1: "6I2j5LqL6L6+", range: [560, 565] },
116
+ rca: { name: "rca", name1: "UkNB", range: [566, 569] },
117
+ lejn: { name: "lejn", name1: "5LmQ5Lqs", range: [570, 573] },
118
+ rowa: { name: "rowa", name1: "5LmQ5Y2O", range: [574, 589] },
119
+ casarte: { name: "casarte", name1: "5Y2h6JCo5bid", range: [590, 595] },
120
+ carrier: { name: "carrier", name1: "5byA5Yip", range: [596, 619] },
121
+ giwee: { name: "giwee", name1: "56ev5b6u", range: [620, 622] },
122
+ jensany: { name: "jensany", name1: "6YeR5LiJ5rSL", range: [623, 629] },
123
+ hualing: { name: "hualing", name1: "5Y2O5YeM", range: [630, 639] },
124
+ gome: { name: "gome", name1: "5Zu9576O", range: [640, 644] },
125
+ gelin: { name: "gelin", name1: "5q2M5p6X", range: [645, 655] },
126
+ chunlan: { name: "chunlan", name1: "5pil5YWw", range: [656, 666] },
127
+ aoli: { name: "aoli", name1: "5aWl5Yqb", range: [667, 669] },
128
+ aucma: { name: "aucma", name1: "5r6z5p+v546b", range: [670, 675] },
129
+ shuanglu: { name: "shuanglu", name1: "5Y+M6bm/", range: [676, 679] },
130
+ jiwu: { name: "jiwu", name1: "6IuP5a6B5p6B54mp", range: [680, 683] },
131
+ leader: { name: "leader", name1: "57uf5biF", range: [684, 688] },
132
+ tomsen: { name: "tomsen", name1: "5rGk5aeG5qOu", range: [689, 693] },
133
+ hyundai: { name: "hyundai", name1: "546w5Luj", range: [694, 699] },
134
+ panda: { name: "panda", name1: "54aK54yr", range: [700, 704] },
135
+ xyingyan: { name: "xyingyan", name1: "5paw6L+O54eV", range: [705, 709] },
136
+ shenhua: { name: "shenhua", name1: "55Sz6Iqx", range: [710, 712] },
137
+ pascmio: { name: "pascmio", name1: "5Lit5p2+", range: [713, 714] },
138
+ yuetu: { name: "yuetu", name1: "5pyI5YWU", range: [715, 719] },
139
+ fzm: { name: "fzm", name1: "5pa557Gz", range: [720, 721] },
140
+ xft: { name: "xft", name1: "6Zuq6I+y54m5", range: [722, 723] },
141
+ boyin: { name: "boyin", name1: "5rOi6Z+z", range: [724, 725] },
142
+ huabao: { name: "huabao", name1: "5Y2O5a6d", range: [726, 729] },
143
+ daewoo: { name: "daewoo", name1: "5aSn5a6H", range: [730, 735] },
144
+ conrowa: { name: "conrowa", name1: "6auY6Lev5Y2O", range: [736, 739] },
145
+ guqiao: { name: "guqiao", name1: "5Y+k5qGl", range: [740, 745] },
146
+ huake: { name: "huake", name1: "5Y2O56eR", range: [746, 749] },
147
+ huamei: { name: "huamei", name1: "5Y2O576O", range: [750, 754] },
148
+ jinsong: { name: "jinsong", name1: "6YeR5p2+", range: [755, 759] },
149
+ risuo: { name: "risuo", name1: "5pel57Si", range: [760, 764] },
150
+ shenbao: { name: "shenbao", name1: "57uF5a6d", range: [765, 769] },
151
+ wanbao: { name: "wanbao", name1: "5LiH5a6d", range: [770, 774] },
152
+ neitian: { name: "neitian", name1: "5YaF55Sw", range: [775, 779] },
153
+ electra: { name: "electra", name1: "5YeJ5a6H", range: [780, 784] },
154
+ bluestar: { name: "bluestar", name1: "Qmx1ZVN0YXI=", range: [785, 789] },
155
+ voltas: { name: "voltas", name1: "Vm9sdGFz", range: [790, 794] },
156
+ akira: { name: "akira", name1: "54ix5a625LmQ", range: [795, 799] },
157
+ panlisen: { name: "panlisen", name1: "UGFubGlzZW4=", range: [800, 801] },
158
+ rasonic: { name: "rasonic", name1: "5LmQ5L+h", range: [802, 809] },
159
+ palcsicons: { name: "palcsicons", name1: "6LWi5p2+", range: [810, 811] },
160
+ itan: { name: "itan", name1: "55uI55Sw", range: [812, 814] },
161
+ whircipol: { name: "whircipol", name1: "V2hpcmNpUG9s", range: [815, 819] },
162
+ changgu: { name: "changgu", name1: "6ZW/6LC3", range: [820, 824] },
163
+ funiki: { name: "funiki", name1: "RnVuaWtp", range: [825, 829] },
164
+ yiruite: { name: "yiruite", name1: "5Lq/55Ge54m5", range: [830, 834] },
165
+ sanzuan: { name: "sanzuan", name1: "5LiJ6ZK7", range: [835, 839] },
166
+ deroxi: { name: "deroxi", name1: "5b635r6z6KW/", range: [840, 844] },
167
+ fedders: { name: "fedders", name1: "6aOe6L6+5LuV", range: [845, 849] },
168
+ paonoca: { name: "paonoca", name1: "6Z+p5Lqa", range: [850, 854] },
169
+ wuq: { name: "wuq", name1: "5LqU5by6", range: [855, 859] },
170
+ sinro: { name: "sinro", name1: "5paw6I+x", range: [860, 864] },
171
+ insignia: { name: "insignia", name1: "5b2x6ZuF", range: [865, 869] },
172
+ elco: { name: "elco", name1: "5a6c56eR", range: [870, 874] },
173
+ vicoo: { name: "vicoo", name1: "VklDT08=", range: [875, 879] },
174
+ gmcc: { name: "gmcc", name1: "R01DQw==", range: [880, 884] },
175
+ xinshiji: { name: "xinshiji", name1: "5paw5LiW57qq", range: [885, 889] },
176
+ bendao: { name: "bendao", name1: "5pys5bKb", range: [890, 894] },
177
+ sumsaxng: { name: "sumsaxng", name1: "5Lic5pa55LiJ5pif", range: [895, 899] },
178
+ jinxing: { name: "jinxing", name1: "6YeR5YW0", range: [900, 904] },
179
+ mitsein: { name: "mitsein", name1: "5byl54m55pav", range: [905, 909] },
180
+ ek: { name: "ek", name1: "RUs=", range: [910, 914] },
181
+ kingair: { name: "kingair", name1: "5Zu956Wl", range: [915, 919] },
182
+ aqua: { name: "aqua", name1: "QVFVQQ==", range: [920, 924] },
183
+ unionaire: { name: "unionaire", name1: "VW5pb24gYWlyZQ==", range: [925, 929] },
184
+ korechi: { name: "korechi", name1: "6Z+p55S1", range: [930, 939] },
185
+ inventor: { name: "inventor", name1: "SW52ZW50b3I=", range: [940, 944] },
186
+ xingfeidq: { name: "xingfeidq", name1: "WElOR0ZFSURR", range: [945, 949] },
187
+ xffh: { name: "xffh", name1: "5paw6aOe6aOe6bi/", range: [950, 954] },
188
+ dizhi: { name: "dizhi", name1: "5bid5pm6", range: [955, 959] },
189
+ winia: { name: "winia", name1: "V0lOSUE=", range: [960, 964] },
190
+ pascmio1: { name: "pascmio1", name1: "5p2+55S1", range: [965, 969] },
191
+ chuangye: { name: "chuangye", name1: "5Yib6YeO", range: [970, 974] },
192
+ shacopu: { name: "shacopu", name1: "5aSP56eR5pmu", range: [975, 979] },
193
+ panwosoci: { name: "panwosoci", name1: "5q2j5p2+5bed", range: [980, 984] },
194
+ shineleaf: { name: "shineleaf", name1: "5aSP56uL", range: [985, 989] },
195
+ panatomic: { name: "panatomic", name1: "UGFuYXRvbWlj", range: [990, 994] },
196
+ paonoca1: { name: "paonoca1", name1: "UGFvbm9jYQ==", range: [995, 999] },
197
+ geling: { name: "geling", name1: "5q2M6I+x", range: [1000, 1004] },
198
+ sharbo: { name: "sharbo", name1: "5aSP5a6d", range: [1005, 1009] },
199
+ hangtiandianqi: { name: "hangtiandianqi", name1: "6Iiq5aSp55S15Zmo", range: [1010, 1014] },
200
+ dongbao: { name: "dongbao", name1: "5Lic5a6d", range: [1015, 1019] },
201
+ toyo: { name: "toyo", name1: "5Lic5rSL", range: [1020, 1024] },
202
+ shangling: { name: "shangling", name1: "5LiK6I+x", range: [1025, 1029] },
203
+ teco: { name: "teco", name1: "VEVDTw==", range: [1030, 1034] },
204
+ airwell: { name: "airwell", name1: "5qyn5aiB5bCU", range: [1035, 1039] },
205
+ combine: { name: "combine", name1: "5bq35ouc5oGp", range: [1040, 1042] },
206
+ feige: { name: "feige", name1: "6aOe5q2M", range: [1043, 1045] },
207
+ partsoinc: { name: "partsoinc", name1: "UGFydHNvaW5j", range: [1046, 1049] },
208
+ nikai: { name: "nikai", name1: "TmlLYWk=", range: [1050, 1052] },
209
+ mitsubishiheavy_haier: { name: "mitsubishiheavy_haier", name1: "5LiJ6I+x6YeN5bel5rW35bCU", range: [1053, 1055] },
210
+ voton: { name: "voton", name1: "5rKD6aG/", range: [1056, 1059] },
211
+ tadiran: { name: "tadiran", name1: "5aGU6L+q5YWw", range: [1060, 1061] },
212
+ lexin: { name: "lexin", name1: "5LmQ5paw", range: [1062, 1063] },
213
+ nuolin: { name: "nuolin", name1: "6K+65p6X", range: [1064, 1066] },
214
+ xiamenyilin: { name: "xiamenyilin", name1: "5Y6m6Zeo5Lq/5p6X", range: [1067, 1069] },
215
+ horshron: { name: "horshron", name1: "6Jm55aOw", range: [1070, 1071] },
216
+ levante: { name: "levante", name1: "TEVWQU5URQ==", range: [1072, 1073] },
217
+ guanyuan: { name: "guanyuan", name1: "5Yag6L+c", range: [1074, 1075] },
218
+ lilytech: { name: "lilytech", name1: "55m+5ZCI", range: [1076, 1078] },
219
+ sunny: { name: "sunny", name1: "6Ziz5YWJ", range: [1079, 1080] },
220
+ viomi: { name: "viomi", name1: "5LqR57Gz", range: [1081, 1082] },
221
+ soyea: { name: "soyea", name1: "57Si5LyK", range: [1082, 1085] },
222
+ serene: { name: "serene", name1: "6KW/5Ya3", range: [1086, 1088] },
223
+ cheblo: { name: "cheblo", name1: "5qix6Iqx55S15Zmo", range: [1089, 1094] },
224
+ smartmi: { name: "smartmi", name1: "5pm657Gz", range: [1095, 1099] },
225
+ bosch: { name: "bosch", name1: "5Y2a5LiW", range: [1100, 1104] },
226
+ partmusic: { name: "partmusic", name1: "5pel5p2+", range: [1105, 1109] },
227
+ funiki1: { name: "funiki1", name1: "RlVOSUtJ", range: [1110, 1114] },
228
+ hilaire: { name: "hilaire", name1: "6Zuq6I6x5bCU", range: [1115, 1116] },
229
+ hkc: { name: "hkc", name1: "5oOg56eR", range: [1117, 1119] },
230
+ bluestar1: { name: "bluestar1", name1: "Qmx1ZSBTdGFy", range: [1120, 1125] },
231
+ teco1: { name: "teco1", name1: "5Lic5YWD", range: [1126, 1128] },
232
+ paohanic: { name: "paohanic", name1: "5p2+5bed", range: [1129, 1131] },
233
+ nintaus: { name: "nintaus", name1: "6YeR5q2j", range: [1132, 1136] },
234
+ olimpiasplendid: { name: "olimpiasplendid", name1: "5qyn6I+x5a6d", range: [1137, 1139] },
235
+ philips: { name: "philips", name1: "6aOe5Yip5rWm", range: [1140, 1145] },
236
+ fortress: { name: "fortress", name1: "5Liw5rO9", range: [1146, 1147] },
237
+ meilihongzuan: { name: "meilihongzuan", name1: "TUVJTElIT05HWlVBTg==", range: [1148, 1149] },
238
+ tica1: { name: "tica1", name1: "5aSp5Yqg", range: [1150, 1154] },
239
+ junda: { name: "junda", name1: "6aqP5a6J6L6+", range: [1155, 1159] },
240
+ electra1: { name: "electra1", name1: "5Lul6I6x54m5", range: [1160, 1162] },
241
+ mingyi: { name: "mingyi", name1: "5ZCN5Lq/", range: [1163, 1165] },
242
+ ifb: { name: "ifb", name1: "SUZC", range: [1166, 1167] },
243
+ kingsfin: { name: "kingsfin", name1: "S2luZ3NmaW4=", range: [1168, 1169] },
244
+ onida: { name: "onida", name1: "T25pZGE=", range: [1170, 1172] },
245
+ suittc: { name: "suittc", name1: "6ZGr5rqQ", range: [1173, 1175] },
246
+ colmo: { name: "colmo", name1: "Q09MTU8=", range: [1176, 1177] },
247
+ duozuanhua: { name: "duozuanhua", name1: "5aSa6ZK76Iqx", range: [1178, 1179] },
248
+ huikang: { name: "huikang", name1: "5oOg5bq3", range: [1180, 1181] },
249
+ gibson: { name: "gibson", name1: "5ZCJ5pmu55Sf", range: [1182, 1189] },
250
+ first: { name: "first", name1: "RklSU1Q=", range: [1190, 1191] },
251
+ jhs: { name: "jhs", name1: "6YeR6bi/55ub", range: [1192, 1193] },
252
+ meiling: { name: "meiling", name1: "576O6I+x", range: [1194, 1197] },
253
+ maxe: { name: "maxe", name1: "5LiH5aOr55uK", range: [1198, 1201] },
254
+ skg: { name: "skg", name1: "U0tH", range: [1202, 1203] },
255
+ acl: { name: "acl", name1: "5Zac5LqL5p2l", range: [1204, 1205] },
256
+ tongyi: { name: "tongyi", name1: "5ZCM55uK", range: [1206, 1207] },
257
+ tianyuan: { name: "tianyuan", name1: "5aSp5YWD", range: [1208, 1209] },
258
+ tianhui: { name: "tianhui", name1: "5aSp5rGH6ZuG5oiQ", range: [1210, 1211] },
259
+ tianjin: { name: "tianjin", name1: "5aSp5rSl", range: [1212, 1213] },
260
+ tair: { name: "tair", name1: "VGFpcg==", range: [1214, 1215] },
261
+ macro: { name: "macro", name1: "5LiH5a625LmQ", range: [1216, 1219] },
262
+ xinle: { name: "xinle", name1: "5paw5LmQ", range: [1220, 1223] },
263
+ xinhuabao: { name: "xinhuabao", name1: "5paw5Y2O5a6d", range: [1224, 1225] },
264
+ xiongdi: { name: "xiongdi", name1: "5YWE5byf", range: [1226, 1227] },
265
+ benwin: { name: "benwin", name1: "5a6+57u0", range: [1228, 1229] },
266
+ sanshui: { name: "sanshui", name1: "5bGx5rC0", range: [1230, 1231] },
267
+ phlgco: { name: "phlgco", name1: "6aOe5q2M5Lit5Zu9", range: [1232, 1233] },
268
+ linkcool: { name: "linkcool", name1: "6bqf6YW3", range: [1234, 1235] },
269
+ nec: { name: "nec", name1: "TkVD", range: [1236, 1238] },
270
+ lanbo: { name: "lanbo", name1: "6JOd5rOi", range: [1239, 1249] },
271
+ changling: { name: "changling", name1: "6ZW/5bKt", range: [1250, 1259] },
272
+ jinli: { name: "jinli", name1: "6YeR56uL", range: [1260, 1261] },
273
+ huifeng: { name: "huifeng", name1: "5rGH5Liw", range: [1262, 1265] },
274
+ huanghe: { name: "huanghe", name1: "6buE5rKz", range: [1266, 1267] },
275
+ hailin: { name: "hailin", name1: "5rW35p6X", range: [1268, 1269] },
276
+ cih: { name: "cih", name1: "Q0lI", range: [1270, 1271] },
277
+ meico: { name: "meico", name1: "576O5q2M", range: [1272, 1273] },
278
+ museen: { name: "museen", name1: "5oWV5qOu", range: [1274, 1275] },
279
+ millink: { name: "millink", name1: "57Gz5p6X5a6i", range: [1276, 1277] },
280
+ mistral: { name: "mistral", name1: "5ZCN5rCP6aOO", range: [1278, 1279] },
281
+ mljd: { name: "mljd", name1: "6bqm5YuS", range: [1280, 1281] },
282
+ bole: { name: "bole", name1: "5rOi5LmQ", range: [1282, 1285] },
283
+ sacon: { name: "sacon", name1: "5biF5bq3", range: [1286, 1290] },
284
+ weili: { name: "weili", name1: "5aiB5Yqb", range: [1291, 1295] },
285
+ sova: { name: "sova", name1: "57Si5Y2O", range: [1296, 1297] },
286
+ zymbo: { name: "zymbo", name1: "5rex5a6d", range: [1298, 1299] },
287
+ weiteli: { name: "weiteli", name1: "5aiB54m55Yip", range: [1300, 1301] },
288
+ kenwood: { name: "kenwood", name1: "5YGl5LyN", range: [1302, 1304] },
289
+ gee: { name: "gee", name1: "5byY56uL", range: [1305, 1306] },
290
+ hneyrea: { name: "hneyrea", name1: "6Jm556uL", range: [1307, 1308] },
291
+ langge: { name: "langge", name1: "5pyX5q2M", range: [1309, 1313] },
292
+ oudian: { name: "oudian", name1: "5qyn5YW4", range: [1314, 1315] },
293
+ pgtess: { name: "pgtess", name1: "5ZOB5qC854m55pav", range: [1316, 1317] },
294
+ panwosoci1: { name: "panwosoci1", name1: "UGFud29zb2Np", range: [1318, 1319] },
295
+ partsonic: { name: "partsonic", name1: "5rex5Zyz5p2+5LiL", range: [1320, 1321] },
296
+ twinswan: { name: "twinswan", name1: "5Y+M5Yek", range: [1322, 1323] },
297
+ shengsong: { name: "shengsong", name1: "5rex5p2+", range: [1324, 1325] },
298
+ pamosautc: { name: "pamosautc", name1: "UGFtb3NhdXRj", range: [1326, 1327] },
299
+ caixing: { name: "caixing", name1: "5b2p5pif", range: [1328, 1329] },
300
+ cmv: { name: "cmv", name1: "Q01W", range: [1330, 1331] },
301
+ dongxia: { name: "dongxia", name1: "5Yas5aSP", range: [1332, 1333] },
302
+ guangda: { name: "guangda", name1: "5YWJ5aSn", range: [1334, 1335] },
303
+ geyang: { name: "geyang", name1: "5qC86Ziz", range: [1336, 1337] },
304
+ gchv: { name: "gchv", name1: "R0NIVg==", range: [1338, 1339] },
305
+ huayi: { name: "huayi", name1: "5Y2O5oSP", range: [1340, 1342] },
306
+ sunburg: { name: "sunburg", name1: "5qOu5a6d", range: [1343, 1344] },
307
+ boerka: { name: "boerka", name1: "5rOi5bCU5Y2h", range: [1345, 1346] },
308
+ aite: { name: "aite", name1: "54ix54m5", range: [1347, 1348] },
309
+ aidelong: { name: "aidelong", name1: "6Im+5b636b6Z", range: [1349, 1350] },
310
+ dajinxing: { name: "dajinxing", name1: "5aSn6YeR5pif", range: [1351, 1352] },
311
+ dometic: { name: "dometic", name1: "5aSa576O6L6+", range: [1353, 1354] },
312
+ museen1: { name: "museen1", name1: "5oWV5qOu", range: [1274, 1275] },
313
+ },
314
+ /**
315
+ * get kfid range for a given brand. Returns [start, end] or null if brand not found.
316
+ */
317
+ getBrandKfidRange: (brand) => {
318
+ const brandKey = brand.toLowerCase();
319
+ const brandData = protocolUtils.acBrandModels[brandKey];
320
+ return brandData ? brandData.range : null;
321
+ },
322
+ /**
323
+ * get kfid range for a given brand. Returns [start, end] or null if brand not found.
324
+ * Example: brand = "gree" -> returns [0, 19]
325
+ */
326
+ getKfidFromOffset: (brand, offset) => {
327
+ const range = protocolUtils.getBrandKfidRange(brand);
328
+ if (!range) {
329
+ return null;
330
+ }
331
+ const [start, end] = range;
332
+ const kfid = start + (offset - 1);
333
+ if (kfid < start || kfid > end) {
334
+ return null;
335
+ }
336
+ return kfid;
337
+ },
338
+ /**
339
+ * get brand and offset from kfid. Returns {brand, offset} or null if kfid not in any brand range.
340
+ * Example: kfid = 5 -> returns {brand: "gree", offset: 6}
341
+ */
342
+ getBrandFormattedEnums: () => {
343
+ const enums = [];
344
+ for (const [brand, data] of Object.entries(protocolUtils.acBrandModels)) {
345
+ const [start, end] = data.range;
346
+ //const offset1Based = (index: number): number => index - 0x0000 + 1;
347
+ //const rangeStr = `${offset1Based(start)}-${offset1Based(end)}`;
348
+ const decoded = Buffer.from(data.name1, "base64").toString("utf-8");
349
+ enums.push(`${data.name}(${decoded})(${start}-${end})`);
350
+ void brand; // to satisfy unused variable linting, as we only need the data.name for the enum display
351
+ }
352
+ return enums;
353
+ },
354
+ /**
355
+ * AC button mapping - based on protocol table 12
356
+ */
357
+ acButtonMap: {
358
+ power: { buttonId: 0x00, values: { on: 0x00, off: 0x01 } },
359
+ mode: { buttonId: 0x01, values: { auto: 0x00, cooling: 0x01, dehumidification: 0x02, air_supply: 0x03, heating: 0x04 } },
360
+ temperature: { buttonId: 0x02, baseValue: 0x00 }, // 16℃ is 0x00, 17℃ is 0x01,max is 32℃ is 0x10
361
+ wind_speed: { buttonId: 0x04, values: { auto: 0x00, low: 0x01, medium: 0x02, high: 0x03, strong: 0x04 } },
362
+ swing: { buttonId: 0x05, values: { on: 0x00, off: 0x01 } },
363
+ },
364
+ };
48
365
  const fzLocal = {
49
366
  easyiot_ir_recv_command: {
50
367
  cluster: "seTunneling",
@@ -117,6 +434,140 @@ const tzLocal = {
117
434
  logger_1.logger.debug("Sending IR command success.", NS);
118
435
  },
119
436
  },
437
+ /**
438
+ * send AC power command
439
+ * value: "on" or "off"
440
+ */
441
+ easyiot_ir_ac_power: {
442
+ key: ["ac_power"],
443
+ convertSet: async (entity, key, value, meta) => {
444
+ if (!["on", "off"].includes(value)) {
445
+ throw new Error("ac_power must be 'on' or 'off'");
446
+ }
447
+ // deviceType 0x01 = AC
448
+ const deviceType = 0x01;
449
+ const buttonId = protocolUtils.acButtonMap.power.buttonId;
450
+ const powerValue = value === "on" ? 0x00 : 0x01;
451
+ const command = protocolUtils.buildCommand(0x86, deviceType, buttonId, powerValue);
452
+ logger_1.logger.debug(`Sending AC power command: ${value}`, NS);
453
+ await entity.command("seTunneling", "transferData", {
454
+ tunnelId: 0x0000,
455
+ data: command,
456
+ }, { disableDefaultResponse: true });
457
+ return { state: { ac_power: value } };
458
+ },
459
+ },
460
+ /**
461
+ * set AC temperature
462
+ * temperature range: 16℃ (0x00) - 32℃ (0x10)
463
+ */
464
+ easyiot_ir_ac_temperature: {
465
+ key: ["ac_temperature"],
466
+ convertSet: async (entity, key, value, meta) => {
467
+ const temp = value;
468
+ if (!Number.isInteger(temp) || temp < 16 || temp > 32) {
469
+ throw new Error("ac_temperature must be 16-32");
470
+ }
471
+ const deviceType = 0x01;
472
+ const buttonId = 0x02;
473
+ const tempValue = temp - 16; // 16℃ is 0x00, 17℃ is 0x01
474
+ const command = protocolUtils.buildCommand(0x86, deviceType, buttonId, tempValue);
475
+ logger_1.logger.debug(`Sending AC temperature command: ${temp}℃`, NS);
476
+ await entity.command("seTunneling", "transferData", {
477
+ tunnelId: 0x0000,
478
+ data: command,
479
+ }, { disableDefaultResponse: true });
480
+ return { state: { ac_temperature: temp } };
481
+ },
482
+ },
483
+ /**
484
+ * set AC mode
485
+ * mode range: auto(0x00), cooling(0x01), dehumidification(0x02), air_supply(0x03), heating(0x04)
486
+ */
487
+ easyiot_ir_ac_mode: {
488
+ key: ["ac_mode"],
489
+ convertSet: async (entity, key, value, meta) => {
490
+ const modeMap = {
491
+ auto: 0x00,
492
+ cooling: 0x01,
493
+ dehumidification: 0x02,
494
+ air_supply: 0x03,
495
+ heating: 0x04,
496
+ };
497
+ if (!(value in modeMap)) {
498
+ throw new Error(`ac_mode must be one of: ${Object.keys(modeMap).join(", ")}`);
499
+ }
500
+ const deviceType = 0x01;
501
+ const buttonId = protocolUtils.acButtonMap.mode.buttonId;
502
+ const modeValue = modeMap[value];
503
+ const command = protocolUtils.buildCommand(0x86, deviceType, buttonId, modeValue);
504
+ logger_1.logger.debug(`Sending AC mode command: ${value}`, NS);
505
+ await entity.command("seTunneling", "transferData", {
506
+ tunnelId: 0x0000,
507
+ data: command,
508
+ }, { disableDefaultResponse: true });
509
+ return { state: { ac_mode: value } };
510
+ },
511
+ },
512
+ easyiot_ir_ac_wind_speed: {
513
+ key: ["ac_wind_speed"],
514
+ convertSet: async (entity, key, value, meta) => {
515
+ const windMap = {
516
+ auto: 0x00,
517
+ low: 0x01,
518
+ medium: 0x02,
519
+ high: 0x03,
520
+ strong: 0x04,
521
+ };
522
+ if (!(value in windMap)) {
523
+ throw new Error(`ac_wind_speed must be one of: ${Object.keys(windMap).join(", ")}`);
524
+ }
525
+ const deviceType = 0x01;
526
+ const buttonId = protocolUtils.acButtonMap.wind_speed.buttonId;
527
+ const windValue = windMap[value];
528
+ const command = protocolUtils.buildCommand(0x86, deviceType, buttonId, windValue);
529
+ logger_1.logger.debug(`Sending AC wind speed command: ${value}`, NS);
530
+ await entity.command("seTunneling", "transferData", {
531
+ tunnelId: 0x0000,
532
+ data: command,
533
+ }, { disableDefaultResponse: true });
534
+ return { state: { ac_wind_speed: value } };
535
+ },
536
+ },
537
+ easyiot_ir_ac_kfid_offset: {
538
+ key: ["ac_kfid_offset_model"],
539
+ convertSet: async (entity, key, value, meta) => {
540
+ const payload = value;
541
+ const kfid = payload.ac_kfid_offset;
542
+ const brandStr = payload.ac_brand;
543
+ const brandMatch = brandStr.match(/^[a-zA-Z]+/);
544
+ const brand = brandMatch[0] ? brandMatch[0].toLowerCase() : undefined;
545
+ logger_1.logger.debug(`AC brand set to ${brand} brandMatch: ${brandMatch}, kfid: ${kfid}`, NS);
546
+ if (!Object.keys(protocolUtils.acBrandModels).includes(brand)) {
547
+ throw new Error(`ac_brand must be one of: ${Object.keys(protocolUtils.acBrandModels).join(", ")}`);
548
+ }
549
+ //get the kfid range for the current brand
550
+ const range = protocolUtils.getBrandKfidRange(brand);
551
+ if (!range) {
552
+ return null;
553
+ }
554
+ const [start, end] = range;
555
+ logger_1.logger.debug(`AC brand set to ${brand}, kfid: ${kfid}`, NS);
556
+ if (kfid < start || kfid > end) {
557
+ throw new Error(`ac_kfid_offset ${kfid} is out of range for brand ${brand} (valid range: ${start}-${end})`);
558
+ }
559
+ const deviceType = 0x01;
560
+ const kfid_l = kfid & 0xff;
561
+ const kfid_h = (kfid >> 8) & 0xff;
562
+ const command = protocolUtils.buildCommand(0x80, deviceType, kfid_h, kfid_l);
563
+ logger_1.logger.debug(`Sending AC kfid offset command: ${kfid}`, NS);
564
+ await entity.command("seTunneling", "transferData", {
565
+ tunnelId: 0x0000,
566
+ data: command,
567
+ }, { disableDefaultResponse: true });
568
+ return { state: { kfid_offset: value } };
569
+ },
570
+ },
120
571
  easyiot_tts_send_command: {
121
572
  key: ["send_tts"],
122
573
  convertSet: async (entity, key, value, meta) => {
@@ -176,6 +627,169 @@ const tzLocal = {
176
627
  logger_1.logger.debug("Sending IR command success.", NS);
177
628
  },
178
629
  },
630
+ easyiot_zl01_open_door: {
631
+ key: ["unlock_door"],
632
+ convertSet: async (entity, key, value, meta) => {
633
+ (0, utils_1.assertString)(value, "PIN code must be a string");
634
+ const length = Buffer.from([value.toString().length]);
635
+ const pincode = Buffer.from(value.toString(), "utf-8");
636
+ const data = Buffer.concat([length, pincode]);
637
+ await entity.command("closuresDoorLock", "unlockDoor", { pincodevalue: data }, { disableDefaultResponse: true });
638
+ },
639
+ },
640
+ easyiot_zl01_open_door_with_timeout: {
641
+ key: ["unlock_door_with_timeout"],
642
+ convertSet: async (entity, key, value, meta) => {
643
+ (0, utils_1.assertObject)(value, "PIN code must be an object");
644
+ const payload = value;
645
+ logger_1.logger.debug(`Sending pin code: ${payload.pin_code} with timeout: ${payload.timeout} seconds`, NS);
646
+ const length = Buffer.from([payload.pin_code.length]);
647
+ const pincodeBuffer = Buffer.from(payload.pin_code, "utf-8");
648
+ const data = Buffer.concat([length, pincodeBuffer]);
649
+ await entity.command("closuresDoorLock", "unlockDoorWithTimeout", {
650
+ timeout: payload.timeout,
651
+ pincodevalue: data,
652
+ }, { disableDefaultResponse: true });
653
+ },
654
+ },
655
+ easyiot_zl01_add_ephemeral_pin: {
656
+ key: ["ephemeral_pin_code"],
657
+ convertSet: async (entity, key, value, meta) => {
658
+ (0, utils_1.assertObject)(value, "ephemeral_pin_code requires an object with start_time, end_time, userid, valid_times, and pincode");
659
+ const payload = value;
660
+ // Validate required parameters
661
+ if (typeof payload.start_time !== "number") {
662
+ throw new Error("start_time must be a number (UNIX timestamp in seconds)");
663
+ }
664
+ if (typeof payload.end_time !== "number") {
665
+ throw new Error("end_time must be a number (UNIX timestamp in seconds)");
666
+ }
667
+ if (typeof payload.userid !== "number") {
668
+ throw new Error("userid must be a number (0-65535)");
669
+ }
670
+ if (typeof payload.valid_times !== "number") {
671
+ throw new Error("valid_times must be a number (0-255)");
672
+ }
673
+ if (typeof payload.pincode !== "string") {
674
+ throw new Error("pincode must be a string");
675
+ }
676
+ logger_1.logger.debug(`Adding ephemeral pin - startTime: ${payload.start_time}, endTime: ${payload.end_time}, userid: ${payload.userid}, validTimes: ${payload.valid_times}, pincode: ${payload.pincode}`, NS);
677
+ // Convert UNIX timestamps to Zigbee 2000-based local time seconds
678
+ // Use UTC (offset 0) as default timezone for temporary passwords
679
+ const startTimeZigbee = (0, sonoff_1.utcToDeviceLocal2000Seconds)(payload.start_time, 0);
680
+ const endTimeZigbee = (0, sonoff_1.utcToDeviceLocal2000Seconds)(payload.end_time, 0);
681
+ // Convert pincode string to buffer
682
+ const pincodeBuffer = Buffer.from(payload.pincode, "utf-8");
683
+ const commandPayload = {
684
+ startTime: startTimeZigbee,
685
+ endTime: endTimeZigbee,
686
+ userid: payload.userid,
687
+ validTimes: payload.valid_times,
688
+ pincodevalue: pincodeBuffer,
689
+ };
690
+ await entity.command("closuresDoorLock", "setEphemeralPin", commandPayload, {
691
+ disableDefaultResponse: true,
692
+ });
693
+ },
694
+ },
695
+ easyiot_zl01_clear_ephemeral_pin: {
696
+ key: ["ephemeral_clear_pin_code"],
697
+ convertSet: async (entity, key, value, meta) => {
698
+ (0, utils_1.assertObject)(value, "ephemeral_clear_pin_code requires an object with userid");
699
+ const payload = value;
700
+ // Validate required parameter
701
+ if (typeof payload.userid !== "number") {
702
+ throw new Error("userid must be a number (0-65535)");
703
+ }
704
+ await entity.command("closuresDoorLock", "clearEphemeralPin", {
705
+ userid: payload.userid,
706
+ }, {
707
+ disableDefaultResponse: true,
708
+ });
709
+ },
710
+ },
711
+ easyiot_zl01_clear_all_ephemeral_pin: {
712
+ key: ["ephemeral_clear_all_pin_code"],
713
+ convertSet: async (entity, key, value, meta) => {
714
+ await entity.command("closuresDoorLock", "clearAllEphemeralPins", {}, { disableDefaultResponse: true });
715
+ },
716
+ },
717
+ /**
718
+ * Configure RS485 serial port parameters using the data point protocol.
719
+ * Each setting is an independent data point command, concatenated and sent in one tunneling transfer.
720
+ *
721
+ * Baud rate (0x0201): [01 02 04 23 <uint32-LE>]
722
+ * Parity (0x0205): [05 02 01 30 <0=NONE|1=EVEN|2=ODD>]
723
+ * Stop bits (0x0209): [09 02 01 30 <0=1bit|1=1.5bits|2=2bits>]
724
+ *
725
+ * TunnelID must be 0x0001 per the data-point tunneling protocol.
726
+ */
727
+ easyiot_rs485_set_config: {
728
+ key: ["rs485_config"],
729
+ convertSet: async (entity, key, value, meta) => {
730
+ (0, utils_1.assertObject)(value, "rs485_config must be an object");
731
+ const payload = value;
732
+ const commands = [];
733
+ // --- Baud rate: 0x0201, data type uint32 (0x23), little-endian ---
734
+ if (payload.baud_rate !== undefined) {
735
+ const baudRateMap = {
736
+ "1200": 1200,
737
+ "2400": 2400,
738
+ "4800": 4800,
739
+ "9600": 9600,
740
+ "19200": 19200,
741
+ "38400": 38400,
742
+ "57600": 57600,
743
+ "115200": 115200,
744
+ "230400": 230400,
745
+ "460800": 460800,
746
+ "921600": 921600,
747
+ };
748
+ const baudRate = String(payload.baud_rate);
749
+ if (!(baudRate in baudRateMap)) {
750
+ throw new Error(`baud_rate must be one of: ${Object.keys(baudRateMap).join(", ")}`);
751
+ }
752
+ const buf = Buffer.alloc(8);
753
+ buf[0] = 0x01; // command low byte (0x0201)
754
+ buf[1] = 0x02; // command high byte
755
+ buf[2] = 0x04; // data length
756
+ buf[3] = 0x23; // data type: uint32
757
+ buf.writeUInt32LE(baudRateMap[baudRate], 4);
758
+ commands.push(buf);
759
+ }
760
+ // --- Parity: 0x0205, data type enum8 (0x30) ---
761
+ // 0 = NONE, 1 = EVEN, 2 = ODD
762
+ if (payload.parity !== undefined) {
763
+ const parityMap = { none: 0x00, even: 0x01, odd: 0x02 };
764
+ const parity = String(payload.parity);
765
+ if (!(parity in parityMap)) {
766
+ throw new Error(`parity must be one of: ${Object.keys(parityMap).join(", ")}`);
767
+ }
768
+ commands.push(Buffer.from([0x05, 0x02, 0x01, 0x30, parityMap[parity]]));
769
+ }
770
+ // --- Stop bits: 0x0209, data type enum8 (0x30) ---
771
+ // 0 = 1 stop bit, 1 = 1.5 stop bits, 2 = 2 stop bits
772
+ if (payload.stop_bits !== undefined) {
773
+ const stopBitsMap = { "1": 0x00, "1.5": 0x01, "2": 0x02 };
774
+ const stopBits = String(payload.stop_bits);
775
+ if (!(stopBits in stopBitsMap)) {
776
+ throw new Error(`stop_bits must be one of: ${Object.keys(stopBitsMap).join(", ")}`);
777
+ }
778
+ commands.push(Buffer.from([0x09, 0x02, 0x01, 0x30, stopBitsMap[stopBits]]));
779
+ }
780
+ if (commands.length === 0) {
781
+ throw new Error("At least one of baud_rate, parity, or stop_bits must be specified");
782
+ }
783
+ const data = Buffer.concat(commands);
784
+ logger_1.logger.debug(`Sending RS485 config (hex): ${data.toString("hex")}`, NS);
785
+ await entity.command("seTunneling", "transferData", {
786
+ tunnelId: 0x0001,
787
+ data,
788
+ }, { disableDefaultResponse: true });
789
+ logger_1.logger.debug("Sending RS485 config success.", NS);
790
+ return { state: { rs485_config: payload } };
791
+ },
792
+ },
179
793
  };
180
794
  exports.definitions = [
181
795
  {
@@ -184,11 +798,47 @@ exports.definitions = [
184
798
  vendor: "easyiot",
185
799
  description: "Infrared remote control equipped with local code library,",
186
800
  fromZigbee: [fzLocal.easyiot_ir_recv_command],
187
- toZigbee: [tzLocal.easyiot_ir_send_command],
188
- exposes: [
189
- e.text("last_received_command", ea.STATE).withDescription("Received infrared control command"),
190
- e.text("send_command", ea.SET).withDescription("Send infrared control command"),
801
+ toZigbee: [
802
+ tzLocal.easyiot_ir_send_command,
803
+ tzLocal.easyiot_ir_ac_power,
804
+ tzLocal.easyiot_ir_ac_temperature,
805
+ tzLocal.easyiot_ir_ac_mode,
806
+ tzLocal.easyiot_ir_ac_wind_speed,
807
+ tzLocal.easyiot_ir_ac_kfid_offset,
191
808
  ],
809
+ exposes: (device, options) => {
810
+ return [
811
+ // recved IR command code
812
+ e.text("last_received_command", ea.STATE).withDescription("Last received IR command code"),
813
+ e
814
+ .text("send_command", ea.SET)
815
+ .withDescription("Send infrared control command, This is a low-level interface. You can refer to the protocol documentation to implement more features."),
816
+ // KFID offset for AC models that require it. The offset is based on the brand's KFID rang
817
+ e
818
+ .composite("ac_kfid_offset_model", "ac_kfid_offset_model", ea.SET)
819
+ .withDescription("Here you can create a new air conditioner remote control. First, select the brand of your air conditioner, then enter the remote control number within the indicated range in Ac kfid offset and click Apply. Finally, try turning on the air conditioner. If it fails, try the next number until it works.")
820
+ .withFeature(e.enum("ac_brand", ea.SET, protocolUtils.getBrandFormattedEnums()).withDescription("AC brand - choose a brand first"))
821
+ .withFeature(e
822
+ .numeric("ac_kfid_offset", ea.SET)
823
+ .withDescription("For example, if you select the first option, Gree, you can enter any number between 0 and 19, and then click Apply.")),
824
+ // (Power on/off)
825
+ e.binary("ac_power", ea.ALL, "on", "off").withDescription("AC power "),
826
+ // (Operation mode)
827
+ e
828
+ .enum("ac_mode", ea.SET, ["auto", "cooling", "dehumidification", "air_supply", "heating"])
829
+ .withDescription("AC mode: auto/cooling/dehumidification/air_supply/heating"),
830
+ // (Temperature setting: 16-32°C)
831
+ e
832
+ .numeric("ac_temperature", ea.SET)
833
+ .withValueMin(16)
834
+ .withValueMax(32)
835
+ .withValueStep(1)
836
+ .withUnit("°C")
837
+ .withDescription("AC temperature setting: 16-32°C"),
838
+ // (Fan speed)
839
+ e.enum("ac_wind_speed", ea.SET, ["auto", "low", "medium", "high", "strong"]).withDescription("AC fan speed"),
840
+ ];
841
+ },
192
842
  },
193
843
  {
194
844
  fingerprint: [{ modelID: "ZB-TTS01", manufacturerName: "easyiot" }],
@@ -221,10 +871,31 @@ exports.definitions = [
221
871
  vendor: "easyiot",
222
872
  description: "Zigbee to RS485 controller",
223
873
  fromZigbee: [fzLocal.easyiot_ir_recv_command],
224
- toZigbee: [tzLocal.easyiot_ir_send_command],
874
+ toZigbee: [tzLocal.easyiot_ir_send_command, tzLocal.easyiot_rs485_set_config],
875
+ ota: true,
225
876
  exposes: [
226
877
  e.text("last_received_command", ea.STATE).withDescription("Received data"),
227
878
  e.text("send_command", ea.SET).withDescription("Send data"),
879
+ e
880
+ .composite("rs485_config", "rs485_config", ea.SET)
881
+ .withDescription("RS485 serial port configuration")
882
+ .withFeature(e
883
+ .enum("baud_rate", ea.SET, [
884
+ "1200",
885
+ "2400",
886
+ "4800",
887
+ "9600",
888
+ "19200",
889
+ "38400",
890
+ "57600",
891
+ "115200",
892
+ "230400",
893
+ "460800",
894
+ "921600",
895
+ ])
896
+ .withDescription("Baud rate (bps)"))
897
+ .withFeature(e.enum("parity", ea.SET, ["none", "even", "odd"]).withDescription("Parity (none / even / odd)"))
898
+ .withFeature(e.enum("stop_bits", ea.SET, ["1", "1.5", "2"]).withDescription("Stop bits (1 / 1.5 / 2)")),
228
899
  ],
229
900
  },
230
901
  {
@@ -355,5 +1026,96 @@ exports.definitions = [
355
1026
  m.onOff({ endpointNames: ["l1", "l2", "l3", "l4", "l5", "l6", "l7", "l8"], configureReporting: false, powerOnBehavior: false }),
356
1027
  ],
357
1028
  },
1029
+ {
1030
+ fingerprint: [{ modelID: "ZB-ZL01", manufacturerName: "easyiot" }],
1031
+ model: "ZB-ZL01",
1032
+ vendor: "easyiot",
1033
+ description: "Smart door lock",
1034
+ fromZigbee: [],
1035
+ toZigbee: [
1036
+ tzLocal.easyiot_zl01_open_door,
1037
+ tzLocal.easyiot_zl01_open_door_with_timeout,
1038
+ tzLocal.easyiot_zl01_add_ephemeral_pin,
1039
+ tzLocal.easyiot_zl01_clear_ephemeral_pin,
1040
+ tzLocal.easyiot_zl01_clear_all_ephemeral_pin,
1041
+ ],
1042
+ extend: [
1043
+ m.deviceAddCustomCluster("closuresDoorLock", {
1044
+ name: "customClusterDoorLock",
1045
+ ID: 0x0101,
1046
+ attributes: {},
1047
+ commands: {
1048
+ unlockDoorWithTimeout: {
1049
+ ID: 0x03,
1050
+ name: "unlockDoorWithTimeout",
1051
+ response: 3,
1052
+ parameters: [
1053
+ { name: "timeout", type: zigbee_herdsman_1.Zcl.DataType.UINT32 },
1054
+ { name: "pincodevalue", type: zigbee_herdsman_1.Zcl.DataType.OCTET_STR },
1055
+ ],
1056
+ },
1057
+ setEphemeralPin: {
1058
+ ID: 0xb6,
1059
+ name: "setEphemeralPin",
1060
+ response: 182,
1061
+ parameters: [
1062
+ { name: "startTime", type: zigbee_herdsman_1.Zcl.DataType.UINT32 },
1063
+ { name: "endTime", type: zigbee_herdsman_1.Zcl.DataType.UINT32 },
1064
+ { name: "userid", type: zigbee_herdsman_1.Zcl.DataType.UINT16 },
1065
+ { name: "validTimes", type: zigbee_herdsman_1.Zcl.DataType.UINT8 },
1066
+ { name: "pincodevalue", type: zigbee_herdsman_1.Zcl.DataType.OCTET_STR },
1067
+ ],
1068
+ },
1069
+ clearEphemeralPin: {
1070
+ ID: 0xb8,
1071
+ name: "clearEphemeralPin",
1072
+ response: 184,
1073
+ parameters: [{ name: "userid", type: zigbee_herdsman_1.Zcl.DataType.UINT16 }],
1074
+ },
1075
+ clearAllEphemeralPins: {
1076
+ ID: 0xb9,
1077
+ name: "clearAllEphemeralPins",
1078
+ response: 185,
1079
+ parameters: [],
1080
+ },
1081
+ },
1082
+ commandsResponse: {
1083
+ unlockDoorRsp: { ID: 0x01, name: "unlockDoorRsp", parameters: [{ name: "status", type: zigbee_herdsman_1.Zcl.DataType.ENUM8 }], required: true },
1084
+ unlockWithTimeoutRsp: { ID: 0x03, name: "unlockWithTimeoutRsp", parameters: [{ name: "status", type: zigbee_herdsman_1.Zcl.DataType.ENUM8 }] },
1085
+ setEphemeralPinRsp: { ID: 182, name: "setEphemeralPinRsp", parameters: [{ name: "status", type: zigbee_herdsman_1.Zcl.DataType.UINT8 }] },
1086
+ clearEphemeralPinRsp: { ID: 184, name: "clearEphemeralPinRsp", parameters: [{ name: "status", type: zigbee_herdsman_1.Zcl.DataType.UINT8 }] },
1087
+ clearAllEphemeralPinsRsp: { ID: 185, name: "clearAllEphemeralPinsRsp", parameters: [{ name: "status", type: zigbee_herdsman_1.Zcl.DataType.UINT8 }] },
1088
+ },
1089
+ }),
1090
+ m.battery({ percentageReportingConfig: { min: 30, max: 1800, change: 1 } }),
1091
+ ],
1092
+ exposes: [
1093
+ e.numeric("lock_status", ea.STATE | ea.GET).withDescription("Lock status reported by the lock, 0 means locked, 1 means unlocked"),
1094
+ e.text("unlock_door", ea.SET).withDescription("Enter password to unlock door"),
1095
+ e
1096
+ .composite("unlock_door_with_timeout", "unlock_door_with_timeout", ea.ALL)
1097
+ .withFeature(e.numeric("timeout", ea.SET).withDescription("Number of seconds the PIN code is valid, 0 means lock will be re-locked"))
1098
+ .withFeature(e.text("pin_code", ea.SET).withLabel("PIN code").withDescription("Pincode to set, set pincode to null to clear")),
1099
+ e
1100
+ .composite("ephemeral_pin_code", "ephemeral_pin_code", ea.SET)
1101
+ .withFeature(e.numeric("start_time", ea.SET).withDescription("Temporary PIN start time (UNIX timestamp in seconds)"))
1102
+ .withFeature(e.numeric("end_time", ea.SET).withDescription("Temporary PIN end time (UNIX timestamp in seconds)"))
1103
+ .withFeature(e.numeric("userid", ea.SET).withDescription("User ID for the temporary PIN (1-20)").withValueMin(1).withValueMax(20))
1104
+ .withFeature(e
1105
+ .numeric("valid_times", ea.SET)
1106
+ .withDescription("Number of times the temporary PIN can be used (0-255, 0 means unlimited)")
1107
+ .withValueMin(0)
1108
+ .withValueMax(255))
1109
+ .withFeature(e.text("pincode", ea.SET).withDescription("The temporary PIN code (numeric string)")),
1110
+ e
1111
+ .composite("ephemeral_clear_pin_code", "ephemeral_clear_pin_code", ea.SET)
1112
+ .withFeature(e.numeric("userid", ea.SET).withDescription("User ID for the temporary PIN (1-20)").withValueMin(1).withValueMax(20)),
1113
+ e.composite("ephemeral_clear_all_pin_code", "ephemeral_clear_all_pin_code", ea.SET),
1114
+ ],
1115
+ configure: async (device, coordinatorEndpoint) => {
1116
+ const endpoint = device.getEndpoint(1);
1117
+ await reporting.bind(endpoint, coordinatorEndpoint, ["genPowerCfg"]);
1118
+ },
1119
+ },
358
1120
  ];
359
1121
  //# sourceMappingURL=easyiot.js.map