zigbee-herdsman-converters 22.1.0 → 23.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2581) hide show
  1. package/README.md +23 -6
  2. package/dist/converters/fromZigbee.d.ts +2036 -0
  3. package/dist/converters/fromZigbee.d.ts.map +1 -0
  4. package/dist/converters/fromZigbee.js +5348 -0
  5. package/dist/converters/fromZigbee.js.map +1 -0
  6. package/dist/converters/toZigbee.d.ts +1582 -0
  7. package/dist/converters/toZigbee.d.ts.map +1 -0
  8. package/dist/converters/toZigbee.js +4418 -0
  9. package/dist/converters/toZigbee.js.map +1 -0
  10. package/dist/devices/ITCommander.d.ts +3 -0
  11. package/dist/devices/ITCommander.d.ts.map +1 -0
  12. package/dist/devices/ITCommander.js +76 -0
  13. package/dist/devices/acova.d.ts +3 -0
  14. package/dist/devices/acova.d.ts.map +1 -0
  15. package/dist/devices/acova.js +126 -0
  16. package/dist/devices/acuity_brands_lighting.d.ts +3 -0
  17. package/dist/devices/acuity_brands_lighting.d.ts.map +1 -0
  18. package/dist/devices/acuity_brands_lighting.js +61 -0
  19. package/dist/devices/adeo.d.ts +3 -0
  20. package/dist/devices/adeo.d.ts.map +1 -0
  21. package/dist/devices/adeo.js +485 -0
  22. package/dist/devices/adeo.js.map +1 -0
  23. package/dist/devices/adurosmart.d.ts +3 -0
  24. package/dist/devices/adurosmart.d.ts.map +1 -0
  25. package/dist/devices/adurosmart.js +189 -0
  26. package/dist/devices/aeotec.d.ts +3 -0
  27. package/dist/devices/aeotec.d.ts.map +1 -0
  28. package/dist/devices/aeotec.js +98 -0
  29. package/dist/devices/airam.d.ts +3 -0
  30. package/dist/devices/airam.d.ts.map +1 -0
  31. package/dist/devices/airam.js +105 -0
  32. package/dist/devices/airzone_aidoo.d.ts +3 -0
  33. package/dist/devices/airzone_aidoo.d.ts.map +1 -0
  34. package/dist/devices/airzone_aidoo.js +80 -0
  35. package/dist/devices/ajax_online.d.ts +3 -0
  36. package/dist/devices/ajax_online.d.ts.map +1 -0
  37. package/dist/devices/ajax_online.js +83 -0
  38. package/dist/devices/akuvox.d.ts +3 -0
  39. package/dist/devices/akuvox.d.ts.map +1 -0
  40. package/dist/devices/akuvox.js +68 -0
  41. package/dist/devices/alchemy.d.ts +3 -0
  42. package/dist/devices/alchemy.d.ts.map +1 -0
  43. package/dist/devices/alchemy.js +54 -0
  44. package/dist/devices/aldi.d.ts +3 -0
  45. package/dist/devices/aldi.d.ts.map +1 -0
  46. package/dist/devices/aldi.js +57 -0
  47. package/dist/devices/alecto.d.ts +3 -0
  48. package/dist/devices/alecto.d.ts.map +1 -0
  49. package/dist/devices/alecto.js +95 -0
  50. package/dist/devices/amina.d.ts +3 -0
  51. package/dist/devices/amina.d.ts.map +1 -0
  52. package/dist/devices/amina.js +366 -0
  53. package/dist/devices/amina.js.map +1 -0
  54. package/dist/devices/anchor.d.ts +3 -0
  55. package/dist/devices/anchor.d.ts.map +1 -0
  56. package/dist/devices/anchor.js +47 -0
  57. package/dist/devices/atlantic.d.ts +3 -0
  58. package/dist/devices/atlantic.d.ts.map +1 -0
  59. package/dist/devices/atlantic.js +145 -0
  60. package/dist/devices/atlantic.js.map +1 -0
  61. package/dist/devices/atsmart.d.ts +3 -0
  62. package/dist/devices/atsmart.d.ts.map +1 -0
  63. package/dist/devices/atsmart.js +47 -0
  64. package/dist/devices/aubess.d.ts +3 -0
  65. package/dist/devices/aubess.d.ts.map +1 -0
  66. package/dist/devices/aubess.js +60 -0
  67. package/dist/devices/aurora_lighting.d.ts +3 -0
  68. package/dist/devices/aurora_lighting.d.ts.map +1 -0
  69. package/dist/devices/aurora_lighting.js +332 -0
  70. package/dist/devices/automaton.d.ts +3 -0
  71. package/dist/devices/automaton.d.ts.map +1 -0
  72. package/dist/devices/automaton.js +64 -0
  73. package/dist/devices/avatto.d.ts +3 -0
  74. package/dist/devices/avatto.d.ts.map +1 -0
  75. package/dist/devices/avatto.js +275 -0
  76. package/dist/devices/avatto.js.map +1 -0
  77. package/dist/devices/awox.d.ts +3 -0
  78. package/dist/devices/awox.d.ts.map +1 -0
  79. package/dist/devices/awox.js +239 -0
  80. package/dist/devices/axis.d.ts +3 -0
  81. package/dist/devices/axis.d.ts.map +1 -0
  82. package/dist/devices/axis.js +62 -0
  83. package/dist/devices/bankamp.d.ts +3 -0
  84. package/dist/devices/bankamp.d.ts.map +1 -0
  85. package/dist/devices/bankamp.js +47 -0
  86. package/dist/devices/bega.d.ts +3 -0
  87. package/dist/devices/bega.d.ts.map +1 -0
  88. package/dist/devices/bega.js +61 -0
  89. package/dist/devices/belkin.d.ts +3 -0
  90. package/dist/devices/belkin.d.ts.map +1 -0
  91. package/dist/devices/belkin.js +47 -0
  92. package/dist/devices/bitron.d.ts +3 -0
  93. package/dist/devices/bitron.d.ts.map +1 -0
  94. package/dist/devices/bitron.js +357 -0
  95. package/dist/devices/bitron.js.map +1 -0
  96. package/dist/devices/bituo_technik.d.ts +3 -0
  97. package/dist/devices/bituo_technik.d.ts.map +1 -0
  98. package/dist/devices/bituo_technik.js +120 -0
  99. package/dist/devices/blaupunkt.d.ts +3 -0
  100. package/dist/devices/blaupunkt.d.ts.map +1 -0
  101. package/dist/devices/blaupunkt.js +67 -0
  102. package/dist/devices/blitzwolf.d.ts +3 -0
  103. package/dist/devices/blitzwolf.d.ts.map +1 -0
  104. package/dist/devices/blitzwolf.js +73 -0
  105. package/dist/devices/bosch.d.ts +3 -0
  106. package/dist/devices/bosch.d.ts.map +1 -0
  107. package/dist/devices/bosch.js +2042 -0
  108. package/dist/devices/bosch.js.map +1 -0
  109. package/dist/devices/bouffalo_lab.d.ts +3 -0
  110. package/dist/devices/bouffalo_lab.d.ts.map +1 -0
  111. package/dist/devices/bouffalo_lab.js +47 -0
  112. package/dist/devices/brimate.d.ts +3 -0
  113. package/dist/devices/brimate.d.ts.map +1 -0
  114. package/dist/devices/brimate.js +54 -0
  115. package/dist/devices/bseed.d.ts +3 -0
  116. package/dist/devices/bseed.d.ts.map +1 -0
  117. package/dist/devices/bseed.js +53 -0
  118. package/dist/devices/bticino.d.ts +3 -0
  119. package/dist/devices/bticino.d.ts.map +1 -0
  120. package/dist/devices/bticino.js +112 -0
  121. package/dist/devices/busch_jaeger.d.ts +3 -0
  122. package/dist/devices/busch_jaeger.d.ts.map +1 -0
  123. package/dist/devices/busch_jaeger.js +184 -0
  124. package/dist/devices/busch_jaeger.js.map +1 -0
  125. package/dist/devices/byun.d.ts +3 -0
  126. package/dist/devices/byun.d.ts.map +1 -0
  127. package/dist/devices/byun.js +63 -0
  128. package/dist/devices/calex.d.ts +3 -0
  129. package/dist/devices/calex.d.ts.map +1 -0
  130. package/dist/devices/calex.js +90 -0
  131. package/dist/devices/candeo.d.ts +3 -0
  132. package/dist/devices/candeo.d.ts.map +1 -0
  133. package/dist/devices/candeo.js +224 -0
  134. package/dist/devices/casaia.d.ts +3 -0
  135. package/dist/devices/casaia.d.ts.map +1 -0
  136. package/dist/devices/casaia.js +98 -0
  137. package/dist/devices/cel.d.ts +3 -0
  138. package/dist/devices/cel.d.ts.map +1 -0
  139. package/dist/devices/cel.js +19 -0
  140. package/dist/devices/centralite.d.ts +3 -0
  141. package/dist/devices/centralite.d.ts.map +1 -0
  142. package/dist/devices/centralite.js +452 -0
  143. package/dist/devices/centralite.js.map +1 -0
  144. package/dist/devices/chacon.d.ts +3 -0
  145. package/dist/devices/chacon.d.ts.map +1 -0
  146. package/dist/devices/chacon.js +57 -0
  147. package/dist/devices/cleode.d.ts +3 -0
  148. package/dist/devices/cleode.d.ts.map +1 -0
  149. package/dist/devices/cleode.js +47 -0
  150. package/dist/devices/cleverio.d.ts +3 -0
  151. package/dist/devices/cleverio.d.ts.map +1 -0
  152. package/dist/devices/cleverio.js +77 -0
  153. package/dist/devices/climax.d.ts +3 -0
  154. package/dist/devices/climax.d.ts.map +1 -0
  155. package/dist/devices/climax.js +180 -0
  156. package/dist/devices/commercial_electric.d.ts +3 -0
  157. package/dist/devices/commercial_electric.d.ts.map +1 -0
  158. package/dist/devices/commercial_electric.js +47 -0
  159. package/dist/devices/cree.d.ts +3 -0
  160. package/dist/devices/cree.d.ts.map +1 -0
  161. package/dist/devices/cree.js +47 -0
  162. package/dist/devices/ctm.d.ts +3 -0
  163. package/dist/devices/ctm.d.ts.map +1 -0
  164. package/dist/devices/ctm.js +1361 -0
  165. package/dist/devices/ctm.js.map +1 -0
  166. package/dist/devices/current_products_corp.d.ts +3 -0
  167. package/dist/devices/current_products_corp.d.ts.map +1 -0
  168. package/dist/devices/current_products_corp.js +63 -0
  169. package/dist/devices/custom_devices_diy.d.ts +3 -0
  170. package/dist/devices/custom_devices_diy.d.ts.map +1 -0
  171. package/dist/devices/custom_devices_diy.js +1204 -0
  172. package/dist/devices/custom_devices_diy.js.map +1 -0
  173. package/dist/devices/cy_lighting.d.ts +3 -0
  174. package/dist/devices/cy_lighting.d.ts.map +1 -0
  175. package/dist/devices/cy_lighting.js +47 -0
  176. package/dist/devices/danalock.d.ts +3 -0
  177. package/dist/devices/danalock.d.ts.map +1 -0
  178. package/dist/devices/danalock.js +64 -0
  179. package/dist/devices/danfoss.d.ts +3 -0
  180. package/dist/devices/danfoss.d.ts.map +1 -0
  181. package/dist/devices/danfoss.js +741 -0
  182. package/dist/devices/danfoss.js.map +1 -0
  183. package/dist/devices/databyte.d.ts +3 -0
  184. package/dist/devices/databyte.d.ts.map +1 -0
  185. package/dist/devices/databyte.js +93 -0
  186. package/dist/devices/datek.d.ts +3 -0
  187. package/dist/devices/datek.d.ts.map +1 -0
  188. package/dist/devices/datek.js +307 -0
  189. package/dist/devices/datek.js.map +1 -0
  190. package/dist/devices/dawon_dns.d.ts +3 -0
  191. package/dist/devices/dawon_dns.d.ts.map +1 -0
  192. package/dist/devices/dawon_dns.js +317 -0
  193. package/dist/devices/develco.d.ts +3 -0
  194. package/dist/devices/develco.d.ts.map +1 -0
  195. package/dist/devices/develco.js +1034 -0
  196. package/dist/devices/develco.js.map +1 -0
  197. package/dist/devices/digi.d.ts +3 -0
  198. package/dist/devices/digi.d.ts.map +1 -0
  199. package/dist/devices/digi.js +24 -0
  200. package/dist/devices/direct_signs.d.ts +3 -0
  201. package/dist/devices/direct_signs.d.ts.map +1 -0
  202. package/dist/devices/direct_signs.js +47 -0
  203. package/dist/devices/diyruz.d.ts +3 -0
  204. package/dist/devices/diyruz.d.ts.map +1 -0
  205. package/dist/devices/diyruz.js +400 -0
  206. package/dist/devices/dlink.d.ts +3 -0
  207. package/dist/devices/dlink.d.ts.map +1 -0
  208. package/dist/devices/dlink.js +75 -0
  209. package/dist/devices/dnake.d.ts +3 -0
  210. package/dist/devices/dnake.d.ts.map +1 -0
  211. package/dist/devices/dnake.js +47 -0
  212. package/dist/devices/dowsing_reynolds.d.ts +3 -0
  213. package/dist/devices/dowsing_reynolds.d.ts.map +1 -0
  214. package/dist/devices/dowsing_reynolds.js +47 -0
  215. package/dist/devices/dresden_elektronik.d.ts +3 -0
  216. package/dist/devices/dresden_elektronik.d.ts.map +1 -0
  217. package/dist/devices/dresden_elektronik.js +82 -0
  218. package/dist/devices/easyaccess.d.ts +3 -0
  219. package/dist/devices/easyaccess.d.ts.map +1 -0
  220. package/dist/devices/easyaccess.js +70 -0
  221. package/dist/devices/easyiot.d.ts +3 -0
  222. package/dist/devices/easyiot.d.ts.map +1 -0
  223. package/dist/devices/easyiot.js +357 -0
  224. package/dist/devices/easyiot.js.map +1 -0
  225. package/dist/devices/eatonhalo_led.d.ts +3 -0
  226. package/dist/devices/eatonhalo_led.d.ts.map +1 -0
  227. package/dist/devices/eatonhalo_led.js +47 -0
  228. package/dist/devices/echostar.d.ts +3 -0
  229. package/dist/devices/echostar.d.ts.map +1 -0
  230. package/dist/devices/echostar.js +64 -0
  231. package/dist/devices/ecodim.d.ts +3 -0
  232. package/dist/devices/ecodim.d.ts.map +1 -0
  233. package/dist/devices/ecodim.js +269 -0
  234. package/dist/devices/ecolink.d.ts +3 -0
  235. package/dist/devices/ecolink.d.ts.map +1 -0
  236. package/dist/devices/ecolink.js +60 -0
  237. package/dist/devices/ecosmart.d.ts +3 -0
  238. package/dist/devices/ecosmart.d.ts.map +1 -0
  239. package/dist/devices/ecosmart.js +115 -0
  240. package/dist/devices/ecozy.d.ts +3 -0
  241. package/dist/devices/ecozy.d.ts.map +1 -0
  242. package/dist/devices/ecozy.js +88 -0
  243. package/dist/devices/edp.d.ts +3 -0
  244. package/dist/devices/edp.d.ts.map +1 -0
  245. package/dist/devices/edp.js +73 -0
  246. package/dist/devices/efekta.d.ts +3 -0
  247. package/dist/devices/efekta.d.ts.map +1 -0
  248. package/dist/devices/efekta.js +2632 -0
  249. package/dist/devices/eglo.d.ts +3 -0
  250. package/dist/devices/eglo.d.ts.map +1 -0
  251. package/dist/devices/eglo.js +133 -0
  252. package/dist/devices/elko.d.ts +3 -0
  253. package/dist/devices/elko.d.ts.map +1 -0
  254. package/dist/devices/elko.js +239 -0
  255. package/dist/devices/enbrighten.d.ts +3 -0
  256. package/dist/devices/enbrighten.d.ts.map +1 -0
  257. package/dist/devices/enbrighten.js +156 -0
  258. package/dist/devices/enocean.d.ts +3 -0
  259. package/dist/devices/enocean.d.ts.map +1 -0
  260. package/dist/devices/enocean.js +152 -0
  261. package/dist/devices/envilar.d.ts +3 -0
  262. package/dist/devices/envilar.d.ts.map +1 -0
  263. package/dist/devices/envilar.js +99 -0
  264. package/dist/devices/essentialb.d.ts +3 -0
  265. package/dist/devices/essentialb.d.ts.map +1 -0
  266. package/dist/devices/essentialb.js +136 -0
  267. package/dist/devices/essentials.d.ts +3 -0
  268. package/dist/devices/essentials.d.ts.map +1 -0
  269. package/dist/devices/essentials.js +150 -0
  270. package/dist/devices/eucontrols.d.ts +3 -0
  271. package/dist/devices/eucontrols.d.ts.map +1 -0
  272. package/dist/devices/eucontrols.js +47 -0
  273. package/dist/devices/eurotronic.d.ts +3 -0
  274. package/dist/devices/eurotronic.d.ts.map +1 -0
  275. package/dist/devices/eurotronic.js +205 -0
  276. package/dist/devices/evanell.d.ts +3 -0
  277. package/dist/devices/evanell.d.ts.map +1 -0
  278. package/dist/devices/evanell.js +71 -0
  279. package/dist/devices/evn.d.ts +3 -0
  280. package/dist/devices/evn.d.ts.map +1 -0
  281. package/dist/devices/evn.js +93 -0
  282. package/dist/devices/evology.d.ts +3 -0
  283. package/dist/devices/evology.d.ts.map +1 -0
  284. package/dist/devices/evology.js +63 -0
  285. package/dist/devices/evvr.d.ts +3 -0
  286. package/dist/devices/evvr.d.ts.map +1 -0
  287. package/dist/devices/evvr.js +47 -0
  288. package/dist/devices/ewelink.d.ts +3 -0
  289. package/dist/devices/ewelink.d.ts.map +1 -0
  290. package/dist/devices/ewelink.js +352 -0
  291. package/dist/devices/ewelink.js.map +1 -0
  292. package/dist/devices/ezex.d.ts +3 -0
  293. package/dist/devices/ezex.d.ts.map +1 -0
  294. package/dist/devices/ezex.js +47 -0
  295. package/dist/devices/fantem.d.ts +3 -0
  296. package/dist/devices/fantem.d.ts.map +1 -0
  297. package/dist/devices/fantem.js +116 -0
  298. package/dist/devices/fantem.js.map +1 -0
  299. package/dist/devices/feibit.d.ts +3 -0
  300. package/dist/devices/feibit.d.ts.map +1 -0
  301. package/dist/devices/feibit.js +343 -0
  302. package/dist/devices/feibit.js.map +1 -0
  303. package/dist/devices/fireangel.d.ts +3 -0
  304. package/dist/devices/fireangel.d.ts.map +1 -0
  305. package/dist/devices/fireangel.js +54 -0
  306. package/dist/devices/frankever.d.ts +3 -0
  307. package/dist/devices/frankever.d.ts.map +1 -0
  308. package/dist/devices/frankever.js +67 -0
  309. package/dist/devices/frient.d.ts +3 -0
  310. package/dist/devices/frient.d.ts.map +1 -0
  311. package/dist/devices/frient.js +74 -0
  312. package/dist/devices/futurehome.d.ts +3 -0
  313. package/dist/devices/futurehome.d.ts.map +1 -0
  314. package/dist/devices/futurehome.js +123 -0
  315. package/dist/devices/ge.d.ts +3 -0
  316. package/dist/devices/ge.d.ts.map +1 -0
  317. package/dist/devices/ge.js +133 -0
  318. package/dist/devices/gewiss.d.ts +3 -0
  319. package/dist/devices/gewiss.d.ts.map +1 -0
  320. package/dist/devices/gewiss.js +85 -0
  321. package/dist/devices/gidealed.d.ts +3 -0
  322. package/dist/devices/gidealed.d.ts.map +1 -0
  323. package/dist/devices/gidealed.js +47 -0
  324. package/dist/devices/giderwel.d.ts +3 -0
  325. package/dist/devices/giderwel.d.ts.map +1 -0
  326. package/dist/devices/giderwel.js +47 -0
  327. package/dist/devices/giex.d.ts +3 -0
  328. package/dist/devices/giex.d.ts.map +1 -0
  329. package/dist/devices/giex.js +114 -0
  330. package/dist/devices/girier.d.ts +3 -0
  331. package/dist/devices/girier.d.ts.map +1 -0
  332. package/dist/devices/girier.js +51 -0
  333. package/dist/devices/gledopto.d.ts +3 -0
  334. package/dist/devices/gledopto.d.ts.map +1 -0
  335. package/dist/devices/gledopto.js +1051 -0
  336. package/dist/devices/gledopto.js.map +1 -0
  337. package/dist/devices/gmmts.d.ts +3 -0
  338. package/dist/devices/gmmts.d.ts.map +1 -0
  339. package/dist/devices/gmmts.js +2285 -0
  340. package/dist/devices/gmmts.js.map +1 -0
  341. package/dist/devices/gmy.d.ts +3 -0
  342. package/dist/devices/gmy.d.ts.map +1 -0
  343. package/dist/devices/gmy.js +47 -0
  344. package/dist/devices/gs.d.ts +3 -0
  345. package/dist/devices/gs.d.ts.map +1 -0
  346. package/dist/devices/gs.js +121 -0
  347. package/dist/devices/gumax.d.ts +3 -0
  348. package/dist/devices/gumax.d.ts.map +1 -0
  349. package/dist/devices/gumax.js +47 -0
  350. package/dist/devices/halemeier.d.ts +3 -0
  351. package/dist/devices/halemeier.d.ts.map +1 -0
  352. package/dist/devices/halemeier.js +128 -0
  353. package/dist/devices/hampton_bay.d.ts +3 -0
  354. package/dist/devices/hampton_bay.d.ts.map +1 -0
  355. package/dist/devices/hampton_bay.js +71 -0
  356. package/dist/devices/heatit.d.ts +3 -0
  357. package/dist/devices/heatit.d.ts.map +1 -0
  358. package/dist/devices/heatit.js +47 -0
  359. package/dist/devices/heiman.d.ts +3 -0
  360. package/dist/devices/heiman.d.ts.map +1 -0
  361. package/dist/devices/heiman.js +816 -0
  362. package/dist/devices/heimgard_technologies.d.ts +3 -0
  363. package/dist/devices/heimgard_technologies.d.ts.map +1 -0
  364. package/dist/devices/heimgard_technologies.js +192 -0
  365. package/dist/devices/hej.d.ts +3 -0
  366. package/dist/devices/hej.d.ts.map +1 -0
  367. package/dist/devices/hej.js +105 -0
  368. package/dist/devices/hfh.d.ts +3 -0
  369. package/dist/devices/hfh.d.ts.map +1 -0
  370. package/dist/devices/hfh.js +47 -0
  371. package/dist/devices/hilux.d.ts +3 -0
  372. package/dist/devices/hilux.d.ts.map +1 -0
  373. package/dist/devices/hilux.js +54 -0
  374. package/dist/devices/hive.d.ts +3 -0
  375. package/dist/devices/hive.d.ts.map +1 -0
  376. package/dist/devices/hive.js +765 -0
  377. package/dist/devices/hommyn.d.ts +3 -0
  378. package/dist/devices/hommyn.d.ts.map +1 -0
  379. package/dist/devices/hommyn.js +63 -0
  380. package/dist/devices/honyar.d.ts +3 -0
  381. package/dist/devices/honyar.d.ts.map +1 -0
  382. package/dist/devices/honyar.js +170 -0
  383. package/dist/devices/hornbach.d.ts +3 -0
  384. package/dist/devices/hornbach.d.ts.map +1 -0
  385. package/dist/devices/hornbach.js +138 -0
  386. package/dist/devices/hzc_electric.d.ts +3 -0
  387. package/dist/devices/hzc_electric.d.ts.map +1 -0
  388. package/dist/devices/hzc_electric.js +105 -0
  389. package/dist/devices/icasa.d.ts +3 -0
  390. package/dist/devices/icasa.d.ts.map +1 -0
  391. package/dist/devices/icasa.js +166 -0
  392. package/dist/devices/idinio.d.ts +3 -0
  393. package/dist/devices/idinio.d.ts.map +1 -0
  394. package/dist/devices/idinio.js +47 -0
  395. package/dist/devices/ihorn.d.ts +3 -0
  396. package/dist/devices/ihorn.d.ts.map +1 -0
  397. package/dist/devices/ihorn.js +108 -0
  398. package/dist/devices/ikea.d.ts +3 -0
  399. package/dist/devices/ikea.d.ts.map +1 -0
  400. package/dist/devices/ikea.js +980 -0
  401. package/dist/devices/ilightsin.d.ts +3 -0
  402. package/dist/devices/ilightsin.d.ts.map +1 -0
  403. package/dist/devices/ilightsin.js +47 -0
  404. package/dist/devices/iluminize.d.ts +3 -0
  405. package/dist/devices/iluminize.d.ts.map +1 -0
  406. package/dist/devices/iluminize.js +389 -0
  407. package/dist/devices/ilux.d.ts +3 -0
  408. package/dist/devices/ilux.d.ts.map +1 -0
  409. package/dist/devices/ilux.js +47 -0
  410. package/dist/devices/imhotepcreation.d.ts +3 -0
  411. package/dist/devices/imhotepcreation.d.ts.map +1 -0
  412. package/dist/devices/imhotepcreation.js +242 -0
  413. package/dist/devices/immax.d.ts +3 -0
  414. package/dist/devices/immax.d.ts.map +1 -0
  415. package/dist/devices/immax.js +303 -0
  416. package/dist/devices/imou.d.ts +3 -0
  417. package/dist/devices/imou.d.ts.map +1 -0
  418. package/dist/devices/imou.js +60 -0
  419. package/dist/devices/index.js +649 -0
  420. package/dist/devices/index.js.map +1 -0
  421. package/dist/devices/innr.d.ts +3 -0
  422. package/dist/devices/innr.d.ts.map +1 -0
  423. package/dist/devices/innr.js +868 -0
  424. package/dist/devices/inovelli.d.ts +3 -0
  425. package/dist/devices/inovelli.d.ts.map +1 -0
  426. package/dist/devices/inovelli.js +2002 -0
  427. package/dist/devices/inovelli.js.map +1 -0
  428. package/dist/devices/insta.d.ts +3 -0
  429. package/dist/devices/insta.d.ts.map +1 -0
  430. package/dist/devices/insta.js +185 -0
  431. package/dist/devices/iolloi.d.ts +3 -0
  432. package/dist/devices/iolloi.d.ts.map +1 -0
  433. package/dist/devices/iolloi.js +48 -0
  434. package/dist/devices/iotperfect.d.ts +3 -0
  435. package/dist/devices/iotperfect.d.ts.map +1 -0
  436. package/dist/devices/iotperfect.js +57 -0
  437. package/dist/devices/iris.d.ts +3 -0
  438. package/dist/devices/iris.d.ts.map +1 -0
  439. package/dist/devices/iris.js +210 -0
  440. package/dist/devices/istar.d.ts +3 -0
  441. package/dist/devices/istar.d.ts.map +1 -0
  442. package/dist/devices/istar.js +54 -0
  443. package/dist/devices/jasco.d.ts +3 -0
  444. package/dist/devices/jasco.d.ts.map +1 -0
  445. package/dist/devices/jasco.js +66 -0
  446. package/dist/devices/javis.d.ts +3 -0
  447. package/dist/devices/javis.d.ts.map +1 -0
  448. package/dist/devices/javis.js +80 -0
  449. package/dist/devices/jethome.d.ts +3 -0
  450. package/dist/devices/jethome.d.ts.map +1 -0
  451. package/dist/devices/jethome.js +123 -0
  452. package/dist/devices/jethome.js.map +1 -0
  453. package/dist/devices/jiawen.d.ts +3 -0
  454. package/dist/devices/jiawen.d.ts.map +1 -0
  455. package/dist/devices/jiawen.js +54 -0
  456. package/dist/devices/jumitech.d.ts +3 -0
  457. package/dist/devices/jumitech.d.ts.map +1 -0
  458. package/dist/devices/jumitech.js +47 -0
  459. package/dist/devices/jxuan.d.ts +3 -0
  460. package/dist/devices/jxuan.d.ts.map +1 -0
  461. package/dist/devices/jxuan.js +88 -0
  462. package/dist/devices/kami.d.ts +3 -0
  463. package/dist/devices/kami.d.ts.map +1 -0
  464. package/dist/devices/kami.js +54 -0
  465. package/dist/devices/keen_home.d.ts +3 -0
  466. package/dist/devices/keen_home.d.ts.map +1 -0
  467. package/dist/devices/keen_home.js +159 -0
  468. package/dist/devices/klikaanklikuit.d.ts +3 -0
  469. package/dist/devices/klikaanklikuit.d.ts.map +1 -0
  470. package/dist/devices/klikaanklikuit.js +54 -0
  471. package/dist/devices/kmpcil.d.ts +3 -0
  472. package/dist/devices/kmpcil.d.ts.map +1 -0
  473. package/dist/devices/kmpcil.js +215 -0
  474. package/dist/devices/kmpcil.js.map +1 -0
  475. package/dist/devices/konke.d.ts +3 -0
  476. package/dist/devices/konke.d.ts.map +1 -0
  477. package/dist/devices/konke.js +210 -0
  478. package/dist/devices/ksentry.d.ts +3 -0
  479. package/dist/devices/ksentry.d.ts.map +1 -0
  480. package/dist/devices/ksentry.js +47 -0
  481. package/dist/devices/kurvia.d.ts +3 -0
  482. package/dist/devices/kurvia.d.ts.map +1 -0
  483. package/dist/devices/kurvia.js +52 -0
  484. package/dist/devices/kwikset.d.ts +3 -0
  485. package/dist/devices/kwikset.d.ts.map +1 -0
  486. package/dist/devices/kwikset.js +156 -0
  487. package/dist/devices/lanesto.d.ts +3 -0
  488. package/dist/devices/lanesto.d.ts.map +1 -0
  489. package/dist/devices/lanesto.js +47 -0
  490. package/dist/devices/lds.d.ts +3 -0
  491. package/dist/devices/lds.d.ts.map +1 -0
  492. package/dist/devices/lds.js +47 -0
  493. package/dist/devices/led_trading.d.ts +3 -0
  494. package/dist/devices/led_trading.d.ts.map +1 -0
  495. package/dist/devices/led_trading.js +111 -0
  496. package/dist/devices/led_trading.js.map +1 -0
  497. package/dist/devices/ledvance.d.ts +3 -0
  498. package/dist/devices/ledvance.d.ts.map +1 -0
  499. package/dist/devices/ledvance.js +370 -0
  500. package/dist/devices/leedarson.d.ts +3 -0
  501. package/dist/devices/leedarson.d.ts.map +1 -0
  502. package/dist/devices/leedarson.js +183 -0
  503. package/dist/devices/legrand.d.ts +3 -0
  504. package/dist/devices/legrand.d.ts.map +1 -0
  505. package/dist/devices/legrand.js +737 -0
  506. package/dist/devices/lellki.d.ts +3 -0
  507. package/dist/devices/lellki.d.ts.map +1 -0
  508. package/dist/devices/lellki.js +164 -0
  509. package/dist/devices/letsled.d.ts +3 -0
  510. package/dist/devices/letsled.d.ts.map +1 -0
  511. package/dist/devices/letsled.js +47 -0
  512. package/dist/devices/letv.d.ts +3 -0
  513. package/dist/devices/letv.d.ts.map +1 -0
  514. package/dist/devices/letv.js +89 -0
  515. package/dist/devices/leviton.d.ts +3 -0
  516. package/dist/devices/leviton.d.ts.map +1 -0
  517. package/dist/devices/leviton.js +167 -0
  518. package/dist/devices/leviton.js.map +1 -0
  519. package/dist/devices/lg.d.ts +3 -0
  520. package/dist/devices/lg.d.ts.map +1 -0
  521. package/dist/devices/lg.js +61 -0
  522. package/dist/devices/lidl.d.ts +3 -0
  523. package/dist/devices/lidl.d.ts.map +1 -0
  524. package/dist/devices/lidl.js +673 -0
  525. package/dist/devices/lidl.js.map +1 -0
  526. package/dist/devices/lifecontrol.d.ts +3 -0
  527. package/dist/devices/lifecontrol.d.ts.map +1 -0
  528. package/dist/devices/lifecontrol.js +150 -0
  529. package/dist/devices/lifecontrol.js.map +1 -0
  530. package/dist/devices/lightsolutions.d.ts +3 -0
  531. package/dist/devices/lightsolutions.d.ts.map +1 -0
  532. package/dist/devices/lightsolutions.js +68 -0
  533. package/dist/devices/linkind.d.ts +3 -0
  534. package/dist/devices/linkind.d.ts.map +1 -0
  535. package/dist/devices/linkind.js +274 -0
  536. package/dist/devices/linptech.d.ts +3 -0
  537. package/dist/devices/linptech.d.ts.map +1 -0
  538. package/dist/devices/linptech.js +158 -0
  539. package/dist/devices/linptech.js.map +1 -0
  540. package/dist/devices/livingwise.d.ts +3 -0
  541. package/dist/devices/livingwise.d.ts.map +1 -0
  542. package/dist/devices/livingwise.js +118 -0
  543. package/dist/devices/livolo.d.ts +3 -0
  544. package/dist/devices/livolo.d.ts.map +1 -0
  545. package/dist/devices/livolo.js +421 -0
  546. package/dist/devices/livolo.js.map +1 -0
  547. package/dist/devices/lixee.d.ts +3 -0
  548. package/dist/devices/lixee.d.ts.map +1 -0
  549. package/dist/devices/lixee.js +1922 -0
  550. package/dist/devices/lixee.js.map +1 -0
  551. package/dist/devices/lonsonho.d.ts +3 -0
  552. package/dist/devices/lonsonho.d.ts.map +1 -0
  553. package/dist/devices/lonsonho.js +290 -0
  554. package/dist/devices/ls.d.ts +3 -0
  555. package/dist/devices/ls.d.ts.map +1 -0
  556. package/dist/devices/ls.js +66 -0
  557. package/dist/devices/lubeez.d.ts +3 -0
  558. package/dist/devices/lubeez.d.ts.map +1 -0
  559. package/dist/devices/lubeez.js +47 -0
  560. package/dist/devices/lumi.d.ts +3 -0
  561. package/dist/devices/lumi.d.ts.map +1 -0
  562. package/dist/devices/lumi.js +4433 -0
  563. package/dist/devices/lumi.js.map +1 -0
  564. package/dist/devices/lupus.d.ts +3 -0
  565. package/dist/devices/lupus.d.ts.map +1 -0
  566. package/dist/devices/lupus.js +97 -0
  567. package/dist/devices/lutron.d.ts +3 -0
  568. package/dist/devices/lutron.d.ts.map +1 -0
  569. package/dist/devices/lutron.js +71 -0
  570. package/dist/devices/lux.d.ts +3 -0
  571. package/dist/devices/lux.d.ts.map +1 -0
  572. package/dist/devices/lux.js +90 -0
  573. package/dist/devices/lytko.d.ts +3 -0
  574. package/dist/devices/lytko.d.ts.map +1 -0
  575. package/dist/devices/lytko.js +787 -0
  576. package/dist/devices/lytko.js.map +1 -0
  577. package/dist/devices/m_elec.d.ts +3 -0
  578. package/dist/devices/m_elec.d.ts.map +1 -0
  579. package/dist/devices/m_elec.js +68 -0
  580. package/dist/devices/makegood.d.ts +3 -0
  581. package/dist/devices/makegood.d.ts.map +1 -0
  582. package/dist/devices/makegood.js +65 -0
  583. package/dist/devices/matcall_bv.d.ts +3 -0
  584. package/dist/devices/matcall_bv.d.ts.map +1 -0
  585. package/dist/devices/matcall_bv.js +54 -0
  586. package/dist/devices/mazda.d.ts +3 -0
  587. package/dist/devices/mazda.d.ts.map +1 -0
  588. package/dist/devices/mazda.js +163 -0
  589. package/dist/devices/mazda.js.map +1 -0
  590. package/dist/devices/meazon.d.ts +3 -0
  591. package/dist/devices/meazon.d.ts.map +1 -0
  592. package/dist/devices/meazon.js +98 -0
  593. package/dist/devices/meazon.js.map +1 -0
  594. package/dist/devices/mercator.d.ts +3 -0
  595. package/dist/devices/mercator.d.ts.map +1 -0
  596. package/dist/devices/mercator.js +252 -0
  597. package/dist/devices/miboxer.d.ts +3 -0
  598. package/dist/devices/miboxer.d.ts.map +1 -0
  599. package/dist/devices/miboxer.js +92 -0
  600. package/dist/devices/micromatic.d.ts +3 -0
  601. package/dist/devices/micromatic.d.ts.map +1 -0
  602. package/dist/devices/micromatic.js +47 -0
  603. package/dist/devices/modular.d.ts +3 -0
  604. package/dist/devices/modular.d.ts.map +1 -0
  605. package/dist/devices/modular.js +47 -0
  606. package/dist/devices/moes.d.ts +3 -0
  607. package/dist/devices/moes.d.ts.map +1 -0
  608. package/dist/devices/moes.js +722 -0
  609. package/dist/devices/muller_licht.d.ts +3 -0
  610. package/dist/devices/muller_licht.d.ts.map +1 -0
  611. package/dist/devices/muller_licht.js +337 -0
  612. package/dist/devices/multiterm.d.ts +3 -0
  613. package/dist/devices/multiterm.d.ts.map +1 -0
  614. package/dist/devices/multiterm.js +122 -0
  615. package/dist/devices/multiterm.js.map +1 -0
  616. package/dist/devices/namron.d.ts +3 -0
  617. package/dist/devices/namron.d.ts.map +1 -0
  618. package/dist/devices/namron.js +1576 -0
  619. package/dist/devices/namron.js.map +1 -0
  620. package/dist/devices/nanoleaf.d.ts +3 -0
  621. package/dist/devices/nanoleaf.d.ts.map +1 -0
  622. package/dist/devices/nanoleaf.js +47 -0
  623. package/dist/devices/nedis.d.ts +3 -0
  624. package/dist/devices/nedis.d.ts.map +1 -0
  625. package/dist/devices/nedis.js +87 -0
  626. package/dist/devices/neo.d.ts +3 -0
  627. package/dist/devices/neo.d.ts.map +1 -0
  628. package/dist/devices/neo.js +561 -0
  629. package/dist/devices/neo.js.map +1 -0
  630. package/dist/devices/net2grid.d.ts +3 -0
  631. package/dist/devices/net2grid.d.ts.map +1 -0
  632. package/dist/devices/net2grid.js +67 -0
  633. package/dist/devices/netvox.d.ts +3 -0
  634. package/dist/devices/netvox.d.ts.map +1 -0
  635. package/dist/devices/netvox.js +74 -0
  636. package/dist/devices/nexelec.d.ts +3 -0
  637. package/dist/devices/nexelec.d.ts.map +1 -0
  638. package/dist/devices/nexelec.js +47 -0
  639. package/dist/devices/niko.d.ts +3 -0
  640. package/dist/devices/niko.d.ts.map +1 -0
  641. package/dist/devices/niko.js +626 -0
  642. package/dist/devices/niko.js.map +1 -0
  643. package/dist/devices/ninja_blocks.d.ts +3 -0
  644. package/dist/devices/ninja_blocks.d.ts.map +1 -0
  645. package/dist/devices/ninja_blocks.js +63 -0
  646. package/dist/devices/niviss.d.ts +3 -0
  647. package/dist/devices/niviss.d.ts.map +1 -0
  648. package/dist/devices/niviss.js +47 -0
  649. package/dist/devices/nodon.d.ts +3 -0
  650. package/dist/devices/nodon.d.ts.map +1 -0
  651. package/dist/devices/nodon.js +386 -0
  652. package/dist/devices/nordtronic.d.ts +3 -0
  653. package/dist/devices/nordtronic.d.ts.map +1 -0
  654. package/dist/devices/nordtronic.js +73 -0
  655. package/dist/devices/nous.d.ts +3 -0
  656. package/dist/devices/nous.d.ts.map +1 -0
  657. package/dist/devices/nous.js +168 -0
  658. package/dist/devices/novo.d.ts +3 -0
  659. package/dist/devices/novo.d.ts.map +1 -0
  660. package/dist/devices/novo.js +57 -0
  661. package/dist/devices/nue_3a.d.ts +3 -0
  662. package/dist/devices/nue_3a.d.ts.map +1 -0
  663. package/dist/devices/nue_3a.js +360 -0
  664. package/dist/devices/nue_3a.js.map +1 -0
  665. package/dist/devices/nyce.d.ts +3 -0
  666. package/dist/devices/nyce.d.ts.map +1 -0
  667. package/dist/devices/nyce.js +133 -0
  668. package/dist/devices/onenuo.d.ts +3 -0
  669. package/dist/devices/onenuo.d.ts.map +1 -0
  670. package/dist/devices/onenuo.js +85 -0
  671. package/dist/devices/onesti.d.ts +3 -0
  672. package/dist/devices/onesti.d.ts.map +1 -0
  673. package/dist/devices/onesti.js +207 -0
  674. package/dist/devices/onesti.js.map +1 -0
  675. package/dist/devices/openlumi.d.ts +3 -0
  676. package/dist/devices/openlumi.d.ts.map +1 -0
  677. package/dist/devices/openlumi.js +61 -0
  678. package/dist/devices/orvibo.d.ts +12 -0
  679. package/dist/devices/orvibo.d.ts.map +1 -0
  680. package/dist/devices/orvibo.js +597 -0
  681. package/dist/devices/orvibo.js.map +1 -0
  682. package/dist/devices/osram.d.ts +3 -0
  683. package/dist/devices/osram.d.ts.map +1 -0
  684. package/dist/devices/osram.js +516 -0
  685. package/dist/devices/oujiabao.d.ts +3 -0
  686. package/dist/devices/oujiabao.d.ts.map +1 -0
  687. package/dist/devices/oujiabao.js +54 -0
  688. package/dist/devices/owon.d.ts +3 -0
  689. package/dist/devices/owon.d.ts.map +1 -0
  690. package/dist/devices/owon.js +476 -0
  691. package/dist/devices/owon.js.map +1 -0
  692. package/dist/devices/ozsmartthings.d.ts +3 -0
  693. package/dist/devices/ozsmartthings.d.ts.map +1 -0
  694. package/dist/devices/ozsmartthings.js +47 -0
  695. package/dist/devices/paul_neuhaus.d.ts +3 -0
  696. package/dist/devices/paul_neuhaus.d.ts.map +1 -0
  697. package/dist/devices/paul_neuhaus.js +193 -0
  698. package/dist/devices/paulmann.d.ts +3 -0
  699. package/dist/devices/paulmann.d.ts.map +1 -0
  700. package/dist/devices/paulmann.js +337 -0
  701. package/dist/devices/peq.d.ts +3 -0
  702. package/dist/devices/peq.d.ts.map +1 -0
  703. package/dist/devices/peq.js +63 -0
  704. package/dist/devices/perenio.d.ts +3 -0
  705. package/dist/devices/perenio.d.ts.map +1 -0
  706. package/dist/devices/perenio.js +465 -0
  707. package/dist/devices/perenio.js.map +1 -0
  708. package/dist/devices/philio.d.ts +3 -0
  709. package/dist/devices/philio.d.ts.map +1 -0
  710. package/dist/devices/philio.js +48 -0
  711. package/dist/devices/philips.d.ts +3 -0
  712. package/dist/devices/philips.d.ts.map +1 -0
  713. package/dist/devices/philips.js +4064 -0
  714. package/dist/devices/philips.js.map +1 -0
  715. package/dist/devices/plaid.d.ts +3 -0
  716. package/dist/devices/plaid.d.ts.map +1 -0
  717. package/dist/devices/plaid.js +64 -0
  718. package/dist/devices/plugwise.d.ts +3 -0
  719. package/dist/devices/plugwise.d.ts.map +1 -0
  720. package/dist/devices/plugwise.js +209 -0
  721. package/dist/devices/plugwise.js.map +1 -0
  722. package/dist/devices/profalux.d.ts +3 -0
  723. package/dist/devices/profalux.d.ts.map +1 -0
  724. package/dist/devices/profalux.js +207 -0
  725. package/dist/devices/profalux.js.map +1 -0
  726. package/dist/devices/prolight.d.ts +3 -0
  727. package/dist/devices/prolight.d.ts.map +1 -0
  728. package/dist/devices/prolight.js +114 -0
  729. package/dist/devices/purmo.d.ts +3 -0
  730. package/dist/devices/purmo.d.ts.map +1 -0
  731. package/dist/devices/purmo.js +94 -0
  732. package/dist/devices/pushok.d.ts +3 -0
  733. package/dist/devices/pushok.d.ts.map +1 -0
  734. package/dist/devices/pushok.js +375 -0
  735. package/dist/devices/pushok.js.map +1 -0
  736. package/dist/devices/qa.d.ts +3 -0
  737. package/dist/devices/qa.d.ts.map +1 -0
  738. package/dist/devices/qa.js +294 -0
  739. package/dist/devices/qmotion.d.ts +3 -0
  740. package/dist/devices/qmotion.d.ts.map +1 -0
  741. package/dist/devices/qmotion.js +72 -0
  742. package/dist/devices/qoto.d.ts +3 -0
  743. package/dist/devices/qoto.d.ts.map +1 -0
  744. package/dist/devices/qoto.js +86 -0
  745. package/dist/devices/quotra.d.ts +3 -0
  746. package/dist/devices/quotra.d.ts.map +1 -0
  747. package/dist/devices/quotra.js +54 -0
  748. package/dist/devices/rademacher.d.ts +3 -0
  749. package/dist/devices/rademacher.d.ts.map +1 -0
  750. package/dist/devices/rademacher.js +61 -0
  751. package/dist/devices/radium.d.ts +3 -0
  752. package/dist/devices/radium.d.ts.map +1 -0
  753. package/dist/devices/radium.js +47 -0
  754. package/dist/devices/raex.d.ts +3 -0
  755. package/dist/devices/raex.d.ts.map +1 -0
  756. package/dist/devices/raex.js +47 -0
  757. package/dist/devices/rgb_genie.d.ts +3 -0
  758. package/dist/devices/rgb_genie.d.ts.map +1 -0
  759. package/dist/devices/rgb_genie.js +278 -0
  760. package/dist/devices/robb.d.ts +3 -0
  761. package/dist/devices/robb.d.ts.map +1 -0
  762. package/dist/devices/robb.js +471 -0
  763. package/dist/devices/roome.d.ts +3 -0
  764. package/dist/devices/roome.d.ts.map +1 -0
  765. package/dist/devices/roome.js +54 -0
  766. package/dist/devices/rtx.d.ts +3 -0
  767. package/dist/devices/rtx.d.ts.map +1 -0
  768. package/dist/devices/rtx.js +146 -0
  769. package/dist/devices/salus_controls.d.ts +3 -0
  770. package/dist/devices/salus_controls.d.ts.map +1 -0
  771. package/dist/devices/salus_controls.js +224 -0
  772. package/dist/devices/samotech.d.ts +3 -0
  773. package/dist/devices/samotech.d.ts.map +1 -0
  774. package/dist/devices/samotech.js +107 -0
  775. package/dist/devices/saswell.d.ts +3 -0
  776. package/dist/devices/saswell.d.ts.map +1 -0
  777. package/dist/devices/saswell.js +126 -0
  778. package/dist/devices/sber.d.ts +3 -0
  779. package/dist/devices/sber.d.ts.map +1 -0
  780. package/dist/devices/sber.js +98 -0
  781. package/dist/devices/scanproducts.d.ts +3 -0
  782. package/dist/devices/scanproducts.d.ts.map +1 -0
  783. package/dist/devices/scanproducts.js +54 -0
  784. package/dist/devices/schlage.d.ts +3 -0
  785. package/dist/devices/schlage.d.ts.map +1 -0
  786. package/dist/devices/schlage.js +63 -0
  787. package/dist/devices/schneider_electric.d.ts +3 -0
  788. package/dist/devices/schneider_electric.d.ts.map +1 -0
  789. package/dist/devices/schneider_electric.js +2187 -0
  790. package/dist/devices/schneider_electric.js.map +1 -0
  791. package/dist/devices/schwaiger.d.ts +3 -0
  792. package/dist/devices/schwaiger.d.ts.map +1 -0
  793. package/dist/devices/schwaiger.js +108 -0
  794. package/dist/devices/seastar_intelligence.d.ts +3 -0
  795. package/dist/devices/seastar_intelligence.d.ts.map +1 -0
  796. package/dist/devices/seastar_intelligence.js +52 -0
  797. package/dist/devices/securifi.d.ts +3 -0
  798. package/dist/devices/securifi.d.ts.map +1 -0
  799. package/dist/devices/securifi.js +82 -0
  800. package/dist/devices/sengled.d.ts +6 -0
  801. package/dist/devices/sengled.d.ts.map +1 -0
  802. package/dist/devices/sengled.js +388 -0
  803. package/dist/devices/sengled.js.map +1 -0
  804. package/dist/devices/sercomm.d.ts +3 -0
  805. package/dist/devices/sercomm.d.ts.map +1 -0
  806. package/dist/devices/sercomm.js +189 -0
  807. package/dist/devices/shade_control.d.ts +3 -0
  808. package/dist/devices/shade_control.d.ts.map +1 -0
  809. package/dist/devices/shade_control.js +64 -0
  810. package/dist/devices/shenzhen_homa.d.ts +3 -0
  811. package/dist/devices/shenzhen_homa.d.ts.map +1 -0
  812. package/dist/devices/shenzhen_homa.js +143 -0
  813. package/dist/devices/shinasystem.d.ts +3 -0
  814. package/dist/devices/shinasystem.d.ts.map +1 -0
  815. package/dist/devices/shinasystem.js +960 -0
  816. package/dist/devices/shinasystem.js.map +1 -0
  817. package/dist/devices/shyugj.d.ts +3 -0
  818. package/dist/devices/shyugj.d.ts.map +1 -0
  819. package/dist/devices/shyugj.js +53 -0
  820. package/dist/devices/siglis.d.ts +3 -0
  821. package/dist/devices/siglis.d.ts.map +1 -0
  822. package/dist/devices/siglis.js +452 -0
  823. package/dist/devices/siglis.js.map +1 -0
  824. package/dist/devices/sikom.d.ts +3 -0
  825. package/dist/devices/sikom.d.ts.map +1 -0
  826. package/dist/devices/sikom.js +67 -0
  827. package/dist/devices/simon.d.ts +3 -0
  828. package/dist/devices/simon.d.ts.map +1 -0
  829. package/dist/devices/simon.js +14 -0
  830. package/dist/devices/sinope.d.ts +3 -0
  831. package/dist/devices/sinope.d.ts.map +1 -0
  832. package/dist/devices/sinope.js +1754 -0
  833. package/dist/devices/sinope.js.map +1 -0
  834. package/dist/devices/siterwell.d.ts +3 -0
  835. package/dist/devices/siterwell.d.ts.map +1 -0
  836. package/dist/devices/siterwell.js +110 -0
  837. package/dist/devices/skydance.d.ts +3 -0
  838. package/dist/devices/skydance.d.ts.map +1 -0
  839. package/dist/devices/skydance.js +138 -0
  840. package/dist/devices/slv.d.ts +3 -0
  841. package/dist/devices/slv.d.ts.map +1 -0
  842. package/dist/devices/slv.js +70 -0
  843. package/dist/devices/smart9.d.ts +3 -0
  844. package/dist/devices/smart9.d.ts.map +1 -0
  845. package/dist/devices/smart9.js +66 -0
  846. package/dist/devices/smart_home_pty.d.ts +3 -0
  847. package/dist/devices/smart_home_pty.d.ts.map +1 -0
  848. package/dist/devices/smart_home_pty.js +54 -0
  849. package/dist/devices/smartenit.d.ts +3 -0
  850. package/dist/devices/smartenit.d.ts.map +1 -0
  851. package/dist/devices/smartenit.js +80 -0
  852. package/dist/devices/smartthings.d.ts +3 -0
  853. package/dist/devices/smartthings.d.ts.map +1 -0
  854. package/dist/devices/smartthings.js +526 -0
  855. package/dist/devices/smartthings.js.map +1 -0
  856. package/dist/devices/smartwings.d.ts +3 -0
  857. package/dist/devices/smartwings.d.ts.map +1 -0
  858. package/dist/devices/smartwings.js +63 -0
  859. package/dist/devices/smlight.d.ts +3 -0
  860. package/dist/devices/smlight.d.ts.map +1 -0
  861. package/dist/devices/smlight.js +56 -0
  862. package/dist/devices/sohan_electric.d.ts +3 -0
  863. package/dist/devices/sohan_electric.d.ts.map +1 -0
  864. package/dist/devices/sohan_electric.js +53 -0
  865. package/dist/devices/solaredge.d.ts +3 -0
  866. package/dist/devices/solaredge.d.ts.map +1 -0
  867. package/dist/devices/solaredge.js +47 -0
  868. package/dist/devices/soma.d.ts +3 -0
  869. package/dist/devices/soma.d.ts.map +1 -0
  870. package/dist/devices/soma.js +47 -0
  871. package/dist/devices/somfy.d.ts +3 -0
  872. package/dist/devices/somfy.d.ts.map +1 -0
  873. package/dist/devices/somfy.js +101 -0
  874. package/dist/devices/somgoms.d.ts +3 -0
  875. package/dist/devices/somgoms.d.ts.map +1 -0
  876. package/dist/devices/somgoms.js +84 -0
  877. package/dist/devices/sonoff.d.ts +3 -0
  878. package/dist/devices/sonoff.d.ts.map +1 -0
  879. package/dist/devices/sonoff.js +1612 -0
  880. package/dist/devices/sonoff.js.map +1 -0
  881. package/dist/devices/sowilo.d.ts +3 -0
  882. package/dist/devices/sowilo.d.ts.map +1 -0
  883. package/dist/devices/sowilo.js +47 -0
  884. package/dist/devices/spotmau.d.ts +3 -0
  885. package/dist/devices/spotmau.d.ts.map +1 -0
  886. package/dist/devices/spotmau.js +74 -0
  887. package/dist/devices/stelpro.d.ts +3 -0
  888. package/dist/devices/stelpro.d.ts.map +1 -0
  889. package/dist/devices/stelpro.js +365 -0
  890. package/dist/devices/stelpro.js.map +1 -0
  891. package/dist/devices/sunricher.d.ts +3 -0
  892. package/dist/devices/sunricher.d.ts.map +1 -0
  893. package/dist/devices/sunricher.js +2282 -0
  894. package/dist/devices/sunricher.js.map +1 -0
  895. package/dist/devices/swann.d.ts +3 -0
  896. package/dist/devices/swann.d.ts.map +1 -0
  897. package/dist/devices/swann.js +72 -0
  898. package/dist/devices/sylvania.d.ts +3 -0
  899. package/dist/devices/sylvania.d.ts.map +1 -0
  900. package/dist/devices/sylvania.js +226 -0
  901. package/dist/devices/tapestry.d.ts +3 -0
  902. package/dist/devices/tapestry.d.ts.map +1 -0
  903. package/dist/devices/tapestry.js +55 -0
  904. package/dist/devices/tci.d.ts +3 -0
  905. package/dist/devices/tci.d.ts.map +1 -0
  906. package/dist/devices/tci.js +61 -0
  907. package/dist/devices/tech.d.ts +3 -0
  908. package/dist/devices/tech.d.ts.map +1 -0
  909. package/dist/devices/tech.js +225 -0
  910. package/dist/devices/tech.js.map +1 -0
  911. package/dist/devices/technicolor.d.ts +3 -0
  912. package/dist/devices/technicolor.d.ts.map +1 -0
  913. package/dist/devices/technicolor.js +101 -0
  914. package/dist/devices/terncy.d.ts +3 -0
  915. package/dist/devices/terncy.d.ts.map +1 -0
  916. package/dist/devices/terncy.js +116 -0
  917. package/dist/devices/the_light_group.d.ts +3 -0
  918. package/dist/devices/the_light_group.d.ts.map +1 -0
  919. package/dist/devices/the_light_group.js +129 -0
  920. package/dist/devices/third_reality.d.ts +3 -0
  921. package/dist/devices/third_reality.d.ts.map +1 -0
  922. package/dist/devices/third_reality.js +609 -0
  923. package/dist/devices/third_reality.js.map +1 -0
  924. package/dist/devices/titan_products.d.ts +3 -0
  925. package/dist/devices/titan_products.d.ts.map +1 -0
  926. package/dist/devices/titan_products.js +61 -0
  927. package/dist/devices/tlwglobal.d.ts +3 -0
  928. package/dist/devices/tlwglobal.d.ts.map +1 -0
  929. package/dist/devices/tlwglobal.js +64 -0
  930. package/dist/devices/tplink.d.ts +3 -0
  931. package/dist/devices/tplink.d.ts.map +1 -0
  932. package/dist/devices/tplink.js +80 -0
  933. package/dist/devices/trust.d.ts +3 -0
  934. package/dist/devices/trust.d.ts.map +1 -0
  935. package/dist/devices/trust.js +182 -0
  936. package/dist/devices/tubeszb.d.ts +3 -0
  937. package/dist/devices/tubeszb.d.ts.map +1 -0
  938. package/dist/devices/tubeszb.js +59 -0
  939. package/dist/devices/tuya.d.ts +3 -0
  940. package/dist/devices/tuya.d.ts.map +1 -0
  941. package/dist/devices/tuya.js +16004 -0
  942. package/dist/devices/tuya.js.map +1 -0
  943. package/dist/devices/ubisys.d.ts +3 -0
  944. package/dist/devices/ubisys.d.ts.map +1 -0
  945. package/dist/devices/ubisys.js +1310 -0
  946. package/dist/devices/ubisys.js.map +1 -0
  947. package/dist/devices/uhome.d.ts +3 -0
  948. package/dist/devices/uhome.d.ts.map +1 -0
  949. package/dist/devices/uhome.js +63 -0
  950. package/dist/devices/universal_electronics_inc.d.ts +3 -0
  951. package/dist/devices/universal_electronics_inc.d.ts.map +1 -0
  952. package/dist/devices/universal_electronics_inc.js +185 -0
  953. package/dist/devices/vbled.d.ts +3 -0
  954. package/dist/devices/vbled.d.ts.map +1 -0
  955. package/dist/devices/vbled.js +47 -0
  956. package/dist/devices/vesternet.d.ts +3 -0
  957. package/dist/devices/vesternet.d.ts.map +1 -0
  958. package/dist/devices/vesternet.js +329 -0
  959. package/dist/devices/vesternet.js.map +1 -0
  960. package/dist/devices/viessmann.d.ts +3 -0
  961. package/dist/devices/viessmann.d.ts.map +1 -0
  962. package/dist/devices/viessmann.js +123 -0
  963. package/dist/devices/villeroy_boch.d.ts +3 -0
  964. package/dist/devices/villeroy_boch.d.ts.map +1 -0
  965. package/dist/devices/villeroy_boch.js +54 -0
  966. package/dist/devices/vimar.d.ts +3 -0
  967. package/dist/devices/vimar.d.ts.map +1 -0
  968. package/dist/devices/vimar.js +136 -0
  969. package/dist/devices/visonic.d.ts +3 -0
  970. package/dist/devices/visonic.d.ts.map +1 -0
  971. package/dist/devices/visonic.js +137 -0
  972. package/dist/devices/vrey.d.ts +3 -0
  973. package/dist/devices/vrey.d.ts.map +1 -0
  974. package/dist/devices/vrey.js +48 -0
  975. package/dist/devices/wally.d.ts +3 -0
  976. package/dist/devices/wally.d.ts.map +1 -0
  977. package/dist/devices/wally.js +63 -0
  978. package/dist/devices/waxman.d.ts +3 -0
  979. package/dist/devices/waxman.d.ts.map +1 -0
  980. package/dist/devices/waxman.js +84 -0
  981. package/dist/devices/weiser.d.ts +3 -0
  982. package/dist/devices/weiser.d.ts.map +1 -0
  983. package/dist/devices/weiser.js +102 -0
  984. package/dist/devices/weiser.js.map +1 -0
  985. package/dist/devices/weten.d.ts +3 -0
  986. package/dist/devices/weten.d.ts.map +1 -0
  987. package/dist/devices/weten.js +88 -0
  988. package/dist/devices/wirenboard.d.ts +3 -0
  989. package/dist/devices/wirenboard.d.ts.map +1 -0
  990. package/dist/devices/wirenboard.js +666 -0
  991. package/dist/devices/wirenboard.js.map +1 -0
  992. package/dist/devices/wisdom.d.ts +3 -0
  993. package/dist/devices/wisdom.d.ts.map +1 -0
  994. package/dist/devices/wisdom.js +47 -0
  995. package/dist/devices/woolley.d.ts +3 -0
  996. package/dist/devices/woolley.d.ts.map +1 -0
  997. package/dist/devices/woolley.js +87 -0
  998. package/dist/devices/woox.d.ts +3 -0
  999. package/dist/devices/woox.d.ts.map +1 -0
  1000. package/dist/devices/woox.js +132 -0
  1001. package/dist/devices/wyze.d.ts +3 -0
  1002. package/dist/devices/wyze.d.ts.map +1 -0
  1003. package/dist/devices/wyze.js +62 -0
  1004. package/dist/devices/xal.d.ts +3 -0
  1005. package/dist/devices/xal.d.ts.map +1 -0
  1006. package/dist/devices/xal.js +61 -0
  1007. package/dist/devices/xinghuoyuan.d.ts +3 -0
  1008. package/dist/devices/xinghuoyuan.d.ts.map +1 -0
  1009. package/dist/devices/xinghuoyuan.js +47 -0
  1010. package/dist/devices/xyzroe.d.ts +3 -0
  1011. package/dist/devices/xyzroe.d.ts.map +1 -0
  1012. package/dist/devices/xyzroe.js +516 -0
  1013. package/dist/devices/xyzroe.js.map +1 -0
  1014. package/dist/devices/yale.d.ts +3 -0
  1015. package/dist/devices/yale.d.ts.map +1 -0
  1016. package/dist/devices/yale.js +502 -0
  1017. package/dist/devices/yale.js.map +1 -0
  1018. package/dist/devices/yandex.d.ts +3 -0
  1019. package/dist/devices/yandex.d.ts.map +1 -0
  1020. package/dist/devices/yandex.js +444 -0
  1021. package/dist/devices/yandex.js.map +1 -0
  1022. package/dist/devices/ynoa.d.ts +3 -0
  1023. package/dist/devices/ynoa.d.ts.map +1 -0
  1024. package/dist/devices/ynoa.js +112 -0
  1025. package/dist/devices/yokis.d.ts +3 -0
  1026. package/dist/devices/yokis.d.ts.map +1 -0
  1027. package/dist/devices/yokis.js +2535 -0
  1028. package/dist/devices/yokis.js.map +1 -0
  1029. package/dist/devices/yookee.d.ts +3 -0
  1030. package/dist/devices/yookee.d.ts.map +1 -0
  1031. package/dist/devices/yookee.js +62 -0
  1032. package/dist/devices/ysrsai.d.ts +3 -0
  1033. package/dist/devices/ysrsai.d.ts.map +1 -0
  1034. package/dist/devices/ysrsai.js +65 -0
  1035. package/dist/devices/zemismart.d.ts +3 -0
  1036. package/dist/devices/zemismart.d.ts.map +1 -0
  1037. package/dist/devices/zemismart.js +391 -0
  1038. package/dist/devices/zen.d.ts +3 -0
  1039. package/dist/devices/zen.d.ts.map +1 -0
  1040. package/dist/devices/zen.js +95 -0
  1041. package/dist/devices/zigbeetlc.js +235 -0
  1042. package/dist/devices/zipato.d.ts +3 -0
  1043. package/dist/devices/zipato.d.ts.map +1 -0
  1044. package/dist/devices/zipato.js +47 -0
  1045. package/dist/index.d.ts +20 -0
  1046. package/dist/index.d.ts.map +1 -0
  1047. package/dist/index.js +513 -0
  1048. package/dist/index.js.map +1 -0
  1049. package/dist/indexer.d.ts +5 -0
  1050. package/dist/indexer.d.ts.map +1 -0
  1051. package/dist/indexer.js +135 -0
  1052. package/dist/indexer.js.map +1 -0
  1053. package/dist/lib/color.d.ts +271 -0
  1054. package/dist/lib/color.d.ts.map +1 -0
  1055. package/dist/lib/color.js +754 -0
  1056. package/dist/lib/color.js.map +1 -0
  1057. package/dist/lib/configureKey.d.ts +3 -0
  1058. package/dist/lib/configureKey.d.ts.map +1 -0
  1059. package/dist/lib/configureKey.js +938 -0
  1060. package/dist/lib/configureKey.js.map +1 -0
  1061. package/dist/lib/constants.d.ts +68 -0
  1062. package/dist/lib/constants.d.ts.map +1 -0
  1063. package/dist/lib/constants.js +264 -0
  1064. package/dist/lib/constants.js.map +1 -0
  1065. package/dist/lib/develco.d.ts +15 -0
  1066. package/dist/lib/develco.d.ts.map +1 -0
  1067. package/dist/lib/develco.js +183 -0
  1068. package/dist/lib/develco.js.map +1 -0
  1069. package/dist/lib/ewelink.d.ts +30 -0
  1070. package/dist/lib/ewelink.d.ts.map +1 -0
  1071. package/dist/lib/ewelink.js +716 -0
  1072. package/dist/lib/ewelink.js.map +1 -0
  1073. package/dist/lib/exposes.d.ts +360 -0
  1074. package/dist/lib/exposes.d.ts.map +1 -0
  1075. package/dist/lib/exposes.js +1085 -0
  1076. package/dist/lib/exposes.js.map +1 -0
  1077. package/dist/lib/generateDefinition.d.ts +6 -0
  1078. package/dist/lib/generateDefinition.d.ts.map +1 -0
  1079. package/dist/lib/generateDefinition.js +345 -0
  1080. package/dist/lib/generateDefinition.js.map +1 -0
  1081. package/dist/lib/ikea.d.ts +39 -0
  1082. package/dist/lib/ikea.d.ts.map +1 -0
  1083. package/dist/lib/ikea.js +785 -0
  1084. package/dist/lib/ikea.js.map +1 -0
  1085. package/dist/lib/kelvinToXy.js +1913 -0
  1086. package/dist/lib/kelvinToXy.js.map +1 -0
  1087. package/dist/lib/ledvance.d.ts +20 -0
  1088. package/dist/lib/ledvance.d.ts.map +1 -0
  1089. package/dist/lib/ledvance.js +103 -0
  1090. package/dist/lib/ledvance.js.map +1 -0
  1091. package/dist/lib/legacy.d.ts +5054 -0
  1092. package/dist/lib/legacy.d.ts.map +1 -0
  1093. package/dist/lib/legacy.js +6456 -0
  1094. package/dist/lib/legacy.js.map +1 -0
  1095. package/dist/lib/legrand.d.ts +69 -0
  1096. package/dist/lib/legrand.d.ts.map +1 -0
  1097. package/dist/lib/legrand.js +282 -0
  1098. package/dist/lib/legrand.js.map +1 -0
  1099. package/dist/lib/light.d.ts +8 -0
  1100. package/dist/lib/light.d.ts.map +1 -0
  1101. package/dist/lib/light.js +142 -0
  1102. package/dist/lib/light.js.map +1 -0
  1103. package/dist/lib/logger.d.ts +4 -0
  1104. package/dist/lib/logger.d.ts.map +1 -0
  1105. package/dist/lib/logger.js +14 -0
  1106. package/dist/lib/lumi.d.ts +962 -0
  1107. package/dist/lib/lumi.d.ts.map +1 -0
  1108. package/dist/lib/lumi.js +5020 -0
  1109. package/dist/lib/lumi.js.map +1 -0
  1110. package/dist/lib/modernExtend.d.ts +337 -0
  1111. package/dist/lib/modernExtend.d.ts.map +1 -0
  1112. package/dist/lib/modernExtend.js +2091 -0
  1113. package/dist/lib/modernExtend.js.map +1 -0
  1114. package/dist/lib/namron.d.ts +56 -0
  1115. package/dist/lib/namron.d.ts.map +1 -0
  1116. package/dist/lib/namron.js +434 -0
  1117. package/dist/lib/namron.js.map +1 -0
  1118. package/dist/lib/nodon.d.ts +3 -0
  1119. package/dist/lib/nodon.d.ts.map +1 -0
  1120. package/dist/lib/nodon.js +130 -0
  1121. package/dist/lib/nodon.js.map +1 -0
  1122. package/dist/lib/ota.d.ts +71 -0
  1123. package/dist/lib/ota.d.ts.map +1 -0
  1124. package/dist/lib/ota.js +661 -0
  1125. package/dist/lib/ota.js.map +1 -0
  1126. package/dist/lib/philips.d.ts +252 -0
  1127. package/dist/lib/philips.d.ts.map +1 -0
  1128. package/dist/lib/philips.js +687 -0
  1129. package/dist/lib/philips.js.map +1 -0
  1130. package/dist/lib/reporting.d.ts +58 -0
  1131. package/dist/lib/reporting.d.ts.map +1 -0
  1132. package/dist/lib/reporting.js +285 -0
  1133. package/dist/lib/store.d.ts +7 -0
  1134. package/dist/lib/store.d.ts.map +1 -0
  1135. package/dist/lib/store.js +49 -0
  1136. package/dist/lib/store.js.map +1 -0
  1137. package/dist/lib/sunricher.d.ts +13 -0
  1138. package/dist/lib/sunricher.d.ts.map +1 -0
  1139. package/dist/lib/sunricher.js +14 -0
  1140. package/dist/lib/tuya.d.ts +784 -0
  1141. package/dist/lib/tuya.d.ts.map +1 -0
  1142. package/dist/lib/tuya.js +2397 -0
  1143. package/dist/lib/tuya.js.map +1 -0
  1144. package/dist/lib/types.d.ts +440 -0
  1145. package/dist/lib/types.d.ts.map +1 -0
  1146. package/dist/lib/ubisys.d.ts +19 -0
  1147. package/dist/lib/ubisys.d.ts.map +1 -0
  1148. package/dist/lib/ubisys.js +293 -0
  1149. package/dist/lib/ubisys.js.map +1 -0
  1150. package/dist/lib/utils.d.ts +93 -0
  1151. package/dist/lib/utils.d.ts.map +1 -0
  1152. package/dist/lib/utils.js +726 -0
  1153. package/dist/lib/utils.js.map +1 -0
  1154. package/dist/lib/zosung.d.ts +52 -0
  1155. package/dist/lib/zosung.d.ts.map +1 -0
  1156. package/dist/lib/zosung.js +253 -0
  1157. package/dist/lib/zosung.js.map +1 -0
  1158. package/dist/models-index.json +1 -0
  1159. package/package.json +21 -30
  1160. package/CHANGELOG.md +0 -7334
  1161. package/converters/fromZigbee.d.ts +0 -2031
  1162. package/converters/fromZigbee.d.ts.map +0 -1
  1163. package/converters/fromZigbee.js +0 -5324
  1164. package/converters/fromZigbee.js.map +0 -1
  1165. package/converters/toZigbee.d.ts +0 -1574
  1166. package/converters/toZigbee.d.ts.map +0 -1
  1167. package/converters/toZigbee.js +0 -4433
  1168. package/converters/toZigbee.js.map +0 -1
  1169. package/devices/ITCommander.d.ts +0 -3
  1170. package/devices/ITCommander.d.ts.map +0 -1
  1171. package/devices/ITCommander.js +0 -76
  1172. package/devices/acova.d.ts +0 -3
  1173. package/devices/acova.d.ts.map +0 -1
  1174. package/devices/acova.js +0 -126
  1175. package/devices/acuity_brands_lighting.d.ts +0 -3
  1176. package/devices/acuity_brands_lighting.d.ts.map +0 -1
  1177. package/devices/acuity_brands_lighting.js +0 -61
  1178. package/devices/adeo.d.ts +0 -3
  1179. package/devices/adeo.d.ts.map +0 -1
  1180. package/devices/adeo.js +0 -485
  1181. package/devices/adeo.js.map +0 -1
  1182. package/devices/adurosmart.d.ts +0 -3
  1183. package/devices/adurosmart.d.ts.map +0 -1
  1184. package/devices/adurosmart.js +0 -189
  1185. package/devices/aeotec.d.ts +0 -3
  1186. package/devices/aeotec.d.ts.map +0 -1
  1187. package/devices/aeotec.js +0 -98
  1188. package/devices/airam.d.ts +0 -3
  1189. package/devices/airam.d.ts.map +0 -1
  1190. package/devices/airam.js +0 -105
  1191. package/devices/airzone_aidoo.d.ts +0 -3
  1192. package/devices/airzone_aidoo.d.ts.map +0 -1
  1193. package/devices/airzone_aidoo.js +0 -80
  1194. package/devices/ajax_online.d.ts +0 -3
  1195. package/devices/ajax_online.d.ts.map +0 -1
  1196. package/devices/ajax_online.js +0 -83
  1197. package/devices/akuvox.d.ts +0 -3
  1198. package/devices/akuvox.d.ts.map +0 -1
  1199. package/devices/akuvox.js +0 -68
  1200. package/devices/alchemy.d.ts +0 -3
  1201. package/devices/alchemy.d.ts.map +0 -1
  1202. package/devices/alchemy.js +0 -54
  1203. package/devices/aldi.d.ts +0 -3
  1204. package/devices/aldi.d.ts.map +0 -1
  1205. package/devices/aldi.js +0 -57
  1206. package/devices/alecto.d.ts +0 -3
  1207. package/devices/alecto.d.ts.map +0 -1
  1208. package/devices/alecto.js +0 -95
  1209. package/devices/amina.d.ts +0 -3
  1210. package/devices/amina.d.ts.map +0 -1
  1211. package/devices/amina.js +0 -369
  1212. package/devices/amina.js.map +0 -1
  1213. package/devices/anchor.d.ts +0 -3
  1214. package/devices/anchor.d.ts.map +0 -1
  1215. package/devices/anchor.js +0 -47
  1216. package/devices/atlantic.d.ts +0 -3
  1217. package/devices/atlantic.d.ts.map +0 -1
  1218. package/devices/atlantic.js +0 -145
  1219. package/devices/atlantic.js.map +0 -1
  1220. package/devices/atsmart.d.ts +0 -3
  1221. package/devices/atsmart.d.ts.map +0 -1
  1222. package/devices/atsmart.js +0 -47
  1223. package/devices/aubess.d.ts +0 -3
  1224. package/devices/aubess.d.ts.map +0 -1
  1225. package/devices/aubess.js +0 -60
  1226. package/devices/aurora_lighting.d.ts +0 -3
  1227. package/devices/aurora_lighting.d.ts.map +0 -1
  1228. package/devices/aurora_lighting.js +0 -332
  1229. package/devices/automaton.d.ts +0 -3
  1230. package/devices/automaton.d.ts.map +0 -1
  1231. package/devices/automaton.js +0 -64
  1232. package/devices/avatto.d.ts +0 -3
  1233. package/devices/avatto.d.ts.map +0 -1
  1234. package/devices/avatto.js +0 -273
  1235. package/devices/avatto.js.map +0 -1
  1236. package/devices/awox.d.ts +0 -3
  1237. package/devices/awox.d.ts.map +0 -1
  1238. package/devices/awox.js +0 -239
  1239. package/devices/axis.d.ts +0 -3
  1240. package/devices/axis.d.ts.map +0 -1
  1241. package/devices/axis.js +0 -62
  1242. package/devices/bankamp.d.ts +0 -3
  1243. package/devices/bankamp.d.ts.map +0 -1
  1244. package/devices/bankamp.js +0 -47
  1245. package/devices/bega.d.ts +0 -3
  1246. package/devices/bega.d.ts.map +0 -1
  1247. package/devices/bega.js +0 -61
  1248. package/devices/belkin.d.ts +0 -3
  1249. package/devices/belkin.d.ts.map +0 -1
  1250. package/devices/belkin.js +0 -47
  1251. package/devices/bitron.d.ts +0 -3
  1252. package/devices/bitron.d.ts.map +0 -1
  1253. package/devices/bitron.js +0 -357
  1254. package/devices/bitron.js.map +0 -1
  1255. package/devices/bituo_technik.d.ts +0 -3
  1256. package/devices/bituo_technik.d.ts.map +0 -1
  1257. package/devices/bituo_technik.js +0 -120
  1258. package/devices/blaupunkt.d.ts +0 -3
  1259. package/devices/blaupunkt.d.ts.map +0 -1
  1260. package/devices/blaupunkt.js +0 -67
  1261. package/devices/blitzwolf.d.ts +0 -3
  1262. package/devices/blitzwolf.d.ts.map +0 -1
  1263. package/devices/blitzwolf.js +0 -73
  1264. package/devices/bosch.d.ts +0 -3
  1265. package/devices/bosch.d.ts.map +0 -1
  1266. package/devices/bosch.js +0 -2046
  1267. package/devices/bosch.js.map +0 -1
  1268. package/devices/bouffalo_lab.d.ts +0 -3
  1269. package/devices/bouffalo_lab.d.ts.map +0 -1
  1270. package/devices/bouffalo_lab.js +0 -47
  1271. package/devices/brimate.d.ts +0 -3
  1272. package/devices/brimate.d.ts.map +0 -1
  1273. package/devices/brimate.js +0 -54
  1274. package/devices/bseed.d.ts +0 -3
  1275. package/devices/bseed.d.ts.map +0 -1
  1276. package/devices/bseed.js +0 -53
  1277. package/devices/bticino.d.ts +0 -3
  1278. package/devices/bticino.d.ts.map +0 -1
  1279. package/devices/bticino.js +0 -112
  1280. package/devices/busch_jaeger.d.ts +0 -3
  1281. package/devices/busch_jaeger.d.ts.map +0 -1
  1282. package/devices/busch_jaeger.js +0 -184
  1283. package/devices/busch_jaeger.js.map +0 -1
  1284. package/devices/byun.d.ts +0 -3
  1285. package/devices/byun.d.ts.map +0 -1
  1286. package/devices/byun.js +0 -63
  1287. package/devices/calex.d.ts +0 -3
  1288. package/devices/calex.d.ts.map +0 -1
  1289. package/devices/calex.js +0 -90
  1290. package/devices/candeo.d.ts +0 -3
  1291. package/devices/candeo.d.ts.map +0 -1
  1292. package/devices/candeo.js +0 -224
  1293. package/devices/casaia.d.ts +0 -3
  1294. package/devices/casaia.d.ts.map +0 -1
  1295. package/devices/casaia.js +0 -98
  1296. package/devices/cel.d.ts +0 -3
  1297. package/devices/cel.d.ts.map +0 -1
  1298. package/devices/cel.js +0 -19
  1299. package/devices/centralite.d.ts +0 -3
  1300. package/devices/centralite.d.ts.map +0 -1
  1301. package/devices/centralite.js +0 -452
  1302. package/devices/centralite.js.map +0 -1
  1303. package/devices/chacon.d.ts +0 -3
  1304. package/devices/chacon.d.ts.map +0 -1
  1305. package/devices/chacon.js +0 -57
  1306. package/devices/cleode.d.ts +0 -3
  1307. package/devices/cleode.d.ts.map +0 -1
  1308. package/devices/cleode.js +0 -47
  1309. package/devices/cleverio.d.ts +0 -3
  1310. package/devices/cleverio.d.ts.map +0 -1
  1311. package/devices/cleverio.js +0 -77
  1312. package/devices/climax.d.ts +0 -3
  1313. package/devices/climax.d.ts.map +0 -1
  1314. package/devices/climax.js +0 -180
  1315. package/devices/commercial_electric.d.ts +0 -3
  1316. package/devices/commercial_electric.d.ts.map +0 -1
  1317. package/devices/commercial_electric.js +0 -47
  1318. package/devices/cree.d.ts +0 -3
  1319. package/devices/cree.d.ts.map +0 -1
  1320. package/devices/cree.js +0 -47
  1321. package/devices/ctm.d.ts +0 -3
  1322. package/devices/ctm.d.ts.map +0 -1
  1323. package/devices/ctm.js +0 -1361
  1324. package/devices/ctm.js.map +0 -1
  1325. package/devices/current_products_corp.d.ts +0 -3
  1326. package/devices/current_products_corp.d.ts.map +0 -1
  1327. package/devices/current_products_corp.js +0 -63
  1328. package/devices/custom_devices_diy.d.ts +0 -3
  1329. package/devices/custom_devices_diy.d.ts.map +0 -1
  1330. package/devices/custom_devices_diy.js +0 -1206
  1331. package/devices/custom_devices_diy.js.map +0 -1
  1332. package/devices/cy_lighting.d.ts +0 -3
  1333. package/devices/cy_lighting.d.ts.map +0 -1
  1334. package/devices/cy_lighting.js +0 -47
  1335. package/devices/danalock.d.ts +0 -3
  1336. package/devices/danalock.d.ts.map +0 -1
  1337. package/devices/danalock.js +0 -64
  1338. package/devices/danfoss.d.ts +0 -3
  1339. package/devices/danfoss.d.ts.map +0 -1
  1340. package/devices/danfoss.js +0 -741
  1341. package/devices/danfoss.js.map +0 -1
  1342. package/devices/databyte.d.ts +0 -3
  1343. package/devices/databyte.d.ts.map +0 -1
  1344. package/devices/databyte.js +0 -93
  1345. package/devices/datek.d.ts +0 -3
  1346. package/devices/datek.d.ts.map +0 -1
  1347. package/devices/datek.js +0 -307
  1348. package/devices/datek.js.map +0 -1
  1349. package/devices/dawon_dns.d.ts +0 -3
  1350. package/devices/dawon_dns.d.ts.map +0 -1
  1351. package/devices/dawon_dns.js +0 -317
  1352. package/devices/develco.d.ts +0 -3
  1353. package/devices/develco.d.ts.map +0 -1
  1354. package/devices/develco.js +0 -1034
  1355. package/devices/develco.js.map +0 -1
  1356. package/devices/digi.d.ts +0 -3
  1357. package/devices/digi.d.ts.map +0 -1
  1358. package/devices/digi.js +0 -24
  1359. package/devices/direct_signs.d.ts +0 -3
  1360. package/devices/direct_signs.d.ts.map +0 -1
  1361. package/devices/direct_signs.js +0 -47
  1362. package/devices/diyruz.d.ts +0 -3
  1363. package/devices/diyruz.d.ts.map +0 -1
  1364. package/devices/diyruz.js +0 -400
  1365. package/devices/dlink.d.ts +0 -3
  1366. package/devices/dlink.d.ts.map +0 -1
  1367. package/devices/dlink.js +0 -75
  1368. package/devices/dnake.d.ts +0 -3
  1369. package/devices/dnake.d.ts.map +0 -1
  1370. package/devices/dnake.js +0 -47
  1371. package/devices/dowsing_reynolds.d.ts +0 -3
  1372. package/devices/dowsing_reynolds.d.ts.map +0 -1
  1373. package/devices/dowsing_reynolds.js +0 -47
  1374. package/devices/dresden_elektronik.d.ts +0 -3
  1375. package/devices/dresden_elektronik.d.ts.map +0 -1
  1376. package/devices/dresden_elektronik.js +0 -82
  1377. package/devices/easyaccess.d.ts +0 -3
  1378. package/devices/easyaccess.d.ts.map +0 -1
  1379. package/devices/easyaccess.js +0 -70
  1380. package/devices/easyiot.d.ts +0 -3
  1381. package/devices/easyiot.d.ts.map +0 -1
  1382. package/devices/easyiot.js +0 -357
  1383. package/devices/easyiot.js.map +0 -1
  1384. package/devices/eatonhalo_led.d.ts +0 -3
  1385. package/devices/eatonhalo_led.d.ts.map +0 -1
  1386. package/devices/eatonhalo_led.js +0 -47
  1387. package/devices/echostar.d.ts +0 -3
  1388. package/devices/echostar.d.ts.map +0 -1
  1389. package/devices/echostar.js +0 -64
  1390. package/devices/ecodim.d.ts +0 -3
  1391. package/devices/ecodim.d.ts.map +0 -1
  1392. package/devices/ecodim.js +0 -269
  1393. package/devices/ecolink.d.ts +0 -3
  1394. package/devices/ecolink.d.ts.map +0 -1
  1395. package/devices/ecolink.js +0 -60
  1396. package/devices/ecosmart.d.ts +0 -3
  1397. package/devices/ecosmart.d.ts.map +0 -1
  1398. package/devices/ecosmart.js +0 -115
  1399. package/devices/ecozy.d.ts +0 -3
  1400. package/devices/ecozy.d.ts.map +0 -1
  1401. package/devices/ecozy.js +0 -88
  1402. package/devices/edp.d.ts +0 -3
  1403. package/devices/edp.d.ts.map +0 -1
  1404. package/devices/edp.js +0 -73
  1405. package/devices/efekta.d.ts +0 -3
  1406. package/devices/efekta.d.ts.map +0 -1
  1407. package/devices/efekta.js +0 -2632
  1408. package/devices/eglo.d.ts +0 -3
  1409. package/devices/eglo.d.ts.map +0 -1
  1410. package/devices/eglo.js +0 -133
  1411. package/devices/elko.d.ts +0 -3
  1412. package/devices/elko.d.ts.map +0 -1
  1413. package/devices/elko.js +0 -239
  1414. package/devices/enbrighten.d.ts +0 -3
  1415. package/devices/enbrighten.d.ts.map +0 -1
  1416. package/devices/enbrighten.js +0 -156
  1417. package/devices/enocean.d.ts +0 -3
  1418. package/devices/enocean.d.ts.map +0 -1
  1419. package/devices/enocean.js +0 -152
  1420. package/devices/envilar.d.ts +0 -3
  1421. package/devices/envilar.d.ts.map +0 -1
  1422. package/devices/envilar.js +0 -99
  1423. package/devices/essentialb.d.ts +0 -3
  1424. package/devices/essentialb.d.ts.map +0 -1
  1425. package/devices/essentialb.js +0 -136
  1426. package/devices/essentials.d.ts +0 -3
  1427. package/devices/essentials.d.ts.map +0 -1
  1428. package/devices/essentials.js +0 -150
  1429. package/devices/eucontrols.d.ts +0 -3
  1430. package/devices/eucontrols.d.ts.map +0 -1
  1431. package/devices/eucontrols.js +0 -47
  1432. package/devices/eurotronic.d.ts +0 -3
  1433. package/devices/eurotronic.d.ts.map +0 -1
  1434. package/devices/eurotronic.js +0 -205
  1435. package/devices/evanell.d.ts +0 -3
  1436. package/devices/evanell.d.ts.map +0 -1
  1437. package/devices/evanell.js +0 -71
  1438. package/devices/evn.d.ts +0 -3
  1439. package/devices/evn.d.ts.map +0 -1
  1440. package/devices/evn.js +0 -93
  1441. package/devices/evology.d.ts +0 -3
  1442. package/devices/evology.d.ts.map +0 -1
  1443. package/devices/evology.js +0 -63
  1444. package/devices/evvr.d.ts +0 -3
  1445. package/devices/evvr.d.ts.map +0 -1
  1446. package/devices/evvr.js +0 -47
  1447. package/devices/ewelink.d.ts +0 -3
  1448. package/devices/ewelink.d.ts.map +0 -1
  1449. package/devices/ewelink.js +0 -352
  1450. package/devices/ewelink.js.map +0 -1
  1451. package/devices/ezex.d.ts +0 -3
  1452. package/devices/ezex.d.ts.map +0 -1
  1453. package/devices/ezex.js +0 -47
  1454. package/devices/fantem.d.ts +0 -3
  1455. package/devices/fantem.d.ts.map +0 -1
  1456. package/devices/fantem.js +0 -114
  1457. package/devices/fantem.js.map +0 -1
  1458. package/devices/feibit.d.ts +0 -3
  1459. package/devices/feibit.d.ts.map +0 -1
  1460. package/devices/feibit.js +0 -344
  1461. package/devices/feibit.js.map +0 -1
  1462. package/devices/fireangel.d.ts +0 -3
  1463. package/devices/fireangel.d.ts.map +0 -1
  1464. package/devices/fireangel.js +0 -54
  1465. package/devices/frankever.d.ts +0 -3
  1466. package/devices/frankever.d.ts.map +0 -1
  1467. package/devices/frankever.js +0 -67
  1468. package/devices/frient.d.ts +0 -3
  1469. package/devices/frient.d.ts.map +0 -1
  1470. package/devices/frient.js +0 -74
  1471. package/devices/futurehome.d.ts +0 -3
  1472. package/devices/futurehome.d.ts.map +0 -1
  1473. package/devices/futurehome.js +0 -123
  1474. package/devices/ge.d.ts +0 -3
  1475. package/devices/ge.d.ts.map +0 -1
  1476. package/devices/ge.js +0 -133
  1477. package/devices/gewiss.d.ts +0 -3
  1478. package/devices/gewiss.d.ts.map +0 -1
  1479. package/devices/gewiss.js +0 -85
  1480. package/devices/gidealed.d.ts +0 -3
  1481. package/devices/gidealed.d.ts.map +0 -1
  1482. package/devices/gidealed.js +0 -47
  1483. package/devices/giderwel.d.ts +0 -3
  1484. package/devices/giderwel.d.ts.map +0 -1
  1485. package/devices/giderwel.js +0 -47
  1486. package/devices/giex.d.ts +0 -3
  1487. package/devices/giex.d.ts.map +0 -1
  1488. package/devices/giex.js +0 -114
  1489. package/devices/girier.d.ts +0 -3
  1490. package/devices/girier.d.ts.map +0 -1
  1491. package/devices/girier.js +0 -51
  1492. package/devices/gledopto.d.ts +0 -3
  1493. package/devices/gledopto.d.ts.map +0 -1
  1494. package/devices/gledopto.js +0 -1052
  1495. package/devices/gledopto.js.map +0 -1
  1496. package/devices/gmmts.d.ts +0 -3
  1497. package/devices/gmmts.d.ts.map +0 -1
  1498. package/devices/gmmts.js +0 -2285
  1499. package/devices/gmmts.js.map +0 -1
  1500. package/devices/gmy.d.ts +0 -3
  1501. package/devices/gmy.d.ts.map +0 -1
  1502. package/devices/gmy.js +0 -47
  1503. package/devices/gs.d.ts +0 -3
  1504. package/devices/gs.d.ts.map +0 -1
  1505. package/devices/gs.js +0 -121
  1506. package/devices/gumax.d.ts +0 -3
  1507. package/devices/gumax.d.ts.map +0 -1
  1508. package/devices/gumax.js +0 -47
  1509. package/devices/halemeier.d.ts +0 -3
  1510. package/devices/halemeier.d.ts.map +0 -1
  1511. package/devices/halemeier.js +0 -128
  1512. package/devices/hampton_bay.d.ts +0 -3
  1513. package/devices/hampton_bay.d.ts.map +0 -1
  1514. package/devices/hampton_bay.js +0 -71
  1515. package/devices/heatit.d.ts +0 -3
  1516. package/devices/heatit.d.ts.map +0 -1
  1517. package/devices/heatit.js +0 -47
  1518. package/devices/heiman.d.ts +0 -3
  1519. package/devices/heiman.d.ts.map +0 -1
  1520. package/devices/heiman.js +0 -816
  1521. package/devices/heimgard_technologies.d.ts +0 -3
  1522. package/devices/heimgard_technologies.d.ts.map +0 -1
  1523. package/devices/heimgard_technologies.js +0 -192
  1524. package/devices/hej.d.ts +0 -3
  1525. package/devices/hej.d.ts.map +0 -1
  1526. package/devices/hej.js +0 -105
  1527. package/devices/hfh.d.ts +0 -3
  1528. package/devices/hfh.d.ts.map +0 -1
  1529. package/devices/hfh.js +0 -47
  1530. package/devices/hilux.d.ts +0 -3
  1531. package/devices/hilux.d.ts.map +0 -1
  1532. package/devices/hilux.js +0 -54
  1533. package/devices/hive.d.ts +0 -3
  1534. package/devices/hive.d.ts.map +0 -1
  1535. package/devices/hive.js +0 -765
  1536. package/devices/hommyn.d.ts +0 -3
  1537. package/devices/hommyn.d.ts.map +0 -1
  1538. package/devices/hommyn.js +0 -63
  1539. package/devices/honyar.d.ts +0 -3
  1540. package/devices/honyar.d.ts.map +0 -1
  1541. package/devices/honyar.js +0 -170
  1542. package/devices/hornbach.d.ts +0 -3
  1543. package/devices/hornbach.d.ts.map +0 -1
  1544. package/devices/hornbach.js +0 -138
  1545. package/devices/hzc_electric.d.ts +0 -3
  1546. package/devices/hzc_electric.d.ts.map +0 -1
  1547. package/devices/hzc_electric.js +0 -105
  1548. package/devices/icasa.d.ts +0 -3
  1549. package/devices/icasa.d.ts.map +0 -1
  1550. package/devices/icasa.js +0 -166
  1551. package/devices/idinio.d.ts +0 -3
  1552. package/devices/idinio.d.ts.map +0 -1
  1553. package/devices/idinio.js +0 -47
  1554. package/devices/ihorn.d.ts +0 -3
  1555. package/devices/ihorn.d.ts.map +0 -1
  1556. package/devices/ihorn.js +0 -108
  1557. package/devices/ikea.d.ts +0 -3
  1558. package/devices/ikea.d.ts.map +0 -1
  1559. package/devices/ikea.js +0 -980
  1560. package/devices/ilightsin.d.ts +0 -3
  1561. package/devices/ilightsin.d.ts.map +0 -1
  1562. package/devices/ilightsin.js +0 -47
  1563. package/devices/iluminize.d.ts +0 -3
  1564. package/devices/iluminize.d.ts.map +0 -1
  1565. package/devices/iluminize.js +0 -389
  1566. package/devices/ilux.d.ts +0 -3
  1567. package/devices/ilux.d.ts.map +0 -1
  1568. package/devices/ilux.js +0 -47
  1569. package/devices/imhotepcreation.d.ts +0 -3
  1570. package/devices/imhotepcreation.d.ts.map +0 -1
  1571. package/devices/imhotepcreation.js +0 -242
  1572. package/devices/immax.d.ts +0 -3
  1573. package/devices/immax.d.ts.map +0 -1
  1574. package/devices/immax.js +0 -303
  1575. package/devices/imou.d.ts +0 -3
  1576. package/devices/imou.d.ts.map +0 -1
  1577. package/devices/imou.js +0 -60
  1578. package/devices/index.js +0 -649
  1579. package/devices/index.js.map +0 -1
  1580. package/devices/innr.d.ts +0 -3
  1581. package/devices/innr.d.ts.map +0 -1
  1582. package/devices/innr.js +0 -868
  1583. package/devices/inovelli.d.ts +0 -3
  1584. package/devices/inovelli.d.ts.map +0 -1
  1585. package/devices/inovelli.js +0 -2014
  1586. package/devices/inovelli.js.map +0 -1
  1587. package/devices/insta.d.ts +0 -3
  1588. package/devices/insta.d.ts.map +0 -1
  1589. package/devices/insta.js +0 -185
  1590. package/devices/iolloi.d.ts +0 -3
  1591. package/devices/iolloi.d.ts.map +0 -1
  1592. package/devices/iolloi.js +0 -48
  1593. package/devices/iotperfect.d.ts +0 -3
  1594. package/devices/iotperfect.d.ts.map +0 -1
  1595. package/devices/iotperfect.js +0 -57
  1596. package/devices/iris.d.ts +0 -3
  1597. package/devices/iris.d.ts.map +0 -1
  1598. package/devices/iris.js +0 -210
  1599. package/devices/istar.d.ts +0 -3
  1600. package/devices/istar.d.ts.map +0 -1
  1601. package/devices/istar.js +0 -54
  1602. package/devices/jasco.d.ts +0 -3
  1603. package/devices/jasco.d.ts.map +0 -1
  1604. package/devices/jasco.js +0 -66
  1605. package/devices/javis.d.ts +0 -3
  1606. package/devices/javis.d.ts.map +0 -1
  1607. package/devices/javis.js +0 -80
  1608. package/devices/jethome.d.ts +0 -3
  1609. package/devices/jethome.d.ts.map +0 -1
  1610. package/devices/jethome.js +0 -123
  1611. package/devices/jethome.js.map +0 -1
  1612. package/devices/jiawen.d.ts +0 -3
  1613. package/devices/jiawen.d.ts.map +0 -1
  1614. package/devices/jiawen.js +0 -54
  1615. package/devices/jumitech.d.ts +0 -3
  1616. package/devices/jumitech.d.ts.map +0 -1
  1617. package/devices/jumitech.js +0 -47
  1618. package/devices/jxuan.d.ts +0 -3
  1619. package/devices/jxuan.d.ts.map +0 -1
  1620. package/devices/jxuan.js +0 -88
  1621. package/devices/kami.d.ts +0 -3
  1622. package/devices/kami.d.ts.map +0 -1
  1623. package/devices/kami.js +0 -54
  1624. package/devices/keen_home.d.ts +0 -3
  1625. package/devices/keen_home.d.ts.map +0 -1
  1626. package/devices/keen_home.js +0 -159
  1627. package/devices/klikaanklikuit.d.ts +0 -3
  1628. package/devices/klikaanklikuit.d.ts.map +0 -1
  1629. package/devices/klikaanklikuit.js +0 -54
  1630. package/devices/kmpcil.d.ts +0 -3
  1631. package/devices/kmpcil.d.ts.map +0 -1
  1632. package/devices/kmpcil.js +0 -215
  1633. package/devices/kmpcil.js.map +0 -1
  1634. package/devices/konke.d.ts +0 -3
  1635. package/devices/konke.d.ts.map +0 -1
  1636. package/devices/konke.js +0 -210
  1637. package/devices/ksentry.d.ts +0 -3
  1638. package/devices/ksentry.d.ts.map +0 -1
  1639. package/devices/ksentry.js +0 -47
  1640. package/devices/kurvia.d.ts +0 -3
  1641. package/devices/kurvia.d.ts.map +0 -1
  1642. package/devices/kurvia.js +0 -52
  1643. package/devices/kwikset.d.ts +0 -3
  1644. package/devices/kwikset.d.ts.map +0 -1
  1645. package/devices/kwikset.js +0 -156
  1646. package/devices/lanesto.d.ts +0 -3
  1647. package/devices/lanesto.d.ts.map +0 -1
  1648. package/devices/lanesto.js +0 -47
  1649. package/devices/lds.d.ts +0 -3
  1650. package/devices/lds.d.ts.map +0 -1
  1651. package/devices/lds.js +0 -47
  1652. package/devices/led_trading.d.ts +0 -3
  1653. package/devices/led_trading.d.ts.map +0 -1
  1654. package/devices/led_trading.js +0 -111
  1655. package/devices/led_trading.js.map +0 -1
  1656. package/devices/ledvance.d.ts +0 -3
  1657. package/devices/ledvance.d.ts.map +0 -1
  1658. package/devices/ledvance.js +0 -370
  1659. package/devices/leedarson.d.ts +0 -3
  1660. package/devices/leedarson.d.ts.map +0 -1
  1661. package/devices/leedarson.js +0 -183
  1662. package/devices/legrand.d.ts +0 -3
  1663. package/devices/legrand.d.ts.map +0 -1
  1664. package/devices/legrand.js +0 -737
  1665. package/devices/lellki.d.ts +0 -3
  1666. package/devices/lellki.d.ts.map +0 -1
  1667. package/devices/lellki.js +0 -164
  1668. package/devices/letsled.d.ts +0 -3
  1669. package/devices/letsled.d.ts.map +0 -1
  1670. package/devices/letsled.js +0 -47
  1671. package/devices/letv.d.ts +0 -3
  1672. package/devices/letv.d.ts.map +0 -1
  1673. package/devices/letv.js +0 -89
  1674. package/devices/leviton.d.ts +0 -3
  1675. package/devices/leviton.d.ts.map +0 -1
  1676. package/devices/leviton.js +0 -163
  1677. package/devices/leviton.js.map +0 -1
  1678. package/devices/lg.d.ts +0 -3
  1679. package/devices/lg.d.ts.map +0 -1
  1680. package/devices/lg.js +0 -61
  1681. package/devices/lidl.d.ts +0 -3
  1682. package/devices/lidl.d.ts.map +0 -1
  1683. package/devices/lidl.js +0 -673
  1684. package/devices/lidl.js.map +0 -1
  1685. package/devices/lifecontrol.d.ts +0 -3
  1686. package/devices/lifecontrol.d.ts.map +0 -1
  1687. package/devices/lifecontrol.js +0 -148
  1688. package/devices/lifecontrol.js.map +0 -1
  1689. package/devices/lightsolutions.d.ts +0 -3
  1690. package/devices/lightsolutions.d.ts.map +0 -1
  1691. package/devices/lightsolutions.js +0 -68
  1692. package/devices/linkind.d.ts +0 -3
  1693. package/devices/linkind.d.ts.map +0 -1
  1694. package/devices/linkind.js +0 -274
  1695. package/devices/linptech.d.ts +0 -3
  1696. package/devices/linptech.d.ts.map +0 -1
  1697. package/devices/linptech.js +0 -158
  1698. package/devices/linptech.js.map +0 -1
  1699. package/devices/livingwise.d.ts +0 -3
  1700. package/devices/livingwise.d.ts.map +0 -1
  1701. package/devices/livingwise.js +0 -118
  1702. package/devices/livolo.d.ts +0 -3
  1703. package/devices/livolo.d.ts.map +0 -1
  1704. package/devices/livolo.js +0 -421
  1705. package/devices/livolo.js.map +0 -1
  1706. package/devices/lixee.d.ts +0 -3
  1707. package/devices/lixee.d.ts.map +0 -1
  1708. package/devices/lixee.js +0 -1924
  1709. package/devices/lixee.js.map +0 -1
  1710. package/devices/lonsonho.d.ts +0 -3
  1711. package/devices/lonsonho.d.ts.map +0 -1
  1712. package/devices/lonsonho.js +0 -290
  1713. package/devices/ls.d.ts +0 -3
  1714. package/devices/ls.d.ts.map +0 -1
  1715. package/devices/ls.js +0 -66
  1716. package/devices/lubeez.d.ts +0 -3
  1717. package/devices/lubeez.d.ts.map +0 -1
  1718. package/devices/lubeez.js +0 -47
  1719. package/devices/lumi.d.ts +0 -3
  1720. package/devices/lumi.d.ts.map +0 -1
  1721. package/devices/lumi.js +0 -4430
  1722. package/devices/lumi.js.map +0 -1
  1723. package/devices/lupus.d.ts +0 -3
  1724. package/devices/lupus.d.ts.map +0 -1
  1725. package/devices/lupus.js +0 -97
  1726. package/devices/lutron.d.ts +0 -3
  1727. package/devices/lutron.d.ts.map +0 -1
  1728. package/devices/lutron.js +0 -71
  1729. package/devices/lux.d.ts +0 -3
  1730. package/devices/lux.d.ts.map +0 -1
  1731. package/devices/lux.js +0 -90
  1732. package/devices/lytko.d.ts +0 -3
  1733. package/devices/lytko.d.ts.map +0 -1
  1734. package/devices/lytko.js +0 -787
  1735. package/devices/lytko.js.map +0 -1
  1736. package/devices/m_elec.d.ts +0 -3
  1737. package/devices/m_elec.d.ts.map +0 -1
  1738. package/devices/m_elec.js +0 -68
  1739. package/devices/makegood.d.ts +0 -3
  1740. package/devices/makegood.d.ts.map +0 -1
  1741. package/devices/makegood.js +0 -65
  1742. package/devices/matcall_bv.d.ts +0 -3
  1743. package/devices/matcall_bv.d.ts.map +0 -1
  1744. package/devices/matcall_bv.js +0 -54
  1745. package/devices/mazda.d.ts +0 -3
  1746. package/devices/mazda.d.ts.map +0 -1
  1747. package/devices/mazda.js +0 -163
  1748. package/devices/mazda.js.map +0 -1
  1749. package/devices/meazon.d.ts +0 -3
  1750. package/devices/meazon.d.ts.map +0 -1
  1751. package/devices/meazon.js +0 -98
  1752. package/devices/meazon.js.map +0 -1
  1753. package/devices/mercator.d.ts +0 -3
  1754. package/devices/mercator.d.ts.map +0 -1
  1755. package/devices/mercator.js +0 -252
  1756. package/devices/miboxer.d.ts +0 -3
  1757. package/devices/miboxer.d.ts.map +0 -1
  1758. package/devices/miboxer.js +0 -92
  1759. package/devices/micromatic.d.ts +0 -3
  1760. package/devices/micromatic.d.ts.map +0 -1
  1761. package/devices/micromatic.js +0 -47
  1762. package/devices/modular.d.ts +0 -3
  1763. package/devices/modular.d.ts.map +0 -1
  1764. package/devices/modular.js +0 -47
  1765. package/devices/moes.d.ts +0 -3
  1766. package/devices/moes.d.ts.map +0 -1
  1767. package/devices/moes.js +0 -722
  1768. package/devices/muller_licht.d.ts +0 -3
  1769. package/devices/muller_licht.d.ts.map +0 -1
  1770. package/devices/muller_licht.js +0 -337
  1771. package/devices/multiterm.d.ts +0 -3
  1772. package/devices/multiterm.d.ts.map +0 -1
  1773. package/devices/multiterm.js +0 -122
  1774. package/devices/multiterm.js.map +0 -1
  1775. package/devices/namron.d.ts +0 -3
  1776. package/devices/namron.d.ts.map +0 -1
  1777. package/devices/namron.js +0 -1572
  1778. package/devices/namron.js.map +0 -1
  1779. package/devices/nanoleaf.d.ts +0 -3
  1780. package/devices/nanoleaf.d.ts.map +0 -1
  1781. package/devices/nanoleaf.js +0 -47
  1782. package/devices/nedis.d.ts +0 -3
  1783. package/devices/nedis.d.ts.map +0 -1
  1784. package/devices/nedis.js +0 -87
  1785. package/devices/neo.d.ts +0 -3
  1786. package/devices/neo.d.ts.map +0 -1
  1787. package/devices/neo.js +0 -557
  1788. package/devices/neo.js.map +0 -1
  1789. package/devices/net2grid.d.ts +0 -3
  1790. package/devices/net2grid.d.ts.map +0 -1
  1791. package/devices/net2grid.js +0 -67
  1792. package/devices/netvox.d.ts +0 -3
  1793. package/devices/netvox.d.ts.map +0 -1
  1794. package/devices/netvox.js +0 -74
  1795. package/devices/nexelec.d.ts +0 -3
  1796. package/devices/nexelec.d.ts.map +0 -1
  1797. package/devices/nexelec.js +0 -47
  1798. package/devices/niko.d.ts +0 -3
  1799. package/devices/niko.d.ts.map +0 -1
  1800. package/devices/niko.js +0 -632
  1801. package/devices/niko.js.map +0 -1
  1802. package/devices/ninja_blocks.d.ts +0 -3
  1803. package/devices/ninja_blocks.d.ts.map +0 -1
  1804. package/devices/ninja_blocks.js +0 -63
  1805. package/devices/niviss.d.ts +0 -3
  1806. package/devices/niviss.d.ts.map +0 -1
  1807. package/devices/niviss.js +0 -47
  1808. package/devices/nodon.d.ts +0 -3
  1809. package/devices/nodon.d.ts.map +0 -1
  1810. package/devices/nodon.js +0 -386
  1811. package/devices/nordtronic.d.ts +0 -3
  1812. package/devices/nordtronic.d.ts.map +0 -1
  1813. package/devices/nordtronic.js +0 -73
  1814. package/devices/nous.d.ts +0 -3
  1815. package/devices/nous.d.ts.map +0 -1
  1816. package/devices/nous.js +0 -168
  1817. package/devices/novo.d.ts +0 -3
  1818. package/devices/novo.d.ts.map +0 -1
  1819. package/devices/novo.js +0 -57
  1820. package/devices/nue_3a.d.ts +0 -3
  1821. package/devices/nue_3a.d.ts.map +0 -1
  1822. package/devices/nue_3a.js +0 -360
  1823. package/devices/nue_3a.js.map +0 -1
  1824. package/devices/nyce.d.ts +0 -3
  1825. package/devices/nyce.d.ts.map +0 -1
  1826. package/devices/nyce.js +0 -133
  1827. package/devices/onenuo.d.ts +0 -3
  1828. package/devices/onenuo.d.ts.map +0 -1
  1829. package/devices/onenuo.js +0 -85
  1830. package/devices/onesti.d.ts +0 -3
  1831. package/devices/onesti.d.ts.map +0 -1
  1832. package/devices/onesti.js +0 -207
  1833. package/devices/onesti.js.map +0 -1
  1834. package/devices/openlumi.d.ts +0 -3
  1835. package/devices/openlumi.d.ts.map +0 -1
  1836. package/devices/openlumi.js +0 -61
  1837. package/devices/orvibo.d.ts +0 -12
  1838. package/devices/orvibo.d.ts.map +0 -1
  1839. package/devices/orvibo.js +0 -595
  1840. package/devices/orvibo.js.map +0 -1
  1841. package/devices/osram.d.ts +0 -3
  1842. package/devices/osram.d.ts.map +0 -1
  1843. package/devices/osram.js +0 -516
  1844. package/devices/oujiabao.d.ts +0 -3
  1845. package/devices/oujiabao.d.ts.map +0 -1
  1846. package/devices/oujiabao.js +0 -54
  1847. package/devices/owon.d.ts +0 -3
  1848. package/devices/owon.d.ts.map +0 -1
  1849. package/devices/owon.js +0 -476
  1850. package/devices/owon.js.map +0 -1
  1851. package/devices/ozsmartthings.d.ts +0 -3
  1852. package/devices/ozsmartthings.d.ts.map +0 -1
  1853. package/devices/ozsmartthings.js +0 -47
  1854. package/devices/paul_neuhaus.d.ts +0 -3
  1855. package/devices/paul_neuhaus.d.ts.map +0 -1
  1856. package/devices/paul_neuhaus.js +0 -193
  1857. package/devices/paulmann.d.ts +0 -3
  1858. package/devices/paulmann.d.ts.map +0 -1
  1859. package/devices/paulmann.js +0 -337
  1860. package/devices/peq.d.ts +0 -3
  1861. package/devices/peq.d.ts.map +0 -1
  1862. package/devices/peq.js +0 -63
  1863. package/devices/perenio.d.ts +0 -3
  1864. package/devices/perenio.d.ts.map +0 -1
  1865. package/devices/perenio.js +0 -467
  1866. package/devices/perenio.js.map +0 -1
  1867. package/devices/philio.d.ts +0 -3
  1868. package/devices/philio.d.ts.map +0 -1
  1869. package/devices/philio.js +0 -48
  1870. package/devices/philips.d.ts +0 -3
  1871. package/devices/philips.d.ts.map +0 -1
  1872. package/devices/philips.js +0 -4057
  1873. package/devices/philips.js.map +0 -1
  1874. package/devices/plaid.d.ts +0 -3
  1875. package/devices/plaid.d.ts.map +0 -1
  1876. package/devices/plaid.js +0 -64
  1877. package/devices/plugwise.d.ts +0 -3
  1878. package/devices/plugwise.d.ts.map +0 -1
  1879. package/devices/plugwise.js +0 -209
  1880. package/devices/plugwise.js.map +0 -1
  1881. package/devices/profalux.d.ts +0 -3
  1882. package/devices/profalux.d.ts.map +0 -1
  1883. package/devices/profalux.js +0 -190
  1884. package/devices/profalux.js.map +0 -1
  1885. package/devices/prolight.d.ts +0 -3
  1886. package/devices/prolight.d.ts.map +0 -1
  1887. package/devices/prolight.js +0 -114
  1888. package/devices/purmo.d.ts +0 -3
  1889. package/devices/purmo.d.ts.map +0 -1
  1890. package/devices/purmo.js +0 -94
  1891. package/devices/pushok.d.ts +0 -3
  1892. package/devices/pushok.d.ts.map +0 -1
  1893. package/devices/pushok.js +0 -375
  1894. package/devices/pushok.js.map +0 -1
  1895. package/devices/qa.d.ts +0 -3
  1896. package/devices/qa.d.ts.map +0 -1
  1897. package/devices/qa.js +0 -294
  1898. package/devices/qmotion.d.ts +0 -3
  1899. package/devices/qmotion.d.ts.map +0 -1
  1900. package/devices/qmotion.js +0 -72
  1901. package/devices/qoto.d.ts +0 -3
  1902. package/devices/qoto.d.ts.map +0 -1
  1903. package/devices/qoto.js +0 -86
  1904. package/devices/quotra.d.ts +0 -3
  1905. package/devices/quotra.d.ts.map +0 -1
  1906. package/devices/quotra.js +0 -54
  1907. package/devices/rademacher.d.ts +0 -3
  1908. package/devices/rademacher.d.ts.map +0 -1
  1909. package/devices/rademacher.js +0 -61
  1910. package/devices/radium.d.ts +0 -3
  1911. package/devices/radium.d.ts.map +0 -1
  1912. package/devices/radium.js +0 -47
  1913. package/devices/raex.d.ts +0 -3
  1914. package/devices/raex.d.ts.map +0 -1
  1915. package/devices/raex.js +0 -47
  1916. package/devices/rgb_genie.d.ts +0 -3
  1917. package/devices/rgb_genie.d.ts.map +0 -1
  1918. package/devices/rgb_genie.js +0 -278
  1919. package/devices/robb.d.ts +0 -3
  1920. package/devices/robb.d.ts.map +0 -1
  1921. package/devices/robb.js +0 -471
  1922. package/devices/roome.d.ts +0 -3
  1923. package/devices/roome.d.ts.map +0 -1
  1924. package/devices/roome.js +0 -54
  1925. package/devices/rtx.d.ts +0 -3
  1926. package/devices/rtx.d.ts.map +0 -1
  1927. package/devices/rtx.js +0 -146
  1928. package/devices/salus_controls.d.ts +0 -3
  1929. package/devices/salus_controls.d.ts.map +0 -1
  1930. package/devices/salus_controls.js +0 -224
  1931. package/devices/samotech.d.ts +0 -3
  1932. package/devices/samotech.d.ts.map +0 -1
  1933. package/devices/samotech.js +0 -107
  1934. package/devices/saswell.d.ts +0 -3
  1935. package/devices/saswell.d.ts.map +0 -1
  1936. package/devices/saswell.js +0 -126
  1937. package/devices/sber.d.ts +0 -3
  1938. package/devices/sber.d.ts.map +0 -1
  1939. package/devices/sber.js +0 -98
  1940. package/devices/scanproducts.d.ts +0 -3
  1941. package/devices/scanproducts.d.ts.map +0 -1
  1942. package/devices/scanproducts.js +0 -54
  1943. package/devices/schlage.d.ts +0 -3
  1944. package/devices/schlage.d.ts.map +0 -1
  1945. package/devices/schlage.js +0 -63
  1946. package/devices/schneider_electric.d.ts +0 -3
  1947. package/devices/schneider_electric.d.ts.map +0 -1
  1948. package/devices/schneider_electric.js +0 -2189
  1949. package/devices/schneider_electric.js.map +0 -1
  1950. package/devices/schwaiger.d.ts +0 -3
  1951. package/devices/schwaiger.d.ts.map +0 -1
  1952. package/devices/schwaiger.js +0 -108
  1953. package/devices/seastar_intelligence.d.ts +0 -3
  1954. package/devices/seastar_intelligence.d.ts.map +0 -1
  1955. package/devices/seastar_intelligence.js +0 -52
  1956. package/devices/securifi.d.ts +0 -3
  1957. package/devices/securifi.d.ts.map +0 -1
  1958. package/devices/securifi.js +0 -82
  1959. package/devices/sengled.d.ts +0 -6
  1960. package/devices/sengled.d.ts.map +0 -1
  1961. package/devices/sengled.js +0 -390
  1962. package/devices/sengled.js.map +0 -1
  1963. package/devices/sercomm.d.ts +0 -3
  1964. package/devices/sercomm.d.ts.map +0 -1
  1965. package/devices/sercomm.js +0 -189
  1966. package/devices/shade_control.d.ts +0 -3
  1967. package/devices/shade_control.d.ts.map +0 -1
  1968. package/devices/shade_control.js +0 -64
  1969. package/devices/shenzhen_homa.d.ts +0 -3
  1970. package/devices/shenzhen_homa.d.ts.map +0 -1
  1971. package/devices/shenzhen_homa.js +0 -143
  1972. package/devices/shinasystem.d.ts +0 -3
  1973. package/devices/shinasystem.d.ts.map +0 -1
  1974. package/devices/shinasystem.js +0 -960
  1975. package/devices/shinasystem.js.map +0 -1
  1976. package/devices/shyugj.d.ts +0 -3
  1977. package/devices/shyugj.d.ts.map +0 -1
  1978. package/devices/shyugj.js +0 -53
  1979. package/devices/siglis.d.ts +0 -3
  1980. package/devices/siglis.d.ts.map +0 -1
  1981. package/devices/siglis.js +0 -454
  1982. package/devices/siglis.js.map +0 -1
  1983. package/devices/sikom.d.ts +0 -3
  1984. package/devices/sikom.d.ts.map +0 -1
  1985. package/devices/sikom.js +0 -67
  1986. package/devices/simon.d.ts +0 -3
  1987. package/devices/simon.d.ts.map +0 -1
  1988. package/devices/simon.js +0 -14
  1989. package/devices/sinope.d.ts +0 -3
  1990. package/devices/sinope.d.ts.map +0 -1
  1991. package/devices/sinope.js +0 -1754
  1992. package/devices/sinope.js.map +0 -1
  1993. package/devices/siterwell.d.ts +0 -3
  1994. package/devices/siterwell.d.ts.map +0 -1
  1995. package/devices/siterwell.js +0 -110
  1996. package/devices/skydance.d.ts +0 -3
  1997. package/devices/skydance.d.ts.map +0 -1
  1998. package/devices/skydance.js +0 -138
  1999. package/devices/slv.d.ts +0 -3
  2000. package/devices/slv.d.ts.map +0 -1
  2001. package/devices/slv.js +0 -70
  2002. package/devices/smart9.d.ts +0 -3
  2003. package/devices/smart9.d.ts.map +0 -1
  2004. package/devices/smart9.js +0 -66
  2005. package/devices/smart_home_pty.d.ts +0 -3
  2006. package/devices/smart_home_pty.d.ts.map +0 -1
  2007. package/devices/smart_home_pty.js +0 -54
  2008. package/devices/smartenit.d.ts +0 -3
  2009. package/devices/smartenit.d.ts.map +0 -1
  2010. package/devices/smartenit.js +0 -80
  2011. package/devices/smartthings.d.ts +0 -3
  2012. package/devices/smartthings.d.ts.map +0 -1
  2013. package/devices/smartthings.js +0 -526
  2014. package/devices/smartthings.js.map +0 -1
  2015. package/devices/smartwings.d.ts +0 -3
  2016. package/devices/smartwings.d.ts.map +0 -1
  2017. package/devices/smartwings.js +0 -63
  2018. package/devices/smlight.d.ts +0 -3
  2019. package/devices/smlight.d.ts.map +0 -1
  2020. package/devices/smlight.js +0 -56
  2021. package/devices/sohan_electric.d.ts +0 -3
  2022. package/devices/sohan_electric.d.ts.map +0 -1
  2023. package/devices/sohan_electric.js +0 -53
  2024. package/devices/solaredge.d.ts +0 -3
  2025. package/devices/solaredge.d.ts.map +0 -1
  2026. package/devices/solaredge.js +0 -47
  2027. package/devices/soma.d.ts +0 -3
  2028. package/devices/soma.d.ts.map +0 -1
  2029. package/devices/soma.js +0 -47
  2030. package/devices/somfy.d.ts +0 -3
  2031. package/devices/somfy.d.ts.map +0 -1
  2032. package/devices/somfy.js +0 -101
  2033. package/devices/somgoms.d.ts +0 -3
  2034. package/devices/somgoms.d.ts.map +0 -1
  2035. package/devices/somgoms.js +0 -84
  2036. package/devices/sonoff.d.ts +0 -3
  2037. package/devices/sonoff.d.ts.map +0 -1
  2038. package/devices/sonoff.js +0 -1583
  2039. package/devices/sonoff.js.map +0 -1
  2040. package/devices/sowilo.d.ts +0 -3
  2041. package/devices/sowilo.d.ts.map +0 -1
  2042. package/devices/sowilo.js +0 -47
  2043. package/devices/spotmau.d.ts +0 -3
  2044. package/devices/spotmau.d.ts.map +0 -1
  2045. package/devices/spotmau.js +0 -74
  2046. package/devices/stelpro.d.ts +0 -3
  2047. package/devices/stelpro.d.ts.map +0 -1
  2048. package/devices/stelpro.js +0 -365
  2049. package/devices/stelpro.js.map +0 -1
  2050. package/devices/sunricher.d.ts +0 -3
  2051. package/devices/sunricher.d.ts.map +0 -1
  2052. package/devices/sunricher.js +0 -2169
  2053. package/devices/sunricher.js.map +0 -1
  2054. package/devices/swann.d.ts +0 -3
  2055. package/devices/swann.d.ts.map +0 -1
  2056. package/devices/swann.js +0 -72
  2057. package/devices/sylvania.d.ts +0 -3
  2058. package/devices/sylvania.d.ts.map +0 -1
  2059. package/devices/sylvania.js +0 -226
  2060. package/devices/tapestry.d.ts +0 -3
  2061. package/devices/tapestry.d.ts.map +0 -1
  2062. package/devices/tapestry.js +0 -55
  2063. package/devices/tci.d.ts +0 -3
  2064. package/devices/tci.d.ts.map +0 -1
  2065. package/devices/tci.js +0 -61
  2066. package/devices/tech.d.ts +0 -3
  2067. package/devices/tech.d.ts.map +0 -1
  2068. package/devices/tech.js +0 -217
  2069. package/devices/tech.js.map +0 -1
  2070. package/devices/technicolor.d.ts +0 -3
  2071. package/devices/technicolor.d.ts.map +0 -1
  2072. package/devices/technicolor.js +0 -101
  2073. package/devices/terncy.d.ts +0 -3
  2074. package/devices/terncy.d.ts.map +0 -1
  2075. package/devices/terncy.js +0 -116
  2076. package/devices/the_light_group.d.ts +0 -3
  2077. package/devices/the_light_group.d.ts.map +0 -1
  2078. package/devices/the_light_group.js +0 -129
  2079. package/devices/third_reality.d.ts +0 -3
  2080. package/devices/third_reality.d.ts.map +0 -1
  2081. package/devices/third_reality.js +0 -609
  2082. package/devices/third_reality.js.map +0 -1
  2083. package/devices/titan_products.d.ts +0 -3
  2084. package/devices/titan_products.d.ts.map +0 -1
  2085. package/devices/titan_products.js +0 -61
  2086. package/devices/tlwglobal.d.ts +0 -3
  2087. package/devices/tlwglobal.d.ts.map +0 -1
  2088. package/devices/tlwglobal.js +0 -64
  2089. package/devices/tplink.d.ts +0 -3
  2090. package/devices/tplink.d.ts.map +0 -1
  2091. package/devices/tplink.js +0 -80
  2092. package/devices/trust.d.ts +0 -3
  2093. package/devices/trust.d.ts.map +0 -1
  2094. package/devices/trust.js +0 -182
  2095. package/devices/tubeszb.d.ts +0 -3
  2096. package/devices/tubeszb.d.ts.map +0 -1
  2097. package/devices/tubeszb.js +0 -59
  2098. package/devices/tuya.d.ts +0 -3
  2099. package/devices/tuya.d.ts.map +0 -1
  2100. package/devices/tuya.js +0 -14328
  2101. package/devices/tuya.js.map +0 -1
  2102. package/devices/ubisys.d.ts +0 -3
  2103. package/devices/ubisys.d.ts.map +0 -1
  2104. package/devices/ubisys.js +0 -1313
  2105. package/devices/ubisys.js.map +0 -1
  2106. package/devices/uhome.d.ts +0 -3
  2107. package/devices/uhome.d.ts.map +0 -1
  2108. package/devices/uhome.js +0 -63
  2109. package/devices/universal_electronics_inc.d.ts +0 -3
  2110. package/devices/universal_electronics_inc.d.ts.map +0 -1
  2111. package/devices/universal_electronics_inc.js +0 -185
  2112. package/devices/vbled.d.ts +0 -3
  2113. package/devices/vbled.d.ts.map +0 -1
  2114. package/devices/vbled.js +0 -47
  2115. package/devices/vesternet.d.ts +0 -3
  2116. package/devices/vesternet.d.ts.map +0 -1
  2117. package/devices/vesternet.js +0 -329
  2118. package/devices/vesternet.js.map +0 -1
  2119. package/devices/viessmann.d.ts +0 -3
  2120. package/devices/viessmann.d.ts.map +0 -1
  2121. package/devices/viessmann.js +0 -123
  2122. package/devices/villeroy_boch.d.ts +0 -3
  2123. package/devices/villeroy_boch.d.ts.map +0 -1
  2124. package/devices/villeroy_boch.js +0 -54
  2125. package/devices/vimar.d.ts +0 -3
  2126. package/devices/vimar.d.ts.map +0 -1
  2127. package/devices/vimar.js +0 -136
  2128. package/devices/visonic.d.ts +0 -3
  2129. package/devices/visonic.d.ts.map +0 -1
  2130. package/devices/visonic.js +0 -137
  2131. package/devices/vrey.d.ts +0 -3
  2132. package/devices/vrey.d.ts.map +0 -1
  2133. package/devices/vrey.js +0 -48
  2134. package/devices/wally.d.ts +0 -3
  2135. package/devices/wally.d.ts.map +0 -1
  2136. package/devices/wally.js +0 -63
  2137. package/devices/waxman.d.ts +0 -3
  2138. package/devices/waxman.d.ts.map +0 -1
  2139. package/devices/waxman.js +0 -84
  2140. package/devices/weiser.d.ts +0 -3
  2141. package/devices/weiser.d.ts.map +0 -1
  2142. package/devices/weiser.js +0 -102
  2143. package/devices/weiser.js.map +0 -1
  2144. package/devices/weten.d.ts +0 -3
  2145. package/devices/weten.d.ts.map +0 -1
  2146. package/devices/weten.js +0 -88
  2147. package/devices/wirenboard.d.ts +0 -3
  2148. package/devices/wirenboard.d.ts.map +0 -1
  2149. package/devices/wirenboard.js +0 -666
  2150. package/devices/wirenboard.js.map +0 -1
  2151. package/devices/wisdom.d.ts +0 -3
  2152. package/devices/wisdom.d.ts.map +0 -1
  2153. package/devices/wisdom.js +0 -47
  2154. package/devices/woolley.d.ts +0 -3
  2155. package/devices/woolley.d.ts.map +0 -1
  2156. package/devices/woolley.js +0 -87
  2157. package/devices/woox.d.ts +0 -3
  2158. package/devices/woox.d.ts.map +0 -1
  2159. package/devices/woox.js +0 -132
  2160. package/devices/wyze.d.ts +0 -3
  2161. package/devices/wyze.d.ts.map +0 -1
  2162. package/devices/wyze.js +0 -62
  2163. package/devices/xal.d.ts +0 -3
  2164. package/devices/xal.d.ts.map +0 -1
  2165. package/devices/xal.js +0 -61
  2166. package/devices/xinghuoyuan.d.ts +0 -3
  2167. package/devices/xinghuoyuan.d.ts.map +0 -1
  2168. package/devices/xinghuoyuan.js +0 -47
  2169. package/devices/xyzroe.d.ts +0 -3
  2170. package/devices/xyzroe.d.ts.map +0 -1
  2171. package/devices/xyzroe.js +0 -518
  2172. package/devices/xyzroe.js.map +0 -1
  2173. package/devices/yale.d.ts +0 -3
  2174. package/devices/yale.d.ts.map +0 -1
  2175. package/devices/yale.js +0 -502
  2176. package/devices/yale.js.map +0 -1
  2177. package/devices/yandex.d.ts +0 -3
  2178. package/devices/yandex.d.ts.map +0 -1
  2179. package/devices/yandex.js +0 -442
  2180. package/devices/yandex.js.map +0 -1
  2181. package/devices/ynoa.d.ts +0 -3
  2182. package/devices/ynoa.d.ts.map +0 -1
  2183. package/devices/ynoa.js +0 -112
  2184. package/devices/yokis.d.ts +0 -3
  2185. package/devices/yokis.d.ts.map +0 -1
  2186. package/devices/yokis.js +0 -2532
  2187. package/devices/yokis.js.map +0 -1
  2188. package/devices/yookee.d.ts +0 -3
  2189. package/devices/yookee.d.ts.map +0 -1
  2190. package/devices/yookee.js +0 -62
  2191. package/devices/ysrsai.d.ts +0 -3
  2192. package/devices/ysrsai.d.ts.map +0 -1
  2193. package/devices/ysrsai.js +0 -65
  2194. package/devices/zemismart.d.ts +0 -3
  2195. package/devices/zemismart.d.ts.map +0 -1
  2196. package/devices/zemismart.js +0 -391
  2197. package/devices/zen.d.ts +0 -3
  2198. package/devices/zen.d.ts.map +0 -1
  2199. package/devices/zen.js +0 -95
  2200. package/devices/zigbeetlc.js +0 -235
  2201. package/devices/zipato.d.ts +0 -3
  2202. package/devices/zipato.d.ts.map +0 -1
  2203. package/devices/zipato.js +0 -47
  2204. package/index.d.ts +0 -20
  2205. package/index.d.ts.map +0 -1
  2206. package/index.js +0 -526
  2207. package/index.js.map +0 -1
  2208. package/lib/color.d.ts +0 -271
  2209. package/lib/color.d.ts.map +0 -1
  2210. package/lib/color.js +0 -761
  2211. package/lib/color.js.map +0 -1
  2212. package/lib/configureKey.d.ts +0 -3
  2213. package/lib/configureKey.d.ts.map +0 -1
  2214. package/lib/configureKey.js +0 -938
  2215. package/lib/configureKey.js.map +0 -1
  2216. package/lib/constants.d.ts +0 -68
  2217. package/lib/constants.d.ts.map +0 -1
  2218. package/lib/constants.js +0 -264
  2219. package/lib/constants.js.map +0 -1
  2220. package/lib/develco.d.ts +0 -15
  2221. package/lib/develco.d.ts.map +0 -1
  2222. package/lib/develco.js +0 -183
  2223. package/lib/develco.js.map +0 -1
  2224. package/lib/ewelink.d.ts +0 -30
  2225. package/lib/ewelink.d.ts.map +0 -1
  2226. package/lib/ewelink.js +0 -718
  2227. package/lib/ewelink.js.map +0 -1
  2228. package/lib/exposes.d.ts +0 -360
  2229. package/lib/exposes.d.ts.map +0 -1
  2230. package/lib/exposes.js +0 -1085
  2231. package/lib/exposes.js.map +0 -1
  2232. package/lib/generateDefinition.d.ts +0 -6
  2233. package/lib/generateDefinition.d.ts.map +0 -1
  2234. package/lib/generateDefinition.js +0 -345
  2235. package/lib/generateDefinition.js.map +0 -1
  2236. package/lib/ikea.d.ts +0 -39
  2237. package/lib/ikea.d.ts.map +0 -1
  2238. package/lib/ikea.js +0 -787
  2239. package/lib/ikea.js.map +0 -1
  2240. package/lib/kelvinToXy.js +0 -1913
  2241. package/lib/kelvinToXy.js.map +0 -1
  2242. package/lib/ledvance.d.ts +0 -20
  2243. package/lib/ledvance.d.ts.map +0 -1
  2244. package/lib/ledvance.js +0 -103
  2245. package/lib/ledvance.js.map +0 -1
  2246. package/lib/legacy.d.ts +0 -5054
  2247. package/lib/legacy.d.ts.map +0 -1
  2248. package/lib/legacy.js +0 -6540
  2249. package/lib/legacy.js.map +0 -1
  2250. package/lib/legrand.d.ts +0 -69
  2251. package/lib/legrand.d.ts.map +0 -1
  2252. package/lib/legrand.js +0 -282
  2253. package/lib/legrand.js.map +0 -1
  2254. package/lib/light.d.ts +0 -8
  2255. package/lib/light.d.ts.map +0 -1
  2256. package/lib/light.js +0 -142
  2257. package/lib/light.js.map +0 -1
  2258. package/lib/logger.d.ts +0 -4
  2259. package/lib/logger.d.ts.map +0 -1
  2260. package/lib/logger.js +0 -14
  2261. package/lib/lumi.d.ts +0 -962
  2262. package/lib/lumi.d.ts.map +0 -1
  2263. package/lib/lumi.js +0 -5027
  2264. package/lib/lumi.js.map +0 -1
  2265. package/lib/modernExtend.d.ts +0 -325
  2266. package/lib/modernExtend.d.ts.map +0 -1
  2267. package/lib/modernExtend.js +0 -2015
  2268. package/lib/modernExtend.js.map +0 -1
  2269. package/lib/namron.d.ts +0 -56
  2270. package/lib/namron.d.ts.map +0 -1
  2271. package/lib/namron.js +0 -434
  2272. package/lib/namron.js.map +0 -1
  2273. package/lib/nodon.d.ts +0 -3
  2274. package/lib/nodon.d.ts.map +0 -1
  2275. package/lib/nodon.js +0 -130
  2276. package/lib/nodon.js.map +0 -1
  2277. package/lib/ota.d.ts +0 -71
  2278. package/lib/ota.d.ts.map +0 -1
  2279. package/lib/ota.js +0 -663
  2280. package/lib/ota.js.map +0 -1
  2281. package/lib/philips.d.ts +0 -249
  2282. package/lib/philips.d.ts.map +0 -1
  2283. package/lib/philips.js +0 -656
  2284. package/lib/philips.js.map +0 -1
  2285. package/lib/reporting.d.ts +0 -58
  2286. package/lib/reporting.d.ts.map +0 -1
  2287. package/lib/reporting.js +0 -285
  2288. package/lib/store.d.ts +0 -7
  2289. package/lib/store.d.ts.map +0 -1
  2290. package/lib/store.js +0 -51
  2291. package/lib/store.js.map +0 -1
  2292. package/lib/sunricher.d.ts +0 -13
  2293. package/lib/sunricher.d.ts.map +0 -1
  2294. package/lib/sunricher.js +0 -14
  2295. package/lib/tuya.d.ts +0 -786
  2296. package/lib/tuya.d.ts.map +0 -1
  2297. package/lib/tuya.js +0 -2415
  2298. package/lib/tuya.js.map +0 -1
  2299. package/lib/types.d.ts +0 -439
  2300. package/lib/types.d.ts.map +0 -1
  2301. package/lib/ubisys.d.ts +0 -19
  2302. package/lib/ubisys.d.ts.map +0 -1
  2303. package/lib/ubisys.js +0 -293
  2304. package/lib/ubisys.js.map +0 -1
  2305. package/lib/utils.d.ts +0 -93
  2306. package/lib/utils.d.ts.map +0 -1
  2307. package/lib/utils.js +0 -754
  2308. package/lib/utils.js.map +0 -1
  2309. package/lib/zosung.d.ts +0 -52
  2310. package/lib/zosung.d.ts.map +0 -1
  2311. package/lib/zosung.js +0 -253
  2312. package/lib/zosung.js.map +0 -1
  2313. package/models-index.json +0 -1
  2314. /package/{devices → dist/devices}/ITCommander.js.map +0 -0
  2315. /package/{devices → dist/devices}/acova.js.map +0 -0
  2316. /package/{devices → dist/devices}/acuity_brands_lighting.js.map +0 -0
  2317. /package/{devices → dist/devices}/adurosmart.js.map +0 -0
  2318. /package/{devices → dist/devices}/aeotec.js.map +0 -0
  2319. /package/{devices → dist/devices}/airam.js.map +0 -0
  2320. /package/{devices → dist/devices}/airzone_aidoo.js.map +0 -0
  2321. /package/{devices → dist/devices}/ajax_online.js.map +0 -0
  2322. /package/{devices → dist/devices}/akuvox.js.map +0 -0
  2323. /package/{devices → dist/devices}/alchemy.js.map +0 -0
  2324. /package/{devices → dist/devices}/aldi.js.map +0 -0
  2325. /package/{devices → dist/devices}/alecto.js.map +0 -0
  2326. /package/{devices → dist/devices}/anchor.js.map +0 -0
  2327. /package/{devices → dist/devices}/atsmart.js.map +0 -0
  2328. /package/{devices → dist/devices}/aubess.js.map +0 -0
  2329. /package/{devices → dist/devices}/aurora_lighting.js.map +0 -0
  2330. /package/{devices → dist/devices}/automaton.js.map +0 -0
  2331. /package/{devices → dist/devices}/awox.js.map +0 -0
  2332. /package/{devices → dist/devices}/axis.js.map +0 -0
  2333. /package/{devices → dist/devices}/bankamp.js.map +0 -0
  2334. /package/{devices → dist/devices}/bega.js.map +0 -0
  2335. /package/{devices → dist/devices}/belkin.js.map +0 -0
  2336. /package/{devices → dist/devices}/bituo_technik.js.map +0 -0
  2337. /package/{devices → dist/devices}/blaupunkt.js.map +0 -0
  2338. /package/{devices → dist/devices}/blitzwolf.js.map +0 -0
  2339. /package/{devices → dist/devices}/bouffalo_lab.js.map +0 -0
  2340. /package/{devices → dist/devices}/brimate.js.map +0 -0
  2341. /package/{devices → dist/devices}/bseed.js.map +0 -0
  2342. /package/{devices → dist/devices}/bticino.js.map +0 -0
  2343. /package/{devices → dist/devices}/byun.js.map +0 -0
  2344. /package/{devices → dist/devices}/calex.js.map +0 -0
  2345. /package/{devices → dist/devices}/candeo.js.map +0 -0
  2346. /package/{devices → dist/devices}/casaia.js.map +0 -0
  2347. /package/{devices → dist/devices}/cel.js.map +0 -0
  2348. /package/{devices → dist/devices}/chacon.js.map +0 -0
  2349. /package/{devices → dist/devices}/cleode.js.map +0 -0
  2350. /package/{devices → dist/devices}/cleverio.js.map +0 -0
  2351. /package/{devices → dist/devices}/climax.js.map +0 -0
  2352. /package/{devices → dist/devices}/commercial_electric.js.map +0 -0
  2353. /package/{devices → dist/devices}/cree.js.map +0 -0
  2354. /package/{devices → dist/devices}/current_products_corp.js.map +0 -0
  2355. /package/{devices → dist/devices}/cy_lighting.js.map +0 -0
  2356. /package/{devices → dist/devices}/danalock.js.map +0 -0
  2357. /package/{devices → dist/devices}/databyte.js.map +0 -0
  2358. /package/{devices → dist/devices}/dawon_dns.js.map +0 -0
  2359. /package/{devices → dist/devices}/digi.js.map +0 -0
  2360. /package/{devices → dist/devices}/direct_signs.js.map +0 -0
  2361. /package/{devices → dist/devices}/diyruz.js.map +0 -0
  2362. /package/{devices → dist/devices}/dlink.js.map +0 -0
  2363. /package/{devices → dist/devices}/dnake.js.map +0 -0
  2364. /package/{devices → dist/devices}/dowsing_reynolds.js.map +0 -0
  2365. /package/{devices → dist/devices}/dresden_elektronik.js.map +0 -0
  2366. /package/{devices → dist/devices}/easyaccess.js.map +0 -0
  2367. /package/{devices → dist/devices}/eatonhalo_led.js.map +0 -0
  2368. /package/{devices → dist/devices}/echostar.js.map +0 -0
  2369. /package/{devices → dist/devices}/ecodim.js.map +0 -0
  2370. /package/{devices → dist/devices}/ecolink.js.map +0 -0
  2371. /package/{devices → dist/devices}/ecosmart.js.map +0 -0
  2372. /package/{devices → dist/devices}/ecozy.js.map +0 -0
  2373. /package/{devices → dist/devices}/edp.js.map +0 -0
  2374. /package/{devices → dist/devices}/efekta.js.map +0 -0
  2375. /package/{devices → dist/devices}/eglo.js.map +0 -0
  2376. /package/{devices → dist/devices}/elko.js.map +0 -0
  2377. /package/{devices → dist/devices}/enbrighten.js.map +0 -0
  2378. /package/{devices → dist/devices}/enocean.js.map +0 -0
  2379. /package/{devices → dist/devices}/envilar.js.map +0 -0
  2380. /package/{devices → dist/devices}/essentialb.js.map +0 -0
  2381. /package/{devices → dist/devices}/essentials.js.map +0 -0
  2382. /package/{devices → dist/devices}/eucontrols.js.map +0 -0
  2383. /package/{devices → dist/devices}/eurotronic.js.map +0 -0
  2384. /package/{devices → dist/devices}/evanell.js.map +0 -0
  2385. /package/{devices → dist/devices}/evn.js.map +0 -0
  2386. /package/{devices → dist/devices}/evology.js.map +0 -0
  2387. /package/{devices → dist/devices}/evvr.js.map +0 -0
  2388. /package/{devices → dist/devices}/ezex.js.map +0 -0
  2389. /package/{devices → dist/devices}/fireangel.js.map +0 -0
  2390. /package/{devices → dist/devices}/frankever.js.map +0 -0
  2391. /package/{devices → dist/devices}/frient.js.map +0 -0
  2392. /package/{devices → dist/devices}/futurehome.js.map +0 -0
  2393. /package/{devices → dist/devices}/ge.js.map +0 -0
  2394. /package/{devices → dist/devices}/gewiss.js.map +0 -0
  2395. /package/{devices → dist/devices}/gidealed.js.map +0 -0
  2396. /package/{devices → dist/devices}/giderwel.js.map +0 -0
  2397. /package/{devices → dist/devices}/giex.js.map +0 -0
  2398. /package/{devices → dist/devices}/girier.js.map +0 -0
  2399. /package/{devices → dist/devices}/gmy.js.map +0 -0
  2400. /package/{devices → dist/devices}/gs.js.map +0 -0
  2401. /package/{devices → dist/devices}/gumax.js.map +0 -0
  2402. /package/{devices → dist/devices}/halemeier.js.map +0 -0
  2403. /package/{devices → dist/devices}/hampton_bay.js.map +0 -0
  2404. /package/{devices → dist/devices}/heatit.js.map +0 -0
  2405. /package/{devices → dist/devices}/heiman.js.map +0 -0
  2406. /package/{devices → dist/devices}/heimgard_technologies.js.map +0 -0
  2407. /package/{devices → dist/devices}/hej.js.map +0 -0
  2408. /package/{devices → dist/devices}/hfh.js.map +0 -0
  2409. /package/{devices → dist/devices}/hilux.js.map +0 -0
  2410. /package/{devices → dist/devices}/hive.js.map +0 -0
  2411. /package/{devices → dist/devices}/hommyn.js.map +0 -0
  2412. /package/{devices → dist/devices}/honyar.js.map +0 -0
  2413. /package/{devices → dist/devices}/hornbach.js.map +0 -0
  2414. /package/{devices → dist/devices}/hzc_electric.js.map +0 -0
  2415. /package/{devices → dist/devices}/icasa.js.map +0 -0
  2416. /package/{devices → dist/devices}/idinio.js.map +0 -0
  2417. /package/{devices → dist/devices}/ihorn.js.map +0 -0
  2418. /package/{devices → dist/devices}/ikea.js.map +0 -0
  2419. /package/{devices → dist/devices}/ilightsin.js.map +0 -0
  2420. /package/{devices → dist/devices}/iluminize.js.map +0 -0
  2421. /package/{devices → dist/devices}/ilux.js.map +0 -0
  2422. /package/{devices → dist/devices}/imhotepcreation.js.map +0 -0
  2423. /package/{devices → dist/devices}/immax.js.map +0 -0
  2424. /package/{devices → dist/devices}/imou.js.map +0 -0
  2425. /package/{devices → dist/devices}/index.d.ts +0 -0
  2426. /package/{devices → dist/devices}/index.d.ts.map +0 -0
  2427. /package/{devices → dist/devices}/innr.js.map +0 -0
  2428. /package/{devices → dist/devices}/insta.js.map +0 -0
  2429. /package/{devices → dist/devices}/iolloi.js.map +0 -0
  2430. /package/{devices → dist/devices}/iotperfect.js.map +0 -0
  2431. /package/{devices → dist/devices}/iris.js.map +0 -0
  2432. /package/{devices → dist/devices}/istar.js.map +0 -0
  2433. /package/{devices → dist/devices}/jasco.js.map +0 -0
  2434. /package/{devices → dist/devices}/javis.js.map +0 -0
  2435. /package/{devices → dist/devices}/jiawen.js.map +0 -0
  2436. /package/{devices → dist/devices}/jumitech.js.map +0 -0
  2437. /package/{devices → dist/devices}/jxuan.js.map +0 -0
  2438. /package/{devices → dist/devices}/kami.js.map +0 -0
  2439. /package/{devices → dist/devices}/keen_home.js.map +0 -0
  2440. /package/{devices → dist/devices}/klikaanklikuit.js.map +0 -0
  2441. /package/{devices → dist/devices}/konke.js.map +0 -0
  2442. /package/{devices → dist/devices}/ksentry.js.map +0 -0
  2443. /package/{devices → dist/devices}/kurvia.js.map +0 -0
  2444. /package/{devices → dist/devices}/kwikset.js.map +0 -0
  2445. /package/{devices → dist/devices}/lanesto.js.map +0 -0
  2446. /package/{devices → dist/devices}/lds.js.map +0 -0
  2447. /package/{devices → dist/devices}/ledvance.js.map +0 -0
  2448. /package/{devices → dist/devices}/leedarson.js.map +0 -0
  2449. /package/{devices → dist/devices}/legrand.js.map +0 -0
  2450. /package/{devices → dist/devices}/lellki.js.map +0 -0
  2451. /package/{devices → dist/devices}/letsled.js.map +0 -0
  2452. /package/{devices → dist/devices}/letv.js.map +0 -0
  2453. /package/{devices → dist/devices}/lg.js.map +0 -0
  2454. /package/{devices → dist/devices}/lightsolutions.js.map +0 -0
  2455. /package/{devices → dist/devices}/linkind.js.map +0 -0
  2456. /package/{devices → dist/devices}/livingwise.js.map +0 -0
  2457. /package/{devices → dist/devices}/lonsonho.js.map +0 -0
  2458. /package/{devices → dist/devices}/ls.js.map +0 -0
  2459. /package/{devices → dist/devices}/lubeez.js.map +0 -0
  2460. /package/{devices → dist/devices}/lupus.js.map +0 -0
  2461. /package/{devices → dist/devices}/lutron.js.map +0 -0
  2462. /package/{devices → dist/devices}/lux.js.map +0 -0
  2463. /package/{devices → dist/devices}/m_elec.js.map +0 -0
  2464. /package/{devices → dist/devices}/makegood.js.map +0 -0
  2465. /package/{devices → dist/devices}/matcall_bv.js.map +0 -0
  2466. /package/{devices → dist/devices}/mercator.js.map +0 -0
  2467. /package/{devices → dist/devices}/miboxer.js.map +0 -0
  2468. /package/{devices → dist/devices}/micromatic.js.map +0 -0
  2469. /package/{devices → dist/devices}/modular.js.map +0 -0
  2470. /package/{devices → dist/devices}/moes.js.map +0 -0
  2471. /package/{devices → dist/devices}/muller_licht.js.map +0 -0
  2472. /package/{devices → dist/devices}/nanoleaf.js.map +0 -0
  2473. /package/{devices → dist/devices}/nedis.js.map +0 -0
  2474. /package/{devices → dist/devices}/net2grid.js.map +0 -0
  2475. /package/{devices → dist/devices}/netvox.js.map +0 -0
  2476. /package/{devices → dist/devices}/nexelec.js.map +0 -0
  2477. /package/{devices → dist/devices}/ninja_blocks.js.map +0 -0
  2478. /package/{devices → dist/devices}/niviss.js.map +0 -0
  2479. /package/{devices → dist/devices}/nodon.js.map +0 -0
  2480. /package/{devices → dist/devices}/nordtronic.js.map +0 -0
  2481. /package/{devices → dist/devices}/nous.js.map +0 -0
  2482. /package/{devices → dist/devices}/novo.js.map +0 -0
  2483. /package/{devices → dist/devices}/nyce.js.map +0 -0
  2484. /package/{devices → dist/devices}/onenuo.js.map +0 -0
  2485. /package/{devices → dist/devices}/openlumi.js.map +0 -0
  2486. /package/{devices → dist/devices}/osram.js.map +0 -0
  2487. /package/{devices → dist/devices}/oujiabao.js.map +0 -0
  2488. /package/{devices → dist/devices}/ozsmartthings.js.map +0 -0
  2489. /package/{devices → dist/devices}/paul_neuhaus.js.map +0 -0
  2490. /package/{devices → dist/devices}/paulmann.js.map +0 -0
  2491. /package/{devices → dist/devices}/peq.js.map +0 -0
  2492. /package/{devices → dist/devices}/philio.js.map +0 -0
  2493. /package/{devices → dist/devices}/plaid.js.map +0 -0
  2494. /package/{devices → dist/devices}/prolight.js.map +0 -0
  2495. /package/{devices → dist/devices}/purmo.js.map +0 -0
  2496. /package/{devices → dist/devices}/qa.js.map +0 -0
  2497. /package/{devices → dist/devices}/qmotion.js.map +0 -0
  2498. /package/{devices → dist/devices}/qoto.js.map +0 -0
  2499. /package/{devices → dist/devices}/quotra.js.map +0 -0
  2500. /package/{devices → dist/devices}/rademacher.js.map +0 -0
  2501. /package/{devices → dist/devices}/radium.js.map +0 -0
  2502. /package/{devices → dist/devices}/raex.js.map +0 -0
  2503. /package/{devices → dist/devices}/rgb_genie.js.map +0 -0
  2504. /package/{devices → dist/devices}/robb.js.map +0 -0
  2505. /package/{devices → dist/devices}/roome.js.map +0 -0
  2506. /package/{devices → dist/devices}/rtx.js.map +0 -0
  2507. /package/{devices → dist/devices}/salus_controls.js.map +0 -0
  2508. /package/{devices → dist/devices}/samotech.js.map +0 -0
  2509. /package/{devices → dist/devices}/saswell.js.map +0 -0
  2510. /package/{devices → dist/devices}/sber.js.map +0 -0
  2511. /package/{devices → dist/devices}/scanproducts.js.map +0 -0
  2512. /package/{devices → dist/devices}/schlage.js.map +0 -0
  2513. /package/{devices → dist/devices}/schwaiger.js.map +0 -0
  2514. /package/{devices → dist/devices}/seastar_intelligence.js.map +0 -0
  2515. /package/{devices → dist/devices}/securifi.js.map +0 -0
  2516. /package/{devices → dist/devices}/sercomm.js.map +0 -0
  2517. /package/{devices → dist/devices}/shade_control.js.map +0 -0
  2518. /package/{devices → dist/devices}/shenzhen_homa.js.map +0 -0
  2519. /package/{devices → dist/devices}/shyugj.js.map +0 -0
  2520. /package/{devices → dist/devices}/sikom.js.map +0 -0
  2521. /package/{devices → dist/devices}/simon.js.map +0 -0
  2522. /package/{devices → dist/devices}/siterwell.js.map +0 -0
  2523. /package/{devices → dist/devices}/skydance.js.map +0 -0
  2524. /package/{devices → dist/devices}/slv.js.map +0 -0
  2525. /package/{devices → dist/devices}/smart9.js.map +0 -0
  2526. /package/{devices → dist/devices}/smart_home_pty.js.map +0 -0
  2527. /package/{devices → dist/devices}/smartenit.js.map +0 -0
  2528. /package/{devices → dist/devices}/smartwings.js.map +0 -0
  2529. /package/{devices → dist/devices}/smlight.js.map +0 -0
  2530. /package/{devices → dist/devices}/sohan_electric.js.map +0 -0
  2531. /package/{devices → dist/devices}/solaredge.js.map +0 -0
  2532. /package/{devices → dist/devices}/soma.js.map +0 -0
  2533. /package/{devices → dist/devices}/somfy.js.map +0 -0
  2534. /package/{devices → dist/devices}/somgoms.js.map +0 -0
  2535. /package/{devices → dist/devices}/sowilo.js.map +0 -0
  2536. /package/{devices → dist/devices}/spotmau.js.map +0 -0
  2537. /package/{devices → dist/devices}/swann.js.map +0 -0
  2538. /package/{devices → dist/devices}/sylvania.js.map +0 -0
  2539. /package/{devices → dist/devices}/tapestry.js.map +0 -0
  2540. /package/{devices → dist/devices}/tci.js.map +0 -0
  2541. /package/{devices → dist/devices}/technicolor.js.map +0 -0
  2542. /package/{devices → dist/devices}/terncy.js.map +0 -0
  2543. /package/{devices → dist/devices}/the_light_group.js.map +0 -0
  2544. /package/{devices → dist/devices}/titan_products.js.map +0 -0
  2545. /package/{devices → dist/devices}/tlwglobal.js.map +0 -0
  2546. /package/{devices → dist/devices}/tplink.js.map +0 -0
  2547. /package/{devices → dist/devices}/trust.js.map +0 -0
  2548. /package/{devices → dist/devices}/tubeszb.js.map +0 -0
  2549. /package/{devices → dist/devices}/uhome.js.map +0 -0
  2550. /package/{devices → dist/devices}/universal_electronics_inc.js.map +0 -0
  2551. /package/{devices → dist/devices}/vbled.js.map +0 -0
  2552. /package/{devices → dist/devices}/viessmann.js.map +0 -0
  2553. /package/{devices → dist/devices}/villeroy_boch.js.map +0 -0
  2554. /package/{devices → dist/devices}/vimar.js.map +0 -0
  2555. /package/{devices → dist/devices}/visonic.js.map +0 -0
  2556. /package/{devices → dist/devices}/vrey.js.map +0 -0
  2557. /package/{devices → dist/devices}/wally.js.map +0 -0
  2558. /package/{devices → dist/devices}/waxman.js.map +0 -0
  2559. /package/{devices → dist/devices}/weten.js.map +0 -0
  2560. /package/{devices → dist/devices}/wisdom.js.map +0 -0
  2561. /package/{devices → dist/devices}/woolley.js.map +0 -0
  2562. /package/{devices → dist/devices}/woox.js.map +0 -0
  2563. /package/{devices → dist/devices}/wyze.js.map +0 -0
  2564. /package/{devices → dist/devices}/xal.js.map +0 -0
  2565. /package/{devices → dist/devices}/xinghuoyuan.js.map +0 -0
  2566. /package/{devices → dist/devices}/ynoa.js.map +0 -0
  2567. /package/{devices → dist/devices}/yookee.js.map +0 -0
  2568. /package/{devices → dist/devices}/ysrsai.js.map +0 -0
  2569. /package/{devices → dist/devices}/zemismart.js.map +0 -0
  2570. /package/{devices → dist/devices}/zen.js.map +0 -0
  2571. /package/{devices → dist/devices}/zigbeetlc.d.ts +0 -0
  2572. /package/{devices → dist/devices}/zigbeetlc.d.ts.map +0 -0
  2573. /package/{devices → dist/devices}/zigbeetlc.js.map +0 -0
  2574. /package/{devices → dist/devices}/zipato.js.map +0 -0
  2575. /package/{lib → dist/lib}/kelvinToXy.d.ts +0 -0
  2576. /package/{lib → dist/lib}/kelvinToXy.d.ts.map +0 -0
  2577. /package/{lib → dist/lib}/logger.js.map +0 -0
  2578. /package/{lib → dist/lib}/reporting.js.map +0 -0
  2579. /package/{lib → dist/lib}/sunricher.js.map +0 -0
  2580. /package/{lib → dist/lib}/types.js +0 -0
  2581. /package/{lib → dist/lib}/types.js.map +0 -0
@@ -0,0 +1,4418 @@
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
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ const zigbee_herdsman_1 = require("zigbee-herdsman");
37
+ const libColor = __importStar(require("../lib/color"));
38
+ const constants = __importStar(require("../lib/constants"));
39
+ const exposes = __importStar(require("../lib/exposes"));
40
+ const legacy = __importStar(require("../lib/legacy"));
41
+ const light = __importStar(require("../lib/light"));
42
+ const logger_1 = require("../lib/logger");
43
+ const modernExtend_1 = require("../lib/modernExtend");
44
+ const globalStore = __importStar(require("../lib/store"));
45
+ const utils = __importStar(require("../lib/utils"));
46
+ const NS = "zhc:tz";
47
+ const manufacturerOptions = {
48
+ sunricher: { manufacturerCode: zigbee_herdsman_1.Zcl.ManufacturerCode.SHENZHEN_SUNRICHER_TECHNOLOGY_LTD },
49
+ lumi: { manufacturerCode: zigbee_herdsman_1.Zcl.ManufacturerCode.LUMI_UNITED_TECHOLOGY_LTD_SHENZHEN, disableDefaultResponse: true },
50
+ eurotronic: { manufacturerCode: zigbee_herdsman_1.Zcl.ManufacturerCode.NXP_SEMICONDUCTORS },
51
+ danfoss: { manufacturerCode: zigbee_herdsman_1.Zcl.ManufacturerCode.DANFOSS_A_S },
52
+ hue: { manufacturerCode: zigbee_herdsman_1.Zcl.ManufacturerCode.SIGNIFY_NETHERLANDS_B_V },
53
+ ikea: { manufacturerCode: zigbee_herdsman_1.Zcl.ManufacturerCode.IKEA_OF_SWEDEN },
54
+ sinope: { manufacturerCode: zigbee_herdsman_1.Zcl.ManufacturerCode.SINOPE_TECHNOLOGIES },
55
+ tint: { manufacturerCode: zigbee_herdsman_1.Zcl.ManufacturerCode.MUELLER_LICHT_INTERNATIONAL_INC },
56
+ legrand: { manufacturerCode: zigbee_herdsman_1.Zcl.ManufacturerCode.LEGRAND_GROUP, disableDefaultResponse: true },
57
+ viessmann: { manufacturerCode: zigbee_herdsman_1.Zcl.ManufacturerCode.VIESSMANN_ELEKTRONIK_GMBH },
58
+ };
59
+ const converters1 = {
60
+ on_off: {
61
+ key: ["state", "on_time", "off_wait_time"],
62
+ convertSet: async (entity, key, value, meta) => {
63
+ const state = utils.isString(meta.message.state) ? meta.message.state.toLowerCase() : null;
64
+ utils.validateValue(state, ["toggle", "off", "on"]);
65
+ if (state === "on" && (meta.message.on_time !== undefined || meta.message.off_wait_time !== undefined)) {
66
+ const onTime = meta.message.on_time !== undefined ? meta.message.on_time : 0;
67
+ const offWaitTime = meta.message.off_wait_time !== undefined ? meta.message.off_wait_time : 0;
68
+ if (typeof onTime !== "number") {
69
+ throw Error("The on_time value must be a number!");
70
+ }
71
+ if (typeof offWaitTime !== "number") {
72
+ throw Error("The off_wait_time value must be a number!");
73
+ }
74
+ const payload = { ctrlbits: 0, ontime: Math.round(onTime * 10), offwaittime: Math.round(offWaitTime * 10) };
75
+ await entity.command("genOnOff", "onWithTimedOff", payload, utils.getOptions(meta.mapped, entity));
76
+ }
77
+ else {
78
+ await entity.command("genOnOff", state, {}, utils.getOptions(meta.mapped, entity));
79
+ if (state === "toggle") {
80
+ const currentState = meta.state[`state${meta.endpoint_name ? `_${meta.endpoint_name}` : ""}`];
81
+ return currentState ? { state: { state: currentState === "OFF" ? "ON" : "OFF" } } : {};
82
+ }
83
+ return { state: { state: state.toUpperCase() } };
84
+ }
85
+ },
86
+ convertGet: async (entity, key, meta) => {
87
+ await entity.read("genOnOff", ["onOff"]);
88
+ },
89
+ },
90
+ light_color: {
91
+ key: ["color"],
92
+ options: [exposes.options.color_sync(), exposes.options.transition()],
93
+ convertSet: async (entity, key, value, meta) => {
94
+ let command;
95
+ const newColor = libColor.Color.fromConverterArg(value);
96
+ const newState = {};
97
+ const zclData = { transtime: utils.getTransition(entity, key, meta).time };
98
+ const supportsHueAndSaturation = utils.getMetaValue(entity, meta.mapped, "supportsHueAndSaturation", "allEqual", true);
99
+ const supportsEnhancedHue = utils.getMetaValue(entity, meta.mapped, "supportsEnhancedHue", "allEqual", true);
100
+ if (newColor.isHSV() && !supportsHueAndSaturation) {
101
+ // The color we got is HSV but the bulb does not support Hue/Saturation mode
102
+ throw new Error("This light does not support Hue/Saturation, please use X/Y instead.");
103
+ }
104
+ if (newColor.isRGB() || newColor.isXY()) {
105
+ // Convert RGB to XY color mode because Zigbee doesn't support RGB (only x/y and hue/saturation)
106
+ const xy = newColor.isRGB() ? newColor.rgb.gammaCorrected().toXY().rounded(4) : newColor.xy;
107
+ // Some bulbs e.g. RB 185 C don't turn to red (they don't respond at all) when x: 0.701 and y: 0.299
108
+ // is send. These values are e.g. send by Home Assistant when clicking red in the color wheel.
109
+ // If we slightly modify these values the bulb will respond.
110
+ // https://github.com/home-assistant/home-assistant/issues/31094
111
+ if (utils.getMetaValue(entity, meta.mapped, "applyRedFix", "allEqual", false) && xy.x === 0.701 && xy.y === 0.299) {
112
+ xy.x = 0.7006;
113
+ xy.y = 0.2993;
114
+ }
115
+ newState.color_mode = constants.colorModeLookup[1];
116
+ newState.color = xy.toObject();
117
+ zclData.colorx = utils.mapNumberRange(xy.x, 0, 1, 0, 65535);
118
+ zclData.colory = utils.mapNumberRange(xy.y, 0, 1, 0, 65535);
119
+ command = "moveToColor";
120
+ }
121
+ else if (newColor.isHSV()) {
122
+ const hsv = newColor.hsv;
123
+ const hsvCorrected = hsv.colorCorrected(meta);
124
+ newState.color_mode = constants.colorModeLookup[0];
125
+ newState.color = hsv.toObject(false);
126
+ if (hsv.hue !== null) {
127
+ if (supportsEnhancedHue) {
128
+ zclData.enhancehue = utils.mapNumberRange(hsvCorrected.hue, 0, 360, 0, 65535);
129
+ }
130
+ else {
131
+ zclData.hue = utils.mapNumberRange(hsvCorrected.hue, 0, 360, 0, 254);
132
+ }
133
+ // @ts-expect-error ignore
134
+ zclData.direction = value.direction || 0;
135
+ }
136
+ if (hsv.saturation != null) {
137
+ zclData.saturation = utils.mapNumberRange(hsvCorrected.saturation, 0, 100, 0, 254);
138
+ }
139
+ if (hsv.value !== null) {
140
+ // fallthrough to genLevelCtrl
141
+ // @ts-expect-error ignore
142
+ value.brightness = utils.mapNumberRange(hsvCorrected.value, 0, 100, 0, 254);
143
+ }
144
+ if (hsv.hue !== null && hsv.saturation !== null) {
145
+ if (supportsEnhancedHue) {
146
+ command = "enhancedMoveToHueAndSaturation";
147
+ }
148
+ else {
149
+ command = "moveToHueAndSaturation";
150
+ }
151
+ }
152
+ else if (hsv.hue !== null) {
153
+ if (supportsEnhancedHue) {
154
+ command = "enhancedMoveToHue";
155
+ }
156
+ else {
157
+ command = "moveToHue";
158
+ }
159
+ }
160
+ else if (hsv.saturation !== null) {
161
+ command = "moveToSaturation";
162
+ }
163
+ }
164
+ if (utils.isObject(value) && value.brightness !== undefined) {
165
+ await entity.command("genLevelCtrl", "moveToLevelWithOnOff", { level: Number(value.brightness), transtime: utils.getTransition(entity, key, meta).time }, utils.getOptions(meta.mapped, entity));
166
+ }
167
+ await entity.command("lightingColorCtrl", command, zclData, utils.getOptions(meta.mapped, entity));
168
+ return { state: libColor.syncColorState(newState, meta.state, entity, meta.options) };
169
+ },
170
+ convertGet: async (entity, key, meta) => {
171
+ await entity.read("lightingColorCtrl", light.readColorAttributes(entity, meta));
172
+ },
173
+ },
174
+ light_colortemp: {
175
+ key: ["color_temp", "color_temp_percent"],
176
+ options: [exposes.options.color_sync(), exposes.options.transition()],
177
+ convertSet: async (entity, key, value, meta) => {
178
+ const [colorTempMin, colorTempMax] = light.findColorTempRange(entity);
179
+ const preset = { warmest: colorTempMax, warm: 454, neutral: 370, cool: 250, coolest: colorTempMin };
180
+ if (key === "color_temp_percent") {
181
+ utils.assertNumber(value);
182
+ value = utils
183
+ .mapNumberRange(value, 0, 100, colorTempMin != null ? colorTempMin : 154, colorTempMax != null ? colorTempMax : 500)
184
+ .toString();
185
+ }
186
+ if (utils.isString(value) && value in preset) {
187
+ value = utils.getFromLookup(value, preset);
188
+ }
189
+ value = Number(value);
190
+ // ensure value within range
191
+ utils.assertNumber(value);
192
+ value = light.clampColorTemp(value, colorTempMin, colorTempMax);
193
+ const payload = { colortemp: value, transtime: utils.getTransition(entity, key, meta).time };
194
+ await entity.command("lightingColorCtrl", "moveToColorTemp", payload, utils.getOptions(meta.mapped, entity));
195
+ return {
196
+ state: libColor.syncColorState({ color_mode: constants.colorModeLookup[2], color_temp: value }, meta.state, entity, meta.options),
197
+ };
198
+ },
199
+ convertGet: async (entity, key, meta) => {
200
+ await entity.read("lightingColorCtrl", ["colorMode", "colorTemperature"]);
201
+ },
202
+ },
203
+ };
204
+ const converters2 = {
205
+ // #region Generic converters
206
+ read: {
207
+ key: ["read"],
208
+ convertSet: async (entity, key, value, meta) => {
209
+ utils.assertObject(value, key);
210
+ const result = await entity.read(value.cluster, value.attributes, value.options !== undefined ? value.options : {});
211
+ logger_1.logger.info(`Read result of '${value.cluster}': ${JSON.stringify(result)}`, NS);
212
+ if (value.state_property !== undefined) {
213
+ return { state: { [value.state_property]: result } };
214
+ }
215
+ },
216
+ },
217
+ write: {
218
+ key: ["write"],
219
+ convertSet: async (entity, key, value, meta) => {
220
+ utils.assertObject(value, key);
221
+ const options = utils.getOptions(meta.mapped, entity);
222
+ if (value.options !== undefined) {
223
+ Object.assign(options, value.options);
224
+ }
225
+ await entity.write(value.cluster, value.payload, options);
226
+ logger_1.logger.info(`Wrote '${JSON.stringify(value.payload)}' to '${value.cluster}'`, NS);
227
+ },
228
+ },
229
+ command: {
230
+ key: ["command"],
231
+ convertSet: async (entity, key, value, meta) => {
232
+ utils.assertObject(value, key);
233
+ const options = utils.getOptions(meta.mapped, entity);
234
+ await entity.command(value.cluster, value.command, value.payload !== undefined ? value.payload : {}, options);
235
+ logger_1.logger.info(`Invoked '${value.cluster}.${value.command}' with payload '${JSON.stringify(value.payload)}'`, NS);
236
+ },
237
+ },
238
+ factory_reset: {
239
+ key: ["reset"],
240
+ convertSet: async (entity, key, value, meta) => {
241
+ await entity.command("genBasic", "resetFactDefault", {}, utils.getOptions(meta.mapped, entity));
242
+ },
243
+ },
244
+ identify: {
245
+ key: ["identify"],
246
+ options: [exposes.options.identify_timeout()],
247
+ convertSet: async (entity, key, value, meta) => {
248
+ // External value takes priority over options for compatibility
249
+ const identifyTimeout = value ?? meta.options.identify_timeout ?? 3;
250
+ await entity.command("genIdentify", "identify", { identifytime: identifyTimeout }, utils.getOptions(meta.mapped, entity));
251
+ },
252
+ },
253
+ zcl_command: {
254
+ key: ["zclcommand"],
255
+ convertSet: async (entity, key, value, meta) => {
256
+ utils.assertObject(value, key);
257
+ const payload = value.payload !== undefined ? value.payload : {};
258
+ utils.assertEndpoint(entity);
259
+ await entity.zclCommand(value.cluster, value.command, payload, value.options !== undefined ? value.options : {}, value.log_payload ?? {}, value.check_status ?? false, value.frametype ?? zigbee_herdsman_1.Zcl.FrameType.SPECIFIC);
260
+ if (value.logging ?? false) {
261
+ logger_1.logger.info(`Invoked ZCL command ${value.cluster}.${value.command} with payload '${JSON.stringify(payload)}'`, NS);
262
+ }
263
+ },
264
+ },
265
+ arm_mode: {
266
+ key: ["arm_mode"],
267
+ convertSet: async (entity, key, value, meta) => {
268
+ utils.assertEndpoint(entity);
269
+ utils.assertObject(value, key);
270
+ if (Array.isArray(meta.mapped))
271
+ throw new Error("Not supported for groups");
272
+ const isNotification = value.transaction !== undefined;
273
+ const modeSrc = isNotification ? constants.armNotification : constants.armMode;
274
+ const mode = utils.getKey(modeSrc, value.mode, undefined, Number);
275
+ if (mode === undefined) {
276
+ throw new Error(`Unsupported mode: '${value.mode}', should be one of: ${Object.values(modeSrc)}`);
277
+ }
278
+ if (isNotification) {
279
+ await entity.commandResponse("ssIasAce", "armRsp", { armnotification: mode }, {}, value.transaction);
280
+ // Do not update PanelStatus after confirming transaction.
281
+ // Instead the server should send an arm_mode command with the necessary state.
282
+ // e.g. exit_delay as a result of arm_all_zones
283
+ return;
284
+ }
285
+ let panelStatus = mode;
286
+ if (meta.mapped.model === "3400-D") {
287
+ panelStatus = mode !== 0 && mode !== 4 ? 0x80 : 0x00;
288
+ }
289
+ globalStore.putValue(entity, "panelStatus", panelStatus);
290
+ const payload = { panelstatus: panelStatus, secondsremain: 0, audiblenotif: 0, alarmstatus: 0 };
291
+ await entity.commandResponse("ssIasAce", "panelStatusChanged", payload);
292
+ },
293
+ },
294
+ battery_percentage_remaining: {
295
+ key: ["battery"],
296
+ convertGet: async (entity, key, meta) => {
297
+ await entity.read("genPowerCfg", ["batteryPercentageRemaining"]);
298
+ },
299
+ },
300
+ battery_voltage: {
301
+ key: ["battery", "voltage"],
302
+ convertGet: async (entity, key, meta) => {
303
+ await entity.read("genPowerCfg", ["batteryVoltage"]);
304
+ },
305
+ },
306
+ power_on_behavior: {
307
+ key: ["power_on_behavior"],
308
+ convertSet: async (entity, key, value, meta) => {
309
+ utils.assertString(value, key);
310
+ value = value.toLowerCase();
311
+ const lookup = { off: 0, on: 1, toggle: 2, previous: 255 };
312
+ try {
313
+ await entity.write("genOnOff", { startUpOnOff: utils.getFromLookup(value, lookup) }, utils.getOptions(meta.mapped, entity));
314
+ }
315
+ catch (e) {
316
+ if (e.message.includes("UNSUPPORTED_ATTRIBUTE")) {
317
+ throw new Error("Got `UNSUPPORTED_ATTRIBUTE` error, device does not support power on behaviour");
318
+ }
319
+ throw e;
320
+ }
321
+ return { state: { power_on_behavior: value } };
322
+ },
323
+ convertGet: async (entity, key, meta) => {
324
+ await entity.read("genOnOff", ["startUpOnOff"]);
325
+ },
326
+ },
327
+ light_color_mode: {
328
+ key: ["color_mode"],
329
+ convertGet: async (entity, key, meta) => {
330
+ await entity.read("lightingColorCtrl", ["colorMode"]);
331
+ },
332
+ },
333
+ light_color_options: {
334
+ key: ["color_options"],
335
+ convertSet: async (entity, key, value, meta) => {
336
+ utils.assertObject(value, key);
337
+ const options = value.execute_if_off !== undefined && value.execute_if_off ? 1 : 0;
338
+ await entity.write("lightingColorCtrl", { options }, utils.getOptions(meta.mapped, entity));
339
+ return { state: { color_options: value } };
340
+ },
341
+ convertGet: async (entity, key, meta) => {
342
+ await entity.read("lightingColorCtrl", ["options"]);
343
+ },
344
+ },
345
+ lock: {
346
+ key: ["state"],
347
+ convertSet: async (entity, key, value, meta) => {
348
+ // If no pin code is provided, value is a only string. Ex: "UNLOCK"
349
+ let state = utils.isString(value) ? value.toUpperCase() : null;
350
+ let pincode = "";
351
+ // If pin code is provided, value is an object including new state and code. Ex: {state: "UNLOCK", code: "1234"}
352
+ if (utils.isObject(value)) {
353
+ if (value.code) {
354
+ pincode = utils.isString(value.code) ? value.code : "";
355
+ }
356
+ if (value.state) {
357
+ state = utils.isString(value.state) ? value.state.toUpperCase() : null;
358
+ }
359
+ }
360
+ utils.validateValue(state, ["LOCK", "UNLOCK", "TOGGLE"]);
361
+ await entity.command("closuresDoorLock", `${state.toLowerCase()}Door`, { pincodevalue: pincode }, utils.getOptions(meta.mapped, entity));
362
+ },
363
+ convertGet: async (entity, key, meta) => {
364
+ await entity.read("closuresDoorLock", ["lockState"]);
365
+ },
366
+ },
367
+ lock_auto_relock_time: {
368
+ key: ["auto_relock_time"],
369
+ convertSet: async (entity, key, value, meta) => {
370
+ await entity.write("closuresDoorLock", { autoRelockTime: value }, utils.getOptions(meta.mapped, entity));
371
+ return { state: { auto_relock_time: value } };
372
+ },
373
+ convertGet: async (entity, key, meta) => {
374
+ await entity.read("closuresDoorLock", ["autoRelockTime"]);
375
+ },
376
+ },
377
+ lock_sound_volume: {
378
+ key: ["sound_volume"],
379
+ convertSet: async (entity, key, value, meta) => {
380
+ utils.assertString(value, key);
381
+ utils.validateValue(value, constants.lockSoundVolume);
382
+ await entity.write("closuresDoorLock", { soundVolume: constants.lockSoundVolume.indexOf(value) }, utils.getOptions(meta.mapped, entity));
383
+ return { state: { sound_volume: value } };
384
+ },
385
+ convertGet: async (entity, key, meta) => {
386
+ await entity.read("closuresDoorLock", ["soundVolume"]);
387
+ },
388
+ },
389
+ pincode_lock: {
390
+ key: ["pin_code"],
391
+ convertSet: async (entity, key, value, meta) => {
392
+ utils.assertObject(value, key);
393
+ const user = value.user;
394
+ const userType = value.user_type || "unrestricted";
395
+ const userEnabled = value.user_enabled !== undefined ? value.user_enabled : true;
396
+ const pinCode = value.pin_code;
397
+ if (Number.isNaN(user))
398
+ throw new Error("user must be numbers");
399
+ const pinCodeCount = utils.getMetaValue(entity, meta.mapped, "pinCodeCount");
400
+ if (!utils.isInRange(0, pinCodeCount - 1, user))
401
+ throw new Error("user must be in range for device");
402
+ if (pinCode == null) {
403
+ await entity.command("closuresDoorLock", "clearPinCode", { userid: user }, utils.getOptions(meta.mapped, entity));
404
+ }
405
+ else {
406
+ if (Number.isNaN(pinCode))
407
+ throw new Error("pinCode must be a number");
408
+ const typeLookup = { unrestricted: 0, year_day_schedule: 1, week_day_schedule: 2, master: 3, non_access: 4 };
409
+ const payload = {
410
+ userid: user,
411
+ userstatus: userEnabled ? 1 : 3,
412
+ usertype: utils.getFromLookup(userType, typeLookup),
413
+ pincodevalue: pinCode.toString(),
414
+ };
415
+ await entity.command("closuresDoorLock", "setPinCode", payload, utils.getOptions(meta.mapped, entity));
416
+ }
417
+ },
418
+ convertGet: async (entity, key, meta) => {
419
+ // @ts-expect-error ignore
420
+ const user = meta?.message?.pin_code ? meta.message.pin_code.user : undefined;
421
+ if (user === undefined) {
422
+ const max = utils.getMetaValue(entity, meta.mapped, "pinCodeCount");
423
+ // Get all
424
+ const options = utils.getOptions(meta.mapped, entity);
425
+ for (let i = 0; i < max; i++) {
426
+ await entity.command("closuresDoorLock", "getPinCode", { userid: i }, options);
427
+ }
428
+ }
429
+ else {
430
+ if (Number.isNaN(user)) {
431
+ throw new Error("user must be numbers");
432
+ }
433
+ const pinCodeCount = utils.getMetaValue(entity, meta.mapped, "pinCodeCount");
434
+ if (!utils.isInRange(0, pinCodeCount - 1, user)) {
435
+ throw new Error("userId must be in range for device");
436
+ }
437
+ await entity.command("closuresDoorLock", "getPinCode", { userid: user }, utils.getOptions(meta.mapped, entity));
438
+ }
439
+ },
440
+ },
441
+ lock_userstatus: {
442
+ key: ["user_status"],
443
+ convertSet: async (entity, key, value, meta) => {
444
+ utils.assertObject(value, key);
445
+ const user = value.user;
446
+ if (Number.isNaN(user)) {
447
+ throw new Error("user must be numbers");
448
+ }
449
+ const pinCodeCount = utils.getMetaValue(entity, meta.mapped, "pinCodeCount");
450
+ if (!utils.isInRange(0, pinCodeCount - 1, user)) {
451
+ throw new Error("user must be in range for device");
452
+ }
453
+ const status = utils.getKey(constants.lockUserStatus, value.status, undefined, Number);
454
+ if (status === undefined) {
455
+ throw new Error(`Unsupported status: '${value.status}', should be one of: ${Object.values(constants.lockUserStatus)}`);
456
+ }
457
+ await entity.command("closuresDoorLock", "setUserStatus", {
458
+ userid: user,
459
+ userstatus: status,
460
+ }, utils.getOptions(meta.mapped, entity));
461
+ },
462
+ convertGet: async (entity, key, meta) => {
463
+ // @ts-expect-error ignore
464
+ const user = meta?.message?.user_status ? meta.message.user_status.user : undefined;
465
+ const pinCodeCount = utils.getMetaValue(entity, meta.mapped, "pinCodeCount");
466
+ if (user === undefined) {
467
+ const max = pinCodeCount;
468
+ // Get all
469
+ const options = utils.getOptions(meta.mapped, entity);
470
+ for (let i = 0; i < max; i++) {
471
+ await entity.command("closuresDoorLock", "getUserStatus", { userid: i }, options);
472
+ }
473
+ }
474
+ else {
475
+ if (Number.isNaN(user)) {
476
+ throw new Error("user must be numbers");
477
+ }
478
+ if (!utils.isInRange(0, pinCodeCount - 1, user)) {
479
+ throw new Error("userId must be in range for device");
480
+ }
481
+ await entity.command("closuresDoorLock", "getUserStatus", { userid: user }, utils.getOptions(meta.mapped, entity));
482
+ }
483
+ },
484
+ },
485
+ cover_via_brightness: {
486
+ key: ["position", "state"],
487
+ options: [exposes.options.invert_cover()],
488
+ convertSet: async (entity, key, value, meta) => {
489
+ if (typeof value !== "number") {
490
+ utils.assertString(value, key);
491
+ value = value.toLowerCase();
492
+ if (value === "stop") {
493
+ await entity.command("genLevelCtrl", "stop", {}, utils.getOptions(meta.mapped, entity));
494
+ return;
495
+ }
496
+ const lookup = { open: 100, close: 0 };
497
+ value = utils.getFromLookup(value, lookup);
498
+ }
499
+ const invert = utils.getMetaValue(entity, meta.mapped, "coverInverted", "allEqual", false)
500
+ ? !meta.options.invert_cover
501
+ : meta.options.invert_cover;
502
+ utils.assertNumber(value);
503
+ const position = invert ? 100 - value : value;
504
+ await entity.command("genLevelCtrl", "moveToLevelWithOnOff", { level: utils.mapNumberRange(Number(position), 0, 100, 0, 255).toString(), transtime: 0 }, utils.getOptions(meta.mapped, entity));
505
+ return { state: { position: value } };
506
+ },
507
+ convertGet: async (entity, key, meta) => {
508
+ await entity.read("genLevelCtrl", ["currentLevel"]);
509
+ },
510
+ },
511
+ warning: {
512
+ key: ["warning"],
513
+ convertSet: async (entity, key, value, meta) => {
514
+ const mode = { stop: 0, burglar: 1, fire: 2, emergency: 3, police_panic: 4, fire_panic: 5, emergency_panic: 6 };
515
+ const level = { low: 0, medium: 1, high: 2, very_high: 3 };
516
+ const strobeLevel = { low: 0, medium: 1, high: 2, very_high: 3 };
517
+ const values = {
518
+ // @ts-expect-error ignore
519
+ mode: value.mode || "emergency",
520
+ // @ts-expect-error ignore
521
+ level: value.level || "medium",
522
+ // @ts-expect-error ignore
523
+ strobe: value.strobe !== undefined ? value.strobe : true,
524
+ // @ts-expect-error ignore
525
+ duration: value.duration !== undefined ? value.duration : 10,
526
+ // @ts-expect-error ignore
527
+ strobeDutyCycle: value.strobe_duty_cycle !== undefined ? value.strobe_duty_cycle * 10 : 0,
528
+ // @ts-expect-error ignore
529
+ strobeLevel: value.strobe_level !== undefined ? utils.getFromLookup(value.strobe_level, strobeLevel) : 1,
530
+ };
531
+ let info;
532
+ // https://github.com/Koenkk/zigbee2mqtt/issues/8310 some devices require the info to be reversed.
533
+ if (Array.isArray(meta.mapped))
534
+ throw new Error("Not supported for groups");
535
+ if (["SIRZB-110", "SRAC-23B-ZBSR", "AV2010/29A", "AV2010/24A"].includes(meta.mapped.model)) {
536
+ info = utils.getFromLookup(values.mode, mode) + ((values.strobe ? 1 : 0) << 4) + (utils.getFromLookup(values.level, level) << 6);
537
+ }
538
+ else {
539
+ info = (utils.getFromLookup(values.mode, mode) << 4) + ((values.strobe ? 1 : 0) << 2) + utils.getFromLookup(values.level, level);
540
+ }
541
+ await entity.command("ssIasWd", "startWarning", { startwarninginfo: info, warningduration: values.duration, strobedutycycle: values.strobeDutyCycle, strobelevel: values.strobeLevel }, utils.getOptions(meta.mapped, entity));
542
+ },
543
+ },
544
+ ias_max_duration: {
545
+ key: ["max_duration"],
546
+ convertSet: async (entity, key, value, meta) => {
547
+ await entity.write("ssIasWd", { maxDuration: value });
548
+ return { state: { max_duration: value } };
549
+ },
550
+ convertGet: async (entity, key, meta) => {
551
+ await entity.read("ssIasWd", ["maxDuration"]);
552
+ },
553
+ },
554
+ warning_simple: {
555
+ key: ["alarm"],
556
+ convertSet: async (entity, key, value, meta) => {
557
+ const alarmState = value === "alarm" || value === "OFF" ? 0 : 1;
558
+ let info;
559
+ // For Develco SMSZB-120 and HESZB-120, introduced change in fw 4.0.5, tested backward with 4.0.4
560
+ if (Array.isArray(meta.mapped))
561
+ throw new Error("Not supported for groups");
562
+ if (["SMSZB-120", "HESZB-120"].includes(meta.mapped.model)) {
563
+ info = (alarmState << 7) + (alarmState << 6);
564
+ }
565
+ else {
566
+ info = (3 << 6) + (alarmState << 2);
567
+ }
568
+ await entity.command("ssIasWd", "startWarning", { startwarninginfo: info, warningduration: 300, strobedutycycle: 0, strobelevel: 0 }, utils.getOptions(meta.mapped, entity));
569
+ },
570
+ },
571
+ squawk: {
572
+ key: ["squawk"],
573
+ convertSet: async (entity, key, value, meta) => {
574
+ utils.assertObject(value, key);
575
+ const state = { system_is_armed: 0, system_is_disarmed: 1 };
576
+ const level = { low: 0, medium: 1, high: 2, very_high: 3 };
577
+ const values = {
578
+ state: value.state,
579
+ level: value.level || "very_high",
580
+ strobe: value.strobe !== undefined ? value.strobe : false,
581
+ };
582
+ const info = utils.getFromLookup(values.state, state) + ((values.strobe ? 1 : 0) << 4) + (utils.getFromLookup(values.level, level) << 6);
583
+ await entity.command("ssIasWd", "squawk", { squawkinfo: info }, utils.getOptions(meta.mapped, entity));
584
+ },
585
+ },
586
+ cover_state: {
587
+ key: ["state"],
588
+ convertSet: async (entity, key, value, meta) => {
589
+ const lookup = { open: "upOpen", close: "downClose", stop: "stop", on: "upOpen", off: "downClose" };
590
+ utils.assertString(value, key);
591
+ value = value.toLowerCase();
592
+ await entity.command("closuresWindowCovering", utils.getFromLookup(value, lookup), {}, utils.getOptions(meta.mapped, entity));
593
+ },
594
+ },
595
+ cover_position_tilt: {
596
+ key: ["position", "tilt"],
597
+ options: [exposes.options.invert_cover(), exposes.options.cover_position_tilt_disable_report()],
598
+ convertSet: async (entity, key, value, meta) => {
599
+ utils.assertNumber(value, key);
600
+ const isPosition = key === "position";
601
+ const invert = !(utils.getMetaValue(entity, meta.mapped, "coverInverted", "allEqual", false)
602
+ ? !meta.options.invert_cover
603
+ : meta.options.invert_cover);
604
+ const disableReport = utils.getMetaValue(entity, meta.mapped, "coverPositionTiltDisableReport", "allEqual", false)
605
+ ? !meta.options.cover_position_tilt_disable_report
606
+ : meta.options.cover_position_tilt_disable_report;
607
+ const position = invert ? 100 - value : value;
608
+ // Zigbee officially expects 'open' to be 0 and 'closed' to be 100 whereas
609
+ // HomeAssistant etc. work the other way round.
610
+ // For zigbee-herdsman-converters: open = 100, close = 0
611
+ await entity.command("closuresWindowCovering", isPosition ? "goToLiftPercentage" : "goToTiltPercentage", isPosition ? { percentageliftvalue: position } : { percentagetiltvalue: position }, utils.getOptions(meta.mapped, entity));
612
+ if (disableReport) {
613
+ return;
614
+ }
615
+ return { state: { [isPosition ? "position" : "tilt"]: value } };
616
+ },
617
+ convertGet: async (entity, key, meta) => {
618
+ const isPosition = key === "position";
619
+ await entity.read("closuresWindowCovering", [isPosition ? "currentPositionLiftPercentage" : "currentPositionTiltPercentage"]);
620
+ },
621
+ },
622
+ cover_mode: {
623
+ key: ["cover_mode"],
624
+ convertSet: async (entity, key, value, meta) => {
625
+ utils.assertObject(value, key);
626
+ const windowCoveringMode = ((value.reversed ? 1 : 0) << 0) |
627
+ ((value.calibration ? 1 : 0) << 1) |
628
+ ((value.maintenance ? 1 : 0) << 2) |
629
+ ((value.led ? 1 : 0) << 3);
630
+ await entity.write("closuresWindowCovering", { windowCoveringMode }, utils.getOptions(meta.mapped, entity));
631
+ return { state: { cover_mode: value } };
632
+ },
633
+ convertGet: async (entity, key, meta) => {
634
+ await entity.read("closuresWindowCovering", ["windowCoveringMode"]);
635
+ },
636
+ },
637
+ occupancy_timeout: {
638
+ // Sets delay after motion detector changes from occupied to unoccupied
639
+ key: ["occupancy_timeout"],
640
+ convertSet: async (entity, key, value, meta) => {
641
+ utils.assertNumber(value);
642
+ value *= 1;
643
+ await entity.write("msOccupancySensing", { pirOToUDelay: value }, utils.getOptions(meta.mapped, entity));
644
+ return { state: { occupancy_timeout: value } };
645
+ },
646
+ convertGet: async (entity, key, meta) => {
647
+ await entity.read("msOccupancySensing", ["pirOToUDelay"]);
648
+ },
649
+ },
650
+ level_config: {
651
+ key: ["level_config"],
652
+ convertSet: async (entity, key, value, meta) => {
653
+ const state = {};
654
+ // parse payload to grab the keys
655
+ if (typeof value === "string") {
656
+ try {
657
+ value = JSON.parse(value);
658
+ }
659
+ catch {
660
+ throw new Error("Payload is not valid JSON");
661
+ }
662
+ }
663
+ utils.assertObject(value, key);
664
+ // onOffTransitionTime - range 0x0000 to 0xffff - optional
665
+ if (value.on_off_transition_time !== undefined) {
666
+ let onOffTransitionTimeValue = Number(value.on_off_transition_time);
667
+ if (onOffTransitionTimeValue > 65535)
668
+ onOffTransitionTimeValue = 65535;
669
+ if (onOffTransitionTimeValue < 0)
670
+ onOffTransitionTimeValue = 0;
671
+ await entity.write("genLevelCtrl", { onOffTransitionTime: onOffTransitionTimeValue }, utils.getOptions(meta.mapped, entity));
672
+ Object.assign(state, { on_off_transition_time: onOffTransitionTimeValue });
673
+ }
674
+ // onTransitionTime - range 0x0000 to 0xffff - optional
675
+ // 0xffff = use onOffTransitionTime
676
+ if (value.on_transition_time !== undefined) {
677
+ let onTransitionTimeValue = value.on_transition_time;
678
+ if (typeof onTransitionTimeValue === "string" && onTransitionTimeValue.toLowerCase() === "disabled") {
679
+ onTransitionTimeValue = 65535;
680
+ }
681
+ else {
682
+ onTransitionTimeValue = Number(onTransitionTimeValue);
683
+ }
684
+ if (onTransitionTimeValue > 65535)
685
+ onTransitionTimeValue = 65534;
686
+ if (onTransitionTimeValue < 0)
687
+ onTransitionTimeValue = 0;
688
+ await entity.write("genLevelCtrl", { onTransitionTime: onTransitionTimeValue }, utils.getOptions(meta.mapped, entity));
689
+ // reverse translate number -> preset
690
+ if (onTransitionTimeValue === 65535) {
691
+ onTransitionTimeValue = "disabled";
692
+ }
693
+ Object.assign(state, { on_transition_time: onTransitionTimeValue });
694
+ }
695
+ // offTransitionTime - range 0x0000 to 0xffff - optional
696
+ // 0xffff = use onOffTransitionTime
697
+ if (value.off_transition_time !== undefined) {
698
+ let offTransitionTimeValue = value.off_transition_time;
699
+ if (typeof offTransitionTimeValue === "string" && offTransitionTimeValue.toLowerCase() === "disabled") {
700
+ offTransitionTimeValue = 65535;
701
+ }
702
+ else {
703
+ offTransitionTimeValue = Number(offTransitionTimeValue);
704
+ }
705
+ if (offTransitionTimeValue > 65535)
706
+ offTransitionTimeValue = 65534;
707
+ if (offTransitionTimeValue < 0)
708
+ offTransitionTimeValue = 0;
709
+ await entity.write("genLevelCtrl", { offTransitionTime: offTransitionTimeValue }, utils.getOptions(meta.mapped, entity));
710
+ // reverse translate number -> preset
711
+ if (offTransitionTimeValue === 65535) {
712
+ offTransitionTimeValue = "disabled";
713
+ }
714
+ Object.assign(state, { off_transition_time: offTransitionTimeValue });
715
+ }
716
+ // startUpCurrentLevel - range 0x00 to 0xff - optional
717
+ // 0x00 = return to minimum supported level
718
+ // 0xff = return to previous previous
719
+ if (value.current_level_startup !== undefined) {
720
+ let startUpCurrentLevelValue = value.current_level_startup;
721
+ if (typeof startUpCurrentLevelValue === "string" && startUpCurrentLevelValue.toLowerCase() === "previous") {
722
+ startUpCurrentLevelValue = 255;
723
+ }
724
+ else if (typeof startUpCurrentLevelValue === "string" && startUpCurrentLevelValue.toLowerCase() === "minimum") {
725
+ startUpCurrentLevelValue = 0;
726
+ }
727
+ else {
728
+ startUpCurrentLevelValue = Number(startUpCurrentLevelValue);
729
+ }
730
+ if (startUpCurrentLevelValue > 255)
731
+ startUpCurrentLevelValue = 254;
732
+ if (startUpCurrentLevelValue < 0)
733
+ startUpCurrentLevelValue = 1;
734
+ await entity.write("genLevelCtrl", { startUpCurrentLevel: startUpCurrentLevelValue }, utils.getOptions(meta.mapped, entity));
735
+ // reverse translate number -> preset
736
+ if (startUpCurrentLevelValue === 255) {
737
+ startUpCurrentLevelValue = "previous";
738
+ }
739
+ if (startUpCurrentLevelValue === 0) {
740
+ startUpCurrentLevelValue = "minimum";
741
+ }
742
+ Object.assign(state, { current_level_startup: startUpCurrentLevelValue });
743
+ }
744
+ // onLevel - range 0x00 to 0xff - optional
745
+ // Any value outside of MinLevel to MaxLevel, including 0xff and 0x00, is interpreted as "previous".
746
+ if (value.on_level !== undefined) {
747
+ let onLevel = value.on_level;
748
+ if (typeof onLevel === "string" && onLevel.toLowerCase() === "previous") {
749
+ onLevel = 255;
750
+ }
751
+ else {
752
+ onLevel = Number(onLevel);
753
+ }
754
+ if (onLevel > 255)
755
+ onLevel = 254;
756
+ if (onLevel < 1)
757
+ onLevel = 1;
758
+ await entity.write("genLevelCtrl", { onLevel }, utils.getOptions(meta.mapped, entity));
759
+ Object.assign(state, { on_level: onLevel === 255 ? "previous" : onLevel });
760
+ }
761
+ // options - 8-bit map
762
+ // bit 0: ExecuteIfOff - when 0, Move commands are ignored if the device is off;
763
+ // when 1, CurrentLevel can be changed while the device is off.
764
+ // bit 1: CoupleColorTempToLevel - when 1, changes to level also change color temperature.
765
+ // (What this means is not defined, but it's most likely to be "dim to warm".)
766
+ if (value.execute_if_off !== undefined) {
767
+ const executeIfOffValue = !!value.execute_if_off;
768
+ await entity.write("genLevelCtrl", { options: executeIfOffValue ? 1 : 0 }, utils.getOptions(meta.mapped, entity));
769
+ Object.assign(state, { execute_if_off: executeIfOffValue });
770
+ }
771
+ if (Object.keys(state).length > 0) {
772
+ return { state: { level_config: state } };
773
+ }
774
+ },
775
+ convertGet: async (entity, key, meta) => {
776
+ for (const attribute of ["onOffTransitionTime", "onTransitionTime", "offTransitionTime", "startUpCurrentLevel", "onLevel", "options"]) {
777
+ try {
778
+ await entity.read("genLevelCtrl", [attribute]);
779
+ }
780
+ catch {
781
+ // continue regardless of error, all these are optional in ZCL
782
+ }
783
+ }
784
+ },
785
+ },
786
+ ballast_config: {
787
+ key: ["ballast_config", "ballast_minimum_level", "ballast_maximum_level", "ballast_power_on_level"],
788
+ // zcl attribute names are camel case, but we want to use snake case in the outside communication
789
+ convertSet: async (entity, key, value, meta) => {
790
+ if (key === "ballast_config") {
791
+ value = utils.toCamelCase(value);
792
+ for (const [attrName, attrValue] of Object.entries(value)) {
793
+ const attributes = { [attrName]: attrValue };
794
+ await entity.write("lightingBallastCfg", attributes);
795
+ }
796
+ }
797
+ if (key === "ballast_minimum_level") {
798
+ await entity.write("lightingBallastCfg", { minLevel: value });
799
+ }
800
+ if (key === "ballast_maximum_level") {
801
+ await entity.write("lightingBallastCfg", { maxLevel: value });
802
+ }
803
+ if (key === "ballast_power_on_level") {
804
+ await entity.write("lightingBallastCfg", { powerOnLevel: value });
805
+ }
806
+ return { state: { [key]: value } };
807
+ },
808
+ convertGet: async (entity, key, meta) => {
809
+ let result = {};
810
+ for (const attrName of [
811
+ "ballast_status",
812
+ "min_level",
813
+ "max_level",
814
+ "power_on_level",
815
+ "power_on_fade_time",
816
+ "intrinsic_ballast_factor",
817
+ "ballast_factor_adjustment",
818
+ "lamp_quantity",
819
+ "lamp_type",
820
+ "lamp_manufacturer",
821
+ "lamp_rated_hours",
822
+ "lamp_burn_hours",
823
+ "lamp_alarm_mode",
824
+ "lamp_burn_hours_trip_point",
825
+ ]) {
826
+ try {
827
+ // @ts-expect-error ignore
828
+ result = { ...result, ...(await entity.read("lightingBallastCfg", [utils.toCamelCase(attrName)])) };
829
+ }
830
+ catch {
831
+ // continue regardless of error
832
+ }
833
+ }
834
+ if (key === "ballast_config") {
835
+ logger_1.logger.debug(`ballast_config attribute results received: ${JSON.stringify(utils.toSnakeCase(result))}`, NS);
836
+ }
837
+ },
838
+ },
839
+ light_brightness_step: {
840
+ key: ["brightness_step", "brightness_step_onoff"],
841
+ options: [exposes.options.transition()],
842
+ convertSet: async (entity, key, value, meta) => {
843
+ const onOff = key.endsWith("_onoff");
844
+ const command = onOff ? "stepWithOnOff" : "step";
845
+ value = Number(value);
846
+ utils.assertNumber(value, key);
847
+ const mode = value > 0 ? 0 : 1;
848
+ const transition = utils.getTransition(entity, key, meta).time;
849
+ const payload = { stepmode: mode, stepsize: Math.abs(value), transtime: transition };
850
+ await entity.command("genLevelCtrl", command, payload, utils.getOptions(meta.mapped, entity));
851
+ if (meta.state.brightness !== undefined) {
852
+ utils.assertNumber(meta.state.brightness);
853
+ let brightness = onOff || meta.state.state === "ON" ? meta.state.brightness + value : meta.state.brightness;
854
+ if (value === 0) {
855
+ const entityToRead = utils.getEntityOrFirstGroupMember(entity);
856
+ if (entityToRead) {
857
+ brightness = (await entityToRead.read("genLevelCtrl", ["currentLevel"])).currentLevel;
858
+ }
859
+ }
860
+ brightness = Math.min(254, brightness);
861
+ brightness = Math.max(onOff || meta.state.state === "OFF" ? 0 : 1, brightness);
862
+ if (utils.getMetaValue(entity, meta.mapped, "turnsOffAtBrightness1", "allEqual", false)) {
863
+ if (onOff && value < 0 && brightness === 1) {
864
+ brightness = 0;
865
+ }
866
+ else if (onOff && value > 0 && meta.state.brightness === 0) {
867
+ brightness++;
868
+ }
869
+ }
870
+ return { state: { brightness, state: brightness === 0 ? "OFF" : "ON" } };
871
+ }
872
+ },
873
+ },
874
+ light_brightness_move: {
875
+ key: ["brightness_move", "brightness_move_onoff"],
876
+ convertSet: async (entity, key, value, meta) => {
877
+ if (value === "stop" || value === 0) {
878
+ await entity.command("genLevelCtrl", "stop", {}, utils.getOptions(meta.mapped, entity));
879
+ // As we cannot determine the new brightness state, we read it from the device
880
+ await utils.sleep(500);
881
+ const target = utils.getEntityOrFirstGroupMember(entity);
882
+ const onOff = (await target.read("genOnOff", ["onOff"])).onOff;
883
+ const brightness = (await target.read("genLevelCtrl", ["currentLevel"])).currentLevel;
884
+ return { state: { brightness, state: onOff === 1 ? "ON" : "OFF" } };
885
+ }
886
+ value = Number(value);
887
+ utils.assertNumber(value, key);
888
+ const payload = { movemode: value > 0 ? 0 : 1, rate: Math.abs(value) };
889
+ const command = key.endsWith("onoff") ? "moveWithOnOff" : "move";
890
+ await entity.command("genLevelCtrl", command, payload, utils.getOptions(meta.mapped, entity));
891
+ },
892
+ },
893
+ light_colortemp_step: {
894
+ key: ["color_temp_step"],
895
+ options: [exposes.options.transition()],
896
+ convertSet: async (entity, key, value, meta) => {
897
+ value = Number(value);
898
+ utils.assertNumber(value, key);
899
+ const mode = value > 0 ? 1 : 3;
900
+ const transition = utils.getTransition(entity, key, meta).time;
901
+ const payload = { stepmode: mode, stepsize: Math.abs(value), transtime: transition, minimum: 0, maximum: 600 };
902
+ await entity.command("lightingColorCtrl", "stepColorTemp", payload, utils.getOptions(meta.mapped, entity));
903
+ // We cannot determine the color temperature from the current state so we read it, because
904
+ // - We don't know the max/min values
905
+ // - Color mode could have been switched (x/y or hue/saturation)
906
+ const entityToRead = utils.getEntityOrFirstGroupMember(entity);
907
+ if (entityToRead) {
908
+ await utils.sleep(100 + transition * 100);
909
+ await entityToRead.read("lightingColorCtrl", ["colorTemperature"]);
910
+ }
911
+ },
912
+ },
913
+ light_colortemp_move: {
914
+ key: ["colortemp_move", "color_temp_move"],
915
+ convertSet: async (entity, key, value, meta) => {
916
+ if (key === "color_temp_move" && (value === "stop" || utils.isNumber(value))) {
917
+ value = value === "stop" ? value : Number(value);
918
+ const payload = { minimum: 0, maximum: 600 };
919
+ if (value === "stop" || value === 0) {
920
+ payload.rate = 1;
921
+ payload.movemode = 0;
922
+ }
923
+ else {
924
+ utils.assertNumber(value, key);
925
+ payload.rate = Math.abs(value);
926
+ payload.movemode = value > 0 ? 1 : 3;
927
+ }
928
+ await entity.command("lightingColorCtrl", "moveColorTemp", payload, utils.getOptions(meta.mapped, entity));
929
+ // We cannot determine the color temperaturefrom the current state so we read it, because
930
+ // - Color mode could have been switched (x/y or colortemp)
931
+ if (value === "stop" || value === 0) {
932
+ const entityToRead = utils.getEntityOrFirstGroupMember(entity);
933
+ if (entityToRead) {
934
+ await utils.sleep(100);
935
+ await entityToRead.read("lightingColorCtrl", ["colorTemperature", "colorMode"]);
936
+ }
937
+ }
938
+ }
939
+ else {
940
+ // Deprecated
941
+ const payload = { minimum: 153, maximum: 370, rate: 55 };
942
+ const stop = (val) => ["stop", "release", "0"].some((el) => val.includes(el));
943
+ const up = (val) => ["1", "up"].some((el) => val.includes(el));
944
+ const arr = [value.toString()];
945
+ const moverate = meta.message.rate !== undefined ? Number(meta.message.rate) : 55;
946
+ payload.rate = moverate;
947
+ if (arr.filter(stop).length) {
948
+ payload.movemode = 0;
949
+ }
950
+ else {
951
+ payload.movemode = arr.filter(up).length ? 1 : 3;
952
+ }
953
+ await entity.command("lightingColorCtrl", "moveColorTemp", payload, utils.getOptions(meta.mapped, entity));
954
+ }
955
+ },
956
+ },
957
+ light_color_and_colortemp_via_color: {
958
+ key: ["color", "color_temp", "color_temp_percent"],
959
+ options: [exposes.options.color_sync(), exposes.options.transition()],
960
+ convertSet: async (entity, key, value, meta) => {
961
+ if (key === "color") {
962
+ return await converters1.light_color.convertSet(entity, key, value, meta);
963
+ }
964
+ if (key === "color_temp" || key === "color_temp_percent") {
965
+ utils.assertNumber(value);
966
+ const xy = libColor.ColorXY.fromMireds(value);
967
+ const payload = {
968
+ transtime: utils.getTransition(entity, key, meta).time,
969
+ colorx: utils.mapNumberRange(xy.x, 0, 1, 0, 65535),
970
+ colory: utils.mapNumberRange(xy.y, 0, 1, 0, 65535),
971
+ };
972
+ await entity.command("lightingColorCtrl", "moveToColor", payload, utils.getOptions(meta.mapped, entity));
973
+ return {
974
+ state: libColor.syncColorState({ color_mode: constants.colorModeLookup[2], color_temp: value }, meta.state, entity, meta.options),
975
+ };
976
+ }
977
+ },
978
+ convertGet: async (entity, key, meta) => {
979
+ await entity.read("lightingColorCtrl", light.readColorAttributes(entity, meta));
980
+ },
981
+ },
982
+ light_hue_saturation_step: {
983
+ key: ["hue_step", "saturation_step"],
984
+ options: [exposes.options.transition()],
985
+ convertSet: async (entity, key, value, meta) => {
986
+ value = Number(value);
987
+ utils.assertNumber(value, key);
988
+ const command = key === "hue_step" ? "stepHue" : "stepSaturation";
989
+ const attribute = key === "hue_step" ? "currentHue" : "currentSaturation";
990
+ const mode = value > 0 ? 1 : 3;
991
+ const transition = utils.getTransition(entity, key, meta).time;
992
+ const payload = { stepmode: mode, stepsize: Math.abs(value), transtime: transition };
993
+ await entity.command("lightingColorCtrl", command, payload, utils.getOptions(meta.mapped, entity));
994
+ // We cannot determine the hue/saturation from the current state so we read it, because
995
+ // - Color mode could have been switched (x/y or colortemp)
996
+ const entityToRead = utils.getEntityOrFirstGroupMember(entity);
997
+ if (entityToRead) {
998
+ await utils.sleep(100 + transition * 100);
999
+ await entityToRead.read("lightingColorCtrl", [attribute, "colorMode"]);
1000
+ }
1001
+ },
1002
+ },
1003
+ light_hue_saturation_move: {
1004
+ key: ["hue_move", "saturation_move"],
1005
+ convertSet: async (entity, key, value, meta) => {
1006
+ value = value === "stop" ? value : Number(value);
1007
+ const command = key === "hue_move" ? "moveHue" : "moveSaturation";
1008
+ const attribute = key === "hue_move" ? "currentHue" : "currentSaturation";
1009
+ const payload = {};
1010
+ if (value === "stop" || value === 0) {
1011
+ payload.rate = 1;
1012
+ payload.movemode = 0;
1013
+ }
1014
+ else {
1015
+ utils.assertNumber(value, key);
1016
+ payload.rate = Math.abs(value);
1017
+ payload.movemode = value > 0 ? 1 : 3;
1018
+ }
1019
+ await entity.command("lightingColorCtrl", command, payload, utils.getOptions(meta.mapped, entity));
1020
+ // We cannot determine the hue/saturation from the current state so we read it, because
1021
+ // - Color mode could have been switched (x/y or colortemp)
1022
+ if (value === "stop" || value === 0) {
1023
+ const entityToRead = utils.getEntityOrFirstGroupMember(entity);
1024
+ if (entityToRead) {
1025
+ await utils.sleep(100);
1026
+ await entityToRead.read("lightingColorCtrl", [attribute, "colorMode"]);
1027
+ }
1028
+ }
1029
+ },
1030
+ },
1031
+ light_onoff_brightness: {
1032
+ key: ["state", "brightness", "brightness_percent"],
1033
+ options: [exposes.options.transition()],
1034
+ convertSet: async (entity, key, value, meta) => {
1035
+ const { message } = meta;
1036
+ const transition = utils.getTransition(entity, "brightness", meta);
1037
+ const turnsOffAtBrightness1 = utils.getMetaValue(entity, meta.mapped, "turnsOffAtBrightness1", "allEqual", false);
1038
+ let state = message.state !== undefined ? (typeof message.state === "string" ? message.state.toLowerCase() : null) : undefined;
1039
+ let brightness = undefined;
1040
+ if (message.brightness !== undefined) {
1041
+ brightness = Number(message.brightness);
1042
+ }
1043
+ else if (message.brightness_percent !== undefined) {
1044
+ brightness = utils.mapNumberRange(Number(message.brightness_percent), 0, 100, 0, 255);
1045
+ }
1046
+ if (brightness === 255) {
1047
+ // Allow 255 for backwards compatibility.
1048
+ brightness = 254;
1049
+ }
1050
+ if (brightness !== undefined && (Number.isNaN(brightness) || brightness < 0 || brightness > 254)) {
1051
+ throw new Error(`Brightness value of message: '${JSON.stringify(message)}' invalid, must be a number >= 0 and =< 254`);
1052
+ }
1053
+ if (state !== undefined && state !== null && ["on", "off", "toggle"].includes(state) === false) {
1054
+ throw new Error(`State value of message: '${JSON.stringify(message)}' invalid, must be 'ON', 'OFF' or 'TOGGLE'`);
1055
+ }
1056
+ if ((state === undefined || state === null) && brightness === undefined) {
1057
+ throw new Error(`At least one of "brightness" or "state" must have a value: '${JSON.stringify(message)}'`);
1058
+ }
1059
+ // Infer state from desired brightness if unset. Ideally we'd want to keep it as it is, but this code has always
1060
+ // used 'MoveToLevelWithOnOff' so that'd break backwards compatibility. To keep the state, the user
1061
+ // has to explicitly set it to null.
1062
+ if (state === undefined) {
1063
+ // Also write to `meta.message.state` in case we delegate to the `on_off` converter.
1064
+ state = meta.message.state = brightness === 0 ? "off" : "on";
1065
+ }
1066
+ let publishBrightness = brightness !== undefined;
1067
+ const targetState = state === "toggle" ? (meta.state.state === "ON" ? "off" : "on") : state;
1068
+ if (targetState === "off") {
1069
+ // Simulate 'Off' with transition via 'MoveToLevelWithOnOff', otherwise just use 'Off'.
1070
+ // TODO: if this is a group where some members don't support Level Control, turning them off
1071
+ // with transition may have no effect. (Some devices, such as Envilar ZG302-BOX-RELAY, handle
1072
+ // 'MoveToLevelWithOnOff' despite not supporting the cluster; others, like the LEDVANCE SMART+
1073
+ // plug, do not.)
1074
+ brightness = transition.specified || brightness === 0 ? 0 : undefined;
1075
+ if (brightness !== undefined &&
1076
+ meta.state.state === "OFF" &&
1077
+ utils.getMetaValue(entity, meta.mapped, "noOffTransitionWhenOff", { atLeastOnce: true }, false)) {
1078
+ logger_1.logger.debug("Supressing OFF transition since entity is OFF and has noOffTransitionWhenOff=true", NS);
1079
+ brightness = undefined;
1080
+ }
1081
+ if (meta.state.brightness !== undefined && meta.state.state === "ON") {
1082
+ // The light's current level gets clobbered in two cases:
1083
+ // 1. when 'Off' has a transition, in which case it is really 'MoveToLevelWithOnOff'
1084
+ // https://github.com/Koenkk/zigbee-herdsman-converters/issues/1073
1085
+ // 2. when 'OnLevel' is set: "If OnLevel is not defined, set the CurrentLevel to the stored level."
1086
+ // https://github.com/Koenkk/zigbee2mqtt/issues/2850#issuecomment-580365633
1087
+ // We need to remember current brightness in case the next 'On' does not provide it. `meta` is not reliable
1088
+ // here, as it will get clobbered too if reporting is configured.
1089
+ globalStore.putValue(entity, "brightness", meta.state.brightness);
1090
+ globalStore.putValue(entity, "turnedOffWithTransition", brightness !== undefined);
1091
+ }
1092
+ }
1093
+ else if (targetState === "on" && brightness === undefined) {
1094
+ // Simulate 'On' with transition via 'MoveToLevelWithOnOff', or restore the level from before
1095
+ // it was clobbered by a previous transition to off; otherwise just use 'On'.
1096
+ // TODO: same problem as above.
1097
+ // TODO: if transition is not specified, should use device default (OnTransitionTime), not 0.
1098
+ if (transition.specified || globalStore.getValue(entity, "turnedOffWithTransition") === true) {
1099
+ const levelConfig = utils.getObjectProperty(meta.state, "level_config", {});
1100
+ let onLevel = utils.getObjectProperty(levelConfig, "on_level", 0);
1101
+ if (onLevel === 0 && entity.meta.onLevelSupported !== false) {
1102
+ try {
1103
+ const attributeRead = await entity.read("genLevelCtrl", ["onLevel"]);
1104
+ if (attributeRead !== undefined) {
1105
+ // @ts-expect-error ignore
1106
+ onLevel = attributeRead.onLevel;
1107
+ }
1108
+ }
1109
+ catch {
1110
+ // OnLevel not supported
1111
+ }
1112
+ }
1113
+ if (onLevel === 0) {
1114
+ onLevel = "previous";
1115
+ entity.meta.onLevelSupported = false;
1116
+ entity.save();
1117
+ }
1118
+ if (onLevel === 255 || onLevel === "previous") {
1119
+ const current = utils.getObjectProperty(meta.state, "brightness", 254);
1120
+ brightness = globalStore.getValue(entity, "brightness", current);
1121
+ }
1122
+ else {
1123
+ brightness = onLevel;
1124
+ }
1125
+ // Published state might have gotten clobbered by reporting.
1126
+ publishBrightness = true;
1127
+ }
1128
+ }
1129
+ if (brightness === undefined) {
1130
+ const result = (await converters1.on_off.convertSet(entity, "state", state, meta));
1131
+ if (result) {
1132
+ if (result.state && result.state.state === "ON" && meta.state.brightness === 0) {
1133
+ result.state.brightness = 1;
1134
+ }
1135
+ }
1136
+ return result;
1137
+ }
1138
+ if (brightness === 0 && (targetState === "on" || state === null)) {
1139
+ brightness = 1;
1140
+ }
1141
+ if (brightness === 1 && turnsOffAtBrightness1) {
1142
+ brightness = 2;
1143
+ }
1144
+ if (targetState !== "off") {
1145
+ globalStore.putValue(entity, "brightness", brightness);
1146
+ globalStore.clearValue(entity, "turnedOffWithTransition");
1147
+ }
1148
+ await entity.command("genLevelCtrl", state === null ? "moveToLevel" : "moveToLevelWithOnOff", { level: Number(brightness), transtime: transition.time }, utils.getOptions(meta.mapped, entity));
1149
+ const result = { state: {} };
1150
+ if (publishBrightness) {
1151
+ result.state.brightness = Number(brightness);
1152
+ }
1153
+ if (state !== null) {
1154
+ result.state.state = brightness === 0 ? "OFF" : "ON";
1155
+ }
1156
+ return result;
1157
+ },
1158
+ convertGet: async (entity, key, meta) => {
1159
+ if (key === "brightness") {
1160
+ await entity.read("genLevelCtrl", ["currentLevel"]);
1161
+ }
1162
+ else if (key === "state") {
1163
+ await converters1.on_off.convertGet(entity, key, meta);
1164
+ }
1165
+ },
1166
+ },
1167
+ light_colortemp_startup: {
1168
+ key: ["color_temp_startup"],
1169
+ convertSet: async (entity, key, value, meta) => {
1170
+ const [colorTempMin, colorTempMax] = light.findColorTempRange(entity);
1171
+ const preset = { warmest: colorTempMax, warm: 454, neutral: 370, cool: 250, coolest: colorTempMin, previous: 65535 };
1172
+ if (utils.isString(value) && value in preset) {
1173
+ value = utils.getFromLookup(value, preset);
1174
+ }
1175
+ value = Number(value);
1176
+ utils.assertNumber(value);
1177
+ // ensure value within range
1178
+ // we do allow one exception for 0xffff, which is to restore the previous value
1179
+ if (value !== 65535) {
1180
+ value = light.clampColorTemp(value, colorTempMin, colorTempMax);
1181
+ }
1182
+ await entity.write("lightingColorCtrl", { startUpColorTemperature: value }, utils.getOptions(meta.mapped, entity));
1183
+ return { state: { color_temp_startup: value } };
1184
+ },
1185
+ convertGet: async (entity, key, meta) => {
1186
+ await entity.read("lightingColorCtrl", ["startUpColorTemperature"]);
1187
+ },
1188
+ },
1189
+ light_color_colortemp: {
1190
+ /**
1191
+ * This converter is a combination of light_color and light_colortemp and
1192
+ * can be used instead of the two individual converters . When used to set,
1193
+ * it actually calls out to light_color or light_colortemp to get the
1194
+ * return value. When used to get, it gets both color and colorTemp in
1195
+ * one call.
1196
+ * The reason for the existence of this somewhat peculiar converter is
1197
+ * that some lights don't report their state when changed. To fix this,
1198
+ * we query the state after we set it. We want to query color and colorTemp
1199
+ * both when setting either, because both change when setting one. This
1200
+ * converter is used to do just that.
1201
+ */
1202
+ key: ["color", "color_temp", "color_temp_percent"],
1203
+ options: [exposes.options.color_sync(), exposes.options.transition()],
1204
+ convertSet: async (entity, key, value, meta) => {
1205
+ if (key === "color") {
1206
+ const result = await converters1.light_color.convertSet(entity, key, value, meta);
1207
+ return result;
1208
+ }
1209
+ if (key === "color_temp" || key === "color_temp_percent") {
1210
+ const result = await converters1.light_colortemp.convertSet(entity, key, value, meta);
1211
+ return result;
1212
+ }
1213
+ },
1214
+ convertGet: async (entity, key, meta) => {
1215
+ await entity.read("lightingColorCtrl", light.readColorAttributes(entity, meta, ["colorTemperature"]));
1216
+ },
1217
+ },
1218
+ effect: {
1219
+ key: ["effect", "alert", "flash"], // alert and flash are deprecated.
1220
+ convertSet: async (entity, key, value, meta) => {
1221
+ if (key === "effect") {
1222
+ utils.assertString(value, key);
1223
+ const lookup = { blink: 0, breathe: 1, okay: 2, channel_change: 11, finish_effect: 254, stop_effect: 255 };
1224
+ value = value.toLowerCase();
1225
+ if (value === "colorloop") {
1226
+ const transition = meta.message.transition ?? 15;
1227
+ utils.assertNumber(transition, "transition");
1228
+ const speed = Math.min(255, Math.max(1, Math.round(255 / transition)));
1229
+ await converters2.light_hue_saturation_move.convertSet(entity, "hue_move", speed, meta);
1230
+ }
1231
+ else if (value === "stop_colorloop") {
1232
+ await converters2.light_hue_saturation_move.convertSet(entity, "hue_move", "stop", meta);
1233
+ }
1234
+ else {
1235
+ const payload = { effectid: utils.getFromLookup(value, lookup), effectvariant: 0 };
1236
+ await entity.command("genIdentify", "triggerEffect", payload, utils.getOptions(meta.mapped, entity));
1237
+ }
1238
+ }
1239
+ else if (key === "alert" || key === "flash") {
1240
+ // Deprecated
1241
+ let effectid = 0;
1242
+ const lookup = { select: 0x00, lselect: 0x01, none: 0xff };
1243
+ if (key === "flash") {
1244
+ if (value === 2) {
1245
+ value = "select";
1246
+ }
1247
+ else if (value === 10) {
1248
+ value = "lselect";
1249
+ }
1250
+ }
1251
+ effectid = utils.getFromLookup(value, lookup);
1252
+ const payload = { effectid, effectvariant: 0 };
1253
+ await entity.command("genIdentify", "triggerEffect", payload, utils.getOptions(meta.mapped, entity));
1254
+ }
1255
+ },
1256
+ },
1257
+ thermostat_remote_sensing: {
1258
+ key: ["remote_sensing"],
1259
+ convertSet: async (entity, key, value, meta) => {
1260
+ await entity.write("hvacThermostat", { remoteSensing: value });
1261
+ },
1262
+ convertGet: async (entity, key, meta) => {
1263
+ await entity.read("hvacThermostat", ["remoteSensing"]);
1264
+ },
1265
+ },
1266
+ thermostat_weekly_schedule: {
1267
+ key: ["weekly_schedule"],
1268
+ convertSet: async (entity, key, value, meta) => {
1269
+ /*
1270
+ * We want to support a simple human creatable format to send a schedule:
1271
+ {"weekly_schedule": {
1272
+ "dayofweek": ["monday", "tuesday"],
1273
+ "transitions": [
1274
+ {"heatSetpoint": 16, "transitionTime": "0:00"},
1275
+ {"heatSetpoint": 20, "transitionTime": "18:00"},
1276
+ {"heatSetpoint": 16, "transitionTime": "19:30"}
1277
+ ]}}
1278
+
1279
+ * However exposes is not flexible enough to describe something like this. There is a
1280
+ * much more verbose format we also support so that exposes work.
1281
+ {"weekly_schedule": {
1282
+ "dayofweek": [
1283
+ {"day": "monday"},
1284
+ {"day": "tuesday"}
1285
+ ],
1286
+ "transitions": [
1287
+ {"heatSetpoint": 16, "transitionTime": {"hour": 0, "minute": 0}},
1288
+ {"heatSetpoint": 20, "transitionTime": {"hour": 18, "minute": 0}},
1289
+ {"heatSetpoint": 16, "transitionTime": {"hour": 19, "minute": 30}}
1290
+ ]}}
1291
+ */
1292
+ utils.assertObject(value, key);
1293
+ const payload = {
1294
+ dayofweek: value.dayofweek,
1295
+ transitions: value.transitions,
1296
+ };
1297
+ if (Array.isArray(payload.transitions)) {
1298
+ // calculate numoftrans
1299
+ if (typeof value.numoftrans !== "undefined") {
1300
+ logger_1.logger.warning(`weekly_schedule: ignoring provided numoftrans value (${JSON.stringify(value.numoftrans)}), this is now calculated automatically`, NS);
1301
+ }
1302
+ payload.numoftrans = payload.transitions.length;
1303
+ // mode is calculated below
1304
+ if (typeof value.mode !== "undefined") {
1305
+ logger_1.logger.warning(`weekly_schedule: ignoring provided mode value (${JSON.stringify(value.mode)}), this is now calculated automatically`, NS);
1306
+ }
1307
+ payload.mode = [];
1308
+ // transform transition payload values if needed
1309
+ for (const elem of payload.transitions) {
1310
+ // update payload.mode if needed
1311
+ if (elem.heatSetpoint !== undefined && !payload.mode.includes("heat")) {
1312
+ payload.mode.push("heat");
1313
+ }
1314
+ if (elem.coolSetpoint !== undefined && !payload.mode.includes("cool")) {
1315
+ payload.mode.push("cool");
1316
+ }
1317
+ // transform setpoint values if numeric
1318
+ if (typeof elem.heatSetpoint === "number") {
1319
+ elem.heatSetpoint = Math.round(elem.heatSetpoint * 100);
1320
+ }
1321
+ if (typeof elem.coolSetpoint === "number") {
1322
+ elem.coolSetpoint = Math.round(elem.coolSetpoint * 100);
1323
+ }
1324
+ // accept 24h time notation (e.g. 19:30)
1325
+ if (typeof elem.transitionTime === "string") {
1326
+ const time = elem.transitionTime.split(":");
1327
+ const timeHour = Number.parseInt(time[0]) * 60;
1328
+ const timeMinute = Number.parseInt(time[1]);
1329
+ if (time.length !== 2 || Number.isNaN(timeHour) || Number.isNaN(timeMinute)) {
1330
+ logger_1.logger.warning(`weekly_schedule: expected 24h time notation (e.g. 19:30) but got '${elem.transitionTime}'!`, NS);
1331
+ }
1332
+ else {
1333
+ elem.transitionTime = timeHour + timeMinute;
1334
+ }
1335
+ }
1336
+ else if (typeof elem.transitionTime === "object") {
1337
+ if (elem.transitionTime.hour === undefined || elem.transitionTime.minute === undefined) {
1338
+ throw new Error(`weekly_schedule: expected 24h time object (e.g. {"hour": 19, "minute": 30}), but got '${JSON.stringify(elem.transitionTime)}'!`);
1339
+ }
1340
+ if (Number.isNaN(elem.transitionTime.hour)) {
1341
+ throw new Error(`weekly_schedule: expected time.hour to be a number, but got '${elem.transitionTime.hour}'!`);
1342
+ }
1343
+ if (Number.isNaN(elem.transitionTime.minute)) {
1344
+ throw new Error(`weekly_schedule: expected time.minute to be a number, but got '${elem.transitionTime.minute}'!`);
1345
+ }
1346
+ elem.transitionTime = Number.parseInt(elem.transitionTime.hour) * 60 + Number.parseInt(elem.transitionTime.minute);
1347
+ }
1348
+ }
1349
+ }
1350
+ else {
1351
+ logger_1.logger.error("weekly_schedule: transitions is not an array!", NS);
1352
+ return;
1353
+ }
1354
+ // map array of desired modes to bitmask
1355
+ let mode = 0;
1356
+ for (let m of payload.mode) {
1357
+ // lookup mode bit
1358
+ m = utils.getKey(constants.thermostatScheduleMode, m.toLowerCase(), m, Number);
1359
+ mode |= 1 << m;
1360
+ }
1361
+ payload.mode = mode;
1362
+ // map array of days to desired dayofweek bitmask
1363
+ if (typeof payload.dayofweek === "string")
1364
+ payload.dayofweek = [payload.dayofweek];
1365
+ if (Array.isArray(payload.dayofweek)) {
1366
+ let dayofweek = 0;
1367
+ for (let d of payload.dayofweek) {
1368
+ if (typeof d === "object") {
1369
+ if (d.day === undefined) {
1370
+ throw new Error(`weekly_schedule: expected dayofweek to be string or {"day": "str"}, but got '${JSON.stringify(d)}'!`);
1371
+ }
1372
+ d = d.day;
1373
+ }
1374
+ // lookup dayofweek bit
1375
+ d = utils.getKey(constants.thermostatDayOfWeek, d.toLowerCase(), d, Number);
1376
+ dayofweek |= 1 << d;
1377
+ }
1378
+ payload.dayofweek = dayofweek;
1379
+ }
1380
+ await entity.command("hvacThermostat", "setWeeklySchedule", payload, utils.getOptions(meta.mapped, entity));
1381
+ },
1382
+ convertGet: async (entity, key, meta) => {
1383
+ const payload = {
1384
+ daystoreturn: 0xff, // Sun-Sat and vacation
1385
+ modetoreturn: 3, // heat + cool
1386
+ };
1387
+ await entity.command("hvacThermostat", "getWeeklySchedule", payload, utils.getOptions(meta.mapped, entity));
1388
+ },
1389
+ },
1390
+ thermostat_system_mode: {
1391
+ key: ["system_mode"],
1392
+ convertSet: async (entity, key, value, meta) => {
1393
+ let systemMode = utils.getKey(constants.thermostatSystemModes, value, undefined, Number);
1394
+ if (systemMode === undefined) {
1395
+ systemMode = utils.getKey(legacy.thermostatSystemModes, value, value, Number);
1396
+ }
1397
+ await entity.write("hvacThermostat", { systemMode });
1398
+ return { state: { system_mode: value } };
1399
+ },
1400
+ convertGet: async (entity, key, meta) => {
1401
+ await entity.read("hvacThermostat", ["systemMode"]);
1402
+ },
1403
+ },
1404
+ acova_thermostat_system_mode: {
1405
+ key: ["system_mode"],
1406
+ convertSet: async (entity, key, value, meta) => {
1407
+ let systemMode = utils.getKey(constants.acovaThermostatSystemModes, value, undefined, Number);
1408
+ if (systemMode === undefined) {
1409
+ systemMode = utils.getKey(legacy.thermostatSystemModes, value, value, Number);
1410
+ }
1411
+ await entity.write("hvacThermostat", { systemMode });
1412
+ return { state: { system_mode: value } };
1413
+ },
1414
+ convertGet: async (entity, key, meta) => {
1415
+ await entity.read("hvacThermostat", ["systemMode"]);
1416
+ },
1417
+ },
1418
+ thermostat_control_sequence_of_operation: {
1419
+ key: ["control_sequence_of_operation"],
1420
+ convertSet: async (entity, key, value, meta) => {
1421
+ utils.assertEndpoint(entity);
1422
+ let val = utils.getKey(constants.thermostatControlSequenceOfOperations, value, undefined, Number);
1423
+ if (val === undefined) {
1424
+ val = utils.getKey(constants.thermostatControlSequenceOfOperations, value, value, Number);
1425
+ }
1426
+ const attributes = { ctrlSeqeOfOper: val };
1427
+ await entity.write("hvacThermostat", attributes);
1428
+ // NOTE: update the cluster attribute we store as this is used by
1429
+ // SMaBiT AV2010/32's dynamic expose function.
1430
+ entity.saveClusterAttributeKeyValue("hvacThermostat", attributes);
1431
+ return { state: { control_sequence_of_operation: value } };
1432
+ },
1433
+ convertGet: async (entity, key, meta) => {
1434
+ await entity.read("hvacThermostat", ["ctrlSeqeOfOper"]);
1435
+ },
1436
+ },
1437
+ thermostat_programming_operation_mode: {
1438
+ key: ["programming_operation_mode"],
1439
+ convertSet: async (entity, key, value, meta) => {
1440
+ const val = utils.getKey(constants.thermostatProgrammingOperationModes, value, undefined, Number);
1441
+ if (val === undefined) {
1442
+ throw new Error(`Programming operation mode invalid, must be one of: ${Object.values(constants.thermostatProgrammingOperationModes).join(", ")}`);
1443
+ }
1444
+ await entity.write("hvacThermostat", { programingOperMode: val });
1445
+ return { state: { programming_operation_mode: value } };
1446
+ },
1447
+ convertGet: async (entity, key, meta) => {
1448
+ await entity.read("hvacThermostat", ["programingOperMode"]);
1449
+ },
1450
+ },
1451
+ thermostat_temperature_display_mode: {
1452
+ key: ["temperature_display_mode"],
1453
+ convertSet: async (entity, key, value, meta) => {
1454
+ const tempDisplayMode = utils.getKey(constants.temperatureDisplayMode, value, value, Number);
1455
+ await entity.write("hvacUserInterfaceCfg", { tempDisplayMode });
1456
+ return { state: { temperature_display_mode: value } };
1457
+ },
1458
+ convertGet: async (entity, key, meta) => {
1459
+ await entity.read("hvacUserInterfaceCfg", ["tempDisplayMode"]);
1460
+ },
1461
+ },
1462
+ thermostat_keypad_lockout: {
1463
+ key: ["keypad_lockout"],
1464
+ convertSet: async (entity, key, value, meta) => {
1465
+ const keypadLockout = utils.getKey(constants.keypadLockoutMode, value, value, Number);
1466
+ await entity.write("hvacUserInterfaceCfg", { keypadLockout });
1467
+ return { state: { keypad_lockout: value } };
1468
+ },
1469
+ convertGet: async (entity, key, meta) => {
1470
+ await entity.read("hvacUserInterfaceCfg", ["keypadLockout"]);
1471
+ },
1472
+ },
1473
+ thermostat_temperature_setpoint_hold: {
1474
+ key: ["temperature_setpoint_hold"],
1475
+ convertSet: async (entity, key, value, meta) => {
1476
+ const tempSetpointHold = value;
1477
+ await entity.write("hvacThermostat", { tempSetpointHold });
1478
+ },
1479
+ convertGet: async (entity, key, meta) => {
1480
+ await entity.read("hvacThermostat", ["tempSetpointHold"]);
1481
+ },
1482
+ },
1483
+ thermostat_temperature_setpoint_hold_duration: {
1484
+ key: ["temperature_setpoint_hold_duration"],
1485
+ convertSet: async (entity, key, value, meta) => {
1486
+ const tempSetpointHoldDuration = value;
1487
+ await entity.write("hvacThermostat", { tempSetpointHoldDuration });
1488
+ },
1489
+ convertGet: async (entity, key, meta) => {
1490
+ await entity.read("hvacThermostat", ["tempSetpointHoldDuration"]);
1491
+ },
1492
+ },
1493
+ fan_mode: {
1494
+ key: ["fan_mode", "fan_state"],
1495
+ convertSet: async (entity, key, value, meta) => {
1496
+ utils.assertString(value, key);
1497
+ const fanMode = utils.getFromLookup(value, constants.fanMode);
1498
+ await entity.write("hvacFanCtrl", { fanMode });
1499
+ return { state: { fan_mode: value.toLowerCase(), fan_state: value.toLowerCase() === "off" ? "OFF" : "ON" } };
1500
+ },
1501
+ convertGet: async (entity, key, meta) => {
1502
+ await entity.read("hvacFanCtrl", ["fanMode"]);
1503
+ },
1504
+ },
1505
+ fan_speed: {
1506
+ key: ["speed"],
1507
+ convertSet: async (entity, key, value, meta) => {
1508
+ utils.assertNumber(value);
1509
+ await entity.command("genLevelCtrl", "moveToLevel", { level: value.toString(), transtime: 0 }, utils.getOptions(meta.mapped, entity));
1510
+ return { state: { speed: value } };
1511
+ },
1512
+ convertGet: async (entity, key, meta) => {
1513
+ await entity.read("genLevelCtrl", ["currentLevel"]);
1514
+ },
1515
+ },
1516
+ thermostat_local_temperature: {
1517
+ key: ["local_temperature"],
1518
+ convertGet: async (entity, key, meta) => {
1519
+ await entity.read("hvacThermostat", ["localTemp"]);
1520
+ },
1521
+ },
1522
+ thermostat_outdoor_temperature: {
1523
+ key: ["outdoor_temperature"],
1524
+ convertGet: async (entity, key, meta) => {
1525
+ await entity.read("hvacThermostat", ["outdoorTemp"]);
1526
+ },
1527
+ },
1528
+ thermostat_local_temperature_calibration: {
1529
+ key: ["local_temperature_calibration"],
1530
+ convertSet: async (entity, key, value, meta) => {
1531
+ utils.assertNumber(value);
1532
+ await entity.write("hvacThermostat", { localTemperatureCalibration: Math.round(value * 10) });
1533
+ return { state: { local_temperature_calibration: value } };
1534
+ },
1535
+ convertGet: async (entity, key, meta) => {
1536
+ await entity.read("hvacThermostat", ["localTemperatureCalibration"]);
1537
+ },
1538
+ },
1539
+ thermostat_occupancy: {
1540
+ key: ["occupancy"],
1541
+ convertGet: async (entity, key, meta) => {
1542
+ await entity.read("hvacThermostat", ["occupancy"]);
1543
+ },
1544
+ },
1545
+ thermostat_clear_weekly_schedule: {
1546
+ key: ["clear_weekly_schedule"],
1547
+ convertSet: async (entity, key, value, meta) => {
1548
+ await entity.command("hvacThermostat", "clearWeeklySchedule", {}, utils.getOptions(meta.mapped, entity));
1549
+ },
1550
+ },
1551
+ thermostat_pi_heating_demand: {
1552
+ key: ["pi_heating_demand"],
1553
+ convertGet: async (entity, key, meta) => {
1554
+ await entity.read("hvacThermostat", ["pIHeatingDemand"]);
1555
+ },
1556
+ },
1557
+ thermostat_running_state: {
1558
+ key: ["running_state"],
1559
+ convertGet: async (entity, key, meta) => {
1560
+ await entity.read("hvacThermostat", ["runningState"]);
1561
+ },
1562
+ },
1563
+ thermostat_occupied_heating_setpoint: {
1564
+ key: ["occupied_heating_setpoint"],
1565
+ options: [exposes.options.thermostat_unit()],
1566
+ convertSet: async (entity, key, value, meta) => {
1567
+ utils.assertNumber(value, key);
1568
+ let result;
1569
+ if (meta.options.thermostat_unit === "fahrenheit") {
1570
+ result = Math.round(utils.normalizeCelsiusVersionOfFahrenheit(value) * 100);
1571
+ }
1572
+ else {
1573
+ result = Number((Math.round(Number((value * 2).toFixed(1))) / 2).toFixed(1)) * 100;
1574
+ }
1575
+ const occupiedHeatingSetpoint = result;
1576
+ await entity.write("hvacThermostat", { occupiedHeatingSetpoint });
1577
+ return { state: { occupied_heating_setpoint: value } };
1578
+ },
1579
+ convertGet: async (entity, key, meta) => {
1580
+ await entity.read("hvacThermostat", ["occupiedHeatingSetpoint"]);
1581
+ },
1582
+ },
1583
+ thermostat_unoccupied_heating_setpoint: {
1584
+ key: ["unoccupied_heating_setpoint"],
1585
+ options: [exposes.options.thermostat_unit()],
1586
+ convertSet: async (entity, key, value, meta) => {
1587
+ utils.assertNumber(value, key);
1588
+ let result;
1589
+ if (meta.options.thermostat_unit === "fahrenheit") {
1590
+ result = Math.round(utils.normalizeCelsiusVersionOfFahrenheit(value) * 100);
1591
+ }
1592
+ else {
1593
+ result = Number((Math.round(Number((value * 2).toFixed(1))) / 2).toFixed(1)) * 100;
1594
+ }
1595
+ const unoccupiedHeatingSetpoint = result;
1596
+ await entity.write("hvacThermostat", { unoccupiedHeatingSetpoint });
1597
+ return { state: { unoccupied_heating_setpoint: value } };
1598
+ },
1599
+ convertGet: async (entity, key, meta) => {
1600
+ await entity.read("hvacThermostat", ["unoccupiedHeatingSetpoint"]);
1601
+ },
1602
+ },
1603
+ thermostat_occupied_cooling_setpoint: {
1604
+ key: ["occupied_cooling_setpoint"],
1605
+ options: [exposes.options.thermostat_unit()],
1606
+ convertSet: async (entity, key, value, meta) => {
1607
+ utils.assertNumber(value, key);
1608
+ let result;
1609
+ if (meta.options.thermostat_unit === "fahrenheit") {
1610
+ result = Math.round(utils.normalizeCelsiusVersionOfFahrenheit(value) * 100);
1611
+ }
1612
+ else {
1613
+ result = Number((Math.round(Number((value * 2).toFixed(1))) / 2).toFixed(1)) * 100;
1614
+ }
1615
+ const occupiedCoolingSetpoint = result;
1616
+ await entity.write("hvacThermostat", { occupiedCoolingSetpoint });
1617
+ return { state: { occupied_cooling_setpoint: value } };
1618
+ },
1619
+ convertGet: async (entity, key, meta) => {
1620
+ await entity.read("hvacThermostat", ["occupiedCoolingSetpoint"]);
1621
+ },
1622
+ },
1623
+ thermostat_unoccupied_cooling_setpoint: {
1624
+ key: ["unoccupied_cooling_setpoint"],
1625
+ options: [exposes.options.thermostat_unit()],
1626
+ convertSet: async (entity, key, value, meta) => {
1627
+ utils.assertNumber(value, key);
1628
+ let result;
1629
+ if (meta.options.thermostat_unit === "fahrenheit") {
1630
+ result = Math.round(utils.normalizeCelsiusVersionOfFahrenheit(value) * 100);
1631
+ }
1632
+ else {
1633
+ result = Number((Math.round(Number((value * 2).toFixed(1))) / 2).toFixed(1)) * 100;
1634
+ }
1635
+ const unoccupiedCoolingSetpoint = result;
1636
+ await entity.write("hvacThermostat", { unoccupiedCoolingSetpoint });
1637
+ return { state: { unoccupied_cooling_setpoint: value } };
1638
+ },
1639
+ convertGet: async (entity, key, meta) => {
1640
+ await entity.read("hvacThermostat", ["unoccupiedCoolingSetpoint"]);
1641
+ },
1642
+ },
1643
+ thermostat_setpoint_raise_lower: {
1644
+ key: ["setpoint_raise_lower"],
1645
+ convertSet: async (entity, key, value, meta) => {
1646
+ utils.assertObject(value, key);
1647
+ const payload = { mode: value.mode, amount: Math.round(value.amount) * 100 };
1648
+ await entity.command("hvacThermostat", "setpointRaiseLower", payload, utils.getOptions(meta.mapped, entity));
1649
+ },
1650
+ },
1651
+ thermostat_relay_status_log: {
1652
+ key: ["relay_status_log"],
1653
+ convertGet: async (entity, key, meta) => {
1654
+ await entity.command("hvacThermostat", "getRelayStatusLog", {}, utils.getOptions(meta.mapped, entity));
1655
+ },
1656
+ },
1657
+ thermostat_running_mode: {
1658
+ key: ["running_mode"],
1659
+ convertGet: async (entity, key, meta) => {
1660
+ await entity.read("hvacThermostat", ["runningMode"]);
1661
+ },
1662
+ },
1663
+ thermostat_min_heat_setpoint_limit: {
1664
+ key: ["min_heat_setpoint_limit"],
1665
+ convertSet: async (entity, key, value, meta) => {
1666
+ utils.assertNumber(value);
1667
+ let result;
1668
+ if (meta.options.thermostat_unit === "fahrenheit") {
1669
+ result = Math.round(utils.normalizeCelsiusVersionOfFahrenheit(value) * 100);
1670
+ }
1671
+ else {
1672
+ result = Number((Math.round(Number((value * 2).toFixed(1))) / 2).toFixed(1)) * 100;
1673
+ }
1674
+ const minHeatSetpointLimit = result;
1675
+ await entity.write("hvacThermostat", { minHeatSetpointLimit });
1676
+ return { state: { min_heat_setpoint_limit: value } };
1677
+ },
1678
+ convertGet: async (entity, key, meta) => {
1679
+ await entity.read("hvacThermostat", ["minHeatSetpointLimit"]);
1680
+ },
1681
+ },
1682
+ thermostat_max_heat_setpoint_limit: {
1683
+ key: ["max_heat_setpoint_limit"],
1684
+ convertSet: async (entity, key, value, meta) => {
1685
+ utils.assertNumber(value, key);
1686
+ let result;
1687
+ if (meta.options.thermostat_unit === "fahrenheit") {
1688
+ result = Math.round(utils.normalizeCelsiusVersionOfFahrenheit(value) * 100);
1689
+ }
1690
+ else {
1691
+ result = Number((Math.round(Number((value * 2).toFixed(1))) / 2).toFixed(1)) * 100;
1692
+ }
1693
+ const maxHeatSetpointLimit = result;
1694
+ await entity.write("hvacThermostat", { maxHeatSetpointLimit });
1695
+ return { state: { max_heat_setpoint_limit: value } };
1696
+ },
1697
+ convertGet: async (entity, key, meta) => {
1698
+ await entity.read("hvacThermostat", ["maxHeatSetpointLimit"]);
1699
+ },
1700
+ },
1701
+ thermostat_min_cool_setpoint_limit: {
1702
+ key: ["min_cool_setpoint_limit"],
1703
+ convertSet: async (entity, key, value, meta) => {
1704
+ utils.assertNumber(value, key);
1705
+ let result;
1706
+ if (meta.options.thermostat_unit === "fahrenheit") {
1707
+ result = Math.round(utils.normalizeCelsiusVersionOfFahrenheit(value) * 100);
1708
+ }
1709
+ else {
1710
+ result = Number((Math.round(Number((value * 2).toFixed(1))) / 2).toFixed(1)) * 100;
1711
+ }
1712
+ const minCoolSetpointLimit = result;
1713
+ await entity.write("hvacThermostat", { minCoolSetpointLimit });
1714
+ return { state: { min_cool_setpoint_limit: value } };
1715
+ },
1716
+ convertGet: async (entity, key, meta) => {
1717
+ await entity.read("hvacThermostat", ["minCoolSetpointLimit"]);
1718
+ },
1719
+ },
1720
+ thermostat_max_cool_setpoint_limit: {
1721
+ key: ["max_cool_setpoint_limit"],
1722
+ convertSet: async (entity, key, value, meta) => {
1723
+ utils.assertNumber(value, key);
1724
+ let result;
1725
+ if (meta.options.thermostat_unit === "fahrenheit") {
1726
+ result = Math.round(utils.normalizeCelsiusVersionOfFahrenheit(value) * 100);
1727
+ }
1728
+ else {
1729
+ result = Number((Math.round(Number((value * 2).toFixed(1))) / 2).toFixed(1)) * 100;
1730
+ }
1731
+ const maxCoolSetpointLimit = result;
1732
+ await entity.write("hvacThermostat", { maxCoolSetpointLimit });
1733
+ return { state: { max_cool_setpoint_limit: value } };
1734
+ },
1735
+ convertGet: async (entity, key, meta) => {
1736
+ await entity.read("hvacThermostat", ["maxCoolSetpointLimit"]);
1737
+ },
1738
+ },
1739
+ thermostat_ac_louver_position: {
1740
+ key: ["ac_louver_position"],
1741
+ convertSet: async (entity, key, value, meta) => {
1742
+ let acLouverPosition = utils.getKey(constants.thermostatAcLouverPositions, value, undefined, Number);
1743
+ if (acLouverPosition === undefined) {
1744
+ acLouverPosition = utils.getKey(constants.thermostatAcLouverPositions, value, value, Number);
1745
+ }
1746
+ await entity.write("hvacThermostat", { acLouverPosition });
1747
+ return { state: { ac_louver_position: value } };
1748
+ },
1749
+ convertGet: async (entity, key, meta) => {
1750
+ await entity.read("hvacThermostat", ["acLouverPosition"]);
1751
+ },
1752
+ },
1753
+ electrical_measurement_power: {
1754
+ key: ["power"],
1755
+ convertGet: async (entity, key, meta) => {
1756
+ const ep = (0, modernExtend_1.determineEndpoint)(entity, meta, "haElectricalMeasurement");
1757
+ await ep.read("haElectricalMeasurement", ["activePower"]);
1758
+ },
1759
+ },
1760
+ electrical_measurement_power_phase_b: {
1761
+ key: ["power_phase_b"],
1762
+ convertGet: async (entity, key, meta) => {
1763
+ const ep = (0, modernExtend_1.determineEndpoint)(entity, meta, "haElectricalMeasurement");
1764
+ await ep.read("haElectricalMeasurement", ["activePowerPhB"]);
1765
+ },
1766
+ },
1767
+ electrical_measurement_power_phase_c: {
1768
+ key: ["power_phase_c"],
1769
+ convertGet: async (entity, key, meta) => {
1770
+ const ep = (0, modernExtend_1.determineEndpoint)(entity, meta, "haElectricalMeasurement");
1771
+ await ep.read("haElectricalMeasurement", ["activePowerPhC"]);
1772
+ },
1773
+ },
1774
+ metering_power: {
1775
+ key: ["power"],
1776
+ convertGet: async (entity, key, meta) => {
1777
+ utils.assertEndpoint(entity);
1778
+ const ep = (0, modernExtend_1.determineEndpoint)(entity, meta, "seMetering");
1779
+ await ep.read("seMetering", ["instantaneousDemand"]);
1780
+ },
1781
+ },
1782
+ metering_status: {
1783
+ key: ["status"],
1784
+ convertGet: async (entity, key, meta) => {
1785
+ utils.assertEndpoint(entity);
1786
+ await utils.enforceEndpoint(entity, key, meta).read("seMetering", ["status"]);
1787
+ },
1788
+ },
1789
+ metering_extended_status: {
1790
+ key: ["extended_status"],
1791
+ convertGet: async (entity, key, meta) => {
1792
+ utils.assertEndpoint(entity);
1793
+ await utils.enforceEndpoint(entity, key, meta).read("seMetering", ["extendedStatus"]);
1794
+ },
1795
+ },
1796
+ currentsummdelivered: {
1797
+ key: ["energy"],
1798
+ convertGet: async (entity, key, meta) => {
1799
+ utils.assertEndpoint(entity);
1800
+ const ep = (0, modernExtend_1.determineEndpoint)(entity, meta, "seMetering");
1801
+ await ep.read("seMetering", ["currentSummDelivered"]);
1802
+ },
1803
+ },
1804
+ currentsummreceived: {
1805
+ key: ["produced_energy"],
1806
+ convertGet: async (entity, key, meta) => {
1807
+ utils.assertEndpoint(entity);
1808
+ const ep = (0, modernExtend_1.determineEndpoint)(entity, meta, "seMetering");
1809
+ await ep.read("seMetering", ["currentSummReceived"]);
1810
+ },
1811
+ },
1812
+ frequency: {
1813
+ key: ["ac_frequency"],
1814
+ convertGet: async (entity, key, meta) => {
1815
+ const ep = (0, modernExtend_1.determineEndpoint)(entity, meta, "haElectricalMeasurement");
1816
+ await ep.read("haElectricalMeasurement", ["acFrequency"]);
1817
+ },
1818
+ },
1819
+ electrical_measurement_power_reactive: {
1820
+ key: ["power_reactive"],
1821
+ convertGet: async (entity, key, meta) => {
1822
+ await entity.read("haElectricalMeasurement", ["reactivePower"]);
1823
+ },
1824
+ },
1825
+ powerfactor: {
1826
+ key: ["power_factor"],
1827
+ convertGet: async (entity, key, meta) => {
1828
+ const ep = (0, modernExtend_1.determineEndpoint)(entity, meta, "haElectricalMeasurement");
1829
+ await ep.read("haElectricalMeasurement", ["powerFactor"]);
1830
+ },
1831
+ },
1832
+ acvoltage: {
1833
+ key: ["voltage"],
1834
+ convertGet: async (entity, key, meta) => {
1835
+ const ep = (0, modernExtend_1.determineEndpoint)(entity, meta, "haElectricalMeasurement");
1836
+ await ep.read("haElectricalMeasurement", ["rmsVoltage"]);
1837
+ },
1838
+ },
1839
+ acvoltage_phase_b: {
1840
+ key: ["voltage_phase_b"],
1841
+ convertGet: async (entity, key, meta) => {
1842
+ const ep = (0, modernExtend_1.determineEndpoint)(entity, meta, "haElectricalMeasurement");
1843
+ await ep.read("haElectricalMeasurement", ["rmsVoltagePhB"]);
1844
+ },
1845
+ },
1846
+ acvoltage_phase_c: {
1847
+ key: ["voltage_phase_c"],
1848
+ convertGet: async (entity, key, meta) => {
1849
+ const ep = (0, modernExtend_1.determineEndpoint)(entity, meta, "haElectricalMeasurement");
1850
+ await ep.read("haElectricalMeasurement", ["rmsVoltagePhC"]);
1851
+ },
1852
+ },
1853
+ accurrent: {
1854
+ key: ["current"],
1855
+ convertGet: async (entity, key, meta) => {
1856
+ const ep = (0, modernExtend_1.determineEndpoint)(entity, meta, "haElectricalMeasurement");
1857
+ await ep.read("haElectricalMeasurement", ["rmsCurrent"]);
1858
+ },
1859
+ },
1860
+ accurrent_phase_b: {
1861
+ key: ["current_phase_b"],
1862
+ convertGet: async (entity, key, meta) => {
1863
+ const ep = (0, modernExtend_1.determineEndpoint)(entity, meta, "haElectricalMeasurement");
1864
+ await ep.read("haElectricalMeasurement", ["rmsCurrentPhB"]);
1865
+ },
1866
+ },
1867
+ accurrent_phase_c: {
1868
+ key: ["current_phase_c"],
1869
+ convertGet: async (entity, key, meta) => {
1870
+ const ep = (0, modernExtend_1.determineEndpoint)(entity, meta, "haElectricalMeasurement");
1871
+ await ep.read("haElectricalMeasurement", ["rmsCurrentPhC"]);
1872
+ },
1873
+ },
1874
+ temperature: {
1875
+ key: ["temperature"],
1876
+ convertGet: async (entity, key, meta) => {
1877
+ await entity.read("msTemperatureMeasurement", ["measuredValue"]);
1878
+ },
1879
+ },
1880
+ humidity: {
1881
+ key: ["humidity"],
1882
+ convertGet: async (entity, key, meta) => {
1883
+ await entity.read("msRelativeHumidity", ["measuredValue"]);
1884
+ },
1885
+ },
1886
+ // #endregion
1887
+ // #region Non-generic converters
1888
+ elko_power_status: {
1889
+ key: ["system_mode"],
1890
+ convertSet: async (entity, key, value, meta) => {
1891
+ await entity.write("hvacThermostat", { elkoPowerStatus: value === "heat" });
1892
+ return { state: { system_mode: value } };
1893
+ },
1894
+ convertGet: async (entity, key, meta) => {
1895
+ await entity.read("hvacThermostat", ["elkoPowerStatus"]);
1896
+ },
1897
+ },
1898
+ elko_relay_state: {
1899
+ key: ["running_state"],
1900
+ convertGet: async (entity, key, meta) => {
1901
+ await entity.read("hvacThermostat", ["elkoRelayState"]);
1902
+ },
1903
+ },
1904
+ elko_local_temperature_calibration: {
1905
+ key: ["local_temperature_calibration"],
1906
+ convertSet: async (entity, key, value, meta) => {
1907
+ utils.assertNumber(value, key);
1908
+ await entity.write("hvacThermostat", { elkoCalibration: Math.round(value * 10) });
1909
+ return { state: { local_temperature_calibration: value } };
1910
+ },
1911
+ convertGet: async (entity, key, meta) => {
1912
+ await entity.read("hvacThermostat", ["elkoCalibration"]);
1913
+ },
1914
+ },
1915
+ livolo_socket_switch_on_off: {
1916
+ key: ["state"],
1917
+ convertSet: async (entity, key, value, meta) => {
1918
+ if (typeof value !== "string") {
1919
+ return;
1920
+ }
1921
+ const state = value.toLowerCase();
1922
+ let oldstate = 1;
1923
+ if (state === "on") {
1924
+ oldstate = 108;
1925
+ }
1926
+ let channel = 1.0;
1927
+ const postfix = meta.endpoint_name || "left";
1928
+ await entity.command("genOnOff", "toggle", {}, { transactionSequenceNumber: 0 });
1929
+ const payloadOn = { 1: { value: Buffer.from([1, 0, 0, 0, 0, 0, 0, 0]), type: 1 } };
1930
+ const payloadOff = { 1: { value: Buffer.from([0, 0, 0, 0, 0, 0, 0, 0]), type: 1 } };
1931
+ const payloadOnRight = { 1: { value: Buffer.from([2, 0, 0, 0, 0, 0, 0, 0]), type: 2 } };
1932
+ const payloadOffRight = { 1: { value: Buffer.from([0, 0, 0, 0, 0, 0, 0, 0]), type: 2 } };
1933
+ const payloadOnBottomLeft = { 1: { value: Buffer.from([4, 0, 0, 0, 0, 0, 0, 0]), type: 4 } };
1934
+ const payloadOffBottomLeft = { 1: { value: Buffer.from([0, 0, 0, 0, 0, 0, 0, 0]), type: 4 } };
1935
+ const payloadOnBottomRight = { 1: { value: Buffer.from([8, 0, 0, 0, 0, 0, 0, 0]), type: 136 } };
1936
+ const payloadOffBottomRight = { 1: { value: Buffer.from([0, 0, 0, 0, 0, 0, 0, 0]), type: 136 } };
1937
+ if (postfix === "left") {
1938
+ await entity.command("genLevelCtrl", "moveToLevelWithOnOff", { level: oldstate, transtime: channel });
1939
+ await entity.write("genPowerCfg", state === "on" ? payloadOn : payloadOff, {
1940
+ manufacturerCode: 0x1ad2,
1941
+ disableDefaultResponse: true,
1942
+ disableResponse: true,
1943
+ reservedBits: 3,
1944
+ direction: 1,
1945
+ transactionSequenceNumber: 0xe9,
1946
+ });
1947
+ return { state: { state: value.toUpperCase() } };
1948
+ }
1949
+ if (postfix === "right") {
1950
+ channel = 2.0;
1951
+ await entity.command("genLevelCtrl", "moveToLevelWithOnOff", { level: oldstate, transtime: channel });
1952
+ await entity.write("genPowerCfg", state === "on" ? payloadOnRight : payloadOffRight, {
1953
+ manufacturerCode: 0x1ad2,
1954
+ disableDefaultResponse: true,
1955
+ disableResponse: true,
1956
+ reservedBits: 3,
1957
+ direction: 1,
1958
+ transactionSequenceNumber: 0xe9,
1959
+ });
1960
+ return { state: { state: value.toUpperCase() } };
1961
+ }
1962
+ if (postfix === "bottom_right") {
1963
+ await entity.write("genPowerCfg", state === "on" ? payloadOnBottomRight : payloadOffBottomRight, {
1964
+ manufacturerCode: 0x1ad2,
1965
+ disableDefaultResponse: true,
1966
+ disableResponse: true,
1967
+ reservedBits: 3,
1968
+ direction: 1,
1969
+ transactionSequenceNumber: 0xe9,
1970
+ });
1971
+ return { state: { state: value.toUpperCase() } };
1972
+ }
1973
+ if (postfix === "bottom_left") {
1974
+ await entity.write("genPowerCfg", state === "on" ? payloadOnBottomLeft : payloadOffBottomLeft, {
1975
+ manufacturerCode: 0x1ad2,
1976
+ disableDefaultResponse: true,
1977
+ disableResponse: true,
1978
+ reservedBits: 3,
1979
+ direction: 1,
1980
+ transactionSequenceNumber: 0xe9,
1981
+ });
1982
+ return { state: { state: value.toUpperCase() } };
1983
+ }
1984
+ return { state: { state: value.toUpperCase() } };
1985
+ },
1986
+ convertGet: async (entity, key, meta) => {
1987
+ await entity.command("genOnOff", "toggle", {}, { transactionSequenceNumber: 0 });
1988
+ },
1989
+ },
1990
+ livolo_switch_on_off: {
1991
+ key: ["state"],
1992
+ convertSet: async (entity, key, value, meta) => {
1993
+ utils.assertString(value, key);
1994
+ const postfix = meta.endpoint_name || "left";
1995
+ const state = value.toLowerCase() === "on" ? 108 : 1;
1996
+ let channel = 1;
1997
+ if (postfix === "left") {
1998
+ channel = 1.0;
1999
+ }
2000
+ else if (postfix === "right") {
2001
+ channel = 2.0;
2002
+ }
2003
+ else {
2004
+ return;
2005
+ }
2006
+ await entity.command("genLevelCtrl", "moveToLevelWithOnOff", { level: state, transtime: channel });
2007
+ return { state: { state: value.toUpperCase() } };
2008
+ },
2009
+ convertGet: async (entity, key, meta) => {
2010
+ await entity.command("genOnOff", "toggle", {}, { transactionSequenceNumber: 0 });
2011
+ },
2012
+ },
2013
+ livolo_dimmer_level: {
2014
+ key: ["brightness", "brightness_percent", "level"],
2015
+ convertSet: async (entity, key, value, meta) => {
2016
+ // upscale to 100
2017
+ value = Number(value);
2018
+ utils.assertNumber(value, key);
2019
+ let newValue;
2020
+ if (key === "level") {
2021
+ if (value >= 0 && value <= 1000) {
2022
+ newValue = utils.mapNumberRange(value, 0, 1000, 0, 100);
2023
+ }
2024
+ else {
2025
+ throw new Error("Dimmer level is out of range 0..1000");
2026
+ }
2027
+ }
2028
+ else if (key === "brightness_percent") {
2029
+ if (value >= 0 && value <= 100) {
2030
+ newValue = Math.round(value);
2031
+ }
2032
+ else {
2033
+ throw new Error("Dimmer brightness_percent is out of range 0..100");
2034
+ }
2035
+ }
2036
+ else {
2037
+ if (value >= 0 && value <= 255) {
2038
+ newValue = utils.mapNumberRange(value, 0, 255, 0, 100);
2039
+ }
2040
+ else {
2041
+ throw new Error("Dimmer brightness is out of range 0..255");
2042
+ }
2043
+ }
2044
+ await entity.command("genOnOff", "toggle", {}, { transactionSequenceNumber: 0 });
2045
+ const payload = { 769: { value: Buffer.from([newValue, 0, 0, 0, 0, 0, 0, 0]), type: 1 } };
2046
+ await entity.write("genPowerCfg", payload, {
2047
+ manufacturerCode: 0x1ad2,
2048
+ disableDefaultResponse: true,
2049
+ disableResponse: true,
2050
+ reservedBits: 3,
2051
+ direction: 1,
2052
+ transactionSequenceNumber: 0xe9,
2053
+ writeUndiv: true,
2054
+ });
2055
+ return {
2056
+ state: { brightness_percent: newValue, brightness: utils.mapNumberRange(newValue, 0, 100, 0, 255), level: newValue * 10 },
2057
+ };
2058
+ },
2059
+ convertGet: async (entity, key, meta) => {
2060
+ await entity.command("genOnOff", "toggle", {}, { transactionSequenceNumber: 0 });
2061
+ },
2062
+ },
2063
+ livolo_cover_state: {
2064
+ key: ["state"],
2065
+ convertSet: async (entity, key, value, meta) => {
2066
+ utils.assertEndpoint(entity);
2067
+ let payload;
2068
+ const options = {
2069
+ frameType: 0,
2070
+ manufacturerCode: 0x1ad2,
2071
+ disableDefaultResponse: true,
2072
+ disableResponse: true,
2073
+ reservedBits: 3,
2074
+ direction: 1,
2075
+ writeUndiv: true,
2076
+ transactionSequenceNumber: 0xe9,
2077
+ };
2078
+ switch (value) {
2079
+ case "OPEN":
2080
+ payload = { attrId: 0x0000, selector: null, elementData: [0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00] };
2081
+ break;
2082
+ case "CLOSE":
2083
+ payload = { attrId: 0x0000, selector: null, elementData: [0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00] };
2084
+ break;
2085
+ case "STOP":
2086
+ payload = { attrId: 0x0000, selector: null, elementData: [0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00] };
2087
+ break;
2088
+ default:
2089
+ throw new Error(`Value '${value}' is not a valid cover position (must be one of 'OPEN' or 'CLOSE')`);
2090
+ }
2091
+ await entity.writeStructured("genPowerCfg", [payload], options);
2092
+ return {
2093
+ state: {
2094
+ moving: true,
2095
+ },
2096
+ };
2097
+ },
2098
+ },
2099
+ livolo_cover_position: {
2100
+ key: ["position"],
2101
+ convertSet: async (entity, key, value, meta) => {
2102
+ utils.assertNumber(value, key);
2103
+ const position = 100 - value;
2104
+ await entity.command("genOnOff", "toggle", {}, { transactionSequenceNumber: 0 });
2105
+ const payload = { 1025: { value: [position, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00], type: 1 } };
2106
+ await entity.write("genPowerCfg", payload, {
2107
+ manufacturerCode: 0x1ad2,
2108
+ disableDefaultResponse: true,
2109
+ disableResponse: true,
2110
+ reservedBits: 3,
2111
+ direction: 1,
2112
+ transactionSequenceNumber: 0xe9,
2113
+ writeUndiv: true,
2114
+ });
2115
+ return {
2116
+ state: {
2117
+ position: value,
2118
+ moving: true,
2119
+ },
2120
+ };
2121
+ },
2122
+ },
2123
+ livolo_cover_options: {
2124
+ key: ["options"],
2125
+ convertSet: async (entity, key, value, meta) => {
2126
+ utils.assertObject(value);
2127
+ const options = {
2128
+ frameType: 0,
2129
+ manufacturerCode: 0x1ad2,
2130
+ disableDefaultResponse: true,
2131
+ disableResponse: true,
2132
+ reservedBits: 3,
2133
+ direction: 1,
2134
+ writeUndiv: true,
2135
+ transactionSequenceNumber: 0xe9,
2136
+ };
2137
+ if (value.motor_direction !== undefined) {
2138
+ let direction;
2139
+ switch (value.motor_direction) {
2140
+ case "FORWARD":
2141
+ direction = 0x00;
2142
+ break;
2143
+ case "REVERSE":
2144
+ direction = 0x80;
2145
+ break;
2146
+ default:
2147
+ throw new Error(`livolo_cover_options: ${value.motor_direction} is not a valid motor direction \
2148
+ (must be one of 'FORWARD' or 'REVERSE')`);
2149
+ }
2150
+ const payload = { 4865: { value: [direction, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00] } };
2151
+ await entity.write("genPowerCfg", payload, options);
2152
+ }
2153
+ if (value.motor_speed !== undefined) {
2154
+ if (value.motor_speed < 20 || value.motor_speed > 40) {
2155
+ throw new Error("livolo_cover_options: Motor speed is out of range (20-40)");
2156
+ }
2157
+ const payload = { 4609: { value: [value.motor_speed, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00] } };
2158
+ await entity.write("genPowerCfg", payload, options);
2159
+ }
2160
+ },
2161
+ },
2162
+ ZigUP_lock: {
2163
+ key: ["led"],
2164
+ convertSet: async (entity, key, value, meta) => {
2165
+ const lookup = { off: "lockDoor", on: "unlockDoor", toggle: "toggleDoor" };
2166
+ await entity.command("closuresDoorLock", utils.getFromLookup(value, lookup), { pincodevalue: "" });
2167
+ },
2168
+ },
2169
+ LS21001_alert_behaviour: {
2170
+ key: ["alert_behaviour"],
2171
+ convertSet: async (entity, key, value, meta) => {
2172
+ const lookup = { siren_led: 3, siren: 2, led: 1, nothing: 0 };
2173
+ await entity.write("genBasic", { 16394: { value: utils.getFromLookup(value, lookup), type: 32 } }, { manufacturerCode: zigbee_herdsman_1.Zcl.ManufacturerCode.LEEDARSON_LIGHTING_CO_LTD, disableDefaultResponse: true });
2174
+ return { state: { alert_behaviour: value } };
2175
+ },
2176
+ },
2177
+ STS_PRS_251_beep: {
2178
+ key: ["beep"],
2179
+ convertSet: async (entity, key, value, meta) => {
2180
+ await entity.command("genIdentify", "identify", { identifytime: value }, utils.getOptions(meta.mapped, entity));
2181
+ },
2182
+ },
2183
+ SPZ01_power_outage_memory: {
2184
+ key: ["power_outage_memory"],
2185
+ convertSet: async (entity, key, value, meta) => {
2186
+ await entity.write("genOnOff", { 8192: { value: value ? 0x01 : 0x00, type: 0x20 } });
2187
+ return { state: { power_outage_memory: value } };
2188
+ },
2189
+ },
2190
+ tuya_relay_din_led_indicator: {
2191
+ key: ["indicator_mode"],
2192
+ convertSet: async (entity, key, value, meta) => {
2193
+ utils.assertString(value, key);
2194
+ value = value.toLowerCase();
2195
+ const lookup = { off: 0x00, on_off: 0x01, off_on: 0x02 };
2196
+ const payload = utils.getFromLookup(value, lookup);
2197
+ await entity.write("genOnOff", { 32769: { value: payload, type: 0x30 } });
2198
+ return { state: { indicator_mode: value } };
2199
+ },
2200
+ },
2201
+ kmpcil_res005_on_off: {
2202
+ key: ["state"],
2203
+ convertSet: async (entity, key, value, meta) => {
2204
+ utils.assertString(value, key);
2205
+ const options = { disableDefaultResponse: true };
2206
+ value = value.toLowerCase();
2207
+ utils.assertString(value, key);
2208
+ utils.validateValue(value, ["toggle", "off", "on"]);
2209
+ if (value === "toggle") {
2210
+ if (meta.state.state === undefined) {
2211
+ throw new Error("Cannot toggle, state not known yet");
2212
+ }
2213
+ const payload = { 85: { value: meta.state.state === "OFF" ? 0x01 : 0x00, type: 0x10 } };
2214
+ await entity.write("genBinaryOutput", payload, options);
2215
+ return { state: { state: meta.state.state === "OFF" ? "ON" : "OFF" } };
2216
+ }
2217
+ const payload = { 85: { value: value.toUpperCase() === "OFF" ? 0x00 : 0x01, type: 0x10 } };
2218
+ await entity.write("genBinaryOutput", payload, options);
2219
+ return { state: { state: value.toUpperCase() } };
2220
+ },
2221
+ convertGet: async (entity, key, meta) => {
2222
+ await entity.read("genBinaryOutput", ["presentValue"]);
2223
+ },
2224
+ },
2225
+ hue_wall_switch_device_mode: {
2226
+ key: ["device_mode"],
2227
+ convertSet: async (entity, key, value, meta) => {
2228
+ utils.assertString(value);
2229
+ const values = ["single_rocker", "single_push_button", "dual_rocker", "dual_push_button"];
2230
+ utils.validateValue(value, values);
2231
+ await entity.write("genBasic", { 52: { value: values.indexOf(value), type: 48 } }, manufacturerOptions.hue);
2232
+ },
2233
+ convertGet: async (entity, key, meta) => {
2234
+ await entity.read("genBasic", [0x0034], manufacturerOptions.hue);
2235
+ },
2236
+ },
2237
+ danfoss_thermostat_occupied_heating_setpoint: {
2238
+ key: ["occupied_heating_setpoint"],
2239
+ convertSet: async (entity, key, value, meta) => {
2240
+ utils.assertNumber(value, key);
2241
+ const payload = {
2242
+ // 1: "User Interaction" Changes occupied heating setpoint and triggers an aggressive reaction
2243
+ // of the actuator as soon as control SW runs, to replicate the behavior of turning the dial on the eTRV.
2244
+ setpointType: 1,
2245
+ setpoint: Number((Math.round(Number((value * 2).toFixed(1))) / 2).toFixed(1)) * 100,
2246
+ };
2247
+ await entity.command("hvacThermostat", "danfossSetpointCommand", payload, manufacturerOptions.danfoss);
2248
+ },
2249
+ convertGet: async (entity, key, meta) => {
2250
+ await entity.read("hvacThermostat", ["occupiedHeatingSetpoint"]);
2251
+ },
2252
+ },
2253
+ danfoss_thermostat_occupied_heating_setpoint_scheduled: {
2254
+ key: ["occupied_heating_setpoint_scheduled"],
2255
+ convertSet: async (entity, key, value, meta) => {
2256
+ utils.assertNumber(value, key);
2257
+ const payload = {
2258
+ // 0: "Schedule Change" Just changes occupied heating setpoint. No special behavior,
2259
+ // the PID control setpoint will be update with the new setpoint.
2260
+ setpointType: 0,
2261
+ setpoint: Number((Math.round(Number((value * 2).toFixed(1))) / 2).toFixed(1)) * 100,
2262
+ };
2263
+ await entity.command("hvacThermostat", "danfossSetpointCommand", payload, manufacturerOptions.danfoss);
2264
+ },
2265
+ convertGet: async (entity, key, meta) => {
2266
+ await entity.read("hvacThermostat", ["occupiedHeatingSetpoint"]);
2267
+ },
2268
+ },
2269
+ danfoss_mounted_mode_active: {
2270
+ key: ["mounted_mode_active"],
2271
+ convertGet: async (entity, key, meta) => {
2272
+ await entity.read("hvacThermostat", ["danfossMountedModeActive"], manufacturerOptions.danfoss);
2273
+ },
2274
+ },
2275
+ danfoss_mounted_mode_control: {
2276
+ key: ["mounted_mode_control"],
2277
+ convertSet: async (entity, key, value, meta) => {
2278
+ await entity.write("hvacThermostat", { danfossMountedModeControl: value }, manufacturerOptions.danfoss);
2279
+ return { state: { mounted_mode_control: value } };
2280
+ },
2281
+ convertGet: async (entity, key, meta) => {
2282
+ await entity.read("hvacThermostat", ["danfossMountedModeControl"], manufacturerOptions.danfoss);
2283
+ },
2284
+ },
2285
+ danfoss_thermostat_vertical_orientation: {
2286
+ key: ["thermostat_vertical_orientation"],
2287
+ convertSet: async (entity, key, value, meta) => {
2288
+ await entity.write("hvacThermostat", { danfossThermostatOrientation: value }, manufacturerOptions.danfoss);
2289
+ return { state: { thermostat_vertical_orientation: value } };
2290
+ },
2291
+ convertGet: async (entity, key, meta) => {
2292
+ await entity.read("hvacThermostat", ["danfossThermostatOrientation"], manufacturerOptions.danfoss);
2293
+ },
2294
+ },
2295
+ danfoss_external_measured_room_sensor: {
2296
+ key: ["external_measured_room_sensor"],
2297
+ convertSet: async (entity, key, value, meta) => {
2298
+ await entity.write("hvacThermostat", { danfossExternalMeasuredRoomSensor: value }, manufacturerOptions.danfoss);
2299
+ return { state: { external_measured_room_sensor: value } };
2300
+ },
2301
+ convertGet: async (entity, key, meta) => {
2302
+ await entity.read("hvacThermostat", ["danfossExternalMeasuredRoomSensor"], manufacturerOptions.danfoss);
2303
+ },
2304
+ },
2305
+ danfoss_radiator_covered: {
2306
+ key: ["radiator_covered"],
2307
+ convertSet: async (entity, key, value, meta) => {
2308
+ await entity.write("hvacThermostat", { danfossRadiatorCovered: value }, manufacturerOptions.danfoss);
2309
+ return { state: { radiator_covered: value } };
2310
+ },
2311
+ convertGet: async (entity, key, meta) => {
2312
+ await entity.read("hvacThermostat", ["danfossRadiatorCovered"], manufacturerOptions.danfoss);
2313
+ },
2314
+ },
2315
+ danfoss_viewing_direction: {
2316
+ key: ["viewing_direction"],
2317
+ convertSet: async (entity, key, value, meta) => {
2318
+ await entity.write("hvacUserInterfaceCfg", { danfossViewingDirection: value }, manufacturerOptions.danfoss);
2319
+ return { state: { viewing_direction: value } };
2320
+ },
2321
+ convertGet: async (entity, key, meta) => {
2322
+ await entity.read("hvacUserInterfaceCfg", ["danfossViewingDirection"], manufacturerOptions.danfoss);
2323
+ },
2324
+ },
2325
+ danfoss_algorithm_scale_factor: {
2326
+ key: ["algorithm_scale_factor"],
2327
+ convertSet: async (entity, key, value, meta) => {
2328
+ await entity.write("hvacThermostat", { danfossAlgorithmScaleFactor: value }, manufacturerOptions.danfoss);
2329
+ return { state: { algorithm_scale_factor: value } };
2330
+ },
2331
+ convertGet: async (entity, key, meta) => {
2332
+ await entity.read("hvacThermostat", ["danfossAlgorithmScaleFactor"], manufacturerOptions.danfoss);
2333
+ },
2334
+ },
2335
+ danfoss_heat_available: {
2336
+ key: ["heat_available"],
2337
+ convertSet: async (entity, key, value, meta) => {
2338
+ await entity.write("hvacThermostat", { danfossHeatAvailable: value }, manufacturerOptions.danfoss);
2339
+ return { state: { heat_available: value } };
2340
+ },
2341
+ convertGet: async (entity, key, meta) => {
2342
+ await entity.read("hvacThermostat", ["danfossHeatAvailable"], manufacturerOptions.danfoss);
2343
+ },
2344
+ },
2345
+ danfoss_heat_required: {
2346
+ key: ["heat_required"],
2347
+ convertGet: async (entity, key, meta) => {
2348
+ await entity.read("hvacThermostat", ["danfossHeatRequired"], manufacturerOptions.danfoss);
2349
+ },
2350
+ },
2351
+ danfoss_day_of_week: {
2352
+ key: ["day_of_week"],
2353
+ convertSet: async (entity, key, value, meta) => {
2354
+ const payload = { danfossDayOfWeek: utils.getKey(constants.thermostatDayOfWeek, value, undefined, Number) };
2355
+ await entity.write("hvacThermostat", payload, manufacturerOptions.danfoss);
2356
+ return { state: { day_of_week: value } };
2357
+ },
2358
+ convertGet: async (entity, key, meta) => {
2359
+ await entity.read("hvacThermostat", ["danfossDayOfWeek"], manufacturerOptions.danfoss);
2360
+ },
2361
+ },
2362
+ danfoss_trigger_time: {
2363
+ key: ["trigger_time"],
2364
+ convertSet: async (entity, key, value, meta) => {
2365
+ await entity.write("hvacThermostat", { danfossTriggerTime: value }, manufacturerOptions.danfoss);
2366
+ return { state: { trigger_time: value } };
2367
+ },
2368
+ convertGet: async (entity, key, meta) => {
2369
+ await entity.read("hvacThermostat", ["danfossTriggerTime"], manufacturerOptions.danfoss);
2370
+ },
2371
+ },
2372
+ danfoss_window_open_feature: {
2373
+ key: ["window_open_feature"],
2374
+ convertSet: async (entity, key, value, meta) => {
2375
+ await entity.write("hvacThermostat", { danfossWindowOpenFeatureEnable: value }, manufacturerOptions.danfoss);
2376
+ return { state: { window_open_feature: value } };
2377
+ },
2378
+ convertGet: async (entity, key, meta) => {
2379
+ await entity.read("hvacThermostat", ["danfossWindowOpenFeatureEnable"], manufacturerOptions.danfoss);
2380
+ },
2381
+ },
2382
+ danfoss_window_open_internal: {
2383
+ key: ["window_open_internal"],
2384
+ convertGet: async (entity, key, meta) => {
2385
+ await entity.read("hvacThermostat", ["danfossWindowOpenInternal"], manufacturerOptions.danfoss);
2386
+ },
2387
+ },
2388
+ danfoss_window_open_external: {
2389
+ key: ["window_open_external"],
2390
+ convertSet: async (entity, key, value, meta) => {
2391
+ await entity.write("hvacThermostat", { danfossWindowOpenExternal: value }, manufacturerOptions.danfoss);
2392
+ return { state: { window_open_external: value } };
2393
+ },
2394
+ convertGet: async (entity, key, meta) => {
2395
+ await entity.read("hvacThermostat", ["danfossWindowOpenExternal"], manufacturerOptions.danfoss);
2396
+ },
2397
+ },
2398
+ danfoss_load_balancing_enable: {
2399
+ key: ["load_balancing_enable"],
2400
+ convertSet: async (entity, key, value, meta) => {
2401
+ await entity.write("hvacThermostat", { danfossLoadBalancingEnable: value }, manufacturerOptions.danfoss);
2402
+ return { state: { load_balancing_enable: value } };
2403
+ },
2404
+ convertGet: async (entity, key, meta) => {
2405
+ await entity.read("hvacThermostat", ["danfossLoadBalancingEnable"], manufacturerOptions.danfoss);
2406
+ },
2407
+ },
2408
+ danfoss_load_room_mean: {
2409
+ key: ["load_room_mean"],
2410
+ convertSet: async (entity, key, value, meta) => {
2411
+ await entity.write("hvacThermostat", { danfossLoadRoomMean: value }, manufacturerOptions.danfoss);
2412
+ return { state: { load_room_mean: value } };
2413
+ },
2414
+ convertGet: async (entity, key, meta) => {
2415
+ await entity.read("hvacThermostat", ["danfossLoadRoomMean"], manufacturerOptions.danfoss);
2416
+ },
2417
+ },
2418
+ danfoss_load_estimate: {
2419
+ key: ["load_estimate"],
2420
+ convertGet: async (entity, key, meta) => {
2421
+ await entity.read("hvacThermostat", ["danfossLoadEstimate"], manufacturerOptions.danfoss);
2422
+ },
2423
+ },
2424
+ danfoss_preheat_status: {
2425
+ key: ["preheat_status"],
2426
+ convertGet: async (entity, key, meta) => {
2427
+ await entity.read("hvacThermostat", ["danfossPreheatStatus"], manufacturerOptions.danfoss);
2428
+ },
2429
+ },
2430
+ danfoss_adaptation_status: {
2431
+ key: ["adaptation_run_status"],
2432
+ convertGet: async (entity, key, meta) => {
2433
+ await entity.read("hvacThermostat", ["danfossAdaptionRunStatus"], manufacturerOptions.danfoss);
2434
+ },
2435
+ },
2436
+ danfoss_adaptation_settings: {
2437
+ key: ["adaptation_run_settings"],
2438
+ convertSet: async (entity, key, value, meta) => {
2439
+ await entity.write("hvacThermostat", { danfossAdaptionRunSettings: value }, manufacturerOptions.danfoss);
2440
+ return { state: { adaptation_run_settings: value } };
2441
+ },
2442
+ convertGet: async (entity, key, meta) => {
2443
+ await entity.read("hvacThermostat", ["danfossAdaptionRunSettings"], manufacturerOptions.danfoss);
2444
+ },
2445
+ },
2446
+ danfoss_adaptation_control: {
2447
+ key: ["adaptation_run_control"],
2448
+ convertSet: async (entity, key, value, meta) => {
2449
+ const payload = { danfossAdaptionRunControl: utils.getKey(constants.danfossAdaptionRunControl, value, value, Number) };
2450
+ await entity.write("hvacThermostat", payload, manufacturerOptions.danfoss);
2451
+ return { state: { adaptation_run_control: value } };
2452
+ },
2453
+ convertGet: async (entity, key, meta) => {
2454
+ await entity.read("hvacThermostat", ["danfossAdaptionRunControl"], manufacturerOptions.danfoss);
2455
+ },
2456
+ },
2457
+ danfoss_regulation_setpoint_offset: {
2458
+ key: ["regulation_setpoint_offset"],
2459
+ convertSet: async (entity, key, value, meta) => {
2460
+ const payload = { danfossRegulationSetpointOffset: value };
2461
+ await entity.write("hvacThermostat", payload, manufacturerOptions.danfoss);
2462
+ return { state: { regulation_setpoint_offset: value } };
2463
+ },
2464
+ convertGet: async (entity, key, meta) => {
2465
+ await entity.read("hvacThermostat", ["danfossRegulationSetpointOffset"], manufacturerOptions.danfoss);
2466
+ },
2467
+ },
2468
+ danfoss_output_status: {
2469
+ key: ["output_status"],
2470
+ convertGet: async (entity, key, meta) => {
2471
+ await entity.read("hvacThermostat", ["danfossOutputStatus"], manufacturerOptions.danfoss);
2472
+ },
2473
+ },
2474
+ danfoss_room_status_code: {
2475
+ key: ["room_status_code"],
2476
+ convertGet: async (entity, key, meta) => {
2477
+ await entity.read("hvacThermostat", ["danfossRoomStatusCode"], manufacturerOptions.danfoss);
2478
+ },
2479
+ },
2480
+ danfoss_floor_sensor_mode: {
2481
+ key: ["room_floor_sensor_mode"],
2482
+ convertGet: async (entity, key, meta) => {
2483
+ await entity.read("hvacThermostat", ["danfossRoomFloorSensorMode"], manufacturerOptions.danfoss);
2484
+ },
2485
+ },
2486
+ danfoss_floor_min_setpoint: {
2487
+ key: ["floor_min_setpoint"],
2488
+ convertSet: async (entity, key, value, meta) => {
2489
+ utils.assertNumber(value, key);
2490
+ const danfossFloorMinSetpoint = Number((Math.round(Number((value * 2).toFixed(1))) / 2).toFixed(1)) * 100;
2491
+ await entity.write("hvacThermostat", { danfossFloorMinSetpoint }, manufacturerOptions.danfoss);
2492
+ return { state: { floor_min_setpoint: value } };
2493
+ },
2494
+ convertGet: async (entity, key, meta) => {
2495
+ await entity.read("hvacThermostat", ["danfossFloorMinSetpoint"], manufacturerOptions.danfoss);
2496
+ },
2497
+ },
2498
+ danfoss_floor_max_setpoint: {
2499
+ key: ["floor_max_setpoint"],
2500
+ convertSet: async (entity, key, value, meta) => {
2501
+ utils.assertNumber(value, key);
2502
+ const danfossFloorMaxSetpoint = Number((Math.round(Number((value * 2).toFixed(1))) / 2).toFixed(1)) * 100;
2503
+ await entity.write("hvacThermostat", { danfossFloorMaxSetpoint }, manufacturerOptions.danfoss);
2504
+ return { state: { floor_max_setpoint: value } };
2505
+ },
2506
+ convertGet: async (entity, key, meta) => {
2507
+ await entity.read("hvacThermostat", ["danfossFloorMaxSetpoint"], manufacturerOptions.danfoss);
2508
+ },
2509
+ },
2510
+ danfoss_system_status_code: {
2511
+ key: ["system_status_code"],
2512
+ convertGet: async (entity, key, meta) => {
2513
+ await entity.read("haDiagnostic", ["danfossSystemStatusCode"], manufacturerOptions.danfoss);
2514
+ },
2515
+ },
2516
+ danfoss_system_status_water: {
2517
+ key: ["system_status_water"],
2518
+ convertGet: async (entity, key, meta) => {
2519
+ await entity.read("haDiagnostic", ["danfossSystemStatusWater"], manufacturerOptions.danfoss);
2520
+ },
2521
+ },
2522
+ danfoss_multimaster_role: {
2523
+ key: ["multimaster_role"],
2524
+ convertGet: async (entity, key, meta) => {
2525
+ await entity.read("haDiagnostic", ["danfossMultimasterRole"], manufacturerOptions.danfoss);
2526
+ },
2527
+ },
2528
+ ZMCSW032D_cover_position: {
2529
+ key: ["position", "tilt"],
2530
+ convertSet: async (entity, key, value, meta) => {
2531
+ utils.assertNumber(value, key);
2532
+ if (meta.options.time_close !== undefined && meta.options.time_open !== undefined) {
2533
+ const sleepSeconds = async (s) => {
2534
+ return await new Promise((resolve) => setTimeout(resolve, s * 1000));
2535
+ };
2536
+ const oldPosition = meta.state.position;
2537
+ if (value === 100) {
2538
+ await entity.command("closuresWindowCovering", "upOpen", {}, utils.getOptions(meta.mapped, entity));
2539
+ }
2540
+ else if (value === 0) {
2541
+ await entity.command("closuresWindowCovering", "downClose", {}, utils.getOptions(meta.mapped, entity));
2542
+ }
2543
+ else {
2544
+ if (utils.isNumber(oldPosition) && oldPosition > value) {
2545
+ const delta = oldPosition - value;
2546
+ utils.assertNumber(meta.options.time_open);
2547
+ const mutiplicateur = meta.options.time_open / 100;
2548
+ const timeBeforeStop = delta * mutiplicateur;
2549
+ await entity.command("closuresWindowCovering", "downClose", {}, utils.getOptions(meta.mapped, entity));
2550
+ await sleepSeconds(timeBeforeStop);
2551
+ await entity.command("closuresWindowCovering", "stop", {}, utils.getOptions(meta.mapped, entity));
2552
+ }
2553
+ else if (utils.isNumber(oldPosition) && oldPosition < value) {
2554
+ const delta = value - oldPosition;
2555
+ utils.assertNumber(meta.options.time_close);
2556
+ const mutiplicateur = meta.options.time_close / 100;
2557
+ const timeBeforeStop = delta * mutiplicateur;
2558
+ await entity.command("closuresWindowCovering", "upOpen", {}, utils.getOptions(meta.mapped, entity));
2559
+ await sleepSeconds(timeBeforeStop);
2560
+ await entity.command("closuresWindowCovering", "stop", {}, utils.getOptions(meta.mapped, entity));
2561
+ }
2562
+ }
2563
+ return { state: { position: value } };
2564
+ }
2565
+ },
2566
+ convertGet: async (entity, key, meta) => {
2567
+ const isPosition = key === "position";
2568
+ await entity.read("closuresWindowCovering", [isPosition ? "currentPositionLiftPercentage" : "currentPositionTiltPercentage"]);
2569
+ },
2570
+ },
2571
+ namron_thermostat: {
2572
+ key: [
2573
+ "lcd_brightness",
2574
+ "button_vibration_level",
2575
+ "floor_sensor_type",
2576
+ "sensor",
2577
+ "powerup_status",
2578
+ "floor_sensor_calibration",
2579
+ "dry_time",
2580
+ "mode_after_dry",
2581
+ "temperature_display",
2582
+ "window_open_check",
2583
+ "hysterersis",
2584
+ "display_auto_off_enabled",
2585
+ "alarm_airtemp_overvalue",
2586
+ "away_mode",
2587
+ ],
2588
+ convertSet: async (entity, key, value, meta) => {
2589
+ if (key === "lcd_brightness") {
2590
+ const lookup = { low: 0, mid: 1, high: 2 };
2591
+ const payload = { 4096: { value: utils.getFromLookup(value, lookup), type: zigbee_herdsman_1.Zcl.DataType.ENUM8 } };
2592
+ await entity.write("hvacThermostat", payload, manufacturerOptions.sunricher);
2593
+ }
2594
+ else if (key === "button_vibration_level") {
2595
+ const lookup = { off: 0, low: 1, high: 2 };
2596
+ const payload = { 4097: { value: utils.getFromLookup(value, lookup), type: zigbee_herdsman_1.Zcl.DataType.ENUM8 } };
2597
+ await entity.write("hvacThermostat", payload, manufacturerOptions.sunricher);
2598
+ }
2599
+ else if (key === "floor_sensor_type") {
2600
+ const lookup = { "10k": 1, "15k": 2, "50k": 3, "100k": 4, "12k": 5 };
2601
+ const payload = { 4098: { value: utils.getFromLookup(value, lookup), type: zigbee_herdsman_1.Zcl.DataType.ENUM8 } };
2602
+ await entity.write("hvacThermostat", payload, manufacturerOptions.sunricher);
2603
+ }
2604
+ else if (key === "sensor") {
2605
+ const lookup = { air: 0, floor: 1, both: 2 };
2606
+ const payload = { 4099: { value: utils.getFromLookup(value, lookup), type: zigbee_herdsman_1.Zcl.DataType.ENUM8 } };
2607
+ await entity.write("hvacThermostat", payload, manufacturerOptions.sunricher);
2608
+ }
2609
+ else if (key === "powerup_status") {
2610
+ const lookup = { default: 0, last_status: 1 };
2611
+ const payload = { 4100: { value: utils.getFromLookup(value, lookup), type: zigbee_herdsman_1.Zcl.DataType.ENUM8 } };
2612
+ await entity.write("hvacThermostat", payload, manufacturerOptions.sunricher);
2613
+ }
2614
+ else if (key === "floor_sensor_calibration") {
2615
+ utils.assertNumber(value);
2616
+ const payload = { 4101: { value: Math.round(value * 10), type: 0x28 } }; // INT8S
2617
+ await entity.write("hvacThermostat", payload, manufacturerOptions.sunricher);
2618
+ }
2619
+ else if (key === "dry_time") {
2620
+ const payload = { 4102: { value: value, type: 0x20 } }; // INT8U
2621
+ await entity.write("hvacThermostat", payload, manufacturerOptions.sunricher);
2622
+ }
2623
+ else if (key === "mode_after_dry") {
2624
+ const lookup = { off: 0, manual: 1, auto: 2, away: 3 };
2625
+ const payload = { 4103: { value: utils.getFromLookup(value, lookup), type: zigbee_herdsman_1.Zcl.DataType.ENUM8 } };
2626
+ await entity.write("hvacThermostat", payload, manufacturerOptions.sunricher);
2627
+ }
2628
+ else if (key === "temperature_display") {
2629
+ const lookup = { room: 0, floor: 1 };
2630
+ const payload = { 4104: { value: utils.getFromLookup(value, lookup), type: zigbee_herdsman_1.Zcl.DataType.ENUM8 } };
2631
+ await entity.write("hvacThermostat", payload, manufacturerOptions.sunricher);
2632
+ }
2633
+ else if (key === "window_open_check") {
2634
+ utils.assertNumber(value);
2635
+ const payload = { 4105: { value: value * 2, type: 0x20 } };
2636
+ await entity.write("hvacThermostat", payload, manufacturerOptions.sunricher);
2637
+ }
2638
+ else if (key === "hysterersis") {
2639
+ utils.assertNumber(value);
2640
+ const payload = { 4106: { value: value * 10, type: 0x20 } };
2641
+ await entity.write("hvacThermostat", payload, manufacturerOptions.sunricher);
2642
+ }
2643
+ else if (key === "display_auto_off_enabled") {
2644
+ const lookup = { disabled: 0, enabled: 1 };
2645
+ const payload = { 4107: { value: utils.getFromLookup(value, lookup), type: zigbee_herdsman_1.Zcl.DataType.ENUM8 } };
2646
+ await entity.write("hvacThermostat", payload, manufacturerOptions.sunricher);
2647
+ }
2648
+ else if (key === "alarm_airtemp_overvalue") {
2649
+ const payload = { 8193: { value: value, type: 0x20 } };
2650
+ await entity.write("hvacThermostat", payload, manufacturerOptions.sunricher);
2651
+ }
2652
+ else if (key === "away_mode") {
2653
+ const payload = { 8194: { value: Number(value === "ON"), type: 0x30 } };
2654
+ await entity.write("hvacThermostat", payload, manufacturerOptions.sunricher);
2655
+ }
2656
+ },
2657
+ convertGet: async (entity, key, meta) => {
2658
+ switch (key) {
2659
+ case "lcd_brightness":
2660
+ await entity.read("hvacThermostat", [0x1000], manufacturerOptions.sunricher);
2661
+ break;
2662
+ case "button_vibration_level":
2663
+ await entity.read("hvacThermostat", [0x1001], manufacturerOptions.sunricher);
2664
+ break;
2665
+ case "floor_sensor_type":
2666
+ await entity.read("hvacThermostat", [0x1002], manufacturerOptions.sunricher);
2667
+ break;
2668
+ case "sensor":
2669
+ await entity.read("hvacThermostat", [0x1003], manufacturerOptions.sunricher);
2670
+ break;
2671
+ case "powerup_status":
2672
+ await entity.read("hvacThermostat", [0x1004], manufacturerOptions.sunricher);
2673
+ break;
2674
+ case "floor_sensor_calibration":
2675
+ await entity.read("hvacThermostat", [0x1005], manufacturerOptions.sunricher);
2676
+ break;
2677
+ case "dry_time":
2678
+ await entity.read("hvacThermostat", [0x1006], manufacturerOptions.sunricher);
2679
+ break;
2680
+ case "mode_after_dry":
2681
+ await entity.read("hvacThermostat", [0x1007], manufacturerOptions.sunricher);
2682
+ break;
2683
+ case "temperature_display":
2684
+ await entity.read("hvacThermostat", [0x1008], manufacturerOptions.sunricher);
2685
+ break;
2686
+ case "window_open_check":
2687
+ await entity.read("hvacThermostat", [0x1009], manufacturerOptions.sunricher);
2688
+ break;
2689
+ case "hysterersis":
2690
+ await entity.read("hvacThermostat", [0x100a], manufacturerOptions.sunricher);
2691
+ break;
2692
+ case "display_auto_off_enabled":
2693
+ await entity.read("hvacThermostat", [0x100b], manufacturerOptions.sunricher);
2694
+ break;
2695
+ case "alarm_airtemp_overvalue":
2696
+ await entity.read("hvacThermostat", [0x2001], manufacturerOptions.sunricher);
2697
+ break;
2698
+ case "away_mode":
2699
+ await entity.read("hvacThermostat", [0x2002], manufacturerOptions.sunricher);
2700
+ break;
2701
+ default: // Unknown key
2702
+ throw new Error(`Unhandled key toZigbee.namron_thermostat.convertGet ${key}`);
2703
+ }
2704
+ },
2705
+ },
2706
+ namron_thermostat_child_lock: {
2707
+ key: ["child_lock"],
2708
+ convertSet: async (entity, key, value, meta) => {
2709
+ const keypadLockout = Number(value === "LOCK");
2710
+ await entity.write("hvacUserInterfaceCfg", { keypadLockout });
2711
+ return { state: { child_lock: value } };
2712
+ },
2713
+ convertGet: async (entity, key, meta) => {
2714
+ await entity.read("hvacUserInterfaceCfg", ["keypadLockout"]);
2715
+ },
2716
+ },
2717
+ easycode_auto_relock: {
2718
+ key: ["auto_relock"],
2719
+ convertSet: async (entity, key, value, meta) => {
2720
+ await entity.write("closuresDoorLock", { autoRelockTime: value ? 1 : 0 }, utils.getOptions(meta.mapped, entity));
2721
+ return { state: { auto_relock: value } };
2722
+ },
2723
+ },
2724
+ tuya_led_control: {
2725
+ key: ["brightness", "color", "color_temp"],
2726
+ options: [exposes.options.color_sync()],
2727
+ convertSet: async (entity, key, value, meta) => {
2728
+ if (key === "brightness" &&
2729
+ meta.state.color_mode === constants.colorModeLookup[2] &&
2730
+ meta.message.color === undefined &&
2731
+ meta.message.color_temp === undefined) {
2732
+ const zclData = { level: Number(value), transtime: 0 };
2733
+ await entity.command("genLevelCtrl", "moveToLevel", zclData, utils.getOptions(meta.mapped, entity));
2734
+ globalStore.putValue(entity, "brightness", zclData.level);
2735
+ return { state: { brightness: zclData.level } };
2736
+ }
2737
+ if (key === "brightness" && utils.isNumber(meta.message.color_temp)) {
2738
+ const zclData = { colortemp: utils.mapNumberRange(meta.message.color_temp, 500, 154, 0, 254), transtime: 0 };
2739
+ const zclDataBrightness = { level: Number(value), transtime: 0 };
2740
+ await entity.command("lightingColorCtrl", "tuyaRgbMode", { enable: 0 });
2741
+ await entity.command("lightingColorCtrl", "moveToColorTemp", zclData, utils.getOptions(meta.mapped, entity));
2742
+ await entity.command("genLevelCtrl", "moveToLevel", zclDataBrightness, utils.getOptions(meta.mapped, entity));
2743
+ globalStore.putValue(entity, "brightness", zclDataBrightness.level);
2744
+ const newState = {
2745
+ brightness: zclDataBrightness.level,
2746
+ color_mode: constants.colorModeLookup[2],
2747
+ color_temp: meta.message.color_temp,
2748
+ };
2749
+ return { state: libColor.syncColorState(newState, meta.state, entity, meta.options) };
2750
+ }
2751
+ if (key === "color_temp") {
2752
+ utils.assertNumber(value, key);
2753
+ const zclData = { colortemp: utils.mapNumberRange(value, 500, 154, 0, 254), transtime: 0 };
2754
+ const zclDataBrightness = { level: globalStore.getValue(entity, "brightness") || 100, transtime: 0 };
2755
+ await entity.command("lightingColorCtrl", "tuyaRgbMode", { enable: 0 });
2756
+ await entity.command("lightingColorCtrl", "moveToColorTemp", zclData, utils.getOptions(meta.mapped, entity));
2757
+ await entity.command("genLevelCtrl", "moveToLevel", zclDataBrightness, utils.getOptions(meta.mapped, entity));
2758
+ const newState = {
2759
+ brightness: zclDataBrightness.level,
2760
+ color_mode: constants.colorModeLookup[2],
2761
+ color_temp: value,
2762
+ };
2763
+ return { state: libColor.syncColorState(newState, meta.state, entity, meta.options) };
2764
+ }
2765
+ const zclData = {
2766
+ brightness: globalStore.getValue(entity, "brightness") || 100,
2767
+ // @ts-expect-error ignore
2768
+ hue: utils.mapNumberRange(meta.state.color.h, 0, 360, 0, 254) || 100,
2769
+ // @ts-expect-error ignore
2770
+ saturation: utils.mapNumberRange(meta.state.color.s, 0, 100, 0, 254) || 100,
2771
+ transtime: 0,
2772
+ };
2773
+ if (utils.isObject(value)) {
2774
+ if (value.h) {
2775
+ zclData.hue = utils.mapNumberRange(value.h, 0, 360, 0, 254);
2776
+ }
2777
+ if (value.hue) {
2778
+ zclData.hue = utils.mapNumberRange(value.hue, 0, 360, 0, 254);
2779
+ }
2780
+ if (value.s) {
2781
+ zclData.saturation = utils.mapNumberRange(value.s, 0, 100, 0, 254);
2782
+ }
2783
+ if (value.saturation) {
2784
+ zclData.saturation = utils.mapNumberRange(value.saturation, 0, 100, 0, 254);
2785
+ }
2786
+ if (value.b) {
2787
+ zclData.brightness = Number(value.b);
2788
+ }
2789
+ if (value.brightness) {
2790
+ zclData.brightness = Number(value.brightness);
2791
+ }
2792
+ if (typeof value === "number") {
2793
+ zclData.brightness = value;
2794
+ }
2795
+ }
2796
+ if (meta.message.color !== undefined) {
2797
+ if (utils.isObject(meta.message.color)) {
2798
+ if (meta.message.color.h) {
2799
+ zclData.hue = utils.mapNumberRange(meta.message.color.h, 0, 360, 0, 254);
2800
+ }
2801
+ if (meta.message.color.s) {
2802
+ zclData.saturation = utils.mapNumberRange(meta.message.color.s, 0, 100, 0, 254);
2803
+ }
2804
+ if (meta.message.color.b) {
2805
+ zclData.brightness = Number(meta.message.color.b);
2806
+ }
2807
+ if (meta.message.color.brightness) {
2808
+ zclData.brightness = Number(meta.message.color.brightness);
2809
+ }
2810
+ }
2811
+ }
2812
+ await entity.command("lightingColorCtrl", "tuyaRgbMode", { enable: 1 });
2813
+ await entity.command("lightingColorCtrl", "tuyaMoveToHueAndSaturationBrightness", zclData, utils.getOptions(meta.mapped, entity));
2814
+ globalStore.putValue(entity, "brightness", zclData.brightness);
2815
+ const newState = {
2816
+ brightness: zclData.brightness,
2817
+ color: {
2818
+ h: utils.mapNumberRange(zclData.hue, 0, 254, 0, 360),
2819
+ hue: utils.mapNumberRange(zclData.hue, 0, 254, 0, 360),
2820
+ s: utils.mapNumberRange(zclData.saturation, 0, 254, 0, 100),
2821
+ saturation: utils.mapNumberRange(zclData.saturation, 0, 254, 0, 100),
2822
+ },
2823
+ color_mode: constants.colorModeLookup[0],
2824
+ };
2825
+ return { state: libColor.syncColorState(newState, meta.state, entity, meta.options) };
2826
+ },
2827
+ convertGet: async (entity, key, meta) => {
2828
+ await entity.read("lightingColorCtrl", ["currentHue", "currentSaturation", "tuyaBrightness", "tuyaRgbMode", "colorTemperature"]);
2829
+ },
2830
+ },
2831
+ tuya_led_controller: {
2832
+ key: ["state", "color"],
2833
+ convertSet: async (entity, key, value, meta) => {
2834
+ if (key === "state") {
2835
+ utils.assertString(value, key);
2836
+ if (value.toLowerCase() === "off") {
2837
+ await entity.command("genOnOff", "offWithEffect", { effectid: 0x01, effectvariant: 0x01 }, utils.getOptions(meta.mapped, entity));
2838
+ }
2839
+ else {
2840
+ const payload = { level: 255, transtime: 0 };
2841
+ await entity.command("genLevelCtrl", "moveToLevelWithOnOff", payload, utils.getOptions(meta.mapped, entity));
2842
+ }
2843
+ return { state: { state: value.toUpperCase() } };
2844
+ }
2845
+ if (key === "color") {
2846
+ const hue = {};
2847
+ const saturation = {};
2848
+ utils.assertObject(value);
2849
+ hue.hue = utils.mapNumberRange(value.h, 0, 360, 0, 254);
2850
+ saturation.saturation = utils.mapNumberRange(value.s, 0, 100, 0, 254);
2851
+ hue.transtime = saturation.transtime = 0;
2852
+ hue.direction = 0;
2853
+ await entity.command("lightingColorCtrl", "moveToHue", hue, utils.getOptions(meta.mapped, entity));
2854
+ await entity.command("lightingColorCtrl", "moveToSaturation", saturation, utils.getOptions(meta.mapped, entity));
2855
+ }
2856
+ },
2857
+ convertGet: async (entity, key, meta) => {
2858
+ if (key === "state") {
2859
+ await entity.read("genOnOff", ["onOff"]);
2860
+ }
2861
+ else if (key === "color") {
2862
+ await entity.read("lightingColorCtrl", ["currentHue", "currentSaturation"]);
2863
+ }
2864
+ },
2865
+ },
2866
+ EMIZB_132_mode: {
2867
+ key: ["interface_mode"],
2868
+ convertSet: async (entity, key, value, meta) => {
2869
+ const endpoint = meta.device.getEndpoint(2);
2870
+ const lookup = {
2871
+ norwegian_han: { value: 0x0200, acVoltageDivisor: 10, acCurrentDivisor: 10 },
2872
+ norwegian_han_extra_load: { value: 0x0201, acVoltageDivisor: 10, acCurrentDivisor: 10 },
2873
+ aidon_meter: { value: 0x0202, acVoltageDivisor: 10, acCurrentDivisor: 10 },
2874
+ kaifa_and_kamstrup: { value: 0x0203, acVoltageDivisor: 10, acCurrentDivisor: 1000 },
2875
+ };
2876
+ await endpoint.write("seMetering", { 770: { value: utils.getFromLookup(value, lookup).value, type: 49 } }, { manufacturerCode: zigbee_herdsman_1.Zcl.ManufacturerCode.DEVELCO });
2877
+ // As the device reports the incorrect divisor, we need to set it here
2878
+ // https://github.com/Koenkk/zigbee-herdsman-converters/issues/974#issuecomment-604347303
2879
+ // Values for norwegian_han and aidon_meter have not been been checked
2880
+ endpoint.saveClusterAttributeKeyValue("haElectricalMeasurement", {
2881
+ acVoltageMultiplier: 1,
2882
+ acVoltageDivisor: utils.getFromLookup(value, lookup).acVoltageDivisor,
2883
+ acCurrentMultiplier: 1,
2884
+ acCurrentDivisor: utils.getFromLookup(value, lookup).acCurrentDivisor,
2885
+ });
2886
+ return { state: { interface_mode: value } };
2887
+ },
2888
+ },
2889
+ eurotronic_host_flags: {
2890
+ key: ["eurotronic_host_flags", "system_mode"],
2891
+ convertSet: async (entity, key, value, meta) => {
2892
+ const origValue = value;
2893
+ await entity.read("hvacThermostat", [0x4008], manufacturerOptions.eurotronic);
2894
+ // calculate bit value
2895
+ let bitValue = 0x01; // bit 0 always 1
2896
+ if (meta.state.mirror_display === "ON") {
2897
+ bitValue |= 0x02;
2898
+ }
2899
+ if (value === constants.thermostatSystemModes[0]) {
2900
+ // off
2901
+ bitValue |= 0x20;
2902
+ }
2903
+ else if (value === constants.thermostatSystemModes[4]) {
2904
+ // "heat"
2905
+ bitValue |= 0x04;
2906
+ }
2907
+ else {
2908
+ // auto
2909
+ bitValue |= 0x10;
2910
+ }
2911
+ if (meta.state.child_lock === "LOCK") {
2912
+ bitValue |= 0x80;
2913
+ }
2914
+ value = bitValue;
2915
+ const payload = { 16392: { value, type: 0x22 } };
2916
+ await entity.write("hvacThermostat", payload, manufacturerOptions.eurotronic);
2917
+ return { state: { [key]: origValue } };
2918
+ },
2919
+ convertGet: async (entity, key, meta) => {
2920
+ await entity.read("hvacThermostat", [0x4008], manufacturerOptions.eurotronic);
2921
+ },
2922
+ },
2923
+ eurotronic_error_status: {
2924
+ key: ["eurotronic_error_status"],
2925
+ convertGet: async (entity, key, meta) => {
2926
+ await entity.read("hvacThermostat", [0x4002], manufacturerOptions.eurotronic);
2927
+ },
2928
+ },
2929
+ eurotronic_current_heating_setpoint: {
2930
+ key: ["current_heating_setpoint"],
2931
+ convertSet: async (entity, key, value, meta) => {
2932
+ utils.assertNumber(value, key);
2933
+ const val = Number((Math.round(Number((value * 2).toFixed(1))) / 2).toFixed(1)) * 100;
2934
+ const payload = { 16387: { value: val, type: 0x29 } };
2935
+ await entity.write("hvacThermostat", payload, manufacturerOptions.eurotronic);
2936
+ },
2937
+ convertGet: async (entity, key, meta) => {
2938
+ await entity.read("hvacThermostat", [0x4003], manufacturerOptions.eurotronic);
2939
+ },
2940
+ },
2941
+ eurotronic_valve_position: {
2942
+ key: ["eurotronic_valve_position", "valve_position"],
2943
+ convertSet: async (entity, key, value, meta) => {
2944
+ const payload = { 16385: { value, type: 0x20 } };
2945
+ await entity.write("hvacThermostat", payload, manufacturerOptions.eurotronic);
2946
+ return { state: { [key]: value } };
2947
+ },
2948
+ convertGet: async (entity, key, meta) => {
2949
+ await entity.read("hvacThermostat", [0x4001], manufacturerOptions.eurotronic);
2950
+ },
2951
+ },
2952
+ eurotronic_trv_mode: {
2953
+ key: ["eurotronic_trv_mode", "trv_mode"],
2954
+ convertSet: async (entity, key, value, meta) => {
2955
+ const payload = { 16384: { value, type: 0x30 } };
2956
+ await entity.write("hvacThermostat", payload, manufacturerOptions.eurotronic);
2957
+ return { state: { [key]: value } };
2958
+ },
2959
+ convertGet: async (entity, key, meta) => {
2960
+ await entity.read("hvacThermostat", [0x4000], manufacturerOptions.eurotronic);
2961
+ },
2962
+ },
2963
+ eurotronic_child_lock: {
2964
+ key: ["eurotronic_child_lock", "child_lock"],
2965
+ convertSet: async (entity, key, value, meta) => {
2966
+ await entity.read("hvacThermostat", [0x4008], manufacturerOptions.eurotronic);
2967
+ // calculate bit value
2968
+ let bitValue = 0x01; // bit 0 always 1
2969
+ if (meta.state.mirror_display === "ON") {
2970
+ bitValue |= 0x02;
2971
+ }
2972
+ if (meta.state.system_mode === constants.thermostatSystemModes[0]) {
2973
+ // off
2974
+ bitValue |= 0x20;
2975
+ }
2976
+ else if (meta.state.system_mode === constants.thermostatSystemModes[4]) {
2977
+ // "heat"
2978
+ bitValue |= 0x04;
2979
+ }
2980
+ else {
2981
+ // auto
2982
+ bitValue |= 0x10;
2983
+ }
2984
+ if (value === "LOCK") {
2985
+ bitValue |= 0x80;
2986
+ }
2987
+ const origValue = value;
2988
+ value = bitValue;
2989
+ const payload = { 16392: { value, type: 0x22 } };
2990
+ await entity.write("hvacThermostat", payload, manufacturerOptions.eurotronic);
2991
+ return { state: { [key]: origValue } };
2992
+ },
2993
+ },
2994
+ eurotronic_mirror_display: {
2995
+ key: ["eurotronic_mirror_display", "mirror_display"],
2996
+ convertSet: async (entity, key, value, meta) => {
2997
+ await entity.read("hvacThermostat", [0x4008], manufacturerOptions.eurotronic);
2998
+ // calculate bit value
2999
+ let bitValue = 0x01; // bit 0 always 1
3000
+ if (value === "ON") {
3001
+ bitValue |= 0x02;
3002
+ }
3003
+ if (meta.state.system_mode === constants.thermostatSystemModes[0]) {
3004
+ // off
3005
+ bitValue |= 0x20;
3006
+ }
3007
+ else if (meta.state.system_mode === constants.thermostatSystemModes[4]) {
3008
+ // "heat"
3009
+ bitValue |= 0x04;
3010
+ }
3011
+ else {
3012
+ // auto
3013
+ bitValue |= 0x10;
3014
+ }
3015
+ if (meta.state.child_lock === "LOCK") {
3016
+ bitValue |= 0x80;
3017
+ }
3018
+ const origValue = value;
3019
+ value = bitValue;
3020
+ const payload = { 16392: { value, type: 0x22 } };
3021
+ await entity.write("hvacThermostat", payload, manufacturerOptions.eurotronic);
3022
+ return { state: { [key]: origValue } };
3023
+ },
3024
+ convertGet: async (entity, key, meta) => {
3025
+ await entity.read("hvacThermostat", [0x4008], manufacturerOptions.eurotronic);
3026
+ },
3027
+ },
3028
+ stelpro_thermostat_outdoor_temperature: {
3029
+ key: ["thermostat_outdoor_temperature"],
3030
+ convertSet: async (entity, key, value, meta) => {
3031
+ utils.assertNumber(value, key);
3032
+ if (value > -100 && value < 100) {
3033
+ await entity.write("hvacThermostat", { StelproOutdoorTemp: value * 100 });
3034
+ }
3035
+ },
3036
+ },
3037
+ DTB190502A1_LED: {
3038
+ key: ["LED"],
3039
+ convertSet: async (entity, key, value, meta) => {
3040
+ if (value === "default") {
3041
+ value = 1;
3042
+ }
3043
+ const lookup = {
3044
+ OFF: 0,
3045
+ ON: 1,
3046
+ };
3047
+ value = utils.getFromLookup(value, lookup);
3048
+ // Check for valid data
3049
+ utils.assertNumber(value, key);
3050
+ if ((value >= 0 && value < 2) === false)
3051
+ value = 0;
3052
+ const payload = {
3053
+ 16400: {
3054
+ value,
3055
+ type: 0x21,
3056
+ },
3057
+ };
3058
+ await entity.write("genBasic", payload);
3059
+ },
3060
+ },
3061
+ ptvo_switch_trigger: {
3062
+ key: ["trigger", "interval"],
3063
+ convertSet: async (entity, key, value, meta) => {
3064
+ utils.assertNumber(value, key);
3065
+ utils.assertEndpoint(entity);
3066
+ if (key === "trigger") {
3067
+ await entity.command("genOnOff", "onWithTimedOff", { ctrlbits: 0, ontime: Math.round(value / 100), offwaittime: 0 });
3068
+ }
3069
+ else if (key === "interval") {
3070
+ await entity.configureReporting("genOnOff", [
3071
+ {
3072
+ attribute: "onOff",
3073
+ minimumReportInterval: value,
3074
+ maximumReportInterval: value,
3075
+ reportableChange: 0,
3076
+ },
3077
+ ]);
3078
+ }
3079
+ },
3080
+ },
3081
+ ptvo_switch_uart: {
3082
+ key: ["action"],
3083
+ convertSet: async (entity, key, value, meta) => {
3084
+ if (!value) {
3085
+ return;
3086
+ }
3087
+ const payload = { 14: { value, type: 0x42 } };
3088
+ for (const endpoint of meta.device.endpoints) {
3089
+ const cluster = "genMultistateValue";
3090
+ if (endpoint.supportsInputCluster(cluster) || endpoint.supportsOutputCluster(cluster)) {
3091
+ await endpoint.write(cluster, payload);
3092
+ return;
3093
+ }
3094
+ }
3095
+ await entity.write("genMultistateValue", payload);
3096
+ },
3097
+ },
3098
+ ptvo_switch_analog_input: {
3099
+ key: ["l1", "l2", "l3", "l4", "l5", "l6", "l7", "l8", "l9", "l10", "l11", "l12", "l13", "l14", "l15", "l16"],
3100
+ convertGet: async (entity, key, meta) => {
3101
+ const epId = Number.parseInt(key.substr(1, 2));
3102
+ if (utils.hasEndpoints(meta.device, [epId])) {
3103
+ const endpoint = meta.device.getEndpoint(epId);
3104
+ await endpoint.read("genAnalogInput", ["presentValue", "description"]);
3105
+ }
3106
+ },
3107
+ convertSet: async (entity, key, value, meta) => {
3108
+ const epId = Number.parseInt(key.substr(1, 2));
3109
+ if (utils.hasEndpoints(meta.device, [epId])) {
3110
+ const endpoint = meta.device.getEndpoint(epId);
3111
+ let cluster = "genLevelCtrl";
3112
+ if (endpoint.supportsInputCluster(cluster) || endpoint.supportsOutputCluster(cluster)) {
3113
+ const value2 = Number(value);
3114
+ if (Number.isNaN(value2)) {
3115
+ return;
3116
+ }
3117
+ const payload = { currentLevel: value2 };
3118
+ await endpoint.write(cluster, payload);
3119
+ return;
3120
+ }
3121
+ cluster = "genAnalogInput";
3122
+ if (endpoint.supportsInputCluster(cluster) || endpoint.supportsOutputCluster(cluster)) {
3123
+ const value2 = Number(value);
3124
+ if (Number.isNaN(value2)) {
3125
+ return;
3126
+ }
3127
+ const payload = { presentValue: value2 };
3128
+ await endpoint.write(cluster, payload);
3129
+ return;
3130
+ }
3131
+ }
3132
+ return;
3133
+ },
3134
+ },
3135
+ tint_scene: {
3136
+ key: ["tint_scene"],
3137
+ convertSet: async (entity, key, value, meta) => {
3138
+ await entity.write("genBasic", { 16389: { value, type: 0x20 } }, manufacturerOptions.tint);
3139
+ },
3140
+ },
3141
+ bticino_4027C_cover_state: {
3142
+ key: ["state"],
3143
+ options: [exposes.options.invert_cover()],
3144
+ convertSet: async (entity, key, value, meta) => {
3145
+ utils.assertString(value);
3146
+ const invert = !(utils.getMetaValue(entity, meta.mapped, "coverInverted", "allEqual", false)
3147
+ ? !meta.options.invert_cover
3148
+ : meta.options.invert_cover);
3149
+ const lookup = invert
3150
+ ? { open: "upOpen", close: "downClose", stop: "stop", on: "upOpen", off: "downClose" }
3151
+ : { open: "downClose", close: "upOpen", stop: "stop", on: "downClose", off: "upOpen" };
3152
+ value = value.toLowerCase();
3153
+ utils.validateValue(value, Object.keys(lookup));
3154
+ let position = 50;
3155
+ if (value === "open") {
3156
+ position = 100;
3157
+ }
3158
+ else if (value === "close") {
3159
+ position = 0;
3160
+ }
3161
+ await entity.command("closuresWindowCovering", utils.getFromLookup(value, lookup), {}, utils.getOptions(meta.mapped, entity));
3162
+ return { state: { position } };
3163
+ },
3164
+ },
3165
+ bticino_4027C_cover_position: {
3166
+ key: ["position"],
3167
+ options: [exposes.options.invert_cover(), exposes.options.no_position_support()],
3168
+ convertSet: async (entity, key, value, meta) => {
3169
+ const invert = !(utils.getMetaValue(entity, meta.mapped, "coverInverted", "allEqual", false)
3170
+ ? !meta.options.invert_cover
3171
+ : meta.options.invert_cover);
3172
+ utils.assertNumber(value, key);
3173
+ let newPosition = value;
3174
+ if (meta.options.no_position_support) {
3175
+ newPosition = value >= 50 ? 100 : 0;
3176
+ }
3177
+ const position = newPosition;
3178
+ if (invert) {
3179
+ newPosition = 100 - newPosition;
3180
+ }
3181
+ await entity.command("closuresWindowCovering", "goToLiftPercentage", { percentageliftvalue: newPosition }, utils.getOptions(meta.mapped, entity));
3182
+ return { state: { position: position } };
3183
+ },
3184
+ convertGet: async (entity, key, meta) => {
3185
+ await entity.read("closuresWindowCovering", ["currentPositionLiftPercentage"]);
3186
+ },
3187
+ },
3188
+ legrand_device_mode: {
3189
+ key: ["device_mode"],
3190
+ convertSet: async (entity, key, value, meta) => {
3191
+ utils.assertString(value, key);
3192
+ // enable the dimmer, requires a recent firmware on the device
3193
+ const lookup = {
3194
+ // dimmer
3195
+ dimmer_on: 0x0101,
3196
+ dimmer_off: 0x0100,
3197
+ // contactor
3198
+ switch: 0x0003,
3199
+ auto: 0x0004,
3200
+ // pilot wire
3201
+ pilot_on: 0x0002,
3202
+ pilot_off: 0x0001,
3203
+ };
3204
+ value = value.toLowerCase();
3205
+ utils.validateValue(value, Object.keys(lookup));
3206
+ const payload = { 0: { value: utils.getFromLookup(value, lookup), type: 9 } };
3207
+ await entity.write("manuSpecificLegrandDevices", payload, manufacturerOptions.legrand);
3208
+ return { state: { device_mode: value } };
3209
+ },
3210
+ convertGet: async (entity, key, meta) => {
3211
+ await entity.read("manuSpecificLegrandDevices", [0x0000, 0x0001, 0x0002], manufacturerOptions.legrand);
3212
+ },
3213
+ },
3214
+ legrand_pilot_wire_mode: {
3215
+ key: ["pilot_wire_mode"],
3216
+ convertSet: async (entity, key, value, meta) => {
3217
+ const mode = {
3218
+ comfort: 0x00,
3219
+ "comfort_-1": 0x01,
3220
+ "comfort_-2": 0x02,
3221
+ eco: 0x03,
3222
+ frost_protection: 0x04,
3223
+ off: 0x05,
3224
+ };
3225
+ const payload = { data: Buffer.from([utils.getFromLookup(value, mode)]) };
3226
+ await entity.command("manuSpecificLegrandDevices2", "command0", payload);
3227
+ return { state: { pilot_wire_mode: value } };
3228
+ },
3229
+ convertGet: async (entity, key, meta) => {
3230
+ await entity.read("manuSpecificLegrandDevices2", [0x0000], manufacturerOptions.legrand);
3231
+ },
3232
+ },
3233
+ legrand_power_alarm: {
3234
+ key: ["power_alarm"],
3235
+ convertSet: async (entity, key, value, meta) => {
3236
+ const enableAlarm = !(value === "DISABLE" || value === false);
3237
+ const payloadBolean = { 61441: { value: enableAlarm ? 0x01 : 0x00, type: 0x10 } };
3238
+ const payloadValue = { 61442: { value: value, type: 0x29 } };
3239
+ await entity.write("haElectricalMeasurement", payloadValue);
3240
+ await entity.write("haElectricalMeasurement", payloadBolean);
3241
+ // To have consistent information in the system.
3242
+ await entity.read("haElectricalMeasurement", [0xf000, 0xf001, 0xf002]);
3243
+ },
3244
+ convertGet: async (entity, key, meta) => {
3245
+ await entity.read("haElectricalMeasurement", [0xf000, 0xf001, 0xf002]);
3246
+ },
3247
+ },
3248
+ diyruz_freepad_on_off_config: {
3249
+ key: ["switch_type", "switch_actions"],
3250
+ convertGet: async (entity, key, meta) => {
3251
+ await entity.read("genOnOffSwitchCfg", ["switchType", "switchActions"]);
3252
+ },
3253
+ convertSet: async (entity, key, value, meta) => {
3254
+ const switchTypesLookup = {
3255
+ toggle: 0x00,
3256
+ momentary: 0x01,
3257
+ multifunction: 0x02,
3258
+ };
3259
+ const switchActionsLookup = {
3260
+ on: 0x00,
3261
+ off: 0x01,
3262
+ toggle: 0x02,
3263
+ };
3264
+ const intVal = Number(value);
3265
+ const switchType = utils.getFromLookup(value, switchTypesLookup, intVal);
3266
+ const switchActions = utils.getFromLookup(value, switchActionsLookup, intVal);
3267
+ const payloads = {
3268
+ switch_type: { switchType },
3269
+ switch_actions: { switchActions },
3270
+ };
3271
+ await entity.write("genOnOffSwitchCfg", payloads[key]);
3272
+ return { state: { [`${key}`]: value } };
3273
+ },
3274
+ },
3275
+ TYZB01_on_off: {
3276
+ key: ["state", "time_in_seconds"],
3277
+ convertSet: async (entity, key, value, meta) => {
3278
+ const result = await converters1.on_off.convertSet(entity, key, value, meta);
3279
+ utils.assertString(value, key);
3280
+ const lowerCaseValue = value.toLowerCase();
3281
+ if (!["on", "off"].includes(lowerCaseValue)) {
3282
+ return result;
3283
+ }
3284
+ const messageKeys = Object.keys(meta.message);
3285
+ const timeInSecondsValue = (() => {
3286
+ if (messageKeys.includes("state")) {
3287
+ return meta.message.time_in_seconds;
3288
+ }
3289
+ if (meta.endpoint_name) {
3290
+ return meta.message[`time_in_seconds_${meta.endpoint_name}`];
3291
+ }
3292
+ return null;
3293
+ })();
3294
+ if (!timeInSecondsValue) {
3295
+ return result;
3296
+ }
3297
+ const timeInSeconds = Number(timeInSecondsValue);
3298
+ if (!Number.isInteger(timeInSeconds) || timeInSeconds < 0 || timeInSeconds > 0xfffe) {
3299
+ throw Error("The time_in_seconds value must be convertible to an integer in the range: <0x0000, 0xFFFE>");
3300
+ }
3301
+ const on = lowerCaseValue === "on";
3302
+ await entity.command("genOnOff", "onWithTimedOff", {
3303
+ ctrlbits: 0,
3304
+ ontime: on ? 0 : timeInSeconds.valueOf(),
3305
+ offwaittime: on ? timeInSeconds.valueOf() : 0,
3306
+ }, utils.getOptions(meta.mapped, entity));
3307
+ return result;
3308
+ },
3309
+ convertGet: async (entity, key, meta) => {
3310
+ await entity.read("genOnOff", ["onOff"]);
3311
+ },
3312
+ },
3313
+ diyruz_geiger_config: {
3314
+ key: ["sensitivity", "led_feedback", "buzzer_feedback", "sensors_count", "sensors_type", "alert_threshold"],
3315
+ convertSet: async (entity, key, rawValue, meta) => {
3316
+ const lookup = {
3317
+ OFF: 0x00,
3318
+ ON: 0x01,
3319
+ };
3320
+ const sensorsTypeLookup = {
3321
+ "СБМ-20/СТС-5/BOI-33": "0",
3322
+ "СБМ-19/СТС-6": "1",
3323
+ Others: "2",
3324
+ };
3325
+ let value = utils.getFromLookup(rawValue, lookup, Number(rawValue));
3326
+ if (key === "sensors_type") {
3327
+ // @ts-expect-error ignore
3328
+ value = utils.getFromLookup(rawValue, sensorsTypeLookup, Number(rawValue));
3329
+ }
3330
+ const payloads = {
3331
+ sensitivity: { 61440: { value, type: 0x21 } },
3332
+ led_feedback: { 61441: { value, type: 0x10 } },
3333
+ buzzer_feedback: { 61442: { value, type: 0x10 } },
3334
+ sensors_count: { 61443: { value, type: 0x20 } },
3335
+ sensors_type: { 61444: { value, type: 0x30 } },
3336
+ alert_threshold: { 61445: { value, type: 0x23 } },
3337
+ };
3338
+ await entity.write("msIlluminanceLevelSensing", payloads[key]);
3339
+ return {
3340
+ state: { [key]: rawValue },
3341
+ };
3342
+ },
3343
+ convertGet: async (entity, key, meta) => {
3344
+ const payloads = {
3345
+ sensitivity: ["msIlluminanceLevelSensing", 0xf000],
3346
+ led_feedback: ["msIlluminanceLevelSensing", 0xf001],
3347
+ buzzer_feedback: ["msIlluminanceLevelSensing", 0xf002],
3348
+ sensors_count: ["msIlluminanceLevelSensing", 0xf003],
3349
+ sensors_type: ["msIlluminanceLevelSensing", 0xf004],
3350
+ alert_threshold: ["msIlluminanceLevelSensing", 0xf005],
3351
+ };
3352
+ await entity.read(payloads[key][0], [payloads[key][1]]);
3353
+ },
3354
+ },
3355
+ diyruz_airsense_config: {
3356
+ key: ["led_feedback", "enable_abc", "threshold1", "threshold2", "temperature_offset", "pressure_offset", "humidity_offset"],
3357
+ convertSet: async (entity, key, rawValue, meta) => {
3358
+ const lookup = { OFF: 0x00, ON: 0x01 };
3359
+ const value = utils.getFromLookup(rawValue, lookup, Number(rawValue));
3360
+ const payloads = {
3361
+ led_feedback: ["msCO2", { 515: { value, type: 0x10 } }],
3362
+ enable_abc: ["msCO2", { 514: { value, type: 0x10 } }],
3363
+ threshold1: ["msCO2", { 516: { value, type: 0x21 } }],
3364
+ threshold2: ["msCO2", { 517: { value, type: 0x21 } }],
3365
+ temperature_offset: ["msTemperatureMeasurement", { 528: { value, type: 0x29 } }],
3366
+ pressure_offset: ["msPressureMeasurement", { 528: { value, type: 0x2b } }],
3367
+ humidity_offset: ["msRelativeHumidity", { 528: { value, type: 0x29 } }],
3368
+ };
3369
+ await entity.write(payloads[key][0], payloads[key][1]);
3370
+ return {
3371
+ state: { [key]: rawValue },
3372
+ };
3373
+ },
3374
+ convertGet: async (entity, key, meta) => {
3375
+ const payloads = {
3376
+ led_feedback: ["msCO2", 0x0203],
3377
+ enable_abc: ["msCO2", 0x0202],
3378
+ threshold1: ["msCO2", 0x0204],
3379
+ threshold2: ["msCO2", 0x0205],
3380
+ temperature_offset: ["msTemperatureMeasurement", 0x0210],
3381
+ pressure_offset: ["msPressureMeasurement", 0x0210],
3382
+ humidity_offset: ["msRelativeHumidity", 0x0210],
3383
+ };
3384
+ await entity.read(payloads[key][0], [payloads[key][1]]);
3385
+ },
3386
+ },
3387
+ diyruz_zintercom_config: {
3388
+ key: ["mode", "sound", "time_ring", "time_talk", "time_open", "time_bell", "time_report"],
3389
+ convertSet: async (entity, key, rawValue, meta) => {
3390
+ const lookup = { OFF: 0x00, ON: 0x01 };
3391
+ const modeOpenLookup = { never: "0", once: "1", always: "2", drop: "3" };
3392
+ let value = utils.getFromLookup(rawValue, lookup, Number(rawValue));
3393
+ if (key === "mode") {
3394
+ // @ts-expect-error ignore
3395
+ value = utils.getFromLookup(rawValue, modeOpenLookup, Number(rawValue));
3396
+ }
3397
+ const payloads = {
3398
+ mode: { 81: { value, type: 0x30 } },
3399
+ sound: { 82: { value, type: 0x10 } },
3400
+ time_ring: { 83: { value, type: 0x20 } },
3401
+ time_talk: { 84: { value, type: 0x20 } },
3402
+ time_open: { 85: { value, type: 0x20 } },
3403
+ time_bell: { 87: { value, type: 0x20 } },
3404
+ time_report: { 86: { value, type: 0x20 } },
3405
+ };
3406
+ await entity.write("closuresDoorLock", payloads[key]);
3407
+ return {
3408
+ state: { [key]: rawValue },
3409
+ };
3410
+ },
3411
+ convertGet: async (entity, key, meta) => {
3412
+ const payloads = {
3413
+ mode: ["closuresDoorLock", 0x0051],
3414
+ sound: ["closuresDoorLock", 0x0052],
3415
+ time_ring: ["closuresDoorLock", 0x0053],
3416
+ time_talk: ["closuresDoorLock", 0x0054],
3417
+ time_open: ["closuresDoorLock", 0x0055],
3418
+ time_bell: ["closuresDoorLock", 0x0057],
3419
+ time_report: ["closuresDoorLock", 0x0056],
3420
+ };
3421
+ const v = utils.getFromLookup(key, payloads);
3422
+ await entity.read(v[0], [v[1]]);
3423
+ },
3424
+ },
3425
+ power_source: {
3426
+ key: ["power_source", "charging"],
3427
+ convertGet: async (entity, key, meta) => {
3428
+ await entity.read("genBasic", ["powerSource"]);
3429
+ },
3430
+ },
3431
+ ts0201_temperature_humidity_alarm: {
3432
+ key: ["alarm_humidity_max", "alarm_humidity_min", "alarm_temperature_max", "alarm_temperature_min"],
3433
+ convertSet: async (entity, key, value, meta) => {
3434
+ switch (key) {
3435
+ case "alarm_temperature_max":
3436
+ case "alarm_temperature_min":
3437
+ case "alarm_humidity_max":
3438
+ case "alarm_humidity_min": {
3439
+ // await entity.write('manuSpecificTuya_2', {[key]: value});
3440
+ // instead write as custom attribute to override incorrect herdsman dataType from uint16 to int16
3441
+ // https://github.com/Koenkk/zigbee-herdsman/blob/v0.13.191/src/zcl/definition/cluster.ts#L4235
3442
+ const keyToAttributeLookup = {
3443
+ alarm_temperature_max: 0xd00a,
3444
+ alarm_temperature_min: 0xd00b,
3445
+ alarm_humidity_max: 0xd00d,
3446
+ alarm_humidity_min: 0xd00e,
3447
+ };
3448
+ const payload = { [keyToAttributeLookup[key]]: { value: value, type: zigbee_herdsman_1.Zcl.DataType.INT16 } };
3449
+ await entity.write("manuSpecificTuya_2", payload);
3450
+ break;
3451
+ }
3452
+ default: // Unknown key
3453
+ logger_1.logger.warning(`Unhandled key ${key}`, NS);
3454
+ }
3455
+ },
3456
+ },
3457
+ heiman_ir_remote: {
3458
+ key: ["send_key", "create", "learn", "delete", "get_list"],
3459
+ convertSet: async (entity, key, value, meta) => {
3460
+ const options = {
3461
+ // Don't send a manufacturerCode (otherwise set in herdsman):
3462
+ // https://github.com/Koenkk/zigbee-herdsman-converters/pull/2827
3463
+ // @ts-expect-error ignore
3464
+ manufacturerCode: null,
3465
+ ...utils.getOptions(meta.mapped, entity),
3466
+ };
3467
+ switch (key) {
3468
+ case "send_key":
3469
+ utils.assertObject(value);
3470
+ await entity.command("heimanSpecificInfraRedRemote", "sendKey", { id: value.id, keyCode: value.key_code }, options);
3471
+ break;
3472
+ case "create":
3473
+ utils.assertObject(value);
3474
+ await entity.command("heimanSpecificInfraRedRemote", "createId", { modelType: value.model_type }, options);
3475
+ break;
3476
+ case "learn":
3477
+ utils.assertObject(value);
3478
+ await entity.command("heimanSpecificInfraRedRemote", "studyKey", { id: value.id, keyCode: value.key_code }, options);
3479
+ break;
3480
+ case "delete":
3481
+ utils.assertObject(value);
3482
+ await entity.command("heimanSpecificInfraRedRemote", "deleteKey", { id: value.id, keyCode: value.key_code }, options);
3483
+ break;
3484
+ case "get_list":
3485
+ await entity.command("heimanSpecificInfraRedRemote", "getIdAndKeyCodeList", {}, options);
3486
+ break;
3487
+ default: // Unknown key
3488
+ throw new Error(`Unhandled key ${key}`);
3489
+ }
3490
+ },
3491
+ },
3492
+ scene_store: {
3493
+ key: ["scene_store"],
3494
+ convertSet: async (entity, key, value, meta) => {
3495
+ const isGroup = utils.isGroup(entity);
3496
+ const groupid = isGroup ? entity.groupID : value.group_id !== undefined ? value.group_id : 0;
3497
+ let sceneid = value;
3498
+ let scenename = null;
3499
+ if (typeof value === "object") {
3500
+ sceneid = value.ID;
3501
+ scenename = value.name;
3502
+ }
3503
+ utils.assertNumber(sceneid, "ID");
3504
+ if (groupid === 0 && sceneid === 0) {
3505
+ // From Zigbee spec:
3506
+ // "Scene identifier 0x00, along with group identifier 0x0000, is reserved for the global scene used by the OnOff cluster"
3507
+ throw new Error("Scene ID 0 cannot be used with group ID 0 (reserved).");
3508
+ }
3509
+ const response = await entity.command("genScenes", "store", { groupid, sceneid }, utils.getOptions(meta.mapped, entity));
3510
+ if (isGroup) {
3511
+ if (meta.membersState) {
3512
+ for (const member of entity.members) {
3513
+ utils.saveSceneState(member, sceneid, groupid, meta.membersState[member.getDevice().ieeeAddr], scenename);
3514
+ }
3515
+ }
3516
+ // @ts-expect-error ignore
3517
+ }
3518
+ else if (response.status === 0) {
3519
+ utils.saveSceneState(entity, sceneid, groupid, meta.state, scenename);
3520
+ }
3521
+ else {
3522
+ // @ts-expect-error ignore
3523
+ throw new Error(`Scene add not successful ('${zigbee_herdsman_1.Zcl.Status[response.status]}')`);
3524
+ }
3525
+ logger_1.logger.info("Successfully stored scene", NS);
3526
+ return { state: {} };
3527
+ },
3528
+ },
3529
+ scene_recall: {
3530
+ key: ["scene_recall"],
3531
+ convertSet: async (entity, key, value, meta) => {
3532
+ const groupid = utils.isGroup(entity) ? entity.groupID : 0;
3533
+ utils.assertNumber(value);
3534
+ const sceneid = value;
3535
+ await entity.command("genScenes", "recall", { groupid, sceneid }, utils.getOptions(meta.mapped, entity));
3536
+ const addColorMode = (newState) => {
3537
+ if (newState.color_temp !== undefined) {
3538
+ newState.color_mode = constants.colorModeLookup[2];
3539
+ }
3540
+ else if (newState.color !== undefined) {
3541
+ if (newState.color.x !== undefined) {
3542
+ newState.color_mode = constants.colorModeLookup[1];
3543
+ }
3544
+ else {
3545
+ newState.color_mode = constants.colorModeLookup[0];
3546
+ }
3547
+ }
3548
+ return newState;
3549
+ };
3550
+ if (utils.isGroup(entity)) {
3551
+ const membersState = {};
3552
+ for (const member of entity.members) {
3553
+ let recalledState = utils.getSceneState(member, sceneid, groupid);
3554
+ if (recalledState) {
3555
+ // add color_mode if saved state does not contain it
3556
+ if (recalledState.color_mode === undefined) {
3557
+ recalledState = addColorMode(recalledState);
3558
+ }
3559
+ Object.assign(recalledState, libColor.syncColorState(recalledState, meta.state, entity, meta.options));
3560
+ membersState[member.getDevice().ieeeAddr] = recalledState;
3561
+ }
3562
+ else {
3563
+ logger_1.logger.warning(`Unknown scene was recalled for ${member.getDevice().ieeeAddr}, can't restore state.`, NS);
3564
+ membersState[member.getDevice().ieeeAddr] = {};
3565
+ }
3566
+ }
3567
+ logger_1.logger.info("Successfully recalled group scene", NS);
3568
+ return { membersState };
3569
+ }
3570
+ let recalledState = utils.getSceneState(entity, sceneid, groupid);
3571
+ if (recalledState) {
3572
+ // add color_mode if saved state does not contain it
3573
+ if (recalledState.color_mode === undefined) {
3574
+ recalledState = addColorMode(recalledState);
3575
+ }
3576
+ Object.assign(recalledState, libColor.syncColorState(recalledState, meta.state, entity, meta.options));
3577
+ logger_1.logger.info("Successfully recalled scene", NS);
3578
+ return { state: recalledState };
3579
+ }
3580
+ logger_1.logger.warning(`Unknown scene was recalled for ${entity.deviceIeeeAddress}, can't restore state.`, NS);
3581
+ return { state: {} };
3582
+ },
3583
+ },
3584
+ scene_add: {
3585
+ key: ["scene_add"],
3586
+ convertSet: async (entity, key, value, meta) => {
3587
+ utils.assertObject(value);
3588
+ utils.assertNumber(value.ID, "ID");
3589
+ if (value.color_temp !== undefined && value.color !== undefined) {
3590
+ throw new Error(`Don't specify both 'color_temp' and 'color'`);
3591
+ }
3592
+ const isGroup = utils.isGroup(entity);
3593
+ const groupid = isGroup ? entity.groupID : value.group_id !== undefined ? value.group_id : 0;
3594
+ const sceneid = value.ID;
3595
+ const scenename = value.name;
3596
+ const transtime = value.transition !== undefined ? value.transition : 0;
3597
+ if (groupid === 0 && sceneid === 0) {
3598
+ // From Zigbee spec:
3599
+ // "Scene identifier 0x00, along with group identifier 0x0000, is reserved for the global scene used by the OnOff cluster"
3600
+ throw new Error("Scene ID 0 cannot be used with group ID 0 (reserved).");
3601
+ }
3602
+ const state = {};
3603
+ const extensionfieldsets = [];
3604
+ for (const attribute of Object.keys(value)) {
3605
+ let val = value[attribute];
3606
+ if (attribute === "state") {
3607
+ extensionfieldsets.push({ clstId: 6, len: 1, extField: [val.toLowerCase() === "on" ? 1 : 0] });
3608
+ state.state = val.toUpperCase();
3609
+ }
3610
+ else if (attribute === "brightness") {
3611
+ extensionfieldsets.push({ clstId: 8, len: 1, extField: [val] });
3612
+ state.brightness = val;
3613
+ }
3614
+ else if (attribute === "position") {
3615
+ const invert = utils.getMetaValue(entity, meta.mapped, "coverInverted", "allEqual", false)
3616
+ ? !meta.options.invert_cover
3617
+ : meta.options.invert_cover;
3618
+ extensionfieldsets.push({ clstId: 258, len: 1, extField: [invert ? 100 - val : val] });
3619
+ state.position = val;
3620
+ }
3621
+ else if (attribute === "color_temp") {
3622
+ /*
3623
+ * ZCL version 7 added support for ColorTemperatureMireds
3624
+ *
3625
+ * Currently no devices seem to support this, so always fallback to XY conversion. In the future if a device
3626
+ * supports this, or other features get added this the following commit contains an implementation:
3627
+ * https://github.com/Koenkk/zigbee-herdsman-converters/pull/1837/commits/c22175b946b83230ce4e711c2a3796cf2029e78f
3628
+ *
3629
+ * Conversion to XY is allowed according to the ZCL:
3630
+ * `Since there is a direct relation between ColorTemperatureMireds and XY,
3631
+ * color temperature, if supported, is stored as XY in the scenes table.`
3632
+ *
3633
+ * See https://github.com/Koenkk/zigbee2mqtt/issues/4926#issuecomment-735947705
3634
+ */
3635
+ const [colorTempMin, colorTempMax] = light.findColorTempRange(entity);
3636
+ val = light.clampColorTemp(val, colorTempMin, colorTempMax);
3637
+ const xy = libColor.ColorXY.fromMireds(val);
3638
+ const xScaled = utils.mapNumberRange(xy.x, 0, 1, 0, 65535);
3639
+ const yScaled = utils.mapNumberRange(xy.y, 0, 1, 0, 65535);
3640
+ extensionfieldsets.push({ clstId: 768, len: 4, extField: [xScaled, yScaled] });
3641
+ state.color_mode = constants.colorModeLookup[2];
3642
+ state.color_temp = val;
3643
+ }
3644
+ else if (attribute === "color") {
3645
+ try {
3646
+ val = JSON.parse(val);
3647
+ }
3648
+ catch {
3649
+ /* empty */
3650
+ }
3651
+ const newColor = libColor.Color.fromConverterArg(val);
3652
+ if (newColor.isXY()) {
3653
+ const xScaled = utils.mapNumberRange(newColor.xy.x, 0, 1, 0, 65535);
3654
+ const yScaled = utils.mapNumberRange(newColor.xy.y, 0, 1, 0, 65535);
3655
+ extensionfieldsets.push({
3656
+ clstId: 768,
3657
+ len: 4,
3658
+ extField: [xScaled, yScaled],
3659
+ });
3660
+ state.color_mode = constants.colorModeLookup[1];
3661
+ state.color = newColor.xy.toObject();
3662
+ }
3663
+ else if (newColor.isHSV()) {
3664
+ const hsvCorrected = newColor.hsv.colorCorrected(meta);
3665
+ if (utils.getMetaValue(entity, meta.mapped, "supportsEnhancedHue", "allEqual", true)) {
3666
+ const hScaled = utils.mapNumberRange(hsvCorrected.hue, 0, 360, 0, 65535);
3667
+ const sScaled = utils.mapNumberRange(hsvCorrected.saturation, 0, 100, 0, 254);
3668
+ extensionfieldsets.push({
3669
+ clstId: 768,
3670
+ len: 13,
3671
+ extField: [0, 0, hScaled, sScaled, 0, 0, 0, 0],
3672
+ });
3673
+ }
3674
+ else {
3675
+ // The extensionFieldSet is always EnhancedCurrentHue according to ZCL
3676
+ // When the bulb or all bulbs in a group do not support enhanchedHue,
3677
+ const colorXY = hsvCorrected.toXY();
3678
+ const xScaled = utils.mapNumberRange(colorXY.x, 0, 1, 0, 65535);
3679
+ const yScaled = utils.mapNumberRange(colorXY.y, 0, 1, 0, 65535);
3680
+ extensionfieldsets.push({
3681
+ clstId: 768,
3682
+ len: 4,
3683
+ extField: [xScaled, yScaled],
3684
+ });
3685
+ }
3686
+ state.color_mode = constants.colorModeLookup[0];
3687
+ state.color = newColor.hsv.toObject(false, false);
3688
+ }
3689
+ }
3690
+ }
3691
+ /*
3692
+ * Remove scene first
3693
+ *
3694
+ * Multiple add scene calls will result in the current and previous
3695
+ * payloads to be merged. Resulting in unexpected behavior when
3696
+ * trying to replace a scene.
3697
+ *
3698
+ * We accept a SUCCESS or NOT_FOUND as a result of the remove call.
3699
+ */
3700
+ const removeresp = await entity.command("genScenes", "remove", { groupid, sceneid }, utils.getOptions(meta.mapped, entity));
3701
+ if (isGroup || (utils.isObject(removeresp) && (removeresp.status === 0 || removeresp.status === 133 || removeresp.status === 139))) {
3702
+ const addSceneCommand = Number.isInteger(transtime) ? "add" : "enhancedAdd";
3703
+ const commandTransitionTime = addSceneCommand === "enhancedAdd" ? Math.floor(transtime * 10) : transtime;
3704
+ const response = await entity.command("genScenes", addSceneCommand, { groupid, sceneid, scenename: "", transtime: commandTransitionTime, extensionfieldsets }, utils.getOptions(meta.mapped, entity));
3705
+ if (isGroup) {
3706
+ if (meta.membersState) {
3707
+ for (const member of entity.members) {
3708
+ utils.saveSceneState(member, sceneid, groupid, state, scenename);
3709
+ }
3710
+ }
3711
+ }
3712
+ else {
3713
+ utils.assertObject(response);
3714
+ if (response.status === 0) {
3715
+ utils.saveSceneState(entity, sceneid, groupid, state, scenename);
3716
+ }
3717
+ else {
3718
+ throw new Error(`Scene add not successful ('${zigbee_herdsman_1.Zcl.Status[response.status]}')`);
3719
+ }
3720
+ }
3721
+ }
3722
+ else {
3723
+ const status = utils.isObject(removeresp) ? zigbee_herdsman_1.Zcl.Status[removeresp.status] : "unknown";
3724
+ throw new Error(`Scene add unable to remove existing scene ('${status}')`);
3725
+ }
3726
+ logger_1.logger.info("Successfully added scene", NS);
3727
+ return { state: {} };
3728
+ },
3729
+ },
3730
+ scene_remove: {
3731
+ key: ["scene_remove"],
3732
+ convertSet: async (entity, key, value, meta) => {
3733
+ const isGroup = utils.isGroup(entity);
3734
+ utils.assertNumber(value);
3735
+ const groupid = isGroup ? entity.groupID : 0;
3736
+ const sceneid = value;
3737
+ const response = await entity.command("genScenes", "remove", { groupid, sceneid }, utils.getOptions(meta.mapped, entity));
3738
+ if (isGroup) {
3739
+ if (meta.membersState) {
3740
+ for (const member of entity.members) {
3741
+ utils.deleteSceneState(member, sceneid, groupid);
3742
+ }
3743
+ }
3744
+ // @ts-expect-error ignore
3745
+ }
3746
+ else if (response.status === 0) {
3747
+ utils.deleteSceneState(entity, sceneid, groupid);
3748
+ }
3749
+ else {
3750
+ // @ts-expect-error ignore
3751
+ throw new Error(`Scene remove not successful ('${zigbee_herdsman_1.Zcl.Status[response.status]}')`);
3752
+ }
3753
+ logger_1.logger.info("Successfully removed scene", NS);
3754
+ },
3755
+ },
3756
+ scene_remove_all: {
3757
+ key: ["scene_remove_all"],
3758
+ convertSet: async (entity, key, value, meta) => {
3759
+ const groupid = utils.isGroup(entity) ? entity.groupID : 0;
3760
+ const response = await entity.command("genScenes", "removeAll", { groupid }, utils.getOptions(meta.mapped, entity));
3761
+ utils.assertObject(response);
3762
+ if (utils.isGroup(entity)) {
3763
+ if (meta.membersState) {
3764
+ for (const member of entity.members) {
3765
+ utils.deleteSceneState(member);
3766
+ }
3767
+ }
3768
+ }
3769
+ else if (response.status === 0) {
3770
+ utils.deleteSceneState(entity);
3771
+ }
3772
+ else {
3773
+ throw new Error(`Scene remove all not successful ('${zigbee_herdsman_1.Zcl.Status[response.status]}')`);
3774
+ }
3775
+ logger_1.logger.info("Successfully removed all scenes", NS);
3776
+ },
3777
+ },
3778
+ scene_rename: {
3779
+ key: ["scene_rename"],
3780
+ convertSet: async (entity, key, value, meta) => {
3781
+ utils.assertObject(value);
3782
+ const isGroup = utils.isGroup(entity);
3783
+ const sceneid = value.ID;
3784
+ const scenename = value.name;
3785
+ const groupid = isGroup ? entity.groupID : value.group_id !== undefined ? value.group_id : 0;
3786
+ if (isGroup) {
3787
+ if (meta.membersState) {
3788
+ for (const member of entity.members) {
3789
+ const state = utils.getSceneState(member, sceneid, groupid);
3790
+ if (state) {
3791
+ utils.saveSceneState(member, sceneid, groupid, state, scenename);
3792
+ }
3793
+ }
3794
+ }
3795
+ }
3796
+ else {
3797
+ const state = utils.getSceneState(entity, sceneid, groupid);
3798
+ if (!state) {
3799
+ throw new Error("No such scene in device meta data");
3800
+ }
3801
+ utils.saveSceneState(entity, sceneid, groupid, state, scenename);
3802
+ }
3803
+ logger_1.logger.info("Successfully renamed scene", NS);
3804
+ },
3805
+ },
3806
+ TS0003_curtain_switch: {
3807
+ key: ["state"],
3808
+ convertSet: async (entity, key, value, meta) => {
3809
+ utils.assertString(value, key);
3810
+ utils.assertEndpoint(entity);
3811
+ const lookup = { close: 1, stop: 2, open: 1 };
3812
+ value = value.toLowerCase();
3813
+ utils.validateValue(value, Object.keys(lookup));
3814
+ const endpointID = utils.getFromLookup(value, lookup);
3815
+ const endpoint = entity.getDevice().getEndpoint(endpointID);
3816
+ await endpoint.command("genOnOff", "on", {}, utils.getOptions(meta.mapped, entity));
3817
+ },
3818
+ convertGet: async (entity, key, meta) => {
3819
+ await entity.read("genOnOff", ["onOff"]);
3820
+ },
3821
+ },
3822
+ ts0216_duration: {
3823
+ key: ["duration"],
3824
+ convertSet: async (entity, key, value, meta) => {
3825
+ await entity.write("ssIasWd", { maxDuration: value });
3826
+ },
3827
+ convertGet: async (entity, key, meta) => {
3828
+ await entity.read("ssIasWd", ["maxDuration"]);
3829
+ },
3830
+ },
3831
+ ts0216_volume: {
3832
+ key: ["volume"],
3833
+ convertSet: async (entity, key, value, meta) => {
3834
+ utils.assertNumber(value);
3835
+ await entity.write("ssIasWd", { 2: { value: utils.mapNumberRange(value, 0, 100, 100, 10), type: 0x20 } });
3836
+ },
3837
+ convertGet: async (entity, key, meta) => {
3838
+ await entity.read("ssIasWd", [0x0002]);
3839
+ },
3840
+ },
3841
+ ts0216_alarm: {
3842
+ key: ["alarm"],
3843
+ convertSet: async (entity, key, value, meta) => {
3844
+ const info = value ? (2 << 4) + (1 << 2) + 0 : 0;
3845
+ await entity.command("ssIasWd", "startWarning", { startwarninginfo: info, warningduration: 0, strobedutycycle: 0, strobelevel: 3 }, utils.getOptions(meta.mapped, entity));
3846
+ },
3847
+ },
3848
+ tuya_cover_calibration: {
3849
+ key: ["calibration", "calibration_up", "calibration_down"],
3850
+ convertSet: async (entity, key, value, meta) => {
3851
+ utils.assertString(value, key);
3852
+ const lookup = { ON: 0, OFF: 1 };
3853
+ value = value.toUpperCase();
3854
+ const calibration = utils.getFromLookup(value, lookup);
3855
+ switch (key) {
3856
+ case "calibration":
3857
+ case "calibration_up":
3858
+ await entity.write("closuresWindowCovering", { tuyaCalibration: calibration });
3859
+ break;
3860
+ case "calibration_down":
3861
+ await meta.device.getEndpoint(2).write("closuresWindowCovering", { tuyaCalibration: calibration });
3862
+ break;
3863
+ }
3864
+ return { state: { [key]: value } };
3865
+ },
3866
+ convertGet: async (entity, key, meta) => {
3867
+ switch (key) {
3868
+ case "calibration":
3869
+ case "calibration_up":
3870
+ await entity.read("closuresWindowCovering", ["tuyaCalibration"]);
3871
+ break;
3872
+ case "calibration_down":
3873
+ await meta.device.getEndpoint(2).read("closuresWindowCovering", ["tuyaCalibration"]);
3874
+ break;
3875
+ }
3876
+ },
3877
+ },
3878
+ tuya_cover_reversal: {
3879
+ key: ["motor_reversal"],
3880
+ convertSet: async (entity, key, value, meta) => {
3881
+ utils.assertString(value, key);
3882
+ const lookup = { ON: 1, OFF: 0 };
3883
+ value = value.toUpperCase();
3884
+ const reversal = utils.getFromLookup(value, lookup);
3885
+ await entity.write("closuresWindowCovering", { tuyaMotorReversal: reversal });
3886
+ return { state: { motor_reversal: value } };
3887
+ },
3888
+ convertGet: async (entity, key, meta) => {
3889
+ await entity.read("closuresWindowCovering", ["tuyaMotorReversal"]);
3890
+ },
3891
+ },
3892
+ moes_cover_calibration: {
3893
+ key: ["calibration_time"],
3894
+ convertSet: async (entity, key, value, meta) => {
3895
+ utils.assertNumber(value);
3896
+ const calibration = value * 10;
3897
+ await entity.write("closuresWindowCovering", { moesCalibrationTime: calibration });
3898
+ return { state: { calibration_time: value } };
3899
+ },
3900
+ convertGet: async (entity, key, meta) => {
3901
+ await entity.read("closuresWindowCovering", ["moesCalibrationTime"]);
3902
+ },
3903
+ },
3904
+ ZM35HQ_attr: {
3905
+ key: ["sensitivity", "keep_time"],
3906
+ convertSet: async (entity, key, value, meta) => {
3907
+ switch (key) {
3908
+ case "sensitivity":
3909
+ await entity.write("ssIasZone", { currentZoneSensitivityLevel: utils.getFromLookup(value, { low: 0, medium: 1, high: 2 }) });
3910
+ break;
3911
+ case "keep_time":
3912
+ await entity.write("ssIasZone", { 61441: { value: utils.getFromLookup(value, { 30: 0, 60: 1, 120: 2 }), type: 0x20 } });
3913
+ break;
3914
+ default: // Unknown key
3915
+ throw new Error(`Unhandled key ${key}`);
3916
+ }
3917
+ },
3918
+ convertGet: async (entity, key, meta) => {
3919
+ // Apparently, reading values may interfere with a commandStatusChangeNotification for changed occupancy.
3920
+ // Therefore, read "zoneStatus" as well.
3921
+ await entity.read("ssIasZone", ["currentZoneSensitivityLevel", 61441, "zoneStatus"]);
3922
+ },
3923
+ },
3924
+ TS0210_sensitivity: {
3925
+ key: ["sensitivity"],
3926
+ convertSet: async (entity, key, value, meta) => {
3927
+ value = utils.toNumber(value, "sensitivity");
3928
+ await entity.write("ssIasZone", { currentZoneSensitivityLevel: value });
3929
+ return { state: { sensitivity: value } };
3930
+ },
3931
+ },
3932
+ viessmann_window_open: {
3933
+ key: ["window_open"],
3934
+ convertGet: async (entity, key, meta) => {
3935
+ await entity.read("hvacThermostat", ["viessmannWindowOpenInternal"], manufacturerOptions.viessmann);
3936
+ },
3937
+ },
3938
+ viessmann_window_open_force: {
3939
+ key: ["window_open_force"],
3940
+ convertSet: async (entity, key, value, meta) => {
3941
+ if (typeof value === "boolean") {
3942
+ await entity.write("hvacThermostat", { viessmannWindowOpenForce: value }, manufacturerOptions.viessmann);
3943
+ return { state: { window_open_force: value } };
3944
+ }
3945
+ logger_1.logger.error("window_open_force must be a boolean!", NS);
3946
+ },
3947
+ convertGet: async (entity, key, meta) => {
3948
+ await entity.read("hvacThermostat", ["viessmannWindowOpenForce"], manufacturerOptions.viessmann);
3949
+ },
3950
+ },
3951
+ viessmann_assembly_mode: {
3952
+ key: ["assembly_mode"],
3953
+ convertGet: async (entity, key, meta) => {
3954
+ await entity.read("hvacThermostat", ["viessmannAssemblyMode"], manufacturerOptions.viessmann);
3955
+ },
3956
+ },
3957
+ dawondns_only_off: {
3958
+ key: ["state"],
3959
+ convertSet: async (entity, key, value, meta) => {
3960
+ utils.assertString(value, key);
3961
+ value = value.toLowerCase();
3962
+ utils.assertString(value, key);
3963
+ utils.validateValue(value, ["off"]);
3964
+ await entity.command("genOnOff", value, {}, utils.getOptions(meta.mapped, entity));
3965
+ },
3966
+ convertGet: async (entity, key, meta) => {
3967
+ await entity.read("genOnOff", ["onOff"]);
3968
+ },
3969
+ },
3970
+ idlock_master_pin_mode: {
3971
+ key: ["master_pin_mode"],
3972
+ convertSet: async (entity, key, value, meta) => {
3973
+ await entity.write("closuresDoorLock", { 16384: { value: value === true ? 1 : 0, type: 0x10 } }, { manufacturerCode: zigbee_herdsman_1.Zcl.ManufacturerCode.DATEK_WIRELESS_AS });
3974
+ return { state: { master_pin_mode: value } };
3975
+ },
3976
+ convertGet: async (entity, key, meta) => {
3977
+ await entity.read("closuresDoorLock", [0x4000], { manufacturerCode: zigbee_herdsman_1.Zcl.ManufacturerCode.DATEK_WIRELESS_AS });
3978
+ },
3979
+ },
3980
+ idlock_rfid_enable: {
3981
+ key: ["rfid_enable"],
3982
+ convertSet: async (entity, key, value, meta) => {
3983
+ await entity.write("closuresDoorLock", { 16385: { value: value === true ? 1 : 0, type: 0x10 } }, { manufacturerCode: zigbee_herdsman_1.Zcl.ManufacturerCode.DATEK_WIRELESS_AS });
3984
+ return { state: { rfid_enable: value } };
3985
+ },
3986
+ convertGet: async (entity, key, meta) => {
3987
+ await entity.read("closuresDoorLock", [0x4001], { manufacturerCode: zigbee_herdsman_1.Zcl.ManufacturerCode.DATEK_WIRELESS_AS });
3988
+ },
3989
+ },
3990
+ idlock_service_mode: {
3991
+ key: ["service_mode"],
3992
+ convertSet: async (entity, key, value, meta) => {
3993
+ const lookup = { deactivated: 0, random_pin_1x_use: 5, random_pin_24_hours: 6 };
3994
+ await entity.write("closuresDoorLock", { 16387: { value: utils.getFromLookup(value, lookup), type: 0x20 } }, { manufacturerCode: zigbee_herdsman_1.Zcl.ManufacturerCode.DATEK_WIRELESS_AS });
3995
+ return { state: { service_mode: value } };
3996
+ },
3997
+ convertGet: async (entity, key, meta) => {
3998
+ await entity.read("closuresDoorLock", [0x4003], { manufacturerCode: zigbee_herdsman_1.Zcl.ManufacturerCode.DATEK_WIRELESS_AS });
3999
+ },
4000
+ },
4001
+ idlock_lock_mode: {
4002
+ key: ["lock_mode"],
4003
+ convertSet: async (entity, key, value, meta) => {
4004
+ const lookup = { auto_off_away_off: 0, auto_on_away_off: 1, auto_off_away_on: 2, auto_on_away_on: 3 };
4005
+ await entity.write("closuresDoorLock", { 16388: { value: utils.getFromLookup(value, lookup), type: 0x20 } }, { manufacturerCode: zigbee_herdsman_1.Zcl.ManufacturerCode.DATEK_WIRELESS_AS });
4006
+ return { state: { lock_mode: value } };
4007
+ },
4008
+ convertGet: async (entity, key, meta) => {
4009
+ await entity.read("closuresDoorLock", [0x4004], { manufacturerCode: zigbee_herdsman_1.Zcl.ManufacturerCode.DATEK_WIRELESS_AS });
4010
+ },
4011
+ },
4012
+ idlock_relock_enabled: {
4013
+ key: ["relock_enabled"],
4014
+ convertSet: async (entity, key, value, meta) => {
4015
+ await entity.write("closuresDoorLock", { 16389: { value: value === true ? 1 : 0, type: 0x10 } }, { manufacturerCode: zigbee_herdsman_1.Zcl.ManufacturerCode.DATEK_WIRELESS_AS });
4016
+ return { state: { relock_enabled: value } };
4017
+ },
4018
+ convertGet: async (entity, key, meta) => {
4019
+ await entity.read("closuresDoorLock", [0x4005], { manufacturerCode: zigbee_herdsman_1.Zcl.ManufacturerCode.DATEK_WIRELESS_AS });
4020
+ },
4021
+ },
4022
+ schneider_pilot_mode: {
4023
+ key: ["schneider_pilot_mode"],
4024
+ convertSet: async (entity, key, value, meta) => {
4025
+ utils.assertString(value, key);
4026
+ const lookup = { contactor: 1, pilot: 3 };
4027
+ value = value.toLowerCase();
4028
+ const mode = utils.getFromLookup(value, lookup);
4029
+ await entity.write("schneiderSpecificPilotMode", { pilotMode: mode }, { manufacturerCode: zigbee_herdsman_1.Zcl.ManufacturerCode.SCHNEIDER_ELECTRIC });
4030
+ return { state: { schneider_pilot_mode: value } };
4031
+ },
4032
+ convertGet: async (entity, key, meta) => {
4033
+ await entity.read("schneiderSpecificPilotMode", ["pilotMode"], { manufacturerCode: zigbee_herdsman_1.Zcl.ManufacturerCode.SCHNEIDER_ELECTRIC });
4034
+ },
4035
+ },
4036
+ schneider_dimmer_mode: {
4037
+ key: ["dimmer_mode"],
4038
+ convertSet: async (entity, key, value, meta) => {
4039
+ const lookup = { RC: 1, RL: 2 };
4040
+ const mode = utils.getFromLookup(value, lookup);
4041
+ await entity.write("lightingBallastCfg", { 57344: { value: mode, type: 0x30 } }, { manufacturerCode: zigbee_herdsman_1.Zcl.ManufacturerCode.SCHNEIDER_ELECTRIC });
4042
+ return { state: { dimmer_mode: value } };
4043
+ },
4044
+ convertGet: async (entity, key, meta) => {
4045
+ await entity.read("lightingBallastCfg", [0xe000], { manufacturerCode: zigbee_herdsman_1.Zcl.ManufacturerCode.SCHNEIDER_ELECTRIC });
4046
+ },
4047
+ },
4048
+ wiser_dimmer_mode: {
4049
+ key: ["dimmer_mode"],
4050
+ convertSet: async (entity, key, value, meta) => {
4051
+ const controlMode = utils.getKey(constants.wiserDimmerControlMode, value, value, Number);
4052
+ await entity.write("lightingBallastCfg", { wiserControlMode: controlMode }, { manufacturerCode: zigbee_herdsman_1.Zcl.ManufacturerCode.SCHNEIDER_ELECTRIC });
4053
+ return { state: { dimmer_mode: value } };
4054
+ },
4055
+ convertGet: async (entity, key, meta) => {
4056
+ await entity.read("lightingBallastCfg", ["wiserControlMode"], { manufacturerCode: zigbee_herdsman_1.Zcl.ManufacturerCode.SCHNEIDER_ELECTRIC });
4057
+ },
4058
+ },
4059
+ schneider_temperature_measured_value: {
4060
+ key: ["temperature_measured_value"],
4061
+ convertSet: async (entity, key, value, meta) => {
4062
+ utils.assertNumber(value);
4063
+ utils.assertEndpoint(entity);
4064
+ await entity.report("msTemperatureMeasurement", { measuredValue: Math.round(value * 100) });
4065
+ },
4066
+ },
4067
+ schneider_thermostat_system_mode: {
4068
+ key: ["system_mode"],
4069
+ convertSet: async (entity, key, value, meta) => {
4070
+ utils.assertEndpoint(entity);
4071
+ const systemMode = utils.getKey(constants.thermostatSystemModes, value, undefined, Number);
4072
+ entity.saveClusterAttributeKeyValue("hvacThermostat", { systemMode: systemMode });
4073
+ return { state: { system_mode: value } };
4074
+ },
4075
+ },
4076
+ schneider_thermostat_occupied_heating_setpoint: {
4077
+ key: ["occupied_heating_setpoint"],
4078
+ convertSet: async (entity, key, value, meta) => {
4079
+ utils.assertNumber(value, key);
4080
+ utils.assertEndpoint(entity);
4081
+ const occupiedHeatingSetpoint = Number((Math.round(Number((value * 2).toFixed(1))) / 2).toFixed(1)) * 100;
4082
+ entity.saveClusterAttributeKeyValue("hvacThermostat", { occupiedHeatingSetpoint: occupiedHeatingSetpoint });
4083
+ return { state: { occupied_heating_setpoint: value } };
4084
+ },
4085
+ },
4086
+ schneider_thermostat_control_sequence_of_operation: {
4087
+ key: ["control_sequence_of_operation"],
4088
+ convertSet: async (entity, key, value, meta) => {
4089
+ utils.assertEndpoint(entity);
4090
+ const val = utils.getKey(constants.thermostatControlSequenceOfOperations, value, value, Number);
4091
+ entity.saveClusterAttributeKeyValue("hvacThermostat", { ctrlSeqeOfOper: val });
4092
+ return { state: { control_sequence_of_operation: value } };
4093
+ },
4094
+ },
4095
+ schneider_thermostat_pi_heating_demand: {
4096
+ key: ["pi_heating_demand"],
4097
+ convertSet: async (entity, key, value, meta) => {
4098
+ utils.assertEndpoint(entity);
4099
+ entity.saveClusterAttributeKeyValue("hvacThermostat", { pIHeatingDemand: value });
4100
+ return { state: { pi_heating_demand: value } };
4101
+ },
4102
+ },
4103
+ schneider_thermostat_keypad_lockout: {
4104
+ key: ["keypad_lockout"],
4105
+ convertSet: async (entity, key, value, meta) => {
4106
+ utils.assertEndpoint(entity);
4107
+ const keypadLockout = utils.getKey(constants.keypadLockoutMode, value, value, Number);
4108
+ await entity.write("hvacUserInterfaceCfg", { keypadLockout });
4109
+ entity.saveClusterAttributeKeyValue("hvacUserInterfaceCfg", { keypadLockout });
4110
+ return { state: { keypad_lockout: value } };
4111
+ },
4112
+ },
4113
+ wiser_fip_setting: {
4114
+ key: ["fip_setting"],
4115
+ convertSet: async (entity, key, value, meta) => {
4116
+ utils.assertString(value, key);
4117
+ const zoneLookup = { manual: 1, schedule: 2, energy_saver: 3, holiday: 6 };
4118
+ const zonemodeNum = utils.getFromLookup(meta.state.zone_mode, zoneLookup);
4119
+ const fipLookup = { comfort: 0, "comfort_-1": 1, "comfort_-2": 2, energy_saving: 3, frost_protection: 4, off: 5 };
4120
+ value = value.toLowerCase();
4121
+ utils.validateValue(value, Object.keys(fipLookup));
4122
+ const fipmodeNum = utils.getFromLookup(value, fipLookup);
4123
+ const payload = {
4124
+ zonemode: zonemodeNum,
4125
+ fipmode: fipmodeNum,
4126
+ reserved: 0xff,
4127
+ };
4128
+ await entity.command("hvacThermostat", "wiserSmartSetFipMode", payload, { srcEndpoint: 11, disableDefaultResponse: true });
4129
+ return { state: { fip_setting: value } };
4130
+ },
4131
+ convertGet: async (entity, key, meta) => {
4132
+ await entity.read("hvacThermostat", [0xe020]);
4133
+ },
4134
+ },
4135
+ wiser_hact_config: {
4136
+ key: ["hact_config"],
4137
+ convertSet: async (entity, key, value, meta) => {
4138
+ utils.assertString(value, key);
4139
+ const lookup = { unconfigured: 0x00, setpoint_switch: 0x80, setpoint_fip: 0x82, fip_fip: 0x83 };
4140
+ value = value.toLowerCase();
4141
+ const mode = utils.getFromLookup(value, lookup);
4142
+ await entity.write("hvacThermostat", { 57361: { value: mode, type: 0x18 } });
4143
+ return { state: { hact_config: value } };
4144
+ },
4145
+ convertGet: async (entity, key, meta) => {
4146
+ await entity.read("hvacThermostat", [0xe011]);
4147
+ },
4148
+ },
4149
+ wiser_zone_mode: {
4150
+ key: ["zone_mode"],
4151
+ convertSet: async (entity, key, value, meta) => {
4152
+ const lookup = { manual: 1, schedule: 2, energy_saver: 3, holiday: 6 };
4153
+ const zonemodeNum = utils.getFromLookup(value, lookup);
4154
+ await entity.write("hvacThermostat", { 57360: { value: zonemodeNum, type: 0x30 } });
4155
+ return { state: { zone_mode: value } };
4156
+ },
4157
+ convertGet: async (entity, key, meta) => {
4158
+ await entity.read("hvacThermostat", [0xe010]);
4159
+ },
4160
+ },
4161
+ wiser_vact_calibrate_valve: {
4162
+ key: ["calibrate_valve"],
4163
+ convertSet: async (entity, key, value, meta) => {
4164
+ await entity.command("hvacThermostat", "wiserSmartCalibrateValve", {}, { srcEndpoint: 11, disableDefaultResponse: true });
4165
+ return { state: { calibrate_valve: value } };
4166
+ },
4167
+ },
4168
+ wiser_sed_zone_mode: {
4169
+ key: ["zone_mode"],
4170
+ convertSet: async (entity, key, value, meta) => {
4171
+ return { state: { zone_mode: value } };
4172
+ },
4173
+ },
4174
+ wiser_sed_occupied_heating_setpoint: {
4175
+ key: ["occupied_heating_setpoint"],
4176
+ convertSet: async (entity, key, value, meta) => {
4177
+ utils.assertNumber(value, key);
4178
+ utils.assertEndpoint(entity);
4179
+ const occupiedHeatingSetpoint = Number((Math.round(Number((value * 2).toFixed(1))) / 2).toFixed(1)) * 100;
4180
+ entity.saveClusterAttributeKeyValue("hvacThermostat", { occupiedHeatingSetpoint });
4181
+ return { state: { occupied_heating_setpoint: value } };
4182
+ },
4183
+ },
4184
+ wiser_sed_thermostat_local_temperature_calibration: {
4185
+ key: ["local_temperature_calibration"],
4186
+ convertSet: async (entity, key, value, meta) => {
4187
+ utils.assertNumber(value);
4188
+ await entity.write("hvacThermostat", { localTemperatureCalibration: Math.round(value * 10) }, { srcEndpoint: 11, disableDefaultResponse: true });
4189
+ return { state: { local_temperature_calibration: value } };
4190
+ },
4191
+ },
4192
+ wiser_sed_thermostat_keypad_lockout: {
4193
+ key: ["keypad_lockout"],
4194
+ convertSet: async (entity, key, value, meta) => {
4195
+ const keypadLockout = utils.getKey(constants.keypadLockoutMode, value, value, Number);
4196
+ await entity.write("hvacUserInterfaceCfg", { keypadLockout }, { srcEndpoint: 11, disableDefaultResponse: true });
4197
+ return { state: { keypad_lockout: value } };
4198
+ },
4199
+ },
4200
+ sihas_set_people: {
4201
+ key: ["people"],
4202
+ convertSet: async (entity, key, value, meta) => {
4203
+ const payload = { presentValue: value };
4204
+ const endpoint = meta.device.endpoints.find((e) => e.supportsInputCluster("genAnalogInput"));
4205
+ await endpoint.write("genAnalogInput", payload);
4206
+ },
4207
+ convertGet: async (entity, key, meta) => {
4208
+ const endpoint = meta.device.endpoints.find((e) => e.supportsInputCluster("genAnalogInput"));
4209
+ await endpoint.read("genAnalogInput", ["presentValue"]);
4210
+ },
4211
+ },
4212
+ tuya_operation_mode: {
4213
+ key: ["operation_mode"],
4214
+ convertSet: async (entity, key, value, meta) => {
4215
+ // modes:
4216
+ // 0 - 'command' mode. keys send commands. useful for group control
4217
+ // 1 - 'event' mode. keys send events. useful for handling
4218
+ utils.assertString(value, key);
4219
+ const endpoint = meta.device.getEndpoint(1);
4220
+ await endpoint.write("genOnOff", { tuyaOperationMode: utils.getFromLookup(value, { command: 0, event: 1 }) });
4221
+ return { state: { operation_mode: value.toLowerCase() } };
4222
+ },
4223
+ convertGet: async (entity, key, meta) => {
4224
+ const endpoint = meta.device.getEndpoint(1);
4225
+ await endpoint.read("genOnOff", ["tuyaOperationMode"]);
4226
+ },
4227
+ },
4228
+ led_on_motion: {
4229
+ key: ["led_on_motion"],
4230
+ convertSet: async (entity, key, value, meta) => {
4231
+ await entity.write("ssIasZone", { 16384: { value: value === true ? 1 : 0, type: 0x10 } }, { manufacturerCode: zigbee_herdsman_1.Zcl.ManufacturerCode.DATEK_WIRELESS_AS });
4232
+ return { state: { led_on_motion: value } };
4233
+ },
4234
+ convertGet: async (entity, key, meta) => {
4235
+ await entity.read("ssIasZone", [0x4000], { manufacturerCode: zigbee_herdsman_1.Zcl.ManufacturerCode.DATEK_WIRELESS_AS });
4236
+ },
4237
+ },
4238
+ // #endregion
4239
+ // #region Ignore converters
4240
+ ignore_transition: {
4241
+ key: ["transition"],
4242
+ convertSet: async (entity, key, value, meta) => { },
4243
+ },
4244
+ ignore_rate: {
4245
+ key: ["rate"],
4246
+ convertSet: async (entity, key, value, meta) => { },
4247
+ },
4248
+ // #endregion
4249
+ // Not a converter, can be used by tests to clear the store.
4250
+ __clearStore__: () => {
4251
+ globalStore.clear();
4252
+ },
4253
+ };
4254
+ const converters3 = {
4255
+ light_onoff_restorable_brightness: {
4256
+ /**
4257
+ * Some devices reset brightness to 100% when turned on, even if previous brightness was different
4258
+ * This uses the stored state of the device to restore to the previous brightness level when turning on
4259
+ */
4260
+ key: ["state", "brightness", "brightness_percent"],
4261
+ options: [exposes.options.transition()],
4262
+ convertSet: async (entity, key, value, meta) => {
4263
+ const deviceState = meta.state || {};
4264
+ const message = meta.message;
4265
+ const state = utils.isString(message.state) ? message.state.toLowerCase() : null;
4266
+ const hasBrightness = message.brightness !== undefined || message.brightness_percent !== undefined;
4267
+ // Add brightness if command is 'on' and we can restore previous value
4268
+ if (state === "on" && !hasBrightness && utils.isNumber(deviceState.brightness) && deviceState.brightness > 0) {
4269
+ message.brightness = deviceState.brightness;
4270
+ }
4271
+ return await converters2.light_onoff_brightness.convertSet(entity, key, value, meta);
4272
+ },
4273
+ convertGet: async (entity, key, meta) => {
4274
+ return await converters2.light_onoff_brightness.convertGet(entity, key, meta);
4275
+ },
4276
+ },
4277
+ RM01_light_onoff_brightness: {
4278
+ key: ["state", "brightness", "brightness_percent"],
4279
+ options: [exposes.options.transition()],
4280
+ convertSet: async (entity, key, value, meta) => {
4281
+ if (utils.hasEndpoints(meta.device, [0x12])) {
4282
+ const endpoint = meta.device.getEndpoint(0x12);
4283
+ return await converters2.light_onoff_brightness.convertSet(endpoint, key, value, meta);
4284
+ }
4285
+ throw new Error("OnOff and LevelControl not supported on this RM01 device.");
4286
+ },
4287
+ convertGet: async (entity, key, meta) => {
4288
+ if (utils.hasEndpoints(meta.device, [0x12])) {
4289
+ const endpoint = meta.device.getEndpoint(0x12);
4290
+ return await converters2.light_onoff_brightness.convertGet(endpoint, key, meta);
4291
+ }
4292
+ throw new Error("OnOff and LevelControl not supported on this RM01 device.");
4293
+ },
4294
+ },
4295
+ RM01_light_brightness_step: {
4296
+ options: [exposes.options.transition()],
4297
+ key: ["brightness_step", "brightness_step_onoff"],
4298
+ convertSet: async (entity, key, value, meta) => {
4299
+ if (utils.hasEndpoints(meta.device, [0x12])) {
4300
+ const endpoint = meta.device.getEndpoint(0x12);
4301
+ return await converters2.light_brightness_step.convertSet(endpoint, key, value, meta);
4302
+ }
4303
+ throw new Error("LevelControl not supported on this RM01 device.");
4304
+ },
4305
+ },
4306
+ RM01_light_brightness_move: {
4307
+ key: ["brightness_move", "brightness_move_onoff"],
4308
+ convertSet: async (entity, key, value, meta) => {
4309
+ if (utils.hasEndpoints(meta.device, [0x12])) {
4310
+ const endpoint = meta.device.getEndpoint(0x12);
4311
+ return await converters2.light_brightness_move.convertSet(endpoint, key, value, meta);
4312
+ }
4313
+ throw new Error("LevelControl not supported on this RM01 device.");
4314
+ },
4315
+ },
4316
+ ptvo_switch_light_brightness: {
4317
+ key: ["brightness", "brightness_percent", "transition"],
4318
+ options: [exposes.options.transition()],
4319
+ convertSet: async (entity, key, value, meta) => {
4320
+ if (key === "transition") {
4321
+ return;
4322
+ }
4323
+ const cluster = "genLevelCtrl";
4324
+ utils.assertEndpoint(entity);
4325
+ if (entity.supportsInputCluster(cluster) || entity.supportsOutputCluster(cluster)) {
4326
+ const message = meta.message;
4327
+ let brightness = undefined;
4328
+ if (message.brightness !== undefined) {
4329
+ brightness = Number(message.brightness);
4330
+ }
4331
+ else if (message.brightness_percent !== undefined)
4332
+ brightness = Math.round(Number(message.brightness_percent) * 2.55);
4333
+ if (brightness !== undefined && brightness === 0) {
4334
+ message.state = "off";
4335
+ message.brightness = 1;
4336
+ }
4337
+ return await converters2.light_onoff_brightness.convertSet(entity, key, value, meta);
4338
+ }
4339
+ throw new Error("LevelControl not supported on this endpoint.");
4340
+ },
4341
+ convertGet: async (entity, key, meta) => {
4342
+ const cluster = "genLevelCtrl";
4343
+ utils.assertEndpoint(entity);
4344
+ if (entity.supportsInputCluster(cluster) || entity.supportsOutputCluster(cluster)) {
4345
+ return await converters2.light_onoff_brightness.convertGet(entity, key, meta);
4346
+ }
4347
+ throw new Error("LevelControl not supported on this endpoint.");
4348
+ },
4349
+ },
4350
+ TS110E_options: {
4351
+ key: ["min_brightness", "max_brightness", "light_type", "switch_type"],
4352
+ convertSet: async (entity, key, value, meta) => {
4353
+ let payload = null;
4354
+ if (key === "min_brightness" || key === "max_brightness") {
4355
+ const id = key === "min_brightness" ? 64515 : 64516;
4356
+ payload = { [id]: { value: utils.mapNumberRange(utils.toNumber(value, key), 1, 255, 0, 1000), type: 0x21 } };
4357
+ }
4358
+ else if (key === "light_type" || key === "switch_type") {
4359
+ utils.assertString(value, "light_type/switch_type");
4360
+ const lookup = key === "light_type" ? { led: 0, incandescent: 1, halogen: 2 } : { momentary: 0, toggle: 1, state: 2 };
4361
+ payload = { 64514: { value: lookup[value], type: 0x20 } };
4362
+ }
4363
+ await entity.write("genLevelCtrl", payload, utils.getOptions(meta.mapped, entity));
4364
+ return { state: { [key]: value } };
4365
+ },
4366
+ convertGet: async (entity, key, meta) => {
4367
+ let id = null;
4368
+ if (key === "min_brightness")
4369
+ id = 64515;
4370
+ if (key === "max_brightness")
4371
+ id = 64516;
4372
+ if (key === "light_type" || key === "switch_type")
4373
+ id = 64514;
4374
+ await entity.read("genLevelCtrl", [id]);
4375
+ },
4376
+ },
4377
+ TS110E_onoff_brightness: {
4378
+ key: ["state", "brightness"],
4379
+ convertSet: async (entity, key, value, meta) => {
4380
+ const { message, state } = meta;
4381
+ if (message.state === "OFF" || (message.state !== undefined && message.brightness === undefined)) {
4382
+ return await converters1.on_off.convertSet(entity, key, value, meta);
4383
+ }
4384
+ if (message.brightness !== undefined) {
4385
+ // set brightness
4386
+ if (state.state === "OFF") {
4387
+ await entity.command("genOnOff", "on", {}, utils.getOptions(meta.mapped, entity));
4388
+ }
4389
+ const brightness = utils.toNumber(message.brightness, "brightness");
4390
+ const level = utils.mapNumberRange(brightness, 0, 254, 0, 1000);
4391
+ await entity.command("genLevelCtrl", "moveToLevelTuya", { level, transtime: 100 }, utils.getOptions(meta.mapped, entity));
4392
+ return { state: { state: "ON", brightness } };
4393
+ }
4394
+ },
4395
+ convertGet: async (entity, key, meta) => {
4396
+ if (key === "state")
4397
+ await converters1.on_off.convertGet(entity, key, meta);
4398
+ if (key === "brightness")
4399
+ await entity.read("genLevelCtrl", [61440]);
4400
+ },
4401
+ },
4402
+ TS110E_light_onoff_brightness: {
4403
+ ...converters2.light_onoff_brightness,
4404
+ convertSet: async (entity, key, value, meta) => {
4405
+ const { message } = meta;
4406
+ if (message.state === "ON" || (typeof message.brightness === "number" && message.brightness > 1)) {
4407
+ // Does not turn off with physical press when turned on with just moveToLevelWithOnOff, required on before.
4408
+ // https://github.com/Koenkk/zigbee2mqtt/issues/15902#issuecomment-1382848150
4409
+ await entity.command("genOnOff", "on", {}, utils.getOptions(meta.mapped, entity));
4410
+ }
4411
+ return await converters2.light_onoff_brightness.convertSet(entity, key, value, meta);
4412
+ },
4413
+ },
4414
+ };
4415
+ const converters = { ...converters1, ...converters2, ...converters3 };
4416
+ exports.default = converters;
4417
+ module.exports = converters;
4418
+ //# sourceMappingURL=toZigbee.js.map