iobroker.zendure-solarflow 2.0.3 → 3.0.0-alpha.2
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/README.md +12 -1
- package/admin/build/index.js +35 -35
- package/admin/build/index.js.map +2 -2
- package/build/constants/constants.js +41 -0
- package/build/constants/constants.js.map +7 -0
- package/build/helpers/helpers.js +84 -96
- package/build/helpers/helpers.js.map +2 -2
- package/build/main.js +108 -180
- package/build/main.js.map +2 -2
- package/build/models/IDeviceAutomationPayload.js.map +1 -1
- package/build/models/{IPack2Device.js → IDevicePack.js} +3 -3
- package/build/models/IDevicePack.js.map +7 -0
- package/build/models/{ISolarFlowDeviceDetails.js → IHaDeviceListData.js} +3 -3
- package/build/models/IHaDeviceListData.js.map +7 -0
- package/build/models/{ISolarflowDevRegisterResponse.js → IZenHaDeviceDetails.js} +3 -3
- package/build/models/IZenHaDeviceDetails.js.map +7 -0
- package/build/models/{ISolarFlowPaths.js → IZenHaMqttData.js} +3 -3
- package/build/models/IZenHaMqttData.js.map +7 -0
- package/build/models/deviceModels/Ace1500.js +77 -0
- package/build/models/deviceModels/Ace1500.js.map +7 -0
- package/build/models/deviceModels/Aio2400.js +121 -0
- package/build/models/deviceModels/Aio2400.js.map +7 -0
- package/build/models/deviceModels/Hyper2000.js +200 -0
- package/build/models/deviceModels/Hyper2000.js.map +7 -0
- package/build/models/deviceModels/Sf2400Ac.js +146 -0
- package/build/models/deviceModels/Sf2400Ac.js.map +7 -0
- package/build/models/deviceModels/Sf800.js +144 -0
- package/build/models/deviceModels/Sf800.js.map +7 -0
- package/build/models/deviceModels/SfHub1200.js +179 -0
- package/build/models/deviceModels/SfHub1200.js.map +7 -0
- package/build/models/deviceModels/SfHub2000.js +177 -0
- package/build/models/deviceModels/SfHub2000.js.map +7 -0
- package/build/models/deviceModels/ZenHaDevice.js +1093 -0
- package/build/models/deviceModels/ZenHaDevice.js.map +7 -0
- package/build/services/jobSchedule.js +19 -58
- package/build/services/jobSchedule.js.map +2 -2
- package/build/services/mqttCloudZenService.js +79 -0
- package/build/services/mqttCloudZenService.js.map +7 -0
- package/build/services/mqttLocalService.js +70 -0
- package/build/services/mqttLocalService.js.map +7 -0
- package/build/services/mqttSharedService.js +432 -0
- package/build/services/mqttSharedService.js.map +7 -0
- package/build/services/zenWebService.js +84 -0
- package/build/services/zenWebService.js.map +7 -0
- package/io-package.json +83 -40
- package/package.json +1 -1
- package/build/constants/paths.js +0 -52
- package/build/constants/paths.js.map +0 -7
- package/build/helpers/createSolarFlowLocalStates.js +0 -113
- package/build/helpers/createSolarFlowLocalStates.js.map +0 -7
- package/build/helpers/createSolarFlowStates.js +0 -196
- package/build/helpers/createSolarFlowStates.js.map +0 -7
- package/build/models/IPack2Device.js.map +0 -7
- package/build/models/ISolarFlowDeviceDetails.js.map +0 -7
- package/build/models/ISolarFlowPaths.js.map +0 -7
- package/build/models/ISolarflowDevRegisterResponse.js.map +0 -7
- package/build/services/adapterService.js +0 -142
- package/build/services/adapterService.js.map +0 -7
- package/build/services/calculationService.js +0 -350
- package/build/services/calculationService.js.map +0 -7
- package/build/services/fallbackMqttService.js +0 -461
- package/build/services/fallbackMqttService.js.map +0 -7
- package/build/services/fallbackWebService.js +0 -80
- package/build/services/fallbackWebService.js.map +0 -7
- package/build/services/mqttService.js +0 -1545
- package/build/services/mqttService.js.map +0 -7
- package/build/services/webService.js +0 -119
- package/build/services/webService.js.map +0 -7
|
@@ -1,142 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __defProp = Object.defineProperty;
|
|
3
|
-
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
-
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
-
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
-
var __export = (target, all) => {
|
|
7
|
-
for (var name in all)
|
|
8
|
-
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
-
};
|
|
10
|
-
var __copyProps = (to, from, except, desc) => {
|
|
11
|
-
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
-
for (let key of __getOwnPropNames(from))
|
|
13
|
-
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
-
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
-
}
|
|
16
|
-
return to;
|
|
17
|
-
};
|
|
18
|
-
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
-
var adapterService_exports = {};
|
|
20
|
-
__export(adapterService_exports, {
|
|
21
|
-
checkDevicesServer: () => checkDevicesServer,
|
|
22
|
-
checkVoltage: () => checkVoltage,
|
|
23
|
-
updateSolarFlowControlState: () => updateSolarFlowControlState,
|
|
24
|
-
updateSolarFlowState: () => updateSolarFlowState
|
|
25
|
-
});
|
|
26
|
-
module.exports = __toCommonJS(adapterService_exports);
|
|
27
|
-
var import_calculationService = require("./calculationService");
|
|
28
|
-
var import_mqttService = require("./mqttService");
|
|
29
|
-
const updateSolarFlowState = async (adapter, productKey, deviceKey, state, val) => {
|
|
30
|
-
await (adapter == null ? void 0 : adapter.setState(`${productKey}.${deviceKey}.${state}`, val, true));
|
|
31
|
-
};
|
|
32
|
-
const updateSolarFlowControlState = async (adapter, productKey, deviceKey, state, val) => {
|
|
33
|
-
const stateExist = await (adapter == null ? void 0 : adapter.objectExists(
|
|
34
|
-
`${productKey}.${deviceKey}.control.${state}`
|
|
35
|
-
));
|
|
36
|
-
if (stateExist) {
|
|
37
|
-
await (adapter == null ? void 0 : adapter.setState(
|
|
38
|
-
`${productKey}.${deviceKey}.control.${state}`,
|
|
39
|
-
val,
|
|
40
|
-
true
|
|
41
|
-
));
|
|
42
|
-
}
|
|
43
|
-
};
|
|
44
|
-
const checkVoltage = async (adapter, productKey, deviceKey, voltage) => {
|
|
45
|
-
var _a;
|
|
46
|
-
if (voltage < 46.1) {
|
|
47
|
-
if (adapter.config.useCalculation) {
|
|
48
|
-
(0, import_calculationService.setSocToZero)(adapter, productKey, deviceKey);
|
|
49
|
-
}
|
|
50
|
-
if (adapter.config.useLowVoltageBlock) {
|
|
51
|
-
await (adapter == null ? void 0 : adapter.setState(
|
|
52
|
-
`${productKey}.${deviceKey}.control.lowVoltageBlock`,
|
|
53
|
-
true,
|
|
54
|
-
true
|
|
55
|
-
));
|
|
56
|
-
const autoModel = (_a = await adapter.getStateAsync(productKey + "." + deviceKey + ".autoModel")) == null ? void 0 : _a.val;
|
|
57
|
-
if (autoModel == 8) {
|
|
58
|
-
(0, import_mqttService.setDeviceAutomationInOutLimit)(adapter, productKey, deviceKey, 0);
|
|
59
|
-
} else {
|
|
60
|
-
(0, import_mqttService.setOutputLimit)(adapter, productKey, deviceKey, 0);
|
|
61
|
-
}
|
|
62
|
-
if (adapter.config.forceShutdownOnLowVoltage) {
|
|
63
|
-
const currentSoc = await adapter.getStateAsync(
|
|
64
|
-
`${productKey}.${deviceKey}.electricLevel`
|
|
65
|
-
);
|
|
66
|
-
if (currentSoc && Number(currentSoc.val) > 50) {
|
|
67
|
-
if (adapter.config.fullChargeIfNeeded) {
|
|
68
|
-
await (adapter == null ? void 0 : adapter.setState(
|
|
69
|
-
`${productKey}.${deviceKey}.control.fullChargeNeeded`,
|
|
70
|
-
true,
|
|
71
|
-
true
|
|
72
|
-
));
|
|
73
|
-
}
|
|
74
|
-
} else {
|
|
75
|
-
if (currentSoc && currentSoc.val) {
|
|
76
|
-
(0, import_mqttService.setDischargeLimit)(
|
|
77
|
-
adapter,
|
|
78
|
-
productKey,
|
|
79
|
-
deviceKey,
|
|
80
|
-
Number(currentSoc.val)
|
|
81
|
-
);
|
|
82
|
-
}
|
|
83
|
-
const hubState = await adapter.getStateAsync(
|
|
84
|
-
`${productKey}.${deviceKey}.hubState`
|
|
85
|
-
);
|
|
86
|
-
if (!hubState || Number(hubState.val) != 1) {
|
|
87
|
-
adapter.log.warn(
|
|
88
|
-
`[checkVoltage] hubState is not set to 'Stop output and shut down', device will NOT go offline!`
|
|
89
|
-
);
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
} else if (voltage >= 47.5) {
|
|
95
|
-
const lowVoltageBlock = await adapter.getStateAsync(
|
|
96
|
-
`${productKey}.${deviceKey}.control.lowVoltageBlock`
|
|
97
|
-
);
|
|
98
|
-
if (lowVoltageBlock && lowVoltageBlock.val == true) {
|
|
99
|
-
await (adapter == null ? void 0 : adapter.setState(
|
|
100
|
-
`${productKey}.${deviceKey}.control.lowVoltageBlock`,
|
|
101
|
-
false,
|
|
102
|
-
true
|
|
103
|
-
));
|
|
104
|
-
if (adapter.config.useLowVoltageBlock && adapter.config.forceShutdownOnLowVoltage) {
|
|
105
|
-
(0, import_mqttService.setDischargeLimit)(
|
|
106
|
-
adapter,
|
|
107
|
-
productKey,
|
|
108
|
-
deviceKey,
|
|
109
|
-
adapter.config.dischargeLimit ? adapter.config.dischargeLimit : 5
|
|
110
|
-
);
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
};
|
|
115
|
-
const checkDevicesServer = async (adapter) => {
|
|
116
|
-
const channels = await adapter.getChannelsAsync();
|
|
117
|
-
channels.forEach(async (channel) => {
|
|
118
|
-
if (channel._id) {
|
|
119
|
-
const splitted = channel._id.split(".");
|
|
120
|
-
if (splitted.length == 4) {
|
|
121
|
-
const productKey = splitted[2];
|
|
122
|
-
const deviceKey = splitted[3];
|
|
123
|
-
const currentServerState = await adapter.getStateAsync(
|
|
124
|
-
`${productKey}.${deviceKey}.registeredServer`
|
|
125
|
-
);
|
|
126
|
-
if (currentServerState && currentServerState.val && currentServerState.val != adapter.config.server) {
|
|
127
|
-
adapter.log.warn(
|
|
128
|
-
`Device with ProductKey '${productKey}' and DeviceKey '${deviceKey}' was configured on server '${currentServerState.val}', but adapter is configured to use server '${adapter.config.server}'! No data will be available!`
|
|
129
|
-
);
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
});
|
|
134
|
-
};
|
|
135
|
-
// Annotate the CommonJS export names for ESM import in node:
|
|
136
|
-
0 && (module.exports = {
|
|
137
|
-
checkDevicesServer,
|
|
138
|
-
checkVoltage,
|
|
139
|
-
updateSolarFlowControlState,
|
|
140
|
-
updateSolarFlowState
|
|
141
|
-
});
|
|
142
|
-
//# sourceMappingURL=adapterService.js.map
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../src/services/adapterService.ts"],
|
|
4
|
-
"sourcesContent": ["/* eslint-disable @typescript-eslint/indent */\r\nimport { ZendureSolarflow } from \"../main\";\r\nimport { setSocToZero } from \"./calculationService\";\r\nimport {\r\n setDeviceAutomationInOutLimit,\r\n setDischargeLimit,\r\n setOutputLimit,\r\n} from \"./mqttService\";\r\n\r\nexport const updateSolarFlowState = async (\r\n adapter: ZendureSolarflow,\r\n productKey: string,\r\n deviceKey: string,\r\n state: string,\r\n val: number | string | boolean\r\n): Promise<void> => {\r\n await adapter?.setState(`${productKey}.${deviceKey}.${state}`, val, true);\r\n};\r\n\r\nexport const updateSolarFlowControlState = async (\r\n adapter: ZendureSolarflow,\r\n productKey: string,\r\n deviceKey: string,\r\n state: string,\r\n val: number | string | boolean\r\n): Promise<void> => {\r\n // First check if state exist\r\n const stateExist = await adapter?.objectExists(\r\n `${productKey}.${deviceKey}.control.${state}`\r\n );\r\n\r\n // Update the control state\r\n if (stateExist) {\r\n await adapter?.setState(\r\n `${productKey}.${deviceKey}.control.${state}`,\r\n val,\r\n true\r\n );\r\n }\r\n};\r\n\r\nexport const checkVoltage = async (\r\n adapter: ZendureSolarflow,\r\n productKey: string,\r\n deviceKey: string,\r\n voltage: number\r\n): Promise<void> => {\r\n if (voltage < 46.1) {\r\n if (adapter.config.useCalculation) {\r\n setSocToZero(adapter, productKey, deviceKey);\r\n }\r\n\r\n if (adapter.config.useLowVoltageBlock) {\r\n // Activate Low Voltage Block\r\n await adapter?.setState(\r\n `${productKey}.${deviceKey}.control.lowVoltageBlock`,\r\n true,\r\n true\r\n );\r\n\r\n // Low Voltage Block activated, stop power input immediately\r\n const autoModel = (\r\n await adapter.getStateAsync(productKey + \".\" + deviceKey + \".autoModel\")\r\n )?.val;\r\n if (autoModel == 8) {\r\n setDeviceAutomationInOutLimit(adapter, productKey, deviceKey, 0);\r\n } else {\r\n setOutputLimit(adapter, productKey, deviceKey, 0);\r\n }\r\n\r\n if (adapter.config.forceShutdownOnLowVoltage) {\r\n const currentSoc = await adapter.getStateAsync(\r\n `${productKey}.${deviceKey}.electricLevel`\r\n );\r\n\r\n if (currentSoc && Number(currentSoc.val) > 50) {\r\n // We can't shut down the device. Full charge needed!\r\n if (adapter.config.fullChargeIfNeeded) {\r\n await adapter?.setState(\r\n `${productKey}.${deviceKey}.control.fullChargeNeeded`,\r\n true,\r\n true\r\n );\r\n }\r\n } else {\r\n if (currentSoc && currentSoc.val) {\r\n setDischargeLimit(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n Number(currentSoc.val)\r\n );\r\n }\r\n\r\n // Check if device setting is correct\r\n const hubState = await adapter.getStateAsync(\r\n `${productKey}.${deviceKey}.hubState`\r\n );\r\n\r\n if (!hubState || Number(hubState.val) != 1) {\r\n adapter.log.warn(\r\n `[checkVoltage] hubState is not set to 'Stop output and shut down', device will NOT go offline!`\r\n );\r\n }\r\n }\r\n }\r\n }\r\n } else if (voltage >= 47.5) {\r\n // Deactivate Low Voltage Block\r\n const lowVoltageBlock = await adapter.getStateAsync(\r\n `${productKey}.${deviceKey}.control.lowVoltageBlock`\r\n );\r\n\r\n if (lowVoltageBlock && lowVoltageBlock.val == true) {\r\n await adapter?.setState(\r\n `${productKey}.${deviceKey}.control.lowVoltageBlock`,\r\n false,\r\n true\r\n );\r\n\r\n if (\r\n adapter.config.useLowVoltageBlock &&\r\n adapter.config.forceShutdownOnLowVoltage\r\n ) {\r\n setDischargeLimit(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n adapter.config.dischargeLimit ? adapter.config.dischargeLimit : 5\r\n );\r\n }\r\n }\r\n }\r\n};\r\n\r\nexport const checkDevicesServer = async (\r\n adapter: ZendureSolarflow\r\n): Promise<void> => {\r\n const channels = await adapter.getChannelsAsync();\r\n\r\n channels.forEach(async (channel) => {\r\n if (channel._id) {\r\n const splitted = channel._id.split(\".\");\r\n if (splitted.length == 4) {\r\n const productKey = splitted[2];\r\n const deviceKey = splitted[3];\r\n\r\n const currentServerState = await adapter.getStateAsync(\r\n `${productKey}.${deviceKey}.registeredServer`\r\n );\r\n\r\n if (\r\n currentServerState &&\r\n currentServerState.val &&\r\n currentServerState.val != adapter.config.server\r\n ) {\r\n adapter.log.warn(\r\n `Device with ProductKey '${productKey}' and DeviceKey '${deviceKey}' was configured on server '${currentServerState.val}', but adapter is configured to use server '${adapter.config.server}'! No data will be available!`\r\n );\r\n }\r\n }\r\n }\r\n });\r\n};\r\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|
|
@@ -1,350 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __defProp = Object.defineProperty;
|
|
3
|
-
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
-
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
-
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
-
var __export = (target, all) => {
|
|
7
|
-
for (var name in all)
|
|
8
|
-
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
-
};
|
|
10
|
-
var __copyProps = (to, from, except, desc) => {
|
|
11
|
-
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
-
for (let key of __getOwnPropNames(from))
|
|
13
|
-
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
-
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
-
}
|
|
16
|
-
return to;
|
|
17
|
-
};
|
|
18
|
-
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
-
var calculationService_exports = {};
|
|
20
|
-
__export(calculationService_exports, {
|
|
21
|
-
calculateEnergy: () => calculateEnergy,
|
|
22
|
-
calculateSocAndEnergy: () => calculateSocAndEnergy,
|
|
23
|
-
resetTodaysValues: () => resetTodaysValues,
|
|
24
|
-
setEnergyWhMax: () => setEnergyWhMax,
|
|
25
|
-
setSocToZero: () => setSocToZero
|
|
26
|
-
});
|
|
27
|
-
module.exports = __toCommonJS(calculationService_exports);
|
|
28
|
-
var import_timeHelper = require("../helpers/timeHelper");
|
|
29
|
-
const calculationStateKeys = [
|
|
30
|
-
"packInput",
|
|
31
|
-
"outputHome",
|
|
32
|
-
"outputPack",
|
|
33
|
-
"outputPack",
|
|
34
|
-
"solarInput",
|
|
35
|
-
"gridInput",
|
|
36
|
-
"pvPower1",
|
|
37
|
-
"pvPower2"
|
|
38
|
-
];
|
|
39
|
-
const setEnergyWhMax = async (adapter, productKey, deviceKey) => {
|
|
40
|
-
const currentEnergyState = await (adapter == null ? void 0 : adapter.getStateAsync(
|
|
41
|
-
productKey + "." + deviceKey + ".calculations.energyWh"
|
|
42
|
-
));
|
|
43
|
-
if (currentEnergyState) {
|
|
44
|
-
await (adapter == null ? void 0 : adapter.setState(
|
|
45
|
-
`${productKey}.${deviceKey}.calculations.energyWhMax`,
|
|
46
|
-
currentEnergyState == null ? void 0 : currentEnergyState.val,
|
|
47
|
-
true
|
|
48
|
-
));
|
|
49
|
-
}
|
|
50
|
-
};
|
|
51
|
-
const setSocToZero = async (adapter, productKey, deviceKey) => {
|
|
52
|
-
await (adapter == null ? void 0 : adapter.setState(
|
|
53
|
-
`${productKey}.${deviceKey}.calculations.soc`,
|
|
54
|
-
0,
|
|
55
|
-
true
|
|
56
|
-
));
|
|
57
|
-
const energyWhState = await adapter.getStateAsync(
|
|
58
|
-
`${productKey}.${deviceKey}.calculations.energyWh`
|
|
59
|
-
);
|
|
60
|
-
const energyWhMaxState = await adapter.getStateAsync(
|
|
61
|
-
`${productKey}.${deviceKey}.calculations.energyWhMax`
|
|
62
|
-
);
|
|
63
|
-
const newMax = Number(energyWhMaxState == null ? void 0 : energyWhMaxState.val) - Number(energyWhState == null ? void 0 : energyWhState.val);
|
|
64
|
-
await (adapter == null ? void 0 : adapter.setState(
|
|
65
|
-
`${productKey}.${deviceKey}.calculations.energyWhMax`,
|
|
66
|
-
newMax,
|
|
67
|
-
true
|
|
68
|
-
));
|
|
69
|
-
await (adapter == null ? void 0 : adapter.setState(
|
|
70
|
-
`${productKey}.${deviceKey}.calculations.energyWh`,
|
|
71
|
-
0,
|
|
72
|
-
true
|
|
73
|
-
));
|
|
74
|
-
};
|
|
75
|
-
const calculateSocAndEnergy = async (adapter, productKey, deviceKey, stateKey, value) => {
|
|
76
|
-
var _a, _b;
|
|
77
|
-
adapter.log.debug(
|
|
78
|
-
`[calculateSocAndEnergy] Calculating for: ${productKey}.${deviceKey} and stateKey ${stateKey}!`
|
|
79
|
-
);
|
|
80
|
-
let energyWhMax = void 0;
|
|
81
|
-
const minSoc = (_a = await adapter.getStateAsync(`${productKey}.${deviceKey}.minSoc`)) == null ? void 0 : _a.val;
|
|
82
|
-
const currentSoc = (_b = await adapter.getStateAsync(`${productKey}.${deviceKey}.electricLevel`)) == null ? void 0 : _b.val;
|
|
83
|
-
if (currentSoc && minSoc && Number(currentSoc) < Number(minSoc)) {
|
|
84
|
-
adapter.log.debug(
|
|
85
|
-
`[calculateSocAndEnergy] Don't calculate, currentSoc (${Number(currentSoc)}) is lower than minSoc (${Number(minSoc)})!`
|
|
86
|
-
);
|
|
87
|
-
return;
|
|
88
|
-
}
|
|
89
|
-
const currentEnergyState = await (adapter == null ? void 0 : adapter.getStateAsync(
|
|
90
|
-
productKey + "." + deviceKey + ".calculations.energyWh"
|
|
91
|
-
));
|
|
92
|
-
const currentEnergyMaxState = await (adapter == null ? void 0 : adapter.getStateAsync(
|
|
93
|
-
productKey + "." + deviceKey + ".calculations.energyWhMax"
|
|
94
|
-
));
|
|
95
|
-
const lowVoltageBlock = await (adapter == null ? void 0 : adapter.getStateAsync(
|
|
96
|
-
productKey + "." + deviceKey + ".control.lowVoltageBlock"
|
|
97
|
-
));
|
|
98
|
-
const currentMaxValue = Number(
|
|
99
|
-
currentEnergyMaxState ? currentEnergyMaxState.val : 0
|
|
100
|
-
);
|
|
101
|
-
const currentEnergyWh = (currentEnergyState == null ? void 0 : currentEnergyState.val) ? Number(currentEnergyState == null ? void 0 : currentEnergyState.val) : 0;
|
|
102
|
-
const batteries = adapter.pack2Devices.filter(
|
|
103
|
-
(x) => x.deviceKey == deviceKey
|
|
104
|
-
);
|
|
105
|
-
if (productKey == "yWF7hV") {
|
|
106
|
-
energyWhMax = 2400;
|
|
107
|
-
} else {
|
|
108
|
-
for (let i = 0; i < batteries.length; i++) {
|
|
109
|
-
if (batteries[i].type == "AB1000") {
|
|
110
|
-
energyWhMax = (energyWhMax ? energyWhMax : 0) + 960;
|
|
111
|
-
} else if (batteries[i].type == "AB2000") {
|
|
112
|
-
energyWhMax = (energyWhMax ? energyWhMax : 0) + 1920;
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
let newEnergyWh = stateKey == "outputPack" ? currentEnergyWh + value : currentEnergyWh - value;
|
|
117
|
-
if (stateKey == "outputPack" && energyWhMax != void 0 && newEnergyWh > energyWhMax) {
|
|
118
|
-
newEnergyWh = energyWhMax;
|
|
119
|
-
adapter.log.debug(
|
|
120
|
-
`[calculateSocAndEnergy] newEnergyWh (${newEnergyWh}) is greater than energyWhMax (${energyWhMax}), don't extend value!`
|
|
121
|
-
);
|
|
122
|
-
}
|
|
123
|
-
if (newEnergyWh > 0) {
|
|
124
|
-
adapter == null ? void 0 : adapter.setState(
|
|
125
|
-
`${productKey}.${deviceKey}.calculations.energyWh`,
|
|
126
|
-
newEnergyWh,
|
|
127
|
-
true
|
|
128
|
-
);
|
|
129
|
-
adapter.log.debug(
|
|
130
|
-
`[calculateSocAndEnergy] set '${productKey}.${deviceKey}.calculations.energyWh' to ${newEnergyWh}!`
|
|
131
|
-
);
|
|
132
|
-
if (currentEnergyMaxState) {
|
|
133
|
-
const soc = Number((newEnergyWh / currentMaxValue * 100).toFixed(1));
|
|
134
|
-
await (adapter == null ? void 0 : adapter.setState(
|
|
135
|
-
`${productKey}.${deviceKey}.calculations.soc`,
|
|
136
|
-
soc > 100 ? 100 : soc,
|
|
137
|
-
true
|
|
138
|
-
));
|
|
139
|
-
if (newEnergyWh > currentMaxValue && !(lowVoltageBlock == null ? void 0 : lowVoltageBlock.val)) {
|
|
140
|
-
await (adapter == null ? void 0 : adapter.setState(
|
|
141
|
-
`${productKey}.${deviceKey}.calculations.energyWhMax`,
|
|
142
|
-
newEnergyWh,
|
|
143
|
-
true
|
|
144
|
-
));
|
|
145
|
-
}
|
|
146
|
-
const currentOutputPackPower = await (adapter == null ? void 0 : adapter.getStateAsync(
|
|
147
|
-
`${productKey}.${deviceKey}.outputPackPower`
|
|
148
|
-
));
|
|
149
|
-
const currentPackInputPower = await (adapter == null ? void 0 : adapter.getStateAsync(
|
|
150
|
-
productKey + "." + deviceKey + ".packInputPower"
|
|
151
|
-
));
|
|
152
|
-
if (stateKey == "outputPack" && (currentOutputPackPower == null ? void 0 : currentOutputPackPower.val) != null && currentOutputPackPower != void 0) {
|
|
153
|
-
const toCharge = currentMaxValue - newEnergyWh;
|
|
154
|
-
const remainHoursAsDecimal = toCharge / Number(currentOutputPackPower.val);
|
|
155
|
-
if (remainHoursAsDecimal < 48) {
|
|
156
|
-
const remainFormatted = (0, import_timeHelper.toHoursAndMinutes)(
|
|
157
|
-
Math.round(remainHoursAsDecimal * 60)
|
|
158
|
-
);
|
|
159
|
-
await (adapter == null ? void 0 : adapter.setState(
|
|
160
|
-
`${productKey}.${deviceKey}.calculations.remainInputTime`,
|
|
161
|
-
remainFormatted,
|
|
162
|
-
true
|
|
163
|
-
));
|
|
164
|
-
} else {
|
|
165
|
-
await (adapter == null ? void 0 : adapter.setState(
|
|
166
|
-
`${productKey}.${deviceKey}.calculations.remainInputTime`,
|
|
167
|
-
"",
|
|
168
|
-
true
|
|
169
|
-
));
|
|
170
|
-
}
|
|
171
|
-
} else if (stateKey == "packInput" && currentPackInputPower != null && currentPackInputPower != void 0) {
|
|
172
|
-
const remainHoursAsDecimal = newEnergyWh / Number(currentPackInputPower.val);
|
|
173
|
-
const remainFormatted = (0, import_timeHelper.toHoursAndMinutes)(
|
|
174
|
-
Math.round(remainHoursAsDecimal * 60)
|
|
175
|
-
);
|
|
176
|
-
if (remainHoursAsDecimal < 48) {
|
|
177
|
-
await (adapter == null ? void 0 : adapter.setState(
|
|
178
|
-
`${productKey}.${deviceKey}.calculations.remainOutTime`,
|
|
179
|
-
remainFormatted,
|
|
180
|
-
true
|
|
181
|
-
));
|
|
182
|
-
} else {
|
|
183
|
-
await (adapter == null ? void 0 : adapter.setState(
|
|
184
|
-
`${productKey}.${deviceKey}.calculations.remainOutTime`,
|
|
185
|
-
"",
|
|
186
|
-
true
|
|
187
|
-
));
|
|
188
|
-
}
|
|
189
|
-
}
|
|
190
|
-
}
|
|
191
|
-
} else if (newEnergyWh <= 0 && stateKey == "outputPack") {
|
|
192
|
-
await (adapter == null ? void 0 : adapter.setState(
|
|
193
|
-
`${productKey}.${deviceKey}.calculations.remainInputTime`,
|
|
194
|
-
"",
|
|
195
|
-
true
|
|
196
|
-
));
|
|
197
|
-
} else if (newEnergyWh <= 0 && stateKey == "packInput") {
|
|
198
|
-
await (adapter == null ? void 0 : adapter.setState(
|
|
199
|
-
`${productKey}.${deviceKey}.calculations.remainOutTime`,
|
|
200
|
-
"",
|
|
201
|
-
true
|
|
202
|
-
));
|
|
203
|
-
const newEnergyWhPositive = Math.abs(newEnergyWh);
|
|
204
|
-
if (energyWhMax && currentMaxValue + newEnergyWhPositive <= energyWhMax) {
|
|
205
|
-
await (adapter == null ? void 0 : adapter.setState(
|
|
206
|
-
`${productKey}.${deviceKey}.calculations.energyWhMax`,
|
|
207
|
-
currentMaxValue + newEnergyWhPositive,
|
|
208
|
-
true
|
|
209
|
-
));
|
|
210
|
-
}
|
|
211
|
-
}
|
|
212
|
-
};
|
|
213
|
-
const calculateEnergy = async (adapter, productKey, deviceKey) => {
|
|
214
|
-
calculationStateKeys.forEach(async (stateKey) => {
|
|
215
|
-
let stateNameEnergyWh = "";
|
|
216
|
-
let stateNameEnergykWh = "";
|
|
217
|
-
let stateNamePower = "";
|
|
218
|
-
if (stateKey == "pvPower1") {
|
|
219
|
-
stateNameEnergyWh = `${productKey}.${deviceKey}.calculations.solarInputPv1EnergyTodayWh`;
|
|
220
|
-
stateNameEnergykWh = `${productKey}.${deviceKey}.calculations.solarInputPv1EnergyTodaykWh`;
|
|
221
|
-
stateNamePower = `${productKey}.${deviceKey}.pvPower1`;
|
|
222
|
-
} else if (stateKey == "pvPower2") {
|
|
223
|
-
stateNameEnergyWh = `${productKey}.${deviceKey}.calculations.solarInputPv2EnergyTodayWh`;
|
|
224
|
-
stateNameEnergykWh = `${productKey}.${deviceKey}.calculations.solarInputPv2EnergyTodaykWh`;
|
|
225
|
-
stateNamePower = `${productKey}.${deviceKey}.pvPower2`;
|
|
226
|
-
} else {
|
|
227
|
-
stateNameEnergyWh = `${productKey}.${deviceKey}.calculations.${stateKey}EnergyTodayWh`;
|
|
228
|
-
stateNameEnergykWh = `${productKey}.${deviceKey}.calculations.${stateKey}EnergyTodaykWh`;
|
|
229
|
-
stateNamePower = `${productKey}.${deviceKey}.${stateKey}Power`;
|
|
230
|
-
}
|
|
231
|
-
const currentPowerState = await (adapter == null ? void 0 : adapter.getStateAsync(stateNamePower));
|
|
232
|
-
const currentEnergyState = await (adapter == null ? void 0 : adapter.getStateAsync(stateNameEnergyWh));
|
|
233
|
-
if ((currentEnergyState == null ? void 0 : currentEnergyState.val) == 0) {
|
|
234
|
-
await (adapter == null ? void 0 : adapter.setState(stateNameEnergyWh, 1e-6, true));
|
|
235
|
-
} else if (currentEnergyState && currentEnergyState.lc && currentPowerState && currentPowerState.val != void 0 && currentPowerState.val != null) {
|
|
236
|
-
const timeFrame = 3e4;
|
|
237
|
-
const addEnergyValue = Number(currentPowerState.val) * timeFrame / 36e5;
|
|
238
|
-
let newEnergyValue = Number(currentEnergyState.val) + addEnergyValue;
|
|
239
|
-
if (newEnergyValue < 0) {
|
|
240
|
-
newEnergyValue = 0;
|
|
241
|
-
}
|
|
242
|
-
await (adapter == null ? void 0 : adapter.setState(stateNameEnergyWh, newEnergyValue, true));
|
|
243
|
-
await (adapter == null ? void 0 : adapter.setState(
|
|
244
|
-
stateNameEnergykWh,
|
|
245
|
-
Number((newEnergyValue / 1e3).toFixed(2)),
|
|
246
|
-
true
|
|
247
|
-
));
|
|
248
|
-
if ((stateKey == "outputPack" || stateKey == "packInput") && addEnergyValue > 0) {
|
|
249
|
-
await calculateSocAndEnergy(
|
|
250
|
-
adapter,
|
|
251
|
-
productKey,
|
|
252
|
-
deviceKey,
|
|
253
|
-
stateKey,
|
|
254
|
-
addEnergyValue
|
|
255
|
-
);
|
|
256
|
-
} else {
|
|
257
|
-
if (stateKey == "outputPack") {
|
|
258
|
-
await (adapter == null ? void 0 : adapter.setState(
|
|
259
|
-
`${productKey}.${deviceKey}.calculations.remainInputTime`,
|
|
260
|
-
"",
|
|
261
|
-
true
|
|
262
|
-
));
|
|
263
|
-
} else if (stateKey == "packInput") {
|
|
264
|
-
await (adapter == null ? void 0 : adapter.setState(
|
|
265
|
-
`${productKey}.${deviceKey}.calculations.remainOutTime`,
|
|
266
|
-
"",
|
|
267
|
-
true
|
|
268
|
-
));
|
|
269
|
-
}
|
|
270
|
-
}
|
|
271
|
-
} else {
|
|
272
|
-
await (adapter == null ? void 0 : adapter.setState(stateNameEnergyWh, 0, true));
|
|
273
|
-
await (adapter == null ? void 0 : adapter.setState(stateNameEnergykWh, 0, true));
|
|
274
|
-
}
|
|
275
|
-
});
|
|
276
|
-
};
|
|
277
|
-
const resetValuesForDevice = (adapter, productKey, deviceKey) => {
|
|
278
|
-
calculationStateKeys.forEach(async (stateKey) => {
|
|
279
|
-
let stateNameEnergyWh = "";
|
|
280
|
-
let stateNameEnergykWh = "";
|
|
281
|
-
if (stateKey == "pvPower1") {
|
|
282
|
-
stateNameEnergyWh = `${productKey}.${deviceKey}.calculations.solarInputPv1EnergyTodayWh`;
|
|
283
|
-
stateNameEnergykWh = `${productKey}.${deviceKey}.calculations.solarInputPv1EnergyTodaykWh`;
|
|
284
|
-
} else if (stateKey == "pvPower2") {
|
|
285
|
-
stateNameEnergyWh = `${productKey}.${deviceKey}.calculations.solarInputPv2EnergyTodayWh`;
|
|
286
|
-
stateNameEnergykWh = `${productKey}.${deviceKey}.calculations.solarInputPv2EnergyTodaykWh`;
|
|
287
|
-
} else {
|
|
288
|
-
stateNameEnergyWh = `${productKey}.${deviceKey}.calculations.${stateKey}EnergyTodayWh`;
|
|
289
|
-
stateNameEnergykWh = `${productKey}.${deviceKey}.calculations.${stateKey}EnergyTodaykWh`;
|
|
290
|
-
}
|
|
291
|
-
await (adapter == null ? void 0 : adapter.setState(stateNameEnergyWh, 0, true));
|
|
292
|
-
await (adapter == null ? void 0 : adapter.setState(stateNameEnergykWh, 0, true));
|
|
293
|
-
});
|
|
294
|
-
};
|
|
295
|
-
const resetTodaysValues = async (adapter) => {
|
|
296
|
-
if (adapter.config.server == "local") {
|
|
297
|
-
if (adapter.config.localDevice1ProductKey && adapter.config.localDevice1DeviceKey) {
|
|
298
|
-
resetValuesForDevice(
|
|
299
|
-
adapter,
|
|
300
|
-
adapter.config.localDevice1ProductKey,
|
|
301
|
-
adapter.config.localDevice1DeviceKey
|
|
302
|
-
);
|
|
303
|
-
}
|
|
304
|
-
if (adapter.config.localDevice2ProductKey && adapter.config.localDevice2DeviceKey) {
|
|
305
|
-
resetValuesForDevice(
|
|
306
|
-
adapter,
|
|
307
|
-
adapter.config.localDevice2ProductKey,
|
|
308
|
-
adapter.config.localDevice2DeviceKey
|
|
309
|
-
);
|
|
310
|
-
}
|
|
311
|
-
if (adapter.config.localDevice3ProductKey && adapter.config.localDevice3DeviceKey) {
|
|
312
|
-
resetValuesForDevice(
|
|
313
|
-
adapter,
|
|
314
|
-
adapter.config.localDevice3ProductKey,
|
|
315
|
-
adapter.config.localDevice3DeviceKey
|
|
316
|
-
);
|
|
317
|
-
}
|
|
318
|
-
if (adapter.config.localDevice4ProductKey && adapter.config.localDevice4DeviceKey) {
|
|
319
|
-
resetValuesForDevice(
|
|
320
|
-
adapter,
|
|
321
|
-
adapter.config.localDevice4ProductKey,
|
|
322
|
-
adapter.config.localDevice4DeviceKey
|
|
323
|
-
);
|
|
324
|
-
}
|
|
325
|
-
} else {
|
|
326
|
-
adapter.deviceList.forEach((device) => {
|
|
327
|
-
resetValuesForDevice(adapter, device.productKey, device.deviceKey);
|
|
328
|
-
if (device.packList && device.packList.length > 0) {
|
|
329
|
-
device.packList.forEach(async (subDevice) => {
|
|
330
|
-
if (subDevice.productName.toLocaleLowerCase() == "ace 1500") {
|
|
331
|
-
resetValuesForDevice(
|
|
332
|
-
adapter,
|
|
333
|
-
subDevice.productKey,
|
|
334
|
-
subDevice.deviceKey
|
|
335
|
-
);
|
|
336
|
-
}
|
|
337
|
-
});
|
|
338
|
-
}
|
|
339
|
-
});
|
|
340
|
-
}
|
|
341
|
-
};
|
|
342
|
-
// Annotate the CommonJS export names for ESM import in node:
|
|
343
|
-
0 && (module.exports = {
|
|
344
|
-
calculateEnergy,
|
|
345
|
-
calculateSocAndEnergy,
|
|
346
|
-
resetTodaysValues,
|
|
347
|
-
setEnergyWhMax,
|
|
348
|
-
setSocToZero
|
|
349
|
-
});
|
|
350
|
-
//# sourceMappingURL=calculationService.js.map
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../src/services/calculationService.ts"],
|
|
4
|
-
"sourcesContent": ["/* eslint-disable @typescript-eslint/indent */\r\n\r\nimport { toHoursAndMinutes } from \"../helpers/timeHelper\";\r\nimport { ZendureSolarflow } from \"../main\";\r\nimport { ISolarFlowDeviceDetails } from \"../models/ISolarFlowDeviceDetails\";\r\n\r\nconst calculationStateKeys = [\r\n \"packInput\",\r\n \"outputHome\",\r\n \"outputPack\",\r\n \"outputPack\",\r\n \"solarInput\",\r\n \"gridInput\",\r\n \"pvPower1\",\r\n \"pvPower2\",\r\n];\r\n\r\nexport const setEnergyWhMax = async (\r\n adapter: ZendureSolarflow,\r\n productKey: string,\r\n deviceKey: string\r\n): Promise<void> => {\r\n const currentEnergyState = await adapter?.getStateAsync(\r\n productKey + \".\" + deviceKey + \".calculations.energyWh\"\r\n );\r\n\r\n if (currentEnergyState) {\r\n await adapter?.setState(\r\n `${productKey}.${deviceKey}.calculations.energyWhMax`,\r\n currentEnergyState?.val,\r\n true\r\n );\r\n }\r\n};\r\n\r\nexport const setSocToZero = async (\r\n adapter: ZendureSolarflow,\r\n productKey: string,\r\n deviceKey: string\r\n): Promise<void> => {\r\n // Set SOC to 0\r\n await adapter?.setState(\r\n `${productKey}.${deviceKey}.calculations.soc`,\r\n 0,\r\n true\r\n );\r\n\r\n // Calculate new Wh Max Value\r\n const energyWhState = await adapter.getStateAsync(\r\n `${productKey}.${deviceKey}.calculations.energyWh`\r\n );\r\n const energyWhMaxState = await adapter.getStateAsync(\r\n `${productKey}.${deviceKey}.calculations.energyWhMax`\r\n );\r\n\r\n const newMax = Number(energyWhMaxState?.val) - Number(energyWhState?.val);\r\n\r\n // Set Max Energy to value minus current energy\r\n await adapter?.setState(\r\n `${productKey}.${deviceKey}.calculations.energyWhMax`,\r\n newMax,\r\n true\r\n );\r\n\r\n // Set Energy in Battery to 0\r\n await adapter?.setState(\r\n `${productKey}.${deviceKey}.calculations.energyWh`,\r\n 0,\r\n true\r\n );\r\n};\r\n\r\nexport const calculateSocAndEnergy = async (\r\n adapter: ZendureSolarflow,\r\n productKey: string,\r\n deviceKey: string,\r\n stateKey: string,\r\n value: number\r\n): Promise<void> => {\r\n adapter.log.debug(\r\n `[calculateSocAndEnergy] Calculating for: ${productKey}.${deviceKey} and stateKey ${stateKey}!`\r\n );\r\n\r\n let energyWhMax: number | undefined = undefined;\r\n\r\n const minSoc = (\r\n await adapter.getStateAsync(`${productKey}.${deviceKey}.minSoc`)\r\n )?.val;\r\n const currentSoc = (\r\n await adapter.getStateAsync(`${productKey}.${deviceKey}.electricLevel`)\r\n )?.val;\r\n\r\n if (currentSoc && minSoc && Number(currentSoc) < Number(minSoc)) {\r\n // Don't calculate if current SOC is lower then minimum\r\n adapter.log.debug(\r\n `[calculateSocAndEnergy] Don't calculate, currentSoc (${Number(currentSoc)}) is lower than minSoc (${Number(minSoc)})!`\r\n );\r\n\r\n return;\r\n }\r\n\r\n const currentEnergyState = await adapter?.getStateAsync(\r\n productKey + \".\" + deviceKey + \".calculations.energyWh\"\r\n );\r\n\r\n const currentEnergyMaxState = await adapter?.getStateAsync(\r\n productKey + \".\" + deviceKey + \".calculations.energyWhMax\"\r\n );\r\n\r\n const lowVoltageBlock = await adapter?.getStateAsync(\r\n productKey + \".\" + deviceKey + \".control.lowVoltageBlock\"\r\n );\r\n\r\n const currentMaxValue = Number(\r\n currentEnergyMaxState ? currentEnergyMaxState.val : 0\r\n );\r\n\r\n const currentEnergyWh = currentEnergyState?.val\r\n ? Number(currentEnergyState?.val)\r\n : 0;\r\n\r\n const batteries = adapter.pack2Devices.filter(\r\n (x) => x.deviceKey == deviceKey\r\n );\r\n\r\n if (productKey == \"yWF7hV\") {\r\n // The device is an AIO 2400, so set maximum Wh to 2400!\r\n energyWhMax = 2400;\r\n } else {\r\n // Iterate over all batteries!\r\n for (let i = 0; i < batteries.length; i++) {\r\n if (batteries[i].type == \"AB1000\") {\r\n energyWhMax = (energyWhMax ? energyWhMax : 0) + 960;\r\n } else if (batteries[i].type == \"AB2000\") {\r\n energyWhMax = (energyWhMax ? energyWhMax : 0) + 1920;\r\n }\r\n }\r\n }\r\n\r\n // newValue is the current available energy in the batteries. If outputPack (charging) add value, if packInput (discharging) subtract value.\r\n let newEnergyWh =\r\n stateKey == \"outputPack\"\r\n ? currentEnergyWh + value\r\n : currentEnergyWh - value;\r\n\r\n // If greater than Max of batteries, set it to this value.\r\n if (\r\n stateKey == \"outputPack\" &&\r\n energyWhMax != undefined &&\r\n newEnergyWh > energyWhMax\r\n ) {\r\n newEnergyWh = energyWhMax;\r\n\r\n adapter.log.debug(\r\n `[calculateSocAndEnergy] newEnergyWh (${newEnergyWh}) is greater than energyWhMax (${energyWhMax}), don't extend value!`\r\n );\r\n }\r\n\r\n if (newEnergyWh > 0) {\r\n adapter?.setState(\r\n `${productKey}.${deviceKey}.calculations.energyWh`,\r\n newEnergyWh,\r\n true\r\n );\r\n\r\n adapter.log.debug(\r\n `[calculateSocAndEnergy] set '${productKey}.${deviceKey}.calculations.energyWh' to ${newEnergyWh}!`\r\n );\r\n\r\n if (currentEnergyMaxState) {\r\n const soc = Number(((newEnergyWh / currentMaxValue) * 100).toFixed(1));\r\n\r\n await adapter?.setState(\r\n `${productKey}.${deviceKey}.calculations.soc`,\r\n soc > 100.0 ? 100 : soc,\r\n true\r\n );\r\n\r\n if (newEnergyWh > currentMaxValue && !lowVoltageBlock?.val) {\r\n // Extend maxVal\r\n await adapter?.setState(\r\n `${productKey}.${deviceKey}.calculations.energyWhMax`,\r\n newEnergyWh,\r\n true\r\n );\r\n }\r\n\r\n const currentOutputPackPower = await adapter?.getStateAsync(\r\n `${productKey}.${deviceKey}.outputPackPower`\r\n );\r\n\r\n const currentPackInputPower = await adapter?.getStateAsync(\r\n productKey + \".\" + deviceKey + \".packInputPower\"\r\n );\r\n\r\n if (\r\n stateKey == \"outputPack\" &&\r\n currentOutputPackPower?.val != null &&\r\n currentOutputPackPower != undefined\r\n ) {\r\n // Charging, calculate remaining charging time\r\n const toCharge = currentMaxValue - newEnergyWh;\r\n\r\n const remainHoursAsDecimal =\r\n toCharge / Number(currentOutputPackPower.val);\r\n\r\n if (remainHoursAsDecimal < 48.0) {\r\n const remainFormatted = toHoursAndMinutes(\r\n Math.round(remainHoursAsDecimal * 60)\r\n );\r\n\r\n await adapter?.setState(\r\n `${productKey}.${deviceKey}.calculations.remainInputTime`,\r\n remainFormatted,\r\n true\r\n );\r\n } else {\r\n await adapter?.setState(\r\n `${productKey}.${deviceKey}.calculations.remainInputTime`,\r\n \"\",\r\n true\r\n );\r\n }\r\n } else if (\r\n stateKey == \"packInput\" &&\r\n currentPackInputPower != null &&\r\n currentPackInputPower != undefined\r\n ) {\r\n // Discharging, calculate remaining discharge time\r\n const remainHoursAsDecimal =\r\n newEnergyWh / Number(currentPackInputPower.val);\r\n const remainFormatted = toHoursAndMinutes(\r\n Math.round(remainHoursAsDecimal * 60)\r\n );\r\n\r\n if (remainHoursAsDecimal < 48.0) {\r\n await adapter?.setState(\r\n `${productKey}.${deviceKey}.calculations.remainOutTime`,\r\n remainFormatted,\r\n true\r\n );\r\n } else {\r\n await adapter?.setState(\r\n `${productKey}.${deviceKey}.calculations.remainOutTime`,\r\n \"\",\r\n true\r\n );\r\n }\r\n }\r\n }\r\n } else if (newEnergyWh <= 0 && stateKey == \"outputPack\") {\r\n await adapter?.setState(\r\n `${productKey}.${deviceKey}.calculations.remainInputTime`,\r\n \"\",\r\n true\r\n );\r\n } else if (newEnergyWh <= 0 && stateKey == \"packInput\") {\r\n await adapter?.setState(\r\n `${productKey}.${deviceKey}.calculations.remainOutTime`,\r\n \"\",\r\n true\r\n );\r\n\r\n // TEST: if SOC == 0, add newValue as positive to energyWhMax\r\n const newEnergyWhPositive = Math.abs(newEnergyWh);\r\n\r\n if (energyWhMax && currentMaxValue + newEnergyWhPositive <= energyWhMax) {\r\n await adapter?.setState(\r\n `${productKey}.${deviceKey}.calculations.energyWhMax`,\r\n currentMaxValue + newEnergyWhPositive,\r\n true\r\n );\r\n }\r\n }\r\n};\r\n\r\n/**\r\n * Calculates the energy for all items in 'calculationStateKeys'.\r\n *\r\n * @param adapter - The core adapter object\r\n * @param productKey - The productKey of the device\r\n * @param deviceKey - The device individual key\r\n * @returns Promise<void>\r\n *\r\n * @beta\r\n */\r\nexport const calculateEnergy = async (\r\n adapter: ZendureSolarflow,\r\n productKey: string,\r\n deviceKey: string\r\n): Promise<void> => {\r\n calculationStateKeys.forEach(async (stateKey) => {\r\n let stateNameEnergyWh = \"\";\r\n let stateNameEnergykWh = \"\";\r\n let stateNamePower = \"\";\r\n\r\n if (stateKey == \"pvPower1\") {\r\n stateNameEnergyWh = `${productKey}.${deviceKey}.calculations.solarInputPv1EnergyTodayWh`;\r\n stateNameEnergykWh = `${productKey}.${deviceKey}.calculations.solarInputPv1EnergyTodaykWh`;\r\n stateNamePower = `${productKey}.${deviceKey}.pvPower1`;\r\n } else if (stateKey == \"pvPower2\") {\r\n stateNameEnergyWh = `${productKey}.${deviceKey}.calculations.solarInputPv2EnergyTodayWh`;\r\n stateNameEnergykWh = `${productKey}.${deviceKey}.calculations.solarInputPv2EnergyTodaykWh`;\r\n stateNamePower = `${productKey}.${deviceKey}.pvPower2`;\r\n } else {\r\n stateNameEnergyWh = `${productKey}.${deviceKey}.calculations.${stateKey}EnergyTodayWh`;\r\n stateNameEnergykWh = `${productKey}.${deviceKey}.calculations.${stateKey}EnergyTodaykWh`;\r\n stateNamePower = `${productKey}.${deviceKey}.${stateKey}Power`;\r\n }\r\n\r\n const currentPowerState = await adapter?.getStateAsync(stateNamePower);\r\n const currentEnergyState = await adapter?.getStateAsync(stateNameEnergyWh);\r\n\r\n if (currentEnergyState?.val == 0) {\r\n // Workaround, set Val to very low value to avoid Jump in data...\r\n await adapter?.setState(stateNameEnergyWh, 0.000001, true);\r\n } else if (\r\n currentEnergyState &&\r\n currentEnergyState.lc &&\r\n currentPowerState &&\r\n currentPowerState.val != undefined &&\r\n currentPowerState.val != null\r\n ) {\r\n // Timeframe = 30000ms, Job runs every 30 seconds...\r\n const timeFrame = 30000;\r\n\r\n // Calculate Energy value (Wh) from current power in the timeframe from last run...\r\n const addEnergyValue =\r\n (Number(currentPowerState.val) * timeFrame) / 3600000; // Wh\r\n\r\n /* // Use efficiency factor (used the one from Youtube Channel VoltAmpereLux - thanks!)\r\n const chargingFactor = 0.96; // Efficiency 96%\r\n const dischargingFactor = 1.08 - addEnergyValue / 10000; // Efficiency 92% - 98% (92% + Energy / 10000 = 600W -> +6%)\r\n\r\n // Calculate energy from efficiency factor if value for charging or discharging\r\n addEnergyValue =\r\n stateKey == \"outputPack\" && addEnergyValue > 0\r\n ? addEnergyValue * chargingFactor\r\n : addEnergyValue;\r\n addEnergyValue =\r\n stateKey == \"packInput\" && addEnergyValue > 0\r\n ? addEnergyValue * dischargingFactor\r\n : addEnergyValue; */\r\n\r\n let newEnergyValue = Number(currentEnergyState.val) + addEnergyValue;\r\n\r\n // Fix negative value\r\n if (newEnergyValue < 0) {\r\n newEnergyValue = 0;\r\n }\r\n\r\n await adapter?.setState(stateNameEnergyWh, newEnergyValue, true);\r\n await adapter?.setState(\r\n stateNameEnergykWh,\r\n Number((newEnergyValue / 1000).toFixed(2)),\r\n true\r\n );\r\n\r\n // SOC and energy in batteries\r\n if (\r\n (stateKey == \"outputPack\" || stateKey == \"packInput\") &&\r\n addEnergyValue > 0\r\n ) {\r\n await calculateSocAndEnergy(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n stateKey,\r\n addEnergyValue\r\n );\r\n } else {\r\n if (stateKey == \"outputPack\") {\r\n await adapter?.setState(\r\n `${productKey}.${deviceKey}.calculations.remainInputTime`,\r\n \"\",\r\n true\r\n );\r\n } else if (stateKey == \"packInput\") {\r\n await adapter?.setState(\r\n `${productKey}.${deviceKey}.calculations.remainOutTime`,\r\n \"\",\r\n true\r\n );\r\n }\r\n }\r\n } else {\r\n await adapter?.setState(stateNameEnergyWh, 0, true);\r\n await adapter?.setState(stateNameEnergykWh, 0, true);\r\n }\r\n });\r\n};\r\n\r\nconst resetValuesForDevice = (\r\n adapter: ZendureSolarflow,\r\n productKey: string,\r\n deviceKey: string\r\n): void => {\r\n calculationStateKeys.forEach(async (stateKey: string) => {\r\n let stateNameEnergyWh = \"\";\r\n let stateNameEnergykWh = \"\";\r\n\r\n if (stateKey == \"pvPower1\") {\r\n stateNameEnergyWh = `${productKey}.${deviceKey}.calculations.solarInputPv1EnergyTodayWh`;\r\n stateNameEnergykWh = `${productKey}.${deviceKey}.calculations.solarInputPv1EnergyTodaykWh`;\r\n } else if (stateKey == \"pvPower2\") {\r\n stateNameEnergyWh = `${productKey}.${deviceKey}.calculations.solarInputPv2EnergyTodayWh`;\r\n stateNameEnergykWh = `${productKey}.${deviceKey}.calculations.solarInputPv2EnergyTodaykWh`;\r\n } else {\r\n stateNameEnergyWh = `${productKey}.${deviceKey}.calculations.${stateKey}EnergyTodayWh`;\r\n stateNameEnergykWh = `${productKey}.${deviceKey}.calculations.${stateKey}EnergyTodaykWh`;\r\n }\r\n\r\n await adapter?.setState(stateNameEnergyWh, 0, true);\r\n await adapter?.setState(stateNameEnergykWh, 0, true);\r\n });\r\n};\r\n\r\nexport const resetTodaysValues = async (\r\n adapter: ZendureSolarflow\r\n): Promise<void> => {\r\n if (adapter.config.server == \"local\") {\r\n if (\r\n adapter.config.localDevice1ProductKey &&\r\n adapter.config.localDevice1DeviceKey\r\n ) {\r\n resetValuesForDevice(\r\n adapter,\r\n adapter.config.localDevice1ProductKey,\r\n adapter.config.localDevice1DeviceKey\r\n );\r\n }\r\n\r\n if (\r\n adapter.config.localDevice2ProductKey &&\r\n adapter.config.localDevice2DeviceKey\r\n ) {\r\n resetValuesForDevice(\r\n adapter,\r\n adapter.config.localDevice2ProductKey,\r\n adapter.config.localDevice2DeviceKey\r\n );\r\n }\r\n\r\n if (\r\n adapter.config.localDevice3ProductKey &&\r\n adapter.config.localDevice3DeviceKey\r\n ) {\r\n resetValuesForDevice(\r\n adapter,\r\n adapter.config.localDevice3ProductKey,\r\n adapter.config.localDevice3DeviceKey\r\n );\r\n }\r\n\r\n if (\r\n adapter.config.localDevice4ProductKey &&\r\n adapter.config.localDevice4DeviceKey\r\n ) {\r\n resetValuesForDevice(\r\n adapter,\r\n adapter.config.localDevice4ProductKey,\r\n adapter.config.localDevice4DeviceKey\r\n );\r\n }\r\n } else {\r\n adapter.deviceList.forEach((device: ISolarFlowDeviceDetails) => {\r\n resetValuesForDevice(adapter, device.productKey, device.deviceKey);\r\n\r\n if (device.packList && device.packList.length > 0) {\r\n device.packList.forEach(async (subDevice) => {\r\n if (subDevice.productName.toLocaleLowerCase() == \"ace 1500\") {\r\n resetValuesForDevice(\r\n adapter,\r\n subDevice.productKey,\r\n subDevice.deviceKey\r\n );\r\n }\r\n });\r\n }\r\n });\r\n }\r\n};\r\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAEA,wBAAkC;AAIlC,MAAM,uBAAuB;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEO,MAAM,iBAAiB,OAC5B,SACA,YACA,cACkB;AAClB,QAAM,qBAAqB,OAAM,mCAAS;AAAA,IACxC,aAAa,MAAM,YAAY;AAAA;AAGjC,MAAI,oBAAoB;AACtB,WAAM,mCAAS;AAAA,MACb,GAAG,UAAU,IAAI,SAAS;AAAA,MAC1B,yDAAoB;AAAA,MACpB;AAAA;AAAA,EAEJ;AACF;AAEO,MAAM,eAAe,OAC1B,SACA,YACA,cACkB;AAElB,SAAM,mCAAS;AAAA,IACb,GAAG,UAAU,IAAI,SAAS;AAAA,IAC1B;AAAA,IACA;AAAA;AAIF,QAAM,gBAAgB,MAAM,QAAQ;AAAA,IAClC,GAAG,UAAU,IAAI,SAAS;AAAA,EAC5B;AACA,QAAM,mBAAmB,MAAM,QAAQ;AAAA,IACrC,GAAG,UAAU,IAAI,SAAS;AAAA,EAC5B;AAEA,QAAM,SAAS,OAAO,qDAAkB,GAAG,IAAI,OAAO,+CAAe,GAAG;AAGxE,SAAM,mCAAS;AAAA,IACb,GAAG,UAAU,IAAI,SAAS;AAAA,IAC1B;AAAA,IACA;AAAA;AAIF,SAAM,mCAAS;AAAA,IACb,GAAG,UAAU,IAAI,SAAS;AAAA,IAC1B;AAAA,IACA;AAAA;AAEJ;AAEO,MAAM,wBAAwB,OACnC,SACA,YACA,WACA,UACA,UACkB;AA9EpB;AA+EE,UAAQ,IAAI;AAAA,IACV,4CAA4C,UAAU,IAAI,SAAS,iBAAiB,QAAQ;AAAA,EAC9F;AAEA,MAAI,cAAkC;AAEtC,QAAM,UACJ,WAAM,QAAQ,cAAc,GAAG,UAAU,IAAI,SAAS,SAAS,MAA/D,mBACC;AACH,QAAM,cACJ,WAAM,QAAQ,cAAc,GAAG,UAAU,IAAI,SAAS,gBAAgB,MAAtE,mBACC;AAEH,MAAI,cAAc,UAAU,OAAO,UAAU,IAAI,OAAO,MAAM,GAAG;AAE/D,YAAQ,IAAI;AAAA,MACV,wDAAwD,OAAO,UAAU,CAAC,2BAA2B,OAAO,MAAM,CAAC;AAAA,IACrH;AAEA;AAAA,EACF;AAEA,QAAM,qBAAqB,OAAM,mCAAS;AAAA,IACxC,aAAa,MAAM,YAAY;AAAA;AAGjC,QAAM,wBAAwB,OAAM,mCAAS;AAAA,IAC3C,aAAa,MAAM,YAAY;AAAA;AAGjC,QAAM,kBAAkB,OAAM,mCAAS;AAAA,IACrC,aAAa,MAAM,YAAY;AAAA;AAGjC,QAAM,kBAAkB;AAAA,IACtB,wBAAwB,sBAAsB,MAAM;AAAA,EACtD;AAEA,QAAM,mBAAkB,yDAAoB,OACxC,OAAO,yDAAoB,GAAG,IAC9B;AAEJ,QAAM,YAAY,QAAQ,aAAa;AAAA,IACrC,CAAC,MAAM,EAAE,aAAa;AAAA,EACxB;AAEA,MAAI,cAAc,UAAU;AAE1B,kBAAc;AAAA,EAChB,OAAO;AAEL,aAAS,IAAI,GAAG,IAAI,UAAU,QAAQ,KAAK;AACzC,UAAI,UAAU,CAAC,EAAE,QAAQ,UAAU;AACjC,uBAAe,cAAc,cAAc,KAAK;AAAA,MAClD,WAAW,UAAU,CAAC,EAAE,QAAQ,UAAU;AACxC,uBAAe,cAAc,cAAc,KAAK;AAAA,MAClD;AAAA,IACF;AAAA,EACF;AAGA,MAAI,cACF,YAAY,eACR,kBAAkB,QAClB,kBAAkB;AAGxB,MACE,YAAY,gBACZ,eAAe,UACf,cAAc,aACd;AACA,kBAAc;AAEd,YAAQ,IAAI;AAAA,MACV,wCAAwC,WAAW,kCAAkC,WAAW;AAAA,IAClG;AAAA,EACF;AAEA,MAAI,cAAc,GAAG;AACnB,uCAAS;AAAA,MACP,GAAG,UAAU,IAAI,SAAS;AAAA,MAC1B;AAAA,MACA;AAAA;AAGF,YAAQ,IAAI;AAAA,MACV,gCAAgC,UAAU,IAAI,SAAS,8BAA8B,WAAW;AAAA,IAClG;AAEA,QAAI,uBAAuB;AACzB,YAAM,MAAM,QAAS,cAAc,kBAAmB,KAAK,QAAQ,CAAC,CAAC;AAErE,aAAM,mCAAS;AAAA,QACb,GAAG,UAAU,IAAI,SAAS;AAAA,QAC1B,MAAM,MAAQ,MAAM;AAAA,QACpB;AAAA;AAGF,UAAI,cAAc,mBAAmB,EAAC,mDAAiB,MAAK;AAE1D,eAAM,mCAAS;AAAA,UACb,GAAG,UAAU,IAAI,SAAS;AAAA,UAC1B;AAAA,UACA;AAAA;AAAA,MAEJ;AAEA,YAAM,yBAAyB,OAAM,mCAAS;AAAA,QAC5C,GAAG,UAAU,IAAI,SAAS;AAAA;AAG5B,YAAM,wBAAwB,OAAM,mCAAS;AAAA,QAC3C,aAAa,MAAM,YAAY;AAAA;AAGjC,UACE,YAAY,iBACZ,iEAAwB,QAAO,QAC/B,0BAA0B,QAC1B;AAEA,cAAM,WAAW,kBAAkB;AAEnC,cAAM,uBACJ,WAAW,OAAO,uBAAuB,GAAG;AAE9C,YAAI,uBAAuB,IAAM;AAC/B,gBAAM,sBAAkB;AAAA,YACtB,KAAK,MAAM,uBAAuB,EAAE;AAAA,UACtC;AAEA,iBAAM,mCAAS;AAAA,YACb,GAAG,UAAU,IAAI,SAAS;AAAA,YAC1B;AAAA,YACA;AAAA;AAAA,QAEJ,OAAO;AACL,iBAAM,mCAAS;AAAA,YACb,GAAG,UAAU,IAAI,SAAS;AAAA,YAC1B;AAAA,YACA;AAAA;AAAA,QAEJ;AAAA,MACF,WACE,YAAY,eACZ,yBAAyB,QACzB,yBAAyB,QACzB;AAEA,cAAM,uBACJ,cAAc,OAAO,sBAAsB,GAAG;AAChD,cAAM,sBAAkB;AAAA,UACtB,KAAK,MAAM,uBAAuB,EAAE;AAAA,QACtC;AAEA,YAAI,uBAAuB,IAAM;AAC/B,iBAAM,mCAAS;AAAA,YACb,GAAG,UAAU,IAAI,SAAS;AAAA,YAC1B;AAAA,YACA;AAAA;AAAA,QAEJ,OAAO;AACL,iBAAM,mCAAS;AAAA,YACb,GAAG,UAAU,IAAI,SAAS;AAAA,YAC1B;AAAA,YACA;AAAA;AAAA,QAEJ;AAAA,MACF;AAAA,IACF;AAAA,EACF,WAAW,eAAe,KAAK,YAAY,cAAc;AACvD,WAAM,mCAAS;AAAA,MACb,GAAG,UAAU,IAAI,SAAS;AAAA,MAC1B;AAAA,MACA;AAAA;AAAA,EAEJ,WAAW,eAAe,KAAK,YAAY,aAAa;AACtD,WAAM,mCAAS;AAAA,MACb,GAAG,UAAU,IAAI,SAAS;AAAA,MAC1B;AAAA,MACA;AAAA;AAIF,UAAM,sBAAsB,KAAK,IAAI,WAAW;AAEhD,QAAI,eAAe,kBAAkB,uBAAuB,aAAa;AACvE,aAAM,mCAAS;AAAA,QACb,GAAG,UAAU,IAAI,SAAS;AAAA,QAC1B,kBAAkB;AAAA,QAClB;AAAA;AAAA,IAEJ;AAAA,EACF;AACF;AAYO,MAAM,kBAAkB,OAC7B,SACA,YACA,cACkB;AAClB,uBAAqB,QAAQ,OAAO,aAAa;AAC/C,QAAI,oBAAoB;AACxB,QAAI,qBAAqB;AACzB,QAAI,iBAAiB;AAErB,QAAI,YAAY,YAAY;AAC1B,0BAAoB,GAAG,UAAU,IAAI,SAAS;AAC9C,2BAAqB,GAAG,UAAU,IAAI,SAAS;AAC/C,uBAAiB,GAAG,UAAU,IAAI,SAAS;AAAA,IAC7C,WAAW,YAAY,YAAY;AACjC,0BAAoB,GAAG,UAAU,IAAI,SAAS;AAC9C,2BAAqB,GAAG,UAAU,IAAI,SAAS;AAC/C,uBAAiB,GAAG,UAAU,IAAI,SAAS;AAAA,IAC7C,OAAO;AACL,0BAAoB,GAAG,UAAU,IAAI,SAAS,iBAAiB,QAAQ;AACvE,2BAAqB,GAAG,UAAU,IAAI,SAAS,iBAAiB,QAAQ;AACxE,uBAAiB,GAAG,UAAU,IAAI,SAAS,IAAI,QAAQ;AAAA,IACzD;AAEA,UAAM,oBAAoB,OAAM,mCAAS,cAAc;AACvD,UAAM,qBAAqB,OAAM,mCAAS,cAAc;AAExD,SAAI,yDAAoB,QAAO,GAAG;AAEhC,aAAM,mCAAS,SAAS,mBAAmB,MAAU;AAAA,IACvD,WACE,sBACA,mBAAmB,MACnB,qBACA,kBAAkB,OAAO,UACzB,kBAAkB,OAAO,MACzB;AAEA,YAAM,YAAY;AAGlB,YAAM,iBACH,OAAO,kBAAkB,GAAG,IAAI,YAAa;AAgBhD,UAAI,iBAAiB,OAAO,mBAAmB,GAAG,IAAI;AAGtD,UAAI,iBAAiB,GAAG;AACtB,yBAAiB;AAAA,MACnB;AAEA,aAAM,mCAAS,SAAS,mBAAmB,gBAAgB;AAC3D,aAAM,mCAAS;AAAA,QACb;AAAA,QACA,QAAQ,iBAAiB,KAAM,QAAQ,CAAC,CAAC;AAAA,QACzC;AAAA;AAIF,WACG,YAAY,gBAAgB,YAAY,gBACzC,iBAAiB,GACjB;AACA,cAAM;AAAA,UACJ;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF,OAAO;AACL,YAAI,YAAY,cAAc;AAC5B,iBAAM,mCAAS;AAAA,YACb,GAAG,UAAU,IAAI,SAAS;AAAA,YAC1B;AAAA,YACA;AAAA;AAAA,QAEJ,WAAW,YAAY,aAAa;AAClC,iBAAM,mCAAS;AAAA,YACb,GAAG,UAAU,IAAI,SAAS;AAAA,YAC1B;AAAA,YACA;AAAA;AAAA,QAEJ;AAAA,MACF;AAAA,IACF,OAAO;AACL,aAAM,mCAAS,SAAS,mBAAmB,GAAG;AAC9C,aAAM,mCAAS,SAAS,oBAAoB,GAAG;AAAA,IACjD;AAAA,EACF,CAAC;AACH;AAEA,MAAM,uBAAuB,CAC3B,SACA,YACA,cACS;AACT,uBAAqB,QAAQ,OAAO,aAAqB;AACvD,QAAI,oBAAoB;AACxB,QAAI,qBAAqB;AAEzB,QAAI,YAAY,YAAY;AAC1B,0BAAoB,GAAG,UAAU,IAAI,SAAS;AAC9C,2BAAqB,GAAG,UAAU,IAAI,SAAS;AAAA,IACjD,WAAW,YAAY,YAAY;AACjC,0BAAoB,GAAG,UAAU,IAAI,SAAS;AAC9C,2BAAqB,GAAG,UAAU,IAAI,SAAS;AAAA,IACjD,OAAO;AACL,0BAAoB,GAAG,UAAU,IAAI,SAAS,iBAAiB,QAAQ;AACvE,2BAAqB,GAAG,UAAU,IAAI,SAAS,iBAAiB,QAAQ;AAAA,IAC1E;AAEA,WAAM,mCAAS,SAAS,mBAAmB,GAAG;AAC9C,WAAM,mCAAS,SAAS,oBAAoB,GAAG;AAAA,EACjD,CAAC;AACH;AAEO,MAAM,oBAAoB,OAC/B,YACkB;AAClB,MAAI,QAAQ,OAAO,UAAU,SAAS;AACpC,QACE,QAAQ,OAAO,0BACf,QAAQ,OAAO,uBACf;AACA;AAAA,QACE;AAAA,QACA,QAAQ,OAAO;AAAA,QACf,QAAQ,OAAO;AAAA,MACjB;AAAA,IACF;AAEA,QACE,QAAQ,OAAO,0BACf,QAAQ,OAAO,uBACf;AACA;AAAA,QACE;AAAA,QACA,QAAQ,OAAO;AAAA,QACf,QAAQ,OAAO;AAAA,MACjB;AAAA,IACF;AAEA,QACE,QAAQ,OAAO,0BACf,QAAQ,OAAO,uBACf;AACA;AAAA,QACE;AAAA,QACA,QAAQ,OAAO;AAAA,QACf,QAAQ,OAAO;AAAA,MACjB;AAAA,IACF;AAEA,QACE,QAAQ,OAAO,0BACf,QAAQ,OAAO,uBACf;AACA;AAAA,QACE;AAAA,QACA,QAAQ,OAAO;AAAA,QACf,QAAQ,OAAO;AAAA,MACjB;AAAA,IACF;AAAA,EACF,OAAO;AACL,YAAQ,WAAW,QAAQ,CAAC,WAAoC;AAC9D,2BAAqB,SAAS,OAAO,YAAY,OAAO,SAAS;AAEjE,UAAI,OAAO,YAAY,OAAO,SAAS,SAAS,GAAG;AACjD,eAAO,SAAS,QAAQ,OAAO,cAAc;AAC3C,cAAI,UAAU,YAAY,kBAAkB,KAAK,YAAY;AAC3D;AAAA,cACE;AAAA,cACA,UAAU;AAAA,cACV,UAAU;AAAA,YACZ;AAAA,UACF;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF,CAAC;AAAA,EACH;AACF;",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|