iobroker.ai-energy-manager 0.2.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.
Files changed (51) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +198 -0
  3. package/admin/ai-energy-manager.png +0 -0
  4. package/admin/custom/.vite/manifest.json +123 -0
  5. package/admin/custom/assets/_virtual_mf-localSharedImportMap___mfe_internal__ConfigCustomAiEnergyManager-D_8M5SZg.js +260 -0
  6. package/admin/custom/assets/_virtual_mf___mfe_internal__ConfigCustomAiEnergyManager__loadShare___mf_0_emotion_mf_1_react__loadShare__.mjs-C_QoYoiQ.js +2234 -0
  7. package/admin/custom/assets/_virtual_mf___mfe_internal__ConfigCustomAiEnergyManager__loadShare___mf_0_emotion_mf_1_styled__loadShare__.mjs-Bjagi3Hs.js +180 -0
  8. package/admin/custom/assets/_virtual_mf___mfe_internal__ConfigCustomAiEnergyManager__loadShare___mf_0_iobroker_mf_1_adapter_mf_2_react_mf_2_v5__loadShare__.mjs-Qmea7kmD.js +253550 -0
  9. package/admin/custom/assets/_virtual_mf___mfe_internal__ConfigCustomAiEnergyManager__loadShare__react_mf_2_dom_mf_1_client__loadShare__.mjs-vzzsfdoZ.js +44 -0
  10. package/admin/custom/assets/hostInit-CFxXjdei.js +62 -0
  11. package/admin/custom/assets/index-BEY7z3x9.js +31 -0
  12. package/admin/custom/assets/main-B8zKNpy9.js +3465 -0
  13. package/admin/custom/assets/main-C0rS7ABd.css +368 -0
  14. package/admin/custom/assets/preload-helper-D9f-kLWf.js +65 -0
  15. package/admin/custom/assets/rolldown-runtime-BYbx6iT9.js +42 -0
  16. package/admin/custom/assets/virtualExposes-BU4Kt82k.js +2 -0
  17. package/admin/custom/assets/virtual_mf-REMOTE_ENTRY_ID___mfe_internal__ConfigCustomAiEnergyManager__customComponents_js-CrBRV5Aj.js +3372 -0
  18. package/admin/custom/assets/virtual_mf-exposes___mfe_internal__ConfigCustomAiEnergyManager__customComponents_js-Ct62_K2n.js +61 -0
  19. package/admin/custom/customComponents.js +5 -0
  20. package/admin/custom/index.html +14 -0
  21. package/admin/custom/mf-entry-bootstrap-0.js +16 -0
  22. package/admin/custom/mf-manifest.json +184 -0
  23. package/admin/custom/mf-stats.json +375 -0
  24. package/admin/i18n/de/translations.json +171 -0
  25. package/admin/i18n/en/translations.json +171 -0
  26. package/admin/i18n/en.json +171 -0
  27. package/admin/i18n/es/translations.json +171 -0
  28. package/admin/i18n/fr/translations.json +171 -0
  29. package/admin/i18n/it/translations.json +171 -0
  30. package/admin/i18n/nl/translations.json +171 -0
  31. package/admin/i18n/nl.json +171 -0
  32. package/admin/i18n/pl/translations.json +171 -0
  33. package/admin/i18n/pt/translations.json +171 -0
  34. package/admin/i18n/ru/translations.json +171 -0
  35. package/admin/i18n/uk/translations.json +171 -0
  36. package/admin/i18n/zh-cn/translations.json +171 -0
  37. package/admin/jsonConfig.json5 +17 -0
  38. package/io-package.json +566 -0
  39. package/lib/apiClient.js +178 -0
  40. package/lib/controlHandler.js +172 -0
  41. package/lib/datapointAssignments.js +511 -0
  42. package/lib/datapointManager.js +117 -0
  43. package/lib/featureRegistry.js +355 -0
  44. package/lib/loggerUtils.js +43 -0
  45. package/lib/serverConfigManager.js +102 -0
  46. package/lib/stateCollector.js +152 -0
  47. package/lib/telemetryQueue.js +110 -0
  48. package/lib/telemetrySampler.js +889 -0
  49. package/lib/validation.js +110 -0
  50. package/main.js +2047 -0
  51. package/package.json +82 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Christoph Böhrs
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,198 @@
1
+ # ioBroker AI Energy Manager
2
+
3
+ [![NPM version](https://img.shields.io/npm/v/iobroker.ai-energy-manager.svg)](https://www.npmjs.com/package/iobroker.ai-energy-manager)
4
+ [![Downloads](https://img.shields.io/npm/dm/iobroker.ai-energy-manager.svg)](https://www.npmjs.com/package/iobroker.ai-energy-manager)
5
+ ![Number of Installations](https://iobroker.live/badges/ai-energy-manager-installed.svg)
6
+ [![GitHub license](https://img.shields.io/github/license/blabond/ioBroker.ai-energy-manager?style=flat-square)](https://github.com/blabond/ioBroker.ai-energy-manager/blob/main/LICENSE)
7
+ [![Test and Release](https://github.com/blabond/ioBroker.ai-energy-manager/actions/workflows/test-and-release.yml/badge.svg)](https://github.com/blabond/ioBroker.ai-energy-manager/actions/workflows/test-and-release.yml)
8
+
9
+ The AI Energy Manager adapter connects ioBroker to the SmartEnergy backend for dynamic electricity tariffs, photovoltaic forecasts, telemetry, battery management, wallbox integration and controlled writable datapoints.
10
+
11
+ The adapter continuously sends normalized energy telemetry to the backend, receives a user-specific system configuration and applies controlled charging commands only to datapoints that were explicitly selected in ioBroker. It supports installations with household meters, PV-only plants, balcony power systems, batteries, generic storage systems, energy meters and wallboxes.
12
+
13
+ ## Documentation
14
+
15
+ [German documentation](https://github.com/blabond/ioBroker.ai-energy-manager/blob/main/docs/de/README.md)
16
+
17
+ ## Features
18
+
19
+ - Token-based connection to the SmartEnergy backend
20
+ - Server-driven adapter configuration for the user's actual plants
21
+ - Telemetry upload for consumption, grid import, grid export, PV production, battery power, battery state of charge and wallbox values
22
+ - Automatic source unit handling for Wh, kWh, W and kW values
23
+ - Dynamic datapoint tables grouped by household and plant
24
+ - ioBroker object browser for selecting datapoints
25
+ - Dashboard Lite with system cards, 6-hour plan and pattern detection
26
+ - Controlled battery commands for charging, discharging and holding reserve
27
+ - Controlled wallbox commands, including charging enablement and current limits
28
+ - Explicit write protection: commands are accepted only for configured writable datapoints
29
+ - Token masking in logs
30
+ - Theme-aware admin UI for light and dark ioBroker themes
31
+
32
+ ## Requirements
33
+
34
+ - Node.js 22 or newer
35
+ - js-controller 6.0.11 or newer
36
+ - ioBroker Admin 7.6.20 or newer
37
+ - SmartEnergy account with an adapter token
38
+ - Configured ioBroker datapoints for the meters, batteries, PV plants and wallboxes that should be used
39
+
40
+ ## Installation
41
+
42
+ Install the adapter from the ioBroker adapter repository or from npm when it is available there. After installation, create an instance of `ai-energy-manager`.
43
+
44
+ ## Configuration
45
+
46
+ Open the adapter configuration in ioBroker Admin.
47
+
48
+ 1. Paste the adapter token from the SmartEnergy web frontend.
49
+ 2. Save the configuration.
50
+ 3. Click **Request Config**.
51
+ 4. Open the **Datapoints** tab.
52
+ 5. Select the required ioBroker state paths with the object browser.
53
+ 6. Save the configuration.
54
+
55
+ The adapter token is stored in encrypted native configuration and is protected from being displayed in ioBroker Admin.
56
+
57
+ ## Request Config
58
+
59
+ The **Request Config** button asks the backend for the current system configuration of the user. The backend response defines the required household values and the available plant-specific values. The adapter then renders one household table and one table per configured plant.
60
+
61
+ The number of plant tables is not fixed. If the user adds or removes plants in the web frontend, the adapter receives the new structure on the next configuration request.
62
+
63
+ Existing datapoint assignments are preserved as long as their logical keys still exist.
64
+
65
+ ## Datapoints
66
+
67
+ The adapter works with logical datapoints instead of hard-coded ioBroker paths. Typical household datapoints are:
68
+
69
+ - household consumption
70
+ - grid import meter
71
+ - grid export meter
72
+ - current grid power
73
+ - wallbox energy or power
74
+
75
+ Typical plant datapoints are:
76
+
77
+ - PV production
78
+ - battery state of charge
79
+ - battery power
80
+ - battery capacity
81
+ - controllable AC output power
82
+ - charge enablement
83
+ - wallbox current limit
84
+
85
+ The adapter automatically normalizes source units before telemetry is sent. For example, a kWh source can be sent as Wh telemetry and a kW source can be sent as W telemetry.
86
+
87
+ ## Telemetry
88
+
89
+ The adapter reads the selected ioBroker states and builds a normalized telemetry payload. The payload is sent to the backend at the configured interval. If `sendOnlyChanged` is enabled, unchanged payloads are skipped to reduce traffic.
90
+
91
+ Telemetry is used by the backend for:
92
+
93
+ - daily household consumption
94
+ - grid import and export
95
+ - PV yield
96
+ - battery availability
97
+ - charging and discharging decisions
98
+ - wallbox charging decisions
99
+ - pattern detection
100
+ - dashboard and 6-hour planning
101
+
102
+ ## Battery and Wallbox Control
103
+
104
+ The backend can send control commands for allowed logical targets. The adapter maps these targets to the ioBroker datapoints selected by the user.
105
+
106
+ Supported control behavior includes:
107
+
108
+ - charge battery from PV surplus
109
+ - charge battery from the grid during favorable tariff windows
110
+ - hold reserve for later use
111
+ - discharge when the plan requires battery support
112
+ - limit AC output power
113
+ - enable or disable wallbox charging
114
+ - set wallbox current limits
115
+
116
+ The adapter never writes to arbitrary state IDs supplied by the backend. A write is executed only when:
117
+
118
+ - the target is part of the server configuration
119
+ - the user selected a datapoint for the target
120
+ - the ioBroker object exists
121
+ - the object is writable
122
+ - the value matches the expected type
123
+ - the configured minimum write interval is respected
124
+
125
+ ## States
126
+
127
+ The adapter creates internal states below its instance namespace:
128
+
129
+ - `info.connection`
130
+ - `info.lastSync`
131
+ - `info.lastError`
132
+ - `info.configValid`
133
+ - `info.tokenValid`
134
+ - `info.detectedFeatures`
135
+ - `info.serverConfigVersion`
136
+ - `info.serverConfigRevision`
137
+ - `info.serverConfigLastRequest`
138
+ - `status.backendReachable`
139
+ - `status.lastPayload`
140
+ - `status.lastCommand`
141
+ - `status.lastCommandResult`
142
+
143
+ The adapter token is never written to states.
144
+
145
+ ## Security
146
+
147
+ - The adapter token is stored as encrypted and protected native configuration.
148
+ - Tokens are masked in logs.
149
+ - Backend commands use logical targets, not direct ioBroker paths.
150
+ - Writable datapoints must be selected explicitly by the user.
151
+ - Commands are acknowledged to the backend after processing.
152
+ - HTTPS is used for backend communication.
153
+
154
+ ## Troubleshooting
155
+
156
+ If telemetry is missing, check the **Datapoints** tab and verify that all required state paths are configured.
157
+
158
+ If the backend connection is not available, check:
159
+
160
+ - `info.connection`
161
+ - `info.tokenValid`
162
+ - `status.backendReachable`
163
+ - `info.lastError`
164
+ - the adapter log in ioBroker Admin
165
+
166
+ If a command is not applied, verify that the selected ioBroker state is writable and that the value type matches the state type.
167
+
168
+ ## Changelog
169
+
170
+ ### 0.2.0 (2026-05-22)
171
+
172
+ - Initial release of the AI Energy Manager adapter.
173
+
174
+ [Older changelogs can be found there](CHANGELOG_OLD.md)
175
+
176
+ ## License
177
+
178
+ MIT License
179
+
180
+ Copyright (c) 2026 Christoph Böhrs
181
+
182
+ Permission is hereby granted, free of charge, to any person obtaining a copy
183
+ of this software and associated documentation files (the "Software"), to deal
184
+ in the Software without restriction, including without limitation the rights
185
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
186
+ copies of the Software, and to permit persons to whom the Software is
187
+ furnished to do so, subject to the following conditions:
188
+
189
+ The above copyright notice and this permission notice shall be included in all
190
+ copies or substantial portions of the Software.
191
+
192
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
193
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
194
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
195
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
196
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
197
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
198
+ SOFTWARE.
Binary file
@@ -0,0 +1,123 @@
1
+ {
2
+ "../virtual:mf-REMOTE_ENTRY_ID:__mfe_internal__ConfigCustomAiEnergyManager__customComponents_js": {
3
+ "file": "customComponents.js",
4
+ "name": "remoteEntry",
5
+ "src": "../virtual:mf-REMOTE_ENTRY_ID:__mfe_internal__ConfigCustomAiEnergyManager__customComponents_js",
6
+ "isEntry": true,
7
+ "imports": [
8
+ "_virtual_mf-REMOTE_ENTRY_ID___mfe_internal__ConfigCustomAiEnergyManager__customComponents_js-CrBRV5Aj.js"
9
+ ]
10
+ },
11
+ "../virtual:mf-exposes:__mfe_internal__ConfigCustomAiEnergyManager__customComponents_js": {
12
+ "file": "assets/virtualExposes-BU4Kt82k.js",
13
+ "name": "virtualExposes",
14
+ "src": "../virtual:mf-exposes:__mfe_internal__ConfigCustomAiEnergyManager__customComponents_js",
15
+ "isEntry": true,
16
+ "imports": [
17
+ "_virtual_mf-exposes___mfe_internal__ConfigCustomAiEnergyManager__customComponents_js-Ct62_K2n.js"
18
+ ]
19
+ },
20
+ "../virtual:mf-localSharedImportMap:__mfe_internal__ConfigCustomAiEnergyManager": {
21
+ "file": "assets/_virtual_mf-localSharedImportMap___mfe_internal__ConfigCustomAiEnergyManager-D_8M5SZg.js",
22
+ "name": "_virtual_mf-localSharedImportMap___mfe_internal__ConfigCustomAiEnergyManager",
23
+ "src": "../virtual:mf-localSharedImportMap:__mfe_internal__ConfigCustomAiEnergyManager",
24
+ "isDynamicEntry": true,
25
+ "imports": [
26
+ "_preload-helper-D9f-kLWf.js",
27
+ "_virtual_mf-REMOTE_ENTRY_ID___mfe_internal__ConfigCustomAiEnergyManager__customComponents_js-CrBRV5Aj.js"
28
+ ],
29
+ "dynamicImports": [
30
+ "__virtual_mf___mfe_internal__ConfigCustomAiEnergyManager__loadShare___mf_0_emotion_mf_1_react__loadShare__.mjs-C_QoYoiQ.js",
31
+ "__virtual_mf___mfe_internal__ConfigCustomAiEnergyManager__loadShare___mf_0_emotion_mf_1_styled__loadShare__.mjs-Bjagi3Hs.js",
32
+ "__virtual_mf___mfe_internal__ConfigCustomAiEnergyManager__loadShare___mf_0_iobroker_mf_1_adapter_mf_2_react_mf_2_v5__loadShare__.mjs-Qmea7kmD.js",
33
+ "__virtual_mf___mfe_internal__ConfigCustomAiEnergyManager__loadShare__react_mf_2_dom_mf_1_client__loadShare__.mjs-vzzsfdoZ.js"
34
+ ]
35
+ },
36
+ "../virtual:mf:__mfe_internal__ConfigCustomAiEnergyManager__H_A_I__hostAutoInit__H_A_I__.js": {
37
+ "file": "assets/hostInit-CFxXjdei.js",
38
+ "name": "hostInit",
39
+ "src": "../virtual:mf:__mfe_internal__ConfigCustomAiEnergyManager__H_A_I__hostAutoInit__H_A_I__.js",
40
+ "isEntry": true,
41
+ "imports": ["_preload-helper-D9f-kLWf.js"],
42
+ "dynamicImports": [
43
+ "_virtual_mf-REMOTE_ENTRY_ID___mfe_internal__ConfigCustomAiEnergyManager__customComponents_js-CrBRV5Aj.js"
44
+ ]
45
+ },
46
+ "__virtual_mf___mfe_internal__ConfigCustomAiEnergyManager__loadShare___mf_0_emotion_mf_1_react__loadShare__.mjs-C_QoYoiQ.js": {
47
+ "file": "assets/_virtual_mf___mfe_internal__ConfigCustomAiEnergyManager__loadShare___mf_0_emotion_mf_1_react__loadShare__.mjs-C_QoYoiQ.js",
48
+ "name": "_virtual_mf___mfe_internal__ConfigCustomAiEnergyManager__loadShare___mf_0_emotion_mf_1_react__loadShare__.mjs",
49
+ "imports": ["_rolldown-runtime-BYbx6iT9.js"]
50
+ },
51
+ "__virtual_mf___mfe_internal__ConfigCustomAiEnergyManager__loadShare___mf_0_emotion_mf_1_styled__loadShare__.mjs-Bjagi3Hs.js": {
52
+ "file": "assets/_virtual_mf___mfe_internal__ConfigCustomAiEnergyManager__loadShare___mf_0_emotion_mf_1_styled__loadShare__.mjs-Bjagi3Hs.js",
53
+ "name": "_virtual_mf___mfe_internal__ConfigCustomAiEnergyManager__loadShare___mf_0_emotion_mf_1_styled__loadShare__.mjs",
54
+ "imports": [
55
+ "_rolldown-runtime-BYbx6iT9.js",
56
+ "__virtual_mf___mfe_internal__ConfigCustomAiEnergyManager__loadShare___mf_0_emotion_mf_1_react__loadShare__.mjs-C_QoYoiQ.js"
57
+ ]
58
+ },
59
+ "__virtual_mf___mfe_internal__ConfigCustomAiEnergyManager__loadShare___mf_0_iobroker_mf_1_adapter_mf_2_react_mf_2_v5__loadShare__.mjs-Qmea7kmD.js": {
60
+ "file": "assets/_virtual_mf___mfe_internal__ConfigCustomAiEnergyManager__loadShare___mf_0_iobroker_mf_1_adapter_mf_2_react_mf_2_v5__loadShare__.mjs-Qmea7kmD.js",
61
+ "name": "_virtual_mf___mfe_internal__ConfigCustomAiEnergyManager__loadShare___mf_0_iobroker_mf_1_adapter_mf_2_react_mf_2_v5__loadShare__.mjs",
62
+ "imports": [
63
+ "_rolldown-runtime-BYbx6iT9.js",
64
+ "__virtual_mf___mfe_internal__ConfigCustomAiEnergyManager__loadShare___mf_0_emotion_mf_1_react__loadShare__.mjs-C_QoYoiQ.js",
65
+ "__virtual_mf___mfe_internal__ConfigCustomAiEnergyManager__loadShare___mf_0_emotion_mf_1_styled__loadShare__.mjs-Bjagi3Hs.js"
66
+ ]
67
+ },
68
+ "__virtual_mf___mfe_internal__ConfigCustomAiEnergyManager__loadShare__react_mf_2_dom_mf_1_client__loadShare__.mjs-vzzsfdoZ.js": {
69
+ "file": "assets/_virtual_mf___mfe_internal__ConfigCustomAiEnergyManager__loadShare__react_mf_2_dom_mf_1_client__loadShare__.mjs-vzzsfdoZ.js",
70
+ "name": "_virtual_mf___mfe_internal__ConfigCustomAiEnergyManager__loadShare__react_mf_2_dom_mf_1_client__loadShare__.mjs",
71
+ "imports": [
72
+ "__virtual_mf___mfe_internal__ConfigCustomAiEnergyManager__loadShare___mf_0_iobroker_mf_1_adapter_mf_2_react_mf_2_v5__loadShare__.mjs-Qmea7kmD.js",
73
+ "_rolldown-runtime-BYbx6iT9.js"
74
+ ]
75
+ },
76
+ "_preload-helper-D9f-kLWf.js": {
77
+ "file": "assets/preload-helper-D9f-kLWf.js",
78
+ "name": "preload-helper"
79
+ },
80
+ "_rolldown-runtime-BYbx6iT9.js": {
81
+ "file": "assets/rolldown-runtime-BYbx6iT9.js",
82
+ "name": "rolldown-runtime"
83
+ },
84
+ "_virtual_mf-REMOTE_ENTRY_ID___mfe_internal__ConfigCustomAiEnergyManager__customComponents_js-CrBRV5Aj.js": {
85
+ "file": "assets/virtual_mf-REMOTE_ENTRY_ID___mfe_internal__ConfigCustomAiEnergyManager__customComponents_js-CrBRV5Aj.js",
86
+ "name": "virtual_mf-REMOTE_ENTRY_ID___mfe_internal__ConfigCustomAiEnergyManager__customComponents_js",
87
+ "imports": ["_preload-helper-D9f-kLWf.js"],
88
+ "dynamicImports": [
89
+ "../virtual:mf-localSharedImportMap:__mfe_internal__ConfigCustomAiEnergyManager",
90
+ "_virtual_mf-exposes___mfe_internal__ConfigCustomAiEnergyManager__customComponents_js-Ct62_K2n.js",
91
+ "__virtual_mf___mfe_internal__ConfigCustomAiEnergyManager__loadShare___mf_0_emotion_mf_1_react__loadShare__.mjs-C_QoYoiQ.js",
92
+ "__virtual_mf___mfe_internal__ConfigCustomAiEnergyManager__loadShare___mf_0_iobroker_mf_1_adapter_mf_2_react_mf_2_v5__loadShare__.mjs-Qmea7kmD.js",
93
+ "__virtual_mf___mfe_internal__ConfigCustomAiEnergyManager__loadShare___mf_0_emotion_mf_1_styled__loadShare__.mjs-Bjagi3Hs.js"
94
+ ]
95
+ },
96
+ "_virtual_mf-exposes___mfe_internal__ConfigCustomAiEnergyManager__customComponents_js-Ct62_K2n.js": {
97
+ "file": "assets/virtual_mf-exposes___mfe_internal__ConfigCustomAiEnergyManager__customComponents_js-Ct62_K2n.js",
98
+ "name": "virtual_mf-exposes___mfe_internal__ConfigCustomAiEnergyManager__customComponents_js",
99
+ "imports": ["_preload-helper-D9f-kLWf.js"],
100
+ "dynamicImports": ["main.jsx"]
101
+ },
102
+ "index.html": {
103
+ "file": "assets/index-BEY7z3x9.js",
104
+ "name": "index",
105
+ "src": "index.html",
106
+ "isEntry": true,
107
+ "imports": ["main.jsx", "main.jsx"]
108
+ },
109
+ "main.jsx": {
110
+ "file": "assets/main-B8zKNpy9.js",
111
+ "name": "main",
112
+ "src": "main.jsx",
113
+ "isEntry": true,
114
+ "imports": [
115
+ "__virtual_mf___mfe_internal__ConfigCustomAiEnergyManager__loadShare___mf_0_iobroker_mf_1_adapter_mf_2_react_mf_2_v5__loadShare__.mjs-Qmea7kmD.js",
116
+ "__virtual_mf___mfe_internal__ConfigCustomAiEnergyManager__loadShare___mf_0_emotion_mf_1_react__loadShare__.mjs-C_QoYoiQ.js",
117
+ "__virtual_mf___mfe_internal__ConfigCustomAiEnergyManager__loadShare__react_mf_2_dom_mf_1_client__loadShare__.mjs-vzzsfdoZ.js",
118
+ "_virtual_mf-REMOTE_ENTRY_ID___mfe_internal__ConfigCustomAiEnergyManager__customComponents_js-CrBRV5Aj.js",
119
+ "_virtual_mf-exposes___mfe_internal__ConfigCustomAiEnergyManager__customComponents_js-Ct62_K2n.js"
120
+ ],
121
+ "css": ["assets/main-C0rS7ABd.css"]
122
+ }
123
+ }
@@ -0,0 +1,260 @@
1
+ import { t as e } from "./preload-helper-D9f-kLWf.js";
2
+ import "./virtual_mf-REMOTE_ENTRY_ID___mfe_internal__ConfigCustomAiEnergyManager__customComponents_js-CrBRV5Aj.js";
3
+ var t = {
4
+ "@emotion/react": async () =>
5
+ await e(
6
+ () =>
7
+ import(
8
+ `./_virtual_mf___mfe_internal__ConfigCustomAiEnergyManager__loadShare___mf_0_emotion_mf_1_react__loadShare__.mjs-C_QoYoiQ.js`
9
+ ).then((e) => e.c),
10
+ [],
11
+ import.meta.url,
12
+ ),
13
+ "@emotion/styled": async () =>
14
+ await e(
15
+ () =>
16
+ import(
17
+ `./_virtual_mf___mfe_internal__ConfigCustomAiEnergyManager__loadShare___mf_0_emotion_mf_1_styled__loadShare__.mjs-Bjagi3Hs.js`
18
+ ).then((e) => e.r),
19
+ [],
20
+ import.meta.url,
21
+ ),
22
+ "@iobroker/adapter-react-v5": async () =>
23
+ await e(
24
+ () =>
25
+ import(
26
+ `./_virtual_mf___mfe_internal__ConfigCustomAiEnergyManager__loadShare___mf_0_iobroker_mf_1_adapter_mf_2_react_mf_2_v5__loadShare__.mjs-Qmea7kmD.js`
27
+ ).then((e) => e.i),
28
+ [],
29
+ import.meta.url,
30
+ ),
31
+ "@mui/icons-material": async () =>
32
+ await e(
33
+ () =>
34
+ import(
35
+ `./_virtual_mf___mfe_internal__ConfigCustomAiEnergyManager__loadShare___mf_0_iobroker_mf_1_adapter_mf_2_react_mf_2_v5__loadShare__.mjs-Qmea7kmD.js`
36
+ ).then((e) => e.s),
37
+ [],
38
+ import.meta.url,
39
+ ),
40
+ "@mui/material": async () =>
41
+ await e(
42
+ () =>
43
+ import(
44
+ `./_virtual_mf___mfe_internal__ConfigCustomAiEnergyManager__loadShare___mf_0_iobroker_mf_1_adapter_mf_2_react_mf_2_v5__loadShare__.mjs-Qmea7kmD.js`
45
+ ).then((e) => e.z),
46
+ [],
47
+ import.meta.url,
48
+ ),
49
+ react: async () =>
50
+ await e(
51
+ () =>
52
+ import(
53
+ `./_virtual_mf___mfe_internal__ConfigCustomAiEnergyManager__loadShare___mf_0_emotion_mf_1_react__loadShare__.mjs-C_QoYoiQ.js`
54
+ ).then((e) => (e.U(), e.H)),
55
+ [],
56
+ import.meta.url,
57
+ ),
58
+ "react-dom": async () =>
59
+ await e(
60
+ () =>
61
+ import(
62
+ `./_virtual_mf___mfe_internal__ConfigCustomAiEnergyManager__loadShare___mf_0_iobroker_mf_1_adapter_mf_2_react_mf_2_v5__loadShare__.mjs-Qmea7kmD.js`
63
+ ).then((e) => (e.K(), e.G)),
64
+ [],
65
+ import.meta.url,
66
+ ),
67
+ "react-dom/client": async () =>
68
+ await e(
69
+ () =>
70
+ import(
71
+ `./_virtual_mf___mfe_internal__ConfigCustomAiEnergyManager__loadShare__react_mf_2_dom_mf_1_client__loadShare__.mjs-vzzsfdoZ.js`
72
+ ).then((e) => e.n),
73
+ [],
74
+ import.meta.url,
75
+ ),
76
+ "react/jsx-runtime": async () =>
77
+ await e(
78
+ () =>
79
+ import(
80
+ `./_virtual_mf___mfe_internal__ConfigCustomAiEnergyManager__loadShare___mf_0_iobroker_mf_1_adapter_mf_2_react_mf_2_v5__loadShare__.mjs-Qmea7kmD.js`
81
+ ).then((e) => e.H),
82
+ [],
83
+ import.meta.url,
84
+ ),
85
+ },
86
+ n = {
87
+ "@emotion/react": {
88
+ name: `@emotion/react`,
89
+ version: `11.14.0`,
90
+ scope: [`default`],
91
+ loaded: !1,
92
+ from: `__mfe_internal__ConfigCustomAiEnergyManager`,
93
+ async get() {
94
+ n[`@emotion/react`].loaded = !0;
95
+ let { "@emotion/react": e } = t,
96
+ r = { ...(await e()) };
97
+ return (
98
+ Object.defineProperty(r, `__esModule`, { value: !0, enumerable: !1 }),
99
+ function () {
100
+ return r;
101
+ }
102
+ );
103
+ },
104
+ shareConfig: { singleton: !0, requiredVersion: `*` },
105
+ },
106
+ "@emotion/styled": {
107
+ name: `@emotion/styled`,
108
+ version: `11.14.1`,
109
+ scope: [`default`],
110
+ loaded: !1,
111
+ from: `__mfe_internal__ConfigCustomAiEnergyManager`,
112
+ async get() {
113
+ n[`@emotion/styled`].loaded = !0;
114
+ let { "@emotion/styled": e } = t,
115
+ r = { ...(await e()) };
116
+ return (
117
+ Object.defineProperty(r, `__esModule`, { value: !0, enumerable: !1 }),
118
+ function () {
119
+ return r;
120
+ }
121
+ );
122
+ },
123
+ shareConfig: { singleton: !0, requiredVersion: `*` },
124
+ },
125
+ "@iobroker/adapter-react-v5": {
126
+ name: `@iobroker/adapter-react-v5`,
127
+ version: `8.2.2`,
128
+ scope: [`default`],
129
+ loaded: !1,
130
+ from: `__mfe_internal__ConfigCustomAiEnergyManager`,
131
+ async get() {
132
+ n[`@iobroker/adapter-react-v5`].loaded = !0;
133
+ let { "@iobroker/adapter-react-v5": e } = t,
134
+ r = { ...(await e()) };
135
+ return (
136
+ Object.defineProperty(r, `__esModule`, { value: !0, enumerable: !1 }),
137
+ function () {
138
+ return r;
139
+ }
140
+ );
141
+ },
142
+ shareConfig: { singleton: !0, requiredVersion: `*` },
143
+ },
144
+ "@mui/icons-material": {
145
+ name: `@mui/icons-material`,
146
+ version: `6.5.0`,
147
+ scope: [`default`],
148
+ loaded: !1,
149
+ from: `__mfe_internal__ConfigCustomAiEnergyManager`,
150
+ async get() {
151
+ n[`@mui/icons-material`].loaded = !0;
152
+ let { "@mui/icons-material": e } = t,
153
+ r = { ...(await e()) };
154
+ return (
155
+ Object.defineProperty(r, `__esModule`, { value: !0, enumerable: !1 }),
156
+ function () {
157
+ return r;
158
+ }
159
+ );
160
+ },
161
+ shareConfig: { singleton: !0, requiredVersion: `*` },
162
+ },
163
+ "@mui/material": {
164
+ name: `@mui/material`,
165
+ version: `6.5.0`,
166
+ scope: [`default`],
167
+ loaded: !1,
168
+ from: `__mfe_internal__ConfigCustomAiEnergyManager`,
169
+ async get() {
170
+ n[`@mui/material`].loaded = !0;
171
+ let { "@mui/material": e } = t,
172
+ r = { ...(await e()) };
173
+ return (
174
+ Object.defineProperty(r, `__esModule`, { value: !0, enumerable: !1 }),
175
+ function () {
176
+ return r;
177
+ }
178
+ );
179
+ },
180
+ shareConfig: { singleton: !0, requiredVersion: `*` },
181
+ },
182
+ react: {
183
+ name: `react`,
184
+ version: `18.3.1`,
185
+ scope: [`default`],
186
+ loaded: !1,
187
+ from: `__mfe_internal__ConfigCustomAiEnergyManager`,
188
+ async get() {
189
+ n.react.loaded = !0;
190
+ let { react: e } = t,
191
+ r = { ...(await e()) };
192
+ return (
193
+ Object.defineProperty(r, `__esModule`, { value: !0, enumerable: !1 }),
194
+ function () {
195
+ return r;
196
+ }
197
+ );
198
+ },
199
+ shareConfig: { singleton: !0, requiredVersion: `*` },
200
+ },
201
+ "react-dom": {
202
+ name: `react-dom`,
203
+ version: `18.3.1`,
204
+ scope: [`default`],
205
+ loaded: !1,
206
+ from: `__mfe_internal__ConfigCustomAiEnergyManager`,
207
+ async get() {
208
+ n[`react-dom`].loaded = !0;
209
+ let { "react-dom": e } = t,
210
+ r = { ...(await e()) };
211
+ return (
212
+ Object.defineProperty(r, `__esModule`, { value: !0, enumerable: !1 }),
213
+ function () {
214
+ return r;
215
+ }
216
+ );
217
+ },
218
+ shareConfig: { singleton: !0, requiredVersion: `*` },
219
+ },
220
+ "react-dom/client": {
221
+ name: `react-dom/client`,
222
+ version: `18.3.1`,
223
+ scope: [`default`],
224
+ loaded: !1,
225
+ from: `__mfe_internal__ConfigCustomAiEnergyManager`,
226
+ async get() {
227
+ n[`react-dom/client`].loaded = !0;
228
+ let { "react-dom/client": e } = t,
229
+ r = { ...(await e()) };
230
+ return (
231
+ Object.defineProperty(r, `__esModule`, { value: !0, enumerable: !1 }),
232
+ function () {
233
+ return r;
234
+ }
235
+ );
236
+ },
237
+ shareConfig: { singleton: !0, requiredVersion: `*` },
238
+ },
239
+ "react/jsx-runtime": {
240
+ name: `react/jsx-runtime`,
241
+ version: `18.3.1`,
242
+ scope: [`default`],
243
+ loaded: !1,
244
+ from: `__mfe_internal__ConfigCustomAiEnergyManager`,
245
+ async get() {
246
+ n[`react/jsx-runtime`].loaded = !0;
247
+ let { "react/jsx-runtime": e } = t,
248
+ r = { ...(await e()) };
249
+ return (
250
+ Object.defineProperty(r, `__esModule`, { value: !0, enumerable: !1 }),
251
+ function () {
252
+ return r;
253
+ }
254
+ );
255
+ },
256
+ shareConfig: { singleton: !0, requiredVersion: `*` },
257
+ },
258
+ },
259
+ r = [];
260
+ export { r as usedRemotes, n as usedShared };