iobroker.zendure-solarflow 0.1.0-alpha.2 → 1.0.2
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 +13 -0
- package/admin/build/index.css.map +1 -1
- package/admin/build/index.js +52 -29
- package/admin/build/index.js.map +4 -4
- package/build/main.js +9 -7
- package/build/main.js.map +2 -2
- package/build/services/adapterService.js +95 -50
- package/build/services/adapterService.js.map +2 -2
- package/build/services/mqttService.js +5 -5
- package/build/services/mqttService.js.map +2 -2
- package/build/services/webService.js +8 -7
- package/build/services/webService.js.map +3 -3
- package/io-package.json +40 -4
- package/package.json +8 -8
- package/admin/.watch/index.css +0 -270
- package/admin/.watch/index.js +0 -59658
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/services/mqttService.ts"],
|
|
4
|
-
"sourcesContent": ["/* eslint-disable @typescript-eslint/indent */\r\nimport { MqttClient } from \"mqtt\";\r\nimport * as mqtt from \"mqtt\";\r\nimport { ZendureSolarflow } from \"../main\";\r\nimport { ISolarFlowDeviceDetails } from \"../models/ISolarFlowDeviceDetails\";\r\nimport { addOrUpdatePackData, createSolarFlowStates, updateSolarFlowState } from \"./adapterService\";\r\n\r\nlet client: MqttClient | undefined = undefined;\r\nlet adapter: ZendureSolarflow | undefined = undefined;\r\n\r\nconst onConnected = (): void => {\r\n adapter?.log.info(\"Connected with MQTT!\");\r\n};\r\n\r\nconst onError = (error: any): void => {\r\n adapter?.log.error(\"Connection to MQTT failed! Error: \" + error);\r\n};\r\n\r\nconst onSubscribe: any = (error: Error | null) => {\r\n if (error) {\r\n adapter?.log.error(\"Subscription to MQTT failed! Error: \" + error);\r\n } else {\r\n adapter?.log.
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAEA,WAAsB;AAGtB,4BAAiF;AAEjF,IAAI,SAAiC;AACrC,IAAI,UAAwC;AAE5C,MAAM,cAAc,MAAY;AAC9B,qCAAS,IAAI,KAAK;AACpB;AAEA,MAAM,UAAU,CAAC,UAAqB;AACpC,qCAAS,IAAI,MAAM,uCAAuC;AAC5D;AAEA,MAAM,cAAmB,CAAC,UAAwB;AAChD,MAAI,OAAO;AACT,uCAAS,IAAI,MAAM,yCAAyC;AAAA,EAC9D,OAAO;AACL,uCAAS,IAAI,
|
|
4
|
+
"sourcesContent": ["/* eslint-disable @typescript-eslint/indent */\r\nimport { MqttClient } from \"mqtt\";\r\nimport * as mqtt from \"mqtt\";\r\nimport { ZendureSolarflow } from \"../main\";\r\nimport { ISolarFlowDeviceDetails } from \"../models/ISolarFlowDeviceDetails\";\r\nimport { addOrUpdatePackData, createSolarFlowStates, updateSolarFlowState } from \"./adapterService\";\r\n\r\nlet client: MqttClient | undefined = undefined;\r\nlet adapter: ZendureSolarflow | undefined = undefined;\r\n\r\nconst onConnected = (): void => {\r\n adapter?.log.info(\"Connected with MQTT!\");\r\n};\r\n\r\nconst onError = (error: any): void => {\r\n adapter?.log.error(\"Connection to MQTT failed! Error: \" + error);\r\n};\r\n\r\nconst onSubscribe: any = (error: Error | null) => {\r\n if (error) {\r\n adapter?.log.error(\"Subscription to MQTT failed! Error: \" + error);\r\n } else {\r\n adapter?.log.debug(\"Subscription successful!\");\r\n }\r\n};\r\n\r\nconst onMessage = async (topic: string, message: Buffer): Promise<void> => {\r\n if (adapter) {\r\n const splitted = topic.split(\"/\");\r\n const productKey = splitted[1];\r\n const deviceKey = splitted[2];\r\n\r\n const obj = JSON.parse(message.toString());\r\n\r\n // lastUpdate f\u00FCr den deviceKey setzen\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"lastUpdate\",\r\n new Date().getTime(),\r\n );\r\n\r\n if (\r\n obj.properties?.electricLevel != null &&\r\n obj.properties?.electricLevel != undefined\r\n ) {\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"electricLevel\",\r\n obj.properties.electricLevel,\r\n );\r\n }\r\n\r\n if (\r\n obj.properties?.outputHomePower != null &&\r\n obj.properties?.outputHomePower != undefined\r\n ) {\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"outputHomePower\",\r\n obj.properties.outputHomePower,\r\n );\r\n }\r\n\r\n if (\r\n obj.properties?.outputLimit != null &&\r\n obj.properties?.outputLimit != undefined\r\n ) {\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"outputLimit\",\r\n obj.properties.outputLimit,\r\n );\r\n }\r\n\r\n if (\r\n obj.properties?.outputPackPower != null &&\r\n obj.properties?.outputPackPower != undefined\r\n ) {\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"outputPackPower\",\r\n obj.properties.outputPackPower,\r\n );\r\n\r\n // if outPutPackPower set packInputPower to 0\r\n updateSolarFlowState(adapter, productKey, deviceKey, \"packInputPower\", 0);\r\n }\r\n\r\n if (\r\n obj.properties?.packInputPower != null &&\r\n obj.properties?.packInputPower != undefined\r\n ) {\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"packInputPower\",\r\n obj.properties.packInputPower,\r\n );\r\n\r\n // if packInputPower set outputPackPower to 0\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"outputPackPower\",\r\n 0,\r\n );\r\n }\r\n\r\n if (\r\n obj.properties?.solarInputPower != null &&\r\n obj.properties?.solarInputPower != undefined\r\n ) {\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"solarInputPower\",\r\n obj.properties.solarInputPower,\r\n );\r\n }\r\n\r\n if (\r\n obj.properties?.remainInputTime != null &&\r\n obj.properties?.remainInputTime != undefined\r\n ) {\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"remainInputTime\",\r\n obj.properties.remainInputTime,\r\n );\r\n }\r\n\r\n if (\r\n obj.properties?.remainOutTime != null &&\r\n obj.properties?.remainOutTime != undefined\r\n ) {\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"remainOutTime\",\r\n obj.properties.remainOutTime,\r\n );\r\n }\r\n\r\n if (obj.properties?.socSet != null && obj.properties?.socSet != undefined) {\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"socSet\",\r\n Number(obj.properties.socSet) / 10,\r\n );\r\n }\r\n\r\n if (obj.properties?.minSoc != null && obj.properties?.minSoc != undefined) {\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"minSoc\",\r\n Number(obj.properties.minSoc) / 10,\r\n );\r\n }\r\n\r\n if (obj.packData) {\r\n addOrUpdatePackData(adapter, productKey, deviceKey, obj.packData);\r\n }\r\n }\r\n\r\n if (client) {\r\n //client.end();\r\n }\r\n};\r\n\r\nexport const setOutputLimit = async (\r\n adapter: ZendureSolarflow,\r\n productKey: string,\r\n deviceKey: string,\r\n limit: number,\r\n): Promise<void> => {\r\n if (client && productKey && deviceKey) {\r\n // Das Limit kann unter 100 nur in 30er Schritten gesetzt werden, dH. 30/60/90/100, wir rechnen das also um\r\n const currentLimit = (\r\n await adapter.getStateAsync(productKey + \".\" + deviceKey + \".outputLimit\")\r\n )?.val;\r\n\r\n if (currentLimit != null && currentLimit != undefined) {\r\n if (currentLimit != limit) {\r\n if (\r\n limit < 100 &&\r\n limit != 90 &&\r\n limit != 60 &&\r\n limit != 30 &&\r\n limit != 0\r\n ) {\r\n if (limit < 100 && limit > 90) {\r\n limit = 90;\r\n } else if (limit < 90 && limit > 60) {\r\n limit = 60;\r\n } else if (limit < 60 && limit > 30) {\r\n limit = 30;\r\n } else if (limit < 30) {\r\n limit = 30;\r\n }\r\n }\r\n\r\n // 'iot/{auth.productKey}/{auth.deviceKey}/properties/write' == Topic? Oder productKey,deviceKey aus Device Details?\r\n const topic = `iot/${productKey}/${deviceKey}/properties/write`;\r\n\r\n const outputlimit = { properties: { outputLimit: limit } };\r\n adapter.log.debug(\r\n `Setting Output Limit for device key ${deviceKey} to ${limit}!`,\r\n );\r\n client?.publish(topic, JSON.stringify(outputlimit));\r\n } else {\r\n adapter.log.debug(\r\n `Output Limit for device key ${deviceKey} is already at ${limit}!`,\r\n );\r\n }\r\n }\r\n }\r\n};\r\n\r\nexport const connectMqttClient = (_adapter: ZendureSolarflow): void => {\r\n adapter = _adapter;\r\n\r\n const options: mqtt.IClientOptions = {\r\n clientId: adapter.accessToken,\r\n username: \"zenApp\",\r\n password: \"oK#PCgy6OZxd\",\r\n clean: true,\r\n protocolVersion: 5,\r\n };\r\n\r\n if (mqtt && adapter && adapter.paths) {\r\n client = mqtt.connect(\r\n \"mqtt://\" + adapter.paths.mqttUrl + \":\" + adapter.paths.mqttPort,\r\n options,\r\n ); // create a client\r\n\r\n if (client && adapter) {\r\n client.on(\"connect\", onConnected);\r\n client.on(\"error\", onError);\r\n\r\n // Subscribe to Topic (appkey von Zendure)\r\n adapter.deviceList.forEach((device: ISolarFlowDeviceDetails) => {\r\n // States erstellen\r\n if (adapter) {\r\n createSolarFlowStates(adapter, device.productKey, device.deviceKey);\r\n\r\n // Set electricLevel (soc) from device details.\r\n updateSolarFlowState(\r\n adapter,\r\n device.productKey,\r\n device.deviceKey,\r\n \"electricLevel\",\r\n device.electricity,\r\n );\r\n\r\n const reportTopic = `/${device.productKey}/${device.deviceKey}/properties/report`;\r\n const iotTopic = `iot/${device.productKey}/${device.deviceKey}/#`;\r\n\r\n adapter.log.debug(`Subscribing to MQTT Topic: ${reportTopic}`);\r\n client?.subscribe(reportTopic, onSubscribe);\r\n adapter.log.debug(`Subscribing to MQTT Topic: ${iotTopic}`);\r\n client?.subscribe(iotTopic, onSubscribe);\r\n }\r\n });\r\n\r\n client.on(\"message\", onMessage);\r\n }\r\n }\r\n};\r\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["adapter"]
|
|
7
7
|
}
|
|
@@ -42,10 +42,12 @@ const config = {
|
|
|
42
42
|
}
|
|
43
43
|
};
|
|
44
44
|
const login = (adapter) => {
|
|
45
|
-
var _a;
|
|
46
45
|
const auth = Buffer.from(
|
|
47
46
|
`${adapter.config.userName}:${adapter.config.password}`
|
|
48
47
|
).toString("base64");
|
|
48
|
+
if (!config || !config.headers) {
|
|
49
|
+
return Promise.reject("No axios config!");
|
|
50
|
+
}
|
|
49
51
|
config.headers.Authorization = "Basic " + auth;
|
|
50
52
|
const authBody = {
|
|
51
53
|
password: adapter.config.password,
|
|
@@ -55,13 +57,12 @@ const login = (adapter) => {
|
|
|
55
57
|
grantType: "password",
|
|
56
58
|
tenantId: ""
|
|
57
59
|
};
|
|
58
|
-
adapter.log.info("tokenurl: " + ((_a = adapter == null ? void 0 : adapter.paths) == null ? void 0 : _a.solarFlowTokenUrl));
|
|
59
60
|
if (adapter.paths && adapter.paths.solarFlowTokenUrl) {
|
|
60
61
|
return import_axios.default.post(adapter.paths.solarFlowTokenUrl, authBody, config).then(function(response) {
|
|
61
|
-
var
|
|
62
|
+
var _a, _b;
|
|
62
63
|
if (response.data.success) {
|
|
63
64
|
adapter.log.info("Login to Rest API successful!");
|
|
64
|
-
if ((_b = (
|
|
65
|
+
if ((_b = (_a = response.data) == null ? void 0 : _a.data) == null ? void 0 : _b.accessToken) {
|
|
65
66
|
return response.data.data.accessToken;
|
|
66
67
|
}
|
|
67
68
|
}
|
|
@@ -73,9 +74,9 @@ const login = (adapter) => {
|
|
|
73
74
|
return Promise.reject("Path error!");
|
|
74
75
|
};
|
|
75
76
|
const getDeviceList = (adapter) => {
|
|
76
|
-
adapter.setState("errorMessage", "");
|
|
77
|
-
adapter.log.
|
|
78
|
-
if (adapter.accessToken) {
|
|
77
|
+
adapter.setState("errorMessage", "no_error");
|
|
78
|
+
adapter.log.debug("Getting device list from Zendure Rest API!");
|
|
79
|
+
if (adapter.accessToken && config && config.headers) {
|
|
79
80
|
config.headers["Blade-Auth"] = "bearer " + adapter.accessToken;
|
|
80
81
|
const body = {};
|
|
81
82
|
let paths = void 0;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/services/webService.ts"],
|
|
4
|
-
"sourcesContent": ["/* eslint-disable @typescript-eslint/indent */\r\nimport { pathsEu, pathsGlobal } from \"../constants/paths\";\r\nimport { ZendureSolarflow } from \"../main\";\r\nimport axios from \"axios\";\r\nimport { ISolarFlowDeviceDetails } from \"../models/ISolarFlowDeviceDetails\";\r\n\r\nconst config = {\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n \"Accept-Language\": \"de-DE\",\r\n appVersion: \"4.3.1\",\r\n \"User-Agent\": \"Zendure/4.3.1 (iPhone; iOS 14.4.2; Scale/3.00)\",\r\n Accept: \"*/*\",\r\n Authorization: \"Basic Q29uc3VtZXJBcHA6NX4qUmRuTnJATWg0WjEyMw==\",\r\n \"Blade-Auth\": \"bearer (null)\",\r\n },\r\n};\r\n\r\n/* eslint-disable @typescript-eslint/indent */\r\nexport const login = (adapter: ZendureSolarflow): Promise<string> => {\r\n const auth = Buffer.from(\r\n `${adapter.config.userName}:${adapter.config.password}`,\r\n ).toString(\"base64\");\r\n\r\n config.headers.Authorization = \"Basic \" + auth;\r\n\r\n const authBody = {\r\n password: adapter.config.password,\r\n account: adapter.config.userName,\r\n appId: \"121c83f761305d6cf7b\",\r\n appType: \"iOS\",\r\n grantType: \"password\",\r\n tenantId: \"\",\r\n };\r\n
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,mBAAqC;AAErC,
|
|
6
|
-
"names": ["axios"
|
|
4
|
+
"sourcesContent": ["/* eslint-disable @typescript-eslint/indent */\r\nimport { pathsEu, pathsGlobal } from \"../constants/paths\";\r\nimport { ZendureSolarflow } from \"../main\";\r\nimport axios, { AxiosRequestConfig } from \"axios\";\r\nimport { ISolarFlowDeviceDetails } from \"../models/ISolarFlowDeviceDetails\";\r\n\r\nconst config: AxiosRequestConfig = {\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n \"Accept-Language\": \"de-DE\",\r\n appVersion: \"4.3.1\",\r\n \"User-Agent\": \"Zendure/4.3.1 (iPhone; iOS 14.4.2; Scale/3.00)\",\r\n Accept: \"*/*\",\r\n Authorization: \"Basic Q29uc3VtZXJBcHA6NX4qUmRuTnJATWg0WjEyMw==\",\r\n \"Blade-Auth\": \"bearer (null)\",\r\n },\r\n};\r\n\r\n/* eslint-disable @typescript-eslint/indent */\r\nexport const login = (adapter: ZendureSolarflow): Promise<string> => {\r\n const auth = Buffer.from(\r\n `${adapter.config.userName}:${adapter.config.password}`,\r\n ).toString(\"base64\");\r\n\r\n if (!config || !config.headers) {\r\n return Promise.reject(\"No axios config!\");\r\n }\r\n\r\n config.headers.Authorization = \"Basic \" + auth;\r\n\r\n const authBody = {\r\n password: adapter.config.password,\r\n account: adapter.config.userName,\r\n appId: \"121c83f761305d6cf7b\",\r\n appType: \"iOS\",\r\n grantType: \"password\",\r\n tenantId: \"\",\r\n };\r\n\r\n if (adapter.paths && adapter.paths.solarFlowTokenUrl) {\r\n return axios\r\n .post(adapter.paths.solarFlowTokenUrl, authBody, config)\r\n .then(function (response) {\r\n if (response.data.success) {\r\n adapter.log.info(\"Login to Rest API successful!\");\r\n\r\n if (response.data?.data?.accessToken) {\r\n return response.data.data.accessToken;\r\n }\r\n }\r\n })\r\n .catch(function (error) {\r\n adapter.log.error(error);\r\n return Promise.reject(\"Failed to login to Zendure REST API!\");\r\n });\r\n } else return Promise.reject(\"Path error!\");\r\n};\r\n\r\nexport const getDeviceList = (\r\n adapter: ZendureSolarflow,\r\n): Promise<ISolarFlowDeviceDetails[]> => {\r\n adapter.setState(\"errorMessage\", \"no_error\");\r\n adapter.log.debug(\"Getting device list from Zendure Rest API!\");\r\n\r\n if (adapter.accessToken && config && config.headers) {\r\n config.headers[\"Blade-Auth\"] = \"bearer \" + adapter.accessToken;\r\n\r\n const body = {};\r\n\r\n let paths = undefined;\r\n\r\n if (adapter.config.server == \"eu\") {\r\n paths = pathsEu;\r\n } else {\r\n paths = pathsGlobal;\r\n }\r\n\r\n return axios\r\n .post(paths.solarFlowQueryDeviceListUrl, JSON.stringify(body), config)\r\n .then(function (response) {\r\n if (response.data.data && response.data.data.length > 0) {\r\n return response.data.data as ISolarFlowDeviceDetails[];\r\n } else {\r\n return [];\r\n }\r\n });\r\n } else {\r\n adapter.log.error(\"No Access Token found!\");\r\n return Promise.reject(\"No Access Token found!\");\r\n }\r\n};\r\n\r\n/* export const createDeveloperAccount = (adapter: ZendureSolarflow) => {\r\n adapter.log.info(\"Function createDeveloperAccount\");\r\n\r\n adapter.setState(\"errorMessage\", \"\");\r\n\r\n const body = {\r\n snNumber: adapter.snNumber,\r\n account: adapter.config.userName,\r\n };\r\n\r\n let paths = undefined;\r\n\r\n if (adapter.config.server == \"eu\") {\r\n paths = pathsEu;\r\n } else {\r\n paths = pathsGlobal;\r\n }\r\n\r\n return axios\r\n .post(paths.solarFlowDevRegisterUrl, JSON.stringify(body), config)\r\n .then(function (response) {\r\n adapter.log.info(\"Successfully created Developer Account!\");\r\n\r\n if (response.data && response.data.success == true) {\r\n return response.data.data;\r\n } else {\r\n console.warn(\"No Response Data!\");\r\n return undefined;\r\n }\r\n })\r\n .catch(function (error) {\r\n adapter.setObjectNotExists(\"errorMessage\", {\r\n type: \"state\",\r\n common: {\r\n name: \"errorMessage\",\r\n type: \"string\",\r\n role: \"indicator\",\r\n read: true,\r\n write: true,\r\n },\r\n native: {},\r\n });\r\n adapter.setState(\r\n \"errorMessage\",\r\n error.response?.data?.code + \" - \" + error.response.data.msg,\r\n );\r\n\r\n if (error.response?.data?.code && error.response?.data?.msg) {\r\n // The request was made and the server responded with a status code\r\n // that falls out of the range of 2xx\r\n adapter.log.error(\r\n \"Failed to created Zendure Developer Account: \" +\r\n error.response?.data?.code +\r\n \" - \" +\r\n error.response.data.msg,\r\n );\r\n }\r\n\r\n return Promise.reject(\"Failed to created Zendure Developer Account!\");\r\n });\r\n};*/\r\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,mBAAqC;AAErC,mBAA0C;AAG1C,MAAM,SAA6B;AAAA,EACjC,SAAS;AAAA,IACP,gBAAgB;AAAA,IAChB,mBAAmB;AAAA,IACnB,YAAY;AAAA,IACZ,cAAc;AAAA,IACd,QAAQ;AAAA,IACR,eAAe;AAAA,IACf,cAAc;AAAA,EAChB;AACF;AAGO,MAAM,QAAQ,CAAC,YAA+C;AACnE,QAAM,OAAO,OAAO;AAAA,IAClB,GAAG,QAAQ,OAAO,YAAY,QAAQ,OAAO;AAAA,EAC/C,EAAE,SAAS,QAAQ;AAEnB,MAAI,CAAC,UAAU,CAAC,OAAO,SAAS;AAC9B,WAAO,QAAQ,OAAO,kBAAkB;AAAA,EAC1C;AAEA,SAAO,QAAQ,gBAAgB,WAAW;AAE1C,QAAM,WAAW;AAAA,IACf,UAAU,QAAQ,OAAO;AAAA,IACzB,SAAS,QAAQ,OAAO;AAAA,IACxB,OAAO;AAAA,IACP,SAAS;AAAA,IACT,WAAW;AAAA,IACX,UAAU;AAAA,EACZ;AAEA,MAAI,QAAQ,SAAS,QAAQ,MAAM,mBAAmB;AACpD,WAAO,aAAAA,QACJ,KAAK,QAAQ,MAAM,mBAAmB,UAAU,MAAM,EACtD,KAAK,SAAU,UAAU;AA1ChC;AA2CQ,UAAI,SAAS,KAAK,SAAS;AACzB,gBAAQ,IAAI,KAAK,+BAA+B;AAEhD,aAAI,oBAAS,SAAT,mBAAe,SAAf,mBAAqB,aAAa;AACpC,iBAAO,SAAS,KAAK,KAAK;AAAA,QAC5B;AAAA,MACF;AAAA,IACF,CAAC,EACA,MAAM,SAAU,OAAO;AACtB,cAAQ,IAAI,MAAM,KAAK;AACvB,aAAO,QAAQ,OAAO,sCAAsC;AAAA,IAC9D,CAAC;AAAA,EACL;AAAO,WAAO,QAAQ,OAAO,aAAa;AAC5C;AAEO,MAAM,gBAAgB,CAC3B,YACuC;AACvC,UAAQ,SAAS,gBAAgB,UAAU;AAC3C,UAAQ,IAAI,MAAM,4CAA4C;AAE9D,MAAI,QAAQ,eAAe,UAAU,OAAO,SAAS;AACnD,WAAO,QAAQ,gBAAgB,YAAY,QAAQ;AAEnD,UAAM,OAAO,CAAC;AAEd,QAAI,QAAQ;AAEZ,QAAI,QAAQ,OAAO,UAAU,MAAM;AACjC,cAAQ;AAAA,IACV,OAAO;AACL,cAAQ;AAAA,IACV;AAEA,WAAO,aAAAA,QACJ,KAAK,MAAM,6BAA6B,KAAK,UAAU,IAAI,GAAG,MAAM,EACpE,KAAK,SAAU,UAAU;AACxB,UAAI,SAAS,KAAK,QAAQ,SAAS,KAAK,KAAK,SAAS,GAAG;AACvD,eAAO,SAAS,KAAK;AAAA,MACvB,OAAO;AACL,eAAO,CAAC;AAAA,MACV;AAAA,IACF,CAAC;AAAA,EACL,OAAO;AACL,YAAQ,IAAI,MAAM,wBAAwB;AAC1C,WAAO,QAAQ,OAAO,wBAAwB;AAAA,EAChD;AACF;",
|
|
6
|
+
"names": ["axios"]
|
|
7
7
|
}
|
package/io-package.json
CHANGED
|
@@ -1,8 +1,47 @@
|
|
|
1
1
|
{
|
|
2
2
|
"common": {
|
|
3
3
|
"name": "zendure-solarflow",
|
|
4
|
-
"version": "
|
|
4
|
+
"version": "1.0.2",
|
|
5
5
|
"news": {
|
|
6
|
+
"1.0.2": {
|
|
7
|
+
"en": "Adapter improvements suggested by iobroker team\nFixed battery pack temperature (data is in kelvin, so now converting to celcius)",
|
|
8
|
+
"de": "Adapter Verbesserungen vorgeschlagen von iobroker team\nFeste Akku-Pack-Temperatur (Daten sind in Kelvin, also jetzt in celcius umwandeln)",
|
|
9
|
+
"ru": "Улучшения адаптера, предложенные командой iobroker\nФиксированная температура аккумулятора (данные находятся в kelvin, поэтому теперь преобразование в celcius)",
|
|
10
|
+
"pt": "Melhorias do adaptador sugeridas pela equipe iobroker\nTemperatura do pacote de bateria fixa (os dados estão em kelvin, então agora convertendo em celcius)",
|
|
11
|
+
"nl": "Adapter verbetering suggereert\nGerepareerde batterijttemperatuur (data is in kelvin, dus nu omkeren naar Cecius)",
|
|
12
|
+
"fr": "Amélioration de l'adaptateur suggérée par l'équipe iobroker\nTempérature de la batterie fixe (les données sont dans kelvin, donc maintenant convertir en celcius)",
|
|
13
|
+
"it": "Miglioramenti dell'adattatore suggeriti dal team di iobroker\nTemperatura del pacchetto batterie fissa (i dati sono in kelvin, quindi ora convertiti in celcius)",
|
|
14
|
+
"es": "Mejoras del adaptador sugeridas por el equipo de iobroker\nTemperatura de paquete de batería fija (data está en kelvin, por lo que ahora se convierte en celcio)",
|
|
15
|
+
"pl": "Adapter ulepszenia sugerowały zespół iobroker\nFixed battery pack temperature (data jest w kelvinu, więc teraz przekształca się w celcius)",
|
|
16
|
+
"uk": "Покращення адаптерів, запропонованих командою iobroker\nФіксована температура пакета акумулятора (data is in kelvin, тому тепер перетворюється в celcius)",
|
|
17
|
+
"zh-cn": "气雾器组建议的改进\n固定电池的包装温度(数据是镍vin,因此现在转换为管道)。"
|
|
18
|
+
},
|
|
19
|
+
"1.0.1": {
|
|
20
|
+
"en": "Fix translations\nUse 'extendObjectAsync' instead of 'setObjectNotExistsAsync'\nFirst official release version",
|
|
21
|
+
"de": "Übersetzungen löschen\nErweiterung ObjectAsync statt Set Gegenstand NichtExistsAsync\nErste offizielle Version",
|
|
22
|
+
"ru": "Fix переводы\nИспользуйте удлинить ObjectAsync вместо набора Объект NotExistsAsync\nПервая официальная версия релиза",
|
|
23
|
+
"pt": "Corrigir traduções\nUso de extensão ObjectAsync em vez de set Objeto NotExistsAsync\nPrimeira versão oficial do lançamento",
|
|
24
|
+
"nl": "Vertaling:\nGebruik verlenging ObjectAsync in plaats van Object NCIS Los Angeles\nEerste officiële vrijlating",
|
|
25
|
+
"fr": "Traductions fixes\nExtension d ' utilisation ObjectAsync au lieu de set Objet NotExistsAsync\nPremière version officielle",
|
|
26
|
+
"it": "Fissare le traduzioni\nEsterni di utilizzo ObjectAsync invece di set Oggetto Non esiste\nPrima versione ufficiale di rilascio",
|
|
27
|
+
"es": "Traducción fija\nAmpliación de uso ObjectAsync en lugar de set Objeto NoExistsAsync\nPrimera versión oficial",
|
|
28
|
+
"pl": "Tłumaczenia Fix\nRozszerzenie ObjectAsync zamiast zbioru obiekt NotExsAsync\nOficjalna wersja",
|
|
29
|
+
"uk": "Виправлення перекладів\nВикористання розширення Об'єктАсинхрон замість набору Об'єкт НеExistsAsync\nПерша офіційна версія випуску",
|
|
30
|
+
"zh-cn": "固定翻译\n使用 反对 目 录 专家\n第一次正式释放"
|
|
31
|
+
},
|
|
32
|
+
"1.0.0": {
|
|
33
|
+
"en": "Fix translations\nUse 'extendObjectAsync' instead of 'setObjectNotExistsAsync'\nFirst official release version",
|
|
34
|
+
"de": "Übersetzungen löschen\nErweiterung ObjectAsync statt Set Gegenstand NichtExistsAsync\nErste offizielle Version",
|
|
35
|
+
"ru": "Fix переводы\nИспользуйте удлинить ObjectAsync вместо набора Объект NotExistsAsync\nПервая официальная версия релиза",
|
|
36
|
+
"pt": "Corrigir traduções\nUso de extensão ObjectAsync em vez de set Objeto NotExistsAsync\nPrimeira versão oficial do lançamento",
|
|
37
|
+
"nl": "Vertaling:\nGebruik verlenging ObjectAsync in plaats van Object NCIS Los Angeles\nEerste officiële vrijlating",
|
|
38
|
+
"fr": "Traductions fixes\nExtension d ' utilisation ObjectAsync au lieu de set Objet NotExistsAsync\nPremière version officielle",
|
|
39
|
+
"it": "Fissare le traduzioni\nEsterni di utilizzo ObjectAsync invece di set Oggetto Non esiste\nPrima versione ufficiale di rilascio",
|
|
40
|
+
"es": "Traducción fija\nAmpliación de uso ObjectAsync en lugar de set Objeto NoExistsAsync\nPrimera versión oficial",
|
|
41
|
+
"pl": "Tłumaczenia Fix\nRozszerzenie ObjectAsync zamiast zbioru obiekt NotExsAsync\nOficjalna wersja",
|
|
42
|
+
"uk": "Виправлення перекладів\nВикористання розширення Об'єктАсинхрон замість набору Об'єкт НеExistsAsync\nПерша офіційна версія випуску",
|
|
43
|
+
"zh-cn": "固定翻译\n使用 反对 目 录 专家\n第一次正式释放"
|
|
44
|
+
},
|
|
6
45
|
"0.1.0-alpha.2": {
|
|
7
46
|
"en": "Don't stop the adapter when no login information is provided!",
|
|
8
47
|
"de": "Stoppen Sie den Adapter nicht, wenn keine Anmeldeinformationen zur Verfügung gestellt werden!",
|
|
@@ -54,9 +93,6 @@
|
|
|
54
93
|
"pl": "Pierwsze wydanie",
|
|
55
94
|
"uk": "Початкова версія",
|
|
56
95
|
"zh-cn": "首次出版"
|
|
57
|
-
},
|
|
58
|
-
"0.0.2": {
|
|
59
|
-
"en": "Bug fixes and improvements"
|
|
60
96
|
}
|
|
61
97
|
},
|
|
62
98
|
"title": "Zendure Solarflow",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "iobroker.zendure-solarflow",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "1.0.2",
|
|
4
4
|
"description": "zendure-solarflow",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Peter",
|
|
@@ -20,9 +20,9 @@
|
|
|
20
20
|
"node": ">= 16"
|
|
21
21
|
},
|
|
22
22
|
"dependencies": {
|
|
23
|
-
"@iobroker/adapter-core": "^3.0.
|
|
23
|
+
"@iobroker/adapter-core": "^3.0.4",
|
|
24
24
|
"axios": "^1.5.1",
|
|
25
|
-
"mqtt": "^5.1.
|
|
25
|
+
"mqtt": "^5.1.3"
|
|
26
26
|
},
|
|
27
27
|
"devDependencies": {
|
|
28
28
|
"@alcalzone/release-script": "^3.6.0",
|
|
@@ -30,20 +30,20 @@
|
|
|
30
30
|
"@alcalzone/release-script-plugin-license": "^3.5.9",
|
|
31
31
|
"@alcalzone/release-script-plugin-manual-review": "^3.5.9",
|
|
32
32
|
"@iobroker/adapter-dev": "^1.2.0",
|
|
33
|
-
"@iobroker/adapter-react": "2.
|
|
33
|
+
"@iobroker/adapter-react": "2.2.4",
|
|
34
34
|
"@iobroker/testing": "^4.1.0",
|
|
35
35
|
"@material-ui/core": "^4.12.4",
|
|
36
36
|
"@tsconfig/node16": "^16.1.1",
|
|
37
37
|
"@types/chai": "^4.3.6",
|
|
38
|
-
"@types/chai-as-promised": "^7.1.
|
|
38
|
+
"@types/chai-as-promised": "^7.1.8",
|
|
39
39
|
"@types/mocha": "^10.0.2",
|
|
40
40
|
"@types/node": "^16.18.57",
|
|
41
|
-
"@types/proxyquire": "^1.3.
|
|
41
|
+
"@types/proxyquire": "^1.3.30",
|
|
42
42
|
"@types/react": "^17.0.67",
|
|
43
43
|
"@types/react-dom": "^17.0.21",
|
|
44
44
|
"@types/sinon": "^10.0.18",
|
|
45
45
|
"@types/sinon-chai": "^3.2.10",
|
|
46
|
-
"@typescript-eslint/eslint-plugin": "^6.
|
|
46
|
+
"@typescript-eslint/eslint-plugin": "^6.9.0",
|
|
47
47
|
"@typescript-eslint/parser": "^6.7.4",
|
|
48
48
|
"chai": "^4.3.10",
|
|
49
49
|
"chai-as-promised": "^7.1.1",
|
|
@@ -58,7 +58,7 @@
|
|
|
58
58
|
"sinon-chai": "^3.7.0",
|
|
59
59
|
"source-map-support": "^0.5.21",
|
|
60
60
|
"ts-node": "^10.9.1",
|
|
61
|
-
"typescript": "~5.
|
|
61
|
+
"typescript": "~5.2.2"
|
|
62
62
|
},
|
|
63
63
|
"main": "build/main.js",
|
|
64
64
|
"files": [
|
package/admin/.watch/index.css
DELETED
|
@@ -1,270 +0,0 @@
|
|
|
1
|
-
/* node_modules/@iobroker/adapter-react/Components/loader.css */
|
|
2
|
-
.logo-background-light,
|
|
3
|
-
.logo-background-colored {
|
|
4
|
-
background: white;
|
|
5
|
-
}
|
|
6
|
-
.logo-background-dark,
|
|
7
|
-
.logo-background-blue {
|
|
8
|
-
background: black;
|
|
9
|
-
}
|
|
10
|
-
.logo-div {
|
|
11
|
-
position: absolute;
|
|
12
|
-
top: 50%;
|
|
13
|
-
left: 50%;
|
|
14
|
-
-ms-transform: translateX(-50%) translateY(-50%);
|
|
15
|
-
-webkit-transform: translate(-50%, -50%);
|
|
16
|
-
transform: translate(-50%, -50%);
|
|
17
|
-
overflow: hidden;
|
|
18
|
-
border-radius: 50%;
|
|
19
|
-
z-index: 2;
|
|
20
|
-
}
|
|
21
|
-
.logo-border {
|
|
22
|
-
border-top-color: #3399CC;
|
|
23
|
-
border-left-color: #164477;
|
|
24
|
-
border-bottom-color: #164477;
|
|
25
|
-
border-right-color: #164477;
|
|
26
|
-
border-radius: 50%;
|
|
27
|
-
border-style: solid;
|
|
28
|
-
box-sizing: border-box;
|
|
29
|
-
width: 100%;
|
|
30
|
-
height: 100%;
|
|
31
|
-
position: absolute;
|
|
32
|
-
}
|
|
33
|
-
.logo-top {
|
|
34
|
-
position: absolute;
|
|
35
|
-
width: 4.5%;
|
|
36
|
-
height: 16%;
|
|
37
|
-
top: 0;
|
|
38
|
-
z-index: 2;
|
|
39
|
-
}
|
|
40
|
-
.logo-i {
|
|
41
|
-
position: absolute;
|
|
42
|
-
width: 14.5%;
|
|
43
|
-
height: 60%;
|
|
44
|
-
top: 20%;
|
|
45
|
-
left: 42%;
|
|
46
|
-
background: #3399CC;
|
|
47
|
-
}
|
|
48
|
-
.logo-i-top {
|
|
49
|
-
position: absolute;
|
|
50
|
-
width: 14.5%;
|
|
51
|
-
height: 4%;
|
|
52
|
-
left: 42%;
|
|
53
|
-
background: #3399CC;
|
|
54
|
-
border-radius: 100%;
|
|
55
|
-
}
|
|
56
|
-
.logo-back {
|
|
57
|
-
width: 100%;
|
|
58
|
-
height: 100%;
|
|
59
|
-
z-index: 0;
|
|
60
|
-
overflow: hidden;
|
|
61
|
-
}
|
|
62
|
-
@keyframes logo-grow {
|
|
63
|
-
0% {
|
|
64
|
-
width: 230px;
|
|
65
|
-
height: 230px;
|
|
66
|
-
transform: translate(-50%, -50%) scale(1);
|
|
67
|
-
opacity: 1;
|
|
68
|
-
}
|
|
69
|
-
99% {
|
|
70
|
-
width: 230px;
|
|
71
|
-
height: 230px;
|
|
72
|
-
transform: translate(-50%, -50%) scale(10);
|
|
73
|
-
opacity: 0;
|
|
74
|
-
}
|
|
75
|
-
100% {
|
|
76
|
-
width: 0;
|
|
77
|
-
height: 0;
|
|
78
|
-
opacity: 0;
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
@keyframes logo-spin {
|
|
82
|
-
100% {
|
|
83
|
-
-webkit-transform: rotate(360deg);
|
|
84
|
-
transform: rotate(360deg);
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
@keyframes logo-color-inside-light {
|
|
88
|
-
0% {
|
|
89
|
-
background: #FEFEFE;
|
|
90
|
-
}
|
|
91
|
-
100% {
|
|
92
|
-
background: #3399CC;
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
@keyframes logo-color-inside-dark {
|
|
96
|
-
0% {
|
|
97
|
-
background: #030303;
|
|
98
|
-
}
|
|
99
|
-
100% {
|
|
100
|
-
background: #3399CC;
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
@keyframes logo-color-inside-colored {
|
|
104
|
-
0% {
|
|
105
|
-
background: #FEFEFE;
|
|
106
|
-
}
|
|
107
|
-
100% {
|
|
108
|
-
background: #3399CC;
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
@keyframes logo-color-inside-blue {
|
|
112
|
-
0% {
|
|
113
|
-
background: #030303;
|
|
114
|
-
}
|
|
115
|
-
100% {
|
|
116
|
-
background: #3399CC;
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
@keyframes logo-color-outside-light {
|
|
120
|
-
0% {
|
|
121
|
-
border-color: #FEFEFE;
|
|
122
|
-
}
|
|
123
|
-
100% {
|
|
124
|
-
border-top-color: #3399CC;
|
|
125
|
-
border-left-color: #164477;
|
|
126
|
-
border-bottom-color: #164477;
|
|
127
|
-
border-right-color: #164477;
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
@keyframes logo-color-outside-dark {
|
|
131
|
-
0% {
|
|
132
|
-
border-color: #040404;
|
|
133
|
-
}
|
|
134
|
-
100% {
|
|
135
|
-
border-top-color: #3399CC;
|
|
136
|
-
border-left-color: #164477;
|
|
137
|
-
border-bottom-color: #164477;
|
|
138
|
-
border-right-color: #164477;
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
@keyframes logo-color-outside-colored {
|
|
142
|
-
0% {
|
|
143
|
-
border-color: #FEFEFE;
|
|
144
|
-
}
|
|
145
|
-
100% {
|
|
146
|
-
border-top-color: #3399CC;
|
|
147
|
-
border-left-color: #164477;
|
|
148
|
-
border-bottom-color: #164477;
|
|
149
|
-
border-right-color: #164477;
|
|
150
|
-
}
|
|
151
|
-
}
|
|
152
|
-
@keyframes logo-color-outside-blue {
|
|
153
|
-
0% {
|
|
154
|
-
border-color: #040404;
|
|
155
|
-
}
|
|
156
|
-
100% {
|
|
157
|
-
border-top-color: #3399CC;
|
|
158
|
-
border-left-color: #164477;
|
|
159
|
-
border-bottom-color: #164477;
|
|
160
|
-
border-right-color: #164477;
|
|
161
|
-
}
|
|
162
|
-
}
|
|
163
|
-
.logo-animate-wait {
|
|
164
|
-
animation: logo-color-outside 1.5s, logo-spin 1.5s linear infinite;
|
|
165
|
-
}
|
|
166
|
-
.logo-animate-grow-light {
|
|
167
|
-
background: #DDD;
|
|
168
|
-
}
|
|
169
|
-
.logo-animate-grow-dark {
|
|
170
|
-
background: #1d1d1d;
|
|
171
|
-
}
|
|
172
|
-
.logo-animate-grow-colored {
|
|
173
|
-
background: #DDD;
|
|
174
|
-
}
|
|
175
|
-
.logo-animate-grow-blue {
|
|
176
|
-
background: #1d1d1d;
|
|
177
|
-
}
|
|
178
|
-
.logo-animate-grow {
|
|
179
|
-
display: inline-block;
|
|
180
|
-
text-align: center;
|
|
181
|
-
z-index: 1;
|
|
182
|
-
top: 50%;
|
|
183
|
-
left: 50%;
|
|
184
|
-
-ms-transform: translateX(-50%) translateY(-50%);
|
|
185
|
-
-webkit-transform: translate(-50%, -50%);
|
|
186
|
-
transform: translate(-50%, -50%);
|
|
187
|
-
width: 245px;
|
|
188
|
-
height: 245px;
|
|
189
|
-
border-radius: 50%;
|
|
190
|
-
position: absolute;
|
|
191
|
-
animation: logo-grow 1s 1 ease forwards;
|
|
192
|
-
}
|
|
193
|
-
.logo-animate-color-inside-light {
|
|
194
|
-
animation: logo-color-inside-light 2.5s;
|
|
195
|
-
}
|
|
196
|
-
.logo-animate-color-inside-dark {
|
|
197
|
-
animation: logo-color-inside-dark 2.5s;
|
|
198
|
-
}
|
|
199
|
-
.logo-animate-color-inside-colored {
|
|
200
|
-
animation: logo-color-inside-colored 2.5s;
|
|
201
|
-
}
|
|
202
|
-
.logo-animate-color-inside-blue {
|
|
203
|
-
animation: logo-color-inside-blue 2.5s;
|
|
204
|
-
}
|
|
205
|
-
.logo-animate-color-outside-light {
|
|
206
|
-
animation: logo-color-outside-light 1.5s;
|
|
207
|
-
}
|
|
208
|
-
.logo-animate-color-outside-dark {
|
|
209
|
-
animation: logo-color-outside-dark 1.5s;
|
|
210
|
-
}
|
|
211
|
-
.logo-animate-color-outside-colored {
|
|
212
|
-
animation: logo-color-outside-colored 1.5s;
|
|
213
|
-
}
|
|
214
|
-
.logo-animate-color-outside-blue {
|
|
215
|
-
animation: logo-color-outside-blue 1.5s;
|
|
216
|
-
}
|
|
217
|
-
|
|
218
|
-
/* node_modules/@iobroker/adapter-react/index.css */
|
|
219
|
-
html {
|
|
220
|
-
height: 100%;
|
|
221
|
-
}
|
|
222
|
-
body {
|
|
223
|
-
margin: 0;
|
|
224
|
-
padding: 0;
|
|
225
|
-
font-family:
|
|
226
|
-
-apple-system,
|
|
227
|
-
BlinkMacSystemFont,
|
|
228
|
-
"Segoe UI",
|
|
229
|
-
"Roboto",
|
|
230
|
-
"Oxygen",
|
|
231
|
-
"Ubuntu",
|
|
232
|
-
"Cantarell",
|
|
233
|
-
"Fira Sans",
|
|
234
|
-
"Droid Sans",
|
|
235
|
-
"Helvetica Neue",
|
|
236
|
-
sans-serif;
|
|
237
|
-
-webkit-font-smoothing: antialiased;
|
|
238
|
-
-moz-osx-font-smoothing: grayscale;
|
|
239
|
-
width: 100%;
|
|
240
|
-
height: 100%;
|
|
241
|
-
overflow: hidden;
|
|
242
|
-
}
|
|
243
|
-
::-webkit-scrollbar-track {
|
|
244
|
-
background-color: #ccc;
|
|
245
|
-
border-radius: 5px;
|
|
246
|
-
}
|
|
247
|
-
::-webkit-scrollbar {
|
|
248
|
-
width: 5px;
|
|
249
|
-
height: 5px;
|
|
250
|
-
background-color: #ccc;
|
|
251
|
-
}
|
|
252
|
-
::-webkit-scrollbar-thumb {
|
|
253
|
-
background-color: #575757;
|
|
254
|
-
border-radius: 5px;
|
|
255
|
-
}
|
|
256
|
-
#root {
|
|
257
|
-
height: 100%;
|
|
258
|
-
}
|
|
259
|
-
.App {
|
|
260
|
-
height: 100%;
|
|
261
|
-
}
|
|
262
|
-
@keyframes glow {
|
|
263
|
-
from {
|
|
264
|
-
background-color: initial;
|
|
265
|
-
}
|
|
266
|
-
to {
|
|
267
|
-
background-color: #58c458;
|
|
268
|
-
}
|
|
269
|
-
}
|
|
270
|
-
/*# sourceMappingURL=index.css.map */
|