zigbee-herdsman-converters 20.13.0 → 20.14.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 (531) hide show
  1. package/CHANGELOG.md +23 -0
  2. package/converters/fromZigbee.d.ts.map +1 -1
  3. package/converters/fromZigbee.js +345 -334
  4. package/converters/fromZigbee.js.map +1 -1
  5. package/converters/toZigbee.d.ts +1 -1
  6. package/converters/toZigbee.d.ts.map +1 -1
  7. package/converters/toZigbee.js +80 -82
  8. package/converters/toZigbee.js.map +1 -1
  9. package/devices/ITCommander.d.ts.map +1 -1
  10. package/devices/ITCommander.js +1 -1
  11. package/devices/ITCommander.js.map +1 -1
  12. package/devices/acova.d.ts.map +1 -1
  13. package/devices/acova.js.map +1 -1
  14. package/devices/akuvox.d.ts.map +1 -1
  15. package/devices/akuvox.js.map +1 -1
  16. package/devices/aldi.d.ts.map +1 -1
  17. package/devices/aldi.js.map +1 -1
  18. package/devices/alecto.d.ts.map +1 -1
  19. package/devices/alecto.js.map +1 -1
  20. package/devices/atlantic.d.ts.map +1 -1
  21. package/devices/atlantic.js.map +1 -1
  22. package/devices/aubess.d.ts.map +1 -1
  23. package/devices/aubess.js.map +1 -1
  24. package/devices/aurora_lighting.d.ts.map +1 -1
  25. package/devices/aurora_lighting.js +2 -2
  26. package/devices/aurora_lighting.js.map +1 -1
  27. package/devices/avatto.js +0 -1
  28. package/devices/avatto.js.map +1 -1
  29. package/devices/axis.d.ts.map +1 -1
  30. package/devices/axis.js.map +1 -1
  31. package/devices/bitron.d.ts.map +1 -1
  32. package/devices/bitron.js +9 -9
  33. package/devices/bitron.js.map +1 -1
  34. package/devices/bituo_technik.d.ts.map +1 -1
  35. package/devices/bituo_technik.js +2 -2
  36. package/devices/bituo_technik.js.map +1 -1
  37. package/devices/blaupunkt.d.ts.map +1 -1
  38. package/devices/blaupunkt.js +1 -1
  39. package/devices/blaupunkt.js.map +1 -1
  40. package/devices/blitzwolf.d.ts.map +1 -1
  41. package/devices/blitzwolf.js.map +1 -1
  42. package/devices/bosch.d.ts.map +1 -1
  43. package/devices/bosch.js +25 -25
  44. package/devices/bosch.js.map +1 -1
  45. package/devices/brimate.d.ts.map +1 -1
  46. package/devices/brimate.js.map +1 -1
  47. package/devices/bseed.d.ts.map +1 -1
  48. package/devices/bseed.js.map +1 -1
  49. package/devices/bticino.d.ts.map +1 -1
  50. package/devices/bticino.js.map +1 -1
  51. package/devices/busch_jaeger.d.ts.map +1 -1
  52. package/devices/busch_jaeger.js.map +1 -1
  53. package/devices/byun.d.ts.map +1 -1
  54. package/devices/byun.js.map +1 -1
  55. package/devices/casaia.d.ts.map +1 -1
  56. package/devices/casaia.js +2 -2
  57. package/devices/casaia.js.map +1 -1
  58. package/devices/centralite.d.ts.map +1 -1
  59. package/devices/centralite.js +5 -5
  60. package/devices/centralite.js.map +1 -1
  61. package/devices/cleverio.d.ts.map +1 -1
  62. package/devices/cleverio.js.map +1 -1
  63. package/devices/ctm.d.ts.map +1 -1
  64. package/devices/ctm.js +62 -62
  65. package/devices/ctm.js.map +1 -1
  66. package/devices/current_products_corp.d.ts.map +1 -1
  67. package/devices/current_products_corp.js.map +1 -1
  68. package/devices/custom_devices_diy.d.ts.map +1 -1
  69. package/devices/custom_devices_diy.js +12 -12
  70. package/devices/custom_devices_diy.js.map +1 -1
  71. package/devices/danalock.d.ts.map +1 -1
  72. package/devices/danalock.js.map +1 -1
  73. package/devices/danfoss.d.ts.map +1 -1
  74. package/devices/danfoss.js +2 -2
  75. package/devices/danfoss.js.map +1 -1
  76. package/devices/datek.d.ts.map +1 -1
  77. package/devices/datek.js +1 -1
  78. package/devices/datek.js.map +1 -1
  79. package/devices/dawon_dns.d.ts.map +1 -1
  80. package/devices/dawon_dns.js.map +1 -1
  81. package/devices/develco.d.ts.map +1 -1
  82. package/devices/develco.js +15 -14
  83. package/devices/develco.js.map +1 -1
  84. package/devices/digi.d.ts.map +1 -1
  85. package/devices/digi.js.map +1 -1
  86. package/devices/dlink.d.ts.map +1 -1
  87. package/devices/dlink.js.map +1 -1
  88. package/devices/easyaccess.d.ts.map +1 -1
  89. package/devices/easyaccess.js.map +1 -1
  90. package/devices/easyiot.d.ts.map +1 -1
  91. package/devices/easyiot.js.map +1 -1
  92. package/devices/echostar.d.ts.map +1 -1
  93. package/devices/echostar.js.map +1 -1
  94. package/devices/ecodim.d.ts.map +1 -1
  95. package/devices/ecodim.js +1 -1
  96. package/devices/ecodim.js.map +1 -1
  97. package/devices/ecolink.d.ts.map +1 -1
  98. package/devices/ecolink.js.map +1 -1
  99. package/devices/ecozy.d.ts.map +1 -1
  100. package/devices/ecozy.js.map +1 -1
  101. package/devices/enocean.d.ts.map +1 -1
  102. package/devices/enocean.js.map +1 -1
  103. package/devices/envilar.d.ts.map +1 -1
  104. package/devices/envilar.js +2 -2
  105. package/devices/envilar.js.map +1 -1
  106. package/devices/eurotronic.d.ts.map +1 -1
  107. package/devices/eurotronic.js.map +1 -1
  108. package/devices/evanell.d.ts.map +1 -1
  109. package/devices/evanell.js.map +1 -1
  110. package/devices/evology.d.ts.map +1 -1
  111. package/devices/evology.js.map +1 -1
  112. package/devices/ewelink.d.ts.map +1 -1
  113. package/devices/ewelink.js +1 -1
  114. package/devices/ewelink.js.map +1 -1
  115. package/devices/fantem.d.ts.map +1 -1
  116. package/devices/fantem.js +2 -2
  117. package/devices/fantem.js.map +1 -1
  118. package/devices/fireangel.d.ts.map +1 -1
  119. package/devices/fireangel.js.map +1 -1
  120. package/devices/frankever.d.ts.map +1 -1
  121. package/devices/frankever.js.map +1 -1
  122. package/devices/frient.d.ts.map +1 -1
  123. package/devices/frient.js.map +1 -1
  124. package/devices/gewiss.d.ts.map +1 -1
  125. package/devices/gewiss.js.map +1 -1
  126. package/devices/giex.d.ts.map +1 -1
  127. package/devices/giex.js.map +1 -1
  128. package/devices/gledopto.js +2 -2
  129. package/devices/gledopto.js.map +1 -1
  130. package/devices/gmmts.d.ts.map +1 -1
  131. package/devices/gmmts.js +23 -23
  132. package/devices/gmmts.js.map +1 -1
  133. package/devices/gumax.d.ts +4 -0
  134. package/devices/gumax.d.ts.map +1 -0
  135. package/devices/gumax.js +15 -0
  136. package/devices/gumax.js.map +1 -0
  137. package/devices/heiman.d.ts.map +1 -1
  138. package/devices/heiman.js +2 -2
  139. package/devices/heiman.js.map +1 -1
  140. package/devices/heimgard_technologies.d.ts.map +1 -1
  141. package/devices/heimgard_technologies.js +2 -2
  142. package/devices/heimgard_technologies.js.map +1 -1
  143. package/devices/hive.js +1 -1
  144. package/devices/hive.js.map +1 -1
  145. package/devices/hommyn.d.ts.map +1 -1
  146. package/devices/hommyn.js.map +1 -1
  147. package/devices/hzc.d.ts.map +1 -1
  148. package/devices/hzc.js.map +1 -1
  149. package/devices/hzc_electric.d.ts.map +1 -1
  150. package/devices/hzc_electric.js.map +1 -1
  151. package/devices/ihorn.d.ts.map +1 -1
  152. package/devices/ihorn.js.map +1 -1
  153. package/devices/imhotepcreation.d.ts.map +1 -1
  154. package/devices/index.d.ts.map +1 -1
  155. package/devices/index.js +4 -2
  156. package/devices/index.js.map +1 -1
  157. package/devices/innr.d.ts.map +1 -1
  158. package/devices/innr.js +2 -2
  159. package/devices/innr.js.map +1 -1
  160. package/devices/inovelli.d.ts.map +1 -1
  161. package/devices/inovelli.js +38 -38
  162. package/devices/inovelli.js.map +1 -1
  163. package/devices/insta.d.ts.map +1 -1
  164. package/devices/insta.js.map +1 -1
  165. package/devices/iotperfect.d.ts.map +1 -1
  166. package/devices/iotperfect.js.map +1 -1
  167. package/devices/iris.d.ts.map +1 -1
  168. package/devices/iris.js +1 -1
  169. package/devices/iris.js.map +1 -1
  170. package/devices/javis.d.ts.map +1 -1
  171. package/devices/javis.js.map +1 -1
  172. package/devices/jxuan.d.ts.map +1 -1
  173. package/devices/jxuan.js +2 -2
  174. package/devices/jxuan.js.map +1 -1
  175. package/devices/kami.d.ts.map +1 -1
  176. package/devices/kami.js.map +1 -1
  177. package/devices/keen_home.d.ts.map +1 -1
  178. package/devices/keen_home.js.map +1 -1
  179. package/devices/kmpcil.d.ts.map +1 -1
  180. package/devices/kmpcil.js +5 -5
  181. package/devices/kmpcil.js.map +1 -1
  182. package/devices/kwikset.d.ts.map +1 -1
  183. package/devices/kwikset.js.map +1 -1
  184. package/devices/led_trading.d.ts.map +1 -1
  185. package/devices/led_trading.js +1 -8
  186. package/devices/led_trading.js.map +1 -1
  187. package/devices/legrand.d.ts.map +1 -1
  188. package/devices/legrand.js +2 -2
  189. package/devices/legrand.js.map +1 -1
  190. package/devices/lellki.d.ts.map +1 -1
  191. package/devices/lellki.js +2 -2
  192. package/devices/lellki.js.map +1 -1
  193. package/devices/letv.d.ts.map +1 -1
  194. package/devices/letv.js.map +1 -1
  195. package/devices/leviton.d.ts.map +1 -1
  196. package/devices/leviton.js +1 -1
  197. package/devices/leviton.js.map +1 -1
  198. package/devices/lidl.d.ts.map +1 -1
  199. package/devices/lidl.js +15 -15
  200. package/devices/lidl.js.map +1 -1
  201. package/devices/lifecontrol.d.ts.map +1 -1
  202. package/devices/lifecontrol.js +1 -1
  203. package/devices/lifecontrol.js.map +1 -1
  204. package/devices/linkind.d.ts.map +1 -1
  205. package/devices/linkind.js +2 -2
  206. package/devices/linkind.js.map +1 -1
  207. package/devices/linptech.d.ts.map +1 -1
  208. package/devices/linptech.js +5 -5
  209. package/devices/linptech.js.map +1 -1
  210. package/devices/livolo.d.ts.map +1 -1
  211. package/devices/livolo.js +1 -1
  212. package/devices/livolo.js.map +1 -1
  213. package/devices/lixee.d.ts.map +1 -1
  214. package/devices/lixee.js +29 -28
  215. package/devices/lixee.js.map +1 -1
  216. package/devices/ls.d.ts.map +1 -1
  217. package/devices/ls.js.map +1 -1
  218. package/devices/lumi.d.ts.map +1 -1
  219. package/devices/lumi.js +7 -7
  220. package/devices/lumi.js.map +1 -1
  221. package/devices/lupus.d.ts.map +1 -1
  222. package/devices/lupus.js +2 -2
  223. package/devices/lupus.js.map +1 -1
  224. package/devices/lutron.d.ts.map +1 -1
  225. package/devices/lutron.js.map +1 -1
  226. package/devices/lux.d.ts.map +1 -1
  227. package/devices/lux.js.map +1 -1
  228. package/devices/lytko.js +6 -6
  229. package/devices/lytko.js.map +1 -1
  230. package/devices/meazon.d.ts.map +1 -1
  231. package/devices/meazon.js.map +1 -1
  232. package/devices/mercator.d.ts.map +1 -1
  233. package/devices/mercator.js +2 -2
  234. package/devices/mercator.js.map +1 -1
  235. package/devices/miboxer.d.ts.map +1 -1
  236. package/devices/miboxer.js +1 -1
  237. package/devices/miboxer.js.map +1 -1
  238. package/devices/moes.d.ts.map +1 -1
  239. package/devices/moes.js +3 -3
  240. package/devices/moes.js.map +1 -1
  241. package/devices/multiterm.js +1 -1
  242. package/devices/multiterm.js.map +1 -1
  243. package/devices/namron.js +6 -6
  244. package/devices/namron.js.map +1 -1
  245. package/devices/neo.d.ts.map +1 -1
  246. package/devices/neo.js +1 -1
  247. package/devices/neo.js.map +1 -1
  248. package/devices/net2grid.d.ts.map +1 -1
  249. package/devices/net2grid.js.map +1 -1
  250. package/devices/netvox.d.ts.map +1 -1
  251. package/devices/netvox.js.map +1 -1
  252. package/devices/niko.d.ts.map +1 -1
  253. package/devices/niko.js +10 -10
  254. package/devices/niko.js.map +1 -1
  255. package/devices/ninja_blocks.d.ts.map +1 -1
  256. package/devices/ninja_blocks.js.map +1 -1
  257. package/devices/nodon.d.ts.map +1 -1
  258. package/devices/nodon.js +2 -2
  259. package/devices/nodon.js.map +1 -1
  260. package/devices/nous.d.ts.map +1 -1
  261. package/devices/nous.js.map +1 -1
  262. package/devices/novo.d.ts.map +1 -1
  263. package/devices/novo.js.map +1 -1
  264. package/devices/nue_3a.js +2 -2
  265. package/devices/nue_3a.js.map +1 -1
  266. package/devices/nyce.d.ts.map +1 -1
  267. package/devices/nyce.js.map +1 -1
  268. package/devices/onesti.d.ts.map +1 -1
  269. package/devices/onesti.js.map +1 -1
  270. package/devices/openlumi.d.ts.map +1 -1
  271. package/devices/openlumi.js.map +1 -1
  272. package/devices/oujiabao.d.ts.map +1 -1
  273. package/devices/oujiabao.js.map +1 -1
  274. package/devices/owon.d.ts.map +1 -1
  275. package/devices/owon.js +35 -26
  276. package/devices/owon.js.map +1 -1
  277. package/devices/peq.d.ts.map +1 -1
  278. package/devices/peq.js.map +1 -1
  279. package/devices/perenio.d.ts.map +1 -1
  280. package/devices/perenio.js +21 -21
  281. package/devices/perenio.js.map +1 -1
  282. package/devices/philips.d.ts.map +1 -1
  283. package/devices/philips.js +28 -0
  284. package/devices/philips.js.map +1 -1
  285. package/devices/plaid.d.ts.map +1 -1
  286. package/devices/plaid.js.map +1 -1
  287. package/devices/plugwise.d.ts.map +1 -1
  288. package/devices/plugwise.js +1 -1
  289. package/devices/plugwise.js.map +1 -1
  290. package/devices/qa.d.ts.map +1 -1
  291. package/devices/qa.js.map +1 -1
  292. package/devices/qmotion.d.ts.map +1 -1
  293. package/devices/qmotion.js +1 -1
  294. package/devices/qmotion.js.map +1 -1
  295. package/devices/qoto.d.ts.map +1 -1
  296. package/devices/qoto.js.map +1 -1
  297. package/devices/rgb_genie.d.ts.map +1 -1
  298. package/devices/rgb_genie.js +2 -2
  299. package/devices/rgb_genie.js.map +1 -1
  300. package/devices/roome.d.ts.map +1 -1
  301. package/devices/roome.js.map +1 -1
  302. package/devices/rtx.d.ts.map +1 -1
  303. package/devices/rtx.js.map +1 -1
  304. package/devices/salus_controls.d.ts.map +1 -1
  305. package/devices/salus_controls.js.map +1 -1
  306. package/devices/saswell.d.ts.map +1 -1
  307. package/devices/saswell.js +1 -1
  308. package/devices/saswell.js.map +1 -1
  309. package/devices/sber.d.ts.map +1 -1
  310. package/devices/sber.js.map +1 -1
  311. package/devices/schlage.d.ts.map +1 -1
  312. package/devices/schlage.js.map +1 -1
  313. package/devices/schneider_electric.d.ts.map +1 -1
  314. package/devices/schneider_electric.js +22 -22
  315. package/devices/schneider_electric.js.map +1 -1
  316. package/devices/securifi.d.ts.map +1 -1
  317. package/devices/securifi.js.map +1 -1
  318. package/devices/sengled.d.ts.map +1 -1
  319. package/devices/sercomm.d.ts.map +1 -1
  320. package/devices/sercomm.js.map +1 -1
  321. package/devices/shade_control.d.ts.map +1 -1
  322. package/devices/shade_control.js.map +1 -1
  323. package/devices/shinasystem.js +1 -1
  324. package/devices/shinasystem.js.map +1 -1
  325. package/devices/siglis.d.ts.map +1 -1
  326. package/devices/siglis.js +4 -5
  327. package/devices/siglis.js.map +1 -1
  328. package/devices/sinope.d.ts.map +1 -1
  329. package/devices/sinope.js +76 -84
  330. package/devices/sinope.js.map +1 -1
  331. package/devices/siterwell.d.ts.map +1 -1
  332. package/devices/siterwell.js.map +1 -1
  333. package/devices/skydance.d.ts.map +1 -1
  334. package/devices/skydance.js.map +1 -1
  335. package/devices/smart9.d.ts.map +1 -1
  336. package/devices/smart9.js.map +1 -1
  337. package/devices/smartenit.d.ts.map +1 -1
  338. package/devices/smartenit.js.map +1 -1
  339. package/devices/smartthings.js +1 -1
  340. package/devices/smartthings.js.map +1 -1
  341. package/devices/smartwings.d.ts.map +1 -1
  342. package/devices/smartwings.js.map +1 -1
  343. package/devices/somgoms.d.ts.map +1 -1
  344. package/devices/somgoms.js.map +1 -1
  345. package/devices/sonoff.d.ts.map +1 -1
  346. package/devices/sonoff.js +2 -2
  347. package/devices/sonoff.js.map +1 -1
  348. package/devices/stelpro.d.ts.map +1 -1
  349. package/devices/stelpro.js +3 -3
  350. package/devices/stelpro.js.map +1 -1
  351. package/devices/sunricher.d.ts.map +1 -1
  352. package/devices/sunricher.js +3 -8
  353. package/devices/sunricher.js.map +1 -1
  354. package/devices/swann.d.ts.map +1 -1
  355. package/devices/swann.js.map +1 -1
  356. package/devices/tapestry.d.ts.map +1 -1
  357. package/devices/tapestry.js.map +1 -1
  358. package/devices/technicolor.d.ts.map +1 -1
  359. package/devices/technicolor.js.map +1 -1
  360. package/devices/third_reality.d.ts.map +1 -1
  361. package/devices/third_reality.js +167 -15
  362. package/devices/third_reality.js.map +1 -1
  363. package/devices/titan_products.d.ts.map +1 -1
  364. package/devices/titan_products.js.map +1 -1
  365. package/devices/tplink.d.ts.map +1 -1
  366. package/devices/tplink.js.map +1 -1
  367. package/devices/tuya.d.ts.map +1 -1
  368. package/devices/tuya.js +20 -20
  369. package/devices/tuya.js.map +1 -1
  370. package/devices/ubisys.d.ts.map +1 -1
  371. package/devices/ubisys.js +30 -27
  372. package/devices/ubisys.js.map +1 -1
  373. package/devices/uhome.d.ts.map +1 -1
  374. package/devices/uhome.js.map +1 -1
  375. package/devices/universal_electronics_inc.d.ts.map +1 -1
  376. package/devices/universal_electronics_inc.js +1 -1
  377. package/devices/universal_electronics_inc.js.map +1 -1
  378. package/devices/vesternet.d.ts.map +1 -1
  379. package/devices/vesternet.js.map +1 -1
  380. package/devices/viessmann.d.ts.map +1 -1
  381. package/devices/viessmann.js.map +1 -1
  382. package/devices/vimar.d.ts.map +1 -1
  383. package/devices/vimar.js.map +1 -1
  384. package/devices/visonic.d.ts.map +1 -1
  385. package/devices/visonic.js.map +1 -1
  386. package/devices/wally.d.ts.map +1 -1
  387. package/devices/wally.js.map +1 -1
  388. package/devices/waxman.d.ts.map +1 -1
  389. package/devices/waxman.js.map +1 -1
  390. package/devices/weiser.d.ts.map +1 -1
  391. package/devices/weiser.js.map +1 -1
  392. package/devices/wirenboard.d.ts.map +1 -1
  393. package/devices/wirenboard.js +11 -11
  394. package/devices/wirenboard.js.map +1 -1
  395. package/devices/woolley.d.ts.map +1 -1
  396. package/devices/woolley.js +1 -1
  397. package/devices/woolley.js.map +1 -1
  398. package/devices/woox.d.ts.map +1 -1
  399. package/devices/woox.js.map +1 -1
  400. package/devices/wyze.d.ts.map +1 -1
  401. package/devices/wyze.js.map +1 -1
  402. package/devices/xyzroe.d.ts.map +1 -1
  403. package/devices/xyzroe.js +6 -6
  404. package/devices/xyzroe.js.map +1 -1
  405. package/devices/yale.d.ts.map +1 -1
  406. package/devices/yale.js +3 -3
  407. package/devices/yale.js.map +1 -1
  408. package/devices/yookee.d.ts.map +1 -1
  409. package/devices/yookee.js.map +1 -1
  410. package/devices/zemismart.d.ts.map +1 -1
  411. package/devices/zemismart.js +2 -2
  412. package/devices/zemismart.js.map +1 -1
  413. package/devices/zen.d.ts.map +1 -1
  414. package/devices/zen.js.map +1 -1
  415. package/index.d.ts +5 -5
  416. package/index.d.ts.map +1 -1
  417. package/index.js +31 -16
  418. package/index.js.map +1 -1
  419. package/lib/color.d.ts +1 -1
  420. package/lib/color.d.ts.map +1 -1
  421. package/lib/color.js +47 -50
  422. package/lib/color.js.map +1 -1
  423. package/lib/configureKey.js +2 -2
  424. package/lib/configureKey.js.map +1 -1
  425. package/lib/develco.d.ts.map +1 -1
  426. package/lib/develco.js +5 -6
  427. package/lib/develco.js.map +1 -1
  428. package/lib/ewelink.d.ts.map +1 -1
  429. package/lib/exposes.js +1 -1
  430. package/lib/exposes.js.map +1 -1
  431. package/lib/ikea.d.ts +1 -1
  432. package/lib/ikea.d.ts.map +1 -1
  433. package/lib/ikea.js +10 -10
  434. package/lib/ikea.js.map +1 -1
  435. package/lib/ledvance.d.ts +1 -1
  436. package/lib/ledvance.d.ts.map +1 -1
  437. package/lib/legacy.d.ts +3 -16
  438. package/lib/legacy.d.ts.map +1 -1
  439. package/lib/legacy.js +121 -131
  440. package/lib/legacy.js.map +1 -1
  441. package/lib/legrand.d.ts +1 -1
  442. package/lib/legrand.d.ts.map +1 -1
  443. package/lib/legrand.js +4 -4
  444. package/lib/legrand.js.map +1 -1
  445. package/lib/light.d.ts +1 -1
  446. package/lib/light.js +5 -5
  447. package/lib/light.js.map +1 -1
  448. package/lib/logger.d.ts.map +1 -1
  449. package/lib/logger.js +4 -4
  450. package/lib/logger.js.map +1 -1
  451. package/lib/lumi.d.ts +1 -1
  452. package/lib/lumi.d.ts.map +1 -1
  453. package/lib/lumi.js +90 -92
  454. package/lib/lumi.js.map +1 -1
  455. package/lib/modernExtend.d.ts +1 -1
  456. package/lib/modernExtend.d.ts.map +1 -1
  457. package/lib/modernExtend.js +15 -15
  458. package/lib/modernExtend.js.map +1 -1
  459. package/lib/ota/common.d.ts +1 -1
  460. package/lib/ota/common.d.ts.map +1 -1
  461. package/lib/ota/common.js +5 -5
  462. package/lib/ota/common.js.map +1 -1
  463. package/lib/ota/gmmts.d.ts +1 -1
  464. package/lib/ota/gmmts.d.ts.map +1 -1
  465. package/lib/ota/gmmts.js +2 -2
  466. package/lib/ota/gmmts.js.map +1 -1
  467. package/lib/ota/index.d.ts +5 -5
  468. package/lib/ota/index.d.ts.map +1 -1
  469. package/lib/ota/index.js +7 -7
  470. package/lib/ota/index.js.map +1 -1
  471. package/lib/ota/inovelli.d.ts +1 -6
  472. package/lib/ota/inovelli.d.ts.map +1 -1
  473. package/lib/ota/inovelli.js +11 -11
  474. package/lib/ota/inovelli.js.map +1 -1
  475. package/lib/ota/jethome.d.ts +1 -1
  476. package/lib/ota/jethome.d.ts.map +1 -1
  477. package/lib/ota/jethome.js +4 -4
  478. package/lib/ota/jethome.js.map +1 -1
  479. package/lib/ota/ledvance.d.ts +1 -1
  480. package/lib/ota/ledvance.d.ts.map +1 -1
  481. package/lib/ota/ledvance.js +4 -4
  482. package/lib/ota/ledvance.js.map +1 -1
  483. package/lib/ota/lixee.d.ts +1 -1
  484. package/lib/ota/lixee.d.ts.map +1 -1
  485. package/lib/ota/lixee.js +3 -3
  486. package/lib/ota/lixee.js.map +1 -1
  487. package/lib/ota/salus.d.ts +1 -1
  488. package/lib/ota/salus.d.ts.map +1 -1
  489. package/lib/ota/salus.js +5 -5
  490. package/lib/ota/salus.js.map +1 -1
  491. package/lib/ota/securifi.d.ts +1 -1
  492. package/lib/ota/securifi.d.ts.map +1 -1
  493. package/lib/ota/securifi.js +2 -2
  494. package/lib/ota/securifi.js.map +1 -1
  495. package/lib/ota/tradfri.d.ts.map +1 -1
  496. package/lib/ota/tradfri.js +4 -4
  497. package/lib/ota/tradfri.js.map +1 -1
  498. package/lib/ota/ubisys.d.ts.map +1 -1
  499. package/lib/ota/ubisys.js +4 -4
  500. package/lib/ota/ubisys.js.map +1 -1
  501. package/lib/ota/zigbeeOTA.d.ts +1 -1
  502. package/lib/ota/zigbeeOTA.d.ts.map +1 -1
  503. package/lib/ota/zigbeeOTA.js +9 -9
  504. package/lib/ota/zigbeeOTA.js.map +1 -1
  505. package/lib/philips.js +12 -12
  506. package/lib/philips.js.map +1 -1
  507. package/lib/reporting.d.ts +1 -1
  508. package/lib/reporting.d.ts.map +1 -1
  509. package/lib/reporting.js +7 -7
  510. package/lib/reporting.js.map +1 -1
  511. package/lib/store.d.ts +1 -1
  512. package/lib/store.d.ts.map +1 -1
  513. package/lib/store.js +2 -2
  514. package/lib/store.js.map +1 -1
  515. package/lib/tuya.d.ts +1 -1
  516. package/lib/tuya.d.ts.map +1 -1
  517. package/lib/tuya.js +24 -56
  518. package/lib/tuya.js.map +1 -1
  519. package/lib/types.d.ts +4 -4
  520. package/lib/types.d.ts.map +1 -1
  521. package/lib/types.js +1 -0
  522. package/lib/types.js.map +1 -1
  523. package/lib/ubisys.d.ts +1 -1
  524. package/lib/ubisys.d.ts.map +1 -1
  525. package/lib/ubisys.js +1 -1
  526. package/lib/ubisys.js.map +1 -1
  527. package/lib/utils.d.ts +1 -1
  528. package/lib/utils.d.ts.map +1 -1
  529. package/lib/utils.js +26 -26
  530. package/lib/utils.js.map +1 -1
  531. package/package.json +8 -9
package/lib/lumi.js CHANGED
@@ -316,7 +316,7 @@ const numericAttributes2Payload = async (msg, meta, model, options, dataObject)
316
316
  else if (['WSDCGQ01LM', 'WSDCGQ11LM', 'WSDCGQ12LM', 'VOCKQJK11LM'].includes(model.model)) {
317
317
  // https://github.com/Koenkk/zigbee2mqtt/issues/798
318
318
  // Sometimes the sensor publishes non-realistic vales, filter these
319
- // @ts-expect-error
319
+ // @ts-expect-error ignore
320
320
  const temperature = parseFloat(value) / 100.0;
321
321
  if (temperature > -65 && temperature < 65) {
322
322
  payload.temperature = temperature;
@@ -391,7 +391,7 @@ const numericAttributes2Payload = async (msg, meta, model, options, dataObject)
391
391
  else if (['WSDCGQ01LM', 'WSDCGQ11LM', 'WSDCGQ12LM', 'VOCKQJK11LM'].includes(model.model)) {
392
392
  // https://github.com/Koenkk/zigbee2mqtt/issues/798
393
393
  // Sometimes the sensor publishes non-realistic vales, filter these
394
- // @ts-expect-error
394
+ // @ts-expect-error ignore
395
395
  const humidity = parseFloat(value) / 100.0;
396
396
  if (humidity >= 0 && humidity <= 100) {
397
397
  payload.humidity = humidity;
@@ -616,7 +616,7 @@ const numericAttributes2Payload = async (msg, meta, model, options, dataObject)
616
616
  payload.operation_mode = newMode;
617
617
  globalStore.putValue(meta.device, 'opModeSwitchTask', null);
618
618
  }
619
- catch (error) {
619
+ catch {
620
620
  // do nothing when callback fails
621
621
  }
622
622
  }
@@ -796,7 +796,7 @@ const numericAttributes2Payload = async (msg, meta, model, options, dataObject)
796
796
  }
797
797
  else {
798
798
  // next values update only when curtain finished initial setup and knows current position
799
- // @ts-expect-error
799
+ // @ts-expect-error ignore
800
800
  payload.options = { ...payload.options, reverse_direction: value[2] == '\u0001', hand_open: value[5] == '\u0000' };
801
801
  }
802
802
  break;
@@ -884,7 +884,7 @@ const numericAttributes2Payload = async (msg, meta, model, options, dataObject)
884
884
  break;
885
885
  case '65281':
886
886
  {
887
- // @ts-expect-error
887
+ // @ts-expect-error ignore
888
888
  const payload65281 = await (0, exports.numericAttributes2Payload)(msg, meta, model, options, value);
889
889
  payload = { ...payload, ...payload65281 };
890
890
  }
@@ -893,13 +893,13 @@ const numericAttributes2Payload = async (msg, meta, model, options, dataObject)
893
893
  // This is a a complete structure with attributes, like element 0 for state, element 1 for voltage...
894
894
  // At this moment we only extract what we are sure, for example, position 0 seems to be always 1 for a
895
895
  // occupancy sensor, so we ignore it at this moment
896
- // @ts-expect-error
896
+ // @ts-expect-error ignore
897
897
  payload.voltage = value[1].elmVal;
898
898
  if (model.meta && model.meta.battery && model.meta.battery.voltageToPercentage) {
899
899
  (0, utils_1.assertNumber)(payload.voltage);
900
900
  payload.battery = (0, utils_1.batteryVoltageToPercentage)(payload.voltage, model.meta.battery.voltageToPercentage);
901
901
  }
902
- // @ts-expect-error
902
+ // @ts-expect-error ignore
903
903
  payload.power_outage_count = value[4].elmVal - 1;
904
904
  break;
905
905
  case 'mode':
@@ -1100,7 +1100,7 @@ function writeDaySelection(buffer, offset, selectedDays) {
1100
1100
  validateDaySelection(selectedDays);
1101
1101
  const bitMap = dayNames.reduce((repeat, dayName, index) => {
1102
1102
  const isDaySelected = selectedDays.includes(dayName);
1103
- // @ts-expect-error
1103
+ // @ts-expect-error ignore
1104
1104
  return repeat | (isDaySelected << (index + 1));
1105
1105
  }, 0);
1106
1106
  buffer.writeUInt8(bitMap, offset);
@@ -1325,7 +1325,7 @@ exports.trv = {
1325
1325
  const stringifiedScheduleFragments = stringifiedSchedule.split(stringifiedScheduleFragmentSeparator);
1326
1326
  stringifiedScheduleFragments.forEach((fragment, index) => {
1327
1327
  if (index === 0) {
1328
- // @ts-expect-error
1328
+ // @ts-expect-error ignore
1329
1329
  schedule.days.push(...fragment.split(stringifiedScheduleValueSeparator));
1330
1330
  }
1331
1331
  else {
@@ -1661,9 +1661,9 @@ exports.lumiModernExtend = {
1661
1661
  // there is however an outage counter published in the 'special' buffer data reported
1662
1662
  // under the manuSpecificLumi cluster as attribute 247, we simple decode and grab value with ID 5.
1663
1663
  // Normal attribute publishing and decoding will be left to the classic fromZigbee or modernExtends.
1664
- if (msg.data.hasOwnProperty('247')) {
1664
+ if (msg.data['247'] !== undefined) {
1665
1665
  const dataDecoded = (0, exports.buffer2DataObject)(model, msg.data['247']);
1666
- if (dataDecoded.hasOwnProperty('5')) {
1666
+ if (dataDecoded['5'] !== undefined) {
1667
1667
  (0, utils_1.assertNumber)(dataDecoded['5']);
1668
1668
  const currentOutageCount = dataDecoded['5'] - 1;
1669
1669
  const previousOutageCount = meta.device?.meta?.outageCount ? meta.device.meta.outageCount : 0;
@@ -1680,7 +1680,7 @@ exports.lumiModernExtend = {
1680
1680
  await endpoint.bind(b.cluster.name, b.target);
1681
1681
  }
1682
1682
  catch (error) {
1683
- logger_1.logger.debug(`Failed to re-bind ${b.cluster.name} from ${b.target} for ${msg.device.ieeeAddr}.`, NS);
1683
+ logger_1.logger.debug(`Failed to re-bind ${b.cluster.name} from ${b.target} for ${msg.device.ieeeAddr} (${error})`, NS);
1684
1684
  }
1685
1685
  }
1686
1686
  // restore reporting
@@ -1695,7 +1695,7 @@ exports.lumiModernExtend = {
1695
1695
  },
1696
1696
  ]);
1697
1697
  }
1698
- catch (error) {
1698
+ catch {
1699
1699
  logger_1.logger.debug(`Failed to re-setup reporting of ${c.cluster.name}/${c.attribute.name} for ${msg.device.ieeeAddr}.`, NS);
1700
1700
  }
1701
1701
  }
@@ -1843,7 +1843,7 @@ exports.lumiModernExtend = {
1843
1843
  cluster: 'manuSpecificLumi',
1844
1844
  type: ['attributeReport', 'readResponse'],
1845
1845
  convert: (model, msg, publish, options, meta) => {
1846
- if (msg.data.hasOwnProperty(652)) {
1846
+ if (msg.data[652] !== undefined) {
1847
1847
  const actionLookup = {
1848
1848
  1: 'slider_single',
1849
1849
  2: 'slider_double',
@@ -1912,7 +1912,7 @@ exports.lumiModernExtend = {
1912
1912
  cluster: 'ssIasZone',
1913
1913
  type: ['attributeReport', 'readResponse'],
1914
1914
  convert: (model, msg, publish, options, meta) => {
1915
- if (msg.data.hasOwnProperty(45)) {
1915
+ if (msg.data[45] !== undefined) {
1916
1916
  const zoneStatus = msg.data[45];
1917
1917
  const actionLookup = { 1: 'shake', 2: 'triple_strike' };
1918
1918
  return { action: actionLookup[zoneStatus] };
@@ -1931,12 +1931,12 @@ exports.lumiModernExtend = {
1931
1931
  type: ['attributeReport', 'readResponse'],
1932
1932
  convert: (model, msg, publish, options, meta) => {
1933
1933
  const payload = {};
1934
- if (msg.data.hasOwnProperty(args.deviceTemperatureAttribute)) {
1934
+ if (msg.data[args.deviceTemperatureAttribute] !== undefined) {
1935
1935
  const value = msg.data[args.deviceTemperatureAttribute];
1936
1936
  (0, utils_1.assertNumber)(value);
1937
1937
  payload['device_temperature'] = value;
1938
1938
  }
1939
- if (msg.data.hasOwnProperty(args.powerOutageCountAttribute)) {
1939
+ if (msg.data[args.powerOutageCountAttribute] !== undefined) {
1940
1940
  const value = msg.data[args.powerOutageCountAttribute];
1941
1941
  (0, utils_1.assertNumber)(value);
1942
1942
  payload['power_outage_count'] = value - 1;
@@ -1965,7 +1965,7 @@ exports.lumiModernExtend = {
1965
1965
  cluster: 'manuSpecificLumi',
1966
1966
  type: ['attributeReport', 'readResponse'],
1967
1967
  convert: (model, msg, publish, options, meta) => {
1968
- if (msg.data.hasOwnProperty(570)) {
1968
+ if (msg.data[570] !== undefined) {
1969
1969
  const act = { 1: 'start_rotating', 2: 'rotation', 3: 'stop_rotating' };
1970
1970
  const state = { 0: 'released', 128: 'pressed' };
1971
1971
  return {
@@ -2374,7 +2374,7 @@ exports.fromZigbee = {
2374
2374
  cluster: 'msPressureMeasurement',
2375
2375
  type: ['attributeReport', 'readResponse'],
2376
2376
  convert: async (model, msg, publish, options, meta) => {
2377
- const result = await fromZigbee_1.default.pressure.convert(model, msg, publish, options, meta);
2377
+ const result = fromZigbee_1.default.pressure.convert(model, msg, publish, options, meta);
2378
2378
  if (result && result.pressure > 500 && result.pressure < 2000) {
2379
2379
  return result;
2380
2380
  }
@@ -2389,16 +2389,16 @@ exports.fromZigbee = {
2389
2389
  Object.entries(msg.data).forEach(([key, value]) => {
2390
2390
  switch (parseInt(key)) {
2391
2391
  case 0xfff1: {
2392
- // @ts-expect-error
2392
+ // @ts-expect-error ignore
2393
2393
  if (value.length < 8) {
2394
2394
  logger_1.logger.debug(`Cannot handle ${value}, frame too small`, 'zhc:lumi:feeder');
2395
2395
  return;
2396
2396
  }
2397
- // @ts-expect-error
2397
+ // @ts-expect-error ignore
2398
2398
  const attr = value.slice(3, 7);
2399
- // @ts-expect-error
2399
+ // @ts-expect-error ignore
2400
2400
  const len = value.slice(7, 8).readUInt8();
2401
- // @ts-expect-error
2401
+ // @ts-expect-error ignore
2402
2402
  const val = value.slice(8, 8 + len);
2403
2403
  switch (attr.readInt32BE()) {
2404
2404
  case 0x04150055: // feeding
@@ -2486,7 +2486,7 @@ exports.fromZigbee = {
2486
2486
  result['system_mode'] = (0, utils_1.getFromLookup)(value, { 1: 'heat', 0: 'off' });
2487
2487
  break;
2488
2488
  case 0x0272:
2489
- // @ts-expect-error
2489
+ // @ts-expect-error ignore
2490
2490
  Object.assign(result, exports.trv.decodePreset(value));
2491
2491
  break;
2492
2492
  case 0x0273:
@@ -2518,7 +2518,7 @@ exports.fromZigbee = {
2518
2518
  result['valve_alarm'] = (0, utils_1.getFromLookup)(value, { 1: true, 0: false });
2519
2519
  break;
2520
2520
  case 247: {
2521
- // @ts-expect-error
2521
+ // @ts-expect-error ignore
2522
2522
  const heartbeat = exports.trv.decodeHeartbeat(meta, model, value);
2523
2523
  logger_1.logger.debug(`${model.model}: Processed heartbeat message into payload ${JSON.stringify(heartbeat)}`, 'zhc:lumi:trv');
2524
2524
  if (heartbeat.firmware_version) {
@@ -2527,7 +2527,7 @@ exports.fromZigbee = {
2527
2527
  // This is not reflected in the frontend unless the device is reconfigured
2528
2528
  // or the whole service restarted.
2529
2529
  // See https://github.com/Koenkk/zigbee-herdsman-converters/pull/5363#discussion_r1081477047
2530
- // @ts-expect-error
2530
+ // @ts-expect-error ignore
2531
2531
  meta.device.softwareBuildID = heartbeat.firmware_version;
2532
2532
  delete heartbeat.firmware_version;
2533
2533
  }
@@ -2581,9 +2581,9 @@ exports.fromZigbee = {
2581
2581
  break;
2582
2582
  }
2583
2583
  const [regionIdRaw, eventTypeCodeRaw] = value;
2584
- // @ts-expect-error
2584
+ // @ts-expect-error ignore
2585
2585
  const regionId = parseInt(regionIdRaw, 10);
2586
- // @ts-expect-error
2586
+ // @ts-expect-error ignore
2587
2587
  const eventTypeCode = parseInt(eventTypeCodeRaw, 10);
2588
2588
  if (Number.isNaN(regionId)) {
2589
2589
  logger_1.logger.warning(`Action: Invalid regionId "${regionIdRaw}"`, NS);
@@ -2645,16 +2645,16 @@ exports.fromZigbee = {
2645
2645
  type: ['attributeReport', 'readResponse'],
2646
2646
  options: [exposes.options.occupancy_timeout_2(), exposes.options.no_occupancy_since_true()],
2647
2647
  convert: (model, msg, publish, options, meta) => {
2648
- if (msg.data.hasOwnProperty('illuminance')) {
2648
+ if (msg.data.illuminance !== undefined) {
2649
2649
  // The occupancy sensor only sends a message when motion detected.
2650
2650
  // Therefore we need to publish the no_motion detected by ourselves.
2651
- let timeout = meta && meta.state && meta.state.hasOwnProperty('detection_interval')
2651
+ let timeout = meta && meta.state && meta.state.detection_interval !== undefined
2652
2652
  ? Number(meta.state.detection_interval)
2653
2653
  : ['RTCGQ14LM'].includes(model.model)
2654
2654
  ? 30
2655
2655
  : 60;
2656
2656
  timeout =
2657
- options && options.hasOwnProperty('occupancy_timeout') && Number(options.occupancy_timeout) >= timeout
2657
+ options && options.occupancy_timeout !== undefined && Number(options.occupancy_timeout) >= timeout
2658
2658
  ? Number(options.occupancy_timeout)
2659
2659
  : timeout + 2;
2660
2660
  // Stop existing timers because motion is detected and set a new one.
@@ -2696,14 +2696,14 @@ exports.fromZigbee = {
2696
2696
  convert: (model, msg, publish, options, meta) => {
2697
2697
  const result = {};
2698
2698
  const invert = model.meta && model.meta.coverInverted ? !options.invert_cover : options.invert_cover;
2699
- if (msg.data.hasOwnProperty('currentPositionLiftPercentage') && msg.data['currentPositionLiftPercentage'] <= 100) {
2699
+ if (msg.data.currentPositionLiftPercentage !== undefined && msg.data['currentPositionLiftPercentage'] <= 100) {
2700
2700
  const value = msg.data['currentPositionLiftPercentage'];
2701
2701
  const position = invert ? 100 - value : value;
2702
2702
  const state = invert ? (position > 0 ? 'CLOSE' : 'OPEN') : position > 0 ? 'OPEN' : 'CLOSE';
2703
2703
  result[(0, utils_1.postfixWithEndpointName)('position', msg, model, meta)] = position;
2704
2704
  result[(0, utils_1.postfixWithEndpointName)('state', msg, model, meta)] = state;
2705
2705
  }
2706
- if (msg.data.hasOwnProperty('currentPositionTiltPercentage') && msg.data['currentPositionTiltPercentage'] <= 100) {
2706
+ if (msg.data.currentPositionTiltPercentage !== undefined && msg.data['currentPositionTiltPercentage'] <= 100) {
2707
2707
  const value = msg.data['currentPositionTiltPercentage'];
2708
2708
  result[(0, utils_1.postfixWithEndpointName)('tilt', msg, model, meta)] = invert ? 100 - value : value;
2709
2709
  }
@@ -2718,7 +2718,7 @@ exports.fromZigbee = {
2718
2718
  if (model.meta && !model.meta.multiEndpoint) {
2719
2719
  const mappingMode = { 0x12: 'control_relay', 0xfe: 'decoupled' };
2720
2720
  const key = 0xff22;
2721
- if (msg.data.hasOwnProperty(key)) {
2721
+ if (msg.data[key] !== undefined) {
2722
2722
  payload.operation_mode = mappingMode[msg.data[key]];
2723
2723
  }
2724
2724
  }
@@ -2726,7 +2726,7 @@ exports.fromZigbee = {
2726
2726
  const mappingButton = { 0xff22: 'left', 0xff23: 'right' };
2727
2727
  const mappingMode = { 0x12: 'control_left_relay', 0x22: 'control_right_relay', 0xfe: 'decoupled' };
2728
2728
  for (const key in mappingButton) {
2729
- if (msg.data.hasOwnProperty(key)) {
2729
+ if (msg.data[key] !== undefined) {
2730
2730
  payload[`operation_mode_${mappingButton[key]}`] = mappingMode[msg.data[key]];
2731
2731
  }
2732
2732
  }
@@ -2753,7 +2753,7 @@ exports.fromZigbee = {
2753
2753
  type: ['attributeReport', 'readResponse'],
2754
2754
  convert: (model, msg, publish, options, meta) => {
2755
2755
  // Lumi wall switches use endpoint 4, 5 or 6 to indicate an action on the button so we have to skip that.
2756
- if (msg.data.hasOwnProperty('onOff') && ![4, 5, 6].includes(msg.endpoint.ID)) {
2756
+ if (msg.data.onOff !== undefined && ![4, 5, 6].includes(msg.endpoint.ID)) {
2757
2757
  const property = (0, utils_1.postfixWithEndpointName)('state', msg, model, meta);
2758
2758
  return { [property]: msg.data['onOff'] === 1 ? 'ON' : 'OFF' };
2759
2759
  }
@@ -2772,7 +2772,7 @@ exports.fromZigbee = {
2772
2772
  // for lumi.curtain.acn002
2773
2773
  if (['ZNJLBL01LM'].includes(model.model))
2774
2774
  lookup = { 0: 'closing', 1: 'opening', 2: 'stopped', 3: 'blocked' };
2775
- if (data && data.hasOwnProperty('presentValue')) {
2775
+ if (data && data.presentValue !== undefined) {
2776
2776
  const value = data['presentValue'];
2777
2777
  if (value < 2) {
2778
2778
  running = true;
@@ -2788,13 +2788,13 @@ exports.fromZigbee = {
2788
2788
  cluster: 'manuSpecificLumi',
2789
2789
  type: ['attributeReport', 'readResponse'],
2790
2790
  convert: (model, msg, publish, options, meta) => {
2791
- if (msg.data.hasOwnProperty('curtainHandOpen')) {
2791
+ if (msg.data.curtainHandOpen !== undefined) {
2792
2792
  return { hand_open: msg.data['curtainHandOpen'] === 0 };
2793
2793
  }
2794
- else if (msg.data.hasOwnProperty('curtainReverse')) {
2794
+ else if (msg.data.curtainReverse !== undefined) {
2795
2795
  return { reverse_direction: msg.data['curtainReverse'] === 1 };
2796
2796
  }
2797
- else if (msg.data.hasOwnProperty('curtainCalibrated')) {
2797
+ else if (msg.data.curtainCalibrated !== undefined) {
2798
2798
  return { limits_calibration: msg.data['curtainCalibrated'] === 1 ? 'calibrated' : 'recalibrate' };
2799
2799
  }
2800
2800
  },
@@ -2817,7 +2817,7 @@ exports.fromZigbee = {
2817
2817
  // Therefore we need to publish a no_vibration message on our own.
2818
2818
  if (result.action === 'vibration') {
2819
2819
  result.vibration = true;
2820
- const timeout = options && options.hasOwnProperty('vibration_timeout') ? Number(options.vibration_timeout) : 90;
2820
+ const timeout = options && options.vibration_timeout !== undefined ? Number(options.vibration_timeout) : 90;
2821
2821
  // Stop any existing timer cause vibration detected
2822
2822
  clearTimeout(globalStore.getValue(msg.endpoint, 'vibration_timer', null));
2823
2823
  globalStore.putValue(msg.endpoint, 'vibration_timer', null);
@@ -2904,9 +2904,9 @@ exports.fromZigbee = {
2904
2904
  }
2905
2905
  // The occupancy sensor only sends a message when motion detected.
2906
2906
  // Therefore we need to publish the no_motion detected by ourselves.
2907
- let timeout = meta && meta.state && meta.state.hasOwnProperty('detection_interval') ? Number(meta.state.detection_interval) : 60;
2907
+ let timeout = meta && meta.state && meta.state.detection_interval !== undefined ? Number(meta.state.detection_interval) : 60;
2908
2908
  timeout =
2909
- options && options.hasOwnProperty('occupancy_timeout') && Number(options.occupancy_timeout) >= timeout
2909
+ options && options.occupancy_timeout !== undefined && Number(options.occupancy_timeout) >= timeout
2910
2910
  ? Number(options.occupancy_timeout)
2911
2911
  : timeout + 2;
2912
2912
  // Stop existing timers because motion is detected and set a new one.
@@ -2940,7 +2940,7 @@ exports.fromZigbee = {
2940
2940
  const data = msg.data;
2941
2941
  if (data && data['65281']) {
2942
2942
  const basicAttrs = data['65281'];
2943
- if (basicAttrs.hasOwnProperty('100')) {
2943
+ if (basicAttrs['100'] !== undefined) {
2944
2944
  return { gas_density: basicAttrs['100'] };
2945
2945
  }
2946
2946
  }
@@ -2952,7 +2952,7 @@ exports.fromZigbee = {
2952
2952
  convert: (model, msg, publish, options, meta) => {
2953
2953
  const data = msg.data;
2954
2954
  const lookup = { '1': 'low', '2': 'medium', '3': 'high' };
2955
- if (data && data.hasOwnProperty('65520')) {
2955
+ if (data && data['65520'] !== undefined) {
2956
2956
  const value = data['65520'];
2957
2957
  if (value && value.startsWith('0x020')) {
2958
2958
  return {
@@ -2966,7 +2966,7 @@ exports.fromZigbee = {
2966
2966
  cluster: 'genPowerCfg',
2967
2967
  type: ['attributeReport', 'readResponse'],
2968
2968
  convert: (model, msg, publish, options, meta) => {
2969
- if (msg.data.hasOwnProperty('batteryAlarmMask')) {
2969
+ if (msg.data.batteryAlarmMask !== undefined) {
2970
2970
  return { battery_low: msg.data['batteryAlarmMask'] === 1 };
2971
2971
  }
2972
2972
  },
@@ -3328,65 +3328,65 @@ exports.fromZigbee = {
3328
3328
  type: ['attributeReport', 'readResponse'],
3329
3329
  convert: (model, msg, publish, options, meta) => {
3330
3330
  const result = {};
3331
- if (msg.data.hasOwnProperty(0x0215)) {
3331
+ if (msg.data[0x0215] !== undefined) {
3332
3332
  const lookup = { 0: 'classic', 1: 'concise' };
3333
3333
  result.theme = lookup[msg.data[0x0215]];
3334
3334
  }
3335
- if (msg.data.hasOwnProperty(0x0214)) {
3335
+ if (msg.data[0x0214] !== undefined) {
3336
3336
  const lookup = { 1: 'classic', 2: 'analog clock' };
3337
3337
  result.screen_saver_style = lookup[msg.data[0x0214]];
3338
3338
  }
3339
- if (msg.data.hasOwnProperty(0x0213)) {
3339
+ if (msg.data[0x0213] !== undefined) {
3340
3340
  result.standby_enabled = msg.data[0x0213] & 1 ? true : false;
3341
3341
  }
3342
- if (msg.data.hasOwnProperty(0x0212)) {
3342
+ if (msg.data[0x0212] !== undefined) {
3343
3343
  const lookup = { 0: 'mute', 1: 'low', 2: 'medium', 3: 'high' };
3344
3344
  result.beep_volume = lookup[msg.data[0x0212]];
3345
3345
  }
3346
- if (msg.data.hasOwnProperty(0x0211)) {
3346
+ if (msg.data[0x0211] !== undefined) {
3347
3347
  result.lcd_brightness = msg.data[0x0211];
3348
3348
  }
3349
- if (msg.data.hasOwnProperty(0x022b)) {
3349
+ if (msg.data[0x022b] !== undefined) {
3350
3350
  const lookup = { 0: 'none', 1: '1', 2: '2', 3: '1 and 2', 4: '3', 5: '1 and 3', 6: '2 and 3', 7: 'all' };
3351
3351
  result.available_switches = lookup[msg.data[0x022b]];
3352
3352
  }
3353
- if (msg.data.hasOwnProperty(0x217)) {
3353
+ if (msg.data[0x217] !== undefined) {
3354
3354
  const lookup = { 3: 'small', 4: 'medium', 5: 'large' };
3355
3355
  result.font_size = lookup[msg.data[0x217]];
3356
3356
  }
3357
- if (msg.data.hasOwnProperty(0x219)) {
3357
+ if (msg.data[0x219] !== undefined) {
3358
3358
  const lookup = { 0: 'scene', 1: 'feel', 2: 'thermostat', 3: 'switch' };
3359
3359
  result.homepage = lookup[msg.data[0x219]];
3360
3360
  }
3361
- if (msg.data.hasOwnProperty(0x210)) {
3361
+ if (msg.data[0x210] !== undefined) {
3362
3362
  const lookup = { 0: 'chinese', 1: 'english' };
3363
3363
  result.language = lookup[msg.data[0x210]];
3364
3364
  }
3365
- if (msg.data.hasOwnProperty(0x216)) {
3365
+ if (msg.data[0x216] !== undefined) {
3366
3366
  result.standby_time = msg.data[0x216];
3367
3367
  }
3368
- if (msg.data.hasOwnProperty(0x218)) {
3368
+ if (msg.data[0x218] !== undefined) {
3369
3369
  result.lcd_auto_brightness_enabled = msg.data[0x218] & 1 ? true : false;
3370
3370
  }
3371
- if (msg.data.hasOwnProperty(0x221)) {
3371
+ if (msg.data[0x221] !== undefined) {
3372
3372
  result.screen_saver_enabled = msg.data[0x221] & 1 ? true : false;
3373
3373
  }
3374
- if (msg.data.hasOwnProperty(0x222)) {
3374
+ if (msg.data[0x222] !== undefined) {
3375
3375
  result.standby_lcd_brightness = msg.data[0x222];
3376
3376
  }
3377
- if (msg.data.hasOwnProperty(0x223)) {
3377
+ if (msg.data[0x223] !== undefined) {
3378
3378
  const lookup = { 1: '1', 2: '2', 3: '3', 4: '4', 5: '5', 6: '6', 7: '7', 8: '8', 9: '9', 10: '10', 11: '11' };
3379
3379
  const textarr = msg.data[0x223].slice(1, msg.data[0x223].length);
3380
3380
  result.switch_1_icon = lookup[msg.data[0x223][0]];
3381
3381
  result.switch_1_text = String.fromCharCode(...textarr);
3382
3382
  }
3383
- if (msg.data.hasOwnProperty(0x224)) {
3383
+ if (msg.data[0x224] !== undefined) {
3384
3384
  const lookup = { 1: '1', 2: '2', 3: '3', 4: '4', 5: '5', 6: '6', 7: '7', 8: '8', 9: '9', 10: '10', 11: '11' };
3385
3385
  const textarr = msg.data[0x224].slice(1, msg.data[0x224].length);
3386
3386
  result.switch_2_icon = lookup[msg.data[0x224][0]];
3387
3387
  result.switch_2_text = String.fromCharCode(...textarr);
3388
3388
  }
3389
- if (msg.data.hasOwnProperty(0x225)) {
3389
+ if (msg.data[0x225] !== undefined) {
3390
3390
  const lookup = { 1: '1', 2: '2', 3: '3', 4: '4', 5: '5', 6: '6', 7: '7', 8: '8', 9: '9', 10: '10', 11: '11' };
3391
3391
  const textarr = msg.data[0x225].slice(1, msg.data[0x225].length);
3392
3392
  result.switch_3_icon = lookup[msg.data[0x225][0]];
@@ -3523,11 +3523,11 @@ exports.toZigbee = {
3523
3523
  key: ['feed', 'schedule', 'led_indicator', 'child_lock', 'mode', 'serving_size', 'portion_weight'],
3524
3524
  convertSet: async (entity, key, value, meta) => {
3525
3525
  const sendAttr = async (attrCode, value, length) => {
3526
- // @ts-expect-error
3526
+ // @ts-expect-error ignore
3527
3527
  entity.sendSeq = ((entity.sendSeq || 0) + 1) % 256;
3528
- // @ts-expect-error
3528
+ // @ts-expect-error ignore
3529
3529
  const val = node_buffer_1.Buffer.from([0x00, 0x02, entity.sendSeq, 0, 0, 0, 0, 0]);
3530
- // @ts-expect-error
3530
+ // @ts-expect-error ignore
3531
3531
  entity.sendSeq += 1;
3532
3532
  val.writeInt32BE(attrCode, 3);
3533
3533
  val.writeUInt8(length, 7);
@@ -3543,7 +3543,7 @@ exports.toZigbee = {
3543
3543
  v.writeUInt32BE(value);
3544
3544
  break;
3545
3545
  default:
3546
- // @ts-expect-error
3546
+ // @ts-expect-error ignore
3547
3547
  v = value;
3548
3548
  }
3549
3549
  await entity.write('manuSpecificLumi', { 0xfff1: { value: node_buffer_1.Buffer.concat([val, v]), type: 0x41 } }, { manufacturerCode: exports.manufacturerCode });
@@ -3554,13 +3554,13 @@ exports.toZigbee = {
3554
3554
  break;
3555
3555
  case 'schedule': {
3556
3556
  const schedule = [];
3557
- // @ts-expect-error
3557
+ // @ts-expect-error ignore
3558
3558
  value.forEach((item) => {
3559
3559
  const schedItem = node_buffer_1.Buffer.from([(0, utils_1.getKey)(feederDaysLookup, item.days, 0x7f), item.hour, item.minute, item.size, 0]);
3560
3560
  schedule.push(schedItem.toString('hex'));
3561
3561
  });
3562
3562
  const val = node_buffer_1.Buffer.concat([node_buffer_1.Buffer.from(schedule.join(',')), node_buffer_1.Buffer.from([0])]);
3563
- // @ts-expect-error
3563
+ // @ts-expect-error ignore
3564
3564
  await sendAttr(0x080008c8, val, val.length);
3565
3565
  break;
3566
3566
  }
@@ -3574,11 +3574,11 @@ exports.toZigbee = {
3574
3574
  await sendAttr(0x04180055, (0, utils_1.getFromLookup)(value, { manual: 0, schedule: 1 }), 1);
3575
3575
  break;
3576
3576
  case 'serving_size':
3577
- // @ts-expect-error
3577
+ // @ts-expect-error ignore
3578
3578
  await sendAttr(0x0e5c0055, value, 4);
3579
3579
  break;
3580
3580
  case 'portion_weight':
3581
- // @ts-expect-error
3581
+ // @ts-expect-error ignore
3582
3582
  await sendAttr(0x0e5f0055, value, 4);
3583
3583
  break;
3584
3584
  default: // Unknown key
@@ -3758,7 +3758,7 @@ exports.toZigbee = {
3758
3758
  }, { manufacturerCode: exports.manufacturerCode });
3759
3759
  break;
3760
3760
  case 'schedule_settings': {
3761
- // @ts-expect-error
3761
+ // @ts-expect-error ignore
3762
3762
  const schedule = exports.trv.parseSchedule(value);
3763
3763
  exports.trv.validateSchedule(schedule);
3764
3764
  const buffer = exports.trv.encodeSchedule(schedule);
@@ -3782,9 +3782,7 @@ exports.toZigbee = {
3782
3782
  schedule: 0x027d,
3783
3783
  schedule_settings: 0x0276,
3784
3784
  };
3785
- if (dict.hasOwnProperty(key)) {
3786
- await entity.read('manuSpecificLumi', [(0, utils_1.getFromLookup)(key, dict)], { manufacturerCode: exports.manufacturerCode });
3787
- }
3785
+ await entity.read('manuSpecificLumi', [(0, utils_1.getFromLookup)(key, dict)], { manufacturerCode: exports.manufacturerCode });
3788
3786
  },
3789
3787
  },
3790
3788
  lumi_presence_region_upsert: {
@@ -3841,7 +3839,7 @@ exports.toZigbee = {
3841
3839
  const commandWrapper = exports.presence.parseAqaraFp1RegionDeleteInput(value);
3842
3840
  if (!commandWrapper.isSuccess) {
3843
3841
  logger_1.logger.warning(
3844
- // @ts-expect-error
3842
+ // @ts-expect-error ignore
3845
3843
  `Encountered an error (${commandWrapper.error.reason}) while parsing configuration commands (input: ${JSON.stringify(value)})`, NS);
3846
3844
  return;
3847
3845
  }
@@ -3888,7 +3886,7 @@ exports.toZigbee = {
3888
3886
  (0, utils_1.assertEndpoint)(entity);
3889
3887
  if (Array.isArray(meta.mapped))
3890
3888
  throw new Error(`Not supported for groups`);
3891
- let targetValue = (0, utils_1.isObject)(value) && value.hasOwnProperty('state') ? value.state : value;
3889
+ let targetValue = (0, utils_1.isObject)(value) && value.state !== undefined ? value.state : value;
3892
3890
  // 1/2 gang switches using genBasic on endpoint 1.
3893
3891
  let attrId;
3894
3892
  let attrValue;
@@ -3936,7 +3934,7 @@ exports.toZigbee = {
3936
3934
  key: ['operation_mode'],
3937
3935
  convertSet: async (entity, key, value, meta) => {
3938
3936
  // Support existing syntax of a nested object just for the state field. Though it's quite silly IMO.
3939
- const targetValue = (0, utils_1.isObject)(value) && value.hasOwnProperty('state') ? value.state : value;
3937
+ const targetValue = (0, utils_1.isObject)(value) && value.state !== undefined ? value.state : value;
3940
3938
  // Switches using manuSpecificLumi 0x0200 on the same endpoints as the onOff clusters.
3941
3939
  const lookupState = { control_relay: 0x01, decoupled: 0x00 };
3942
3940
  await entity.write('manuSpecificLumi', { 0x0200: { value: (0, utils_1.getFromLookup)(targetValue, lookupState), type: 0x20 } }, manufacturerOptions.lumi);
@@ -4008,7 +4006,7 @@ exports.toZigbee = {
4008
4006
  const lookup = { rgbw: 3, dual_ct: 1 };
4009
4007
  (0, utils_1.assertString)(value, key);
4010
4008
  value = value.toLowerCase();
4011
- // @ts-expect-error
4009
+ // @ts-expect-error ignore
4012
4010
  if (['rgbw'].includes(value)) {
4013
4011
  await entity.write('manuSpecificLumi', { 0x0509: { value: (0, utils_1.getFromLookup)(value, lookup), type: 0x23 } }, manufacturerOptions.lumi);
4014
4012
  await entity.write('manuSpecificLumi', { 0x050f: { value: 1, type: 0x23 } }, manufacturerOptions.lumi);
@@ -4123,7 +4121,7 @@ exports.toZigbee = {
4123
4121
  }
4124
4122
  else if (['ZNQBKG38LM', 'ZNQBKG39LM', 'ZNQBKG40LM', 'ZNQBKG41LM'].includes(meta.mapped.model)) {
4125
4123
  // Support existing syntax of a nested object just for the state field. Though it's quite silly IMO.
4126
- const targetValue = (0, utils_1.isObject)(value) && value.hasOwnProperty('state') ? value.state : value;
4124
+ const targetValue = (0, utils_1.isObject)(value) && value.state !== undefined ? value.state : value;
4127
4125
  const lookupState = { on: 0x01, electric_appliances_on: 0x00, electric_appliances_off: 0x02, inverted: 0x03 };
4128
4126
  await entity.write('manuSpecificLumi', { 0x0517: { value: (0, utils_1.getFromLookup)(targetValue, lookupState), type: 0x20 } }, manufacturerOptions.lumi);
4129
4127
  }
@@ -4382,9 +4380,9 @@ exports.toZigbee = {
4382
4380
  ...value,
4383
4381
  };
4384
4382
  // Legacy names
4385
- if (value.hasOwnProperty('auto_close'))
4383
+ if (value.auto_close !== undefined)
4386
4384
  opts.hand_open = value.auto_close;
4387
- if (value.hasOwnProperty('reset_move'))
4385
+ if (value.reset_move !== undefined)
4388
4386
  opts.reset_limits = value.reset_move;
4389
4387
  if (meta.mapped.model === 'ZNCLDJ12LM') {
4390
4388
  await entity.write('genBasic', { 0xff28: { value: opts.reverse_direction, type: 0x10 } }, manufacturerOptions.lumi);
@@ -4613,7 +4611,7 @@ exports.toZigbee = {
4613
4611
  logger_1.logger.info('Moving curtain and waiting to reach the end position.', NS);
4614
4612
  // Wait until the curtain gets into a moving state, then wait until it gets blocked or stopped
4615
4613
  const waitForStateTransition = async (initialStates, desiredStates) => {
4616
- return new Promise((resolve) => {
4614
+ return await new Promise((resolve) => {
4617
4615
  const checkState = async () => {
4618
4616
  const result = await entity.read('manuSpecificLumi', [0x0421]);
4619
4617
  const state = result ? result[0x0421] : null;
@@ -4845,7 +4843,7 @@ exports.toZigbee = {
4845
4843
  const payload = [];
4846
4844
  const statearr = {};
4847
4845
  (0, utils_1.assertObject)(value);
4848
- if (value.hasOwnProperty('switch_1_icon')) {
4846
+ if (value.switch_1_icon !== undefined) {
4849
4847
  payload.push((0, utils_1.getFromLookup)(value.switch_1_icon, lookup));
4850
4848
  statearr.switch_1_icon = value.switch_1_icon;
4851
4849
  }
@@ -4853,12 +4851,12 @@ exports.toZigbee = {
4853
4851
  payload.push(1);
4854
4852
  statearr.switch_1_icon = '1';
4855
4853
  }
4856
- if (value.hasOwnProperty('switch_1_text')) {
4854
+ if (value.switch_1_text !== undefined) {
4857
4855
  payload.push(...value.switch_1_text.split('').map((c) => c.charCodeAt(0)));
4858
4856
  statearr.switch_1_text = value.switch_1_text;
4859
4857
  }
4860
4858
  else {
4861
- // @ts-expect-error
4859
+ // @ts-expect-error ignore
4862
4860
  payload.push(...''.text.split('').map((c) => c.charCodeAt(0)));
4863
4861
  statearr.switch_1_text = '';
4864
4862
  }
@@ -4870,7 +4868,7 @@ exports.toZigbee = {
4870
4868
  const payload = [];
4871
4869
  const statearr = {};
4872
4870
  (0, utils_1.assertObject)(value);
4873
- if (value.hasOwnProperty('switch_2_icon')) {
4871
+ if (value.switch_2_icon !== undefined) {
4874
4872
  payload.push((0, utils_1.getFromLookup)(value.switch_2_icon, lookup));
4875
4873
  statearr.switch_2_icon = value.switch_2_icon;
4876
4874
  }
@@ -4878,12 +4876,12 @@ exports.toZigbee = {
4878
4876
  payload.push(1);
4879
4877
  statearr.switch_2_icon = '1';
4880
4878
  }
4881
- if (value.hasOwnProperty('switch_2_text')) {
4879
+ if (value.switch_2_text !== undefined) {
4882
4880
  payload.push(...value.switch_2_text.split('').map((c) => c.charCodeAt(0)));
4883
4881
  statearr.switch_2_text = value.switch_2_text;
4884
4882
  }
4885
4883
  else {
4886
- // @ts-expect-error
4884
+ // @ts-expect-error ignore
4887
4885
  payload.push(...''.text.split('').map((c) => c.charCodeAt(0)));
4888
4886
  statearr.switch_2_text = '';
4889
4887
  }
@@ -4895,7 +4893,7 @@ exports.toZigbee = {
4895
4893
  const payload = [];
4896
4894
  const statearr = {};
4897
4895
  (0, utils_1.assertObject)(value);
4898
- if (value.hasOwnProperty('switch_3_icon')) {
4896
+ if (value.switch_3_icon !== undefined) {
4899
4897
  payload.push((0, utils_1.getFromLookup)(value.switch_3_icon, lookup));
4900
4898
  statearr.switch_3_icon = value.switch_3_icon;
4901
4899
  }
@@ -4903,12 +4901,12 @@ exports.toZigbee = {
4903
4901
  payload.push(1);
4904
4902
  statearr.switch_3_icon = '1';
4905
4903
  }
4906
- if (value.hasOwnProperty('switch_3_text')) {
4904
+ if (value.switch_3_text !== undefined) {
4907
4905
  payload.push(...value.switch_3_text.split('').map((c) => c.charCodeAt(0)));
4908
4906
  statearr.switch_3_text = value.switch_3_text;
4909
4907
  }
4910
4908
  else {
4911
- // @ts-expect-error
4909
+ // @ts-expect-error ignore
4912
4910
  payload.push(...''.text.split('').map((c) => c.charCodeAt(0)));
4913
4911
  statearr.switch_3_text = '';
4914
4912
  }
@@ -4947,7 +4945,7 @@ exports.legacyFromZigbee = {
4947
4945
  legacyFromZigbeeStore[key].long_timer = setTimeout(() => {
4948
4946
  legacyFromZigbeeStore[key].long = false;
4949
4947
  }, 4000); // After 4000 milliseconds of not receiving long_release we assume it will not happen.
4950
- // @ts-expect-error
4948
+ // @ts-expect-error ignore
4951
4949
  }, options.long_timeout || 1000); // After 1000 milliseconds of not releasing we assume long click.
4952
4950
  }
4953
4951
  else if (state === 1) {