iobroker.zendure-solarflow 1.1.18 → 1.1.21
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 +3 -3
- package/build/main.js +1 -5
- package/build/main.js.map +2 -2
- package/build/services/calculationService.js +1 -1
- package/build/services/calculationService.js.map +2 -2
- package/io-package.json +40 -40
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -38,9 +38,9 @@ If you find the adapter useful for you and want to support my work, feel free to
|
|
|
38
38
|
[](https://www.paypal.com/paypalme/PeterFrommert)
|
|
39
39
|
|
|
40
40
|
## Changelog
|
|
41
|
-
### 1.1.
|
|
41
|
+
### 1.1.21 (2024-03-08)
|
|
42
42
|
|
|
43
|
-
- Fix
|
|
43
|
+
- Fix calculation timeframe
|
|
44
44
|
|
|
45
45
|
### 1.1.17 (2024-03-08)
|
|
46
46
|
|
|
@@ -112,7 +112,7 @@ If you find the adapter useful for you and want to support my work, feel free to
|
|
|
112
112
|
|
|
113
113
|
### 1.0.1 (2023-11-03)
|
|
114
114
|
|
|
115
|
-
- Fix
|
|
115
|
+
- Fix translationscd so
|
|
116
116
|
- Use 'extendObjectAsync' instead of 'setObjectNotExistsAsync'
|
|
117
117
|
- First official release version
|
|
118
118
|
|
package/build/main.js
CHANGED
|
@@ -61,11 +61,7 @@ class ZendureSolarflow extends utils.Adapter {
|
|
|
61
61
|
*/
|
|
62
62
|
async onReady() {
|
|
63
63
|
var _a;
|
|
64
|
-
|
|
65
|
-
this.paths = import_paths.pathsEu;
|
|
66
|
-
} else {
|
|
67
|
-
this.paths = import_paths.pathsGlobal;
|
|
68
|
-
}
|
|
64
|
+
this.paths = import_paths.pathsGlobal;
|
|
69
65
|
if (this.config.userName && this.config.password) {
|
|
70
66
|
(_a = (0, import_webService.login)(this)) == null ? void 0 : _a.then((_accessToken) => {
|
|
71
67
|
this.accessToken = _accessToken;
|
package/build/main.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/main.ts"],
|
|
4
|
-
"sourcesContent": ["/* eslint-disable @typescript-eslint/indent */\r\n/*\r\n * Created with @iobroker/create-adapter v2.5.0\r\n */\r\n\r\n// The adapter-core module gives you access to the core ioBroker functions\r\n// you need to create an adapter\r\nimport * as utils from \"@iobroker/adapter-core\";\r\nimport {\r\n connectMqttClient,\r\n setChargeLimit,\r\n setDischargeLimit,\r\n setOutputLimit,\r\n} from \"./services/mqttService\";\r\nimport { getDeviceList, login } from \"./services/webService\";\r\nimport { ISolarFlowDeviceDetails } from \"./models/ISolarFlowDeviceDetails\";\r\nimport { ISolarFlowPaths } from \"./models/ISolarFlowPaths\";\r\nimport {
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAOA,YAAuB;AACvB,yBAKO;AACP,wBAAqC;AAGrC,
|
|
4
|
+
"sourcesContent": ["/* eslint-disable @typescript-eslint/indent */\r\n/*\r\n * Created with @iobroker/create-adapter v2.5.0\r\n */\r\n\r\n// The adapter-core module gives you access to the core ioBroker functions\r\n// you need to create an adapter\r\nimport * as utils from \"@iobroker/adapter-core\";\r\nimport {\r\n connectMqttClient,\r\n setChargeLimit,\r\n setDischargeLimit,\r\n setOutputLimit,\r\n} from \"./services/mqttService\";\r\nimport { getDeviceList, login } from \"./services/webService\";\r\nimport { ISolarFlowDeviceDetails } from \"./models/ISolarFlowDeviceDetails\";\r\nimport { ISolarFlowPaths } from \"./models/ISolarFlowPaths\";\r\nimport { pathsGlobal } from \"./constants/paths\";\r\nimport { Job } from \"node-schedule\";\r\nimport {\r\n startCalculationJob,\r\n startCheckStatesJob,\r\n startReloginAndResetValuesJob,\r\n} from \"./services/jobSchedule\";\r\nimport { MqttClient } from \"mqtt\";\r\n\r\nexport class ZendureSolarflow extends utils.Adapter {\r\n public constructor(options: Partial<utils.AdapterOptions> = {}) {\r\n super({\r\n ...options,\r\n name: \"zendure-solarflow\",\r\n });\r\n this.on(\"ready\", this.onReady.bind(this));\r\n this.on(\"stateChange\", this.onStateChange.bind(this));\r\n this.on(\"unload\", this.onUnload.bind(this));\r\n }\r\n\r\n public accessToken: string | undefined = undefined; // Access Token for Zendure Rest API\r\n public deviceList: ISolarFlowDeviceDetails[] = [];\r\n public paths: ISolarFlowPaths | undefined = undefined;\r\n public interval: ioBroker.Interval | undefined = undefined;\r\n public lastLogin: Date | undefined = undefined;\r\n\r\n public mqttClient: MqttClient | undefined = undefined;\r\n\r\n public resetValuesJob: Job | undefined = undefined;\r\n public checkStatesJob: Job | undefined = undefined;\r\n public calculationJob: Job | undefined = undefined;\r\n\r\n /**\r\n * Is called when databases are connected and adapter received configuration.\r\n */\r\n private async onReady(): Promise<void> {\r\n // Select paths by config value\r\n //if (this.config.server && this.config.server == \"eu\") {\r\n // this.paths = pathsEu;\r\n //} else {\r\n this.paths = pathsGlobal;\r\n //}\r\n\r\n // If Username and Password is provided, try to login and get the access token.\r\n if (this.config.userName && this.config.password) {\r\n login(this)\r\n ?.then((_accessToken: string) => {\r\n this.accessToken = _accessToken;\r\n\r\n this.connected = true;\r\n this.lastLogin = new Date();\r\n\r\n // Try to get the device list\r\n getDeviceList(this)\r\n .then((result: ISolarFlowDeviceDetails[]) => {\r\n if (result) {\r\n // Device List found. Save in the adapter properties and connect to MQTT\r\n this.deviceList = result;\r\n connectMqttClient(this);\r\n\r\n // Schedule Job\r\n startReloginAndResetValuesJob(this);\r\n startCheckStatesJob(this);\r\n startCalculationJob(this);\r\n }\r\n })\r\n .catch(() => {\r\n this.connected = false;\r\n this.log?.error(\"[onReady] Retrieving device failed!\");\r\n });\r\n })\r\n .catch((error) => {\r\n this.connected = false;\r\n this.log.error(\r\n \"[onReady] Logon error at Zendure cloud service! Error: \" +\r\n error.toString(),\r\n );\r\n });\r\n } else {\r\n this.connected = false;\r\n this.log.error(\"[onReady] No Login Information provided!\");\r\n //this.stop?.();\r\n }\r\n }\r\n\r\n /**\r\n * Is called when adapter shuts down - callback has to be called under any circumstances!\r\n */\r\n private onUnload(callback: () => void): void {\r\n try {\r\n if (this.interval) {\r\n this.clearInterval(this.interval);\r\n }\r\n\r\n // Scheduler beenden\r\n if (this.resetValuesJob) {\r\n this.resetValuesJob.cancel();\r\n this.resetValuesJob = undefined;\r\n }\r\n\r\n if (this.checkStatesJob) {\r\n this.checkStatesJob?.cancel();\r\n this.checkStatesJob = undefined;\r\n }\r\n\r\n if (this.calculationJob) {\r\n this.calculationJob.cancel();\r\n this.calculationJob = undefined;\r\n }\r\n\r\n callback();\r\n } catch (e) {\r\n callback();\r\n }\r\n }\r\n\r\n /**\r\n * Is called if a subscribed state changes\r\n */\r\n private onStateChange(\r\n id: string,\r\n state: ioBroker.State | null | undefined,\r\n ): void {\r\n if (state) {\r\n // The state was changed\r\n //this.log.debug(`state ${id} changed: ${state.val} (ack = ${state.ack})`);\r\n\r\n // Read product and device key from string\r\n const splitted = id.split(\".\");\r\n const productKey = splitted[2];\r\n const deviceKey = splitted[3];\r\n const stateName1 = splitted[4];\r\n const stateName2 = splitted[5];\r\n\r\n if (state.val != undefined && state.val != null) {\r\n switch (stateName1) {\r\n case \"control\":\r\n if (stateName2 == \"setOutputLimit\") {\r\n setOutputLimit(this, productKey, deviceKey, Number(state.val));\r\n } else if (stateName2 == \"dischargeLimit\") {\r\n setDischargeLimit(this, productKey, deviceKey, Number(state.val));\r\n } else if (stateName2 == \"chargeLimit\") {\r\n setChargeLimit(this, productKey, deviceKey, Number(state.val));\r\n } else if (stateName2 == \"lowVoltageBlock\") {\r\n if (this.config.useLowVoltageBlock) {\r\n if (state.val == true) {\r\n // Low Voltage Block activated, stop power input\r\n setOutputLimit(this, productKey, deviceKey, 0);\r\n }\r\n }\r\n }\r\n break;\r\n default:\r\n break;\r\n }\r\n } else {\r\n // The state was deleted\r\n this.log.debug(`state ${id} deleted`);\r\n }\r\n }\r\n }\r\n}\r\n\r\nif (require.main !== module) {\r\n // Export the constructor in compact mode\r\n module.exports = (options: Partial<utils.AdapterOptions> | undefined) =>\r\n new ZendureSolarflow(options);\r\n} else {\r\n // otherwise start the instance directly\r\n (() => new ZendureSolarflow())();\r\n}\r\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["_a"]
|
|
7
7
|
}
|
|
@@ -71,7 +71,7 @@ const calculateEnergy = async (adapter, productKey, deviceKey) => {
|
|
|
71
71
|
if ((currentEnergyState == null ? void 0 : currentEnergyState.val) == 0) {
|
|
72
72
|
adapter == null ? void 0 : adapter.setStateAsync(stateNameEnergyWh, 1e-6, true);
|
|
73
73
|
} else if (currentEnergyState && currentEnergyState.lc && currentPowerState && currentPowerState.val != void 0 && currentPowerState.val != null) {
|
|
74
|
-
const timeFrame =
|
|
74
|
+
const timeFrame = 1e4;
|
|
75
75
|
const addValue = Number(currentPowerState.val) * timeFrame / 36e5;
|
|
76
76
|
let newValue = Number(currentEnergyState.val) + addValue;
|
|
77
77
|
if (newValue < 0) {
|
|
@@ -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 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?.setStateAsync(\r\n `${productKey}.${deviceKey}.calculations.energyWh`,\r\n newValue,\r\n true,\r\n );\r\n\r\n if (currentEnergyMaxState) {\r\n const soc = (newValue / Number(currentEnergyMaxState.val)) * 100;\r\n adapter?.setStateAsync(\r\n `${productKey}.${deviceKey}.calculations.soc`,\r\n soc,\r\n true,\r\n );\r\n\r\n if (newValue > Number(currentEnergyMaxState.val)) {\r\n // Extend maxVal\r\n 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\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 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 const timeFrame = Date.now() / 1000
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAKA,MAAM,uBAAuB;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEO,MAAM,wBAAwB,OACnC,SACA,YACA,WACA,UACA,UACkB;AAClB,QAAM,qBAAqB,OAAM,mCAAS;AAAA,IACxC,aAAa,MAAM,YAAY;AAAA;AAGjC,QAAM,wBAAwB,OAAM,mCAAS;AAAA,IAC3C,aAAa,MAAM,YAAY;AAAA;AAGjC,QAAM,gBAAe,yDAAoB,OACrC,OAAO,yDAAoB,GAAG,IAC9B;AAEJ,QAAM,WACJ,YAAY,eAAe,eAAe,QAAQ,eAAe;AAEnE,MAAI,WAAW,GAAG;AAChB,uCAAS;AAAA,MACP,GAAG,UAAU,IAAI,SAAS;AAAA,MAC1B;AAAA,MACA;AAAA;AAGF,QAAI,uBAAuB;AACzB,YAAM,MAAO,WAAW,OAAO,sBAAsB,GAAG,IAAK;AAC7D,yCAAS;AAAA,QACP,GAAG,UAAU,IAAI,SAAS;AAAA,QAC1B;AAAA,QACA;AAAA;AAGF,UAAI,WAAW,OAAO,sBAAsB,GAAG,GAAG;AAEhD,2CAAS;AAAA,UACP,GAAG,UAAU,IAAI,SAAS;AAAA,UAC1B;AAAA,UACA;AAAA;AAAA,MAEJ;AAAA,IACF;AAAA,EACF;AACF;AAEO,MAAM,kBAAkB,OAC7B,SACA,YACA,cACkB;AAClB,uBAAqB,QAAQ,OAAO,aAAa;AAC/C,UAAM,oBAAoB,GAAG,UAAU,IAAI,SAAS,iBAAiB,QAAQ;AAC7E,UAAM,qBAAqB,GAAG,UAAU,IAAI,SAAS,iBAAiB,QAAQ;AAC9E,UAAM,iBAAiB,GAAG,UAAU,IAAI,SAAS,IAAI,QAAQ;AAE7D,UAAM,oBAAoB,OAAM,mCAAS,cAAc;AACvD,UAAM,qBAAqB,OAAM,mCAAS,cAAc;AAExD,SAAI,yDAAoB,QAAO,GAAG;AAEhC,yCAAS,cAAc,mBAAmB,MAAU;AAAA,IACtD,WACE,sBACA,mBAAmB,MACnB,qBACA,kBAAkB,OAAO,UACzB,kBAAkB,OAAO,MACzB;
|
|
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 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?.setStateAsync(\r\n `${productKey}.${deviceKey}.calculations.energyWh`,\r\n newValue,\r\n true,\r\n );\r\n\r\n if (currentEnergyMaxState) {\r\n const soc = (newValue / Number(currentEnergyMaxState.val)) * 100;\r\n adapter?.setStateAsync(\r\n `${productKey}.${deviceKey}.calculations.soc`,\r\n soc,\r\n true,\r\n );\r\n\r\n if (newValue > Number(currentEnergyMaxState.val)) {\r\n // Extend maxVal\r\n 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\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 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 = 10000ms, Job runs every 10 seconds...\r\n const timeFrame = 10000;\r\n\r\n /* console.log(\r\n `LC = ${currentEnergyState?.lc}, DateNow / 1000 = ${\r\n Date.now() / 1000\r\n } / DIFF = ${timeFrame}`,\r\n ); */\r\n\r\n const addValue = (Number(currentPowerState.val) * timeFrame) / 3600000; // Wh\r\n let newValue = Number(currentEnergyState.val) + addValue;\r\n\r\n // Fix negative value\r\n if (newValue < 0) {\r\n newValue = 0;\r\n }\r\n\r\n adapter?.setStateAsync(stateNameEnergyWh, newValue, true);\r\n adapter?.setStateAsync(\r\n stateNameEnergykWh,\r\n Number((newValue / 1000).toFixed(2)),\r\n true,\r\n );\r\n\r\n // SOC and energy in batteries\r\n if (stateKey == \"outputPack\" || stateKey == \"packInput\") {\r\n calculateSocAndEnergy(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n stateKey,\r\n addValue,\r\n );\r\n }\r\n } else {\r\n adapter?.setStateAsync(stateNameEnergyWh, 0, true);\r\n 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((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 adapter?.setStateAsync(stateNameEnergyWh, 0, true);\r\n adapter?.setStateAsync(stateNameEnergykWh, 0, true);\r\n });\r\n });\r\n};\r\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAKA,MAAM,uBAAuB;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEO,MAAM,wBAAwB,OACnC,SACA,YACA,WACA,UACA,UACkB;AAClB,QAAM,qBAAqB,OAAM,mCAAS;AAAA,IACxC,aAAa,MAAM,YAAY;AAAA;AAGjC,QAAM,wBAAwB,OAAM,mCAAS;AAAA,IAC3C,aAAa,MAAM,YAAY;AAAA;AAGjC,QAAM,gBAAe,yDAAoB,OACrC,OAAO,yDAAoB,GAAG,IAC9B;AAEJ,QAAM,WACJ,YAAY,eAAe,eAAe,QAAQ,eAAe;AAEnE,MAAI,WAAW,GAAG;AAChB,uCAAS;AAAA,MACP,GAAG,UAAU,IAAI,SAAS;AAAA,MAC1B;AAAA,MACA;AAAA;AAGF,QAAI,uBAAuB;AACzB,YAAM,MAAO,WAAW,OAAO,sBAAsB,GAAG,IAAK;AAC7D,yCAAS;AAAA,QACP,GAAG,UAAU,IAAI,SAAS;AAAA,QAC1B;AAAA,QACA;AAAA;AAGF,UAAI,WAAW,OAAO,sBAAsB,GAAG,GAAG;AAEhD,2CAAS;AAAA,UACP,GAAG,UAAU,IAAI,SAAS;AAAA,UAC1B;AAAA,UACA;AAAA;AAAA,MAEJ;AAAA,IACF;AAAA,EACF;AACF;AAEO,MAAM,kBAAkB,OAC7B,SACA,YACA,cACkB;AAClB,uBAAqB,QAAQ,OAAO,aAAa;AAC/C,UAAM,oBAAoB,GAAG,UAAU,IAAI,SAAS,iBAAiB,QAAQ;AAC7E,UAAM,qBAAqB,GAAG,UAAU,IAAI,SAAS,iBAAiB,QAAQ;AAC9E,UAAM,iBAAiB,GAAG,UAAU,IAAI,SAAS,IAAI,QAAQ;AAE7D,UAAM,oBAAoB,OAAM,mCAAS,cAAc;AACvD,UAAM,qBAAqB,OAAM,mCAAS,cAAc;AAExD,SAAI,yDAAoB,QAAO,GAAG;AAEhC,yCAAS,cAAc,mBAAmB,MAAU;AAAA,IACtD,WACE,sBACA,mBAAmB,MACnB,qBACA,kBAAkB,OAAO,UACzB,kBAAkB,OAAO,MACzB;AAEA,YAAM,YAAY;AAQlB,YAAM,WAAY,OAAO,kBAAkB,GAAG,IAAI,YAAa;AAC/D,UAAI,WAAW,OAAO,mBAAmB,GAAG,IAAI;AAGhD,UAAI,WAAW,GAAG;AAChB,mBAAW;AAAA,MACb;AAEA,yCAAS,cAAc,mBAAmB,UAAU;AACpD,yCAAS;AAAA,QACP;AAAA,QACA,QAAQ,WAAW,KAAM,QAAQ,CAAC,CAAC;AAAA,QACnC;AAAA;AAIF,UAAI,YAAY,gBAAgB,YAAY,aAAa;AACvD;AAAA,UACE;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,IACF,OAAO;AACL,yCAAS,cAAc,mBAAmB,GAAG;AAC7C,yCAAS,cAAc,oBAAoB,GAAG;AAAA,IAChD;AAAA,EACF,CAAC;AACH;AAEO,MAAM,oBAAoB,OAC/B,YACkB;AAClB,UAAQ,WAAW,QAAQ,CAAC,WAAoC;AAC9D,yBAAqB,QAAQ,CAAC,aAAqB;AACjD,YAAM,oBAAoB,GAAG,OAAO,UAAU,IAAI,OAAO,SAAS,iBAAiB,QAAQ;AAC3F,YAAM,qBAAqB,GAAG,OAAO,UAAU,IAAI,OAAO,SAAS,iBAAiB,QAAQ;AAE5F,yCAAS,cAAc,mBAAmB,GAAG;AAC7C,yCAAS,cAAc,oBAAoB,GAAG;AAAA,IAChD,CAAC;AAAA,EACH,CAAC;AACH;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/io-package.json
CHANGED
|
@@ -1,8 +1,47 @@
|
|
|
1
1
|
{
|
|
2
2
|
"common": {
|
|
3
3
|
"name": "zendure-solarflow",
|
|
4
|
-
"version": "1.1.
|
|
4
|
+
"version": "1.1.21",
|
|
5
5
|
"news": {
|
|
6
|
+
"1.1.21": {
|
|
7
|
+
"en": "Fix calculation timeframe",
|
|
8
|
+
"de": "Berechnungs-Zeitrahmen",
|
|
9
|
+
"ru": "График расчета",
|
|
10
|
+
"pt": "Tempo de cálculo fixo",
|
|
11
|
+
"nl": "De berekeningsperiode vaststellen",
|
|
12
|
+
"fr": "Fixer le délai de calcul",
|
|
13
|
+
"it": "Fissare il tempo di calcolo",
|
|
14
|
+
"es": "Plazo de cálculo fijo",
|
|
15
|
+
"pl": "Poprawiony harmonogram obliczeń",
|
|
16
|
+
"uk": "Фіксація графіка розрахунку",
|
|
17
|
+
"zh-cn": "固定计算时限"
|
|
18
|
+
},
|
|
19
|
+
"1.1.20": {
|
|
20
|
+
"en": "Fix negative values in calculation",
|
|
21
|
+
"de": "Negative Werte in der Berechnung festsetzen",
|
|
22
|
+
"ru": "Исправление отрицательных значений в расчетах",
|
|
23
|
+
"pt": "Corrigir valores negativos no cálculo",
|
|
24
|
+
"nl": "Vaststellen van negatieve waarden bij de berekening",
|
|
25
|
+
"fr": "Fixer des valeurs négatives dans le calcul",
|
|
26
|
+
"it": "Fissare i valori negativi nel calcolo",
|
|
27
|
+
"es": "Fijar valores negativos en el cálculo",
|
|
28
|
+
"pl": "Popraw wartości ujemne w obliczeniach",
|
|
29
|
+
"uk": "Виправлення негативних значень при розрахунку",
|
|
30
|
+
"zh-cn": "在计算中修正负值"
|
|
31
|
+
},
|
|
32
|
+
"1.1.19": {
|
|
33
|
+
"en": "Fix negative values in calculation",
|
|
34
|
+
"de": "Negative Werte in der Berechnung festsetzen",
|
|
35
|
+
"ru": "Исправление отрицательных значений в расчетах",
|
|
36
|
+
"pt": "Corrigir valores negativos no cálculo",
|
|
37
|
+
"nl": "Vaststellen van negatieve waarden bij de berekening",
|
|
38
|
+
"fr": "Fixer des valeurs négatives dans le calcul",
|
|
39
|
+
"it": "Fissare i valori negativi nel calcolo",
|
|
40
|
+
"es": "Fijar valores negativos en el cálculo",
|
|
41
|
+
"pl": "Popraw wartości ujemne w obliczeniach",
|
|
42
|
+
"uk": "Виправлення негативних значень при розрахунку",
|
|
43
|
+
"zh-cn": "在计算中修正负值"
|
|
44
|
+
},
|
|
6
45
|
"1.1.18": {
|
|
7
46
|
"en": "Fix negative values in calculation",
|
|
8
47
|
"de": "Negative Werte in der Berechnung festsetzen",
|
|
@@ -54,45 +93,6 @@
|
|
|
54
93
|
"pl": "Poprawiono obliczenia\nZaprzestanie wprowadzania energii przy niskim napięciu jest teraz opcją w ustawieniach",
|
|
55
94
|
"uk": "Удосконалено розрахунки\nЗупинити введення енергії на низькій напруги тепер опція в налаштуваннях",
|
|
56
95
|
"zh-cn": "计算改进\n在低电压下停止能量输入, 现在在设置中是一个选项"
|
|
57
|
-
},
|
|
58
|
-
"1.1.14": {
|
|
59
|
-
"en": "Reorganize Code\nCalculations are now optional and have to be enabled in settings\nCalculation of SOC from voltage and energy go in and out of batteries\nStop energy feed if voltage drops under limit",
|
|
60
|
-
"de": "Reorganisieren Code\nBerechnungen sind nun optional und müssen in Einstellungen aktiviert werden\nBerechnung von SOC aus Spannung und Energie gehen in und aus Batterien\nStoppen Sie die Energiezufuhr, wenn die Spannung unter Grenzwert sinkt",
|
|
61
|
-
"ru": "Реорганизовать код\nРасчеты теперь необязательны и должны быть включены в настройки\nРасчет SOC от напряжения и энергии идет в и из батарей\nОстановить источник энергии, если напряжение падает под лимит",
|
|
62
|
-
"pt": "Reorganizar código\nCálculos agora são opcionais e têm de ser ativados em configurações\nCálculo de SOC de tensão e energia entrar e sair de baterias\nPare a alimentação de energia se a tensão cair sob limite",
|
|
63
|
-
"nl": "Code herschikken\nBerekeningen zijn nu optioneel en moeten worden ingeschakeld in instellingen\nBerekening van SOC uit spanning en energie gaan in en uit batterijen\nStop energietoevoer als de spanning onder de limiet daalt",
|
|
64
|
-
"fr": "Réorganiser le code\nLes calculs sont désormais optionnels et doivent être activés dans les paramètres\nCalcul du COS à partir de la tension et de l'énergie entrent et sortent des batteries\nArrêt de l'alimentation en énergie si la tension tombe sous la limite",
|
|
65
|
-
"it": "Riorganizzare il Codice\nI calcoli sono ora facoltativi e devono essere abilitati nelle impostazioni\nCalcolo di SOC da tensione ed energia vanno dentro e fuori dalle batterie\nSmettere di alimentazione di energia se la tensione scende sotto limite",
|
|
66
|
-
"es": "Reorganizar el Código\nLas cálculos son ahora opcionales y tienen que ser habilitados en la configuración\nCálculo de SOC a partir del voltaje y la energía entran y salen de las baterías\nStop energy feed if tension drops under limit",
|
|
67
|
-
"pl": "Kod reorganizacji\nObliczenia są teraz opcjonalne i muszą być włączone w ustawieniach\nObliczanie SOC z napięcia i energii wchodzi i wychodzi z baterii\nZatrzymać zasilanie energetyczne, jeśli napięcie spada w granicach",
|
|
68
|
-
"uk": "Код реорганізації\nРозрахунок тепер необов'язково і потрібно ввімкнути в налаштуваннях\nРозрахунок SOC від напруги і енергії йти і з батарей\nЗупинити живлення енергії, якщо краплі напруги під лімітом",
|
|
69
|
-
"zh-cn": "重组代码\n现在计算是可选的,必须在设置中启用\n从电压和能量中计算出电池的SOC\n如果电压下降, 停止能量喂养"
|
|
70
|
-
},
|
|
71
|
-
"1.1.13": {
|
|
72
|
-
"en": "Reorganize Code\nCalculations are now optional and have to be enabled in settings\nCalculation of SOC from voltage and energy go in and out of batteries\nStop energy feed if voltage drops under limit",
|
|
73
|
-
"de": "Reorganisieren Code\nBerechnungen sind nun optional und müssen in Einstellungen aktiviert werden\nBerechnung von SOC aus Spannung und Energie gehen in und aus Batterien\nStoppen Sie die Energiezufuhr, wenn die Spannung unter Grenzwert sinkt",
|
|
74
|
-
"ru": "Реорганизовать код\nРасчеты теперь необязательны и должны быть включены в настройки\nРасчет SOC от напряжения и энергии идет в и из батарей\nОстановить источник энергии, если напряжение падает под лимит",
|
|
75
|
-
"pt": "Reorganizar código\nCálculos agora são opcionais e têm de ser ativados em configurações\nCálculo de SOC de tensão e energia entrar e sair de baterias\nPare a alimentação de energia se a tensão cair sob limite",
|
|
76
|
-
"nl": "Code herschikken\nBerekeningen zijn nu optioneel en moeten worden ingeschakeld in instellingen\nBerekening van SOC uit spanning en energie gaan in en uit batterijen\nStop energietoevoer als de spanning onder de limiet daalt",
|
|
77
|
-
"fr": "Réorganiser le code\nLes calculs sont désormais optionnels et doivent être activés dans les paramètres\nCalcul du COS à partir de la tension et de l'énergie entrent et sortent des batteries\nArrêt de l'alimentation en énergie si la tension tombe sous la limite",
|
|
78
|
-
"it": "Riorganizzare il Codice\nI calcoli sono ora facoltativi e devono essere abilitati nelle impostazioni\nCalcolo di SOC da tensione ed energia vanno dentro e fuori dalle batterie\nSmettere di alimentazione di energia se la tensione scende sotto limite",
|
|
79
|
-
"es": "Reorganizar el Código\nLas cálculos son ahora opcionales y tienen que ser habilitados en la configuración\nCálculo de SOC a partir del voltaje y la energía entran y salen de las baterías\nStop energy feed if tension drops under limit",
|
|
80
|
-
"pl": "Kod reorganizacji\nObliczenia są teraz opcjonalne i muszą być włączone w ustawieniach\nObliczanie SOC z napięcia i energii wchodzi i wychodzi z baterii\nZatrzymać zasilanie energetyczne, jeśli napięcie spada w granicach",
|
|
81
|
-
"uk": "Код реорганізації\nРозрахунок тепер необов'язково і потрібно ввімкнути в налаштуваннях\nРозрахунок SOC від напруги і енергії йти і з батарей\nЗупинити живлення енергії, якщо краплі напруги під лімітом",
|
|
82
|
-
"zh-cn": "重组代码\n现在计算是可选的,必须在设置中启用\n从电压和能量中计算出电池的SOC\n如果电压下降, 停止能量喂养"
|
|
83
|
-
},
|
|
84
|
-
"1.1.12": {
|
|
85
|
-
"en": "Reorganize Code\nCalculations are now optional and have to be enabled in settings\nCalculation of SOC from voltage and energy go in and out of batteries\nStop energy feed if voltage drops under limit",
|
|
86
|
-
"de": "Reorganisieren Code\nBerechnungen sind nun optional und müssen in Einstellungen aktiviert werden\nBerechnung von SOC aus Spannung und Energie gehen in und aus Batterien\nStoppen Sie die Energiezufuhr, wenn die Spannung unter Grenzwert sinkt",
|
|
87
|
-
"ru": "Реорганизовать код\nРасчеты теперь необязательны и должны быть включены в настройки\nРасчет SOC от напряжения и энергии идет в и из батарей\nОстановить источник энергии, если напряжение падает под лимит",
|
|
88
|
-
"pt": "Reorganizar código\nCálculos agora são opcionais e têm de ser ativados em configurações\nCálculo de SOC de tensão e energia entrar e sair de baterias\nPare a alimentação de energia se a tensão cair sob limite",
|
|
89
|
-
"nl": "Code herschikken\nBerekeningen zijn nu optioneel en moeten worden ingeschakeld in instellingen\nBerekening van SOC uit spanning en energie gaan in en uit batterijen\nStop energietoevoer als de spanning onder de limiet daalt",
|
|
90
|
-
"fr": "Réorganiser le code\nLes calculs sont désormais optionnels et doivent être activés dans les paramètres\nCalcul du COS à partir de la tension et de l'énergie entrent et sortent des batteries\nArrêt de l'alimentation en énergie si la tension tombe sous la limite",
|
|
91
|
-
"it": "Riorganizzare il Codice\nI calcoli sono ora facoltativi e devono essere abilitati nelle impostazioni\nCalcolo di SOC da tensione ed energia vanno dentro e fuori dalle batterie\nSmettere di alimentazione di energia se la tensione scende sotto limite",
|
|
92
|
-
"es": "Reorganizar el Código\nLas cálculos son ahora opcionales y tienen que ser habilitados en la configuración\nCálculo de SOC a partir del voltaje y la energía entran y salen de las baterías\nStop energy feed if tension drops under limit",
|
|
93
|
-
"pl": "Kod reorganizacji\nObliczenia są teraz opcjonalne i muszą być włączone w ustawieniach\nObliczanie SOC z napięcia i energii wchodzi i wychodzi z baterii\nZatrzymać zasilanie energetyczne, jeśli napięcie spada w granicach",
|
|
94
|
-
"uk": "Код реорганізації\nРозрахунок тепер необов'язково і потрібно ввімкнути в налаштуваннях\nРозрахунок SOC від напруги і енергії йти і з батарей\nЗупинити живлення енергії, якщо краплі напруги під лімітом",
|
|
95
|
-
"zh-cn": "重组代码\n现在计算是可选的,必须在设置中启用\n从电压和能量中计算出电池的SOC\n如果电压下降, 停止能量喂养"
|
|
96
96
|
}
|
|
97
97
|
},
|
|
98
98
|
"title": "Zendure Solarflow",
|