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
@@ -44,7 +44,58 @@ export interface LinkProfile {
44
44
  description: Localized;
45
45
  /** Parameters this profile sets or restricts; everything else keeps its current value. */
46
46
  params: Record<string, ProfileConstraint>;
47
+ /**
48
+ * Task 62 (D-54): the controls the CCU's own easy mode draws for this profile, in its order,
49
+ * extracted from the WebUI's easymode TCL. Absent where the extraction found no form; the
50
+ * dialog then shows every parameter.
51
+ */
52
+ controls?: EasyControl[];
47
53
  }
54
+ /**
55
+ * One control of the CCU easy mode's form of a profile (task 62). `requires` lists parameters the
56
+ * WebUI checks with `info exists` before drawing it; `label` is the WebUI's own row text where it
57
+ * could be resolved, otherwise the dialog uses the parameter's name.
58
+ */
59
+ export type EasyControl = {
60
+ /**
61
+ * One duration over `<prefix>_BASE` / `<prefix>_FACTOR` (a link's `SHORT_ON_TIME`) or
62
+ * `<prefix>_UNIT` / `<prefix>_VALUE` (an HmIP MASTER parameter such as `EVENT_DELAY`).
63
+ */
64
+ kind: 'time';
65
+ prefix: string;
66
+ /** The preset list, a key of the time selector file (`timeOnOff`, `rampOnOff`, ...). */
67
+ selector: string;
68
+ label?: Localized;
69
+ requires?: string[];
70
+ } | {
71
+ kind: 'param';
72
+ param: string;
73
+ /** Further parameters the WebUI writes the same value to (`SHORT_ON_LEVEL|LONG_ON_LEVEL`). */
74
+ also?: string[];
75
+ /** The WebUI's option set for the combo box, an `OptionPreset.id`. */
76
+ option?: string;
77
+ label?: Localized;
78
+ requires?: string[];
79
+ } | {
80
+ /** One choice among `LinkSenderMetadata.subsets`, by id. */
81
+ kind: 'subset';
82
+ subsets: number[];
83
+ label?: Localized;
84
+ /** The choices' names, in the order of `subsets`. */
85
+ names?: Array<Localized | null>;
86
+ requires?: string[];
87
+ };
88
+ /**
89
+ * One entry of a time selector: a duration in seconds, or `notActive` (0), `permanent` (the pair's
90
+ * maximum) or `enterValue` (show the raw base and factor).
91
+ */
92
+ export type TimeSelectorOption = ({
93
+ seconds: number;
94
+ } | {
95
+ special: 'notActive' | 'permanent' | 'enterValue';
96
+ }) & {
97
+ label?: Localized;
98
+ };
48
99
  /**
49
100
  * One group of link parameters the WebUI offers as a preset value, e.g. "switch on immediately"
50
101
  * versus "switch on after the ramp": picking `optionValue` writes `values` to `params`.
@@ -94,6 +145,11 @@ export interface MasterMetadata {
94
145
  labelKey?: string;
95
146
  parameters: string[];
96
147
  }>;
148
+ /**
149
+ * Task 63 (D-55): the controls the CCU's own MASTER form draws for this channel type, in its
150
+ * order, extracted from the WebUI like `LinkProfile.controls`. Absent where there is no form.
151
+ */
152
+ controls?: EasyControl[];
97
153
  }
98
154
  export interface OptionPresetEntry {
99
155
  /** Literal label such as `5s`; `labelKey` refers to `Translations.uiLabels`. */
@@ -171,6 +227,8 @@ export interface DataSource {
171
227
  crossValidations(): Promise<CrossValidationRule[]>;
172
228
  translations(language: Language): Promise<Translations | undefined>;
173
229
  deviceIcons(): Promise<DeviceIcons>;
230
+ /** Task 62: the presets of each easy-mode time selector type; empty when the file is missing. */
231
+ timeSelectors(): Promise<Record<string, TimeSelectorOption[]>>;
174
232
  }
175
233
  /**
176
234
  * File layout the pipeline writes under `data/dist/` and every `DataSource` reads:
@@ -183,6 +241,7 @@ export interface DataSource {
183
241
  * cross-validations.json CrossValidationRule[]
184
242
  * translations/<language>.json Translations
185
243
  * device-icons.json DeviceIcons
244
+ * easymode-time-selectors.json {source, types: Record<type, TimeSelectorOption[]>}
186
245
  */
187
246
  export declare const DATA_FILES: {
188
247
  readonly manifest: "manifest.json";
@@ -193,5 +252,6 @@ export declare const DATA_FILES: {
193
252
  readonly crossValidations: "cross-validations.json";
194
253
  readonly translations: (language: Language) => string;
195
254
  readonly deviceIcons: "device-icons.json";
255
+ readonly timeSelectors: "easymode-time-selectors.json";
196
256
  };
197
257
  //# sourceMappingURL=types.d.ts.map
@@ -18,6 +18,7 @@
18
18
  * cross-validations.json CrossValidationRule[]
19
19
  * translations/<language>.json Translations
20
20
  * device-icons.json DeviceIcons
21
+ * easymode-time-selectors.json {source, types: Record<type, TimeSelectorOption[]>}
21
22
  */
22
23
  export const DATA_FILES = {
23
24
  manifest: 'manifest.json',
@@ -28,5 +29,6 @@ export const DATA_FILES = {
28
29
  crossValidations: 'cross-validations.json',
29
30
  translations: (language) => `translations/${language}.json`,
30
31
  deviceIcons: 'device-icons.json',
32
+ timeSelectors: 'easymode-time-selectors.json',
31
33
  };
32
34
  //# sourceMappingURL=types.js.map
@@ -40,6 +40,18 @@ export interface DeviceDescription {
40
40
  readonly INDEX?: number;
41
41
  readonly SUBTYPE?: string;
42
42
  }
43
+ /**
44
+ * One value of a list field as a list of strings: an array keeps its string entries, a string
45
+ * becomes its whitespace- or comma-separated words (`"MASTER VALUES"` is two paramsets, `"MASTER"`
46
+ * is one), and anything else - a number, an object, null - is nothing.
47
+ */
48
+ export declare function asStringList(value: unknown): string[] | undefined;
49
+ /**
50
+ * A description as it arrives from an interface process, with its list fields made into lists
51
+ * (#143). Everything else is passed through untouched: what a field means is the interface's
52
+ * business, only its *shape* is ours, and only where the UI iterates over it.
53
+ */
54
+ export declare function normaliseDescription(entry: DeviceDescription): DeviceDescription;
43
55
  /** `FLAGS` bits of a device description. */
44
56
  export declare const DEVICE_FLAGS: {
45
57
  readonly VISIBLE: 1;
@@ -72,6 +84,13 @@ export declare const RX_MODES: {
72
84
  * by itself and one that does not (task 6).
73
85
  */
74
86
  export declare function decodeRxMode(rxMode: number | undefined): string[];
87
+ /**
88
+ * Is roaming on for this device? rfd reports `ROAMING` as `1`/`0` over BIN-RPC and as a boolean
89
+ * over XML-RPC, so both spellings mean yes.
90
+ */
91
+ export declare function isRoaming(device: {
92
+ readonly ROAMING?: boolean | number | undefined;
93
+ }): boolean;
75
94
  /** `DIRECTION` of a channel. */
76
95
  export declare const DIRECTIONS: readonly ["NONE", "SENDER", "RECEIVER"];
77
96
  /** Decodes `DIRECTION`; anything unexpected is `NONE`, as the 2.x grid did. */
@@ -7,6 +7,52 @@
7
7
  * is one immutable index built once per `listDevices` answer.
8
8
  */
9
9
  import { compareAddresses, MAINTENANCE_CHANNEL, tryParseAddress } from '../address/address.js';
10
+ /**
11
+ * The fields of a description that are lists of strings. What an interface process actually sends
12
+ * for them is not guaranteed: the CCU's group process (`VirtualDevices`) answers `PARAMSETS` as a
13
+ * plain string on some boxes, and a `?? []` guard does not catch that - `.filter` on a string
14
+ * throws, and in a reactive grid one throw takes the whole page down (#143: the device list stayed
15
+ * on "Loading Homematic Manager..." while the count beside it said 31).
16
+ */
17
+ const LIST_FIELDS = ['CHILDREN', 'PARAMSETS', 'TEAM_CHANNELS'];
18
+ /**
19
+ * One value of a list field as a list of strings: an array keeps its string entries, a string
20
+ * becomes its whitespace- or comma-separated words (`"MASTER VALUES"` is two paramsets, `"MASTER"`
21
+ * is one), and anything else - a number, an object, null - is nothing.
22
+ */
23
+ export function asStringList(value) {
24
+ if (Array.isArray(value)) {
25
+ return value.filter((entry) => typeof entry === 'string');
26
+ }
27
+ if (typeof value === 'string') {
28
+ const words = value.split(/[\s,]+/).filter((word) => word !== '');
29
+ return words.length > 0 ? words : [];
30
+ }
31
+ return undefined;
32
+ }
33
+ /**
34
+ * A description as it arrives from an interface process, with its list fields made into lists
35
+ * (#143). Everything else is passed through untouched: what a field means is the interface's
36
+ * business, only its *shape* is ours, and only where the UI iterates over it.
37
+ */
38
+ export function normaliseDescription(entry) {
39
+ let patch;
40
+ for (const field of LIST_FIELDS) {
41
+ const value = entry[field];
42
+ if (value === undefined || Array.isArray(value)) {
43
+ continue;
44
+ }
45
+ const list = asStringList(value);
46
+ patch ??= {};
47
+ if (list === undefined) {
48
+ patch[field] = undefined;
49
+ }
50
+ else {
51
+ patch[field] = list;
52
+ }
53
+ }
54
+ return patch === undefined ? entry : { ...entry, ...patch };
55
+ }
10
56
  /** `FLAGS` bits of a device description. */
11
57
  export const DEVICE_FLAGS = {
12
58
  VISIBLE: 1,
@@ -55,6 +101,13 @@ export function decodeRxMode(rxMode) {
55
101
  }
56
102
  return names;
57
103
  }
104
+ /**
105
+ * Is roaming on for this device? rfd reports `ROAMING` as `1`/`0` over BIN-RPC and as a boolean
106
+ * over XML-RPC, so both spellings mean yes.
107
+ */
108
+ export function isRoaming(device) {
109
+ return device.ROAMING === true || device.ROAMING === 1;
110
+ }
58
111
  /** `DIRECTION` of a channel. */
59
112
  export const DIRECTIONS = ['NONE', 'SENDER', 'RECEIVER'];
60
113
  /** Decodes `DIRECTION`; anything unexpected is `NONE`, as the 2.x grid did. */
@@ -11,7 +11,7 @@
11
11
  * parameters, which of them only make sense with a certain value of another one, the typical
12
12
  * values for a delay or a level, and rules between parameters.
13
13
  */
14
- import type { DataSource, LinkProfile, LinkSenderMetadata, OptionPreset } from '../data/types.js';
14
+ import type { DataSource, EasyControl, LinkProfile, LinkSenderMetadata, OptionPreset } from '../data/types.js';
15
15
  import { type ParameterDescription, type ParamsetDescription } from '../paramset/description.js';
16
16
  import type { Paramset, ParamsetValue } from '../rpc/values.js';
17
17
  /** The parameter the CCU stores the chosen profile in, inside the receiver's LINK paramset. */
@@ -57,6 +57,8 @@ export interface MasterView {
57
57
  /** In display order: the metadata's order first, then the rest by `TAB_ORDER`. */
58
58
  readonly parameters: readonly MasterParameterView[];
59
59
  readonly problems: readonly CrossValidationProblem[];
60
+ /** Task 63: the CCU's MASTER form of the channel type, where the data has one. */
61
+ readonly controls?: readonly EasyControl[];
60
62
  }
61
63
  /** Reads the easy-mode data through a `DataSource` and answers the dialogs' questions. */
62
64
  export declare class EasyModeEngine {
@@ -144,6 +144,7 @@ export class EasyModeEngine {
144
144
  return {
145
145
  channelType,
146
146
  parameters,
147
+ ...(metadata?.controls ? { controls: metadata.controls } : {}),
147
148
  problems: rules
148
149
  .filter((rule) => appliesTo(rule, description))
149
150
  .filter((rule) => !holds(rule, values))
@@ -0,0 +1,43 @@
1
+ import type { EasyControl, LinkParameterSubset, LinkProfile, Localized } from '../data/types.js';
2
+ import type { ParamsetDescription } from '../paramset/description.js';
3
+ import { type DurationPair } from '../paramset/time.js';
4
+ /**
5
+ * Tasks 62 and 63 (D-54, D-55): the CCU easy mode's form, for one device.
6
+ *
7
+ * The extracted controls - a link profile's (`LinkProfile.controls`) or a channel type's MASTER
8
+ * form (`MasterMetadata.controls`) - are the union of every branch the WebUI's Tcl can take. What
9
+ * a device actually shows depends on its description: a control whose parameter, time pair or
10
+ * `requires` the description lacks is not on its form - the colour selector of an optical-signal
11
+ * device on a plain dimmer, say.
12
+ */
13
+ export type EasyFormControl = {
14
+ kind: 'time';
15
+ pair: DurationPair;
16
+ selector: string;
17
+ label?: Localized;
18
+ } | {
19
+ kind: 'param';
20
+ param: string;
21
+ also: string[];
22
+ option?: string;
23
+ label?: Localized;
24
+ } | {
25
+ kind: 'subset';
26
+ subsets: number[];
27
+ names?: Array<Localized | null>;
28
+ label?: Localized;
29
+ };
30
+ /**
31
+ * The form of a list of controls on this device, in the WebUI's order; `undefined` when there are
32
+ * none or nothing of them applies, which is the dialogs' cue to show every parameter.
33
+ */
34
+ export declare function easyFormOf(controls: readonly EasyControl[] | undefined, description: ParamsetDescription): EasyFormControl[] | undefined;
35
+ /** A link profile's form on this device (task 62). */
36
+ export declare function easyForm(profile: LinkProfile | undefined, description: ParamsetDescription): EasyFormControl[] | undefined;
37
+ /**
38
+ * Every parameter the form edits: both halves of each time pair, each combo box's parameter and
39
+ * the ones it writes along, and the members of the offered subsets. The expert view highlights
40
+ * exactly these rows.
41
+ */
42
+ export declare function easyFormParams(form: readonly EasyFormControl[] | undefined, subsets?: readonly LinkParameterSubset[]): Set<string>;
43
+ //# sourceMappingURL=form.d.ts.map
@@ -0,0 +1,84 @@
1
+ import { findDurationPairs } from '../paramset/time.js';
2
+ function withLabel(control, label) {
3
+ return label === undefined ? control : { ...control, label };
4
+ }
5
+ /**
6
+ * The form of a list of controls on this device, in the WebUI's order; `undefined` when there are
7
+ * none or nothing of them applies, which is the dialogs' cue to show every parameter.
8
+ */
9
+ export function easyFormOf(controls, description) {
10
+ // a time control names the pair by its prefix: `SHORT_ON_TIME` for `SHORT_ON_TIME_BASE`, and
11
+ // `EVENT_DELAY` for `EVENT_DELAY_UNIT` - both are among the description's duration pairs
12
+ const pairs = new Map(findDurationPairs(description).map((pair) => [pair.unitParam, pair]));
13
+ const form = [];
14
+ for (const control of controls ?? []) {
15
+ if (!(control.requires ?? []).every((param) => param in description)) {
16
+ continue;
17
+ }
18
+ switch (control.kind) {
19
+ case 'time': {
20
+ const pair = pairs.get(`${control.prefix}_BASE`) ?? pairs.get(`${control.prefix}_UNIT`);
21
+ if (pair) {
22
+ form.push(withLabel({ kind: 'time', pair, selector: control.selector }, control.label));
23
+ }
24
+ break;
25
+ }
26
+ case 'param': {
27
+ if (control.param in description) {
28
+ const also = (control.also ?? []).filter((param) => param in description);
29
+ const entry = {
30
+ kind: 'param',
31
+ param: control.param,
32
+ also,
33
+ ...(control.option === undefined ? {} : { option: control.option }),
34
+ };
35
+ form.push(withLabel(entry, control.label));
36
+ }
37
+ break;
38
+ }
39
+ case 'subset': {
40
+ const entry = {
41
+ kind: 'subset',
42
+ subsets: control.subsets,
43
+ ...(control.names === undefined ? {} : { names: control.names }),
44
+ };
45
+ form.push(withLabel(entry, control.label));
46
+ break;
47
+ }
48
+ }
49
+ }
50
+ return form.length > 0 ? form : undefined;
51
+ }
52
+ /** A link profile's form on this device (task 62). */
53
+ export function easyForm(profile, description) {
54
+ return easyFormOf(profile?.controls, description);
55
+ }
56
+ /**
57
+ * Every parameter the form edits: both halves of each time pair, each combo box's parameter and
58
+ * the ones it writes along, and the members of the offered subsets. The expert view highlights
59
+ * exactly these rows.
60
+ */
61
+ export function easyFormParams(form, subsets = []) {
62
+ const params = new Set();
63
+ for (const control of form ?? []) {
64
+ if (control.kind === 'time') {
65
+ params.add(control.pair.unitParam);
66
+ params.add(control.pair.countParam);
67
+ }
68
+ else if (control.kind === 'param') {
69
+ params.add(control.param);
70
+ for (const param of control.also)
71
+ params.add(param);
72
+ }
73
+ else {
74
+ for (const subset of subsets) {
75
+ if (control.subsets.includes(subset.id)) {
76
+ for (const param of subset.params)
77
+ params.add(param);
78
+ }
79
+ }
80
+ }
81
+ }
82
+ return params;
83
+ }
84
+ //# sourceMappingURL=form.js.map
@@ -297,6 +297,22 @@ export const MESSAGES = {
297
297
  de: 'Über Homematic Manager',
298
298
  en: 'about Homematic Manager',
299
299
  },
300
+ 'Saving and reconnecting…': {
301
+ de: 'Wird gespeichert, die Verbindung wird neu aufgebaut…',
302
+ en: 'Saving and reconnecting…',
303
+ },
304
+ 'This tab could not be drawn.': {
305
+ de: 'Dieser Reiter konnte nicht gezeichnet werden.',
306
+ en: 'This tab could not be drawn.',
307
+ },
308
+ 'Try again': {
309
+ de: 'Erneut versuchen',
310
+ en: 'Try again',
311
+ },
312
+ 'The device list could not be read - press Refresh to try again': {
313
+ de: 'Die Geräteliste konnte nicht gelesen werden - mit Aktualisieren erneut versuchen',
314
+ en: 'The device list could not be read - press Refresh to try again',
315
+ },
300
316
  'Loading Homematic Manager...': {
301
317
  de: 'Lade Homematic Manager...',
302
318
  en: 'Loading Homematic Manager...',
@@ -391,6 +407,51 @@ export const MESSAGES = {
391
407
  de: 'Schreibe {paramset} von {address}',
392
408
  en: 'Writing {paramset} of {address}',
393
409
  },
410
+ // The RPC log drawer (task 22; every outgoing call and its origin since task 48).
411
+ 'RPC log': {
412
+ de: 'RPC-Protokoll',
413
+ en: 'RPC log',
414
+ },
415
+ 'No RPC calls yet': {
416
+ de: 'Noch keine RPC-Aufrufe',
417
+ en: 'No RPC calls yet',
418
+ },
419
+ 'in progress': {
420
+ de: 'läuft',
421
+ en: 'in progress',
422
+ },
423
+ Clear: {
424
+ de: 'Leeren',
425
+ en: 'Clear',
426
+ },
427
+ Close: {
428
+ de: 'Schließen',
429
+ en: 'Close',
430
+ },
431
+ 'Resize the RPC log': {
432
+ de: 'Größe des RPC-Protokolls ändern',
433
+ en: 'Resize the RPC log',
434
+ },
435
+ 'Hide background calls': {
436
+ de: 'Hintergrundaufrufe ausblenden',
437
+ en: 'Hide background calls',
438
+ },
439
+ 'Open in console': {
440
+ de: 'In der Konsole öffnen',
441
+ en: 'Open in console',
442
+ },
443
+ 'Origin: console': {
444
+ de: 'Konsole',
445
+ en: 'console',
446
+ },
447
+ 'Origin: UI': {
448
+ de: 'UI',
449
+ en: 'UI',
450
+ },
451
+ 'Origin: background': {
452
+ de: 'Hintergrund',
453
+ en: 'background',
454
+ },
394
455
  };
395
456
  /** The keys the catalogue knows, for the completeness test and for tooling. */
396
457
  export const MESSAGE_KEYS = Object.keys(MESSAGES);
@@ -16,6 +16,7 @@ export * from './devices/index.js';
16
16
  export * from './links/roles.js';
17
17
  export * from './rpc/values.js';
18
18
  export * from './rpc/methods.js';
19
+ export * from './rpc/text.js';
19
20
  export * from './paramset/description.js';
20
21
  export * from './paramset/units.js';
21
22
  export * from './paramset/time.js';
@@ -24,9 +25,11 @@ export * from './paramset/validate.js';
24
25
  export * from './paramset/diff.js';
25
26
  export * from './paramset/multiApply.js';
26
27
  export * from './easymodes/engine.js';
28
+ export * from './easymodes/form.js';
27
29
  export * from './serviceMessages/index.js';
28
30
  export * from './rssi/index.js';
29
31
  export * from './events/ringBuffer.js';
32
+ export * from './meta/index.js';
30
33
  export * from './i18n/messages.js';
31
34
  export * from './i18n/translate.js';
32
35
  export * from './i18n/lookup.js';
@@ -19,6 +19,7 @@ export * from './links/roles.js';
19
19
  // Values and the write path (task 6)
20
20
  export * from './rpc/values.js';
21
21
  export * from './rpc/methods.js';
22
+ export * from './rpc/text.js';
22
23
  export * from './paramset/description.js';
23
24
  export * from './paramset/units.js';
24
25
  export * from './paramset/time.js';
@@ -28,10 +29,13 @@ export * from './paramset/diff.js';
28
29
  export * from './paramset/multiApply.js';
29
30
  // Easy modes and the MASTER metadata layer
30
31
  export * from './easymodes/engine.js';
32
+ export * from './easymodes/form.js';
31
33
  // State the tabs show
32
34
  export * from './serviceMessages/index.js';
33
35
  export * from './rssi/index.js';
34
36
  export * from './events/ringBuffer.js';
37
+ // The openccu-lite metadata store (task 24): names, rooms and functions as data
38
+ export * from './meta/index.js';
35
39
  // Texts
36
40
  export * from './i18n/messages.js';
37
41
  export * from './i18n/translate.js';
@@ -53,11 +53,20 @@ export interface InterfaceDefinition {
53
53
  * re-`init`, which on an idle CCU addon was the only thing in the log. **HmIP-RF** does not
54
54
  * have the method either - hmipserver reports neither `rssiInfo` nor `getServiceMessages`, so
55
55
  * its service messages are read out of the `VALUES` paramset of every `:0` channel instead.
56
+ * **CUxD** has no such method either (B-26, #158): it answers `unknown.method name` and writes a
57
+ * warning into the CCU's syslog for every call.
56
58
  *
57
- * Omitted means yes. A user-defined interface is unknown territory and is therefore tried
58
- * once; the backend remembers a method-not-found or an unparseable answer for that session.
59
+ * Omitted means yes. A user-defined interface is unknown territory: the backend looks the
60
+ * method up in its `system.listMethods` where it has one, and otherwise tries it once and
61
+ * remembers a method-not-found or an unparseable answer for that session.
59
62
  */
60
63
  readonly serviceMessages?: boolean;
64
+ /**
65
+ * Has an install mode: devices can be paired to it (task 28). Omitted means yes. The CCU's
66
+ * group process behind **VirtualDevices** and **CUxD** create their devices themselves and
67
+ * have nothing to pair, so the Devices tab's "Pair device" is disabled there.
68
+ */
69
+ readonly installMode?: boolean;
61
70
  /** A fixed `init` identity string; only CUxD has one (it matches on the literal `CUxD`). */
62
71
  readonly ident?: string;
63
72
  }
@@ -110,6 +119,7 @@ export declare const INTERFACES: {
110
119
  readonly init: true;
111
120
  readonly ping: false;
112
121
  readonly serviceMessages: false;
122
+ readonly installMode: false;
113
123
  };
114
124
  readonly CUxD: {
115
125
  readonly name: "CUxD";
@@ -118,6 +128,8 @@ export declare const INTERFACES: {
118
128
  readonly init: true;
119
129
  readonly ping: true;
120
130
  readonly ident: "CUxD";
131
+ readonly serviceMessages: false;
132
+ readonly installMode: false;
121
133
  };
122
134
  };
123
135
  /** Name of a built-in interface. */
@@ -174,6 +186,9 @@ export interface ResolvedInterface {
174
186
  * | `protocol` | `xmlrpc` |
175
187
  * | `path` | `/RPC3` |
176
188
  *
189
+ * and its name has to be in `ConnectionConfig.interfaces` as well, like any interface that is to be
190
+ * connected - the settings dialog ticks a newly added one there by itself.
191
+ *
177
192
  * No code is needed for it, which is why there is none: the only thing #135 wanted that was missing
178
193
  * is a `path`, and a user-defined interface has had one since task 4.
179
194
  */
@@ -192,6 +207,12 @@ export interface UserDefinedInterface {
192
207
  export declare function isKnownInterface(name: string): name is InterfaceName;
193
208
  /** The built-in definition, or `undefined` for a name the table does not know. */
194
209
  export declare function interfaceDefinition(name: string): InterfaceDefinition | undefined;
210
+ /**
211
+ * Whether devices can be paired to an interface of this type (task 28). Only a built-in interface
212
+ * that says it has no install mode is refused; a user-defined one - Homegear, a bare rfd - and a
213
+ * type that is not known yet get the pairing dialog, and the process behind them has the last word.
214
+ */
215
+ export declare function canPairDevices(type: string): boolean;
195
216
  /**
196
217
  * The identity string passed to `init(url, ident)` and sent back with every callback, which is how
197
218
  * the callback server tells the interfaces apart. `hmm_<name>` for everything except CUxD, which
@@ -66,6 +66,8 @@ export const INTERFACES = {
66
66
  ping: false,
67
67
  // ... and it has no getServiceMessages either: it answers that one with invalid XML-RPC
68
68
  serviceMessages: false,
69
+ // groups are made by the CCU, not paired (task 28)
70
+ installMode: false,
69
71
  },
70
72
  CUxD: {
71
73
  name: 'CUxD',
@@ -75,6 +77,12 @@ export const INTERFACES = {
75
77
  ping: true,
76
78
  // CUxD matches the init identity against the literal string, `hmm_CUxD` is ignored
77
79
  ident: 'CUxD',
80
+ // no getServiceMessages: CUxD answers `getServiceMessages: unknown.method name` (-1) and logs
81
+ // `called unknown request method 'getServiceMessages'` as daemon.warn for every call - with
82
+ // the five-minute poll, a warning in the CCU's syslog every five minutes (B-26, #158)
83
+ serviceMessages: false,
84
+ // its devices are created in its own configuration, not paired (task 28)
85
+ installMode: false,
78
86
  },
79
87
  };
80
88
  /** The built-in interfaces in table order. */
@@ -93,6 +101,14 @@ export function isKnownInterface(name) {
93
101
  export function interfaceDefinition(name) {
94
102
  return isKnownInterface(name) ? INTERFACES[name] : undefined;
95
103
  }
104
+ /**
105
+ * Whether devices can be paired to an interface of this type (task 28). Only a built-in interface
106
+ * that says it has no install mode is refused; a user-defined one - Homegear, a bare rfd - and a
107
+ * type that is not known yet get the pairing dialog, and the process behind them has the last word.
108
+ */
109
+ export function canPairDevices(type) {
110
+ return interfaceDefinition(type)?.installMode !== false;
111
+ }
96
112
  /**
97
113
  * The identity string passed to `init(url, ident)` and sent back with every callback, which is how
98
114
  * the callback server tells the interfaces apart. `hmm_<name>` for everything except CUxD, which
@@ -170,7 +186,8 @@ export function resolveUserDefinedInterface(definition) {
170
186
  ping: true,
171
187
  pingTimeoutSeconds: DEFAULT_PING_TIMEOUT_SECONDS,
172
188
  dutyCycle: false,
173
- // tried once: what a hand-configured process implements is not knowable from here
189
+ // what a hand-configured process implements is not knowable from here; the backend asks its
190
+ // `system.listMethods`, or tries the method once
174
191
  serviceMessages: true,
175
192
  };
176
193
  }
@@ -0,0 +1,71 @@
1
+ /**
2
+ * Reading, validating and comparing a whole metadata document.
3
+ *
4
+ * A document arrives from three places - the box's `/snapshot`, a file this application wrote
5
+ * itself, and an import a user picked - and all three go through here. The rule of the format is
6
+ * that a document is validated **as a whole and rejected entirely** on the first error, because
7
+ * half an import is worse than none: the enums an object refers to have to exist, and that is not
8
+ * a property of any single entry.
9
+ *
10
+ * Every refusal is a {@link MetaError} with the code the specification names, so an import dialog
11
+ * can say "room/nowhere does not exist" rather than "invalid".
12
+ */
13
+ import { MetaError, type MetaDocument, type MetaEnum, type MetaNode, type MetaObject } from './types.js';
14
+ /**
15
+ * One object, checked and brought into the shape the store keeps.
16
+ *
17
+ * `enums` and `meta` always exist afterwards; `orphaned` only when it is true, which is what
18
+ * `occulited` serialises and therefore what a byte comparison of two documents needs.
19
+ */
20
+ export declare function normaliseObject(raw: unknown): MetaObject;
21
+ /** The `enums` array: strings that look like paths, without duplicates. Existence is checked later. */
22
+ export declare function normaliseEnumList(raw: unknown): readonly string[];
23
+ /**
24
+ * The `meta` block: one key per consumer namespace, any JSON below it.
25
+ *
26
+ * The store never interprets what is in there - that is the point of the namespace - so the only
27
+ * rules are the spelling of the key and the size of the whole block.
28
+ */
29
+ export declare function normaliseMeta(raw: unknown): Readonly<Record<string, unknown>>;
30
+ /** One node and its subtree, checked. Sibling ids are unique; depth is checked by the caller. */
31
+ export declare function normaliseNode(raw: unknown): MetaNode;
32
+ /** A list of siblings: every one checked, no id twice. */
33
+ export declare function normaliseNodes(raw: unknown): readonly MetaNode[];
34
+ /** One enum: a localised name with at least `en`, and its tree. */
35
+ export declare function normaliseEnum(id: string, raw: unknown): MetaEnum;
36
+ /**
37
+ * The localised name of an enum.
38
+ *
39
+ * `en` is required: it is the fallback every consumer falls back to, and an enum that has only a
40
+ * German name is unreadable in an English UI - the corpus refuses exactly that with `invalid-name`.
41
+ */
42
+ export declare function normaliseEnumName(raw: unknown): Readonly<Record<string, string>>;
43
+ /**
44
+ * A whole document, validated and normalised - the one entry point for anything untrusted.
45
+ *
46
+ * The order of the checks is the order of the specification's error codes: the format version
47
+ * first (a newer store is not something to guess at), then the enums, then the objects against the
48
+ * paths the enums define.
49
+ */
50
+ export declare function parseDocument(raw: unknown): MetaDocument;
51
+ /** Every node path of every enum - what an object's `enums` entries are checked against. */
52
+ export declare function knownPaths(enums: Readonly<Record<string, MetaEnum>>): Set<string>;
53
+ /**
54
+ * A document as JSON with its keys sorted, which is how two of them are compared.
55
+ *
56
+ * The format says key order is not significant and that a writer should sort for stable diffs, so
57
+ * sorting is both the comparison and the file this application writes. It is also the answer to
58
+ * "did this import change anything": an import whose result equals the document is not a revision.
59
+ */
60
+ export declare function documentJson(document: MetaDocument, space?: number): string;
61
+ /** Do two documents hold the same data? `revision` is not part of the answer. */
62
+ export declare function documentEquals(a: MetaDocument, b: MetaDocument): boolean;
63
+ /**
64
+ * A document out of anything, never throwing: a broken file becomes an empty store.
65
+ *
66
+ * The format says a reader that finds the document unparsable falls back to the `.bak` and reports
67
+ * that it did, never starts empty silently - so the caller gets the error and decides. This is the
68
+ * "and then what" for a caller that has already tried both files.
69
+ */
70
+ export declare function parseDocumentOrEmpty(raw: unknown, onError?: (error: MetaError) => void): MetaDocument;
71
+ //# sourceMappingURL=document.d.ts.map