iobroker.zendure-solarflow 1.6.5 → 1.6.6
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 +4 -0
- package/build/services/jobSchedule.js +10 -6
- package/build/services/jobSchedule.js.map +2 -2
- package/io-package.json +14 -14
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -46,6 +46,10 @@ If you find the adapter useful for you and want to support my work, feel free to
|
|
|
46
46
|
[](https://www.paypal.com/paypalme/PeterFrommert)
|
|
47
47
|
|
|
48
48
|
## Changelog
|
|
49
|
+
### 1.6.6 (2024-06-21)
|
|
50
|
+
|
|
51
|
+
- Tweaked recurring refresh of access token.
|
|
52
|
+
|
|
49
53
|
### 1.6.5 (2024-06-20)
|
|
50
54
|
|
|
51
55
|
- Fix reconnect issue. Adapter will now restart if connection semms to be broken.
|
|
@@ -28,25 +28,29 @@ var import_node_schedule = require("node-schedule");
|
|
|
28
28
|
var import_mqttService = require("./mqttService");
|
|
29
29
|
var import_webService = require("./webService");
|
|
30
30
|
var import_calculationService = require("./calculationService");
|
|
31
|
-
const refreshAccessToken = (adapter) => {
|
|
31
|
+
const refreshAccessToken = async (adapter) => {
|
|
32
32
|
var _a, _b;
|
|
33
|
-
adapter.log.info(`[startRefreshAccessTokenTimerJob]
|
|
33
|
+
adapter.log.info(`[startRefreshAccessTokenTimerJob] Stop connections!`);
|
|
34
34
|
if (adapter.resetValuesJob) {
|
|
35
35
|
adapter.resetValuesJob.cancel();
|
|
36
|
-
adapter.resetValuesJob = void 0;
|
|
37
36
|
}
|
|
38
37
|
if (adapter.checkStatesJob) {
|
|
39
38
|
(_a = adapter.checkStatesJob) == null ? void 0 : _a.cancel();
|
|
40
|
-
adapter.checkStatesJob = void 0;
|
|
41
39
|
}
|
|
42
40
|
if (adapter.calculationJob) {
|
|
43
41
|
adapter.calculationJob.cancel();
|
|
44
|
-
adapter.calculationJob = void 0;
|
|
45
42
|
}
|
|
46
43
|
if (adapter.mqttClient) {
|
|
47
44
|
adapter.mqttClient.end();
|
|
48
|
-
adapter.mqttClient = void 0;
|
|
49
45
|
}
|
|
46
|
+
adapter.log.info(
|
|
47
|
+
`[startRefreshAccessTokenTimerJob] Refreshing accessToken in 10 seconds!`
|
|
48
|
+
);
|
|
49
|
+
await adapter.delay(10 * 1e3);
|
|
50
|
+
adapter.resetValuesJob = void 0;
|
|
51
|
+
adapter.checkStatesJob = void 0;
|
|
52
|
+
adapter.calculationJob = void 0;
|
|
53
|
+
adapter.mqttClient = void 0;
|
|
50
54
|
if (adapter.config.userName && adapter.config.password) {
|
|
51
55
|
(_b = (0, import_webService.login)(adapter)) == null ? void 0 : _b.then((_accessToken) => {
|
|
52
56
|
adapter.accessToken = _accessToken;
|
|
@@ -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 { login } from \"./webService\";\r\nimport { ISolarFlowDeviceDetails } from \"../models/ISolarFlowDeviceDetails\";\r\nimport { calculateEnergy, resetTodaysValues } from \"./calculationService\";\r\n\r\nconst refreshAccessToken = (adapter: ZendureSolarflow): void => {\r\n // Relogin every 3 hours to get a fresh accessToken!\r\n adapter.log.info(`[startRefreshAccessTokenTimerJob]
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,2BAA4B;AAE5B,yBAAkC;AAClC,wBAAsB;AAEtB,gCAAmD;AAEnD,MAAM,qBAAqB,
|
|
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 { login } from \"./webService\";\r\nimport { ISolarFlowDeviceDetails } from \"../models/ISolarFlowDeviceDetails\";\r\nimport { calculateEnergy, resetTodaysValues } from \"./calculationService\";\r\n\r\nconst refreshAccessToken = async (adapter: ZendureSolarflow): Promise<void> => {\r\n // Relogin every 3 hours to get a fresh accessToken!\r\n adapter.log.info(`[startRefreshAccessTokenTimerJob] Stop connections!`);\r\n\r\n // Scheduler beenden\r\n if (adapter.resetValuesJob) {\r\n adapter.resetValuesJob.cancel();\r\n }\r\n\r\n if (adapter.checkStatesJob) {\r\n adapter.checkStatesJob?.cancel();\r\n }\r\n\r\n if (adapter.calculationJob) {\r\n adapter.calculationJob.cancel();\r\n }\r\n\r\n if (adapter.mqttClient) {\r\n adapter.mqttClient.end();\r\n }\r\n\r\n adapter.log.info(\r\n `[startRefreshAccessTokenTimerJob] Refreshing accessToken in 10 seconds!`,\r\n );\r\n await adapter.delay(10 * 1000);\r\n\r\n adapter.resetValuesJob = undefined;\r\n adapter.checkStatesJob = undefined;\r\n adapter.calculationJob = undefined;\r\n adapter.mqttClient = undefined;\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};\r\n\r\nexport const startRefreshAccessTokenTimerJob = async (\r\n adapter: ZendureSolarflow,\r\n): Promise<void> => {\r\n adapter.refreshAccessTokenInterval = adapter.setInterval(\r\n () => {\r\n refreshAccessToken(adapter);\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 adapter.deviceList.forEach((device) => {\r\n calculateEnergy(adapter, device.productKey, device.deviceKey);\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 \"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?.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};\r\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/io-package.json
CHANGED
|
@@ -1,8 +1,21 @@
|
|
|
1
1
|
{
|
|
2
2
|
"common": {
|
|
3
3
|
"name": "zendure-solarflow",
|
|
4
|
-
"version": "1.6.
|
|
4
|
+
"version": "1.6.6",
|
|
5
5
|
"news": {
|
|
6
|
+
"1.6.6": {
|
|
7
|
+
"en": "Tweaked recurring refresh of access token.",
|
|
8
|
+
"de": "Tweaked wiederkehrende Erfrischung des Zugangs zu Token.",
|
|
9
|
+
"ru": "Сжатое повторяющееся обновление токена доступа.",
|
|
10
|
+
"pt": "Atualização recorrente de token de acesso.",
|
|
11
|
+
"nl": "Getweaked returning refresh of access token.",
|
|
12
|
+
"fr": "Changez de jeton d'accès.",
|
|
13
|
+
"it": "Tweaked rinfresco ricorrente di accesso token.",
|
|
14
|
+
"es": "Refrigerio recurrente de token de acceso.",
|
|
15
|
+
"pl": "Podmienił powtarzające się odświeżanie tokena dostępu.",
|
|
16
|
+
"uk": "Запечена рецидивна обробка токени доступу.",
|
|
17
|
+
"zh-cn": "不断刷新访问标志."
|
|
18
|
+
},
|
|
6
19
|
"1.6.5": {
|
|
7
20
|
"en": "Fix reconnect issue. Adapter will now restart if connection semms to be broken.",
|
|
8
21
|
"de": "Reconnect Problem behoben. Adapter wird jetzt neu starten, wenn Verbindungssemms gebrochen werden.",
|
|
@@ -80,19 +93,6 @@
|
|
|
80
93
|
"pl": "Popraw problem, że czasem dane nie są aktualizowane\nDodawanie trybu czuwania HUB (20W) w przypadku niskiego wejścia solarinput",
|
|
81
94
|
"uk": "Виправлення проблеми, які одноразові дані не оновлено\nДодайте автономне використання HUB (20W) при низькому доступі",
|
|
82
95
|
"zh-cn": "解决数据有时不更新的问题\n当太阳输入量低时添加 HUB( 20W) 的备用用法"
|
|
83
|
-
},
|
|
84
|
-
"1.5.3": {
|
|
85
|
-
"en": "Fix autoRecover datatype issue",
|
|
86
|
-
"de": "AutoRecover Datatype Problem",
|
|
87
|
-
"ru": "Вопрос о типе данных autoRecover",
|
|
88
|
-
"pt": "Corrigir problema do tipo de dados autoRecover",
|
|
89
|
-
"nl": "Repareren autoRecover datatype probleem",
|
|
90
|
-
"fr": "Correction problème de type de données autoRecover",
|
|
91
|
-
"it": "Risolvere il problema del tipo di dati autoRecover",
|
|
92
|
-
"es": "Corrección de autoRecover datatype problema",
|
|
93
|
-
"pl": "Napraw wydanie typu danych autoRecover",
|
|
94
|
-
"uk": "Фіксувати автоматичнийВихід даних",
|
|
95
|
-
"zh-cn": "自动恢复数据类型问题"
|
|
96
96
|
}
|
|
97
97
|
},
|
|
98
98
|
"titleLang": {
|