iobroker.zendure-solarflow 1.2.5 → 1.2.7
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 +14 -1
- package/admin/build/index.js.map +2 -2
- package/build/helpers/createCalculationStates.js +1 -1
- package/build/helpers/createCalculationStates.js.map +1 -1
- package/build/helpers/createControlStates.js +62 -0
- package/build/helpers/createControlStates.js.map +2 -2
- package/build/helpers/createSolarFlowStates.js +52 -1
- package/build/helpers/createSolarFlowStates.js.map +2 -2
- package/build/main.js +43 -4
- package/build/main.js.map +2 -2
- package/build/services/adapterService.js +11 -11
- package/build/services/adapterService.js.map +2 -2
- package/build/services/calculationService.js +58 -27
- package/build/services/calculationService.js.map +2 -2
- package/build/services/jobSchedule.js +2 -2
- package/build/services/jobSchedule.js.map +2 -2
- package/build/services/mqttService.js +231 -175
- package/build/services/mqttService.js.map +2 -2
- package/io-package.json +27 -27
- package/package.json +1 -1
|
@@ -24,6 +24,7 @@ __export(calculationService_exports, {
|
|
|
24
24
|
setEnergyWhMax: () => setEnergyWhMax
|
|
25
25
|
});
|
|
26
26
|
module.exports = __toCommonJS(calculationService_exports);
|
|
27
|
+
var import_timeHelper = require("../helpers/timeHelper");
|
|
27
28
|
const calculationStateKeys = [
|
|
28
29
|
"packInput",
|
|
29
30
|
"outputHome",
|
|
@@ -35,11 +36,11 @@ const setEnergyWhMax = async (adapter, productKey, deviceKey) => {
|
|
|
35
36
|
productKey + "." + deviceKey + ".calculations.energyWh"
|
|
36
37
|
));
|
|
37
38
|
if (currentEnergyState) {
|
|
38
|
-
adapter == null ? void 0 : adapter.setStateAsync(
|
|
39
|
+
await (adapter == null ? void 0 : adapter.setStateAsync(
|
|
39
40
|
`${productKey}.${deviceKey}.calculations.energyWhMax`,
|
|
40
41
|
currentEnergyState == null ? void 0 : currentEnergyState.val,
|
|
41
42
|
true
|
|
42
|
-
);
|
|
43
|
+
));
|
|
43
44
|
}
|
|
44
45
|
};
|
|
45
46
|
const calculateSocAndEnergy = async (adapter, productKey, deviceKey, stateKey, value) => {
|
|
@@ -52,25 +53,51 @@ const calculateSocAndEnergy = async (adapter, productKey, deviceKey, stateKey, v
|
|
|
52
53
|
const currentValue = (currentEnergyState == null ? void 0 : currentEnergyState.val) ? Number(currentEnergyState == null ? void 0 : currentEnergyState.val) : 0;
|
|
53
54
|
const newValue = stateKey == "outputPack" ? currentValue + value : currentValue - value;
|
|
54
55
|
if (newValue > 0) {
|
|
55
|
-
adapter == null ? void 0 : adapter.
|
|
56
|
+
adapter == null ? void 0 : adapter.setState(
|
|
56
57
|
`${productKey}.${deviceKey}.calculations.energyWh`,
|
|
57
58
|
newValue,
|
|
58
59
|
true
|
|
59
60
|
);
|
|
60
61
|
if (currentEnergyMaxState) {
|
|
61
|
-
const soc = Number(
|
|
62
|
-
|
|
62
|
+
const soc = Number(
|
|
63
|
+
(newValue / Number(currentEnergyMaxState.val) * 100).toFixed(1)
|
|
64
|
+
);
|
|
65
|
+
await (adapter == null ? void 0 : adapter.setStateAsync(
|
|
63
66
|
`${productKey}.${deviceKey}.calculations.soc`,
|
|
64
|
-
soc,
|
|
67
|
+
soc > 100 ? 100 : soc,
|
|
65
68
|
true
|
|
66
|
-
);
|
|
69
|
+
));
|
|
67
70
|
if (newValue > Number(currentEnergyMaxState.val)) {
|
|
68
|
-
adapter == null ? void 0 : adapter.setStateAsync(
|
|
71
|
+
await (adapter == null ? void 0 : adapter.setStateAsync(
|
|
69
72
|
`${productKey}.${deviceKey}.calculations.energyWhMax`,
|
|
70
73
|
newValue,
|
|
71
74
|
true
|
|
72
|
-
);
|
|
75
|
+
));
|
|
76
|
+
}
|
|
77
|
+
if (stateKey == "outputPack") {
|
|
78
|
+
const toCharge = Number(currentEnergyMaxState.val) - newValue;
|
|
79
|
+
const remainHoursAsDecimal = toCharge / value;
|
|
80
|
+
const remainFormatted = (0, import_timeHelper.toHoursAndMinutes)(remainHoursAsDecimal * 60);
|
|
81
|
+
await (adapter == null ? void 0 : adapter.setStateAsync(
|
|
82
|
+
`${productKey}.${deviceKey}.calculations.remainInputTime`,
|
|
83
|
+
remainFormatted,
|
|
84
|
+
true
|
|
85
|
+
));
|
|
86
|
+
} else if (stateKey == "packInput") {
|
|
87
|
+
const remainHoursAsDecimal = newValue / value;
|
|
88
|
+
const remainFormatted = (0, import_timeHelper.toHoursAndMinutes)(remainHoursAsDecimal * 60);
|
|
89
|
+
await (adapter == null ? void 0 : adapter.setStateAsync(
|
|
90
|
+
`${productKey}.${deviceKey}.calculations.remainInputTime`,
|
|
91
|
+
remainFormatted,
|
|
92
|
+
true
|
|
93
|
+
));
|
|
73
94
|
}
|
|
95
|
+
} else {
|
|
96
|
+
await (adapter == null ? void 0 : adapter.setStateAsync(
|
|
97
|
+
`${productKey}.${deviceKey}.calculations.energyWhMax`,
|
|
98
|
+
newValue,
|
|
99
|
+
true
|
|
100
|
+
));
|
|
74
101
|
}
|
|
75
102
|
}
|
|
76
103
|
};
|
|
@@ -82,42 +109,46 @@ const calculateEnergy = async (adapter, productKey, deviceKey) => {
|
|
|
82
109
|
const currentPowerState = await (adapter == null ? void 0 : adapter.getStateAsync(stateNamePower));
|
|
83
110
|
const currentEnergyState = await (adapter == null ? void 0 : adapter.getStateAsync(stateNameEnergyWh));
|
|
84
111
|
if ((currentEnergyState == null ? void 0 : currentEnergyState.val) == 0) {
|
|
85
|
-
adapter == null ? void 0 : adapter.setStateAsync(stateNameEnergyWh, 1e-6, true);
|
|
112
|
+
await (adapter == null ? void 0 : adapter.setStateAsync(stateNameEnergyWh, 1e-6, true));
|
|
86
113
|
} else if (currentEnergyState && currentEnergyState.lc && currentPowerState && currentPowerState.val != void 0 && currentPowerState.val != null) {
|
|
87
|
-
const timeFrame =
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
114
|
+
const timeFrame = 3e4;
|
|
115
|
+
let addEnergyValue = Number(currentPowerState.val) * timeFrame / 36e5;
|
|
116
|
+
const chargingFactor = 0.96;
|
|
117
|
+
const dischargingFactor = 1.08 - addEnergyValue / 1e4;
|
|
118
|
+
addEnergyValue = stateKey == "outputPack" && addEnergyValue > 0 ? addEnergyValue * chargingFactor : addEnergyValue;
|
|
119
|
+
addEnergyValue = stateKey == "packInput" && addEnergyValue > 0 ? addEnergyValue * dischargingFactor : addEnergyValue;
|
|
120
|
+
let newEnergyValue = Number(currentEnergyState.val) + addEnergyValue;
|
|
121
|
+
if (newEnergyValue < 0) {
|
|
122
|
+
newEnergyValue = 0;
|
|
92
123
|
}
|
|
93
|
-
adapter == null ? void 0 : adapter.setStateAsync(stateNameEnergyWh,
|
|
94
|
-
adapter == null ? void 0 : adapter.setStateAsync(
|
|
124
|
+
await (adapter == null ? void 0 : adapter.setStateAsync(stateNameEnergyWh, newEnergyValue, true));
|
|
125
|
+
await (adapter == null ? void 0 : adapter.setStateAsync(
|
|
95
126
|
stateNameEnergykWh,
|
|
96
|
-
Number((
|
|
127
|
+
Number((newEnergyValue / 1e3).toFixed(2)),
|
|
97
128
|
true
|
|
98
|
-
);
|
|
99
|
-
if ((stateKey == "outputPack" || stateKey == "packInput") &&
|
|
100
|
-
calculateSocAndEnergy(
|
|
129
|
+
));
|
|
130
|
+
if ((stateKey == "outputPack" || stateKey == "packInput") && addEnergyValue > 0) {
|
|
131
|
+
await calculateSocAndEnergy(
|
|
101
132
|
adapter,
|
|
102
133
|
productKey,
|
|
103
134
|
deviceKey,
|
|
104
135
|
stateKey,
|
|
105
|
-
|
|
136
|
+
addEnergyValue
|
|
106
137
|
);
|
|
107
138
|
}
|
|
108
139
|
} else {
|
|
109
|
-
adapter == null ? void 0 : adapter.setStateAsync(stateNameEnergyWh, 0, true);
|
|
110
|
-
adapter == null ? void 0 : adapter.setStateAsync(stateNameEnergykWh, 0, true);
|
|
140
|
+
await (adapter == null ? void 0 : adapter.setStateAsync(stateNameEnergyWh, 0, true));
|
|
141
|
+
await (adapter == null ? void 0 : adapter.setStateAsync(stateNameEnergykWh, 0, true));
|
|
111
142
|
}
|
|
112
143
|
});
|
|
113
144
|
};
|
|
114
145
|
const resetTodaysValues = async (adapter) => {
|
|
115
146
|
adapter.deviceList.forEach((device) => {
|
|
116
|
-
calculationStateKeys.forEach((stateKey) => {
|
|
147
|
+
calculationStateKeys.forEach(async (stateKey) => {
|
|
117
148
|
const stateNameEnergyWh = `${device.productKey}.${device.deviceKey}.calculations.${stateKey}EnergyTodayWh`;
|
|
118
149
|
const stateNameEnergykWh = `${device.productKey}.${device.deviceKey}.calculations.${stateKey}EnergyTodaykWh`;
|
|
119
|
-
adapter == null ? void 0 : adapter.setStateAsync(stateNameEnergyWh, 0, true);
|
|
120
|
-
adapter == null ? void 0 : adapter.setStateAsync(stateNameEnergykWh, 0, true);
|
|
150
|
+
await (adapter == null ? void 0 : adapter.setStateAsync(stateNameEnergyWh, 0, true));
|
|
151
|
+
await (adapter == null ? void 0 : adapter.setStateAsync(stateNameEnergykWh, 0, true));
|
|
121
152
|
});
|
|
122
153
|
});
|
|
123
154
|
};
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/services/calculationService.ts"],
|
|
4
|
-
"sourcesContent": ["/* eslint-disable @typescript-eslint/indent */\r\n\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 \"solarInput\",\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 adapter?.setStateAsync(\r\n `${productKey}.${deviceKey}.calculations.energyWhMax`,\r\n currentEnergyState?.val,\r\n true,\r\n );\r\n }\r\n}
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;
|
|
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 \"solarInput\",\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?.setStateAsync(\r\n `${productKey}.${deviceKey}.calculations.energyWhMax`,\r\n currentEnergyState?.val,\r\n true,\r\n );\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 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 currentValue = currentEnergyState?.val\r\n ? Number(currentEnergyState?.val)\r\n : 0;\r\n\r\n const newValue =\r\n stateKey == \"outputPack\" ? currentValue + value : currentValue - value;\r\n\r\n if (newValue > 0) {\r\n adapter?.setState(\r\n `${productKey}.${deviceKey}.calculations.energyWh`,\r\n newValue,\r\n true,\r\n );\r\n\r\n if (currentEnergyMaxState) {\r\n const soc = Number(\r\n ((newValue / Number(currentEnergyMaxState.val)) * 100).toFixed(1),\r\n );\r\n\r\n await adapter?.setStateAsync(\r\n `${productKey}.${deviceKey}.calculations.soc`,\r\n soc > 100.0 ? 100 : soc,\r\n true,\r\n );\r\n\r\n if (newValue > Number(currentEnergyMaxState.val)) {\r\n // Extend maxVal\r\n await adapter?.setStateAsync(\r\n `${productKey}.${deviceKey}.calculations.energyWhMax`,\r\n newValue,\r\n true,\r\n );\r\n }\r\n\r\n if (stateKey == \"outputPack\") {\r\n // Charging, calculate remaining charging time\r\n const toCharge = Number(currentEnergyMaxState.val) - newValue;\r\n\r\n const remainHoursAsDecimal = toCharge / value;\r\n const remainFormatted = toHoursAndMinutes(remainHoursAsDecimal * 60);\r\n\r\n await adapter?.setStateAsync(\r\n `${productKey}.${deviceKey}.calculations.remainInputTime`,\r\n remainFormatted,\r\n true,\r\n );\r\n } else if (stateKey == \"packInput\") {\r\n // Discharging, calculate remaining discharge time\r\n const remainHoursAsDecimal = newValue / value;\r\n const remainFormatted = toHoursAndMinutes(remainHoursAsDecimal * 60);\r\n\r\n await adapter?.setStateAsync(\r\n `${productKey}.${deviceKey}.calculations.remainInputTime`,\r\n remainFormatted,\r\n true,\r\n );\r\n }\r\n } else {\r\n await adapter?.setStateAsync(\r\n `${productKey}.${deviceKey}.calculations.energyWhMax`,\r\n newValue,\r\n true,\r\n );\r\n }\r\n }\r\n};\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 const stateNameEnergyWh = `${productKey}.${deviceKey}.calculations.${stateKey}EnergyTodayWh`;\r\n const stateNameEnergykWh = `${productKey}.${deviceKey}.calculations.${stateKey}EnergyTodaykWh`;\r\n const stateNamePower = `${productKey}.${deviceKey}.${stateKey}Power`;\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?.setStateAsync(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 let 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?.setStateAsync(stateNameEnergyWh, newEnergyValue, true);\r\n await adapter?.setStateAsync(\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 }\r\n } else {\r\n await adapter?.setStateAsync(stateNameEnergyWh, 0, true);\r\n await adapter?.setStateAsync(stateNameEnergykWh, 0, true);\r\n }\r\n });\r\n};\r\n\r\nexport const resetTodaysValues = async (\r\n adapter: ZendureSolarflow,\r\n): Promise<void> => {\r\n adapter.deviceList.forEach((device: ISolarFlowDeviceDetails) => {\r\n calculationStateKeys.forEach(async (stateKey: string) => {\r\n const stateNameEnergyWh = `${device.productKey}.${device.deviceKey}.calculations.${stateKey}EnergyTodayWh`;\r\n const stateNameEnergykWh = `${device.productKey}.${device.deviceKey}.calculations.${stateKey}EnergyTodaykWh`;\r\n\r\n await adapter?.setStateAsync(stateNameEnergyWh, 0, true);\r\n await adapter?.setStateAsync(stateNameEnergykWh, 0, true);\r\n });\r\n });\r\n};\r\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -40,7 +40,7 @@ const startRefreshAccessTokenTimerJob = async (adapter) => {
|
|
|
40
40
|
(_a = (0, import_webService.login)(adapter)) == null ? void 0 : _a.then((_accessToken) => {
|
|
41
41
|
adapter.accessToken = _accessToken;
|
|
42
42
|
adapter.lastLogin = /* @__PURE__ */ new Date();
|
|
43
|
-
adapter.
|
|
43
|
+
adapter.setState("info.connection", true, true);
|
|
44
44
|
(0, import_mqttService.connectMqttClient)(adapter);
|
|
45
45
|
});
|
|
46
46
|
}
|
|
@@ -52,7 +52,7 @@ const startResetValuesJob = async (adapter) => {
|
|
|
52
52
|
});
|
|
53
53
|
};
|
|
54
54
|
const startCalculationJob = async (adapter) => {
|
|
55
|
-
adapter.calculationJob = (0, import_node_schedule.scheduleJob)("*/
|
|
55
|
+
adapter.calculationJob = (0, import_node_schedule.scheduleJob)("*/30 * * * * *", () => {
|
|
56
56
|
adapter.deviceList.forEach((device) => {
|
|
57
57
|
(0, import_calculationService.calculateEnergy)(adapter, device.productKey, device.deviceKey);
|
|
58
58
|
});
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/services/jobSchedule.ts"],
|
|
4
|
-
"sourcesContent": ["/* eslint-disable @typescript-eslint/indent */\r\nimport { scheduleJob } from \"node-schedule\";\r\nimport { ZendureSolarflow } from \"../main\";\r\nimport { connectMqttClient } from \"./mqttService\";\r\nimport { getDeviceList, login } from \"./webService\";\r\nimport { ISolarFlowDeviceDetails } from \"../models/ISolarFlowDeviceDetails\";\r\nimport { calculateEnergy, resetTodaysValues } from \"./calculationService\";\r\n\r\nexport const startRefreshAccessTokenTimerJob = async (adapter: ZendureSolarflow): Promise<void> => {\r\n adapter.refreshAccessTokenInterval = adapter.setInterval(() => {\r\n // Relogin at night to get a fresh accessToken!\r\n adapter.log.info(`[startRefreshAccessTokenTimerJob] Refreshing accessToken!`);\r\n\r\n if (adapter.mqttClient) {\r\n adapter.mqttClient.end();\r\n adapter.mqttClient = undefined;\r\n }\r\n\r\n if (adapter.config.userName && adapter.config.password) {\r\n login(adapter)?.then((_accessToken: string) => {\r\n adapter.accessToken = _accessToken;\r\n adapter.lastLogin = new Date();\r\n adapter.
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,2BAA4B;AAE5B,yBAAkC;AAClC,wBAAqC;AAErC,gCAAmD;AAE5C,MAAM,kCAAkC,OAAO,YAA6C;AACjG,UAAQ,6BAA6B,QAAQ,YAAY,MAAM;AATjE;AAWI,YAAQ,IAAI,KAAK,2DAA2D;AAE5E,QAAI,QAAQ,YAAY;AACtB,cAAQ,WAAW,IAAI;AACvB,cAAQ,aAAa;AAAA,IACvB;AAEA,QAAI,QAAQ,OAAO,YAAY,QAAQ,OAAO,UAAU;AACtD,yCAAM,OAAO,MAAb,mBAAgB,KAAK,CAAC,iBAAyB;AAC7C,gBAAQ,cAAc;AACtB,gBAAQ,YAAY,oBAAI,KAAK;AAC7B,gBAAQ,
|
|
4
|
+
"sourcesContent": ["/* eslint-disable @typescript-eslint/indent */\r\nimport { scheduleJob } from \"node-schedule\";\r\nimport { ZendureSolarflow } from \"../main\";\r\nimport { connectMqttClient } from \"./mqttService\";\r\nimport { getDeviceList, login } from \"./webService\";\r\nimport { ISolarFlowDeviceDetails } from \"../models/ISolarFlowDeviceDetails\";\r\nimport { calculateEnergy, resetTodaysValues } from \"./calculationService\";\r\n\r\nexport const startRefreshAccessTokenTimerJob = async (adapter: ZendureSolarflow): Promise<void> => {\r\n adapter.refreshAccessTokenInterval = adapter.setInterval(() => {\r\n // Relogin at night to get a fresh accessToken!\r\n adapter.log.info(`[startRefreshAccessTokenTimerJob] Refreshing accessToken!`);\r\n\r\n if (adapter.mqttClient) {\r\n adapter.mqttClient.end();\r\n adapter.mqttClient = undefined;\r\n }\r\n\r\n if (adapter.config.userName && adapter.config.password) {\r\n login(adapter)?.then((_accessToken: string) => {\r\n adapter.accessToken = _accessToken;\r\n adapter.lastLogin = new Date();\r\n adapter.setState(\"info.connection\", true, true);\r\n\r\n connectMqttClient(adapter);\r\n });\r\n }\r\n }, 3 * 60 * 60 * 1000)\r\n}\r\n\r\nexport const startResetValuesJob = async (\r\n adapter: ZendureSolarflow,\r\n): Promise<void> => {\r\n adapter.resetValuesJob = scheduleJob(\"5 0 0 * * *\", () => {\r\n // Reset Values\r\n resetTodaysValues(adapter);\r\n });\r\n};\r\n\r\nexport const startCalculationJob = async (\r\n adapter: ZendureSolarflow,\r\n): Promise<void> => {\r\n adapter.calculationJob = scheduleJob(\"*/30 * * * * *\", () => {\r\n adapter.deviceList.forEach((device) => {\r\n calculateEnergy(adapter, device.productKey, device.deviceKey);\r\n });\r\n });\r\n};\r\n\r\nexport const startCheckStatesJob = async (\r\n adapter: ZendureSolarflow,\r\n): Promise<void> => {\r\n // Check for states that has no updates in the last 5 minutes and set them to 0\r\n const statesToReset: string[] = [\r\n \"outputHomePower\",\r\n \"outputPackPower\",\r\n \"packInputPower\",\r\n \"solarInputPower\",\r\n ];\r\n\r\n adapter.checkStatesJob = scheduleJob(\"*/10 * * * *\", async () => {\r\n getDeviceList(adapter)\r\n .then((deviceList: ISolarFlowDeviceDetails[]) => {\r\n deviceList.forEach(async (device: ISolarFlowDeviceDetails) => {\r\n const lastUpdate = await adapter?.getStateAsync(\r\n device.productKey + \".\" + device.deviceKey + \".lastUpdate\",\r\n );\r\n\r\n const tenMinutesAgo = Date.now() / 1000 - 10 * 60; // Ten minutes ago\r\n\r\n if (\r\n lastUpdate &&\r\n lastUpdate.val &&\r\n Number(lastUpdate.val) < tenMinutesAgo\r\n ) {\r\n adapter.log.debug(\r\n `[checkStatesJob] Last update for deviceKey ${\r\n device.deviceKey\r\n } was at ${new Date(\r\n Number(lastUpdate),\r\n )}, checking for pseudo power values!`,\r\n );\r\n // State was not updated in the last 10 minutes... set states to 0\r\n await statesToReset.forEach(async (stateName: string) => {\r\n await adapter?.setStateAsync(\r\n device.productKey + \".\" + device.deviceKey + \".\" + stateName,\r\n 0,\r\n true,\r\n );\r\n });\r\n\r\n // set electricLevel from deviceList\r\n if (device.electricity) {\r\n await adapter?.setStateAsync(\r\n device.productKey + \".\" + device.deviceKey + \".electricLevel\",\r\n device.electricity,\r\n true,\r\n );\r\n }\r\n }\r\n });\r\n })\r\n .catch(() => {\r\n adapter.log?.error(\r\n \"[checkStatesJob] Retrieving device failedRetrieving device failed!\",\r\n );\r\n });\r\n });\r\n};\r\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,2BAA4B;AAE5B,yBAAkC;AAClC,wBAAqC;AAErC,gCAAmD;AAE5C,MAAM,kCAAkC,OAAO,YAA6C;AACjG,UAAQ,6BAA6B,QAAQ,YAAY,MAAM;AATjE;AAWI,YAAQ,IAAI,KAAK,2DAA2D;AAE5E,QAAI,QAAQ,YAAY;AACtB,cAAQ,WAAW,IAAI;AACvB,cAAQ,aAAa;AAAA,IACvB;AAEA,QAAI,QAAQ,OAAO,YAAY,QAAQ,OAAO,UAAU;AACtD,yCAAM,OAAO,MAAb,mBAAgB,KAAK,CAAC,iBAAyB;AAC7C,gBAAQ,cAAc;AACtB,gBAAQ,YAAY,oBAAI,KAAK;AAC7B,gBAAQ,SAAS,mBAAmB,MAAM,IAAI;AAE9C,kDAAkB,OAAO;AAAA,MAC3B;AAAA,IACF;AAAA,EACF,GAAG,IAAI,KAAK,KAAK,GAAI;AACvB;AAEO,MAAM,sBAAsB,OACjC,YACkB;AAClB,UAAQ,qBAAiB,kCAAY,eAAe,MAAM;AAExD,qDAAkB,OAAO;AAAA,EAC3B,CAAC;AACH;AAEO,MAAM,sBAAsB,OACjC,YACkB;AAClB,UAAQ,qBAAiB,kCAAY,kBAAkB,MAAM;AAC3D,YAAQ,WAAW,QAAQ,CAAC,WAAW;AACrC,qDAAgB,SAAS,OAAO,YAAY,OAAO,SAAS;AAAA,IAC9D,CAAC;AAAA,EACH,CAAC;AACH;AAEO,MAAM,sBAAsB,OACjC,YACkB;AAElB,QAAM,gBAA0B;AAAA,IAC9B;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,UAAQ,qBAAiB,kCAAY,gBAAgB,YAAY;AAC/D,yCAAc,OAAO,EAClB,KAAK,CAAC,eAA0C;AAC/C,iBAAW,QAAQ,OAAO,WAAoC;AAC5D,cAAM,aAAa,OAAM,mCAAS;AAAA,UAChC,OAAO,aAAa,MAAM,OAAO,YAAY;AAAA;AAG/C,cAAM,gBAAgB,KAAK,IAAI,IAAI,MAAO,KAAK;AAE/C,YACE,cACA,WAAW,OACX,OAAO,WAAW,GAAG,IAAI,eACzB;AACA,kBAAQ,IAAI;AAAA,YACV,8CACE,OAAO,SACT,WAAW,IAAI;AAAA,cACb,OAAO,UAAU;AAAA,YACnB,CAAC;AAAA,UACH;AAEA,gBAAM,cAAc,QAAQ,OAAO,cAAsB;AACvD,mBAAM,mCAAS;AAAA,cACb,OAAO,aAAa,MAAM,OAAO,YAAY,MAAM;AAAA,cACnD;AAAA,cACA;AAAA;AAAA,UAEJ,CAAC;AAGD,cAAI,OAAO,aAAa;AACtB,mBAAM,mCAAS;AAAA,cACb,OAAO,aAAa,MAAM,OAAO,YAAY;AAAA,cAC7C,OAAO;AAAA,cACP;AAAA;AAAA,UAEJ;AAAA,QACF;AAAA,MACF,CAAC;AAAA,IACH,CAAC,EACA,MAAM,MAAM;AAtGnB;AAuGQ,oBAAQ,QAAR,mBAAa;AAAA,QACX;AAAA;AAAA,IAEJ,CAAC;AAAA,EACL,CAAC;AACH;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|