iobroker.zendure-solarflow 2.0.1 → 2.0.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 +6 -0
- package/admin/build/index.js +38 -38
- package/admin/build/index.js.map +2 -2
- package/build/helpers/helpers.js +2 -0
- package/build/helpers/helpers.js.map +2 -2
- package/build/services/mqttService.js +18 -5
- package/build/services/mqttService.js.map +2 -2
- package/io-package.json +14 -14
- package/package.json +1 -1
package/build/helpers/helpers.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/helpers/helpers.ts"],
|
|
4
|
-
"sourcesContent": ["/* eslint-disable @typescript-eslint/indent */\n\nexport const getProductNameFromProductKey = (productKey: string): string => {\n switch (productKey.toLowerCase()) {\n case \"73bktv\":\n return \"solarflow2.0\";\n case \"a8yh63\":\n return \"solarflow hub 2000\";\n case \"ywf7hv\":\n return \"solarflow aio zy\";\n case \"ja72u0ha\":\n return \"hyper 2000\";\n case \"gda3tb\":\n return \"hyper 2000\";\n case \"8bm93h\":\n return \"ace 1500\";\n case \"bc8b7f\":\n return \"solarflow 2400 ac\";\n case \"b1nhmc\":\n return \"solarflow 800\";\n default:\n return \"\";\n }\n};\n\nexport const getMinAndMaxOutputLimitForProductKey = (\n productKey: string,\n limit: number\n): number => {\n const productName = getProductNameFromProductKey(productKey);\n\n if (limit < 100 && limit != 90 && limit != 60 && limit != 30 && limit != 0) {\n // NUR Solarflow HUB: Das Limit kann unter 100 nur in 30er Schritten gesetzt werden, dH. 30/60/90/100, wir rechnen das also um\n if (\n limit < 100 &&\n limit > 90 &&\n !productName?.includes(\"hyper\") &&\n !productName?.includes(\"2400 ac\") &&\n !productName?.includes(\"solarflow 800\")\n ) {\n limit = 90;\n } else if (\n limit > 60 &&\n limit < 90 &&\n !productName?.includes(\"hyper\") &&\n !productName?.includes(\"2400 ac\") &&\n !productName?.includes(\"solarflow 800\")\n ) {\n limit = 60;\n } else if (\n limit > 30 &&\n limit < 60 &&\n !productName?.includes(\"hyper\") &&\n !productName?.includes(\"2400 ac\") &&\n !productName?.includes(\"solarflow 800\")\n ) {\n limit = 30;\n } else if (limit < 30) {\n limit = 30;\n }\n }\n\n switch (productName?.toLocaleLowerCase()) {\n case \"hyper 2000\":\n if (limit > 1200) {\n limit = 1200;\n }\n break;\n case \"solarflow 800\":\n if (limit > 800) {\n limit = 800;\n }\n break;\n case \"solarflow2.0\":\n if (limit > 1200) {\n limit = 1200;\n }\n break;\n case \"solarflow hub 2000\":\n if (limit > 1200) {\n limit = 1200;\n }\n break;\n case \"solarflow aio zy\":\n if (limit > 1200) {\n limit = 1200;\n }\n break;\n case \"solarflow 800 pro\":\n if (limit > 800) {\n limit = 800;\n }\n break;\n case \"solarflow 2400 ac\":\n if (limit > 2400) {\n limit = 2400;\n }\n break;\n default:\n break;\n }\n\n return limit;\n};\n\nexport const getMinAndMaxInputLimitForProductKey = (\n productKey: string,\n limit: number\n): number => {\n let maxLimit = 900;\n\n const productName = getProductNameFromProductKey(productKey);\n\n if (productName?.includes(\"hyper\")) {\n maxLimit = 1200;\n }\n\n if (productName?.includes(\"2400 ac\")) {\n maxLimit = 2400;\n }\n\n if (productName?.includes(\"solarflow 800\")) {\n maxLimit = 800;\n }\n\n if (productName?.includes(\"ace\")) {\n // Das Limit kann nur in 100er Schritten gesetzt werden\n limit = Math.ceil(limit / 100) * 100;\n }\n\n if (limit < 0) {\n limit = 0;\n } else if (limit > 0 && limit <= 30) {\n limit = 30;\n } else if (limit > maxLimit) {\n limit = maxLimit;\n }\n\n return limit;\n};\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAEO,MAAM,+BAA+B,CAAC,eAA+B;AAC1E,UAAQ,WAAW,YAAY,GAAG;AAAA,IAChC,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;AAEO,MAAM,uCAAuC,CAClD,YACA,UACW;AACX,QAAM,cAAc,6BAA6B,UAAU;AAE3D,MAAI,QAAQ,OAAO,SAAS,MAAM,SAAS,MAAM,SAAS,MAAM,SAAS,GAAG;AAE1E,QACE,QAAQ,OACR,QAAQ,MACR,EAAC,2CAAa,SAAS,aACvB,EAAC,2CAAa,SAAS,eACvB,EAAC,2CAAa,SAAS,mBACvB;AACA,cAAQ;AAAA,IACV,WACE,QAAQ,MACR,QAAQ,MACR,EAAC,2CAAa,SAAS,aACvB,EAAC,2CAAa,SAAS,eACvB,EAAC,2CAAa,SAAS,mBACvB;AACA,cAAQ;AAAA,IACV,WACE,QAAQ,MACR,QAAQ,MACR,EAAC,2CAAa,SAAS,aACvB,EAAC,2CAAa,SAAS,eACvB,EAAC,2CAAa,SAAS,mBACvB;AACA,cAAQ;AAAA,IACV,WAAW,QAAQ,IAAI;AACrB,cAAQ;AAAA,IACV;AAAA,EACF;AAEA,UAAQ,2CAAa,qBAAqB;AAAA,IACxC,KAAK;AACH,UAAI,QAAQ,MAAM;AAChB,gBAAQ;AAAA,MACV;AACA;AAAA,IACF,KAAK;AACH,UAAI,QAAQ,KAAK;AACf,gBAAQ;AAAA,MACV;AACA;AAAA,IACF,KAAK;AACH,UAAI,QAAQ,MAAM;AAChB,gBAAQ;AAAA,MACV;AACA;AAAA,IACF,KAAK;AACH,UAAI,QAAQ,MAAM;AAChB,gBAAQ;AAAA,MACV;AACA;AAAA,IACF,KAAK;AACH,UAAI,QAAQ,MAAM;AAChB,gBAAQ;AAAA,MACV;AACA;AAAA,IACF,KAAK;AACH,UAAI,QAAQ,KAAK;AACf,gBAAQ;AAAA,MACV;AACA;AAAA,IACF,KAAK;AACH,UAAI,QAAQ,MAAM;AAChB,gBAAQ;AAAA,MACV;AACA;AAAA,IACF;AACE;AAAA,EACJ;AAEA,SAAO;AACT;AAEO,MAAM,sCAAsC,CACjD,YACA,UACW;AACX,MAAI,WAAW;AAEf,QAAM,cAAc,6BAA6B,UAAU;AAE3D,MAAI,2CAAa,SAAS,UAAU;AAClC,eAAW;AAAA,EACb;AAEA,MAAI,2CAAa,SAAS,YAAY;AACpC,eAAW;AAAA,EACb;AAEA,MAAI,2CAAa,SAAS,kBAAkB;AAC1C,eAAW;AAAA,EACb;AAEA,MAAI,2CAAa,SAAS,QAAQ;AAEhC,YAAQ,KAAK,KAAK,QAAQ,GAAG,IAAI;AAAA,EACnC;AAEA,MAAI,QAAQ,GAAG;AACb,YAAQ;AAAA,EACV,WAAW,QAAQ,KAAK,SAAS,IAAI;AACnC,YAAQ;AAAA,EACV,WAAW,QAAQ,UAAU;AAC3B,YAAQ;AAAA,EACV;AAEA,SAAO;AACT;",
|
|
4
|
+
"sourcesContent": ["/* eslint-disable @typescript-eslint/indent */\n\nexport const getProductNameFromProductKey = (productKey: string): string => {\n switch (productKey.toLowerCase()) {\n case \"73bktv\":\n return \"solarflow2.0\";\n case \"a8yh63\":\n return \"solarflow hub 2000\";\n case \"ywf7hv\":\n return \"solarflow aio zy\";\n case \"ja72u0ha\":\n return \"hyper 2000\";\n case \"gda3tb\":\n return \"hyper 2000\";\n case \"b3dxda\":\n return \"hyper 2000\";\n case \"8bm93h\":\n return \"ace 1500\";\n case \"bc8b7f\":\n return \"solarflow 2400 ac\";\n case \"b1nhmc\":\n return \"solarflow 800\";\n default:\n return \"\";\n }\n};\n\nexport const getMinAndMaxOutputLimitForProductKey = (\n productKey: string,\n limit: number\n): number => {\n const productName = getProductNameFromProductKey(productKey);\n\n if (limit < 100 && limit != 90 && limit != 60 && limit != 30 && limit != 0) {\n // NUR Solarflow HUB: Das Limit kann unter 100 nur in 30er Schritten gesetzt werden, dH. 30/60/90/100, wir rechnen das also um\n if (\n limit < 100 &&\n limit > 90 &&\n !productName?.includes(\"hyper\") &&\n !productName?.includes(\"2400 ac\") &&\n !productName?.includes(\"solarflow 800\")\n ) {\n limit = 90;\n } else if (\n limit > 60 &&\n limit < 90 &&\n !productName?.includes(\"hyper\") &&\n !productName?.includes(\"2400 ac\") &&\n !productName?.includes(\"solarflow 800\")\n ) {\n limit = 60;\n } else if (\n limit > 30 &&\n limit < 60 &&\n !productName?.includes(\"hyper\") &&\n !productName?.includes(\"2400 ac\") &&\n !productName?.includes(\"solarflow 800\")\n ) {\n limit = 30;\n } else if (limit < 30) {\n limit = 30;\n }\n }\n\n switch (productName?.toLocaleLowerCase()) {\n case \"hyper 2000\":\n if (limit > 1200) {\n limit = 1200;\n }\n break;\n case \"solarflow 800\":\n if (limit > 800) {\n limit = 800;\n }\n break;\n case \"solarflow2.0\":\n if (limit > 1200) {\n limit = 1200;\n }\n break;\n case \"solarflow hub 2000\":\n if (limit > 1200) {\n limit = 1200;\n }\n break;\n case \"solarflow aio zy\":\n if (limit > 1200) {\n limit = 1200;\n }\n break;\n case \"solarflow 800 pro\":\n if (limit > 800) {\n limit = 800;\n }\n break;\n case \"solarflow 2400 ac\":\n if (limit > 2400) {\n limit = 2400;\n }\n break;\n default:\n break;\n }\n\n return limit;\n};\n\nexport const getMinAndMaxInputLimitForProductKey = (\n productKey: string,\n limit: number\n): number => {\n let maxLimit = 900;\n\n const productName = getProductNameFromProductKey(productKey);\n\n if (productName?.includes(\"hyper\")) {\n maxLimit = 1200;\n }\n\n if (productName?.includes(\"2400 ac\")) {\n maxLimit = 2400;\n }\n\n if (productName?.includes(\"solarflow 800\")) {\n maxLimit = 800;\n }\n\n if (productName?.includes(\"ace\")) {\n // Das Limit kann nur in 100er Schritten gesetzt werden\n limit = Math.ceil(limit / 100) * 100;\n }\n\n if (limit < 0) {\n limit = 0;\n } else if (limit > 0 && limit <= 30) {\n limit = 30;\n } else if (limit > maxLimit) {\n limit = maxLimit;\n }\n\n return limit;\n};\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAEO,MAAM,+BAA+B,CAAC,eAA+B;AAC1E,UAAQ,WAAW,YAAY,GAAG;AAAA,IAChC,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;AAEO,MAAM,uCAAuC,CAClD,YACA,UACW;AACX,QAAM,cAAc,6BAA6B,UAAU;AAE3D,MAAI,QAAQ,OAAO,SAAS,MAAM,SAAS,MAAM,SAAS,MAAM,SAAS,GAAG;AAE1E,QACE,QAAQ,OACR,QAAQ,MACR,EAAC,2CAAa,SAAS,aACvB,EAAC,2CAAa,SAAS,eACvB,EAAC,2CAAa,SAAS,mBACvB;AACA,cAAQ;AAAA,IACV,WACE,QAAQ,MACR,QAAQ,MACR,EAAC,2CAAa,SAAS,aACvB,EAAC,2CAAa,SAAS,eACvB,EAAC,2CAAa,SAAS,mBACvB;AACA,cAAQ;AAAA,IACV,WACE,QAAQ,MACR,QAAQ,MACR,EAAC,2CAAa,SAAS,aACvB,EAAC,2CAAa,SAAS,eACvB,EAAC,2CAAa,SAAS,mBACvB;AACA,cAAQ;AAAA,IACV,WAAW,QAAQ,IAAI;AACrB,cAAQ;AAAA,IACV;AAAA,EACF;AAEA,UAAQ,2CAAa,qBAAqB;AAAA,IACxC,KAAK;AACH,UAAI,QAAQ,MAAM;AAChB,gBAAQ;AAAA,MACV;AACA;AAAA,IACF,KAAK;AACH,UAAI,QAAQ,KAAK;AACf,gBAAQ;AAAA,MACV;AACA;AAAA,IACF,KAAK;AACH,UAAI,QAAQ,MAAM;AAChB,gBAAQ;AAAA,MACV;AACA;AAAA,IACF,KAAK;AACH,UAAI,QAAQ,MAAM;AAChB,gBAAQ;AAAA,MACV;AACA;AAAA,IACF,KAAK;AACH,UAAI,QAAQ,MAAM;AAChB,gBAAQ;AAAA,MACV;AACA;AAAA,IACF,KAAK;AACH,UAAI,QAAQ,KAAK;AACf,gBAAQ;AAAA,MACV;AACA;AAAA,IACF,KAAK;AACH,UAAI,QAAQ,MAAM;AAChB,gBAAQ;AAAA,MACV;AACA;AAAA,IACF;AACE;AAAA,EACJ;AAEA,SAAO;AACT;AAEO,MAAM,sCAAsC,CACjD,YACA,UACW;AACX,MAAI,WAAW;AAEf,QAAM,cAAc,6BAA6B,UAAU;AAE3D,MAAI,2CAAa,SAAS,UAAU;AAClC,eAAW;AAAA,EACb;AAEA,MAAI,2CAAa,SAAS,YAAY;AACpC,eAAW;AAAA,EACb;AAEA,MAAI,2CAAa,SAAS,kBAAkB;AAC1C,eAAW;AAAA,EACb;AAEA,MAAI,2CAAa,SAAS,QAAQ;AAEhC,YAAQ,KAAK,KAAK,QAAQ,GAAG,IAAI;AAAA,EACnC;AAEA,MAAI,QAAQ,GAAG;AACb,YAAQ;AAAA,EACV,WAAW,QAAQ,KAAK,SAAS,IAAI;AACnC,YAAQ;AAAA,EACV,WAAW,QAAQ,UAAU;AAC3B,YAAQ;AAAA,EACV;AAEA,SAAO;AACT;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -65,7 +65,9 @@ const knownPackDataProperties = [
|
|
|
65
65
|
"minVol",
|
|
66
66
|
"socLevel",
|
|
67
67
|
"maxTemp",
|
|
68
|
-
"soh"
|
|
68
|
+
"soh",
|
|
69
|
+
"power",
|
|
70
|
+
"batcur"
|
|
69
71
|
];
|
|
70
72
|
const addOrUpdatePackData = async (productKey, deviceKey, packData, isSolarFlow) => {
|
|
71
73
|
if (adapter && productKey && deviceKey) {
|
|
@@ -1026,9 +1028,7 @@ const setDeviceAutomationInOutLimit = async (adapter2, productKey, deviceKey, li
|
|
|
1026
1028
|
{
|
|
1027
1029
|
autoModelProgram: 1,
|
|
1028
1030
|
autoModelValue: {
|
|
1029
|
-
upTime: 0,
|
|
1030
1031
|
chargingType: 1,
|
|
1031
|
-
pullTime: 1800,
|
|
1032
1032
|
price: 2,
|
|
1033
1033
|
chargingPower: -limit,
|
|
1034
1034
|
prices: [
|
|
@@ -1084,9 +1084,22 @@ const setDeviceAutomationInOutLimit = async (adapter2, productKey, deviceKey, li
|
|
|
1084
1084
|
}
|
|
1085
1085
|
} else {
|
|
1086
1086
|
if (limit < 0) {
|
|
1087
|
-
adapter2.log.
|
|
1088
|
-
`[setDeviceAutomationInOutLimit] Using CHARGE variant of
|
|
1087
|
+
adapter2.log.debug(
|
|
1088
|
+
`[setDeviceAutomationInOutLimit] Using CHARGE variant of HUB device automation, as device '${productName}' detected and limit is negative!`
|
|
1089
1089
|
);
|
|
1090
|
+
_arguments = [
|
|
1091
|
+
{
|
|
1092
|
+
autoModelProgram: 2,
|
|
1093
|
+
autoModelValue: {
|
|
1094
|
+
chargingType: 1,
|
|
1095
|
+
chargingPower: -limit,
|
|
1096
|
+
freq: 0,
|
|
1097
|
+
outPower: 0
|
|
1098
|
+
},
|
|
1099
|
+
msgType: 1,
|
|
1100
|
+
autoModel: 8
|
|
1101
|
+
}
|
|
1102
|
+
];
|
|
1090
1103
|
} else {
|
|
1091
1104
|
adapter2.log.debug(
|
|
1092
1105
|
`[setDeviceAutomationInOutLimit] Using FEED IN variant of Hub device automation, as device '${productName}' detected and limit is positive!`
|
|
@@ -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 } from \"../models/ISolarFlowMqttProperties\";\r\nimport {\r\n startCalculationJob,\r\n startCheckStatesAndConnectionJob,\r\n startResetValuesJob,\r\n} from \"./jobSchedule\";\r\nimport { createSolarFlowLocalStates } from \"../helpers/createSolarFlowLocalStates\";\r\nimport { ISolarflowState } from \"../models/ISolarflowState\";\r\nimport { getStateDefinition } from \"../helpers/createSolarFlowStates\";\r\nimport {\r\n getMinAndMaxInputLimitForProductKey,\r\n getMinAndMaxOutputLimitForProductKey,\r\n getProductNameFromProductKey,\r\n} from \"../helpers/helpers\";\r\nimport { IDeviceAutomationPayload } from \"../models/IDeviceAutomationPayload\";\r\n\r\nlet adapter: ZendureSolarflow | undefined = undefined;\r\n\r\nconst knownPackDataProperties = [\r\n \"sn\",\r\n \"totalVol\",\r\n \"maxVol\",\r\n \"minVol\",\r\n \"socLevel\",\r\n \"maxTemp\",\r\n \"soh\",\r\n];\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 channel (e.g. the device specific key)\r\n // We can determine the type of the battery by the SN number.\r\n let batType = \"\";\r\n if (productKey == \"yWF7hV\") {\r\n batType = \"AIO2400\";\r\n } else if (x.sn.startsWith(\"A\")) {\r\n batType = \"AB1000\";\r\n } else if (x.sn.startsWith(\"B\")) {\r\n batType = \"AB1000S\";\r\n } else if (x.sn.startsWith(\"C\")) {\r\n if (x.sn[3] == \"F\") {\r\n batType = \"AB2000S\";\r\n } else {\r\n batType = \"AB2000\";\r\n }\r\n } else if (x.sn.startsWith(\"F\")) {\r\n batType = \"AB3000X\";\r\n }\r\n\r\n // Check if is in Pack2device list\r\n if (\r\n !adapter.pack2Devices.some(\r\n (y) => y.packSn == x.sn && y.deviceKey == deviceKey\r\n )\r\n ) {\r\n adapter.pack2Devices.push({\r\n packSn: x.sn,\r\n deviceKey: deviceKey,\r\n type: batType,\r\n });\r\n\r\n adapter.log.debug(\r\n `[addOrUpdatePackData] Added battery ${batType} with SN ${x.sn} on deviceKey ${deviceKey} to pack2Devices!`\r\n );\r\n }\r\n\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, {\r\n type: \"channel\",\r\n common: {\r\n name: {\r\n de: batType,\r\n en: batType,\r\n },\r\n },\r\n native: {},\r\n });\r\n\r\n await adapter?.extendObject(key + \".model\", {\r\n type: \"state\",\r\n common: {\r\n name: {\r\n de: \"Batterietyp\",\r\n en: \"Battery type\",\r\n },\r\n type: \"string\",\r\n desc: \"model\",\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 + \".model\", batType, true);\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?.setState(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 unit: \"%\",\r\n },\r\n native: {},\r\n });\r\n\r\n await adapter?.setState(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 unit: \"\u00B0C\",\r\n },\r\n native: {},\r\n });\r\n\r\n // Convert Kelvin to Celsius\r\n await adapter?.setState(\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 unit: \"V\",\r\n },\r\n native: {},\r\n });\r\n\r\n await adapter?.setState(key + \".minVol\", x.minVol / 100, true);\r\n }\r\n\r\n if (x.batcur) {\r\n await adapter?.extendObject(key + \".batcur\", {\r\n type: \"state\",\r\n common: {\r\n name: \"batcur\",\r\n type: \"number\",\r\n desc: \"batcur\",\r\n role: \"value\",\r\n read: true,\r\n write: false,\r\n unit: \"A\",\r\n },\r\n native: {},\r\n });\r\n\r\n await adapter?.setState(key + \".batcur\", x.batcur / 10, 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 unit: \"V\",\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 unit: \"V\",\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 if (x.soh) {\r\n await adapter?.extendObject(key + \".soh\", {\r\n type: \"state\",\r\n common: {\r\n name: {\r\n de: \"Gesundheitszustand\",\r\n en: \"State of Health\",\r\n },\r\n type: \"number\",\r\n desc: \"State of Health\",\r\n role: \"value\",\r\n read: true,\r\n write: false,\r\n unit: \"%\",\r\n },\r\n native: {},\r\n });\r\n\r\n await adapter?.setState(key + \".soh\", x.soh / 10, true);\r\n }\r\n\r\n if (x.power) {\r\n await adapter?.extendObject(key + \".power\", {\r\n type: \"state\",\r\n common: {\r\n name: {\r\n de: \"Energie\",\r\n en: \"Power\",\r\n },\r\n type: \"number\",\r\n desc: \"Power\",\r\n read: true,\r\n write: false,\r\n role: \"value.power\",\r\n unit: \"W\",\r\n },\r\n native: {},\r\n });\r\n\r\n await adapter?.setState(key + \".power\", x.power, true);\r\n }\r\n\r\n // Debug, send message if property is unknown!\r\n let found = false;\r\n\r\n Object.entries(x).forEach(([key, value]) => {\r\n knownPackDataProperties.forEach((property: string) => {\r\n if (property == key) {\r\n found = true;\r\n }\r\n });\r\n\r\n if (found) {\r\n //console.log(\r\n // `${productName?.val}: ${key} with value ${value} is a KNOWN Mqtt Prop!`\r\n //);\r\n } else {\r\n adapter?.log.debug(\r\n `[addOrUpdatePackData] ${key} with value ${value} is a UNKNOWN PackData Mqtt Property!`\r\n );\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 if (topic.toLowerCase().includes(\"loginOut/force\")) {\r\n // TODO: Ausloggen???\r\n }\r\n\r\n const topicSplitted = topic.replace(\"/server/app\", \"\").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(`[onMessage] JSON Parse error!`);\r\n\r\n adapter.log.debug(`[onMessage] 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 if (adapter.log.level == \"debug\") {\r\n adapter.log.debug(\r\n `[onMessage] MQTT message on topic '${topic}': ${message.toString()}`\r\n );\r\n }\r\n\r\n if (obj.timestamp) {\r\n const currentTimeStamp = new Date().getTime() / 1000;\r\n const diff = currentTimeStamp - obj.timestamp;\r\n\r\n if (diff > 600) {\r\n // Timestamp older than 5 Minutens, device is offline!\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"wifiState\",\r\n \"Disconnected\"\r\n );\r\n } else {\r\n // Timestamp older than 5 Minutens, device is offline!\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"wifiState\",\r\n \"Connected\"\r\n );\r\n }\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 (productKey != \"8bM93H\") {\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 //\r\n if (obj.function == \"deviceAutomation\" && obj.success == 1) {\r\n // setDeviceAutomationInOutLimit ack = true setzen;\r\n const currentValue = await adapter.getStateAsync(\r\n productKey + \".\" + deviceKey + \".control.setDeviceAutomationInOutLimit\"\r\n );\r\n\r\n updateSolarFlowControlState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"setDeviceAutomationInOutLimit\",\r\n currentValue?.val ? currentValue.val : 0\r\n );\r\n } else if (obj.function == \"deviceAutomation\" && obj.success == 0) {\r\n adapter?.log.warn(\r\n `[onMessage] device automation failed for ${productName?.val}: ${productKey}/${deviceKey}!`\r\n );\r\n }\r\n\r\n if (\r\n obj.properties?.autoModel != null &&\r\n obj.properties?.autoModel != undefined\r\n ) {\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"autoModel\",\r\n obj.properties.autoModel\r\n );\r\n\r\n updateSolarFlowControlState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"autoModel\",\r\n obj.properties.autoModel\r\n );\r\n }\r\n\r\n if (\r\n obj.properties?.heatState != null &&\r\n obj.properties?.heatState != undefined\r\n ) {\r\n const value = obj.properties?.heatState == 0 ? false : true;\r\n\r\n updateSolarFlowState(adapter, productKey, deviceKey, \"heatState\", value);\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 (obj.properties.electricLevel == 100) {\r\n const fullChargeNeeded = await adapter.getStateAsync(\r\n productKey + \".\" + deviceKey + \".control.fullChargeNeeded\"\r\n );\r\n\r\n if (\r\n fullChargeNeeded &&\r\n fullChargeNeeded.val &&\r\n fullChargeNeeded.val == true\r\n ) {\r\n await adapter?.setState(\r\n `${productKey}.${deviceKey}.control.fullChargeNeeded`,\r\n false,\r\n true\r\n );\r\n }\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 (obj.power != null && obj.power != undefined) {\r\n const value = obj.power / 10;\r\n updateSolarFlowState(adapter, productKey, deviceKey, \"power\", value);\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 if (obj.properties?.packState) {\r\n // Update combined data point\r\n updateSolarFlowState(adapter, productKey, deviceKey, \"packPower\", 0);\r\n }\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?.smartMode != null &&\r\n obj.properties?.smartMode != undefined\r\n ) {\r\n const value = obj.properties?.smartMode == 0 ? false : true;\r\n\r\n updateSolarFlowState(adapter, productKey, deviceKey, \"smartMode\", value);\r\n\r\n updateSolarFlowControlState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"smartMode\",\r\n value\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 (obj.properties?.outputPackPower > 0) {\r\n // Update combined data point\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"packPower\",\r\n obj.properties.outputPackPower\r\n );\r\n } else if (obj.properties?.outputPackPower == 0) {\r\n // Check if packInputPower is 0\r\n const packInputPower = await adapter?.getStateAsync(\r\n productKey + \".\" + deviceKey + \".packInputPower\"\r\n );\r\n\r\n if (packInputPower?.val == 0) {\r\n // Update combined data point to 0 as both are 0\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"packPower\",\r\n -Math.abs(obj.properties.outputPackPower)\r\n );\r\n }\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 (obj.properties?.packInputPower > 0) {\r\n // Update combined data point\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"packPower\",\r\n -Math.abs(obj.properties.packInputPower)\r\n );\r\n } else if (obj.properties?.packInputPower == 0) {\r\n // Check if outputPackPower is 0\r\n const outputPackPower = await adapter?.getStateAsync(\r\n productKey + \".\" + deviceKey + \".outputPackPower\"\r\n );\r\n\r\n if (outputPackPower?.val == 0) {\r\n // Update combined data point to 0 as both are 0\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"packPower\",\r\n -Math.abs(obj.properties.packInputPower)\r\n );\r\n }\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?.solarPower3 != null &&\r\n obj.properties?.solarPower3 != undefined\r\n ) {\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"pvPower3\",\r\n obj.properties.solarPower3\r\n );\r\n }\r\n\r\n if (\r\n obj.properties?.solarPower4 != null &&\r\n obj.properties?.solarPower4 != undefined\r\n ) {\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"pvPower4\",\r\n obj.properties.solarPower4\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 if (\r\n productName?.val?.toString().toLowerCase().includes(\"solarflow\") ||\r\n productName?.val?.toString().toLowerCase().includes(\"ace\") ||\r\n productName?.val?.toString().toLowerCase().includes(\"hyper\")\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\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 (obj.properties?.acMode != null && obj.properties?.acMode != undefined) {\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"acMode\",\r\n obj.properties.acMode\r\n );\r\n\r\n updateSolarFlowControlState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"acMode\",\r\n obj.properties.acMode\r\n );\r\n }\r\n\r\n if (\r\n obj.properties?.hyperTmp != null &&\r\n obj.properties?.hyperTmp != undefined\r\n ) {\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"hyperTmp\",\r\n obj.properties.hyperTmp / 10 - 273.15\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 \"gridInputPower\",\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\r\n );\r\n\r\n updateSolarFlowControlState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"hubState\",\r\n obj.properties.hubState\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 && adapter.log.level == \"debug\") {\r\n const _productName = productName?.val?.toString();\r\n\r\n if (_productName) {\r\n const states = getStateDefinition(_productName);\r\n let found = false;\r\n\r\n Object.entries(obj.properties).forEach(([key, value]) => {\r\n states.forEach((state: ISolarflowState) => {\r\n if (state.title == key) {\r\n found = true;\r\n }\r\n });\r\n\r\n if (found) {\r\n //console.log(\r\n // `${productName?.val}: ${key} with value ${value} is a KNOWN Mqtt Prop!`\r\n //);\r\n } else {\r\n adapter?.log.debug(\r\n `[onMessage] ${productName?.val}: ${key} with value ${JSON.stringify(value)} is a UNKNOWN Mqtt Property!`\r\n );\r\n }\r\n });\r\n }\r\n }\r\n }\r\n};\r\n\r\nexport const setAcMode = async (\r\n adapter: ZendureSolarflow,\r\n productKey: string,\r\n deviceKey: string,\r\n acMode: number\r\n): Promise<void> => {\r\n if (adapter.mqttClient && productKey && deviceKey) {\r\n if (acMode >= 0 && acMode <= 3) {\r\n const topic = `iot/${productKey}/${deviceKey}/properties/write`;\r\n\r\n const setAcMode = { properties: { acMode: acMode } };\r\n adapter.log.debug(`[setAcMode] Set AC mode to ${acMode}!`);\r\n adapter.mqttClient?.publish(topic, JSON.stringify(setAcMode));\r\n\r\n // Check if device is HUB, then check if smartMode is false - if so send a warning to log!\r\n const smartMode = await adapter.getStateAsync(\r\n productKey + \".\" + deviceKey + \".control.smartMode\"\r\n );\r\n\r\n if (smartMode && !smartMode.val) {\r\n adapter.log.warn(\r\n `[setAcMode] AC mode was switched and smartMode is false - changes will be written to flash memory. In the worst case, the device may break or changes may no longer be saved!`\r\n );\r\n }\r\n } else {\r\n adapter.log.error(`[setAcMode] AC mode must be a value between 0 and 3!`);\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 <= 50) {\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<>50!`\r\n );\r\n }\r\n }\r\n};\r\n\r\nexport const setHubState = async (\r\n adapter: ZendureSolarflow,\r\n productKey: string,\r\n deviceKey: string,\r\n hubState: number\r\n): Promise<void> => {\r\n if (adapter.mqttClient && productKey && deviceKey) {\r\n if (hubState == 0 || hubState == 1) {\r\n const topic = `iot/${productKey}/${deviceKey}/properties/write`;\r\n\r\n const socSetLimit = { properties: { hubState: hubState } };\r\n adapter.log.debug(\r\n `[setHubState] Setting Hub State for device key ${deviceKey} to ${hubState}!`\r\n );\r\n adapter.mqttClient?.publish(topic, JSON.stringify(socSetLimit));\r\n } else {\r\n adapter.log.debug(`[setHubState] Hub state is not 0 or 1!`);\r\n }\r\n }\r\n};\r\n\r\nexport const setDeviceAutomationInOutLimit = async (\r\n adapter: ZendureSolarflow,\r\n productKey: string,\r\n deviceKey: string,\r\n limit: number // can be negative, negative will trigger charging mode\r\n): Promise<void> => {\r\n if (adapter.mqttClient && productKey && deviceKey) {\r\n adapter.log.debug(\r\n `[setDeviceAutomationInOutLimit] Set device Automation limit to ${limit}!`\r\n );\r\n\r\n if (limit) {\r\n limit = Math.round(limit);\r\n } else {\r\n limit = 0;\r\n }\r\n\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 limit > 0\r\n ) {\r\n limit = 0;\r\n }\r\n\r\n const fullChargeNeeded = await adapter.getStateAsync(\r\n productKey + \".\" + deviceKey + \".control.fullChargeNeeded\"\r\n );\r\n\r\n if (\r\n fullChargeNeeded &&\r\n fullChargeNeeded.val &&\r\n fullChargeNeeded.val == true &&\r\n limit > 0\r\n ) {\r\n limit = 0;\r\n }\r\n }\r\n\r\n if (limit < 0) {\r\n // Get input limit, make number positive and the new value negative\r\n limit = -getMinAndMaxInputLimitForProductKey(productKey, -limit);\r\n } else {\r\n limit = getMinAndMaxOutputLimitForProductKey(productKey, limit);\r\n }\r\n\r\n const topic = `iot/${productKey}/${deviceKey}/function/invoke`;\r\n\r\n adapter.msgCounter += 1;\r\n\r\n const timestamp = new Date();\r\n timestamp.setMilliseconds(0);\r\n\r\n // HUB1200 & HUB 2000\r\n let _arguments: IDeviceAutomationPayload[] = [];\r\n\r\n const productName = getProductNameFromProductKey(productKey);\r\n\r\n if (\r\n productName.toLowerCase().includes(\"2400 ac\") ||\r\n productName.toLowerCase().includes(\"solarflow 800\")\r\n ) {\r\n adapter.log.debug(\r\n `[setDeviceAutomationInOutLimit] Using HEMS Variant of device automation, as device '${productName}' detected!`\r\n );\r\n // HEMS Variante\r\n const hemsEP = {\r\n arguments: {\r\n outputPower: limit > 0 ? limit : 0,\r\n chargeState: limit > 0 ? 0 : 1,\r\n chargePower: limit > 0 ? 0 : -limit,\r\n mode: 9,\r\n },\r\n function: \"hemsEP\",\r\n messageId: adapter.msgCounter,\r\n deviceKey: deviceKey,\r\n timestamp: timestamp.getTime() / 1000,\r\n };\r\n\r\n adapter.mqttClient?.publish(topic, JSON.stringify(hemsEP));\r\n return;\r\n } else if (productName.toLowerCase().includes(\"hyper\")) {\r\n if (limit < 0) {\r\n adapter.log.debug(\r\n `[setDeviceAutomationInOutLimit] Using CHARGE variant of HYPER device automation, as device '${productName}' detected and limit is negative!`\r\n );\r\n // Input / Charge\r\n _arguments = [\r\n {\r\n autoModelProgram: 1,\r\n autoModelValue: {\r\n upTime: 0,\r\n chargingType: 1,\r\n pullTime: 1800,\r\n price: 2,\r\n chargingPower: -limit,\r\n prices: [\r\n 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\r\n 1, 1, 1,\r\n ],\r\n outPower: 0,\r\n freq: 0,\r\n },\r\n msgType: 1,\r\n autoModel: 8,\r\n },\r\n ];\r\n } else {\r\n adapter.log.debug(\r\n `[setDeviceAutomationInOutLimit] Using FEED IN variant of HYPER device automation, as device '${productName}' detected and limit is positive!`\r\n );\r\n // Output\r\n _arguments = [\r\n {\r\n autoModelProgram: 2,\r\n autoModelValue: {\r\n chargingType: 0,\r\n chargingPower: 0,\r\n freq: 0,\r\n outPower: limit,\r\n },\r\n msgType: 1,\r\n autoModel: 8,\r\n },\r\n ];\r\n }\r\n } else {\r\n if (limit < 0) {\r\n adapter.log.warn(\r\n `[setDeviceAutomationInOutLimit] Using CHARGE variant of Hub device automation is currently not working! You have to manualy switch acMode and inputLimit!`\r\n );\r\n /* // Input / Charge\r\n _arguments = [\r\n {\r\n autoModelProgram: 2,\r\n autoModelValue: {\r\n upTime: 0,\r\n chargingType: 1,\r\n pullTime: 1800,\r\n price: 2,\r\n chargingPower: -limit,\r\n prices: [\r\n 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\r\n 1, 1, 1,\r\n ],\r\n outPower: 0,\r\n freq: 0,\r\n },\r\n msgType: 1,\r\n autoModel: 8,\r\n },\r\n ]; */\r\n } else {\r\n // Output\r\n adapter.log.debug(\r\n `[setDeviceAutomationInOutLimit] Using FEED IN variant of Hub device automation, as device '${productName}' detected and limit is positive!`\r\n );\r\n _arguments = [\r\n {\r\n autoModelProgram: 2,\r\n autoModelValue: limit,\r\n msgType: 1,\r\n autoModel: 8,\r\n },\r\n ];\r\n }\r\n }\r\n\r\n const deviceAutomation = {\r\n arguments: _arguments,\r\n function: \"deviceAutomation\",\r\n messageId: adapter.msgCounter,\r\n deviceKey: deviceKey,\r\n timestamp: timestamp.getTime() / 1000,\r\n };\r\n adapter.mqttClient?.publish(topic, JSON.stringify(deviceAutomation));\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 // Check if autoModel is set to 0 (Nothing) or 8 (Smart Matching)\r\n const autoModel = (\r\n await adapter.getStateAsync(productKey + \".\" + deviceKey + \".autoModel\")\r\n )?.val;\r\n\r\n if (autoModel != 0) {\r\n adapter.log.warn(\r\n \"Operation mode (autoModel) is not set to '0', we can't set the output limit!\"\r\n );\r\n return;\r\n }\r\n\r\n if (limit) {\r\n limit = Math.round(limit);\r\n } else {\r\n limit = 0;\r\n }\r\n\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 const fullChargeNeeded = await adapter.getStateAsync(\r\n productKey + \".\" + deviceKey + \".control.fullChargeNeeded\"\r\n );\r\n\r\n if (\r\n fullChargeNeeded &&\r\n fullChargeNeeded.val &&\r\n fullChargeNeeded.val == true\r\n ) {\r\n limit = 0;\r\n }\r\n }\r\n\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 limit = getMinAndMaxOutputLimitForProductKey(productKey, limit);\r\n\r\n const topic = `iot/${productKey}/${deviceKey}/properties/write`;\r\n\r\n const outputlimit = { properties: { outputLimit: limit } };\r\n\r\n adapter.msgCounter += 1;\r\n\r\n const timestamp = new Date();\r\n timestamp.setMilliseconds(0);\r\n\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 if (limit) {\r\n limit = Math.round(limit);\r\n } else {\r\n limit = 0;\r\n }\r\n\r\n limit = getMinAndMaxInputLimitForProductKey(productKey, limit);\r\n\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\nexport const setSmartMode = async (\r\n adapter: ZendureSolarflow,\r\n productKey: string,\r\n deviceKey: string,\r\n smartModeOn: 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 setSmartModeContent = {\r\n properties: { smartMode: smartModeOn ? 1 : 0 },\r\n };\r\n adapter.log.debug(\r\n `[setBuzzer] Setting Smart Mode for device key ${deviceKey} to ${smartModeOn}!`\r\n );\r\n adapter.mqttClient?.publish(topic, JSON.stringify(setSmartModeContent));\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 setBuzzerSwitchContent = {\r\n properties: { buzzerSwitch: buzzerOn ? 1 : 0 },\r\n };\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(setBuzzerSwitchContent));\r\n }\r\n};\r\n\r\nexport const setAutoModel = async (\r\n adapter: ZendureSolarflow,\r\n productKey: string,\r\n deviceKey: string,\r\n autoModel: 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 let setAutoModelContent: any = { properties: { autoModel: autoModel } };\r\n\r\n switch (autoModel) {\r\n case 8: // Smart Matching Modus\r\n setAutoModelContent = {\r\n properties: {\r\n autoModelProgram: 1,\r\n autoModelValue: { chargingType: 0, chargingPower: 0, outPower: 0 },\r\n msgType: 1,\r\n autoModel: 8,\r\n },\r\n };\r\n break;\r\n case 9: // Smart CT Modus\r\n setAutoModelContent = {\r\n properties: {\r\n autoModelProgram: 2,\r\n autoModelValue: { chargingType: 3, chargingPower: 0, outPower: 0 },\r\n msgType: 1,\r\n autoModel: 9,\r\n },\r\n };\r\n break;\r\n }\r\n\r\n adapter.log.debug(\r\n `[setAutoModel] Setting autoModel for device key ${deviceKey} to ${autoModel}!`\r\n );\r\n adapter.mqttClient?.publish(topic, JSON.stringify(setAutoModelContent));\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 `[setAutoRecover] 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 `[setDcSwitch] 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 `[setAcSwitch] 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 subscribeReportTopic = (\r\n productKey: string,\r\n deviceKey: string,\r\n timeout: number\r\n): void => {\r\n const reportTopic = `/${productKey}/${deviceKey}/#`;\r\n\r\n setTimeout(() => {\r\n if (adapter) {\r\n adapter.log.debug(\r\n `[subscribeReportTopic] Subscribing to MQTT Topic: ${reportTopic}`\r\n );\r\n adapter.mqttClient?.subscribe(reportTopic, onSubscribeReportTopic);\r\n }\r\n }, timeout);\r\n};\r\n\r\nexport const subscribeIotTopic = (\r\n productKey: string,\r\n deviceKey: string,\r\n timeout: number\r\n): void => {\r\n const iotTopic = `iot/${productKey}/${deviceKey}/#`;\r\n\r\n setTimeout(() => {\r\n adapter?.log.debug(\r\n `[subscribeIotTopic] Subscribing to MQTT Topic: ${iotTopic}`\r\n );\r\n adapter?.mqttClient?.subscribe(iotTopic, (error) => {\r\n onSubscribeIotTopic(error, productKey, deviceKey);\r\n });\r\n }, timeout);\r\n};\r\n\r\nexport const connectCloudMqttClient = (_adapter: ZendureSolarflow): void => {\r\n adapter = _adapter;\r\n\r\n if (!adapter.paths?.mqttPassword) {\r\n adapter.log.error(`[connectCloudMqttClient] MQTT Password is missing!`);\r\n return;\r\n }\r\n\r\n const mqttPassword = atob(adapter.paths?.mqttPassword);\r\n\r\n const options: mqtt.IClientOptions = {\r\n clientId: adapter.accessToken,\r\n username: \"zenApp\",\r\n password: mqttPassword,\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 `[connectCloudMqttClient] 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 let connectIot = true;\r\n\r\n if (device.productKey == \"s3Xk4x\") {\r\n const smartPlugReportTopic = `/server/app/${adapter.userId}/${device.id}/smart/power`;\r\n\r\n adapter.mqttClient?.subscribe(\r\n smartPlugReportTopic,\r\n onSubscribeReportTopic\r\n );\r\n\r\n connectIot = false;\r\n }\r\n\r\n subscribeReportTopic(\r\n device.productKey,\r\n device.deviceKey,\r\n 1000 * index\r\n );\r\n\r\n if (connectIot) {\r\n subscribeIotTopic(\r\n device.productKey,\r\n device.deviceKey,\r\n 1000 * index\r\n );\r\n }\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 subscribeReportTopic(\r\n subDevice.productKey,\r\n subDevice.deviceKey,\r\n 1000 * index\r\n );\r\n\r\n subscribeIotTopic(\r\n subDevice.productKey,\r\n subDevice.deviceKey,\r\n 2000 * index\r\n );\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 // 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\r\nexport const connectLocalMqttClient = (_adapter: ZendureSolarflow): void => {\r\n adapter = _adapter;\r\n\r\n const options: mqtt.IClientOptions = {\r\n clientId: \"ioBroker.zendure-solarflow.\" + adapter.instance,\r\n };\r\n\r\n if (mqtt && adapter && adapter.config && adapter.config.localMqttUrl) {\r\n adapter.log.debug(\r\n `[connectLocalMqttClient] Connecting to MQTT broker ${\r\n adapter.config.localMqttUrl + \":\" + 1883\r\n }...`\r\n );\r\n adapter.mqttClient = mqtt.connect(\r\n \"mqtt://\" + adapter.config.localMqttUrl + \":\" + 1883,\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 adapter.setState(\"info.connection\", true, true);\r\n\r\n // Subscribe to 1. device from local settings\r\n if (\r\n adapter.config.localDevice1ProductKey &&\r\n adapter.config.localDevice1DeviceKey\r\n ) {\r\n // Create states and subscribe device 1\r\n createSolarFlowLocalStates(\r\n adapter,\r\n adapter.config.localDevice1ProductKey,\r\n adapter.config.localDevice1DeviceKey\r\n );\r\n\r\n subscribeReportTopic(\r\n adapter.config.localDevice1ProductKey,\r\n adapter.config.localDevice1DeviceKey,\r\n 1000\r\n );\r\n\r\n subscribeIotTopic(\r\n adapter.config.localDevice1ProductKey,\r\n adapter.config.localDevice1DeviceKey,\r\n 1000\r\n );\r\n }\r\n\r\n // Subscribe to 2. device from local settings\r\n if (\r\n adapter.config.localDevice2ProductKey &&\r\n adapter.config.localDevice2DeviceKey\r\n ) {\r\n // Create states and subscribe device 2\r\n createSolarFlowLocalStates(\r\n adapter,\r\n adapter.config.localDevice2ProductKey,\r\n adapter.config.localDevice2DeviceKey\r\n );\r\n\r\n subscribeReportTopic(\r\n adapter.config.localDevice2ProductKey,\r\n adapter.config.localDevice2DeviceKey,\r\n 2000\r\n );\r\n\r\n subscribeIotTopic(\r\n adapter.config.localDevice2ProductKey,\r\n adapter.config.localDevice2DeviceKey,\r\n 2000\r\n );\r\n }\r\n\r\n // Subscribe to 3. device from local settings\r\n if (\r\n adapter.config.localDevice3ProductKey &&\r\n adapter.config.localDevice3DeviceKey\r\n ) {\r\n // Create states and subscribe device 2\r\n createSolarFlowLocalStates(\r\n adapter,\r\n adapter.config.localDevice3ProductKey,\r\n adapter.config.localDevice3DeviceKey\r\n );\r\n\r\n subscribeReportTopic(\r\n adapter.config.localDevice3ProductKey,\r\n adapter.config.localDevice3DeviceKey,\r\n 2000\r\n );\r\n\r\n subscribeIotTopic(\r\n adapter.config.localDevice3ProductKey,\r\n adapter.config.localDevice3DeviceKey,\r\n 2000\r\n );\r\n }\r\n\r\n // Subscribe to 3. device from local settings\r\n if (\r\n adapter.config.localDevice4ProductKey &&\r\n adapter.config.localDevice4DeviceKey\r\n ) {\r\n // Create states and subscribe device 2\r\n createSolarFlowLocalStates(\r\n adapter,\r\n adapter.config.localDevice4ProductKey,\r\n adapter.config.localDevice4DeviceKey\r\n );\r\n\r\n subscribeReportTopic(\r\n adapter.config.localDevice4ProductKey,\r\n adapter.config.localDevice4DeviceKey,\r\n 2000\r\n );\r\n\r\n subscribeIotTopic(\r\n adapter.config.localDevice4ProductKey,\r\n adapter.config.localDevice4DeviceKey,\r\n 2000\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 // 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 } from \"../models/ISolarFlowMqttProperties\";\r\nimport {\r\n startCalculationJob,\r\n startCheckStatesAndConnectionJob,\r\n startResetValuesJob,\r\n} from \"./jobSchedule\";\r\nimport { createSolarFlowLocalStates } from \"../helpers/createSolarFlowLocalStates\";\r\nimport { ISolarflowState } from \"../models/ISolarflowState\";\r\nimport { getStateDefinition } from \"../helpers/createSolarFlowStates\";\r\nimport {\r\n getMinAndMaxInputLimitForProductKey,\r\n getMinAndMaxOutputLimitForProductKey,\r\n getProductNameFromProductKey,\r\n} from \"../helpers/helpers\";\r\nimport { IDeviceAutomationPayload } from \"../models/IDeviceAutomationPayload\";\r\n\r\nlet adapter: ZendureSolarflow | undefined = undefined;\r\n\r\nconst knownPackDataProperties = [\r\n \"sn\",\r\n \"totalVol\",\r\n \"maxVol\",\r\n \"minVol\",\r\n \"socLevel\",\r\n \"maxTemp\",\r\n \"soh\",\r\n \"power\",\r\n \"batcur\",\r\n];\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 channel (e.g. the device specific key)\r\n // We can determine the type of the battery by the SN number.\r\n let batType = \"\";\r\n if (productKey == \"yWF7hV\") {\r\n batType = \"AIO2400\";\r\n } else if (x.sn.startsWith(\"A\")) {\r\n batType = \"AB1000\";\r\n } else if (x.sn.startsWith(\"B\")) {\r\n batType = \"AB1000S\";\r\n } else if (x.sn.startsWith(\"C\")) {\r\n if (x.sn[3] == \"F\") {\r\n batType = \"AB2000S\";\r\n } else {\r\n batType = \"AB2000\";\r\n }\r\n } else if (x.sn.startsWith(\"F\")) {\r\n batType = \"AB3000X\";\r\n }\r\n\r\n // Check if is in Pack2device list\r\n if (\r\n !adapter.pack2Devices.some(\r\n (y) => y.packSn == x.sn && y.deviceKey == deviceKey\r\n )\r\n ) {\r\n adapter.pack2Devices.push({\r\n packSn: x.sn,\r\n deviceKey: deviceKey,\r\n type: batType,\r\n });\r\n\r\n adapter.log.debug(\r\n `[addOrUpdatePackData] Added battery ${batType} with SN ${x.sn} on deviceKey ${deviceKey} to pack2Devices!`\r\n );\r\n }\r\n\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, {\r\n type: \"channel\",\r\n common: {\r\n name: {\r\n de: batType,\r\n en: batType,\r\n },\r\n },\r\n native: {},\r\n });\r\n\r\n await adapter?.extendObject(key + \".model\", {\r\n type: \"state\",\r\n common: {\r\n name: {\r\n de: \"Batterietyp\",\r\n en: \"Battery type\",\r\n },\r\n type: \"string\",\r\n desc: \"model\",\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 + \".model\", batType, true);\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?.setState(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 unit: \"%\",\r\n },\r\n native: {},\r\n });\r\n\r\n await adapter?.setState(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 unit: \"\u00B0C\",\r\n },\r\n native: {},\r\n });\r\n\r\n // Convert Kelvin to Celsius\r\n await adapter?.setState(\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 unit: \"V\",\r\n },\r\n native: {},\r\n });\r\n\r\n await adapter?.setState(key + \".minVol\", x.minVol / 100, true);\r\n }\r\n\r\n if (x.batcur) {\r\n await adapter?.extendObject(key + \".batcur\", {\r\n type: \"state\",\r\n common: {\r\n name: \"batcur\",\r\n type: \"number\",\r\n desc: \"batcur\",\r\n role: \"value\",\r\n read: true,\r\n write: false,\r\n unit: \"A\",\r\n },\r\n native: {},\r\n });\r\n\r\n await adapter?.setState(key + \".batcur\", x.batcur / 10, 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 unit: \"V\",\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 unit: \"V\",\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 if (x.soh) {\r\n await adapter?.extendObject(key + \".soh\", {\r\n type: \"state\",\r\n common: {\r\n name: {\r\n de: \"Gesundheitszustand\",\r\n en: \"State of Health\",\r\n },\r\n type: \"number\",\r\n desc: \"State of Health\",\r\n role: \"value\",\r\n read: true,\r\n write: false,\r\n unit: \"%\",\r\n },\r\n native: {},\r\n });\r\n\r\n await adapter?.setState(key + \".soh\", x.soh / 10, true);\r\n }\r\n\r\n if (x.power) {\r\n await adapter?.extendObject(key + \".power\", {\r\n type: \"state\",\r\n common: {\r\n name: {\r\n de: \"Energie\",\r\n en: \"Power\",\r\n },\r\n type: \"number\",\r\n desc: \"Power\",\r\n read: true,\r\n write: false,\r\n role: \"value.power\",\r\n unit: \"W\",\r\n },\r\n native: {},\r\n });\r\n\r\n await adapter?.setState(key + \".power\", x.power, true);\r\n }\r\n\r\n // Debug, send message if property is unknown!\r\n let found = false;\r\n\r\n Object.entries(x).forEach(([key, value]) => {\r\n knownPackDataProperties.forEach((property: string) => {\r\n if (property == key) {\r\n found = true;\r\n }\r\n });\r\n\r\n if (found) {\r\n //console.log(\r\n // `${productName?.val}: ${key} with value ${value} is a KNOWN Mqtt Prop!`\r\n //);\r\n } else {\r\n adapter?.log.debug(\r\n `[addOrUpdatePackData] ${key} with value ${value} is a UNKNOWN PackData Mqtt Property!`\r\n );\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 if (topic.toLowerCase().includes(\"loginOut/force\")) {\r\n // TODO: Ausloggen???\r\n }\r\n\r\n const topicSplitted = topic.replace(\"/server/app\", \"\").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(`[onMessage] JSON Parse error!`);\r\n\r\n adapter.log.debug(`[onMessage] 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 if (adapter.log.level == \"debug\") {\r\n adapter.log.debug(\r\n `[onMessage] MQTT message on topic '${topic}': ${message.toString()}`\r\n );\r\n }\r\n\r\n if (obj.timestamp) {\r\n const currentTimeStamp = new Date().getTime() / 1000;\r\n const diff = currentTimeStamp - obj.timestamp;\r\n\r\n if (diff > 600) {\r\n // Timestamp older than 5 Minutens, device is offline!\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"wifiState\",\r\n \"Disconnected\"\r\n );\r\n } else {\r\n // Timestamp older than 5 Minutens, device is offline!\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"wifiState\",\r\n \"Connected\"\r\n );\r\n }\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 (productKey != \"8bM93H\") {\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 //\r\n if (obj.function == \"deviceAutomation\" && obj.success == 1) {\r\n // setDeviceAutomationInOutLimit ack = true setzen;\r\n const currentValue = await adapter.getStateAsync(\r\n productKey + \".\" + deviceKey + \".control.setDeviceAutomationInOutLimit\"\r\n );\r\n\r\n updateSolarFlowControlState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"setDeviceAutomationInOutLimit\",\r\n currentValue?.val ? currentValue.val : 0\r\n );\r\n } else if (obj.function == \"deviceAutomation\" && obj.success == 0) {\r\n adapter?.log.warn(\r\n `[onMessage] device automation failed for ${productName?.val}: ${productKey}/${deviceKey}!`\r\n );\r\n }\r\n\r\n if (\r\n obj.properties?.autoModel != null &&\r\n obj.properties?.autoModel != undefined\r\n ) {\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"autoModel\",\r\n obj.properties.autoModel\r\n );\r\n\r\n updateSolarFlowControlState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"autoModel\",\r\n obj.properties.autoModel\r\n );\r\n }\r\n\r\n if (\r\n obj.properties?.heatState != null &&\r\n obj.properties?.heatState != undefined\r\n ) {\r\n const value = obj.properties?.heatState == 0 ? false : true;\r\n\r\n updateSolarFlowState(adapter, productKey, deviceKey, \"heatState\", value);\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 (obj.properties.electricLevel == 100) {\r\n const fullChargeNeeded = await adapter.getStateAsync(\r\n productKey + \".\" + deviceKey + \".control.fullChargeNeeded\"\r\n );\r\n\r\n if (\r\n fullChargeNeeded &&\r\n fullChargeNeeded.val &&\r\n fullChargeNeeded.val == true\r\n ) {\r\n await adapter?.setState(\r\n `${productKey}.${deviceKey}.control.fullChargeNeeded`,\r\n false,\r\n true\r\n );\r\n }\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 (obj.power != null && obj.power != undefined) {\r\n const value = obj.power / 10;\r\n updateSolarFlowState(adapter, productKey, deviceKey, \"power\", value);\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 if (obj.properties?.packState) {\r\n // Update combined data point\r\n updateSolarFlowState(adapter, productKey, deviceKey, \"packPower\", 0);\r\n }\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?.smartMode != null &&\r\n obj.properties?.smartMode != undefined\r\n ) {\r\n const value = obj.properties?.smartMode == 0 ? false : true;\r\n\r\n updateSolarFlowState(adapter, productKey, deviceKey, \"smartMode\", value);\r\n\r\n updateSolarFlowControlState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"smartMode\",\r\n value\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 (obj.properties?.outputPackPower > 0) {\r\n // Update combined data point\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"packPower\",\r\n obj.properties.outputPackPower\r\n );\r\n } else if (obj.properties?.outputPackPower == 0) {\r\n // Check if packInputPower is 0\r\n const packInputPower = await adapter?.getStateAsync(\r\n productKey + \".\" + deviceKey + \".packInputPower\"\r\n );\r\n\r\n if (packInputPower?.val == 0) {\r\n // Update combined data point to 0 as both are 0\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"packPower\",\r\n -Math.abs(obj.properties.outputPackPower)\r\n );\r\n }\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 (obj.properties?.packInputPower > 0) {\r\n // Update combined data point\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"packPower\",\r\n -Math.abs(obj.properties.packInputPower)\r\n );\r\n } else if (obj.properties?.packInputPower == 0) {\r\n // Check if outputPackPower is 0\r\n const outputPackPower = await adapter?.getStateAsync(\r\n productKey + \".\" + deviceKey + \".outputPackPower\"\r\n );\r\n\r\n if (outputPackPower?.val == 0) {\r\n // Update combined data point to 0 as both are 0\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"packPower\",\r\n -Math.abs(obj.properties.packInputPower)\r\n );\r\n }\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?.solarPower3 != null &&\r\n obj.properties?.solarPower3 != undefined\r\n ) {\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"pvPower3\",\r\n obj.properties.solarPower3\r\n );\r\n }\r\n\r\n if (\r\n obj.properties?.solarPower4 != null &&\r\n obj.properties?.solarPower4 != undefined\r\n ) {\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"pvPower4\",\r\n obj.properties.solarPower4\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 if (\r\n productName?.val?.toString().toLowerCase().includes(\"solarflow\") ||\r\n productName?.val?.toString().toLowerCase().includes(\"ace\") ||\r\n productName?.val?.toString().toLowerCase().includes(\"hyper\")\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\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 (obj.properties?.acMode != null && obj.properties?.acMode != undefined) {\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"acMode\",\r\n obj.properties.acMode\r\n );\r\n\r\n updateSolarFlowControlState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"acMode\",\r\n obj.properties.acMode\r\n );\r\n }\r\n\r\n if (\r\n obj.properties?.hyperTmp != null &&\r\n obj.properties?.hyperTmp != undefined\r\n ) {\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"hyperTmp\",\r\n obj.properties.hyperTmp / 10 - 273.15\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 \"gridInputPower\",\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\r\n );\r\n\r\n updateSolarFlowControlState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"hubState\",\r\n obj.properties.hubState\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 && adapter.log.level == \"debug\") {\r\n const _productName = productName?.val?.toString();\r\n\r\n if (_productName) {\r\n const states = getStateDefinition(_productName);\r\n let found = false;\r\n\r\n Object.entries(obj.properties).forEach(([key, value]) => {\r\n states.forEach((state: ISolarflowState) => {\r\n if (state.title == key) {\r\n found = true;\r\n }\r\n });\r\n\r\n if (found) {\r\n //console.log(\r\n // `${productName?.val}: ${key} with value ${value} is a KNOWN Mqtt Prop!`\r\n //);\r\n } else {\r\n adapter?.log.debug(\r\n `[onMessage] ${productName?.val}: ${key} with value ${JSON.stringify(value)} is a UNKNOWN Mqtt Property!`\r\n );\r\n }\r\n });\r\n }\r\n }\r\n }\r\n};\r\n\r\nexport const setAcMode = async (\r\n adapter: ZendureSolarflow,\r\n productKey: string,\r\n deviceKey: string,\r\n acMode: number\r\n): Promise<void> => {\r\n if (adapter.mqttClient && productKey && deviceKey) {\r\n if (acMode >= 0 && acMode <= 3) {\r\n const topic = `iot/${productKey}/${deviceKey}/properties/write`;\r\n\r\n const setAcMode = { properties: { acMode: acMode } };\r\n adapter.log.debug(`[setAcMode] Set AC mode to ${acMode}!`);\r\n adapter.mqttClient?.publish(topic, JSON.stringify(setAcMode));\r\n\r\n // Check if device is HUB, then check if smartMode is false - if so send a warning to log!\r\n const smartMode = await adapter.getStateAsync(\r\n productKey + \".\" + deviceKey + \".control.smartMode\"\r\n );\r\n\r\n if (smartMode && !smartMode.val) {\r\n adapter.log.warn(\r\n `[setAcMode] AC mode was switched and smartMode is false - changes will be written to flash memory. In the worst case, the device may break or changes may no longer be saved!`\r\n );\r\n }\r\n } else {\r\n adapter.log.error(`[setAcMode] AC mode must be a value between 0 and 3!`);\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 <= 50) {\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<>50!`\r\n );\r\n }\r\n }\r\n};\r\n\r\nexport const setHubState = async (\r\n adapter: ZendureSolarflow,\r\n productKey: string,\r\n deviceKey: string,\r\n hubState: number\r\n): Promise<void> => {\r\n if (adapter.mqttClient && productKey && deviceKey) {\r\n if (hubState == 0 || hubState == 1) {\r\n const topic = `iot/${productKey}/${deviceKey}/properties/write`;\r\n\r\n const socSetLimit = { properties: { hubState: hubState } };\r\n adapter.log.debug(\r\n `[setHubState] Setting Hub State for device key ${deviceKey} to ${hubState}!`\r\n );\r\n adapter.mqttClient?.publish(topic, JSON.stringify(socSetLimit));\r\n } else {\r\n adapter.log.debug(`[setHubState] Hub state is not 0 or 1!`);\r\n }\r\n }\r\n};\r\n\r\nexport const setDeviceAutomationInOutLimit = async (\r\n adapter: ZendureSolarflow,\r\n productKey: string,\r\n deviceKey: string,\r\n limit: number // can be negative, negative will trigger charging mode\r\n): Promise<void> => {\r\n if (adapter.mqttClient && productKey && deviceKey) {\r\n adapter.log.debug(\r\n `[setDeviceAutomationInOutLimit] Set device Automation limit to ${limit}!`\r\n );\r\n\r\n if (limit) {\r\n limit = Math.round(limit);\r\n } else {\r\n limit = 0;\r\n }\r\n\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 limit > 0\r\n ) {\r\n limit = 0;\r\n }\r\n\r\n const fullChargeNeeded = await adapter.getStateAsync(\r\n productKey + \".\" + deviceKey + \".control.fullChargeNeeded\"\r\n );\r\n\r\n if (\r\n fullChargeNeeded &&\r\n fullChargeNeeded.val &&\r\n fullChargeNeeded.val == true &&\r\n limit > 0\r\n ) {\r\n limit = 0;\r\n }\r\n }\r\n\r\n if (limit < 0) {\r\n // Get input limit, make number positive and the new value negative\r\n limit = -getMinAndMaxInputLimitForProductKey(productKey, -limit);\r\n } else {\r\n limit = getMinAndMaxOutputLimitForProductKey(productKey, limit);\r\n }\r\n\r\n const topic = `iot/${productKey}/${deviceKey}/function/invoke`;\r\n\r\n adapter.msgCounter += 1;\r\n\r\n const timestamp = new Date();\r\n timestamp.setMilliseconds(0);\r\n\r\n // HUB1200 & HUB 2000\r\n let _arguments: IDeviceAutomationPayload[] = [];\r\n\r\n const productName = getProductNameFromProductKey(productKey);\r\n\r\n if (\r\n productName.toLowerCase().includes(\"2400 ac\") ||\r\n productName.toLowerCase().includes(\"solarflow 800\")\r\n ) {\r\n // Device Automation for Solarflow 2400 AC and Solarflow 800\r\n adapter.log.debug(\r\n `[setDeviceAutomationInOutLimit] Using HEMS Variant of device automation, as device '${productName}' detected!`\r\n );\r\n // HEMS Variante\r\n const hemsEP = {\r\n arguments: {\r\n outputPower: limit > 0 ? limit : 0,\r\n chargeState: limit > 0 ? 0 : 1,\r\n chargePower: limit > 0 ? 0 : -limit,\r\n mode: 9,\r\n },\r\n function: \"hemsEP\",\r\n messageId: adapter.msgCounter,\r\n deviceKey: deviceKey,\r\n timestamp: timestamp.getTime() / 1000,\r\n };\r\n\r\n adapter.mqttClient?.publish(topic, JSON.stringify(hemsEP));\r\n return;\r\n } else if (productName.toLowerCase().includes(\"hyper\")) {\r\n // Device Automation for Hyper 2000\r\n if (limit < 0) {\r\n adapter.log.debug(\r\n `[setDeviceAutomationInOutLimit] Using CHARGE variant of HYPER device automation, as device '${productName}' detected and limit is negative!`\r\n );\r\n // Input / Charge\r\n _arguments = [\r\n {\r\n autoModelProgram: 1,\r\n autoModelValue: {\r\n chargingType: 1,\r\n price: 2,\r\n chargingPower: -limit,\r\n prices: [\r\n 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\r\n 1, 1, 1,\r\n ],\r\n outPower: 0,\r\n freq: 0,\r\n },\r\n msgType: 1,\r\n autoModel: 8,\r\n },\r\n ];\r\n } else {\r\n adapter.log.debug(\r\n `[setDeviceAutomationInOutLimit] Using FEED IN variant of HYPER device automation, as device '${productName}' detected and limit is positive!`\r\n );\r\n // Output\r\n _arguments = [\r\n {\r\n autoModelProgram: 2,\r\n autoModelValue: {\r\n chargingType: 0,\r\n chargingPower: 0,\r\n freq: 0,\r\n outPower: limit,\r\n },\r\n msgType: 1,\r\n autoModel: 8,\r\n },\r\n ];\r\n }\r\n } else {\r\n // Device Automation for devices like HUB 1200, HUB 2000, AIO 2400 and Ace 1500\r\n if (limit < 0) {\r\n adapter.log.debug(\r\n `[setDeviceAutomationInOutLimit] Using CHARGE variant of HUB device automation, as device '${productName}' detected and limit is negative!`\r\n );\r\n _arguments = [\r\n {\r\n autoModelProgram: 2,\r\n autoModelValue: {\r\n chargingType: 1,\r\n chargingPower: -limit,\r\n freq: 0,\r\n outPower: 0,\r\n },\r\n msgType: 1,\r\n autoModel: 8,\r\n },\r\n ];\r\n } else {\r\n // Output\r\n adapter.log.debug(\r\n `[setDeviceAutomationInOutLimit] Using FEED IN variant of Hub device automation, as device '${productName}' detected and limit is positive!`\r\n );\r\n _arguments = [\r\n {\r\n autoModelProgram: 2,\r\n autoModelValue: limit,\r\n msgType: 1,\r\n autoModel: 8,\r\n },\r\n ];\r\n }\r\n }\r\n\r\n const deviceAutomation = {\r\n arguments: _arguments,\r\n function: \"deviceAutomation\",\r\n messageId: adapter.msgCounter,\r\n deviceKey: deviceKey,\r\n timestamp: timestamp.getTime() / 1000,\r\n };\r\n adapter.mqttClient?.publish(topic, JSON.stringify(deviceAutomation));\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 // Check if autoModel is set to 0 (Nothing) or 8 (Smart Matching)\r\n const autoModel = (\r\n await adapter.getStateAsync(productKey + \".\" + deviceKey + \".autoModel\")\r\n )?.val;\r\n\r\n if (autoModel != 0) {\r\n adapter.log.warn(\r\n \"Operation mode (autoModel) is not set to '0', we can't set the output limit!\"\r\n );\r\n return;\r\n }\r\n\r\n if (limit) {\r\n limit = Math.round(limit);\r\n } else {\r\n limit = 0;\r\n }\r\n\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 const fullChargeNeeded = await adapter.getStateAsync(\r\n productKey + \".\" + deviceKey + \".control.fullChargeNeeded\"\r\n );\r\n\r\n if (\r\n fullChargeNeeded &&\r\n fullChargeNeeded.val &&\r\n fullChargeNeeded.val == true\r\n ) {\r\n limit = 0;\r\n }\r\n }\r\n\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 limit = getMinAndMaxOutputLimitForProductKey(productKey, limit);\r\n\r\n const topic = `iot/${productKey}/${deviceKey}/properties/write`;\r\n\r\n const outputlimit = { properties: { outputLimit: limit } };\r\n\r\n adapter.msgCounter += 1;\r\n\r\n const timestamp = new Date();\r\n timestamp.setMilliseconds(0);\r\n\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 if (limit) {\r\n limit = Math.round(limit);\r\n } else {\r\n limit = 0;\r\n }\r\n\r\n limit = getMinAndMaxInputLimitForProductKey(productKey, limit);\r\n\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\nexport const setSmartMode = async (\r\n adapter: ZendureSolarflow,\r\n productKey: string,\r\n deviceKey: string,\r\n smartModeOn: 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 setSmartModeContent = {\r\n properties: { smartMode: smartModeOn ? 1 : 0 },\r\n };\r\n adapter.log.debug(\r\n `[setBuzzer] Setting Smart Mode for device key ${deviceKey} to ${smartModeOn}!`\r\n );\r\n adapter.mqttClient?.publish(topic, JSON.stringify(setSmartModeContent));\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 setBuzzerSwitchContent = {\r\n properties: { buzzerSwitch: buzzerOn ? 1 : 0 },\r\n };\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(setBuzzerSwitchContent));\r\n }\r\n};\r\n\r\nexport const setAutoModel = async (\r\n adapter: ZendureSolarflow,\r\n productKey: string,\r\n deviceKey: string,\r\n autoModel: 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 let setAutoModelContent: any = { properties: { autoModel: autoModel } };\r\n\r\n switch (autoModel) {\r\n case 8: // Smart Matching Modus\r\n setAutoModelContent = {\r\n properties: {\r\n autoModelProgram: 1,\r\n autoModelValue: { chargingType: 0, chargingPower: 0, outPower: 0 },\r\n msgType: 1,\r\n autoModel: 8,\r\n },\r\n };\r\n break;\r\n case 9: // Smart CT Modus\r\n setAutoModelContent = {\r\n properties: {\r\n autoModelProgram: 2,\r\n autoModelValue: { chargingType: 3, chargingPower: 0, outPower: 0 },\r\n msgType: 1,\r\n autoModel: 9,\r\n },\r\n };\r\n break;\r\n }\r\n\r\n adapter.log.debug(\r\n `[setAutoModel] Setting autoModel for device key ${deviceKey} to ${autoModel}!`\r\n );\r\n adapter.mqttClient?.publish(topic, JSON.stringify(setAutoModelContent));\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 `[setAutoRecover] 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 `[setDcSwitch] 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 `[setAcSwitch] 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 subscribeReportTopic = (\r\n productKey: string,\r\n deviceKey: string,\r\n timeout: number\r\n): void => {\r\n const reportTopic = `/${productKey}/${deviceKey}/#`;\r\n\r\n setTimeout(() => {\r\n if (adapter) {\r\n adapter.log.debug(\r\n `[subscribeReportTopic] Subscribing to MQTT Topic: ${reportTopic}`\r\n );\r\n adapter.mqttClient?.subscribe(reportTopic, onSubscribeReportTopic);\r\n }\r\n }, timeout);\r\n};\r\n\r\nexport const subscribeIotTopic = (\r\n productKey: string,\r\n deviceKey: string,\r\n timeout: number\r\n): void => {\r\n const iotTopic = `iot/${productKey}/${deviceKey}/#`;\r\n\r\n setTimeout(() => {\r\n adapter?.log.debug(\r\n `[subscribeIotTopic] Subscribing to MQTT Topic: ${iotTopic}`\r\n );\r\n adapter?.mqttClient?.subscribe(iotTopic, (error) => {\r\n onSubscribeIotTopic(error, productKey, deviceKey);\r\n });\r\n }, timeout);\r\n};\r\n\r\nexport const connectCloudMqttClient = (_adapter: ZendureSolarflow): void => {\r\n adapter = _adapter;\r\n\r\n if (!adapter.paths?.mqttPassword) {\r\n adapter.log.error(`[connectCloudMqttClient] MQTT Password is missing!`);\r\n return;\r\n }\r\n\r\n const mqttPassword = atob(adapter.paths?.mqttPassword);\r\n\r\n const options: mqtt.IClientOptions = {\r\n clientId: adapter.accessToken,\r\n username: \"zenApp\",\r\n password: mqttPassword,\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 `[connectCloudMqttClient] 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 let connectIot = true;\r\n\r\n if (device.productKey == \"s3Xk4x\") {\r\n const smartPlugReportTopic = `/server/app/${adapter.userId}/${device.id}/smart/power`;\r\n\r\n adapter.mqttClient?.subscribe(\r\n smartPlugReportTopic,\r\n onSubscribeReportTopic\r\n );\r\n\r\n connectIot = false;\r\n }\r\n\r\n subscribeReportTopic(\r\n device.productKey,\r\n device.deviceKey,\r\n 1000 * index\r\n );\r\n\r\n if (connectIot) {\r\n subscribeIotTopic(\r\n device.productKey,\r\n device.deviceKey,\r\n 1000 * index\r\n );\r\n }\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 subscribeReportTopic(\r\n subDevice.productKey,\r\n subDevice.deviceKey,\r\n 1000 * index\r\n );\r\n\r\n subscribeIotTopic(\r\n subDevice.productKey,\r\n subDevice.deviceKey,\r\n 2000 * index\r\n );\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 // 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\r\nexport const connectLocalMqttClient = (_adapter: ZendureSolarflow): void => {\r\n adapter = _adapter;\r\n\r\n const options: mqtt.IClientOptions = {\r\n clientId: \"ioBroker.zendure-solarflow.\" + adapter.instance,\r\n };\r\n\r\n if (mqtt && adapter && adapter.config && adapter.config.localMqttUrl) {\r\n adapter.log.debug(\r\n `[connectLocalMqttClient] Connecting to MQTT broker ${\r\n adapter.config.localMqttUrl + \":\" + 1883\r\n }...`\r\n );\r\n adapter.mqttClient = mqtt.connect(\r\n \"mqtt://\" + adapter.config.localMqttUrl + \":\" + 1883,\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 adapter.setState(\"info.connection\", true, true);\r\n\r\n // Subscribe to 1. device from local settings\r\n if (\r\n adapter.config.localDevice1ProductKey &&\r\n adapter.config.localDevice1DeviceKey\r\n ) {\r\n // Create states and subscribe device 1\r\n createSolarFlowLocalStates(\r\n adapter,\r\n adapter.config.localDevice1ProductKey,\r\n adapter.config.localDevice1DeviceKey\r\n );\r\n\r\n subscribeReportTopic(\r\n adapter.config.localDevice1ProductKey,\r\n adapter.config.localDevice1DeviceKey,\r\n 1000\r\n );\r\n\r\n subscribeIotTopic(\r\n adapter.config.localDevice1ProductKey,\r\n adapter.config.localDevice1DeviceKey,\r\n 1000\r\n );\r\n }\r\n\r\n // Subscribe to 2. device from local settings\r\n if (\r\n adapter.config.localDevice2ProductKey &&\r\n adapter.config.localDevice2DeviceKey\r\n ) {\r\n // Create states and subscribe device 2\r\n createSolarFlowLocalStates(\r\n adapter,\r\n adapter.config.localDevice2ProductKey,\r\n adapter.config.localDevice2DeviceKey\r\n );\r\n\r\n subscribeReportTopic(\r\n adapter.config.localDevice2ProductKey,\r\n adapter.config.localDevice2DeviceKey,\r\n 2000\r\n );\r\n\r\n subscribeIotTopic(\r\n adapter.config.localDevice2ProductKey,\r\n adapter.config.localDevice2DeviceKey,\r\n 2000\r\n );\r\n }\r\n\r\n // Subscribe to 3. device from local settings\r\n if (\r\n adapter.config.localDevice3ProductKey &&\r\n adapter.config.localDevice3DeviceKey\r\n ) {\r\n // Create states and subscribe device 2\r\n createSolarFlowLocalStates(\r\n adapter,\r\n adapter.config.localDevice3ProductKey,\r\n adapter.config.localDevice3DeviceKey\r\n );\r\n\r\n subscribeReportTopic(\r\n adapter.config.localDevice3ProductKey,\r\n adapter.config.localDevice3DeviceKey,\r\n 2000\r\n );\r\n\r\n subscribeIotTopic(\r\n adapter.config.localDevice3ProductKey,\r\n adapter.config.localDevice3DeviceKey,\r\n 2000\r\n );\r\n }\r\n\r\n // Subscribe to 3. device from local settings\r\n if (\r\n adapter.config.localDevice4ProductKey &&\r\n adapter.config.localDevice4DeviceKey\r\n ) {\r\n // Create states and subscribe device 2\r\n createSolarFlowLocalStates(\r\n adapter,\r\n adapter.config.localDevice4ProductKey,\r\n adapter.config.localDevice4DeviceKey\r\n );\r\n\r\n subscribeReportTopic(\r\n adapter.config.localDevice4ProductKey,\r\n adapter.config.localDevice4DeviceKey,\r\n 2000\r\n );\r\n\r\n subscribeIotTopic(\r\n adapter.config.localDevice4ProductKey,\r\n adapter.config.localDevice4DeviceKey,\r\n 2000\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 // 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": ["key", "adapter", "setAcMode", "_a"]
|
|
7
7
|
}
|
package/io-package.json
CHANGED
|
@@ -1,8 +1,21 @@
|
|
|
1
1
|
{
|
|
2
2
|
"common": {
|
|
3
3
|
"name": "zendure-solarflow",
|
|
4
|
-
"version": "2.0.
|
|
4
|
+
"version": "2.0.3",
|
|
5
5
|
"news": {
|
|
6
|
+
"2.0.3": {
|
|
7
|
+
"en": "Added 'B3Dxda' as new Hyper 2000 productKey. Removed parameter 'upTime' and 'pullTime' from 'setDeviceAutomationInOutLimit'. TEST: Use 'setDeviceAutomationInOutLimit' to let HUB1200/HUB2000 charge with connected ACE 1500",
|
|
8
|
+
"de": "B3Dxda' als neuer Hyper 2000 productKey hinzugefügt. Parameter 'upTime' und 'pullTime' aus 'setDeviceAutomationInOutLimit' entfernt. TEST: Verwenden Sie 'setDeviceAutomationInOutLimit', um HUB1200/HUB2000 mit angeschlossenem ACE 1500 laden zu lassen.",
|
|
9
|
+
"ru": "Добавлен 'B3Dxda' в качестве нового ключа устройства Hyper 2000. Удалены параметры 'upTime' и 'pullTime' из 'setDeviceAutomationInOutLimit'. ТЕСТ: Используйте 'setDeviceAutomationInOutLimit', чтобы позволить HUB1200/HUB2000 заряжаться с подключенным ACE 1500.",
|
|
10
|
+
"pt": "Adicionado 'B3Dxda' como nova productKey Hyper 2000. Removido o parâmetro 'upTime' e 'pullTime' de 'setDeviceAutomationInOutLimit'. TESTE: Utilizar 'setDeviceAutomationInOutLimit' para permitir que o HUB1200/HUB2000 carregue com o ACE 1500 ligado",
|
|
11
|
+
"nl": "B3Dxda' toegevoegd als nieuwe Hyper 2000 productKey. Parameter 'upTime' en 'pullTime' verwijderd uit 'setDeviceAutomationInOutLimit'. TEST: Gebruik 'setDeviceAutomationInOutLimit' om HUB1200/HUB2000 te laten laden met aangesloten ACE 1500.",
|
|
12
|
+
"fr": "Ajout de 'B3Dxda' comme nouvelle clé de périphérique Hyper 2000. Suppression des paramètres 'upTime' et 'pullTime' de 'setDeviceAutomationInOutLimit'. TEST : Utilisez 'setDeviceAutomationInOutLimit' pour permettre au HUB1200/HUB2000 de se recharger avec un ACE 1500 connecté.",
|
|
13
|
+
"it": "Aggiunto 'B3Dxda' come nuovo productKey Hyper 2000. Rimosso il parametro 'upTime' e 'pullTime' da 'setDeviceAutomationInOutLimit'. TEST: utilizzare 'setDeviceAutomationInOutLimit' per consentire a HUB1200/HUB2000 di caricarsi con l'ACE 1500 collegato.",
|
|
14
|
+
"es": "Añadido 'B3Dxda' como nuevo productKey de Hyper 2000. Eliminados los parámetros 'upTime' y 'pullTime' de 'setDeviceAutomationInOutLimit'. PRUEBA: Utiliza 'setDeviceAutomationInOutLimit' para que HUB1200/HUB2000 se cargue con ACE 1500 conectado.",
|
|
15
|
+
"pl": "Dodano \"B3Dxda\" jako nowy klucz urządzenia Hyper 2000. Usunięto parametr 'upTime' i 'pullTime' z 'setDeviceAutomationInOutLimit'. TEST: Użyj 'setDeviceAutomationInOutLimit', aby umożliwić ładowanie HUB1200/HUB2000 z podłączonym ACE 1500.",
|
|
16
|
+
"uk": "Додано 'B3Dxda' як новий Hyper 2000 productKey. Видалено параметри 'upTime' та 'pullTime' з 'setDeviceAutomationInOutLimit'. ТЕСТ: Використовуйте 'setDeviceAutomationInOutLimit', щоб дозволити HUB1200/HUB2000 заряджатися з підключеним ACE 1500",
|
|
17
|
+
"zh-cn": "Added 'B3Dxda' as new Hyper 2000 productKey. Removed parameter 'upTime' and 'pullTime' from 'setDeviceAutomationInOutLimit'. TEST: Use 'setDeviceAutomationInOutLimit' to let HUB1200/HUB2000 charge with connected ACE 1500"
|
|
18
|
+
},
|
|
6
19
|
"2.0.1": {
|
|
7
20
|
"en": "Small fix MQTT service",
|
|
8
21
|
"de": "Kleiner MQTT-Service",
|
|
@@ -80,19 +93,6 @@
|
|
|
80
93
|
"pl": "Klucz produktu wrażliwego na dopasowanie dla SF 2400 AC i SF 800 w ustawieniach w trybie lokalnym\nDodaj czujnik i sterowanie \"SmartMode\"",
|
|
81
94
|
"uk": "У разі використання чутливого продукту для SF 2400 AC та SF 800 у налаштуваннях, якщо використовується локальний режим\nДодати датчик і контроль \"SmartMode\"",
|
|
82
95
|
"zh-cn": "如果使用本地模式, 匹配 SF 2400 AC 和 SF 800 的大小写敏感产品密钥\n添加“ SmartMode” 的传感器和控制"
|
|
83
|
-
},
|
|
84
|
-
"1.15.3-alpha.0": {
|
|
85
|
-
"en": "Match case sensitive product key for SF 2400 AC",
|
|
86
|
-
"de": "Passender Case sensitiver Produktschlüssel für SF 2400 AC",
|
|
87
|
-
"ru": "Ключ для чувствительного кейса для SF 2400 AC",
|
|
88
|
-
"pt": "Chave de produto sensível à caixa para SF 2400 AC",
|
|
89
|
-
"nl": "Match hoofdlettergevoelige productsleutel voor SF 2400 AC",
|
|
90
|
-
"fr": "Clé de produit sensible à la coque pour SF 2400 AC",
|
|
91
|
-
"it": "Chiave di prodotto sensibile caso per SF 2400 AC",
|
|
92
|
-
"es": "Clave de producto sensible de caso de coincidencia para SF 2400 AC",
|
|
93
|
-
"pl": "Klucz produktu wrażliwego na dopasowanie dla SF 2400 AC",
|
|
94
|
-
"uk": "Ключ до чутливого продукту для SF 2400 AC",
|
|
95
|
-
"zh-cn": "匹配 SF 2400 AC 的大小写敏感产品密钥"
|
|
96
96
|
}
|
|
97
97
|
},
|
|
98
98
|
"titleLang": {
|