iobroker.zendure-solarflow 1.0.7 → 1.1.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.
@@ -18,6 +18,10 @@ var __copyProps = (to, from, except, desc) => {
18
18
  return to;
19
19
  };
20
20
  var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
21
25
  isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
22
26
  mod
23
27
  ));
@@ -32,6 +36,7 @@ __export(mqttService_exports, {
32
36
  module.exports = __toCommonJS(mqttService_exports);
33
37
  var mqtt = __toESM(require("mqtt"));
34
38
  var import_adapterService = require("./adapterService");
39
+ var import_timeHelper = require("../helpers/timeHelper");
35
40
  let client = void 0;
36
41
  let adapter = void 0;
37
42
  const onConnected = () => {
@@ -59,7 +64,7 @@ const onMessage = async (topic, message) => {
59
64
  productKey,
60
65
  deviceKey,
61
66
  "lastUpdate",
62
- new Date().getTime()
67
+ (/* @__PURE__ */ new Date()).getTime()
63
68
  );
64
69
  if (((_a = obj.properties) == null ? void 0 : _a.electricLevel) != null && ((_b = obj.properties) == null ? void 0 : _b.electricLevel) != void 0) {
65
70
  (0, import_adapterService.updateSolarFlowState)(
@@ -128,7 +133,8 @@ const onMessage = async (topic, message) => {
128
133
  adapter,
129
134
  productKey,
130
135
  deviceKey,
131
- "pvPower1",
136
+ "pvPower2",
137
+ // Reversed to adjust like offical app
132
138
  obj.properties.pvPower1
133
139
  );
134
140
  }
@@ -137,7 +143,8 @@ const onMessage = async (topic, message) => {
137
143
  adapter,
138
144
  productKey,
139
145
  deviceKey,
140
- "pvPower2",
146
+ "pvPower1",
147
+ // Reversed to adjust like offical app
141
148
  obj.properties.pvPower2
142
149
  );
143
150
  }
@@ -149,6 +156,13 @@ const onMessage = async (topic, message) => {
149
156
  "remainInputTime",
150
157
  obj.properties.remainInputTime
151
158
  );
159
+ (0, import_adapterService.updateSolarFlowState)(
160
+ adapter,
161
+ productKey,
162
+ deviceKey,
163
+ "calculations.remainInputTime",
164
+ obj.properties.remainInputTime < 59940 ? (0, import_timeHelper.toHoursAndMinutes)(obj.properties.remainInputTime) : ""
165
+ );
152
166
  }
153
167
  if (((_s = obj.properties) == null ? void 0 : _s.remainOutTime) != null && ((_t = obj.properties) == null ? void 0 : _t.remainOutTime) != void 0) {
154
168
  (0, import_adapterService.updateSolarFlowState)(
@@ -158,6 +172,13 @@ const onMessage = async (topic, message) => {
158
172
  "remainOutTime",
159
173
  obj.properties.remainOutTime
160
174
  );
175
+ (0, import_adapterService.updateSolarFlowState)(
176
+ adapter,
177
+ productKey,
178
+ deviceKey,
179
+ "calculations.remainOutTime",
180
+ obj.properties.remainOutTime < 59940 ? (0, import_timeHelper.toHoursAndMinutes)(obj.properties.remainOutTime) : ""
181
+ );
161
182
  }
162
183
  if (((_u = obj.properties) == null ? void 0 : _u.socSet) != null && ((_v = obj.properties) == null ? void 0 : _v.socSet) != void 0) {
163
184
  (0, import_adapterService.updateSolarFlowState)(
@@ -194,9 +215,7 @@ const setChargeLimit = async (adapter2, productKey, deviceKey, socSet) => {
194
215
  );
195
216
  client == null ? void 0 : client.publish(topic, JSON.stringify(socSetLimit));
196
217
  } else {
197
- adapter2.log.debug(
198
- `Charge limit is not in range 40<>100!`
199
- );
218
+ adapter2.log.debug(`Charge limit is not in range 40<>100!`);
200
219
  }
201
220
  }
202
221
  };
@@ -210,9 +229,7 @@ const setDischargeLimit = async (adapter2, productKey, deviceKey, minSoc) => {
210
229
  );
211
230
  client == null ? void 0 : client.publish(topic, JSON.stringify(socSetLimit));
212
231
  } else {
213
- adapter2.log.debug(
214
- `Discharge limit is not in range 0<>90!`
215
- );
232
+ adapter2.log.debug(`Discharge limit is not in range 0<>90!`);
216
233
  }
217
234
  }
218
235
  };
@@ -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.debug(\"Subscription successful!\");\r\n }\r\n};\r\n\r\nconst onMessage = async (topic: string, message: Buffer): Promise<void> => {\r\n //adapter?.log.info(message.toString())\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?.pvPower1 != null &&\r\n obj.properties?.pvPower1 != undefined\r\n ) {\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"pvPower1\",\r\n obj.properties.pvPower1,\r\n );\r\n }\r\n\r\n if (\r\n obj.properties?.pvPower2 != null &&\r\n obj.properties?.pvPower2 != undefined\r\n ) {\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"pvPower2\",\r\n obj.properties.pvPower2,\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 setChargeLimit = async (\r\n adapter: ZendureSolarflow,\r\n productKey: string,\r\n deviceKey: string,\r\n socSet: number,\r\n): Promise<void> => {\r\n if (client && productKey && deviceKey) {\r\n if (socSet > 40 && socSet <= 100) {\r\n const topic = `iot/${productKey}/${deviceKey}/properties/write`;\r\n\r\n const socSetLimit = { properties: { socSet: socSet * 10 } };\r\n adapter.log.debug(\r\n `Setting ChargeLimit for device key ${deviceKey} to ${socSet}!`,\r\n );\r\n client?.publish(topic, JSON.stringify(socSetLimit));\r\n }\r\n else {\r\n adapter.log.debug(\r\n `Charge limit is not in range 40<>100!`,\r\n );\r\n }\r\n }\r\n};\r\n\r\nexport const setDischargeLimit = async (\r\n adapter: ZendureSolarflow,\r\n productKey: string,\r\n deviceKey: string,\r\n minSoc: number,\r\n): Promise<void> => {\r\n if (client && productKey && deviceKey) {\r\n if (minSoc > 0 && minSoc < 90) {\r\n const topic = `iot/${productKey}/${deviceKey}/properties/write`;\r\n\r\n const socSetLimit = { properties: { minSoc: minSoc * 10 } };\r\n adapter.log.debug(\r\n `Setting Discharge Limit for device key ${deviceKey} to ${minSoc}!`,\r\n );\r\n client?.publish(topic, JSON.stringify(socSetLimit));\r\n }\r\n else{\r\n adapter.log.debug(\r\n `Discharge limit is not in range 0<>90!`,\r\n );\r\n }\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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",
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 {\r\n addOrUpdatePackData,\r\n createSolarFlowStates,\r\n updateSolarFlowState,\r\n} from \"./adapterService\";\r\nimport { toHoursAndMinutes } from \"../helpers/timeHelper\";\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 //adapter?.log.info(message.toString())\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?.pvPower1 != null &&\r\n obj.properties?.pvPower1 != undefined\r\n ) {\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"pvPower2\", // Reversed to adjust like offical app\r\n obj.properties.pvPower1,\r\n );\r\n }\r\n\r\n if (\r\n obj.properties?.pvPower2 != null &&\r\n obj.properties?.pvPower2 != undefined\r\n ) {\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"pvPower1\", // Reversed to adjust like offical app\r\n obj.properties.pvPower2,\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 // Calculate minutes to format hh:mm\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"calculations.remainInputTime\",\r\n obj.properties.remainInputTime < 59940\r\n ? toHoursAndMinutes(obj.properties.remainInputTime)\r\n : \"\",\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 // Calculate minutes to format hh:mm\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"calculations.remainOutTime\",\r\n obj.properties.remainOutTime < 59940\r\n ? toHoursAndMinutes(obj.properties.remainOutTime)\r\n : \"\",\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 setChargeLimit = async (\r\n adapter: ZendureSolarflow,\r\n productKey: string,\r\n deviceKey: string,\r\n socSet: number,\r\n): Promise<void> => {\r\n if (client && productKey && deviceKey) {\r\n if (socSet > 40 && socSet <= 100) {\r\n const topic = `iot/${productKey}/${deviceKey}/properties/write`;\r\n\r\n const socSetLimit = { properties: { socSet: socSet * 10 } };\r\n adapter.log.debug(\r\n `Setting ChargeLimit for device key ${deviceKey} to ${socSet}!`,\r\n );\r\n client?.publish(topic, JSON.stringify(socSetLimit));\r\n } else {\r\n adapter.log.debug(`Charge limit is not in range 40<>100!`);\r\n }\r\n }\r\n};\r\n\r\nexport const setDischargeLimit = async (\r\n adapter: ZendureSolarflow,\r\n productKey: string,\r\n deviceKey: string,\r\n minSoc: number,\r\n): Promise<void> => {\r\n if (client && productKey && deviceKey) {\r\n if (minSoc > 0 && minSoc < 90) {\r\n const topic = `iot/${productKey}/${deviceKey}/properties/write`;\r\n\r\n const socSetLimit = { properties: { minSoc: minSoc * 10 } };\r\n adapter.log.debug(\r\n `Setting Discharge Limit for device key ${deviceKey} to ${minSoc}!`,\r\n );\r\n client?.publish(topic, JSON.stringify(socSetLimit));\r\n } else {\r\n adapter.log.debug(`Discharge limit is not in range 0<>90!`);\r\n }\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": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAEA,WAAsB;AAGtB,4BAIO;AACP,wBAAkC;AAElC,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,MAAM;AAAA,EACrB;AACF;AAEA,MAAM,YAAY,OAAO,OAAe,YAAmC;AA/B3E;AAiCE,MAAI,SAAS;AACX,UAAM,WAAW,MAAM,MAAM,GAAG;AAChC,UAAM,aAAa,SAAS,CAAC;AAC7B,UAAM,YAAY,SAAS,CAAC;AAE5B,UAAM,MAAM,KAAK,MAAM,QAAQ,SAAS,CAAC;AAGzC;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,OACA,oBAAI,KAAK,GAAE,QAAQ;AAAA,IACrB;AAEA,UACE,SAAI,eAAJ,mBAAgB,kBAAiB,UACjC,SAAI,eAAJ,mBAAgB,kBAAiB,QACjC;AACA;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,IAAI,WAAW;AAAA,MACjB;AAAA,IACF;AAEA,UACE,SAAI,eAAJ,mBAAgB,oBAAmB,UACnC,SAAI,eAAJ,mBAAgB,oBAAmB,QACnC;AACA;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,IAAI,WAAW;AAAA,MACjB;AAAA,IACF;AAEA,UACE,SAAI,eAAJ,mBAAgB,gBAAe,UAC/B,SAAI,eAAJ,mBAAgB,gBAAe,QAC/B;AACA;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,IAAI,WAAW;AAAA,MACjB;AAAA,IACF;AAEA,UACE,SAAI,eAAJ,mBAAgB,oBAAmB,UACnC,SAAI,eAAJ,mBAAgB,oBAAmB,QACnC;AACA;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,IAAI,WAAW;AAAA,MACjB;AAGA,sDAAqB,SAAS,YAAY,WAAW,kBAAkB,CAAC;AAAA,IAC1E;AAEA,UACE,SAAI,eAAJ,mBAAgB,mBAAkB,UAClC,SAAI,eAAJ,mBAAgB,mBAAkB,QAClC;AACA;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,IAAI,WAAW;AAAA,MACjB;AAGA;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,UACE,SAAI,eAAJ,mBAAgB,oBAAmB,UACnC,SAAI,eAAJ,mBAAgB,oBAAmB,QACnC;AACA;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,IAAI,WAAW;AAAA,MACjB;AAAA,IACF;AAEA,UACE,SAAI,eAAJ,mBAAgB,aAAY,UAC5B,SAAI,eAAJ,mBAAgB,aAAY,QAC5B;AACA;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA;AAAA,QACA,IAAI,WAAW;AAAA,MACjB;AAAA,IACF;AAEA,UACE,SAAI,eAAJ,mBAAgB,aAAY,UAC5B,SAAI,eAAJ,mBAAgB,aAAY,QAC5B;AACA;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA;AAAA,QACA,IAAI,WAAW;AAAA,MACjB;AAAA,IACF;AAEA,UACE,SAAI,eAAJ,mBAAgB,oBAAmB,UACnC,SAAI,eAAJ,mBAAgB,oBAAmB,QACnC;AACA;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,IAAI,WAAW;AAAA,MACjB;AAGA;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,IAAI,WAAW,kBAAkB,YAC7B,qCAAkB,IAAI,WAAW,eAAe,IAChD;AAAA,MACN;AAAA,IACF;AAEA,UACE,SAAI,eAAJ,mBAAgB,kBAAiB,UACjC,SAAI,eAAJ,mBAAgB,kBAAiB,QACjC;AACA;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,IAAI,WAAW;AAAA,MACjB;AAGA;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,IAAI,WAAW,gBAAgB,YAC3B,qCAAkB,IAAI,WAAW,aAAa,IAC9C;AAAA,MACN;AAAA,IACF;AAEA,UAAI,SAAI,eAAJ,mBAAgB,WAAU,UAAQ,SAAI,eAAJ,mBAAgB,WAAU,QAAW;AACzE;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,OAAO,IAAI,WAAW,MAAM,IAAI;AAAA,MAClC;AAAA,IACF;AAEA,UAAI,SAAI,eAAJ,mBAAgB,WAAU,UAAQ,SAAI,eAAJ,mBAAgB,WAAU,QAAW;AACzE;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,OAAO,IAAI,WAAW,MAAM,IAAI;AAAA,MAClC;AAAA,IACF;AAEA,QAAI,IAAI,UAAU;AAChB,qDAAoB,SAAS,YAAY,WAAW,IAAI,QAAQ;AAAA,IAClE;AAAA,EACF;AAEA,MAAI,QAAQ;AAAA,EAEZ;AACF;AAEO,MAAM,iBAAiB,OAC5BA,UACA,YACA,WACA,WACkB;AAClB,MAAI,UAAU,cAAc,WAAW;AACrC,QAAI,SAAS,MAAM,UAAU,KAAK;AAChC,YAAM,QAAQ,OAAO,UAAU,IAAI,SAAS;AAE5C,YAAM,cAAc,EAAE,YAAY,EAAE,QAAQ,SAAS,GAAG,EAAE;AAC1D,MAAAA,SAAQ,IAAI;AAAA,QACV,sCAAsC,SAAS,OAAO,MAAM;AAAA,MAC9D;AACA,uCAAQ,QAAQ,OAAO,KAAK,UAAU,WAAW;AAAA,IACnD,OAAO;AACL,MAAAA,SAAQ,IAAI,MAAM,uCAAuC;AAAA,IAC3D;AAAA,EACF;AACF;AAEO,MAAM,oBAAoB,OAC/BA,UACA,YACA,WACA,WACkB;AAClB,MAAI,UAAU,cAAc,WAAW;AACrC,QAAI,SAAS,KAAK,SAAS,IAAI;AAC7B,YAAM,QAAQ,OAAO,UAAU,IAAI,SAAS;AAE5C,YAAM,cAAc,EAAE,YAAY,EAAE,QAAQ,SAAS,GAAG,EAAE;AAC1D,MAAAA,SAAQ,IAAI;AAAA,QACV,0CAA0C,SAAS,OAAO,MAAM;AAAA,MAClE;AACA,uCAAQ,QAAQ,OAAO,KAAK,UAAU,WAAW;AAAA,IACnD,OAAO;AACL,MAAAA,SAAQ,IAAI,MAAM,wCAAwC;AAAA,IAC5D;AAAA,EACF;AACF;AAEO,MAAM,iBAAiB,OAC5BA,UACA,YACA,WACA,UACkB;AAlSpB;AAmSE,MAAI,UAAU,cAAc,WAAW;AAErC,UAAM,gBACJ,WAAMA,SAAQ,cAAc,aAAa,MAAM,YAAY,cAAc,MAAzE,mBACC;AAEH,QAAI,gBAAgB,QAAQ,gBAAgB,QAAW;AACrD,UAAI,gBAAgB,OAAO;AACzB,YACE,QAAQ,OACR,SAAS,MACT,SAAS,MACT,SAAS,MACT,SAAS,GACT;AACA,cAAI,QAAQ,OAAO,QAAQ,IAAI;AAC7B,oBAAQ;AAAA,UACV,WAAW,QAAQ,MAAM,QAAQ,IAAI;AACnC,oBAAQ;AAAA,UACV,WAAW,QAAQ,MAAM,QAAQ,IAAI;AACnC,oBAAQ;AAAA,UACV,WAAW,QAAQ,IAAI;AACrB,oBAAQ;AAAA,UACV;AAAA,QACF;AAGA,cAAM,QAAQ,OAAO,UAAU,IAAI,SAAS;AAE5C,cAAM,cAAc,EAAE,YAAY,EAAE,aAAa,MAAM,EAAE;AACzD,QAAAA,SAAQ,IAAI;AAAA,UACV,uCAAuC,SAAS,OAAO,KAAK;AAAA,QAC9D;AACA,yCAAQ,QAAQ,OAAO,KAAK,UAAU,WAAW;AAAA,MACnD,OAAO;AACL,QAAAA,SAAQ,IAAI;AAAA,UACV,+BAA+B,SAAS,kBAAkB,KAAK;AAAA,QACjE;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEO,MAAM,oBAAoB,CAAC,aAAqC;AACrE,YAAU;AAEV,QAAM,UAA+B;AAAA,IACnC,UAAU,QAAQ;AAAA,IAClB,UAAU;AAAA,IACV,UAAU;AAAA,IACV,OAAO;AAAA,IACP,iBAAiB;AAAA,EACnB;AAEA,MAAI,QAAQ,WAAW,QAAQ,OAAO;AACpC,aAAS,KAAK;AAAA,MACZ,YAAY,QAAQ,MAAM,UAAU,MAAM,QAAQ,MAAM;AAAA,MACxD;AAAA,IACF;AAEA,QAAI,UAAU,SAAS;AACrB,aAAO,GAAG,WAAW,WAAW;AAChC,aAAO,GAAG,SAAS,OAAO;AAG1B,cAAQ,WAAW,QAAQ,CAAC,WAAoC;AAE9D,YAAI,SAAS;AACX,2DAAsB,SAAS,OAAO,YAAY,OAAO,SAAS;AAGlE;AAAA,YACE;AAAA,YACA,OAAO;AAAA,YACP,OAAO;AAAA,YACP;AAAA,YACA,OAAO;AAAA,UACT;AAEA,gBAAM,cAAc,IAAI,OAAO,UAAU,IAAI,OAAO,SAAS;AAC7D,gBAAM,WAAW,OAAO,OAAO,UAAU,IAAI,OAAO,SAAS;AAE7D,kBAAQ,IAAI,MAAM,8BAA8B,WAAW,EAAE;AAC7D,2CAAQ,UAAU,aAAa;AAC/B,kBAAQ,IAAI,MAAM,8BAA8B,QAAQ,EAAE;AAC1D,2CAAQ,UAAU,UAAU;AAAA,QAC9B;AAAA,MACF,CAAC;AAED,aAAO,GAAG,WAAW,SAAS;AAAA,IAChC;AAAA,EACF;AACF;",
6
6
  "names": ["adapter"]
7
7
  }
@@ -18,6 +18,10 @@ var __copyProps = (to, from, except, desc) => {
18
18
  return to;
19
19
  };
20
20
  var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
21
25
  isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
22
26
  mod
23
27
  ));
@@ -40,9 +44,16 @@ const config = {
40
44
  Authorization: "Basic Q29uc3VtZXJBcHA6NX4qUmRuTnJATWg0WjEyMw==",
41
45
  "Blade-Auth": "bearer (null)"
42
46
  },
43
- timeout: 5e3
47
+ timeout: 1e4
44
48
  };
45
49
  const login = (adapter) => {
50
+ if (adapter.accessToken) {
51
+ return new Promise((resolve) => {
52
+ if (adapter.accessToken) {
53
+ resolve(adapter.accessToken);
54
+ }
55
+ });
56
+ }
46
57
  const auth = Buffer.from(
47
58
  `${adapter.config.userName}:${adapter.config.password}`
48
59
  ).toString("base64");
@@ -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, { 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 timeout: 5000\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;AAAA,EACA,SAAS;AACX;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;AA3ChC;AA4CQ,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;AAEvC,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;",
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 timeout: 10000,\r\n};\r\n\r\n/* eslint-disable @typescript-eslint/indent */\r\nexport const login = (adapter: ZendureSolarflow): Promise<string> => {\r\n if (adapter.accessToken) {\r\n return new Promise((resolve) => {\r\n if (adapter.accessToken) {\r\n resolve(adapter.accessToken);\r\n }\r\n });\r\n }\r\n\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;AAAA,EACA,SAAS;AACX;AAGO,MAAM,QAAQ,CAAC,YAA+C;AACnE,MAAI,QAAQ,aAAa;AACvB,WAAO,IAAI,QAAQ,CAAC,YAAY;AAC9B,UAAI,QAAQ,aAAa;AACvB,gBAAQ,QAAQ,WAAW;AAAA,MAC7B;AAAA,IACF,CAAC;AAAA,EACH;AAEA,QAAM,OAAO,OAAO;AAAA,IAClB,GAAG,QAAQ,OAAO,QAAQ,IAAI,QAAQ,OAAO,QAAQ;AAAA,EACvD,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;AAnDhC;AAoDQ,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;AAEvC,UAAQ,IAAI,MAAM,4CAA4C;AAE9D,MAAI,QAAQ,eAAe,UAAU,OAAO,SAAS;AACnD,WAAO,QAAQ,YAAY,IAAI,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
6
  "names": ["axios"]
7
7
  }
package/io-package.json CHANGED
@@ -1,98 +1,98 @@
1
1
  {
2
2
  "common": {
3
3
  "name": "zendure-solarflow",
4
- "version": "1.0.7",
4
+ "version": "1.1.6",
5
5
  "news": {
6
- "1.0.7": {
7
- "en": "Add control for charge and discharge limit\nUpdate Readme Screenshot",
8
- "de": "Steuerung für Lade- und Entladegrenzen hinzufügen\nUpdate Readme Screenshot",
9
- "ru": "Добавить контроль за лимитом заряда и разряда\nОбновление Редакция экрана",
10
- "pt": "Adicionar controle para o limite de carga e descarga\nActualizar Screenshot de Readme",
11
- "nl": "Controle toevoegen voor lading en ontladingslimiet\nSchermafdruk bijwerken",
12
- "fr": "Ajouter le contrôle pour la charge et la limite de décharge\nMettre à jour la capture d'écran Readme",
13
- "it": "Aggiungere il controllo per il limite di carica e scarico\nAggiornamento Readme Screenshot",
14
- "es": "Agregar control para el límite de carga y descarga\nUpdate Readme Captura de Pantalla",
15
- "pl": "Dodawanie kontroli dla doładowania i rozładowania\nAktualizacja zrzutu ekranu Readme",
16
- "uk": "Додати контроль за лімітом заряду та розряду\nUpdate Readme Скріншот",
17
- "zh-cn": "添加充电和放电限制的控制\n更新 Readme 屏幕截图"
6
+ "1.1.6": {
7
+ "en": "Add energy calculations for 'today'\nFix minutes display bug for remaining charge and discharge time",
8
+ "de": "Energieberechnungen für heute hinzufügen '\nFehler der Minutenanzeige für die verbleibende Lade- und Entladezeit",
9
+ "ru": "Добавить расчеты энергии для \"сегодня\" \"\n6 минут дисплей клоп для оставшегося заряда и времени выгрузки",
10
+ "pt": "Adicionar cálculos de energia para 'hoje '\nCorrigir minutos exibir bug para o tempo restante de carga e descarga",
11
+ "nl": "Energieberekeningen toevoegen voor 'vandaag' '\nFix minuten weergave bug voor resterende lading en ontladingstijd",
12
+ "fr": "Ajouter le calcul de l'énergie pour «aujourd'hui» '\nCorrection minutes affichage bug pour la charge restante et le temps de décharge",
13
+ "it": "Aggiungere calcoli energetici per 'oggi '\nFissare il bug di visualizzazione dei minuti per il tempo di carica e di scarico rimanenti",
14
+ "es": "Añadir cálculos energéticos para 'hoy '\nError de visualización de minutos fijo para el tiempo de carga y descarga restante",
15
+ "pl": "Dodaj obliczenia energii na dziś '\nNapraw błąd wyświetlania minut dla pozostałego czasu ładowania i rozładowania",
16
+ "uk": "Додавання енергорозрахунків за добу Р\nВиправлення хвилин відображення помилок для решти часу заряду та розряду",
17
+ "zh-cn": "为今天添加能量计算 '\n为剩余充电和放电时间修正分钟显示错误"
18
18
  },
19
- "1.0.6": {
20
- "en": "Update Readme",
21
- "de": "Update Reader",
22
- "ru": "Readme",
23
- "pt": "Atualizar o Readme",
24
- "nl": "Readme bijwerken",
25
- "fr": "Mettre à jour Readme",
26
- "it": "Aggiornamento",
27
- "es": "Actualización Readme",
28
- "pl": "Aktualizacja Readme",
29
- "uk": "Оновлення Readme",
30
- "zh-cn": "更新读取器"
19
+ "1.1.5": {
20
+ "en": "Add energy calculations for 'today'\nFix minutes display bug for remaining charge and discharge time",
21
+ "de": "Energieberechnungen für heute hinzufügen '\nFehler der Minutenanzeige für die verbleibende Lade- und Entladezeit",
22
+ "ru": "Добавить расчеты энергии для \"сегодня\" \"\n6 минут дисплей клоп для оставшегося заряда и времени выгрузки",
23
+ "pt": "Adicionar cálculos de energia para 'hoje '\nCorrigir minutos exibir bug para o tempo restante de carga e descarga",
24
+ "nl": "Energieberekeningen toevoegen voor 'vandaag' '\nFix minuten weergave bug voor resterende lading en ontladingstijd",
25
+ "fr": "Ajouter le calcul de l'énergie pour «aujourd'hui» '\nCorrection minutes affichage bug pour la charge restante et le temps de décharge",
26
+ "it": "Aggiungere calcoli energetici per 'oggi '\nFissare il bug di visualizzazione dei minuti per il tempo di carica e di scarico rimanenti",
27
+ "es": "Añadir cálculos energéticos para 'hoy '\nError de visualización de minutos fijo para el tiempo de carga y descarga restante",
28
+ "pl": "Dodaj obliczenia energii na dziś '\nNapraw błąd wyświetlania minut dla pozostałego czasu ładowania i rozładowania",
29
+ "uk": "Додавання енергорозрахунків за добу Р\nВиправлення хвилин відображення помилок для решти часу заряду та розряду",
30
+ "zh-cn": "为今天添加能量计算 '\n为剩余充电和放电时间修正分钟显示错误"
31
31
  },
32
- "1.0.5": {
33
- "en": "Added state for both Solarflow PV inputs",
34
- "de": "Zusätzlicher Zustand für beide Solarflow PV-Eingänge",
35
- "ru": "Добавленное состояние для обоих компонентов Solarflow PV",
36
- "pt": "Estado adicionado para ambas as entradas Solarflow PV",
37
- "nl": "Toegevoegde toestand voor beide Solarflow PV-inputs",
38
- "fr": "État ajouté pour les deux entrées Solarflow PV",
39
- "it": "Stato aggiunto per entrambi gli ingressi Solarflow PV",
40
- "es": "Estado añadido para ambas entradas de PV de flujo solar",
41
- "pl": "Dodano stan dla obu wejść Solarflow PV",
42
- "uk": "Додано стан для обох вхідних сонячних батарей",
43
- "zh-cn": "两种太阳流光电输入的添加状态"
32
+ "1.1.4": {
33
+ "en": "Fix timeout issues",
34
+ "de": "Timeout Probleme beheben",
35
+ "ru": "Вопросы таймаута",
36
+ "pt": "Corrigir problemas de tempo limite",
37
+ "nl": "Timeout-problemen oplossen",
38
+ "fr": "Correction des problèmes de délai",
39
+ "it": "Risolvere i problemi di timeout",
40
+ "es": "Arreglar los problemas de tiempo",
41
+ "pl": "Popraw problemy z czasem",
42
+ "uk": "Фіксація термінів",
43
+ "zh-cn": "解决超时问题"
44
44
  },
45
- "1.0.4": {
46
- "en": "Added Timeout for axios",
47
- "de": "Timeout für Axios hinzugefügt",
48
- "ru": "Добавлено Timeout для axios",
49
- "pt": "Adicionado Timeout para axios",
50
- "nl": "Axios",
51
- "fr": "Ajout du timeout pour axios",
52
- "it": "Aggiunto Timeout per assios",
53
- "es": "Tiempo añadido para el eje",
54
- "pl": "Added Timeout",
55
- "uk": "Додано час для axios",
56
- "zh-cn": "增加焦虑时间"
45
+ "1.1.3": {
46
+ "en": "Fix timeout issues",
47
+ "de": "Timeout Probleme beheben",
48
+ "ru": "Вопросы таймаута",
49
+ "pt": "Corrigir problemas de tempo limite",
50
+ "nl": "Timeout-problemen oplossen",
51
+ "fr": "Correction des problèmes de délai",
52
+ "it": "Risolvere i problemi di timeout",
53
+ "es": "Arreglar los problemas de tiempo",
54
+ "pl": "Popraw problemy z czasem",
55
+ "uk": "Фіксація термінів",
56
+ "zh-cn": "解决超时问题"
57
57
  },
58
- "1.0.3": {
59
- "en": "Password is now encrypted. NOTE: You have to re-enter the password after adapter update!",
60
- "de": "Passwort ist jetzt verschlüsselt. HINWEIS: Sie müssen das Passwort nach dem Update des Adapters neu eingeben!",
61
- "ru": "Пароль теперь зашифрован. ПРИМЕЧАНИЕ: Вы должны повторно ввести пароль после обновления адаптера!",
62
- "pt": "A senha é agora criptografada. NOTA: Você tem que reinserir a senha após a atualização do adaptador!",
63
- "nl": "Het wachtwoord is nu versleuteld. Je moet het wachtwoord herstellen na de update van de adapter!",
64
- "fr": "Le mot de passe est désormais crypté. REMARQUE: Vous devez retourner le mot de passe après la mise à jour de l'adaptateur!",
65
- "it": "La password è ora crittografata. NOTA: Devi reinserire la password dopo l'aggiornamento dell'adattatore!",
66
- "es": "La contraseña está ahora encriptada. NOTA: ¡Tienes que volver a introducir la contraseña después de la actualización del adaptador!",
67
- "pl": "Obecnie hasło jest szyfrowane. NOTE: Musisz wrócić do hasła po adapteru!",
68
- "uk": "Пароль тепер зашифрований. ОНОВЛЕННЯ: Ви повинні повторно реєструвати пароль після оновлення адаптера!",
69
- "zh-cn": "护照现在加密。 注:你必须在适应者更新之后重新加入文字。!"
58
+ "1.1.2": {
59
+ "en": "Fix timeout issues",
60
+ "de": "Timeout Probleme beheben",
61
+ "ru": "Вопросы таймаута",
62
+ "pt": "Corrigir problemas de tempo limite",
63
+ "nl": "Timeout-problemen oplossen",
64
+ "fr": "Correction des problèmes de délai",
65
+ "it": "Risolvere i problemi di timeout",
66
+ "es": "Arreglar los problemas de tiempo",
67
+ "pl": "Popraw problemy z czasem",
68
+ "uk": "Фіксація термінів",
69
+ "zh-cn": "解决超时问题"
70
70
  },
71
- "1.0.2": {
72
- "en": "Adapter improvements suggested by iobroker team\nFixed battery pack temperature (data is in kelvin, so now converting to celcius)",
73
- "de": "Adapter Verbesserungen vorgeschlagen von iobroker team\nFeste Akku-Pack-Temperatur (Daten sind in Kelvin, also jetzt in celcius umwandeln)",
74
- "ru": "Улучшения адаптера, предложенные командой iobroker\nФиксированная температура аккумулятора (данные находятся в kelvin, поэтому теперь преобразование в celcius)",
75
- "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)",
76
- "nl": "Adapter verbetering suggereert\nGerepareerde batterijttemperatuur (data is in kelvin, dus nu omkeren naar Cecius)",
77
- "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)",
78
- "it": "Miglioramenti dell'adattatore suggeriti dal team di iobroker\nTemperatura del pacchetto batterie fissa (i dati sono in kelvin, quindi ora convertiti in celcius)",
79
- "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)",
80
- "pl": "Adapter ulepszenia sugerowały zespół iobroker\nFixed battery pack temperature (data jest w kelvinu, więc teraz przekształca się w celcius)",
81
- "uk": "Покращення адаптерів, запропонованих командою iobroker\nФіксована температура пакета акумулятора (data is in kelvin, тому тепер перетворюється в celcius)",
82
- "zh-cn": "气雾器组建议的改进\n固定电池的包装温度(数据是镍vin,因此现在转换为管道)。"
71
+ "1.1.1": {
72
+ "en": "Fix timeout issues",
73
+ "de": "Timeout Probleme beheben",
74
+ "ru": "Вопросы таймаута",
75
+ "pt": "Corrigir problemas de tempo limite",
76
+ "nl": "Timeout-problemen oplossen",
77
+ "fr": "Correction des problèmes de délai",
78
+ "it": "Risolvere i problemi di timeout",
79
+ "es": "Arreglar los problemas de tiempo",
80
+ "pl": "Popraw problemy z czasem",
81
+ "uk": "Фіксація термінів",
82
+ "zh-cn": "解决超时问题"
83
83
  },
84
- "1.0.1": {
85
- "en": "Fix translations\nUse 'extendObjectAsync' instead of 'setObjectNotExistsAsync'\nFirst official release version",
86
- "de": "Übersetzungen löschen\nErweiterung ObjectAsync statt Set Gegenstand NichtExistsAsync\nErste offizielle Version",
87
- "ru": "Fix переводы\nИспользуйте удлинить ObjectAsync вместо набора Объект NotExistsAsync\nПервая официальная версия релиза",
88
- "pt": "Corrigir traduções\nUso de extensão ObjectAsync em vez de set Objeto NotExistsAsync\nPrimeira versão oficial do lançamento",
89
- "nl": "Vertaling:\nGebruik verlenging ObjectAsync in plaats van Object NCIS Los Angeles\nEerste officiële vrijlating",
90
- "fr": "Traductions fixes\nExtension d ' utilisation ObjectAsync au lieu de set Objet NotExistsAsync\nPremière version officielle",
91
- "it": "Fissare le traduzioni\nEsterni di utilizzo ObjectAsync invece di set Oggetto Non esiste\nPrima versione ufficiale di rilascio",
92
- "es": "Traducción fija\nAmpliación de uso ObjectAsync en lugar de set Objeto NoExistsAsync\nPrimera versión oficial",
93
- "pl": "Tłumaczenia Fix\nRozszerzenie ObjectAsync zamiast zbioru obiekt NotExsAsync\nOficjalna wersja",
94
- "uk": "Виправлення перекладів\nВикористання розширення Об'єктАсинхрон замість набору Об'єкт НеExistsAsync\nПерша офіційна версія випуску",
95
- "zh-cn": "固定翻译\n使用 反对 专家\n第一次正式释放"
84
+ "1.1.0": {
85
+ "en": "Switched solar input 1 und 2 to adjust the behavior like the offical app\nAdded Calculations folder, remaining charge and discharge time is now available as formatted time\nAdded a note in the settings that this adapter only works with the global server",
86
+ "de": "Solareingang 1 und 2 zum Einstellen des Verhaltens wie die Offical App\nHinzufügen Berechnungsordner, Restladung und Entladung Zeit ist jetzt als formatierte Zeit verfügbar\nFügen Sie eine Notiz in den Einstellungen hinzu, die dieser Adapter nur mit dem globalen Server funktioniert",
87
+ "ru": "Переключение солнечного ввода 1 und 2 для корректировки поведения, как оффическое приложение\nДобавить папку расчета, оставшееся время заряда и выгрузки теперь доступно как отформатированное время\nДобавлена нота в настройках, что этот адаптер работает только с глобальным сервером",
88
+ "pt": "Entrada solar comutada 1 und 2 para ajustar o comportamento como o aplicativo offical\nAdicionado pasta Cálculos, restante carga e tempo de descarga está agora disponível como tempo formatado\nAdicionado uma nota nas configurações que este adaptador só funciona com o servidor global",
89
+ "nl": "Schakelde zonne-input 1 und 2 om het gedrag aan te passen zoals de officale app\nToegevoegde rekenmap, resterende lading en ontladingstijd is nu beschikbaar als geformatteerde tijd\nEen opmerking toegevoegd in de instellingen dat deze adapter alleen werkt met de globale server",
90
+ "fr": "Entrée solaire commutée 1 et 2 pour ajuster le comportement comme l'application offical\nAjout du dossier Calculs, la charge restante et le temps de décharge sont maintenant disponibles en formatage\nAjout d'une note dans les paramètres que cet adaptateur ne fonctionne qu'avec le serveur global",
91
+ "it": "Ingresso solare commutato 1 und 2 per regolare il comportamento come l'app offical\nAggiunta cartella Calculazioni, carica rimanente e tempo di scarico è ora disponibile come tempo formattato\nAggiunto una nota nelle impostazioni che questo adattatore funziona solo con il server globale",
92
+ "es": "Interrupción de entrada solar 1 und 2 para ajustar el comportamiento como la aplicación offical\nCarpeta de cálculos añadidos, tiempo de carga y descarga restante está disponible ahora como tiempo formateado\nSe agregó una nota en la configuración que este adaptador sólo funciona con el servidor global",
93
+ "pl": "Switched solar input 1 und 2 to adjustic the behavior like the official app\nDodano folder Obliczeń, pozostały czas ładowania i rozładowania jest teraz dostępny jako sformatowany czas\nDodano notatkę w ustawieniach, że ten adapter działa tylko z globalnym serwerem",
94
+ "uk": "Переключений сонячний вхід 1 унд 2 для регулювання поведінки, як офичний додаток\nДодано папку Розрахунок, що залишився заряд і час розряду тепер доступний як форматований час\nДодано замітку в налаштуваннях, які цей адаптер працює тільки з глобальним сервером",
95
+ "zh-cn": "切换太阳输入 1 und 2 以调整类似外科应用的行为\n已添加计算文件夹、剩余充电和放电时间已作为格式化时间提供\n在设置中添加了一个注释, 该适配器只与全局服务器工作"
96
96
  }
97
97
  },
98
98
  "title": "Zendure Solarflow",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "iobroker.zendure-solarflow",
3
- "version": "1.0.7",
3
+ "version": "1.1.6",
4
4
  "description": "zendure-solarflow",
5
5
  "author": {
6
6
  "name": "Peter",
@@ -17,10 +17,11 @@
17
17
  "url": "https://github.com/nograx/ioBroker.zendure-solarflow.git"
18
18
  },
19
19
  "engines": {
20
- "node": ">= 16"
20
+ "node": ">= 18"
21
21
  },
22
22
  "dependencies": {
23
23
  "@iobroker/adapter-core": "^3.0.4",
24
+ "@types/node-schedule": "^2.1.6",
24
25
  "axios": "^1.5.1",
25
26
  "mqtt": "^5.1.3"
26
27
  },