iobroker.zendure-solarflow 1.1.14 → 1.1.15
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 +5 -0
- package/admin/build/index.js +12 -12
- package/admin/build/index.js.map +2 -2
- package/build/helpers/createCalculationStates.js +4 -4
- package/build/helpers/createCalculationStates.js.map +1 -1
- package/build/helpers/createControlStates.js +23 -0
- package/build/helpers/createControlStates.js.map +2 -2
- package/build/helpers/createSolarFlowStates.js +3 -3
- package/build/helpers/createSolarFlowStates.js.map +2 -2
- package/build/helpers/deleteCalculationStates.js +1 -1
- package/build/helpers/deleteCalculationStates.js.map +2 -2
- package/build/main.js +11 -4
- package/build/main.js.map +2 -2
- package/build/services/adapterService.js +45 -0
- package/build/services/adapterService.js.map +2 -2
- package/build/services/calculationService.js +2 -1
- package/build/services/calculationService.js.map +2 -2
- package/build/services/jobSchedule.js +16 -9
- package/build/services/jobSchedule.js.map +2 -2
- package/build/services/mqttService.js +47 -26
- package/build/services/mqttService.js.map +2 -2
- package/build/services/webService.js +6 -4
- package/build/services/webService.js.map +2 -2
- package/io-package.json +14 -14
- package/package.json +1 -1
|
@@ -39,10 +39,9 @@ var mqtt = __toESM(require("mqtt"));
|
|
|
39
39
|
var import_adapterService = require("./adapterService");
|
|
40
40
|
var import_timeHelper = require("../helpers/timeHelper");
|
|
41
41
|
var import_createSolarFlowStates = require("../helpers/createSolarFlowStates");
|
|
42
|
-
let client = void 0;
|
|
43
42
|
let adapter = void 0;
|
|
44
43
|
const onConnected = () => {
|
|
45
|
-
adapter == null ? void 0 : adapter.log.info("Connected with MQTT!");
|
|
44
|
+
adapter == null ? void 0 : adapter.log.info("[onConnected] Connected with MQTT!");
|
|
46
45
|
};
|
|
47
46
|
const onError = (error) => {
|
|
48
47
|
adapter == null ? void 0 : adapter.log.error("Connection to MQTT failed! Error: " + error);
|
|
@@ -160,7 +159,9 @@ const addOrUpdatePackData = async (adapter2, productKey, deviceKey, packData) =>
|
|
|
160
159
|
},
|
|
161
160
|
native: {}
|
|
162
161
|
}));
|
|
163
|
-
|
|
162
|
+
const totalVol = x.totalVol / 100;
|
|
163
|
+
await (adapter2 == null ? void 0 : adapter2.setStateAsync(key + ".totalVol", totalVol, true));
|
|
164
|
+
(0, import_adapterService.checkVoltage)(adapter2, productKey, deviceKey, totalVol);
|
|
164
165
|
}
|
|
165
166
|
}
|
|
166
167
|
});
|
|
@@ -353,40 +354,54 @@ const onMessage = async (topic, message) => {
|
|
|
353
354
|
addOrUpdatePackData(adapter, productKey, deviceKey, obj.packData);
|
|
354
355
|
}
|
|
355
356
|
}
|
|
356
|
-
if (
|
|
357
|
+
if (adapter == null ? void 0 : adapter.mqttClient) {
|
|
357
358
|
}
|
|
358
359
|
};
|
|
359
360
|
const setChargeLimit = async (adapter2, productKey, deviceKey, socSet) => {
|
|
360
|
-
|
|
361
|
+
var _a;
|
|
362
|
+
if (adapter2.mqttClient && productKey && deviceKey) {
|
|
361
363
|
if (socSet > 40 && socSet <= 100) {
|
|
362
364
|
const topic = `iot/${productKey}/${deviceKey}/properties/write`;
|
|
363
365
|
const socSetLimit = { properties: { socSet: socSet * 10 } };
|
|
364
366
|
adapter2.log.debug(
|
|
365
|
-
`Setting ChargeLimit for device key ${deviceKey} to ${socSet}!`
|
|
367
|
+
`[setChargeLimit] Setting ChargeLimit for device key ${deviceKey} to ${socSet}!`
|
|
366
368
|
);
|
|
367
|
-
|
|
369
|
+
(_a = adapter2.mqttClient) == null ? void 0 : _a.publish(topic, JSON.stringify(socSetLimit));
|
|
368
370
|
} else {
|
|
369
|
-
adapter2.log.debug(
|
|
371
|
+
adapter2.log.debug(
|
|
372
|
+
`[setChargeLimit] Charge limit is not in range 40<>100!`
|
|
373
|
+
);
|
|
370
374
|
}
|
|
371
375
|
}
|
|
372
376
|
};
|
|
373
377
|
const setDischargeLimit = async (adapter2, productKey, deviceKey, minSoc) => {
|
|
374
|
-
|
|
378
|
+
var _a;
|
|
379
|
+
if (adapter2.mqttClient && productKey && deviceKey) {
|
|
375
380
|
if (minSoc > 0 && minSoc < 90) {
|
|
376
381
|
const topic = `iot/${productKey}/${deviceKey}/properties/write`;
|
|
377
382
|
const socSetLimit = { properties: { minSoc: minSoc * 10 } };
|
|
378
383
|
adapter2.log.debug(
|
|
379
|
-
`Setting Discharge Limit for device key ${deviceKey} to ${minSoc}!`
|
|
384
|
+
`[setDischargeLimit] Setting Discharge Limit for device key ${deviceKey} to ${minSoc}!`
|
|
380
385
|
);
|
|
381
|
-
|
|
386
|
+
(_a = adapter2.mqttClient) == null ? void 0 : _a.publish(topic, JSON.stringify(socSetLimit));
|
|
382
387
|
} else {
|
|
383
|
-
adapter2.log.debug(
|
|
388
|
+
adapter2.log.debug(
|
|
389
|
+
`[setDischargeLimit] Discharge limit is not in range 0<>90!`
|
|
390
|
+
);
|
|
384
391
|
}
|
|
385
392
|
}
|
|
386
393
|
};
|
|
387
394
|
const setOutputLimit = async (adapter2, productKey, deviceKey, limit) => {
|
|
388
|
-
var _a;
|
|
389
|
-
if (
|
|
395
|
+
var _a, _b;
|
|
396
|
+
if (adapter2.mqttClient && productKey && deviceKey) {
|
|
397
|
+
if (adapter2.config.useLowVoltageBlock) {
|
|
398
|
+
const lowVoltageBlockState = await adapter2.getStateAsync(
|
|
399
|
+
productKey + "." + deviceKey + ".control.lowVoltageBlock"
|
|
400
|
+
);
|
|
401
|
+
if (lowVoltageBlockState && lowVoltageBlockState.val && lowVoltageBlockState.val == true) {
|
|
402
|
+
limit = 0;
|
|
403
|
+
}
|
|
404
|
+
}
|
|
390
405
|
const currentLimit = (_a = await adapter2.getStateAsync(productKey + "." + deviceKey + ".outputLimit")) == null ? void 0 : _a.val;
|
|
391
406
|
if (currentLimit != null && currentLimit != void 0) {
|
|
392
407
|
if (currentLimit != limit) {
|
|
@@ -404,12 +419,12 @@ const setOutputLimit = async (adapter2, productKey, deviceKey, limit) => {
|
|
|
404
419
|
const topic = `iot/${productKey}/${deviceKey}/properties/write`;
|
|
405
420
|
const outputlimit = { properties: { outputLimit: limit } };
|
|
406
421
|
adapter2.log.debug(
|
|
407
|
-
`Setting Output Limit for device key ${deviceKey} to ${limit}!`
|
|
422
|
+
`[setOutputLimit] Setting Output Limit for device key ${deviceKey} to ${limit}!`
|
|
408
423
|
);
|
|
409
|
-
|
|
424
|
+
(_b = adapter2.mqttClient) == null ? void 0 : _b.publish(topic, JSON.stringify(outputlimit));
|
|
410
425
|
} else {
|
|
411
426
|
adapter2.log.debug(
|
|
412
|
-
`Output Limit for device key ${deviceKey} is already at ${limit}!`
|
|
427
|
+
`[setOutputLimit] Output Limit for device key ${deviceKey} is already at ${limit}!`
|
|
413
428
|
);
|
|
414
429
|
}
|
|
415
430
|
}
|
|
@@ -425,14 +440,16 @@ const connectMqttClient = (_adapter) => {
|
|
|
425
440
|
protocolVersion: 5
|
|
426
441
|
};
|
|
427
442
|
if (mqtt && adapter && adapter.paths) {
|
|
428
|
-
|
|
443
|
+
adapter.log.debug("[connectMqttClient] Connecting to mqtt client...");
|
|
444
|
+
adapter.mqttClient = mqtt.connect(
|
|
429
445
|
"mqtt://" + adapter.paths.mqttUrl + ":" + adapter.paths.mqttPort,
|
|
430
446
|
options
|
|
431
447
|
);
|
|
432
|
-
if (
|
|
433
|
-
|
|
434
|
-
|
|
448
|
+
if (adapter && adapter.mqttClient) {
|
|
449
|
+
adapter.mqttClient.on("connect", onConnected);
|
|
450
|
+
adapter.mqttClient.on("error", onError);
|
|
435
451
|
adapter.deviceList.forEach((device) => {
|
|
452
|
+
var _a, _b;
|
|
436
453
|
if (adapter) {
|
|
437
454
|
(0, import_createSolarFlowStates.createSolarFlowStates)(adapter, device.productKey, device.deviceKey);
|
|
438
455
|
(0, import_adapterService.updateSolarFlowState)(
|
|
@@ -444,13 +461,17 @@ const connectMqttClient = (_adapter) => {
|
|
|
444
461
|
);
|
|
445
462
|
const reportTopic = `/${device.productKey}/${device.deviceKey}/properties/report`;
|
|
446
463
|
const iotTopic = `iot/${device.productKey}/${device.deviceKey}/#`;
|
|
447
|
-
adapter.log.debug(
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
464
|
+
adapter.log.debug(
|
|
465
|
+
`[connectMqttClient] Subscribing to MQTT Topic: ${reportTopic}`
|
|
466
|
+
);
|
|
467
|
+
(_a = adapter.mqttClient) == null ? void 0 : _a.subscribe(reportTopic, onSubscribe);
|
|
468
|
+
adapter.log.debug(
|
|
469
|
+
`[connectMqttClient] Subscribing to MQTT Topic: ${iotTopic}`
|
|
470
|
+
);
|
|
471
|
+
(_b = adapter.mqttClient) == null ? void 0 : _b.subscribe(iotTopic, onSubscribe);
|
|
451
472
|
}
|
|
452
473
|
});
|
|
453
|
-
|
|
474
|
+
adapter.mqttClient.on("message", onMessage);
|
|
454
475
|
}
|
|
455
476
|
}
|
|
456
477
|
};
|
|
@@ -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 { updateSolarFlowState } from \"./adapterService\";\r\nimport { toHoursAndMinutes } from \"../helpers/timeHelper\";\r\nimport { createSolarFlowStates } from \"../helpers/createSolarFlowStates\";\r\nimport { IPackData } from \"../models/IPackData\";\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\nexport const addOrUpdatePackData = async (\r\n adapter: ZendureSolarflow,\r\n productKey: string,\r\n deviceKey: string,\r\n packData: IPackData[],\r\n): Promise<void> => {\r\n await packData.forEach(async (x) => {\r\n // Process data only with a serial id!\r\n if (x.sn) {\r\n // create a state for the serial id\r\n const key = (productKey + \".\" + deviceKey + \".packData.\" + x.sn).replace(\r\n adapter.FORBIDDEN_CHARS,\r\n \"\",\r\n );\r\n\r\n await adapter?.extendObjectAsync(key + \".sn\", {\r\n type: \"state\",\r\n common: {\r\n name: {\r\n de: \"Seriennummer\",\r\n en: \"Serial id\",\r\n },\r\n type: \"string\",\r\n desc: \"Serial ID\",\r\n role: \"value\",\r\n read: true,\r\n write: false,\r\n },\r\n native: {},\r\n });\r\n\r\n await adapter?.setStateAsync(key + \".sn\", x.sn, true);\r\n\r\n if (x.socLevel) {\r\n // State f\u00FCr socLevel\r\n await adapter?.extendObjectAsync(key + \".socLevel\", {\r\n type: \"state\",\r\n common: {\r\n name: {\r\n de: \"SOC der Batterie\",\r\n en: \"soc of battery\",\r\n },\r\n type: \"number\",\r\n desc: \"SOC Level\",\r\n role: \"value\",\r\n read: true,\r\n write: false,\r\n },\r\n native: {},\r\n });\r\n\r\n await adapter?.setStateAsync(key + \".socLevel\", x.socLevel, true);\r\n }\r\n\r\n if (x.maxTemp) {\r\n // State f\u00FCr maxTemp\r\n await adapter?.extendObjectAsync(key + \".maxTemp\", {\r\n type: \"state\",\r\n common: {\r\n name: {\r\n de: \"Max. Temperatur der Batterie\",\r\n en: \"max temp. of battery\",\r\n },\r\n type: \"number\",\r\n desc: \"Max. Temp\",\r\n role: \"value\",\r\n read: true,\r\n write: false,\r\n },\r\n native: {},\r\n });\r\n\r\n // Convert Kelvin to Celsius\r\n await adapter?.setStateAsync(\r\n key + \".maxTemp\",\r\n x.maxTemp / 10 - 273.15,\r\n true,\r\n );\r\n }\r\n\r\n if (x.minVol) {\r\n await adapter?.extendObjectAsync(key + \".minVol\", {\r\n type: \"state\",\r\n common: {\r\n name: \"minVol\",\r\n type: \"number\",\r\n desc: \"minVol\",\r\n role: \"value\",\r\n read: true,\r\n write: false,\r\n },\r\n native: {},\r\n });\r\n\r\n await adapter?.setStateAsync(key + \".minVol\", x.minVol / 100, true);\r\n }\r\n\r\n if (x.maxVol) {\r\n await adapter?.extendObjectAsync(key + \".maxVol\", {\r\n type: \"state\",\r\n common: {\r\n name: \"maxVol\",\r\n type: \"number\",\r\n desc: \"maxVol\",\r\n role: \"value\",\r\n read: true,\r\n write: false,\r\n },\r\n native: {},\r\n });\r\n\r\n await adapter?.setStateAsync(key + \".maxVol\", x.maxVol / 100, true);\r\n }\r\n\r\n if (x.totalVol) {\r\n await adapter?.extendObjectAsync(key + \".totalVol\", {\r\n type: \"state\",\r\n common: {\r\n name: \"totalVol\",\r\n type: \"number\",\r\n desc: \"totalVol\",\r\n role: \"value\",\r\n read: true,\r\n write: false,\r\n },\r\n native: {},\r\n });\r\n\r\n await adapter?.setStateAsync(key + \".totalVol\", x.totalVol / 100, true);\r\n }\r\n }\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?.solarPower1 != null &&\r\n obj.properties?.solarPower1 != undefined\r\n ) {\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"pvPower1\",\r\n obj.properties.solarPower1,\r\n );\r\n }\r\n\r\n if (\r\n obj.properties?.solarPower2 != null &&\r\n obj.properties?.solarPower2 != undefined\r\n ) {\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"pvPower2\",\r\n obj.properties.solarPower2,\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 // If Adapter calucation is used, calculate in and outtime\r\n if (adapter.config.useCalculation) {\r\n // Zendure use the same state for input und output values, if charging set remainInputTime, else remainOutTime\r\n const packInputPower = Number(\r\n (\r\n await adapter.getStateAsync(\r\n productKey + \".\" + deviceKey + \".packInputPower\",\r\n )\r\n )?.val,\r\n );\r\n const outputPackPower = Number(\r\n (\r\n await adapter.getStateAsync(\r\n productKey + \".\" + deviceKey + \".outputPackPower\",\r\n )\r\n )?.val,\r\n );\r\n\r\n if (packInputPower && packInputPower > 0) {\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 // Set remainInputTime to blank\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"calculations.remainInputTime\",\r\n \"\",\r\n );\r\n } else if (outputPackPower && outputPackPower > 0) {\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 // Set remainOutTime to blank\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"calculations.remainOutTime\",\r\n \"\",\r\n );\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;AAAA;
|
|
4
|
+
"sourcesContent": ["/* eslint-disable @typescript-eslint/indent */\r\nimport * as mqtt from \"mqtt\";\r\nimport { ZendureSolarflow } from \"../main\";\r\nimport { ISolarFlowDeviceDetails } from \"../models/ISolarFlowDeviceDetails\";\r\nimport { checkVoltage, updateSolarFlowState } from \"./adapterService\";\r\nimport { toHoursAndMinutes } from \"../helpers/timeHelper\";\r\nimport { createSolarFlowStates } from \"../helpers/createSolarFlowStates\";\r\nimport { IPackData } from \"../models/IPackData\";\r\n\r\nlet adapter: ZendureSolarflow | undefined = undefined;\r\n\r\nconst onConnected = (): void => {\r\n adapter?.log.info(\"[onConnected] 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\nexport const addOrUpdatePackData = async (\r\n adapter: ZendureSolarflow,\r\n productKey: string,\r\n deviceKey: string,\r\n packData: IPackData[],\r\n): Promise<void> => {\r\n await packData.forEach(async (x) => {\r\n // Process data only with a serial id!\r\n if (x.sn) {\r\n // create a state for the serial id\r\n const key = (productKey + \".\" + deviceKey + \".packData.\" + x.sn).replace(\r\n adapter.FORBIDDEN_CHARS,\r\n \"\",\r\n );\r\n\r\n await adapter?.extendObjectAsync(key + \".sn\", {\r\n type: \"state\",\r\n common: {\r\n name: {\r\n de: \"Seriennummer\",\r\n en: \"Serial id\",\r\n },\r\n type: \"string\",\r\n desc: \"Serial ID\",\r\n role: \"value\",\r\n read: true,\r\n write: false,\r\n },\r\n native: {},\r\n });\r\n\r\n await adapter?.setStateAsync(key + \".sn\", x.sn, true);\r\n\r\n if (x.socLevel) {\r\n // State f\u00FCr socLevel\r\n await adapter?.extendObjectAsync(key + \".socLevel\", {\r\n type: \"state\",\r\n common: {\r\n name: {\r\n de: \"SOC der Batterie\",\r\n en: \"soc of battery\",\r\n },\r\n type: \"number\",\r\n desc: \"SOC Level\",\r\n role: \"value\",\r\n read: true,\r\n write: false,\r\n },\r\n native: {},\r\n });\r\n\r\n await adapter?.setStateAsync(key + \".socLevel\", x.socLevel, true);\r\n }\r\n\r\n if (x.maxTemp) {\r\n // State f\u00FCr maxTemp\r\n await adapter?.extendObjectAsync(key + \".maxTemp\", {\r\n type: \"state\",\r\n common: {\r\n name: {\r\n de: \"Max. Temperatur der Batterie\",\r\n en: \"max temp. of battery\",\r\n },\r\n type: \"number\",\r\n desc: \"Max. Temp\",\r\n role: \"value\",\r\n read: true,\r\n write: false,\r\n },\r\n native: {},\r\n });\r\n\r\n // Convert Kelvin to Celsius\r\n await adapter?.setStateAsync(\r\n key + \".maxTemp\",\r\n x.maxTemp / 10 - 273.15,\r\n true,\r\n );\r\n }\r\n\r\n if (x.minVol) {\r\n await adapter?.extendObjectAsync(key + \".minVol\", {\r\n type: \"state\",\r\n common: {\r\n name: \"minVol\",\r\n type: \"number\",\r\n desc: \"minVol\",\r\n role: \"value\",\r\n read: true,\r\n write: false,\r\n },\r\n native: {},\r\n });\r\n\r\n await adapter?.setStateAsync(key + \".minVol\", x.minVol / 100, true);\r\n }\r\n\r\n if (x.maxVol) {\r\n await adapter?.extendObjectAsync(key + \".maxVol\", {\r\n type: \"state\",\r\n common: {\r\n name: \"maxVol\",\r\n type: \"number\",\r\n desc: \"maxVol\",\r\n role: \"value\",\r\n read: true,\r\n write: false,\r\n },\r\n native: {},\r\n });\r\n\r\n await adapter?.setStateAsync(key + \".maxVol\", x.maxVol / 100, true);\r\n }\r\n\r\n if (x.totalVol) {\r\n await adapter?.extendObjectAsync(key + \".totalVol\", {\r\n type: \"state\",\r\n common: {\r\n name: \"totalVol\",\r\n type: \"number\",\r\n desc: \"totalVol\",\r\n role: \"value\",\r\n read: true,\r\n write: false,\r\n },\r\n native: {},\r\n });\r\n\r\n const totalVol = x.totalVol / 100;\r\n\r\n await adapter?.setStateAsync(key + \".totalVol\", totalVol, true);\r\n\r\n // Send Voltage to checkVoltage Method\r\n checkVoltage(adapter, productKey, deviceKey, totalVol);\r\n }\r\n }\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?.solarPower1 != null &&\r\n obj.properties?.solarPower1 != undefined\r\n ) {\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"pvPower1\",\r\n obj.properties.solarPower1,\r\n );\r\n }\r\n\r\n if (\r\n obj.properties?.solarPower2 != null &&\r\n obj.properties?.solarPower2 != undefined\r\n ) {\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"pvPower2\",\r\n obj.properties.solarPower2,\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 // If Adapter calucation is used, calculate in and outtime\r\n if (adapter.config.useCalculation) {\r\n // Zendure use the same state for input und output values, if charging set remainInputTime, else remainOutTime\r\n const packInputPower = Number(\r\n (\r\n await adapter.getStateAsync(\r\n productKey + \".\" + deviceKey + \".packInputPower\",\r\n )\r\n )?.val,\r\n );\r\n const outputPackPower = Number(\r\n (\r\n await adapter.getStateAsync(\r\n productKey + \".\" + deviceKey + \".outputPackPower\",\r\n )\r\n )?.val,\r\n );\r\n\r\n if (packInputPower && packInputPower > 0) {\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 // Set remainInputTime to blank\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"calculations.remainInputTime\",\r\n \"\",\r\n );\r\n } else if (outputPackPower && outputPackPower > 0) {\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 // Set remainOutTime to blank\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"calculations.remainOutTime\",\r\n \"\",\r\n );\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 (adapter?.mqttClient) {\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 (adapter.mqttClient && 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 `[setChargeLimit] Setting ChargeLimit for device key ${deviceKey} to ${socSet}!`,\r\n );\r\n adapter.mqttClient?.publish(topic, JSON.stringify(socSetLimit));\r\n } else {\r\n adapter.log.debug(\r\n `[setChargeLimit] 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 (adapter.mqttClient && 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 `[setDischargeLimit] Setting Discharge Limit for device key ${deviceKey} to ${minSoc}!`,\r\n );\r\n adapter.mqttClient?.publish(topic, JSON.stringify(socSetLimit));\r\n } else {\r\n adapter.log.debug(\r\n `[setDischargeLimit] 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 (adapter.mqttClient && productKey && deviceKey) {\r\n if (adapter.config.useLowVoltageBlock) {\r\n const lowVoltageBlockState = await adapter.getStateAsync(\r\n productKey + \".\" + deviceKey + \".control.lowVoltageBlock\",\r\n );\r\n if (\r\n lowVoltageBlockState &&\r\n lowVoltageBlockState.val &&\r\n lowVoltageBlockState.val == true\r\n ) {\r\n limit = 0;\r\n }\r\n }\r\n\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 `[setOutputLimit] Setting Output Limit for device key ${deviceKey} to ${limit}!`,\r\n );\r\n adapter.mqttClient?.publish(topic, JSON.stringify(outputlimit));\r\n } else {\r\n adapter.log.debug(\r\n `[setOutputLimit] 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 adapter.log.debug(\"[connectMqttClient] Connecting to mqtt client...\");\r\n adapter.mqttClient = mqtt.connect(\r\n \"mqtt://\" + adapter.paths.mqttUrl + \":\" + adapter.paths.mqttPort,\r\n options,\r\n ); // create a client\r\n\r\n if (adapter && adapter.mqttClient) {\r\n adapter.mqttClient.on(\"connect\", onConnected);\r\n adapter.mqttClient.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(\r\n `[connectMqttClient] Subscribing to MQTT Topic: ${reportTopic}`,\r\n );\r\n adapter.mqttClient?.subscribe(reportTopic, onSubscribe);\r\n adapter.log.debug(\r\n `[connectMqttClient] Subscribing to MQTT Topic: ${iotTopic}`,\r\n );\r\n adapter.mqttClient?.subscribe(iotTopic, onSubscribe);\r\n }\r\n });\r\n\r\n adapter.mqttClient.on(\"message\", onMessage);\r\n }\r\n }\r\n};\r\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["adapter"]
|
|
7
7
|
}
|
|
@@ -73,20 +73,22 @@ const login = (adapter) => {
|
|
|
73
73
|
return import_axios.default.post(adapter.paths.solarFlowTokenUrl, authBody, config).then(function(response) {
|
|
74
74
|
var _a, _b;
|
|
75
75
|
if (response.data.success) {
|
|
76
|
-
adapter.log.info("Login to Zendure Rest API successful!");
|
|
76
|
+
adapter.log.info("[login] Login to Zendure Rest API successful!");
|
|
77
77
|
if ((_b = (_a = response.data) == null ? void 0 : _a.data) == null ? void 0 : _b.accessToken) {
|
|
78
78
|
return response.data.data.accessToken;
|
|
79
79
|
}
|
|
80
80
|
}
|
|
81
81
|
}).catch(function(error) {
|
|
82
82
|
adapter.log.error(error);
|
|
83
|
-
return Promise.reject("Failed to login to Zendure REST API!");
|
|
83
|
+
return Promise.reject("[login] Failed to login to Zendure REST API!");
|
|
84
84
|
});
|
|
85
85
|
} else
|
|
86
86
|
return Promise.reject("Path error!");
|
|
87
87
|
};
|
|
88
88
|
const getDeviceList = (adapter) => {
|
|
89
|
-
adapter.log.debug(
|
|
89
|
+
adapter.log.debug(
|
|
90
|
+
"[getDeviceList] Getting device list from Zendure Rest API!"
|
|
91
|
+
);
|
|
90
92
|
if (adapter.accessToken && config && config.headers) {
|
|
91
93
|
config.headers["Blade-Auth"] = "bearer " + adapter.accessToken;
|
|
92
94
|
const body = {};
|
|
@@ -104,7 +106,7 @@ const getDeviceList = (adapter) => {
|
|
|
104
106
|
}
|
|
105
107
|
});
|
|
106
108
|
} else {
|
|
107
|
-
adapter.log.error("No Access Token found!");
|
|
109
|
+
adapter.log.error("[getDeviceList] No Access Token found!");
|
|
108
110
|
return Promise.reject("No Access Token found!");
|
|
109
111
|
}
|
|
110
112
|
};
|
|
@@ -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: 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 Zendure 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
|
|
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] Login to Zendure 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(\"[login] 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(\r\n \"[getDeviceList] Getting device list from Zendure Rest API!\",\r\n );\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(\"[getDeviceList] 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,+CAA+C;AAEhE,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,8CAA8C;AAAA,IACtE,CAAC;AAAA,EACL;AAAO,WAAO,QAAQ,OAAO,aAAa;AAC5C;AAEO,MAAM,gBAAgB,CAC3B,YACuC;AAEvC,UAAQ,IAAI;AAAA,IACV;AAAA,EACF;AAEA,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,wCAAwC;AAC1D,WAAO,QAAQ,OAAO,wBAAwB;AAAA,EAChD;AACF;",
|
|
6
6
|
"names": ["axios"]
|
|
7
7
|
}
|
package/io-package.json
CHANGED
|
@@ -1,8 +1,21 @@
|
|
|
1
1
|
{
|
|
2
2
|
"common": {
|
|
3
3
|
"name": "zendure-solarflow",
|
|
4
|
-
"version": "1.1.
|
|
4
|
+
"version": "1.1.15",
|
|
5
5
|
"news": {
|
|
6
|
+
"1.1.15": {
|
|
7
|
+
"en": "Calculations improved\nStop energy input on low voltage is now an option in settings",
|
|
8
|
+
"de": "Berechnungen verbessert\nStoppen Sie die Energieeingabe auf Niederspannung ist jetzt eine Option in Einstellungen",
|
|
9
|
+
"ru": "Улучшены расчеты\nСтоп-вход энергии при низком напряжении теперь опция в настройках",
|
|
10
|
+
"pt": "Cálculos melhorados\nParar a entrada de energia na baixa tensão é agora uma opção nas configurações",
|
|
11
|
+
"nl": "Verbeterde berekeningen\nStop energie-input op lage spanning is nu een optie in instellingen",
|
|
12
|
+
"fr": "Amélioration des calculs\nL'entrée d'énergie stop en basse tension est maintenant une option dans les réglages",
|
|
13
|
+
"it": "Miglioramento dei calcoli\nInterrompere l'ingresso di energia su bassa tensione è ora un'opzione nelle impostazioni",
|
|
14
|
+
"es": "Cálculos mejorados\nStop energy input on low tension is now an option in settings",
|
|
15
|
+
"pl": "Poprawiono obliczenia\nZaprzestanie wprowadzania energii przy niskim napięciu jest teraz opcją w ustawieniach",
|
|
16
|
+
"uk": "Удосконалено розрахунки\nЗупинити введення енергії на низькій напруги тепер опція в налаштуваннях",
|
|
17
|
+
"zh-cn": "计算改进\n在低电压下停止能量输入, 现在在设置中是一个选项"
|
|
18
|
+
},
|
|
6
19
|
"1.1.14": {
|
|
7
20
|
"en": "Reorganize Code\nCalculations are now optional and have to be enabled in settings\nCalculation of SOC from voltage and energy go in and out of batteries\nStop energy feed if voltage drops under limit",
|
|
8
21
|
"de": "Reorganisieren Code\nBerechnungen sind nun optional und müssen in Einstellungen aktiviert werden\nBerechnung von SOC aus Spannung und Energie gehen in und aus Batterien\nStoppen Sie die Energiezufuhr, wenn die Spannung unter Grenzwert sinkt",
|
|
@@ -80,19 +93,6 @@
|
|
|
80
93
|
"pl": "Fix Solar Input 1 i 2 z nowego firmware Zabb\nPopraw pozostały czas ładowania\nNapraw obliczenia nadpisane, gdy dane o wartości 0 wchodzą.",
|
|
81
94
|
"uk": "Фіксація Solar Input 1 і 2 від нової прошивки Zendure\nВиправлення часу решти зарядки\nВиправлення перезаписів, коли дані з значенням 0 надходить в.",
|
|
82
95
|
"zh-cn": "从新的 Zendure 固件中修复太阳输入 1 和 2\n修复剩余充电时间\n当有 0 个值的数据出现时, 修正覆盖的计算 ."
|
|
83
|
-
},
|
|
84
|
-
"1.1.8": {
|
|
85
|
-
"en": "Fix calculation error",
|
|
86
|
-
"de": "Fehler bei der Berechnung",
|
|
87
|
-
"ru": "Ошибка расчета",
|
|
88
|
-
"pt": "Corrigir erro de cálculo",
|
|
89
|
-
"nl": "Fix rekenfout",
|
|
90
|
-
"fr": "Correction de l'erreur de calcul",
|
|
91
|
-
"it": "Correzione dell'errore di calcolo",
|
|
92
|
-
"es": "Error de cálculo fijo",
|
|
93
|
-
"pl": "Błąd obliczenia",
|
|
94
|
-
"uk": "Виправлення помилки розрахунку",
|
|
95
|
-
"zh-cn": "修正计算错误"
|
|
96
96
|
}
|
|
97
97
|
},
|
|
98
98
|
"title": "Zendure Solarflow",
|