zigbee-herdsman-converters 21.9.0 → 21.9.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1394) hide show
  1. package/CHANGELOG.md +9 -0
  2. package/converters/fromZigbee.d.ts +2036 -0
  3. package/converters/fromZigbee.d.ts.map +1 -0
  4. package/converters/fromZigbee.js +5343 -0
  5. package/converters/fromZigbee.js.map +1 -0
  6. package/converters/toZigbee.d.ts +1578 -0
  7. package/converters/toZigbee.d.ts.map +1 -0
  8. package/converters/toZigbee.js +4422 -0
  9. package/converters/toZigbee.js.map +1 -0
  10. package/devices/ITCommander.d.ts +4 -0
  11. package/devices/ITCommander.d.ts.map +1 -0
  12. package/devices/ITCommander.js +77 -0
  13. package/devices/ITCommander.js.map +1 -0
  14. package/devices/acova.d.ts +4 -0
  15. package/devices/acova.d.ts.map +1 -0
  16. package/devices/acova.js +127 -0
  17. package/devices/acova.js.map +1 -0
  18. package/devices/acuity_brands_lighting.d.ts +4 -0
  19. package/devices/acuity_brands_lighting.d.ts.map +1 -0
  20. package/devices/acuity_brands_lighting.js +29 -0
  21. package/devices/acuity_brands_lighting.js.map +1 -0
  22. package/devices/adeo.d.ts +4 -0
  23. package/devices/adeo.d.ts.map +1 -0
  24. package/devices/adeo.js +486 -0
  25. package/devices/adeo.js.map +1 -0
  26. package/devices/adurosmart.d.ts +4 -0
  27. package/devices/adurosmart.d.ts.map +1 -0
  28. package/devices/adurosmart.js +183 -0
  29. package/devices/adurosmart.js.map +1 -0
  30. package/devices/aeotec.d.ts +4 -0
  31. package/devices/aeotec.d.ts.map +1 -0
  32. package/devices/aeotec.js +66 -0
  33. package/devices/aeotec.js.map +1 -0
  34. package/devices/airam.d.ts +4 -0
  35. package/devices/airam.d.ts.map +1 -0
  36. package/devices/airam.js +106 -0
  37. package/devices/airam.js.map +1 -0
  38. package/devices/airzone_aidoo.d.ts +4 -0
  39. package/devices/airzone_aidoo.d.ts.map +1 -0
  40. package/devices/airzone_aidoo.js +81 -0
  41. package/devices/airzone_aidoo.js.map +1 -0
  42. package/devices/ajax_online.d.ts +4 -0
  43. package/devices/ajax_online.d.ts.map +1 -0
  44. package/devices/ajax_online.js +84 -0
  45. package/devices/ajax_online.js.map +1 -0
  46. package/devices/akuvox.d.ts +4 -0
  47. package/devices/akuvox.d.ts.map +1 -0
  48. package/devices/akuvox.js +68 -0
  49. package/devices/akuvox.js.map +1 -0
  50. package/devices/alchemy.d.ts +4 -0
  51. package/devices/alchemy.d.ts.map +1 -0
  52. package/devices/alchemy.js +22 -0
  53. package/devices/alchemy.js.map +1 -0
  54. package/devices/aldi.d.ts +4 -0
  55. package/devices/aldi.d.ts.map +1 -0
  56. package/devices/aldi.js +57 -0
  57. package/devices/aldi.js.map +1 -0
  58. package/devices/alecto.d.ts +4 -0
  59. package/devices/alecto.d.ts.map +1 -0
  60. package/devices/alecto.js +101 -0
  61. package/devices/alecto.js.map +1 -0
  62. package/devices/amina.d.ts +4 -0
  63. package/devices/amina.d.ts.map +1 -0
  64. package/devices/amina.js +370 -0
  65. package/devices/amina.js.map +1 -0
  66. package/devices/anchor.d.ts +4 -0
  67. package/devices/anchor.d.ts.map +1 -0
  68. package/devices/anchor.js +15 -0
  69. package/devices/anchor.js.map +1 -0
  70. package/devices/atlantic.d.ts +4 -0
  71. package/devices/atlantic.d.ts.map +1 -0
  72. package/devices/atlantic.js +146 -0
  73. package/devices/atlantic.js.map +1 -0
  74. package/devices/atsmart.d.ts +4 -0
  75. package/devices/atsmart.d.ts.map +1 -0
  76. package/devices/atsmart.js +15 -0
  77. package/devices/atsmart.js.map +1 -0
  78. package/devices/aubess.d.ts +4 -0
  79. package/devices/aubess.d.ts.map +1 -0
  80. package/devices/aubess.js +60 -0
  81. package/devices/aubess.js.map +1 -0
  82. package/devices/aurora_lighting.d.ts +4 -0
  83. package/devices/aurora_lighting.d.ts.map +1 -0
  84. package/devices/aurora_lighting.js +338 -0
  85. package/devices/aurora_lighting.js.map +1 -0
  86. package/devices/automaton.d.ts +4 -0
  87. package/devices/automaton.d.ts.map +1 -0
  88. package/devices/automaton.js +65 -0
  89. package/devices/automaton.js.map +1 -0
  90. package/devices/avatto.d.ts +4 -0
  91. package/devices/avatto.d.ts.map +1 -0
  92. package/devices/avatto.js +67 -0
  93. package/devices/avatto.js.map +1 -0
  94. package/devices/awox.d.ts +4 -0
  95. package/devices/awox.d.ts.map +1 -0
  96. package/devices/awox.js +240 -0
  97. package/devices/awox.js.map +1 -0
  98. package/devices/axis.d.ts +4 -0
  99. package/devices/axis.d.ts.map +1 -0
  100. package/devices/axis.js +63 -0
  101. package/devices/axis.js.map +1 -0
  102. package/devices/bankamp.d.ts +4 -0
  103. package/devices/bankamp.d.ts.map +1 -0
  104. package/devices/bankamp.js +15 -0
  105. package/devices/bankamp.js.map +1 -0
  106. package/devices/bega.d.ts +4 -0
  107. package/devices/bega.d.ts.map +1 -0
  108. package/devices/bega.js +29 -0
  109. package/devices/bega.js.map +1 -0
  110. package/devices/belkin.d.ts +4 -0
  111. package/devices/belkin.d.ts.map +1 -0
  112. package/devices/belkin.js +15 -0
  113. package/devices/belkin.js.map +1 -0
  114. package/devices/bitron.d.ts +4 -0
  115. package/devices/bitron.d.ts.map +1 -0
  116. package/devices/bitron.js +359 -0
  117. package/devices/bitron.js.map +1 -0
  118. package/devices/bituo_technik.d.ts +4 -0
  119. package/devices/bituo_technik.d.ts.map +1 -0
  120. package/devices/bituo_technik.js +121 -0
  121. package/devices/bituo_technik.js.map +1 -0
  122. package/devices/blaupunkt.d.ts +4 -0
  123. package/devices/blaupunkt.d.ts.map +1 -0
  124. package/devices/blaupunkt.js +68 -0
  125. package/devices/blaupunkt.js.map +1 -0
  126. package/devices/blitzwolf.d.ts +4 -0
  127. package/devices/blitzwolf.d.ts.map +1 -0
  128. package/devices/blitzwolf.js +73 -0
  129. package/devices/blitzwolf.js.map +1 -0
  130. package/devices/bosch.d.ts +4 -0
  131. package/devices/bosch.d.ts.map +1 -0
  132. package/devices/bosch.js +2048 -0
  133. package/devices/bosch.js.map +1 -0
  134. package/devices/bouffalo_lab.d.ts +4 -0
  135. package/devices/bouffalo_lab.d.ts.map +1 -0
  136. package/devices/bouffalo_lab.js +15 -0
  137. package/devices/bouffalo_lab.js.map +1 -0
  138. package/devices/brimate.d.ts +4 -0
  139. package/devices/brimate.d.ts.map +1 -0
  140. package/devices/brimate.js +55 -0
  141. package/devices/brimate.js.map +1 -0
  142. package/devices/bseed.d.ts +4 -0
  143. package/devices/bseed.d.ts.map +1 -0
  144. package/devices/bseed.js +57 -0
  145. package/devices/bseed.js.map +1 -0
  146. package/devices/bticino.d.ts +4 -0
  147. package/devices/bticino.d.ts.map +1 -0
  148. package/devices/bticino.js +113 -0
  149. package/devices/bticino.js.map +1 -0
  150. package/devices/busch_jaeger.d.ts +4 -0
  151. package/devices/busch_jaeger.d.ts.map +1 -0
  152. package/devices/busch_jaeger.js +186 -0
  153. package/devices/busch_jaeger.js.map +1 -0
  154. package/devices/byun.d.ts +4 -0
  155. package/devices/byun.d.ts.map +1 -0
  156. package/devices/byun.js +64 -0
  157. package/devices/byun.js.map +1 -0
  158. package/devices/calex.d.ts +4 -0
  159. package/devices/calex.d.ts.map +1 -0
  160. package/devices/calex.js +91 -0
  161. package/devices/calex.js.map +1 -0
  162. package/devices/candeo.d.ts +4 -0
  163. package/devices/candeo.d.ts.map +1 -0
  164. package/devices/candeo.js +185 -0
  165. package/devices/candeo.js.map +1 -0
  166. package/devices/casaia.d.ts +4 -0
  167. package/devices/casaia.d.ts.map +1 -0
  168. package/devices/casaia.js +99 -0
  169. package/devices/casaia.js.map +1 -0
  170. package/devices/cel.d.ts +4 -0
  171. package/devices/cel.d.ts.map +1 -0
  172. package/devices/cel.js +20 -0
  173. package/devices/cel.js.map +1 -0
  174. package/devices/centralite.d.ts +4 -0
  175. package/devices/centralite.d.ts.map +1 -0
  176. package/devices/centralite.js +444 -0
  177. package/devices/centralite.js.map +1 -0
  178. package/devices/chacon.d.ts +4 -0
  179. package/devices/chacon.d.ts.map +1 -0
  180. package/devices/chacon.js +18 -0
  181. package/devices/chacon.js.map +1 -0
  182. package/devices/cleode.d.ts +4 -0
  183. package/devices/cleode.d.ts.map +1 -0
  184. package/devices/cleode.js +15 -0
  185. package/devices/cleode.js.map +1 -0
  186. package/devices/cleverio.d.ts +4 -0
  187. package/devices/cleverio.d.ts.map +1 -0
  188. package/devices/cleverio.js +77 -0
  189. package/devices/cleverio.js.map +1 -0
  190. package/devices/climax.d.ts +4 -0
  191. package/devices/climax.d.ts.map +1 -0
  192. package/devices/climax.js +181 -0
  193. package/devices/climax.js.map +1 -0
  194. package/devices/commercial_electric.d.ts +4 -0
  195. package/devices/commercial_electric.d.ts.map +1 -0
  196. package/devices/commercial_electric.js +15 -0
  197. package/devices/commercial_electric.js.map +1 -0
  198. package/devices/cree.d.ts +4 -0
  199. package/devices/cree.d.ts.map +1 -0
  200. package/devices/cree.js +15 -0
  201. package/devices/cree.js.map +1 -0
  202. package/devices/ctm.d.ts +4 -0
  203. package/devices/ctm.d.ts.map +1 -0
  204. package/devices/ctm.js +1383 -0
  205. package/devices/ctm.js.map +1 -0
  206. package/devices/current_products_corp.d.ts +4 -0
  207. package/devices/current_products_corp.d.ts.map +1 -0
  208. package/devices/current_products_corp.js +64 -0
  209. package/devices/current_products_corp.js.map +1 -0
  210. package/devices/custom_devices_diy.d.ts +4 -0
  211. package/devices/custom_devices_diy.d.ts.map +1 -0
  212. package/devices/custom_devices_diy.js +1206 -0
  213. package/devices/custom_devices_diy.js.map +1 -0
  214. package/devices/cy_lighting.d.ts +4 -0
  215. package/devices/cy_lighting.d.ts.map +1 -0
  216. package/devices/cy_lighting.js +15 -0
  217. package/devices/cy_lighting.js.map +1 -0
  218. package/devices/danalock.d.ts +4 -0
  219. package/devices/danalock.d.ts.map +1 -0
  220. package/devices/danalock.js +65 -0
  221. package/devices/danalock.js.map +1 -0
  222. package/devices/danfoss.d.ts +4 -0
  223. package/devices/danfoss.d.ts.map +1 -0
  224. package/devices/danfoss.js +743 -0
  225. package/devices/danfoss.js.map +1 -0
  226. package/devices/databyte.d.ts +4 -0
  227. package/devices/databyte.d.ts.map +1 -0
  228. package/devices/databyte.js +95 -0
  229. package/devices/databyte.js.map +1 -0
  230. package/devices/datek.d.ts +4 -0
  231. package/devices/datek.d.ts.map +1 -0
  232. package/devices/datek.js +298 -0
  233. package/devices/datek.js.map +1 -0
  234. package/devices/dawon_dns.d.ts +4 -0
  235. package/devices/dawon_dns.d.ts.map +1 -0
  236. package/devices/dawon_dns.js +318 -0
  237. package/devices/dawon_dns.js.map +1 -0
  238. package/devices/develco.d.ts +4 -0
  239. package/devices/develco.d.ts.map +1 -0
  240. package/devices/develco.js +1037 -0
  241. package/devices/develco.js.map +1 -0
  242. package/devices/digi.d.ts +4 -0
  243. package/devices/digi.d.ts.map +1 -0
  244. package/devices/digi.js +25 -0
  245. package/devices/digi.js.map +1 -0
  246. package/devices/diyruz.d.ts +4 -0
  247. package/devices/diyruz.d.ts.map +1 -0
  248. package/devices/diyruz.js +403 -0
  249. package/devices/diyruz.js.map +1 -0
  250. package/devices/dlink.d.ts +4 -0
  251. package/devices/dlink.d.ts.map +1 -0
  252. package/devices/dlink.js +76 -0
  253. package/devices/dlink.js.map +1 -0
  254. package/devices/dnake.d.ts +4 -0
  255. package/devices/dnake.d.ts.map +1 -0
  256. package/devices/dnake.js +15 -0
  257. package/devices/dnake.js.map +1 -0
  258. package/devices/dowsing_reynolds.d.ts +4 -0
  259. package/devices/dowsing_reynolds.d.ts.map +1 -0
  260. package/devices/dowsing_reynolds.js +15 -0
  261. package/devices/dowsing_reynolds.js.map +1 -0
  262. package/devices/dresden_elektronik.d.ts +4 -0
  263. package/devices/dresden_elektronik.d.ts.map +1 -0
  264. package/devices/dresden_elektronik.js +50 -0
  265. package/devices/dresden_elektronik.js.map +1 -0
  266. package/devices/easyaccess.d.ts +4 -0
  267. package/devices/easyaccess.d.ts.map +1 -0
  268. package/devices/easyaccess.js +71 -0
  269. package/devices/easyaccess.js.map +1 -0
  270. package/devices/easyiot.d.ts +4 -0
  271. package/devices/easyiot.d.ts.map +1 -0
  272. package/devices/easyiot.js +358 -0
  273. package/devices/easyiot.js.map +1 -0
  274. package/devices/eatonhalo_led.d.ts +4 -0
  275. package/devices/eatonhalo_led.d.ts.map +1 -0
  276. package/devices/eatonhalo_led.js +15 -0
  277. package/devices/eatonhalo_led.js.map +1 -0
  278. package/devices/echostar.d.ts +4 -0
  279. package/devices/echostar.d.ts.map +1 -0
  280. package/devices/echostar.js +65 -0
  281. package/devices/echostar.js.map +1 -0
  282. package/devices/ecodim.d.ts +4 -0
  283. package/devices/ecodim.d.ts.map +1 -0
  284. package/devices/ecodim.js +270 -0
  285. package/devices/ecodim.js.map +1 -0
  286. package/devices/ecolink.d.ts +4 -0
  287. package/devices/ecolink.d.ts.map +1 -0
  288. package/devices/ecolink.js +61 -0
  289. package/devices/ecolink.js.map +1 -0
  290. package/devices/ecosmart.d.ts +4 -0
  291. package/devices/ecosmart.d.ts.map +1 -0
  292. package/devices/ecosmart.js +83 -0
  293. package/devices/ecosmart.js.map +1 -0
  294. package/devices/ecozy.d.ts +4 -0
  295. package/devices/ecozy.d.ts.map +1 -0
  296. package/devices/ecozy.js +89 -0
  297. package/devices/ecozy.js.map +1 -0
  298. package/devices/edp.d.ts +4 -0
  299. package/devices/edp.d.ts.map +1 -0
  300. package/devices/edp.js +74 -0
  301. package/devices/edp.js.map +1 -0
  302. package/devices/efekta.d.ts +4 -0
  303. package/devices/efekta.d.ts.map +1 -0
  304. package/devices/efekta.js +754 -0
  305. package/devices/efekta.js.map +1 -0
  306. package/devices/eglo.d.ts +4 -0
  307. package/devices/eglo.d.ts.map +1 -0
  308. package/devices/eglo.js +132 -0
  309. package/devices/eglo.js.map +1 -0
  310. package/devices/elko.d.ts +4 -0
  311. package/devices/elko.d.ts.map +1 -0
  312. package/devices/elko.js +240 -0
  313. package/devices/elko.js.map +1 -0
  314. package/devices/enbrighten.d.ts +4 -0
  315. package/devices/enbrighten.d.ts.map +1 -0
  316. package/devices/enbrighten.js +97 -0
  317. package/devices/enbrighten.js.map +1 -0
  318. package/devices/enocean.d.ts +4 -0
  319. package/devices/enocean.d.ts.map +1 -0
  320. package/devices/enocean.js +153 -0
  321. package/devices/enocean.js.map +1 -0
  322. package/devices/envilar.d.ts +4 -0
  323. package/devices/envilar.d.ts.map +1 -0
  324. package/devices/envilar.js +100 -0
  325. package/devices/envilar.js.map +1 -0
  326. package/devices/essentialb.d.ts +4 -0
  327. package/devices/essentialb.d.ts.map +1 -0
  328. package/devices/essentialb.js +137 -0
  329. package/devices/essentialb.js.map +1 -0
  330. package/devices/essentials.d.ts +4 -0
  331. package/devices/essentials.d.ts.map +1 -0
  332. package/devices/essentials.js +151 -0
  333. package/devices/essentials.js.map +1 -0
  334. package/devices/eucontrols.d.ts +4 -0
  335. package/devices/eucontrols.d.ts.map +1 -0
  336. package/devices/eucontrols.js +15 -0
  337. package/devices/eucontrols.js.map +1 -0
  338. package/devices/eurotronic.d.ts +4 -0
  339. package/devices/eurotronic.d.ts.map +1 -0
  340. package/devices/eurotronic.js +128 -0
  341. package/devices/eurotronic.js.map +1 -0
  342. package/devices/evanell.d.ts +4 -0
  343. package/devices/evanell.d.ts.map +1 -0
  344. package/devices/evanell.js +75 -0
  345. package/devices/evanell.js.map +1 -0
  346. package/devices/evn.d.ts +4 -0
  347. package/devices/evn.d.ts.map +1 -0
  348. package/devices/evn.js +94 -0
  349. package/devices/evn.js.map +1 -0
  350. package/devices/evology.d.ts +4 -0
  351. package/devices/evology.d.ts.map +1 -0
  352. package/devices/evology.js +64 -0
  353. package/devices/evology.js.map +1 -0
  354. package/devices/evvr.d.ts +4 -0
  355. package/devices/evvr.d.ts.map +1 -0
  356. package/devices/evvr.js +15 -0
  357. package/devices/evvr.js.map +1 -0
  358. package/devices/ewelink.d.ts +4 -0
  359. package/devices/ewelink.d.ts.map +1 -0
  360. package/devices/ewelink.js +343 -0
  361. package/devices/ewelink.js.map +1 -0
  362. package/devices/ezex.d.ts +4 -0
  363. package/devices/ezex.d.ts.map +1 -0
  364. package/devices/ezex.js +15 -0
  365. package/devices/ezex.js.map +1 -0
  366. package/devices/fantem.d.ts +4 -0
  367. package/devices/fantem.d.ts.map +1 -0
  368. package/devices/fantem.js +118 -0
  369. package/devices/fantem.js.map +1 -0
  370. package/devices/feibit.d.ts +4 -0
  371. package/devices/feibit.d.ts.map +1 -0
  372. package/devices/feibit.js +334 -0
  373. package/devices/feibit.js.map +1 -0
  374. package/devices/fireangel.d.ts +4 -0
  375. package/devices/fireangel.d.ts.map +1 -0
  376. package/devices/fireangel.js +55 -0
  377. package/devices/fireangel.js.map +1 -0
  378. package/devices/frankever.d.ts +4 -0
  379. package/devices/frankever.d.ts.map +1 -0
  380. package/devices/frankever.js +71 -0
  381. package/devices/frankever.js.map +1 -0
  382. package/devices/frient.d.ts +4 -0
  383. package/devices/frient.d.ts.map +1 -0
  384. package/devices/frient.js +42 -0
  385. package/devices/frient.js.map +1 -0
  386. package/devices/futurehome.d.ts +4 -0
  387. package/devices/futurehome.d.ts.map +1 -0
  388. package/devices/futurehome.js +124 -0
  389. package/devices/futurehome.js.map +1 -0
  390. package/devices/ge.d.ts +4 -0
  391. package/devices/ge.d.ts.map +1 -0
  392. package/devices/ge.js +134 -0
  393. package/devices/ge.js.map +1 -0
  394. package/devices/gewiss.d.ts +4 -0
  395. package/devices/gewiss.d.ts.map +1 -0
  396. package/devices/gewiss.js +78 -0
  397. package/devices/gewiss.js.map +1 -0
  398. package/devices/gidealed.d.ts +4 -0
  399. package/devices/gidealed.d.ts.map +1 -0
  400. package/devices/gidealed.js +15 -0
  401. package/devices/gidealed.js.map +1 -0
  402. package/devices/giderwel.d.ts +4 -0
  403. package/devices/giderwel.d.ts.map +1 -0
  404. package/devices/giderwel.js +15 -0
  405. package/devices/giderwel.js.map +1 -0
  406. package/devices/giex.d.ts +4 -0
  407. package/devices/giex.d.ts.map +1 -0
  408. package/devices/giex.js +121 -0
  409. package/devices/giex.js.map +1 -0
  410. package/devices/girier.d.ts +4 -0
  411. package/devices/girier.d.ts.map +1 -0
  412. package/devices/girier.js +56 -0
  413. package/devices/girier.js.map +1 -0
  414. package/devices/gledopto.d.ts +4 -0
  415. package/devices/gledopto.d.ts.map +1 -0
  416. package/devices/gledopto.js +1046 -0
  417. package/devices/gledopto.js.map +1 -0
  418. package/devices/gmmts.d.ts +4 -0
  419. package/devices/gmmts.d.ts.map +1 -0
  420. package/devices/gmmts.js +2287 -0
  421. package/devices/gmmts.js.map +1 -0
  422. package/devices/gmy.d.ts +4 -0
  423. package/devices/gmy.d.ts.map +1 -0
  424. package/devices/gmy.js +15 -0
  425. package/devices/gmy.js.map +1 -0
  426. package/devices/gs.d.ts +4 -0
  427. package/devices/gs.d.ts.map +1 -0
  428. package/devices/gs.js +89 -0
  429. package/devices/gs.js.map +1 -0
  430. package/devices/gumax.d.ts +4 -0
  431. package/devices/gumax.d.ts.map +1 -0
  432. package/devices/gumax.js +15 -0
  433. package/devices/gumax.js.map +1 -0
  434. package/devices/halemeier.d.ts +4 -0
  435. package/devices/halemeier.d.ts.map +1 -0
  436. package/devices/halemeier.js +129 -0
  437. package/devices/halemeier.js.map +1 -0
  438. package/devices/hampton_bay.d.ts +4 -0
  439. package/devices/hampton_bay.d.ts.map +1 -0
  440. package/devices/hampton_bay.js +72 -0
  441. package/devices/hampton_bay.js.map +1 -0
  442. package/devices/heatit.d.ts +4 -0
  443. package/devices/heatit.d.ts.map +1 -0
  444. package/devices/heatit.js +15 -0
  445. package/devices/heatit.js.map +1 -0
  446. package/devices/heiman.d.ts +4 -0
  447. package/devices/heiman.d.ts.map +1 -0
  448. package/devices/heiman.js +807 -0
  449. package/devices/heiman.js.map +1 -0
  450. package/devices/heimgard_technologies.d.ts +4 -0
  451. package/devices/heimgard_technologies.d.ts.map +1 -0
  452. package/devices/heimgard_technologies.js +193 -0
  453. package/devices/heimgard_technologies.js.map +1 -0
  454. package/devices/hej.d.ts +4 -0
  455. package/devices/hej.d.ts.map +1 -0
  456. package/devices/hej.js +73 -0
  457. package/devices/hej.js.map +1 -0
  458. package/devices/hfh.d.ts +4 -0
  459. package/devices/hfh.d.ts.map +1 -0
  460. package/devices/hfh.js +15 -0
  461. package/devices/hfh.js.map +1 -0
  462. package/devices/hilux.d.ts +4 -0
  463. package/devices/hilux.d.ts.map +1 -0
  464. package/devices/hilux.js +22 -0
  465. package/devices/hilux.js.map +1 -0
  466. package/devices/hive.d.ts +4 -0
  467. package/devices/hive.d.ts.map +1 -0
  468. package/devices/hive.js +766 -0
  469. package/devices/hive.js.map +1 -0
  470. package/devices/hommyn.d.ts +4 -0
  471. package/devices/hommyn.d.ts.map +1 -0
  472. package/devices/hommyn.js +64 -0
  473. package/devices/hommyn.js.map +1 -0
  474. package/devices/honyar.d.ts +4 -0
  475. package/devices/honyar.d.ts.map +1 -0
  476. package/devices/honyar.js +171 -0
  477. package/devices/honyar.js.map +1 -0
  478. package/devices/hornbach.d.ts +4 -0
  479. package/devices/hornbach.d.ts.map +1 -0
  480. package/devices/hornbach.js +99 -0
  481. package/devices/hornbach.js.map +1 -0
  482. package/devices/hzc_electric.d.ts +4 -0
  483. package/devices/hzc_electric.d.ts.map +1 -0
  484. package/devices/hzc_electric.js +94 -0
  485. package/devices/hzc_electric.js.map +1 -0
  486. package/devices/icasa.d.ts +4 -0
  487. package/devices/icasa.d.ts.map +1 -0
  488. package/devices/icasa.js +167 -0
  489. package/devices/icasa.js.map +1 -0
  490. package/devices/idinio.d.ts +4 -0
  491. package/devices/idinio.d.ts.map +1 -0
  492. package/devices/idinio.js +15 -0
  493. package/devices/idinio.js.map +1 -0
  494. package/devices/ihorn.d.ts +4 -0
  495. package/devices/ihorn.d.ts.map +1 -0
  496. package/devices/ihorn.js +109 -0
  497. package/devices/ihorn.js.map +1 -0
  498. package/devices/ikea.d.ts +4 -0
  499. package/devices/ikea.d.ts.map +1 -0
  500. package/devices/ikea.js +927 -0
  501. package/devices/ikea.js.map +1 -0
  502. package/devices/ilightsin.d.ts +4 -0
  503. package/devices/ilightsin.d.ts.map +1 -0
  504. package/devices/ilightsin.js +15 -0
  505. package/devices/ilightsin.js.map +1 -0
  506. package/devices/iluminize.d.ts +4 -0
  507. package/devices/iluminize.d.ts.map +1 -0
  508. package/devices/iluminize.js +376 -0
  509. package/devices/iluminize.js.map +1 -0
  510. package/devices/ilux.d.ts +4 -0
  511. package/devices/ilux.d.ts.map +1 -0
  512. package/devices/ilux.js +15 -0
  513. package/devices/ilux.js.map +1 -0
  514. package/devices/imhotepcreation.d.ts +4 -0
  515. package/devices/imhotepcreation.d.ts.map +1 -0
  516. package/devices/imhotepcreation.js +251 -0
  517. package/devices/imhotepcreation.js.map +1 -0
  518. package/devices/immax.d.ts +4 -0
  519. package/devices/immax.d.ts.map +1 -0
  520. package/devices/immax.js +304 -0
  521. package/devices/immax.js.map +1 -0
  522. package/devices/imou.d.ts +4 -0
  523. package/devices/imou.d.ts.map +1 -0
  524. package/devices/imou.js +28 -0
  525. package/devices/imou.js.map +1 -0
  526. package/devices/index.d.ts +13 -0
  527. package/devices/index.d.ts.map +1 -0
  528. package/devices/index.js +642 -0
  529. package/devices/index.js.map +1 -0
  530. package/devices/innr.d.ts +4 -0
  531. package/devices/innr.d.ts.map +1 -0
  532. package/devices/innr.js +878 -0
  533. package/devices/innr.js.map +1 -0
  534. package/devices/inovelli.d.ts +4 -0
  535. package/devices/inovelli.d.ts.map +1 -0
  536. package/devices/inovelli.js +1977 -0
  537. package/devices/inovelli.js.map +1 -0
  538. package/devices/insta.d.ts +4 -0
  539. package/devices/insta.d.ts.map +1 -0
  540. package/devices/insta.js +186 -0
  541. package/devices/insta.js.map +1 -0
  542. package/devices/iolloi.d.ts +4 -0
  543. package/devices/iolloi.d.ts.map +1 -0
  544. package/devices/iolloi.js +16 -0
  545. package/devices/iolloi.js.map +1 -0
  546. package/devices/iotperfect.d.ts +4 -0
  547. package/devices/iotperfect.d.ts.map +1 -0
  548. package/devices/iotperfect.js +62 -0
  549. package/devices/iotperfect.js.map +1 -0
  550. package/devices/iris.d.ts +4 -0
  551. package/devices/iris.d.ts.map +1 -0
  552. package/devices/iris.js +211 -0
  553. package/devices/iris.js.map +1 -0
  554. package/devices/istar.d.ts +4 -0
  555. package/devices/istar.d.ts.map +1 -0
  556. package/devices/istar.js +22 -0
  557. package/devices/istar.js.map +1 -0
  558. package/devices/jasco.d.ts +4 -0
  559. package/devices/jasco.d.ts.map +1 -0
  560. package/devices/jasco.js +34 -0
  561. package/devices/jasco.js.map +1 -0
  562. package/devices/javis.d.ts +4 -0
  563. package/devices/javis.d.ts.map +1 -0
  564. package/devices/javis.js +84 -0
  565. package/devices/javis.js.map +1 -0
  566. package/devices/jethome.d.ts +4 -0
  567. package/devices/jethome.d.ts.map +1 -0
  568. package/devices/jethome.js +124 -0
  569. package/devices/jethome.js.map +1 -0
  570. package/devices/jiawen.d.ts +4 -0
  571. package/devices/jiawen.d.ts.map +1 -0
  572. package/devices/jiawen.js +22 -0
  573. package/devices/jiawen.js.map +1 -0
  574. package/devices/jumitech.d.ts +4 -0
  575. package/devices/jumitech.d.ts.map +1 -0
  576. package/devices/jumitech.js +15 -0
  577. package/devices/jumitech.js.map +1 -0
  578. package/devices/jxuan.d.ts +4 -0
  579. package/devices/jxuan.d.ts.map +1 -0
  580. package/devices/jxuan.js +89 -0
  581. package/devices/jxuan.js.map +1 -0
  582. package/devices/kami.d.ts +4 -0
  583. package/devices/kami.d.ts.map +1 -0
  584. package/devices/kami.js +55 -0
  585. package/devices/kami.js.map +1 -0
  586. package/devices/keen_home.d.ts +4 -0
  587. package/devices/keen_home.d.ts.map +1 -0
  588. package/devices/keen_home.js +160 -0
  589. package/devices/keen_home.js.map +1 -0
  590. package/devices/klikaanklikuit.d.ts +4 -0
  591. package/devices/klikaanklikuit.d.ts.map +1 -0
  592. package/devices/klikaanklikuit.js +22 -0
  593. package/devices/klikaanklikuit.js.map +1 -0
  594. package/devices/kmpcil.d.ts +4 -0
  595. package/devices/kmpcil.d.ts.map +1 -0
  596. package/devices/kmpcil.js +219 -0
  597. package/devices/kmpcil.js.map +1 -0
  598. package/devices/konke.d.ts +4 -0
  599. package/devices/konke.d.ts.map +1 -0
  600. package/devices/konke.js +210 -0
  601. package/devices/konke.js.map +1 -0
  602. package/devices/ksentry.d.ts +4 -0
  603. package/devices/ksentry.d.ts.map +1 -0
  604. package/devices/ksentry.js +15 -0
  605. package/devices/ksentry.js.map +1 -0
  606. package/devices/kurvia.d.ts +4 -0
  607. package/devices/kurvia.d.ts.map +1 -0
  608. package/devices/kurvia.js +20 -0
  609. package/devices/kurvia.js.map +1 -0
  610. package/devices/kwikset.d.ts +4 -0
  611. package/devices/kwikset.d.ts.map +1 -0
  612. package/devices/kwikset.js +157 -0
  613. package/devices/kwikset.js.map +1 -0
  614. package/devices/lanesto.d.ts +4 -0
  615. package/devices/lanesto.d.ts.map +1 -0
  616. package/devices/lanesto.js +15 -0
  617. package/devices/lanesto.js.map +1 -0
  618. package/devices/lds.d.ts +4 -0
  619. package/devices/lds.d.ts.map +1 -0
  620. package/devices/lds.js +15 -0
  621. package/devices/lds.js.map +1 -0
  622. package/devices/led_trading.d.ts +4 -0
  623. package/devices/led_trading.d.ts.map +1 -0
  624. package/devices/led_trading.js +112 -0
  625. package/devices/led_trading.js.map +1 -0
  626. package/devices/ledvance.d.ts +4 -0
  627. package/devices/ledvance.d.ts.map +1 -0
  628. package/devices/ledvance.js +337 -0
  629. package/devices/ledvance.js.map +1 -0
  630. package/devices/leedarson.d.ts +4 -0
  631. package/devices/leedarson.d.ts.map +1 -0
  632. package/devices/leedarson.js +182 -0
  633. package/devices/leedarson.js.map +1 -0
  634. package/devices/legrand.d.ts +4 -0
  635. package/devices/legrand.d.ts.map +1 -0
  636. package/devices/legrand.js +740 -0
  637. package/devices/legrand.js.map +1 -0
  638. package/devices/lellki.d.ts +4 -0
  639. package/devices/lellki.d.ts.map +1 -0
  640. package/devices/lellki.js +169 -0
  641. package/devices/lellki.js.map +1 -0
  642. package/devices/letsled.d.ts +4 -0
  643. package/devices/letsled.d.ts.map +1 -0
  644. package/devices/letsled.js +15 -0
  645. package/devices/letsled.js.map +1 -0
  646. package/devices/letv.d.ts +4 -0
  647. package/devices/letv.d.ts.map +1 -0
  648. package/devices/letv.js +90 -0
  649. package/devices/letv.js.map +1 -0
  650. package/devices/leviton.d.ts +4 -0
  651. package/devices/leviton.d.ts.map +1 -0
  652. package/devices/leviton.js +164 -0
  653. package/devices/leviton.js.map +1 -0
  654. package/devices/lg.d.ts +4 -0
  655. package/devices/lg.d.ts.map +1 -0
  656. package/devices/lg.js +29 -0
  657. package/devices/lg.js.map +1 -0
  658. package/devices/lidl.d.ts +4 -0
  659. package/devices/lidl.d.ts.map +1 -0
  660. package/devices/lidl.js +674 -0
  661. package/devices/lidl.js.map +1 -0
  662. package/devices/lifecontrol.d.ts +4 -0
  663. package/devices/lifecontrol.d.ts.map +1 -0
  664. package/devices/lifecontrol.js +149 -0
  665. package/devices/lifecontrol.js.map +1 -0
  666. package/devices/lightsolutions.d.ts +4 -0
  667. package/devices/lightsolutions.d.ts.map +1 -0
  668. package/devices/lightsolutions.js +36 -0
  669. package/devices/lightsolutions.js.map +1 -0
  670. package/devices/linkind.d.ts +4 -0
  671. package/devices/linkind.d.ts.map +1 -0
  672. package/devices/linkind.js +275 -0
  673. package/devices/linkind.js.map +1 -0
  674. package/devices/linptech.d.ts +4 -0
  675. package/devices/linptech.d.ts.map +1 -0
  676. package/devices/linptech.js +159 -0
  677. package/devices/linptech.js.map +1 -0
  678. package/devices/livingwise.d.ts +4 -0
  679. package/devices/livingwise.d.ts.map +1 -0
  680. package/devices/livingwise.js +119 -0
  681. package/devices/livingwise.js.map +1 -0
  682. package/devices/livolo.d.ts +4 -0
  683. package/devices/livolo.d.ts.map +1 -0
  684. package/devices/livolo.js +422 -0
  685. package/devices/livolo.js.map +1 -0
  686. package/devices/lixee.d.ts +4 -0
  687. package/devices/lixee.d.ts.map +1 -0
  688. package/devices/lixee.js +1926 -0
  689. package/devices/lixee.js.map +1 -0
  690. package/devices/lonsonho.d.ts +4 -0
  691. package/devices/lonsonho.d.ts.map +1 -0
  692. package/devices/lonsonho.js +303 -0
  693. package/devices/lonsonho.js.map +1 -0
  694. package/devices/ls.d.ts +4 -0
  695. package/devices/ls.d.ts.map +1 -0
  696. package/devices/ls.js +68 -0
  697. package/devices/ls.js.map +1 -0
  698. package/devices/lubeez.d.ts +4 -0
  699. package/devices/lubeez.d.ts.map +1 -0
  700. package/devices/lubeez.js +15 -0
  701. package/devices/lubeez.js.map +1 -0
  702. package/devices/lumi.d.ts +4 -0
  703. package/devices/lumi.d.ts.map +1 -0
  704. package/devices/lumi.js +4387 -0
  705. package/devices/lumi.js.map +1 -0
  706. package/devices/lupus.d.ts +4 -0
  707. package/devices/lupus.d.ts.map +1 -0
  708. package/devices/lupus.js +98 -0
  709. package/devices/lupus.js.map +1 -0
  710. package/devices/lutron.d.ts +4 -0
  711. package/devices/lutron.d.ts.map +1 -0
  712. package/devices/lutron.js +71 -0
  713. package/devices/lutron.js.map +1 -0
  714. package/devices/lux.d.ts +4 -0
  715. package/devices/lux.d.ts.map +1 -0
  716. package/devices/lux.js +91 -0
  717. package/devices/lux.js.map +1 -0
  718. package/devices/lytko.d.ts +4 -0
  719. package/devices/lytko.d.ts.map +1 -0
  720. package/devices/lytko.js +788 -0
  721. package/devices/lytko.js.map +1 -0
  722. package/devices/m_elec.d.ts +4 -0
  723. package/devices/m_elec.d.ts.map +1 -0
  724. package/devices/m_elec.js +36 -0
  725. package/devices/m_elec.js.map +1 -0
  726. package/devices/makegood.d.ts +4 -0
  727. package/devices/makegood.d.ts.map +1 -0
  728. package/devices/makegood.js +66 -0
  729. package/devices/makegood.js.map +1 -0
  730. package/devices/matcall_bv.d.ts +4 -0
  731. package/devices/matcall_bv.d.ts.map +1 -0
  732. package/devices/matcall_bv.js +22 -0
  733. package/devices/matcall_bv.js.map +1 -0
  734. package/devices/mazda.d.ts +4 -0
  735. package/devices/mazda.d.ts.map +1 -0
  736. package/devices/mazda.js +174 -0
  737. package/devices/mazda.js.map +1 -0
  738. package/devices/meazon.d.ts +4 -0
  739. package/devices/meazon.d.ts.map +1 -0
  740. package/devices/meazon.js +99 -0
  741. package/devices/meazon.js.map +1 -0
  742. package/devices/mercator.d.ts +4 -0
  743. package/devices/mercator.d.ts.map +1 -0
  744. package/devices/mercator.js +256 -0
  745. package/devices/mercator.js.map +1 -0
  746. package/devices/miboxer.d.ts +4 -0
  747. package/devices/miboxer.d.ts.map +1 -0
  748. package/devices/miboxer.js +93 -0
  749. package/devices/miboxer.js.map +1 -0
  750. package/devices/micromatic.d.ts +4 -0
  751. package/devices/micromatic.d.ts.map +1 -0
  752. package/devices/micromatic.js +15 -0
  753. package/devices/micromatic.js.map +1 -0
  754. package/devices/modular.d.ts +4 -0
  755. package/devices/modular.d.ts.map +1 -0
  756. package/devices/modular.js +15 -0
  757. package/devices/modular.js.map +1 -0
  758. package/devices/moes.d.ts +4 -0
  759. package/devices/moes.d.ts.map +1 -0
  760. package/devices/moes.js +654 -0
  761. package/devices/moes.js.map +1 -0
  762. package/devices/muller_licht.d.ts +4 -0
  763. package/devices/muller_licht.d.ts.map +1 -0
  764. package/devices/muller_licht.js +341 -0
  765. package/devices/muller_licht.js.map +1 -0
  766. package/devices/multiterm.d.ts +4 -0
  767. package/devices/multiterm.d.ts.map +1 -0
  768. package/devices/multiterm.js +123 -0
  769. package/devices/multiterm.js.map +1 -0
  770. package/devices/namron.d.ts +4 -0
  771. package/devices/namron.d.ts.map +1 -0
  772. package/devices/namron.js +1464 -0
  773. package/devices/namron.js.map +1 -0
  774. package/devices/nanoleaf.d.ts +4 -0
  775. package/devices/nanoleaf.d.ts.map +1 -0
  776. package/devices/nanoleaf.js +15 -0
  777. package/devices/nanoleaf.js.map +1 -0
  778. package/devices/nedis.d.ts +4 -0
  779. package/devices/nedis.d.ts.map +1 -0
  780. package/devices/nedis.js +88 -0
  781. package/devices/nedis.js.map +1 -0
  782. package/devices/neo.d.ts +4 -0
  783. package/devices/neo.d.ts.map +1 -0
  784. package/devices/neo.js +558 -0
  785. package/devices/neo.js.map +1 -0
  786. package/devices/net2grid.d.ts +4 -0
  787. package/devices/net2grid.d.ts.map +1 -0
  788. package/devices/net2grid.js +68 -0
  789. package/devices/net2grid.js.map +1 -0
  790. package/devices/netvox.d.ts +4 -0
  791. package/devices/netvox.d.ts.map +1 -0
  792. package/devices/netvox.js +75 -0
  793. package/devices/netvox.js.map +1 -0
  794. package/devices/nexelec.d.ts +4 -0
  795. package/devices/nexelec.d.ts.map +1 -0
  796. package/devices/nexelec.js +15 -0
  797. package/devices/nexelec.js.map +1 -0
  798. package/devices/niko.d.ts +4 -0
  799. package/devices/niko.d.ts.map +1 -0
  800. package/devices/niko.js +495 -0
  801. package/devices/niko.js.map +1 -0
  802. package/devices/ninja_blocks.d.ts +4 -0
  803. package/devices/ninja_blocks.d.ts.map +1 -0
  804. package/devices/ninja_blocks.js +64 -0
  805. package/devices/ninja_blocks.js.map +1 -0
  806. package/devices/niviss.d.ts +4 -0
  807. package/devices/niviss.d.ts.map +1 -0
  808. package/devices/niviss.js +15 -0
  809. package/devices/niviss.js.map +1 -0
  810. package/devices/nodon.d.ts +4 -0
  811. package/devices/nodon.d.ts.map +1 -0
  812. package/devices/nodon.js +386 -0
  813. package/devices/nodon.js.map +1 -0
  814. package/devices/nordtronic.d.ts +4 -0
  815. package/devices/nordtronic.d.ts.map +1 -0
  816. package/devices/nordtronic.js +41 -0
  817. package/devices/nordtronic.js.map +1 -0
  818. package/devices/nous.d.ts +4 -0
  819. package/devices/nous.d.ts.map +1 -0
  820. package/devices/nous.js +151 -0
  821. package/devices/nous.js.map +1 -0
  822. package/devices/novo.d.ts +4 -0
  823. package/devices/novo.d.ts.map +1 -0
  824. package/devices/novo.js +57 -0
  825. package/devices/novo.js.map +1 -0
  826. package/devices/nue_3a.d.ts +4 -0
  827. package/devices/nue_3a.d.ts.map +1 -0
  828. package/devices/nue_3a.js +361 -0
  829. package/devices/nue_3a.js.map +1 -0
  830. package/devices/nyce.d.ts +4 -0
  831. package/devices/nyce.d.ts.map +1 -0
  832. package/devices/nyce.js +134 -0
  833. package/devices/nyce.js.map +1 -0
  834. package/devices/onenuo.d.ts +4 -0
  835. package/devices/onenuo.d.ts.map +1 -0
  836. package/devices/onenuo.js +86 -0
  837. package/devices/onenuo.js.map +1 -0
  838. package/devices/onesti.d.ts +4 -0
  839. package/devices/onesti.d.ts.map +1 -0
  840. package/devices/onesti.js +208 -0
  841. package/devices/onesti.js.map +1 -0
  842. package/devices/openlumi.d.ts +4 -0
  843. package/devices/openlumi.d.ts.map +1 -0
  844. package/devices/openlumi.js +62 -0
  845. package/devices/openlumi.js.map +1 -0
  846. package/devices/orvibo.d.ts +4 -0
  847. package/devices/orvibo.d.ts.map +1 -0
  848. package/devices/orvibo.js +391 -0
  849. package/devices/orvibo.js.map +1 -0
  850. package/devices/osram.d.ts +4 -0
  851. package/devices/osram.d.ts.map +1 -0
  852. package/devices/osram.js +516 -0
  853. package/devices/osram.js.map +1 -0
  854. package/devices/oujiabao.d.ts +4 -0
  855. package/devices/oujiabao.d.ts.map +1 -0
  856. package/devices/oujiabao.js +55 -0
  857. package/devices/oujiabao.js.map +1 -0
  858. package/devices/owon.d.ts +4 -0
  859. package/devices/owon.d.ts.map +1 -0
  860. package/devices/owon.js +478 -0
  861. package/devices/owon.js.map +1 -0
  862. package/devices/ozsmartthings.d.ts +4 -0
  863. package/devices/ozsmartthings.d.ts.map +1 -0
  864. package/devices/ozsmartthings.js +48 -0
  865. package/devices/ozsmartthings.js.map +1 -0
  866. package/devices/paul_neuhaus.d.ts +4 -0
  867. package/devices/paul_neuhaus.d.ts.map +1 -0
  868. package/devices/paul_neuhaus.js +194 -0
  869. package/devices/paul_neuhaus.js.map +1 -0
  870. package/devices/paulmann.d.ts +4 -0
  871. package/devices/paulmann.d.ts.map +1 -0
  872. package/devices/paulmann.js +330 -0
  873. package/devices/paulmann.js.map +1 -0
  874. package/devices/peq.d.ts +4 -0
  875. package/devices/peq.d.ts.map +1 -0
  876. package/devices/peq.js +64 -0
  877. package/devices/peq.js.map +1 -0
  878. package/devices/perenio.d.ts +4 -0
  879. package/devices/perenio.d.ts.map +1 -0
  880. package/devices/perenio.js +468 -0
  881. package/devices/perenio.js.map +1 -0
  882. package/devices/philio.d.ts +4 -0
  883. package/devices/philio.d.ts.map +1 -0
  884. package/devices/philio.js +16 -0
  885. package/devices/philio.js.map +1 -0
  886. package/devices/philips.d.ts +4 -0
  887. package/devices/philips.d.ts.map +1 -0
  888. package/devices/philips.js +4051 -0
  889. package/devices/philips.js.map +1 -0
  890. package/devices/plaid.d.ts +4 -0
  891. package/devices/plaid.d.ts.map +1 -0
  892. package/devices/plaid.js +65 -0
  893. package/devices/plaid.js.map +1 -0
  894. package/devices/plugwise.d.ts +4 -0
  895. package/devices/plugwise.d.ts.map +1 -0
  896. package/devices/plugwise.js +210 -0
  897. package/devices/plugwise.js.map +1 -0
  898. package/devices/profalux.d.ts +4 -0
  899. package/devices/profalux.d.ts.map +1 -0
  900. package/devices/profalux.js +191 -0
  901. package/devices/profalux.js.map +1 -0
  902. package/devices/prolight.d.ts +4 -0
  903. package/devices/prolight.d.ts.map +1 -0
  904. package/devices/prolight.js +115 -0
  905. package/devices/prolight.js.map +1 -0
  906. package/devices/pushok.d.ts +4 -0
  907. package/devices/pushok.d.ts.map +1 -0
  908. package/devices/pushok.js +300 -0
  909. package/devices/pushok.js.map +1 -0
  910. package/devices/qa.d.ts +4 -0
  911. package/devices/qa.d.ts.map +1 -0
  912. package/devices/qa.js +295 -0
  913. package/devices/qa.js.map +1 -0
  914. package/devices/qmotion.d.ts +4 -0
  915. package/devices/qmotion.d.ts.map +1 -0
  916. package/devices/qmotion.js +73 -0
  917. package/devices/qmotion.js.map +1 -0
  918. package/devices/qoto.d.ts +4 -0
  919. package/devices/qoto.d.ts.map +1 -0
  920. package/devices/qoto.js +87 -0
  921. package/devices/qoto.js.map +1 -0
  922. package/devices/quotra.d.ts +4 -0
  923. package/devices/quotra.d.ts.map +1 -0
  924. package/devices/quotra.js +22 -0
  925. package/devices/quotra.js.map +1 -0
  926. package/devices/rademacher.d.ts +4 -0
  927. package/devices/rademacher.d.ts.map +1 -0
  928. package/devices/rademacher.js +29 -0
  929. package/devices/rademacher.js.map +1 -0
  930. package/devices/radium.d.ts +4 -0
  931. package/devices/radium.d.ts.map +1 -0
  932. package/devices/radium.js +15 -0
  933. package/devices/radium.js.map +1 -0
  934. package/devices/raex.d.ts +4 -0
  935. package/devices/raex.d.ts.map +1 -0
  936. package/devices/raex.js +15 -0
  937. package/devices/raex.js.map +1 -0
  938. package/devices/rgb_genie.d.ts +4 -0
  939. package/devices/rgb_genie.d.ts.map +1 -0
  940. package/devices/rgb_genie.js +279 -0
  941. package/devices/rgb_genie.js.map +1 -0
  942. package/devices/robb.d.ts +4 -0
  943. package/devices/robb.d.ts.map +1 -0
  944. package/devices/robb.js +449 -0
  945. package/devices/robb.js.map +1 -0
  946. package/devices/roome.d.ts +4 -0
  947. package/devices/roome.d.ts.map +1 -0
  948. package/devices/roome.js +55 -0
  949. package/devices/roome.js.map +1 -0
  950. package/devices/rtx.d.ts +4 -0
  951. package/devices/rtx.d.ts.map +1 -0
  952. package/devices/rtx.js +151 -0
  953. package/devices/rtx.js.map +1 -0
  954. package/devices/salus_controls.d.ts +4 -0
  955. package/devices/salus_controls.d.ts.map +1 -0
  956. package/devices/salus_controls.js +136 -0
  957. package/devices/salus_controls.js.map +1 -0
  958. package/devices/samotech.d.ts +4 -0
  959. package/devices/samotech.d.ts.map +1 -0
  960. package/devices/samotech.js +75 -0
  961. package/devices/samotech.js.map +1 -0
  962. package/devices/saswell.d.ts +4 -0
  963. package/devices/saswell.d.ts.map +1 -0
  964. package/devices/saswell.js +125 -0
  965. package/devices/saswell.js.map +1 -0
  966. package/devices/sber.d.ts +4 -0
  967. package/devices/sber.d.ts.map +1 -0
  968. package/devices/sber.js +66 -0
  969. package/devices/sber.js.map +1 -0
  970. package/devices/scanproducts.d.ts +4 -0
  971. package/devices/scanproducts.d.ts.map +1 -0
  972. package/devices/scanproducts.js +22 -0
  973. package/devices/scanproducts.js.map +1 -0
  974. package/devices/schlage.d.ts +4 -0
  975. package/devices/schlage.d.ts.map +1 -0
  976. package/devices/schlage.js +64 -0
  977. package/devices/schlage.js.map +1 -0
  978. package/devices/schneider_electric.d.ts +4 -0
  979. package/devices/schneider_electric.d.ts.map +1 -0
  980. package/devices/schneider_electric.js +2187 -0
  981. package/devices/schneider_electric.js.map +1 -0
  982. package/devices/schwaiger.d.ts +4 -0
  983. package/devices/schwaiger.d.ts.map +1 -0
  984. package/devices/schwaiger.js +109 -0
  985. package/devices/schwaiger.js.map +1 -0
  986. package/devices/seastar_intelligence.d.ts +4 -0
  987. package/devices/seastar_intelligence.d.ts.map +1 -0
  988. package/devices/seastar_intelligence.js +20 -0
  989. package/devices/seastar_intelligence.js.map +1 -0
  990. package/devices/securifi.d.ts +4 -0
  991. package/devices/securifi.d.ts.map +1 -0
  992. package/devices/securifi.js +83 -0
  993. package/devices/securifi.js.map +1 -0
  994. package/devices/sengled.d.ts +7 -0
  995. package/devices/sengled.d.ts.map +1 -0
  996. package/devices/sengled.js +358 -0
  997. package/devices/sengled.js.map +1 -0
  998. package/devices/sercomm.d.ts +4 -0
  999. package/devices/sercomm.d.ts.map +1 -0
  1000. package/devices/sercomm.js +189 -0
  1001. package/devices/sercomm.js.map +1 -0
  1002. package/devices/shade_control.d.ts +4 -0
  1003. package/devices/shade_control.d.ts.map +1 -0
  1004. package/devices/shade_control.js +65 -0
  1005. package/devices/shade_control.js.map +1 -0
  1006. package/devices/shenzhen_homa.d.ts +4 -0
  1007. package/devices/shenzhen_homa.d.ts.map +1 -0
  1008. package/devices/shenzhen_homa.js +111 -0
  1009. package/devices/shenzhen_homa.js.map +1 -0
  1010. package/devices/shinasystem.d.ts +4 -0
  1011. package/devices/shinasystem.d.ts.map +1 -0
  1012. package/devices/shinasystem.js +961 -0
  1013. package/devices/shinasystem.js.map +1 -0
  1014. package/devices/shyugj.d.ts +4 -0
  1015. package/devices/shyugj.d.ts.map +1 -0
  1016. package/devices/shyugj.js +21 -0
  1017. package/devices/shyugj.js.map +1 -0
  1018. package/devices/siglis.d.ts +4 -0
  1019. package/devices/siglis.d.ts.map +1 -0
  1020. package/devices/siglis.js +457 -0
  1021. package/devices/siglis.js.map +1 -0
  1022. package/devices/sikom.d.ts +4 -0
  1023. package/devices/sikom.d.ts.map +1 -0
  1024. package/devices/sikom.js +68 -0
  1025. package/devices/sikom.js.map +1 -0
  1026. package/devices/sinope.d.ts +4 -0
  1027. package/devices/sinope.d.ts.map +1 -0
  1028. package/devices/sinope.js +1755 -0
  1029. package/devices/sinope.js.map +1 -0
  1030. package/devices/siterwell.d.ts +4 -0
  1031. package/devices/siterwell.d.ts.map +1 -0
  1032. package/devices/siterwell.js +111 -0
  1033. package/devices/siterwell.js.map +1 -0
  1034. package/devices/skydance.d.ts +4 -0
  1035. package/devices/skydance.d.ts.map +1 -0
  1036. package/devices/skydance.js +156 -0
  1037. package/devices/skydance.js.map +1 -0
  1038. package/devices/slv.d.ts +4 -0
  1039. package/devices/slv.d.ts.map +1 -0
  1040. package/devices/slv.js +38 -0
  1041. package/devices/slv.js.map +1 -0
  1042. package/devices/smart9.d.ts +4 -0
  1043. package/devices/smart9.d.ts.map +1 -0
  1044. package/devices/smart9.js +67 -0
  1045. package/devices/smart9.js.map +1 -0
  1046. package/devices/smart_home_pty.d.ts +4 -0
  1047. package/devices/smart_home_pty.d.ts.map +1 -0
  1048. package/devices/smart_home_pty.js +22 -0
  1049. package/devices/smart_home_pty.js.map +1 -0
  1050. package/devices/smartenit.d.ts +4 -0
  1051. package/devices/smartenit.d.ts.map +1 -0
  1052. package/devices/smartenit.js +81 -0
  1053. package/devices/smartenit.js.map +1 -0
  1054. package/devices/smartthings.d.ts +4 -0
  1055. package/devices/smartthings.d.ts.map +1 -0
  1056. package/devices/smartthings.js +527 -0
  1057. package/devices/smartthings.js.map +1 -0
  1058. package/devices/smartwings.d.ts +4 -0
  1059. package/devices/smartwings.d.ts.map +1 -0
  1060. package/devices/smartwings.js +64 -0
  1061. package/devices/smartwings.js.map +1 -0
  1062. package/devices/smlight.d.ts +4 -0
  1063. package/devices/smlight.d.ts.map +1 -0
  1064. package/devices/smlight.js +22 -0
  1065. package/devices/smlight.js.map +1 -0
  1066. package/devices/sohan_electric.d.ts +4 -0
  1067. package/devices/sohan_electric.d.ts.map +1 -0
  1068. package/devices/sohan_electric.js +20 -0
  1069. package/devices/sohan_electric.js.map +1 -0
  1070. package/devices/solaredge.d.ts +4 -0
  1071. package/devices/solaredge.d.ts.map +1 -0
  1072. package/devices/solaredge.js +15 -0
  1073. package/devices/solaredge.js.map +1 -0
  1074. package/devices/soma.d.ts +4 -0
  1075. package/devices/soma.d.ts.map +1 -0
  1076. package/devices/soma.js +15 -0
  1077. package/devices/soma.js.map +1 -0
  1078. package/devices/somfy.d.ts +4 -0
  1079. package/devices/somfy.d.ts.map +1 -0
  1080. package/devices/somfy.js +88 -0
  1081. package/devices/somfy.js.map +1 -0
  1082. package/devices/somgoms.d.ts +4 -0
  1083. package/devices/somgoms.d.ts.map +1 -0
  1084. package/devices/somgoms.js +84 -0
  1085. package/devices/somgoms.js.map +1 -0
  1086. package/devices/sonoff.d.ts +4 -0
  1087. package/devices/sonoff.d.ts.map +1 -0
  1088. package/devices/sonoff.js +1452 -0
  1089. package/devices/sonoff.js.map +1 -0
  1090. package/devices/sowilo.d.ts +4 -0
  1091. package/devices/sowilo.d.ts.map +1 -0
  1092. package/devices/sowilo.js +15 -0
  1093. package/devices/sowilo.js.map +1 -0
  1094. package/devices/spotmau.d.ts +4 -0
  1095. package/devices/spotmau.d.ts.map +1 -0
  1096. package/devices/spotmau.js +42 -0
  1097. package/devices/spotmau.js.map +1 -0
  1098. package/devices/stelpro.d.ts +4 -0
  1099. package/devices/stelpro.d.ts.map +1 -0
  1100. package/devices/stelpro.js +366 -0
  1101. package/devices/stelpro.js.map +1 -0
  1102. package/devices/sunricher.d.ts +4 -0
  1103. package/devices/sunricher.d.ts.map +1 -0
  1104. package/devices/sunricher.js +1308 -0
  1105. package/devices/sunricher.js.map +1 -0
  1106. package/devices/swann.d.ts +4 -0
  1107. package/devices/swann.d.ts.map +1 -0
  1108. package/devices/swann.js +73 -0
  1109. package/devices/swann.js.map +1 -0
  1110. package/devices/sylvania.d.ts +4 -0
  1111. package/devices/sylvania.d.ts.map +1 -0
  1112. package/devices/sylvania.js +226 -0
  1113. package/devices/sylvania.js.map +1 -0
  1114. package/devices/tapestry.d.ts +4 -0
  1115. package/devices/tapestry.d.ts.map +1 -0
  1116. package/devices/tapestry.js +56 -0
  1117. package/devices/tapestry.js.map +1 -0
  1118. package/devices/tci.d.ts +4 -0
  1119. package/devices/tci.d.ts.map +1 -0
  1120. package/devices/tci.js +29 -0
  1121. package/devices/tci.js.map +1 -0
  1122. package/devices/tech.d.ts +4 -0
  1123. package/devices/tech.d.ts.map +1 -0
  1124. package/devices/tech.js +131 -0
  1125. package/devices/tech.js.map +1 -0
  1126. package/devices/technicolor.d.ts +4 -0
  1127. package/devices/technicolor.d.ts.map +1 -0
  1128. package/devices/technicolor.js +102 -0
  1129. package/devices/technicolor.js.map +1 -0
  1130. package/devices/terncy.d.ts +4 -0
  1131. package/devices/terncy.d.ts.map +1 -0
  1132. package/devices/terncy.js +116 -0
  1133. package/devices/terncy.js.map +1 -0
  1134. package/devices/the_light_group.d.ts +4 -0
  1135. package/devices/the_light_group.d.ts.map +1 -0
  1136. package/devices/the_light_group.js +130 -0
  1137. package/devices/the_light_group.js.map +1 -0
  1138. package/devices/third_reality.d.ts +4 -0
  1139. package/devices/third_reality.d.ts.map +1 -0
  1140. package/devices/third_reality.js +569 -0
  1141. package/devices/third_reality.js.map +1 -0
  1142. package/devices/titan_products.d.ts +4 -0
  1143. package/devices/titan_products.d.ts.map +1 -0
  1144. package/devices/titan_products.js +62 -0
  1145. package/devices/titan_products.js.map +1 -0
  1146. package/devices/tlwglobal.d.ts +4 -0
  1147. package/devices/tlwglobal.d.ts.map +1 -0
  1148. package/devices/tlwglobal.js +32 -0
  1149. package/devices/tlwglobal.js.map +1 -0
  1150. package/devices/tplink.d.ts +4 -0
  1151. package/devices/tplink.d.ts.map +1 -0
  1152. package/devices/tplink.js +82 -0
  1153. package/devices/tplink.js.map +1 -0
  1154. package/devices/trust.d.ts +4 -0
  1155. package/devices/trust.d.ts.map +1 -0
  1156. package/devices/trust.js +183 -0
  1157. package/devices/trust.js.map +1 -0
  1158. package/devices/tubeszb.d.ts +4 -0
  1159. package/devices/tubeszb.d.ts.map +1 -0
  1160. package/devices/tubeszb.js +60 -0
  1161. package/devices/tubeszb.js.map +1 -0
  1162. package/devices/tuya.d.ts +4 -0
  1163. package/devices/tuya.d.ts.map +1 -0
  1164. package/devices/tuya.js +13607 -0
  1165. package/devices/tuya.js.map +1 -0
  1166. package/devices/ubisys.d.ts +4 -0
  1167. package/devices/ubisys.d.ts.map +1 -0
  1168. package/devices/ubisys.js +1300 -0
  1169. package/devices/ubisys.js.map +1 -0
  1170. package/devices/uhome.d.ts +4 -0
  1171. package/devices/uhome.d.ts.map +1 -0
  1172. package/devices/uhome.js +64 -0
  1173. package/devices/uhome.js.map +1 -0
  1174. package/devices/universal_electronics_inc.d.ts +4 -0
  1175. package/devices/universal_electronics_inc.d.ts.map +1 -0
  1176. package/devices/universal_electronics_inc.js +186 -0
  1177. package/devices/universal_electronics_inc.js.map +1 -0
  1178. package/devices/vbled.d.ts +4 -0
  1179. package/devices/vbled.d.ts.map +1 -0
  1180. package/devices/vbled.js +15 -0
  1181. package/devices/vbled.js.map +1 -0
  1182. package/devices/vesternet.d.ts +4 -0
  1183. package/devices/vesternet.d.ts.map +1 -0
  1184. package/devices/vesternet.js +330 -0
  1185. package/devices/vesternet.js.map +1 -0
  1186. package/devices/viessmann.d.ts +4 -0
  1187. package/devices/viessmann.d.ts.map +1 -0
  1188. package/devices/viessmann.js +115 -0
  1189. package/devices/viessmann.js.map +1 -0
  1190. package/devices/villeroy_boch.d.ts +4 -0
  1191. package/devices/villeroy_boch.d.ts.map +1 -0
  1192. package/devices/villeroy_boch.js +22 -0
  1193. package/devices/villeroy_boch.js.map +1 -0
  1194. package/devices/vimar.d.ts +4 -0
  1195. package/devices/vimar.d.ts.map +1 -0
  1196. package/devices/vimar.js +137 -0
  1197. package/devices/vimar.js.map +1 -0
  1198. package/devices/visonic.d.ts +4 -0
  1199. package/devices/visonic.d.ts.map +1 -0
  1200. package/devices/visonic.js +138 -0
  1201. package/devices/visonic.js.map +1 -0
  1202. package/devices/vrey.d.ts +4 -0
  1203. package/devices/vrey.d.ts.map +1 -0
  1204. package/devices/vrey.js +18 -0
  1205. package/devices/vrey.js.map +1 -0
  1206. package/devices/wally.d.ts +4 -0
  1207. package/devices/wally.d.ts.map +1 -0
  1208. package/devices/wally.js +64 -0
  1209. package/devices/wally.js.map +1 -0
  1210. package/devices/waxman.d.ts +4 -0
  1211. package/devices/waxman.d.ts.map +1 -0
  1212. package/devices/waxman.js +85 -0
  1213. package/devices/waxman.js.map +1 -0
  1214. package/devices/weiser.d.ts +4 -0
  1215. package/devices/weiser.d.ts.map +1 -0
  1216. package/devices/weiser.js +103 -0
  1217. package/devices/weiser.js.map +1 -0
  1218. package/devices/weten.d.ts +4 -0
  1219. package/devices/weten.d.ts.map +1 -0
  1220. package/devices/weten.js +89 -0
  1221. package/devices/weten.js.map +1 -0
  1222. package/devices/wirenboard.d.ts +4 -0
  1223. package/devices/wirenboard.d.ts.map +1 -0
  1224. package/devices/wirenboard.js +626 -0
  1225. package/devices/wirenboard.js.map +1 -0
  1226. package/devices/wisdom.d.ts +4 -0
  1227. package/devices/wisdom.d.ts.map +1 -0
  1228. package/devices/wisdom.js +15 -0
  1229. package/devices/wisdom.js.map +1 -0
  1230. package/devices/woolley.d.ts +4 -0
  1231. package/devices/woolley.d.ts.map +1 -0
  1232. package/devices/woolley.js +88 -0
  1233. package/devices/woolley.js.map +1 -0
  1234. package/devices/woox.d.ts +4 -0
  1235. package/devices/woox.d.ts.map +1 -0
  1236. package/devices/woox.js +137 -0
  1237. package/devices/woox.js.map +1 -0
  1238. package/devices/wyze.d.ts +4 -0
  1239. package/devices/wyze.d.ts.map +1 -0
  1240. package/devices/wyze.js +63 -0
  1241. package/devices/wyze.js.map +1 -0
  1242. package/devices/xinghuoyuan.d.ts +4 -0
  1243. package/devices/xinghuoyuan.d.ts.map +1 -0
  1244. package/devices/xinghuoyuan.js +15 -0
  1245. package/devices/xinghuoyuan.js.map +1 -0
  1246. package/devices/xyzroe.d.ts +4 -0
  1247. package/devices/xyzroe.d.ts.map +1 -0
  1248. package/devices/xyzroe.js +519 -0
  1249. package/devices/xyzroe.js.map +1 -0
  1250. package/devices/yale.d.ts +4 -0
  1251. package/devices/yale.d.ts.map +1 -0
  1252. package/devices/yale.js +503 -0
  1253. package/devices/yale.js.map +1 -0
  1254. package/devices/yandex.d.ts +4 -0
  1255. package/devices/yandex.d.ts.map +1 -0
  1256. package/devices/yandex.js +410 -0
  1257. package/devices/yandex.js.map +1 -0
  1258. package/devices/ynoa.d.ts +4 -0
  1259. package/devices/ynoa.d.ts.map +1 -0
  1260. package/devices/ynoa.js +113 -0
  1261. package/devices/ynoa.js.map +1 -0
  1262. package/devices/yookee.d.ts +4 -0
  1263. package/devices/yookee.d.ts.map +1 -0
  1264. package/devices/yookee.js +63 -0
  1265. package/devices/yookee.js.map +1 -0
  1266. package/devices/ysrsai.d.ts +4 -0
  1267. package/devices/ysrsai.d.ts.map +1 -0
  1268. package/devices/ysrsai.js +66 -0
  1269. package/devices/ysrsai.js.map +1 -0
  1270. package/devices/zemismart.d.ts +4 -0
  1271. package/devices/zemismart.d.ts.map +1 -0
  1272. package/devices/zemismart.js +405 -0
  1273. package/devices/zemismart.js.map +1 -0
  1274. package/devices/zen.d.ts +4 -0
  1275. package/devices/zen.d.ts.map +1 -0
  1276. package/devices/zen.js +96 -0
  1277. package/devices/zen.js.map +1 -0
  1278. package/devices/zigbeetlc.d.ts +13 -0
  1279. package/devices/zigbeetlc.d.ts.map +1 -0
  1280. package/devices/zigbeetlc.js +201 -0
  1281. package/devices/zigbeetlc.js.map +1 -0
  1282. package/devices/zipato.d.ts +4 -0
  1283. package/devices/zipato.d.ts.map +1 -0
  1284. package/devices/zipato.js +15 -0
  1285. package/devices/zipato.js.map +1 -0
  1286. package/index.d.ts +21 -0
  1287. package/index.d.ts.map +1 -0
  1288. package/index.js +488 -0
  1289. package/index.js.map +1 -0
  1290. package/lib/color.d.ts +272 -0
  1291. package/lib/color.d.ts.map +1 -0
  1292. package/lib/color.js +765 -0
  1293. package/lib/color.js.map +1 -0
  1294. package/lib/configureKey.d.ts +3 -0
  1295. package/lib/configureKey.d.ts.map +1 -0
  1296. package/lib/configureKey.js +939 -0
  1297. package/lib/configureKey.js.map +1 -0
  1298. package/lib/constants.d.ts +68 -0
  1299. package/lib/constants.d.ts.map +1 -0
  1300. package/lib/constants.js +293 -0
  1301. package/lib/constants.js.map +1 -0
  1302. package/lib/develco.d.ts +15 -0
  1303. package/lib/develco.d.ts.map +1 -0
  1304. package/lib/develco.js +183 -0
  1305. package/lib/develco.js.map +1 -0
  1306. package/lib/ewelink.d.ts +30 -0
  1307. package/lib/ewelink.d.ts.map +1 -0
  1308. package/lib/ewelink.js +718 -0
  1309. package/lib/ewelink.js.map +1 -0
  1310. package/lib/exposes.d.ts +344 -0
  1311. package/lib/exposes.d.ts.map +1 -0
  1312. package/lib/exposes.js +1065 -0
  1313. package/lib/exposes.js.map +1 -0
  1314. package/lib/generateDefinition.d.ts +6 -0
  1315. package/lib/generateDefinition.d.ts.map +1 -0
  1316. package/lib/generateDefinition.js +356 -0
  1317. package/lib/generateDefinition.js.map +1 -0
  1318. package/lib/ikea.d.ts +39 -0
  1319. package/lib/ikea.d.ts.map +1 -0
  1320. package/lib/ikea.js +776 -0
  1321. package/lib/ikea.js.map +1 -0
  1322. package/lib/kelvinToXy.d.ts +8 -0
  1323. package/lib/kelvinToXy.d.ts.map +1 -0
  1324. package/lib/kelvinToXy.js +1914 -0
  1325. package/lib/kelvinToXy.js.map +1 -0
  1326. package/lib/ledvance.d.ts +20 -0
  1327. package/lib/ledvance.d.ts.map +1 -0
  1328. package/lib/ledvance.js +103 -0
  1329. package/lib/ledvance.js.map +1 -0
  1330. package/lib/legacy.d.ts +5128 -0
  1331. package/lib/legacy.d.ts.map +1 -0
  1332. package/lib/legacy.js +6603 -0
  1333. package/lib/legacy.js.map +1 -0
  1334. package/lib/legrand.d.ts +69 -0
  1335. package/lib/legrand.d.ts.map +1 -0
  1336. package/lib/legrand.js +282 -0
  1337. package/lib/legrand.js.map +1 -0
  1338. package/lib/light.d.ts +6 -0
  1339. package/lib/light.d.ts.map +1 -0
  1340. package/lib/light.js +146 -0
  1341. package/lib/light.js.map +1 -0
  1342. package/lib/logger.d.ts +4 -0
  1343. package/lib/logger.d.ts.map +1 -0
  1344. package/lib/logger.js +14 -0
  1345. package/lib/logger.js.map +1 -0
  1346. package/lib/lumi.d.ts +953 -0
  1347. package/lib/lumi.d.ts.map +1 -0
  1348. package/lib/lumi.js +4973 -0
  1349. package/lib/lumi.js.map +1 -0
  1350. package/lib/modernExtend.d.ts +325 -0
  1351. package/lib/modernExtend.d.ts.map +1 -0
  1352. package/lib/modernExtend.js +1995 -0
  1353. package/lib/modernExtend.js.map +1 -0
  1354. package/lib/ota.d.ts +71 -0
  1355. package/lib/ota.d.ts.map +1 -0
  1356. package/lib/ota.js +663 -0
  1357. package/lib/ota.js.map +1 -0
  1358. package/lib/philips.d.ts +84 -0
  1359. package/lib/philips.d.ts.map +1 -0
  1360. package/lib/philips.js +657 -0
  1361. package/lib/philips.js.map +1 -0
  1362. package/lib/reporting.d.ts +58 -0
  1363. package/lib/reporting.d.ts.map +1 -0
  1364. package/lib/reporting.js +336 -0
  1365. package/lib/reporting.js.map +1 -0
  1366. package/lib/store.d.ts +7 -0
  1367. package/lib/store.d.ts.map +1 -0
  1368. package/lib/store.js +56 -0
  1369. package/lib/store.js.map +1 -0
  1370. package/lib/sunricher.d.ts +13 -0
  1371. package/lib/sunricher.d.ts.map +1 -0
  1372. package/lib/sunricher.js +14 -0
  1373. package/lib/sunricher.js.map +1 -0
  1374. package/lib/tuya.d.ts +764 -0
  1375. package/lib/tuya.d.ts.map +1 -0
  1376. package/lib/tuya.js +2425 -0
  1377. package/lib/tuya.js.map +1 -0
  1378. package/lib/types.d.ts +433 -0
  1379. package/lib/types.d.ts.map +1 -0
  1380. package/lib/types.js +4 -0
  1381. package/lib/types.js.map +1 -0
  1382. package/lib/ubisys.d.ts +19 -0
  1383. package/lib/ubisys.d.ts.map +1 -0
  1384. package/lib/ubisys.js +293 -0
  1385. package/lib/ubisys.js.map +1 -0
  1386. package/lib/utils.d.ts +93 -0
  1387. package/lib/utils.d.ts.map +1 -0
  1388. package/lib/utils.js +790 -0
  1389. package/lib/utils.js.map +1 -0
  1390. package/lib/zosung.d.ts +52 -0
  1391. package/lib/zosung.d.ts.map +1 -0
  1392. package/lib/zosung.js +256 -0
  1393. package/lib/zosung.js.map +1 -0
  1394. package/package.json +2 -2
package/lib/tuya.js ADDED
@@ -0,0 +1,2425 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.clusters = exports.modernExtend = exports.fz = exports.tz = exports.valueConverter = exports.valueConverterBasic = exports.Bitmap = exports.enum = exports.Enum = exports.whitelabel = exports.fingerprint = exports.configureMagicPacket = exports.skip = exports.exposes = exports.dataTypes = void 0;
40
+ exports.convertBufferToNumber = convertBufferToNumber;
41
+ exports.onEvent = onEvent;
42
+ exports.convertDecimalValueTo4ByteHexArray = convertDecimalValueTo4ByteHexArray;
43
+ exports.onEventMeasurementPoll = onEventMeasurementPoll;
44
+ exports.onEventSetTime = onEventSetTime;
45
+ exports.onEventSetLocalTime = onEventSetLocalTime;
46
+ exports.sendDataPointValue = sendDataPointValue;
47
+ exports.sendDataPointBool = sendDataPointBool;
48
+ exports.sendDataPointEnum = sendDataPointEnum;
49
+ exports.sendDataPointRaw = sendDataPointRaw;
50
+ exports.sendDataPointBitmap = sendDataPointBitmap;
51
+ exports.sendDataPointStringBuffer = sendDataPointStringBuffer;
52
+ exports.getHandlersForDP = getHandlersForDP;
53
+ const zigbee_herdsman_1 = require("zigbee-herdsman");
54
+ const fromZigbee_1 = __importDefault(require("../converters/fromZigbee"));
55
+ const toZigbee_1 = __importDefault(require("../converters/toZigbee"));
56
+ const constants = __importStar(require("./constants"));
57
+ const exposes = __importStar(require("./exposes"));
58
+ const logger_1 = require("./logger");
59
+ const modernExtend = __importStar(require("./modernExtend"));
60
+ const globalStore = __importStar(require("./store"));
61
+ const utils = __importStar(require("./utils"));
62
+ const utils_1 = require("./utils");
63
+ // import {Color} from './color';
64
+ const NS = 'zhc:tuya';
65
+ const e = exposes.presets;
66
+ const ea = exposes.access;
67
+ exports.dataTypes = {
68
+ raw: 0, // [ bytes ]
69
+ bool: 1, // [0/1]
70
+ number: 2, // [ 4 byte value ]
71
+ string: 3, // [ N byte string ]
72
+ enum: 4, // [ 0-255 ]
73
+ bitmap: 5, // [ 1,2,4 bytes ] as bits
74
+ };
75
+ function convertBufferToNumber(chunks) {
76
+ let value = 0;
77
+ for (let i = 0; i < chunks.length; i++) {
78
+ value = value << 8;
79
+ value += chunks[i];
80
+ }
81
+ return value;
82
+ }
83
+ function convertStringToHexArray(value) {
84
+ const asciiKeys = [];
85
+ for (let i = 0; i < value.length; i++) {
86
+ asciiKeys.push(value[i].charCodeAt(0));
87
+ }
88
+ return asciiKeys;
89
+ }
90
+ function onEvent(args) {
91
+ return async (type, data, device, settings, state) => {
92
+ args = { queryOnDeviceAnnounce: false, timeStart: '1970', respondToMcuVersionResponse: true, ...args };
93
+ const endpoint = device.endpoints[0];
94
+ if (type === 'message' && data.cluster === 'manuSpecificTuya') {
95
+ if (args.respondToMcuVersionResponse && data.type === 'commandMcuVersionResponse') {
96
+ await endpoint.command('manuSpecificTuya', 'mcuVersionRequest', { seq: 0x0002 });
97
+ }
98
+ else if (data.type === 'commandMcuGatewayConnectionStatus') {
99
+ // "payload" can have the following values:
100
+ // 0x00: The gateway is not connected to the internet.
101
+ // 0x01: The gateway is connected to the internet.
102
+ // 0x02: The request timed out after three seconds.
103
+ const payload = { payloadSize: 1, payload: 1 };
104
+ await endpoint.command('manuSpecificTuya', 'mcuGatewayConnectionStatus', payload, {});
105
+ }
106
+ }
107
+ if (data.type === 'commandMcuSyncTime' && data.cluster === 'manuSpecificTuya') {
108
+ try {
109
+ const offset = args.timeStart === '2000' ? constants.OneJanuary2000 : 0;
110
+ const utcTime = Math.round((new Date().getTime() - offset) / 1000);
111
+ const localTime = utcTime - new Date().getTimezoneOffset() * 60;
112
+ const payload = {
113
+ payloadSize: 8,
114
+ payload: [...convertDecimalValueTo4ByteHexArray(utcTime), ...convertDecimalValueTo4ByteHexArray(localTime)],
115
+ };
116
+ await endpoint.command('manuSpecificTuya', 'mcuSyncTime', payload, {});
117
+ }
118
+ catch {
119
+ /* handle error to prevent crash */
120
+ }
121
+ }
122
+ // Some devices require a dataQuery on deviceAnnounce, otherwise they don't report any data
123
+ if (args.queryOnDeviceAnnounce && type === 'deviceAnnounce') {
124
+ await endpoint.command('manuSpecificTuya', 'dataQuery', {});
125
+ }
126
+ if (args.queryIntervalSeconds) {
127
+ if (type === 'stop') {
128
+ clearTimeout(globalStore.getValue(device, 'query_interval'));
129
+ globalStore.clearValue(device, 'query_interval');
130
+ }
131
+ else if (!globalStore.hasValue(device, 'query_interval')) {
132
+ const setTimer = () => {
133
+ const timer = setTimeout(async () => {
134
+ try {
135
+ await endpoint.command('manuSpecificTuya', 'dataQuery', {});
136
+ }
137
+ catch {
138
+ /* Do nothing*/
139
+ }
140
+ setTimer();
141
+ }, args.queryIntervalSeconds * 1000);
142
+ globalStore.putValue(device, 'query_interval', timer);
143
+ };
144
+ setTimer();
145
+ }
146
+ }
147
+ };
148
+ }
149
+ function getDataValue(dpValue) {
150
+ let dataString = '';
151
+ switch (dpValue.datatype) {
152
+ case exports.dataTypes.raw:
153
+ return dpValue.data;
154
+ case exports.dataTypes.bool:
155
+ return dpValue.data[0] === 1;
156
+ case exports.dataTypes.number:
157
+ return convertBufferToNumber(dpValue.data);
158
+ case exports.dataTypes.string:
159
+ // Don't use .map here, doesn't work: https://github.com/Koenkk/zigbee-herdsman-converters/pull/1799/files#r530377091
160
+ for (let i = 0; i < dpValue.data.length; ++i) {
161
+ dataString += String.fromCharCode(dpValue.data[i]);
162
+ }
163
+ return dataString;
164
+ case exports.dataTypes.enum:
165
+ return dpValue.data[0];
166
+ case exports.dataTypes.bitmap:
167
+ return convertBufferToNumber(dpValue.data);
168
+ }
169
+ }
170
+ function convertDecimalValueTo4ByteHexArray(value) {
171
+ const hexValue = Number(value).toString(16).padStart(8, '0');
172
+ const chunk1 = hexValue.substring(0, 2);
173
+ const chunk2 = hexValue.substring(2, 4);
174
+ const chunk3 = hexValue.substring(4, 6);
175
+ const chunk4 = hexValue.substring(6);
176
+ return [chunk1, chunk2, chunk3, chunk4].map((hexVal) => parseInt(hexVal, 16));
177
+ }
178
+ function convertDecimalValueTo2ByteHexArray(value) {
179
+ const hexValue = Number(value).toString(16).padStart(4, '0');
180
+ const chunk1 = hexValue.substring(0, 2);
181
+ const chunk2 = hexValue.substring(2);
182
+ return [chunk1, chunk2].map((hexVal) => parseInt(hexVal, 16));
183
+ }
184
+ async function onEventMeasurementPoll(type, data, device, options, electricalMeasurement = true, metering = false) {
185
+ const endpoint = device.getEndpoint(1);
186
+ const poll = async () => {
187
+ if (electricalMeasurement) {
188
+ await endpoint.read('haElectricalMeasurement', ['rmsVoltage', 'rmsCurrent', 'activePower']);
189
+ }
190
+ if (metering) {
191
+ await endpoint.read('seMetering', ['currentSummDelivered']);
192
+ }
193
+ };
194
+ utils.onEventPoll(type, data, device, options, 'measurement', 60, poll);
195
+ }
196
+ async function onEventSetTime(type, data, device) {
197
+ // FIXME: Need to join onEventSetTime/onEventSetLocalTime to one command
198
+ if (data.type === 'commandMcuSyncTime' && data.cluster === 'manuSpecificTuya') {
199
+ try {
200
+ const utcTime = Math.round((new Date().getTime() - constants.OneJanuary2000) / 1000);
201
+ const localTime = utcTime - new Date().getTimezoneOffset() * 60;
202
+ const endpoint = device.getEndpoint(1);
203
+ const payload = {
204
+ payloadSize: 8,
205
+ payload: [...convertDecimalValueTo4ByteHexArray(utcTime), ...convertDecimalValueTo4ByteHexArray(localTime)],
206
+ };
207
+ await endpoint.command('manuSpecificTuya', 'mcuSyncTime', payload, {});
208
+ }
209
+ catch {
210
+ // endpoint.command can throw an error which needs to
211
+ // be caught or the zigbee-herdsman may crash
212
+ // Debug message is handled in the zigbee-herdsman
213
+ }
214
+ }
215
+ }
216
+ // set UTC and Local Time as total number of seconds from 00: 00: 00 on January 01, 1970
217
+ // force to update every device time every hour due to very poor clock
218
+ async function onEventSetLocalTime(type, data, device) {
219
+ // FIXME: What actually nextLocalTimeUpdate/forceTimeUpdate do?
220
+ // I did not find any timers or something else where it was used.
221
+ // Actually, there are two ways to set time on Tuya MCU devices:
222
+ // 1. Respond to the `commandMcuSyncTime` event
223
+ // 2. Just send `mcuSyncTime` anytime (by 1-hour timer or something else)
224
+ const nextLocalTimeUpdate = globalStore.getValue(device, 'nextLocalTimeUpdate');
225
+ const forceTimeUpdate = nextLocalTimeUpdate == null || nextLocalTimeUpdate < new Date().getTime();
226
+ if ((data.type === 'commandMcuSyncTime' && data.cluster === 'manuSpecificTuya') || forceTimeUpdate) {
227
+ globalStore.putValue(device, 'nextLocalTimeUpdate', new Date().getTime() + 3600 * 1000);
228
+ try {
229
+ const utcTime = Math.round(new Date().getTime() / 1000);
230
+ const localTime = utcTime - new Date().getTimezoneOffset() * 60;
231
+ const endpoint = device.getEndpoint(1);
232
+ const payload = {
233
+ payloadSize: 8,
234
+ payload: [...convertDecimalValueTo4ByteHexArray(utcTime), ...convertDecimalValueTo4ByteHexArray(localTime)],
235
+ };
236
+ await endpoint.command('manuSpecificTuya', 'mcuSyncTime', payload, {});
237
+ }
238
+ catch {
239
+ // endpoint.command can throw an error which needs to
240
+ // be caught or the zigbee-herdsman may crash
241
+ // Debug message is handled in the zigbee-herdsman
242
+ }
243
+ }
244
+ }
245
+ // Return `seq` - transaction ID for handling concrete response
246
+ async function sendDataPoints(entity, dpValues, cmd = 'dataRequest', seq) {
247
+ if (seq === undefined) {
248
+ seq = globalStore.getValue(entity, 'sequence', 0);
249
+ globalStore.putValue(entity, 'sequence', (seq + 1) % 0xffff);
250
+ }
251
+ await entity.command('manuSpecificTuya', cmd, { seq, dpValues }, { disableDefaultResponse: true });
252
+ return seq;
253
+ }
254
+ function dpValueFromNumberValue(dp, value) {
255
+ return { dp, datatype: exports.dataTypes.number, data: convertDecimalValueTo4ByteHexArray(value) };
256
+ }
257
+ function dpValueFromBool(dp, value) {
258
+ return { dp, datatype: exports.dataTypes.bool, data: [value ? 1 : 0] };
259
+ }
260
+ function dpValueFromEnum(dp, value) {
261
+ return { dp, datatype: exports.dataTypes.enum, data: [value] };
262
+ }
263
+ function dpValueFromString(dp, string) {
264
+ return { dp, datatype: exports.dataTypes.string, data: convertStringToHexArray(string) };
265
+ }
266
+ function dpValueFromRaw(dp, rawBuffer) {
267
+ return { dp, datatype: exports.dataTypes.raw, data: rawBuffer };
268
+ }
269
+ function dpValueFromBitmap(dp, bitmapBuffer) {
270
+ return { dp, datatype: exports.dataTypes.bitmap, data: [bitmapBuffer] };
271
+ }
272
+ async function sendDataPointValue(entity, dp, value, cmd, seq) {
273
+ return await sendDataPoints(entity, [dpValueFromNumberValue(dp, value)], cmd, seq);
274
+ }
275
+ async function sendDataPointBool(entity, dp, value, cmd, seq) {
276
+ return await sendDataPoints(entity, [dpValueFromBool(dp, value)], cmd, seq);
277
+ }
278
+ async function sendDataPointEnum(entity, dp, value, cmd, seq) {
279
+ return await sendDataPoints(entity, [dpValueFromEnum(dp, value)], cmd, seq);
280
+ }
281
+ async function sendDataPointRaw(entity, dp, value, cmd, seq) {
282
+ return await sendDataPoints(entity, [dpValueFromRaw(dp, value)], cmd, seq);
283
+ }
284
+ async function sendDataPointBitmap(entity, dp, value, cmd, seq) {
285
+ return await sendDataPoints(entity, [dpValueFromBitmap(dp, value)], cmd, seq);
286
+ }
287
+ async function sendDataPointStringBuffer(entity, dp, value, cmd, seq) {
288
+ return await sendDataPoints(entity, [dpValueFromString(dp, value)], cmd, seq);
289
+ }
290
+ const tuyaExposes = {
291
+ lightType: () => e.enum('light_type', ea.STATE_SET, ['led', 'incandescent', 'halogen']).withDescription('Type of light attached to the device'),
292
+ lightBrightnessWithMinMax: () => e
293
+ .light_brightness()
294
+ .withMinBrightness()
295
+ .withMaxBrightness()
296
+ .setAccess('state', ea.STATE_SET)
297
+ .setAccess('brightness', ea.STATE_SET)
298
+ .setAccess('min_brightness', ea.STATE_SET)
299
+ .setAccess('max_brightness', ea.STATE_SET),
300
+ lightBrightness: () => e.light_brightness().setAccess('state', ea.STATE_SET).setAccess('brightness', ea.STATE_SET),
301
+ countdown: () => e
302
+ .numeric('countdown', ea.STATE_SET)
303
+ .withValueMin(0)
304
+ .withValueMax(43200)
305
+ .withValueStep(1)
306
+ .withUnit('s')
307
+ .withDescription('Countdown to turn device off after a certain time'),
308
+ switch: () => e.switch().setAccess('state', ea.STATE_SET),
309
+ selfTest: () => e.binary('self_test', ea.STATE_SET, true, false).withDescription('Indicates whether the device is being self-tested'),
310
+ selfTestResult: () => e.enum('self_test_result', ea.STATE, ['checking', 'success', 'failure', 'others']).withDescription('Result of the self-test'),
311
+ faultAlarm: () => e.binary('fault_alarm', ea.STATE, true, false).withDescription('Indicates whether a fault was detected'),
312
+ silence: () => e.binary('silence', ea.STATE_SET, true, false).withDescription('Silence the alarm'),
313
+ frostProtection: (extraNote = '') => e
314
+ .binary('frost_protection', ea.STATE_SET, 'ON', 'OFF')
315
+ .withDescription(`When Anti-Freezing function is activated, the temperature in the house is kept at 8 °C.${extraNote}`),
316
+ errorStatus: () => e.numeric('error_status', ea.STATE).withDescription('Error status'),
317
+ scheduleAllDays: (access, format) => ['monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday', 'sunday'].map((day) => e.text(`schedule_${day}`, access).withDescription(`Schedule for ${day}, format: "${format}"`)),
318
+ temperatureUnit: () => e.enum('temperature_unit', ea.STATE_SET, ['celsius', 'fahrenheit']).withDescription('Temperature unit'),
319
+ temperatureCalibration: () => e
320
+ .numeric('temperature_calibration', ea.STATE_SET)
321
+ .withValueMin(-2.0)
322
+ .withValueMax(2.0)
323
+ .withValueStep(0.1)
324
+ .withUnit('°C')
325
+ .withDescription('Temperature calibration'),
326
+ humidityCalibration: () => e
327
+ .numeric('humidity_calibration', ea.STATE_SET)
328
+ .withValueMin(-30)
329
+ .withValueMax(30)
330
+ .withValueStep(1)
331
+ .withUnit('%')
332
+ .withDescription('Humidity calibration'),
333
+ gasValue: () => e.numeric('gas_value', ea.STATE).withDescription('Measured gas concentration'),
334
+ energyWithPhase: (phase) => e.numeric(`energy_${phase}`, ea.STATE).withUnit('kWh').withDescription(`Sum of consumed energy (phase ${phase.toUpperCase()})`),
335
+ energyProducedWithPhase: (phase) => e.numeric(`energy_produced_${phase}`, ea.STATE).withUnit('kWh').withDescription(`Sum of produced energy (phase ${phase.toUpperCase()})`),
336
+ energyFlowWithPhase: (phase, more) => e
337
+ .enum(`energy_flow_${phase}`, ea.STATE, ['consuming', 'producing', ...more])
338
+ .withDescription(`Direction of energy (phase ${phase.toUpperCase()})`),
339
+ voltageWithPhase: (phase) => e.numeric(`voltage_${phase}`, ea.STATE).withUnit('V').withDescription(`Measured electrical potential value (phase ${phase.toUpperCase()})`),
340
+ powerWithPhase: (phase) => e.numeric(`power_${phase}`, ea.STATE).withUnit('W').withDescription(`Instantaneous measured power (phase ${phase.toUpperCase()})`),
341
+ currentWithPhase: (phase) => e
342
+ .numeric(`current_${phase}`, ea.STATE)
343
+ .withUnit('A')
344
+ .withDescription(`Instantaneous measured electrical current (phase ${phase.toUpperCase()})`),
345
+ powerFactorWithPhase: (phase) => e
346
+ .numeric(`power_factor_${phase}`, ea.STATE)
347
+ .withUnit('%')
348
+ .withDescription(`Instantaneous measured power factor (phase ${phase.toUpperCase()})`),
349
+ switchType: () => e.enum('switch_type', ea.ALL, ['toggle', 'state', 'momentary']).withDescription('Type of the switch'),
350
+ backlightModeLowMediumHigh: () => e.enum('backlight_mode', ea.ALL, ['low', 'medium', 'high']).withDescription('Intensity of the backlight'),
351
+ backlightModeOffNormalInverted: () => e.enum('backlight_mode', ea.ALL, ['off', 'normal', 'inverted']).withDescription('Mode of the backlight'),
352
+ backlightModeOffOn: () => e.binary('backlight_mode', ea.ALL, 'ON', 'OFF').withDescription(`Mode of the backlight`),
353
+ indicatorMode: () => e.enum('indicator_mode', ea.ALL, ['off', 'off/on', 'on/off', 'on']).withDescription('LED indicator mode'),
354
+ indicatorModeNoneRelayPos: () => e.enum('indicator_mode', ea.ALL, ['none', 'relay', 'pos']).withDescription('Mode of the indicator light'),
355
+ powerOutageMemory: () => e.enum('power_outage_memory', ea.ALL, ['on', 'off', 'restore']).withDescription('Recover state after power outage'),
356
+ batteryState: () => e.enum('battery_state', ea.STATE, ['low', 'medium', 'high']).withDescription('State of the battery'),
357
+ doNotDisturb: () => e
358
+ .binary('do_not_disturb', ea.STATE_SET, true, false)
359
+ .withDescription('Do not disturb mode, when enabled this function will keep the light OFF after a power outage'),
360
+ colorPowerOnBehavior: () => e.enum('color_power_on_behavior', ea.STATE_SET, ['initial', 'previous', 'customized']).withDescription('Power on behavior state'),
361
+ switchMode: () => e.enum('switch_mode', ea.STATE_SET, ['switch', 'scene']).withDescription('Sets the mode of the switch to act as a switch or as a scene'),
362
+ switchMode2: () => e
363
+ .enum('switch_mode', ea.STATE_SET, ['switch', 'curtain'])
364
+ .withDescription('Sets the mode of the switch to act as a switch or as a curtain controller'),
365
+ lightMode: () => e.enum('light_mode', ea.STATE_SET, ['normal', 'on', 'off', 'flash']).withDescription(`'Sets the indicator mode of l1.
366
+ Normal: Orange while off and white while on.
367
+ On: Always white. Off: Always orange.
368
+ Flash: Flashes white when triggered.
369
+ Note: Orange light will turn off after light off delay, white light always stays on. Light mode updates on next state change.'`),
370
+ // Inching can be enabled for multiple endpoints (1 to 6) but it is always controlled on endpoint 1
371
+ // So instead of pinning the values to each endpoint, it is easier to keep the structure stand alone.
372
+ inchingSwitch: (quantity) => {
373
+ const x = e
374
+ .composite('inching_control_set', 'inching_control_set', ea.SET)
375
+ .withDescription('Device Inching function Settings. The device will automatically turn off ' + 'after each turn on for a specified period of time.');
376
+ for (let i = 1; i <= quantity; i++) {
377
+ x.withFeature(e
378
+ .binary('inching_control', ea.SET, 'ENABLE', 'DISABLE')
379
+ .withDescription('Enable/disable inching function for endpoint ' + i + '.')
380
+ .withLabel('Inching for Endpoint ' + i)
381
+ .withProperty('inching_control_' + i)).withFeature(e
382
+ .numeric('inching_time', ea.SET)
383
+ .withDescription('Delay time for executing a inching action for endpoint ' + i + '.')
384
+ .withLabel('Inching time for endpoint ' + i)
385
+ .withProperty('inching_time_' + i)
386
+ .withUnit('seconds')
387
+ .withValueMin(1)
388
+ .withValueMax(65535)
389
+ .withValueStep(1));
390
+ }
391
+ return x;
392
+ },
393
+ };
394
+ exports.exposes = tuyaExposes;
395
+ exports.skip = {
396
+ // Prevent state from being published when already ON and brightness is also published.
397
+ // This prevents 100% -> X% brightness jumps when the switch is already on
398
+ // https://github.com/Koenkk/zigbee2mqtt/issues/13800#issuecomment-1263592783
399
+ stateOnAndBrightnessPresent: (meta) => {
400
+ if (Array.isArray(meta.mapped))
401
+ throw new Error('Not supported');
402
+ const convertedKey = meta.mapped.meta.multiEndpoint && meta.endpoint_name ? `state_${meta.endpoint_name}` : 'state';
403
+ return meta.message.brightness !== undefined && meta.state[convertedKey] === meta.message.state;
404
+ },
405
+ };
406
+ const configureMagicPacket = async (device, coordinatorEndpoint) => {
407
+ try {
408
+ const endpoint = device.endpoints[0];
409
+ await endpoint.read('genBasic', ['manufacturerName', 'zclVersion', 'appVersion', 'modelId', 'powerSource', 0xfffe]);
410
+ }
411
+ catch (e) {
412
+ // Fails for some Tuya devices with UNSUPPORTED_ATTRIBUTE, ignore that.
413
+ // e.g. https://github.com/Koenkk/zigbee2mqtt/issues/14857
414
+ if (e.message.includes('UNSUPPORTED_ATTRIBUTE')) {
415
+ logger_1.logger.debug('configureMagicPacket failed, ignoring...', NS);
416
+ }
417
+ else {
418
+ throw e;
419
+ }
420
+ }
421
+ };
422
+ exports.configureMagicPacket = configureMagicPacket;
423
+ const fingerprint = (modelID, manufacturerNames) => {
424
+ return manufacturerNames.map((manufacturerName) => {
425
+ return { modelID, manufacturerName };
426
+ });
427
+ };
428
+ exports.fingerprint = fingerprint;
429
+ const whitelabel = (vendor, model, description, manufacturerNames) => {
430
+ const fingerprint = manufacturerNames.map((manufacturerName) => {
431
+ return { manufacturerName };
432
+ });
433
+ return { vendor, model, description, fingerprint };
434
+ };
435
+ exports.whitelabel = whitelabel;
436
+ class Base {
437
+ value;
438
+ constructor(value) {
439
+ this.value = value;
440
+ }
441
+ valueOf() {
442
+ return this.value;
443
+ }
444
+ }
445
+ class Enum extends Base {
446
+ constructor(value) {
447
+ super(value);
448
+ }
449
+ }
450
+ exports.Enum = Enum;
451
+ const enumConstructor = (value) => new Enum(value);
452
+ exports.enum = enumConstructor;
453
+ class Bitmap extends Base {
454
+ constructor(value) {
455
+ super(value);
456
+ }
457
+ }
458
+ exports.Bitmap = Bitmap;
459
+ exports.valueConverterBasic = {
460
+ lookup: (map, fallbackValue) => {
461
+ return {
462
+ to: (v, meta) => utils.getFromLookup(v, typeof map === 'function' ? map(meta.options, meta.device) : map),
463
+ from: (v, _meta, options) => {
464
+ const m = typeof map === 'function' ? map(options, _meta.device) : map;
465
+ const value = Object.entries(m).find((i) => i[1].valueOf() === v);
466
+ if (!value) {
467
+ if (fallbackValue !== undefined)
468
+ return fallbackValue;
469
+ throw new Error(`Value '${v}' is not allowed, expected one of ${Object.values(m).map((i) => i.valueOf())}`);
470
+ }
471
+ return value[0];
472
+ },
473
+ };
474
+ },
475
+ scale: (min1, max1, min2, max2) => {
476
+ return {
477
+ to: (v) => utils.mapNumberRange(v, min1, max1, min2, max2),
478
+ from: (v) => utils.mapNumberRange(v, min2, max2, min1, max1),
479
+ };
480
+ },
481
+ raw: () => {
482
+ return { to: (v) => v, from: (v) => v };
483
+ },
484
+ divideBy: (value) => {
485
+ return { to: (v) => v * value, from: (v) => v / value };
486
+ },
487
+ divideByFromOnly: (value) => {
488
+ return { to: (v) => v, from: (v) => v / value };
489
+ },
490
+ trueFalse: (valueTrue) => {
491
+ return { from: (v) => v === valueTrue.valueOf() };
492
+ },
493
+ };
494
+ exports.valueConverter = {
495
+ trueFalse0: exports.valueConverterBasic.trueFalse(0),
496
+ trueFalse1: exports.valueConverterBasic.trueFalse(1),
497
+ trueFalseInvert: {
498
+ to: (v) => !v,
499
+ from: (v) => !v,
500
+ },
501
+ trueFalseEnum0: exports.valueConverterBasic.trueFalse(new Enum(0)),
502
+ trueFalseEnum1: exports.valueConverterBasic.trueFalse(new Enum(1)),
503
+ onOff: exports.valueConverterBasic.lookup({ ON: true, OFF: false }),
504
+ powerOnBehavior: exports.valueConverterBasic.lookup({ off: 0, on: 1, previous: 2 }),
505
+ powerOnBehaviorEnum: exports.valueConverterBasic.lookup({ off: new Enum(0), on: new Enum(1), previous: new Enum(2) }),
506
+ switchType: exports.valueConverterBasic.lookup({ momentary: new Enum(0), toggle: new Enum(1), state: new Enum(2) }),
507
+ switchType2: exports.valueConverterBasic.lookup({ toggle: new Enum(0), state: new Enum(1), momentary: new Enum(2) }),
508
+ backlightModeOffNormalInverted: exports.valueConverterBasic.lookup({ off: new Enum(0), normal: new Enum(1), inverted: new Enum(2) }),
509
+ backlightModeOffLowMediumHigh: exports.valueConverterBasic.lookup({ off: new Enum(0), low: new Enum(1), medium: new Enum(2), high: new Enum(3) }),
510
+ lightType: exports.valueConverterBasic.lookup({ led: 0, incandescent: 1, halogen: 2 }),
511
+ countdown: exports.valueConverterBasic.raw(),
512
+ scale0_254to0_1000: exports.valueConverterBasic.scale(0, 254, 0, 1000),
513
+ scale0_1to0_1000: exports.valueConverterBasic.scale(0, 1, 0, 1000),
514
+ temperatureUnit: exports.valueConverterBasic.lookup({ celsius: 0, fahrenheit: 1 }),
515
+ temperatureUnitEnum: exports.valueConverterBasic.lookup({ celsius: new Enum(0), fahrenheit: new Enum(1) }),
516
+ batteryState: exports.valueConverterBasic.lookup({ low: 0, medium: 1, high: 2 }),
517
+ divideBy2: exports.valueConverterBasic.divideBy(2),
518
+ divideBy10: exports.valueConverterBasic.divideBy(10),
519
+ divideBy100: exports.valueConverterBasic.divideBy(100),
520
+ divideBy1000: exports.valueConverterBasic.divideBy(1000),
521
+ divideBy10FromOnly: exports.valueConverterBasic.divideByFromOnly(10),
522
+ switchMode: exports.valueConverterBasic.lookup({ switch: new Enum(0), scene: new Enum(1) }),
523
+ switchMode2: exports.valueConverterBasic.lookup({ switch: new Enum(0), curtain: new Enum(1) }),
524
+ lightMode: exports.valueConverterBasic.lookup({ normal: new Enum(0), on: new Enum(1), off: new Enum(2), flash: new Enum(3) }),
525
+ raw: exports.valueConverterBasic.raw(),
526
+ localTemperatureCalibration: {
527
+ from: (value) => (value > 4000 ? value - 4096 : value),
528
+ to: (value) => (value < 0 ? 4096 + value : value),
529
+ },
530
+ setLimit: {
531
+ to: (v) => {
532
+ if (!v)
533
+ throw new Error('Limit cannot be unset, use factory_reset');
534
+ return v;
535
+ },
536
+ from: (v) => v,
537
+ },
538
+ coverPosition: {
539
+ to: async (v, meta) => {
540
+ return meta.options.invert_cover ? 100 - v : v;
541
+ },
542
+ from: (v, meta, options, publish) => {
543
+ const position = options.invert_cover ? 100 - v : v;
544
+ publish({ state: position === 0 ? 'CLOSE' : 'OPEN' });
545
+ return position;
546
+ },
547
+ },
548
+ coverPositionInverted: {
549
+ to: async (v, meta) => {
550
+ return meta.options.invert_cover ? v : 100 - v;
551
+ },
552
+ from: (v, meta, options, publish) => {
553
+ const position = options.invert_cover ? v : 100 - v;
554
+ publish({ state: position === 0 ? 'CLOSE' : 'OPEN' });
555
+ return position;
556
+ },
557
+ },
558
+ tubularMotorDirection: exports.valueConverterBasic.lookup({ normal: new Enum(0), reversed: new Enum(1) }),
559
+ plus1: {
560
+ from: (v) => v + 1,
561
+ to: (v) => v - 1,
562
+ },
563
+ static: (value) => {
564
+ return {
565
+ from: (v) => {
566
+ return value;
567
+ },
568
+ };
569
+ },
570
+ phaseVariant1: {
571
+ from: (v) => {
572
+ const buffer = Buffer.from(v, 'base64');
573
+ return { voltage: (buffer[14] | (buffer[13] << 8)) / 10, current: (buffer[12] | (buffer[11] << 8)) / 1000 };
574
+ },
575
+ },
576
+ phaseVariant2: {
577
+ from: (v) => {
578
+ const buf = Buffer.from(v, 'base64');
579
+ return { voltage: (buf[1] | (buf[0] << 8)) / 10, current: (buf[4] | (buf[3] << 8)) / 1000, power: buf[7] | (buf[6] << 8) };
580
+ },
581
+ },
582
+ phaseVariant2WithPhase: (phase) => {
583
+ return {
584
+ from: (v) => {
585
+ // Support negative power readings
586
+ // https://github.com/Koenkk/zigbee2mqtt/issues/18603#issuecomment-2277697295
587
+ const buf = Buffer.from(v, 'base64');
588
+ let power = buf[7] | (buf[6] << 8);
589
+ if (power > 0x7fff) {
590
+ power = (0x999a - power) * -1;
591
+ }
592
+ return {
593
+ [`voltage_${phase}`]: (buf[1] | (buf[0] << 8)) / 10,
594
+ [`current_${phase}`]: (buf[4] | (buf[3] << 8)) / 1000,
595
+ [`power_${phase}`]: power,
596
+ };
597
+ },
598
+ };
599
+ },
600
+ phaseVariant3: {
601
+ from: (v) => {
602
+ const buf = Buffer.from(v, 'base64');
603
+ return {
604
+ voltage: ((buf[0] << 8) | buf[1]) / 10,
605
+ current: ((buf[2] << 16) | (buf[3] << 8) | buf[4]) / 1000,
606
+ power: (buf[5] << 16) | (buf[6] << 8) | buf[7],
607
+ };
608
+ },
609
+ },
610
+ power: {
611
+ from: (v) => {
612
+ // Support negative readings
613
+ // https://github.com/Koenkk/zigbee2mqtt/issues/18603
614
+ return v > 0x0fffffff ? (0x1999999c - v) * -1 : v;
615
+ },
616
+ },
617
+ threshold: {
618
+ from: (v) => {
619
+ const buffer = Buffer.from(v, 'base64');
620
+ const stateLookup = { 0: 'not_set', 1: 'over_current_threshold', 3: 'over_voltage_threshold' };
621
+ const protectionLookup = { 0: 'OFF', 1: 'ON' };
622
+ return {
623
+ threshold_1_protection: protectionLookup[buffer[1]],
624
+ threshold_1: stateLookup[buffer[0]],
625
+ threshold_1_value: buffer[3] | (buffer[2] << 8),
626
+ threshold_2_protection: protectionLookup[buffer[5]],
627
+ threshold_2: stateLookup[buffer[4]],
628
+ threshold_2_value: buffer[7] | (buffer[6] << 8),
629
+ };
630
+ },
631
+ },
632
+ threshold_2: {
633
+ to: async (v, meta) => {
634
+ const entity = meta.device.endpoints[0];
635
+ const onOffLookup = { on: 1, off: 0 };
636
+ const sendCommand = utils.getMetaValue(entity, meta.mapped, 'tuyaSendCommand', undefined, 'dataRequest');
637
+ if (meta.message.overload_breaker) {
638
+ const threshold = meta.state['overload_threshold'];
639
+ const buf = Buffer.from([
640
+ 3,
641
+ utils.getFromLookup(meta.message.overload_breaker, onOffLookup),
642
+ 0,
643
+ utils.toNumber(threshold, 'overload_threshold'),
644
+ ]);
645
+ await sendDataPointRaw(entity, 17, Array.from(buf), sendCommand, 1);
646
+ }
647
+ else if (meta.message.overload_threshold) {
648
+ const state = meta.state['overload_breaker'];
649
+ const buf = Buffer.from([
650
+ 3,
651
+ utils.getFromLookup(state, onOffLookup),
652
+ 0,
653
+ utils.toNumber(meta.message.overload_threshold, 'overload_threshold'),
654
+ ]);
655
+ await sendDataPointRaw(entity, 17, Array.from(buf), sendCommand, 1);
656
+ }
657
+ else if (meta.message.leakage_threshold) {
658
+ const state = meta.state['leakage_breaker'];
659
+ const buf = Buffer.alloc(8);
660
+ buf.writeUInt8(4, 4);
661
+ buf.writeUInt8(utils.getFromLookup(state, onOffLookup), 5);
662
+ buf.writeUInt16BE(utils.toNumber(meta.message.leakage_threshold, 'leakage_threshold'), 6);
663
+ await sendDataPointRaw(entity, 17, Array.from(buf), sendCommand, 1);
664
+ }
665
+ else if (meta.message.leakage_breaker) {
666
+ const threshold = meta.state['leakage_threshold'];
667
+ const buf = Buffer.alloc(8);
668
+ buf.writeUInt8(4, 4);
669
+ buf.writeUInt8(utils.getFromLookup(meta.message.leakage_breaker, onOffLookup), 5);
670
+ buf.writeUInt16BE(utils.toNumber(threshold, 'leakage_threshold'), 6);
671
+ await sendDataPointRaw(entity, 17, Array.from(buf), sendCommand, 1);
672
+ }
673
+ else if (meta.message.high_temperature_threshold) {
674
+ const state = meta.state['high_temperature_breaker'];
675
+ const buf = Buffer.alloc(12);
676
+ buf.writeUInt8(5, 8);
677
+ buf.writeUInt8(utils.getFromLookup(state, onOffLookup), 9);
678
+ buf.writeUInt16BE(utils.toNumber(meta.message.high_temperature_threshold, 'high_temperature_threshold'), 10);
679
+ await sendDataPointRaw(entity, 17, Array.from(buf), sendCommand, 1);
680
+ }
681
+ else if (meta.message.high_temperature_breaker) {
682
+ const threshold = meta.state['high_temperature_threshold'];
683
+ const buf = Buffer.alloc(12);
684
+ buf.writeUInt8(5, 8);
685
+ buf.writeUInt8(utils.getFromLookup(meta.message.high_temperature_breaker, onOffLookup), 9);
686
+ buf.writeUInt16BE(utils.toNumber(threshold, 'high_temperature_threshold'), 10);
687
+ await sendDataPointRaw(entity, 17, Array.from(buf), sendCommand, 1);
688
+ }
689
+ },
690
+ from: (v) => {
691
+ const data = Buffer.from(v, 'base64');
692
+ const result = {};
693
+ const lookup = { 0: 'OFF', 1: 'ON' };
694
+ const alarmLookup = { 3: 'overload', 4: 'leakage', 5: 'high_temperature' };
695
+ const len = data.length;
696
+ let i = 0;
697
+ while (i < len) {
698
+ if (Object.prototype.hasOwnProperty.call(alarmLookup, data[i])) {
699
+ const alarm = alarmLookup[data[i]];
700
+ const state = lookup[data[i + 1]];
701
+ const threshold = data[i + 3] | (data[i + 2] << 8);
702
+ result[`${alarm}_breaker`] = state;
703
+ result[`${alarm}_threshold`] = threshold;
704
+ }
705
+ i += 4;
706
+ }
707
+ return result;
708
+ },
709
+ },
710
+ threshold_3: {
711
+ to: async (v, meta) => {
712
+ const entity = meta.device.endpoints[0];
713
+ const onOffLookup = { on: 1, off: 0 };
714
+ const sendCommand = utils.getMetaValue(entity, meta.mapped, 'tuyaSendCommand', undefined, 'dataRequest');
715
+ if (meta.message.over_current_threshold) {
716
+ const state = meta.state['over_current_breaker'];
717
+ const buf = Buffer.from([
718
+ 1,
719
+ utils.getFromLookup(state, onOffLookup),
720
+ 0,
721
+ utils.toNumber(meta.message.over_current_threshold, 'over_current_threshold'),
722
+ ]);
723
+ await sendDataPointRaw(entity, 18, Array.from(buf), sendCommand, 1);
724
+ }
725
+ else if (meta.message.over_current_breaker) {
726
+ const threshold = meta.state['over_current_threshold'];
727
+ const buf = Buffer.from([
728
+ 1,
729
+ utils.getFromLookup(meta.message.over_current_breaker, onOffLookup),
730
+ 0,
731
+ utils.toNumber(threshold, 'over_current_threshold'),
732
+ ]);
733
+ await sendDataPointRaw(entity, 18, Array.from(buf), sendCommand, 1);
734
+ }
735
+ else if (meta.message.over_voltage_threshold) {
736
+ const state = meta.state['over_voltage_breaker'];
737
+ const buf = Buffer.alloc(8);
738
+ buf.writeUInt8(3, 4);
739
+ buf.writeUInt8(utils.getFromLookup(state, onOffLookup), 5);
740
+ buf.writeUInt16BE(utils.toNumber(meta.message.over_voltage_threshold, 'over_voltage_threshold'), 6);
741
+ await sendDataPointRaw(entity, 18, Array.from(buf), sendCommand, 1);
742
+ }
743
+ else if (meta.message.over_voltage_breaker) {
744
+ const threshold = meta.state['over_voltage_threshold'];
745
+ const buf = Buffer.alloc(8);
746
+ buf.writeUInt8(3, 4);
747
+ buf.writeUInt8(utils.getFromLookup(meta.message.over_voltage_breaker, onOffLookup), 5);
748
+ buf.writeUInt16BE(utils.toNumber(threshold, 'over_voltage_threshold'), 6);
749
+ await sendDataPointRaw(entity, 18, Array.from(buf), sendCommand, 1);
750
+ }
751
+ else if (meta.message.under_voltage_threshold) {
752
+ const state = meta.state['under_voltage_breaker'];
753
+ const buf = Buffer.alloc(12);
754
+ buf.writeUInt8(4, 8);
755
+ buf.writeUInt8(utils.getFromLookup(state, onOffLookup), 9);
756
+ buf.writeUInt16BE(utils.toNumber(meta.message.under_voltage_threshold, 'under_voltage_threshold'), 10);
757
+ await sendDataPointRaw(entity, 18, Array.from(buf), sendCommand, 1);
758
+ }
759
+ else if (meta.message.under_voltage_breaker) {
760
+ const threshold = meta.state['under_voltage_threshold'];
761
+ const buf = Buffer.alloc(12);
762
+ buf.writeUInt8(4, 8);
763
+ buf.writeUInt8(utils.getFromLookup(meta.message.under_voltage_breaker, onOffLookup), 9);
764
+ buf.writeUInt16BE(utils.toNumber(threshold, 'under_voltage_threshold'), 10);
765
+ await sendDataPointRaw(entity, 18, Array.from(buf), sendCommand, 1);
766
+ }
767
+ else if (meta.message.insufficient_balance_threshold) {
768
+ const state = meta.state['insufficient_balance_breaker'];
769
+ const buf = Buffer.alloc(16);
770
+ buf.writeUInt8(8, 12);
771
+ buf.writeUInt8(utils.getFromLookup(state, onOffLookup), 13);
772
+ buf.writeUInt16BE(utils.toNumber(meta.message.insufficient_balance_threshold, 'insufficient_balance_threshold'), 14);
773
+ await sendDataPointRaw(entity, 18, Array.from(buf), sendCommand, 1);
774
+ }
775
+ else if (meta.message.insufficient_balance_breaker) {
776
+ const threshold = meta.state['insufficient_balance_threshold'];
777
+ const buf = Buffer.alloc(16);
778
+ buf.writeUInt8(8, 12);
779
+ buf.writeUInt8(utils.getFromLookup(meta.message.insufficient_balance_breaker, onOffLookup), 13);
780
+ buf.writeUInt16BE(utils.toNumber(threshold, 'insufficient_balance_threshold'), 14);
781
+ await sendDataPointRaw(entity, 18, Array.from(buf), sendCommand, 1);
782
+ }
783
+ },
784
+ from: (v) => {
785
+ const data = Buffer.from(v, 'base64');
786
+ const result = {};
787
+ const lookup = { 0: 'OFF', 1: 'ON' };
788
+ const alarmLookup = { 1: 'over_current', 3: 'over_voltage', 4: 'under_voltage', 8: 'insufficient_balance' };
789
+ const len = data.length;
790
+ let i = 0;
791
+ while (i < len) {
792
+ if (Object.prototype.hasOwnProperty.call(alarmLookup, data[i])) {
793
+ const alarm = alarmLookup[data[i]];
794
+ const state = lookup[data[i + 1]];
795
+ const threshold = data[i + 3] | (data[i + 2] << 8);
796
+ result[`${alarm}_breaker`] = state;
797
+ result[`${alarm}_threshold`] = threshold;
798
+ }
799
+ i += 4;
800
+ }
801
+ return result;
802
+ },
803
+ },
804
+ selfTestResult: exports.valueConverterBasic.lookup({ checking: 0, success: 1, failure: 2, others: 3 }),
805
+ lockUnlock: exports.valueConverterBasic.lookup({ LOCK: true, UNLOCK: false }),
806
+ localTempCalibration1: {
807
+ from: (v) => {
808
+ if (v > 55)
809
+ v -= 0x100000000;
810
+ return v / 10;
811
+ },
812
+ to: (v) => {
813
+ if (v > 0)
814
+ return v * 10;
815
+ if (v < 0)
816
+ return v * 10 + 0x100000000;
817
+ return v;
818
+ },
819
+ },
820
+ localTempCalibration2: {
821
+ from: (v) => v,
822
+ to: (v) => {
823
+ if (v < 0)
824
+ return v + 0x100000000;
825
+ return v;
826
+ },
827
+ },
828
+ localTempCalibration3: {
829
+ from: (v) => {
830
+ if (v > 0x7fffffff)
831
+ v -= 0x100000000;
832
+ return v / 10;
833
+ },
834
+ to: (v) => {
835
+ if (v > 0)
836
+ return v * 10;
837
+ if (v < 0)
838
+ return v * 10 + 0x100000000;
839
+ return v;
840
+ },
841
+ },
842
+ thermostatHolidayStartStop: {
843
+ from: (v) => {
844
+ const start = {
845
+ year: v.slice(0, 4),
846
+ month: v.slice(4, 6),
847
+ day: v.slice(6, 8),
848
+ hours: v.slice(8, 10),
849
+ minutes: v.slice(10, 12),
850
+ };
851
+ const end = {
852
+ year: v.slice(12, 16),
853
+ month: v.slice(16, 18),
854
+ day: v.slice(18, 20),
855
+ hours: v.slice(20, 22),
856
+ minutes: v.slice(22, 24),
857
+ };
858
+ const startStr = `${start.year}/${start.month}/${start.day} ${start.hours}:${start.minutes}`;
859
+ const endStr = `${end.year}/${end.month}/${end.day} ${end.hours}:${end.minutes}`;
860
+ return `${startStr} | ${endStr}`;
861
+ },
862
+ to: (v) => {
863
+ const numberPattern = /\d+/g;
864
+ // @ts-expect-error ignore
865
+ return v.match(numberPattern).join([]).toString();
866
+ },
867
+ },
868
+ thermostatScheduleDaySingleDP: {
869
+ from: (v) => {
870
+ // day split to 10 min segments = total 144 segments
871
+ const maxPeriodsInDay = 10;
872
+ const periodSize = 3;
873
+ const schedule = [];
874
+ for (let i = 0; i < maxPeriodsInDay; i++) {
875
+ const time = v[i * periodSize];
876
+ const totalMinutes = time * 10;
877
+ const hours = totalMinutes / 60;
878
+ const rHours = Math.floor(hours);
879
+ const minutes = (hours - rHours) * 60;
880
+ const rMinutes = Math.round(minutes);
881
+ const strHours = rHours.toString().padStart(2, '0');
882
+ const strMinutes = rMinutes.toString().padStart(2, '0');
883
+ const tempHexArray = [v[i * periodSize + 1], v[i * periodSize + 2]];
884
+ const tempRaw = Buffer.from(tempHexArray).readUIntBE(0, tempHexArray.length);
885
+ const temp = tempRaw / 10;
886
+ schedule.push(`${strHours}:${strMinutes}/${temp}`);
887
+ if (rHours === 24)
888
+ break;
889
+ }
890
+ return schedule.join(' ');
891
+ },
892
+ to: (v, meta) => {
893
+ const dayByte = {
894
+ monday: 1,
895
+ tuesday: 2,
896
+ wednesday: 4,
897
+ thursday: 8,
898
+ friday: 16,
899
+ saturday: 32,
900
+ sunday: 64,
901
+ };
902
+ const weekDay = v.week_day;
903
+ utils.assertString(weekDay, 'week_day');
904
+ if (Object.keys(dayByte).indexOf(weekDay) === -1) {
905
+ throw new Error('Invalid "week_day" property value: ' + weekDay);
906
+ }
907
+ let weekScheduleType = 'separate';
908
+ if (meta.state && meta.state.working_day) {
909
+ weekScheduleType = String(meta.state.working_day);
910
+ }
911
+ const payload = [];
912
+ switch (weekScheduleType) {
913
+ case 'mon_sun':
914
+ payload.push(127);
915
+ break;
916
+ case 'mon_fri+sat+sun':
917
+ if (['saturday', 'sunday'].indexOf(weekDay) === -1) {
918
+ payload.push(31);
919
+ break;
920
+ }
921
+ payload.push(dayByte[weekDay]);
922
+ break;
923
+ case 'separate':
924
+ payload.push(dayByte[weekDay]);
925
+ break;
926
+ default:
927
+ throw new Error('Invalid "working_day" property, need to set it before');
928
+ }
929
+ // day split to 10 min segments = total 144 segments
930
+ const maxPeriodsInDay = 10;
931
+ utils.assertString(v.schedule, 'schedule');
932
+ const schedule = v.schedule.split(' ');
933
+ const schedulePeriods = schedule.length;
934
+ if (schedulePeriods > 10)
935
+ throw new Error('There cannot be more than 10 periods in the schedule: ' + v);
936
+ if (schedulePeriods < 2)
937
+ throw new Error('There cannot be less than 2 periods in the schedule: ' + v);
938
+ let prevHour;
939
+ for (const period of schedule) {
940
+ const timeTemp = period.split('/');
941
+ const hm = timeTemp[0].split(':', 2);
942
+ const h = parseInt(hm[0]);
943
+ const m = parseInt(hm[1]);
944
+ const temp = parseFloat(timeTemp[1]);
945
+ if (h < 0 || h > 24 || m < 0 || m >= 60 || m % 10 !== 0 || temp < 5 || temp > 30 || temp % 0.5 !== 0) {
946
+ throw new Error('Invalid hour, minute or temperature of: ' + period);
947
+ }
948
+ else if (prevHour > h) {
949
+ throw new Error(`The hour of the next segment can't be less than the previous one: ${prevHour} > ${h}`);
950
+ }
951
+ prevHour = h;
952
+ const segment = (h * 60 + m) / 10;
953
+ const tempHexArray = convertDecimalValueTo2ByteHexArray(temp * 10);
954
+ payload.push(segment, ...tempHexArray);
955
+ }
956
+ // Add "technical" periods to be valid payload
957
+ for (let i = 0; i < maxPeriodsInDay - schedulePeriods; i++) {
958
+ // by default it sends 9000b2, it's 24 hours and 18 degrees
959
+ payload.push(144, 0, 180);
960
+ }
961
+ return payload;
962
+ },
963
+ },
964
+ thermostatScheduleDayMultiDP: {
965
+ from: (v) => exports.valueConverter.thermostatScheduleDayMultiDPWithTransitionCount().from(v),
966
+ to: (v) => exports.valueConverter.thermostatScheduleDayMultiDPWithTransitionCount().to(v),
967
+ },
968
+ thermostatScheduleDayMultiDPWithTransitionCount: (transitionCount = 4) => {
969
+ return {
970
+ from: (v) => {
971
+ const schedule = [];
972
+ for (let index = 1; index < transitionCount * 4 - 1; index = index + 4) {
973
+ schedule.push(String(parseInt(v[index + 0])).padStart(2, '0') +
974
+ ':' +
975
+ String(parseInt(v[index + 1])).padStart(2, '0') +
976
+ '/' +
977
+ // @ts-expect-error ignore
978
+ (parseFloat((v[index + 2] << 8) + v[index + 3]) / 10.0).toFixed(1));
979
+ }
980
+ return schedule.join(' ');
981
+ },
982
+ to: (v) => {
983
+ const payload = [0];
984
+ const transitions = v.split(' ');
985
+ if (transitions.length != transitionCount) {
986
+ throw new Error(`Invalid schedule: there should be ${transitionCount} transitions`);
987
+ }
988
+ for (const transition of transitions) {
989
+ const timeTemp = transition.split('/');
990
+ if (timeTemp.length != 2) {
991
+ throw new Error('Invalid schedule: wrong transition format: ' + transition);
992
+ }
993
+ const hourMin = timeTemp[0].split(':');
994
+ const hour = parseInt(hourMin[0]);
995
+ const min = parseInt(hourMin[1]);
996
+ const temperature = Math.floor(parseFloat(timeTemp[1]) * 10);
997
+ if (hour < 0 || hour > 24 || min < 0 || min > 60 || temperature < 50 || temperature > 300) {
998
+ throw new Error('Invalid hour, minute or temperature of: ' + transition);
999
+ }
1000
+ payload.push(hour, min, (temperature & 0xff00) >> 8, temperature & 0xff);
1001
+ }
1002
+ return payload;
1003
+ },
1004
+ };
1005
+ },
1006
+ thermostatScheduleDayMultiDPWithDayNumber: (dayNum, transitionCount = 4) => {
1007
+ return {
1008
+ from: (v) => exports.valueConverter.thermostatScheduleDayMultiDPWithTransitionCount(transitionCount).from(v),
1009
+ to: (v) => {
1010
+ const data = exports.valueConverter.thermostatScheduleDayMultiDPWithTransitionCount(transitionCount).to(v);
1011
+ data[0] = dayNum;
1012
+ return data;
1013
+ },
1014
+ };
1015
+ },
1016
+ thermostatScheduleDayMultiDP_TRV602Z: {
1017
+ from: (v) => {
1018
+ const schedule = [];
1019
+ for (let index = 1; index < 24; index = index + 4) {
1020
+ const firstByte = (parseInt(v[index + 0]) - 192) << 8;
1021
+ const secondByte = parseInt(v[index + 1]);
1022
+ const minutesSinceMidnight = firstByte | secondByte;
1023
+ const hour = Math.floor(minutesSinceMidnight / 60);
1024
+ const minutes = minutesSinceMidnight % 60;
1025
+ schedule.push(String(hour).padStart(2, '0') + ':' + String(minutes).padStart(2, '0') + '/' + (parseFloat(v[index + 3]) / 10.0).toFixed(1));
1026
+ }
1027
+ return schedule.join(' ');
1028
+ },
1029
+ to: (v) => {
1030
+ const payload = [];
1031
+ const transitions = v.split(' ');
1032
+ if (transitions.length != 6) {
1033
+ throw new Error('Invalid schedule: there should be 6 transitions');
1034
+ }
1035
+ for (const transition of transitions) {
1036
+ const timeTemp = transition.split('/');
1037
+ if (timeTemp.length != 2) {
1038
+ throw new Error('Invalid schedule: wrong transition format: ' + transition);
1039
+ }
1040
+ const hourMin = timeTemp[0].split(':');
1041
+ const hour = parseInt(hourMin[0]);
1042
+ const min = parseInt(hourMin[1]);
1043
+ const temperature = Math.floor(parseFloat(timeTemp[1]) * 10);
1044
+ if (hour < 0 || hour > 24 || min < 0 || min > 60 || temperature < 50 || temperature > 300) {
1045
+ throw new Error('Invalid hour, minute or temperature of: ' + transition);
1046
+ }
1047
+ const minutesSinceMidnight = hour * 60 + min;
1048
+ const firstByte = ((minutesSinceMidnight & 3840) >> 8) + 192;
1049
+ const secondByte = minutesSinceMidnight & 255;
1050
+ payload.push(firstByte, secondByte, 64, temperature);
1051
+ }
1052
+ return payload;
1053
+ },
1054
+ },
1055
+ thermostatScheduleDayMultiDP_TRV602Z_WithDayNumber: (dayNum) => {
1056
+ return {
1057
+ from: (v) => exports.valueConverter.thermostatScheduleDayMultiDP_TRV602Z.from(v),
1058
+ to: (v) => {
1059
+ const data = exports.valueConverter.thermostatScheduleDayMultiDP_TRV602Z.to(v);
1060
+ data.unshift(dayNum);
1061
+ return data;
1062
+ },
1063
+ };
1064
+ },
1065
+ tv02Preset: () => {
1066
+ return {
1067
+ from: (v) => {
1068
+ if (v === 0)
1069
+ return 'auto';
1070
+ else if (v === 1)
1071
+ return 'manual';
1072
+ else
1073
+ return 'holiday'; // 2 and 3 are holiday
1074
+ },
1075
+ to: (v, meta) => {
1076
+ if (v === 'auto')
1077
+ return new Enum(0);
1078
+ else if (v === 'manual')
1079
+ return new Enum(1);
1080
+ else if (v === 'holiday') {
1081
+ // https://github.com/Koenkk/zigbee2mqtt/issues/20486
1082
+ if (meta.device.manufacturerName === '_TZE200_mudxchsu')
1083
+ return new Enum(2);
1084
+ else
1085
+ return new Enum(3);
1086
+ }
1087
+ else
1088
+ throw new Error(`Unsupported preset '${v}'`);
1089
+ },
1090
+ };
1091
+ },
1092
+ thermostatSystemModeAndPreset: (toKey) => {
1093
+ return {
1094
+ from: (v) => {
1095
+ utils.assertNumber(v, 'system_mode');
1096
+ const presetLookup = { 0: 'auto', 1: 'manual', 2: 'off', 3: 'on' };
1097
+ const systemModeLookup = { 0: 'auto', 1: 'auto', 2: 'off', 3: 'heat' };
1098
+ return { preset: presetLookup[v], system_mode: systemModeLookup[v] };
1099
+ },
1100
+ to: (v) => {
1101
+ const presetLookup = { auto: new Enum(0), manual: new Enum(1), off: new Enum(2), on: new Enum(3) };
1102
+ const systemModeLookup = { auto: new Enum(1), off: new Enum(2), heat: new Enum(3) };
1103
+ const lookup = toKey === 'preset' ? presetLookup : systemModeLookup;
1104
+ return utils.getFromLookup(v, lookup);
1105
+ },
1106
+ };
1107
+ },
1108
+ thermostatGtz10SystemModeAndPreset: (toKey) => {
1109
+ return {
1110
+ from: (v) => {
1111
+ utils.assertNumber(v, 'system_mode');
1112
+ const presetLookup = {
1113
+ 0: 'manual',
1114
+ 1: 'auto',
1115
+ 2: 'holiday',
1116
+ 3: 'comfort',
1117
+ 4: 'eco',
1118
+ 5: 'off',
1119
+ };
1120
+ const systemModeLookup = {
1121
+ 0: 'heat',
1122
+ 1: 'auto',
1123
+ 5: 'off',
1124
+ };
1125
+ return { preset: presetLookup[v], system_mode: systemModeLookup[v] };
1126
+ },
1127
+ to: (v) => {
1128
+ const presetLookup = {
1129
+ manual: new Enum(0),
1130
+ auto: new Enum(1),
1131
+ holiday: new Enum(2),
1132
+ comfort: new Enum(3),
1133
+ eco: new Enum(4),
1134
+ off: new Enum(5),
1135
+ };
1136
+ const systemModeLookup = {
1137
+ heat: new Enum(0),
1138
+ auto: new Enum(1),
1139
+ off: new Enum(5),
1140
+ };
1141
+ const lookup = toKey === 'preset' ? presetLookup : systemModeLookup;
1142
+ return utils.getFromLookup(v, lookup);
1143
+ },
1144
+ };
1145
+ },
1146
+ ZWT198_schedule: {
1147
+ from: (value, meta, options) => {
1148
+ const programmingMode = [];
1149
+ for (let i = 0; i < 8; i++) {
1150
+ const start = i * 4;
1151
+ const time = value[start].toString().padStart(2, '0') + ':' + value[start + 1].toString().padStart(2, '0');
1152
+ const temp = (value[start + 2] * 256 + value[start + 3]) / 10;
1153
+ const tempStr = temp.toFixed(1) + '°C';
1154
+ programmingMode.push(time + '/' + tempStr);
1155
+ }
1156
+ return {
1157
+ schedule_weekday: programmingMode.slice(0, 6).join(' '),
1158
+ schedule_holiday: programmingMode.slice(6, 8).join(' '),
1159
+ };
1160
+ },
1161
+ to: async (v, meta) => {
1162
+ const dpId = 109;
1163
+ const payload = [];
1164
+ let weekdayFormat;
1165
+ let holidayFormat;
1166
+ if (meta.message.schedule_weekday !== undefined) {
1167
+ weekdayFormat = v;
1168
+ holidayFormat = meta.state['schedule_holiday'];
1169
+ }
1170
+ else {
1171
+ weekdayFormat = meta.state['schedule_weekday'];
1172
+ holidayFormat = v;
1173
+ }
1174
+ function scheduleToRaw(key, input, number, payload, meta) {
1175
+ const items = input.trim().split(/\s+/);
1176
+ if (items.length != number) {
1177
+ throw new Error('Wrong number of items for ' + key + ' :' + items.length);
1178
+ }
1179
+ else {
1180
+ for (let i = 0; i < number; i++) {
1181
+ const timeTemperature = items[i].split('/');
1182
+ if (timeTemperature.length != 2) {
1183
+ throw new Error('Invalid schedule: wrong transition format: ' + items[i]);
1184
+ }
1185
+ const hourMinute = timeTemperature[0].split(':', 2);
1186
+ const hour = parseInt(hourMinute[0]);
1187
+ const minute = parseInt(hourMinute[1]);
1188
+ const temperature = parseFloat(timeTemperature[1]);
1189
+ if (!utils.isNumber(hour) ||
1190
+ !utils.isNumber(temperature) ||
1191
+ !utils.isNumber(minute) ||
1192
+ hour < 0 ||
1193
+ hour >= 24 ||
1194
+ minute < 0 ||
1195
+ minute >= 60 ||
1196
+ temperature < 5 ||
1197
+ temperature >= 35) {
1198
+ throw new Error('Invalid hour, minute or temperature (5<t<35) in ' +
1199
+ key +
1200
+ ' of: `' +
1201
+ items[i] +
1202
+ '`; Format is `hh:m/cc.c` or `hh:mm/cc.c°C`');
1203
+ }
1204
+ const temperature10 = Math.round(temperature * 10);
1205
+ payload.push(hour, minute, (temperature10 >> 8) & 0xff, temperature10 & 0xff);
1206
+ }
1207
+ }
1208
+ return;
1209
+ }
1210
+ scheduleToRaw('schedule_weekday', weekdayFormat, 6, payload, meta);
1211
+ scheduleToRaw('schedule_holiday', holidayFormat, 2, payload, meta);
1212
+ const entity = meta.device.endpoints[0];
1213
+ const sendCommand = utils.getMetaValue(entity, meta.mapped, 'tuyaSendCommand', undefined, 'dataRequest');
1214
+ await sendDataPointRaw(entity, dpId, payload, sendCommand, 1);
1215
+ },
1216
+ },
1217
+ PO_BOCO_ELEC_schedule: (day) => ({
1218
+ to: (v) => {
1219
+ const payload = [80 + day];
1220
+ const modeMapping = {
1221
+ off: 5,
1222
+ antifrost: 4,
1223
+ eco: 3,
1224
+ 'comfort_-2': 2,
1225
+ 'comfort_-1': 1,
1226
+ comfort: 0,
1227
+ };
1228
+ const items = v.split(' / ');
1229
+ items.forEach((item) => {
1230
+ if (Object.keys(modeMapping).includes(item)) {
1231
+ payload.push(modeMapping[item]);
1232
+ }
1233
+ else {
1234
+ const time = item.split(':');
1235
+ const hours = parseInt(time[0]);
1236
+ const minutes = Math.floor(parseInt(time[1]) / 5);
1237
+ const total = hours * 12 + minutes;
1238
+ if (total > 0)
1239
+ payload.push(total);
1240
+ }
1241
+ });
1242
+ return payload;
1243
+ },
1244
+ from: (v) => {
1245
+ const payload = [];
1246
+ const modeMapping = {
1247
+ 5: 'off',
1248
+ 4: 'antifrost',
1249
+ 3: 'eco',
1250
+ 2: 'comfort_-2',
1251
+ 1: 'comfort_-1',
1252
+ 0: 'comfort',
1253
+ };
1254
+ for (let index = 1; index < v.length; index++) {
1255
+ const item = v[index];
1256
+ if (index % 2) {
1257
+ if (item > 5)
1258
+ break;
1259
+ const mode = modeMapping[item];
1260
+ payload.push(mode);
1261
+ }
1262
+ else {
1263
+ const nextItem = v[index + 1];
1264
+ if (nextItem > 5)
1265
+ break;
1266
+ const date = new Date();
1267
+ date.setHours(0, item * 5);
1268
+ const hours = date.getHours().toString().padStart(2, '0');
1269
+ const minutes = date.getMinutes().toString().padStart(2, '0');
1270
+ payload.push(`${hours}:${minutes}`);
1271
+ }
1272
+ }
1273
+ return payload.join(' / ');
1274
+ },
1275
+ }),
1276
+ PO_BOCO_ELEC_holiday: {
1277
+ to: (v) => {
1278
+ const payload = [];
1279
+ const regex = /(?<startYear>\d{4})\/(?<startMonth>\d{2})\/(?<startDay>\d{2})\s(?<startHours>\d{2}):(?<startMinutes>\d{2}) \| (?<endYear>\d{4})\/(?<endMonth>\d{2})\/(?<endDay>\d{2})\s(?<endHours>\d{2}):(?<endMinutes>\d{2}) \| (?<mode>off|antifrost|eco|comfort_-2|comfort_-1|comfort)$/g;
1280
+ const regexResult = regex.exec(v);
1281
+ if (!regexResult)
1282
+ throw new Error('Invalid syntax. Should be' +
1283
+ '`startYear/startMonth/startDay startHours:startMinutes | endYear/endMonth/endDay endHours:endMinutes | mode`. ' +
1284
+ 'For example: `2024/12/12 09:00 | 2024/12/14 10:00 | comfort`');
1285
+ const { startYear, startMonth, startDay, startHours, startMinutes, endYear, endMonth, endDay, endHours, endMin, mode } = regexResult.groups;
1286
+ const startDate = new Date(parseInt(startYear), parseInt(startMonth) - 1, parseInt(startDay), parseInt(startHours), parseInt(startMinutes));
1287
+ const endDate = new Date(parseInt(endYear), parseInt(endMonth) - 1, parseInt(endDay), parseInt(endHours), parseInt(startMinutes));
1288
+ const diffHours = Math.abs(startDate.getTime() - endDate.getTime()) / 36e5;
1289
+ const modeMapping = {
1290
+ off: 5,
1291
+ antifrost: 4,
1292
+ eco: 3,
1293
+ 'comfort_-2': 2,
1294
+ 'comfort_-1': 1,
1295
+ comfort: 0,
1296
+ };
1297
+ if (endMin)
1298
+ logger_1.logger.warning('The end date minutes will be ignore.', NS);
1299
+ if (diffHours > 255)
1300
+ throw new Error('You cannot set an interval superior at 255 hours.');
1301
+ else if (startDate.getTime() > endDate.getTime())
1302
+ throw new Error('You cannot set a negative interval.');
1303
+ payload.push(parseInt(startYear.slice(2)), parseInt(startMonth), parseInt(startDay), parseInt(startHours), parseInt(startMinutes), modeMapping[mode], 0, diffHours);
1304
+ return payload;
1305
+ },
1306
+ from: (v) => {
1307
+ const startYear = '2' + v[0].toString().padStart(3, '0');
1308
+ const startMonth = v[1].toString().padStart(2, '0');
1309
+ const startDay = v[2].toString().padStart(2, '0');
1310
+ const startHours = v[3].toString().padStart(2, '0');
1311
+ const startMinutes = v[4].toString().padStart(2, '0');
1312
+ const mode = v[5];
1313
+ const diffHours = v[7];
1314
+ const modeMapping = {
1315
+ 5: 'off',
1316
+ 4: 'antifrost',
1317
+ 3: 'eco',
1318
+ 2: 'comfort_-2',
1319
+ 1: 'comfort_-1',
1320
+ 0: 'comfort',
1321
+ };
1322
+ const endDate = new Date(parseInt(startYear), parseInt(startMonth) - 1, parseInt(startDay), parseInt(startHours), parseInt(startMinutes));
1323
+ endDate.setHours(endDate.getHours() + diffHours);
1324
+ const endYear = endDate.getFullYear().toString();
1325
+ const endMonth = (endDate.getMonth() + 1).toString().padStart(2, '0');
1326
+ const endDay = endDate.getDate().toString().padStart(2, '0');
1327
+ const endHours = endDate.getHours().toString().padStart(2, '0');
1328
+ return (`${startYear}/${startMonth}/${startDay} ${startHours}:${startMinutes}` +
1329
+ ` | ${endYear}/${endMonth}/${endDay} ${endHours}:${startMinutes}` +
1330
+ ` | ${modeMapping[mode]}`);
1331
+ },
1332
+ },
1333
+ TV02SystemMode: {
1334
+ to: async (v, meta) => {
1335
+ const entity = meta.device.endpoints[0];
1336
+ if (meta.message.system_mode) {
1337
+ if (meta.message.system_mode === 'off') {
1338
+ await sendDataPointBool(entity, 107, true, 'dataRequest', 1);
1339
+ }
1340
+ else {
1341
+ await sendDataPointEnum(entity, 2, 1, 'dataRequest', 1); // manual
1342
+ }
1343
+ }
1344
+ else if (meta.message.heating_stop) {
1345
+ if (meta.message.heating_stop === 'ON') {
1346
+ await sendDataPointBool(entity, 107, true, 'dataRequest', 1);
1347
+ }
1348
+ else {
1349
+ await sendDataPointEnum(entity, 2, 1, 'dataRequest', 1); // manual
1350
+ }
1351
+ }
1352
+ },
1353
+ from: (v) => {
1354
+ return { system_mode: v === false ? 'heat' : 'off', heating_stop: v === false ? 'OFF' : 'ON' };
1355
+ },
1356
+ },
1357
+ TV02FrostProtection: {
1358
+ to: async (v, meta) => {
1359
+ const entity = meta.device.endpoints[0];
1360
+ if (v === 'ON') {
1361
+ await sendDataPointBool(entity, 10, true, 'dataRequest', 1);
1362
+ }
1363
+ else {
1364
+ await sendDataPointEnum(entity, 2, 1, 'dataRequest', 1); // manual
1365
+ }
1366
+ },
1367
+ from: (v) => {
1368
+ return { frost_protection: v === false ? 'OFF' : 'ON' };
1369
+ },
1370
+ },
1371
+ inverse: { to: (v) => !v, from: (v) => !v },
1372
+ onOffNotStrict: { from: (v) => (v ? 'ON' : 'OFF'), to: (v) => v === 'ON' },
1373
+ errorOrBatteryLow: {
1374
+ from: (v) => {
1375
+ if (v === 0)
1376
+ return { battery_low: false };
1377
+ if (v === 1)
1378
+ return { battery_low: true };
1379
+ return { error: v };
1380
+ },
1381
+ },
1382
+ // https://developer.tuya.com/en/docs/connect-subdevices-to-gateways/tuya-zigbee-multiple-switch-access-standard?id=K9ik6zvnqr09m
1383
+ inchingSwitch: {
1384
+ to: (value) => {
1385
+ let result = '';
1386
+ for (let i = 1; i <= 6; i++) {
1387
+ if (value['inching_control_' + i] == undefined || value['inching_time_' + i] == undefined)
1388
+ continue;
1389
+ let state = value['inching_control_' + i] == 'ENABLE' ? 1 : 0;
1390
+ if (i != 1) {
1391
+ // Second endpoint onwards base number is determined by 2 powered by endpoint number less 1
1392
+ state += 2 ** (i - 1);
1393
+ }
1394
+ const secs = parseInt(value['inching_time_' + i]);
1395
+ const byte1 = secs >> 8; // Equivalent to Math.truc(secs / 256)
1396
+ const byte2 = secs % 256;
1397
+ const ascii = String.fromCharCode(state, byte1, byte2);
1398
+ result += Buffer.from(ascii).toString('base64');
1399
+ }
1400
+ return result;
1401
+ },
1402
+ from: (value) => {
1403
+ // break the value into 4 char encoded char which will give 3 char when decoded
1404
+ const data = {};
1405
+ for (let i = 0; i < value.length; i += 4) {
1406
+ const b64asc = value.substring(i, i + 4);
1407
+ const str = Buffer.from(b64asc, 'base64').toString('utf8');
1408
+ const cca0 = str.charCodeAt(0);
1409
+ const cca1 = str.charCodeAt(1);
1410
+ const cca2 = str.charCodeAt(2);
1411
+ let tmp = 0;
1412
+ let status = '';
1413
+ // first value indicates the endpoint and if it is on or off
1414
+ // 0-1 - 1st endpoint, 2-3 - 2nd endpoint, ...
1415
+ switch (cca0) {
1416
+ case 0:
1417
+ data['inching_control_1'] = 'DISABLE';
1418
+ data['inching_time_1'] = (cca1 << 8) + cca2;
1419
+ break;
1420
+ case 1:
1421
+ data['inching_control_1'] = 'ENABLE';
1422
+ data['inching_time_1'] = (cca1 << 8) + cca2;
1423
+ break;
1424
+ default:
1425
+ // endpoint #
1426
+ tmp = Math.trunc(Math.log2(cca0)) + 1;
1427
+ status = cca0 % 2 ? 'ENABLE' : 'DISABLE';
1428
+ data['inching_control_' + tmp] = status;
1429
+ data['inching_time_' + tmp] = (cca1 << 8) + cca2;
1430
+ }
1431
+ }
1432
+ return data;
1433
+ },
1434
+ },
1435
+ };
1436
+ const tuyaTz = {
1437
+ power_on_behavior_1: {
1438
+ key: ['power_on_behavior', 'power_outage_memory'],
1439
+ convertSet: async (entity, key, value, meta) => {
1440
+ // Deprecated: remove power_outage_memory
1441
+ const moesStartUpOnOff = utils.getFromLookup(value, key === 'power_on_behavior' ? { off: 0, on: 1, previous: 2 } : { off: 0, on: 1, restore: 2 });
1442
+ await entity.write('genOnOff', { moesStartUpOnOff });
1443
+ return { state: { [key]: value } };
1444
+ },
1445
+ convertGet: async (entity, key, meta) => {
1446
+ await entity.read('genOnOff', ['moesStartUpOnOff']);
1447
+ },
1448
+ },
1449
+ power_on_behavior_2: {
1450
+ key: ['power_on_behavior'],
1451
+ convertSet: async (entity, key, value, meta) => {
1452
+ const powerOnBehavior = utils.getFromLookup(value, { off: 0, on: 1, previous: 2 });
1453
+ await entity.write('manuSpecificTuya_3', { powerOnBehavior });
1454
+ return { state: { [key]: value } };
1455
+ },
1456
+ convertGet: async (entity, key, meta) => {
1457
+ await entity.read('manuSpecificTuya_3', ['powerOnBehavior']);
1458
+ },
1459
+ },
1460
+ switch_type: {
1461
+ key: ['switch_type'],
1462
+ convertSet: async (entity, key, value, meta) => {
1463
+ const switchType = utils.getFromLookup(value, { toggle: 0, state: 1, momentary: 2 });
1464
+ await entity.write('manuSpecificTuya_3', { switchType }, { disableDefaultResponse: true });
1465
+ return { state: { [key]: value } };
1466
+ },
1467
+ convertGet: async (entity, key, meta) => {
1468
+ await entity.read('manuSpecificTuya_3', ['switchType']);
1469
+ },
1470
+ },
1471
+ backlight_indicator_mode_1: {
1472
+ key: ['backlight_mode', 'indicator_mode'],
1473
+ convertSet: async (entity, key, value, meta) => {
1474
+ const tuyaBacklightMode = utils.getFromLookup(value, key === 'backlight_mode' ? { low: 0, medium: 1, high: 2, off: 0, normal: 1, inverted: 2 } : { off: 0, 'off/on': 1, 'on/off': 2, on: 3 });
1475
+ await entity.write('genOnOff', { tuyaBacklightMode });
1476
+ return { state: { [key]: value } };
1477
+ },
1478
+ convertGet: async (entity, key, meta) => {
1479
+ await entity.read('genOnOff', ['tuyaBacklightMode']);
1480
+ },
1481
+ },
1482
+ backlight_indicator_mode_2: {
1483
+ key: ['backlight_mode'],
1484
+ convertSet: async (entity, key, value, meta) => {
1485
+ const tuyaBacklightSwitch = utils.getFromLookup(value, { off: 0, on: 1 });
1486
+ await entity.write('genOnOff', { tuyaBacklightSwitch });
1487
+ return { state: { [key]: value } };
1488
+ },
1489
+ convertGet: async (entity, key, meta) => {
1490
+ await entity.read('genOnOff', ['tuyaBacklightSwitch']);
1491
+ },
1492
+ },
1493
+ child_lock: {
1494
+ key: ['child_lock'],
1495
+ convertSet: async (entity, key, value, meta) => {
1496
+ const v = utils.getFromLookup(value, { lock: true, unlock: false });
1497
+ await entity.write('genOnOff', { 0x8000: { value: v, type: 0x10 } });
1498
+ },
1499
+ },
1500
+ min_brightness_attribute: {
1501
+ key: ['min_brightness'],
1502
+ convertSet: async (entity, key, value, meta) => {
1503
+ const number = utils.toNumber(value, `min_brightness`);
1504
+ const minValueHex = number.toString(16);
1505
+ const maxValueHex = 'ff';
1506
+ const minMaxValue = parseInt(`${minValueHex}${maxValueHex}`, 16);
1507
+ const payload = { 0xfc00: { value: minMaxValue, type: 0x21 } };
1508
+ await entity.write('genLevelCtrl', payload, { disableDefaultResponse: true });
1509
+ return { state: { min_brightness: number } };
1510
+ },
1511
+ convertGet: async (entity, key, meta) => {
1512
+ await entity.read('genLevelCtrl', [0xfc00]);
1513
+ },
1514
+ },
1515
+ min_brightness_command: {
1516
+ key: ['min_brightness'],
1517
+ convertSet: async (entity, key, value, meta) => {
1518
+ utils.assertNumber(value, key);
1519
+ const payload = { minimum: value };
1520
+ await entity.command('lightingColorCtrl', 'tuyaSetMinimumBrightness', payload);
1521
+ return { state: { min_brightness: value } };
1522
+ },
1523
+ // The response contains the value but as the data type, randomly
1524
+ // causing malformed messages
1525
+ // convertGet: async (entity, key, meta) => {
1526
+ // await entity.read('lightingColorCtrl', [0xf102]);
1527
+ // },
1528
+ },
1529
+ color_power_on_behavior: {
1530
+ key: ['color_power_on_behavior'],
1531
+ convertSet: async (entity, key, value, meta) => {
1532
+ const v = utils.getFromLookup(value, { initial: 0, previous: 1, customized: 2 });
1533
+ await entity.command('lightingColorCtrl', 'tuyaOnStartUp', { mode: v * 256, data: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0] });
1534
+ return { state: { color_power_on_behavior: value } };
1535
+ },
1536
+ },
1537
+ datapoints: {
1538
+ convertSet: async (entity, key, value, meta) => {
1539
+ // A set converter is only called once; therefore we need to loop
1540
+ const state = {};
1541
+ if (Array.isArray(meta.mapped))
1542
+ throw new Error(`Not supported for groups`);
1543
+ const datapoints = meta.mapped.meta?.tuyaDatapoints;
1544
+ if (!datapoints)
1545
+ throw new Error('No datapoints map defined');
1546
+ for (const [attr, value] of Object.entries(meta.message)) {
1547
+ const convertedKey = meta.mapped.meta.multiEndpoint && meta.endpoint_name && !attr.startsWith(`${key}_`) ? `${attr}_${meta.endpoint_name}` : attr;
1548
+ const dpEntry = datapoints.find((d) => d[1] === convertedKey);
1549
+ if (!dpEntry?.[1] || !dpEntry?.[2].to) {
1550
+ throw new Error(`No datapoint defined for '${attr}'`);
1551
+ }
1552
+ if (dpEntry[3] && dpEntry[3].skip && dpEntry[3].skip(meta))
1553
+ continue;
1554
+ const dpId = dpEntry[0];
1555
+ const convertedValue = await dpEntry[2].to(value, meta);
1556
+ const sendCommand = utils.getMetaValue(entity, meta.mapped, 'tuyaSendCommand', undefined, 'dataRequest');
1557
+ if (convertedValue === undefined) {
1558
+ // conversion done inside converter, ignore.
1559
+ }
1560
+ else if (typeof convertedValue === 'boolean') {
1561
+ await sendDataPointBool(entity, dpId, convertedValue, sendCommand, 1);
1562
+ }
1563
+ else if (typeof convertedValue === 'number') {
1564
+ await sendDataPointValue(entity, dpId, convertedValue, sendCommand, 1);
1565
+ }
1566
+ else if (typeof convertedValue === 'string') {
1567
+ await sendDataPointStringBuffer(entity, dpId, convertedValue, sendCommand, 1);
1568
+ }
1569
+ else if (Array.isArray(convertedValue)) {
1570
+ await sendDataPointRaw(entity, dpId, convertedValue, sendCommand, 1);
1571
+ }
1572
+ else if (convertedValue instanceof Enum) {
1573
+ await sendDataPointEnum(entity, dpId, convertedValue.valueOf(), sendCommand, 1);
1574
+ }
1575
+ else if (convertedValue instanceof Bitmap) {
1576
+ await sendDataPointBitmap(entity, dpId, convertedValue.valueOf(), sendCommand, 1);
1577
+ }
1578
+ else {
1579
+ throw new Error(`Don't know how to send type '${typeof convertedValue}'`);
1580
+ }
1581
+ if (dpEntry[3] && dpEntry[3].optimistic === false)
1582
+ continue;
1583
+ state[attr] = value;
1584
+ }
1585
+ return { state };
1586
+ },
1587
+ },
1588
+ do_not_disturb: {
1589
+ key: ['do_not_disturb'],
1590
+ convertSet: async (entity, key, value, meta) => {
1591
+ await entity.command('lightingColorCtrl', 'tuyaDoNotDisturb', { enable: value ? 1 : 0 });
1592
+ return { state: { do_not_disturb: value } };
1593
+ },
1594
+ },
1595
+ on_off_countdown: {
1596
+ // Note: This is the Tuya on-off countdown feature documented for switches and smart plugs
1597
+ // using the Zigbee 'onWithTimedOff' command in a non-standard way.
1598
+ // There is also an alternative on-off countdown implementation mostly for for Tuya Lighting
1599
+ // products that uses private commands and attributes. However, those devices should also
1600
+ // provide datapoints so there is little reason to provide support.
1601
+ key: ['state', 'countdown'],
1602
+ convertSet: async (entity, key, value, meta) => {
1603
+ const state = meta.message.state !== undefined ? (utils.isString(meta.message.state) ? meta.message.state.toLowerCase() : undefined) : undefined;
1604
+ const countdown = meta.message.countdown !== undefined ? meta.message.countdown : undefined;
1605
+ const result = {};
1606
+ if (countdown !== undefined) {
1607
+ // OnTime is a 16bit register and so might very well work up to 0xFFFF seconds but
1608
+ // the Tuya documentation says that the maximum is 43200 (so 12 hours).
1609
+ // @ts-expect-error ignore
1610
+ if (!Number.isInteger(countdown) || countdown < 0 || countdown > 12 * 3600) {
1611
+ throw new Error('countdown must be an integer between 1 and 43200 (12 hours) or 0 to cancel');
1612
+ }
1613
+ }
1614
+ // The order of the commands matters because 'on/off/toggle' cancels 'onWithTimedOff'.
1615
+ if (state !== undefined) {
1616
+ utils.validateValue(state, ['toggle', 'off', 'on']);
1617
+ await entity.command('genOnOff', state, {}, utils.getOptions(meta.mapped, entity));
1618
+ if (state === 'toggle') {
1619
+ const currentState = meta.state[`state${meta.endpoint_name ? `_${meta.endpoint_name}` : ''}`];
1620
+ if (currentState) {
1621
+ result.state = currentState === 'OFF' ? 'ON' : 'OFF';
1622
+ }
1623
+ }
1624
+ else {
1625
+ result.state = state.toUpperCase();
1626
+ }
1627
+ // A side effect of setting the state is to cancel any running coundown.
1628
+ result.countdown = 0;
1629
+ }
1630
+ if (countdown !== undefined) {
1631
+ // offwaittime is probably not used but according to the Tuya documentation, it should
1632
+ // be set to the same value than ontime.
1633
+ const payload = { ctrlbits: 0, ontime: countdown, offwaittime: countdown };
1634
+ await entity.command('genOnOff', 'onWithTimedOff', payload, utils.getOptions(meta.mapped, entity));
1635
+ if (result.state !== undefined) {
1636
+ result.countdown = countdown;
1637
+ }
1638
+ }
1639
+ return { state: result };
1640
+ },
1641
+ convertGet: async (entity, key, meta) => {
1642
+ if (key == 'state') {
1643
+ await entity.read('genOnOff', ['onOff']);
1644
+ }
1645
+ else if (key == 'countdown') {
1646
+ await entity.read('genOnOff', ['onTime']);
1647
+ }
1648
+ },
1649
+ },
1650
+ inchingSwitch: {
1651
+ key: ['inching_control_set'],
1652
+ convertSet: async (entity, key, value, meta) => {
1653
+ const inching = exports.valueConverter.inchingSwitch.to(value);
1654
+ const payload = { payload: inching };
1655
+ const endpoint = meta.device.getEndpoint(1);
1656
+ await endpoint.command('manuSpecificTuya_4', 'setInchingSwitch', payload, utils.getOptions(meta.mapped, endpoint));
1657
+ return { state: { inching_control_set: value } };
1658
+ },
1659
+ },
1660
+ };
1661
+ exports.tz = tuyaTz;
1662
+ const tuyaFz = {
1663
+ brightness: {
1664
+ cluster: 'genLevelCtrl',
1665
+ type: ['attributeReport', 'readResponse'],
1666
+ convert: (model, msg, publish, options, meta) => {
1667
+ if (msg.data['61440'] !== undefined) {
1668
+ const property = utils.postfixWithEndpointName('brightness', msg, model, meta);
1669
+ return { [property]: utils.mapNumberRange(msg.data['61440'], 0, 1000, 0, 255) };
1670
+ }
1671
+ },
1672
+ },
1673
+ gateway_connection_status: {
1674
+ cluster: 'manuSpecificTuya',
1675
+ type: ['commandMcuGatewayConnectionStatus'],
1676
+ convert: async (model, msg, publish, options, meta) => {
1677
+ // "payload" can have the following values:
1678
+ // 0x00: The gateway is not connected to the internet.
1679
+ // 0x01: The gateway is connected to the internet.
1680
+ // 0x02: The request timed out after three seconds.
1681
+ const payload = { payloadSize: 1, payload: 1 };
1682
+ await msg.endpoint.command('manuSpecificTuya', 'mcuGatewayConnectionStatus', payload, {});
1683
+ },
1684
+ },
1685
+ power_on_behavior_1: {
1686
+ cluster: 'genOnOff',
1687
+ type: ['attributeReport', 'readResponse'],
1688
+ convert: (model, msg, publish, options, meta) => {
1689
+ if (msg.data.moesStartUpOnOff !== undefined) {
1690
+ const lookup = { 0: 'off', 1: 'on', 2: 'previous' };
1691
+ const property = utils.postfixWithEndpointName('power_on_behavior', msg, model, meta);
1692
+ return { [property]: lookup[msg.data['moesStartUpOnOff']] };
1693
+ }
1694
+ },
1695
+ },
1696
+ power_on_behavior_2: {
1697
+ cluster: 'manuSpecificTuya_3',
1698
+ type: ['attributeReport', 'readResponse'],
1699
+ convert: (model, msg, publish, options, meta) => {
1700
+ const attribute = 'powerOnBehavior';
1701
+ const lookup = { 0: 'off', 1: 'on', 2: 'previous' };
1702
+ if (msg.data[attribute] !== undefined) {
1703
+ const property = utils.postfixWithEndpointName('power_on_behavior', msg, model, meta);
1704
+ return { [property]: lookup[msg.data[attribute]] };
1705
+ }
1706
+ },
1707
+ },
1708
+ power_outage_memory: {
1709
+ cluster: 'genOnOff',
1710
+ type: ['attributeReport', 'readResponse'],
1711
+ convert: (model, msg, publish, options, meta) => {
1712
+ if (msg.data.moesStartUpOnOff !== undefined) {
1713
+ const lookup = { 0x00: 'off', 0x01: 'on', 0x02: 'restore' };
1714
+ const property = utils.postfixWithEndpointName('power_outage_memory', msg, model, meta);
1715
+ return { [property]: lookup[msg.data['moesStartUpOnOff']] };
1716
+ }
1717
+ },
1718
+ },
1719
+ switch_type: {
1720
+ cluster: 'manuSpecificTuya_3',
1721
+ type: ['attributeReport', 'readResponse'],
1722
+ convert: (model, msg, publish, options, meta) => {
1723
+ if (msg.data.switchType !== undefined) {
1724
+ const lookup = { 0: 'toggle', 1: 'state', 2: 'momentary' };
1725
+ return { switch_type: lookup[msg.data['switchType']] };
1726
+ }
1727
+ },
1728
+ },
1729
+ backlight_mode_low_medium_high: {
1730
+ cluster: 'genOnOff',
1731
+ type: ['attributeReport', 'readResponse'],
1732
+ convert: (model, msg, publish, options, meta) => {
1733
+ if (msg.data.tuyaBacklightMode !== undefined) {
1734
+ const value = msg.data['tuyaBacklightMode'];
1735
+ const backlightLookup = { 0: 'low', 1: 'medium', 2: 'high' };
1736
+ return { backlight_mode: backlightLookup[value] };
1737
+ }
1738
+ },
1739
+ },
1740
+ backlight_mode_off_normal_inverted: {
1741
+ cluster: 'genOnOff',
1742
+ type: ['attributeReport', 'readResponse'],
1743
+ convert: (model, msg, publish, options, meta) => {
1744
+ if (msg.data.tuyaBacklightMode !== undefined) {
1745
+ return { backlight_mode: utils.getFromLookup(msg.data['tuyaBacklightMode'], { 0: 'off', 1: 'normal', 2: 'inverted' }) };
1746
+ }
1747
+ },
1748
+ },
1749
+ backlight_mode_off_on: {
1750
+ cluster: 'genOnOff',
1751
+ type: ['attributeReport', 'readResponse'],
1752
+ convert: (model, msg, publish, options, meta) => {
1753
+ if (msg.data.tuyaBacklightSwitch !== undefined) {
1754
+ return { backlight_mode: utils.getFromLookup(msg.data['tuyaBacklightSwitch'], { 0: 'OFF', 1: 'ON' }) };
1755
+ }
1756
+ },
1757
+ },
1758
+ indicator_mode: {
1759
+ cluster: 'genOnOff',
1760
+ type: ['attributeReport', 'readResponse'],
1761
+ convert: (model, msg, publish, options, meta) => {
1762
+ if (msg.data.tuyaBacklightMode !== undefined) {
1763
+ return { indicator_mode: utils.getFromLookup(msg.data['tuyaBacklightMode'], { 0: 'off', 1: 'off/on', 2: 'on/off', 3: 'on' }) };
1764
+ }
1765
+ },
1766
+ },
1767
+ child_lock: {
1768
+ cluster: 'genOnOff',
1769
+ type: ['attributeReport', 'readResponse'],
1770
+ convert: (model, msg, publish, options, meta) => {
1771
+ if (msg.data['32768'] !== undefined) {
1772
+ const value = msg.data['32768'];
1773
+ return { child_lock: value ? 'LOCK' : 'UNLOCK' };
1774
+ }
1775
+ },
1776
+ },
1777
+ min_brightness_attribute: {
1778
+ cluster: 'genLevelCtrl',
1779
+ type: ['attributeReport', 'readResponse'],
1780
+ convert: (model, msg, publish, options, meta) => {
1781
+ if (msg.data[0xfc00] !== undefined) {
1782
+ const property = utils.postfixWithEndpointName('min_brightness', msg, model, meta);
1783
+ const value = parseInt(msg.data[0xfc00].toString(16).slice(0, 2), 16);
1784
+ return { [property]: value };
1785
+ }
1786
+ },
1787
+ },
1788
+ datapoints: {
1789
+ cluster: 'manuSpecificTuya',
1790
+ type: ['commandDataResponse', 'commandDataReport', 'commandActiveStatusReport', 'commandActiveStatusReportAlt'],
1791
+ convert: (model, msg, publish, options, meta) => {
1792
+ const result = {};
1793
+ if (!model.meta || !model.meta.tuyaDatapoints)
1794
+ throw new Error('No datapoints map defined');
1795
+ const datapoints = model.meta.tuyaDatapoints;
1796
+ for (const dpValue of msg.data.dpValues) {
1797
+ const dpId = dpValue.dp;
1798
+ const dpEntry = datapoints.find((d) => d[0] === dpId);
1799
+ const value = getDataValue(dpValue);
1800
+ if (dpEntry?.[2]?.from) {
1801
+ if (dpEntry[1]) {
1802
+ result[dpEntry[1]] = dpEntry[2].from(value, meta, options, publish, msg);
1803
+ }
1804
+ else {
1805
+ Object.assign(result, dpEntry[2].from(value, meta, options, publish, msg));
1806
+ }
1807
+ }
1808
+ else {
1809
+ logger_1.logger.debug(`Datapoint ${dpId} not defined for '${meta.device.manufacturerName}' with value ${value}`, NS);
1810
+ }
1811
+ }
1812
+ return result;
1813
+ },
1814
+ },
1815
+ on_off_action: {
1816
+ cluster: 'genOnOff',
1817
+ type: 'commandTuyaAction',
1818
+ convert: (model, msg, publish, options, meta) => {
1819
+ if (utils.hasAlreadyProcessedMessage(msg, model, msg.data[0]))
1820
+ return;
1821
+ const clickMapping = { 0: 'single', 1: 'double', 2: 'hold' };
1822
+ const buttonMapping = { 1: '1', 2: '2', 3: '3', 4: '4', 5: '5', 6: '6', 7: '7', 8: '8' };
1823
+ // TS004F has single endpoint, TS0041A/TS0041 can have multiple but have just one button
1824
+ const button = msg.device.endpoints.length == 1 || ['TS0041A', 'TS0041'].includes(msg.device.modelID) ? '' : `${buttonMapping[msg.endpoint.ID]}_`;
1825
+ return { action: `${button}${clickMapping[msg.data.value]}` };
1826
+ },
1827
+ },
1828
+ on_off_countdown: {
1829
+ // While a countdown is in progress, the device will report onTime at all multiples of 60.
1830
+ // More reportings can be configured for 'onTime` but they will happen independently of
1831
+ // the builtin 60s reporting.
1832
+ cluster: 'genOnOff',
1833
+ type: ['attributeReport', 'readResponse'],
1834
+ convert: (model, msg, publish, options, meta) => {
1835
+ if (msg.data.onTime !== undefined) {
1836
+ const payload = {};
1837
+ const property = utils.postfixWithEndpointName('countdown', msg, model, meta);
1838
+ const countdown = msg.data['onTime'];
1839
+ payload[property] = countdown;
1840
+ return payload;
1841
+ }
1842
+ },
1843
+ },
1844
+ inchingSwitch: {
1845
+ cluster: 'manuSpecificTuya_4',
1846
+ type: ['attributeReport', 'readResponse'],
1847
+ convert: (model, msg, publish, options, meta) => {
1848
+ if (msg.data.inching !== undefined) {
1849
+ const payload = {};
1850
+ const value = exports.valueConverter.inchingSwitch.from(msg.data['inching']);
1851
+ payload['inching_control_set'] = value;
1852
+ return payload;
1853
+ }
1854
+ },
1855
+ },
1856
+ };
1857
+ exports.fz = tuyaFz;
1858
+ function getHandlersForDP(name, dp, type, converter, readOnly, skip, endpoint, useGlobalSequence) {
1859
+ const keyName = endpoint ? `${name}_${endpoint}` : name;
1860
+ const fromZigbee = [
1861
+ {
1862
+ cluster: 'manuSpecificTuya',
1863
+ type: ['commandDataResponse', 'commandDataReport', 'commandActiveStatusReport', 'commandActiveStatusReportAlt'],
1864
+ convert: (model, msg, publish, options, meta) => {
1865
+ const dpValue = msg.data.dpValues.find((d) => d.dp === dp);
1866
+ if (dpValue) {
1867
+ return { [keyName]: converter.from(getDataValue(dpValue)) };
1868
+ }
1869
+ },
1870
+ },
1871
+ ];
1872
+ const toZigbee = readOnly
1873
+ ? undefined
1874
+ : [
1875
+ {
1876
+ key: [name],
1877
+ endpoints: endpoint ? [endpoint] : undefined,
1878
+ convertSet: async (entity, key, value, meta) => {
1879
+ // A set converter is only called once; therefore we need to loop
1880
+ const state = {};
1881
+ if (Array.isArray(meta.mapped))
1882
+ throw new Error(`Not supported for groups`);
1883
+ for (const [attr, value] of Object.entries(meta.message)) {
1884
+ const convertedKey = meta.mapped.meta && meta.mapped.meta.multiEndpoint && meta.endpoint_name && !attr.startsWith(`${key}_`)
1885
+ ? `${attr}_${meta.endpoint_name}`
1886
+ : attr;
1887
+ // logger.debug(`key: ${key}, convertedKey: ${convertedKey}, keyName: ${keyName}`);
1888
+ if (convertedKey !== keyName)
1889
+ continue;
1890
+ if (skip && skip(meta))
1891
+ continue;
1892
+ const convertedValue = await converter.to(value, meta);
1893
+ const sendCommand = utils.getMetaValue(entity, meta.mapped, 'tuyaSendCommand', undefined, 'dataRequest');
1894
+ const seq = useGlobalSequence ? undefined : 1;
1895
+ // logger.debug(`dp: ${dp}, value: ${value}, convertedValue: ${convertedValue}`);
1896
+ if (convertedValue === undefined) {
1897
+ // conversion done inside converter, ignore.
1898
+ }
1899
+ else if (type == exports.dataTypes.bool) {
1900
+ await sendDataPointBool(entity, dp, convertedValue, sendCommand, seq);
1901
+ }
1902
+ else if (type == exports.dataTypes.number) {
1903
+ await sendDataPointValue(entity, dp, convertedValue, sendCommand, seq);
1904
+ }
1905
+ else if (type == exports.dataTypes.string) {
1906
+ await sendDataPointStringBuffer(entity, dp, convertedValue, sendCommand, seq);
1907
+ }
1908
+ else if (type == exports.dataTypes.raw) {
1909
+ await sendDataPointRaw(entity, dp, convertedValue, sendCommand, seq);
1910
+ }
1911
+ else if (type == exports.dataTypes.enum) {
1912
+ await sendDataPointEnum(entity, dp, convertedValue, sendCommand, seq);
1913
+ }
1914
+ else if (type == exports.dataTypes.bitmap) {
1915
+ await sendDataPointBitmap(entity, dp, convertedValue, sendCommand, seq);
1916
+ }
1917
+ else {
1918
+ throw new Error(`Don't know how to send type '${typeof convertedValue}'`);
1919
+ }
1920
+ state[key] = value;
1921
+ }
1922
+ return { state };
1923
+ },
1924
+ },
1925
+ ];
1926
+ return [fromZigbee, toZigbee];
1927
+ }
1928
+ const tuyaModernExtend = {
1929
+ tuyaBase(args) {
1930
+ const result = {
1931
+ configure: [exports.configureMagicPacket],
1932
+ onEvent: onEvent(args.onEvent),
1933
+ isModernExtend: true,
1934
+ };
1935
+ if (args?.dp) {
1936
+ result.fromZigbee = [tuyaFz.datapoints];
1937
+ result.toZigbee = [tuyaTz.datapoints];
1938
+ }
1939
+ return result;
1940
+ },
1941
+ dpEnumLookup(args) {
1942
+ const { name, dp, type, lookup, description, readOnly, endpoint, expose, skip } = args;
1943
+ let exp;
1944
+ if (expose) {
1945
+ exp = expose;
1946
+ }
1947
+ else {
1948
+ exp = new exposes.Enum(name, readOnly ? ea.STATE : ea.STATE_SET, Object.keys(lookup)).withDescription(description);
1949
+ }
1950
+ if (endpoint)
1951
+ exp = exp.withEndpoint(endpoint);
1952
+ const handlers = getHandlersForDP(name, dp, type, {
1953
+ from: (value) => utils.getFromLookupByValue(value, lookup),
1954
+ to: (value) => utils.getFromLookup(value, lookup),
1955
+ }, readOnly, skip, endpoint);
1956
+ return { exposes: [exp], fromZigbee: handlers[0], toZigbee: handlers[1], isModernExtend: true };
1957
+ },
1958
+ dpBinary(args) {
1959
+ const { name, dp, type, valueOn, valueOff, description, readOnly, endpoint, expose, skip } = args;
1960
+ let exp;
1961
+ if (expose) {
1962
+ exp = expose;
1963
+ }
1964
+ else {
1965
+ exp = e.binary(name, readOnly ? ea.STATE : ea.STATE_SET, valueOn[0], valueOff[0]).withDescription(description);
1966
+ }
1967
+ if (endpoint)
1968
+ exp = exp.withEndpoint(endpoint);
1969
+ const handlers = getHandlersForDP(name, dp, type, {
1970
+ from: (value) => (value === valueOn[1] ? valueOn[0] : valueOff[0]),
1971
+ to: (value) => (value === valueOn[0] ? valueOn[1] : valueOff[1]),
1972
+ }, readOnly, skip, endpoint);
1973
+ return { exposes: [exp], fromZigbee: handlers[0], toZigbee: handlers[1], isModernExtend: true };
1974
+ },
1975
+ dpNumeric(args) {
1976
+ const { name, dp, type, description, readOnly, endpoint, unit, valueMax, valueMin, valueStep, scale, expose, skip } = args;
1977
+ let exp;
1978
+ if (expose) {
1979
+ exp = expose;
1980
+ }
1981
+ else {
1982
+ exp = e.numeric(name, readOnly ? ea.STATE : ea.STATE_SET).withDescription(description);
1983
+ }
1984
+ if (endpoint)
1985
+ exp = exp.withEndpoint(endpoint);
1986
+ if (unit)
1987
+ exp = exp.withUnit(unit);
1988
+ if (valueMin !== undefined)
1989
+ exp = exp.withValueMin(valueMin);
1990
+ if (valueMax !== undefined)
1991
+ exp = exp.withValueMax(valueMax);
1992
+ if (valueStep !== undefined)
1993
+ exp = exp.withValueStep(valueStep);
1994
+ let converter;
1995
+ if (scale === undefined) {
1996
+ converter = exports.valueConverterBasic.raw();
1997
+ }
1998
+ else {
1999
+ if (Array.isArray(scale)) {
2000
+ converter = exports.valueConverterBasic.scale(scale[0], scale[1], scale[2], scale[3]);
2001
+ }
2002
+ else {
2003
+ converter = exports.valueConverterBasic.divideBy(scale);
2004
+ }
2005
+ }
2006
+ const handlers = getHandlersForDP(name, dp, type, converter, readOnly, skip, endpoint);
2007
+ return { exposes: [exp], fromZigbee: handlers[0], toZigbee: handlers[1], isModernExtend: true };
2008
+ },
2009
+ dpLight(args) {
2010
+ const { state, brightness, min, max, colorTemp, endpoint } = args;
2011
+ let exp = e.light_brightness().setAccess('state', ea.STATE_SET).setAccess('brightness', ea.STATE_SET);
2012
+ let fromZigbee = [];
2013
+ let toZigbee = [];
2014
+ let ext;
2015
+ if (min) {
2016
+ exp = exp.withMinBrightness().setAccess('min_brightness', ea.STATE_SET);
2017
+ }
2018
+ if (max) {
2019
+ exp = exp.withMaxBrightness().setAccess('max_brightness', ea.STATE_SET);
2020
+ }
2021
+ if (colorTemp) {
2022
+ exp = exp.withColorTemp(colorTemp.range).setAccess('color_temp', ea.STATE_SET);
2023
+ }
2024
+ // if (color) {
2025
+ // exp = exp.withColor(['hs']).setAccess('color_hs', ea.STATE_SET);
2026
+ // }
2027
+ if (endpoint)
2028
+ exp = exp.withEndpoint(endpoint);
2029
+ ext = tuyaModernExtend.dpBinary({
2030
+ name: 'state',
2031
+ dp: state.dp,
2032
+ type: state.type,
2033
+ valueOn: state.valueOn,
2034
+ valueOff: state.valueOff,
2035
+ skip: state.skip,
2036
+ endpoint: endpoint,
2037
+ });
2038
+ fromZigbee = [...fromZigbee, ...ext.fromZigbee];
2039
+ toZigbee = [...toZigbee, ...ext.toZigbee];
2040
+ ext = tuyaModernExtend.dpNumeric({ name: 'brightness', dp: brightness.dp, type: brightness.type, scale: brightness.scale, endpoint: endpoint });
2041
+ fromZigbee = [...fromZigbee, ...ext.fromZigbee];
2042
+ toZigbee = [...toZigbee, ...ext.toZigbee];
2043
+ if (min) {
2044
+ ext = tuyaModernExtend.dpNumeric({ name: 'min_brightness', dp: min.dp, type: min.type, scale: min.scale, endpoint: endpoint });
2045
+ fromZigbee = [...fromZigbee, ...ext.fromZigbee];
2046
+ toZigbee = [...toZigbee, ...ext.toZigbee];
2047
+ }
2048
+ if (max) {
2049
+ ext = tuyaModernExtend.dpNumeric({ name: 'max_brightness', dp: max.dp, type: max.type, scale: max.scale, endpoint: endpoint });
2050
+ fromZigbee = [...fromZigbee, ...ext.fromZigbee];
2051
+ toZigbee = [...toZigbee, ...ext.toZigbee];
2052
+ }
2053
+ if (colorTemp) {
2054
+ ext = tuyaModernExtend.dpNumeric({
2055
+ name: 'color_temp',
2056
+ dp: colorTemp.dp,
2057
+ type: colorTemp.type,
2058
+ scale: colorTemp.scale,
2059
+ endpoint: endpoint,
2060
+ });
2061
+ fromZigbee = [...fromZigbee, ...ext.fromZigbee];
2062
+ toZigbee = [...toZigbee, ...ext.toZigbee];
2063
+ }
2064
+ // if (color) {
2065
+ // const handlers = getHandlersForDP('color', color.dp, color.type,
2066
+ // valueConverterBasic.color1000(), undefined, undefined, endpoint);
2067
+ // fromZigbee = [...fromZigbee, ...handlers[0]];
2068
+ // toZigbee = [...toZigbee, ...handlers[1]];
2069
+ // }
2070
+ // combine extends for one expose
2071
+ return { exposes: [exp], fromZigbee, toZigbee, isModernExtend: true };
2072
+ },
2073
+ dpTemperature(args) {
2074
+ return tuyaModernExtend.dpNumeric({ name: 'temperature', type: exports.dataTypes.number, readOnly: true, scale: 10, expose: e.temperature(), ...args });
2075
+ },
2076
+ dpHumidity(args) {
2077
+ return tuyaModernExtend.dpNumeric({ name: 'humidity', type: exports.dataTypes.number, readOnly: true, expose: e.humidity(), ...args });
2078
+ },
2079
+ dpBattery(args) {
2080
+ return tuyaModernExtend.dpNumeric({ name: 'battery', type: exports.dataTypes.number, readOnly: true, expose: e.battery(), ...args });
2081
+ },
2082
+ dpBatteryState(args) {
2083
+ return tuyaModernExtend.dpEnumLookup({
2084
+ name: 'battery_state',
2085
+ type: exports.dataTypes.number,
2086
+ lookup: { low: 0, medium: 1, high: 2 },
2087
+ readOnly: true,
2088
+ expose: tuyaExposes.batteryState(),
2089
+ ...args,
2090
+ });
2091
+ },
2092
+ dpTemperatureUnit(args) {
2093
+ return tuyaModernExtend.dpEnumLookup({
2094
+ name: 'temperature_unit',
2095
+ type: exports.dataTypes.enum,
2096
+ lookup: { celsius: 0, fahrenheit: 1 },
2097
+ readOnly: true,
2098
+ expose: tuyaExposes.temperatureUnit(),
2099
+ ...args,
2100
+ });
2101
+ },
2102
+ dpContact(args, invert) {
2103
+ return tuyaModernExtend.dpBinary({
2104
+ name: 'contact',
2105
+ type: exports.dataTypes.bool,
2106
+ valueOn: invert ? [true, true] : [true, false],
2107
+ valueOff: invert ? [false, false] : [false, true],
2108
+ readOnly: true,
2109
+ expose: e.contact(),
2110
+ ...args,
2111
+ });
2112
+ },
2113
+ dpAction(args) {
2114
+ const { lookup } = args;
2115
+ return tuyaModernExtend.dpEnumLookup({
2116
+ name: 'action',
2117
+ type: exports.dataTypes.number,
2118
+ readOnly: true,
2119
+ expose: e.action(Object.keys(lookup)),
2120
+ ...args,
2121
+ });
2122
+ },
2123
+ dpIlluminance(args) {
2124
+ return tuyaModernExtend.dpNumeric({ name: 'illuminance', type: exports.dataTypes.number, readOnly: true, expose: e.illuminance(), ...args });
2125
+ },
2126
+ dpGas(args, invert) {
2127
+ return tuyaModernExtend.dpBinary({
2128
+ name: 'gas',
2129
+ type: exports.dataTypes.enum,
2130
+ valueOn: invert ? [true, 1] : [true, 0],
2131
+ valueOff: invert ? [false, 0] : [false, 1],
2132
+ readOnly: true,
2133
+ expose: e.gas(),
2134
+ ...args,
2135
+ });
2136
+ },
2137
+ dpOnOff(args) {
2138
+ const { readOnly } = args;
2139
+ return tuyaModernExtend.dpBinary({
2140
+ name: 'state',
2141
+ type: exports.dataTypes.bool,
2142
+ valueOn: ['ON', true],
2143
+ valueOff: ['OFF', false],
2144
+ expose: e.switch().setAccess('state', readOnly ? ea.STATE : ea.STATE_SET),
2145
+ ...args,
2146
+ });
2147
+ },
2148
+ dpPowerOnBehavior(args) {
2149
+ const { readOnly } = args;
2150
+ let { lookup } = args;
2151
+ lookup = lookup || { off: 0, on: 1, previous: 2 };
2152
+ return tuyaModernExtend.dpEnumLookup({
2153
+ name: 'power_on_behavior',
2154
+ lookup: lookup,
2155
+ type: exports.dataTypes.enum,
2156
+ expose: e.power_on_behavior(Object.keys(lookup)).withAccess(readOnly ? ea.STATE : ea.STATE_SET),
2157
+ ...args,
2158
+ });
2159
+ },
2160
+ tuyaLight(args) {
2161
+ args = { minBrightness: 'none', powerOnBehavior: false, switchType: false, ...args };
2162
+ if (args.colorTemp) {
2163
+ args.colorTemp = { startup: false, ...args.colorTemp };
2164
+ }
2165
+ if (args.color) {
2166
+ args.color = { applyRedFix: true, enhancedHue: false, ...(utils.isBoolean(args.color) ? {} : args.color) };
2167
+ }
2168
+ const result = modernExtend.light({ ...args, powerOnBehavior: false });
2169
+ result.fromZigbee.push(tuyaFz.brightness);
2170
+ result.toZigbee.push(tuyaTz.do_not_disturb);
2171
+ result.exposes.push(tuyaExposes.doNotDisturb());
2172
+ if (args.powerOnBehavior) {
2173
+ result.fromZigbee.push(tuyaFz.power_on_behavior_2);
2174
+ result.toZigbee.push(tuyaTz.power_on_behavior_2);
2175
+ if (args.endpointNames) {
2176
+ result.exposes.push(...args.endpointNames.map((ee) => e.power_on_behavior().withEndpoint(ee)));
2177
+ }
2178
+ else {
2179
+ result.exposes.push(e.power_on_behavior());
2180
+ }
2181
+ }
2182
+ if (args.switchType) {
2183
+ result.fromZigbee.push(tuyaFz.switch_type);
2184
+ result.toZigbee.push(tuyaTz.switch_type);
2185
+ result.exposes.push(tuyaExposes.switchType());
2186
+ }
2187
+ if (args.minBrightness === 'attribute') {
2188
+ result.fromZigbee.push(tuyaFz.min_brightness_attribute);
2189
+ result.toZigbee.push(tuyaTz.min_brightness_attribute);
2190
+ result.exposes = result.exposes.map((e) => (typeof e !== 'function' && utils.isLightExpose(e) ? e.withMinBrightness() : e));
2191
+ }
2192
+ else if (args.minBrightness === 'command') {
2193
+ result.toZigbee.push(tuyaTz.min_brightness_command);
2194
+ result.exposes = result.exposes.map((e) => typeof e !== 'function' && utils.isLightExpose(e) ? e.withMinBrightness().setAccess('min_brightness', ea.STATE_SET) : e);
2195
+ }
2196
+ if (args.color) {
2197
+ result.toZigbee.push(tuyaTz.color_power_on_behavior);
2198
+ result.exposes.push(tuyaExposes.colorPowerOnBehavior());
2199
+ }
2200
+ result.configure = [(0, utils_1.configureSetPowerSourceWhenUnknown)('Mains (single phase)')];
2201
+ return result;
2202
+ },
2203
+ tuyaOnOff: (args = {}) => {
2204
+ const exposes = args.endpoints
2205
+ ? args.endpoints.map((ee) => e.switch().withEndpoint(ee))
2206
+ : [e.switch()];
2207
+ const fromZigbee = [fromZigbee_1.default.on_off, fromZigbee_1.default.ignore_basic_report];
2208
+ const toZigbee = [];
2209
+ if (args.onOffCountdown) {
2210
+ fromZigbee.push(tuyaFz.on_off_countdown);
2211
+ toZigbee.push(tuyaTz.on_off_countdown);
2212
+ if (args.endpoints) {
2213
+ exposes.push(...args.endpoints.map((ee) => tuyaExposes.countdown().withAccess(ea.ALL).withEndpoint(ee)));
2214
+ }
2215
+ else {
2216
+ exposes.push(tuyaExposes.countdown().withAccess(ea.ALL));
2217
+ }
2218
+ }
2219
+ else {
2220
+ toZigbee.push(toZigbee_1.default.on_off);
2221
+ }
2222
+ if (args.powerOutageMemory) {
2223
+ // Legacy, powerOnBehavior is preferred
2224
+ fromZigbee.push(tuyaFz.power_outage_memory);
2225
+ toZigbee.push(tuyaTz.power_on_behavior_1);
2226
+ exposes.push(tuyaExposes.powerOutageMemory());
2227
+ }
2228
+ else if (args.powerOnBehavior2) {
2229
+ fromZigbee.push(tuyaFz.power_on_behavior_2);
2230
+ toZigbee.push(tuyaTz.power_on_behavior_2);
2231
+ if (args.endpoints) {
2232
+ exposes.push(...args.endpoints.map((ee) => e.power_on_behavior().withEndpoint(ee)));
2233
+ }
2234
+ else {
2235
+ exposes.push(e.power_on_behavior());
2236
+ }
2237
+ }
2238
+ else {
2239
+ fromZigbee.push(tuyaFz.power_on_behavior_1);
2240
+ toZigbee.push(tuyaTz.power_on_behavior_1);
2241
+ exposes.push(e.power_on_behavior());
2242
+ }
2243
+ if (args.switchType) {
2244
+ fromZigbee.push(tuyaFz.switch_type);
2245
+ toZigbee.push(tuyaTz.switch_type);
2246
+ exposes.push(tuyaExposes.switchType());
2247
+ }
2248
+ if (args.backlightModeOffOn) {
2249
+ fromZigbee.push(tuyaFz.backlight_mode_off_on);
2250
+ exposes.push(tuyaExposes.backlightModeOffOn());
2251
+ toZigbee.push(tuyaTz.backlight_indicator_mode_2);
2252
+ }
2253
+ if (args.backlightModeLowMediumHigh) {
2254
+ fromZigbee.push(tuyaFz.backlight_mode_low_medium_high);
2255
+ exposes.push(tuyaExposes.backlightModeLowMediumHigh());
2256
+ toZigbee.push(tuyaTz.backlight_indicator_mode_1);
2257
+ }
2258
+ if (args.backlightModeOffNormalInverted) {
2259
+ fromZigbee.push(tuyaFz.backlight_mode_off_normal_inverted);
2260
+ exposes.push(tuyaExposes.backlightModeOffNormalInverted());
2261
+ toZigbee.push(tuyaTz.backlight_indicator_mode_1);
2262
+ }
2263
+ if (args.indicatorMode) {
2264
+ fromZigbee.push(tuyaFz.indicator_mode);
2265
+ exposes.push(tuyaExposes.indicatorMode());
2266
+ toZigbee.push(tuyaTz.backlight_indicator_mode_1);
2267
+ }
2268
+ if (args.electricalMeasurements) {
2269
+ fromZigbee.push(args.electricalMeasurementsFzConverter || fromZigbee_1.default.electrical_measurement, fromZigbee_1.default.metering);
2270
+ exposes.push(e.power(), e.current(), e.voltage(), e.energy());
2271
+ }
2272
+ if (args.childLock) {
2273
+ fromZigbee.push(tuyaFz.child_lock);
2274
+ toZigbee.push(tuyaTz.child_lock);
2275
+ exposes.push(e.child_lock());
2276
+ }
2277
+ if (args.switchMode) {
2278
+ if (args.endpoints) {
2279
+ args.endpoints.forEach(function (ep) {
2280
+ const epExtend = tuyaModernExtend.tuyaSwitchMode({
2281
+ description: `Switch mode ${ep}`,
2282
+ endpointName: ep,
2283
+ });
2284
+ fromZigbee.push(...epExtend.fromZigbee);
2285
+ toZigbee.push(...epExtend.toZigbee);
2286
+ exposes.push(...epExtend.exposes);
2287
+ });
2288
+ }
2289
+ else {
2290
+ const extend = tuyaModernExtend.tuyaSwitchMode({ description: 'Switch mode' });
2291
+ fromZigbee.push(...extend.fromZigbee);
2292
+ toZigbee.push(...extend.toZigbee);
2293
+ exposes.push(...extend.exposes);
2294
+ }
2295
+ }
2296
+ if (args.inchingSwitch) {
2297
+ let quantity = 1;
2298
+ if (args.endpoints) {
2299
+ quantity = args.endpoints.length;
2300
+ }
2301
+ fromZigbee.push(tuyaFz.inchingSwitch);
2302
+ exposes.push(tuyaExposes.inchingSwitch(quantity));
2303
+ toZigbee.push(tuyaTz.inchingSwitch);
2304
+ }
2305
+ const configure = [(0, utils_1.configureSetPowerSourceWhenUnknown)('Mains (single phase)')];
2306
+ return { exposes, fromZigbee, toZigbee, isModernExtend: true, configure };
2307
+ },
2308
+ dpBacklightMode(args) {
2309
+ const { readOnly } = args;
2310
+ let { lookup } = args;
2311
+ lookup = lookup || { off: 0, normal: 1, inverted: 2 };
2312
+ return tuyaModernExtend.dpEnumLookup({
2313
+ name: 'backlight_mode',
2314
+ lookup: lookup,
2315
+ type: exports.dataTypes.enum,
2316
+ expose: tuyaExposes.backlightModeOffNormalInverted().withAccess(readOnly ? ea.STATE : ea.STATE_SET),
2317
+ ...args,
2318
+ });
2319
+ },
2320
+ combineActions(actions) {
2321
+ let newValues = [];
2322
+ let newFromZigbee = [];
2323
+ let description;
2324
+ // collect action values and handlers
2325
+ for (const actionME of actions) {
2326
+ const { exposes, fromZigbee } = actionME;
2327
+ newValues = newValues.concat(exposes[0].values);
2328
+ description = exposes[0].description;
2329
+ newFromZigbee = newFromZigbee.concat(fromZigbee);
2330
+ }
2331
+ // create single enum-expose
2332
+ const exp = new exposes.Enum('action', ea.STATE, newValues).withDescription(description);
2333
+ return { exposes: [exp], fromZigbee: newFromZigbee, isModernExtend: true };
2334
+ },
2335
+ tuyaSwitchMode: (args) => modernExtend.enumLookup({
2336
+ name: 'switch_mode',
2337
+ lookup: { switch: 0, scene: 1 },
2338
+ cluster: 'manuSpecificTuya_3',
2339
+ attribute: 'switchMode',
2340
+ description: 'Work mode for switch',
2341
+ entityCategory: 'config',
2342
+ ...args,
2343
+ }),
2344
+ tuyaLedIndicator() {
2345
+ const fromZigbee = [tuyaFz.backlight_mode_off_normal_inverted];
2346
+ const exp = tuyaExposes.backlightModeOffNormalInverted();
2347
+ const toZigbee = [tuyaTz.backlight_indicator_mode_1];
2348
+ return { exposes: [exp], toZigbee, fromZigbee, isModernExtend: true };
2349
+ },
2350
+ tuyaMagicPacket() {
2351
+ return { configure: [exports.configureMagicPacket], isModernExtend: true };
2352
+ },
2353
+ tuyaOnOffAction(args) {
2354
+ return modernExtend.actionEnumLookup({
2355
+ actionLookup: { 0: 'single', 1: 'double', 2: 'hold' },
2356
+ cluster: 'genOnOff',
2357
+ commands: ['commandTuyaAction'],
2358
+ attribute: 'value',
2359
+ });
2360
+ },
2361
+ tuyaOnOffActionLegacy(args) {
2362
+ // For new devices use tuyaOnOffAction instead
2363
+ const actions = args.actions.map((a) => (args.endpointNames ? args.endpointNames.map((e) => `${e}_${a}`) : [a])).flat();
2364
+ const exposes = [e.action(actions)];
2365
+ const fromZigbee = [tuyaFz.on_off_action];
2366
+ return { exposes, fromZigbee, isModernExtend: true };
2367
+ },
2368
+ dpChildLock(args) {
2369
+ return tuyaModernExtend.dpBinary({
2370
+ name: 'child_lock',
2371
+ type: exports.dataTypes.bool,
2372
+ valueOn: ['LOCK', true],
2373
+ valueOff: ['UNLOCK', false],
2374
+ expose: e.child_lock(),
2375
+ ...args,
2376
+ });
2377
+ },
2378
+ };
2379
+ exports.modernExtend = tuyaModernExtend;
2380
+ const tuyaClusters = {
2381
+ addTuyaCommonPrivateCluster: () => modernExtend.deviceAddCustomCluster('manuSpecificTuya_4', {
2382
+ ID: 0xe000,
2383
+ attributes: {
2384
+ random_timing: { ID: 0xd001, type: zigbee_herdsman_1.Zcl.DataType.CHAR_STR },
2385
+ cycle_timing: { ID: 0xd002, type: zigbee_herdsman_1.Zcl.DataType.CHAR_STR },
2386
+ inching: { ID: 0xd003, type: zigbee_herdsman_1.Zcl.DataType.CHAR_STR },
2387
+ },
2388
+ commands: {
2389
+ setRandomTiming: {
2390
+ ID: 0xf7,
2391
+ parameters: [{ name: 'payload', type: zigbee_herdsman_1.Zcl.BuffaloZclDataType.BUFFER }],
2392
+ },
2393
+ setCycleTiming: {
2394
+ ID: 0xf8,
2395
+ parameters: [{ name: 'payload', type: zigbee_herdsman_1.Zcl.BuffaloZclDataType.BUFFER }],
2396
+ },
2397
+ setInchingSwitch: {
2398
+ ID: 0xfb,
2399
+ parameters: [{ name: 'payload', type: zigbee_herdsman_1.Zcl.BuffaloZclDataType.BUFFER }],
2400
+ },
2401
+ },
2402
+ commandsResponse: {},
2403
+ }),
2404
+ };
2405
+ exports.clusters = tuyaClusters;
2406
+ exports.exposes = tuyaExposes;
2407
+ exports.modernExtend = tuyaModernExtend;
2408
+ exports.tz = tuyaTz;
2409
+ exports.fz = tuyaFz;
2410
+ exports.clusters = tuyaClusters;
2411
+ exports.enum = (value) => new Enum(value);
2412
+ exports.bitmap = (value) => new Bitmap(value);
2413
+ exports.valueConverter = exports.valueConverter;
2414
+ exports.valueConverterBasic = exports.valueConverterBasic;
2415
+ exports.sendDataPointBool = sendDataPointBool;
2416
+ exports.sendDataPointEnum = sendDataPointEnum;
2417
+ exports.onEventSetTime = onEventSetTime;
2418
+ exports.onEventSetLocalTime = onEventSetLocalTime;
2419
+ exports.onEventMeasurementPoll = onEventMeasurementPoll;
2420
+ exports.skip = exports.skip;
2421
+ exports.configureMagicPacket = exports.configureMagicPacket;
2422
+ exports.fingerprint = exports.fingerprint;
2423
+ exports.whitelabel = exports.whitelabel;
2424
+ exports.dataTypes = exports.dataTypes;
2425
+ //# sourceMappingURL=tuya.js.map