homematic-manager 3.0.0-beta.2 → 3.0.0-beta.21

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 (332) hide show
  1. package/README.md +2 -1
  2. package/data/easymode-time-selectors.json +285 -0
  3. package/data/icons/106_hm-lc-sw1-dr.webp +0 -0
  4. package/data/icons/108_hm-rc-dis-h-x-eu.webp +0 -0
  5. package/data/icons/109_hm-lc-sw1-pl-ct.webp +0 -0
  6. package/data/icons/110_hm-es-pmsw1-dr.webp +0 -0
  7. package/data/icons/112_hmip-wrc2.webp +0 -0
  8. package/data/icons/113_hmip-psm-ch.webp +0 -0
  9. package/data/icons/113_hmip-psm-it.webp +0 -0
  10. package/data/icons/113_hmip-psm-pe.webp +0 -0
  11. package/data/icons/113_hmip-psm-uk.webp +0 -0
  12. package/data/icons/113_hmip-psm.webp +0 -0
  13. package/data/icons/114_hm-lc-dim1t-fm-lf_3.webp +0 -0
  14. package/data/icons/116_hm-rc-4-3_brc-h3.webp +0 -0
  15. package/data/icons/118_hmip-swdo.webp +0 -0
  16. package/data/icons/119_hmip-rc8.webp +0 -0
  17. package/data/icons/120_hmip-etrv.webp +0 -0
  18. package/data/icons/121_hmip-wth.webp +0 -0
  19. package/data/icons/123_oligo.smart.ip.hm.webp +0 -0
  20. package/data/icons/125_hmip-smi.webp +0 -0
  21. package/data/icons/130_hmip-srh.webp +0 -0
  22. package/data/icons/131_hmip-wrc6.webp +0 -0
  23. package/data/icons/132_hmip-smo.webp +0 -0
  24. package/data/icons/133_hmip-asir.webp +0 -0
  25. package/data/icons/134_hmip-fsm.webp +0 -0
  26. package/data/icons/135_hmip-fsm16.webp +0 -0
  27. package/data/icons/136_hmip-miob.webp +0 -0
  28. package/data/icons/137_hmip-fal-c6.webp +0 -0
  29. package/data/icons/138_hmip-fal-c10.webp +0 -0
  30. package/data/icons/140_alpha-ip-rgb.webp +0 -0
  31. package/data/icons/141_alpha-ip-rgba.webp +0 -0
  32. package/data/icons/144_hmip-wgc.webp +0 -0
  33. package/data/icons/145_hmip-froll_hmip-fbl.webp +0 -0
  34. package/data/icons/146_hmip-sth.webp +0 -0
  35. package/data/icons/147_hmip-sthd.webp +0 -0
  36. package/data/icons/148_hmip-stho.webp +0 -0
  37. package/data/icons/149_hmip-sam.webp +0 -0
  38. package/data/icons/151_hmip-pcbs-bat.webp +0 -0
  39. package/data/icons/152_hmip-swdo-i.webp +0 -0
  40. package/data/icons/153_hmip-spi.webp +0 -0
  41. package/data/icons/154_hmip-spdr.webp +0 -0
  42. package/data/icons/155_hmip-whs2.webp +0 -0
  43. package/data/icons/156_hmip-mod-oc8.webp +0 -0
  44. package/data/icons/158_hmip-etrv-uk.webp +0 -0
  45. package/data/icons/159_hmip-mod-rc8.webp +0 -0
  46. package/data/icons/160_hmipw-drs4.webp +0 -0
  47. package/data/icons/161_hmipw-drs8.webp +0 -0
  48. package/data/icons/162_hmipw-drap.webp +0 -0
  49. package/data/icons/163_hmipw-drbl4.webp +0 -0
  50. package/data/icons/164_hmipw-dri16.webp +0 -0
  51. package/data/icons/165_hmipw-fio6.webp +0 -0
  52. package/data/icons/166_hmipw-drd3.webp +0 -0
  53. package/data/icons/167_hmipw-dri32.webp +0 -0
  54. package/data/icons/168_hmip-smi55.webp +0 -0
  55. package/data/icons/169_hmip-swo-pr.webp +0 -0
  56. package/data/icons/170_hmip-swo-pl.webp +0 -0
  57. package/data/icons/171_hmip-swo-b.webp +0 -0
  58. package/data/icons/172_hmip-swd.webp +0 -0
  59. package/data/icons/173_hmip-bsl.webp +0 -0
  60. package/data/icons/174_hmip-slo.webp +0 -0
  61. package/data/icons/175_hmip-group-heating.webp +0 -0
  62. package/data/icons/177_hmip-dbb.webp +0 -0
  63. package/data/icons/178_hmip-etrv-b1.webp +0 -0
  64. package/data/icons/179_hmip-swdm-b2.webp +0 -0
  65. package/data/icons/180_hmip-etrv-b.webp +0 -0
  66. package/data/icons/181_hmip-swdm.webp +0 -0
  67. package/data/icons/182_hmip-fci1.webp +0 -0
  68. package/data/icons/183_hmip-mod-tm.webp +0 -0
  69. package/data/icons/184_hmip-pcbs2.webp +0 -0
  70. package/data/icons/185_hmip-FCI6.webp +0 -0
  71. package/data/icons/186_hmip-mp3p.webp +0 -0
  72. package/data/icons/187_hmip-rcb1.webp +0 -0
  73. package/data/icons/188_hmip-etrv-c.webp +0 -0
  74. package/data/icons/190_hmip-sci.webp +0 -0
  75. package/data/icons/191_hmip-mod-ho.webp +0 -0
  76. package/data/icons/192_hmip-asir-o.webp +0 -0
  77. package/data/icons/193_hmip-wt.webp +0 -0
  78. package/data/icons/194_hmip-wrcd.webp +0 -0
  79. package/data/icons/195_hmipw-smi55.webp +0 -0
  80. package/data/icons/196_hmip-ASIR-2.webp +0 -0
  81. package/data/icons/197_hmip-swdo-pl.webp +0 -0
  82. package/data/icons/198_hmip-falmot-c12.webp +0 -0
  83. package/data/icons/199_hmip-mio16-pcb.webp +0 -0
  84. package/data/icons/200_hmip-wth-b.webp +0 -0
  85. package/data/icons/201_hmip-stv.webp +0 -0
  86. package/data/icons/202_hmip-wrcr.webp +0 -0
  87. package/data/icons/203_hmip-fsi16.webp +0 -0
  88. package/data/icons/204_hmip-drdi3.webp +0 -0
  89. package/data/icons/205_hmip-drsi4.webp +0 -0
  90. package/data/icons/206_hmip-drbli4.webp +0 -0
  91. package/data/icons/207_hmip-srdo.webp +0 -0
  92. package/data/icons/208_hmip-dsd-pcb.webp +0 -0
  93. package/data/icons/209_hmip-etrv-b-uk.webp +0 -0
  94. package/data/icons/210_hmip-ste2-pcb.webp +0 -0
  95. package/data/icons/211_hmip-drg-dali.webp +0 -0
  96. package/data/icons/211_hmip-drsi1.webp +0 -0
  97. package/data/icons/212_hmip-sfd.webp +0 -0
  98. package/data/icons/212_hmipw-scthd.webp +0 -0
  99. package/data/icons/213_hmip-smo230.webp +0 -0
  100. package/data/icons/213_hmip-wua.webp +0 -0
  101. package/data/icons/214_hmip-dld.webp +0 -0
  102. package/data/icons/215_hmip-psm-pe-2.webp +0 -0
  103. package/data/icons/215_hmip-scth230.webp +0 -0
  104. package/data/icons/216_hmip-etrv-e.webp +0 -0
  105. package/data/icons/216_hmip-psm-ch-2.webp +0 -0
  106. package/data/icons/217_hmip-usbsm.webp +0 -0
  107. package/data/icons/218_hmip-dls.webp +0 -0
  108. package/data/icons/219_hmip-fwi.webp +0 -0
  109. package/data/icons/220_hmip-wsc.webp +0 -0
  110. package/data/icons/221_hmip-sti.webp +0 -0
  111. package/data/icons/221_hmip-wkp.webp +0 -0
  112. package/data/icons/222_hmipw-wgd.webp +0 -0
  113. package/data/icons/223_hmip-mod-wd-vk.webp +0 -0
  114. package/data/icons/224_hmip-etrv-cl.webp +0 -0
  115. package/data/icons/225_hmip-rgbw.webp +0 -0
  116. package/data/icons/226_hmip-esi.webp +0 -0
  117. package/data/icons/227_hmip-lsc.webp +0 -0
  118. package/data/icons/228_elv-sh-sw1-bat.webp +0 -0
  119. package/data/icons/229_elv-sh-bm-s.webp +0 -0
  120. package/data/icons/230_hmip-etrv-f.webp +0 -0
  121. package/data/icons/231_elv-sh-cth.webp +0 -0
  122. package/data/icons/232_elv-sh-taco.webp +0 -0
  123. package/data/icons/233_hmip-flc.webp +0 -0
  124. package/data/icons/234_hmip-etrv-3.webp +0 -0
  125. package/data/icons/235_hmip-psmco.webp +0 -0
  126. package/data/icons/236_elv-sh-sb8.webp +0 -0
  127. package/data/icons/237_elv-sh-ctv.webp +0 -0
  128. package/data/icons/238_elv-sh-cap.webp +0 -0
  129. package/data/icons/239_hmip-wgs-f.webp +0 -0
  130. package/data/icons/240_hmip-wgtc-f.webp +0 -0
  131. package/data/icons/241_hmip-wgt-f.webp +0 -0
  132. package/data/icons/242_elv-sh-smsi.webp +0 -0
  133. package/data/icons/243_elv-sh-crc.webp +0 -0
  134. package/data/icons/244_elv-sh-krco.webp +0 -0
  135. package/data/icons/245_hmip-falmot-c8.webp +0 -0
  136. package/data/icons/246_elv-sh-wsm.webp +0 -0
  137. package/data/icons/247_hmip-hap-2.webp +0 -0
  138. package/data/icons/248_hmip-dlp.webp +0 -0
  139. package/data/icons/249_elv-sh-psmci.webp +0 -0
  140. package/data/icons/250_elv-sh-sps25.webp +0 -0
  141. package/data/icons/252_elv-sh-pti2.webp +0 -0
  142. package/data/icons/253_hmip-udi-smi55.webp +0 -0
  143. package/data/icons/254_hmip-udi-pb2.webp +0 -0
  144. package/data/icons/256_ELV-SH-SMS2.webp +0 -0
  145. package/data/icons/257_ELV-SH-FSI.webp +0 -0
  146. package/data/icons/258_hmip-m-td15.webp +0 -0
  147. package/data/icons/259_elv-sh-dusi.webp +0 -0
  148. package/data/icons/260_hmip-wss.webp +0 -0
  149. package/data/icons/54a_lc-ddc1-pcb.webp +0 -0
  150. package/data/icons/72_hm-rc-brc-h.webp +0 -0
  151. package/data/icons/73_hm-atent.webp +0 -0
  152. package/data/icons/79_hm-lc-dim1pwm-cv.webp +0 -0
  153. package/data/icons/84_hm-rc-4-3.webp +0 -0
  154. package/data/icons/85_hm-rc-sec4-3.webp +0 -0
  155. package/data/icons/86_hm-rc-key4-3.webp +0 -0
  156. package/data/icons/CCU3-1-50.webp +0 -0
  157. package/data/icons/CCU3.webp +0 -0
  158. package/data/icons/hm-coupling-dim.webp +0 -0
  159. package/data/icons/hm-coupling-group.webp +0 -0
  160. package/data/icons/hm-coupling-onoff.webp +0 -0
  161. package/data/icons/hm-coupling-rgb-dim.webp +0 -0
  162. package/data/icons/hm-coupling-rgb.webp +0 -0
  163. package/data/icons/hm-coupling-rgbw-dim.webp +0 -0
  164. package/data/icons/hm-coupling-rgbw.webp +0 -0
  165. package/data/icons/hm-coupling-white-dim.webp +0 -0
  166. package/data/icons/hm-coupling-white.webp +0 -0
  167. package/data/icons/hm-hue_gateway.webp +0 -0
  168. package/data/icons/hm-lightify_gateway.webp +0 -0
  169. package/data/icons/hm_resc-win-pcb-sc.webp +0 -0
  170. package/data/icons/unknown_device.webp +0 -0
  171. package/data/manifest.json +7 -1
  172. package/data/master-metadata.json +1997 -33
  173. package/data/profiles/ACCESS_RECEIVER.json +26 -13
  174. package/data/profiles/ACOUSTIC_SIGNAL_VIRTUAL_RECEIVER.json +3270 -76
  175. package/data/profiles/ACTOR_SECURITY.json +90 -10
  176. package/data/profiles/ACTOR_WINDOW.json +580 -43
  177. package/data/profiles/ALARMACTUATOR.json +564 -37
  178. package/data/profiles/ALARM_COND_SWITCH_RECEIVER.json +36 -4
  179. package/data/profiles/ALARM_SWITCH_VIRTUAL_RECEIVER.json +735 -33
  180. package/data/profiles/ARMING.json +115 -5
  181. package/data/profiles/BLIND.json +1038 -49
  182. package/data/profiles/BLIND_VIRTUAL_RECEIVER.json +4624 -124
  183. package/data/profiles/CLIMATECONTROL_FLOOR_PUMP_TRANSCEIVER.json +27 -1
  184. package/data/profiles/DIMMER.json +2233 -71
  185. package/data/profiles/DIMMER_VIRTUAL_RECEIVER.json +5773 -102
  186. package/data/profiles/DIMMER_woLongKeyPress.json +117 -4
  187. package/data/profiles/DOOR_RECEIVER.json +138 -10
  188. package/data/profiles/DUAL_WHITE_BRIGHTNESS.json +305 -11
  189. package/data/profiles/DUAL_WHITE_COLOR.json +730 -23
  190. package/data/profiles/HEATING_KEY_RECEIVER.json +127 -10
  191. package/data/profiles/HMW_BLIND.json +555 -20
  192. package/data/profiles/HMW_DIMMER.json +1337 -47
  193. package/data/profiles/HMW_INPUT_OUTPUT.json +375 -20
  194. package/data/profiles/HMW_SWITCH.json +375 -20
  195. package/data/profiles/JALOUSIE.json +1320 -52
  196. package/data/profiles/KEYMATIC.json +120 -12
  197. package/data/profiles/REMOTECONTROL_RECEIVER.json +10 -2
  198. package/data/profiles/RGBW_AUTOMATIC.json +46 -6
  199. package/data/profiles/RGBW_COLOR.json +14 -4
  200. package/data/profiles/SERVO_VIRTUAL_RECEIVER.json +117 -3
  201. package/data/profiles/SHUTTER_VIRTUAL_RECEIVER.json +4263 -128
  202. package/data/profiles/SIGNAL_CHIME.json +195 -14
  203. package/data/profiles/SIGNAL_CHIMEM.json +195 -14
  204. package/data/profiles/SIGNAL_LED.json +195 -14
  205. package/data/profiles/SIGNAL_LEDM.json +195 -14
  206. package/data/profiles/SIMPLE_SWITCH_RECEIVER.json +113 -9
  207. package/data/profiles/STATUS_INDICATOR.json +1073 -45
  208. package/data/profiles/SWITCH.json +1412 -60
  209. package/data/profiles/SWITCH_PANIC.json +315 -13
  210. package/data/profiles/SWITCH_SENSOR.json +243 -11
  211. package/data/profiles/SWITCH_VIRTUAL_RECEIVER.json +3963 -131
  212. package/data/profiles/UNIVERSAL_ACTOR.json +4319 -90
  213. package/data/profiles/UNIVERSAL_LIGHT_RECEIVER_LSC.json +6094 -196
  214. package/data/profiles/UNIVERSAL_LIGHT_RECEIVER_PWM.json +4920 -101
  215. package/data/profiles/UNIVERSAL_LIGHT_RECEIVER_RGB(W).json +2353 -80
  216. package/data/profiles/UNIVERSAL_LIGHT_RECEIVER_RGBW_DALI.json +6116 -176
  217. package/data/profiles/UNIVERSAL_LIGHT_RECEIVER_TW.json +3844 -104
  218. package/data/profiles/VIRTUAL_DIMMER.json +305 -11
  219. package/data/profiles/VIRTUAL_DUAL_WHITE_COLOR.json +730 -23
  220. package/data/profiles/WATER_SWITCH_VIRTUAL_RECEIVER.json +3903 -128
  221. package/data/profiles/WINDOW_DRIVE_RECEIVER.json +220 -8
  222. package/data/profiles/WINMATIC.json +505 -23
  223. package/dist/cli.js +24 -0
  224. package/dist/occulite.d.ts +86 -0
  225. package/dist/occulite.js +140 -0
  226. package/dist/options.d.ts +37 -6
  227. package/dist/options.js +49 -6
  228. package/dist/server.d.ts +47 -4
  229. package/dist/server.js +237 -27
  230. package/dist/sessions.d.ts +9 -1
  231. package/dist/sessions.js +8 -2
  232. package/dist/testSupport.js +9 -2
  233. package/node_modules/@homematic-manager/backend/dist/api/backend.d.ts +33 -0
  234. package/node_modules/@homematic-manager/backend/dist/api/backend.js +558 -46
  235. package/node_modules/@homematic-manager/backend/dist/cache/names.d.ts +9 -0
  236. package/node_modules/@homematic-manager/backend/dist/cache/names.js +21 -0
  237. package/node_modules/@homematic-manager/backend/dist/config/defaults.js +10 -1
  238. package/node_modules/@homematic-manager/backend/dist/config/store.d.ts +28 -1
  239. package/node_modules/@homematic-manager/backend/dist/config/store.js +59 -3
  240. package/node_modules/@homematic-manager/backend/dist/devices/installMode.js +9 -0
  241. package/node_modules/@homematic-manager/backend/dist/errors.d.ts +18 -0
  242. package/node_modules/@homematic-manager/backend/dist/errors.js +51 -2
  243. package/node_modules/@homematic-manager/backend/dist/images/deviceImages.d.ts +6 -0
  244. package/node_modules/@homematic-manager/backend/dist/images/deviceImages.js +38 -2
  245. package/node_modules/@homematic-manager/backend/dist/index.d.ts +3 -1
  246. package/node_modules/@homematic-manager/backend/dist/index.js +4 -1
  247. package/node_modules/@homematic-manager/backend/dist/interfaces/manager.d.ts +70 -8
  248. package/node_modules/@homematic-manager/backend/dist/interfaces/manager.js +333 -44
  249. package/node_modules/@homematic-manager/backend/dist/meta/client.d.ts +120 -0
  250. package/node_modules/@homematic-manager/backend/dist/meta/client.js +307 -0
  251. package/node_modules/@homematic-manager/backend/dist/meta/credentials.d.ts +38 -0
  252. package/node_modules/@homematic-manager/backend/dist/meta/credentials.js +53 -0
  253. package/node_modules/@homematic-manager/backend/dist/meta/index.d.ts +12 -0
  254. package/node_modules/@homematic-manager/backend/dist/meta/index.js +12 -0
  255. package/node_modules/@homematic-manager/backend/dist/meta/localProvider.d.ts +47 -0
  256. package/node_modules/@homematic-manager/backend/dist/meta/localProvider.js +119 -0
  257. package/node_modules/@homematic-manager/backend/dist/meta/occuliteProvider.d.ts +79 -0
  258. package/node_modules/@homematic-manager/backend/dist/meta/occuliteProvider.js +305 -0
  259. package/node_modules/@homematic-manager/backend/dist/meta/provider.d.ts +68 -0
  260. package/node_modules/@homematic-manager/backend/dist/meta/provider.js +19 -0
  261. package/node_modules/@homematic-manager/backend/dist/meta/regaProvider.d.ts +84 -0
  262. package/node_modules/@homematic-manager/backend/dist/meta/regaProvider.js +403 -0
  263. package/node_modules/@homematic-manager/backend/dist/meta/service.d.ts +137 -0
  264. package/node_modules/@homematic-manager/backend/dist/meta/service.js +412 -0
  265. package/node_modules/@homematic-manager/backend/dist/rega/client.d.ts +11 -0
  266. package/node_modules/@homematic-manager/backend/dist/rega/client.js +13 -0
  267. package/node_modules/@homematic-manager/backend/dist/rega/scripts.d.ts +51 -0
  268. package/node_modules/@homematic-manager/backend/dist/rega/scripts.js +171 -0
  269. package/node_modules/@homematic-manager/backend/dist/rpc/client.d.ts +18 -5
  270. package/node_modules/@homematic-manager/backend/dist/rpc/client.js +11 -5
  271. package/node_modules/@homematic-manager/backend/dist/rpc/log.d.ts +86 -0
  272. package/node_modules/@homematic-manager/backend/dist/rpc/log.js +241 -0
  273. package/node_modules/@homematic-manager/backend/dist/rpc/origin.d.ts +30 -0
  274. package/node_modules/@homematic-manager/backend/dist/rpc/origin.js +35 -0
  275. package/node_modules/@homematic-manager/backend/dist/rpc/server.d.ts +12 -0
  276. package/node_modules/@homematic-manager/backend/dist/rpc/server.js +37 -5
  277. package/node_modules/@homematic-manager/backend/dist/util/net.d.ts +86 -1
  278. package/node_modules/@homematic-manager/backend/dist/util/net.js +223 -9
  279. package/node_modules/@homematic-manager/backend/package.json +1 -1
  280. package/node_modules/@homematic-manager/core/dist/api/types.d.ts +397 -10
  281. package/node_modules/@homematic-manager/core/dist/api/types.js +23 -2
  282. package/node_modules/@homematic-manager/core/dist/data/memory.d.ts +3 -1
  283. package/node_modules/@homematic-manager/core/dist/data/memory.js +3 -0
  284. package/node_modules/@homematic-manager/core/dist/data/types.d.ts +60 -0
  285. package/node_modules/@homematic-manager/core/dist/data/types.js +2 -0
  286. package/node_modules/@homematic-manager/core/dist/devices/index.d.ts +19 -0
  287. package/node_modules/@homematic-manager/core/dist/devices/index.js +53 -0
  288. package/node_modules/@homematic-manager/core/dist/easymodes/engine.d.ts +3 -1
  289. package/node_modules/@homematic-manager/core/dist/easymodes/engine.js +1 -0
  290. package/node_modules/@homematic-manager/core/dist/easymodes/form.d.ts +43 -0
  291. package/node_modules/@homematic-manager/core/dist/easymodes/form.js +84 -0
  292. package/node_modules/@homematic-manager/core/dist/i18n/messages.js +61 -0
  293. package/node_modules/@homematic-manager/core/dist/index.d.ts +3 -0
  294. package/node_modules/@homematic-manager/core/dist/index.js +4 -0
  295. package/node_modules/@homematic-manager/core/dist/interfaces/table.d.ts +23 -2
  296. package/node_modules/@homematic-manager/core/dist/interfaces/table.js +18 -1
  297. package/node_modules/@homematic-manager/core/dist/meta/document.d.ts +71 -0
  298. package/node_modules/@homematic-manager/core/dist/meta/document.js +260 -0
  299. package/node_modules/@homematic-manager/core/dist/meta/follow.d.ts +27 -0
  300. package/node_modules/@homematic-manager/core/dist/meta/follow.js +180 -0
  301. package/node_modules/@homematic-manager/core/dist/meta/index.d.ts +16 -0
  302. package/node_modules/@homematic-manager/core/dist/meta/index.js +16 -0
  303. package/node_modules/@homematic-manager/core/dist/meta/paths.d.ts +96 -0
  304. package/node_modules/@homematic-manager/core/dist/meta/paths.js +182 -0
  305. package/node_modules/@homematic-manager/core/dist/meta/slug.d.ts +22 -0
  306. package/node_modules/@homematic-manager/core/dist/meta/slug.js +59 -0
  307. package/node_modules/@homematic-manager/core/dist/meta/store.d.ts +147 -0
  308. package/node_modules/@homematic-manager/core/dist/meta/store.js +537 -0
  309. package/node_modules/@homematic-manager/core/dist/meta/tree.d.ts +19 -0
  310. package/node_modules/@homematic-manager/core/dist/meta/tree.js +53 -0
  311. package/node_modules/@homematic-manager/core/dist/meta/types.d.ts +143 -0
  312. package/node_modules/@homematic-manager/core/dist/meta/types.js +63 -0
  313. package/node_modules/@homematic-manager/core/dist/meta/view.d.ts +50 -0
  314. package/node_modules/@homematic-manager/core/dist/meta/view.js +103 -0
  315. package/node_modules/@homematic-manager/core/dist/rpc/methods.d.ts +10 -0
  316. package/node_modules/@homematic-manager/core/dist/rpc/methods.js +51 -1
  317. package/node_modules/@homematic-manager/core/dist/rpc/text.d.ts +22 -0
  318. package/node_modules/@homematic-manager/core/dist/rpc/text.js +46 -0
  319. package/node_modules/@homematic-manager/core/dist/rssi/index.d.ts +125 -13
  320. package/node_modules/@homematic-manager/core/dist/rssi/index.js +146 -29
  321. package/node_modules/@homematic-manager/core/dist/serviceMessages/index.d.ts +28 -2
  322. package/node_modules/@homematic-manager/core/dist/serviceMessages/index.js +44 -6
  323. package/node_modules/@homematic-manager/core/package.json +1 -1
  324. package/package.json +3 -3
  325. package/ui/assets/index-D-NsbBVS.css +1 -0
  326. package/ui/assets/index-DNUNMBbb.js +16 -0
  327. package/ui/favicon.ico +0 -0
  328. package/ui/index.html +3 -2
  329. package/node_modules/@homematic-manager/backend/dist/write/log.d.ts +0 -51
  330. package/node_modules/@homematic-manager/backend/dist/write/log.js +0 -151
  331. package/ui/assets/index-lB-HxsKR.js +0 -13
  332. package/ui/assets/index-qbhgN2pA.css +0 -1
@@ -0,0 +1,305 @@
1
+ /**
2
+ * The `occulite` provider: names, rooms and functions from an openccu-lite box, and written back
3
+ * to it.
4
+ *
5
+ * The shape of it is the one openccu-lite's porting kit prescribes and the one their own
6
+ * `occulited` expects: **snapshot once, then follow the change stream**, and re-snapshot when the
7
+ * stream says the history is gone (`resync`), when a whole store was imported, or when a revision
8
+ * arrives that is not the next one. Nothing polls. A rename made in another frontend, or by another
9
+ * person in another browser, is in this application's grid inside a second.
10
+ *
11
+ * Failure is degradation, never an exception (their invariant 5, our D-2):
12
+ *
13
+ * - the box is off → the last snapshot from the cache file, `reachable: false`, one notice, and a
14
+ * reconnect loop with a backoff;
15
+ * - the credential is refused (401) → no names rather than no application, one notice, and a retry
16
+ * on the next reconnect;
17
+ * - the credential may read but not write (403) → the names are shown and `writable` is false, so
18
+ * the UI can say why the rename button does nothing.
19
+ *
20
+ * The snapshot is persisted where the ReGa provider persists its names, for the same reason: a
21
+ * restart while the box is unreachable must not leave the grid nameless.
22
+ */
23
+ import { applyEvent, emptyDocument, isMetaError, parseDocument, summariseAll, } from '@homematic-manager/core';
24
+ import { errorMessage } from '../errors.js';
25
+ import { readJsonFile, writeJsonFile } from '../util/jsonFile.js';
26
+ import { MetaApiClient } from './client.js';
27
+ /** First wait before the event stream is opened again, in milliseconds. */
28
+ export const RECONNECT_MIN_MS = 2000;
29
+ /** Longest wait between two attempts. A box that is being updated is back well inside a minute. */
30
+ export const RECONNECT_MAX_MS = 60_000;
31
+ export class OcculiteProvider {
32
+ kind = 'occulite';
33
+ #options;
34
+ #client;
35
+ #document = emptyDocument();
36
+ #reachable = false;
37
+ #writable = true;
38
+ #error;
39
+ #abort;
40
+ #loop;
41
+ /** So that the same failure is not written into the log every two seconds. */
42
+ #lastNotice = '';
43
+ /** Ends the wait between two attempts at the event stream; set while the loop is sleeping. */
44
+ #wake;
45
+ constructor(options) {
46
+ this.#options = options;
47
+ this.#client = options.client;
48
+ }
49
+ state() {
50
+ return {
51
+ provider: 'occulite',
52
+ reachable: this.#reachable,
53
+ writable: this.#writable,
54
+ revision: this.#document.revision,
55
+ objects: Object.keys(this.#document.objects).length,
56
+ url: this.#client.baseUrl,
57
+ ...(this.#options.implementation === undefined ? {} : { implementation: this.#options.implementation }),
58
+ ...(this.#error === undefined ? {} : { error: this.#error }),
59
+ };
60
+ }
61
+ document() {
62
+ return this.#document;
63
+ }
64
+ /**
65
+ * The cached snapshot first, then the box.
66
+ *
67
+ * In that order on purpose: the cache is instant and the box may be a second away, and a grid
68
+ * that shows the names it had a moment ago and then corrects them is better than one that shows
69
+ * addresses while a request is in flight.
70
+ */
71
+ async start() {
72
+ await this.#loadCache();
73
+ this.#abort = new AbortController();
74
+ const signal = this.#abort.signal;
75
+ await this.#refresh();
76
+ this.#loop = this.#follow(signal);
77
+ }
78
+ async stop() {
79
+ this.#abort?.abort();
80
+ this.#abort = undefined;
81
+ try {
82
+ await this.#loop;
83
+ }
84
+ catch {
85
+ // the loop ends by being aborted; that is not a failure
86
+ }
87
+ this.#loop = undefined;
88
+ }
89
+ /**
90
+ * A fresh snapshot, on demand - the credential changed, or a host asked for one.
91
+ *
92
+ * It also ends the wait before the next attempt at the event stream. On the box the first page
93
+ * load is what hands the addon a session at all, and without this the store would be read at
94
+ * once but only *followed* after the backoff had run out.
95
+ */
96
+ async refresh() {
97
+ await this.#refresh();
98
+ this.#wake?.();
99
+ }
100
+ async setNames(entries) {
101
+ if (entries.length === 0) {
102
+ return;
103
+ }
104
+ const sets = {};
105
+ for (const entry of entries) {
106
+ sets[entry.ref] = { name: entry.name };
107
+ }
108
+ await this.#write(() => this.#client.bulk(sets));
109
+ }
110
+ async setMembership(entries) {
111
+ if (entries.length === 0) {
112
+ return;
113
+ }
114
+ const sets = {};
115
+ for (const entry of entries) {
116
+ sets[entry.ref] = { enums: entry.paths };
117
+ }
118
+ await this.#write(() => this.#client.bulk(sets));
119
+ }
120
+ async createEnum(id, name) {
121
+ await this.#write(() => this.#client.createEnum(id, name));
122
+ }
123
+ async updateEnum(id, name) {
124
+ await this.#write(() => this.#client.updateEnum(id, name));
125
+ }
126
+ async deleteEnum(id, detach) {
127
+ await this.#write(() => this.#client.deleteEnum(id, detach ? 'detach' : 'refuse'));
128
+ }
129
+ async createNode(enumId, parent, id, name, options) {
130
+ await this.#write(() => this.#client.createNode(enumId, {
131
+ parent,
132
+ id,
133
+ name,
134
+ ...(options.icon === undefined ? {} : { icon: options.icon }),
135
+ ...(options.position === undefined ? {} : { position: options.position }),
136
+ }));
137
+ return `${parent ?? enumId}/${id}`;
138
+ }
139
+ async updateNode(path, patch) {
140
+ await this.#write(() => this.#client.updateNode(path, patch));
141
+ }
142
+ async deleteNode(path, detach) {
143
+ await this.#write(() => this.#client.deleteNode(path, detach ? 'detach' : 'refuse'));
144
+ }
145
+ async import(document, mode) {
146
+ await this.#write(() => this.#client.import(document, mode));
147
+ }
148
+ /**
149
+ * One write, then a fresh snapshot.
150
+ *
151
+ * The snapshot rather than trusting the event stream: a write is a user action, they are rare,
152
+ * and the alternative is a UI whose own change appears only if the stream happens to be up. A
153
+ * 403 is turned into `writable: false` so the state says *why*, and is then re-thrown for the
154
+ * caller to show.
155
+ */
156
+ async #write(call) {
157
+ try {
158
+ const answer = await call();
159
+ if (!this.#writable) {
160
+ this.#writable = true;
161
+ this.#options.onStateChanged(this.state());
162
+ }
163
+ await this.#refresh();
164
+ return answer;
165
+ }
166
+ catch (error) {
167
+ if (isMetaError(error) && error.code === 'forbidden') {
168
+ this.#writable = false;
169
+ this.#error = error.message;
170
+ this.#options.onStateChanged(this.state());
171
+ }
172
+ throw error;
173
+ }
174
+ }
175
+ /** `GET /snapshot`, with every failure turned into a state instead of an exception. */
176
+ async #refresh() {
177
+ try {
178
+ const document = await this.#client.snapshot();
179
+ this.#document = document;
180
+ this.#reachable = true;
181
+ this.#error = undefined;
182
+ this.#lastNotice = '';
183
+ // told before it is persisted, and on purpose: the document is already visible to every
184
+ // reader, so a listener that hears about it one `await` later would be looking at a
185
+ // change nobody announced
186
+ this.#options.onStateChanged(this.state());
187
+ this.#options.onChanged();
188
+ await this.#saveCache();
189
+ }
190
+ catch (error) {
191
+ this.#fail(error);
192
+ }
193
+ }
194
+ /**
195
+ * The change stream, for as long as the provider is running.
196
+ *
197
+ * Every reconnect resumes at the revision this provider holds. The box replays what it still
198
+ * has and answers `resync` when it does not, which is the one case where a snapshot is fetched
199
+ * again - together with `import`, which means the whole store was replaced.
200
+ */
201
+ async #follow(signal) {
202
+ // read through a function: `aborted` changes while this loop is awaiting, and neither the
203
+ // type checker's narrowing nor the lint rule that follows it can know that
204
+ const aborted = () => signal.aborted;
205
+ let wait = this.#options.reconnectMinMs ?? RECONNECT_MIN_MS;
206
+ while (!aborted()) {
207
+ try {
208
+ for await (const event of this.#client.events(this.#document.revision, signal)) {
209
+ wait = this.#options.reconnectMinMs ?? RECONNECT_MIN_MS;
210
+ if (!this.#reachable) {
211
+ this.#reachable = true;
212
+ this.#error = undefined;
213
+ this.#options.onStateChanged(this.state());
214
+ }
215
+ const next = applyEvent(this.#document, event);
216
+ if (next === 'resync') {
217
+ await this.#refresh();
218
+ continue;
219
+ }
220
+ if (next.revision === this.#document.revision) {
221
+ // a replayed event we already had
222
+ continue;
223
+ }
224
+ this.#document = next;
225
+ this.#options.onStateChanged(this.state());
226
+ this.#options.onChanged();
227
+ await this.#saveCache();
228
+ }
229
+ }
230
+ catch (error) {
231
+ if (aborted()) {
232
+ return;
233
+ }
234
+ this.#fail(error);
235
+ }
236
+ if (aborted()) {
237
+ return;
238
+ }
239
+ await this.#sleep(wait, signal);
240
+ wait = Math.min(wait * 2, this.#options.reconnectMaxMs ?? RECONNECT_MAX_MS);
241
+ // a reconnect is also the moment to try the credential again: a token that was added on
242
+ // the box while this was running starts working without a restart here
243
+ if (!aborted() && !this.#reachable) {
244
+ await this.#refresh();
245
+ }
246
+ }
247
+ }
248
+ #fail(error) {
249
+ const message = isMetaError(error) ? error.message : errorMessage(error);
250
+ this.#reachable = false;
251
+ this.#error = message;
252
+ this.#options.onStateChanged(this.state());
253
+ if (message !== this.#lastNotice) {
254
+ this.#lastNotice = message;
255
+ this.#options.onNotice('warn', `the openccu-lite metadata store is not answering: ${message}`);
256
+ }
257
+ }
258
+ async #loadCache() {
259
+ if (this.#options.cacheFile === undefined) {
260
+ return;
261
+ }
262
+ const raw = await readJsonFile(this.#options.cacheFile);
263
+ if (raw === undefined) {
264
+ return;
265
+ }
266
+ try {
267
+ this.#document = parseDocument(raw);
268
+ this.#options.onChanged();
269
+ }
270
+ catch {
271
+ // a cache file that cannot be read is a cache file, not a store: it is replaced by the
272
+ // next snapshot and nobody needs to hear about it
273
+ }
274
+ }
275
+ async #saveCache() {
276
+ if (this.#options.cacheFile === undefined) {
277
+ return;
278
+ }
279
+ try {
280
+ await writeJsonFile(this.#options.cacheFile, this.#document);
281
+ }
282
+ catch (error) {
283
+ this.#options.onNotice('warn', `the metadata cache could not be written: ${errorMessage(error)}`);
284
+ }
285
+ }
286
+ #sleep(ms, signal) {
287
+ if (this.#options.wait) {
288
+ return this.#options.wait(ms, signal);
289
+ }
290
+ return new Promise((resolve) => {
291
+ const done = () => {
292
+ clearTimeout(timer);
293
+ this.#wake = undefined;
294
+ resolve();
295
+ };
296
+ const timer = setTimeout(done, ms);
297
+ timer.unref();
298
+ this.#wake = done;
299
+ signal.addEventListener('abort', done, { once: true });
300
+ });
301
+ }
302
+ }
303
+ /** Every object of the current document as the UI shows it. Re-exported for the backend's reads. */
304
+ export { summariseAll };
305
+ //# sourceMappingURL=occuliteProvider.js.map
@@ -0,0 +1,68 @@
1
+ /**
2
+ * The metadata provider: one interface, two implementations, the same public surface.
3
+ *
4
+ * D-40. `local` keeps names, rooms and functions in this profile - a user on Homegear, on a bare
5
+ * rfd or on the desktop gets a taxonomy for the first time. `occulite` reads them from an
6
+ * openccu-lite box, follows its change stream and **writes back**, because on that box this
7
+ * application is the editor of the store: there is no ReGaHSS and no WebUI to do it instead.
8
+ *
9
+ * `rega` (task 27) is the third: on a CCU with ReGaHSS the rooms and functions are ReGa's own enum
10
+ * objects, read and written through the script transport the names already use, so that one
11
+ * editing UI serves a CCU and a box. A box that has ReGa never has a metadata API, so the three
12
+ * never compete: the box's API wins when it answers, ReGa when it is on and answered, and `local`
13
+ * is what every other system - Homegear, a bare rfd, the desktop without a CCU - gets.
14
+ */
15
+ import type { MetaDocument, MetaEnum, MetaImportMode, MetaNodePatch, MetaState } from '@homematic-manager/core';
16
+ /** One name to write: the store's identity is the ref, not the bare address. */
17
+ export interface MetaNameEntry {
18
+ readonly ref: string;
19
+ readonly name: string;
20
+ }
21
+ /** The complete membership one object should have afterwards. */
22
+ export interface MetaMembershipEntry {
23
+ readonly ref: string;
24
+ readonly paths: readonly string[];
25
+ }
26
+ export interface MetaProviderEvents {
27
+ /** The document changed - locally, or on the box because somebody else edited it. */
28
+ readonly onChanged: () => void;
29
+ /** Reachability, writability or the revision changed. */
30
+ readonly onStateChanged: (state: MetaState) => void;
31
+ readonly onNotice: (level: 'info' | 'warn' | 'error', message: string) => void;
32
+ }
33
+ /**
34
+ * What the backend calls. Every write is asynchronous because one of the two implementations is a
35
+ * box on the network; every read is synchronous because both keep the document in memory.
36
+ */
37
+ export interface MetadataProvider {
38
+ readonly kind: 'local' | 'occulite' | 'rega';
39
+ state(): MetaState;
40
+ /** Loads the document (a file, or the box's snapshot) and starts following changes. */
41
+ start(): Promise<void>;
42
+ stop(): Promise<void>;
43
+ /**
44
+ * Reads everything again.
45
+ *
46
+ * Called when the credential changes - on the box that is the moment a user opens the page and
47
+ * the addon learns their session - so that names appear at once instead of at the next
48
+ * reconnect of the event stream.
49
+ */
50
+ refresh(): Promise<void>;
51
+ document(): MetaDocument;
52
+ setNames(entries: readonly MetaNameEntry[]): Promise<void>;
53
+ setMembership(entries: readonly MetaMembershipEntry[]): Promise<void>;
54
+ createEnum(id: string, name: Readonly<Record<string, string>>): Promise<void>;
55
+ updateEnum(id: string, name: Readonly<Record<string, string>>): Promise<void>;
56
+ deleteEnum(id: string, detach: boolean): Promise<void>;
57
+ /** Answers with the path the node got; the id is derived from the name by the caller. */
58
+ createNode(enumId: string, parent: string | null, id: string, name: string, options: {
59
+ readonly icon?: string;
60
+ readonly position?: number;
61
+ }): Promise<string>;
62
+ updateNode(path: string, patch: MetaNodePatch): Promise<void>;
63
+ deleteNode(path: string, detach: boolean): Promise<void>;
64
+ import(document: unknown, mode: MetaImportMode): Promise<void>;
65
+ }
66
+ /** The enums of a document, for a caller that only wants the trees. */
67
+ export declare function enumsOf(document: MetaDocument): Readonly<Record<string, MetaEnum>>;
68
+ //# sourceMappingURL=provider.d.ts.map
@@ -0,0 +1,19 @@
1
+ /**
2
+ * The metadata provider: one interface, two implementations, the same public surface.
3
+ *
4
+ * D-40. `local` keeps names, rooms and functions in this profile - a user on Homegear, on a bare
5
+ * rfd or on the desktop gets a taxonomy for the first time. `occulite` reads them from an
6
+ * openccu-lite box, follows its change stream and **writes back**, because on that box this
7
+ * application is the editor of the store: there is no ReGaHSS and no WebUI to do it instead.
8
+ *
9
+ * `rega` (task 27) is the third: on a CCU with ReGaHSS the rooms and functions are ReGa's own enum
10
+ * objects, read and written through the script transport the names already use, so that one
11
+ * editing UI serves a CCU and a box. A box that has ReGa never has a metadata API, so the three
12
+ * never compete: the box's API wins when it answers, ReGa when it is on and answered, and `local`
13
+ * is what every other system - Homegear, a bare rfd, the desktop without a CCU - gets.
14
+ */
15
+ /** The enums of a document, for a caller that only wants the trees. */
16
+ export function enumsOf(document) {
17
+ return document.enums;
18
+ }
19
+ //# sourceMappingURL=provider.js.map
@@ -0,0 +1,84 @@
1
+ /**
2
+ * The `rega` metadata provider (task 27): the CCU's own rooms and functions, through ReGaHSS.
3
+ *
4
+ * On a CCU the rooms and functions the user sees in the WebUI live in ReGa's DOM - enum objects
5
+ * under `ID_ROOMS` and `ID_FUNCTIONS`, each holding channel ids - and a taxonomy kept in this
6
+ * profile beside them would be a second truth. So on a CCU with ReGa this provider *is* the store:
7
+ * the same {@link MetadataProvider} surface the box's provider has, over the same script transport
8
+ * the names already use, so that the editing UI of task 25 does not know which one it talks to.
9
+ *
10
+ * What ReGa's model is, and therefore what this provider is:
11
+ *
12
+ * - **Flat.** A room is a room; there is no room below another and no floor. `state().flat` says
13
+ * so, `createNode` with a parent and a move under a parent are refused.
14
+ * - **Two taxonomies, fixed.** Rooms and functions exist; nothing else can be created or deleted.
15
+ * - **Channels are members, devices are not.** The WebUI assigns channels. A device ref in a
16
+ * membership write is applied to every channel of the device except the `:0` maintenance
17
+ * channel, which is what a user who "puts the device in the kitchen" means.
18
+ * - **Identity is the ReGa id.** A node's id is `r<id>`, stable across renames, so a path never
19
+ * has to be rewritten when a room is renamed.
20
+ * - **No change stream.** ReGa tells nobody when the WebUI edits a room. This provider reads
21
+ * everything on `start()`, after every write of its own, and on `refresh()`, which the UI asks
22
+ * for through `meta.refresh`.
23
+ *
24
+ * Failure is a state, never an exception (D-2): a script that does not run leaves the last
25
+ * document in place, sets `reachable: false` and says so once.
26
+ */
27
+ import { type Language, type MetaDocument, type MetaNodePatch, type MetaState } from '@homematic-manager/core';
28
+ import type { MetadataProvider, MetaMembershipEntry, MetaNameEntry, MetaProviderEvents } from './provider.js';
29
+ /** The part of the ReGa transport this provider uses: run a script, read what it wrote. */
30
+ export type RegaScriptRunner = (script: string) => Promise<{
31
+ output: string;
32
+ }>;
33
+ export interface RegaMetaProviderOptions extends MetaProviderEvents {
34
+ readonly exec: RegaScriptRunner;
35
+ /**
36
+ * The interface an address belongs to, from the device caches - the fallback for a device
37
+ * whose interface ReGa does not name (an older firmware, a CUxD device).
38
+ */
39
+ readonly interfaceOf: (address: string) => string | undefined;
40
+ /**
41
+ * The language the stock rooms and functions are shown in. ReGa stores them as translation keys
42
+ * (`roomKitchen`) and the WebUI translates them on display; the CCU's own default is German.
43
+ */
44
+ readonly language?: Language | undefined;
45
+ }
46
+ /**
47
+ * The rooms and functions a CCU comes with, as the WebUI translates them (`translate.lang.js` of
48
+ * the German and the English WebUI, firmware 3.89.8). ReGa's objects carry the *key* as their
49
+ * `Name()` - `roomKitchen`, not `Küche` - and every WebUI page translates it on display, so a list
50
+ * that shows the keys is not what the user sees on the CCU. Found in the first lab pass of task 27.
51
+ * A name that is not one of these keys is shown as it is; a rename writes the literal name.
52
+ */
53
+ export declare const REGA_STOCK_NAMES: Readonly<Record<string, Readonly<Record<'de' | 'en', string>>>>;
54
+ /** `roomKitchen` -> `Küche`; anything that is not a stock key is answered as it is. */
55
+ export declare function regaStockName(name: string, language: Language | undefined): string;
56
+ /** `r4711` - the node id of a ReGa enum object; stable across renames. */
57
+ export declare function regaNodeId(id: number): string;
58
+ /** The ReGa id behind a node id, or `undefined` for anything that is not one. */
59
+ export declare function parseRegaNodeId(id: string): number | undefined;
60
+ export declare class RegaMetaProvider implements MetadataProvider {
61
+ #private;
62
+ readonly kind: "rega";
63
+ constructor(options: RegaMetaProviderOptions);
64
+ state(): MetaState;
65
+ start(): Promise<void>;
66
+ stop(): Promise<void>;
67
+ /** Reads everything again. Never throws: a ReGa that does not answer is a state. */
68
+ refresh(): Promise<void>;
69
+ document(): MetaDocument;
70
+ setNames(entries: readonly MetaNameEntry[]): Promise<void>;
71
+ setMembership(entries: readonly MetaMembershipEntry[]): Promise<void>;
72
+ createEnum(): Promise<void>;
73
+ updateEnum(): Promise<void>;
74
+ deleteEnum(): Promise<void>;
75
+ /**
76
+ * A new room or function. The id the caller derived from the name is not used: ReGa hands out
77
+ * the id, and `r<id>` is what keeps the path stable when the room is renamed later.
78
+ */
79
+ createNode(enumId: string, parent: string | null, _id: string, name: string): Promise<string>;
80
+ updateNode(path: string, patch: MetaNodePatch): Promise<void>;
81
+ deleteNode(path: string, detach: boolean): Promise<void>;
82
+ import(): Promise<void>;
83
+ }
84
+ //# sourceMappingURL=regaProvider.d.ts.map