iobroker.zendure-solarflow 1.12.1 → 1.12.3

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.
@@ -1,8 +1,13 @@
1
- <html>
1
+ <html lang="en">
2
2
  <head>
3
+ <meta charset="UTF-8" />
4
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
5
+ <title>Zendure SolarFlow Admin</title>
3
6
  <!-- Load ioBroker scripts and styles-->
4
7
  <link rel="stylesheet" type="text/css" href="../../css/adapter.css" />
5
8
  <script type="text/javascript" src="../../socket.io/socket.io.js"></script>
9
+ <link rel="stylesheet" type="text/css" href="../../css/adapter.css" />
10
+ <link rel="stylesheet" type="text/css" href="../../lib/css/materialize.css">
6
11
 
7
12
  <!-- Load our own files -->
8
13
  <link rel="stylesheet" type="text/css" href="style.css" />
@@ -15,4 +20,4 @@
15
20
  <!-- load compiled React scripts -->
16
21
  <script type="text/javascript" src="build/index.js"></script>
17
22
  </body>
18
- </html>
23
+ </html>
@@ -74,10 +74,16 @@ const setSocToZero = async (adapter, productKey, deviceKey) => {
74
74
  };
75
75
  const calculateSocAndEnergy = async (adapter, productKey, deviceKey, stateKey, value) => {
76
76
  var _a, _b, _c;
77
+ adapter.log.debug(
78
+ `[calculateSocAndEnergy] Calculating for: ${productKey}.${deviceKey} and stateKey ${stateKey}!`
79
+ );
77
80
  let energyWhMax = 0;
78
81
  const minSoc = (_a = await adapter.getStateAsync(`${productKey}.${deviceKey}.minSoc`)) == null ? void 0 : _a.val;
79
82
  const currentSoc = (_b = await adapter.getStateAsync(`${productKey}.${deviceKey}.electricLevel`)) == null ? void 0 : _b.val;
80
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
+ );
81
87
  return;
82
88
  }
83
89
  const productName = (_c = await adapter.getStateAsync(`${productKey}.${deviceKey}.productName`)) == null ? void 0 : _c.val;
@@ -115,6 +121,9 @@ const calculateSocAndEnergy = async (adapter, productKey, deviceKey, stateKey, v
115
121
  let newEnergyWh = stateKey == "outputPack" ? currentEnergyWh + value : currentEnergyWh - value;
116
122
  if (stateKey == "outputPack" && newEnergyWh > energyWhMax) {
117
123
  newEnergyWh = energyWhMax;
124
+ adapter.log.debug(
125
+ `[calculateSocAndEnergy] newEnergyWh (${newEnergyWh}) is greater than energyWhMax (${energyWhMax}), don't extend value!`
126
+ );
118
127
  }
119
128
  if (newEnergyWh > 0) {
120
129
  adapter == null ? void 0 : adapter.setState(
@@ -122,6 +131,9 @@ const calculateSocAndEnergy = async (adapter, productKey, deviceKey, stateKey, v
122
131
  newEnergyWh,
123
132
  true
124
133
  );
134
+ adapter.log.debug(
135
+ `[calculateSocAndEnergy] set '${productKey}.${deviceKey}.calculations.energyWh' to ${newEnergyWh}!`
136
+ );
125
137
  if (currentEnergyMaxState) {
126
138
  const soc = Number((newEnergyWh / currentMaxValue * 100).toFixed(1));
127
139
  await (adapter == null ? void 0 : adapter.setState(
@@ -271,35 +283,70 @@ const calculateEnergy = async (adapter, productKey, deviceKey) => {
271
283
  }
272
284
  });
273
285
  };
274
- const resetValuesForDevice = (adapter, device) => {
286
+ const resetValuesForDevice = (adapter, productKey, deviceKey) => {
275
287
  calculationStateKeys.forEach(async (stateKey) => {
276
288
  let stateNameEnergyWh = "";
277
289
  let stateNameEnergykWh = "";
278
290
  if (stateKey == "pvPower1") {
279
- stateNameEnergyWh = `${device.productKey}.${device.deviceKey}.calculations.solarInputPv1EnergyTodayWh`;
280
- stateNameEnergykWh = `${device.productKey}.${device.deviceKey}.calculations.solarInputPv1EnergyTodaykWh`;
291
+ stateNameEnergyWh = `${productKey}.${deviceKey}.calculations.solarInputPv1EnergyTodayWh`;
292
+ stateNameEnergykWh = `${productKey}.${deviceKey}.calculations.solarInputPv1EnergyTodaykWh`;
281
293
  } else if (stateKey == "pvPower2") {
282
- stateNameEnergyWh = `${device.productKey}.${device.deviceKey}.calculations.solarInputPv2EnergyTodayWh`;
283
- stateNameEnergykWh = `${device.productKey}.${device.deviceKey}.calculations.solarInputPv2EnergyTodaykWh`;
294
+ stateNameEnergyWh = `${productKey}.${deviceKey}.calculations.solarInputPv2EnergyTodayWh`;
295
+ stateNameEnergykWh = `${productKey}.${deviceKey}.calculations.solarInputPv2EnergyTodaykWh`;
284
296
  } else {
285
- stateNameEnergyWh = `${device.productKey}.${device.deviceKey}.calculations.${stateKey}EnergyTodayWh`;
286
- stateNameEnergykWh = `${device.productKey}.${device.deviceKey}.calculations.${stateKey}EnergyTodaykWh`;
297
+ stateNameEnergyWh = `${productKey}.${deviceKey}.calculations.${stateKey}EnergyTodayWh`;
298
+ stateNameEnergykWh = `${productKey}.${deviceKey}.calculations.${stateKey}EnergyTodaykWh`;
287
299
  }
288
300
  await (adapter == null ? void 0 : adapter.setState(stateNameEnergyWh, 0, true));
289
301
  await (adapter == null ? void 0 : adapter.setState(stateNameEnergykWh, 0, true));
290
302
  });
291
303
  };
292
304
  const resetTodaysValues = async (adapter) => {
293
- adapter.deviceList.forEach((device) => {
294
- resetValuesForDevice(adapter, device);
295
- if (device.packList && device.packList.length > 0) {
296
- device.packList.forEach(async (subDevice) => {
297
- if (subDevice.productName.toLocaleLowerCase() == "ace 1500") {
298
- resetValuesForDevice(adapter, subDevice);
299
- }
300
- });
305
+ if (adapter.config.server == "local") {
306
+ if (adapter.config.localDevice1ProductKey && adapter.config.localDevice1DeviceKey) {
307
+ resetValuesForDevice(
308
+ adapter,
309
+ adapter.config.localDevice1ProductKey,
310
+ adapter.config.localDevice1DeviceKey
311
+ );
301
312
  }
302
- });
313
+ if (adapter.config.localDevice2ProductKey && adapter.config.localDevice2DeviceKey) {
314
+ resetValuesForDevice(
315
+ adapter,
316
+ adapter.config.localDevice2ProductKey,
317
+ adapter.config.localDevice2DeviceKey
318
+ );
319
+ }
320
+ if (adapter.config.localDevice3ProductKey && adapter.config.localDevice3DeviceKey) {
321
+ resetValuesForDevice(
322
+ adapter,
323
+ adapter.config.localDevice3ProductKey,
324
+ adapter.config.localDevice3DeviceKey
325
+ );
326
+ }
327
+ if (adapter.config.localDevice4ProductKey && adapter.config.localDevice4DeviceKey) {
328
+ resetValuesForDevice(
329
+ adapter,
330
+ adapter.config.localDevice4ProductKey,
331
+ adapter.config.localDevice4DeviceKey
332
+ );
333
+ }
334
+ } else {
335
+ adapter.deviceList.forEach((device) => {
336
+ resetValuesForDevice(adapter, device.productKey, device.deviceKey);
337
+ if (device.packList && device.packList.length > 0) {
338
+ device.packList.forEach(async (subDevice) => {
339
+ if (subDevice.productName.toLocaleLowerCase() == "ace 1500") {
340
+ resetValuesForDevice(
341
+ adapter,
342
+ subDevice.productKey,
343
+ subDevice.deviceKey
344
+ );
345
+ }
346
+ });
347
+ }
348
+ });
349
+ }
303
350
  };
304
351
  // Annotate the CommonJS export names for ESM import in node:
305
352
  0 && (module.exports = {
@@ -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 { 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 let energyWhMax = 0;\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 return;\r\n }\r\n\r\n const productName = (\r\n await adapter.getStateAsync(`${productKey}.${deviceKey}.productName`)\r\n )?.val;\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 let isAio = false;\r\n // Check if device is an solarflow or hyper device. Don't use LowVoltageBlock on an ACE device?\r\n if (productName?.toString().toLowerCase().includes(\"aio\")) {\r\n isAio = true;\r\n }\r\n\r\n if (isAio) {\r\n energyWhMax = 2400;\r\n } else {\r\n for (let i = 0; i < batteries.length; i++) {\r\n if (batteries[i].type == \"AB1000\") {\r\n energyWhMax = energyWhMax + 960;\r\n } else if (batteries[i].type == \"AB2000\") {\r\n energyWhMax = energyWhMax + 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 (stateKey == \"outputPack\" && newEnergyWh > energyWhMax) {\r\n newEnergyWh = energyWhMax;\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 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 (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 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?.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 device: ISolarFlowDeviceDetails\r\n) => {\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 = `${device.productKey}.${device.deviceKey}.calculations.solarInputPv1EnergyTodayWh`;\r\n stateNameEnergykWh = `${device.productKey}.${device.deviceKey}.calculations.solarInputPv1EnergyTodaykWh`;\r\n } else if (stateKey == \"pvPower2\") {\r\n stateNameEnergyWh = `${device.productKey}.${device.deviceKey}.calculations.solarInputPv2EnergyTodayWh`;\r\n stateNameEnergykWh = `${device.productKey}.${device.deviceKey}.calculations.solarInputPv2EnergyTodaykWh`;\r\n } else {\r\n stateNameEnergyWh = `${device.productKey}.${device.deviceKey}.calculations.${stateKey}EnergyTodayWh`;\r\n stateNameEnergykWh = `${device.productKey}.${device.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 adapter.deviceList.forEach((device: ISolarFlowDeviceDetails) => {\r\n resetValuesForDevice(adapter, device);\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(adapter, subDevice);\r\n }\r\n });\r\n }\r\n });\r\n};\r\n"],
5
- "mappings": "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",
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 = 0;\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 productName = (\r\n await adapter.getStateAsync(`${productKey}.${deviceKey}.productName`)\r\n )?.val;\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 let isAio = false;\r\n // Check if device is an solarflow or hyper device. Don't use LowVoltageBlock on an ACE device?\r\n if (productName?.toString().toLowerCase().includes(\"aio\")) {\r\n isAio = true;\r\n }\r\n\r\n if (isAio) {\r\n energyWhMax = 2400;\r\n } else {\r\n for (let i = 0; i < batteries.length; i++) {\r\n if (batteries[i].type == \"AB1000\") {\r\n energyWhMax = energyWhMax + 960;\r\n } else if (batteries[i].type == \"AB2000\") {\r\n energyWhMax = energyWhMax + 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 (stateKey == \"outputPack\" && newEnergyWh > energyWhMax) {\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 (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 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?.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) => {\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": "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",
6
6
  "names": []
7
7
  }
@@ -60,6 +60,20 @@ const startCalculationJob = async (adapter) => {
60
60
  adapter.config.localDevice2DeviceKey
61
61
  );
62
62
  }
63
+ if (adapter.config.localDevice3ProductKey && adapter.config.localDevice3DeviceKey) {
64
+ (0, import_calculationService.calculateEnergy)(
65
+ adapter,
66
+ adapter.config.localDevice3ProductKey,
67
+ adapter.config.localDevice3DeviceKey
68
+ );
69
+ }
70
+ if (adapter.config.localDevice4ProductKey && adapter.config.localDevice4DeviceKey) {
71
+ (0, import_calculationService.calculateEnergy)(
72
+ adapter,
73
+ adapter.config.localDevice4ProductKey,
74
+ adapter.config.localDevice4DeviceKey
75
+ );
76
+ }
63
77
  } else {
64
78
  adapter.deviceList.forEach((device) => {
65
79
  if (device.productKey != "s3Xk4x") {
@@ -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 { ISolarFlowDeviceDetails } from \"../models/ISolarFlowDeviceDetails\";\r\nimport { calculateEnergy, resetTodaysValues } from \"./calculationService\";\r\n\r\nexport const startRefreshAccessTokenTimerJob = async (\r\n adapter: ZendureSolarflow\r\n): Promise<void> => {\r\n adapter.refreshAccessTokenInterval = adapter.setInterval(\r\n async () => {\r\n adapter.log.info(\r\n `Refresh Access Token - Adapter will restart in 20 seconds!`\r\n );\r\n\r\n await adapter.delay(20 * 1000);\r\n adapter.restart();\r\n },\r\n 3 * 60 * 60 * 1000\r\n );\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 if (adapter.config.server == \"local\") {\r\n if (\r\n adapter.config.localDevice1ProductKey &&\r\n adapter.config.localDevice1DeviceKey\r\n ) {\r\n calculateEnergy(\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 calculateEnergy(\r\n adapter,\r\n adapter.config.localDevice2ProductKey,\r\n adapter.config.localDevice2DeviceKey\r\n );\r\n }\r\n } else {\r\n adapter.deviceList.forEach((device) => {\r\n if (device.productKey != \"s3Xk4x\") {\r\n calculateEnergy(adapter, device.productKey, device.deviceKey);\r\n\r\n // Check if connected with ACE, then calculate also for ACE device\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 calculateEnergy(\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 });\r\n};\r\n\r\nexport const startCheckStatesAndConnectionJob = 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 \"gridInputPower\",\r\n \"packInputPower\",\r\n \"solarInputPower\",\r\n ];\r\n\r\n let refreshAccessTokenNeeded = false;\r\n\r\n adapter.log.debug(\r\n `[checkStatesJob] Starting check of states and connection!`\r\n );\r\n\r\n adapter.checkStatesJob = scheduleJob(\"*/5 * * * *\", async () => {\r\n adapter.deviceList.forEach(async (device: ISolarFlowDeviceDetails) => {\r\n if (refreshAccessTokenNeeded) {\r\n return;\r\n }\r\n\r\n const lastUpdate = await adapter?.getStateAsync(\r\n device.productKey + \".\" + device.deviceKey + \".lastUpdate\"\r\n );\r\n\r\n const wifiState = await adapter?.getStateAsync(\r\n device.productKey + \".\" + device.deviceKey + \".wifiState\"\r\n );\r\n\r\n const fiveMinutesAgo = (Date.now() / 1000 - 5 * 60) * 1000; // Five minutes ago\r\n const tenMinutesAgo = (Date.now() / 1000 - 10 * 60) * 1000; // Ten minutes ago\r\n\r\n if (\r\n lastUpdate &&\r\n lastUpdate.val &&\r\n Number(lastUpdate.val) < fiveMinutesAgo &&\r\n wifiState?.val == \"Connected\"\r\n ) {\r\n adapter.log.warn(\r\n `[checkStatesJob] Last update for deviceKey ${\r\n device.deviceKey\r\n } was at ${new Date(\r\n Number(lastUpdate)\r\n )}, device seems to be online - so maybe connection is broken - restart adapter in 20 seconds!`\r\n );\r\n\r\n await adapter.delay(20 * 1000);\r\n adapter.restart();\r\n\r\n // set marker, so we discontinue the forEach Loop because of reconnect!\r\n refreshAccessTokenNeeded = true;\r\n }\r\n\r\n if (\r\n lastUpdate &&\r\n lastUpdate.val &&\r\n Number(lastUpdate.val) < tenMinutesAgo &&\r\n !refreshAccessTokenNeeded\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?.setState(\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?.setState(\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};\r\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["/* eslint-disable @typescript-eslint/indent */\r\nimport { scheduleJob } from \"node-schedule\";\r\nimport { ZendureSolarflow } from \"../main\";\r\nimport { ISolarFlowDeviceDetails } from \"../models/ISolarFlowDeviceDetails\";\r\nimport { calculateEnergy, resetTodaysValues } from \"./calculationService\";\r\n\r\nexport const startRefreshAccessTokenTimerJob = async (\r\n adapter: ZendureSolarflow\r\n): Promise<void> => {\r\n adapter.refreshAccessTokenInterval = adapter.setInterval(\r\n async () => {\r\n adapter.log.info(\r\n `Refresh Access Token - Adapter will restart in 20 seconds!`\r\n );\r\n\r\n await adapter.delay(20 * 1000);\r\n adapter.restart();\r\n },\r\n 3 * 60 * 60 * 1000\r\n );\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 if (adapter.config.server == \"local\") {\r\n if (\r\n adapter.config.localDevice1ProductKey &&\r\n adapter.config.localDevice1DeviceKey\r\n ) {\r\n calculateEnergy(\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 calculateEnergy(\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 calculateEnergy(\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 calculateEnergy(\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) => {\r\n if (device.productKey != \"s3Xk4x\") {\r\n calculateEnergy(adapter, device.productKey, device.deviceKey);\r\n\r\n // Check if connected with ACE, then calculate also for ACE device\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 calculateEnergy(\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 });\r\n};\r\n\r\nexport const startCheckStatesAndConnectionJob = 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 \"gridInputPower\",\r\n \"packInputPower\",\r\n \"solarInputPower\",\r\n ];\r\n\r\n let refreshAccessTokenNeeded = false;\r\n\r\n adapter.log.debug(\r\n `[checkStatesJob] Starting check of states and connection!`\r\n );\r\n\r\n adapter.checkStatesJob = scheduleJob(\"*/5 * * * *\", async () => {\r\n adapter.deviceList.forEach(async (device: ISolarFlowDeviceDetails) => {\r\n if (refreshAccessTokenNeeded) {\r\n return;\r\n }\r\n\r\n const lastUpdate = await adapter?.getStateAsync(\r\n device.productKey + \".\" + device.deviceKey + \".lastUpdate\"\r\n );\r\n\r\n const wifiState = await adapter?.getStateAsync(\r\n device.productKey + \".\" + device.deviceKey + \".wifiState\"\r\n );\r\n\r\n const fiveMinutesAgo = (Date.now() / 1000 - 5 * 60) * 1000; // Five minutes ago\r\n const tenMinutesAgo = (Date.now() / 1000 - 10 * 60) * 1000; // Ten minutes ago\r\n\r\n if (\r\n lastUpdate &&\r\n lastUpdate.val &&\r\n Number(lastUpdate.val) < fiveMinutesAgo &&\r\n wifiState?.val == \"Connected\"\r\n ) {\r\n adapter.log.warn(\r\n `[checkStatesJob] Last update for deviceKey ${\r\n device.deviceKey\r\n } was at ${new Date(\r\n Number(lastUpdate)\r\n )}, device seems to be online - so maybe connection is broken - restart adapter in 20 seconds!`\r\n );\r\n\r\n await adapter.delay(20 * 1000);\r\n adapter.restart();\r\n\r\n // set marker, so we discontinue the forEach Loop because of reconnect!\r\n refreshAccessTokenNeeded = true;\r\n }\r\n\r\n if (\r\n lastUpdate &&\r\n lastUpdate.val &&\r\n Number(lastUpdate.val) < tenMinutesAgo &&\r\n !refreshAccessTokenNeeded\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?.setState(\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?.setState(\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};\r\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -1084,13 +1084,47 @@ const connectLocalMqttClient = (_adapter) => {
1084
1084
  adapter.config.localDevice2DeviceKey
1085
1085
  );
1086
1086
  subscribeReportTopic(
1087
- adapter.config.localDevice1ProductKey,
1088
- adapter.config.localDevice1DeviceKey,
1087
+ adapter.config.localDevice2ProductKey,
1088
+ adapter.config.localDevice2DeviceKey,
1089
1089
  2e3
1090
1090
  );
1091
1091
  subscribeIotTopic(
1092
- adapter.config.localDevice1ProductKey,
1093
- adapter.config.localDevice1DeviceKey,
1092
+ adapter.config.localDevice2ProductKey,
1093
+ adapter.config.localDevice2DeviceKey,
1094
+ 2e3
1095
+ );
1096
+ }
1097
+ if (adapter.config.localDevice3ProductKey && adapter.config.localDevice3DeviceKey) {
1098
+ (0, import_createSolarFlowLocalStates.createSolarFlowLocalStates)(
1099
+ adapter,
1100
+ adapter.config.localDevice3ProductKey,
1101
+ adapter.config.localDevice3DeviceKey
1102
+ );
1103
+ subscribeReportTopic(
1104
+ adapter.config.localDevice3ProductKey,
1105
+ adapter.config.localDevice3DeviceKey,
1106
+ 2e3
1107
+ );
1108
+ subscribeIotTopic(
1109
+ adapter.config.localDevice3ProductKey,
1110
+ adapter.config.localDevice3DeviceKey,
1111
+ 2e3
1112
+ );
1113
+ }
1114
+ if (adapter.config.localDevice4ProductKey && adapter.config.localDevice4DeviceKey) {
1115
+ (0, import_createSolarFlowLocalStates.createSolarFlowLocalStates)(
1116
+ adapter,
1117
+ adapter.config.localDevice4ProductKey,
1118
+ adapter.config.localDevice4DeviceKey
1119
+ );
1120
+ subscribeReportTopic(
1121
+ adapter.config.localDevice4ProductKey,
1122
+ adapter.config.localDevice4DeviceKey,
1123
+ 2e3
1124
+ );
1125
+ subscribeIotTopic(
1126
+ adapter.config.localDevice4ProductKey,
1127
+ adapter.config.localDevice4DeviceKey,
1094
1128
  2e3
1095
1129
  );
1096
1130
  }