@smarthome.exchange/integrations 0.2.0 → 2.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 +171 -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 +40 -10
- package/dist_ts/core/classes.configstore.js +355 -32
- package/dist_ts/core/classes.discoveryengine.js +12 -2
- package/dist_ts/core/classes.nativehomeadmission.d.ts +19 -0
- package/dist_ts/core/classes.nativehomeadmission.js +84 -0
- package/dist_ts/core/classes.nativeintegrationowner.d.ts +79 -0
- package/dist_ts/core/classes.nativeintegrationowner.js +269 -0
- 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/index.d.ts +2 -0
- package/dist_ts/core/index.js +3 -1
- package/dist_ts/core/types.d.ts +27 -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.d.ts +23 -72
- package/dist_ts/integrations/braviatv/braviatv.classes.client.js +265 -625
- package/dist_ts/integrations/braviatv/braviatv.classes.configflow.d.ts +7 -7
- package/dist_ts/integrations/braviatv/braviatv.classes.configflow.js +51 -68
- package/dist_ts/integrations/braviatv/braviatv.classes.integration.d.ts +9 -12
- package/dist_ts/integrations/braviatv/braviatv.classes.integration.js +186 -135
- package/dist_ts/integrations/braviatv/braviatv.discovery.d.ts +3 -3
- package/dist_ts/integrations/braviatv/braviatv.discovery.js +12 -11
- package/dist_ts/integrations/braviatv/braviatv.mapper.d.ts +6 -14
- package/dist_ts/integrations/braviatv/braviatv.mapper.js +37 -131
- package/dist_ts/integrations/braviatv/braviatv.types.d.ts +55 -133
- package/dist_ts/integrations/braviatv/braviatv.validation.d.ts +7 -0
- package/dist_ts/integrations/braviatv/braviatv.validation.js +72 -0
- package/dist_ts/integrations/broadlink/broadlink.actions.d.ts +2 -0
- package/dist_ts/integrations/broadlink/broadlink.actions.js +36 -0
- package/dist_ts/integrations/broadlink/broadlink.classes.client.d.ts +21 -19
- package/dist_ts/integrations/broadlink/broadlink.classes.client.js +185 -124
- package/dist_ts/integrations/broadlink/broadlink.classes.configflow.d.ts +5 -4
- package/dist_ts/integrations/broadlink/broadlink.classes.configflow.js +64 -83
- package/dist_ts/integrations/broadlink/broadlink.classes.integration.d.ts +17 -20
- package/dist_ts/integrations/broadlink/broadlink.classes.integration.js +114 -59
- package/dist_ts/integrations/broadlink/broadlink.discovery.d.ts +3 -3
- package/dist_ts/integrations/broadlink/broadlink.mapper.d.ts +3 -2
- package/dist_ts/integrations/broadlink/broadlink.mapper.js +2 -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/broadlink/broadlink.selected.mapper.d.ts +10 -0
- package/dist_ts/integrations/broadlink/broadlink.selected.mapper.js +41 -0
- package/dist_ts/integrations/broadlink/broadlink.types.d.ts +43 -7
- package/dist_ts/integrations/broadlink/broadlink.validation.d.ts +7 -0
- package/dist_ts/integrations/broadlink/broadlink.validation.js +63 -0
- 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.d.ts +10 -52
- package/dist_ts/integrations/daikin/daikin.classes.client.js +55 -614
- package/dist_ts/integrations/daikin/daikin.classes.configflow.d.ts +8 -12
- package/dist_ts/integrations/daikin/daikin.classes.configflow.js +77 -138
- package/dist_ts/integrations/daikin/daikin.classes.integration.d.ts +8 -25
- package/dist_ts/integrations/daikin/daikin.classes.integration.js +175 -67
- package/dist_ts/integrations/daikin/daikin.discovery.d.ts +11 -24
- package/dist_ts/integrations/daikin/daikin.discovery.js +98 -305
- package/dist_ts/integrations/daikin/daikin.mapper.d.ts +6 -7
- package/dist_ts/integrations/daikin/daikin.mapper.js +95 -155
- package/dist_ts/integrations/daikin/daikin.types.d.ts +24 -44
- package/dist_ts/integrations/daikin/daikin.types.js +1 -1
- package/dist_ts/integrations/daikin/daikin.validation.d.ts +5 -0
- package/dist_ts/integrations/daikin/daikin.validation.js +53 -0
- 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.d.ts +31 -40
- package/dist_ts/integrations/denonavr/denonavr.classes.client.js +149 -404
- package/dist_ts/integrations/denonavr/denonavr.classes.configflow.d.ts +7 -2
- package/dist_ts/integrations/denonavr/denonavr.classes.configflow.js +44 -36
- package/dist_ts/integrations/denonavr/denonavr.classes.integration.d.ts +7 -12
- package/dist_ts/integrations/denonavr/denonavr.classes.integration.js +192 -113
- package/dist_ts/integrations/denonavr/denonavr.discovery.d.ts +10 -18
- package/dist_ts/integrations/denonavr/denonavr.discovery.js +71 -193
- package/dist_ts/integrations/denonavr/denonavr.mapper.d.ts +5 -13
- package/dist_ts/integrations/denonavr/denonavr.mapper.js +35 -159
- package/dist_ts/integrations/denonavr/denonavr.types.d.ts +55 -90
- package/dist_ts/integrations/denonavr/denonavr.validation.d.ts +10 -0
- package/dist_ts/integrations/denonavr/denonavr.validation.js +86 -0
- 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 +11 -45
- package/dist_ts/integrations/kodi/kodi.classes.client.js +84 -310
- package/dist_ts/integrations/kodi/kodi.classes.configflow.d.ts +9 -8
- package/dist_ts/integrations/kodi/kodi.classes.configflow.js +53 -48
- package/dist_ts/integrations/kodi/kodi.classes.integration.d.ts +12 -12
- package/dist_ts/integrations/kodi/kodi.classes.integration.js +114 -171
- package/dist_ts/integrations/kodi/kodi.discovery.d.ts +2 -2
- package/dist_ts/integrations/kodi/kodi.discovery.js +53 -29
- package/dist_ts/integrations/kodi/kodi.mapper.d.ts +7 -2
- package/dist_ts/integrations/kodi/kodi.mapper.js +48 -10
- package/dist_ts/integrations/kodi/kodi.types.d.ts +32 -28
- package/dist_ts/integrations/kodi/kodi.validation.d.ts +9 -0
- package/dist_ts/integrations/kodi/kodi.validation.js +62 -0
- 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.d.ts +15 -61
- package/dist_ts/integrations/modbus/modbus.classes.client.js +117 -776
- package/dist_ts/integrations/modbus/modbus.classes.configflow.d.ts +9 -5
- package/dist_ts/integrations/modbus/modbus.classes.configflow.js +70 -38
- package/dist_ts/integrations/modbus/modbus.classes.integration.d.ts +7 -18
- package/dist_ts/integrations/modbus/modbus.classes.integration.js +133 -57
- package/dist_ts/integrations/modbus/modbus.discovery.d.ts +5 -8
- package/dist_ts/integrations/modbus/modbus.discovery.js +38 -93
- package/dist_ts/integrations/modbus/modbus.mapper.d.ts +8 -32
- package/dist_ts/integrations/modbus/modbus.mapper.js +71 -431
- package/dist_ts/integrations/modbus/modbus.types.d.ts +82 -332
- package/dist_ts/integrations/modbus/modbus.validation.d.ts +10 -0
- package/dist_ts/integrations/modbus/modbus.validation.js +128 -0
- 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.d.ts +12 -34
- package/dist_ts/integrations/nanoleaf/nanoleaf.classes.client.js +143 -231
- package/dist_ts/integrations/nanoleaf/nanoleaf.classes.configflow.d.ts +6 -1
- package/dist_ts/integrations/nanoleaf/nanoleaf.classes.configflow.js +105 -18
- package/dist_ts/integrations/nanoleaf/nanoleaf.classes.integration.d.ts +9 -9
- package/dist_ts/integrations/nanoleaf/nanoleaf.classes.integration.js +141 -155
- package/dist_ts/integrations/nanoleaf/nanoleaf.credentials.d.ts +9 -0
- package/dist_ts/integrations/nanoleaf/nanoleaf.credentials.js +35 -0
- package/dist_ts/integrations/nanoleaf/nanoleaf.discovery.d.ts +3 -3
- package/dist_ts/integrations/nanoleaf/nanoleaf.mapper.d.ts +6 -18
- package/dist_ts/integrations/nanoleaf/nanoleaf.mapper.js +45 -220
- package/dist_ts/integrations/nanoleaf/nanoleaf.types.d.ts +33 -147
- package/dist_ts/integrations/nanoleaf/nanoleaf.validation.d.ts +6 -0
- package/dist_ts/integrations/nanoleaf/nanoleaf.validation.js +82 -0
- 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.d.ts +15 -20
- package/dist_ts/integrations/onkyo/onkyo.classes.client.js +161 -404
- package/dist_ts/integrations/onkyo/onkyo.classes.configflow.d.ts +9 -4
- package/dist_ts/integrations/onkyo/onkyo.classes.configflow.js +51 -6
- package/dist_ts/integrations/onkyo/onkyo.classes.integration.d.ts +22 -6
- package/dist_ts/integrations/onkyo/onkyo.classes.integration.js +144 -11
- package/dist_ts/integrations/onkyo/onkyo.discovery.d.ts +6 -1
- package/dist_ts/integrations/onkyo/onkyo.discovery.js +40 -4
- package/dist_ts/integrations/onkyo/onkyo.mapper.d.ts +7 -8
- package/dist_ts/integrations/onkyo/onkyo.mapper.js +45 -12
- package/dist_ts/integrations/onkyo/onkyo.types.d.ts +58 -8
- package/dist_ts/integrations/onkyo/onkyo.types.js +13 -102
- package/dist_ts/integrations/onkyo/onkyo.validation.d.ts +16 -0
- package/dist_ts/integrations/onkyo/onkyo.validation.js +77 -0
- 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.d.ts +25 -25
- package/dist_ts/integrations/panasonic_viera/panasonic_viera.classes.client.js +116 -360
- package/dist_ts/integrations/panasonic_viera/panasonic_viera.classes.configflow.d.ts +11 -3
- package/dist_ts/integrations/panasonic_viera/panasonic_viera.classes.configflow.js +76 -6
- package/dist_ts/integrations/panasonic_viera/panasonic_viera.classes.integration.d.ts +26 -4
- package/dist_ts/integrations/panasonic_viera/panasonic_viera.classes.integration.js +142 -9
- package/dist_ts/integrations/panasonic_viera/panasonic_viera.discovery.d.ts +2 -1
- package/dist_ts/integrations/panasonic_viera/panasonic_viera.discovery.js +31 -4
- package/dist_ts/integrations/panasonic_viera/panasonic_viera.mapper.d.ts +9 -9
- package/dist_ts/integrations/panasonic_viera/panasonic_viera.mapper.js +31 -149
- package/dist_ts/integrations/panasonic_viera/panasonic_viera.types.d.ts +51 -11
- package/dist_ts/integrations/panasonic_viera/panasonic_viera.types.js +22 -87
- package/dist_ts/integrations/panasonic_viera/panasonic_viera.validation.d.ts +6 -0
- package/dist_ts/integrations/panasonic_viera/panasonic_viera.validation.js +56 -0
- 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.d.ts +31 -16
- package/dist_ts/integrations/pioneer/pioneer.classes.client.js +167 -409
- package/dist_ts/integrations/pioneer/pioneer.classes.configflow.d.ts +10 -3
- package/dist_ts/integrations/pioneer/pioneer.classes.configflow.js +66 -6
- package/dist_ts/integrations/pioneer/pioneer.classes.integration.d.ts +13 -5
- package/dist_ts/integrations/pioneer/pioneer.classes.integration.js +239 -11
- package/dist_ts/integrations/pioneer/pioneer.discovery.d.ts +14 -1
- package/dist_ts/integrations/pioneer/pioneer.discovery.js +51 -4
- package/dist_ts/integrations/pioneer/pioneer.mapper.d.ts +14 -8
- package/dist_ts/integrations/pioneer/pioneer.mapper.js +54 -12
- package/dist_ts/integrations/pioneer/pioneer.types.d.ts +79 -12
- package/dist_ts/integrations/pioneer/pioneer.types.js +12 -76
- package/dist_ts/integrations/pioneer/pioneer.validation.d.ts +10 -0
- package/dist_ts/integrations/pioneer/pioneer.validation.js +85 -0
- 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.d.ts +13 -36
- package/dist_ts/integrations/soundtouch/soundtouch.classes.client.js +179 -502
- package/dist_ts/integrations/soundtouch/soundtouch.classes.configflow.d.ts +6 -1
- package/dist_ts/integrations/soundtouch/soundtouch.classes.configflow.js +50 -40
- package/dist_ts/integrations/soundtouch/soundtouch.classes.integration.d.ts +15 -16
- package/dist_ts/integrations/soundtouch/soundtouch.classes.integration.js +108 -128
- package/dist_ts/integrations/soundtouch/soundtouch.discovery.d.ts +2 -20
- package/dist_ts/integrations/soundtouch/soundtouch.discovery.js +23 -113
- package/dist_ts/integrations/soundtouch/soundtouch.mapper.d.ts +3 -12
- package/dist_ts/integrations/soundtouch/soundtouch.mapper.js +35 -189
- package/dist_ts/integrations/soundtouch/soundtouch.types.d.ts +57 -142
- package/dist_ts/integrations/soundtouch/soundtouch.types.js +18 -3
- package/dist_ts/integrations/soundtouch/soundtouch.validation.d.ts +22 -0
- package/dist_ts/integrations/soundtouch/soundtouch.validation.js +65 -0
- 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/index.d.ts +1 -0
- package/dist_ts/integrations/wiz/index.js +2 -1
- package/dist_ts/integrations/wiz/wiz.classes.client.d.ts +14 -28
- package/dist_ts/integrations/wiz/wiz.classes.client.js +93 -229
- package/dist_ts/integrations/wiz/wiz.classes.configflow.d.ts +6 -4
- package/dist_ts/integrations/wiz/wiz.classes.configflow.js +38 -67
- package/dist_ts/integrations/wiz/wiz.classes.integration.d.ts +11 -22
- package/dist_ts/integrations/wiz/wiz.classes.integration.js +204 -44
- package/dist_ts/integrations/wiz/wiz.discovery.d.ts +10 -31
- package/dist_ts/integrations/wiz/wiz.discovery.js +48 -249
- package/dist_ts/integrations/wiz/wiz.mapper.d.ts +7 -51
- package/dist_ts/integrations/wiz/wiz.mapper.js +82 -668
- package/dist_ts/integrations/wiz/wiz.types.d.ts +34 -208
- package/dist_ts/integrations/wiz/wiz.validation.d.ts +8 -0
- package/dist_ts/integrations/wiz/wiz.validation.js +72 -0
- 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/index.d.ts +1 -0
- package/dist_ts/integrations/yamaha/index.js +2 -1
- package/dist_ts/integrations/yamaha/yamaha.classes.client.d.ts +30 -4
- package/dist_ts/integrations/yamaha/yamaha.classes.client.js +162 -6
- package/dist_ts/integrations/yamaha/yamaha.classes.configflow.d.ts +10 -3
- package/dist_ts/integrations/yamaha/yamaha.classes.configflow.js +106 -6
- package/dist_ts/integrations/yamaha/yamaha.classes.integration.d.ts +22 -4
- package/dist_ts/integrations/yamaha/yamaha.classes.integration.js +243 -8
- package/dist_ts/integrations/yamaha/yamaha.discovery.d.ts +13 -1
- package/dist_ts/integrations/yamaha/yamaha.discovery.js +57 -4
- package/dist_ts/integrations/yamaha/yamaha.mapper.d.ts +16 -8
- package/dist_ts/integrations/yamaha/yamaha.mapper.js +58 -12
- package/dist_ts/integrations/yamaha/yamaha.types.d.ts +73 -6
- package/dist_ts/integrations/yamaha/yamaha.types.js +8 -94
- package/dist_ts/integrations/yamaha/yamaha.validation.d.ts +12 -0
- package/dist_ts/integrations/yamaha/yamaha.validation.js +89 -0
- 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 +560 -9
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/core/classes.configrecord.ts +23 -0
- package/ts/core/classes.configstore.ts +381 -25
- package/ts/core/classes.discoveryengine.ts +11 -1
- package/ts/core/classes.nativehomeadmission.ts +96 -0
- package/ts/core/classes.nativeintegrationowner.ts +297 -0
- package/ts/core/index.ts +2 -0
- package/ts/core/types.ts +31 -4
- package/ts/index.ts +6 -0
- package/ts/integrations/braviatv/braviatv.classes.client.ts +245 -709
- package/ts/integrations/braviatv/braviatv.classes.configflow.ts +47 -76
- package/ts/integrations/braviatv/braviatv.classes.integration.ts +167 -147
- package/ts/integrations/braviatv/braviatv.discovery.ts +11 -10
- package/ts/integrations/braviatv/braviatv.mapper.ts +39 -142
- package/ts/integrations/braviatv/braviatv.types.ts +53 -173
- package/ts/integrations/braviatv/braviatv.validation.ts +68 -0
- package/ts/integrations/broadlink/broadlink.actions.ts +31 -0
- package/ts/integrations/broadlink/broadlink.classes.client.ts +170 -144
- package/ts/integrations/broadlink/broadlink.classes.configflow.ts +59 -89
- package/ts/integrations/broadlink/broadlink.classes.integration.ts +110 -64
- package/ts/integrations/broadlink/broadlink.mapper.ts +5 -4
- package/ts/integrations/broadlink/broadlink.selected.mapper.ts +46 -0
- package/ts/integrations/broadlink/broadlink.types.ts +48 -8
- package/ts/integrations/broadlink/broadlink.validation.ts +66 -0
- package/ts/integrations/daikin/daikin.classes.client.ts +52 -661
- package/ts/integrations/daikin/daikin.classes.configflow.ts +72 -152
- package/ts/integrations/daikin/daikin.classes.integration.ts +166 -71
- package/ts/integrations/daikin/daikin.discovery.ts +94 -346
- package/ts/integrations/daikin/daikin.mapper.ts +83 -166
- package/ts/integrations/daikin/daikin.types.ts +27 -48
- package/ts/integrations/daikin/daikin.validation.ts +51 -0
- package/ts/integrations/daikin/readme.md +83 -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/denonavr/denonavr.classes.client.ts +132 -421
- package/ts/integrations/denonavr/denonavr.classes.configflow.ts +44 -37
- package/ts/integrations/denonavr/denonavr.classes.integration.ts +171 -117
- package/ts/integrations/denonavr/denonavr.discovery.ts +67 -220
- package/ts/integrations/denonavr/denonavr.mapper.ts +36 -182
- package/ts/integrations/denonavr/denonavr.types.ts +48 -111
- package/ts/integrations/denonavr/denonavr.validation.ts +87 -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/kodi/kodi.classes.client.ts +72 -352
- package/ts/integrations/kodi/kodi.classes.configflow.ts +52 -55
- package/ts/integrations/kodi/kodi.classes.integration.ts +97 -178
- package/ts/integrations/kodi/kodi.discovery.ts +49 -28
- package/ts/integrations/kodi/kodi.mapper.ts +52 -10
- package/ts/integrations/kodi/kodi.types.ts +33 -58
- package/ts/integrations/kodi/kodi.validation.ts +60 -0
- 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/modbus/modbus.classes.client.ts +100 -842
- package/ts/integrations/modbus/modbus.classes.configflow.ts +70 -41
- package/ts/integrations/modbus/modbus.classes.integration.ts +115 -60
- package/ts/integrations/modbus/modbus.discovery.ts +38 -106
- package/ts/integrations/modbus/modbus.mapper.ts +64 -467
- package/ts/integrations/modbus/modbus.types.ts +64 -381
- package/ts/integrations/modbus/modbus.validation.ts +119 -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/nanoleaf/nanoleaf.classes.client.ts +115 -249
- package/ts/integrations/nanoleaf/nanoleaf.classes.configflow.ts +90 -19
- package/ts/integrations/nanoleaf/nanoleaf.classes.integration.ts +130 -181
- package/ts/integrations/nanoleaf/nanoleaf.credentials.ts +39 -0
- package/ts/integrations/nanoleaf/nanoleaf.mapper.ts +47 -260
- package/ts/integrations/nanoleaf/nanoleaf.types.ts +29 -147
- package/ts/integrations/nanoleaf/nanoleaf.validation.ts +77 -0
- package/ts/integrations/onkyo/onkyo.classes.client.ts +148 -457
- package/ts/integrations/onkyo/onkyo.classes.configflow.ts +52 -6
- package/ts/integrations/onkyo/onkyo.classes.integration.ts +121 -12
- package/ts/integrations/onkyo/onkyo.discovery.ts +41 -3
- package/ts/integrations/onkyo/onkyo.mapper.ts +46 -19
- package/ts/integrations/onkyo/onkyo.types.ts +55 -110
- package/ts/integrations/onkyo/onkyo.validation.ts +85 -0
- package/ts/integrations/onkyo/readme.md +126 -0
- package/ts/integrations/openhome/openhome.classes.client.ts +22 -18
- package/ts/integrations/panasonic_viera/panasonic_viera.classes.client.ts +101 -398
- package/ts/integrations/panasonic_viera/panasonic_viera.classes.configflow.ts +69 -5
- package/ts/integrations/panasonic_viera/panasonic_viera.classes.integration.ts +141 -9
- package/ts/integrations/panasonic_viera/panasonic_viera.discovery.ts +32 -3
- package/ts/integrations/panasonic_viera/panasonic_viera.mapper.ts +34 -161
- package/ts/integrations/panasonic_viera/panasonic_viera.types.ts +52 -96
- package/ts/integrations/panasonic_viera/panasonic_viera.validation.ts +56 -0
- package/ts/integrations/pioneer/pioneer.classes.client.ts +132 -428
- package/ts/integrations/pioneer/pioneer.classes.configflow.ts +67 -5
- package/ts/integrations/pioneer/pioneer.classes.integration.ts +225 -11
- package/ts/integrations/pioneer/pioneer.discovery.ts +45 -3
- package/ts/integrations/pioneer/pioneer.mapper.ts +57 -13
- package/ts/integrations/pioneer/pioneer.types.ts +87 -85
- package/ts/integrations/pioneer/pioneer.validation.ts +84 -0
- 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/soundtouch/soundtouch.classes.client.ts +152 -571
- package/ts/integrations/soundtouch/soundtouch.classes.configflow.ts +47 -42
- package/ts/integrations/soundtouch/soundtouch.classes.integration.ts +95 -150
- package/ts/integrations/soundtouch/soundtouch.discovery.ts +21 -133
- package/ts/integrations/soundtouch/soundtouch.mapper.ts +36 -207
- package/ts/integrations/soundtouch/soundtouch.types.ts +50 -195
- package/ts/integrations/soundtouch/soundtouch.validation.ts +60 -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/wiz/index.ts +1 -0
- package/ts/integrations/wiz/wiz.classes.client.ts +84 -254
- package/ts/integrations/wiz/wiz.classes.configflow.ts +39 -70
- package/ts/integrations/wiz/wiz.classes.integration.ts +189 -45
- package/ts/integrations/wiz/wiz.discovery.ts +48 -291
- package/ts/integrations/wiz/wiz.mapper.ts +81 -754
- package/ts/integrations/wiz/wiz.types.ts +24 -224
- package/ts/integrations/wiz/wiz.validation.ts +73 -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/yamaha/index.ts +1 -0
- package/ts/integrations/yamaha/yamaha.classes.client.ts +150 -6
- package/ts/integrations/yamaha/yamaha.classes.configflow.ts +100 -5
- package/ts/integrations/yamaha/yamaha.classes.integration.ts +236 -8
- package/ts/integrations/yamaha/yamaha.discovery.ts +52 -3
- package/ts/integrations/yamaha/yamaha.mapper.ts +65 -13
- package/ts/integrations/yamaha/yamaha.types.ts +77 -97
- package/ts/integrations/yamaha/yamaha.validation.ts +86 -0
- package/ts/integrations/yeelight/readme.md +47 -0
- package/ts/integrations/yeelight/yeelight.classes.client.ts +201 -302
- package/ts/integrations/yeelight/yeelight.classes.configflow.ts +23 -32
- package/ts/integrations/yeelight/yeelight.classes.integration.ts +115 -87
- package/ts/integrations/yeelight/yeelight.discovery.ts +78 -140
- package/ts/integrations/yeelight/yeelight.mapper.ts +61 -191
- package/ts/integrations/yeelight/yeelight.types.ts +31 -162
- package/ts/integrations/yeelight/yeelight.validation.ts +112 -0
- package/ts/integrations/zha/readme.md +23 -0
- package/ts/integrations/zha/zha.discovery.ts +92 -232
- package/ts/integrations/zha/zha.discoveryvalidation.ts +67 -0
- package/ts/integrations/zigbee2mqtt/index.ts +5 -0
- package/ts/integrations/zigbee2mqtt/readme.md +40 -0
- package/ts/integrations/zigbee2mqtt/zigbee2mqtt.classes.configflow.ts +26 -0
- package/ts/integrations/zigbee2mqtt/zigbee2mqtt.classes.integration.ts +23 -0
- package/ts/integrations/zigbee2mqtt/zigbee2mqtt.classes.runtime.ts +414 -0
- package/ts/integrations/zigbee2mqtt/zigbee2mqtt.mapper.ts +172 -0
- package/ts/integrations/zigbee2mqtt/zigbee2mqtt.types.ts +63 -0
- package/ts/integrations/zigbee2mqtt/zigbee2mqtt.validation.ts +65 -0
- package/ts/integrations/zwave_js/readme.md +23 -0
- package/ts/integrations/zwave_js/zwave_js.classes.client.ts +256 -136
- package/ts/integrations/zwave_js/zwave_js.classes.configflow.ts +26 -28
- package/ts/integrations/zwave_js/zwave_js.classes.integration.ts +65 -81
- package/ts/integrations/zwave_js/zwave_js.discovery.ts +100 -15
- package/ts/integrations/zwave_js/zwave_js.mapper.ts +129 -256
- package/ts/integrations/zwave_js/zwave_js.types.ts +32 -19
- package/ts/integrations/zwave_js/zwave_js.validation.ts +191 -0
- package/ts/plugins.ts +12 -3
- package/ts_migration/001.import-json-config.ts +81 -0
- package/ts_migration/index.ts +1 -0
- package/ts/integrations/tasmota/.generated-by-smarthome-exchange +0 -1
- package/ts/integrations/tuya/.generated-by-smarthome-exchange +0 -1
package/readme.md
CHANGED
|
@@ -30,11 +30,13 @@ const candidates = await engine.runActiveDiscovery({});
|
|
|
30
30
|
console.log(candidates);
|
|
31
31
|
```
|
|
32
32
|
|
|
33
|
+
Pass `abortSignal` to `runActiveDiscovery()` to cancel discovery. Cancellation rejects with the caller's original reason even when an admitted probe reports its own error after abort, admits no further probes, and does not return a partial candidate list. An uncancelled probe failure preserves the probe's original error. Each admitted probe remains responsible for closing its owned resources.
|
|
34
|
+
|
|
33
35
|
## Public Surface
|
|
34
36
|
|
|
35
37
|
| Export group | What it gives you |
|
|
36
38
|
| --- | --- |
|
|
37
|
-
| Core classes | `BaseIntegration`, `DescriptorOnlyIntegration`, `DiscoveryDescriptor`, `DiscoveryEngine`, `IntegrationRegistry`, `IntegrationRuntimeManager`, `ConsoleLogger`, `
|
|
39
|
+
| Core classes | `BaseIntegration`, `DescriptorOnlyIntegration`, `DiscoveryDescriptor`, `DiscoveryEngine`, `IntegrationRegistry`, `IntegrationRuntimeManager`, `ConsoleLogger`, `NoSqlConfigStore`. |
|
|
38
40
|
| Core errors | `IntegrationError`, `DiscoveryError`, `AuthenticationError`, `DeviceCommunicationError`. |
|
|
39
41
|
| Core types | Discovery, config-flow, runtime, service-call, entity, logging, and integration status contracts. |
|
|
40
42
|
| Protocol namespaces | `mdns`, `ssdp`, `http`, `mqtt`, `bluetooth`, and `usb` descriptor helpers. |
|
|
@@ -42,6 +44,43 @@ console.log(candidates);
|
|
|
42
44
|
| Generated metadata | `generatedHomeAssistantPortIntegrations`, `generatedHomeAssistantPortCount`, and `handwrittenHomeAssistantPortDomains`. |
|
|
43
45
|
| Handwritten modules | All handwritten integration folders are re-exported from `ts/integrations/index.ts`. |
|
|
44
46
|
|
|
47
|
+
## Durable Integration Config
|
|
48
|
+
|
|
49
|
+
`NoSqlConfigStore` implements `IConfigStore` through the public document-model APIs of `@lossless.org/client/nosqldb`. It replaces `JsonFileConfigStore`; application config is no longer persisted on the filesystem. Supply a connected, caller-owned `SmartdataDb`, an authenticated home ID, an integration domain and an external key provider:
|
|
50
|
+
|
|
51
|
+
This is a breaking API change: remove the `JsonFileConfigStore` import and replace `new JsonFileConfigStore(filePath)` with the options-based constructor below. Await `initialize()` before passing the store to integration contexts. Existing `IConfigStore` calls to `get()`, `set()`, `delete()` and `list()` remain valid; each also accepts optional transaction options. Existing JSON files are not read automatically; import them explicitly with the migration described below before switching the application to the new store. The database and encryption-key provider are required to keep config durable, scoped and encrypted.
|
|
52
|
+
|
|
53
|
+
```ts
|
|
54
|
+
import { NoSqlConfigStore } from '@smarthome.exchange/integrations';
|
|
55
|
+
|
|
56
|
+
const store = new NoSqlConfigStore({
|
|
57
|
+
db,
|
|
58
|
+
homeId: authenticatedHome.id,
|
|
59
|
+
integrationDomain: 'hue',
|
|
60
|
+
keyProvider: {
|
|
61
|
+
currentKey: (signal) => secretProvider.currentEncryptionKey(signal),
|
|
62
|
+
keyForId: (keyId, signal) => secretProvider.encryptionKeyById(keyId, signal),
|
|
63
|
+
},
|
|
64
|
+
});
|
|
65
|
+
await store.initialize();
|
|
66
|
+
await store.set('bridge', bridgeConfig);
|
|
67
|
+
const restoredConfig = await store.get('bridge');
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
`db`, `authenticatedHome`, `bridgeConfig` and `secretProvider` are application-owned collaborators. The store neither creates nor closes the database. Initialize it before opening a transaction so its indexes are ready. Choose its immutable home/domain scope from authorized server context. `IConfigStore` injection remains available in discovery, config-flow and setup contexts.
|
|
71
|
+
|
|
72
|
+
`getScope()` returns a new frozen `IConfigStoreScope` containing the immutable `homeId` and `integrationDomain` captured at construction. The snapshot remains available after close and contains no database or encryption credentials. `IConfigStore` exposes this capability optionally; integrations requiring scoped storage must reject a missing or mismatched scope before accessing config. A scope declaration does not grant home access: compare it against verified server context.
|
|
73
|
+
|
|
74
|
+
`initialize({ signal })` prepares the declared collection and indexes through the client's public `prepareCollection()` API. The configured `timeoutMs` bounds the entire preparation, including waiting for another preparation and cleanup; an optional caller signal cancels that caller's attempt. Failed or cancelled preparation can be retried on the same open store. Await `close()` during shutdown: it stops admission, cancels this store's preparation and key lookups, refuses queued operations and joins admitted work, including the actual encryption-provider callbacks after a caller deadline expires. It publishes one stable promise before abort listeners run. A provider that never settles keeps cleanup pending. An unrelated provider rejection after cancellation produces a sanitized cleanup failure after all siblings settle; repeated `close()` calls retain that original rejection. Explicit terminal `retryCleanup()` acknowledges only settled retained provider failures. It does not call the provider or database again, replay a config operation or reopen the store. Resource owners must use this method for explicit cleanup retry. In-flight database operations and caller-owned transactions retain their client deadlines and ownership; close does not close the database, session or key provider. A closed store cannot be reopened.
|
|
75
|
+
|
|
76
|
+
Every config value, including credentials, is encrypted with AES-256-GCM and a fresh 12-byte nonce. `currentKey(signal)` returns `{ id, key }`, where `key` contains exactly 32 bytes; `keyForId(id, signal)` resolves an older key or returns `undefined`. Keep keys in an external secret provider, preserve old keys while records still reference them, and honor cancellation. The store binds the ciphertext to its schema version, key ID, home ID, integration domain and config key. A missing key, corrupt envelope or failed authentication rejects the read. Normal writes use the current key, so rewriting a value rotates its encryption without changing its scope.
|
|
77
|
+
|
|
78
|
+
The database stores one document per config key with unique scope indexes. Atomic writes preserve unrelated keys across independent instances; `get()` does not cache values. Operations on one store execute in invocation order, including read-after-write ordering. Admission defaults to 1,000 active, queued or retained operations and rejects at capacity. An operation uses one slot while active; after its caller deadline expires, pending actual provider work retains that slot until fulfillment. A late unrelated provider failure retains it until explicit terminal cleanup acknowledgment. Ordinary settled failures release admission. `timeoutMs` defaults to 5,000 and bounds each key-provider lookup and each database call outside a transaction. Values must be finite JSON data, with dense arrays and plain objects, at most 32 levels deep and 64 KiB by default. Optional object fields whose value is `undefined` are omitted; `undefined` array elements and top-level values reject. `maxValueBytes` can raise that limit to 1 MiB; large payloads belong in object storage. `create()` inserts without replacing an existing key.
|
|
79
|
+
|
|
80
|
+
All config operations accept `IConfigStoreOperationOptions` with a public `SmartdataSession` from the same database. Call `initialize()` before starting a transaction, then sequentially await `get(key, { session })`, `set(key, value, { session })`, `create(key, value, { session })`, `delete(key, { session })` and `list(prefix, { session })` inside `session.withTransaction(callback, { timeoutMS, signal })`. Reads and lists see that transaction's writes, and config writes can commit or roll back with another model's ownership-lease update. The caller owns commit, rollback and session close. Session-carrying operations omit their database timeout because the caller's transaction supplies it; always provide a transaction deadline. Key lookup keeps its separate store deadline, so cancellation during a lookup waits for that lookup to settle or time out before the transaction rejects. No database operation is detached on timeout; the client settles its operation and rollback cleanup before rejecting. Do not retry an unknown commit outcome: inspect `SmartdataSession.getCommitOutcome(error)` and reconcile durable state first.
|
|
81
|
+
|
|
82
|
+
Existing JSON files can be imported explicitly through `importLegacyJsonConfig()` from `@smarthome.exchange/integrations/migration`. Pass the same store options plus `sourcePath`. The versioned module under `ts_migration/` reads at most 1 MiB, requires an object root, and uses one transaction to insert all values and record completion. Any existing config key refuses the entire import. Re-running the same completed source returns `{ applied: false, importedKeys }` without replacing subsequent edits; a changed source rejects. The source file is never written, renamed or removed, and no file import runs implicitly during normal store initialization. Migration requires a database supporting transactions.
|
|
83
|
+
|
|
45
84
|
## Integration Lifecycle
|
|
46
85
|
|
|
47
86
|
```ts
|
|
@@ -52,14 +91,11 @@ if (!integration) {
|
|
|
52
91
|
}
|
|
53
92
|
|
|
54
93
|
const matches = await engine.validateCandidate({
|
|
55
|
-
id: '
|
|
94
|
+
id: '001788fffe123456',
|
|
56
95
|
source: 'manual',
|
|
57
96
|
integrationDomain: 'hue',
|
|
58
97
|
host: '192.168.1.20',
|
|
59
98
|
name: 'Office Hue Bridge',
|
|
60
|
-
metadata: {
|
|
61
|
-
baseUrl: 'https://192.168.1.20',
|
|
62
|
-
},
|
|
63
99
|
});
|
|
64
100
|
|
|
65
101
|
console.log(matches);
|
|
@@ -71,14 +107,15 @@ Runtime setup receives an optional abort signal. Device snapshots, subscriptions
|
|
|
71
107
|
|
|
72
108
|
## Home Assistant Runtime
|
|
73
109
|
|
|
74
|
-
The handwritten `homeassistant` integration connects to `/api/websocket` with a long-lived access token held only in runtime configuration. Setup does not become ready until Home Assistant has delivered the first complete entity snapshot. The official connection owns socket reconnection and subscription restoration; disconnects mark normalized devices offline immediately. Each reconnect remains unready until an authoritative state refresh
|
|
110
|
+
The handwritten `homeassistant` integration connects to `/api/websocket` with a long-lived access token held only in runtime configuration. Setup does not become ready until Home Assistant has delivered the first complete entity snapshot. The official connection owns socket reconnection and subscription restoration; disconnects mark normalized devices offline immediately. Each reconnect remains unready until an authoritative state refresh, a fresh service catalogue, and a fresh entity-registry provenance check all succeed. Failed reconnect refreshes use adapter-owned exponential backoff from 1 through 30 seconds. If the socket reconnects during strict startup, validation restarts against the current connection generation before setup may succeed. While an authoritative snapshot or registry refresh is pending, only selected state events are retained, coalesced by entity ID, and replayed onto the snapshot.
|
|
75
111
|
|
|
76
|
-
Optional `entityIds` and `entityDomains` are allowlists with intersection semantics when both are present. Set `requireEntityIds: true` to fail setup when any configured entity is absent. Set `requireEntityRegistry: true` together with `requireEntityIds` to require Home Assistant's `config/entity_registry/list_for_display` response
|
|
112
|
+
Optional `entityIds` and `entityDomains` are allowlists with intersection semantics when both are present. Set `requireEntityIds: true` to fail setup when any configured entity is absent. Set `requireEntityRegistry: true` together with `requireEntityIds` to require an entry for every selected entity in Home Assistant's `config/entity_registry/list_for_display` response. Every setup records available entity integration platforms in `metadata.homeAssistantPlatform`. The runtime exposes read-only state for all selected entities, controlled power and percentage brightness for supported lights, power for switches and input booleans, energy telemetry for power and energy sensors, and supported write-only vacuum commands. It does not expose unrestricted Home Assistant service calls.
|
|
77
113
|
|
|
78
114
|
```ts
|
|
79
115
|
import { HomeAssistantHomeassistantIntegration } from "@smarthome.exchange/integrations";
|
|
80
116
|
|
|
81
117
|
const runtime = await new HomeAssistantHomeassistantIntegration().setup({
|
|
118
|
+
homeId: "house-a",
|
|
82
119
|
baseUrl: "http://homeassistant.local:8123",
|
|
83
120
|
accessToken: homeAssistantToken,
|
|
84
121
|
entityDomains: ["light", "sensor", "switch", "vacuum"],
|
|
@@ -96,7 +133,7 @@ try {
|
|
|
96
133
|
}
|
|
97
134
|
```
|
|
98
135
|
|
|
99
|
-
`baseUrl` and `accessToken` are required. `entityIds` and `entityDomains` are optional intersecting allowlists. Required-entity and registry checks need a non-empty `entityIds` allowlist; registry enforcement also requires required-entity enforcement, and every required entity's domain must be allowed by `entityDomains` when that filter is present. `setupRetry` must be a finite non-negative integer and controls the adapter-owned, abortable retry loop; each official websocket connection/socket call receives `setupRetry: 0` so it cannot start an unbounded nested retry. `initialSnapshotTimeoutMs` is a timer-safe integer from 1 through 2,147,483,647 and provides one shared deadline for socket creation and authentication, initial subscription acknowledgement, the first complete entity snapshot, and
|
|
136
|
+
`homeId`, `baseUrl` and `accessToken` are required. Device and entity IDs include the configured home and a stable hash of the endpoint origin; writes validate that immutable scope and the current canonical device/feature before dispatch. The integration always fetches real service and entity-registry catalogues before readiness, and only currently advertised service controls are writable. Catalogue-change events and reconnects refresh all three authoritative snapshots. See the [Home Assistant runtime](ts/integrations/homeassistant/readme.md) for the configuration migration and exact boundaries. `entityIds` and `entityDomains` are optional intersecting allowlists. Required-entity and registry checks need a non-empty `entityIds` allowlist; registry enforcement also requires required-entity enforcement, and every required entity's domain must be allowed by `entityDomains` when that filter is present. `setupRetry` must be a finite non-negative integer and controls the adapter-owned, abortable retry loop; each official websocket connection/socket call receives `setupRetry: 0` so it cannot start an unbounded nested retry. `initialSnapshotTimeoutMs` is a timer-safe integer from 1 through 2,147,483,647 and provides one shared deadline for socket creation and authentication, initial subscription acknowledgement, the first complete entity snapshot, live service catalogue and entity-registry provenance. `serviceCallTimeoutMs` has the same range, defaults to 15 seconds, and bounds every write even when the caller does not supply an abort signal. Aborted or timed-out writes cancel the pending command by forcing the owned connection through its normal reconnect lifecycle. Required-entity loss blocks health and writes; recreation remains unready until registry provenance is revalidated. Among Home Assistant entity state values, `unknown` remains present and online with an unknown value while `unavailable` marks an entity offline; socket disconnection also marks normalized devices offline immediately.
|
|
100
137
|
|
|
101
138
|
The runtime requires native WebSocket support from Node.js 22.4 or newer. Production packaging must verify that runtime version. Hue, ZHA/SkyConnect, Roborock, Huawei SUN2000, and FHEM/MQTT entities remain subject to live-device acceptance testing; SUN2000 settings are not writable through this generic allowlist, and the adapter itself does not claim that those upstream integrations are configured.
|
|
102
139
|
|
|
@@ -110,7 +147,9 @@ Current generated metadata is exposed through `generatedHomeAssistantPortCount`
|
|
|
110
147
|
|
|
111
148
|
The default `integrations` array registers handwritten integrations tracked by `handwrittenHomeAssistantPortDomains` plus custom integrations such as Wolf Smartset. These handwritten folders are exported as named modules and registered before generated descriptors, so handwritten code wins whenever a generated Home Assistant descriptor has the same domain.
|
|
112
149
|
|
|
113
|
-
Examples include Home Assistant, Hue, AdGuard, AirGradient, Amcrest, Android TV, APC UPSD, ASUSWRT, Axis, BleBox, Bosch SHC, Broadlink, deCONZ, Denon AVR, DSMR, ESPHome, Fritz, HomeKit Controller, Homematic, KNX, Kodi, Matter, MQTT, Nanoleaf, ONVIF, Pi-hole, Plex, Roku, Shelly, Sonos, Synology DSM, TP-Link, Tradfri, UniFi, Wolf Smartset, Xiaomi Miio, Yeelight, ZHA, and Z-Wave JS.
|
|
150
|
+
Examples include Home Assistant, Hue, AdGuard, AirGradient, Amcrest, Android TV, APC UPSD, ASUSWRT, Axis, BleBox, Bosch SHC, Broadlink, deCONZ, Denon AVR, DSMR, ESPHome, Fritz, HomeKit Controller, Homematic, KNX, Kodi, Matter, MQTT, Nanoleaf, ONVIF, Pi-hole, Plex, Roku, Shelly, Sonos, Synology DSM, Tasmota, TP-Link, Tradfri, UniFi, Wolf Smartset, Xiaomi Miio, Yeelight, ZHA, and Z-Wave JS.
|
|
151
|
+
|
|
152
|
+
The native [Tasmota runtime](./ts/integrations/tasmota/readme.md) connects selected devices directly through MQTT. It provides relay and single-channel brightness controls plus read-only sensor telemetry, requires fresh device state before writes, and is registered as `control-runtime` rather than a generated descriptor.
|
|
114
153
|
|
|
115
154
|
The generator updates the barrel export file during `pnpm generate:ha`, so the named export surface stays aligned with preserved handwritten folders instead of drifting back to a short manual list.
|
|
116
155
|
|
|
@@ -154,6 +193,20 @@ pnpm build
|
|
|
154
193
|
pnpm buildDocs
|
|
155
194
|
```
|
|
156
195
|
|
|
196
|
+
Release preflight on the shared Linux build host acquires `$HOME/.cache/shx-heavy.lock` separately for the complete serial `pnpm test` suite and `pnpm build`. Each lock wait is bounded to 240 seconds; exit 75 means the lock was unavailable, so retry the preflight after the other heavy check completes. Publication and registry verification run after those check processes release the lock.
|
|
197
|
+
|
|
198
|
+
## Native Home and Lifetime Ownership
|
|
199
|
+
|
|
200
|
+
Native adapters using the shared ownership core require `homeId` in their setup and config-flow context, selected independently by the embedding host. An optional constructor home is an additional fixed constraint; it never supplies a missing context home. Configuration, editable fields, discovery metadata and storage scope cannot choose the host home. Generic registry factories remain inert. The first validated context fixes the instance home before asynchronous work, including when setup later fails. A different home needs a new instance.
|
|
201
|
+
|
|
202
|
+
This is an embedding-host contract. It grants no authentication or authorization by itself. A Hub must select an explicit operator home and enforce its authenticated request boundary before passing context. Display defaults and request payloads are not home authority.
|
|
203
|
+
|
|
204
|
+
An optional `NoSqlConfigStore` must be an actual instance with the exact selected home and integration domain. It remains borrowed with its database and key provider. Protocol-only paths may omit it; encrypted credential-reference or restoration paths still require their documented persistence capability. No store scope or fallback storage supplies a home.
|
|
205
|
+
|
|
206
|
+
`NativeHomeAdmission`, `NativeIntegrationOwner` and its child flow scopes provide reusable admission and cleanup for native adapters. The default capacity16 counts pending work, live runtimes, retained failed cleanup and additional owned resources. Register cleanup before foreign callbacks, capture the admitted context, and promote only prepared runtimes. Close is terminal and joins actual admitted work and sibling cleanup even if one fails. It publishes its stable promise before synchronous abort listeners run. Caller cancellation closes its retained runtime lease.
|
|
207
|
+
|
|
208
|
+
Cleanup failures remain observable and retain capacity. `retryCleanup()` explicitly retries failed cleanup only; it never repeats setup or transport effects or reopens the owner. Completed admitted persistence writes keep their actual result during close. Borrowed persistence resources are never closed by an adapter, and cancellation makes no claim that a physical effect was rolled back.
|
|
209
|
+
|
|
157
210
|
## License and Legal Information
|
|
158
211
|
|
|
159
212
|
This repository contains open-source code licensed under the MIT License. A copy of the license can be found in the [LICENSE](./license.md) file.
|
|
@@ -174,3 +227,501 @@ Registered at District Court Bremen HRB 35230 HB, Germany
|
|
|
174
227
|
For any legal inquiries or further information, please contact us via email at hello@task.vc.
|
|
175
228
|
|
|
176
229
|
By using this repository, you acknowledge that you have read this section, agree to comply with its terms, and understand that the licensing of the code does not imply endorsement by Task Venture Capital GmbH of any derivative works.
|
|
230
|
+
|
|
231
|
+
### Nanoleaf native local controller
|
|
232
|
+
|
|
233
|
+
Every setup and config-flow call requires a separately selected host `context.homeId`; constructor binding, controller config and encrypted store cannot supply it. Nanoleaf configuration requires an explicit matching `homeId`, selected literal private/loopback/link-local unicast IPv4 HTTP(S) `origin`, exact `expectedSerialNumber`, documented Light Panels API `expectedModel`, and `credentialKey`. Use a caller-supplied encrypted `NoSqlConfigStore` scoped to that home and the `nanoleaf` domain, or construct `NanoleafIntegration({ db, keyProvider })` with public `@lossless.org/client/nosqldb` and an external encryption key provider. The integration closes stores it creates and retains caller-owned stores, database and key provider.
|
|
234
|
+
|
|
235
|
+
The config flow takes an existing token, validates the selected controller's real identity, and insert-only persists a versioned identity/endpoint-bound token envelope in the encrypted public store. It returns only a credential reference, never the token. The caller can provision or rotate an existing token with the public `nanoleafCredential(config, token)` and `nanoleafCredentialKey(config)` helpers and `store.set(...)`; each admitted operation retrieves the current encrypted record. Pairing and revocation remain explicit external operations.
|
|
236
|
+
|
|
237
|
+
Vendor plaintext HTTP requires `allowUnencryptedHttp: true`; HTTPS preserves certificate and hostname checks and optionally accepts an explicit `certificateAuthority` PEM. These selected local endpoints are not cryptographic Nanoleaf identities over plaintext HTTP. Advertisements are setup hints only, and runtime identity is verified against exact serial/model before controls.
|
|
238
|
+
|
|
239
|
+
One home-scoped aggregate controller is mapped from current observations. Power is absolute boolean; brightness is exact integer percent inside its current advertised range; color temperature is exact Kelvin inside its current advertised range. A select entity and scene control exist only for current non-reserved advertised scenes. Numeric capabilities absent in current observations are not fabricated. Service targets require the exact controller ID or corresponding light/scene entity. Writable features forward caller cancellation. Every control is submitted once, and reports HTTP acknowledgement separately from fresh observed state and `physicalCompletion: 'unconfirmed'`. A response may acknowledge a command without changing observed state; an ambiguous transport/readback after submission is `indeterminate` and never replayed.
|
|
240
|
+
|
|
241
|
+
Breaking migration: legacy `host`/`port`, inline `authToken`/`token`, injected cached snapshots, optimistic updates, arbitrary effects, hue/RGB conversion, identify, per-panel/rhythm inference, increments/transitions and no-op destruction are removed. Configure the explicit identity-bound encrypted token reference and use `light.turn_on`, `light.turn_off`, `light.set_brightness` with `{ brightness }`, `light.set_color_temperature` with `{ kelvin }`, or `select.select_option` with `{ option }`. `nanoleaf.snapshot` reads current observations. Destroy is terminal, publishes one promise before abort callbacks and joins admitted credential callbacks, owned HTTP/TLS requests, stores created by the adapter and setup work. The shared owner retains failed cleanup for explicit `retryCleanup()` without reopening or replaying effects.
|
|
242
|
+
|
|
243
|
+
Verified only with local real HTTP/TLS fixtures and disposable public-client NoSQL fixtures. No real controller, firmware behavior or physical completion was checked.
|
|
244
|
+
|
|
245
|
+
### Native WiZ selected-device runtime
|
|
246
|
+
|
|
247
|
+
WiZ uses `@ecobridge.xyz/devicemanager`'s published `WizProtocol`. Supply an exact `homeId`, private/link-local/loopback unicast IPv4 `host`, and unicast `macAddress`; optional `port` defaults to 38899. Hostnames, public addresses, broadcast, snapshots, manual capability declarations, arbitrary command executors and raw `setPilot` are rejected. Supplied mDNS/UDP/manual advertisements are unauthenticated setup hints only. This integration does not broadcast registration or provision devices.
|
|
248
|
+
|
|
249
|
+
Setup and config flow require independent explicit `context.homeId`; constructor binding, config, editable fields and store scope cannot supply it. An optional actual `NoSqlConfigStore` must match that home and the WiZ domain and remains borrowed with its database and key provider. Protocol-only setup and flow work without a store. When a store is supplied, the flow verifies current system/pilot MAC identity before saving the selected config under `device:<normalized MAC>`; mismatched or failed admission does not persist a selection. Runtime shutdown closes its shared owner lease without closing the borrowed store; failed owned cleanup remains observable until explicit `retryCleanup()`.
|
|
250
|
+
|
|
251
|
+
Known single-head RGB/tunable-white/dimmable-white lights and sockets expose only the capability subset admitted by current module identification and actual pilot fields. Unknown, dual-head and fan models remain observable and read-only. Only explicit power, brightness (integer 1–100), and RGB (three integer bytes) controls are available. Temperature and scene IDs are observed read-only values; no invented scenes, toggles, fan/dual-head mappings, white-temperature writes or compound commands are supported.
|
|
252
|
+
|
|
253
|
+
Device and entity IDs include the exact encoded home ID and MAC. Services require an owned device/entity target and reject conflicting targets, accessors and unsupported fields before dispatch. `light.turn_on`/`light.turn_off` accept no data, `light.set_brightness` accepts exactly `{ brightness }`, and `light.set_rgb` accepts exactly `{ rgb: { red, green, blue } }`. Sockets use `switch.turn_on`/`switch.turn_off`. Canonical feature writes ignore caller-supplied writable flags and require exact home/device ownership and an observed supported feature; RGB feature values use `"red,green,blue"` decimal bytes.
|
|
254
|
+
|
|
255
|
+
Every control gets fresh identity/capability preflight and sends its effect once. Results retain `not-sent`, `rejected`, `indeterminate` or `accepted` and always report `physicalStateConfirmed: false`. A positive firmware acknowledgement means acceptance; independent readback may disagree. If accepted readback fails, the result keeps `outcome: 'accepted'` with the protocol error code, `success: false`, and no automatic replay. Observed state never receives an optimistic desired-value patch.
|
|
256
|
+
|
|
257
|
+
Subscriptions deliver current authoritative observations and poll serially only while subscribed. `pollIntervalMs` defaults to 30000; zero disables polling and positive values must be at least 100 milliseconds. Unsubscribe cancels owned polling and removes its abort listener. Caller lifetime cancellation and terminal/idempotent destruction drain admitted operations and UDP sockets, remove subscriptions/timers, and permanently forbid new work. Synchronously failing subscription callbacks are removed and reported through the supplied logger; initial delivery errors reject subscription setup. The protocol's lifetime exchange bound (`maxExchanges`, default 4096) remains explicit; exhaustion closes polling and requires a new explicitly set-up runtime.
|
|
258
|
+
|
|
259
|
+
WiZ LAN UDP is not cryptographically authenticated. Address/MAC/source-port consistency does not establish authorization, attacker-resistant replay protection or physical actuation. The hub must enforce caller identity, home grants and scopes before calling integrations. RGB/brightness can have firmware-defined mode or power effects even though only the caller's explicit supported fields are sent. No hardware was accessed; model-specific firmware and physical actuation remain unverified.
|
|
260
|
+
|
|
261
|
+
Protocol sources: [pywizlight bulb implementation](https://github.com/sbidy/pywizlight/blob/master/pywizlight/bulb.py) and [pywizlight model/capability identification](https://github.com/sbidy/pywizlight/blob/master/pywizlight/bulblibrary.py).
|
|
262
|
+
|
|
263
|
+
### Selected Denon and Marantz receivers
|
|
264
|
+
|
|
265
|
+
`DenonavrIntegration` uses the published `@ecobridge.xyz/devicemanager`
|
|
266
|
+
`DenonProtocol`. Supported profiles are Denon AVR-1913/AVR-2113CI and Marantz
|
|
267
|
+
NR1605/SR5009. One runtime selects one receiver and its main zone.
|
|
268
|
+
|
|
269
|
+
```typescript
|
|
270
|
+
const integration = new DenonavrIntegration({ homeId: 'my-home' });
|
|
271
|
+
const runtime = await integration.setup({
|
|
272
|
+
homeId: 'my-home',
|
|
273
|
+
host: '192.168.1.42',
|
|
274
|
+
descriptionUrl: selectedDescriptionUrl,
|
|
275
|
+
expectedUdn: selectedReceiverUdn,
|
|
276
|
+
model: 'AVR-1913',
|
|
277
|
+
maximumVolumeDb: -10,
|
|
278
|
+
}, { homeId: 'my-home', configStore });
|
|
279
|
+
try {
|
|
280
|
+
const entity = (await runtime.entities())[0];
|
|
281
|
+
const result = await runtime.callService!({
|
|
282
|
+
domain: 'media_player',
|
|
283
|
+
service: 'volume_set',
|
|
284
|
+
target: { entityId: entity.id },
|
|
285
|
+
data: { volume_db: -30.5 },
|
|
286
|
+
});
|
|
287
|
+
console.log(result.success, result.data);
|
|
288
|
+
} finally {
|
|
289
|
+
await integration.destroy();
|
|
290
|
+
}
|
|
291
|
+
```
|
|
292
|
+
|
|
293
|
+
Each setup/config-flow call requires independent host-selected `context.homeId`. Configuration, constructor binding, discovery and store scope cannot replace it. The credential-free path may omit storage. An optional actual `NoSqlConfigStore` must match the exact admitted home and `denonavr` domain; the caller retains its store, database and key provider. The public `DenonavrClient(config, context)` also requires the explicit host context. This credential-free
|
|
294
|
+
protocol does not write runtime observations or configuration, generate
|
|
295
|
+
credentials, access MongoDB directly or persist on disk.
|
|
296
|
+
|
|
297
|
+
Supply an explicit private or loopback IPv4 address, the selected receiver's
|
|
298
|
+
same-IP HTTP UPnP description URL, its exact UDN and supported model, and an owner
|
|
299
|
+
volume ceiling. No HTTP descriptor path is guessed. Discovery records are
|
|
300
|
+
unauthenticated setup hints. Setup and every read/effect obtain fresh receiver
|
|
301
|
+
identity and power/mute/volume/input observations. A valid vendor descriptor
|
|
302
|
+
with the selected identity is required; descriptor spelling and availability
|
|
303
|
+
on physical firmware remain unverified. Plaintext UPnP and TCP observations do
|
|
304
|
+
not cryptographically authenticate the LAN peer.
|
|
305
|
+
|
|
306
|
+
Services are `turn_on`, `turn_off`, `volume_mute` with boolean
|
|
307
|
+
`is_volume_muted`, `volume_set` with absolute numeric `volume_db`, and
|
|
308
|
+
`select_source` with an exact observed physical `source`. Feature writes use
|
|
309
|
+
`power`, `muted`, `volume_db` and `input`. Volume must lie on the documented
|
|
310
|
+
half-decibel grid from -79.5 to +18 dB and may not exceed `maximumVolumeDb`.
|
|
311
|
+
The vendor minimum-volume sentinel remains `null`. Inputs must already have
|
|
312
|
+
been observed on this receiver and belong to the protocol's documented
|
|
313
|
+
physical subset; display-name maps and streaming shortcuts are not authority.
|
|
314
|
+
|
|
315
|
+
Every service or feature write must target the selected receiver's exact
|
|
316
|
+
home/UDN-derived device or entity ID. These IDs survive renames and distinguish
|
|
317
|
+
homes. Configuration rejects caller-supplied snapshots, zone/source maps and
|
|
318
|
+
unverified receiver information. Unsupported models, extra zones, incremental
|
|
319
|
+
volume, toggles, streaming/playback commands, arbitrary HTTP/TCP commands and
|
|
320
|
+
HEOS/account features are outside this runtime.
|
|
321
|
+
|
|
322
|
+
Each effect is submitted once. Result `data.dispatch: 'written'` describes
|
|
323
|
+
local TCP submission; `data.outcome: 'observed-target'` means the fresh
|
|
324
|
+
receiver observation matched. `success` reports that match, without proving
|
|
325
|
+
command causality, electrical output or audible playback. A different setting
|
|
326
|
+
returns `success: false` with `outcome: 'indeterminate'`. Protocol failures
|
|
327
|
+
carry `data.effectOutcome: 'not-sent' | 'indeterminate'`. Effects are never
|
|
328
|
+
automatically retried or replayed. Power observations produce only on/off
|
|
329
|
+
media states, without inventing playing/paused state.
|
|
330
|
+
|
|
331
|
+
An adapter FIFO rechecks exact home scope when admitted work actually runs.
|
|
332
|
+
The configured deadline includes both adapter queue time and all protocol
|
|
333
|
+
preflight/write/readback work; active plus waiting operations are bounded.
|
|
334
|
+
Each operation drains its fresh HTTP/TCP resources. Destruction cancels and
|
|
335
|
+
joins startup and admitted work, detaches owned listeners and is terminal.
|
|
336
|
+
`subscribe()` reports newly completed adapter observations; it creates no
|
|
337
|
+
background polling, replay or automatic reconnect loop. Subscriber exceptions
|
|
338
|
+
detach that listener and are surfaced by its unsubscribe or runtime teardown.
|
|
339
|
+
|
|
340
|
+
The test suite uses real bounded local HTTP/TCP fixtures. No physical receiver
|
|
341
|
+
or account was contacted. Receivers configured with network access disabled
|
|
342
|
+
in standby remain unreachable; wake/retry behavior is not inferred.
|
|
343
|
+
|
|
344
|
+
Protocol references:
|
|
345
|
+
[Denon AVR-2113CI/AVR-1913 protocol](https://downloads.denon.com/documentmaster/us/avr2113ci_avr1913_protocol_v04.pdf),
|
|
346
|
+
[Marantz 2014 protocol workbook](https://www.marantz.com/on/demandware.static/-/Library-Sites-marantz_northamerica_shared/default/dwd4037f30/archive-downloads/marantz-2014-nr-series---sr-series-rs232-ip-protocol.xls),
|
|
347
|
+
[UPnP Device Architecture](https://upnp.org/specs/arch/UPnP-arch-DeviceArchitecture-v1.1.pdf).
|
|
348
|
+
|
|
349
|
+
Onkyo now uses the published selected main-zone `OnkyoProtocol` from
|
|
350
|
+
`@ecobridge.xyz/devicemanager@4.5.0` and canonical `tcp` from interfaces 2.1.
|
|
351
|
+
Setup and config flow require independent explicit `context.homeId`; optional constructor home checks consistency and never supplies missing context. The public `OnkyoClient(config, context, signal?)` requires this context too. Optional actual matching NoSqlConfigStore remains borrowed; protocol-only calls need none. Configuration requires matching home, private selected IPv4 host, exact MAC/model,
|
|
352
|
+
cleartext LAN acknowledgement and an integer raw-volume ceiling. Native power,
|
|
353
|
+
mute, advertised input selectors and integer raw volume are admitted from fresh
|
|
354
|
+
receiver identity/capability observations. Events report explicit inspections
|
|
355
|
+
and matching control reports with acknowledgement/causality unconfirmed. See
|
|
356
|
+
[the native Onkyo contract](ts/integrations/onkyo/readme.md) for exact services,
|
|
357
|
+
feature ids, scopes, shutdown behavior and fixture-only verification limits.
|
|
358
|
+
|
|
359
|
+
### Selected native Daikin BRP069
|
|
360
|
+
|
|
361
|
+
`DaikinIntegration` uses the published devicemanager `DaikinProtocol` for one selected controller. Native configuration requires `homeId`, explicit `apiVariant: 'brp069'`, private literal `host`, exact twelve-hex-digit `expectedMac`, and `allowPlaintext: true`. Configuration flow and setup independently verify current basic/model/control observations. Only exact owned targets with explicit boolean power or integer Celsius targets in the currently observed standard cool/heat range can dispatch effects. Required current control fields are preserved by the protocol, and accepted setters require matching independent readback for success. Mismatches and post-dispatch failures remain indeterminate; there are no effect retries, optimistic state or fabricated ambient sensors/HVAC action.
|
|
362
|
+
|
|
363
|
+
Discovery is passive. Setup, config flow and public `DaikinClient(config, context)` require independent explicit host-selected `context.homeId`. Optional constructor home only checks consistency. An optional actual NoSqlConfigStore must match that home and daikin domain and remains borrowed; protocol-only operation requires no store. Runtime and integration destruction cancel and drain owned protocol work and subscriptions. Integration and configuration-flow destruction await all owned cleanup settlements before reporting aggregated original failures; repeated destruction returns the same terminal result without retries. The legacy injected-client/executor/static setup path is replaced by explicit verified native setup; offline mapper/parser/translation utilities remain read only. See the [Daikin runtime](ts/integrations/daikin/readme.md) for migration and boundaries. Real HTTP/NoSQL fixtures pass; physical hardware remains unverified.
|
|
364
|
+
|
|
365
|
+
## Selected native Broadlink RM IR
|
|
366
|
+
|
|
367
|
+
Broadlink setup selects one authorized home, exact private IPv4 endpoint, six-byte
|
|
368
|
+
unicast MAC, and RM mini 3 type `0x2737` or RM4 mini type `0x51da`. Other Broadlink
|
|
369
|
+
families and model variants are unsupported by this runtime. Provision the device
|
|
370
|
+
on the trusted LAN separately. Discovery candidates do not authenticate a bridge;
|
|
371
|
+
setup verifies the selected MAC/type, establishes one encrypted session, and reads
|
|
372
|
+
the observed firmware through the published `@ecobridge.xyz/devicemanager` API.
|
|
373
|
+
|
|
374
|
+
Every setup/config-flow call and public `BroadlinkClient(config, context)` requires independent explicit host-selected `context.homeId`. Optional constructor binding, config and storage scope cannot supply it. Explicit owner actions allow protocol-only operation without storage. Restoring omitted actions requires an initialized actual `NoSqlConfigStore` matching the admitted home and `broadlink` domain. The host retains user/action authorization; structural or unscoped stores are rejected. When supplied, the borrowed store persists selection and owner IR actions
|
|
375
|
+
through the public client document models with its existing AES-256-GCM encryption.
|
|
376
|
+
It never stores Broadlink session keys. There is no filesystem or direct MongoDB
|
|
377
|
+
access, and no plaintext persistence fallback.
|
|
378
|
+
|
|
379
|
+
```typescript
|
|
380
|
+
const store = new NoSqlConfigStore({
|
|
381
|
+
db, homeId: authorizedHome.id, integrationDomain: 'broadlink', keyProvider,
|
|
382
|
+
});
|
|
383
|
+
await store.initialize();
|
|
384
|
+
const integration = new BroadlinkIntegration();
|
|
385
|
+
const runtime = await integration.setup({
|
|
386
|
+
homeId: authorizedHome.id,
|
|
387
|
+
host: '192.168.1.55',
|
|
388
|
+
macAddress: 'a0:43:b0:54:44:6e',
|
|
389
|
+
deviceType: 0x2737,
|
|
390
|
+
actions: [{ id: 'owner_tv_code', name: 'Owner TV IR code', packetBase64: approvedNativeIrBase64 }],
|
|
391
|
+
}, { homeId: authorizedHome.id, configStore: store });
|
|
392
|
+
try {
|
|
393
|
+
const [device] = await runtime.devices();
|
|
394
|
+
const action = device.features.find((feature) => feature.id === 'ir.owner_tv_code');
|
|
395
|
+
if (!action) throw new Error('Configured action missing');
|
|
396
|
+
const result = await runtime.writeFeature!({ device, feature: action, value: true });
|
|
397
|
+
// result.success confirms bridge acceptance only.
|
|
398
|
+
// result.data.physicalEffectConfirmed is always false.
|
|
399
|
+
} finally {
|
|
400
|
+
await integration.destroy();
|
|
401
|
+
await store.close();
|
|
402
|
+
}
|
|
403
|
+
```
|
|
404
|
+
|
|
405
|
+
The application supplies `db`, `authorizedHome`, `keyProvider`, and its already
|
|
406
|
+
approved native IR payload. `actions` must contain 1–32 unique lowercase IDs,
|
|
407
|
+
display names and canonical base64 packets. The public upstream validator rejects
|
|
408
|
+
non-IR packets, repeats, malformed lengths/pulse pairs and packets outside its
|
|
409
|
+
6–1024 byte limit before encrypted persistence. This runtime generates no waveform
|
|
410
|
+
and assigns no appliance meaning to arbitrary bytes. Omit `actions` only to restore
|
|
411
|
+
an existing encrypted record matching the exact home/MAC/type/host/port/local
|
|
412
|
+
interface selection. Stored actions are revalidated before startup.
|
|
413
|
+
|
|
414
|
+
The selected bridge maps to a canonical device ID containing home and MAC. Its
|
|
415
|
+
readable state is observed connectivity and numeric firmware. Owner actions are
|
|
416
|
+
write-only `ir.<actionId>` features and button entities with `state: null`; sending
|
|
417
|
+
one never changes appliance power, volume, temperature, playback or other state.
|
|
418
|
+
Feature writes require the canonical bridge/feature and trigger value `true`.
|
|
419
|
+
Services support `button.press` targeting a known button entity, or
|
|
420
|
+
`broadlink.send_ir` targeting the known bridge with only `{actionId}`. Cross-home,
|
|
421
|
+
unknown, contradictory and missing targets fail before any UDP exchange. Raw
|
|
422
|
+
service payloads, timings, repeats, arbitrary command names, learning, RF,
|
|
423
|
+
switch/appliance services and injected executors are rejected.
|
|
424
|
+
|
|
425
|
+
`port` defaults to 80, `timeoutMs` to 5000 (maximum 60000), and
|
|
426
|
+
`maxPendingOperations` to 32 (maximum 128). An optional private `localAddress`
|
|
427
|
+
selects an interface; loopback addresses are admitted for local fixtures. The
|
|
428
|
+
public foundation owns bounded FIFO/deadlines, identity/session/counter/checksum
|
|
429
|
+
and exact source validation, cancellation and terminal socket/key cleanup. The
|
|
430
|
+
consumer adds no retry, reconnection, automatic reauthentication or effect replay.
|
|
431
|
+
Setup and snapshot/feature operations honor caller cancellation; destroy stops
|
|
432
|
+
admission and joins admitted work while leaving the caller's store/database open.
|
|
433
|
+
Protocol-close failures still drain admitted work and clear owned IR buffers.
|
|
434
|
+
Integration destroy waits for every runtime and aggregates cleanup failures;
|
|
435
|
+
failed runtime cleanup remains owned for explicit `retryCleanup()`. Repeated destroy preserves its original terminal promise; cleanup retry never reopens the session or replays an action. Setup reports both its original failure and any
|
|
436
|
+
cleanup failure.
|
|
437
|
+
Recreate the runtime explicitly after terminal session failure.
|
|
438
|
+
|
|
439
|
+
Every result reports `physicalEffectConfirmed: false`. Valid acknowledgements
|
|
440
|
+
report `outcome: 'accepted'`; errors preserve `not-sent`, `indeterminate`, `rejected`
|
|
441
|
+
or `accepted` from the protocol. An unknown/corrupt/lost reply after UDP handoff
|
|
442
|
+
remains indeterminate and is never retried. Protocol default keys, fixed IVs and
|
|
443
|
+
checksums do not authenticate the peer cryptographically. MAC/IP matching protects
|
|
444
|
+
against accidental misbinding on a trusted isolated LAN and cannot establish user
|
|
445
|
+
authorization or resist an active LAN attacker.
|
|
446
|
+
|
|
447
|
+
This is a breaking migration from snapshot/injected-executor setup. Replace the
|
|
448
|
+
old `IBroadlinkConfig` with explicit selected configuration and scoped storage;
|
|
449
|
+
remove `snapshot`, `codes`, `switches`, `commandExecutor` and `transport`. Pure
|
|
450
|
+
offline snapshot/command mappers and packet encoders remain available explicitly,
|
|
451
|
+
with old snapshot input typed as `IBroadlinkOfflineConfig`; they do not start a
|
|
452
|
+
runtime, validate native admission or prove physical effects.
|
|
453
|
+
|
|
454
|
+
Real encrypted loopback UDP and encrypted in-memory NoSQL tests verify this strict
|
|
455
|
+
protocol envelope. Real hardware, firmware/model variants and physical appliance
|
|
456
|
+
effects have not been verified. The vendor's [RM4 mini product description](https://www.ibroadlink.com/productinfo/762674.html)
|
|
457
|
+
and [IR-code API overview](https://docs.ibroadlink.com/public/configuration-sdk%2Bctc/rm_related_api/)
|
|
458
|
+
describe IR transmission and external code storage; the lower-level LAN contract
|
|
459
|
+
and its security limitations are documented in devicemanager's readme.
|
|
460
|
+
|
|
461
|
+
### Yamaha selected RX-V485 main zone
|
|
462
|
+
|
|
463
|
+
`YamahaIntegration` admits the main zone of an explicitly selected RX-V485 through the published `@ecobridge.xyz/devicemanager` Yamaha protocol. Setup and config flow require independent explicit host-selected `context.homeId`; optional constructor home only checks consistency. Configuration, discovery, form and store scope cannot replace it. Configuration requires a matching `homeId`, a literal private/link-local/loopback IPv4 HTTP origin, the exact 12-character Yamaha `device_id`, the selected model, explicit `allowUnencryptedHttp: true` and an integer `maxVolume` owner ceiling in the receiver's raw vendor units. It never infers percent/dB volume or accepts arbitrary snapshots, executors or raw protocol commands as a live runtime.
|
|
464
|
+
|
|
465
|
+
```typescript
|
|
466
|
+
import { YamahaIntegration, IntegrationRuntimeManager } from '@smarthome.exchange/integrations';
|
|
467
|
+
|
|
468
|
+
const integration = new YamahaIntegration();
|
|
469
|
+
const manager = new IntegrationRuntimeManager();
|
|
470
|
+
try {
|
|
471
|
+
const runtime = await manager.setupIntegration(integration, {
|
|
472
|
+
homeId: authenticatedHome.id,
|
|
473
|
+
origin: 'http://192.168.1.50',
|
|
474
|
+
expectedDeviceId: '00A0DE123456', // Replace with the selected receiver's device_id.
|
|
475
|
+
model: 'RX-V485',
|
|
476
|
+
allowUnencryptedHttp: true,
|
|
477
|
+
maxVolume: 60, // Owner-chosen raw ceiling within this receiver's current advertised range.
|
|
478
|
+
}, { homeId: authenticatedHome.id, abortSignal: homeLifetime.signal, configStore: optionalYamahaHomeStore });
|
|
479
|
+
const device = (await runtime.devices())[0];
|
|
480
|
+
await runtime.callService?.({ domain: 'media_player', service: 'volume_set',
|
|
481
|
+
target: { deviceId: device.id }, data: { volume_raw: 40 } });
|
|
482
|
+
} finally {
|
|
483
|
+
await manager.destroyAll();
|
|
484
|
+
await integration.destroy();
|
|
485
|
+
}
|
|
486
|
+
```
|
|
487
|
+
|
|
488
|
+
The host owns `authenticatedHome`, its lifetime signal and the optional config store. The exported `YamahaClient(config, context)` requires the same independent native context, including `homeId`; its second argument is no longer a config store. A supplied store must be an actual NoSqlConfigStore matching that exact home ID and `integrationDomain: 'yamaha'`; routine setup/reads/controls neither read nor write it, and shutdown never closes it, its database or its key provider. `YamahaConfigFlow` verifies fresh live identity/features/status before explicitly persisting selected config to an injected scoped store. Without a store, it returns the verified immutable config. Flow destruction cancels owned requests, refuses stale forms and joins admitted caller-store writes; a write already admitted may complete while the form closes and preserves its actual `done` result. Failures from writes admitted before closure remain visible in the closure's aggregate error.
|
|
489
|
+
|
|
490
|
+
Device features are `power`, `muted`, `volume_raw` (unit `raw`) and `input`. Media-player services are `turn_on`, `turn_off`, `volume_set` with `{ volume_raw: integer }`, `volume_mute` with `{ is_volume_muted: boolean }`, and `select_source` with `{ source: currentAdvertisedInput }`. Every request targets the exact home/receiver-derived device or entity ID and refuses extra parameters. Input selection uses autoplay_disabled. The protocol refreshes identity/features/status before every effect and attempts fresh readback after its single dispatch. Vendor volume grid, receiver max-volume and owner ceiling are enforced; no toggles, relative volume, arbitrary commands, playback/linking or other zones/models are exposed.
|
|
491
|
+
|
|
492
|
+
Results distinguish acknowledged dispatch from observed target. `success` is true only when the fresh observation matches; an unchanged setting yields an indeterminate receipt with the actual observed state. A missing/malformed acknowledgement, cancellation, identity/scope drift or failed readback after dispatch yields `effectOutcome: 'indeterminate'`. Nothing retries or replays. Inspect actual state deliberately before another call. Receiver observations do not prove acoustic/electrical effects or authenticated identity; independent controllers may change state between observations, so this is not a physical volume guarantee.
|
|
493
|
+
|
|
494
|
+
Subscriptions emit copied completed observations from explicit adapter calls; they do not start hidden polling or Yamaha UDP subscriptions. Each subscriber can own at most one asynchronous callback; a second observation before it settles terminates that subscription with an inspectable cleanup error. Returned callback promises must settle, and unsubscribe/runtime shutdown joins them; callback failures surface through cleanup. Owner abort closes a runtime terminally, joins owned HTTP drain and refuses later operations. Queue/response/subscriber/runtime capacity and operation deadlines are bounded. `YamahaOfflineMapper` retains pure raw-data mapping for imports/analysis, with unavailable/unwritable output that cannot be supplied to native setup.
|
|
495
|
+
|
|
496
|
+
Evidence: [Yamaha RX-V485 product information](https://uk.yamaha.com/en/audio/home-audio/products/av-receivers-amps/rx-v485/) and Yamaha-authored [Extended Control Basic Rev2 specification](https://community.symcon.de/uploads/short-url/7r8QTdkYFNfJVJmKbtqvdleuzKt.pdf), using documented v1 fields. API >=1.17 is required for the stable device_id and every required identity/capability/status field must be observed; the Rev2 preface describes API >=2.00 firmware, so this does not claim all Rev2 features on earlier firmware. LAN HTTP is plaintext and identity matching does not protect against malicious LAN peers. Verification uses synthetic loopback fixtures; physical receiver/firmware behavior remains unverified.
|
|
497
|
+
|
|
498
|
+
The shared owner bounds pending setup and flow, live runtimes and retained cleanup resources together at16. Clients and actual observer promises are owned before foreign callbacks. Failed cleanup stays observable and consumes capacity until explicit `retryCleanup()` succeeds without replaying setup or transport work. Closing retains its original terminal promise.
|
|
499
|
+
|
|
500
|
+
### Selected Pioneer SC-95 receivers
|
|
501
|
+
|
|
502
|
+
`PioneerIntegration` admits the SC-95/CUXJ main zone through the published `@ecobridge.xyz/devicemanager` `PioneerProtocol`. Select a private or loopback IPv4, an existing UPnP description URL at that same address, exact receiver UUID/model and raw owner volume ceiling. Explicit `allowUnencryptedLan: true` acknowledges plaintext HTTP/TCP. Discovery and UPnP identity establish consistency with a selected LAN endpoint; they do not cryptographically authenticate the peer.
|
|
503
|
+
|
|
504
|
+
```typescript
|
|
505
|
+
import { PioneerIntegration } from '@smarthome.exchange/integrations';
|
|
506
|
+
|
|
507
|
+
declare const hostSelectedHomeId: string; // Selected independently by the trusted embedding host.
|
|
508
|
+
declare const selectedDescriptionUrl: string;
|
|
509
|
+
declare const selectedReceiverUdn: string;
|
|
510
|
+
const integration = new PioneerIntegration();
|
|
511
|
+
try {
|
|
512
|
+
const runtime = await integration.setup({
|
|
513
|
+
homeId: hostSelectedHomeId, host: '192.168.1.80', descriptionUrl: selectedDescriptionUrl,
|
|
514
|
+
expectedUdn: selectedReceiverUdn, model: 'SC-95', allowUnencryptedLan: true,
|
|
515
|
+
maximumVolumeRaw: 121,
|
|
516
|
+
}, { homeId: hostSelectedHomeId });
|
|
517
|
+
const device = (await runtime.devices())[0];
|
|
518
|
+
const muted = device.features.find((feature) => feature.id === 'muted');
|
|
519
|
+
if (!muted) throw new Error('Selected receiver has no mute feature.');
|
|
520
|
+
const receipt = await runtime.writeFeature!({ device, feature: muted, value: true });
|
|
521
|
+
console.log(receipt.data);
|
|
522
|
+
} finally {
|
|
523
|
+
await integration.destroy();
|
|
524
|
+
}
|
|
525
|
+
```
|
|
526
|
+
|
|
527
|
+
Setup, direct `new PioneerClient(config, context)` and config-flow start require an explicit `context.homeId` selected by the embedding host. Config, discovery, editable fields and store scope never select that home. `new PioneerIntegration({ homeId })` and standalone `new PioneerConfigFlow({ homeId })` optionally bind an immutable constructor home as a further consistency constraint; context home remains required. Without constructor binding, the first valid host admission fixes the home synchronously before receiver I/O, including a later failed identity probe. Integration and its flow share this admission. This is a trusted host contract, not a string-as-authentication claim.
|
|
528
|
+
|
|
529
|
+
Pioneer has no persistence requirement for admission or controls. Optional `context.configStore` must be an actual `NoSqlConfigStore` with immutable scope matching the admitted home and `pioneer`; structural scope objects are rejected. The borrowed store, database and encryption provider remain caller-owned, and Pioneer performs no gratuitous config read/write. Returned device/entity IDs include the exact encoded home ID and receiver UDN. Executable config, injected clients/executors and static snapshots cannot configure a native runtime.
|
|
530
|
+
|
|
531
|
+
`PioneerConfigFlow.start(candidate, { homeId })` captures the context before returning its form. Home has no editable field; an explicitly conflicting submitted home is refused before receiver I/O, and completed config uses the captured host home. A flow created by the integration shares the owning integration's capacity and cleanup ledger. Ordinary admission errors return an error step; cleanup failures reject and remain owned for explicit cleanup retry.
|
|
532
|
+
|
|
533
|
+
Features are `power`, `muted`, `volume_raw` and `input`. Volume is the vendor raw integer range 0 through 185, limited by the required owner `maximumVolumeRaw`; zero preserves the minimum sentinel. The [Pioneer-authored FY16 control sheet](https://github.com/D-Jeffrey/Pioneer-info/blob/main/FY16AVR_External_Command_for_CI_2.xlsx) has conflicting dB examples, so no dB, normalized fraction or percentage conversion is inferred. Input selection requires a documented physical SC-95 source actually observed by the foundation. Every operation refreshes selected identity, and controls preflight readable receiver settings.
|
|
534
|
+
|
|
535
|
+
`media_player` services require the exact device or entity target: `turn_on`/`turn_off` with empty data, `volume_mute` with boolean `is_volume_muted`, `set_volume_raw` with integer `volume_raw`, and `select_source` with an observed two-digit `source`. Relative volume, toggles, arbitrary ASCII commands, additional zones, generic model families, media playback and inferred source names are unsupported. Explicit `PioneerOfflineMapper` methods keep historical values available for preview while forcing `online`, entity availability, feature writability and local control capability false, even for supplied snapshots containing stale live flags. They never create a native runtime.
|
|
536
|
+
|
|
537
|
+
Receipts preserve `dispatch: 'written'`, `effectOutcome: 'observed-target' | 'indeterminate'`, `commandAcknowledged: false` and `causalityConfirmed: false`. A matching readback is an independent observation; it does not prove this command caused an acoustic or electrical effect. Transport loss or cancellation after dispatch is indeterminate. Effects are submitted once, with no replay, reconnect or transport retry.
|
|
538
|
+
|
|
539
|
+
The foundation owns bounded FIFO, deadlines, framing and terminal TCP cleanup. The shared native owner bounds pending setup/submission work, live runtimes and retained failed cleanup together, with default capacity 16 and optional constructor `capacity`. Each accepted client is registered immediately after construction and before startup. Runtime destruction closes its ownership lease; integration destruction closes the whole owner and joins setup, flow, clients and callbacks. A failed cleanup continues occupying capacity until explicit `integration.retryCleanup()` or `flow.retryCleanup()` succeeds. These methods retry terminal cleanup only and cannot replay receiver operations or reopen a closed owner.
|
|
540
|
+
|
|
541
|
+
`runtime.subscribe()` emits completed explicit read/control observations without background polling. Up to 32 subscriptions are admitted; unfinished callback work is bounded by `maxPendingOperations`, registered before invoking user code and joined on terminal cleanup. Reentrant abort or destruction shares the already-published close promise. Callback rejection is surfaced by disposal/cleanup. Stale flow submissions and all closed native runtimes are terminal. The [SC-95 manual, printed page 58](https://www.snapav.com/wcsstore/ExtendedSitesCatalogAssetStore/attachments/documents/Pioneer/ManualsAndGuides/SC-95_OperatingInstructions_071015.pdf) documents configurable control ports and Network Standby; configure the receiver beforehand. Fixtures exercise loopback HTTP/TCP peers; physical receiver and firmware behavior remain unverified.
|
|
542
|
+
|
|
543
|
+
### Selected Panasonic Viera plaintext NRC
|
|
544
|
+
|
|
545
|
+
`PanasonicVieraIntegration` admits one explicitly selected Panasonic NRC endpoint through `@ecobridge.xyz/devicemanager`'s public `PanasonicProtocol`. Supply `homeId`, private literal IPv4 `host`, exact HTTP `descriptionUrl`, `expectedUdn` (UPnP UUID), `expectedModelName`, and `allowUnencryptedLan: true`. Identity and current service/SCPD metadata are rechecked before every key dispatch. LAN metadata is unauthenticated; the identity pin is not cryptographic hardware authentication.
|
|
546
|
+
|
|
547
|
+
Only currently advertised keys from the owning protocol's finite subset are exposed. `remote_key` is a write-only media feature whose value is an admitted key string; button entities have unknown (`null`) state. Use exact-device `panasonic_viera.press` or exact-button `button.press`. The result is the matching SOAP acknowledgement receipt; it never implies the resulting TV power, volume, mute, input, playback, or physical effect. There is no retry or replay. Protocol rejection and indeterminate outcomes remain typed owning-package errors.
|
|
548
|
+
|
|
549
|
+
Encrypted/PIN families, pairing, absolute rendering settings, media playback, arbitrary SOAP, executor injection and snapshot-backed native setup are refused. The separately named pure `PanasonicVieraMapper.toSnapshotFromRaw` utility marks supplied data unavailable and read-only, and cannot create a live runtime.
|
|
550
|
+
|
|
551
|
+
Every setup/config-flow call requires independently selected `context.homeId`; optional constructor binding cannot supply it. The public PanasonicVieraClient options require the same native home context. An optional store must be an actual NoSqlConfigStore matching the admitted home and `panasonic_viera` domain. Protocol-only operation requires no store. This keys-only integration does not write that store or close caller storage/database resources. Client, runtime, integration and config-flow destruction are terminal and drain admitted logical work even when cleanup fails; parent setup cancellation closes the owned protocol. Cleanup errors remain observable, multiple cleanup errors are aggregated, and failed allocated handles remain owned without automatic close retries or reopening. Config-flow destruction also fences stale submit closures.
|
|
552
|
+
|
|
553
|
+
Fixtures qualify the protocol contract only. No physical television or captured model fixture was used. The Panasonic-authored TV Remote 2 guide confirms same-LAN control and model variance (https://av.jpn.support.panasonic.com/support/global/cs/tv/vremote2/ios/); the exact wire subset is documented by the owning foundation's primary implementation-source evidence, not a Panasonic-authored SOAP specification.
|
|
554
|
+
|
|
555
|
+
Integration and child flow share the bounded native owner, default16 including pending work, live runtimes and retained failed cleanup. Registering clients before startup keeps failed allocations reachable. Terminal destroy publishes its memo before abort and preserves its original failure; only explicit `retryCleanup()` retries teardown without reopening or repeating keys. Flow captures host context before returning its form and never lets an editable field select home.
|
|
556
|
+
|
|
557
|
+
### Native Modbus TCP integration
|
|
558
|
+
|
|
559
|
+
The native adapter consumes the published `@ecobridge.xyz/devicemanager@4.7.0` `ModbusProtocol`. It requires an explicit host-selected `context.homeId`, matching configuration home, private/link-local/loopback IPv4 address, unit 1–247 or direct TCP unit 255, exact expected basic vendor/product identity, explicit unencrypted-LAN acceptance and one through 64 owner read mappings. No endpoint, unit, register meaning or capability is discovered or inferred. The optional expected revision pins that identity object too.
|
|
560
|
+
|
|
561
|
+
```typescript
|
|
562
|
+
const integration = new ModbusIntegration();
|
|
563
|
+
const runtime = await integration.setup({
|
|
564
|
+
homeId: 'home-123',
|
|
565
|
+
address: '192.168.1.50',
|
|
566
|
+
unitId: 1,
|
|
567
|
+
expectedVendorName: 'Owner verified vendor',
|
|
568
|
+
expectedProductCode: 'Owner verified product',
|
|
569
|
+
allowUnencryptedLan: true,
|
|
570
|
+
mappings: [
|
|
571
|
+
{ id: 'raw-status', name: 'Raw input register', kind: 'input', address: 0 },
|
|
572
|
+
{ id: 'raw-output', name: 'Raw coil', kind: 'coil', address: 7, write: true },
|
|
573
|
+
{ id: 'raw-setting', name: 'Raw holding register', kind: 'holding', address: 11,
|
|
574
|
+
write: { minimum: 10, maximum: 200 } },
|
|
575
|
+
],
|
|
576
|
+
}, { homeId: 'home-123' });
|
|
577
|
+
try {
|
|
578
|
+
const entities = await runtime.entities();
|
|
579
|
+
await runtime.callService?.({
|
|
580
|
+
domain: 'modbus',
|
|
581
|
+
service: 'write_coil',
|
|
582
|
+
target: { entityId: entities.find((entity) => entity.name === 'Raw coil')!.id },
|
|
583
|
+
data: { value: false },
|
|
584
|
+
});
|
|
585
|
+
} finally {
|
|
586
|
+
await integration.destroy();
|
|
587
|
+
}
|
|
588
|
+
```
|
|
589
|
+
|
|
590
|
+
Mappings use zero-based wire addresses and unsigned 16-bit raw registers. Read kinds are `coil`, `discrete_input`, `holding` and `input`. Each has an explicit ID, display name and address; `quantity` defaults to one and is bounded by the protocol to 2000 bits or 125 registers. IDs must be unique and ranges of the same kind must not overlap. Multiple values remain raw arrays in entities and individual raw sensor features in device definitions. There is no scaling, signed/float decoding, 40001 notation conversion, default unit, temperature/energy meaning or light capability.
|
|
591
|
+
|
|
592
|
+
Writes default to denied. A `coil` mapping with `write: true` permits one absolute boolean FC5 write. A `holding` mapping with inclusive `write: { minimum, maximum }` bounds permits one unsigned integer FC6 write. Both require quantity one. Read-only input mappings, arbitrary addresses, multi-address writes, toggles, retries and replay are rejected. Raw services use domain `modbus`, service `read`, `write_coil` or `write_register`, and one exact mapped entity ID; writes accept only `data: { value }`. Device feature writes additionally verify exact home/device provenance and the copied owner permission.
|
|
593
|
+
|
|
594
|
+
Every read/write freshly checks mandatory basic identity through the owning protocol before dispatch. Identity strings and endpoint/unit are plaintext LAN selection, without cryptographic authentication or unique serial identity. A write receipt confirms the correlated Modbus echo and always reports `physicalEffectConfirmed: false`; it neither changes observed state nor proves the physical result. Explicit reads provide new observations. Subscriptions are passive and never start a poll timer. Client construction is inert; setup/config admission obtains live mapped reads before succeeding.
|
|
595
|
+
|
|
596
|
+
`timeoutMs` (default 5000, maximum 60000) applies to each protocol operation including queue time. The native FIFO defaults to 16 admitted operations and permits a maximum of 128. Cancellation/deadlines and malformed, mismatching or failed transport follow the owning protocol's terminal rules. Failed writes retain conservative `not-sent` or `indeterminate` outcomes. The adapter never recreates or replays a terminal client. Shutdown stops admission, aborts owned operations and joins every handle before reporting cleanup errors, including handles whose admission cleanup failed.
|
|
597
|
+
|
|
598
|
+
Runtime persistence is optional. If supplied, the context store must be a caller-owned encrypted `NoSqlConfigStore` with the exact `homeId` and `integrationDomain: 'modbus'`. Config admission stores the verified selection through that store; the adapter does not close it. No filesystem persistence or database-driver bypass exists.
|
|
599
|
+
|
|
600
|
+
The integration and its config flow share native home admission and terminal resource ownership. Constructor `{ homeId }` is an optional consistency constraint; it never replaces explicit context home. The first valid context binds the instance synchronously, including when later transport setup fails. A config flow captures its context before returning a form, omits editable home, rejects a conflicting submitted home, and returns the captured home. Configuration, discovery and store scope cannot select it. This is a trusted embedding-host contract, not a home string used as authentication.
|
|
601
|
+
|
|
602
|
+
Shared ownership defaults to 16 pending setups, runtimes or retained cleanup resources; `{ capacity }` sets that bound. It is separate from each protocol's FIFO. Cleanup failures remain owned and count toward capacity. `retryCleanup()` retries teardown explicitly, without opening a connection or replaying commands. Closing remains terminal and keeps its stable promise.
|
|
603
|
+
|
|
604
|
+
Wire references: [Modbus Application Protocol V1.1b3](https://www.modbus.org/file/secure/modbusprotocolspecification.pdf), sections 6.1–6.6 and 6.21, and [Messaging Implementation Guide V1.0b](https://www.modbus.org/file/secure/messagingimplementationguide.pdf), MBAP and transaction matching. Qualification is loopback-fixture based; actual hardware, vendor register maps and Modbus Security/TLS are unverified.
|
|
605
|
+
|
|
606
|
+
### Selected Bose SoundTouch
|
|
607
|
+
|
|
608
|
+
`SoundtouchIntegration` uses the published `@ecobridge.xyz/devicemanager` SoundTouch protocol for one selected private IPv4 endpoint, exact uppercase twelve-digit unicast deviceID and exact `/info` type. It requires explicit `allowUnencryptedLan: true`, an integer `volumeLimit` from 0 through 100, and a separately selected host `context.homeId`. Optional constructor home binding is an additional consistency check; it never replaces the host context. Setup and the integration's config flow share a home binding. An optional store must be an actual `NoSqlConfigStore` with the same home and `soundtouch` domain; it remains caller-owned. No store is required for these local operations.
|
|
609
|
+
|
|
610
|
+
```typescript
|
|
611
|
+
const integration = new SoundtouchIntegration();
|
|
612
|
+
const runtime = await integration.setup({
|
|
613
|
+
homeId: 'home-one',
|
|
614
|
+
host: '192.168.1.90',
|
|
615
|
+
deviceId: 'D05FB8A9591C',
|
|
616
|
+
type: 'SoundTouch 20',
|
|
617
|
+
allowUnencryptedLan: true,
|
|
618
|
+
volumeLimit: 40,
|
|
619
|
+
}, { homeId: 'home-one' });
|
|
620
|
+
try {
|
|
621
|
+
const device = (await runtime.devices())[0];
|
|
622
|
+
const result = await runtime.callService!({
|
|
623
|
+
domain: 'soundtouch', service: 'set_volume',
|
|
624
|
+
target: { deviceId: device.id }, data: { volume: 25 },
|
|
625
|
+
});
|
|
626
|
+
// result.success is false: status STRING has no defined success vocabulary.
|
|
627
|
+
// result.data retains status-received acknowledgment, independent readback,
|
|
628
|
+
// effectOutcome: 'indeterminate' and causalityConfirmed: false.
|
|
629
|
+
} finally {
|
|
630
|
+
await integration.destroy();
|
|
631
|
+
}
|
|
632
|
+
```
|
|
633
|
+
|
|
634
|
+
Read services `soundtouch.status`, `.snapshot` and `.refresh` return truthful sanitized observations. Controls are `soundtouch.set_volume` or `media_player.volume_set` with integer `{ volume }`, and `soundtouch.set_mute` or `media_player.volume_mute` with explicit `{ muted }`. Every service requires an exact owned device or speaker entity target. Canonical feature writes support only `volume` and `mute`. Observations retain the vendor's raw 0–100 range, including readings above the owner ceiling; `ownerWriteVolumeRange` describes the separate write policy. Optional `config.name` is a local display label; the snapshot's `name` and device metadata's `observedName` retain `/info` name.
|
|
635
|
+
|
|
636
|
+
The protocol owns final fresh identity, settled-volume and prior-mute checks before every POST. Reads above the ceiling and absolute lowering into range are permitted without clamping. Mute preserves the fresh volume and rejects a preserved target above the ceiling; unmute above the ceiling and increases while freshly muted reject. Lower while preserving mute, then explicitly unmute after a new in-range observation. Concurrent controllers can race after observation; no transaction, compare-and-set, acoustic limit or physical-effect guarantee is claimed.
|
|
637
|
+
|
|
638
|
+
Manual/custom discovery descriptors only match explicitly selected endpoint identity; they issue no discovery requests. The config flow captures the host home and selected endpoint/type/deviceID before effects, requires plaintext acknowledgment and an owner ceiling, and returns config without persistence. Public `SoundtouchClient(config, { homeId })` also requires a separate native home context before allocating its protocol. Unsupported operations include injected snapshots/clients/executors, mDNS discovery, power/standby/remote keys, sources/presets/media/zones, cloud access, retries/replay/reconnect and vendor push subscriptions.
|
|
639
|
+
|
|
640
|
+
Subscriptions emit completed adapter observations only. Callback failures are retained and surfaced by unsubscribe/terminal cleanup. The shared native owner bounds pending setups, flow submissions, runtimes and retained failed cleanup resources to 16 by default. Client operations default to 16 pending operations with a single 5000 ms deadline covering FIFO waiting and protocol exchanges. Closing is terminal, idempotent and joins owned operations/resources. `integration.retryCleanup()`, `flow.retryCleanup()` or closed-client `retryCleanup()` explicitly retry retained cleanup; they never repeat transport observations or controls. Explicit cleanup retry also acknowledges retained subscriber failures. Borrowed stores, databases and key providers are never closed.
|
|
641
|
+
|
|
642
|
+
Verified with genuine loopback HTTP fixtures, strict TypeScript with library checks, compiled-source import and Docker limited to two CPUs and 4 GiB with networking disabled. Physical hardware, firmware compatibility and acoustic effects remain unverified. Plaintext deviceID/type matching does not cryptographically authenticate the peer.
|
|
643
|
+
|
|
644
|
+
### Selected Sony BRAVIA Professional display
|
|
645
|
+
|
|
646
|
+
`BraviatvIntegration` consumes the public `SonyBraviaProtocol` from `@ecobridge.xyz/devicemanager`. It admits a selected BRAVIA Professional version 1.0 REST endpoint by exact model and active-network MAC, with an optional exact serial check. Missing or unusable active-network MACs cannot establish selection. Discovery records supply setup hints only.
|
|
647
|
+
|
|
648
|
+
```typescript
|
|
649
|
+
import { BraviatvIntegration } from '@smarthome.exchange/integrations';
|
|
650
|
+
|
|
651
|
+
async function useSelectedDisplay(resolvePrivatePsk: (credentialRef: string, signal: AbortSignal) => Promise<string>) {
|
|
652
|
+
const homeId = 'my-home';
|
|
653
|
+
const integration = new BraviatvIntegration({
|
|
654
|
+
homeId,
|
|
655
|
+
resolvePsk: ({ credentialRef, signal }) => resolvePrivatePsk(credentialRef, signal),
|
|
656
|
+
});
|
|
657
|
+
try {
|
|
658
|
+
const runtime = await integration.setup({
|
|
659
|
+
homeId,
|
|
660
|
+
host: '192.168.1.50',
|
|
661
|
+
expectedModel: 'FW-55BZ35F',
|
|
662
|
+
expectedMacAddress: '04:5D:4B:AD:6D:E1',
|
|
663
|
+
credentialRef: 'my-display-private-psk',
|
|
664
|
+
allowUnencryptedLan: true,
|
|
665
|
+
volumeLimitRaw: 40,
|
|
666
|
+
}, { homeId });
|
|
667
|
+
const device = (await runtime.devices())[0];
|
|
668
|
+
return await runtime.callService!({
|
|
669
|
+
domain: 'braviatv', service: 'set_speaker_volume_raw',
|
|
670
|
+
target: { deviceId: device.id }, data: { volume_raw: 20 },
|
|
671
|
+
});
|
|
672
|
+
} finally {
|
|
673
|
+
await integration.destroy();
|
|
674
|
+
}
|
|
675
|
+
}
|
|
676
|
+
```
|
|
677
|
+
|
|
678
|
+
The host must supply an independent nonempty `context.homeId` for every setup and config flow. Constructor `homeId` is an optional consistency check; config, discovery, form values and stores cannot select the host home. The first admitted host home remains latched even after setup fails. The required constructor `resolvePsk` is caller-owned. A constructor with only `{ resolvePsk }` is supported; the optional `homeId` in the example adds a consistency check. Configuration and completed config flows carry a credential reference only. The caller owns private-level PSK storage and retrieval; the adapter never logs, returns, caches or persists the credential. An optional actual caller-owned `NoSqlConfigStore` must have the exact canonical `homeId` and `braviatv` domain; no store is required for control. Structural stand-ins are rejected. The adapter does not write or close it, its database or its key provider. There is no filesystem persistence fallback.
|
|
679
|
+
|
|
680
|
+
Explicit `allowUnencryptedLan: true` acknowledges HTTP on a selected private IPv4 address. PSK authorization does not prove peer identity or protect plaintext traffic. The integration checks freshly reported model and active-network MAC before each effect and during independent readback; this is an exact selection check, not cryptographic peer authentication.
|
|
681
|
+
|
|
682
|
+
Only three separate absolute services are admitted, each with an exact device or corresponding entity target: `braviatv.set_power` with `{ power: boolean }`, `braviatv.set_device_mute` with `{ muted: boolean }`, and `braviatv.set_speaker_volume_raw` with `{ volume_raw: integer }`. Feature writes use `power`, `device_mute` and `speaker_volume_raw`. Power and mute map to switch entities; speaker volume maps to a number entity. Mute applies at device level and observes speaker mute. Volume targets the speaker and requires its freshly advertised integer range plus the caller's `volumeLimitRaw` ceiling in 0..100 raw levels. Entity `minimum`/`maximum` preserve the display’s actual reported raw range; writable entities separately expose `maximumWritableRaw` limited by the owner ceiling. Read-only entities omit that writable cap. No percentage conversion or clamping occurs.
|
|
683
|
+
|
|
684
|
+
The facade refreshes supported v1.0 HTTP methods, identity and relevant state before every effect. Results preserve `commandAcknowledged`, distinguish `matching-reported-state` from `different-reported-state`, and keep `causalityConfirmed: false`. Reported state does not establish physical output or causality. Post-dispatch timeout, connection loss or changed identity remains indeterminate and never replays. Errors omit credentials, device debug strings and caller abort reasons. There is no arbitrary RPC, pairing, IR, toggle, relative volume, media URL, playback or wake fallback. A suspended display must remain reachable through Sony's documented Sleep/Remote start configuration.
|
|
685
|
+
|
|
686
|
+
`timeoutMs` defaults to 5000 and is bounded to 1..30000. The deadline starts at FIFO admission and covers queue time, credential resolution, facade preflight, single dispatch, independent readback and transport drain. Constructor `capacity` defaults to 16 and bounds shared pending setup/flow admissions, runtimes and retained failed cleanup resources. Client `maxPendingOperations` separately defaults to 16, bounded to 1..128, and includes retained failed facades. Responses default to 32768 bytes, bounded to 1024..65536. Late credential completion after cancellation cannot construct a facade or dispatch. Terminal memoized `destroy()` aborts and joins owned transports, queued work, failed factories and runtimes even when another cleanup fails. Failed cleanup remains owned. Only explicit `retryCleanup()` retries cleanup; it never retrieves a credential, constructs a facade or repeats a command. The original `destroy()` promise remains stable. Closing a config-flow child is terminal for that flow and leaves sibling runtimes usable; closing the integration joins all children and runtimes. Caller `abortSignal` also closes promoted runtimes. Caller credential providers receive an AbortSignal and monotonic deadline and own their retrieval resources. Destroy joins the actual admitted provider promise even after the request deadline. Rejection with the exact admitted `signal.reason` remains cancellation; an unrelated late provider rejection becomes a sanitized retained cleanup failure. Explicit `retryCleanup()` acknowledges that settled failure without invoking the resolver or replaying an effect; the original destroy promise keeps its result. Providers must cooperatively settle their admitted work.
|
|
687
|
+
|
|
688
|
+
`BraviatvClient` directly requires `(config, { homeId, abortSignal?, configStore? }, { resolvePsk, homeId? })`; constructor options never replace that context. `BraviatvConfigFlow({ resolvePsk, homeId?, capacity? })` likewise requires an independent `homeId` when started. Config flows capture the host home and discovery endpoint hint before returning a form and reject conflicting submitted homes before credentials or HTTP.
|
|
689
|
+
|
|
690
|
+
Subscriptions publish completed observations only and do not start polling. Relevant control readback replaces earlier observations, so unrelated old fields are not presented with a fresh timestamp. Unconfigured registry descriptors remain inert and cannot set up a runtime without explicit caller options.
|
|
691
|
+
|
|
692
|
+
Disposable real HTTP fixtures use ephemeral loopback ports and synthetic PSKs; they make no hardware claim. The opt-in `BRAVIATV_LOAD=1` case runs only in Docker capped to two CPUs and 4 GiB. Sony's canonical sources are the [REST API reference](https://pro-bravia.sony.net/remote-display-control/rest-api/reference/) and [REST structure and PSK levels](https://pro-bravia.sony.net/remote-display-control/rest-api/structure/).
|
|
693
|
+
|
|
694
|
+
### Kodi selected native HTTP JSON-RPC
|
|
695
|
+
|
|
696
|
+
Kodi observes a caller-selected literal private, link-local or loopback IPv4 HTTP origin through the published `@ecobridge.xyz/devicemanager` `KodiProtocol`. Configuration selects the exact application name and major and explicitly accepts plaintext HTTP. The live JSON-RPC API13 schema and case-sensitive `ReadData`/`ControlPlayback` permissions govern admission. Application name/version identify a compatible application, not a unique device; plain HTTP and optional Basic credentials do not authenticate the server cryptographically.
|
|
697
|
+
|
|
698
|
+
```typescript
|
|
699
|
+
const integration = new KodiIntegration({ homeId: 'home-1' });
|
|
700
|
+
const runtime = await integration.setup({
|
|
701
|
+
homeId: 'home-1',
|
|
702
|
+
origin: 'http://192.168.1.70:8080',
|
|
703
|
+
expectedApplicationName: 'Kodi',
|
|
704
|
+
expectedApplicationMajor: 21,
|
|
705
|
+
allowUnencryptedHttp: true,
|
|
706
|
+
}, { homeId: 'home-1', abortSignal });
|
|
707
|
+
|
|
708
|
+
const devices = await runtime.devices();
|
|
709
|
+
// Finish this caller-owned lifetime explicitly.
|
|
710
|
+
await integration.destroy();
|
|
711
|
+
```
|
|
712
|
+
|
|
713
|
+
Setup and config flow require an explicit `context.homeId` selected by the embedding host. An optional constructor home is an additional consistency constraint and never substitutes for the context. The shared native owner captures and fixes the first admitted host home synchronously, even if later readiness fails. This is a trusted embedding-host contract; the home string is not an authentication credential. Configuration, editable fields, advertisements and store scope cannot select that home. An optional caller-owned `configStore` must be an actual `NoSqlConfigStore` with the exact admitted home and `integrationDomain: 'kodi'`; no store is required for Kodi observation or policy capture. Kodi never reads, writes, deletes, lists, creates or closes borrowed store data/resources. Config flow captures the host home and fixes the candidate endpoint; its form does not expose an editable home. Discovery and flow admission use the public shared `validateKodiOrigin` policy. An eligible numeric advertised host wins; otherwise the first eligible explicitly advertised numeric address is selected. Invalid or absent numeric endpoints and invalid explicit ports are rejected before form creation or home binding. No DNS resolution or HTTP request runs during discovery or form submission. Setup performs fresh network readiness before returning a runtime. Credentials and snapshot data are rejected in production configuration.
|
|
714
|
+
|
|
715
|
+
Snapshots produce two readable features: integer application `volume` and boolean `muted`. Entity playback state is `unknown` because the selected foundation does not observe players. Metadata reports `selection: 'configured-http-endpoint'`, `uniqueDeviceIdentityVerified: false` and `cryptographicServerIdentityVerified: false`. Device and entity ids encode the home and selected normalized HTTP origin; these are local routing keys, not device identity evidence.
|
|
716
|
+
|
|
717
|
+
Controls default to disabled. Explicit configuration `control: { trustSelectedEndpoint: true, maximumVolume: 30 }` permits only absolute integer application volume and explicit boolean mute when the current schema/permissions admit them. Services require an exact owned device or entity target: `kodi.snapshot` with empty data, `kodi.set_volume` with `{ volume: 20 }`, and `kodi.set_muted` or `media_player.volume_mute` with `{ muted: true }`. `writeFeature` admits only the canonical media features `volume` and `muted` for this selected home/endpoint; supplied writable flags cannot grant authority. Percentage-level conversion, volume steps, toggle, playback, media URLs, remote keys, library, power and arbitrary methods are unsupported.
|
|
718
|
+
|
|
719
|
+
The owner ceiling limits this caller's admitted volume and refuses unmute while the observed volume exceeds it. It does not constrain concurrent controllers or physical audio output. A control result preserves the requested value, actual correlated RPC return and later actual observation separately, with `physicalEffectConfirmed: false`. A failure after dispatch reports `effectOutcome: 'indeterminate'`; the adapter never retries or replays it.
|
|
720
|
+
|
|
721
|
+
Optional Basic credentials are supplied by `new KodiIntegration({ homeId, getBasicCredentials })` or `new KodiClient(config, { homeId, abortSignal, configStore }, { getBasicCredentials })`. The public client requires an independently selected native home context before protocol allocation; credentials stay in its separate third options argument. The private caller-owned callback receives an `AbortSignal`, runs once per admitted operation and must honor cancellation. Its secret storage and external resources remain caller-owned. Credentials or remote error messages/data are not included in diagnostics or mapping.
|
|
722
|
+
|
|
723
|
+
The shared native owner bounds pending setups, admitted flow operations, runtimes and retained failed cleanup together to 16 owned slots. The public foundation separately serializes each client's operations in a bounded FIFO, including the active operation: default 16, configurable 1–128. Deadlines start at protocol admission: default 5000 ms, configurable 1–60000. Bodies default to 65536 bytes, configurable 1024–1048576. Queued cancellation removes queued work; active cancellation, deadline/HTTP/transport/correlation/body/selection failures close the client terminally and drain queued work. `destroy()` installs its stable promise before cancellation, rejects future setup/reads/writes, closes selected sockets and joins admitted providers and flow submissions. Cleanup failures remain retained and observable; `retryCleanup()` explicitly retries cleanup without replaying protocol operations. Closing the config flow is terminal for that child scope and preserves a separately owned runtime.
|
|
724
|
+
|
|
725
|
+
`KodiMapper.toDevices()` and `.toEntities()` preserve pure conversion of imported offline `IKodiSnapshot` data. Such outputs always report unavailable/read-only with `runtimeAuthority: 'offline-import'` and cannot configure or authorize native operation. No application filesystem persistence or Home Assistant bridge is used.
|
|
726
|
+
|
|
727
|
+
Verification: actual published devicemanager 4.8.0, 55 passing Kodi tests with real loopback HTTP fixtures, genuine `strict: true` / `noImplicitAny: true` / `skipLibCheck: false` source/test checking, and narrow production emit. Docker qualification with 2 CPUs, 4 GiB and no external network drained 128 admitted protocol operations, refused 10000 excess admissions, and drained all 16 admitted setup providers. No physical Kodi hardware or production installation was tested.
|