iobroker.zendure-solarflow 3.1.1 → 3.2.0

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,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\n\r\nexport const startRefreshAccessTokenTimerJob = async (\r\n adapter: ZendureSolarflow\r\n): Promise<void> => {\r\n // Restart adapter every 3 hours\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 adapter.zenHaDeviceList.forEach((device) => {\r\n device.resetValuesForDevice();\r\n });\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.zenHaDeviceList.forEach((device) => {\r\n if (device.productKey != \"s3Xk4x\") {\r\n device.calculateEnergy();\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 \"packPower\",\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.zenHaDeviceList.forEach(async (device) => {\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; // Thirty minutes ago\r\n\r\n if (\r\n lastUpdate &&\r\n lastUpdate.val &&\r\n Number(lastUpdate.val) < tenMinutesAgo &&\r\n wifiState?.val == \"Connected\" &&\r\n adapter.config.connectionMode == \"authKey\"\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.val)\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 } else if (\r\n lastUpdate &&\r\n lastUpdate.val &&\r\n Number(lastUpdate.val) < tenMinutesAgo &&\r\n wifiState?.val == \"Connected\" &&\r\n adapter.config.connectionMode == \"local\"\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.val)\r\n )}, set Wifi state to Disconnected!`\r\n );\r\n\r\n device?.updateSolarFlowState(\"wifiState\", \"Disconnected\");\r\n }\r\n\r\n if (\r\n lastUpdate &&\r\n lastUpdate.val &&\r\n Number(lastUpdate.val) < fiveMinutesAgo &&\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.val)\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 });\r\n });\r\n};\r\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,2BAA4B;AAGrB,MAAM,kCAAkC,OAC7C,YACkB;AAElB,UAAQ,6BAA6B,QAAQ;AAAA,IAC3C,YAAY;AACV,cAAQ,IAAI;AAAA,QACV;AAAA,MACF;AAEA,YAAM,QAAQ,MAAM,KAAK,GAAI;AAC7B,cAAQ,QAAQ;AAAA,IAClB;AAAA,IACA,IAAI,KAAK,KAAK;AAAA,EAChB;AACF;AAEO,MAAM,sBAAsB,OACjC,YACkB;AAClB,UAAQ,qBAAiB,kCAAY,eAAe,MAAM;AAExD,YAAQ,gBAAgB,QAAQ,CAAC,WAAW;AAC1C,aAAO,qBAAqB;AAAA,IAC9B,CAAC;AAAA,EACH,CAAC;AACH;AAEO,MAAM,sBAAsB,OACjC,YACkB;AAClB,UAAQ,qBAAiB,kCAAY,kBAAkB,MAAM;AAC3D,YAAQ,gBAAgB,QAAQ,CAAC,WAAW;AAC1C,UAAI,OAAO,cAAc,UAAU;AACjC,eAAO,gBAAgB;AAAA,MACzB;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AACH;AAEO,MAAM,mCAAmC,OAC9C,YACkB;AAElB,QAAM,gBAA0B;AAAA,IAC9B;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,MAAI,2BAA2B;AAE/B,UAAQ,IAAI;AAAA,IACV;AAAA,EACF;AAEA,UAAQ,qBAAiB,kCAAY,eAAe,YAAY;AAC9D,YAAQ,gBAAgB,QAAQ,OAAO,WAAW;AAChD,UAAI,0BAA0B;AAC5B;AAAA,MACF;AAEA,YAAM,aAAa,OAAM,mCAAS;AAAA,QAChC,OAAO,aAAa,MAAM,OAAO,YAAY;AAAA;AAG/C,YAAM,YAAY,OAAM,mCAAS;AAAA,QAC/B,OAAO,aAAa,MAAM,OAAO,YAAY;AAAA;AAG/C,YAAM,kBAAkB,KAAK,IAAI,IAAI,MAAO,IAAI,MAAM;AACtD,YAAM,iBAAiB,KAAK,IAAI,IAAI,MAAO,KAAK,MAAM;AAEtD,UACE,cACA,WAAW,OACX,OAAO,WAAW,GAAG,IAAI,kBACzB,uCAAW,QAAO,eAClB,QAAQ,OAAO,kBAAkB,WACjC;AACA,gBAAQ,IAAI;AAAA,UACV,8CACE,OAAO,SACT,WAAW,IAAI;AAAA,YACb,OAAO,WAAW,GAAG;AAAA,UACvB,CAAC;AAAA,QACH;AAEA,cAAM,QAAQ,MAAM,KAAK,GAAI;AAC7B,gBAAQ,QAAQ;AAGhB,mCAA2B;AAAA,MAC7B,WACE,cACA,WAAW,OACX,OAAO,WAAW,GAAG,IAAI,kBACzB,uCAAW,QAAO,eAClB,QAAQ,OAAO,kBAAkB,SACjC;AACA,gBAAQ,IAAI;AAAA,UACV,8CACE,OAAO,SACT,WAAW,IAAI;AAAA,YACb,OAAO,WAAW,GAAG;AAAA,UACvB,CAAC;AAAA,QACH;AAEA,yCAAQ,qBAAqB,aAAa;AAAA,MAC5C;AAEA,UACE,cACA,WAAW,OACX,OAAO,WAAW,GAAG,IAAI,kBACzB,CAAC,0BACD;AACA,gBAAQ,IAAI;AAAA,UACV,8CACE,OAAO,SACT,WAAW,IAAI;AAAA,YACb,OAAO,WAAW,GAAG;AAAA,UACvB,CAAC;AAAA,QACH;AAEA,cAAM,cAAc,QAAQ,OAAO,cAAsB;AACvD,iBAAM,mCAAS;AAAA,YACb,OAAO,aAAa,MAAM,OAAO,YAAY,MAAM;AAAA,YACnD;AAAA,YACA;AAAA;AAAA,QAEJ,CAAC;AAAA,MACH;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AACH;",
4
+ "sourcesContent": ["/* eslint-disable @typescript-eslint/indent */\r\nimport { scheduleJob } from \"node-schedule\";\r\nimport { ZendureSolarflow } from \"../main\";\r\n\r\nexport const startRefreshAccessTokenTimerJob = async (\r\n adapter: ZendureSolarflow\r\n): Promise<void> => {\r\n // Restart adapter every 3 hours\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 adapter.zenHaDeviceList.forEach((device) => {\r\n device.resetValuesForDevice();\r\n });\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.zenHaDeviceList.forEach((device) => {\r\n if (device.productKey != \"s3Xk4x\") {\r\n device.calculateEnergy();\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 \"pvPower1\",\r\n \"pvPower2\",\r\n \"pvPower3\",\r\n \"pvPower4\",\r\n \"packPower\",\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.zenHaDeviceList.forEach(async (device) => {\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; // Thirty minutes ago\r\n\r\n if (\r\n lastUpdate &&\r\n lastUpdate.val &&\r\n Number(lastUpdate.val) < tenMinutesAgo &&\r\n wifiState?.val == \"Connected\" &&\r\n adapter.config.connectionMode == \"authKey\"\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.val)\r\n )}, device seems to be online - so maybe connection is broken!`\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 } else if (\r\n lastUpdate &&\r\n lastUpdate.val &&\r\n Number(lastUpdate.val) < tenMinutesAgo &&\r\n wifiState?.val == \"Connected\" &&\r\n adapter.config.connectionMode == \"local\"\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.val)\r\n )}, set Wifi state to Disconnected!`\r\n );\r\n\r\n device?.updateSolarFlowState(\"wifiState\", \"Disconnected\");\r\n }\r\n\r\n if (\r\n lastUpdate &&\r\n lastUpdate.val &&\r\n Number(lastUpdate.val) < fiveMinutesAgo &&\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.val)\r\n )}, checking for pseudo power values!`\r\n );\r\n // State was not updated in the last 5 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 });\r\n });\r\n};\r\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,2BAA4B;AAGrB,MAAM,kCAAkC,OAC7C,YACkB;AAElB,UAAQ,6BAA6B,QAAQ;AAAA,IAC3C,YAAY;AACV,cAAQ,IAAI;AAAA,QACV;AAAA,MACF;AAEA,YAAM,QAAQ,MAAM,KAAK,GAAI;AAC7B,cAAQ,QAAQ;AAAA,IAClB;AAAA,IACA,IAAI,KAAK,KAAK;AAAA,EAChB;AACF;AAEO,MAAM,sBAAsB,OACjC,YACkB;AAClB,UAAQ,qBAAiB,kCAAY,eAAe,MAAM;AAExD,YAAQ,gBAAgB,QAAQ,CAAC,WAAW;AAC1C,aAAO,qBAAqB;AAAA,IAC9B,CAAC;AAAA,EACH,CAAC;AACH;AAEO,MAAM,sBAAsB,OACjC,YACkB;AAClB,UAAQ,qBAAiB,kCAAY,kBAAkB,MAAM;AAC3D,YAAQ,gBAAgB,QAAQ,CAAC,WAAW;AAC1C,UAAI,OAAO,cAAc,UAAU;AACjC,eAAO,gBAAgB;AAAA,MACzB;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AACH;AAEO,MAAM,mCAAmC,OAC9C,YACkB;AAElB,QAAM,gBAA0B;AAAA,IAC9B;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,MAAI,2BAA2B;AAE/B,UAAQ,IAAI;AAAA,IACV;AAAA,EACF;AAEA,UAAQ,qBAAiB,kCAAY,eAAe,YAAY;AAC9D,YAAQ,gBAAgB,QAAQ,OAAO,WAAW;AAChD,UAAI,0BAA0B;AAC5B;AAAA,MACF;AAEA,YAAM,aAAa,OAAM,mCAAS;AAAA,QAChC,OAAO,aAAa,MAAM,OAAO,YAAY;AAAA;AAG/C,YAAM,YAAY,OAAM,mCAAS;AAAA,QAC/B,OAAO,aAAa,MAAM,OAAO,YAAY;AAAA;AAG/C,YAAM,kBAAkB,KAAK,IAAI,IAAI,MAAO,IAAI,MAAM;AACtD,YAAM,iBAAiB,KAAK,IAAI,IAAI,MAAO,KAAK,MAAM;AAEtD,UACE,cACA,WAAW,OACX,OAAO,WAAW,GAAG,IAAI,kBACzB,uCAAW,QAAO,eAClB,QAAQ,OAAO,kBAAkB,WACjC;AACA,gBAAQ,IAAI;AAAA,UACV,8CACE,OAAO,SACT,WAAW,IAAI;AAAA,YACb,OAAO,WAAW,GAAG;AAAA,UACvB,CAAC;AAAA,QACH;AAMA,mCAA2B;AAAA,MAC7B,WACE,cACA,WAAW,OACX,OAAO,WAAW,GAAG,IAAI,kBACzB,uCAAW,QAAO,eAClB,QAAQ,OAAO,kBAAkB,SACjC;AACA,gBAAQ,IAAI;AAAA,UACV,8CACE,OAAO,SACT,WAAW,IAAI;AAAA,YACb,OAAO,WAAW,GAAG;AAAA,UACvB,CAAC;AAAA,QACH;AAEA,yCAAQ,qBAAqB,aAAa;AAAA,MAC5C;AAEA,UACE,cACA,WAAW,OACX,OAAO,WAAW,GAAG,IAAI,kBACzB,CAAC,0BACD;AACA,gBAAQ,IAAI;AAAA,UACV,8CACE,OAAO,SACT,WAAW,IAAI;AAAA,YACb,OAAO,WAAW,GAAG;AAAA,UACvB,CAAC;AAAA,QACH;AAEA,cAAM,cAAc,QAAQ,OAAO,cAAsB;AACvD,iBAAM,mCAAS;AAAA,YACb,OAAO,aAAa,MAAM,OAAO,YAAY,MAAM;AAAA,YACnD;AAAA,YACA;AAAA;AAAA,QAEJ,CAAC;AAAA,MACH;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AACH;",
6
6
  "names": []
7
7
  }
@@ -72,7 +72,6 @@ const zenLogin = async (adapter) => {
72
72
  };
73
73
  return import_axios.default.post(`${apiUrl}/api/ha/deviceList`, JSON.stringify(body), config).then(async function(response) {
74
74
  const data = await response.data;
75
- adapter.log.error(data);
76
75
  return data.data;
77
76
  }).catch(async function(error) {
78
77
  if (error.response) {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/services/zenWebService.ts"],
4
- "sourcesContent": ["/* eslint-disable @typescript-eslint/indent */\nimport axios, { AxiosRequestConfig } from \"axios\";\nimport { haKey } from \"../constants/constants\";\nimport { ZendureSolarflow } from \"../main\";\nimport * as crypto from \"crypto\";\nimport { IHaDeviceListData } from \"../models/IHaDeviceListData\";\n\nexport const zenLogin = async (\n adapter: ZendureSolarflow\n): Promise<string | IHaDeviceListData | undefined> => {\n const decodedAuthCloudKey = Buffer.from(\n adapter.config.authorizationCloudKey,\n \"base64\"\n ).toString(\"utf-8\");\n\n const lastDot = decodedAuthCloudKey.lastIndexOf(\".\");\n if (lastDot === -1) {\n // Invalid\n }\n\n const apiUrl = decodedAuthCloudKey.slice(0, lastDot);\n const appKey = decodedAuthCloudKey.slice(lastDot + 1);\n\n const body = {\n appKey: appKey,\n };\n\n // Timestamp und Nonce\n const timestamp = Math.floor(Date.now() / 1000);\n const nonce = (Math.floor(Math.random() * 90000) + 10000).toString();\n\n // Signatur-Parameter\n const signParams: Record<string, string | number> = {\n ...body,\n timestamp: timestamp,\n nonce: nonce,\n };\n\n // Signatur-String erstellen\n const bodyStr = Object.keys(signParams)\n .sort()\n .map((k) => `${k}${signParams[k]}`)\n .join(\"\");\n\n const signStr = `${haKey}${bodyStr}${haKey}`;\n\n // SHA1-Hash berechnen\n const sha1 = crypto.createHash(\"sha1\");\n sha1.update(signStr, \"utf8\");\n const sign = sha1.digest(\"hex\").toUpperCase();\n\n // Header bauen\n const headers = {\n \"Content-Type\": \"application/json\",\n timestamp: timestamp.toString(),\n nonce: nonce,\n clientid: \"zenHa\",\n sign: sign,\n };\n\n const config: AxiosRequestConfig = {\n headers: headers,\n timeout: 10000,\n };\n\n // Request\n return axios\n .post(`${apiUrl}/api/ha/deviceList`, JSON.stringify(body), config)\n .then(async function (response) {\n const data = await response.data;\n\n adapter.log.error(data);\n\n return data.data;\n })\n .catch(async function (error) {\n if (error.response) {\n // The request was made and the server responded with a status code\n // that falls out of the range of 2xx\n adapter.log.error(error.response.data);\n adapter.log.error(error.response.status);\n adapter.log.error(error.response.headers);\n } else if (error.request) {\n // The request was made but no response was received\n // `error.request` is an instance of XMLHttpRequest in the browser and an instance of\n // http.ClientRequest in node.js\n adapter.log.error(error.request);\n } else {\n // Something happened in setting up the request that triggered an Error\n adapter.log.error(\"Error\" + error.message);\n }\n adapter.log.error(error.config);\n });\n};\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,mBAA0C;AAC1C,uBAAsB;AAEtB,aAAwB;AAGjB,MAAM,WAAW,OACtB,YACoD;AACpD,QAAM,sBAAsB,OAAO;AAAA,IACjC,QAAQ,OAAO;AAAA,IACf;AAAA,EACF,EAAE,SAAS,OAAO;AAElB,QAAM,UAAU,oBAAoB,YAAY,GAAG;AACnD,MAAI,YAAY,IAAI;AAAA,EAEpB;AAEA,QAAM,SAAS,oBAAoB,MAAM,GAAG,OAAO;AACnD,QAAM,SAAS,oBAAoB,MAAM,UAAU,CAAC;AAEpD,QAAM,OAAO;AAAA,IACX;AAAA,EACF;AAGA,QAAM,YAAY,KAAK,MAAM,KAAK,IAAI,IAAI,GAAI;AAC9C,QAAM,SAAS,KAAK,MAAM,KAAK,OAAO,IAAI,GAAK,IAAI,KAAO,SAAS;AAGnE,QAAM,aAA8C;AAAA,IAClD,GAAG;AAAA,IACH;AAAA,IACA;AAAA,EACF;AAGA,QAAM,UAAU,OAAO,KAAK,UAAU,EACnC,KAAK,EACL,IAAI,CAAC,MAAM,GAAG,CAAC,GAAG,WAAW,CAAC,CAAC,EAAE,EACjC,KAAK,EAAE;AAEV,QAAM,UAAU,GAAG,sBAAK,GAAG,OAAO,GAAG,sBAAK;AAG1C,QAAM,OAAO,OAAO,WAAW,MAAM;AACrC,OAAK,OAAO,SAAS,MAAM;AAC3B,QAAM,OAAO,KAAK,OAAO,KAAK,EAAE,YAAY;AAG5C,QAAM,UAAU;AAAA,IACd,gBAAgB;AAAA,IAChB,WAAW,UAAU,SAAS;AAAA,IAC9B;AAAA,IACA,UAAU;AAAA,IACV;AAAA,EACF;AAEA,QAAM,SAA6B;AAAA,IACjC;AAAA,IACA,SAAS;AAAA,EACX;AAGA,SAAO,aAAAA,QACJ,KAAK,GAAG,MAAM,sBAAsB,KAAK,UAAU,IAAI,GAAG,MAAM,EAChE,KAAK,eAAgB,UAAU;AAC9B,UAAM,OAAO,MAAM,SAAS;AAE5B,YAAQ,IAAI,MAAM,IAAI;AAEtB,WAAO,KAAK;AAAA,EACd,CAAC,EACA,MAAM,eAAgB,OAAO;AAC5B,QAAI,MAAM,UAAU;AAGlB,cAAQ,IAAI,MAAM,MAAM,SAAS,IAAI;AACrC,cAAQ,IAAI,MAAM,MAAM,SAAS,MAAM;AACvC,cAAQ,IAAI,MAAM,MAAM,SAAS,OAAO;AAAA,IAC1C,WAAW,MAAM,SAAS;AAIxB,cAAQ,IAAI,MAAM,MAAM,OAAO;AAAA,IACjC,OAAO;AAEL,cAAQ,IAAI,MAAM,UAAU,MAAM,OAAO;AAAA,IAC3C;AACA,YAAQ,IAAI,MAAM,MAAM,MAAM;AAAA,EAChC,CAAC;AACL;",
4
+ "sourcesContent": ["/* eslint-disable @typescript-eslint/indent */\nimport axios, { AxiosRequestConfig } from \"axios\";\nimport { haKey } from \"../constants/constants\";\nimport { ZendureSolarflow } from \"../main\";\nimport * as crypto from \"crypto\";\nimport { IHaDeviceListData } from \"../models/IHaDeviceListData\";\n\nexport const zenLogin = async (\n adapter: ZendureSolarflow\n): Promise<string | IHaDeviceListData | undefined> => {\n const decodedAuthCloudKey = Buffer.from(\n adapter.config.authorizationCloudKey,\n \"base64\"\n ).toString(\"utf-8\");\n\n const lastDot = decodedAuthCloudKey.lastIndexOf(\".\");\n if (lastDot === -1) {\n // Invalid\n }\n\n const apiUrl = decodedAuthCloudKey.slice(0, lastDot);\n const appKey = decodedAuthCloudKey.slice(lastDot + 1);\n\n const body = {\n appKey: appKey,\n };\n\n // Timestamp und Nonce\n const timestamp = Math.floor(Date.now() / 1000);\n const nonce = (Math.floor(Math.random() * 90000) + 10000).toString();\n\n // Signatur-Parameter\n const signParams: Record<string, string | number> = {\n ...body,\n timestamp: timestamp,\n nonce: nonce,\n };\n\n // Signatur-String erstellen\n const bodyStr = Object.keys(signParams)\n .sort()\n .map((k) => `${k}${signParams[k]}`)\n .join(\"\");\n\n const signStr = `${haKey}${bodyStr}${haKey}`;\n\n // SHA1-Hash berechnen\n const sha1 = crypto.createHash(\"sha1\");\n sha1.update(signStr, \"utf8\");\n const sign = sha1.digest(\"hex\").toUpperCase();\n\n // Header bauen\n const headers = {\n \"Content-Type\": \"application/json\",\n timestamp: timestamp.toString(),\n nonce: nonce,\n clientid: \"zenHa\",\n sign: sign,\n };\n\n const config: AxiosRequestConfig = {\n headers: headers,\n timeout: 10000,\n };\n\n // Request\n return axios\n .post(`${apiUrl}/api/ha/deviceList`, JSON.stringify(body), config)\n .then(async function (response) {\n const data = await response.data;\n\n return data.data;\n })\n .catch(async function (error) {\n if (error.response) {\n // The request was made and the server responded with a status code\n // that falls out of the range of 2xx\n adapter.log.error(error.response.data);\n adapter.log.error(error.response.status);\n adapter.log.error(error.response.headers);\n } else if (error.request) {\n // The request was made but no response was received\n // `error.request` is an instance of XMLHttpRequest in the browser and an instance of\n // http.ClientRequest in node.js\n adapter.log.error(error.request);\n } else {\n // Something happened in setting up the request that triggered an Error\n adapter.log.error(\"Error\" + error.message);\n }\n adapter.log.error(error.config);\n });\n};\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,mBAA0C;AAC1C,uBAAsB;AAEtB,aAAwB;AAGjB,MAAM,WAAW,OACtB,YACoD;AACpD,QAAM,sBAAsB,OAAO;AAAA,IACjC,QAAQ,OAAO;AAAA,IACf;AAAA,EACF,EAAE,SAAS,OAAO;AAElB,QAAM,UAAU,oBAAoB,YAAY,GAAG;AACnD,MAAI,YAAY,IAAI;AAAA,EAEpB;AAEA,QAAM,SAAS,oBAAoB,MAAM,GAAG,OAAO;AACnD,QAAM,SAAS,oBAAoB,MAAM,UAAU,CAAC;AAEpD,QAAM,OAAO;AAAA,IACX;AAAA,EACF;AAGA,QAAM,YAAY,KAAK,MAAM,KAAK,IAAI,IAAI,GAAI;AAC9C,QAAM,SAAS,KAAK,MAAM,KAAK,OAAO,IAAI,GAAK,IAAI,KAAO,SAAS;AAGnE,QAAM,aAA8C;AAAA,IAClD,GAAG;AAAA,IACH;AAAA,IACA;AAAA,EACF;AAGA,QAAM,UAAU,OAAO,KAAK,UAAU,EACnC,KAAK,EACL,IAAI,CAAC,MAAM,GAAG,CAAC,GAAG,WAAW,CAAC,CAAC,EAAE,EACjC,KAAK,EAAE;AAEV,QAAM,UAAU,GAAG,sBAAK,GAAG,OAAO,GAAG,sBAAK;AAG1C,QAAM,OAAO,OAAO,WAAW,MAAM;AACrC,OAAK,OAAO,SAAS,MAAM;AAC3B,QAAM,OAAO,KAAK,OAAO,KAAK,EAAE,YAAY;AAG5C,QAAM,UAAU;AAAA,IACd,gBAAgB;AAAA,IAChB,WAAW,UAAU,SAAS;AAAA,IAC9B;AAAA,IACA,UAAU;AAAA,IACV;AAAA,EACF;AAEA,QAAM,SAA6B;AAAA,IACjC;AAAA,IACA,SAAS;AAAA,EACX;AAGA,SAAO,aAAAA,QACJ,KAAK,GAAG,MAAM,sBAAsB,KAAK,UAAU,IAAI,GAAG,MAAM,EAChE,KAAK,eAAgB,UAAU;AAC9B,UAAM,OAAO,MAAM,SAAS;AAE5B,WAAO,KAAK;AAAA,EACd,CAAC,EACA,MAAM,eAAgB,OAAO;AAC5B,QAAI,MAAM,UAAU;AAGlB,cAAQ,IAAI,MAAM,MAAM,SAAS,IAAI;AACrC,cAAQ,IAAI,MAAM,MAAM,SAAS,MAAM;AACvC,cAAQ,IAAI,MAAM,MAAM,SAAS,OAAO;AAAA,IAC1C,WAAW,MAAM,SAAS;AAIxB,cAAQ,IAAI,MAAM,MAAM,OAAO;AAAA,IACjC,OAAO;AAEL,cAAQ,IAAI,MAAM,UAAU,MAAM,OAAO;AAAA,IAC3C;AACA,YAAQ,IAAI,MAAM,MAAM,MAAM;AAAA,EAChC,CAAC;AACL;",
6
6
  "names": ["axios"]
7
7
  }
package/io-package.json CHANGED
@@ -1,8 +1,21 @@
1
1
  {
2
2
  "common": {
3
3
  "name": "zendure-solarflow",
4
- "version": "3.1.1",
4
+ "version": "3.2.0",
5
5
  "news": {
6
+ "3.2.0": {
7
+ "en": "Fix inputLimit on certain devices\nFix calculation of PV3 & 4 again (hopefully now 100%)\nAdd some more specific debug messages\nRemove misleading error message on adapter start\nReplace restart on checkStatesJob with a debug message (I think Zendure cloud is stable now)\nUpdate adapter to adapter-react-v5 (MUI v5)\nFix commandbar in settings",
8
+ "de": "EingabeLimit auf bestimmte Geräte fixieren\nFixe Berechnung von PV3 & 4 wieder (hoffentlich jetzt 100%)\nFügen Sie einige spezifische Debug-Nachrichten hinzu\nEntfernen irreführende Fehlermeldung auf Adapterstart\nWiederstart ersetzen StatesJob mit einer Debug-Nachricht (ich glaube, Zendure Cloud ist jetzt stabil)\nUpdate-Adapter auf Adapter-React-v5 (MUI v5)\nBefehlsleiste in Einstellungen festlegen",
9
+ "ru": "Исправьте входное ограничение на определенных устройствах\nИсправьте расчет PV3 и 4 снова (надеюсь, теперь 100%)\nДобавьте более конкретные сообщения отладки\nУдалить вводящее в заблуждение сообщение об ошибке при запуске адаптера\nЗаменить перезапуск на проверку StatesJob с сообщением отладки (я думаю, что облако Zendure теперь стабильно)\nАдаптер обновления для адаптера-реакции-v5 (MUI v5)\nFix Commandbar в настройках",
10
+ "pt": "Corrigir a entradaLimit em certos dispositivos\nCorrigir o cálculo de PV3 & 4 novamente (esperançosamente agora 100%)\nAdicionar algumas mensagens de depuração mais específicas\nRemover a mensagem de erro enganosa no início do adaptador\nSubstituir reiniciar na verificação StatesJob com uma mensagem de depuração (Eu acho que a nuvem Zendure está estável agora)\nAtualizar adaptador para adaptador-react-v5 (MUI v5)\nCorrigir a barra de comandos nas configurações",
11
+ "nl": "Repareren inputLimit op bepaalde apparaten\nFix berekening van PV3 & 4 weer (hopelijk nu 100%)\nMeer specifieke debug-berichten toevoegen\nVerwijder misleidende foutmelding bij het starten van de adapter\nHerstart vervangen bij controle StatesJob met een debug bericht (Ik denk dat Zendure cloud nu stabiel is)\nUpdate adapter naar adapter-react-v5 (MUI v5)\nCommandbar in instellingen herstellen",
12
+ "fr": "Correction de l'entréeLimit sur certains appareils\nFixer à nouveau le calcul de PV3 & 4 (avec espoir maintenant 100%)\nAjouter des messages de débogage plus spécifiques\nSupprimer le message d'erreur trompeuse lors du démarrage de l'adaptateur\nRemplacer le redémarrage lors de la vérification StatesJob avec un message de débogage (je pense que le nuage Zendure est stable maintenant)\nMettre à jour l'adaptateur pour adapter-réaction-v5 (MUI v5)\nCorrection de la barre de commande dans les paramètres",
13
+ "it": "Fissare inputLimit su determinati dispositivi\nFissare il calcolo di PV3 & 4 di nuovo (si spera ora 100%)\nAggiungi alcuni messaggi di debug più specifici\nRimuovere il messaggio di errore fuorviante sull'avvio dell'adattatore\nSostituisci il riavvio al controllo StateJob con un messaggio debug (Penso che il cloud Zendure sia stabile ora)\nAdattatore di aggiornamento per adattatore-react-v5 (MUI v5)\nFissare la barra di comando nelle impostazioni",
14
+ "es": "Fijar entradaLimitar en ciertos dispositivos\nFijar el cálculo de PV3 & 4 de nuevo (esperadamente ahora 100%)\nAgregar algunos mensajes de depuración más específicos\nEliminar el mensaje de error engañoso en el comienzo del adaptador\nReemplace reiniciar el cheque StatesJob con un mensaje de depuración (creo que la nube Zendure está estable ahora)\nAdaptador de actualización para adaptador-react-v5 (MUI v5)\nFijar barra de comandos en los ajustes",
15
+ "pl": "Fix inputLimit na niektórych urządzeniach\nPopraw obliczenia PV3 & 4 ponownie (miejmy nadzieję, że teraz 100%)\nDodaj kilka bardziej szczegółowych wiadomości debugowania\nUsuń mylący komunikat błędu przy uruchomieniu adaptera\nZastąp ponowne uruchomienie podczas kontroli States Job z komunikatem o debugowaniu (myślę, że chmura Zabb jest teraz stabilna)\nAktualizuj adapter do adaptacji- react- v5 (MUI v5)\nNapraw pasek poleceń w ustawieniach",
16
+ "uk": "Фіксувати вхідОблік на певних пристроях\nФіксований розрахунок ПВ3 та 4 знову (повно зараз 100%)\nДодати більше специфічних повідомлень\nВидаліть повідомлення про помилку в оману на адаптері\nЗамініть перезапуск на перевірку USAJob з повідомленням debug (Я думаю, що хмара Zendure стабільний зараз)\nОновлення адаптера до адаптера-реакт-v5 (MUI v5)\nВиправлення командного рядка в налаштуваннях",
17
+ "zh-cn": "在某些设备上固定输入范围\n再次修复光电3 & 4 的计算( 希望现在100%)\n添加一些更具体的调试消息\n删除适配器启动时的错误消息\n检查时替换重新启动 有调试消息的国家Job(我认为Zendure云已经稳定了)\n更新适配器到适配器-反应-v5(MUI v5)\n在设置中修正命令栏"
18
+ },
6
19
  "3.1.1": {
7
20
  "en": "Fix Uppercase 'a4ss5p' in helpers.ts",
8
21
  "de": "Großbuchstaben 'a4ss5p' in helpers.ts",
@@ -80,19 +93,6 @@
80
93
  "pl": "Fix inputLimit wydania\nNaprawianie stanu Wifi nie aktualizuje się przy zmianie PackData",
81
94
  "uk": "Виправлення вхідного номера\nВиправлення стану Wifi не оновлення при зміні пакетаData",
82
95
  "zh-cn": "修正输入范围\nBackData 更改时不更新 Wifi 状态"
83
- },
84
- "3.0.3": {
85
- "en": "Optimize setting of wifiMode in local mode\nOptimize Debug option",
86
- "de": "Optimieren Sie die Einstellung von wifiMode im lokalen Modus\nOptimierung der Debug-Option",
87
- "ru": "Оптимизируйте настройку WiFiMode в локальном режиме\nОптимизируйте опцию Debug",
88
- "pt": "Otimizar a configuração do wifiMode no modo local\nOtimizar a opção de depuração",
89
- "nl": "Optimaliseer de instelling van wifiMode in lokale modus\nOptimaliseer debug-optie",
90
- "fr": "Optimiser le réglage du wifiMode en mode local\nOptimiser l'option de débogage",
91
- "it": "Ottimizzare l'impostazione di wifiMode in modalità locale\nOttimizzare l'opzione Debug",
92
- "es": "Optimize setting of wifiMode in local mode\nOpción Optimize Debug",
93
- "pl": "Optymalizacja ustawień WifiMode w trybie lokalnym\nOptymalizacja opcji debugowania",
94
- "uk": "Оптимізуйте налаштування wifiMode в локальному режимі\nОптимізуйте опцію Debug",
95
- "zh-cn": "优化本地模式的 wifiMode 设置\n优化调试选项"
96
96
  }
97
97
  },
98
98
  "titleLang": {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "iobroker.zendure-solarflow",
3
- "version": "3.1.1",
3
+ "version": "3.2.0",
4
4
  "description": "zendure-solarflow",
5
5
  "author": {
6
6
  "name": "Peter",
@@ -22,19 +22,24 @@
22
22
  },
23
23
  "dependencies": {
24
24
  "@iobroker/adapter-core": "^3.2.3",
25
+ "@mui/styles": "^5.10.9",
25
26
  "@types/node-schedule": "^2.1.6",
26
27
  "axios": "^1.9.0",
28
+ "babel-eslint": "^10.1.0",
27
29
  "mqtt": "^5.14.1"
28
30
  },
29
31
  "devDependencies": {
30
32
  "@alcalzone/release-script": "^3.8.0",
31
33
  "@alcalzone/release-script-plugin-iobroker": "^3.7.2",
32
- "@alcalzone/release-script-plugin-license": "^3.5.9",
33
- "@alcalzone/release-script-plugin-manual-review": "^3.5.9",
34
+ "@alcalzone/release-script-plugin-license": "^3.7.0",
35
+ "@alcalzone/release-script-plugin-manual-review": "^3.7.0",
36
+ "@emotion/react": "^11.11.0",
37
+ "@emotion/styled": "^11.11.0",
34
38
  "@iobroker/adapter-dev": "^1.4.0",
35
39
  "@iobroker/adapter-react": "^2.2.4",
40
+ "@iobroker/adapter-react-v5": "^8.0.13",
36
41
  "@iobroker/testing": "^5.0.4",
37
- "@material-ui/core": "^4.12.4",
42
+ "@mui/material": "^5.14.11",
38
43
  "@tsconfig/node16": "^16.1.1",
39
44
  "@types/chai": "^4.3.6",
40
45
  "@types/chai-as-promised": "^8.0.2",
@@ -54,8 +59,8 @@
54
59
  "mocha": "^10.2.0",
55
60
  "prettier": "^3.6.2",
56
61
  "proxyquire": "^2.1.3",
57
- "react": "^17.0.2",
58
- "react-dom": "^17.0.2",
62
+ "react": "^19.2.1",
63
+ "react-dom": "^19.2.1",
59
64
  "rimraf": "^5.0.5",
60
65
  "sinon": "^21.0.0",
61
66
  "sinon-chai": "^3.7.0",