@smarthome.exchange/integrations 1.0.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 +49 -0
- package/dist_ts/00_commitinfo_data.js +1 -1
- package/dist_ts/core/classes.configstore.d.ts +2 -0
- package/dist_ts/core/classes.configstore.js +84 -27
- 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/index.d.ts +2 -0
- package/dist_ts/core/index.js +3 -1
- package/dist_ts/core/types.d.ts +14 -0
- 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 +8 -11
- package/dist_ts/integrations/braviatv/braviatv.classes.integration.js +186 -135
- 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 +16 -19
- package/dist_ts/integrations/broadlink/broadlink.classes.integration.js +114 -59
- 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.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/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 +7 -24
- 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/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 +6 -11
- 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/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 +11 -11
- package/dist_ts/integrations/kodi/kodi.classes.integration.js +114 -171
- 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/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 +6 -17
- 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/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 +8 -8
- 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.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/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/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/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/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 +14 -15
- 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/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 +10 -21
- 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/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/package.json +3 -3
- package/readme.md +514 -2
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/core/classes.configstore.ts +84 -27
- 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 +16 -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/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/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/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/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/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/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/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/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
|
@@ -1,7 +1,11 @@
|
|
|
1
|
-
import
|
|
2
|
-
import type {
|
|
1
|
+
import { type NativeIntegrationScope } from '../../core/classes.nativeintegrationowner.js';
|
|
2
|
+
import type { IConfigFlow, IConfigFlowStep, IDiscoveryCandidate, INativeConfigFlowContext } from '../../core/types.js';
|
|
3
|
+
import type { IModbusConfig, IModbusIntegrationOptions } from './modbus.types.js';
|
|
3
4
|
export declare class ModbusConfigFlow implements IConfigFlow<IModbusConfig> {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
5
|
+
#private;
|
|
6
|
+
constructor(optionsArg?: IModbusIntegrationOptions, scopeArg?: NativeIntegrationScope);
|
|
7
|
+
start(candidateArg: IDiscoveryCandidate, contextArg: INativeConfigFlowContext): Promise<IConfigFlowStep<IModbusConfig>>;
|
|
8
|
+
destroy(): Promise<void>;
|
|
9
|
+
retryCleanup(): Promise<void>;
|
|
10
|
+
private submit;
|
|
7
11
|
}
|
|
@@ -1,47 +1,79 @@
|
|
|
1
|
-
|
|
1
|
+
import { NativeIntegrationOwner } from '../../core/classes.nativeintegrationowner.js';
|
|
2
|
+
import { ModbusClient } from './modbus.classes.client.js';
|
|
3
|
+
import { ModbusMapper } from './modbus.mapper.js';
|
|
4
|
+
import { modbusRecord, normalizeModbusConfig } from './modbus.validation.js';
|
|
2
5
|
export class ModbusConfigFlow {
|
|
6
|
+
#scope;
|
|
7
|
+
constructor(optionsArg = {}, scopeArg) {
|
|
8
|
+
this.#scope = scopeArg ?? new NativeIntegrationOwner('modbus', optionsArg).createFlowScope();
|
|
9
|
+
}
|
|
3
10
|
async start(candidateArg, contextArg) {
|
|
4
|
-
|
|
11
|
+
const candidate = modbusRecord(candidateArg);
|
|
12
|
+
if (candidate.source !== 'manual' || candidate.integrationDomain !== undefined && candidate.integrationDomain !== 'modbus') {
|
|
13
|
+
throw new TypeError('Modbus config admission accepts explicit manual candidates only.');
|
|
14
|
+
}
|
|
15
|
+
const metadata = candidate.metadata === undefined ? {} : modbusRecord(candidate.metadata);
|
|
16
|
+
const context = this.#scope.admit(contextArg);
|
|
5
17
|
return {
|
|
6
|
-
kind: 'form',
|
|
7
|
-
|
|
8
|
-
description: 'Configure a known Modbus TCP endpoint. Serial RTU ports are intentionally not guessed or probed.',
|
|
18
|
+
kind: 'form', title: 'Select Modbus TCP device',
|
|
19
|
+
description: 'Select the private IPv4 endpoint, unit, vendor and product for the host-selected home. Supply an explicit JSON array of zero-based raw read mappings; writes require single-address permission. Identity strings are unauthenticated LAN observations.',
|
|
9
20
|
fields: [
|
|
10
|
-
{ name: '
|
|
11
|
-
{ name: '
|
|
12
|
-
{ name: '
|
|
13
|
-
{ name: '
|
|
14
|
-
{ name: '
|
|
21
|
+
{ name: 'address', label: 'Selected local IPv4 address', type: 'text', required: true },
|
|
22
|
+
{ name: 'port', label: 'TCP port', type: 'number' },
|
|
23
|
+
{ name: 'unitId', label: 'Selected unit ID', type: 'number', required: true },
|
|
24
|
+
{ name: 'expectedVendorName', label: 'Exact vendor name', type: 'text', required: true },
|
|
25
|
+
{ name: 'expectedProductCode', label: 'Exact product code', type: 'text', required: true },
|
|
26
|
+
{ name: 'expectedRevision', label: 'Optional exact revision', type: 'text' },
|
|
27
|
+
{ name: 'allowUnencryptedLan', label: 'Accept unencrypted LAN transport', type: 'boolean', required: true },
|
|
28
|
+
{ name: 'mappings', label: 'Owner raw mappings JSON', type: 'text', required: true },
|
|
29
|
+
{ name: 'name', label: 'Display name', type: 'text' },
|
|
15
30
|
],
|
|
16
|
-
submit:
|
|
17
|
-
const unitId = this.numberValue(valuesArg.unitId) || this.numberValue(candidateArg.metadata?.unitId) || 1;
|
|
18
|
-
const port = this.numberValue(valuesArg.port) || candidateArg.port || defaultModbusTcpPort;
|
|
19
|
-
return {
|
|
20
|
-
kind: 'done',
|
|
21
|
-
title: 'Modbus TCP hub configured',
|
|
22
|
-
config: {
|
|
23
|
-
hubs: [{
|
|
24
|
-
id: candidateArg.id,
|
|
25
|
-
name: this.stringValue(valuesArg.name) || candidateArg.name || 'modbus_hub',
|
|
26
|
-
type: 'tcp',
|
|
27
|
-
host: this.stringValue(valuesArg.host) || candidateArg.host || '',
|
|
28
|
-
port,
|
|
29
|
-
timeoutMs: this.numberValue(valuesArg.timeoutMs) || 5000,
|
|
30
|
-
slave: unitId,
|
|
31
|
-
manufacturer: candidateArg.manufacturer,
|
|
32
|
-
model: candidateArg.model,
|
|
33
|
-
serialNumber: candidateArg.serialNumber,
|
|
34
|
-
}],
|
|
35
|
-
},
|
|
36
|
-
};
|
|
37
|
-
},
|
|
31
|
+
submit: (valuesArg) => this.submit(valuesArg, candidate, metadata, context),
|
|
38
32
|
};
|
|
39
33
|
}
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
34
|
+
destroy() { return this.#scope.close(); }
|
|
35
|
+
retryCleanup() { return this.#scope.retryCleanup(); }
|
|
36
|
+
async submit(valuesArg, candidateArg, metadataArg, contextArg) {
|
|
37
|
+
try {
|
|
38
|
+
const values = modbusRecord(valuesArg, ['homeId', 'address', 'port', 'unitId', 'expectedVendorName', 'expectedProductCode', 'expectedRevision',
|
|
39
|
+
'allowUnencryptedLan', 'mappings', 'name', 'localAddress', 'timeoutMs', 'maxQueuedOperations']);
|
|
40
|
+
if (values.homeId !== undefined && values.homeId !== contextArg.homeId)
|
|
41
|
+
throw new Error('Modbus submitted home conflicts with the host-selected home.');
|
|
42
|
+
let mappings = values.mappings;
|
|
43
|
+
if (typeof mappings === 'string') {
|
|
44
|
+
if (mappings.length > 32768)
|
|
45
|
+
throw new TypeError('Modbus mapping JSON exceeds its size bound.');
|
|
46
|
+
mappings = JSON.parse(mappings);
|
|
47
|
+
}
|
|
48
|
+
const config = normalizeModbusConfig({ ...values, homeId: contextArg.homeId, mappings,
|
|
49
|
+
address: values.address === undefined ? candidateArg.host : values.address,
|
|
50
|
+
port: values.port === undefined ? candidateArg.port : values.port,
|
|
51
|
+
unitId: values.unitId === undefined ? metadataArg.unitId : values.unitId,
|
|
52
|
+
expectedVendorName: values.expectedVendorName === undefined ? metadataArg.expectedVendorName : values.expectedVendorName,
|
|
53
|
+
expectedProductCode: values.expectedProductCode === undefined ? metadataArg.expectedProductCode : values.expectedProductCode,
|
|
54
|
+
expectedRevision: values.expectedRevision === undefined ? metadataArg.expectedRevision : values.expectedRevision });
|
|
55
|
+
return await this.#scope.run(contextArg, config.homeId, async (leaseArg) => {
|
|
56
|
+
const client = new ModbusClient(config, leaseArg.signal);
|
|
57
|
+
let cleanupAttempted = false;
|
|
58
|
+
leaseArg.own(() => {
|
|
59
|
+
if (cleanupAttempted)
|
|
60
|
+
return client.retryCleanup();
|
|
61
|
+
cleanupAttempted = true;
|
|
62
|
+
return client.destroy();
|
|
63
|
+
});
|
|
64
|
+
await client.getSnapshot(leaseArg.signal);
|
|
65
|
+
leaseArg.assertOpen();
|
|
66
|
+
await client.destroy();
|
|
67
|
+
leaseArg.assertOpen();
|
|
68
|
+
if (leaseArg.context.configStore)
|
|
69
|
+
await leaseArg.context.configStore.set(`device:${ModbusMapper.deviceId(config)}`, config);
|
|
70
|
+
leaseArg.assertOpen();
|
|
71
|
+
return { kind: 'done', title: 'Selected Modbus device and read mappings verified', config };
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
catch (errorArg) {
|
|
75
|
+
return { kind: 'error', title: 'Modbus admission failed', error: errorArg instanceof Error ? errorArg.message : 'Modbus admission failed.' };
|
|
76
|
+
}
|
|
45
77
|
}
|
|
46
78
|
}
|
|
47
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
79
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kYnVzLmNsYXNzZXMuY29uZmlnZmxvdy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3RzL2ludGVncmF0aW9ucy9tb2RidXMvbW9kYnVzLmNsYXNzZXMuY29uZmlnZmxvdy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsc0JBQXNCLEVBQStCLE1BQU0sOENBQThDLENBQUM7QUFFbkgsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzFELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUVsRCxPQUFPLEVBQUUsWUFBWSxFQUFFLHFCQUFxQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFFN0UsTUFBTSxPQUFPLGdCQUFnQjtJQUNsQixNQUFNLENBQXlCO0lBRXhDLFlBQVksVUFBVSxHQUE4QixFQUFFLEVBQUUsUUFBaUM7UUFDdkYsSUFBSSxDQUFDLE1BQU0sR0FBRyxRQUFRLElBQUksSUFBSSxzQkFBc0IsQ0FBQyxRQUFRLEVBQUUsVUFBVSxDQUFDLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDL0YsQ0FBQztJQUVNLEtBQUssQ0FBQyxLQUFLLENBQUMsWUFBaUMsRUFBRSxVQUFvQztRQUN4RixNQUFNLFNBQVMsR0FBRyxZQUFZLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDN0MsSUFBSSxTQUFTLENBQUMsTUFBTSxLQUFLLFFBQVEsSUFBSSxTQUFTLENBQUMsaUJBQWlCLEtBQUssU0FBUyxJQUFJLFNBQVMsQ0FBQyxpQkFBaUIsS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUMzSCxNQUFNLElBQUksU0FBUyxDQUFDLGtFQUFrRSxDQUFDLENBQUM7UUFDMUYsQ0FBQztRQUNELE1BQU0sUUFBUSxHQUFHLFNBQVMsQ0FBQyxRQUFRLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUM7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
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { BaseIntegration } from '../../core/classes.baseintegration.js';
|
|
2
|
-
import type { IIntegrationRuntime,
|
|
2
|
+
import type { IIntegrationRuntime, INativeIntegrationSetupContext } from '../../core/types.js';
|
|
3
3
|
import { ModbusConfigFlow } from './modbus.classes.configflow.js';
|
|
4
|
-
import type { IModbusConfig } from './modbus.types.js';
|
|
4
|
+
import type { IModbusConfig, IModbusIntegrationOptions } from './modbus.types.js';
|
|
5
5
|
export declare class ModbusIntegration extends BaseIntegration<IModbusConfig> {
|
|
6
|
+
#private;
|
|
6
7
|
readonly domain = "modbus";
|
|
7
8
|
readonly displayName = "Modbus";
|
|
8
9
|
readonly status: 'control-runtime';
|
|
@@ -10,21 +11,7 @@ export declare class ModbusIntegration extends BaseIntegration<IModbusConfig> {
|
|
|
10
11
|
readonly configFlow: ModbusConfigFlow;
|
|
11
12
|
readonly metadata: {
|
|
12
13
|
source: string;
|
|
13
|
-
upstreamPath: string;
|
|
14
14
|
upstreamDomain: string;
|
|
15
|
-
iotClass: string;
|
|
16
|
-
requirements: string[];
|
|
17
|
-
dependencies: never[];
|
|
18
|
-
afterDependencies: never[];
|
|
19
|
-
codeowners: never[];
|
|
20
|
-
documentation: string;
|
|
21
|
-
configFlow: boolean;
|
|
22
|
-
discovery: {
|
|
23
|
-
manual: boolean;
|
|
24
|
-
tcp: boolean;
|
|
25
|
-
serial: boolean;
|
|
26
|
-
note: string;
|
|
27
|
-
};
|
|
28
15
|
runtime: {
|
|
29
16
|
type: string;
|
|
30
17
|
polling: string;
|
|
@@ -35,8 +22,10 @@ export declare class ModbusIntegration extends BaseIntegration<IModbusConfig> {
|
|
|
35
22
|
explicitUnsupported: string[];
|
|
36
23
|
};
|
|
37
24
|
};
|
|
38
|
-
|
|
25
|
+
constructor(optionsArg?: IModbusIntegrationOptions);
|
|
26
|
+
setup(configArg: IModbusConfig, contextArg: INativeIntegrationSetupContext): Promise<IIntegrationRuntime>;
|
|
39
27
|
destroy(): Promise<void>;
|
|
28
|
+
retryCleanup(): Promise<void>;
|
|
40
29
|
}
|
|
41
30
|
export declare class HomeAssistantModbusIntegration extends ModbusIntegration {
|
|
42
31
|
}
|
|
@@ -1,87 +1,163 @@
|
|
|
1
|
+
import * as plugins from '../../plugins.js';
|
|
1
2
|
import { BaseIntegration } from '../../core/classes.baseintegration.js';
|
|
3
|
+
import { NativeIntegrationOwner } from '../../core/classes.nativeintegrationowner.js';
|
|
2
4
|
import { ModbusClient } from './modbus.classes.client.js';
|
|
3
5
|
import { ModbusConfigFlow } from './modbus.classes.configflow.js';
|
|
4
6
|
import { createModbusDiscoveryDescriptor } from './modbus.discovery.js';
|
|
5
7
|
import { ModbusMapper } from './modbus.mapper.js';
|
|
8
|
+
import { normalizeModbusConfig } from './modbus.validation.js';
|
|
6
9
|
export class ModbusIntegration extends BaseIntegration {
|
|
7
10
|
domain = 'modbus';
|
|
8
11
|
displayName = 'Modbus';
|
|
9
12
|
status = 'control-runtime';
|
|
10
13
|
discoveryDescriptor = createModbusDiscoveryDescriptor();
|
|
11
|
-
configFlow
|
|
14
|
+
configFlow;
|
|
12
15
|
metadata = {
|
|
13
|
-
source: '
|
|
14
|
-
|
|
15
|
-
upstreamDomain: 'modbus',
|
|
16
|
-
iotClass: 'local_polling',
|
|
17
|
-
requirements: ['pymodbus==3.11.2'],
|
|
18
|
-
dependencies: [],
|
|
19
|
-
afterDependencies: [],
|
|
20
|
-
codeowners: [],
|
|
21
|
-
documentation: 'https://www.home-assistant.io/integrations/modbus',
|
|
22
|
-
configFlow: true,
|
|
23
|
-
discovery: {
|
|
24
|
-
manual: true,
|
|
25
|
-
tcp: true,
|
|
26
|
-
serial: false,
|
|
27
|
-
note: 'Manual Modbus TCP setup is implemented. Serial RTU ports are not guessed or probed.',
|
|
28
|
-
},
|
|
29
|
-
runtime: {
|
|
30
|
-
type: 'control-runtime',
|
|
31
|
-
polling: 'local snapshot or explicit Modbus TCP requests',
|
|
32
|
-
services: ['read_coil', 'read_register', 'write_coil', 'write_register', 'stop', 'restart', 'refresh'],
|
|
33
|
-
},
|
|
16
|
+
source: 'native', upstreamDomain: 'modbus',
|
|
17
|
+
runtime: { type: 'control-runtime', polling: 'explicit owner reads', services: ['read', 'write_coil', 'write_register'] },
|
|
34
18
|
localApi: {
|
|
35
|
-
implemented: [
|
|
36
|
-
'
|
|
37
|
-
|
|
38
|
-
'
|
|
39
|
-
'register/coils mapping to sensor, binary_sensor, switch, and number entities',
|
|
40
|
-
],
|
|
41
|
-
explicitUnsupported: [
|
|
42
|
-
'unsafe serial RTU discovery or serial port guessing',
|
|
43
|
-
'serial RTU runtime transport',
|
|
44
|
-
'RTU-over-TCP framer runtime transport',
|
|
45
|
-
'UDP runtime transport',
|
|
46
|
-
'climate, cover, fan, and light platform behavior beyond configured register/coil entities',
|
|
47
|
-
],
|
|
19
|
+
implemented: ['selected home/IPv4/unit/vendor/product', 'fresh basic identity on every operation', 'explicit raw bit/register read mappings',
|
|
20
|
+
'default-deny single absolute FC5/6 writes', 'bounded devicemanager admission and terminal cleanup'],
|
|
21
|
+
explicitUnsupported: ['automatic discovery', 'serial RTU', 'UDP', 'RTU-over-TCP', 'register-map inference', 'scaling or semantic device capabilities',
|
|
22
|
+
'multi-address writes', 'toggles', 'automatic retries or replay', 'cryptographic device authentication', 'physical effect confirmation'],
|
|
48
23
|
},
|
|
49
24
|
};
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
25
|
+
#owner;
|
|
26
|
+
constructor(optionsArg = {}) {
|
|
27
|
+
super();
|
|
28
|
+
this.#owner = new NativeIntegrationOwner(this.domain, optionsArg);
|
|
29
|
+
this.configFlow = new ModbusConfigFlow({}, this.#owner.createFlowScope());
|
|
30
|
+
}
|
|
31
|
+
setup(configArg, contextArg) {
|
|
32
|
+
try {
|
|
33
|
+
const config = normalizeModbusConfig(configArg);
|
|
34
|
+
return this.#owner.runSetup(contextArg, config.homeId, async (leaseArg) => {
|
|
35
|
+
const client = new ModbusClient(config, leaseArg.signal);
|
|
36
|
+
let cleanupAttempted = false;
|
|
37
|
+
leaseArg.own(() => {
|
|
38
|
+
if (cleanupAttempted)
|
|
39
|
+
return client.retryCleanup();
|
|
40
|
+
cleanupAttempted = true;
|
|
41
|
+
return client.destroy();
|
|
42
|
+
});
|
|
43
|
+
const snapshot = await client.getSnapshot(leaseArg.signal);
|
|
44
|
+
leaseArg.assertOpen();
|
|
45
|
+
const runtime = new ModbusRuntime(client, snapshot, leaseArg);
|
|
46
|
+
leaseArg.promoteToRuntime();
|
|
47
|
+
return runtime;
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
catch (errorArg) {
|
|
51
|
+
return Promise.reject(errorArg);
|
|
52
|
+
}
|
|
53
53
|
}
|
|
54
|
-
|
|
54
|
+
destroy() { return this.#owner.close(); }
|
|
55
|
+
retryCleanup() { return this.#owner.retryCleanup(); }
|
|
55
56
|
}
|
|
56
57
|
export class HomeAssistantModbusIntegration extends ModbusIntegration {
|
|
57
58
|
}
|
|
58
59
|
class ModbusRuntime {
|
|
59
60
|
client;
|
|
61
|
+
snapshot;
|
|
62
|
+
lease;
|
|
60
63
|
domain = 'modbus';
|
|
61
|
-
|
|
64
|
+
#subscriptions = new Set();
|
|
65
|
+
#ownerAbort = () => { void this.destroy().then(() => undefined, () => undefined); };
|
|
66
|
+
#closed = false;
|
|
67
|
+
#closing;
|
|
68
|
+
constructor(client, snapshot, lease) {
|
|
62
69
|
this.client = client;
|
|
70
|
+
this.snapshot = snapshot;
|
|
71
|
+
this.lease = lease;
|
|
72
|
+
lease.signal.addEventListener('abort', this.#ownerAbort, { once: true });
|
|
73
|
+
if (lease.signal.aborted)
|
|
74
|
+
this.#ownerAbort();
|
|
63
75
|
}
|
|
64
|
-
|
|
65
|
-
|
|
76
|
+
isHealthy() { return !this.#closed && this.client.isHealthy(); }
|
|
77
|
+
async devices(signalArg) {
|
|
78
|
+
return ModbusMapper.toDevices(await this.refresh(signalArg));
|
|
66
79
|
}
|
|
67
|
-
async entities() {
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
80
|
+
async entities() { return ModbusMapper.toEntities(await this.refresh()); }
|
|
81
|
+
/** Passive observations only: subscribing never starts reads or a polling timer. */
|
|
82
|
+
async subscribe(handlerArg, signalArg) {
|
|
83
|
+
this.assertOpen();
|
|
84
|
+
if (typeof handlerArg !== 'function')
|
|
85
|
+
throw new TypeError('Modbus subscription handler must be a function.');
|
|
86
|
+
if (signalArg !== undefined && !(signalArg instanceof AbortSignal))
|
|
87
|
+
throw new TypeError('Modbus subscription signal must be an AbortSignal.');
|
|
88
|
+
signalArg?.throwIfAborted();
|
|
89
|
+
const entry = { handler: handlerArg, release: () => { this.#subscriptions.delete(entry); signalArg?.removeEventListener('abort', entry.release); } };
|
|
90
|
+
this.#subscriptions.add(entry);
|
|
91
|
+
signalArg?.addEventListener('abort', entry.release, { once: true });
|
|
92
|
+
if (signalArg?.aborted)
|
|
93
|
+
entry.release();
|
|
94
|
+
return async () => entry.release();
|
|
73
95
|
}
|
|
74
96
|
async callService(requestArg) {
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
97
|
+
try {
|
|
98
|
+
this.assertOpen();
|
|
99
|
+
return await this.execute(ModbusMapper.commandForService(this.client.config, requestArg));
|
|
100
|
+
}
|
|
101
|
+
catch (errorArg) {
|
|
102
|
+
return this.failure(errorArg);
|
|
79
103
|
}
|
|
80
|
-
const result = await this.client.sendCommand(command);
|
|
81
|
-
return { success: result.success, error: result.error, data: result.data };
|
|
82
104
|
}
|
|
83
|
-
async
|
|
84
|
-
|
|
105
|
+
async writeFeature(requestArg, signalArg) {
|
|
106
|
+
try {
|
|
107
|
+
this.assertOpen();
|
|
108
|
+
return await this.execute(ModbusMapper.commandForFeature(this.client.config, requestArg), signalArg);
|
|
109
|
+
}
|
|
110
|
+
catch (errorArg) {
|
|
111
|
+
return this.failure(errorArg);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
destroy() {
|
|
115
|
+
if (this.#closing)
|
|
116
|
+
return this.#closing;
|
|
117
|
+
this.#closed = true;
|
|
118
|
+
this.#closing = Promise.resolve().then(() => this.lease.close());
|
|
119
|
+
this.lease.signal.removeEventListener('abort', this.#ownerAbort);
|
|
120
|
+
for (const entry of [...this.#subscriptions])
|
|
121
|
+
entry.release();
|
|
122
|
+
return this.#closing;
|
|
123
|
+
}
|
|
124
|
+
async refresh(signalArg) {
|
|
125
|
+
this.assertOpen();
|
|
126
|
+
const snapshot = await this.client.getSnapshot(signalArg);
|
|
127
|
+
this.assertOpen();
|
|
128
|
+
this.snapshot = snapshot;
|
|
129
|
+
for (const entity of ModbusMapper.toEntities(snapshot))
|
|
130
|
+
this.notify({ type: 'state_changed', integrationDomain: 'modbus',
|
|
131
|
+
deviceId: entity.deviceId, entityId: entity.id, timestamp: Date.parse(snapshot.observedAt), data: { entity } });
|
|
132
|
+
return snapshot;
|
|
133
|
+
}
|
|
134
|
+
async execute(commandArg, signalArg) {
|
|
135
|
+
const result = await this.client.sendCommand(commandArg, signalArg);
|
|
136
|
+
if ('mapping' in result) {
|
|
137
|
+
this.assertOpen();
|
|
138
|
+
const snapshot = { ...this.snapshot, identity: result.identity, observations: [result], observedAt: result.observedAt };
|
|
139
|
+
const entity = ModbusMapper.toEntities(snapshot)[0];
|
|
140
|
+
this.notify({ type: 'state_changed', integrationDomain: 'modbus', deviceId: entity.deviceId, entityId: entity.id,
|
|
141
|
+
timestamp: Date.parse(result.observedAt), data: { entity } });
|
|
142
|
+
}
|
|
143
|
+
return { success: true, data: result };
|
|
144
|
+
}
|
|
145
|
+
failure(errorArg) {
|
|
146
|
+
return { success: false, error: errorArg instanceof Error ? errorArg.message : 'Modbus operation failed.',
|
|
147
|
+
data: { physicalEffectConfirmed: false, effectOutcome: errorArg instanceof plugins.ecobridgeDeviceManager.ModbusProtocolError ? errorArg.effectOutcome : 'not-sent',
|
|
148
|
+
...(errorArg instanceof plugins.ecobridgeDeviceManager.ModbusProtocolError ? { errorCode: errorArg.code } : {}) } };
|
|
149
|
+
}
|
|
150
|
+
assertOpen() {
|
|
151
|
+
if (this.#closed)
|
|
152
|
+
throw new Error('Modbus runtime is destroyed.');
|
|
153
|
+
this.lease.assertOpen();
|
|
154
|
+
}
|
|
155
|
+
notify(eventArg) {
|
|
156
|
+
for (const entry of [...this.#subscriptions]) {
|
|
157
|
+
if (this.#closed)
|
|
158
|
+
break;
|
|
159
|
+
entry.handler(eventArg);
|
|
160
|
+
}
|
|
85
161
|
}
|
|
86
162
|
}
|
|
87
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
163
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kYnVzLmNsYXNzZXMuaW50ZWdyYXRpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90cy9pbnRlZ3JhdGlvbnMvbW9kYnVzL21vZGJ1cy5jbGFzc2VzLmludGVncmF0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sa0JBQWtCLENBQUM7QUFDNUMsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBQ3hFLE9BQU8sRUFBRSxzQkFBc0IsRUFBMEIsTUFBTSw4Q0FBOEMsQ0FBQztBQUU5RyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDMUQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDbEUsT0FBTyxFQUFFLCtCQUErQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDeEUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRWxELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRS9ELE1BQU0sT0FBTyxpQkFBa0IsU0FBUSxlQUE4QjtJQUNuRCxNQUFNLEdBQUcsUUFBUSxDQUFDO0lBQ2xCLFdBQVcsR0FBRyxRQUFRLENBQUM7SUFDdkIsTUFBTSxHQUFHLGlCQUEwQixDQUFDO0lBQ3BDLG1CQUFtQixHQUFHLCtCQUErQixFQUFFLENBQUM7SUFDeEQsVUFBVSxDQUFtQjtJQUM3QixRQUFRLEdBQUc7UUFDekIsTUFBTSxFQUFFLFFBQVEsRUFBRSxjQUFjLEVBQUUsUUFBUTtRQUMxQyxPQUFPLEVBQUUsRUFBRSxJQUFJLEVBQUUsaUJBQWlCLEVBQUUsT0FBTyxFQUFFLHNCQUFzQixFQUFFLFFBQVEsRUFBRSxDQUFDLE1BQU0sRUFBRSxZQUFZLEVBQUUsZ0JBQWdCLENBQUMsRUFBRTtRQUN6SCxRQUFRLEVBQUU7WUFDUixXQUFXLEVBQUUsQ0FBQyx3Q0FBd0MsRUFB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
|
|
@@ -2,17 +2,14 @@ import { DiscoveryDescriptor } from '../../core/classes.discoverydescriptor.js';
|
|
|
2
2
|
import type { IDiscoveryCandidate, IDiscoveryContext, IDiscoveryMatch, IDiscoveryMatcher, IDiscoveryValidator } from '../../core/types.js';
|
|
3
3
|
import type { IModbusManualTcpEntry } from './modbus.types.js';
|
|
4
4
|
export declare class ModbusManualTcpMatcher implements IDiscoveryMatcher<IModbusManualTcpEntry> {
|
|
5
|
-
id
|
|
6
|
-
source: 'manual';
|
|
7
|
-
description
|
|
5
|
+
readonly id = "modbus-manual-tcp-match";
|
|
6
|
+
readonly source: 'manual';
|
|
7
|
+
readonly description = "Accept explicit Modbus endpoint and family identity selections without network probes.";
|
|
8
8
|
matches(inputArg: IModbusManualTcpEntry, contextArg: IDiscoveryContext): Promise<IDiscoveryMatch>;
|
|
9
|
-
private normalizedId;
|
|
10
|
-
private looksLikeSerialPort;
|
|
11
9
|
}
|
|
12
10
|
export declare class ModbusCandidateValidator implements IDiscoveryValidator {
|
|
13
|
-
id
|
|
14
|
-
description
|
|
11
|
+
readonly id = "modbus-candidate-validator";
|
|
12
|
+
readonly description = "Validate explicit manual selections; live admission belongs to the config flow.";
|
|
15
13
|
validate(candidateArg: IDiscoveryCandidate, contextArg: IDiscoveryContext): Promise<IDiscoveryMatch>;
|
|
16
|
-
private looksLikeSerialPort;
|
|
17
14
|
}
|
|
18
15
|
export declare const createModbusDiscoveryDescriptor: () => DiscoveryDescriptor;
|