iobroker.zendure-solarflow 1.7.1 → 1.7.3

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 CHANGED
@@ -46,6 +46,15 @@ If you find the adapter useful for you and want to support my work, feel free to
46
46
  [![Donate](https://img.shields.io/badge/PayPal-00457C?style=for-the-badge&logo=paypal&logoColor=white)](https://www.paypal.com/paypalme/PeterFrommert)
47
47
 
48
48
  ## Changelog
49
+ ### 1.7.3 (2024-07-30)
50
+
51
+ - Fix AC input value for Hyper to max. 1200W
52
+ - Fix dcSwitch and acSwitch value
53
+
54
+ ### 1.7.2 (2024-07-29)
55
+
56
+ - Fix acSwitch for ACE and Hyper
57
+
49
58
  ### 1.7.1 (2024-07-29)
50
59
 
51
60
  - Fix missing ACE 1500 when connected with HUB1200 / HUB2000
@@ -432,6 +432,13 @@ const onMessage = async (topic, message) => {
432
432
  "inputLimit",
433
433
  obj.properties.inputLimit
434
434
  );
435
+ (0, import_adapterService.updateSolarFlowControlState)(
436
+ adapter,
437
+ productKey,
438
+ deviceKey,
439
+ "setInputLimit",
440
+ obj.properties.inputLimit
441
+ );
435
442
  }
436
443
  if (((_aa = obj.properties) == null ? void 0 : _aa.gridInputPower) != null && ((_ba = obj.properties) == null ? void 0 : _ba.gridInputPower) != void 0) {
437
444
  (0, import_adapterService.updateSolarFlowState)(
@@ -463,10 +470,24 @@ const onMessage = async (topic, message) => {
463
470
  if (((_ga = obj.properties) == null ? void 0 : _ga.acSwitch) != null && ((_ha = obj.properties) == null ? void 0 : _ha.acSwitch) != void 0) {
464
471
  const value = ((_ia = obj.properties) == null ? void 0 : _ia.acSwitch) == 0 ? false : true;
465
472
  (0, import_adapterService.updateSolarFlowState)(adapter, productKey, deviceKey, "acSwitch", value);
473
+ (0, import_adapterService.updateSolarFlowControlState)(
474
+ adapter,
475
+ productKey,
476
+ deviceKey,
477
+ "acSwitch",
478
+ value
479
+ );
466
480
  }
467
481
  if (((_ja = obj.properties) == null ? void 0 : _ja.dcSwitch) != null && ((_ka = obj.properties) == null ? void 0 : _ka.dcSwitch) != void 0) {
468
482
  const value = ((_la = obj.properties) == null ? void 0 : _la.dcSwitch) == 0 ? false : true;
469
483
  (0, import_adapterService.updateSolarFlowState)(adapter, productKey, deviceKey, "dcSwitch", value);
484
+ (0, import_adapterService.updateSolarFlowControlState)(
485
+ adapter,
486
+ productKey,
487
+ deviceKey,
488
+ "dcSwitch",
489
+ value
490
+ );
470
491
  }
471
492
  if (((_ma = obj.properties) == null ? void 0 : _ma.dcOutputPower) != null && ((_na = obj.properties) == null ? void 0 : _na.dcOutputPower) != void 0) {
472
493
  (0, import_adapterService.updateSolarFlowState)(
@@ -599,20 +620,25 @@ const setOutputLimit = async (adapter2, productKey, deviceKey, limit) => {
599
620
  }
600
621
  };
601
622
  const setInputLimit = async (adapter2, productKey, deviceKey, limit) => {
602
- var _a, _b;
623
+ var _a, _b, _c, _d;
603
624
  if (adapter2.mqttClient && productKey && deviceKey) {
625
+ let maxLimit = 900;
604
626
  const currentLimit = (_a = await adapter2.getStateAsync(productKey + "." + deviceKey + ".inputLimit")) == null ? void 0 : _a.val;
627
+ const productName = (_c = (_b = await adapter2.getStateAsync(productKey + "." + deviceKey + ".productName")) == null ? void 0 : _b.val) == null ? void 0 : _c.toString().toLowerCase();
628
+ if (productName == "hyper 2000") {
629
+ maxLimit = 1200;
630
+ }
605
631
  limit = Math.ceil(limit / 100) * 100;
606
632
  if (limit < 0) {
607
633
  limit = 0;
608
- } else if (limit > 900) {
609
- limit = 900;
634
+ } else if (limit > maxLimit) {
635
+ limit = maxLimit;
610
636
  }
611
637
  if (currentLimit != null && currentLimit != void 0) {
612
638
  if (currentLimit != limit) {
613
639
  const topic = `iot/${productKey}/${deviceKey}/properties/write`;
614
640
  const inputLimitContent = { properties: { inputLimit: limit } };
615
- (_b = adapter2.mqttClient) == null ? void 0 : _b.publish(topic, JSON.stringify(inputLimitContent));
641
+ (_d = adapter2.mqttClient) == null ? void 0 : _d.publish(topic, JSON.stringify(inputLimitContent));
616
642
  }
617
643
  }
618
644
  }
@@ -676,17 +702,17 @@ const setDcSwitch = async (adapter2, productKey, deviceKey, dcSwitch) => {
676
702
  (_a = adapter2.mqttClient) == null ? void 0 : _a.publish(topic, JSON.stringify(setDcSwitchContent));
677
703
  }
678
704
  };
679
- const setAcSwitch = async (adapter2, productKey, deviceKey, dcSwitch) => {
705
+ const setAcSwitch = async (adapter2, productKey, deviceKey, acSwitch) => {
680
706
  var _a;
681
707
  if (adapter2.mqttClient && productKey && deviceKey) {
682
708
  const topic = `iot/${productKey}/${deviceKey}/properties/write`;
683
- const setDcSwitchContent = {
684
- properties: { dcSwitch: dcSwitch ? 1 : 0 }
709
+ const setAcSwitchContent = {
710
+ properties: { acSwitch: acSwitch ? 1 : 0 }
685
711
  };
686
712
  adapter2.log.debug(
687
- `[setPassMode] Set AC Switch for device ${deviceKey} to ${dcSwitch}!`
713
+ `[setPassMode] Set AC Switch for device ${deviceKey} to ${acSwitch}!`
688
714
  );
689
- (_a = adapter2.mqttClient) == null ? void 0 : _a.publish(topic, JSON.stringify(setDcSwitchContent));
715
+ (_a = adapter2.mqttClient) == null ? void 0 : _a.publish(topic, JSON.stringify(setAcSwitchContent));
690
716
  }
691
717
  };
692
718
  const onConnected = () => {
@@ -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 * as mqtt from \"mqtt\";\r\nimport { ZendureSolarflow } from \"../main\";\r\nimport { ISolarFlowDeviceDetails } from \"../models/ISolarFlowDeviceDetails\";\r\nimport {\r\n checkVoltage,\r\n updateSolarFlowControlState,\r\n updateSolarFlowState,\r\n} from \"./adapterService\";\r\nimport { IPackData } from \"../models/IPackData\";\r\nimport { setEnergyWhMax, setSocToZero } from \"./calculationService\";\r\nimport { IMqttData, knownMqttProps } from \"../models/ISolarFlowMqttProperties\";\r\nimport {\r\n startCalculationJob,\r\n startCheckStatesAndConnectionJob,\r\n startRefreshAccessTokenTimerJob,\r\n startResetValuesJob,\r\n} from \"./jobSchedule\";\r\n\r\nlet adapter: ZendureSolarflow | undefined = undefined;\r\n\r\nexport const addOrUpdatePackData = async (\r\n productKey: string,\r\n deviceKey: string,\r\n packData: IPackData[],\r\n isSolarFlow: boolean\r\n): Promise<void> => {\r\n if (adapter && productKey && deviceKey) {\r\n await packData.forEach(async (x) => {\r\n // Process data only with a serial id!\r\n if (x.sn && adapter) {\r\n // create a state for the serial id\r\n const key = (\r\n productKey +\r\n \".\" +\r\n deviceKey +\r\n \".packData.\" +\r\n x.sn\r\n ).replace(adapter.FORBIDDEN_CHARS, \"\");\r\n\r\n await adapter?.extendObject(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?.extendObject(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?.extendObject(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?.extendObject(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?.extendObject(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?.setState(key + \".maxVol\", x.maxVol / 100, true);\r\n }\r\n\r\n if (x.totalVol) {\r\n await adapter?.extendObject(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?.setState(key + \".totalVol\", totalVol, true);\r\n\r\n // Send Voltage to checkVoltage Method (only if is Solarflow device)\r\n if (isSolarFlow) {\r\n checkVoltage(adapter, productKey, deviceKey, totalVol);\r\n }\r\n }\r\n }\r\n });\r\n }\r\n};\r\n\r\nconst onMessage = async (topic: string, message: Buffer): Promise<void> => {\r\n if (adapter) {\r\n const topicSplitted = topic.split(\"/\");\r\n const productKey = topicSplitted[1];\r\n const deviceKey = topicSplitted[2];\r\n\r\n let obj: IMqttData = {};\r\n try {\r\n obj = JSON.parse(message.toString());\r\n } catch (e) {\r\n const txt = message.toString();\r\n adapter.log.error(`[JSON PARSE ERROR] ${txt}`);\r\n }\r\n\r\n let isSolarFlow = false;\r\n const productName = await adapter.getStateAsync(\r\n `${productKey}.${deviceKey}.productName`\r\n );\r\n\r\n // Check if device is an solarflow or hyper device. Don't use LowVoltageBlock on an ACE device?\r\n if (\r\n productName?.val?.toString().toLowerCase().includes(\"solarflow\") ||\r\n productName?.val?.toString().toLowerCase().includes(\"hyper\")\r\n ) {\r\n isSolarFlow = true;\r\n }\r\n\r\n // set lastUpdate for deviceKey\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 if (\r\n adapter?.config.useCalculation &&\r\n obj.properties.electricLevel == 100 &&\r\n isSolarFlow\r\n ) {\r\n setEnergyWhMax(adapter, productKey, deviceKey);\r\n }\r\n\r\n // if minSoc is reached, set the calculated soc to 0\r\n const minSoc = await adapter?.getStateAsync(\r\n `${productKey}.${deviceKey}.minSoc`\r\n );\r\n if (\r\n adapter?.config.useCalculation &&\r\n minSoc &&\r\n minSoc.val &&\r\n obj.properties.electricLevel <= Number(minSoc.val) &&\r\n isSolarFlow\r\n ) {\r\n setSocToZero(adapter, productKey, deviceKey);\r\n }\r\n }\r\n\r\n if (\r\n obj.properties?.packState != null &&\r\n obj.properties?.packState != undefined\r\n ) {\r\n const value =\r\n obj.properties?.packState == 0\r\n ? \"Idle\"\r\n : obj.properties?.packState == 1\r\n ? \"Charging\"\r\n : obj.properties?.packState == 2\r\n ? \"Discharging\"\r\n : \"Unknown\";\r\n updateSolarFlowState(adapter, productKey, deviceKey, \"packState\", value);\r\n }\r\n\r\n if (\r\n obj.properties?.passMode != null &&\r\n obj.properties?.passMode != undefined\r\n ) {\r\n const value =\r\n obj.properties?.passMode == 0\r\n ? \"Automatic\"\r\n : obj.properties?.passMode == 1\r\n ? \"Always off\"\r\n : obj.properties?.passMode == 2\r\n ? \"Always on\"\r\n : \"Unknown\";\r\n updateSolarFlowState(adapter, productKey, deviceKey, \"passMode\", value);\r\n\r\n updateSolarFlowControlState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"passMode\",\r\n obj.properties?.passMode\r\n );\r\n }\r\n\r\n if (obj.properties?.pass != null && obj.properties?.pass != undefined) {\r\n const value = obj.properties?.pass == 0 ? false : true;\r\n\r\n updateSolarFlowState(adapter, productKey, deviceKey, \"pass\", value);\r\n }\r\n\r\n if (\r\n obj.properties?.autoRecover != null &&\r\n obj.properties?.autoRecover != undefined\r\n ) {\r\n const value = obj.properties?.autoRecover == 0 ? false : true;\r\n\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"autoRecover\",\r\n value\r\n );\r\n\r\n updateSolarFlowControlState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"autoRecover\",\r\n value\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?.energyPower != null &&\r\n obj.properties?.energyPower != undefined\r\n ) {\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"energyPower\",\r\n obj.properties.energyPower\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 updateSolarFlowControlState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"setOutputLimit\",\r\n obj.properties.outputLimit\r\n );\r\n }\r\n\r\n if (\r\n obj.properties?.buzzerSwitch != null &&\r\n obj.properties?.buzzerSwitch != undefined\r\n ) {\r\n const value = obj.properties?.buzzerSwitch == 0 ? false : true;\r\n\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"buzzerSwitch\",\r\n value\r\n );\r\n\r\n updateSolarFlowControlState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"buzzerSwitch\",\r\n value\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 let standbyUsage = 0;\r\n\r\n // Aktuelle Solar-Power abfragen, wenn 0 Standby-Verbrauch dazu rechnen\r\n const solarInputPower = await adapter?.getStateAsync(\r\n `${productKey}.${deviceKey}.solarInputPower`\r\n );\r\n\r\n if (solarInputPower && Number(solarInputPower.val) < 10) {\r\n standbyUsage = 10 - Number(solarInputPower.val);\r\n }\r\n\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"packInputPower\",\r\n obj.properties.packInputPower + standbyUsage\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\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 (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 updateSolarFlowControlState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"chargeLimit\",\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 updateSolarFlowControlState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"dischargeLimit\",\r\n Number(obj.properties.minSoc) / 10\r\n );\r\n }\r\n\r\n if (\r\n obj.properties?.inputLimit != null &&\r\n obj.properties?.inputLimit != undefined\r\n ) {\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"inputLimit\",\r\n obj.properties.inputLimit\r\n );\r\n }\r\n\r\n if (\r\n obj.properties?.gridInputPower != null &&\r\n obj.properties?.gridInputPower != undefined\r\n ) {\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"gridInputPower\",\r\n obj.properties.gridInputPower\r\n );\r\n }\r\n\r\n if (\r\n obj.properties?.acOutputPower != null &&\r\n obj.properties?.acOutputPower != undefined\r\n ) {\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"acOutputPower\",\r\n obj.properties.acOutputPower\r\n );\r\n }\r\n\r\n if (\r\n obj.properties?.gridPower != null &&\r\n obj.properties?.gridPower != undefined\r\n ) {\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"gridPower\",\r\n obj.properties.gridPower\r\n );\r\n }\r\n\r\n if (\r\n obj.properties?.acSwitch != null &&\r\n obj.properties?.acSwitch != undefined\r\n ) {\r\n const value = obj.properties?.acSwitch == 0 ? false : true;\r\n\r\n updateSolarFlowState(adapter, productKey, deviceKey, \"acSwitch\", value);\r\n }\r\n\r\n if (\r\n obj.properties?.dcSwitch != null &&\r\n obj.properties?.dcSwitch != undefined\r\n ) {\r\n const value = obj.properties?.dcSwitch == 0 ? false : true;\r\n\r\n updateSolarFlowState(adapter, productKey, deviceKey, \"dcSwitch\", value);\r\n }\r\n\r\n if (\r\n obj.properties?.dcOutputPower != null &&\r\n obj.properties?.dcOutputPower != undefined\r\n ) {\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"dcOutputPower\",\r\n obj.properties.dcOutputPower\r\n );\r\n }\r\n\r\n if (\r\n obj.properties?.pvBrand != null &&\r\n obj.properties?.pvBrand != undefined\r\n ) {\r\n const value =\r\n obj.properties?.pvBrand == 0\r\n ? \"Others\"\r\n : obj.properties?.pvBrand == 1\r\n ? \"Hoymiles\"\r\n : obj.properties?.pvBrand == 2\r\n ? \"Enphase\"\r\n : obj.properties?.pvBrand == 3\r\n ? \"APSystems\"\r\n : obj.properties?.pvBrand == 4\r\n ? \"Anker\"\r\n : obj.properties?.pvBrand == 5\r\n ? \"Deye\"\r\n : obj.properties?.pvBrand == 6\r\n ? \"Bosswerk\"\r\n : \"Unknown\";\r\n updateSolarFlowState(adapter, productKey, deviceKey, \"pvBrand\", value);\r\n }\r\n\r\n if (\r\n obj.properties?.inverseMaxPower != null &&\r\n obj.properties?.inverseMaxPower != undefined\r\n ) {\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"inverseMaxPower\",\r\n obj.properties.inverseMaxPower\r\n );\r\n }\r\n\r\n if (\r\n obj.properties?.wifiState != null &&\r\n obj.properties?.wifiState != undefined\r\n ) {\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"wifiState\",\r\n obj.properties.wifiState == 1 ? \"Connected\" : \"Disconnected\"\r\n );\r\n }\r\n\r\n if (\r\n obj.properties?.packNum != null &&\r\n obj.properties?.packNum != undefined\r\n ) {\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"packNum\",\r\n obj.properties.packNum\r\n );\r\n }\r\n\r\n if (\r\n obj.properties?.hubState != null &&\r\n obj.properties?.hubState != undefined\r\n ) {\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"hubState\",\r\n obj.properties.hubState == 0\r\n ? \"Stop output and standby\"\r\n : \"Stop output and shut down\"\r\n );\r\n }\r\n\r\n if (obj.packData) {\r\n addOrUpdatePackData(productKey, deviceKey, obj.packData, isSolarFlow);\r\n }\r\n\r\n if (obj.properties) {\r\n Object.entries(obj.properties).forEach(([key, value]) => {\r\n if (knownMqttProps.includes(key)) {\r\n //console.log(`${key} with value ${value} is a known Mqtt Prop!`);\r\n } else {\r\n console.log(\r\n `${productName?.val}: ${key} with value ${value} is a UNKNOWN Mqtt Prop!`\r\n );\r\n }\r\n });\r\n }\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 const topic = `iot/${productKey}/${deviceKey}/properties/write`;\r\n\r\n const outputlimit = { properties: { outputLimit: limit } };\r\n adapter.mqttClient?.publish(topic, JSON.stringify(outputlimit));\r\n }\r\n }\r\n }\r\n};\r\n\r\nexport const setInputLimit = 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 const currentLimit = (\r\n await adapter.getStateAsync(productKey + \".\" + deviceKey + \".inputLimit\")\r\n )?.val;\r\n\r\n // Das Limit kann nur in 100er Schritten gesetzt werden\r\n limit = Math.ceil(limit / 100) * 100;\r\n if (limit < 0) {\r\n limit = 0;\r\n } else if (limit > 900) {\r\n limit = 900;\r\n }\r\n\r\n if (currentLimit != null && currentLimit != undefined) {\r\n if (currentLimit != limit) {\r\n const topic = `iot/${productKey}/${deviceKey}/properties/write`;\r\n\r\n const inputLimitContent = { properties: { inputLimit: limit } };\r\n adapter.mqttClient?.publish(topic, JSON.stringify(inputLimitContent));\r\n }\r\n }\r\n }\r\n};\r\n\r\nexport const setBuzzerSwitch = async (\r\n adapter: ZendureSolarflow,\r\n productKey: string,\r\n deviceKey: string,\r\n buzzerOn: boolean\r\n): Promise<void> => {\r\n if (adapter.mqttClient && productKey && deviceKey) {\r\n const topic = `iot/${productKey}/${deviceKey}/properties/write`;\r\n\r\n const socSetLimit = { properties: { buzzerSwitch: buzzerOn ? 1 : 0 } };\r\n adapter.log.debug(\r\n `[setBuzzer] Setting Buzzer for device key ${deviceKey} to ${buzzerOn}!`\r\n );\r\n adapter.mqttClient?.publish(topic, JSON.stringify(socSetLimit));\r\n }\r\n};\r\n\r\nexport const triggerFullTelemetryUpdate = async (\r\n adapter: ZendureSolarflow,\r\n productKey: string,\r\n deviceKey: string\r\n): Promise<void> => {\r\n if (adapter.mqttClient && productKey && deviceKey) {\r\n const topic = `iot/${productKey}/${deviceKey}/properties/read`;\r\n\r\n const getAllContent = { properties: [\"getAll\"] };\r\n adapter.log.debug(\r\n `[triggerFullTelemetryUpdate] Triggering full telemetry update for device key ${deviceKey}!`\r\n );\r\n adapter.mqttClient?.publish(topic, JSON.stringify(getAllContent));\r\n }\r\n};\r\n\r\nexport const setPassMode = async (\r\n adapter: ZendureSolarflow,\r\n productKey: string,\r\n deviceKey: string,\r\n passMode: number\r\n): Promise<void> => {\r\n if (adapter.mqttClient && productKey && deviceKey) {\r\n const topic = `iot/${productKey}/${deviceKey}/properties/write`;\r\n\r\n const setPassModeContent = { properties: { passMode: passMode } };\r\n adapter.log.debug(\r\n `[setPassMode] Set passMode for device ${deviceKey} to ${passMode}!`\r\n );\r\n adapter.mqttClient?.publish(topic, JSON.stringify(setPassModeContent));\r\n }\r\n};\r\n\r\nexport const setAutoRecover = async (\r\n adapter: ZendureSolarflow,\r\n productKey: string,\r\n deviceKey: string,\r\n autoRecover: boolean\r\n): Promise<void> => {\r\n if (adapter.mqttClient && productKey && deviceKey) {\r\n const topic = `iot/${productKey}/${deviceKey}/properties/write`;\r\n\r\n const setAutoRecoverContent = {\r\n properties: { autoRecover: autoRecover ? 1 : 0 },\r\n };\r\n adapter.log.debug(\r\n `[setPassMode] Set autoRecover for device ${deviceKey} to ${autoRecover}!`\r\n );\r\n adapter.mqttClient?.publish(topic, JSON.stringify(setAutoRecoverContent));\r\n }\r\n};\r\n\r\nexport const setDcSwitch = async (\r\n adapter: ZendureSolarflow,\r\n productKey: string,\r\n deviceKey: string,\r\n dcSwitch: boolean\r\n): Promise<void> => {\r\n if (adapter.mqttClient && productKey && deviceKey) {\r\n const topic = `iot/${productKey}/${deviceKey}/properties/write`;\r\n\r\n const setDcSwitchContent = {\r\n properties: { dcSwitch: dcSwitch ? 1 : 0 },\r\n };\r\n adapter.log.debug(\r\n `[setPassMode] Set DC Switch for device ${deviceKey} to ${dcSwitch}!`\r\n );\r\n adapter.mqttClient?.publish(topic, JSON.stringify(setDcSwitchContent));\r\n }\r\n};\r\n\r\nexport const setAcSwitch = async (\r\n adapter: ZendureSolarflow,\r\n productKey: string,\r\n deviceKey: string,\r\n dcSwitch: boolean\r\n): Promise<void> => {\r\n if (adapter.mqttClient && productKey && deviceKey) {\r\n const topic = `iot/${productKey}/${deviceKey}/properties/write`;\r\n\r\n const setDcSwitchContent = {\r\n properties: { dcSwitch: dcSwitch ? 1 : 0 },\r\n };\r\n adapter.log.debug(\r\n `[setPassMode] Set AC Switch for device ${deviceKey} to ${dcSwitch}!`\r\n );\r\n adapter.mqttClient?.publish(topic, JSON.stringify(setDcSwitchContent));\r\n }\r\n};\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 onSubscribeReportTopic: 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 of Report Topic successful!\");\r\n }\r\n};\r\n\r\nconst onSubscribeIotTopic: any = (\r\n error: Error | null,\r\n productKey: string,\r\n deviceKey: string\r\n) => {\r\n if (error) {\r\n adapter?.log.error(\"Subscription to MQTT failed! Error: \" + error);\r\n } else if (adapter) {\r\n adapter?.log.debug(\"Subscription of IOT Topic successful!\");\r\n triggerFullTelemetryUpdate(adapter, productKey, deviceKey);\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:\r\n adapter.config.server && adapter.config.server == \"eu\"\r\n ? \"H6s$j9CtNa0N\"\r\n : \"oK#PCgy6OZxd\",\r\n clean: true,\r\n protocolVersion: 5,\r\n };\r\n\r\n if (mqtt && adapter && adapter.paths && adapter.deviceList) {\r\n adapter.log.debug(\r\n `[connectMqttClient] Connecting to MQTT broker ${\r\n adapter.paths.mqttUrl + \":\" + adapter.paths.mqttPort\r\n }...`\r\n );\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(\r\n (device: ISolarFlowDeviceDetails, index: number) => {\r\n if (adapter) {\r\n const reportTopic = `/${device.productKey}/${device.deviceKey}/properties/report`;\r\n const iotTopic = `iot/${device.productKey}/${device.deviceKey}/#`;\r\n\r\n setTimeout(() => {\r\n if (adapter) {\r\n adapter.log.debug(\r\n `[connectMqttClient] Subscribing to MQTT Topic: ${reportTopic}`\r\n );\r\n adapter.mqttClient?.subscribe(\r\n reportTopic,\r\n onSubscribeReportTopic\r\n );\r\n }\r\n }, 1000 * index);\r\n\r\n setTimeout(() => {\r\n adapter?.log.debug(\r\n `[connectMqttClient] Subscribing to MQTT Topic: ${iotTopic}`\r\n );\r\n adapter?.mqttClient?.subscribe(iotTopic, (error) => {\r\n onSubscribeIotTopic(error, device.productKey, device.deviceKey);\r\n });\r\n }, 1500 * index);\r\n\r\n // Check if has subdevice e.g. ACE and connect to this also?\r\n if (device.packList && device.packList.length > 0) {\r\n device.packList.forEach(async (subDevice) => {\r\n if (subDevice.productName.toLocaleLowerCase() == \"ace 1500\") {\r\n const reportTopic = `/${subDevice.productKey}/${subDevice.deviceKey}/properties/report`;\r\n const iotTopic = `iot/${subDevice.productKey}/${subDevice.deviceKey}/#`;\r\n\r\n setTimeout(() => {\r\n if (adapter) {\r\n adapter.log.debug(\r\n `[connectMqttClient] Subscribing to MQTT Topic: ${reportTopic}`\r\n );\r\n adapter.mqttClient?.subscribe(\r\n reportTopic,\r\n onSubscribeReportTopic\r\n );\r\n }\r\n }, 1000 * index);\r\n\r\n setTimeout(() => {\r\n adapter?.log.debug(\r\n `[connectMqttClient] Subscribing to MQTT Topic: ${iotTopic}`\r\n );\r\n adapter?.mqttClient?.subscribe(iotTopic, (error) => {\r\n onSubscribeIotTopic(\r\n error,\r\n subDevice.productKey,\r\n subDevice.deviceKey\r\n );\r\n });\r\n }, 1500 * index);\r\n }\r\n });\r\n }\r\n }\r\n }\r\n );\r\n\r\n adapter.mqttClient.on(\"message\", onMessage);\r\n\r\n // Job starten die states in der Nacht zu resetten\r\n startResetValuesJob(adapter);\r\n\r\n // Job starten die States zu checken\r\n startCheckStatesAndConnectionJob(adapter);\r\n\r\n // Den Access Token aktualiseren\r\n startRefreshAccessTokenTimerJob(adapter);\r\n\r\n // Calculation Job starten sofern aktiviert\r\n if (adapter.config.useCalculation) {\r\n startCalculationJob(adapter);\r\n }\r\n }\r\n }\r\n};\r\n"],
5
- "mappings": "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",
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 {\r\n checkVoltage,\r\n updateSolarFlowControlState,\r\n updateSolarFlowState,\r\n} from \"./adapterService\";\r\nimport { IPackData } from \"../models/IPackData\";\r\nimport { setEnergyWhMax, setSocToZero } from \"./calculationService\";\r\nimport { IMqttData, knownMqttProps } from \"../models/ISolarFlowMqttProperties\";\r\nimport {\r\n startCalculationJob,\r\n startCheckStatesAndConnectionJob,\r\n startRefreshAccessTokenTimerJob,\r\n startResetValuesJob,\r\n} from \"./jobSchedule\";\r\n\r\nlet adapter: ZendureSolarflow | undefined = undefined;\r\n\r\nexport const addOrUpdatePackData = async (\r\n productKey: string,\r\n deviceKey: string,\r\n packData: IPackData[],\r\n isSolarFlow: boolean\r\n): Promise<void> => {\r\n if (adapter && productKey && deviceKey) {\r\n await packData.forEach(async (x) => {\r\n // Process data only with a serial id!\r\n if (x.sn && adapter) {\r\n // create a state for the serial id\r\n const key = (\r\n productKey +\r\n \".\" +\r\n deviceKey +\r\n \".packData.\" +\r\n x.sn\r\n ).replace(adapter.FORBIDDEN_CHARS, \"\");\r\n\r\n await adapter?.extendObject(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?.extendObject(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?.extendObject(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?.extendObject(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?.extendObject(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?.setState(key + \".maxVol\", x.maxVol / 100, true);\r\n }\r\n\r\n if (x.totalVol) {\r\n await adapter?.extendObject(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?.setState(key + \".totalVol\", totalVol, true);\r\n\r\n // Send Voltage to checkVoltage Method (only if is Solarflow device)\r\n if (isSolarFlow) {\r\n checkVoltage(adapter, productKey, deviceKey, totalVol);\r\n }\r\n }\r\n }\r\n });\r\n }\r\n};\r\n\r\nconst onMessage = async (topic: string, message: Buffer): Promise<void> => {\r\n if (adapter) {\r\n const topicSplitted = topic.split(\"/\");\r\n const productKey = topicSplitted[1];\r\n const deviceKey = topicSplitted[2];\r\n\r\n let obj: IMqttData = {};\r\n try {\r\n obj = JSON.parse(message.toString());\r\n } catch (e) {\r\n const txt = message.toString();\r\n adapter.log.error(`[JSON PARSE ERROR] ${txt}`);\r\n }\r\n\r\n let isSolarFlow = false;\r\n const productName = await adapter.getStateAsync(\r\n `${productKey}.${deviceKey}.productName`\r\n );\r\n\r\n // Check if device is an solarflow or hyper device. Don't use LowVoltageBlock on an ACE device?\r\n if (\r\n productName?.val?.toString().toLowerCase().includes(\"solarflow\") ||\r\n productName?.val?.toString().toLowerCase().includes(\"hyper\")\r\n ) {\r\n isSolarFlow = true;\r\n }\r\n\r\n // set lastUpdate for deviceKey\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 if (\r\n adapter?.config.useCalculation &&\r\n obj.properties.electricLevel == 100 &&\r\n isSolarFlow\r\n ) {\r\n setEnergyWhMax(adapter, productKey, deviceKey);\r\n }\r\n\r\n // if minSoc is reached, set the calculated soc to 0\r\n const minSoc = await adapter?.getStateAsync(\r\n `${productKey}.${deviceKey}.minSoc`\r\n );\r\n if (\r\n adapter?.config.useCalculation &&\r\n minSoc &&\r\n minSoc.val &&\r\n obj.properties.electricLevel <= Number(minSoc.val) &&\r\n isSolarFlow\r\n ) {\r\n setSocToZero(adapter, productKey, deviceKey);\r\n }\r\n }\r\n\r\n if (\r\n obj.properties?.packState != null &&\r\n obj.properties?.packState != undefined\r\n ) {\r\n const value =\r\n obj.properties?.packState == 0\r\n ? \"Idle\"\r\n : obj.properties?.packState == 1\r\n ? \"Charging\"\r\n : obj.properties?.packState == 2\r\n ? \"Discharging\"\r\n : \"Unknown\";\r\n updateSolarFlowState(adapter, productKey, deviceKey, \"packState\", value);\r\n }\r\n\r\n if (\r\n obj.properties?.passMode != null &&\r\n obj.properties?.passMode != undefined\r\n ) {\r\n const value =\r\n obj.properties?.passMode == 0\r\n ? \"Automatic\"\r\n : obj.properties?.passMode == 1\r\n ? \"Always off\"\r\n : obj.properties?.passMode == 2\r\n ? \"Always on\"\r\n : \"Unknown\";\r\n updateSolarFlowState(adapter, productKey, deviceKey, \"passMode\", value);\r\n\r\n updateSolarFlowControlState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"passMode\",\r\n obj.properties?.passMode\r\n );\r\n }\r\n\r\n if (obj.properties?.pass != null && obj.properties?.pass != undefined) {\r\n const value = obj.properties?.pass == 0 ? false : true;\r\n\r\n updateSolarFlowState(adapter, productKey, deviceKey, \"pass\", value);\r\n }\r\n\r\n if (\r\n obj.properties?.autoRecover != null &&\r\n obj.properties?.autoRecover != undefined\r\n ) {\r\n const value = obj.properties?.autoRecover == 0 ? false : true;\r\n\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"autoRecover\",\r\n value\r\n );\r\n\r\n updateSolarFlowControlState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"autoRecover\",\r\n value\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?.energyPower != null &&\r\n obj.properties?.energyPower != undefined\r\n ) {\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"energyPower\",\r\n obj.properties.energyPower\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 updateSolarFlowControlState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"setOutputLimit\",\r\n obj.properties.outputLimit\r\n );\r\n }\r\n\r\n if (\r\n obj.properties?.buzzerSwitch != null &&\r\n obj.properties?.buzzerSwitch != undefined\r\n ) {\r\n const value = obj.properties?.buzzerSwitch == 0 ? false : true;\r\n\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"buzzerSwitch\",\r\n value\r\n );\r\n\r\n updateSolarFlowControlState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"buzzerSwitch\",\r\n value\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 let standbyUsage = 0;\r\n\r\n // Aktuelle Solar-Power abfragen, wenn 0 Standby-Verbrauch dazu rechnen\r\n const solarInputPower = await adapter?.getStateAsync(\r\n `${productKey}.${deviceKey}.solarInputPower`\r\n );\r\n\r\n if (solarInputPower && Number(solarInputPower.val) < 10) {\r\n standbyUsage = 10 - Number(solarInputPower.val);\r\n }\r\n\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"packInputPower\",\r\n obj.properties.packInputPower + standbyUsage\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\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 (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 updateSolarFlowControlState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"chargeLimit\",\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 updateSolarFlowControlState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"dischargeLimit\",\r\n Number(obj.properties.minSoc) / 10\r\n );\r\n }\r\n\r\n if (\r\n obj.properties?.inputLimit != null &&\r\n obj.properties?.inputLimit != undefined\r\n ) {\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"inputLimit\",\r\n obj.properties.inputLimit\r\n );\r\n\r\n updateSolarFlowControlState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"setInputLimit\",\r\n obj.properties.inputLimit\r\n );\r\n }\r\n\r\n if (\r\n obj.properties?.gridInputPower != null &&\r\n obj.properties?.gridInputPower != undefined\r\n ) {\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"gridInputPower\",\r\n obj.properties.gridInputPower\r\n );\r\n }\r\n\r\n if (\r\n obj.properties?.acOutputPower != null &&\r\n obj.properties?.acOutputPower != undefined\r\n ) {\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"acOutputPower\",\r\n obj.properties.acOutputPower\r\n );\r\n }\r\n\r\n if (\r\n obj.properties?.gridPower != null &&\r\n obj.properties?.gridPower != undefined\r\n ) {\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"gridPower\",\r\n obj.properties.gridPower\r\n );\r\n }\r\n\r\n if (\r\n obj.properties?.acSwitch != null &&\r\n obj.properties?.acSwitch != undefined\r\n ) {\r\n const value = obj.properties?.acSwitch == 0 ? false : true;\r\n\r\n updateSolarFlowState(adapter, productKey, deviceKey, \"acSwitch\", value);\r\n\r\n updateSolarFlowControlState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"acSwitch\",\r\n value\r\n );\r\n }\r\n\r\n if (\r\n obj.properties?.dcSwitch != null &&\r\n obj.properties?.dcSwitch != undefined\r\n ) {\r\n const value = obj.properties?.dcSwitch == 0 ? false : true;\r\n\r\n updateSolarFlowState(adapter, productKey, deviceKey, \"dcSwitch\", value);\r\n\r\n updateSolarFlowControlState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"dcSwitch\",\r\n value\r\n );\r\n }\r\n\r\n if (\r\n obj.properties?.dcOutputPower != null &&\r\n obj.properties?.dcOutputPower != undefined\r\n ) {\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"dcOutputPower\",\r\n obj.properties.dcOutputPower\r\n );\r\n }\r\n\r\n if (\r\n obj.properties?.pvBrand != null &&\r\n obj.properties?.pvBrand != undefined\r\n ) {\r\n const value =\r\n obj.properties?.pvBrand == 0\r\n ? \"Others\"\r\n : obj.properties?.pvBrand == 1\r\n ? \"Hoymiles\"\r\n : obj.properties?.pvBrand == 2\r\n ? \"Enphase\"\r\n : obj.properties?.pvBrand == 3\r\n ? \"APSystems\"\r\n : obj.properties?.pvBrand == 4\r\n ? \"Anker\"\r\n : obj.properties?.pvBrand == 5\r\n ? \"Deye\"\r\n : obj.properties?.pvBrand == 6\r\n ? \"Bosswerk\"\r\n : \"Unknown\";\r\n updateSolarFlowState(adapter, productKey, deviceKey, \"pvBrand\", value);\r\n }\r\n\r\n if (\r\n obj.properties?.inverseMaxPower != null &&\r\n obj.properties?.inverseMaxPower != undefined\r\n ) {\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"inverseMaxPower\",\r\n obj.properties.inverseMaxPower\r\n );\r\n }\r\n\r\n if (\r\n obj.properties?.wifiState != null &&\r\n obj.properties?.wifiState != undefined\r\n ) {\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"wifiState\",\r\n obj.properties.wifiState == 1 ? \"Connected\" : \"Disconnected\"\r\n );\r\n }\r\n\r\n if (\r\n obj.properties?.packNum != null &&\r\n obj.properties?.packNum != undefined\r\n ) {\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"packNum\",\r\n obj.properties.packNum\r\n );\r\n }\r\n\r\n if (\r\n obj.properties?.hubState != null &&\r\n obj.properties?.hubState != undefined\r\n ) {\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"hubState\",\r\n obj.properties.hubState == 0\r\n ? \"Stop output and standby\"\r\n : \"Stop output and shut down\"\r\n );\r\n }\r\n\r\n if (obj.packData) {\r\n addOrUpdatePackData(productKey, deviceKey, obj.packData, isSolarFlow);\r\n }\r\n\r\n if (obj.properties) {\r\n Object.entries(obj.properties).forEach(([key, value]) => {\r\n if (knownMqttProps.includes(key)) {\r\n //console.log(`${key} with value ${value} is a known Mqtt Prop!`);\r\n } else {\r\n console.log(\r\n `${productName?.val}: ${key} with value ${value} is a UNKNOWN Mqtt Prop!`\r\n );\r\n }\r\n });\r\n }\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 const topic = `iot/${productKey}/${deviceKey}/properties/write`;\r\n\r\n const outputlimit = { properties: { outputLimit: limit } };\r\n adapter.mqttClient?.publish(topic, JSON.stringify(outputlimit));\r\n }\r\n }\r\n }\r\n};\r\n\r\nexport const setInputLimit = 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 let maxLimit = 900;\r\n const currentLimit = (\r\n await adapter.getStateAsync(productKey + \".\" + deviceKey + \".inputLimit\")\r\n )?.val;\r\n\r\n const productName = (\r\n await adapter.getStateAsync(productKey + \".\" + deviceKey + \".productName\")\r\n )?.val\r\n ?.toString()\r\n .toLowerCase();\r\n\r\n if (productName == \"hyper 2000\") {\r\n maxLimit = 1200;\r\n }\r\n\r\n // Das Limit kann nur in 100er Schritten gesetzt werden\r\n limit = Math.ceil(limit / 100) * 100;\r\n if (limit < 0) {\r\n limit = 0;\r\n } else if (limit > maxLimit) {\r\n limit = maxLimit;\r\n }\r\n\r\n if (currentLimit != null && currentLimit != undefined) {\r\n if (currentLimit != limit) {\r\n const topic = `iot/${productKey}/${deviceKey}/properties/write`;\r\n\r\n const inputLimitContent = { properties: { inputLimit: limit } };\r\n adapter.mqttClient?.publish(topic, JSON.stringify(inputLimitContent));\r\n }\r\n }\r\n }\r\n};\r\n\r\nexport const setBuzzerSwitch = async (\r\n adapter: ZendureSolarflow,\r\n productKey: string,\r\n deviceKey: string,\r\n buzzerOn: boolean\r\n): Promise<void> => {\r\n if (adapter.mqttClient && productKey && deviceKey) {\r\n const topic = `iot/${productKey}/${deviceKey}/properties/write`;\r\n\r\n const socSetLimit = { properties: { buzzerSwitch: buzzerOn ? 1 : 0 } };\r\n adapter.log.debug(\r\n `[setBuzzer] Setting Buzzer for device key ${deviceKey} to ${buzzerOn}!`\r\n );\r\n adapter.mqttClient?.publish(topic, JSON.stringify(socSetLimit));\r\n }\r\n};\r\n\r\nexport const triggerFullTelemetryUpdate = async (\r\n adapter: ZendureSolarflow,\r\n productKey: string,\r\n deviceKey: string\r\n): Promise<void> => {\r\n if (adapter.mqttClient && productKey && deviceKey) {\r\n const topic = `iot/${productKey}/${deviceKey}/properties/read`;\r\n\r\n const getAllContent = { properties: [\"getAll\"] };\r\n adapter.log.debug(\r\n `[triggerFullTelemetryUpdate] Triggering full telemetry update for device key ${deviceKey}!`\r\n );\r\n adapter.mqttClient?.publish(topic, JSON.stringify(getAllContent));\r\n }\r\n};\r\n\r\nexport const setPassMode = async (\r\n adapter: ZendureSolarflow,\r\n productKey: string,\r\n deviceKey: string,\r\n passMode: number\r\n): Promise<void> => {\r\n if (adapter.mqttClient && productKey && deviceKey) {\r\n const topic = `iot/${productKey}/${deviceKey}/properties/write`;\r\n\r\n const setPassModeContent = { properties: { passMode: passMode } };\r\n adapter.log.debug(\r\n `[setPassMode] Set passMode for device ${deviceKey} to ${passMode}!`\r\n );\r\n adapter.mqttClient?.publish(topic, JSON.stringify(setPassModeContent));\r\n }\r\n};\r\n\r\nexport const setAutoRecover = async (\r\n adapter: ZendureSolarflow,\r\n productKey: string,\r\n deviceKey: string,\r\n autoRecover: boolean\r\n): Promise<void> => {\r\n if (adapter.mqttClient && productKey && deviceKey) {\r\n const topic = `iot/${productKey}/${deviceKey}/properties/write`;\r\n\r\n const setAutoRecoverContent = {\r\n properties: { autoRecover: autoRecover ? 1 : 0 },\r\n };\r\n adapter.log.debug(\r\n `[setPassMode] Set autoRecover for device ${deviceKey} to ${autoRecover}!`\r\n );\r\n adapter.mqttClient?.publish(topic, JSON.stringify(setAutoRecoverContent));\r\n }\r\n};\r\n\r\nexport const setDcSwitch = async (\r\n adapter: ZendureSolarflow,\r\n productKey: string,\r\n deviceKey: string,\r\n dcSwitch: boolean\r\n): Promise<void> => {\r\n if (adapter.mqttClient && productKey && deviceKey) {\r\n const topic = `iot/${productKey}/${deviceKey}/properties/write`;\r\n\r\n const setDcSwitchContent = {\r\n properties: { dcSwitch: dcSwitch ? 1 : 0 },\r\n };\r\n adapter.log.debug(\r\n `[setPassMode] Set DC Switch for device ${deviceKey} to ${dcSwitch}!`\r\n );\r\n adapter.mqttClient?.publish(topic, JSON.stringify(setDcSwitchContent));\r\n }\r\n};\r\n\r\nexport const setAcSwitch = async (\r\n adapter: ZendureSolarflow,\r\n productKey: string,\r\n deviceKey: string,\r\n acSwitch: boolean\r\n): Promise<void> => {\r\n if (adapter.mqttClient && productKey && deviceKey) {\r\n const topic = `iot/${productKey}/${deviceKey}/properties/write`;\r\n\r\n const setAcSwitchContent = {\r\n properties: { acSwitch: acSwitch ? 1 : 0 },\r\n };\r\n adapter.log.debug(\r\n `[setPassMode] Set AC Switch for device ${deviceKey} to ${acSwitch}!`\r\n );\r\n adapter.mqttClient?.publish(topic, JSON.stringify(setAcSwitchContent));\r\n }\r\n};\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 onSubscribeReportTopic: 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 of Report Topic successful!\");\r\n }\r\n};\r\n\r\nconst onSubscribeIotTopic: any = (\r\n error: Error | null,\r\n productKey: string,\r\n deviceKey: string\r\n) => {\r\n if (error) {\r\n adapter?.log.error(\"Subscription to MQTT failed! Error: \" + error);\r\n } else if (adapter) {\r\n adapter?.log.debug(\"Subscription of IOT Topic successful!\");\r\n triggerFullTelemetryUpdate(adapter, productKey, deviceKey);\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:\r\n adapter.config.server && adapter.config.server == \"eu\"\r\n ? \"H6s$j9CtNa0N\"\r\n : \"oK#PCgy6OZxd\",\r\n clean: true,\r\n protocolVersion: 5,\r\n };\r\n\r\n if (mqtt && adapter && adapter.paths && adapter.deviceList) {\r\n adapter.log.debug(\r\n `[connectMqttClient] Connecting to MQTT broker ${\r\n adapter.paths.mqttUrl + \":\" + adapter.paths.mqttPort\r\n }...`\r\n );\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(\r\n (device: ISolarFlowDeviceDetails, index: number) => {\r\n if (adapter) {\r\n const reportTopic = `/${device.productKey}/${device.deviceKey}/properties/report`;\r\n const iotTopic = `iot/${device.productKey}/${device.deviceKey}/#`;\r\n\r\n setTimeout(() => {\r\n if (adapter) {\r\n adapter.log.debug(\r\n `[connectMqttClient] Subscribing to MQTT Topic: ${reportTopic}`\r\n );\r\n adapter.mqttClient?.subscribe(\r\n reportTopic,\r\n onSubscribeReportTopic\r\n );\r\n }\r\n }, 1000 * index);\r\n\r\n setTimeout(() => {\r\n adapter?.log.debug(\r\n `[connectMqttClient] Subscribing to MQTT Topic: ${iotTopic}`\r\n );\r\n adapter?.mqttClient?.subscribe(iotTopic, (error) => {\r\n onSubscribeIotTopic(error, device.productKey, device.deviceKey);\r\n });\r\n }, 1500 * index);\r\n\r\n // Check if has subdevice e.g. ACE and connect to this also?\r\n if (device.packList && device.packList.length > 0) {\r\n device.packList.forEach(async (subDevice) => {\r\n if (subDevice.productName.toLocaleLowerCase() == \"ace 1500\") {\r\n const reportTopic = `/${subDevice.productKey}/${subDevice.deviceKey}/properties/report`;\r\n const iotTopic = `iot/${subDevice.productKey}/${subDevice.deviceKey}/#`;\r\n\r\n setTimeout(() => {\r\n if (adapter) {\r\n adapter.log.debug(\r\n `[connectMqttClient] Subscribing to MQTT Topic: ${reportTopic}`\r\n );\r\n adapter.mqttClient?.subscribe(\r\n reportTopic,\r\n onSubscribeReportTopic\r\n );\r\n }\r\n }, 1000 * index);\r\n\r\n setTimeout(() => {\r\n adapter?.log.debug(\r\n `[connectMqttClient] Subscribing to MQTT Topic: ${iotTopic}`\r\n );\r\n adapter?.mqttClient?.subscribe(iotTopic, (error) => {\r\n onSubscribeIotTopic(\r\n error,\r\n subDevice.productKey,\r\n subDevice.deviceKey\r\n );\r\n });\r\n }, 1500 * index);\r\n }\r\n });\r\n }\r\n }\r\n }\r\n );\r\n\r\n adapter.mqttClient.on(\"message\", onMessage);\r\n\r\n // Job starten die states in der Nacht zu resetten\r\n startResetValuesJob(adapter);\r\n\r\n // Job starten die States zu checken\r\n startCheckStatesAndConnectionJob(adapter);\r\n\r\n // Den Access Token aktualiseren\r\n startRefreshAccessTokenTimerJob(adapter);\r\n\r\n // Calculation Job starten sofern aktiviert\r\n if (adapter.config.useCalculation) {\r\n startCalculationJob(adapter);\r\n }\r\n }\r\n }\r\n};\r\n"],
5
+ "mappings": "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",
6
6
  "names": ["adapter", "reportTopic", "iotTopic"]
7
7
  }
package/io-package.json CHANGED
@@ -1,8 +1,34 @@
1
1
  {
2
2
  "common": {
3
3
  "name": "zendure-solarflow",
4
- "version": "1.7.1",
4
+ "version": "1.7.3",
5
5
  "news": {
6
+ "1.7.3": {
7
+ "en": "Fix AC input value for Hyper to max. 1200W\nFix dcSwitch and acSwitch value",
8
+ "de": "Fix AC-Eingabewert für Hyper zu max. 1\nFix dcSwitch und acSwitch Wert",
9
+ "ru": "Исправить значение переменного тока для Hyper to max. 1200 Вт\nFix dcSwitch и acSwitch значение",
10
+ "pt": "Corrigir valor de entrada AC para Hyper para max. 1200W\nFix dcSwitch e valor acSwitch",
11
+ "nl": "Fix AC ingang waarde voor Hyper tot max. 1200W\nDcSwitch- en acSwitch-waarde herstellen",
12
+ "fr": "Fixer la valeur d'entrée AC pour Hyper à max. 1200W\nCorrection de la valeur dcSwitch et acSwitch",
13
+ "it": "Fissare il valore di ingresso AC per Hyper a max. 1200W\nFissare il valore dcSwitch e acSwitch",
14
+ "es": "Fijar el valor de entrada AC para Hyper a max. 1200W\nFijar el valor dcSwitch y acSwitch",
15
+ "pl": "Popraw wartość wejściową AC dla Hyper do max. 1200W\nNapraw wartość dcSwitch i acSwitch",
16
+ "uk": "Фіксувати значення введення змінного струму для Hyper до макс. 1200В\nВиправлення dcSwitch і значення acSwitch",
17
+ "zh-cn": "将 Hyper 的 AC 输入值固定为最大 。 1200W (英语)\n修正 dcSwitch 和 acSwitch 值"
18
+ },
19
+ "1.7.2": {
20
+ "en": "Fix acSwitch for ACE and Hyper",
21
+ "de": "Fix acSwitch für ACE und Hyper",
22
+ "ru": "Fix acSwitch для ACE и Hyper",
23
+ "pt": "Fix acSwitch para ACE e Hyper",
24
+ "nl": "Fix acSwitch voor ACE en Hyper",
25
+ "fr": "Correction acSwitch pour ACE et Hyper",
26
+ "it": "Fissare acSwitch per ACE e Hyper",
27
+ "es": "Fijar acSwitch para ACE e Hyper",
28
+ "pl": "Napraw acSwitch dla ACE i Hyper",
29
+ "uk": "Виправлення acSwitch для ACE і Hyper",
30
+ "zh-cn": "修正ACE 和 Hyper 的 ACE 开关"
31
+ },
6
32
  "1.7.1": {
7
33
  "en": "Fix missing ACE 1500 when connected with HUB1200 / HUB2000\nFix some missing states",
8
34
  "de": "Fehlerbehebung ACE 1500 bei Verbindung mit HUB1200 / HUB2000\nEinige fehlende Staaten beheben",
@@ -67,32 +93,6 @@
67
93
  "pl": "Napraw ponownie połączenie. Adapter ponownie uruchomi się, jeśli semms połączenia zostanie przerwany.",
68
94
  "uk": "Виправлення проблеми відключення. Перехідник тепер перезавантажить, якщо з'єднання зламається.",
69
95
  "zh-cn": "修复重联问题. 如果连接 semms 要中断, 适配器现在将重新启动 ."
70
- },
71
- "1.6.4": {
72
- "en": "Fix services",
73
- "de": "Dienstleistungen",
74
- "ru": "Исправление услуг",
75
- "pt": "Serviços de fixação",
76
- "nl": "Reparatie",
77
- "fr": "Services de réparation",
78
- "it": "Servizi fissi",
79
- "es": "Servicios de fijación",
80
- "pl": "Usługi naprawcze",
81
- "uk": "Фіксація послуг",
82
- "zh-cn": "修复服务"
83
- },
84
- "1.6.3": {
85
- "en": "Fixed reconnect when connection seems to be dead.",
86
- "de": "Feste Wiederverbindung, wenn die Verbindung tot ist.",
87
- "ru": "Переключение, когда связь кажется мертвой.",
88
- "pt": "Reconexão fixa quando a conexão parece estar morta.",
89
- "nl": "Vaste verbinding wanneer de verbinding lijkt te zijn uitgeschakeld.",
90
- "fr": "Réconnecter quand la connexion semble morte.",
91
- "it": "Ricollegamento fisso quando la connessione sembra essere morta.",
92
- "es": "Reconexión fija cuando la conexión parece estar muerta.",
93
- "pl": "Naprawiono połączenie, gdy połączenie wydaje się martwe.",
94
- "uk": "Виправлено відключення при з'єднанні з'являється мертвим.",
95
- "zh-cn": "连接似乎已失效时固定重联 ."
96
96
  }
97
97
  },
98
98
  "titleLang": {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "iobroker.zendure-solarflow",
3
- "version": "1.7.1",
3
+ "version": "1.7.3",
4
4
  "description": "zendure-solarflow",
5
5
  "author": {
6
6
  "name": "Peter",