@smarthome.exchange/integrations 0.2.0 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/changelog.md +122 -0
- package/dist_ts/00_commitinfo_data.js +1 -1
- package/dist_ts/cli/classes.cliruntime.d.ts +1 -1
- package/dist_ts/cli/commands.discover.js +1 -1
- package/dist_ts/cli/commands.setup.d.ts +1 -1
- package/dist_ts/core/classes.configrecord.d.ts +15 -0
- package/dist_ts/core/classes.configrecord.js +93 -0
- package/dist_ts/core/classes.configstore.d.ts +38 -10
- package/dist_ts/core/classes.configstore.js +298 -32
- package/dist_ts/core/classes.discoveryengine.js +12 -2
- package/dist_ts/core/classes.runtimemanager.js +1 -1
- package/dist_ts/core/classes.simplelocalintegration.js +1 -1
- package/dist_ts/core/errors.d.ts +2 -2
- package/dist_ts/core/errors.js +1 -1
- package/dist_ts/core/types.d.ts +13 -4
- package/dist_ts/index.d.ts +4 -1
- package/dist_ts/index.js +7 -1
- package/dist_ts/integrations/adguard/adguard.classes.client.js +1 -1
- package/dist_ts/integrations/adguard/adguard.classes.integration.d.ts +1 -1
- package/dist_ts/integrations/adguard/adguard.classes.integration.js +1 -1
- package/dist_ts/integrations/adguard/adguard.discovery.d.ts +1 -1
- package/dist_ts/integrations/adguard/adguard.mapper.js +1 -1
- package/dist_ts/integrations/agent_dvr/agent_dvr.classes.client.js +1 -1
- package/dist_ts/integrations/agent_dvr/agent_dvr.classes.integration.d.ts +1 -1
- package/dist_ts/integrations/agent_dvr/agent_dvr.classes.integration.js +1 -1
- package/dist_ts/integrations/agent_dvr/agent_dvr.discovery.d.ts +3 -3
- package/dist_ts/integrations/agent_dvr/agent_dvr.mapper.js +1 -1
- package/dist_ts/integrations/agent_dvr/agent_dvr.types.d.ts +1 -1
- package/dist_ts/integrations/airgradient/airgradient.classes.client.js +1 -1
- package/dist_ts/integrations/airgradient/airgradient.classes.integration.d.ts +1 -1
- package/dist_ts/integrations/airgradient/airgradient.classes.integration.js +1 -1
- package/dist_ts/integrations/airgradient/airgradient.discovery.d.ts +2 -2
- package/dist_ts/integrations/airos/airos.classes.client.js +1 -1
- package/dist_ts/integrations/airos/airos.classes.integration.d.ts +1 -1
- package/dist_ts/integrations/airos/airos.classes.integration.js +1 -1
- package/dist_ts/integrations/airos/airos.discovery.d.ts +4 -4
- package/dist_ts/integrations/airos/airos.discovery.js +1 -1
- package/dist_ts/integrations/airos/airos.mapper.js +1 -1
- package/dist_ts/integrations/amcrest/amcrest.classes.client.js +1 -1
- package/dist_ts/integrations/amcrest/amcrest.classes.integration.d.ts +1 -1
- package/dist_ts/integrations/amcrest/amcrest.classes.integration.js +1 -1
- package/dist_ts/integrations/amcrest/amcrest.discovery.d.ts +3 -3
- package/dist_ts/integrations/amcrest/amcrest.types.d.ts +5 -5
- package/dist_ts/integrations/android_ip_webcam/android_ip_webcam.classes.client.js +1 -1
- package/dist_ts/integrations/android_ip_webcam/android_ip_webcam.classes.integration.d.ts +1 -1
- package/dist_ts/integrations/android_ip_webcam/android_ip_webcam.classes.integration.js +1 -1
- package/dist_ts/integrations/android_ip_webcam/android_ip_webcam.discovery.d.ts +1 -1
- package/dist_ts/integrations/androidtv/androidtv.classes.client.js +1 -1
- package/dist_ts/integrations/androidtv/androidtv.classes.integration.d.ts +1 -1
- package/dist_ts/integrations/androidtv/androidtv.classes.integration.js +1 -1
- package/dist_ts/integrations/androidtv/androidtv.discovery.d.ts +3 -3
- package/dist_ts/integrations/androidtv_remote/androidtv_remote.classes.client.js +1 -1
- package/dist_ts/integrations/androidtv_remote/androidtv_remote.classes.integration.d.ts +1 -1
- package/dist_ts/integrations/androidtv_remote/androidtv_remote.classes.integration.js +1 -1
- package/dist_ts/integrations/androidtv_remote/androidtv_remote.discovery.d.ts +2 -2
- package/dist_ts/integrations/apcupsd/apcupsd.classes.client.js +1 -1
- package/dist_ts/integrations/apcupsd/apcupsd.classes.integration.d.ts +1 -1
- package/dist_ts/integrations/apcupsd/apcupsd.classes.integration.js +1 -1
- package/dist_ts/integrations/apcupsd/apcupsd.discovery.d.ts +1 -1
- package/dist_ts/integrations/apcupsd/apcupsd.mapper.js +1 -1
- package/dist_ts/integrations/arcam_fmj/arcam_fmj.classes.client.js +1 -1
- package/dist_ts/integrations/arcam_fmj/arcam_fmj.classes.integration.d.ts +1 -1
- package/dist_ts/integrations/arcam_fmj/arcam_fmj.classes.integration.js +1 -1
- package/dist_ts/integrations/arcam_fmj/arcam_fmj.discovery.d.ts +2 -2
- package/dist_ts/integrations/asuswrt/asuswrt.classes.client.js +1 -1
- package/dist_ts/integrations/asuswrt/asuswrt.classes.integration.d.ts +1 -1
- package/dist_ts/integrations/asuswrt/asuswrt.classes.integration.js +1 -1
- package/dist_ts/integrations/asuswrt/asuswrt.discovery.d.ts +1 -1
- package/dist_ts/integrations/asuswrt/asuswrt.mapper.js +1 -1
- package/dist_ts/integrations/axis/axis.classes.client.js +1 -1
- package/dist_ts/integrations/axis/axis.classes.integration.d.ts +1 -1
- package/dist_ts/integrations/axis/axis.classes.integration.js +1 -1
- package/dist_ts/integrations/axis/axis.discovery.d.ts +3 -3
- package/dist_ts/integrations/blebox/blebox.classes.client.js +1 -1
- package/dist_ts/integrations/blebox/blebox.classes.integration.d.ts +1 -1
- package/dist_ts/integrations/blebox/blebox.classes.integration.js +1 -1
- package/dist_ts/integrations/blebox/blebox.discovery.d.ts +2 -2
- package/dist_ts/integrations/bluesound/bluesound.classes.client.d.ts +9 -4
- package/dist_ts/integrations/bluesound/bluesound.classes.client.js +1 -1
- package/dist_ts/integrations/bluesound/bluesound.classes.integration.d.ts +1 -1
- package/dist_ts/integrations/bluesound/bluesound.classes.integration.js +1 -1
- package/dist_ts/integrations/bluesound/bluesound.discovery.d.ts +2 -2
- package/dist_ts/integrations/bluetooth_le_tracker/bluetooth_le_tracker.classes.client.js +1 -1
- package/dist_ts/integrations/bluetooth_le_tracker/bluetooth_le_tracker.classes.integration.d.ts +1 -1
- package/dist_ts/integrations/bluetooth_le_tracker/bluetooth_le_tracker.classes.integration.js +1 -1
- package/dist_ts/integrations/bluetooth_le_tracker/bluetooth_le_tracker.discovery.d.ts +2 -2
- package/dist_ts/integrations/bluetooth_le_tracker/bluetooth_le_tracker.mapper.js +1 -1
- package/dist_ts/integrations/bond/bond.classes.client.js +1 -1
- package/dist_ts/integrations/bond/bond.classes.integration.d.ts +1 -1
- package/dist_ts/integrations/bond/bond.classes.integration.js +1 -1
- package/dist_ts/integrations/bond/bond.discovery.d.ts +3 -3
- package/dist_ts/integrations/bond/bond.mapper.js +1 -1
- package/dist_ts/integrations/bond/bond.types.d.ts +71 -71
- package/dist_ts/integrations/bosch_shc/bosch_shc.classes.client.js +1 -1
- package/dist_ts/integrations/bosch_shc/bosch_shc.classes.integration.d.ts +1 -1
- package/dist_ts/integrations/bosch_shc/bosch_shc.classes.integration.js +1 -1
- package/dist_ts/integrations/bosch_shc/bosch_shc.discovery.d.ts +2 -2
- package/dist_ts/integrations/bosch_shc/bosch_shc.mapper.js +1 -1
- package/dist_ts/integrations/braviatv/braviatv.classes.client.js +1 -1
- package/dist_ts/integrations/braviatv/braviatv.classes.integration.d.ts +1 -1
- package/dist_ts/integrations/braviatv/braviatv.classes.integration.js +1 -1
- package/dist_ts/integrations/braviatv/braviatv.discovery.d.ts +3 -3
- package/dist_ts/integrations/broadlink/broadlink.classes.client.js +1 -1
- package/dist_ts/integrations/broadlink/broadlink.classes.integration.d.ts +1 -1
- package/dist_ts/integrations/broadlink/broadlink.classes.integration.js +1 -1
- package/dist_ts/integrations/broadlink/broadlink.discovery.d.ts +3 -3
- package/dist_ts/integrations/broadlink/broadlink.mapper.js +1 -1
- package/dist_ts/integrations/broadlink/broadlink.packet.d.ts +2 -2
- package/dist_ts/integrations/broadlink/broadlink.packet.js +1 -1
- package/dist_ts/integrations/brother/brother.classes.client.js +1 -1
- package/dist_ts/integrations/brother/brother.classes.integration.d.ts +1 -1
- package/dist_ts/integrations/brother/brother.classes.integration.js +1 -1
- package/dist_ts/integrations/brother/brother.constants.d.ts +12 -12
- package/dist_ts/integrations/brother/brother.discovery.d.ts +2 -2
- package/dist_ts/integrations/brother/brother.mapper.js +1 -1
- package/dist_ts/integrations/cast/cast.classes.client.js +1 -1
- package/dist_ts/integrations/cast/cast.classes.integration.d.ts +1 -1
- package/dist_ts/integrations/cast/cast.classes.integration.js +1 -1
- package/dist_ts/integrations/cast/cast.discovery.d.ts +2 -2
- package/dist_ts/integrations/channels/channels.classes.client.js +1 -1
- package/dist_ts/integrations/channels/channels.classes.integration.d.ts +1 -1
- package/dist_ts/integrations/channels/channels.classes.integration.js +1 -1
- package/dist_ts/integrations/channels/channels.discovery.d.ts +2 -2
- package/dist_ts/integrations/cisco_ios/cisco_ios.classes.client.js +1 -1
- package/dist_ts/integrations/cisco_ios/cisco_ios.classes.integration.d.ts +1 -1
- package/dist_ts/integrations/cisco_ios/cisco_ios.classes.integration.js +1 -1
- package/dist_ts/integrations/cisco_ios/cisco_ios.discovery.d.ts +2 -2
- package/dist_ts/integrations/cisco_ios/cisco_ios.mapper.js +1 -1
- package/dist_ts/integrations/daikin/daikin.classes.client.js +1 -1
- package/dist_ts/integrations/daikin/daikin.classes.integration.d.ts +1 -1
- package/dist_ts/integrations/daikin/daikin.classes.integration.js +1 -1
- package/dist_ts/integrations/daikin/daikin.discovery.d.ts +5 -5
- package/dist_ts/integrations/daikin/daikin.mapper.js +1 -1
- package/dist_ts/integrations/ddwrt/ddwrt.classes.client.js +1 -1
- package/dist_ts/integrations/ddwrt/ddwrt.classes.integration.d.ts +1 -1
- package/dist_ts/integrations/ddwrt/ddwrt.classes.integration.js +1 -1
- package/dist_ts/integrations/ddwrt/ddwrt.discovery.d.ts +3 -3
- package/dist_ts/integrations/ddwrt/ddwrt.mapper.js +1 -1
- package/dist_ts/integrations/deconz/deconz.classes.client.d.ts +31 -22
- package/dist_ts/integrations/deconz/deconz.classes.client.js +302 -153
- package/dist_ts/integrations/deconz/deconz.classes.configflow.js +43 -26
- package/dist_ts/integrations/deconz/deconz.classes.integration.d.ts +3 -1
- package/dist_ts/integrations/deconz/deconz.classes.integration.js +133 -20
- package/dist_ts/integrations/deconz/deconz.discovery.d.ts +4 -4
- package/dist_ts/integrations/deconz/deconz.mapper.d.ts +2 -1
- package/dist_ts/integrations/deconz/deconz.mapper.js +23 -18
- package/dist_ts/integrations/deconz/deconz.types.d.ts +34 -3
- package/dist_ts/integrations/deconz/deconz.validation.d.ts +14 -0
- package/dist_ts/integrations/deconz/deconz.validation.js +269 -0
- package/dist_ts/integrations/deluge/deluge.classes.client.js +1 -1
- package/dist_ts/integrations/deluge/deluge.classes.integration.d.ts +1 -1
- package/dist_ts/integrations/deluge/deluge.classes.integration.js +1 -1
- package/dist_ts/integrations/deluge/deluge.discovery.d.ts +2 -2
- package/dist_ts/integrations/denon/denon.classes.client.js +1 -1
- package/dist_ts/integrations/denon/denon.classes.integration.d.ts +1 -1
- package/dist_ts/integrations/denon/denon.classes.integration.js +1 -1
- package/dist_ts/integrations/denon/denon.discovery.d.ts +1 -1
- package/dist_ts/integrations/denonavr/denonavr.classes.client.js +1 -1
- package/dist_ts/integrations/denonavr/denonavr.classes.integration.d.ts +1 -1
- package/dist_ts/integrations/denonavr/denonavr.classes.integration.js +1 -1
- package/dist_ts/integrations/denonavr/denonavr.discovery.d.ts +3 -3
- package/dist_ts/integrations/devolo_home_network/devolo_home_network.classes.client.js +1 -1
- package/dist_ts/integrations/devolo_home_network/devolo_home_network.classes.integration.d.ts +1 -1
- package/dist_ts/integrations/devolo_home_network/devolo_home_network.classes.integration.js +1 -1
- package/dist_ts/integrations/devolo_home_network/devolo_home_network.discovery.d.ts +3 -3
- package/dist_ts/integrations/devolo_home_network/devolo_home_network.mapper.js +1 -1
- package/dist_ts/integrations/directv/directv.classes.client.js +1 -1
- package/dist_ts/integrations/directv/directv.classes.integration.d.ts +1 -1
- package/dist_ts/integrations/directv/directv.classes.integration.js +1 -1
- package/dist_ts/integrations/directv/directv.discovery.d.ts +2 -2
- package/dist_ts/integrations/directv/directv.types.d.ts +1 -1
- package/dist_ts/integrations/dlink/dlink.classes.client.d.ts +6 -3
- package/dist_ts/integrations/dlink/dlink.classes.client.js +1 -1
- package/dist_ts/integrations/dlink/dlink.classes.integration.d.ts +1 -1
- package/dist_ts/integrations/dlink/dlink.classes.integration.js +1 -1
- package/dist_ts/integrations/dlink/dlink.discovery.d.ts +2 -2
- package/dist_ts/integrations/dlink/dlink.mapper.js +1 -1
- package/dist_ts/integrations/dlna_dmr/dlna_dmr.classes.client.js +1 -1
- package/dist_ts/integrations/dlna_dmr/dlna_dmr.classes.integration.d.ts +1 -1
- package/dist_ts/integrations/dlna_dmr/dlna_dmr.classes.integration.js +1 -1
- package/dist_ts/integrations/dlna_dmr/dlna_dmr.discovery.d.ts +2 -2
- package/dist_ts/integrations/dlna_dms/dlna_dms.classes.client.js +1 -1
- package/dist_ts/integrations/dlna_dms/dlna_dms.classes.integration.d.ts +1 -1
- package/dist_ts/integrations/dlna_dms/dlna_dms.classes.integration.js +1 -1
- package/dist_ts/integrations/dlna_dms/dlna_dms.discovery.d.ts +2 -2
- package/dist_ts/integrations/doorbird/doorbird.classes.client.js +1 -1
- package/dist_ts/integrations/doorbird/doorbird.classes.integration.d.ts +1 -1
- package/dist_ts/integrations/doorbird/doorbird.classes.integration.js +1 -1
- package/dist_ts/integrations/doorbird/doorbird.discovery.d.ts +2 -2
- package/dist_ts/integrations/dsmr/dsmr.classes.client.js +1 -1
- package/dist_ts/integrations/dsmr/dsmr.classes.integration.d.ts +1 -1
- package/dist_ts/integrations/dsmr/dsmr.classes.integration.js +1 -1
- package/dist_ts/integrations/dsmr/dsmr.discovery.d.ts +1 -1
- package/dist_ts/integrations/dsmr/dsmr.parser.js +1 -1
- package/dist_ts/integrations/dunehd/dunehd.classes.client.js +1 -1
- package/dist_ts/integrations/dunehd/dunehd.classes.integration.d.ts +1 -1
- package/dist_ts/integrations/dunehd/dunehd.classes.integration.js +1 -1
- package/dist_ts/integrations/dunehd/dunehd.discovery.d.ts +3 -3
- package/dist_ts/integrations/edimax/edimax.classes.client.js +1 -1
- package/dist_ts/integrations/edl21/edl21.classes.client.js +1 -1
- package/dist_ts/integrations/egardia/egardia.classes.client.js +1 -1
- package/dist_ts/integrations/elgato/elgato.classes.client.js +1 -1
- package/dist_ts/integrations/elgato/elgato.classes.integration.d.ts +1 -1
- package/dist_ts/integrations/elgato/elgato.classes.integration.js +1 -1
- package/dist_ts/integrations/elgato/elgato.discovery.d.ts +3 -3
- package/dist_ts/integrations/emby/emby.classes.client.js +1 -1
- package/dist_ts/integrations/emby/emby.classes.integration.d.ts +1 -1
- package/dist_ts/integrations/emby/emby.classes.integration.js +1 -1
- package/dist_ts/integrations/emby/emby.discovery.d.ts +3 -3
- package/dist_ts/integrations/emoncms_history/emoncms_history.classes.client.js +1 -1
- package/dist_ts/integrations/emonitor/emonitor.classes.client.js +1 -1
- package/dist_ts/integrations/emulated_hue/emulated_hue.classes.client.js +1 -1
- package/dist_ts/integrations/emulated_kasa/emulated_kasa.classes.client.js +1 -1
- package/dist_ts/integrations/emulated_roku/emulated_roku.classes.client.js +1 -1
- package/dist_ts/integrations/energenie_power_sockets/energenie_power_sockets.classes.client.js +1 -1
- package/dist_ts/integrations/enigma2/enigma2.classes.client.js +1 -1
- package/dist_ts/integrations/enocean/enocean.classes.client.js +1 -1
- package/dist_ts/integrations/esphome/esphome.classes.client.d.ts +35 -18
- package/dist_ts/integrations/esphome/esphome.classes.client.js +267 -77
- package/dist_ts/integrations/esphome/esphome.classes.configflow.js +2 -4
- package/dist_ts/integrations/esphome/esphome.classes.integration.d.ts +22 -11
- package/dist_ts/integrations/esphome/esphome.classes.integration.js +68 -61
- package/dist_ts/integrations/esphome/esphome.discovery.d.ts +2 -2
- package/dist_ts/integrations/esphome/esphome.discovery.js +2 -2
- package/dist_ts/integrations/esphome/esphome.mapper.d.ts +1 -2
- package/dist_ts/integrations/esphome/esphome.mapper.js +79 -36
- package/dist_ts/integrations/esphome/esphome.types.d.ts +2 -0
- package/dist_ts/integrations/fibaro/fibaro.classes.client.js +1 -1
- package/dist_ts/integrations/file/file.classes.client.js +1 -1
- package/dist_ts/integrations/filesize/filesize.classes.client.js +1 -1
- package/dist_ts/integrations/flexit_bacnet/flexit_bacnet.classes.client.js +1 -1
- package/dist_ts/integrations/flic/flic.classes.client.js +1 -1
- package/dist_ts/integrations/flux_led/flux_led.classes.client.js +1 -1
- package/dist_ts/integrations/folder/folder.classes.client.js +1 -1
- package/dist_ts/integrations/folder_watcher/folder_watcher.classes.client.js +1 -1
- package/dist_ts/integrations/forked_daapd/forked_daapd.classes.client.js +1 -1
- package/dist_ts/integrations/forked_daapd/forked_daapd.classes.integration.d.ts +1 -1
- package/dist_ts/integrations/forked_daapd/forked_daapd.classes.integration.js +1 -1
- package/dist_ts/integrations/forked_daapd/forked_daapd.discovery.d.ts +2 -2
- package/dist_ts/integrations/foscam/foscam.classes.client.js +1 -1
- package/dist_ts/integrations/foscam/foscam.classes.integration.d.ts +1 -1
- package/dist_ts/integrations/foscam/foscam.classes.integration.js +1 -1
- package/dist_ts/integrations/foscam/foscam.discovery.d.ts +3 -3
- package/dist_ts/integrations/foscam/foscam.types.d.ts +2 -2
- package/dist_ts/integrations/freebox/freebox.classes.client.js +1 -1
- package/dist_ts/integrations/freebox/freebox.classes.integration.d.ts +1 -1
- package/dist_ts/integrations/freebox/freebox.classes.integration.js +1 -1
- package/dist_ts/integrations/freebox/freebox.discovery.d.ts +2 -2
- package/dist_ts/integrations/freebox/freebox.mapper.js +1 -1
- package/dist_ts/integrations/freebox/freebox.types.d.ts +11 -11
- package/dist_ts/integrations/fritz/fritz.classes.client.js +1 -1
- package/dist_ts/integrations/fritz/fritz.classes.integration.d.ts +1 -1
- package/dist_ts/integrations/fritz/fritz.classes.integration.js +1 -1
- package/dist_ts/integrations/fritz/fritz.discovery.d.ts +3 -3
- package/dist_ts/integrations/fritz/fritz.mapper.js +1 -1
- package/dist_ts/integrations/fritzbox_callmonitor/fritzbox_callmonitor.classes.client.js +1 -1
- package/dist_ts/integrations/fritzbox_callmonitor/fritzbox_callmonitor.classes.integration.d.ts +1 -1
- package/dist_ts/integrations/fritzbox_callmonitor/fritzbox_callmonitor.classes.integration.js +1 -1
- package/dist_ts/integrations/fritzbox_callmonitor/fritzbox_callmonitor.discovery.d.ts +3 -3
- package/dist_ts/integrations/fritzbox_callmonitor/fritzbox_callmonitor.mapper.js +1 -1
- package/dist_ts/integrations/fronius/fronius.classes.client.js +1 -1
- package/dist_ts/integrations/fronius/fronius.classes.integration.d.ts +1 -1
- package/dist_ts/integrations/fronius/fronius.classes.integration.js +1 -1
- package/dist_ts/integrations/fronius/fronius.discovery.d.ts +2 -2
- package/dist_ts/integrations/fronius/fronius.mapper.js +1 -1
- package/dist_ts/integrations/frontier_silicon/frontier_silicon.classes.client.js +1 -1
- package/dist_ts/integrations/frontier_silicon/frontier_silicon.classes.integration.d.ts +1 -1
- package/dist_ts/integrations/frontier_silicon/frontier_silicon.classes.integration.js +1 -1
- package/dist_ts/integrations/frontier_silicon/frontier_silicon.discovery.d.ts +2 -2
- package/dist_ts/integrations/fully_kiosk/fully_kiosk.classes.client.js +1 -1
- package/dist_ts/integrations/fully_kiosk/fully_kiosk.classes.integration.d.ts +1 -1
- package/dist_ts/integrations/fully_kiosk/fully_kiosk.classes.integration.js +1 -1
- package/dist_ts/integrations/fully_kiosk/fully_kiosk.discovery.d.ts +2 -2
- package/dist_ts/integrations/fully_kiosk/fully_kiosk.mapper.js +1 -1
- package/dist_ts/integrations/generated/index.d.ts +1 -1
- package/dist_ts/integrations/generated/index.js +5 -7
- package/dist_ts/integrations/generic/generic.classes.client.js +1 -1
- package/dist_ts/integrations/geniushub/geniushub.classes.client.js +1 -1
- package/dist_ts/integrations/glances/glances.classes.client.js +1 -1
- package/dist_ts/integrations/glances/glances.classes.integration.d.ts +1 -1
- package/dist_ts/integrations/glances/glances.classes.integration.js +1 -1
- package/dist_ts/integrations/glances/glances.discovery.d.ts +2 -2
- package/dist_ts/integrations/go2rtc/go2rtc.classes.client.js +1 -1
- package/dist_ts/integrations/go2rtc/go2rtc.classes.integration.d.ts +1 -1
- package/dist_ts/integrations/go2rtc/go2rtc.classes.integration.js +1 -1
- package/dist_ts/integrations/go2rtc/go2rtc.discovery.d.ts +2 -2
- package/dist_ts/integrations/go2rtc/go2rtc.mapper.js +1 -1
- package/dist_ts/integrations/goalzero/goalzero.classes.client.js +1 -1
- package/dist_ts/integrations/gogogate2/gogogate2.classes.client.js +1 -1
- package/dist_ts/integrations/goodwe/goodwe.classes.client.js +1 -1
- package/dist_ts/integrations/goodwe/goodwe.classes.integration.d.ts +1 -1
- package/dist_ts/integrations/goodwe/goodwe.classes.integration.js +1 -1
- package/dist_ts/integrations/goodwe/goodwe.discovery.d.ts +1 -1
- package/dist_ts/integrations/goodwe/goodwe.types.d.ts +8 -8
- package/dist_ts/integrations/google_wifi/google_wifi.classes.client.js +1 -1
- package/dist_ts/integrations/govee_ble/govee_ble.classes.client.js +1 -1
- package/dist_ts/integrations/govee_light_local/govee_light_local.classes.client.js +1 -1
- package/dist_ts/integrations/gpsd/gpsd.classes.client.js +1 -1
- package/dist_ts/integrations/graphite/graphite.classes.client.js +1 -1
- package/dist_ts/integrations/gree/gree.classes.client.js +1 -1
- package/dist_ts/integrations/harman_kardon_avr/harman_kardon_avr.classes.client.js +1 -1
- package/dist_ts/integrations/harman_kardon_avr/harman_kardon_avr.classes.integration.d.ts +1 -1
- package/dist_ts/integrations/harman_kardon_avr/harman_kardon_avr.classes.integration.js +1 -1
- package/dist_ts/integrations/harman_kardon_avr/harman_kardon_avr.discovery.d.ts +1 -1
- package/dist_ts/integrations/harman_kardon_avr/harman_kardon_avr.types.d.ts +12 -12
- package/dist_ts/integrations/harmony/harmony.classes.client.js +1 -1
- package/dist_ts/integrations/harmony/harmony.classes.integration.d.ts +1 -1
- package/dist_ts/integrations/harmony/harmony.classes.integration.js +1 -1
- package/dist_ts/integrations/harmony/harmony.discovery.d.ts +2 -2
- package/dist_ts/integrations/hddtemp/hddtemp.classes.client.js +1 -1
- package/dist_ts/integrations/hddtemp/hddtemp.classes.integration.d.ts +1 -1
- package/dist_ts/integrations/hddtemp/hddtemp.classes.integration.js +1 -1
- package/dist_ts/integrations/hddtemp/hddtemp.discovery.d.ts +2 -2
- package/dist_ts/integrations/hdfury/hdfury.classes.client.js +1 -1
- package/dist_ts/integrations/hdmi_cec/hdmi_cec.classes.client.js +1 -1
- package/dist_ts/integrations/heatmiser/heatmiser.classes.client.js +1 -1
- package/dist_ts/integrations/hegel/hegel.classes.client.js +1 -1
- package/dist_ts/integrations/heos/heos.classes.client.js +1 -1
- package/dist_ts/integrations/heos/heos.classes.integration.d.ts +1 -1
- package/dist_ts/integrations/heos/heos.classes.integration.js +1 -1
- package/dist_ts/integrations/heos/heos.discovery.d.ts +3 -3
- package/dist_ts/integrations/hikvision/hikvision.classes.client.js +1 -1
- package/dist_ts/integrations/hikvision/hikvision.classes.integration.d.ts +1 -1
- package/dist_ts/integrations/hikvision/hikvision.classes.integration.js +1 -1
- package/dist_ts/integrations/hikvision/hikvision.discovery.d.ts +3 -3
- package/dist_ts/integrations/hikvisioncam/hikvisioncam.classes.client.js +1 -1
- package/dist_ts/integrations/hisense_aehw4a1/hisense_aehw4a1.classes.client.js +1 -1
- package/dist_ts/integrations/hitron_coda/hitron_coda.classes.client.js +1 -1
- package/dist_ts/integrations/hlk_sw16/hlk_sw16.classes.client.js +1 -1
- package/dist_ts/integrations/holiday/holiday.classes.client.js +1 -1
- package/dist_ts/integrations/homeassistant/homeassistant.classes.client.d.ts +7 -1
- package/dist_ts/integrations/homeassistant/homeassistant.classes.client.js +174 -50
- package/dist_ts/integrations/homeassistant/homeassistant.classes.integration.d.ts +1 -1
- package/dist_ts/integrations/homeassistant/homeassistant.classes.integration.js +1 -1
- package/dist_ts/integrations/homeassistant/homeassistant.classes.runtime.d.ts +2 -0
- package/dist_ts/integrations/homeassistant/homeassistant.classes.runtime.js +35 -3
- package/dist_ts/integrations/homeassistant/homeassistant.mapper.d.ts +4 -4
- package/dist_ts/integrations/homeassistant/homeassistant.mapper.js +25 -36
- package/dist_ts/integrations/homeassistant/homeassistant.types.d.ts +10 -0
- package/dist_ts/integrations/homeassistant/homeassistant.validation.d.ts +9 -0
- package/dist_ts/integrations/homeassistant/homeassistant.validation.js +137 -0
- package/dist_ts/integrations/homee/homee.classes.client.js +1 -1
- package/dist_ts/integrations/homekit_controller/homekit_controller.classes.client.js +1 -1
- package/dist_ts/integrations/homekit_controller/homekit_controller.classes.integration.d.ts +1 -1
- package/dist_ts/integrations/homekit_controller/homekit_controller.classes.integration.js +1 -1
- package/dist_ts/integrations/homekit_controller/homekit_controller.discovery.d.ts +2 -2
- package/dist_ts/integrations/homekit_controller/homekit_controller.mapper.js +1 -1
- package/dist_ts/integrations/homematic/homematic.classes.client.d.ts +2 -2
- package/dist_ts/integrations/homematic/homematic.classes.client.js +1 -1
- package/dist_ts/integrations/homematic/homematic.classes.integration.d.ts +1 -1
- package/dist_ts/integrations/homematic/homematic.classes.integration.js +1 -1
- package/dist_ts/integrations/homematic/homematic.constants.d.ts +2 -2
- package/dist_ts/integrations/homematic/homematic.discovery.d.ts +2 -2
- package/dist_ts/integrations/homewizard/homewizard.classes.client.js +1 -1
- package/dist_ts/integrations/homewizard/homewizard.classes.integration.d.ts +3 -3
- package/dist_ts/integrations/homewizard/homewizard.classes.integration.js +1 -1
- package/dist_ts/integrations/homewizard/homewizard.discovery.d.ts +3 -3
- package/dist_ts/integrations/homewizard/homewizard.mapper.js +1 -1
- package/dist_ts/integrations/homewizard/homewizard.types.d.ts +10 -10
- package/dist_ts/integrations/huawei_lte/huawei_lte.classes.client.js +1 -1
- package/dist_ts/integrations/huawei_lte/huawei_lte.classes.integration.d.ts +2 -2
- package/dist_ts/integrations/huawei_lte/huawei_lte.classes.integration.js +1 -1
- package/dist_ts/integrations/huawei_lte/huawei_lte.discovery.d.ts +3 -3
- package/dist_ts/integrations/huawei_lte/huawei_lte.mapper.js +1 -1
- package/dist_ts/integrations/huawei_lte/huawei_lte.types.d.ts +1 -1
- package/dist_ts/integrations/hue/hue.classes.client.d.ts +13 -5
- package/dist_ts/integrations/hue/hue.classes.client.js +278 -23
- package/dist_ts/integrations/hue/hue.classes.configflow.js +34 -14
- package/dist_ts/integrations/hue/hue.classes.integration.d.ts +2 -1
- package/dist_ts/integrations/hue/hue.classes.integration.js +85 -25
- package/dist_ts/integrations/hue/hue.discovery.d.ts +2 -2
- package/dist_ts/integrations/hue/hue.discovery.js +79 -26
- package/dist_ts/integrations/hue/hue.mapper.d.ts +0 -1
- package/dist_ts/integrations/hue/hue.mapper.js +26 -54
- package/dist_ts/integrations/hue/hue.types.d.ts +14 -7
- package/dist_ts/integrations/hue/hue.validation.d.ts +11 -0
- package/dist_ts/integrations/hue/hue.validation.js +160 -0
- package/dist_ts/integrations/hunterdouglas_powerview/hunterdouglas_powerview.classes.client.js +1 -1
- package/dist_ts/integrations/hunterdouglas_powerview/hunterdouglas_powerview.classes.integration.d.ts +2 -2
- package/dist_ts/integrations/hunterdouglas_powerview/hunterdouglas_powerview.classes.integration.js +1 -1
- package/dist_ts/integrations/hunterdouglas_powerview/hunterdouglas_powerview.discovery.d.ts +3 -3
- package/dist_ts/integrations/hunterdouglas_powerview/hunterdouglas_powerview.types.d.ts +1 -1
- package/dist_ts/integrations/hyperion/hyperion.classes.client.js +1 -1
- package/dist_ts/integrations/hyperion/hyperion.classes.integration.d.ts +1 -1
- package/dist_ts/integrations/hyperion/hyperion.classes.integration.js +1 -1
- package/dist_ts/integrations/hyperion/hyperion.discovery.d.ts +3 -3
- package/dist_ts/integrations/hyperion/hyperion.types.d.ts +1 -1
- package/dist_ts/integrations/imeon_inverter/imeon_inverter.classes.client.js +1 -1
- package/dist_ts/integrations/immich/immich.classes.client.js +1 -1
- package/dist_ts/integrations/incomfort/incomfort.classes.integration.js +1 -1
- package/dist_ts/integrations/indevolt/indevolt.classes.integration.js +1 -1
- package/dist_ts/integrations/index.d.ts +4 -1
- package/dist_ts/integrations/index.js +5 -2
- package/dist_ts/integrations/influxdb/influxdb.classes.client.js +1 -1
- package/dist_ts/integrations/intellifire/intellifire.classes.client.js +1 -1
- package/dist_ts/integrations/intellifire/intellifire.mapper.js +1 -1
- package/dist_ts/integrations/iometer/iometer.classes.client.js +1 -1
- package/dist_ts/integrations/iometer/iometer.mapper.js +1 -1
- package/dist_ts/integrations/iotawatt/iotawatt.classes.client.js +1 -1
- package/dist_ts/integrations/iperf3/iperf3.classes.client.js +1 -1
- package/dist_ts/integrations/ipp/ipp.classes.client.js +1 -1
- package/dist_ts/integrations/ipp/ipp.classes.integration.d.ts +1 -1
- package/dist_ts/integrations/ipp/ipp.classes.integration.js +1 -1
- package/dist_ts/integrations/ipp/ipp.discovery.d.ts +2 -2
- package/dist_ts/integrations/iron_os/iron_os.classes.client.js +1 -1
- package/dist_ts/integrations/iskra/iskra.classes.client.js +1 -1
- package/dist_ts/integrations/iskra/iskra.mapper.js +1 -1
- package/dist_ts/integrations/itunes/itunes.classes.client.js +1 -1
- package/dist_ts/integrations/jellyfin/jellyfin.classes.client.js +1 -1
- package/dist_ts/integrations/jellyfin/jellyfin.classes.integration.d.ts +1 -1
- package/dist_ts/integrations/jellyfin/jellyfin.classes.integration.js +1 -1
- package/dist_ts/integrations/jellyfin/jellyfin.discovery.d.ts +3 -3
- package/dist_ts/integrations/jvc_projector/jvc_projector.classes.client.js +1 -1
- package/dist_ts/integrations/kaleidescape/kaleidescape.classes.client.js +1 -1
- package/dist_ts/integrations/kankun/kankun.classes.client.js +1 -1
- package/dist_ts/integrations/keenetic_ndms2/keenetic_ndms2.classes.client.js +1 -1
- package/dist_ts/integrations/kef/kef.classes.client.js +1 -1
- package/dist_ts/integrations/kiosker/kiosker.classes.client.js +1 -1
- package/dist_ts/integrations/kira/kira.classes.client.js +1 -1
- package/dist_ts/integrations/kmtronic/kmtronic.classes.client.js +1 -1
- package/dist_ts/integrations/knx/knx.classes.client.js +1 -1
- package/dist_ts/integrations/knx/knx.classes.integration.d.ts +1 -1
- package/dist_ts/integrations/knx/knx.classes.integration.js +1 -1
- package/dist_ts/integrations/knx/knx.discovery.d.ts +3 -3
- package/dist_ts/integrations/knx/knx.mapper.d.ts +1 -1
- package/dist_ts/integrations/knx/knx.mapper.js +1 -1
- package/dist_ts/integrations/kodi/kodi.classes.client.d.ts +2 -2
- package/dist_ts/integrations/kodi/kodi.classes.client.js +1 -1
- package/dist_ts/integrations/kodi/kodi.classes.integration.d.ts +1 -1
- package/dist_ts/integrations/kodi/kodi.classes.integration.js +1 -1
- package/dist_ts/integrations/kodi/kodi.discovery.d.ts +2 -2
- package/dist_ts/integrations/konnected/konnected.classes.client.js +1 -1
- package/dist_ts/integrations/kostal_plenticore/kostal_plenticore.classes.client.js +1 -1
- package/dist_ts/integrations/kostal_plenticore/kostal_plenticore.mapper.js +1 -1
- package/dist_ts/integrations/kwb/kwb.classes.client.js +1 -1
- package/dist_ts/integrations/kwb/kwb.mapper.js +1 -1
- package/dist_ts/integrations/lametric/lametric.classes.client.js +1 -1
- package/dist_ts/integrations/landisgyr_heat_meter/landisgyr_heat_meter.mapper.js +1 -1
- package/dist_ts/integrations/lcn/lcn.classes.client.js +1 -1
- package/dist_ts/integrations/lektrico/lektrico.classes.client.js +1 -1
- package/dist_ts/integrations/lektrico/lektrico.types.d.ts +4 -4
- package/dist_ts/integrations/lg_netcast/lg_netcast.classes.client.js +1 -1
- package/dist_ts/integrations/lg_soundbar/lg_soundbar.classes.client.js +1 -1
- package/dist_ts/integrations/libre_hardware_monitor/libre_hardware_monitor.classes.client.js +1 -1
- package/dist_ts/integrations/lidarr/lidarr.classes.client.js +1 -1
- package/dist_ts/integrations/lifx/lifx.classes.client.d.ts +10 -4
- package/dist_ts/integrations/lifx/lifx.classes.client.js +94 -6
- package/dist_ts/integrations/lifx/lifx.classes.configflow.d.ts +3 -3
- package/dist_ts/integrations/lifx/lifx.classes.configflow.js +37 -6
- package/dist_ts/integrations/lifx/lifx.classes.integration.d.ts +19 -4
- package/dist_ts/integrations/lifx/lifx.classes.integration.js +152 -7
- package/dist_ts/integrations/lifx/lifx.discovery.d.ts +2 -1
- package/dist_ts/integrations/lifx/lifx.discovery.js +26 -4
- package/dist_ts/integrations/lifx/lifx.mapper.d.ts +7 -8
- package/dist_ts/integrations/lifx/lifx.mapper.js +42 -12
- package/dist_ts/integrations/lifx/lifx.types.d.ts +61 -9
- package/dist_ts/integrations/lifx/lifx.types.js +9 -116
- package/dist_ts/integrations/lifx/lifx.validation.d.ts +10 -0
- package/dist_ts/integrations/lifx/lifx.validation.js +83 -0
- package/dist_ts/integrations/linkplay/linkplay.classes.client.js +1 -1
- package/dist_ts/integrations/linkplay/linkplay.classes.integration.d.ts +1 -1
- package/dist_ts/integrations/linkplay/linkplay.classes.integration.js +1 -1
- package/dist_ts/integrations/linkplay/linkplay.discovery.d.ts +3 -3
- package/dist_ts/integrations/linksys_smart/linksys_smart.classes.client.js +1 -1
- package/dist_ts/integrations/livisi/livisi.classes.client.js +1 -1
- package/dist_ts/integrations/local_calendar/local_calendar.classes.client.js +1 -1
- package/dist_ts/integrations/local_file/local_file.classes.client.js +1 -1
- package/dist_ts/integrations/local_ip/local_ip.classes.client.js +1 -1
- package/dist_ts/integrations/local_todo/local_todo.classes.client.js +1 -1
- package/dist_ts/integrations/lookin/lookin.classes.client.js +1 -1
- package/dist_ts/integrations/loqed/loqed.classes.client.js +1 -1
- package/dist_ts/integrations/loqed/loqed.mapper.d.ts +1 -1
- package/dist_ts/integrations/loqed/loqed.mapper.js +1 -1
- package/dist_ts/integrations/luci/luci.classes.client.js +1 -1
- package/dist_ts/integrations/luci/luci.mapper.js +1 -1
- package/dist_ts/integrations/lunatone/lunatone.classes.client.js +1 -1
- package/dist_ts/integrations/lunatone/lunatone.mapper.js +1 -1
- package/dist_ts/integrations/madvr/madvr.classes.client.js +1 -1
- package/dist_ts/integrations/madvr/madvr.classes.integration.d.ts +1 -1
- package/dist_ts/integrations/madvr/madvr.classes.integration.js +1 -1
- package/dist_ts/integrations/madvr/madvr.discovery.d.ts +2 -2
- package/dist_ts/integrations/marytts/marytts.classes.client.js +1 -1
- package/dist_ts/integrations/marytts/marytts.classes.integration.js +1 -1
- package/dist_ts/integrations/matter/matter.classes.client.js +1 -1
- package/dist_ts/integrations/matter/matter.classes.integration.d.ts +1 -1
- package/dist_ts/integrations/matter/matter.classes.integration.js +1 -1
- package/dist_ts/integrations/matter/matter.discovery.d.ts +2 -2
- package/dist_ts/integrations/matter/matter.mapper.js +1 -1
- package/dist_ts/integrations/maxcube/maxcube.classes.client.js +1 -1
- package/dist_ts/integrations/mcp/mcp.classes.client.js +1 -1
- package/dist_ts/integrations/mcp_server/mcp_server.classes.client.js +1 -1
- package/dist_ts/integrations/mealie/mealie.classes.client.js +1 -1
- package/dist_ts/integrations/mealie/mealie.mapper.js +1 -1
- package/dist_ts/integrations/medcom_ble/medcom_ble.classes.client.js +1 -1
- package/dist_ts/integrations/medcom_ble/medcom_ble.mapper.js +1 -1
- package/dist_ts/integrations/mediaroom/mediaroom.classes.client.js +1 -1
- package/dist_ts/integrations/mediaroom/mediaroom.mapper.js +1 -1
- package/dist_ts/integrations/mfi/mfi.mapper.js +1 -1
- package/dist_ts/integrations/mikrotik/mikrotik.classes.client.js +1 -1
- package/dist_ts/integrations/mikrotik/mikrotik.classes.integration.d.ts +1 -1
- package/dist_ts/integrations/mikrotik/mikrotik.classes.integration.js +1 -1
- package/dist_ts/integrations/mikrotik/mikrotik.discovery.d.ts +1 -1
- package/dist_ts/integrations/mikrotik/mikrotik.mapper.js +1 -1
- package/dist_ts/integrations/mill/mill.classes.client.js +1 -1
- package/dist_ts/integrations/mill/mill.mapper.js +1 -1
- package/dist_ts/integrations/minecraft_server/minecraft_server.classes.client.js +1 -1
- package/dist_ts/integrations/mjpeg/mjpeg.classes.client.js +1 -1
- package/dist_ts/integrations/mobile_app/mobile_app.classes.client.js +1 -1
- package/dist_ts/integrations/mochad/mochad.classes.client.js +1 -1
- package/dist_ts/integrations/modbus/modbus.classes.client.js +1 -1
- package/dist_ts/integrations/modbus/modbus.classes.integration.d.ts +1 -1
- package/dist_ts/integrations/modbus/modbus.classes.integration.js +1 -1
- package/dist_ts/integrations/modbus/modbus.discovery.d.ts +1 -1
- package/dist_ts/integrations/modern_forms/modern_forms.classes.client.js +1 -1
- package/dist_ts/integrations/moehlenhoff_alpha2/moehlenhoff_alpha2.classes.client.js +1 -1
- package/dist_ts/integrations/monoprice/monoprice.classes.client.js +1 -1
- package/dist_ts/integrations/motioneye/motioneye.classes.client.js +1 -1
- package/dist_ts/integrations/motioneye/motioneye.classes.integration.d.ts +1 -1
- package/dist_ts/integrations/motioneye/motioneye.classes.integration.js +1 -1
- package/dist_ts/integrations/motioneye/motioneye.discovery.d.ts +2 -2
- package/dist_ts/integrations/motioneye/motioneye.types.d.ts +1 -1
- package/dist_ts/integrations/motionmount/motionmount.classes.client.js +1 -1
- package/dist_ts/integrations/mpd/mpd.classes.client.js +1 -1
- package/dist_ts/integrations/mpd/mpd.classes.integration.d.ts +1 -1
- package/dist_ts/integrations/mpd/mpd.classes.integration.js +1 -1
- package/dist_ts/integrations/mpd/mpd.discovery.d.ts +2 -2
- package/dist_ts/integrations/mqtt/mqtt.classes.client.d.ts +54 -9
- package/dist_ts/integrations/mqtt/mqtt.classes.client.js +443 -352
- package/dist_ts/integrations/mqtt/mqtt.classes.configflow.d.ts +0 -1
- package/dist_ts/integrations/mqtt/mqtt.classes.configflow.js +23 -18
- package/dist_ts/integrations/mqtt/mqtt.classes.integration.d.ts +1 -1
- package/dist_ts/integrations/mqtt/mqtt.classes.integration.js +140 -37
- package/dist_ts/integrations/mqtt/mqtt.discovery.d.ts +2 -2
- package/dist_ts/integrations/mqtt/mqtt.mapper.d.ts +7 -1
- package/dist_ts/integrations/mqtt/mqtt.mapper.js +161 -48
- package/dist_ts/integrations/mqtt/mqtt.types.d.ts +17 -0
- package/dist_ts/integrations/mqtt_eventstream/mqtt_eventstream.classes.client.js +1 -1
- package/dist_ts/integrations/mqtt_json/mqtt_json.classes.client.js +1 -1
- package/dist_ts/integrations/mqtt_room/mqtt_room.classes.client.js +1 -1
- package/dist_ts/integrations/music_assistant/music_assistant.classes.client.js +1 -1
- package/dist_ts/integrations/music_assistant/music_assistant.mapper.js +1 -1
- package/dist_ts/integrations/mutesync/mutesync.classes.client.js +1 -1
- package/dist_ts/integrations/mutesync/mutesync.mapper.js +1 -1
- package/dist_ts/integrations/mycroft/mycroft.classes.client.js +1 -1
- package/dist_ts/integrations/mysensors/mysensors.classes.client.js +1 -1
- package/dist_ts/integrations/mystrom/mystrom.classes.client.js +1 -1
- package/dist_ts/integrations/nad/nad.classes.client.js +1 -1
- package/dist_ts/integrations/nam/nam.classes.client.js +1 -1
- package/dist_ts/integrations/nanoleaf/nanoleaf.classes.client.js +1 -1
- package/dist_ts/integrations/nanoleaf/nanoleaf.classes.integration.d.ts +1 -1
- package/dist_ts/integrations/nanoleaf/nanoleaf.classes.integration.js +1 -1
- package/dist_ts/integrations/nanoleaf/nanoleaf.discovery.d.ts +3 -3
- package/dist_ts/integrations/nasweb/nasweb.classes.client.js +1 -1
- package/dist_ts/integrations/netdata/netdata.classes.client.js +1 -1
- package/dist_ts/integrations/nibe_heatpump/nibe_heatpump.classes.client.js +1 -1
- package/dist_ts/integrations/niko_home_control/niko_home_control.classes.client.js +1 -1
- package/dist_ts/integrations/nobo_hub/nobo_hub.classes.client.js +1 -1
- package/dist_ts/integrations/nrgkick/nrgkick.classes.client.js +1 -1
- package/dist_ts/integrations/nuki/nuki.classes.client.js +1 -1
- package/dist_ts/integrations/nut/nut.classes.client.js +1 -1
- package/dist_ts/integrations/nut/nut.classes.integration.js +1 -1
- package/dist_ts/integrations/nx584/nx584.classes.client.js +1 -1
- package/dist_ts/integrations/nx584/nx584.classes.integration.js +1 -1
- package/dist_ts/integrations/nzbget/nzbget.classes.client.js +1 -1
- package/dist_ts/integrations/nzbget/nzbget.mapper.js +1 -1
- package/dist_ts/integrations/obihai/obihai.classes.client.js +1 -1
- package/dist_ts/integrations/octoprint/octoprint.classes.client.js +1 -1
- package/dist_ts/integrations/octoprint/octoprint.mapper.js +1 -1
- package/dist_ts/integrations/oem/oem.classes.client.js +1 -1
- package/dist_ts/integrations/ollama/ollama.classes.client.js +1 -1
- package/dist_ts/integrations/ombi/ombi.classes.client.js +1 -1
- package/dist_ts/integrations/onewire/onewire.classes.client.js +1 -1
- package/dist_ts/integrations/onkyo/onkyo.classes.client.js +1 -1
- package/dist_ts/integrations/onvif/onvif.classes.client.js +1 -1
- package/dist_ts/integrations/onvif/onvif.classes.integration.d.ts +1 -1
- package/dist_ts/integrations/onvif/onvif.classes.integration.js +1 -1
- package/dist_ts/integrations/onvif/onvif.discovery.d.ts +3 -3
- package/dist_ts/integrations/onvif/onvif.mapper.js +1 -1
- package/dist_ts/integrations/openevse/openevse.classes.client.js +1 -1
- package/dist_ts/integrations/openevse/openevse.mapper.js +1 -1
- package/dist_ts/integrations/opengarage/opengarage.classes.client.js +1 -1
- package/dist_ts/integrations/opengarage/opengarage.mapper.js +1 -1
- package/dist_ts/integrations/openhardwaremonitor/openhardwaremonitor.classes.client.js +1 -1
- package/dist_ts/integrations/openhome/openhome.classes.client.d.ts +2 -1
- package/dist_ts/integrations/openhome/openhome.classes.client.js +21 -19
- package/dist_ts/integrations/openrgb/openrgb.classes.client.js +1 -1
- package/dist_ts/integrations/openrgb/openrgb.classes.integration.d.ts +1 -1
- package/dist_ts/integrations/openrgb/openrgb.classes.integration.js +1 -1
- package/dist_ts/integrations/openrgb/openrgb.discovery.d.ts +2 -2
- package/dist_ts/integrations/openrgb/openrgb.mapper.js +1 -1
- package/dist_ts/integrations/opentherm_gw/opentherm_gw.classes.client.d.ts +1 -1
- package/dist_ts/integrations/opentherm_gw/opentherm_gw.classes.client.js +1 -1
- package/dist_ts/integrations/opentherm_gw/opentherm_gw.classes.integration.d.ts +1 -1
- package/dist_ts/integrations/opentherm_gw/opentherm_gw.classes.integration.js +1 -1
- package/dist_ts/integrations/opentherm_gw/opentherm_gw.discovery.d.ts +1 -1
- package/dist_ts/integrations/opnsense/opnsense.classes.client.js +1 -1
- package/dist_ts/integrations/opnsense/opnsense.classes.integration.d.ts +1 -1
- package/dist_ts/integrations/opnsense/opnsense.classes.integration.js +1 -1
- package/dist_ts/integrations/opnsense/opnsense.discovery.d.ts +1 -1
- package/dist_ts/integrations/opnsense/opnsense.mapper.js +1 -1
- package/dist_ts/integrations/orvibo/orvibo.classes.client.js +1 -1
- package/dist_ts/integrations/osramlightify/osramlightify.classes.client.js +1 -1
- package/dist_ts/integrations/otbr/otbr.classes.client.js +1 -1
- package/dist_ts/integrations/overkiz/overkiz.classes.client.js +1 -1
- package/dist_ts/integrations/overseerr/overseerr.classes.client.js +1 -1
- package/dist_ts/integrations/owntracks/owntracks.classes.client.js +1 -1
- package/dist_ts/integrations/p1_monitor/p1_monitor.classes.client.js +1 -1
- package/dist_ts/integrations/palazzetti/palazzetti.classes.client.js +1 -1
- package/dist_ts/integrations/panasonic_bluray/panasonic_bluray.classes.client.js +1 -1
- package/dist_ts/integrations/panasonic_viera/panasonic_viera.classes.client.js +1 -1
- package/dist_ts/integrations/paperless_ngx/paperless_ngx.classes.client.js +1 -1
- package/dist_ts/integrations/paperless_ngx/paperless_ngx.mapper.js +1 -1
- package/dist_ts/integrations/peblar/peblar.classes.client.js +1 -1
- package/dist_ts/integrations/peblar/peblar.mapper.js +1 -1
- package/dist_ts/integrations/pencom/pencom.classes.client.js +1 -1
- package/dist_ts/integrations/philips_js/philips_js.classes.client.js +1 -1
- package/dist_ts/integrations/pi_hole/pi_hole.classes.client.js +1 -1
- package/dist_ts/integrations/pi_hole/pi_hole.classes.integration.d.ts +1 -1
- package/dist_ts/integrations/pi_hole/pi_hole.classes.integration.js +1 -1
- package/dist_ts/integrations/pi_hole/pi_hole.discovery.d.ts +2 -2
- package/dist_ts/integrations/pi_hole/pi_hole.mapper.js +1 -1
- package/dist_ts/integrations/picotts/picotts.classes.client.js +1 -1
- package/dist_ts/integrations/pilight/pilight.classes.client.js +1 -1
- package/dist_ts/integrations/pilight/pilight.classes.integration.js +1 -1
- package/dist_ts/integrations/ping/ping.classes.client.js +1 -1
- package/dist_ts/integrations/pioneer/pioneer.classes.client.js +1 -1
- package/dist_ts/integrations/pjlink/pjlink.classes.client.js +1 -1
- package/dist_ts/integrations/plex/plex.classes.client.d.ts +1 -1
- package/dist_ts/integrations/plex/plex.classes.client.js +1 -1
- package/dist_ts/integrations/plex/plex.classes.integration.d.ts +1 -1
- package/dist_ts/integrations/plex/plex.classes.integration.js +1 -1
- package/dist_ts/integrations/plex/plex.discovery.d.ts +5 -5
- package/dist_ts/integrations/plugwise/plugwise.classes.client.js +1 -1
- package/dist_ts/integrations/prusalink/prusalink.classes.client.js +1 -1
- package/dist_ts/integrations/prusalink/prusalink.classes.integration.d.ts +1 -1
- package/dist_ts/integrations/prusalink/prusalink.classes.integration.js +1 -1
- package/dist_ts/integrations/prusalink/prusalink.discovery.d.ts +2 -2
- package/dist_ts/integrations/rainbird/rainbird.classes.client.js +1 -1
- package/dist_ts/integrations/rainbird/rainbird.classes.integration.d.ts +1 -1
- package/dist_ts/integrations/rainbird/rainbird.classes.integration.js +1 -1
- package/dist_ts/integrations/rainbird/rainbird.discovery.d.ts +1 -1
- package/dist_ts/integrations/rflink/rflink.classes.client.js +1 -1
- package/dist_ts/integrations/rflink/rflink.classes.integration.d.ts +1 -1
- package/dist_ts/integrations/rflink/rflink.classes.integration.js +1 -1
- package/dist_ts/integrations/rflink/rflink.discovery.d.ts +1 -1
- package/dist_ts/integrations/roku/roku.classes.client.d.ts +27 -14
- package/dist_ts/integrations/roku/roku.classes.client.js +213 -132
- package/dist_ts/integrations/roku/roku.classes.configflow.js +23 -14
- package/dist_ts/integrations/roku/roku.classes.integration.d.ts +4 -1
- package/dist_ts/integrations/roku/roku.classes.integration.js +74 -91
- package/dist_ts/integrations/roku/roku.discovery.d.ts +8 -8
- package/dist_ts/integrations/roku/roku.discovery.js +82 -65
- package/dist_ts/integrations/roku/roku.mapper.d.ts +0 -3
- package/dist_ts/integrations/roku/roku.mapper.js +18 -50
- package/dist_ts/integrations/roku/roku.types.d.ts +21 -12
- package/dist_ts/integrations/roku/roku.validation.d.ts +9 -0
- package/dist_ts/integrations/roku/roku.validation.js +74 -0
- package/dist_ts/integrations/samsungtv/samsungtv.classes.client.d.ts +9 -38
- package/dist_ts/integrations/samsungtv/samsungtv.classes.client.js +113 -417
- package/dist_ts/integrations/samsungtv/samsungtv.classes.configflow.js +31 -29
- package/dist_ts/integrations/samsungtv/samsungtv.classes.integration.d.ts +8 -7
- package/dist_ts/integrations/samsungtv/samsungtv.classes.integration.js +122 -117
- package/dist_ts/integrations/samsungtv/samsungtv.discovery.d.ts +11 -11
- package/dist_ts/integrations/samsungtv/samsungtv.discovery.js +120 -143
- package/dist_ts/integrations/samsungtv/samsungtv.mapper.d.ts +3 -11
- package/dist_ts/integrations/samsungtv/samsungtv.mapper.js +18 -117
- package/dist_ts/integrations/samsungtv/samsungtv.types.d.ts +18 -85
- package/dist_ts/integrations/samsungtv/samsungtv.validation.d.ts +7 -0
- package/dist_ts/integrations/samsungtv/samsungtv.validation.js +83 -0
- package/dist_ts/integrations/shelly/shelly.classes.client.d.ts +29 -14
- package/dist_ts/integrations/shelly/shelly.classes.client.js +310 -126
- package/dist_ts/integrations/shelly/shelly.classes.configflow.js +29 -11
- package/dist_ts/integrations/shelly/shelly.classes.integration.d.ts +4 -1
- package/dist_ts/integrations/shelly/shelly.classes.integration.js +120 -27
- package/dist_ts/integrations/shelly/shelly.classes.subscription.d.ts +47 -0
- package/dist_ts/integrations/shelly/shelly.classes.subscription.js +206 -0
- package/dist_ts/integrations/shelly/shelly.discovery.d.ts +2 -2
- package/dist_ts/integrations/shelly/shelly.discovery.js +6 -3
- package/dist_ts/integrations/shelly/shelly.rpc.d.ts +21 -0
- package/dist_ts/integrations/shelly/shelly.rpc.js +210 -0
- package/dist_ts/integrations/shelly/shelly.types.d.ts +26 -4
- package/dist_ts/integrations/snapcast/snapcast.classes.client.js +1 -1
- package/dist_ts/integrations/snapcast/snapcast.classes.integration.d.ts +1 -1
- package/dist_ts/integrations/snapcast/snapcast.classes.integration.js +1 -1
- package/dist_ts/integrations/snapcast/snapcast.discovery.d.ts +2 -2
- package/dist_ts/integrations/sonos/index.d.ts +3 -0
- package/dist_ts/integrations/sonos/index.js +4 -1
- package/dist_ts/integrations/sonos/sonos.classes.client.d.ts +30 -29
- package/dist_ts/integrations/sonos/sonos.classes.client.js +162 -208
- package/dist_ts/integrations/sonos/sonos.classes.configflow.js +27 -9
- package/dist_ts/integrations/sonos/sonos.classes.integration.d.ts +6 -5
- package/dist_ts/integrations/sonos/sonos.classes.integration.js +280 -61
- package/dist_ts/integrations/sonos/sonos.classes.ssdpprobe.d.ts +17 -0
- package/dist_ts/integrations/sonos/sonos.classes.ssdpprobe.js +88 -0
- package/dist_ts/integrations/sonos/sonos.config.d.ts +12 -0
- package/dist_ts/integrations/sonos/sonos.config.js +52 -0
- package/dist_ts/integrations/sonos/sonos.discovery.d.ts +1 -25
- package/dist_ts/integrations/sonos/sonos.discovery.js +6 -114
- package/dist_ts/integrations/sonos/sonos.mapper.d.ts +2 -1
- package/dist_ts/integrations/sonos/sonos.mapper.js +33 -13
- package/dist_ts/integrations/sonos/sonos.matchers.d.ts +25 -0
- package/dist_ts/integrations/sonos/sonos.matchers.js +82 -0
- package/dist_ts/integrations/sonos/sonos.topology.d.ts +2 -0
- package/dist_ts/integrations/sonos/sonos.topology.js +59 -0
- package/dist_ts/integrations/sonos/sonos.types.d.ts +18 -8
- package/dist_ts/integrations/sonos/sonos.xml.d.ts +3 -0
- package/dist_ts/integrations/sonos/sonos.xml.js +21 -0
- package/dist_ts/integrations/soundtouch/soundtouch.classes.client.js +1 -1
- package/dist_ts/integrations/soundtouch/soundtouch.classes.integration.d.ts +1 -1
- package/dist_ts/integrations/soundtouch/soundtouch.classes.integration.js +1 -1
- package/dist_ts/integrations/soundtouch/soundtouch.discovery.d.ts +2 -2
- package/dist_ts/integrations/soundtouch/soundtouch.types.d.ts +1 -1
- package/dist_ts/integrations/squeezebox/squeezebox.classes.client.js +1 -1
- package/dist_ts/integrations/squeezebox/squeezebox.classes.integration.d.ts +1 -1
- package/dist_ts/integrations/squeezebox/squeezebox.classes.integration.js +1 -1
- package/dist_ts/integrations/squeezebox/squeezebox.discovery.d.ts +3 -3
- package/dist_ts/integrations/synology_dsm/synology_dsm.classes.client.js +1 -1
- package/dist_ts/integrations/synology_dsm/synology_dsm.classes.integration.d.ts +1 -1
- package/dist_ts/integrations/synology_dsm/synology_dsm.classes.integration.js +1 -1
- package/dist_ts/integrations/synology_dsm/synology_dsm.discovery.d.ts +4 -4
- package/dist_ts/integrations/synology_dsm/synology_dsm.mapper.js +1 -1
- package/dist_ts/integrations/synology_srm/synology_srm.classes.client.js +1 -1
- package/dist_ts/integrations/synology_srm/synology_srm.classes.integration.d.ts +1 -1
- package/dist_ts/integrations/synology_srm/synology_srm.classes.integration.js +1 -1
- package/dist_ts/integrations/synology_srm/synology_srm.discovery.d.ts +2 -2
- package/dist_ts/integrations/synology_srm/synology_srm.mapper.js +1 -1
- package/dist_ts/integrations/tasmota/index.d.ts +4 -0
- package/dist_ts/integrations/tasmota/index.js +5 -1
- package/dist_ts/integrations/tasmota/tasmota.classes.integration.d.ts +21 -3
- package/dist_ts/integrations/tasmota/tasmota.classes.integration.js +24 -25
- package/dist_ts/integrations/tasmota/tasmota.classes.runtime.d.ts +36 -0
- package/dist_ts/integrations/tasmota/tasmota.classes.runtime.js +292 -0
- package/dist_ts/integrations/tasmota/tasmota.config.d.ts +2 -0
- package/dist_ts/integrations/tasmota/tasmota.config.js +78 -0
- package/dist_ts/integrations/tasmota/tasmota.discovery.d.ts +7 -0
- package/dist_ts/integrations/tasmota/tasmota.discovery.js +85 -0
- package/dist_ts/integrations/tasmota/tasmota.mapper.d.ts +12 -0
- package/dist_ts/integrations/tasmota/tasmota.mapper.js +91 -0
- package/dist_ts/integrations/tasmota/tasmota.types.d.ts +51 -1
- package/dist_ts/integrations/tplink/index.d.ts +3 -0
- package/dist_ts/integrations/tplink/index.js +4 -1
- package/dist_ts/integrations/tplink/tplink.classes.client.d.ts +8 -14
- package/dist_ts/integrations/tplink/tplink.classes.client.js +64 -64
- package/dist_ts/integrations/tplink/tplink.classes.configflow.d.ts +3 -8
- package/dist_ts/integrations/tplink/tplink.classes.configflow.js +53 -89
- package/dist_ts/integrations/tplink/tplink.classes.integration.d.ts +8 -13
- package/dist_ts/integrations/tplink/tplink.classes.integration.js +136 -37
- package/dist_ts/integrations/tplink/tplink.discovery.d.ts +11 -14
- package/dist_ts/integrations/tplink/tplink.discovery.js +125 -210
- package/dist_ts/integrations/tplink/tplink.mapper.js +1 -1
- package/dist_ts/integrations/tplink/tplink.native.mapper.d.ts +11 -0
- package/dist_ts/integrations/tplink/tplink.native.mapper.js +61 -0
- package/dist_ts/integrations/tplink/tplink.native.types.d.ts +32 -0
- package/dist_ts/integrations/tplink/tplink.native.types.js +2 -0
- package/dist_ts/integrations/tplink/tplink.validation.d.ts +4 -0
- package/dist_ts/integrations/tplink/tplink.validation.js +48 -0
- package/dist_ts/integrations/tradfri/tradfri.classes.client.js +1 -1
- package/dist_ts/integrations/tradfri/tradfri.classes.integration.d.ts +1 -1
- package/dist_ts/integrations/tradfri/tradfri.classes.integration.js +1 -1
- package/dist_ts/integrations/tradfri/tradfri.discovery.d.ts +2 -3
- package/dist_ts/integrations/tradfri/tradfri.discovery.js +52 -26
- package/dist_ts/integrations/tradfri/tradfri.mapper.js +1 -1
- package/dist_ts/integrations/tuya/tuya.classes.integration.d.ts +21 -3
- package/dist_ts/integrations/tuya/tuya.classes.integration.js +139 -28
- package/dist_ts/integrations/tuya/tuya.classes.runtime.d.ts +15 -0
- package/dist_ts/integrations/tuya/tuya.classes.runtime.js +189 -0
- package/dist_ts/integrations/tuya/tuya.mapper.d.ts +13 -0
- package/dist_ts/integrations/tuya/tuya.mapper.js +30 -0
- package/dist_ts/integrations/tuya/tuya.types.d.ts +40 -1
- package/dist_ts/integrations/tuya/tuya.validation.d.ts +10 -0
- package/dist_ts/integrations/tuya/tuya.validation.js +122 -0
- package/dist_ts/integrations/unifi/unifi.classes.client.js +1 -1
- package/dist_ts/integrations/unifi/unifi.classes.integration.d.ts +1 -1
- package/dist_ts/integrations/unifi/unifi.classes.integration.js +1 -1
- package/dist_ts/integrations/unifi/unifi.discovery.d.ts +4 -4
- package/dist_ts/integrations/unifi/unifi.mapper.js +6 -6
- package/dist_ts/integrations/velbus/velbus.classes.client.js +1 -1
- package/dist_ts/integrations/velbus/velbus.classes.integration.d.ts +1 -1
- package/dist_ts/integrations/velbus/velbus.classes.integration.js +1 -1
- package/dist_ts/integrations/velbus/velbus.discovery.d.ts +2 -2
- package/dist_ts/integrations/volumio/volumio.classes.client.js +1 -1
- package/dist_ts/integrations/volumio/volumio.classes.integration.d.ts +1 -1
- package/dist_ts/integrations/volumio/volumio.classes.integration.js +1 -1
- package/dist_ts/integrations/volumio/volumio.discovery.d.ts +2 -2
- package/dist_ts/integrations/wake_on_lan/wake_on_lan.classes.client.js +1 -1
- package/dist_ts/integrations/wake_on_lan/wake_on_lan.classes.integration.d.ts +1 -1
- package/dist_ts/integrations/wake_on_lan/wake_on_lan.classes.integration.js +1 -1
- package/dist_ts/integrations/wake_on_lan/wake_on_lan.discovery.d.ts +2 -2
- package/dist_ts/integrations/wake_on_lan/wake_on_lan.mapper.js +1 -1
- package/dist_ts/integrations/wake_on_lan/wake_on_lan.packet.js +1 -1
- package/dist_ts/integrations/webostv/webostv.classes.client.d.ts +10 -4
- package/dist_ts/integrations/webostv/webostv.classes.client.js +370 -6
- package/dist_ts/integrations/webostv/webostv.classes.configflow.d.ts +3 -3
- package/dist_ts/integrations/webostv/webostv.classes.configflow.js +23 -6
- package/dist_ts/integrations/webostv/webostv.classes.integration.d.ts +20 -5
- package/dist_ts/integrations/webostv/webostv.classes.integration.js +138 -7
- package/dist_ts/integrations/webostv/webostv.discovery.d.ts +2 -1
- package/dist_ts/integrations/webostv/webostv.discovery.js +26 -4
- package/dist_ts/integrations/webostv/webostv.mapper.d.ts +6 -8
- package/dist_ts/integrations/webostv/webostv.mapper.js +24 -13
- package/dist_ts/integrations/webostv/webostv.types.d.ts +61 -5
- package/dist_ts/integrations/webostv/webostv.types.js +5 -96
- package/dist_ts/integrations/webostv/webostv.validation.d.ts +6 -0
- package/dist_ts/integrations/webostv/webostv.validation.js +54 -0
- package/dist_ts/integrations/wiz/wiz.classes.client.js +1 -1
- package/dist_ts/integrations/wiz/wiz.classes.integration.d.ts +7 -7
- package/dist_ts/integrations/wiz/wiz.classes.integration.js +1 -1
- package/dist_ts/integrations/wiz/wiz.discovery.d.ts +4 -4
- package/dist_ts/integrations/wiz/wiz.mapper.js +1 -1
- package/dist_ts/integrations/wled/index.d.ts +1 -0
- package/dist_ts/integrations/wled/index.js +2 -1
- package/dist_ts/integrations/wled/wled.classes.client.d.ts +27 -4
- package/dist_ts/integrations/wled/wled.classes.client.js +231 -6
- package/dist_ts/integrations/wled/wled.classes.configflow.d.ts +3 -3
- package/dist_ts/integrations/wled/wled.classes.configflow.js +33 -6
- package/dist_ts/integrations/wled/wled.classes.integration.d.ts +24 -4
- package/dist_ts/integrations/wled/wled.classes.integration.js +171 -7
- package/dist_ts/integrations/wled/wled.classes.subscription.d.ts +37 -0
- package/dist_ts/integrations/wled/wled.classes.subscription.js +116 -0
- package/dist_ts/integrations/wled/wled.commands.d.ts +4 -0
- package/dist_ts/integrations/wled/wled.commands.js +65 -0
- package/dist_ts/integrations/wled/wled.discovery.d.ts +17 -1
- package/dist_ts/integrations/wled/wled.discovery.js +68 -4
- package/dist_ts/integrations/wled/wled.errors.d.ts +5 -0
- package/dist_ts/integrations/wled/wled.errors.js +9 -0
- package/dist_ts/integrations/wled/wled.mapper.d.ts +8 -8
- package/dist_ts/integrations/wled/wled.mapper.js +40 -16
- package/dist_ts/integrations/wled/wled.types.d.ts +75 -6
- package/dist_ts/integrations/wled/wled.types.js +12 -82
- package/dist_ts/integrations/wled/wled.validation.d.ts +7 -0
- package/dist_ts/integrations/wled/wled.validation.js +85 -0
- package/dist_ts/integrations/wolf_smartset/wolf_smartset.classes.client.js +1 -1
- package/dist_ts/integrations/wolf_smartset/wolf_smartset.classes.integration.d.ts +1 -1
- package/dist_ts/integrations/wolf_smartset/wolf_smartset.discovery.d.ts +1 -1
- package/dist_ts/integrations/xiaomi_miio/xiaomi_miio.classes.client.js +1 -1
- package/dist_ts/integrations/xiaomi_miio/xiaomi_miio.classes.integration.d.ts +1 -1
- package/dist_ts/integrations/xiaomi_miio/xiaomi_miio.classes.integration.js +1 -1
- package/dist_ts/integrations/xiaomi_miio/xiaomi_miio.discovery.d.ts +3 -3
- package/dist_ts/integrations/xiaomi_miio/xiaomi_miio.mapper.js +1 -1
- package/dist_ts/integrations/yamaha_musiccast/yamaha_musiccast.classes.client.js +1 -1
- package/dist_ts/integrations/yamaha_musiccast/yamaha_musiccast.classes.integration.d.ts +1 -1
- package/dist_ts/integrations/yamaha_musiccast/yamaha_musiccast.classes.integration.js +1 -1
- package/dist_ts/integrations/yamaha_musiccast/yamaha_musiccast.discovery.d.ts +3 -3
- package/dist_ts/integrations/yeelight/yeelight.classes.client.d.ts +34 -26
- package/dist_ts/integrations/yeelight/yeelight.classes.client.js +225 -275
- package/dist_ts/integrations/yeelight/yeelight.classes.configflow.d.ts +0 -2
- package/dist_ts/integrations/yeelight/yeelight.classes.configflow.js +29 -30
- package/dist_ts/integrations/yeelight/yeelight.classes.integration.d.ts +11 -5
- package/dist_ts/integrations/yeelight/yeelight.classes.integration.js +140 -80
- package/dist_ts/integrations/yeelight/yeelight.discovery.d.ts +11 -13
- package/dist_ts/integrations/yeelight/yeelight.discovery.js +90 -128
- package/dist_ts/integrations/yeelight/yeelight.mapper.d.ts +2 -10
- package/dist_ts/integrations/yeelight/yeelight.mapper.js +57 -178
- package/dist_ts/integrations/yeelight/yeelight.types.d.ts +37 -139
- package/dist_ts/integrations/yeelight/yeelight.validation.d.ts +10 -0
- package/dist_ts/integrations/yeelight/yeelight.validation.js +111 -0
- package/dist_ts/integrations/zha/zha.classes.client.js +1 -1
- package/dist_ts/integrations/zha/zha.classes.integration.d.ts +1 -1
- package/dist_ts/integrations/zha/zha.classes.integration.js +1 -1
- package/dist_ts/integrations/zha/zha.discovery.d.ts +3 -12
- package/dist_ts/integrations/zha/zha.discovery.js +102 -222
- package/dist_ts/integrations/zha/zha.discoveryvalidation.d.ts +10 -0
- package/dist_ts/integrations/zha/zha.discoveryvalidation.js +71 -0
- package/dist_ts/integrations/zha/zha.mapper.js +1 -1
- package/dist_ts/integrations/zigbee2mqtt/index.d.ts +5 -0
- package/dist_ts/integrations/zigbee2mqtt/index.js +6 -0
- package/dist_ts/integrations/zigbee2mqtt/zigbee2mqtt.classes.configflow.d.ts +5 -0
- package/dist_ts/integrations/zigbee2mqtt/zigbee2mqtt.classes.configflow.js +27 -0
- package/dist_ts/integrations/zigbee2mqtt/zigbee2mqtt.classes.integration.d.ts +19 -0
- package/dist_ts/integrations/zigbee2mqtt/zigbee2mqtt.classes.integration.js +19 -0
- package/dist_ts/integrations/zigbee2mqtt/zigbee2mqtt.classes.runtime.d.ts +55 -0
- package/dist_ts/integrations/zigbee2mqtt/zigbee2mqtt.classes.runtime.js +464 -0
- package/dist_ts/integrations/zigbee2mqtt/zigbee2mqtt.mapper.d.ts +15 -0
- package/dist_ts/integrations/zigbee2mqtt/zigbee2mqtt.mapper.js +186 -0
- package/dist_ts/integrations/zigbee2mqtt/zigbee2mqtt.types.d.ts +57 -0
- package/dist_ts/integrations/zigbee2mqtt/zigbee2mqtt.types.js +2 -0
- package/dist_ts/integrations/zigbee2mqtt/zigbee2mqtt.validation.d.ts +5 -0
- package/dist_ts/integrations/zigbee2mqtt/zigbee2mqtt.validation.js +66 -0
- package/dist_ts/integrations/zwave_js/zwave_js.classes.client.d.ts +19 -21
- package/dist_ts/integrations/zwave_js/zwave_js.classes.client.js +303 -134
- package/dist_ts/integrations/zwave_js/zwave_js.classes.configflow.d.ts +0 -3
- package/dist_ts/integrations/zwave_js/zwave_js.classes.configflow.js +31 -26
- package/dist_ts/integrations/zwave_js/zwave_js.classes.integration.d.ts +2 -1
- package/dist_ts/integrations/zwave_js/zwave_js.classes.integration.js +71 -76
- package/dist_ts/integrations/zwave_js/zwave_js.discovery.d.ts +3 -3
- package/dist_ts/integrations/zwave_js/zwave_js.discovery.js +120 -16
- package/dist_ts/integrations/zwave_js/zwave_js.mapper.d.ts +13 -14
- package/dist_ts/integrations/zwave_js/zwave_js.mapper.js +140 -257
- package/dist_ts/integrations/zwave_js/zwave_js.types.d.ts +30 -19
- package/dist_ts/integrations/zwave_js/zwave_js.validation.d.ts +15 -0
- package/dist_ts/integrations/zwave_js/zwave_js.validation.js +191 -0
- package/dist_ts/plugins.d.ts +10 -2
- package/dist_ts/plugins.js +11 -3
- package/dist_ts_migration/001.import-json-config.d.ts +10 -0
- package/dist_ts_migration/001.import-json-config.js +147 -0
- package/dist_ts_migration/index.d.ts +1 -0
- package/dist_ts_migration/index.js +2 -0
- package/package.json +20 -11
- package/readme.md +48 -9
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/core/classes.configrecord.ts +23 -0
- package/ts/core/classes.configstore.ts +324 -25
- package/ts/core/classes.discoveryengine.ts +11 -1
- package/ts/core/types.ts +15 -4
- package/ts/index.ts +6 -0
- package/ts/integrations/deconz/deconz.classes.client.ts +243 -190
- package/ts/integrations/deconz/deconz.classes.configflow.ts +34 -25
- package/ts/integrations/deconz/deconz.classes.integration.ts +105 -22
- package/ts/integrations/deconz/deconz.mapper.ts +24 -18
- package/ts/integrations/deconz/deconz.types.ts +38 -3
- package/ts/integrations/deconz/deconz.validation.ts +261 -0
- package/ts/integrations/deconz/readme.md +44 -0
- package/ts/integrations/esphome/esphome.classes.client.ts +254 -74
- package/ts/integrations/esphome/esphome.classes.configflow.ts +1 -3
- package/ts/integrations/esphome/esphome.classes.integration.ts +61 -66
- package/ts/integrations/esphome/esphome.discovery.ts +1 -1
- package/ts/integrations/esphome/esphome.mapper.ts +71 -37
- package/ts/integrations/esphome/esphome.types.ts +2 -0
- package/ts/integrations/esphome/readme.md +66 -0
- package/ts/integrations/generated/index.ts +4 -6
- package/ts/integrations/homeassistant/homeassistant.classes.client.ts +166 -63
- package/ts/integrations/homeassistant/homeassistant.classes.runtime.ts +41 -3
- package/ts/integrations/homeassistant/homeassistant.mapper.ts +32 -36
- package/ts/integrations/homeassistant/homeassistant.types.ts +11 -0
- package/ts/integrations/homeassistant/homeassistant.validation.ts +139 -0
- package/ts/integrations/homeassistant/readme.md +40 -0
- package/ts/integrations/hue/hue.classes.client.ts +251 -21
- package/ts/integrations/hue/hue.classes.configflow.ts +26 -13
- package/ts/integrations/hue/hue.classes.integration.ts +76 -30
- package/ts/integrations/hue/hue.discovery.ts +61 -26
- package/ts/integrations/hue/hue.mapper.ts +28 -60
- package/ts/integrations/hue/hue.types.ts +12 -18
- package/ts/integrations/hue/hue.validation.ts +154 -0
- package/ts/integrations/hue/readme.md +71 -0
- package/ts/integrations/index.ts +5 -1
- package/ts/integrations/lifx/lifx.classes.client.ts +95 -6
- package/ts/integrations/lifx/lifx.classes.configflow.ts +32 -5
- package/ts/integrations/lifx/lifx.classes.integration.ts +142 -7
- package/ts/integrations/lifx/lifx.discovery.ts +26 -3
- package/ts/integrations/lifx/lifx.mapper.ts +45 -17
- package/ts/integrations/lifx/lifx.types.ts +51 -125
- package/ts/integrations/lifx/lifx.validation.ts +86 -0
- package/ts/integrations/lifx/readme.md +55 -0
- package/ts/integrations/mqtt/mqtt.classes.client.ts +394 -366
- package/ts/integrations/mqtt/mqtt.classes.configflow.ts +22 -18
- package/ts/integrations/mqtt/mqtt.classes.integration.ts +119 -44
- package/ts/integrations/mqtt/mqtt.mapper.ts +139 -47
- package/ts/integrations/mqtt/mqtt.types.ts +19 -0
- package/ts/integrations/mqtt/readme.md +28 -0
- package/ts/integrations/openhome/openhome.classes.client.ts +22 -18
- package/ts/integrations/roku/readme.md +95 -0
- package/ts/integrations/roku/roku.classes.client.ts +194 -131
- package/ts/integrations/roku/roku.classes.configflow.ts +20 -13
- package/ts/integrations/roku/roku.classes.integration.ts +69 -98
- package/ts/integrations/roku/roku.discovery.ts +68 -71
- package/ts/integrations/roku/roku.mapper.ts +17 -52
- package/ts/integrations/roku/roku.types.ts +23 -14
- package/ts/integrations/roku/roku.validation.ts +79 -0
- package/ts/integrations/samsungtv/readme.md +30 -0
- package/ts/integrations/samsungtv/samsungtv.classes.client.ts +107 -481
- package/ts/integrations/samsungtv/samsungtv.classes.configflow.ts +28 -29
- package/ts/integrations/samsungtv/samsungtv.classes.integration.ts +108 -132
- package/ts/integrations/samsungtv/samsungtv.discovery.ts +101 -165
- package/ts/integrations/samsungtv/samsungtv.mapper.ts +20 -127
- package/ts/integrations/samsungtv/samsungtv.types.ts +18 -95
- package/ts/integrations/samsungtv/samsungtv.validation.ts +84 -0
- package/ts/integrations/shelly/readme.md +34 -0
- package/ts/integrations/shelly/shelly.classes.client.ts +275 -137
- package/ts/integrations/shelly/shelly.classes.configflow.ts +24 -10
- package/ts/integrations/shelly/shelly.classes.integration.ts +109 -32
- package/ts/integrations/shelly/shelly.classes.subscription.ts +218 -0
- package/ts/integrations/shelly/shelly.discovery.ts +5 -2
- package/ts/integrations/shelly/shelly.rpc.ts +190 -0
- package/ts/integrations/shelly/shelly.types.ts +16 -4
- package/ts/integrations/sonos/index.ts +3 -0
- package/ts/integrations/sonos/readme.md +74 -0
- package/ts/integrations/sonos/sonos.classes.client.ts +153 -225
- package/ts/integrations/sonos/sonos.classes.configflow.ts +21 -8
- package/ts/integrations/sonos/sonos.classes.integration.ts +234 -72
- package/ts/integrations/sonos/sonos.classes.ssdpprobe.ts +85 -0
- package/ts/integrations/sonos/sonos.config.ts +57 -0
- package/ts/integrations/sonos/sonos.discovery.ts +5 -123
- package/ts/integrations/sonos/sonos.mapper.ts +29 -13
- package/ts/integrations/sonos/sonos.matchers.ts +83 -0
- package/ts/integrations/sonos/sonos.topology.ts +54 -0
- package/ts/integrations/sonos/sonos.types.ts +20 -8
- package/ts/integrations/sonos/sonos.xml.ts +19 -0
- package/ts/integrations/tasmota/index.ts +4 -0
- package/ts/integrations/tasmota/readme.md +33 -0
- package/ts/integrations/tasmota/tasmota.classes.integration.ts +27 -24
- package/ts/integrations/tasmota/tasmota.classes.runtime.ts +274 -0
- package/ts/integrations/tasmota/tasmota.config.ts +69 -0
- package/ts/integrations/tasmota/tasmota.discovery.ts +84 -0
- package/ts/integrations/tasmota/tasmota.mapper.ts +88 -0
- package/ts/integrations/tasmota/tasmota.types.ts +48 -2
- package/ts/integrations/tplink/index.ts +3 -0
- package/ts/integrations/tplink/readme.md +38 -0
- package/ts/integrations/tplink/tplink.classes.client.ts +56 -75
- package/ts/integrations/tplink/tplink.classes.configflow.ts +48 -100
- package/ts/integrations/tplink/tplink.classes.integration.ts +118 -40
- package/ts/integrations/tplink/tplink.discovery.ts +106 -235
- package/ts/integrations/tplink/tplink.native.mapper.ts +67 -0
- package/ts/integrations/tplink/tplink.native.types.ts +32 -0
- package/ts/integrations/tplink/tplink.validation.ts +50 -0
- package/ts/integrations/tradfri/tradfri.discovery.ts +52 -26
- package/ts/integrations/tuya/readme.md +106 -0
- package/ts/integrations/tuya/tuya.classes.integration.ts +127 -28
- package/ts/integrations/tuya/tuya.classes.runtime.ts +166 -0
- package/ts/integrations/tuya/tuya.mapper.ts +47 -0
- package/ts/integrations/tuya/tuya.types.ts +47 -2
- package/ts/integrations/tuya/tuya.validation.ts +118 -0
- package/ts/integrations/unifi/unifi.mapper.ts +8 -5
- package/ts/integrations/webostv/readme.md +48 -0
- package/ts/integrations/webostv/webostv.classes.client.ts +297 -6
- package/ts/integrations/webostv/webostv.classes.configflow.ts +18 -5
- package/ts/integrations/webostv/webostv.classes.integration.ts +92 -7
- package/ts/integrations/webostv/webostv.discovery.ts +22 -3
- package/ts/integrations/webostv/webostv.mapper.ts +27 -18
- package/ts/integrations/webostv/webostv.types.ts +47 -101
- package/ts/integrations/webostv/webostv.validation.ts +48 -0
- package/ts/integrations/wled/index.ts +1 -0
- package/ts/integrations/wled/readme.md +83 -0
- package/ts/integrations/wled/wled.classes.client.ts +208 -6
- package/ts/integrations/wled/wled.classes.configflow.ts +26 -5
- package/ts/integrations/wled/wled.classes.integration.ts +142 -7
- package/ts/integrations/wled/wled.classes.subscription.ts +122 -0
- package/ts/integrations/wled/wled.commands.ts +54 -0
- package/ts/integrations/wled/wled.discovery.ts +52 -3
- package/ts/integrations/wled/wled.errors.ts +9 -0
- package/ts/integrations/wled/wled.mapper.ts +39 -19
- package/ts/integrations/wled/wled.types.ts +59 -87
- package/ts/integrations/wled/wled.validation.ts +72 -0
- package/ts/integrations/yeelight/readme.md +47 -0
- package/ts/integrations/yeelight/yeelight.classes.client.ts +201 -302
- package/ts/integrations/yeelight/yeelight.classes.configflow.ts +23 -32
- package/ts/integrations/yeelight/yeelight.classes.integration.ts +115 -87
- package/ts/integrations/yeelight/yeelight.discovery.ts +78 -140
- package/ts/integrations/yeelight/yeelight.mapper.ts +61 -191
- package/ts/integrations/yeelight/yeelight.types.ts +31 -162
- package/ts/integrations/yeelight/yeelight.validation.ts +112 -0
- package/ts/integrations/zha/readme.md +23 -0
- package/ts/integrations/zha/zha.discovery.ts +92 -232
- package/ts/integrations/zha/zha.discoveryvalidation.ts +67 -0
- package/ts/integrations/zigbee2mqtt/index.ts +5 -0
- package/ts/integrations/zigbee2mqtt/readme.md +40 -0
- package/ts/integrations/zigbee2mqtt/zigbee2mqtt.classes.configflow.ts +26 -0
- package/ts/integrations/zigbee2mqtt/zigbee2mqtt.classes.integration.ts +23 -0
- package/ts/integrations/zigbee2mqtt/zigbee2mqtt.classes.runtime.ts +414 -0
- package/ts/integrations/zigbee2mqtt/zigbee2mqtt.mapper.ts +172 -0
- package/ts/integrations/zigbee2mqtt/zigbee2mqtt.types.ts +63 -0
- package/ts/integrations/zigbee2mqtt/zigbee2mqtt.validation.ts +65 -0
- package/ts/integrations/zwave_js/readme.md +23 -0
- package/ts/integrations/zwave_js/zwave_js.classes.client.ts +256 -136
- package/ts/integrations/zwave_js/zwave_js.classes.configflow.ts +26 -28
- package/ts/integrations/zwave_js/zwave_js.classes.integration.ts +65 -81
- package/ts/integrations/zwave_js/zwave_js.discovery.ts +100 -15
- package/ts/integrations/zwave_js/zwave_js.mapper.ts +129 -256
- package/ts/integrations/zwave_js/zwave_js.types.ts +32 -19
- package/ts/integrations/zwave_js/zwave_js.validation.ts +191 -0
- package/ts/plugins.ts +12 -3
- package/ts_migration/001.import-json-config.ts +81 -0
- package/ts_migration/index.ts +1 -0
- package/ts/integrations/tasmota/.generated-by-smarthome-exchange +0 -1
- package/ts/integrations/tuya/.generated-by-smarthome-exchange +0 -1
package/readme.md
CHANGED
|
@@ -30,11 +30,13 @@ const candidates = await engine.runActiveDiscovery({});
|
|
|
30
30
|
console.log(candidates);
|
|
31
31
|
```
|
|
32
32
|
|
|
33
|
+
Pass `abortSignal` to `runActiveDiscovery()` to cancel discovery. Cancellation rejects with the caller's original reason even when an admitted probe reports its own error after abort, admits no further probes, and does not return a partial candidate list. An uncancelled probe failure preserves the probe's original error. Each admitted probe remains responsible for closing its owned resources.
|
|
34
|
+
|
|
33
35
|
## Public Surface
|
|
34
36
|
|
|
35
37
|
| Export group | What it gives you |
|
|
36
38
|
| --- | --- |
|
|
37
|
-
| Core classes | `BaseIntegration`, `DescriptorOnlyIntegration`, `DiscoveryDescriptor`, `DiscoveryEngine`, `IntegrationRegistry`, `IntegrationRuntimeManager`, `ConsoleLogger`, `
|
|
39
|
+
| Core classes | `BaseIntegration`, `DescriptorOnlyIntegration`, `DiscoveryDescriptor`, `DiscoveryEngine`, `IntegrationRegistry`, `IntegrationRuntimeManager`, `ConsoleLogger`, `NoSqlConfigStore`. |
|
|
38
40
|
| Core errors | `IntegrationError`, `DiscoveryError`, `AuthenticationError`, `DeviceCommunicationError`. |
|
|
39
41
|
| Core types | Discovery, config-flow, runtime, service-call, entity, logging, and integration status contracts. |
|
|
40
42
|
| Protocol namespaces | `mdns`, `ssdp`, `http`, `mqtt`, `bluetooth`, and `usb` descriptor helpers. |
|
|
@@ -42,6 +44,43 @@ console.log(candidates);
|
|
|
42
44
|
| Generated metadata | `generatedHomeAssistantPortIntegrations`, `generatedHomeAssistantPortCount`, and `handwrittenHomeAssistantPortDomains`. |
|
|
43
45
|
| Handwritten modules | All handwritten integration folders are re-exported from `ts/integrations/index.ts`. |
|
|
44
46
|
|
|
47
|
+
## Durable Integration Config
|
|
48
|
+
|
|
49
|
+
`NoSqlConfigStore` implements `IConfigStore` through the public document-model APIs of `@lossless.org/client/nosqldb`. It replaces `JsonFileConfigStore`; application config is no longer persisted on the filesystem. Supply a connected, caller-owned `SmartdataDb`, an authenticated home ID, an integration domain and an external key provider:
|
|
50
|
+
|
|
51
|
+
This is a breaking API change: remove the `JsonFileConfigStore` import and replace `new JsonFileConfigStore(filePath)` with the options-based constructor below. Await `initialize()` before passing the store to integration contexts. Existing `IConfigStore` calls to `get()`, `set()`, `delete()` and `list()` remain valid; each also accepts optional transaction options. Existing JSON files are not read automatically; import them explicitly with the migration described below before switching the application to the new store. The database and encryption-key provider are required to keep config durable, scoped and encrypted.
|
|
52
|
+
|
|
53
|
+
```ts
|
|
54
|
+
import { NoSqlConfigStore } from '@smarthome.exchange/integrations';
|
|
55
|
+
|
|
56
|
+
const store = new NoSqlConfigStore({
|
|
57
|
+
db,
|
|
58
|
+
homeId: authenticatedHome.id,
|
|
59
|
+
integrationDomain: 'hue',
|
|
60
|
+
keyProvider: {
|
|
61
|
+
currentKey: (signal) => secretProvider.currentEncryptionKey(signal),
|
|
62
|
+
keyForId: (keyId, signal) => secretProvider.encryptionKeyById(keyId, signal),
|
|
63
|
+
},
|
|
64
|
+
});
|
|
65
|
+
await store.initialize();
|
|
66
|
+
await store.set('bridge', bridgeConfig);
|
|
67
|
+
const restoredConfig = await store.get('bridge');
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
`db`, `authenticatedHome`, `bridgeConfig` and `secretProvider` are application-owned collaborators. The store neither creates nor closes the database. Initialize it before opening a transaction so its indexes are ready. Choose its immutable home/domain scope from authorized server context. `IConfigStore` injection remains available in discovery, config-flow and setup contexts.
|
|
71
|
+
|
|
72
|
+
`getScope()` returns a new frozen `IConfigStoreScope` containing the immutable `homeId` and `integrationDomain` captured at construction. The snapshot remains available after close and contains no database or encryption credentials. `IConfigStore` exposes this capability optionally; integrations requiring scoped storage must reject a missing or mismatched scope before accessing config. A scope declaration does not grant home access: compare it against verified server context.
|
|
73
|
+
|
|
74
|
+
`initialize({ signal })` prepares the declared collection and indexes through the client's public `prepareCollection()` API. The configured `timeoutMs` bounds the entire preparation, including waiting for another preparation and cleanup; an optional caller signal cancels that caller's attempt. Failed or cancelled preparation can be retried on the same open store. Await `close()` during shutdown: it stops admission, cancels this store's preparation and key lookups, refuses queued operations and joins admitted work before resolving. In-flight database operations and caller-owned transactions retain their client deadlines and ownership; close does not close the database, session or key provider. A closed store cannot be reopened.
|
|
75
|
+
|
|
76
|
+
Every config value, including credentials, is encrypted with AES-256-GCM and a fresh 12-byte nonce. `currentKey(signal)` returns `{ id, key }`, where `key` contains exactly 32 bytes; `keyForId(id, signal)` resolves an older key or returns `undefined`. Keep keys in an external secret provider, preserve old keys while records still reference them, and honor cancellation. The store binds the ciphertext to its schema version, key ID, home ID, integration domain and config key. A missing key, corrupt envelope or failed authentication rejects the read. Normal writes use the current key, so rewriting a value rotates its encryption without changing its scope.
|
|
77
|
+
|
|
78
|
+
The database stores one document per config key with unique scope indexes. Atomic writes preserve unrelated keys across independent instances; `get()` does not cache values. Operations on one store execute in invocation order, including read-after-write ordering. Admission defaults to 1,000 active/queued operations and rejects at capacity; failures release admission. `timeoutMs` defaults to 5,000 and bounds each key-provider lookup and each database call outside a transaction. Values must be finite JSON data, with dense arrays and plain objects, at most 32 levels deep and 64 KiB by default. Optional object fields whose value is `undefined` are omitted; `undefined` array elements and top-level values reject. `maxValueBytes` can raise that limit to 1 MiB; large payloads belong in object storage. `create()` inserts without replacing an existing key.
|
|
79
|
+
|
|
80
|
+
All config operations accept `IConfigStoreOperationOptions` with a public `SmartdataSession` from the same database. Call `initialize()` before starting a transaction, then sequentially await `get(key, { session })`, `set(key, value, { session })`, `create(key, value, { session })`, `delete(key, { session })` and `list(prefix, { session })` inside `session.withTransaction(callback, { timeoutMS, signal })`. Reads and lists see that transaction's writes, and config writes can commit or roll back with another model's ownership-lease update. The caller owns commit, rollback and session close. Session-carrying operations omit their database timeout because the caller's transaction supplies it; always provide a transaction deadline. Key lookup keeps its separate store deadline, so cancellation during a lookup waits for that lookup to settle or time out before the transaction rejects. No database operation is detached on timeout; the client settles its operation and rollback cleanup before rejecting. Do not retry an unknown commit outcome: inspect `SmartdataSession.getCommitOutcome(error)` and reconcile durable state first.
|
|
81
|
+
|
|
82
|
+
Existing JSON files can be imported explicitly through `importLegacyJsonConfig()` from `@smarthome.exchange/integrations/migration`. Pass the same store options plus `sourcePath`. The versioned module under `ts_migration/` reads at most 1 MiB, requires an object root, and uses one transaction to insert all values and record completion. Any existing config key refuses the entire import. Re-running the same completed source returns `{ applied: false, importedKeys }` without replacing subsequent edits; a changed source rejects. The source file is never written, renamed or removed, and no file import runs implicitly during normal store initialization. Migration requires a database supporting transactions.
|
|
83
|
+
|
|
45
84
|
## Integration Lifecycle
|
|
46
85
|
|
|
47
86
|
```ts
|
|
@@ -52,14 +91,11 @@ if (!integration) {
|
|
|
52
91
|
}
|
|
53
92
|
|
|
54
93
|
const matches = await engine.validateCandidate({
|
|
55
|
-
id: '
|
|
94
|
+
id: '001788fffe123456',
|
|
56
95
|
source: 'manual',
|
|
57
96
|
integrationDomain: 'hue',
|
|
58
97
|
host: '192.168.1.20',
|
|
59
98
|
name: 'Office Hue Bridge',
|
|
60
|
-
metadata: {
|
|
61
|
-
baseUrl: 'https://192.168.1.20',
|
|
62
|
-
},
|
|
63
99
|
});
|
|
64
100
|
|
|
65
101
|
console.log(matches);
|
|
@@ -71,14 +107,15 @@ Runtime setup receives an optional abort signal. Device snapshots, subscriptions
|
|
|
71
107
|
|
|
72
108
|
## Home Assistant Runtime
|
|
73
109
|
|
|
74
|
-
The handwritten `homeassistant` integration connects to `/api/websocket` with a long-lived access token held only in runtime configuration. Setup does not become ready until Home Assistant has delivered the first complete entity snapshot. The official connection owns socket reconnection and subscription restoration; disconnects mark normalized devices offline immediately. Each reconnect remains unready until an authoritative state refresh
|
|
110
|
+
The handwritten `homeassistant` integration connects to `/api/websocket` with a long-lived access token held only in runtime configuration. Setup does not become ready until Home Assistant has delivered the first complete entity snapshot. The official connection owns socket reconnection and subscription restoration; disconnects mark normalized devices offline immediately. Each reconnect remains unready until an authoritative state refresh, a fresh service catalogue, and a fresh entity-registry provenance check all succeed. Failed reconnect refreshes use adapter-owned exponential backoff from 1 through 30 seconds. If the socket reconnects during strict startup, validation restarts against the current connection generation before setup may succeed. While an authoritative snapshot or registry refresh is pending, only selected state events are retained, coalesced by entity ID, and replayed onto the snapshot.
|
|
75
111
|
|
|
76
|
-
Optional `entityIds` and `entityDomains` are allowlists with intersection semantics when both are present. Set `requireEntityIds: true` to fail setup when any configured entity is absent. Set `requireEntityRegistry: true` together with `requireEntityIds` to require Home Assistant's `config/entity_registry/list_for_display` response
|
|
112
|
+
Optional `entityIds` and `entityDomains` are allowlists with intersection semantics when both are present. Set `requireEntityIds: true` to fail setup when any configured entity is absent. Set `requireEntityRegistry: true` together with `requireEntityIds` to require an entry for every selected entity in Home Assistant's `config/entity_registry/list_for_display` response. Every setup records available entity integration platforms in `metadata.homeAssistantPlatform`. The runtime exposes read-only state for all selected entities, controlled power and percentage brightness for supported lights, power for switches and input booleans, energy telemetry for power and energy sensors, and supported write-only vacuum commands. It does not expose unrestricted Home Assistant service calls.
|
|
77
113
|
|
|
78
114
|
```ts
|
|
79
115
|
import { HomeAssistantHomeassistantIntegration } from "@smarthome.exchange/integrations";
|
|
80
116
|
|
|
81
117
|
const runtime = await new HomeAssistantHomeassistantIntegration().setup({
|
|
118
|
+
homeId: "house-a",
|
|
82
119
|
baseUrl: "http://homeassistant.local:8123",
|
|
83
120
|
accessToken: homeAssistantToken,
|
|
84
121
|
entityDomains: ["light", "sensor", "switch", "vacuum"],
|
|
@@ -96,7 +133,7 @@ try {
|
|
|
96
133
|
}
|
|
97
134
|
```
|
|
98
135
|
|
|
99
|
-
`baseUrl` and `accessToken` are required. `entityIds` and `entityDomains` are optional intersecting allowlists. Required-entity and registry checks need a non-empty `entityIds` allowlist; registry enforcement also requires required-entity enforcement, and every required entity's domain must be allowed by `entityDomains` when that filter is present. `setupRetry` must be a finite non-negative integer and controls the adapter-owned, abortable retry loop; each official websocket connection/socket call receives `setupRetry: 0` so it cannot start an unbounded nested retry. `initialSnapshotTimeoutMs` is a timer-safe integer from 1 through 2,147,483,647 and provides one shared deadline for socket creation and authentication, initial subscription acknowledgement, the first complete entity snapshot, and
|
|
136
|
+
`homeId`, `baseUrl` and `accessToken` are required. Device and entity IDs include the configured home and a stable hash of the endpoint origin; writes validate that immutable scope and the current canonical device/feature before dispatch. The integration always fetches real service and entity-registry catalogues before readiness, and only currently advertised service controls are writable. Catalogue-change events and reconnects refresh all three authoritative snapshots. See the [Home Assistant runtime](ts/integrations/homeassistant/readme.md) for the configuration migration and exact boundaries. `entityIds` and `entityDomains` are optional intersecting allowlists. Required-entity and registry checks need a non-empty `entityIds` allowlist; registry enforcement also requires required-entity enforcement, and every required entity's domain must be allowed by `entityDomains` when that filter is present. `setupRetry` must be a finite non-negative integer and controls the adapter-owned, abortable retry loop; each official websocket connection/socket call receives `setupRetry: 0` so it cannot start an unbounded nested retry. `initialSnapshotTimeoutMs` is a timer-safe integer from 1 through 2,147,483,647 and provides one shared deadline for socket creation and authentication, initial subscription acknowledgement, the first complete entity snapshot, live service catalogue and entity-registry provenance. `serviceCallTimeoutMs` has the same range, defaults to 15 seconds, and bounds every write even when the caller does not supply an abort signal. Aborted or timed-out writes cancel the pending command by forcing the owned connection through its normal reconnect lifecycle. Required-entity loss blocks health and writes; recreation remains unready until registry provenance is revalidated. Among Home Assistant entity state values, `unknown` remains present and online with an unknown value while `unavailable` marks an entity offline; socket disconnection also marks normalized devices offline immediately.
|
|
100
137
|
|
|
101
138
|
The runtime requires native WebSocket support from Node.js 22.4 or newer. Production packaging must verify that runtime version. Hue, ZHA/SkyConnect, Roborock, Huawei SUN2000, and FHEM/MQTT entities remain subject to live-device acceptance testing; SUN2000 settings are not writable through this generic allowlist, and the adapter itself does not claim that those upstream integrations are configured.
|
|
102
139
|
|
|
@@ -110,7 +147,9 @@ Current generated metadata is exposed through `generatedHomeAssistantPortCount`
|
|
|
110
147
|
|
|
111
148
|
The default `integrations` array registers handwritten integrations tracked by `handwrittenHomeAssistantPortDomains` plus custom integrations such as Wolf Smartset. These handwritten folders are exported as named modules and registered before generated descriptors, so handwritten code wins whenever a generated Home Assistant descriptor has the same domain.
|
|
112
149
|
|
|
113
|
-
Examples include Home Assistant, Hue, AdGuard, AirGradient, Amcrest, Android TV, APC UPSD, ASUSWRT, Axis, BleBox, Bosch SHC, Broadlink, deCONZ, Denon AVR, DSMR, ESPHome, Fritz, HomeKit Controller, Homematic, KNX, Kodi, Matter, MQTT, Nanoleaf, ONVIF, Pi-hole, Plex, Roku, Shelly, Sonos, Synology DSM, TP-Link, Tradfri, UniFi, Wolf Smartset, Xiaomi Miio, Yeelight, ZHA, and Z-Wave JS.
|
|
150
|
+
Examples include Home Assistant, Hue, AdGuard, AirGradient, Amcrest, Android TV, APC UPSD, ASUSWRT, Axis, BleBox, Bosch SHC, Broadlink, deCONZ, Denon AVR, DSMR, ESPHome, Fritz, HomeKit Controller, Homematic, KNX, Kodi, Matter, MQTT, Nanoleaf, ONVIF, Pi-hole, Plex, Roku, Shelly, Sonos, Synology DSM, Tasmota, TP-Link, Tradfri, UniFi, Wolf Smartset, Xiaomi Miio, Yeelight, ZHA, and Z-Wave JS.
|
|
151
|
+
|
|
152
|
+
The native [Tasmota runtime](./ts/integrations/tasmota/readme.md) connects selected devices directly through MQTT. It provides relay and single-channel brightness controls plus read-only sensor telemetry, requires fresh device state before writes, and is registered as `control-runtime` rather than a generated descriptor.
|
|
114
153
|
|
|
115
154
|
The generator updates the barrel export file during `pnpm generate:ha`, so the named export surface stays aligned with preserved handwritten folders instead of drifting back to a short manual list.
|
|
116
155
|
|
package/ts/00_commitinfo_data.ts
CHANGED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import * as plugins from '../plugins.js';
|
|
2
|
+
|
|
3
|
+
export interface IEncryptedConfigValue {
|
|
4
|
+
version: 1;
|
|
5
|
+
keyId: string;
|
|
6
|
+
nonce: string;
|
|
7
|
+
ciphertext: string;
|
|
8
|
+
tag: string;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
@plugins.nosqldb.managed({ collectionName: 'shx_integration_config' })
|
|
12
|
+
@plugins.nosqldb.namedIndex({
|
|
13
|
+
name: 'integration_config_scope',
|
|
14
|
+
key: { homeId: 1, integrationDomain: 1, key: 1 },
|
|
15
|
+
options: { unique: true },
|
|
16
|
+
})
|
|
17
|
+
export class IntegrationConfigRecord extends plugins.nosqldb.SmartDataDbDoc<IntegrationConfigRecord, IntegrationConfigRecord> {
|
|
18
|
+
@plugins.nosqldb.unI({ indexName: 'integration_config_identity' }) public id!: string;
|
|
19
|
+
@plugins.nosqldb.svDb() public homeId!: string;
|
|
20
|
+
@plugins.nosqldb.svDb() public integrationDomain!: string;
|
|
21
|
+
@plugins.nosqldb.svDb() public key!: string;
|
|
22
|
+
@plugins.nosqldb.svDb() public encryptedValue!: IEncryptedConfigValue;
|
|
23
|
+
}
|
|
@@ -1,42 +1,341 @@
|
|
|
1
1
|
import * as plugins from '../plugins.js';
|
|
2
|
-
import type
|
|
2
|
+
import { IntegrationConfigRecord, type IEncryptedConfigValue } from './classes.configrecord.js';
|
|
3
|
+
import type { IConfigStore, IConfigStoreOperationOptions, IConfigStoreScope } from './types.js';
|
|
3
4
|
|
|
4
|
-
export
|
|
5
|
-
|
|
5
|
+
export interface IConfigEncryptionKey {
|
|
6
|
+
id: string;
|
|
7
|
+
key: Uint8Array;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export interface IConfigEncryptionKeyProvider {
|
|
11
|
+
currentKey(signalArg: AbortSignal): Promise<IConfigEncryptionKey>;
|
|
12
|
+
keyForId(keyIdArg: string, signalArg: AbortSignal): Promise<Uint8Array | undefined>;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export interface INoSqlConfigStoreOptions {
|
|
16
|
+
db: plugins.nosqldb.SmartdataDb;
|
|
17
|
+
homeId: string;
|
|
18
|
+
integrationDomain: string;
|
|
19
|
+
keyProvider: IConfigEncryptionKeyProvider;
|
|
20
|
+
timeoutMs?: number;
|
|
21
|
+
maxPendingOperations?: number;
|
|
22
|
+
maxValueBytes?: number;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export interface IConfigCreateOptions extends IConfigStoreOperationOptions {}
|
|
26
|
+
|
|
27
|
+
export interface IConfigStoreInitializationOptions {
|
|
28
|
+
signal?: AbortSignal;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
const validateName = (valueArg: string, nameArg: string, maxLengthArg: number): string => {
|
|
32
|
+
if (typeof valueArg !== 'string' || valueArg.length === 0 || valueArg.length > maxLengthArg || /[\p{Cc}\p{Cs}]/u.test(valueArg)) {
|
|
33
|
+
throw new TypeError(`${nameArg} must be a non-empty string without control characters, at most ${maxLengthArg} characters.`);
|
|
34
|
+
}
|
|
35
|
+
return valueArg;
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
const boundedInteger = (valueArg: number, nameArg: string, maximumArg: number): number => {
|
|
39
|
+
if (!Number.isSafeInteger(valueArg) || valueArg < 1 || valueArg > maximumArg) {
|
|
40
|
+
throw new RangeError(`${nameArg} must be an integer from 1 through ${maximumArg}.`);
|
|
41
|
+
}
|
|
42
|
+
return valueArg;
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
const assertJsonValue = (valueArg: unknown, ancestorsArg = new Set<object>(), depthArg = 0): void => {
|
|
46
|
+
if (valueArg === null || typeof valueArg === 'string' || typeof valueArg === 'boolean') return;
|
|
47
|
+
if (typeof valueArg === 'number' && Number.isFinite(valueArg)) return;
|
|
48
|
+
if (typeof valueArg !== 'object' || depthArg >= 32 || ancestorsArg.has(valueArg)) {
|
|
49
|
+
throw new TypeError('Config values must be finite JSON data without cycles and at most 32 levels deep.');
|
|
50
|
+
}
|
|
51
|
+
if (!Array.isArray(valueArg) && Object.getPrototypeOf(valueArg) !== Object.prototype && Object.getPrototypeOf(valueArg) !== null) {
|
|
52
|
+
throw new TypeError('Config values must contain only arrays and plain objects.');
|
|
53
|
+
}
|
|
54
|
+
ancestorsArg.add(valueArg);
|
|
55
|
+
try {
|
|
56
|
+
for (const key of Reflect.ownKeys(valueArg)) {
|
|
57
|
+
if (Array.isArray(valueArg) && key === 'length') continue;
|
|
58
|
+
const descriptor = Object.getOwnPropertyDescriptor(valueArg, key);
|
|
59
|
+
if (typeof key !== 'string' || !descriptor || !('value' in descriptor) || !descriptor.enumerable) {
|
|
60
|
+
throw new TypeError('Config values may not contain symbols, accessors or hidden fields.');
|
|
61
|
+
}
|
|
62
|
+
if (Array.isArray(valueArg) && (!/^(0|[1-9]\d*)$/.test(key) || Number(key) >= valueArg.length)) {
|
|
63
|
+
throw new TypeError('Config arrays may not have additional properties.');
|
|
64
|
+
}
|
|
65
|
+
if (!Array.isArray(valueArg) && descriptor.value === undefined) continue;
|
|
66
|
+
assertJsonValue(descriptor.value, ancestorsArg, depthArg + 1);
|
|
67
|
+
}
|
|
68
|
+
if (Array.isArray(valueArg) && Object.keys(valueArg).length !== valueArg.length) {
|
|
69
|
+
throw new TypeError('Config arrays must be dense and may not have additional properties.');
|
|
70
|
+
}
|
|
71
|
+
} finally {
|
|
72
|
+
ancestorsArg.delete(valueArg);
|
|
73
|
+
}
|
|
74
|
+
};
|
|
6
75
|
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
76
|
+
const copyKey = (valueArg: Uint8Array | undefined): Buffer => {
|
|
77
|
+
if (!(valueArg instanceof Uint8Array) || valueArg.byteLength !== 32) {
|
|
78
|
+
throw new TypeError('Config encryption requires an external 32-byte key.');
|
|
10
79
|
}
|
|
80
|
+
return Buffer.from(valueArg);
|
|
81
|
+
};
|
|
11
82
|
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
await this.writeFile(data);
|
|
83
|
+
const decodeBase64 = (valueArg: string, maximumBytesArg: number, exactBytesArg?: number): Buffer => {
|
|
84
|
+
if (typeof valueArg !== 'string' || valueArg.length > Math.ceil(maximumBytesArg / 3) * 4) {
|
|
85
|
+
throw new Error('Stored config encryption envelope is invalid.');
|
|
16
86
|
}
|
|
87
|
+
const decoded = Buffer.from(valueArg, 'base64');
|
|
88
|
+
if (decoded.toString('base64') !== valueArg || decoded.byteLength > maximumBytesArg || (exactBytesArg !== undefined && decoded.byteLength !== exactBytesArg)) {
|
|
89
|
+
throw new Error('Stored config encryption envelope is invalid.');
|
|
90
|
+
}
|
|
91
|
+
return decoded;
|
|
92
|
+
};
|
|
93
|
+
|
|
94
|
+
/** The caller owns the database and key provider; this store owns neither resource. */
|
|
95
|
+
export class NoSqlConfigStore implements IConfigStore {
|
|
96
|
+
readonly #records: typeof IntegrationConfigRecord;
|
|
97
|
+
readonly #homeId: string;
|
|
98
|
+
readonly #integrationDomain: string;
|
|
99
|
+
readonly #keyProvider: IConfigEncryptionKeyProvider;
|
|
100
|
+
readonly #timeoutMs: number;
|
|
101
|
+
readonly #maxPendingOperations: number;
|
|
102
|
+
readonly #maxValueBytes: number;
|
|
103
|
+
readonly #lifetime = new AbortController();
|
|
104
|
+
readonly #preparations = new Set<Promise<void>>();
|
|
105
|
+
#operationTail: Promise<void> = Promise.resolve();
|
|
106
|
+
#pendingOperations = 0;
|
|
107
|
+
#closePromise?: Promise<void>;
|
|
17
108
|
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
109
|
+
constructor(optionsArg: INoSqlConfigStoreOptions) {
|
|
110
|
+
this.#homeId = validateName(optionsArg.homeId, 'homeId', 256);
|
|
111
|
+
this.#integrationDomain = validateName(optionsArg.integrationDomain, 'integrationDomain', 128);
|
|
112
|
+
this.#keyProvider = optionsArg.keyProvider;
|
|
113
|
+
this.#timeoutMs = boundedInteger(optionsArg.timeoutMs ?? 5000, 'timeoutMs', 120000);
|
|
114
|
+
this.#maxPendingOperations = boundedInteger(optionsArg.maxPendingOperations ?? 1000, 'maxPendingOperations', 10000);
|
|
115
|
+
this.#maxValueBytes = boundedInteger(optionsArg.maxValueBytes ?? 65536, 'maxValueBytes', 1048576);
|
|
116
|
+
if (!this.#keyProvider || typeof this.#keyProvider.currentKey !== 'function' || typeof this.#keyProvider.keyForId !== 'function') {
|
|
117
|
+
throw new TypeError('Config encryption requires a currentKey/keyForId provider.');
|
|
118
|
+
}
|
|
119
|
+
this.#records = plugins.nosqldb.bindDocToManager({ db: optionsArg.db }, IntegrationConfigRecord);
|
|
22
120
|
}
|
|
23
121
|
|
|
24
|
-
public
|
|
25
|
-
|
|
26
|
-
return Object.keys(data).filter((keyArg) => keyArg.startsWith(prefixArg));
|
|
122
|
+
public getScope(): IConfigStoreScope {
|
|
123
|
+
return Object.freeze({ homeId: this.#homeId, integrationDomain: this.#integrationDomain });
|
|
27
124
|
}
|
|
28
125
|
|
|
29
|
-
|
|
126
|
+
public async initialize(optionsArg: IConfigStoreInitializationOptions = {}): Promise<void> {
|
|
127
|
+
this.#assertOpen();
|
|
128
|
+
if (!optionsArg || Object.getPrototypeOf(optionsArg) !== Object.prototype ||
|
|
129
|
+
Reflect.ownKeys(optionsArg).some((keyArg) => keyArg !== 'signal' ||
|
|
130
|
+
!('value' in Object.getOwnPropertyDescriptor(optionsArg, keyArg)!))) {
|
|
131
|
+
throw new TypeError('Config initialization options accept only an AbortSignal.');
|
|
132
|
+
}
|
|
133
|
+
const signal = Object.getOwnPropertyDescriptor(optionsArg, 'signal')?.value as AbortSignal | undefined;
|
|
134
|
+
if (signal !== undefined && !(signal instanceof AbortSignal)) {
|
|
135
|
+
throw new TypeError('Config initialization signal must be an AbortSignal.');
|
|
136
|
+
}
|
|
137
|
+
signal?.throwIfAborted();
|
|
138
|
+
const preparation = this.#records.prepareCollection({
|
|
139
|
+
mode: 'ensureCompatible',
|
|
140
|
+
timeoutMs: this.#timeoutMs,
|
|
141
|
+
signal: signal ? AbortSignal.any([signal, this.#lifetime.signal]) : this.#lifetime.signal,
|
|
142
|
+
});
|
|
143
|
+
this.#preparations.add(preparation);
|
|
30
144
|
try {
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
}
|
|
34
|
-
|
|
145
|
+
await preparation;
|
|
146
|
+
this.#assertOpen();
|
|
147
|
+
} finally {
|
|
148
|
+
this.#preparations.delete(preparation);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
/** Stops this store without closing its caller-owned database or sessions. */
|
|
153
|
+
public close(): Promise<void> {
|
|
154
|
+
if (!this.#closePromise) {
|
|
155
|
+
this.#closePromise = Promise.resolve().then(async () => {
|
|
156
|
+
await Promise.allSettled([
|
|
157
|
+
...this.#preparations,
|
|
158
|
+
this.#operationTail,
|
|
159
|
+
]);
|
|
160
|
+
});
|
|
161
|
+
this.#lifetime.abort(new Error('NoSqlConfigStore is closed.'));
|
|
162
|
+
}
|
|
163
|
+
return this.#closePromise;
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
public get<TValue>(keyArg: string, optionsArg: IConfigStoreOperationOptions = {}): Promise<TValue | undefined> {
|
|
167
|
+
const key = validateName(keyArg, 'config key', 1024);
|
|
168
|
+
const databaseOptions = this.#databaseOptions(optionsArg);
|
|
169
|
+
return this.#runOperation(async () => {
|
|
170
|
+
const record = await this.#records.getInstance(this.#selector(key), databaseOptions);
|
|
171
|
+
return record ? this.#decrypt<TValue>(key, record.encryptedValue) : undefined;
|
|
172
|
+
});
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
public set<TValue>(keyArg: string, valueArg: TValue, optionsArg: IConfigStoreOperationOptions = {}): Promise<void> {
|
|
176
|
+
const key = validateName(keyArg, 'config key', 1024);
|
|
177
|
+
const serialized = this.#serialize(valueArg);
|
|
178
|
+
const databaseOptions = this.#databaseOptions(optionsArg);
|
|
179
|
+
return this.#runOperation(async () => {
|
|
180
|
+
const encryptedValue = await this.#encrypt(key, serialized);
|
|
181
|
+
await this.#records.atomicUpdate({ id: this.#selector(key).id }, {
|
|
182
|
+
$set: { homeId: this.#homeId, integrationDomain: this.#integrationDomain, key, encryptedValue },
|
|
183
|
+
}, { upsert: true, ...databaseOptions });
|
|
184
|
+
});
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
/** Insert-only persistence for callers that must never replace an existing key. */
|
|
188
|
+
public create<TValue>(keyArg: string, valueArg: TValue, optionsArg: IConfigCreateOptions = {}): Promise<void> {
|
|
189
|
+
const key = validateName(keyArg, 'config key', 1024);
|
|
190
|
+
const serialized = this.#serialize(valueArg);
|
|
191
|
+
const databaseOptions = this.#databaseOptions(optionsArg);
|
|
192
|
+
return this.#runOperation(async () => {
|
|
193
|
+
const record = Object.assign(new this.#records(), this.#selector(key), {
|
|
194
|
+
encryptedValue: await this.#encrypt(key, serialized),
|
|
195
|
+
});
|
|
196
|
+
await this.#records.insert(record, databaseOptions);
|
|
197
|
+
});
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
public delete(keyArg: string, optionsArg: IConfigStoreOperationOptions = {}): Promise<void> {
|
|
201
|
+
const key = validateName(keyArg, 'config key', 1024);
|
|
202
|
+
const databaseOptions = this.#databaseOptions(optionsArg);
|
|
203
|
+
return this.#runOperation(async () => {
|
|
204
|
+
await this.#records.atomicDelete(this.#selector(key), databaseOptions);
|
|
205
|
+
});
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
public list(prefixArg = '', optionsArg: IConfigStoreOperationOptions = {}): Promise<string[]> {
|
|
209
|
+
if (prefixArg !== '') validateName(prefixArg, 'config key prefix', 1024);
|
|
210
|
+
const databaseOptions = this.#databaseOptions(optionsArg);
|
|
211
|
+
return this.#runOperation(async () => {
|
|
212
|
+
const records = await this.#records.getInstances({
|
|
213
|
+
homeId: this.#homeId,
|
|
214
|
+
integrationDomain: this.#integrationDomain,
|
|
215
|
+
}, databaseOptions);
|
|
216
|
+
return records.map((recordArg) => recordArg.key).filter((keyArg) => keyArg.startsWith(prefixArg)).sort();
|
|
217
|
+
});
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
#databaseOptions(optionsArg: IConfigStoreOperationOptions): { session: plugins.nosqldb.SmartdataSession } | { timeoutMS: number } {
|
|
221
|
+
if (!optionsArg || Object.getPrototypeOf(optionsArg) !== Object.prototype ||
|
|
222
|
+
Reflect.ownKeys(optionsArg).some((keyArg) => keyArg !== 'session' ||
|
|
223
|
+
!('value' in Object.getOwnPropertyDescriptor(optionsArg, keyArg)!))) {
|
|
224
|
+
throw new TypeError('Config operation options accept only a caller-owned SmartdataSession.');
|
|
225
|
+
}
|
|
226
|
+
const session = Object.getOwnPropertyDescriptor(optionsArg, 'session')?.value as plugins.nosqldb.SmartdataSession | undefined;
|
|
227
|
+
if (session === undefined) return { timeoutMS: this.#timeoutMs };
|
|
228
|
+
if (!(session instanceof plugins.nosqldb.SmartdataSession)) {
|
|
229
|
+
throw new TypeError('Config operation session must be a caller-owned SmartdataSession.');
|
|
230
|
+
}
|
|
231
|
+
return { session };
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
#selector(keyArg: string) {
|
|
235
|
+
return {
|
|
236
|
+
id: JSON.stringify([this.#homeId, this.#integrationDomain, keyArg]),
|
|
237
|
+
homeId: this.#homeId,
|
|
238
|
+
integrationDomain: this.#integrationDomain,
|
|
239
|
+
key: keyArg,
|
|
240
|
+
};
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
#aad(keyArg: string, keyIdArg: string): Buffer {
|
|
244
|
+
return Buffer.from(JSON.stringify([1, this.#homeId, this.#integrationDomain, keyArg, keyIdArg]), 'utf8');
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
#serialize(valueArg: unknown): string {
|
|
248
|
+
assertJsonValue(valueArg);
|
|
249
|
+
const serialized = JSON.stringify(valueArg);
|
|
250
|
+
if (Buffer.byteLength(serialized, 'utf8') > this.#maxValueBytes) {
|
|
251
|
+
throw new RangeError(`Config value exceeds the ${this.#maxValueBytes}-byte limit; large payloads require object storage.`);
|
|
252
|
+
}
|
|
253
|
+
return serialized;
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
async #encrypt(keyArg: string, serializedArg: string): Promise<IEncryptedConfigValue> {
|
|
257
|
+
const encryptionKey = await this.#lookupKey((signalArg) => this.#keyProvider.currentKey(signalArg));
|
|
258
|
+
const keyId = validateName(encryptionKey.id, 'encryption key ID', 128);
|
|
259
|
+
const key = copyKey(encryptionKey.key);
|
|
260
|
+
try {
|
|
261
|
+
const nonce = plugins.crypto.randomBytes(12);
|
|
262
|
+
const cipher = plugins.crypto.createCipheriv('aes-256-gcm', key, nonce);
|
|
263
|
+
cipher.setAAD(this.#aad(keyArg, keyId));
|
|
264
|
+
const ciphertext = Buffer.concat([cipher.update(serializedArg, 'utf8'), cipher.final()]);
|
|
265
|
+
return { version: 1, keyId, nonce: nonce.toString('base64'), ciphertext: ciphertext.toString('base64'), tag: cipher.getAuthTag().toString('base64') };
|
|
266
|
+
} finally {
|
|
267
|
+
key.fill(0);
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
async #decrypt<TValue>(keyArg: string, valueArg: IEncryptedConfigValue): Promise<TValue> {
|
|
272
|
+
if (!valueArg || valueArg.version !== 1) throw new Error('Stored config encryption envelope is invalid.');
|
|
273
|
+
const keyId = validateName(valueArg.keyId, 'stored encryption key ID', 128);
|
|
274
|
+
const nonce = decodeBase64(valueArg.nonce, 12, 12);
|
|
275
|
+
const tag = decodeBase64(valueArg.tag, 16, 16);
|
|
276
|
+
const ciphertext = decodeBase64(valueArg.ciphertext, this.#maxValueBytes);
|
|
277
|
+
const key = copyKey(await this.#lookupKey((signalArg) => this.#keyProvider.keyForId(keyId, signalArg)));
|
|
278
|
+
try {
|
|
279
|
+
const decipher = plugins.crypto.createDecipheriv('aes-256-gcm', key, nonce);
|
|
280
|
+
decipher.setAAD(this.#aad(keyArg, keyId));
|
|
281
|
+
decipher.setAuthTag(tag);
|
|
282
|
+
const plaintext = Buffer.concat([decipher.update(ciphertext), decipher.final()]);
|
|
283
|
+
try {
|
|
284
|
+
const value: unknown = JSON.parse(plaintext.toString('utf8'));
|
|
285
|
+
assertJsonValue(value);
|
|
286
|
+
return value as TValue;
|
|
287
|
+
} finally {
|
|
288
|
+
plaintext.fill(0);
|
|
289
|
+
}
|
|
290
|
+
} catch {
|
|
291
|
+
throw new Error('Stored config failed authentication or JSON validation.');
|
|
292
|
+
} finally {
|
|
293
|
+
key.fill(0);
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
async #lookupKey<TResult>(lookupArg: (signalArg: AbortSignal) => Promise<TResult>): Promise<TResult> {
|
|
298
|
+
this.#assertOpen();
|
|
299
|
+
const controller = new AbortController();
|
|
300
|
+
let timer: ReturnType<typeof setTimeout> | undefined;
|
|
301
|
+
const deadline = new Promise<never>((resolveArg, rejectArg) => {
|
|
302
|
+
void resolveArg;
|
|
303
|
+
timer = setTimeout(() => {
|
|
304
|
+
const error = new Error('Config encryption key lookup timed out.');
|
|
305
|
+
controller.abort(error);
|
|
306
|
+
rejectArg(error);
|
|
307
|
+
}, this.#timeoutMs);
|
|
308
|
+
timer.unref();
|
|
309
|
+
});
|
|
310
|
+
try {
|
|
311
|
+
const result = await Promise.race([
|
|
312
|
+
lookupArg(AbortSignal.any([controller.signal, this.#lifetime.signal])),
|
|
313
|
+
deadline,
|
|
314
|
+
]);
|
|
315
|
+
this.#assertOpen();
|
|
316
|
+
return result;
|
|
317
|
+
} finally {
|
|
318
|
+
clearTimeout(timer);
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
#runOperation<TResult>(operationArg: () => Promise<TResult>): Promise<TResult> {
|
|
323
|
+
if (this.#lifetime.signal.aborted) {
|
|
324
|
+
return Promise.reject(this.#lifetime.signal.reason);
|
|
325
|
+
}
|
|
326
|
+
if (this.#pendingOperations >= this.#maxPendingOperations) {
|
|
327
|
+
return Promise.reject(new Error(`NoSqlConfigStore operation capacity reached: ${this.#maxPendingOperations}.`));
|
|
35
328
|
}
|
|
329
|
+
this.#pendingOperations += 1;
|
|
330
|
+
const operation = this.#operationTail.then(() => {
|
|
331
|
+
this.#assertOpen();
|
|
332
|
+
return operationArg();
|
|
333
|
+
}).finally(() => { this.#pendingOperations -= 1; });
|
|
334
|
+
this.#operationTail = operation.then(() => undefined, () => undefined);
|
|
335
|
+
return operation;
|
|
36
336
|
}
|
|
37
337
|
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
await plugins.fs.writeFile(this.filePath, `${JSON.stringify(dataArg, null, 2)}\n`);
|
|
338
|
+
#assertOpen(): void {
|
|
339
|
+
this.#lifetime.signal.throwIfAborted();
|
|
41
340
|
}
|
|
42
341
|
}
|
|
@@ -3,6 +3,7 @@ import type {
|
|
|
3
3
|
IDiscoveryCandidate,
|
|
4
4
|
IDiscoveryContext,
|
|
5
5
|
IDiscoveryMatch,
|
|
6
|
+
IDiscoveryProbeResult,
|
|
6
7
|
TDiscoverySource,
|
|
7
8
|
} from './types.js';
|
|
8
9
|
|
|
@@ -10,12 +11,21 @@ export class DiscoveryEngine {
|
|
|
10
11
|
constructor(private readonly integrationRegistry: IntegrationRegistry) {}
|
|
11
12
|
|
|
12
13
|
public async runActiveDiscovery(contextArg: IDiscoveryContext = {}): Promise<IDiscoveryCandidate[]> {
|
|
14
|
+
contextArg.abortSignal?.throwIfAborted();
|
|
13
15
|
const candidates: IDiscoveryCandidate[] = [];
|
|
14
16
|
|
|
15
17
|
for (const integration of this.integrationRegistry.list()) {
|
|
16
18
|
const descriptor = integration.discoveryDescriptor;
|
|
17
19
|
for (const probe of descriptor.getProbes()) {
|
|
18
|
-
|
|
20
|
+
contextArg.abortSignal?.throwIfAborted();
|
|
21
|
+
let result: IDiscoveryProbeResult;
|
|
22
|
+
try {
|
|
23
|
+
result = await probe.probe(contextArg);
|
|
24
|
+
} catch (error) {
|
|
25
|
+
contextArg.abortSignal?.throwIfAborted();
|
|
26
|
+
throw error;
|
|
27
|
+
}
|
|
28
|
+
contextArg.abortSignal?.throwIfAborted();
|
|
19
29
|
for (const candidate of result.candidates) {
|
|
20
30
|
candidates.push({
|
|
21
31
|
...candidate,
|
package/ts/core/types.ts
CHANGED
|
@@ -34,11 +34,22 @@ export interface INetworkInterface {
|
|
|
34
34
|
internal: boolean;
|
|
35
35
|
}
|
|
36
36
|
|
|
37
|
+
export interface IConfigStoreOperationOptions {
|
|
38
|
+
/** A prepared caller-owned transaction supplies the database deadline. */
|
|
39
|
+
session?: plugins.nosqldb.SmartdataSession;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
export interface IConfigStoreScope {
|
|
43
|
+
readonly homeId: string;
|
|
44
|
+
readonly integrationDomain: string;
|
|
45
|
+
}
|
|
46
|
+
|
|
37
47
|
export interface IConfigStore {
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
48
|
+
getScope?(): IConfigStoreScope;
|
|
49
|
+
get<TValue>(keyArg: string, optionsArg?: IConfigStoreOperationOptions): Promise<TValue | undefined>;
|
|
50
|
+
set<TValue>(keyArg: string, valueArg: TValue, optionsArg?: IConfigStoreOperationOptions): Promise<void>;
|
|
51
|
+
delete(keyArg: string, optionsArg?: IConfigStoreOperationOptions): Promise<void>;
|
|
52
|
+
list(prefixArg?: string, optionsArg?: IConfigStoreOperationOptions): Promise<string[]>;
|
|
42
53
|
}
|
|
43
54
|
|
|
44
55
|
export interface IDiscoveryContext {
|
package/ts/index.ts
CHANGED
|
@@ -417,12 +417,14 @@ import { SoundtouchIntegration } from './integrations/soundtouch/index.js';
|
|
|
417
417
|
import { SqueezeboxIntegration } from './integrations/squeezebox/index.js';
|
|
418
418
|
import { SynologyDsmIntegration } from './integrations/synology_dsm/index.js';
|
|
419
419
|
import { SynologySrmIntegration } from './integrations/synology_srm/index.js';
|
|
420
|
+
import { HomeAssistantTasmotaIntegration } from './integrations/tasmota/index.js';
|
|
420
421
|
import { TomatoIntegration } from './integrations/tomato/index.js';
|
|
421
422
|
import { TplinkIntegration } from './integrations/tplink/index.js';
|
|
422
423
|
import { TplinkLteIntegration } from './integrations/tplink_lte/index.js';
|
|
423
424
|
import { TplinkOmadaIntegration } from './integrations/tplink_omada/index.js';
|
|
424
425
|
import { TradfriIntegration } from './integrations/tradfri/index.js';
|
|
425
426
|
import { TransmissionIntegration } from './integrations/transmission/index.js';
|
|
427
|
+
import { TuyaIntegration } from './integrations/tuya/index.js';
|
|
426
428
|
import { TwinklyIntegration } from './integrations/twinkly/index.js';
|
|
427
429
|
import { UbusIntegration } from './integrations/ubus/index.js';
|
|
428
430
|
import { UnifiIntegration } from './integrations/unifi/index.js';
|
|
@@ -460,6 +462,7 @@ import { ZhaIntegration } from './integrations/zha/index.js';
|
|
|
460
462
|
import { ZiggoMediaboxXlIntegration } from './integrations/ziggo_mediabox_xl/index.js';
|
|
461
463
|
import { ZoneminderIntegration } from './integrations/zoneminder/index.js';
|
|
462
464
|
import { ZwaveJsIntegration } from './integrations/zwave_js/index.js';
|
|
465
|
+
import { Zigbee2MqttIntegration } from './integrations/zigbee2mqtt/index.js';
|
|
463
466
|
import { generatedHomeAssistantPortIntegrations } from './integrations/generated/index.js';
|
|
464
467
|
import { IntegrationRegistry } from './core/index.js';
|
|
465
468
|
|
|
@@ -879,12 +882,14 @@ export const integrations = [
|
|
|
879
882
|
new SqueezeboxIntegration(),
|
|
880
883
|
new SynologyDsmIntegration(),
|
|
881
884
|
new SynologySrmIntegration(),
|
|
885
|
+
new HomeAssistantTasmotaIntegration(),
|
|
882
886
|
new TomatoIntegration(),
|
|
883
887
|
new TplinkIntegration(),
|
|
884
888
|
new TplinkLteIntegration(),
|
|
885
889
|
new TplinkOmadaIntegration(),
|
|
886
890
|
new TradfriIntegration(),
|
|
887
891
|
new TransmissionIntegration(),
|
|
892
|
+
new TuyaIntegration(),
|
|
888
893
|
new TwinklyIntegration(),
|
|
889
894
|
new UbusIntegration(),
|
|
890
895
|
new UnifiIntegration(),
|
|
@@ -910,6 +915,7 @@ export const integrations = [
|
|
|
910
915
|
new WiimIntegration(),
|
|
911
916
|
new WizIntegration(),
|
|
912
917
|
new WledIntegration(),
|
|
918
|
+
new Zigbee2MqttIntegration(),
|
|
913
919
|
new WolfSmartsetIntegration(),
|
|
914
920
|
new XiaomiMiioIntegration(),
|
|
915
921
|
new YamahaIntegration(),
|