@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
|
@@ -1,11 +1,12 @@
|
|
|
1
|
-
import
|
|
1
|
+
import * as plugins from '../../plugins.js';
|
|
2
2
|
import { BaseIntegration } from '../../core/classes.baseintegration.js';
|
|
3
|
-
import type { IIntegrationEntity, IIntegrationRuntime, IIntegrationSetupContext, IServiceCallRequest, IServiceCallResult } from '../../core/types.js';
|
|
3
|
+
import type { IDeviceFeatureWriteRequest, IIntegrationEntity, IIntegrationEvent, IIntegrationRuntime, IIntegrationSetupContext, IServiceCallRequest, IServiceCallResult } from '../../core/types.js';
|
|
4
4
|
import { SonosClient } from './sonos.classes.client.js';
|
|
5
5
|
import { SonosConfigFlow } from './sonos.classes.configflow.js';
|
|
6
6
|
import { createSonosDiscoveryDescriptor } from './sonos.discovery.js';
|
|
7
7
|
import { SonosMapper } from './sonos.mapper.js';
|
|
8
|
-
import
|
|
8
|
+
import { isSonosDataRecord } from './sonos.config.js';
|
|
9
|
+
import type { ISonosConfig, ISonosSnapshot } from './sonos.types.js';
|
|
9
10
|
|
|
10
11
|
export class SonosIntegration extends BaseIntegration<ISonosConfig> {
|
|
11
12
|
public readonly domain = 'sonos';
|
|
@@ -13,93 +14,254 @@ export class SonosIntegration extends BaseIntegration<ISonosConfig> {
|
|
|
13
14
|
public readonly status = 'control-runtime' as const;
|
|
14
15
|
public readonly discoveryDescriptor = createSonosDiscoveryDescriptor();
|
|
15
16
|
public readonly configFlow = new SonosConfigFlow();
|
|
16
|
-
public readonly metadata = {
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
17
|
+
public readonly metadata = { source: 'native-typescript', integrationType: 'device', iotClass: 'local_poll' };
|
|
18
|
+
private readonly runtimes = new Set<SonosRuntime>();
|
|
19
|
+
private readonly setups = new Set<Promise<IIntegrationRuntime>>();
|
|
20
|
+
private readonly lifetime = new AbortController();
|
|
21
|
+
private closePromise?: Promise<void>;
|
|
22
|
+
|
|
23
|
+
public setup(config: ISonosConfig, context: IIntegrationSetupContext): Promise<IIntegrationRuntime> {
|
|
24
|
+
if (this.lifetime.signal.aborted) return Promise.reject(new Error('Sonos integration is closed.'));
|
|
25
|
+
const signal = AbortSignal.any([this.lifetime.signal, ...(context.abortSignal ? [context.abortSignal] : [])]);
|
|
26
|
+
const pending = (async () => {
|
|
27
|
+
const client = new SonosClient(config, signal);
|
|
28
|
+
try {
|
|
29
|
+
const initial = await client.getSnapshot(signal);
|
|
30
|
+
signal.throwIfAborted();
|
|
31
|
+
const runtime = new SonosRuntime(client, initial, { ...context, abortSignal: signal }, () => { this.runtimes.delete(runtime); });
|
|
32
|
+
this.runtimes.add(runtime);
|
|
33
|
+
return runtime;
|
|
34
|
+
} catch (error) {
|
|
35
|
+
try { await client.destroy(); }
|
|
36
|
+
catch (cleanupError) { throw new AggregateError([error, cleanupError], 'Sonos setup and cleanup failed.'); }
|
|
37
|
+
throw error;
|
|
38
|
+
}
|
|
39
|
+
})();
|
|
40
|
+
this.setups.add(pending);
|
|
41
|
+
void pending.then(() => this.setups.delete(pending), () => this.setups.delete(pending));
|
|
42
|
+
return pending;
|
|
28
43
|
}
|
|
29
44
|
|
|
30
|
-
public
|
|
45
|
+
public destroy(): Promise<void> {
|
|
46
|
+
if (!this.closePromise) {
|
|
47
|
+
this.lifetime.abort(new Error('Sonos integration is closed.'));
|
|
48
|
+
this.closePromise = (async () => {
|
|
49
|
+
await Promise.allSettled([...this.setups]);
|
|
50
|
+
const results = await Promise.allSettled([...this.runtimes].map((runtime) => runtime.destroy()));
|
|
51
|
+
this.runtimes.clear();
|
|
52
|
+
const failures = results.filter((result): result is PromiseRejectedResult => result.status === 'rejected');
|
|
53
|
+
if (failures.length) throw new AggregateError(failures.map((result) => result.reason), 'Sonos runtime cleanup failed.');
|
|
54
|
+
})();
|
|
55
|
+
}
|
|
56
|
+
return this.closePromise;
|
|
57
|
+
}
|
|
31
58
|
}
|
|
32
59
|
|
|
33
60
|
export class HomeAssistantSonosIntegration extends SonosIntegration {}
|
|
34
61
|
|
|
62
|
+
interface ISonosSubscription {
|
|
63
|
+
controller: AbortController;
|
|
64
|
+
job: Promise<void>;
|
|
65
|
+
failed: boolean;
|
|
66
|
+
failure?: unknown;
|
|
67
|
+
stop(): Promise<void>;
|
|
68
|
+
}
|
|
69
|
+
|
|
35
70
|
class SonosRuntime implements IIntegrationRuntime {
|
|
36
|
-
public domain = 'sonos';
|
|
71
|
+
public readonly domain = 'sonos';
|
|
72
|
+
private readonly lifetime = new AbortController();
|
|
73
|
+
private readonly subscriptions = new Set<ISonosSubscription>();
|
|
74
|
+
private healthy = true;
|
|
75
|
+
private closed = false;
|
|
76
|
+
private closePromise?: Promise<void>;
|
|
77
|
+
private readonly parentAbort?: () => void;
|
|
37
78
|
|
|
38
|
-
constructor(private readonly client: SonosClient) {
|
|
79
|
+
constructor(private readonly client: SonosClient, private snapshot: ISonosSnapshot, private readonly context: IIntegrationSetupContext = {}, private readonly onClosed?: () => void) {
|
|
80
|
+
if (context.abortSignal) {
|
|
81
|
+
this.parentAbort = () => this.lifetime.abort(context.abortSignal?.reason);
|
|
82
|
+
context.abortSignal.addEventListener('abort', this.parentAbort, { once: true });
|
|
83
|
+
if (context.abortSignal.aborted) this.parentAbort();
|
|
84
|
+
}
|
|
85
|
+
}
|
|
39
86
|
|
|
40
|
-
public
|
|
41
|
-
|
|
87
|
+
public isHealthy(): boolean { return this.healthy && !this.closed && !this.lifetime.signal.aborted; }
|
|
88
|
+
|
|
89
|
+
public async devices(signal?: AbortSignal): Promise<plugins.shxInterfaces.data.IDeviceDefinition[]> {
|
|
90
|
+
return SonosMapper.toDevices(await this.read(signal));
|
|
42
91
|
}
|
|
43
92
|
|
|
44
|
-
public async entities(): Promise<IIntegrationEntity[]> {
|
|
45
|
-
|
|
93
|
+
public async entities(): Promise<IIntegrationEntity[]> { return SonosMapper.toEntities(await this.read()); }
|
|
94
|
+
|
|
95
|
+
public async writeFeature(request: IDeviceFeatureWriteRequest, signal?: AbortSignal): Promise<IServiceCallResult> {
|
|
96
|
+
assertDataRecord(request, ['device', 'feature', 'value']);
|
|
97
|
+
assertDataRecord(request.device);
|
|
98
|
+
assertDataRecord(request.feature);
|
|
99
|
+
const deviceId = request.device.id;
|
|
100
|
+
const integrationDomain = request.device.integrationDomain;
|
|
101
|
+
const featureId = request.feature.id;
|
|
102
|
+
const value = request.value;
|
|
103
|
+
const snapshot = await this.read(signal);
|
|
104
|
+
const device = SonosMapper.toDevices(snapshot)[0];
|
|
105
|
+
if (integrationDomain !== this.domain || deviceId !== device.id) throw new Error('Sonos feature target does not belong to the selected renderer.');
|
|
106
|
+
const feature = device.features.find((feature) => feature.id === featureId);
|
|
107
|
+
if (!feature?.writable || feature.capability !== 'media') throw new Error('Sonos feature is not writable for this renderer.');
|
|
108
|
+
if (feature.id === 'volume') {
|
|
109
|
+
if (typeof value !== 'number') throw new Error('Sonos volume must be numeric.');
|
|
110
|
+
await this.client.setVolume(value, this.signal(signal));
|
|
111
|
+
} else if (feature.id === 'muted') {
|
|
112
|
+
if (typeof value !== 'boolean') throw new Error('Sonos mute must be boolean.');
|
|
113
|
+
await this.client.setMute(value, this.signal(signal));
|
|
114
|
+
} else if (feature.id === 'playback') {
|
|
115
|
+
if (value === 'playing') await this.client.play(this.signal(signal));
|
|
116
|
+
else if (value === 'paused') await this.client.pause(this.signal(signal));
|
|
117
|
+
else if (value === 'stopped') await this.client.stop(this.signal(signal));
|
|
118
|
+
else throw new Error('Sonos playback must be playing, paused or stopped.');
|
|
119
|
+
} else throw new Error('Unsupported Sonos feature.');
|
|
120
|
+
return this.readback(signal);
|
|
46
121
|
}
|
|
47
122
|
|
|
48
|
-
public async callService(
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
123
|
+
public async callService(request: IServiceCallRequest): Promise<IServiceCallResult> {
|
|
124
|
+
assertDataRecord(request, ['domain', 'service', 'target', 'data']);
|
|
125
|
+
assertDataRecord(request.target, ['deviceId', 'entityId']);
|
|
126
|
+
if (request.data !== undefined) assertDataRecord(request.data);
|
|
127
|
+
request = { domain: request.domain, service: request.service,
|
|
128
|
+
target: { ...(request.target.deviceId === undefined ? {} : { deviceId: request.target.deviceId }),
|
|
129
|
+
...(request.target.entityId === undefined ? {} : { entityId: request.target.entityId }) },
|
|
130
|
+
...(request.data === undefined ? {} : { data: { ...request.data } }) };
|
|
131
|
+
if (request.domain !== 'media_player' || typeof request.service !== 'string') throw new Error('Unsupported Sonos service domain.');
|
|
132
|
+
const snapshot = await this.read();
|
|
133
|
+
const deviceId = SonosMapper.deviceId(snapshot);
|
|
134
|
+
const entityId = SonosMapper.entityId(snapshot.speakerInfo.uid);
|
|
135
|
+
if ((!request.target.deviceId && !request.target.entityId) || (request.target.deviceId !== undefined && request.target.deviceId !== deviceId)
|
|
136
|
+
|| (request.target.entityId !== undefined && request.target.entityId !== entityId)) throw new Error('Sonos service target does not belong to the selected renderer.');
|
|
137
|
+
const data = request.data ?? {};
|
|
138
|
+
assertDataRecord(data);
|
|
139
|
+
const signal = this.signal();
|
|
140
|
+
if (['play', 'pause', 'stop', 'next_track', 'previous_track'].includes(request.service)) {
|
|
141
|
+
assertDataRecord(data, []);
|
|
142
|
+
if (request.service === 'play') await this.client.play(signal);
|
|
143
|
+
else if (request.service === 'pause') await this.client.pause(signal);
|
|
144
|
+
else if (request.service === 'stop') await this.client.stop(signal);
|
|
145
|
+
else if (request.service === 'next_track') await this.client.next(signal);
|
|
146
|
+
else await this.client.previous(signal);
|
|
147
|
+
} else if (request.service === 'volume_set') {
|
|
148
|
+
assertDataRecord(data, ['volume', 'volume_level']);
|
|
149
|
+
if (Object.hasOwn(data, 'volume') === Object.hasOwn(data, 'volume_level')) throw new Error('Sonos volume_set requires exactly one volume argument.');
|
|
150
|
+
const value = Object.hasOwn(data, 'volume') ? data.volume : data.volume_level;
|
|
151
|
+
if (typeof value !== 'number' || !Number.isFinite(value)) throw new Error('Sonos volume must be finite.');
|
|
152
|
+
const percent = Math.round(value * 100);
|
|
153
|
+
if (Object.hasOwn(data, 'volume_level') && (value < 0 || value > 1 || Math.abs(value * 100 - percent) > 1e-8)) throw new Error('Sonos volume_level must represent an integer percent from 0 to 100.');
|
|
154
|
+
await this.client.setVolume(Object.hasOwn(data, 'volume') ? value : percent, signal);
|
|
155
|
+
} else if (request.service === 'volume_mute') {
|
|
156
|
+
assertDataRecord(data, ['muted', 'is_volume_muted']);
|
|
157
|
+
if (Object.hasOwn(data, 'muted') === Object.hasOwn(data, 'is_volume_muted')) throw new Error('Sonos volume_mute requires exactly one mute argument.');
|
|
158
|
+
const value = Object.hasOwn(data, 'muted') ? data.muted : data.is_volume_muted;
|
|
159
|
+
if (typeof value !== 'boolean') throw new Error('Sonos mute must be boolean.');
|
|
160
|
+
await this.client.setMute(value, signal);
|
|
161
|
+
} else if (request.service === 'play_media') {
|
|
162
|
+
assertDataRecord(data, ['uri', 'media_content_id', 'title', 'mime_type']);
|
|
163
|
+
if (Object.hasOwn(data, 'uri') === Object.hasOwn(data, 'media_content_id')) throw new Error('Sonos play_media requires exactly one URI argument.');
|
|
164
|
+
const uri = Object.hasOwn(data, 'uri') ? data.uri : data.media_content_id;
|
|
165
|
+
if (typeof uri !== 'string' || (data.title !== undefined && typeof data.title !== 'string') || (data.mime_type !== undefined && typeof data.mime_type !== 'string')) throw new Error('Sonos media URI, title and MIME type must be text.');
|
|
166
|
+
await this.client.playUri(uri, { title: data.title, mimeType: data.mime_type }, signal);
|
|
167
|
+
} else throw new Error(`Unsupported Sonos service: ${request.service}`);
|
|
168
|
+
return this.readback();
|
|
169
|
+
}
|
|
52
170
|
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
return { success: false, error: 'Sonos volume_set requires data.volume_level or data.volume.' };
|
|
78
|
-
}
|
|
79
|
-
await this.client.setVolume(volume);
|
|
80
|
-
return { success: true };
|
|
81
|
-
}
|
|
82
|
-
if (requestArg.service === 'volume_mute') {
|
|
83
|
-
const muted = requestArg.data?.is_volume_muted ?? requestArg.data?.muted;
|
|
84
|
-
if (typeof muted !== 'boolean') {
|
|
85
|
-
return { success: false, error: 'Sonos volume_mute requires data.is_volume_muted or data.muted.' };
|
|
86
|
-
}
|
|
87
|
-
await this.client.setMute(muted);
|
|
88
|
-
return { success: true };
|
|
89
|
-
}
|
|
90
|
-
if (requestArg.service === 'play_media') {
|
|
91
|
-
const uri = requestArg.data?.media_content_id ?? requestArg.data?.uri;
|
|
92
|
-
if (typeof uri !== 'string' || !uri) {
|
|
93
|
-
return { success: false, error: 'Sonos play_media requires data.media_content_id or data.uri.' };
|
|
171
|
+
public async subscribe(handler: (event: IIntegrationEvent) => void, signal?: AbortSignal): Promise<() => Promise<void>> {
|
|
172
|
+
if (typeof handler !== 'function') throw new Error('Sonos subscription handler must be callable.');
|
|
173
|
+
if (this.subscriptions.size >= 16) throw new Error('Sonos runtime supports at most 16 subscriptions.');
|
|
174
|
+
const controller = new AbortController();
|
|
175
|
+
const combined = AbortSignal.any([this.signal(signal), controller.signal]);
|
|
176
|
+
const initial = await this.read(combined);
|
|
177
|
+
combined.throwIfAborted();
|
|
178
|
+
if (this.subscriptions.size >= 16) throw new Error('Sonos runtime supports at most 16 subscriptions.');
|
|
179
|
+
handler(this.event('state_changed', initial));
|
|
180
|
+
combined.throwIfAborted();
|
|
181
|
+
let subscription: ISonosSubscription;
|
|
182
|
+
const job = (async () => {
|
|
183
|
+
while (!combined.aborted) {
|
|
184
|
+
await wait(this.client.config.pollIntervalMs, combined);
|
|
185
|
+
if (combined.aborted) return;
|
|
186
|
+
let snapshot: ISonosSnapshot;
|
|
187
|
+
try { snapshot = await this.read(combined); }
|
|
188
|
+
catch (error) {
|
|
189
|
+
if (combined.aborted) return;
|
|
190
|
+
handler(this.event('availability_changed', { available: false }));
|
|
191
|
+
handler(this.event('error', { message: error instanceof Error ? error.message : 'Sonos read failed.' }));
|
|
192
|
+
continue;
|
|
193
|
+
}
|
|
194
|
+
handler(this.event('state_changed', snapshot));
|
|
94
195
|
}
|
|
95
|
-
|
|
96
|
-
|
|
196
|
+
})().catch((error: unknown) => {
|
|
197
|
+
if (!combined.aborted) { subscription.failed = true; subscription.failure = error; this.healthy = false; controller.abort(error); }
|
|
198
|
+
}).then(() => {
|
|
199
|
+
if (!subscription.failed) this.subscriptions.delete(subscription);
|
|
200
|
+
});
|
|
201
|
+
subscription = {
|
|
202
|
+
controller, job, failed: false,
|
|
203
|
+
stop: async () => {
|
|
204
|
+
controller.abort(new Error('Sonos subscription stopped.'));
|
|
205
|
+
await job;
|
|
206
|
+
this.subscriptions.delete(subscription);
|
|
207
|
+
if (subscription.failed) throw subscription.failure;
|
|
208
|
+
},
|
|
209
|
+
};
|
|
210
|
+
this.subscriptions.add(subscription);
|
|
211
|
+
return subscription.stop;
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
public destroy(): Promise<void> {
|
|
215
|
+
if (!this.closePromise) {
|
|
216
|
+
this.closed = true;
|
|
217
|
+
this.healthy = false;
|
|
218
|
+
this.lifetime.abort(new Error('Sonos runtime is closed.'));
|
|
219
|
+
if (this.parentAbort) this.context.abortSignal?.removeEventListener('abort', this.parentAbort);
|
|
220
|
+
this.closePromise = (async () => {
|
|
221
|
+
const results = await Promise.allSettled([this.client.destroy(), ...[...this.subscriptions].map((subscription) => subscription.stop())]);
|
|
222
|
+
this.onClosed?.();
|
|
223
|
+
const failures = results.filter((result): result is PromiseRejectedResult => result.status === 'rejected');
|
|
224
|
+
if (failures.length) throw new AggregateError(failures.map((result) => result.reason), 'Sonos cleanup failed.');
|
|
225
|
+
})();
|
|
97
226
|
}
|
|
227
|
+
return this.closePromise;
|
|
228
|
+
}
|
|
98
229
|
|
|
99
|
-
|
|
230
|
+
private async read(signal?: AbortSignal): Promise<ISonosSnapshot> {
|
|
231
|
+
try { this.snapshot = await this.client.getSnapshot(this.signal(signal)); this.healthy = true; return this.snapshot; }
|
|
232
|
+
catch (error) { this.healthy = false; throw error; }
|
|
100
233
|
}
|
|
101
234
|
|
|
102
|
-
|
|
103
|
-
await this.
|
|
235
|
+
private async readback(signal?: AbortSignal): Promise<IServiceCallResult> {
|
|
236
|
+
const snapshot = await this.read(signal);
|
|
237
|
+
return { success: true, data: { devices: SonosMapper.toDevices(snapshot), entities: SonosMapper.toEntities(snapshot) } };
|
|
104
238
|
}
|
|
239
|
+
|
|
240
|
+
private signal(signal?: AbortSignal): AbortSignal {
|
|
241
|
+
const combined = AbortSignal.any([this.lifetime.signal, ...(signal ? [signal] : [])]);
|
|
242
|
+
combined.throwIfAborted();
|
|
243
|
+
return combined;
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
private event(type: IIntegrationEvent['type'], data: unknown): IIntegrationEvent {
|
|
247
|
+
return { type, integrationDomain: this.domain, deviceId: SonosMapper.deviceId(this.snapshot),
|
|
248
|
+
entityId: SonosMapper.entityId(this.snapshot.speakerInfo.uid), data: structuredClone(data), timestamp: Date.now() };
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
function assertDataRecord(value: unknown, allowed?: string[]): asserts value is Record<string, unknown> {
|
|
253
|
+
if (!isSonosDataRecord(value)) throw new Error('Sonos input must be a plain object.');
|
|
254
|
+
for (const key of Reflect.ownKeys(value)) {
|
|
255
|
+
const descriptor = Object.getOwnPropertyDescriptor(value, key);
|
|
256
|
+
if (typeof key !== 'string' || !descriptor || !('value' in descriptor) || (allowed && !allowed.includes(key))) throw new Error('Sonos input contains an unsupported field.');
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
function wait(milliseconds: number, signal: AbortSignal): Promise<void> {
|
|
261
|
+
return new Promise((resolve) => {
|
|
262
|
+
const finish = (): void => { clearTimeout(timer); signal.removeEventListener('abort', finish); resolve(); };
|
|
263
|
+
const timer = setTimeout(finish, milliseconds);
|
|
264
|
+
signal.addEventListener('abort', finish, { once: true });
|
|
265
|
+
if (signal.aborted) finish();
|
|
266
|
+
});
|
|
105
267
|
}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import * as plugins from '../../plugins.js';
|
|
2
|
+
import type { IDiscoveryCandidate, IDiscoveryContext, IDiscoveryProbe, IDiscoveryProbeResult } from '../../core/types.js';
|
|
3
|
+
import { SonosSsdpMatcher } from './sonos.matchers.js';
|
|
4
|
+
|
|
5
|
+
export interface ISonosSsdpProbeOptions {
|
|
6
|
+
scanDurationMs?: number;
|
|
7
|
+
startupTimeoutMs?: number;
|
|
8
|
+
dependencies?: plugins.ecobridgeDeviceManager.ISsdpDiscoveryDependencies;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export class SonosSsdpProbe implements IDiscoveryProbe {
|
|
12
|
+
public readonly id = 'sonos-ssdp-probe';
|
|
13
|
+
public readonly source = 'ssdp' as const;
|
|
14
|
+
public readonly description = 'Discover local Sonos ZonePlayers through the owning native SSDP client.';
|
|
15
|
+
private readonly scanDurationMs: number;
|
|
16
|
+
private readonly startupTimeoutMs: number;
|
|
17
|
+
private readonly dependencies: plugins.ecobridgeDeviceManager.ISsdpDiscoveryDependencies;
|
|
18
|
+
|
|
19
|
+
constructor(options: ISonosSsdpProbeOptions = {}) {
|
|
20
|
+
this.scanDurationMs = duration(options.scanDurationMs ?? 3000, 20, 10000, 'scanDurationMs');
|
|
21
|
+
this.startupTimeoutMs = duration(options.startupTimeoutMs ?? 5000, 1, 60000, 'startupTimeoutMs');
|
|
22
|
+
this.dependencies = { ...options.dependencies };
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
public async probe(context: IDiscoveryContext): Promise<IDiscoveryProbeResult> {
|
|
26
|
+
context.abortSignal?.throwIfAborted();
|
|
27
|
+
const addresses = context.networkInterfaces?.filter((network) => network.family === 'IPv4' && !network.internal).map((network) => network.address);
|
|
28
|
+
if (addresses?.length === 0) return { candidates: [] };
|
|
29
|
+
const networkInterfaces = this.dependencies.networkInterfaces ?? plugins.os.networkInterfaces;
|
|
30
|
+
const discovery = new plugins.ecobridgeDeviceManager.SsdpDiscovery({
|
|
31
|
+
...this.dependencies,
|
|
32
|
+
networkInterfaces: () => {
|
|
33
|
+
const interfaces = networkInterfaces();
|
|
34
|
+
if (addresses === undefined) return interfaces;
|
|
35
|
+
return Object.fromEntries(Object.entries(interfaces).map(([name, networks]) => [name,
|
|
36
|
+
networks?.filter((network) => addresses.includes(network.address) && network.family === 'IPv4' && !network.internal)]));
|
|
37
|
+
},
|
|
38
|
+
});
|
|
39
|
+
const failure = new AbortController();
|
|
40
|
+
const signal = AbortSignal.any([failure.signal, ...(context.abortSignal ? [context.abortSignal] : [])]);
|
|
41
|
+
const onError = (error: unknown): void => failure.abort(error);
|
|
42
|
+
discovery.on('error', onError);
|
|
43
|
+
let operationError: unknown;
|
|
44
|
+
let operationFailed = false;
|
|
45
|
+
try {
|
|
46
|
+
await discovery.start(['urn:schemas-upnp-org:device:ZonePlayer:1'], { signal, timeoutMs: this.startupTimeoutMs });
|
|
47
|
+
await observe(this.scanDurationMs, signal);
|
|
48
|
+
if (discovery.lastError !== null) throw discovery.lastError;
|
|
49
|
+
const matcher = new SonosSsdpMatcher();
|
|
50
|
+
const candidates = new Map<string, IDiscoveryCandidate>();
|
|
51
|
+
for (const device of discovery.getDevices()) {
|
|
52
|
+
const match = await matcher.matches({ st: device.serviceType, usn: device.usn, location: device.location });
|
|
53
|
+
if (match.matched && match.candidate?.id) candidates.set(match.candidate.id, match.candidate);
|
|
54
|
+
}
|
|
55
|
+
signal.throwIfAborted();
|
|
56
|
+
return { candidates: [...candidates.values()] };
|
|
57
|
+
} catch (error) {
|
|
58
|
+
operationFailed = true;
|
|
59
|
+
operationError = error;
|
|
60
|
+
throw error;
|
|
61
|
+
} finally {
|
|
62
|
+
try { await discovery.stop(); }
|
|
63
|
+
catch (error) {
|
|
64
|
+
if (operationFailed) throw new AggregateError([operationError, error], 'Sonos discovery and cleanup failed.');
|
|
65
|
+
throw error;
|
|
66
|
+
} finally { discovery.off('error', onError); }
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
function duration(value: number, minimum: number, maximum: number, name: string): number {
|
|
72
|
+
if (!Number.isSafeInteger(value) || value < minimum || value > maximum) throw new Error(`Sonos ${name} must be an integer from ${minimum} to ${maximum}.`);
|
|
73
|
+
return value;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
function observe(milliseconds: number, signal: AbortSignal): Promise<void> {
|
|
77
|
+
signal.throwIfAborted();
|
|
78
|
+
return new Promise((resolve, reject) => {
|
|
79
|
+
const cleanup = (): void => { clearTimeout(timer); signal.removeEventListener('abort', onAbort); };
|
|
80
|
+
const onAbort = (): void => { cleanup(); reject(signal.reason); };
|
|
81
|
+
const timer = setTimeout(() => { cleanup(); resolve(); }, milliseconds);
|
|
82
|
+
signal.addEventListener('abort', onAbort, { once: true });
|
|
83
|
+
if (signal.aborted) onAbort();
|
|
84
|
+
});
|
|
85
|
+
}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import type { ISonosConfig } from './sonos.types.js';
|
|
2
|
+
|
|
3
|
+
export interface INormalizedSonosConfig extends ISonosConfig {
|
|
4
|
+
readonly host: string;
|
|
5
|
+
readonly port: number;
|
|
6
|
+
readonly expectedUid?: string;
|
|
7
|
+
readonly timeoutMs: number;
|
|
8
|
+
readonly maxResponseBytes: number;
|
|
9
|
+
readonly pollIntervalMs: number;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export function normalizeSonosUid(value: unknown): string {
|
|
13
|
+
if (typeof value !== 'string' || !/^RINCON_[0-9a-f]{12}0?1400$/i.test(value)) {
|
|
14
|
+
throw new Error('Sonos player identity must be a RINCON UUID.');
|
|
15
|
+
}
|
|
16
|
+
return value.toUpperCase();
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export function isSonosDataRecord(value: unknown): value is Record<string, unknown> {
|
|
20
|
+
if (!value || typeof value !== 'object' || Array.isArray(value) || ![Object.prototype, null].includes(Object.getPrototypeOf(value))) return false;
|
|
21
|
+
return Reflect.ownKeys(value).every((key) => {
|
|
22
|
+
const descriptor = Object.getOwnPropertyDescriptor(value, key);
|
|
23
|
+
return typeof key === 'string' && descriptor !== undefined && 'value' in descriptor;
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export function normalizeSonosConfig(input: ISonosConfig): INormalizedSonosConfig {
|
|
28
|
+
if (!isSonosDataRecord(input) || !Object.hasOwn(input, 'host')) throw new Error('Sonos configuration must be a plain object containing its own host field.');
|
|
29
|
+
const allowed = new Set(['host', 'port', 'expectedUid', 'timeoutMs', 'maxResponseBytes', 'pollIntervalMs']);
|
|
30
|
+
for (const key of Reflect.ownKeys(input)) {
|
|
31
|
+
const descriptor = Object.getOwnPropertyDescriptor(input, key);
|
|
32
|
+
if (typeof key !== 'string' || !allowed.has(key) || !descriptor || !('value' in descriptor)) {
|
|
33
|
+
throw new Error('Sonos configuration contains an unsupported field.');
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
if (typeof input.host !== 'string' || input.host.length > 253 || !/^[a-z0-9](?:[a-z0-9.-]*[a-z0-9])?$/i.test(input.host)
|
|
37
|
+
|| input.host.split('.').some((label) => !label || label.length > 63 || label.startsWith('-') || label.endsWith('-'))) {
|
|
38
|
+
throw new Error('Sonos host must be a bare IPv4 address or DNS hostname.');
|
|
39
|
+
}
|
|
40
|
+
let hostname: string;
|
|
41
|
+
try { hostname = new URL(`http://${input.host}`).hostname; }
|
|
42
|
+
catch { throw new Error('Sonos host must be a valid IPv4 address or DNS hostname.'); }
|
|
43
|
+
if (hostname !== input.host.toLowerCase()) throw new Error('Sonos host must use its canonical IPv4 address or DNS hostname.');
|
|
44
|
+
const port = boundedInteger(input.port ?? 1400, 1, 65535, 'port');
|
|
45
|
+
const timeoutMs = boundedInteger(input.timeoutMs ?? 10000, 1, 120000, 'timeoutMs');
|
|
46
|
+
const maxResponseBytes = boundedInteger(input.maxResponseBytes ?? 1024 * 1024, 1024, 4 * 1024 * 1024, 'maxResponseBytes');
|
|
47
|
+
const pollIntervalMs = boundedInteger(input.pollIntervalMs ?? 5000, 100, 60000, 'pollIntervalMs');
|
|
48
|
+
return Object.freeze({
|
|
49
|
+
host: input.host.toLowerCase(), port, timeoutMs, maxResponseBytes, pollIntervalMs,
|
|
50
|
+
...(input.expectedUid === undefined ? {} : { expectedUid: normalizeSonosUid(input.expectedUid) }),
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
function boundedInteger(value: number, minimum: number, maximum: number, name: string): number {
|
|
55
|
+
if (!Number.isSafeInteger(value) || value < minimum || value > maximum) throw new Error(`Sonos ${name} must be an integer from ${minimum} to ${maximum}.`);
|
|
56
|
+
return value;
|
|
57
|
+
}
|
|
@@ -1,126 +1,8 @@
|
|
|
1
1
|
import { DiscoveryDescriptor } from '../../core/classes.discoverydescriptor.js';
|
|
2
|
-
import
|
|
3
|
-
import
|
|
2
|
+
import { SonosCandidateValidator, SonosManualMatcher, SonosMdnsMatcher, SonosSsdpMatcher } from './sonos.matchers.js';
|
|
3
|
+
import { SonosSsdpProbe } from './sonos.classes.ssdpprobe.js';
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
export * from './sonos.matchers.js';
|
|
6
6
|
|
|
7
|
-
export
|
|
8
|
-
|
|
9
|
-
public source = 'ssdp' as const;
|
|
10
|
-
public description = 'Recognize Sonos ZonePlayer SSDP advertisements.';
|
|
11
|
-
|
|
12
|
-
public async matches(recordArg: ISonosSsdpRecord): Promise<IDiscoveryMatch> {
|
|
13
|
-
const st = recordArg.st || recordArg.headers?.st || recordArg.headers?.ST;
|
|
14
|
-
const usn = recordArg.usn || recordArg.headers?.usn || recordArg.headers?.USN;
|
|
15
|
-
const location = recordArg.location || recordArg.headers?.location || recordArg.headers?.LOCATION;
|
|
16
|
-
const matched = st === sonosUpnpSt || Boolean(usn?.includes('RINCON_'));
|
|
17
|
-
if (!matched) {
|
|
18
|
-
return { matched: false, confidence: 'low', reason: 'SSDP record is not a Sonos ZonePlayer.' };
|
|
19
|
-
}
|
|
20
|
-
const url = location ? new URL(location) : undefined;
|
|
21
|
-
const id = usn?.match(/RINCON_[^:\s]+/)?.[0];
|
|
22
|
-
return {
|
|
23
|
-
matched: true,
|
|
24
|
-
confidence: id ? 'certain' : 'high',
|
|
25
|
-
reason: 'SSDP record matches Sonos ZonePlayer metadata.',
|
|
26
|
-
normalizedDeviceId: id,
|
|
27
|
-
candidate: {
|
|
28
|
-
source: 'ssdp',
|
|
29
|
-
integrationDomain: 'sonos',
|
|
30
|
-
id,
|
|
31
|
-
host: url?.hostname,
|
|
32
|
-
port: url?.port ? Number(url.port) : 1400,
|
|
33
|
-
manufacturer: 'Sonos',
|
|
34
|
-
model: 'ZonePlayer',
|
|
35
|
-
metadata: { st, usn, location },
|
|
36
|
-
},
|
|
37
|
-
};
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
export class SonosMdnsMatcher implements IDiscoveryMatcher<ISonosMdnsRecord> {
|
|
42
|
-
public id = 'sonos-mdns-match';
|
|
43
|
-
public source = 'mdns' as const;
|
|
44
|
-
public description = 'Recognize Sonos mDNS advertisements.';
|
|
45
|
-
|
|
46
|
-
public async matches(recordArg: ISonosMdnsRecord): Promise<IDiscoveryMatch> {
|
|
47
|
-
const type = recordArg.type?.toLowerCase() || '';
|
|
48
|
-
const name = recordArg.name?.toLowerCase() || '';
|
|
49
|
-
const matched = type === '_sonos._tcp.local.' || name.startsWith('sonos');
|
|
50
|
-
if (!matched) {
|
|
51
|
-
return { matched: false, confidence: 'low', reason: 'mDNS record is not a Sonos advertisement.' };
|
|
52
|
-
}
|
|
53
|
-
const id = recordArg.txt?.id || recordArg.txt?.uid || recordArg.name;
|
|
54
|
-
return {
|
|
55
|
-
matched: true,
|
|
56
|
-
confidence: id ? 'certain' : 'high',
|
|
57
|
-
reason: 'mDNS record matches Sonos metadata.',
|
|
58
|
-
normalizedDeviceId: id,
|
|
59
|
-
candidate: {
|
|
60
|
-
source: 'mdns',
|
|
61
|
-
integrationDomain: 'sonos',
|
|
62
|
-
id,
|
|
63
|
-
host: recordArg.host,
|
|
64
|
-
port: recordArg.port || 1400,
|
|
65
|
-
manufacturer: 'Sonos',
|
|
66
|
-
metadata: { mdnsName: recordArg.name, mdnsType: recordArg.type, txt: recordArg.txt },
|
|
67
|
-
},
|
|
68
|
-
};
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
export class SonosManualMatcher implements IDiscoveryMatcher<ISonosManualEntry> {
|
|
73
|
-
public id = 'sonos-manual-match';
|
|
74
|
-
public source = 'manual' as const;
|
|
75
|
-
public description = 'Recognize manual Sonos setup entries.';
|
|
76
|
-
|
|
77
|
-
public async matches(inputArg: ISonosManualEntry): Promise<IDiscoveryMatch> {
|
|
78
|
-
const matched = Boolean(inputArg.host || inputArg.model?.toLowerCase().includes('sonos') || inputArg.metadata?.sonos);
|
|
79
|
-
if (!matched) {
|
|
80
|
-
return { matched: false, confidence: 'low', reason: 'Manual entry does not contain Sonos setup hints.' };
|
|
81
|
-
}
|
|
82
|
-
return {
|
|
83
|
-
matched: true,
|
|
84
|
-
confidence: inputArg.host ? 'high' : 'medium',
|
|
85
|
-
reason: 'Manual entry can start Sonos setup.',
|
|
86
|
-
normalizedDeviceId: inputArg.id,
|
|
87
|
-
candidate: {
|
|
88
|
-
source: 'manual',
|
|
89
|
-
integrationDomain: 'sonos',
|
|
90
|
-
id: inputArg.id,
|
|
91
|
-
host: inputArg.host,
|
|
92
|
-
port: inputArg.port || 1400,
|
|
93
|
-
name: inputArg.name,
|
|
94
|
-
manufacturer: 'Sonos',
|
|
95
|
-
model: inputArg.model,
|
|
96
|
-
metadata: inputArg.metadata,
|
|
97
|
-
},
|
|
98
|
-
};
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
export class SonosCandidateValidator implements IDiscoveryValidator {
|
|
103
|
-
public id = 'sonos-candidate-validator';
|
|
104
|
-
public description = 'Validate Sonos candidate metadata.';
|
|
105
|
-
|
|
106
|
-
public async validate(candidateArg: IDiscoveryCandidate): Promise<IDiscoveryMatch> {
|
|
107
|
-
const manufacturer = candidateArg.manufacturer?.toLowerCase() || '';
|
|
108
|
-
const model = candidateArg.model?.toLowerCase() || '';
|
|
109
|
-
const matched = candidateArg.integrationDomain === 'sonos' || manufacturer === 'sonos' || model.includes('zoneplayer') || model.includes('sonos');
|
|
110
|
-
return {
|
|
111
|
-
matched,
|
|
112
|
-
confidence: matched && candidateArg.host ? 'high' : matched ? 'medium' : 'low',
|
|
113
|
-
reason: matched ? 'Candidate has Sonos metadata.' : 'Candidate is not Sonos.',
|
|
114
|
-
candidate: matched ? candidateArg : undefined,
|
|
115
|
-
normalizedDeviceId: candidateArg.id,
|
|
116
|
-
};
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
export const createSonosDiscoveryDescriptor = (): DiscoveryDescriptor => {
|
|
121
|
-
return new DiscoveryDescriptor({ integrationDomain: 'sonos', displayName: 'Sonos' })
|
|
122
|
-
.addMatcher(new SonosSsdpMatcher())
|
|
123
|
-
.addMatcher(new SonosMdnsMatcher())
|
|
124
|
-
.addMatcher(new SonosManualMatcher())
|
|
125
|
-
.addValidator(new SonosCandidateValidator());
|
|
126
|
-
};
|
|
7
|
+
export const createSonosDiscoveryDescriptor = (): DiscoveryDescriptor => new DiscoveryDescriptor({ integrationDomain: 'sonos', displayName: 'Sonos' })
|
|
8
|
+
.addProbe(new SonosSsdpProbe()).addMatcher(new SonosSsdpMatcher()).addMatcher(new SonosMdnsMatcher()).addMatcher(new SonosManualMatcher()).addValidator(new SonosCandidateValidator());
|