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.
- package/README.md +2 -1
- package/data/easymode-time-selectors.json +285 -0
- package/data/icons/106_hm-lc-sw1-dr.webp +0 -0
- package/data/icons/108_hm-rc-dis-h-x-eu.webp +0 -0
- package/data/icons/109_hm-lc-sw1-pl-ct.webp +0 -0
- package/data/icons/110_hm-es-pmsw1-dr.webp +0 -0
- package/data/icons/112_hmip-wrc2.webp +0 -0
- package/data/icons/113_hmip-psm-ch.webp +0 -0
- package/data/icons/113_hmip-psm-it.webp +0 -0
- package/data/icons/113_hmip-psm-pe.webp +0 -0
- package/data/icons/113_hmip-psm-uk.webp +0 -0
- package/data/icons/113_hmip-psm.webp +0 -0
- package/data/icons/114_hm-lc-dim1t-fm-lf_3.webp +0 -0
- package/data/icons/116_hm-rc-4-3_brc-h3.webp +0 -0
- package/data/icons/118_hmip-swdo.webp +0 -0
- package/data/icons/119_hmip-rc8.webp +0 -0
- package/data/icons/120_hmip-etrv.webp +0 -0
- package/data/icons/121_hmip-wth.webp +0 -0
- package/data/icons/123_oligo.smart.ip.hm.webp +0 -0
- package/data/icons/125_hmip-smi.webp +0 -0
- package/data/icons/130_hmip-srh.webp +0 -0
- package/data/icons/131_hmip-wrc6.webp +0 -0
- package/data/icons/132_hmip-smo.webp +0 -0
- package/data/icons/133_hmip-asir.webp +0 -0
- package/data/icons/134_hmip-fsm.webp +0 -0
- package/data/icons/135_hmip-fsm16.webp +0 -0
- package/data/icons/136_hmip-miob.webp +0 -0
- package/data/icons/137_hmip-fal-c6.webp +0 -0
- package/data/icons/138_hmip-fal-c10.webp +0 -0
- package/data/icons/140_alpha-ip-rgb.webp +0 -0
- package/data/icons/141_alpha-ip-rgba.webp +0 -0
- package/data/icons/144_hmip-wgc.webp +0 -0
- package/data/icons/145_hmip-froll_hmip-fbl.webp +0 -0
- package/data/icons/146_hmip-sth.webp +0 -0
- package/data/icons/147_hmip-sthd.webp +0 -0
- package/data/icons/148_hmip-stho.webp +0 -0
- package/data/icons/149_hmip-sam.webp +0 -0
- package/data/icons/151_hmip-pcbs-bat.webp +0 -0
- package/data/icons/152_hmip-swdo-i.webp +0 -0
- package/data/icons/153_hmip-spi.webp +0 -0
- package/data/icons/154_hmip-spdr.webp +0 -0
- package/data/icons/155_hmip-whs2.webp +0 -0
- package/data/icons/156_hmip-mod-oc8.webp +0 -0
- package/data/icons/158_hmip-etrv-uk.webp +0 -0
- package/data/icons/159_hmip-mod-rc8.webp +0 -0
- package/data/icons/160_hmipw-drs4.webp +0 -0
- package/data/icons/161_hmipw-drs8.webp +0 -0
- package/data/icons/162_hmipw-drap.webp +0 -0
- package/data/icons/163_hmipw-drbl4.webp +0 -0
- package/data/icons/164_hmipw-dri16.webp +0 -0
- package/data/icons/165_hmipw-fio6.webp +0 -0
- package/data/icons/166_hmipw-drd3.webp +0 -0
- package/data/icons/167_hmipw-dri32.webp +0 -0
- package/data/icons/168_hmip-smi55.webp +0 -0
- package/data/icons/169_hmip-swo-pr.webp +0 -0
- package/data/icons/170_hmip-swo-pl.webp +0 -0
- package/data/icons/171_hmip-swo-b.webp +0 -0
- package/data/icons/172_hmip-swd.webp +0 -0
- package/data/icons/173_hmip-bsl.webp +0 -0
- package/data/icons/174_hmip-slo.webp +0 -0
- package/data/icons/175_hmip-group-heating.webp +0 -0
- package/data/icons/177_hmip-dbb.webp +0 -0
- package/data/icons/178_hmip-etrv-b1.webp +0 -0
- package/data/icons/179_hmip-swdm-b2.webp +0 -0
- package/data/icons/180_hmip-etrv-b.webp +0 -0
- package/data/icons/181_hmip-swdm.webp +0 -0
- package/data/icons/182_hmip-fci1.webp +0 -0
- package/data/icons/183_hmip-mod-tm.webp +0 -0
- package/data/icons/184_hmip-pcbs2.webp +0 -0
- package/data/icons/185_hmip-FCI6.webp +0 -0
- package/data/icons/186_hmip-mp3p.webp +0 -0
- package/data/icons/187_hmip-rcb1.webp +0 -0
- package/data/icons/188_hmip-etrv-c.webp +0 -0
- package/data/icons/190_hmip-sci.webp +0 -0
- package/data/icons/191_hmip-mod-ho.webp +0 -0
- package/data/icons/192_hmip-asir-o.webp +0 -0
- package/data/icons/193_hmip-wt.webp +0 -0
- package/data/icons/194_hmip-wrcd.webp +0 -0
- package/data/icons/195_hmipw-smi55.webp +0 -0
- package/data/icons/196_hmip-ASIR-2.webp +0 -0
- package/data/icons/197_hmip-swdo-pl.webp +0 -0
- package/data/icons/198_hmip-falmot-c12.webp +0 -0
- package/data/icons/199_hmip-mio16-pcb.webp +0 -0
- package/data/icons/200_hmip-wth-b.webp +0 -0
- package/data/icons/201_hmip-stv.webp +0 -0
- package/data/icons/202_hmip-wrcr.webp +0 -0
- package/data/icons/203_hmip-fsi16.webp +0 -0
- package/data/icons/204_hmip-drdi3.webp +0 -0
- package/data/icons/205_hmip-drsi4.webp +0 -0
- package/data/icons/206_hmip-drbli4.webp +0 -0
- package/data/icons/207_hmip-srdo.webp +0 -0
- package/data/icons/208_hmip-dsd-pcb.webp +0 -0
- package/data/icons/209_hmip-etrv-b-uk.webp +0 -0
- package/data/icons/210_hmip-ste2-pcb.webp +0 -0
- package/data/icons/211_hmip-drg-dali.webp +0 -0
- package/data/icons/211_hmip-drsi1.webp +0 -0
- package/data/icons/212_hmip-sfd.webp +0 -0
- package/data/icons/212_hmipw-scthd.webp +0 -0
- package/data/icons/213_hmip-smo230.webp +0 -0
- package/data/icons/213_hmip-wua.webp +0 -0
- package/data/icons/214_hmip-dld.webp +0 -0
- package/data/icons/215_hmip-psm-pe-2.webp +0 -0
- package/data/icons/215_hmip-scth230.webp +0 -0
- package/data/icons/216_hmip-etrv-e.webp +0 -0
- package/data/icons/216_hmip-psm-ch-2.webp +0 -0
- package/data/icons/217_hmip-usbsm.webp +0 -0
- package/data/icons/218_hmip-dls.webp +0 -0
- package/data/icons/219_hmip-fwi.webp +0 -0
- package/data/icons/220_hmip-wsc.webp +0 -0
- package/data/icons/221_hmip-sti.webp +0 -0
- package/data/icons/221_hmip-wkp.webp +0 -0
- package/data/icons/222_hmipw-wgd.webp +0 -0
- package/data/icons/223_hmip-mod-wd-vk.webp +0 -0
- package/data/icons/224_hmip-etrv-cl.webp +0 -0
- package/data/icons/225_hmip-rgbw.webp +0 -0
- package/data/icons/226_hmip-esi.webp +0 -0
- package/data/icons/227_hmip-lsc.webp +0 -0
- package/data/icons/228_elv-sh-sw1-bat.webp +0 -0
- package/data/icons/229_elv-sh-bm-s.webp +0 -0
- package/data/icons/230_hmip-etrv-f.webp +0 -0
- package/data/icons/231_elv-sh-cth.webp +0 -0
- package/data/icons/232_elv-sh-taco.webp +0 -0
- package/data/icons/233_hmip-flc.webp +0 -0
- package/data/icons/234_hmip-etrv-3.webp +0 -0
- package/data/icons/235_hmip-psmco.webp +0 -0
- package/data/icons/236_elv-sh-sb8.webp +0 -0
- package/data/icons/237_elv-sh-ctv.webp +0 -0
- package/data/icons/238_elv-sh-cap.webp +0 -0
- package/data/icons/239_hmip-wgs-f.webp +0 -0
- package/data/icons/240_hmip-wgtc-f.webp +0 -0
- package/data/icons/241_hmip-wgt-f.webp +0 -0
- package/data/icons/242_elv-sh-smsi.webp +0 -0
- package/data/icons/243_elv-sh-crc.webp +0 -0
- package/data/icons/244_elv-sh-krco.webp +0 -0
- package/data/icons/245_hmip-falmot-c8.webp +0 -0
- package/data/icons/246_elv-sh-wsm.webp +0 -0
- package/data/icons/247_hmip-hap-2.webp +0 -0
- package/data/icons/248_hmip-dlp.webp +0 -0
- package/data/icons/249_elv-sh-psmci.webp +0 -0
- package/data/icons/250_elv-sh-sps25.webp +0 -0
- package/data/icons/252_elv-sh-pti2.webp +0 -0
- package/data/icons/253_hmip-udi-smi55.webp +0 -0
- package/data/icons/254_hmip-udi-pb2.webp +0 -0
- package/data/icons/256_ELV-SH-SMS2.webp +0 -0
- package/data/icons/257_ELV-SH-FSI.webp +0 -0
- package/data/icons/258_hmip-m-td15.webp +0 -0
- package/data/icons/259_elv-sh-dusi.webp +0 -0
- package/data/icons/260_hmip-wss.webp +0 -0
- package/data/icons/54a_lc-ddc1-pcb.webp +0 -0
- package/data/icons/72_hm-rc-brc-h.webp +0 -0
- package/data/icons/73_hm-atent.webp +0 -0
- package/data/icons/79_hm-lc-dim1pwm-cv.webp +0 -0
- package/data/icons/84_hm-rc-4-3.webp +0 -0
- package/data/icons/85_hm-rc-sec4-3.webp +0 -0
- package/data/icons/86_hm-rc-key4-3.webp +0 -0
- package/data/icons/CCU3-1-50.webp +0 -0
- package/data/icons/CCU3.webp +0 -0
- package/data/icons/hm-coupling-dim.webp +0 -0
- package/data/icons/hm-coupling-group.webp +0 -0
- package/data/icons/hm-coupling-onoff.webp +0 -0
- package/data/icons/hm-coupling-rgb-dim.webp +0 -0
- package/data/icons/hm-coupling-rgb.webp +0 -0
- package/data/icons/hm-coupling-rgbw-dim.webp +0 -0
- package/data/icons/hm-coupling-rgbw.webp +0 -0
- package/data/icons/hm-coupling-white-dim.webp +0 -0
- package/data/icons/hm-coupling-white.webp +0 -0
- package/data/icons/hm-hue_gateway.webp +0 -0
- package/data/icons/hm-lightify_gateway.webp +0 -0
- package/data/icons/hm_resc-win-pcb-sc.webp +0 -0
- package/data/icons/unknown_device.webp +0 -0
- package/data/manifest.json +7 -1
- package/data/master-metadata.json +1997 -33
- package/data/profiles/ACCESS_RECEIVER.json +26 -13
- package/data/profiles/ACOUSTIC_SIGNAL_VIRTUAL_RECEIVER.json +3270 -76
- package/data/profiles/ACTOR_SECURITY.json +90 -10
- package/data/profiles/ACTOR_WINDOW.json +580 -43
- package/data/profiles/ALARMACTUATOR.json +564 -37
- package/data/profiles/ALARM_COND_SWITCH_RECEIVER.json +36 -4
- package/data/profiles/ALARM_SWITCH_VIRTUAL_RECEIVER.json +735 -33
- package/data/profiles/ARMING.json +115 -5
- package/data/profiles/BLIND.json +1038 -49
- package/data/profiles/BLIND_VIRTUAL_RECEIVER.json +4624 -124
- package/data/profiles/CLIMATECONTROL_FLOOR_PUMP_TRANSCEIVER.json +27 -1
- package/data/profiles/DIMMER.json +2233 -71
- package/data/profiles/DIMMER_VIRTUAL_RECEIVER.json +5773 -102
- package/data/profiles/DIMMER_woLongKeyPress.json +117 -4
- package/data/profiles/DOOR_RECEIVER.json +138 -10
- package/data/profiles/DUAL_WHITE_BRIGHTNESS.json +305 -11
- package/data/profiles/DUAL_WHITE_COLOR.json +730 -23
- package/data/profiles/HEATING_KEY_RECEIVER.json +127 -10
- package/data/profiles/HMW_BLIND.json +555 -20
- package/data/profiles/HMW_DIMMER.json +1337 -47
- package/data/profiles/HMW_INPUT_OUTPUT.json +375 -20
- package/data/profiles/HMW_SWITCH.json +375 -20
- package/data/profiles/JALOUSIE.json +1320 -52
- package/data/profiles/KEYMATIC.json +120 -12
- package/data/profiles/REMOTECONTROL_RECEIVER.json +10 -2
- package/data/profiles/RGBW_AUTOMATIC.json +46 -6
- package/data/profiles/RGBW_COLOR.json +14 -4
- package/data/profiles/SERVO_VIRTUAL_RECEIVER.json +117 -3
- package/data/profiles/SHUTTER_VIRTUAL_RECEIVER.json +4263 -128
- package/data/profiles/SIGNAL_CHIME.json +195 -14
- package/data/profiles/SIGNAL_CHIMEM.json +195 -14
- package/data/profiles/SIGNAL_LED.json +195 -14
- package/data/profiles/SIGNAL_LEDM.json +195 -14
- package/data/profiles/SIMPLE_SWITCH_RECEIVER.json +113 -9
- package/data/profiles/STATUS_INDICATOR.json +1073 -45
- package/data/profiles/SWITCH.json +1412 -60
- package/data/profiles/SWITCH_PANIC.json +315 -13
- package/data/profiles/SWITCH_SENSOR.json +243 -11
- package/data/profiles/SWITCH_VIRTUAL_RECEIVER.json +3963 -131
- package/data/profiles/UNIVERSAL_ACTOR.json +4319 -90
- package/data/profiles/UNIVERSAL_LIGHT_RECEIVER_LSC.json +6094 -196
- package/data/profiles/UNIVERSAL_LIGHT_RECEIVER_PWM.json +4920 -101
- package/data/profiles/UNIVERSAL_LIGHT_RECEIVER_RGB(W).json +2353 -80
- package/data/profiles/UNIVERSAL_LIGHT_RECEIVER_RGBW_DALI.json +6116 -176
- package/data/profiles/UNIVERSAL_LIGHT_RECEIVER_TW.json +3844 -104
- package/data/profiles/VIRTUAL_DIMMER.json +305 -11
- package/data/profiles/VIRTUAL_DUAL_WHITE_COLOR.json +730 -23
- package/data/profiles/WATER_SWITCH_VIRTUAL_RECEIVER.json +3903 -128
- package/data/profiles/WINDOW_DRIVE_RECEIVER.json +220 -8
- package/data/profiles/WINMATIC.json +505 -23
- package/dist/cli.js +24 -0
- package/dist/occulite.d.ts +86 -0
- package/dist/occulite.js +140 -0
- package/dist/options.d.ts +37 -6
- package/dist/options.js +49 -6
- package/dist/server.d.ts +47 -4
- package/dist/server.js +237 -27
- package/dist/sessions.d.ts +9 -1
- package/dist/sessions.js +8 -2
- package/dist/testSupport.js +9 -2
- package/node_modules/@homematic-manager/backend/dist/api/backend.d.ts +33 -0
- package/node_modules/@homematic-manager/backend/dist/api/backend.js +558 -46
- package/node_modules/@homematic-manager/backend/dist/cache/names.d.ts +9 -0
- package/node_modules/@homematic-manager/backend/dist/cache/names.js +21 -0
- package/node_modules/@homematic-manager/backend/dist/config/defaults.js +10 -1
- package/node_modules/@homematic-manager/backend/dist/config/store.d.ts +28 -1
- package/node_modules/@homematic-manager/backend/dist/config/store.js +59 -3
- package/node_modules/@homematic-manager/backend/dist/devices/installMode.js +9 -0
- package/node_modules/@homematic-manager/backend/dist/errors.d.ts +18 -0
- package/node_modules/@homematic-manager/backend/dist/errors.js +51 -2
- package/node_modules/@homematic-manager/backend/dist/images/deviceImages.d.ts +6 -0
- package/node_modules/@homematic-manager/backend/dist/images/deviceImages.js +38 -2
- package/node_modules/@homematic-manager/backend/dist/index.d.ts +3 -1
- package/node_modules/@homematic-manager/backend/dist/index.js +4 -1
- package/node_modules/@homematic-manager/backend/dist/interfaces/manager.d.ts +70 -8
- package/node_modules/@homematic-manager/backend/dist/interfaces/manager.js +333 -44
- package/node_modules/@homematic-manager/backend/dist/meta/client.d.ts +120 -0
- package/node_modules/@homematic-manager/backend/dist/meta/client.js +307 -0
- package/node_modules/@homematic-manager/backend/dist/meta/credentials.d.ts +38 -0
- package/node_modules/@homematic-manager/backend/dist/meta/credentials.js +53 -0
- package/node_modules/@homematic-manager/backend/dist/meta/index.d.ts +12 -0
- package/node_modules/@homematic-manager/backend/dist/meta/index.js +12 -0
- package/node_modules/@homematic-manager/backend/dist/meta/localProvider.d.ts +47 -0
- package/node_modules/@homematic-manager/backend/dist/meta/localProvider.js +119 -0
- package/node_modules/@homematic-manager/backend/dist/meta/occuliteProvider.d.ts +79 -0
- package/node_modules/@homematic-manager/backend/dist/meta/occuliteProvider.js +305 -0
- package/node_modules/@homematic-manager/backend/dist/meta/provider.d.ts +68 -0
- package/node_modules/@homematic-manager/backend/dist/meta/provider.js +19 -0
- package/node_modules/@homematic-manager/backend/dist/meta/regaProvider.d.ts +84 -0
- package/node_modules/@homematic-manager/backend/dist/meta/regaProvider.js +403 -0
- package/node_modules/@homematic-manager/backend/dist/meta/service.d.ts +137 -0
- package/node_modules/@homematic-manager/backend/dist/meta/service.js +412 -0
- package/node_modules/@homematic-manager/backend/dist/rega/client.d.ts +11 -0
- package/node_modules/@homematic-manager/backend/dist/rega/client.js +13 -0
- package/node_modules/@homematic-manager/backend/dist/rega/scripts.d.ts +51 -0
- package/node_modules/@homematic-manager/backend/dist/rega/scripts.js +171 -0
- package/node_modules/@homematic-manager/backend/dist/rpc/client.d.ts +18 -5
- package/node_modules/@homematic-manager/backend/dist/rpc/client.js +11 -5
- package/node_modules/@homematic-manager/backend/dist/rpc/log.d.ts +86 -0
- package/node_modules/@homematic-manager/backend/dist/rpc/log.js +241 -0
- package/node_modules/@homematic-manager/backend/dist/rpc/origin.d.ts +30 -0
- package/node_modules/@homematic-manager/backend/dist/rpc/origin.js +35 -0
- package/node_modules/@homematic-manager/backend/dist/rpc/server.d.ts +12 -0
- package/node_modules/@homematic-manager/backend/dist/rpc/server.js +37 -5
- package/node_modules/@homematic-manager/backend/dist/util/net.d.ts +86 -1
- package/node_modules/@homematic-manager/backend/dist/util/net.js +223 -9
- package/node_modules/@homematic-manager/backend/package.json +1 -1
- package/node_modules/@homematic-manager/core/dist/api/types.d.ts +397 -10
- package/node_modules/@homematic-manager/core/dist/api/types.js +23 -2
- package/node_modules/@homematic-manager/core/dist/data/memory.d.ts +3 -1
- package/node_modules/@homematic-manager/core/dist/data/memory.js +3 -0
- package/node_modules/@homematic-manager/core/dist/data/types.d.ts +60 -0
- package/node_modules/@homematic-manager/core/dist/data/types.js +2 -0
- package/node_modules/@homematic-manager/core/dist/devices/index.d.ts +19 -0
- package/node_modules/@homematic-manager/core/dist/devices/index.js +53 -0
- package/node_modules/@homematic-manager/core/dist/easymodes/engine.d.ts +3 -1
- package/node_modules/@homematic-manager/core/dist/easymodes/engine.js +1 -0
- package/node_modules/@homematic-manager/core/dist/easymodes/form.d.ts +43 -0
- package/node_modules/@homematic-manager/core/dist/easymodes/form.js +84 -0
- package/node_modules/@homematic-manager/core/dist/i18n/messages.js +61 -0
- package/node_modules/@homematic-manager/core/dist/index.d.ts +3 -0
- package/node_modules/@homematic-manager/core/dist/index.js +4 -0
- package/node_modules/@homematic-manager/core/dist/interfaces/table.d.ts +23 -2
- package/node_modules/@homematic-manager/core/dist/interfaces/table.js +18 -1
- package/node_modules/@homematic-manager/core/dist/meta/document.d.ts +71 -0
- package/node_modules/@homematic-manager/core/dist/meta/document.js +260 -0
- package/node_modules/@homematic-manager/core/dist/meta/follow.d.ts +27 -0
- package/node_modules/@homematic-manager/core/dist/meta/follow.js +180 -0
- package/node_modules/@homematic-manager/core/dist/meta/index.d.ts +16 -0
- package/node_modules/@homematic-manager/core/dist/meta/index.js +16 -0
- package/node_modules/@homematic-manager/core/dist/meta/paths.d.ts +96 -0
- package/node_modules/@homematic-manager/core/dist/meta/paths.js +182 -0
- package/node_modules/@homematic-manager/core/dist/meta/slug.d.ts +22 -0
- package/node_modules/@homematic-manager/core/dist/meta/slug.js +59 -0
- package/node_modules/@homematic-manager/core/dist/meta/store.d.ts +147 -0
- package/node_modules/@homematic-manager/core/dist/meta/store.js +537 -0
- package/node_modules/@homematic-manager/core/dist/meta/tree.d.ts +19 -0
- package/node_modules/@homematic-manager/core/dist/meta/tree.js +53 -0
- package/node_modules/@homematic-manager/core/dist/meta/types.d.ts +143 -0
- package/node_modules/@homematic-manager/core/dist/meta/types.js +63 -0
- package/node_modules/@homematic-manager/core/dist/meta/view.d.ts +50 -0
- package/node_modules/@homematic-manager/core/dist/meta/view.js +103 -0
- package/node_modules/@homematic-manager/core/dist/rpc/methods.d.ts +10 -0
- package/node_modules/@homematic-manager/core/dist/rpc/methods.js +51 -1
- package/node_modules/@homematic-manager/core/dist/rpc/text.d.ts +22 -0
- package/node_modules/@homematic-manager/core/dist/rpc/text.js +46 -0
- package/node_modules/@homematic-manager/core/dist/rssi/index.d.ts +125 -13
- package/node_modules/@homematic-manager/core/dist/rssi/index.js +146 -29
- package/node_modules/@homematic-manager/core/dist/serviceMessages/index.d.ts +28 -2
- package/node_modules/@homematic-manager/core/dist/serviceMessages/index.js +44 -6
- package/node_modules/@homematic-manager/core/package.json +1 -1
- package/package.json +3 -3
- package/ui/assets/index-D-NsbBVS.css +1 -0
- package/ui/assets/index-DNUNMBbb.js +16 -0
- package/ui/favicon.ico +0 -0
- package/ui/index.html +3 -2
- package/node_modules/@homematic-manager/backend/dist/write/log.d.ts +0 -51
- package/node_modules/@homematic-manager/backend/dist/write/log.js +0 -151
- package/ui/assets/index-lB-HxsKR.js +0 -13
- 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
|
|
58
|
-
*
|
|
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
|
-
//
|
|
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
|