iobroker.zendure-solarflow 1.12.0-alpha.0 → 1.12.1
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 +21 -6
- package/admin/build/index.js +24 -24
- package/admin/build/index.js.map +2 -2
- package/build/models/ISolarFlowMqttProperties.js.map +2 -2
- package/build/services/calculationService.js +21 -13
- package/build/services/calculationService.js.map +2 -2
- package/build/services/jobSchedule.js +7 -0
- package/build/services/jobSchedule.js.map +2 -2
- package/build/services/mqttService.js +96 -85
- package/build/services/mqttService.js.map +3 -3
- package/io-package.json +27 -27
- package/package.json +4 -4
|
@@ -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\n\r\nlet adapter: ZendureSolarflow | undefined = undefined;\r\n\r\nexport const addOrUpdatePackData = async (\r\n productKey: string,\r\n deviceKey: string,\r\n packData: IPackData[],\r\n isSolarFlow: boolean\r\n): Promise<void> => {\r\n if (adapter && productKey && deviceKey) {\r\n await packData.forEach(async (x) => {\r\n // Process data only with a serial id!\r\n if (x.sn && adapter) {\r\n // Create 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 (x.sn.startsWith(\"C\")) {\r\n // It's a AB2000\r\n batType = \"AB2000\";\r\n } else if (x.sn.startsWith(\"A\")) {\r\n // It's a AB1000\r\n batType = \"AB1000\";\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\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 },\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 },\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.maxVol) {\r\n await adapter?.extendObject(key + \".maxVol\", {\r\n type: \"state\",\r\n common: {\r\n name: \"maxVol\",\r\n type: \"number\",\r\n desc: \"maxVol\",\r\n role: \"value\",\r\n read: true,\r\n write: false,\r\n },\r\n native: {},\r\n });\r\n\r\n await adapter?.setState(key + \".maxVol\", x.maxVol / 100, true);\r\n }\r\n\r\n if (x.totalVol) {\r\n await adapter?.extendObject(key + \".totalVol\", {\r\n type: \"state\",\r\n common: {\r\n name: \"totalVol\",\r\n type: \"number\",\r\n desc: \"totalVol\",\r\n role: \"value\",\r\n read: true,\r\n write: false,\r\n },\r\n native: {},\r\n });\r\n\r\n const totalVol = x.totalVol / 100;\r\n\r\n await adapter?.setState(key + \".totalVol\", totalVol, true);\r\n\r\n // Send Voltage to checkVoltage Method (only if is Solarflow device)\r\n if (isSolarFlow) {\r\n checkVoltage(adapter, productKey, deviceKey, totalVol);\r\n }\r\n }\r\n }\r\n });\r\n }\r\n};\r\n\r\nconst onMessage = async (topic: string, message: Buffer): Promise<void> => {\r\n if (adapter) {\r\n 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 // Check if device is an solarflow or hyper device. Don't use LowVoltageBlock on an ACE device?\r\n if (\r\n productName?.val?.toString().toLowerCase().includes(\"solarflow\") ||\r\n productName?.val?.toString().toLowerCase().includes(\"hyper\")\r\n ) {\r\n isSolarFlow = true;\r\n }\r\n\r\n // set lastUpdate for deviceKey\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"lastUpdate\",\r\n new Date().getTime()\r\n );\r\n\r\n if (\r\n obj.properties?.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\r\n if (\r\n obj.properties?.passMode != null &&\r\n obj.properties?.passMode != undefined\r\n ) {\r\n const value =\r\n obj.properties?.passMode == 0\r\n ? \"Automatic\"\r\n : obj.properties?.passMode == 1\r\n ? \"Always off\"\r\n : obj.properties?.passMode == 2\r\n ? \"Always on\"\r\n : \"Unknown\";\r\n updateSolarFlowState(adapter, productKey, deviceKey, \"passMode\", value);\r\n\r\n updateSolarFlowControlState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"passMode\",\r\n obj.properties?.passMode\r\n );\r\n }\r\n\r\n if (obj.properties?.pass != null && obj.properties?.pass != undefined) {\r\n const value = obj.properties?.pass == 0 ? false : true;\r\n\r\n updateSolarFlowState(adapter, productKey, deviceKey, \"pass\", value);\r\n }\r\n\r\n if (\r\n obj.properties?.autoRecover != null &&\r\n obj.properties?.autoRecover != undefined\r\n ) {\r\n const value = obj.properties?.autoRecover == 0 ? false : true;\r\n\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"autoRecover\",\r\n value\r\n );\r\n\r\n updateSolarFlowControlState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"autoRecover\",\r\n value\r\n );\r\n }\r\n\r\n if (\r\n obj.properties?.outputHomePower != null &&\r\n obj.properties?.outputHomePower != undefined\r\n ) {\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"outputHomePower\",\r\n obj.properties.outputHomePower\r\n );\r\n }\r\n\r\n if (\r\n obj.properties?.energyPower != null &&\r\n obj.properties?.energyPower != undefined\r\n ) {\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"energyPower\",\r\n obj.properties.energyPower\r\n );\r\n }\r\n\r\n if (\r\n obj.properties?.outputLimit != null &&\r\n obj.properties?.outputLimit != undefined\r\n ) {\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"outputLimit\",\r\n obj.properties.outputLimit\r\n );\r\n\r\n updateSolarFlowControlState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"setOutputLimit\",\r\n obj.properties.outputLimit\r\n );\r\n }\r\n\r\n if (\r\n obj.properties?.buzzerSwitch != null &&\r\n obj.properties?.buzzerSwitch != undefined\r\n ) {\r\n const value = obj.properties?.buzzerSwitch == 0 ? false : true;\r\n\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"buzzerSwitch\",\r\n value\r\n );\r\n\r\n updateSolarFlowControlState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"buzzerSwitch\",\r\n value\r\n );\r\n }\r\n\r\n if (\r\n obj.properties?.outputPackPower != null &&\r\n obj.properties?.outputPackPower != undefined\r\n ) {\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"outputPackPower\",\r\n obj.properties.outputPackPower\r\n );\r\n\r\n // if outPutPackPower set packInputPower to 0\r\n updateSolarFlowState(adapter, productKey, deviceKey, \"packInputPower\", 0);\r\n }\r\n\r\n if (\r\n obj.properties?.packInputPower != null &&\r\n obj.properties?.packInputPower != undefined\r\n ) {\r\n let standbyUsage = 0;\r\n\r\n // Aktuelle Solar-Power abfragen, wenn 0 Standby-Verbrauch dazu rechnen\r\n const solarInputPower = await adapter?.getStateAsync(\r\n `${productKey}.${deviceKey}.solarInputPower`\r\n );\r\n\r\n if (solarInputPower && Number(solarInputPower.val) < 10) {\r\n standbyUsage = 7 - Number(solarInputPower.val);\r\n }\r\n\r\n // Check if connected with Ace, if so add 10 Watt to standby usage!\r\n const device = adapter?.deviceList?.find(\r\n (x) => x.deviceKey == deviceKey && x.productKey == productKey\r\n );\r\n\r\n if (device && device._connectedWithAce) {\r\n standbyUsage += 7;\r\n }\r\n\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"packInputPower\",\r\n obj.properties.packInputPower + standbyUsage\r\n );\r\n\r\n // if packInputPower set outputPackPower to 0\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"outputPackPower\",\r\n 0\r\n );\r\n }\r\n\r\n if (\r\n obj.properties?.solarInputPower != null &&\r\n obj.properties?.solarInputPower != undefined\r\n ) {\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"solarInputPower\",\r\n obj.properties.solarInputPower\r\n );\r\n }\r\n\r\n if (\r\n obj.properties?.pvPower1 != null &&\r\n obj.properties?.pvPower1 != undefined\r\n ) {\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"pvPower2\", // Reversed to adjust like offical app\r\n obj.properties.pvPower1\r\n );\r\n }\r\n\r\n if (\r\n obj.properties?.pvPower2 != null &&\r\n obj.properties?.pvPower2 != undefined\r\n ) {\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"pvPower1\", // Reversed to adjust like offical app\r\n obj.properties.pvPower2\r\n );\r\n }\r\n\r\n if (\r\n obj.properties?.solarPower1 != null &&\r\n obj.properties?.solarPower1 != undefined\r\n ) {\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"pvPower1\",\r\n obj.properties.solarPower1\r\n );\r\n }\r\n\r\n if (\r\n obj.properties?.solarPower2 != null &&\r\n obj.properties?.solarPower2 != undefined\r\n ) {\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"pvPower2\",\r\n obj.properties.solarPower2\r\n );\r\n }\r\n\r\n if (\r\n obj.properties?.remainOutTime != null &&\r\n obj.properties?.remainOutTime != undefined\r\n ) {\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"remainOutTime\",\r\n obj.properties.remainOutTime\r\n );\r\n }\r\n\r\n if (\r\n obj.properties?.remainInputTime != null &&\r\n obj.properties?.remainInputTime != undefined\r\n ) {\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"remainInputTime\",\r\n obj.properties.remainInputTime\r\n );\r\n }\r\n\r\n if (obj.properties?.socSet != null && obj.properties?.socSet != undefined) {\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"socSet\",\r\n Number(obj.properties.socSet) / 10\r\n );\r\n\r\n updateSolarFlowControlState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"chargeLimit\",\r\n Number(obj.properties.socSet) / 10\r\n );\r\n }\r\n\r\n if (obj.properties?.minSoc != null && obj.properties?.minSoc != undefined) {\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"minSoc\",\r\n Number(obj.properties.minSoc) / 10\r\n );\r\n\r\n updateSolarFlowControlState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"dischargeLimit\",\r\n Number(obj.properties.minSoc) / 10\r\n );\r\n }\r\n\r\n if (\r\n obj.properties?.inputLimit != null &&\r\n obj.properties?.inputLimit != undefined\r\n ) {\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"inputLimit\",\r\n obj.properties.inputLimit\r\n );\r\n\r\n 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) {\r\n let type = \"solarflow\";\r\n const _productName = productName?.val?.toString();\r\n\r\n if (_productName?.toLowerCase().includes(\"hyper\")) {\r\n type = \"hyper\";\r\n } else if (_productName?.toLowerCase().includes(\"ace\")) {\r\n type = \"ace\";\r\n } else if (_productName?.toLowerCase().includes(\"aio\")) {\r\n type = \"aio\";\r\n } else if (_productName?.toLowerCase().includes(\"smart plug\")) {\r\n type = \"smartPlug\";\r\n }\r\n\r\n const states = getStateDefinition(type);\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 console.log(\r\n `${productName?.val}: ${key} with value ${value} is a UNKNOWN Mqtt Prop!`\r\n );\r\n }\r\n });\r\n } */\r\n }\r\n};\r\n\r\nexport const 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 <= 2) {\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 } else {\r\n adapter.log.error(`[setAcMode] AC mode must be a value between 0 and 2!`);\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 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\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 const productName = (\r\n await adapter.getStateAsync(productKey + \".\" + deviceKey + \".productName\")\r\n )?.val\r\n ?.toString()\r\n .toLowerCase();\r\n\r\n if (currentLimit != null && currentLimit != undefined) {\r\n if (currentLimit != limit) {\r\n if (\r\n limit < 100 &&\r\n limit != 90 &&\r\n limit != 60 &&\r\n limit != 30 &&\r\n limit != 0\r\n ) {\r\n // NUR Solarflow HUB: Das Limit kann unter 100 nur in 30er Schritten gesetzt werden, dH. 30/60/90/100, wir rechnen das also um\r\n if (limit < 100 && limit > 90 && !productName?.includes(\"hyper\")) {\r\n limit = 90;\r\n } else if (\r\n limit > 60 &&\r\n limit < 90 &&\r\n !productName?.includes(\"hyper\")\r\n ) {\r\n limit = 60;\r\n } else if (\r\n limit > 30 &&\r\n limit < 60 &&\r\n !productName?.includes(\"hyper\")\r\n ) {\r\n limit = 30;\r\n } else if (limit < 30) {\r\n limit = 30;\r\n }\r\n }\r\n\r\n if (limit > 1200) {\r\n limit = 1200;\r\n }\r\n\r\n const topic = `iot/${productKey}/${deviceKey}/properties/write`;\r\n\r\n const outputlimit = { properties: { outputLimit: limit } };\r\n adapter.mqttClient?.publish(topic, JSON.stringify(outputlimit));\r\n }\r\n }\r\n }\r\n};\r\n\r\nexport const setInputLimit = async (\r\n adapter: ZendureSolarflow,\r\n productKey: string,\r\n deviceKey: string,\r\n limit: number\r\n): Promise<void> => {\r\n if (adapter.mqttClient && productKey && deviceKey) {\r\n if (limit) {\r\n limit = Math.round(limit);\r\n } else {\r\n limit = 0;\r\n }\r\n\r\n let maxLimit = 900;\r\n const currentLimit = (\r\n await adapter.getStateAsync(productKey + \".\" + deviceKey + \".inputLimit\")\r\n )?.val;\r\n\r\n const productName = (\r\n await adapter.getStateAsync(productKey + \".\" + deviceKey + \".productName\")\r\n )?.val\r\n ?.toString()\r\n .toLowerCase();\r\n\r\n if (productName?.includes(\"hyper\")) {\r\n maxLimit = 1200;\r\n }\r\n\r\n if (productName?.includes(\"ace\")) {\r\n // Das Limit kann nur in 100er Schritten gesetzt werden\r\n limit = Math.ceil(limit / 100) * 100;\r\n }\r\n\r\n if (limit < 0) {\r\n limit = 0;\r\n } else if (limit > 0 && limit <= 30) {\r\n limit = 30;\r\n } else if (limit > maxLimit) {\r\n limit = maxLimit;\r\n }\r\n\r\n if (currentLimit != null && currentLimit != undefined) {\r\n if (currentLimit != limit) {\r\n const topic = `iot/${productKey}/${deviceKey}/properties/write`;\r\n\r\n const inputLimitContent = { properties: { inputLimit: limit } };\r\n adapter.mqttClient?.publish(topic, JSON.stringify(inputLimitContent));\r\n }\r\n }\r\n }\r\n};\r\n\r\nexport const setBuzzerSwitch = async (\r\n adapter: ZendureSolarflow,\r\n productKey: string,\r\n deviceKey: string,\r\n buzzerOn: boolean\r\n): Promise<void> => {\r\n if (adapter.mqttClient && productKey && deviceKey) {\r\n const topic = `iot/${productKey}/${deviceKey}/properties/write`;\r\n\r\n const 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 const setAutoModelContent = { properties: { autoModel: autoModel } };\r\n adapter.log.debug(\r\n `[setBuzzer] 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 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 let reportTopic = `/${device.productKey}/${device.deviceKey}/#`;\r\n const iotTopic = `iot/${device.productKey}/${device.deviceKey}/#`;\r\n\r\n if (device.productKey == \"s3Xk4x\") {\r\n reportTopic = `/server/app/${adapter.userId}/${device.id}/smart/power`;\r\n connectIot = false;\r\n }\r\n\r\n setTimeout(\r\n () => {\r\n if (adapter) {\r\n adapter.log.debug(\r\n `[connectCloudMqttClient] Subscribing to MQTT Topic: ${reportTopic}`\r\n );\r\n adapter.mqttClient?.subscribe(\r\n reportTopic,\r\n onSubscribeReportTopic\r\n );\r\n }\r\n },\r\n 1000 * index + 1\r\n );\r\n\r\n if (connectIot) {\r\n setTimeout(\r\n () => {\r\n adapter?.log.debug(\r\n `[connectCloudMqttClient] Subscribing to MQTT Topic: ${iotTopic}`\r\n );\r\n adapter?.mqttClient?.subscribe(iotTopic, (error) => {\r\n onSubscribeIotTopic(\r\n error,\r\n device.productKey,\r\n device.deviceKey\r\n );\r\n });\r\n },\r\n 1500 * index + 1\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 const reportTopic = `/${subDevice.productKey}/${subDevice.deviceKey}/properties/report`;\r\n const iotTopic = `iot/${subDevice.productKey}/${subDevice.deviceKey}/#`;\r\n\r\n setTimeout(() => {\r\n if (adapter) {\r\n adapter.log.debug(\r\n `[connectCloudMqttClient] Subscribing to MQTT Topic: ${reportTopic}`\r\n );\r\n adapter.mqttClient?.subscribe(\r\n reportTopic,\r\n onSubscribeReportTopic\r\n );\r\n }\r\n }, 1000 * index);\r\n\r\n setTimeout(() => {\r\n adapter?.log.debug(\r\n `[connectCloudMqttClient] Subscribing to MQTT Topic: ${iotTopic}`\r\n );\r\n adapter?.mqttClient?.subscribe(iotTopic, (error) => {\r\n onSubscribeIotTopic(\r\n error,\r\n subDevice.productKey,\r\n subDevice.deviceKey\r\n );\r\n });\r\n }, 1500 * index);\r\n }\r\n });\r\n }\r\n }\r\n }\r\n );\r\n\r\n adapter.mqttClient.on(\"message\", onMessage);\r\n\r\n // Job starten die states in der Nacht zu resetten\r\n startResetValuesJob(adapter);\r\n\r\n // Job starten die States zu checken\r\n startCheckStatesAndConnectionJob(adapter);\r\n\r\n // 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: \"bla\",\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 all devices in 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 // Subscribe device 1 // /yWF7hV/JaqhMbJ2/properties/report\r\n const reportTopic = `/${adapter.config.localDevice1ProductKey}/${adapter.config.localDevice1DeviceKey}/#`;\r\n const iotTopic = `iot/${adapter.config.localDevice1ProductKey}/${adapter.config.localDevice1DeviceKey}/`;\r\n\r\n setTimeout(() => {\r\n if (adapter) {\r\n adapter.log.debug(\r\n `[connectLocalMqttClient] Subscribing to MQTT Topic: ${reportTopic}`\r\n );\r\n adapter.mqttClient?.subscribe(reportTopic, onSubscribeReportTopic);\r\n }\r\n }, 1000);\r\n\r\n setTimeout(() => {\r\n adapter?.log.debug(\r\n `[connectLocalMqttClient] Subscribing to MQTT Topic: ${iotTopic}`\r\n );\r\n adapter?.mqttClient?.subscribe(iotTopic, (error) => {\r\n onSubscribeIotTopic(\r\n error,\r\n adapter?.config.localDevice1ProductKey,\r\n adapter?.config.localDevice1DeviceKey\r\n );\r\n });\r\n }, 2000);\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
|
-
"names": ["adapter", "setAcMode", "_a"
|
|
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\n\r\nlet adapter: ZendureSolarflow | undefined = undefined;\r\n\r\nexport const addOrUpdatePackData = async (\r\n productKey: string,\r\n deviceKey: string,\r\n packData: IPackData[],\r\n isSolarFlow: boolean\r\n): Promise<void> => {\r\n if (adapter && productKey && deviceKey) {\r\n await packData.forEach(async (x) => {\r\n // Process data only with a serial id!\r\n if (x.sn && adapter) {\r\n // Create 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(\"C\")) {\r\n // It's a AB2000\r\n batType = \"AB2000\";\r\n } else if (x.sn.startsWith(\"A\")) {\r\n // It's a AB1000\r\n batType = \"AB1000\";\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\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 },\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 },\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.maxVol) {\r\n await adapter?.extendObject(key + \".maxVol\", {\r\n type: \"state\",\r\n common: {\r\n name: \"maxVol\",\r\n type: \"number\",\r\n desc: \"maxVol\",\r\n role: \"value\",\r\n read: true,\r\n write: false,\r\n },\r\n native: {},\r\n });\r\n\r\n await adapter?.setState(key + \".maxVol\", x.maxVol / 100, true);\r\n }\r\n\r\n if (x.totalVol) {\r\n await adapter?.extendObject(key + \".totalVol\", {\r\n type: \"state\",\r\n common: {\r\n name: \"totalVol\",\r\n type: \"number\",\r\n desc: \"totalVol\",\r\n role: \"value\",\r\n read: true,\r\n write: false,\r\n },\r\n native: {},\r\n });\r\n\r\n const totalVol = x.totalVol / 100;\r\n\r\n await adapter?.setState(key + \".totalVol\", totalVol, true);\r\n\r\n // Send Voltage to checkVoltage Method (only if is Solarflow device)\r\n if (isSolarFlow) {\r\n checkVoltage(adapter, productKey, deviceKey, totalVol);\r\n }\r\n }\r\n }\r\n });\r\n }\r\n};\r\n\r\nconst onMessage = async (topic: string, message: Buffer): Promise<void> => {\r\n if (adapter) {\r\n 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 (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 }\r\n }\r\n\r\n // Check if device is an solarflow or hyper device. Don't use LowVoltageBlock on an ACE device?\r\n if (\r\n productName?.val?.toString().toLowerCase().includes(\"solarflow\") ||\r\n productName?.val?.toString().toLowerCase().includes(\"hyper\")\r\n ) {\r\n isSolarFlow = true;\r\n }\r\n\r\n // set lastUpdate for deviceKey\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"lastUpdate\",\r\n new Date().getTime()\r\n );\r\n\r\n if (\r\n obj.properties?.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\r\n if (\r\n obj.properties?.passMode != null &&\r\n obj.properties?.passMode != undefined\r\n ) {\r\n const value =\r\n obj.properties?.passMode == 0\r\n ? \"Automatic\"\r\n : obj.properties?.passMode == 1\r\n ? \"Always off\"\r\n : obj.properties?.passMode == 2\r\n ? \"Always on\"\r\n : \"Unknown\";\r\n updateSolarFlowState(adapter, productKey, deviceKey, \"passMode\", value);\r\n\r\n updateSolarFlowControlState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"passMode\",\r\n obj.properties?.passMode\r\n );\r\n }\r\n\r\n if (obj.properties?.pass != null && obj.properties?.pass != undefined) {\r\n const value = obj.properties?.pass == 0 ? false : true;\r\n\r\n updateSolarFlowState(adapter, productKey, deviceKey, \"pass\", value);\r\n }\r\n\r\n if (\r\n obj.properties?.autoRecover != null &&\r\n obj.properties?.autoRecover != undefined\r\n ) {\r\n const value = obj.properties?.autoRecover == 0 ? false : true;\r\n\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"autoRecover\",\r\n value\r\n );\r\n\r\n updateSolarFlowControlState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"autoRecover\",\r\n value\r\n );\r\n }\r\n\r\n if (\r\n obj.properties?.outputHomePower != null &&\r\n obj.properties?.outputHomePower != undefined\r\n ) {\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"outputHomePower\",\r\n obj.properties.outputHomePower\r\n );\r\n }\r\n\r\n if (\r\n obj.properties?.energyPower != null &&\r\n obj.properties?.energyPower != undefined\r\n ) {\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"energyPower\",\r\n obj.properties.energyPower\r\n );\r\n }\r\n\r\n if (\r\n obj.properties?.outputLimit != null &&\r\n obj.properties?.outputLimit != undefined\r\n ) {\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"outputLimit\",\r\n obj.properties.outputLimit\r\n );\r\n\r\n updateSolarFlowControlState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"setOutputLimit\",\r\n obj.properties.outputLimit\r\n );\r\n }\r\n\r\n if (\r\n obj.properties?.buzzerSwitch != null &&\r\n obj.properties?.buzzerSwitch != undefined\r\n ) {\r\n const value = obj.properties?.buzzerSwitch == 0 ? false : true;\r\n\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"buzzerSwitch\",\r\n value\r\n );\r\n\r\n updateSolarFlowControlState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"buzzerSwitch\",\r\n value\r\n );\r\n }\r\n\r\n if (\r\n obj.properties?.outputPackPower != null &&\r\n obj.properties?.outputPackPower != undefined\r\n ) {\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"outputPackPower\",\r\n obj.properties.outputPackPower\r\n );\r\n\r\n // if outPutPackPower set packInputPower to 0\r\n updateSolarFlowState(adapter, productKey, deviceKey, \"packInputPower\", 0);\r\n }\r\n\r\n if (\r\n obj.properties?.packInputPower != null &&\r\n obj.properties?.packInputPower != undefined\r\n ) {\r\n let standbyUsage = 0;\r\n\r\n // Aktuelle Solar-Power abfragen, wenn 0 Standby-Verbrauch dazu rechnen\r\n const solarInputPower = await adapter?.getStateAsync(\r\n `${productKey}.${deviceKey}.solarInputPower`\r\n );\r\n\r\n if (solarInputPower && Number(solarInputPower.val) < 10) {\r\n standbyUsage = 7 - Number(solarInputPower.val);\r\n }\r\n\r\n // Check if connected with Ace, if so add 10 Watt to standby usage!\r\n const device = adapter?.deviceList?.find(\r\n (x) => x.deviceKey == deviceKey && x.productKey == productKey\r\n );\r\n\r\n if (device && device._connectedWithAce) {\r\n standbyUsage += 7;\r\n }\r\n\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"packInputPower\",\r\n obj.properties.packInputPower + standbyUsage\r\n );\r\n\r\n // if packInputPower set outputPackPower to 0\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"outputPackPower\",\r\n 0\r\n );\r\n }\r\n\r\n if (\r\n obj.properties?.solarInputPower != null &&\r\n obj.properties?.solarInputPower != undefined\r\n ) {\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"solarInputPower\",\r\n obj.properties.solarInputPower\r\n );\r\n }\r\n\r\n if (\r\n obj.properties?.pvPower1 != null &&\r\n obj.properties?.pvPower1 != undefined\r\n ) {\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"pvPower2\", // Reversed to adjust like offical app\r\n obj.properties.pvPower1\r\n );\r\n }\r\n\r\n if (\r\n obj.properties?.pvPower2 != null &&\r\n obj.properties?.pvPower2 != undefined\r\n ) {\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"pvPower1\", // Reversed to adjust like offical app\r\n obj.properties.pvPower2\r\n );\r\n }\r\n\r\n if (\r\n obj.properties?.solarPower1 != null &&\r\n obj.properties?.solarPower1 != undefined\r\n ) {\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"pvPower1\",\r\n obj.properties.solarPower1\r\n );\r\n }\r\n\r\n if (\r\n obj.properties?.solarPower2 != null &&\r\n obj.properties?.solarPower2 != undefined\r\n ) {\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"pvPower2\",\r\n obj.properties.solarPower2\r\n );\r\n }\r\n\r\n if (\r\n obj.properties?.remainOutTime != null &&\r\n obj.properties?.remainOutTime != undefined\r\n ) {\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"remainOutTime\",\r\n obj.properties.remainOutTime\r\n );\r\n }\r\n\r\n if (\r\n obj.properties?.remainInputTime != null &&\r\n obj.properties?.remainInputTime != undefined\r\n ) {\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"remainInputTime\",\r\n obj.properties.remainInputTime\r\n );\r\n }\r\n\r\n if (obj.properties?.socSet != null && obj.properties?.socSet != undefined) {\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"socSet\",\r\n Number(obj.properties.socSet) / 10\r\n );\r\n\r\n updateSolarFlowControlState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"chargeLimit\",\r\n Number(obj.properties.socSet) / 10\r\n );\r\n }\r\n\r\n if (obj.properties?.minSoc != null && obj.properties?.minSoc != undefined) {\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"minSoc\",\r\n Number(obj.properties.minSoc) / 10\r\n );\r\n\r\n updateSolarFlowControlState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"dischargeLimit\",\r\n Number(obj.properties.minSoc) / 10\r\n );\r\n }\r\n\r\n if (\r\n obj.properties?.inputLimit != null &&\r\n obj.properties?.inputLimit != undefined\r\n ) {\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"inputLimit\",\r\n obj.properties.inputLimit\r\n );\r\n\r\n 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) {\r\n let type = \"solarflow\";\r\n const _productName = productName?.val?.toString();\r\n\r\n if (_productName?.toLowerCase().includes(\"hyper\")) {\r\n type = \"hyper\";\r\n } else if (_productName?.toLowerCase().includes(\"ace\")) {\r\n type = \"ace\";\r\n } else if (_productName?.toLowerCase().includes(\"aio\")) {\r\n type = \"aio\";\r\n } else if (_productName?.toLowerCase().includes(\"smart plug\")) {\r\n type = \"smartPlug\";\r\n }\r\n\r\n const states = getStateDefinition(type);\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 console.log(\r\n `${productName?.val}: ${key} with value ${value} is a UNKNOWN Mqtt Prop!`\r\n );\r\n }\r\n });\r\n } */\r\n }\r\n};\r\n\r\nexport const 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 <= 2) {\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 } else {\r\n adapter.log.error(`[setAcMode] AC mode must be a value between 0 and 2!`);\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 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\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 const productName = (\r\n await adapter.getStateAsync(productKey + \".\" + deviceKey + \".productName\")\r\n )?.val\r\n ?.toString()\r\n .toLowerCase();\r\n\r\n if (currentLimit != null && currentLimit != undefined) {\r\n if (currentLimit != limit) {\r\n if (\r\n limit < 100 &&\r\n limit != 90 &&\r\n limit != 60 &&\r\n limit != 30 &&\r\n limit != 0\r\n ) {\r\n // NUR Solarflow HUB: Das Limit kann unter 100 nur in 30er Schritten gesetzt werden, dH. 30/60/90/100, wir rechnen das also um\r\n if (limit < 100 && limit > 90 && !productName?.includes(\"hyper\")) {\r\n limit = 90;\r\n } else if (\r\n limit > 60 &&\r\n limit < 90 &&\r\n !productName?.includes(\"hyper\")\r\n ) {\r\n limit = 60;\r\n } else if (\r\n limit > 30 &&\r\n limit < 60 &&\r\n !productName?.includes(\"hyper\")\r\n ) {\r\n limit = 30;\r\n } else if (limit < 30) {\r\n limit = 30;\r\n }\r\n }\r\n\r\n if (limit > 1200) {\r\n limit = 1200;\r\n }\r\n\r\n const topic = `iot/${productKey}/${deviceKey}/properties/write`;\r\n\r\n const outputlimit = { properties: { outputLimit: limit } };\r\n adapter.mqttClient?.publish(topic, JSON.stringify(outputlimit));\r\n }\r\n }\r\n }\r\n};\r\n\r\nexport const setInputLimit = async (\r\n adapter: ZendureSolarflow,\r\n productKey: string,\r\n deviceKey: string,\r\n limit: number\r\n): Promise<void> => {\r\n if (adapter.mqttClient && productKey && deviceKey) {\r\n if (limit) {\r\n limit = Math.round(limit);\r\n } else {\r\n limit = 0;\r\n }\r\n\r\n let maxLimit = 900;\r\n const currentLimit = (\r\n await adapter.getStateAsync(productKey + \".\" + deviceKey + \".inputLimit\")\r\n )?.val;\r\n\r\n const productName = (\r\n await adapter.getStateAsync(productKey + \".\" + deviceKey + \".productName\")\r\n )?.val\r\n ?.toString()\r\n .toLowerCase();\r\n\r\n if (productName?.includes(\"hyper\")) {\r\n maxLimit = 1200;\r\n }\r\n\r\n if (productName?.includes(\"ace\")) {\r\n // Das Limit kann nur in 100er Schritten gesetzt werden\r\n limit = Math.ceil(limit / 100) * 100;\r\n }\r\n\r\n if (limit < 0) {\r\n limit = 0;\r\n } else if (limit > 0 && limit <= 30) {\r\n limit = 30;\r\n } else if (limit > maxLimit) {\r\n limit = maxLimit;\r\n }\r\n\r\n if (currentLimit != null && currentLimit != undefined) {\r\n if (currentLimit != limit) {\r\n const topic = `iot/${productKey}/${deviceKey}/properties/write`;\r\n\r\n const inputLimitContent = { properties: { inputLimit: limit } };\r\n adapter.mqttClient?.publish(topic, JSON.stringify(inputLimitContent));\r\n }\r\n }\r\n }\r\n};\r\n\r\nexport const setBuzzerSwitch = async (\r\n adapter: ZendureSolarflow,\r\n productKey: string,\r\n deviceKey: string,\r\n buzzerOn: boolean\r\n): Promise<void> => {\r\n if (adapter.mqttClient && productKey && deviceKey) {\r\n const topic = `iot/${productKey}/${deviceKey}/properties/write`;\r\n\r\n const 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 const setAutoModelContent = { properties: { autoModel: autoModel } };\r\n adapter.log.debug(\r\n `[setBuzzer] 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.localDevice1ProductKey,\r\n adapter.config.localDevice1DeviceKey,\r\n 2000\r\n );\r\n\r\n subscribeIotTopic(\r\n adapter.config.localDevice1ProductKey,\r\n adapter.config.localDevice1DeviceKey,\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
|
+
"names": ["adapter", "setAcMode", "_a"]
|
|
7
7
|
}
|
package/io-package.json
CHANGED
|
@@ -1,20 +1,33 @@
|
|
|
1
1
|
{
|
|
2
2
|
"common": {
|
|
3
3
|
"name": "zendure-solarflow",
|
|
4
|
-
"version": "1.12.
|
|
4
|
+
"version": "1.12.1",
|
|
5
5
|
"news": {
|
|
6
|
-
"1.12.
|
|
7
|
-
"en": "
|
|
8
|
-
"de": "
|
|
9
|
-
"ru": "
|
|
10
|
-
"pt": "
|
|
11
|
-
"nl": "
|
|
12
|
-
"fr": "
|
|
13
|
-
"it": "
|
|
14
|
-
"es": "
|
|
15
|
-
"pl": "
|
|
16
|
-
"uk": "
|
|
17
|
-
"zh-cn": "
|
|
6
|
+
"1.12.1": {
|
|
7
|
+
"en": "Fix IOT subscription",
|
|
8
|
+
"de": "IOT-Abonnement festsetzen",
|
|
9
|
+
"ru": "Исправить подписку IOT",
|
|
10
|
+
"pt": "Corrigir assinatura IOT",
|
|
11
|
+
"nl": "IOT-abonnement repareren",
|
|
12
|
+
"fr": "Correction de l'abonnement IOT",
|
|
13
|
+
"it": "Fissa l'abbonamento IOT",
|
|
14
|
+
"es": "Suscripción fija IOT",
|
|
15
|
+
"pl": "Napraw subskrypcję IOT",
|
|
16
|
+
"uk": "Виправлення підписки IOT",
|
|
17
|
+
"zh-cn": "修复IOT订阅"
|
|
18
|
+
},
|
|
19
|
+
"1.12.0": {
|
|
20
|
+
"en": "Added possibility to use \"local\" mode. You have to either route dns request to your own MQTT server or use a tool to modify the Zendure device\nSome improvements on value calculation\nSome improvements on AIO 2400 device",
|
|
21
|
+
"de": "Zusätzliche Möglichkeit, \"lokal\" Modus zu verwenden. Sie müssen entweder Route dns Anfrage an Ihren eigenen MQTT-Server oder verwenden Sie ein Tool, um das Zendure-Gerät zu ändern\nEinige Verbesserungen bei der Wertberechnung\nEinige Verbesserungen am AIO 2400 Gerät",
|
|
22
|
+
"ru": "Добавлена возможность использования «местного» режима. Вы должны либо направить запрос DNS на свой собственный сервер MQTT, либо использовать инструмент для изменения устройства Zendure\nНекоторые улучшения в расчете стоимости\nНекоторые улучшения в устройстве AIO 2400",
|
|
23
|
+
"pt": "Adicionado possibilidade de usar o modo \"local\". Você tem que direcionar dns solicitar ao seu próprio servidor MQTT ou usar uma ferramenta para modificar o dispositivo Zendure\nAlgumas melhorias no cálculo do valor\nAlgumas melhorias no dispositivo AIO 2400",
|
|
24
|
+
"nl": "Toegevoegde mogelijkheid om \"lokale\" modus te gebruiken. U moet een dns-verzoek naar uw eigen MQTT-server routeren of een hulpmiddel gebruiken om het Zendure-apparaat te wijzigen\nEnkele verbeteringen in waardeberekening\nEnkele verbeteringen op AIO 2400 apparaat",
|
|
25
|
+
"fr": "Possibilité d'utiliser le mode \"local\". Vous devez soit router dns demander à votre propre serveur MQTT ou utiliser un outil pour modifier le périphérique Zendure\nQuelques améliorations dans le calcul de la valeur\nQuelques améliorations sur le périphérique AIO 2400",
|
|
26
|
+
"it": "Aggiunta possibilità di usare la modalità \"locale\". È necessario che il dns di route richieda al proprio server MQTT o utilizzi uno strumento per modificare il dispositivo Zendure\nAlcuni miglioramenti sul calcolo del valore\nAlcuni miglioramenti sul dispositivo AIO 2400",
|
|
27
|
+
"es": "Se agregó la posibilidad de usar el modo \"local\". Usted tiene que solicitar a su propio servidor MQTT o utilizar una herramienta para modificar el dispositivo Zendure\nAlgunas mejoras en el cálculo del valor\nAlgunas mejoras en el dispositivo AIO 2400",
|
|
28
|
+
"pl": "Dodano możliwość użycia trybu \"lokalnego\". Musisz albo zwrócić się z prośbą do własnego serwera MQTT, albo użyć narzędzia do modyfikacji urządzenia Zhamb\nPewne ulepszenia w zakresie obliczania wartości\nNiektóre ulepszenia na urządzeniu AIO 2400",
|
|
29
|
+
"uk": "Додана можливість використання \"локального\" режиму. Щоб змінити пристрій Zendure\nДеякі поліпшення розрахунку вартості\nДеякі удосконалення на пристрої AIO 2400",
|
|
30
|
+
"zh-cn": "添加了使用\"本地\"模式的可能性. 您需要向自己的 MQTT 服务器请求路由 dns 或使用工具修改 Zendure 设备\n价值计算方面的一些改进\nAIO 2400设备的一些改进"
|
|
18
31
|
},
|
|
19
32
|
"1.11.0": {
|
|
20
33
|
"en": "Drop Standby usage to 7W and 14W if HUB connected with ACE as it is more accurate\nAdded heatState and autoModel (system operation mode) state\nAdded possibility to set the operation mode (autoModel)\nFix gridPower state",
|
|
@@ -80,19 +93,6 @@
|
|
|
80
93
|
"pl": "Napraw stan \"Grid Input Power\" w przypadku połączenia z Asem",
|
|
81
94
|
"uk": "Фіксація \"Грідка вхідна потужність\" при підключенні з Ace",
|
|
82
95
|
"zh-cn": "如果与 Ace 连接, 则修正“ Grid 输入功率” 状态"
|
|
83
|
-
},
|
|
84
|
-
"1.10.3": {
|
|
85
|
-
"en": "Fix \"Grid Input Power\" state if connected with Ace",
|
|
86
|
-
"de": "Fix \"Grid Input Power\" Zustand, wenn mit Ace verbunden",
|
|
87
|
-
"ru": "Fix \"Grid Input Power\" в случае подключения к Ace",
|
|
88
|
-
"pt": "Fix \"Grid Input Power\" estado se conectado com Ace",
|
|
89
|
-
"nl": "Fix \"Grid Input Power\" status indien verbonden met Ace",
|
|
90
|
-
"fr": "Correction de l'état \"Grid Input Power\" si connecté avec Ace",
|
|
91
|
-
"it": "Fissare lo stato \"Grid Input Power\" se collegato con Ace",
|
|
92
|
-
"es": "Fijar el estado de \"Grid Input Power\" si está conectado con Ace",
|
|
93
|
-
"pl": "Napraw stan \"Grid Input Power\" w przypadku połączenia z Asem",
|
|
94
|
-
"uk": "Фіксація \"Грідка вхідна потужність\" при підключенні з Ace",
|
|
95
|
-
"zh-cn": "如果与 Ace 连接, 则修正“ Grid 输入功率” 状态"
|
|
96
96
|
}
|
|
97
97
|
},
|
|
98
98
|
"titleLang": {
|
|
@@ -155,7 +155,7 @@
|
|
|
155
155
|
],
|
|
156
156
|
"globalDependencies": [
|
|
157
157
|
{
|
|
158
|
-
"admin": ">=
|
|
158
|
+
"admin": ">=6.0.0"
|
|
159
159
|
}
|
|
160
160
|
]
|
|
161
161
|
},
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "iobroker.zendure-solarflow",
|
|
3
|
-
"version": "1.12.
|
|
3
|
+
"version": "1.12.1",
|
|
4
4
|
"description": "zendure-solarflow",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Peter",
|
|
@@ -21,17 +21,17 @@
|
|
|
21
21
|
"node": ">= 18"
|
|
22
22
|
},
|
|
23
23
|
"dependencies": {
|
|
24
|
-
"@iobroker/adapter-core": "^3.2.
|
|
24
|
+
"@iobroker/adapter-core": "^3.2.3",
|
|
25
25
|
"@types/node-schedule": "^2.1.6",
|
|
26
26
|
"axios": "^1.5.1",
|
|
27
27
|
"mqtt": "^5.1.3"
|
|
28
28
|
},
|
|
29
29
|
"devDependencies": {
|
|
30
|
-
"@alcalzone/release-script": "^3.
|
|
30
|
+
"@alcalzone/release-script": "^3.8.0",
|
|
31
31
|
"@alcalzone/release-script-plugin-iobroker": "^3.6.0",
|
|
32
32
|
"@alcalzone/release-script-plugin-license": "^3.5.9",
|
|
33
33
|
"@alcalzone/release-script-plugin-manual-review": "^3.5.9",
|
|
34
|
-
"@iobroker/adapter-dev": "^1.
|
|
34
|
+
"@iobroker/adapter-dev": "^1.3.0",
|
|
35
35
|
"@iobroker/adapter-react": "^2.2.4",
|
|
36
36
|
"@iobroker/testing": "^4.1.3",
|
|
37
37
|
"@material-ui/core": "^4.12.4",
|