iobroker.zendure-solarflow 1.3.0 → 1.3.1-alpha.5

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.
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/services/calculationService.ts"],
4
- "sourcesContent": ["/* eslint-disable @typescript-eslint/indent */\r\n\r\nimport { toHoursAndMinutes } from \"../helpers/timeHelper\";\r\nimport { ZendureSolarflow } from \"../main\";\r\nimport { ISolarFlowDeviceDetails } from \"../models/ISolarFlowDeviceDetails\";\r\n\r\nconst calculationStateKeys = [\r\n \"packInput\",\r\n \"outputHome\",\r\n \"outputPack\",\r\n \"solarInput\",\r\n];\r\n\r\nexport const setEnergyWhMax = async (\r\n adapter: ZendureSolarflow,\r\n productKey: string,\r\n deviceKey: string,\r\n): Promise<void> => {\r\n const currentEnergyState = await adapter?.getStateAsync(\r\n productKey + \".\" + deviceKey + \".calculations.energyWh\",\r\n );\r\n\r\n if (currentEnergyState) {\r\n await adapter?.setStateAsync(\r\n `${productKey}.${deviceKey}.calculations.energyWhMax`,\r\n currentEnergyState?.val,\r\n true,\r\n );\r\n }\r\n};\r\n\r\nexport const calculateSocAndEnergy = async (\r\n adapter: ZendureSolarflow,\r\n productKey: string,\r\n deviceKey: string,\r\n stateKey: string,\r\n value: number,\r\n): Promise<void> => {\r\n const currentEnergyState = await adapter?.getStateAsync(\r\n productKey + \".\" + deviceKey + \".calculations.energyWh\",\r\n );\r\n\r\n const currentEnergyMaxState = await adapter?.getStateAsync(\r\n productKey + \".\" + deviceKey + \".calculations.energyWhMax\",\r\n );\r\n\r\n const currentValue = currentEnergyState?.val\r\n ? Number(currentEnergyState?.val)\r\n : 0;\r\n\r\n const newValue =\r\n stateKey == \"outputPack\" ? currentValue + value : currentValue - value;\r\n\r\n if (newValue > 0) {\r\n adapter?.setState(\r\n `${productKey}.${deviceKey}.calculations.energyWh`,\r\n newValue,\r\n true,\r\n );\r\n\r\n if (currentEnergyMaxState) {\r\n const soc = Number(\r\n ((newValue / Number(currentEnergyMaxState.val)) * 100).toFixed(1),\r\n );\r\n\r\n await adapter?.setStateAsync(\r\n `${productKey}.${deviceKey}.calculations.soc`,\r\n soc > 100.0 ? 100 : soc,\r\n true,\r\n );\r\n\r\n if (newValue > Number(currentEnergyMaxState.val)) {\r\n // Extend maxVal\r\n await adapter?.setStateAsync(\r\n `${productKey}.${deviceKey}.calculations.energyWhMax`,\r\n newValue,\r\n true,\r\n );\r\n }\r\n\r\n const currentOutputPackPower = await adapter?.getStateAsync(\r\n `${productKey}.${deviceKey}.outputPackPower`,\r\n );\r\n\r\n const currentPackInputPower = await adapter?.getStateAsync(\r\n productKey + \".\" + deviceKey + \".packInputPower\",\r\n );\r\n\r\n if (stateKey == \"outputPack\" && currentOutputPackPower?.val != null && currentOutputPackPower != undefined) {\r\n // Charging, calculate remaining charging time\r\n const toCharge = Number(currentEnergyMaxState.val) - newValue;\r\n\r\n const remainHoursAsDecimal = toCharge / Number(currentOutputPackPower.val);\r\n\r\n if (remainHoursAsDecimal < 10.0) {\r\n const remainFormatted = toHoursAndMinutes(Math.round(remainHoursAsDecimal * 60));\r\n\r\n await adapter?.setStateAsync(\r\n `${productKey}.${deviceKey}.calculations.remainInputTime`,\r\n remainFormatted,\r\n true,\r\n );\r\n }\r\n else {\r\n await adapter?.setStateAsync(\r\n `${productKey}.${deviceKey}.calculations.remainInputTime`,\r\n \"-\",\r\n true,\r\n );\r\n }\r\n } else if (stateKey == \"packInput\" && currentPackInputPower != null && currentPackInputPower != undefined) {\r\n // Discharging, calculate remaining discharge time\r\n const remainHoursAsDecimal = newValue / Number(currentPackInputPower.val);\r\n const remainFormatted = toHoursAndMinutes(Math.round(remainHoursAsDecimal * 60));\r\n\r\n if (remainHoursAsDecimal < 40.0) {\r\n await adapter?.setStateAsync(\r\n `${productKey}.${deviceKey}.calculations.remainOutTime`,\r\n remainFormatted,\r\n true,\r\n );\r\n }\r\n else {\r\n await adapter?.setStateAsync(\r\n `${productKey}.${deviceKey}.calculations.remainOutTime`,\r\n \"-\",\r\n true,\r\n );\r\n }\r\n }\r\n } else {\r\n await adapter?.setStateAsync(\r\n `${productKey}.${deviceKey}.calculations.energyWhMax`,\r\n newValue,\r\n true,\r\n );\r\n }\r\n }\r\n};\r\n\r\nexport const calculateEnergy = async (\r\n adapter: ZendureSolarflow,\r\n productKey: string,\r\n deviceKey: string,\r\n): Promise<void> => {\r\n calculationStateKeys.forEach(async (stateKey) => {\r\n const stateNameEnergyWh = `${productKey}.${deviceKey}.calculations.${stateKey}EnergyTodayWh`;\r\n const stateNameEnergykWh = `${productKey}.${deviceKey}.calculations.${stateKey}EnergyTodaykWh`;\r\n const stateNamePower = `${productKey}.${deviceKey}.${stateKey}Power`;\r\n\r\n const currentPowerState = await adapter?.getStateAsync(stateNamePower);\r\n const currentEnergyState = await adapter?.getStateAsync(stateNameEnergyWh);\r\n\r\n if (currentEnergyState?.val == 0) {\r\n // Workaround, set Val to very low value to avoid Jump in data...\r\n await adapter?.setStateAsync(stateNameEnergyWh, 0.000001, true);\r\n } else if (\r\n currentEnergyState &&\r\n currentEnergyState.lc &&\r\n currentPowerState &&\r\n currentPowerState.val != undefined &&\r\n currentPowerState.val != null\r\n ) {\r\n // Timeframe = 30000ms, Job runs every 30 seconds...\r\n const timeFrame = 30000;\r\n\r\n // Calculate Energy value (Wh) from current power in the timeframe from last run...\r\n let addEnergyValue =\r\n (Number(currentPowerState.val) * timeFrame) / 3600000; // Wh\r\n\r\n // Use efficiency factor (used the one from Youtube Channel VoltAmpereLux - thanks!)\r\n const chargingFactor = 0.96; // Efficiency 96%\r\n const dischargingFactor = 1.08 - addEnergyValue / 10000; // Efficiency 92% - 98% (92% + Energy / 10000 = 600W -> +6%)\r\n\r\n // Calculate energy from efficiency factor if value for charging or discharging\r\n addEnergyValue =\r\n stateKey == \"outputPack\" && addEnergyValue > 0\r\n ? addEnergyValue * chargingFactor\r\n : addEnergyValue;\r\n addEnergyValue =\r\n stateKey == \"packInput\" && addEnergyValue > 0\r\n ? addEnergyValue * dischargingFactor\r\n : addEnergyValue;\r\n\r\n let newEnergyValue = Number(currentEnergyState.val) + addEnergyValue;\r\n\r\n // Fix negative value\r\n if (newEnergyValue < 0) {\r\n newEnergyValue = 0;\r\n }\r\n\r\n await adapter?.setStateAsync(stateNameEnergyWh, newEnergyValue, true);\r\n await adapter?.setStateAsync(\r\n stateNameEnergykWh,\r\n Number((newEnergyValue / 1000).toFixed(2)),\r\n true,\r\n );\r\n\r\n // SOC and energy in batteries\r\n if (\r\n (stateKey == \"outputPack\" || stateKey == \"packInput\") &&\r\n addEnergyValue > 0\r\n ) {\r\n await calculateSocAndEnergy(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n stateKey,\r\n addEnergyValue,\r\n );\r\n }\r\n } else {\r\n await adapter?.setStateAsync(stateNameEnergyWh, 0, true);\r\n await adapter?.setStateAsync(stateNameEnergykWh, 0, true);\r\n }\r\n });\r\n};\r\n\r\nexport const resetTodaysValues = async (\r\n adapter: ZendureSolarflow,\r\n): Promise<void> => {\r\n adapter.deviceList.forEach((device: ISolarFlowDeviceDetails) => {\r\n calculationStateKeys.forEach(async (stateKey: string) => {\r\n const stateNameEnergyWh = `${device.productKey}.${device.deviceKey}.calculations.${stateKey}EnergyTodayWh`;\r\n const stateNameEnergykWh = `${device.productKey}.${device.deviceKey}.calculations.${stateKey}EnergyTodaykWh`;\r\n\r\n await adapter?.setStateAsync(stateNameEnergyWh, 0, true);\r\n await adapter?.setStateAsync(stateNameEnergykWh, 0, true);\r\n });\r\n });\r\n};\r\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAEA,wBAAkC;AAIlC,MAAM,uBAAuB;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEO,MAAM,iBAAiB,OAC5B,SACA,YACA,cACkB;AAClB,QAAM,qBAAqB,OAAM,mCAAS;AAAA,IACxC,aAAa,MAAM,YAAY;AAAA;AAGjC,MAAI,oBAAoB;AACtB,WAAM,mCAAS;AAAA,MACb,GAAG,UAAU,IAAI,SAAS;AAAA,MAC1B,yDAAoB;AAAA,MACpB;AAAA;AAAA,EAEJ;AACF;AAEO,MAAM,wBAAwB,OACnC,SACA,YACA,WACA,UACA,UACkB;AAClB,QAAM,qBAAqB,OAAM,mCAAS;AAAA,IACxC,aAAa,MAAM,YAAY;AAAA;AAGjC,QAAM,wBAAwB,OAAM,mCAAS;AAAA,IAC3C,aAAa,MAAM,YAAY;AAAA;AAGjC,QAAM,gBAAe,yDAAoB,OACrC,OAAO,yDAAoB,GAAG,IAC9B;AAEJ,QAAM,WACJ,YAAY,eAAe,eAAe,QAAQ,eAAe;AAEnE,MAAI,WAAW,GAAG;AAChB,uCAAS;AAAA,MACP,GAAG,UAAU,IAAI,SAAS;AAAA,MAC1B;AAAA,MACA;AAAA;AAGF,QAAI,uBAAuB;AACzB,YAAM,MAAM;AAAA,SACR,WAAW,OAAO,sBAAsB,GAAG,IAAK,KAAK,QAAQ,CAAC;AAAA,MAClE;AAEA,aAAM,mCAAS;AAAA,QACb,GAAG,UAAU,IAAI,SAAS;AAAA,QAC1B,MAAM,MAAQ,MAAM;AAAA,QACpB;AAAA;AAGF,UAAI,WAAW,OAAO,sBAAsB,GAAG,GAAG;AAEhD,eAAM,mCAAS;AAAA,UACb,GAAG,UAAU,IAAI,SAAS;AAAA,UAC1B;AAAA,UACA;AAAA;AAAA,MAEJ;AAEA,YAAM,yBAAyB,OAAM,mCAAS;AAAA,QAC5C,GAAG,UAAU,IAAI,SAAS;AAAA;AAG5B,YAAM,wBAAwB,OAAM,mCAAS;AAAA,QAC3C,aAAa,MAAM,YAAY;AAAA;AAGjC,UAAI,YAAY,iBAAgB,iEAAwB,QAAO,QAAQ,0BAA0B,QAAW;AAE1G,cAAM,WAAW,OAAO,sBAAsB,GAAG,IAAI;AAErD,cAAM,uBAAuB,WAAW,OAAO,uBAAuB,GAAG;AAEzE,YAAI,uBAAuB,IAAM;AAC/B,gBAAM,sBAAkB,qCAAkB,KAAK,MAAM,uBAAuB,EAAE,CAAC;AAE/E,iBAAM,mCAAS;AAAA,YACb,GAAG,UAAU,IAAI,SAAS;AAAA,YAC1B;AAAA,YACA;AAAA;AAAA,QAEJ,OACK;AACH,iBAAM,mCAAS;AAAA,YACb,GAAG,UAAU,IAAI,SAAS;AAAA,YAC1B;AAAA,YACA;AAAA;AAAA,QAEJ;AAAA,MACF,WAAW,YAAY,eAAe,yBAAyB,QAAQ,yBAAyB,QAAW;AAEzG,cAAM,uBAAuB,WAAW,OAAO,sBAAsB,GAAG;AACxE,cAAM,sBAAkB,qCAAkB,KAAK,MAAM,uBAAuB,EAAE,CAAC;AAE/E,YAAI,uBAAuB,IAAM;AAC/B,iBAAM,mCAAS;AAAA,YACb,GAAG,UAAU,IAAI,SAAS;AAAA,YAC1B;AAAA,YACA;AAAA;AAAA,QAEJ,OACK;AACH,iBAAM,mCAAS;AAAA,YACb,GAAG,UAAU,IAAI,SAAS;AAAA,YAC1B;AAAA,YACA;AAAA;AAAA,QAEJ;AAAA,MACF;AAAA,IACF,OAAO;AACL,aAAM,mCAAS;AAAA,QACb,GAAG,UAAU,IAAI,SAAS;AAAA,QAC1B;AAAA,QACA;AAAA;AAAA,IAEJ;AAAA,EACF;AACF;AAEO,MAAM,kBAAkB,OAC7B,SACA,YACA,cACkB;AAClB,uBAAqB,QAAQ,OAAO,aAAa;AAC/C,UAAM,oBAAoB,GAAG,UAAU,IAAI,SAAS,iBAAiB,QAAQ;AAC7E,UAAM,qBAAqB,GAAG,UAAU,IAAI,SAAS,iBAAiB,QAAQ;AAC9E,UAAM,iBAAiB,GAAG,UAAU,IAAI,SAAS,IAAI,QAAQ;AAE7D,UAAM,oBAAoB,OAAM,mCAAS,cAAc;AACvD,UAAM,qBAAqB,OAAM,mCAAS,cAAc;AAExD,SAAI,yDAAoB,QAAO,GAAG;AAEhC,aAAM,mCAAS,cAAc,mBAAmB,MAAU;AAAA,IAC5D,WACE,sBACA,mBAAmB,MACnB,qBACA,kBAAkB,OAAO,UACzB,kBAAkB,OAAO,MACzB;AAEA,YAAM,YAAY;AAGlB,UAAI,iBACD,OAAO,kBAAkB,GAAG,IAAI,YAAa;AAGhD,YAAM,iBAAiB;AACvB,YAAM,oBAAoB,OAAO,iBAAiB;AAGlD,uBACE,YAAY,gBAAgB,iBAAiB,IACzC,iBAAiB,iBACjB;AACN,uBACE,YAAY,eAAe,iBAAiB,IACxC,iBAAiB,oBACjB;AAEN,UAAI,iBAAiB,OAAO,mBAAmB,GAAG,IAAI;AAGtD,UAAI,iBAAiB,GAAG;AACtB,yBAAiB;AAAA,MACnB;AAEA,aAAM,mCAAS,cAAc,mBAAmB,gBAAgB;AAChE,aAAM,mCAAS;AAAA,QACb;AAAA,QACA,QAAQ,iBAAiB,KAAM,QAAQ,CAAC,CAAC;AAAA,QACzC;AAAA;AAIF,WACG,YAAY,gBAAgB,YAAY,gBACzC,iBAAiB,GACjB;AACA,cAAM;AAAA,UACJ;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,IACF,OAAO;AACL,aAAM,mCAAS,cAAc,mBAAmB,GAAG;AACnD,aAAM,mCAAS,cAAc,oBAAoB,GAAG;AAAA,IACtD;AAAA,EACF,CAAC;AACH;AAEO,MAAM,oBAAoB,OAC/B,YACkB;AAClB,UAAQ,WAAW,QAAQ,CAAC,WAAoC;AAC9D,yBAAqB,QAAQ,OAAO,aAAqB;AACvD,YAAM,oBAAoB,GAAG,OAAO,UAAU,IAAI,OAAO,SAAS,iBAAiB,QAAQ;AAC3F,YAAM,qBAAqB,GAAG,OAAO,UAAU,IAAI,OAAO,SAAS,iBAAiB,QAAQ;AAE5F,aAAM,mCAAS,cAAc,mBAAmB,GAAG;AACnD,aAAM,mCAAS,cAAc,oBAAoB,GAAG;AAAA,IACtD,CAAC;AAAA,EACH,CAAC;AACH;",
4
+ "sourcesContent": ["/* eslint-disable @typescript-eslint/indent */\r\n\r\nimport { toHoursAndMinutes } from \"../helpers/timeHelper\";\r\nimport { ZendureSolarflow } from \"../main\";\r\nimport { ISolarFlowDeviceDetails } from \"../models/ISolarFlowDeviceDetails\";\r\n\r\nconst calculationStateKeys = [\r\n \"packInput\",\r\n \"outputHome\",\r\n \"outputPack\",\r\n \"solarInput\",\r\n \"pvPower1\",\r\n \"pvPower2\"\r\n];\r\n\r\nexport const setEnergyWhMax = async (\r\n adapter: ZendureSolarflow,\r\n productKey: string,\r\n deviceKey: string,\r\n): Promise<void> => {\r\n const currentEnergyState = await adapter?.getStateAsync(\r\n productKey + \".\" + deviceKey + \".calculations.energyWh\",\r\n );\r\n\r\n if (currentEnergyState) {\r\n await adapter?.setStateAsync(\r\n `${productKey}.${deviceKey}.calculations.energyWhMax`,\r\n currentEnergyState?.val,\r\n true,\r\n );\r\n }\r\n};\r\n\r\nexport const setSocToZero = async (\r\n adapter: ZendureSolarflow,\r\n productKey: string,\r\n deviceKey: string,\r\n ): Promise<void> => {\r\n // Set SOC to 0\r\n await adapter?.setStateAsync(\r\n `${productKey}.${deviceKey}.calculations.soc`,\r\n 0,\r\n true,\r\n );\r\n\r\n // Calculate new Wh Max Value\r\n const energyWhState = await adapter.getStateAsync(\r\n `${productKey}.${deviceKey}.calculations.energyWh`,\r\n );\r\n const energyWhMaxState = await adapter.getStateAsync(\r\n `${productKey}.${deviceKey}.calculations.energyWhMax`,\r\n );\r\n\r\n const newMax = Number(energyWhMaxState?.val) - Number(energyWhState?.val);\r\n\r\n // Set Max Energy to value minus current energy\r\n await adapter?.setStateAsync(\r\n `${productKey}.${deviceKey}.calculations.energyWhMax`,\r\n newMax,\r\n true,\r\n );\r\n\r\n // Set Energy in Battery to 0\r\n await adapter?.setStateAsync(\r\n `${productKey}.${deviceKey}.calculations.energyWh`,\r\n 0,\r\n true,\r\n );\r\n}\r\n\r\nexport const calculateSocAndEnergy = async (\r\n adapter: ZendureSolarflow,\r\n productKey: string,\r\n deviceKey: string,\r\n stateKey: string,\r\n value: number,\r\n): Promise<void> => {\r\n const currentEnergyState = await adapter?.getStateAsync(\r\n productKey + \".\" + deviceKey + \".calculations.energyWh\",\r\n );\r\n\r\n const currentEnergyMaxState = await adapter?.getStateAsync(\r\n productKey + \".\" + deviceKey + \".calculations.energyWhMax\",\r\n );\r\n\r\n const currentValue = currentEnergyState?.val\r\n ? Number(currentEnergyState?.val)\r\n : 0;\r\n\r\n const newValue =\r\n stateKey == \"outputPack\" ? currentValue + value : currentValue - value;\r\n\r\n if (newValue > 0) {\r\n adapter?.setState(\r\n `${productKey}.${deviceKey}.calculations.energyWh`,\r\n newValue,\r\n true,\r\n );\r\n\r\n if (currentEnergyMaxState) {\r\n const soc = Number(\r\n ((newValue / Number(currentEnergyMaxState.val)) * 100).toFixed(1),\r\n );\r\n\r\n await adapter?.setStateAsync(\r\n `${productKey}.${deviceKey}.calculations.soc`,\r\n soc > 100.0 ? 100 : soc,\r\n true,\r\n );\r\n\r\n if (newValue > Number(currentEnergyMaxState.val)) {\r\n // Extend maxVal\r\n await adapter?.setStateAsync(\r\n `${productKey}.${deviceKey}.calculations.energyWhMax`,\r\n newValue,\r\n true,\r\n );\r\n }\r\n\r\n const currentOutputPackPower = await adapter?.getStateAsync(\r\n `${productKey}.${deviceKey}.outputPackPower`,\r\n );\r\n\r\n const currentPackInputPower = await adapter?.getStateAsync(\r\n productKey + \".\" + deviceKey + \".packInputPower\",\r\n );\r\n\r\n if (stateKey == \"outputPack\" && currentOutputPackPower?.val != null && currentOutputPackPower != undefined) {\r\n // Charging, calculate remaining charging time\r\n const toCharge = Number(currentEnergyMaxState.val) - newValue;\r\n\r\n const remainHoursAsDecimal = toCharge / Number(currentOutputPackPower.val);\r\n\r\n if (remainHoursAsDecimal < 24.0) {\r\n const remainFormatted = toHoursAndMinutes(Math.round(remainHoursAsDecimal * 60));\r\n\r\n await adapter?.setStateAsync(\r\n `${productKey}.${deviceKey}.calculations.remainInputTime`,\r\n remainFormatted,\r\n true,\r\n );\r\n }\r\n else {\r\n await adapter?.setStateAsync(\r\n `${productKey}.${deviceKey}.calculations.remainInputTime`,\r\n \"\",\r\n true,\r\n );\r\n }\r\n } else if (stateKey == \"packInput\" && currentPackInputPower != null && currentPackInputPower != undefined) {\r\n // Discharging, calculate remaining discharge time\r\n const remainHoursAsDecimal = newValue / Number(currentPackInputPower.val);\r\n const remainFormatted = toHoursAndMinutes(Math.round(remainHoursAsDecimal * 60));\r\n\r\n if (remainHoursAsDecimal < 48.0) {\r\n await adapter?.setStateAsync(\r\n `${productKey}.${deviceKey}.calculations.remainOutTime`,\r\n remainFormatted,\r\n true,\r\n );\r\n }\r\n else {\r\n await adapter?.setStateAsync(\r\n `${productKey}.${deviceKey}.calculations.remainOutTime`,\r\n \"\",\r\n true,\r\n );\r\n }\r\n }\r\n } else {\r\n await adapter?.setStateAsync(\r\n `${productKey}.${deviceKey}.calculations.energyWhMax`,\r\n newValue,\r\n true,\r\n );\r\n }\r\n }\r\n else if (newValue == 0 && stateKey == \"outputPack\") {\r\n await adapter?.setStateAsync(\r\n `${productKey}.${deviceKey}.calculations.remainInputTime`,\r\n \"\",\r\n true,\r\n );\r\n }\r\n else if (newValue == 0 && stateKey == \"packInput\") {\r\n await adapter?.setStateAsync(\r\n `${productKey}.${deviceKey}.calculations.remainOutTime`,\r\n \"\",\r\n true,\r\n );\r\n }\r\n};\r\n\r\nexport const calculateEnergy = async (\r\n adapter: ZendureSolarflow,\r\n productKey: string,\r\n deviceKey: string,\r\n): Promise<void> => {\r\n calculationStateKeys.forEach(async (stateKey) => {\r\n let stateNameEnergyWh = \"\";\r\n let stateNameEnergykWh = \"\";\r\n let stateNamePower = \"\";\r\n\r\n if (stateKey == \"pvPower1\") {\r\n stateNameEnergyWh = `${productKey}.${deviceKey}.calculations.solarInputPv1EnergyTodayWh`;\r\n stateNameEnergykWh = `${productKey}.${deviceKey}.calculations.solarInputPv1EnergyTodaykWh`;\r\n stateNamePower = `${productKey}.${deviceKey}.pvPower1`;\r\n }\r\n else if (stateKey == \"pvPower2\") {\r\n stateNameEnergyWh = `${productKey}.${deviceKey}.calculations.solarInputPv2EnergyTodayWh`;\r\n stateNameEnergykWh = `${productKey}.${deviceKey}.calculations.solarInputPv2EnergyTodaykWh`;\r\n stateNamePower = `${productKey}.${deviceKey}.pvPower2`;\r\n }\r\n else {\r\n stateNameEnergyWh = `${productKey}.${deviceKey}.calculations.${stateKey}EnergyTodayWh`;\r\n stateNameEnergykWh = `${productKey}.${deviceKey}.calculations.${stateKey}EnergyTodaykWh`;\r\n stateNamePower = `${productKey}.${deviceKey}.${stateKey}Power`;\r\n }\r\n\r\n const currentPowerState = await adapter?.getStateAsync(stateNamePower);\r\n const currentEnergyState = await adapter?.getStateAsync(stateNameEnergyWh);\r\n\r\n if (currentEnergyState?.val == 0) {\r\n // Workaround, set Val to very low value to avoid Jump in data...\r\n await adapter?.setStateAsync(stateNameEnergyWh, 0.000001, true);\r\n } else if (\r\n currentEnergyState &&\r\n currentEnergyState.lc &&\r\n currentPowerState &&\r\n currentPowerState.val != undefined &&\r\n currentPowerState.val != null\r\n ) {\r\n // Timeframe = 30000ms, Job runs every 30 seconds...\r\n const timeFrame = 30000;\r\n\r\n // Calculate Energy value (Wh) from current power in the timeframe from last run...\r\n let addEnergyValue =\r\n (Number(currentPowerState.val) * timeFrame) / 3600000; // Wh\r\n\r\n // Use efficiency factor (used the one from Youtube Channel VoltAmpereLux - thanks!)\r\n const chargingFactor = 0.96; // Efficiency 96%\r\n const dischargingFactor = 1.08 - addEnergyValue / 10000; // Efficiency 92% - 98% (92% + Energy / 10000 = 600W -> +6%)\r\n\r\n // Calculate energy from efficiency factor if value for charging or discharging\r\n addEnergyValue =\r\n stateKey == \"outputPack\" && addEnergyValue > 0\r\n ? addEnergyValue * chargingFactor\r\n : addEnergyValue;\r\n addEnergyValue =\r\n stateKey == \"packInput\" && addEnergyValue > 0\r\n ? addEnergyValue * dischargingFactor\r\n : addEnergyValue;\r\n\r\n let newEnergyValue = Number(currentEnergyState.val) + addEnergyValue;\r\n\r\n // Fix negative value\r\n if (newEnergyValue < 0) {\r\n newEnergyValue = 0;\r\n }\r\n\r\n await adapter?.setStateAsync(stateNameEnergyWh, newEnergyValue, true);\r\n await adapter?.setStateAsync(\r\n stateNameEnergykWh,\r\n Number((newEnergyValue / 1000).toFixed(2)),\r\n true,\r\n );\r\n\r\n // SOC and energy in batteries\r\n if (\r\n (stateKey == \"outputPack\" || stateKey == \"packInput\") &&\r\n addEnergyValue > 0\r\n ) {\r\n await calculateSocAndEnergy(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n stateKey,\r\n addEnergyValue,\r\n );\r\n }\r\n } else {\r\n await adapter?.setStateAsync(stateNameEnergyWh, 0, true);\r\n await adapter?.setStateAsync(stateNameEnergykWh, 0, true);\r\n }\r\n });\r\n};\r\n\r\nexport const resetTodaysValues = async (\r\n adapter: ZendureSolarflow,\r\n): Promise<void> => {\r\n adapter.deviceList.forEach((device: ISolarFlowDeviceDetails) => {\r\n calculationStateKeys.forEach(async (stateKey: string) => {\r\n const stateNameEnergyWh = `${device.productKey}.${device.deviceKey}.calculations.${stateKey}EnergyTodayWh`;\r\n const stateNameEnergykWh = `${device.productKey}.${device.deviceKey}.calculations.${stateKey}EnergyTodaykWh`;\r\n\r\n await adapter?.setStateAsync(stateNameEnergyWh, 0, true);\r\n await adapter?.setStateAsync(stateNameEnergykWh, 0, true);\r\n });\r\n });\r\n};\r\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -156,7 +156,7 @@ const addOrUpdatePackData = async (productKey, deviceKey, packData) => {
156
156
  }
157
157
  };
158
158
  const onMessage = async (topic, message) => {
159
- var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z, _A, _B, _C, _D, _E, _F, _G, _H, _I, _J, _K, _L, _M, _N, _O, _P, _Q, _R, _S, _T, _U;
159
+ var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z, _A, _B, _C, _D, _E, _F, _G, _H, _I, _J, _K, _L, _M, _N, _O, _P, _Q, _R, _S, _T, _U, _V, _W, _X, _Y, _Z, __, _$, _aa, _ba, _ca, _da;
160
160
  if (adapter) {
161
161
  const splitted = topic.split("/");
162
162
  const productKey = splitted[1];
@@ -180,6 +180,10 @@ const onMessage = async (topic, message) => {
180
180
  if ((adapter == null ? void 0 : adapter.config.useCalculation) && obj.properties.electricLevel == 100) {
181
181
  (0, import_calculationService.setEnergyWhMax)(adapter, productKey, deviceKey);
182
182
  }
183
+ const minSoc = await (adapter == null ? void 0 : adapter.getStateAsync(`${productKey}.${deviceKey}.minSoc`));
184
+ if ((adapter == null ? void 0 : adapter.config.useCalculation) && minSoc && minSoc.val && minSoc.val >= obj.properties.electricLevel) {
185
+ (0, import_calculationService.setSocToZero)(adapter, productKey, deviceKey);
186
+ }
183
187
  }
184
188
  if (((_c = obj.properties) == null ? void 0 : _c.packState) != null && ((_d = obj.properties) == null ? void 0 : _d.packState) != void 0) {
185
189
  const value = ((_e = obj.properties) == null ? void 0 : _e.packState) == 0 ? "Idle" : ((_f = obj.properties) == null ? void 0 : _f.packState) == 1 ? "Charging" : ((_g = obj.properties) == null ? void 0 : _g.packState) == 2 ? "Discharging" : "Unknown";
@@ -340,6 +344,19 @@ const onMessage = async (topic, message) => {
340
344
  Number(obj.properties.minSoc) / 10
341
345
  );
342
346
  }
347
+ if (((_V = obj.properties) == null ? void 0 : _V.pvBrand) != null && ((_W = obj.properties) == null ? void 0 : _W.pvBrand) != void 0) {
348
+ const value = ((_X = obj.properties) == null ? void 0 : _X.pvBrand) == 0 ? "Others" : ((_Y = obj.properties) == null ? void 0 : _Y.pvBrand) == 1 ? "Hoymiles" : ((_Z = obj.properties) == null ? void 0 : _Z.pvBrand) == 2 ? "Enphase" : ((__ = obj.properties) == null ? void 0 : __.pvBrand) == 3 ? "APSystems" : ((_$ = obj.properties) == null ? void 0 : _$.pvBrand) == 4 ? "Anker" : ((_aa = obj.properties) == null ? void 0 : _aa.pvBrand) == 5 ? "Deye" : ((_ba = obj.properties) == null ? void 0 : _ba.pvBrand) == 6 ? "Bosswerk" : "Unknown";
349
+ (0, import_adapterService.updateSolarFlowState)(adapter, productKey, deviceKey, "pvBrand", value);
350
+ }
351
+ if (((_ca = obj.properties) == null ? void 0 : _ca.inverseMaxPower) != null && ((_da = obj.properties) == null ? void 0 : _da.inverseMaxPower) != void 0) {
352
+ (0, import_adapterService.updateSolarFlowState)(
353
+ adapter,
354
+ productKey,
355
+ deviceKey,
356
+ "inverseMaxPower",
357
+ obj.properties.inverseMaxPower
358
+ );
359
+ }
343
360
  if (obj.packData) {
344
361
  addOrUpdatePackData(productKey, deviceKey, obj.packData);
345
362
  }
@@ -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 { checkVoltage, updateSolarFlowState } from \"./adapterService\";\r\nimport { IPackData } from \"../models/IPackData\";\r\nimport { setEnergyWhMax } from \"./calculationService\";\r\n\r\nlet adapter: ZendureSolarflow | undefined = undefined;\r\n\r\n//triggerFullTelemetryUpdate\r\n\r\nexport const addOrUpdatePackData = async (\r\n productKey: string,\r\n deviceKey: string,\r\n packData: IPackData[],\r\n): Promise<void> => {\r\n if (adapter && productKey && deviceKey) {\r\n await packData.forEach(async (x) => {\r\n // Process data only with a serial id!\r\n if (x.sn && adapter) {\r\n // create a state for the serial id\r\n const key = (\r\n productKey +\r\n \".\" +\r\n deviceKey +\r\n \".packData.\" +\r\n x.sn\r\n ).replace(adapter.FORBIDDEN_CHARS, \"\");\r\n\r\n await adapter?.extendObjectAsync(key + \".sn\", {\r\n type: \"state\",\r\n common: {\r\n name: {\r\n de: \"Seriennummer\",\r\n en: \"Serial id\",\r\n },\r\n type: \"string\",\r\n desc: \"Serial ID\",\r\n role: \"value\",\r\n read: true,\r\n write: false,\r\n },\r\n native: {},\r\n });\r\n\r\n await adapter?.setStateAsync(key + \".sn\", x.sn, true);\r\n\r\n if (x.socLevel) {\r\n // State f\u00FCr socLevel\r\n await adapter?.extendObjectAsync(key + \".socLevel\", {\r\n type: \"state\",\r\n common: {\r\n name: {\r\n de: \"SOC der Batterie\",\r\n en: \"soc of battery\",\r\n },\r\n type: \"number\",\r\n desc: \"SOC Level\",\r\n role: \"value\",\r\n read: true,\r\n write: false,\r\n },\r\n native: {},\r\n });\r\n\r\n await adapter?.setStateAsync(key + \".socLevel\", x.socLevel, true);\r\n }\r\n\r\n if (x.maxTemp) {\r\n // State f\u00FCr maxTemp\r\n await adapter?.extendObjectAsync(key + \".maxTemp\", {\r\n type: \"state\",\r\n common: {\r\n name: {\r\n de: \"Max. Temperatur der Batterie\",\r\n en: \"max temp. of battery\",\r\n },\r\n type: \"number\",\r\n desc: \"Max. Temp\",\r\n role: \"value\",\r\n read: true,\r\n write: false,\r\n },\r\n native: {},\r\n });\r\n\r\n // Convert Kelvin to Celsius\r\n await adapter?.setStateAsync(\r\n key + \".maxTemp\",\r\n x.maxTemp / 10 - 273.15,\r\n true,\r\n );\r\n }\r\n\r\n if (x.minVol) {\r\n await adapter?.extendObjectAsync(key + \".minVol\", {\r\n type: \"state\",\r\n common: {\r\n name: \"minVol\",\r\n type: \"number\",\r\n desc: \"minVol\",\r\n role: \"value\",\r\n read: true,\r\n write: false,\r\n },\r\n native: {},\r\n });\r\n\r\n await adapter?.setStateAsync(key + \".minVol\", x.minVol / 100, true);\r\n }\r\n\r\n if (x.maxVol) {\r\n await adapter?.extendObjectAsync(key + \".maxVol\", {\r\n type: \"state\",\r\n common: {\r\n name: \"maxVol\",\r\n type: \"number\",\r\n desc: \"maxVol\",\r\n role: \"value\",\r\n read: true,\r\n write: false,\r\n },\r\n native: {},\r\n });\r\n\r\n await adapter?.setStateAsync(key + \".maxVol\", x.maxVol / 100, true);\r\n }\r\n\r\n if (x.totalVol) {\r\n await adapter?.extendObjectAsync(key + \".totalVol\", {\r\n type: \"state\",\r\n common: {\r\n name: \"totalVol\",\r\n type: \"number\",\r\n desc: \"totalVol\",\r\n role: \"value\",\r\n read: true,\r\n write: false,\r\n },\r\n native: {},\r\n });\r\n\r\n const totalVol = x.totalVol / 100;\r\n\r\n await adapter?.setStateAsync(key + \".totalVol\", totalVol, true);\r\n\r\n // Send Voltage to checkVoltage Method\r\n checkVoltage(adapter, productKey, deviceKey, totalVol);\r\n }\r\n }\r\n });\r\n }\r\n};\r\n\r\nconst onMessage = async (topic: string, message: Buffer): Promise<void> => {\r\n //console.log(message.toString())\r\n if (adapter) {\r\n const splitted = topic.split(\"/\");\r\n const productKey = splitted[1];\r\n const deviceKey = splitted[2];\r\n\r\n const obj = JSON.parse(message.toString());\r\n\r\n // lastUpdate f\u00FCr den deviceKey setzen\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"lastUpdate\",\r\n new Date().getTime(),\r\n );\r\n\r\n if (\r\n obj.properties?.electricLevel != null &&\r\n obj.properties?.electricLevel != undefined\r\n ) {\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"electricLevel\",\r\n obj.properties.electricLevel,\r\n );\r\n\r\n if (\r\n adapter?.config.useCalculation &&\r\n obj.properties.electricLevel == 100\r\n ) {\r\n setEnergyWhMax(adapter, productKey, deviceKey);\r\n }\r\n }\r\n\r\n if (\r\n obj.properties?.packState != null &&\r\n obj.properties?.packState != undefined\r\n ) {\r\n const value =\r\n obj.properties?.packState == 0\r\n ? \"Idle\"\r\n : obj.properties?.packState == 1\r\n ? \"Charging\"\r\n : obj.properties?.packState == 2\r\n ? \"Discharging\"\r\n : \"Unknown\";\r\n updateSolarFlowState(adapter, productKey, deviceKey, \"packState\", value);\r\n }\r\n\r\n if (\r\n obj.properties?.passMode != null &&\r\n obj.properties?.passMode != undefined\r\n ) {\r\n const value =\r\n obj.properties?.passMode == 0\r\n ? \"Automatic\"\r\n : obj.properties?.passMode == 1\r\n ? \"Always off\"\r\n : obj.properties?.passMode == 2\r\n ? \"Always on\"\r\n : \"Unknown\";\r\n updateSolarFlowState(adapter, productKey, deviceKey, \"passMode\", value);\r\n }\r\n\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\r\n if (\r\n obj.properties?.outputHomePower != null &&\r\n obj.properties?.outputHomePower != undefined\r\n ) {\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"outputHomePower\",\r\n obj.properties.outputHomePower,\r\n );\r\n }\r\n\r\n if (\r\n obj.properties?.outputLimit != null &&\r\n obj.properties?.outputLimit != undefined\r\n ) {\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"outputLimit\",\r\n obj.properties.outputLimit,\r\n );\r\n }\r\n\r\n if (\r\n obj.properties?.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\r\n if (\r\n obj.properties?.outputPackPower != null &&\r\n obj.properties?.outputPackPower != undefined\r\n ) {\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"outputPackPower\",\r\n obj.properties.outputPackPower,\r\n );\r\n\r\n // if outPutPackPower set packInputPower to 0\r\n updateSolarFlowState(adapter, productKey, deviceKey, \"packInputPower\", 0);\r\n }\r\n\r\n if (\r\n obj.properties?.packInputPower != null &&\r\n obj.properties?.packInputPower != undefined\r\n ) {\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"packInputPower\",\r\n obj.properties.packInputPower,\r\n );\r\n\r\n // if packInputPower set outputPackPower to 0\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"outputPackPower\",\r\n 0,\r\n );\r\n }\r\n\r\n if (\r\n obj.properties?.solarInputPower != null &&\r\n obj.properties?.solarInputPower != undefined\r\n ) {\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"solarInputPower\",\r\n obj.properties.solarInputPower,\r\n );\r\n }\r\n\r\n if (\r\n obj.properties?.pvPower1 != null &&\r\n obj.properties?.pvPower1 != undefined\r\n ) {\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"pvPower2\", // Reversed to adjust like offical app\r\n obj.properties.pvPower1,\r\n );\r\n }\r\n\r\n if (\r\n obj.properties?.pvPower2 != null &&\r\n obj.properties?.pvPower2 != undefined\r\n ) {\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"pvPower1\", // Reversed to adjust like offical app\r\n obj.properties.pvPower2,\r\n );\r\n }\r\n\r\n if (\r\n obj.properties?.solarPower1 != null &&\r\n obj.properties?.solarPower1 != undefined\r\n ) {\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"pvPower1\",\r\n obj.properties.solarPower1,\r\n );\r\n }\r\n\r\n if (\r\n obj.properties?.solarPower2 != null &&\r\n obj.properties?.solarPower2 != undefined\r\n ) {\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"pvPower2\",\r\n obj.properties.solarPower2,\r\n );\r\n }\r\n\r\n if (\r\n obj.properties?.remainOutTime != null &&\r\n obj.properties?.remainOutTime != undefined\r\n ) {\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"remainOutTime\",\r\n obj.properties.remainOutTime,\r\n );\r\n }\r\n\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\r\n if (obj.properties?.minSoc != null && obj.properties?.minSoc != undefined) {\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"minSoc\",\r\n Number(obj.properties.minSoc) / 10,\r\n );\r\n }\r\n\r\n if (obj.packData) {\r\n addOrUpdatePackData(productKey, deviceKey, obj.packData);\r\n }\r\n }\r\n\r\n if (adapter?.mqttClient) {\r\n //client.end();\r\n }\r\n};\r\n\r\nexport const setChargeLimit = async (\r\n adapter: ZendureSolarflow,\r\n productKey: string,\r\n deviceKey: string,\r\n socSet: number,\r\n): Promise<void> => {\r\n if (adapter.mqttClient && productKey && deviceKey) {\r\n if (socSet > 40 && socSet <= 100) {\r\n const topic = `iot/${productKey}/${deviceKey}/properties/write`;\r\n\r\n const socSetLimit = { properties: { socSet: socSet * 10 } };\r\n adapter.log.debug(\r\n `[setChargeLimit] Setting ChargeLimit for device key ${deviceKey} to ${socSet}!`,\r\n );\r\n adapter.mqttClient?.publish(topic, JSON.stringify(socSetLimit));\r\n } else {\r\n adapter.log.debug(\r\n `[setChargeLimit] Charge limit is not in range 40<>100!`,\r\n );\r\n }\r\n }\r\n};\r\n\r\nexport const setDischargeLimit = async (\r\n adapter: ZendureSolarflow,\r\n productKey: string,\r\n deviceKey: string,\r\n minSoc: number,\r\n): Promise<void> => {\r\n if (adapter.mqttClient && productKey && deviceKey) {\r\n if (minSoc > 0 && minSoc < 90) {\r\n const topic = `iot/${productKey}/${deviceKey}/properties/write`;\r\n\r\n const socSetLimit = { properties: { minSoc: minSoc * 10 } };\r\n adapter.log.debug(\r\n `[setDischargeLimit] Setting Discharge Limit for device key ${deviceKey} to ${minSoc}!`,\r\n );\r\n adapter.mqttClient?.publish(topic, JSON.stringify(socSetLimit));\r\n } else {\r\n adapter.log.debug(\r\n `[setDischargeLimit] Discharge limit is not in range 0<>90!`,\r\n );\r\n }\r\n }\r\n};\r\n\r\nexport const setOutputLimit = async (\r\n adapter: ZendureSolarflow,\r\n productKey: string,\r\n deviceKey: string,\r\n limit: number,\r\n): Promise<void> => {\r\n if (adapter.mqttClient && productKey && deviceKey) {\r\n if (adapter.config.useLowVoltageBlock) {\r\n const lowVoltageBlockState = await adapter.getStateAsync(\r\n productKey + \".\" + deviceKey + \".control.lowVoltageBlock\",\r\n );\r\n if (\r\n lowVoltageBlockState &&\r\n lowVoltageBlockState.val &&\r\n lowVoltageBlockState.val == true\r\n ) {\r\n limit = 0;\r\n }\r\n }\r\n\r\n // Das Limit kann unter 100 nur in 30er Schritten gesetzt werden, dH. 30/60/90/100, wir rechnen das also um\r\n const currentLimit = (\r\n await adapter.getStateAsync(productKey + \".\" + deviceKey + \".outputLimit\")\r\n )?.val;\r\n\r\n if (currentLimit != null && currentLimit != undefined) {\r\n if (currentLimit != limit) {\r\n if (\r\n limit < 100 &&\r\n limit != 90 &&\r\n limit != 60 &&\r\n limit != 30 &&\r\n limit != 0\r\n ) {\r\n if (limit < 100 && limit > 90) {\r\n limit = 90;\r\n } else if (limit < 90 && limit > 60) {\r\n limit = 60;\r\n } else if (limit < 60 && limit > 30) {\r\n limit = 30;\r\n } else if (limit < 30) {\r\n limit = 30;\r\n }\r\n }\r\n\r\n // 'iot/{auth.productKey}/{auth.deviceKey}/properties/write' == Topic? Oder productKey,deviceKey aus Device Details?\r\n const topic = `iot/${productKey}/${deviceKey}/properties/write`;\r\n\r\n const outputlimit = { properties: { outputLimit: limit } };\r\n /* adapter.log.debug(\r\n `[setOutputLimit] Setting Output Limit for device key ${deviceKey} to ${limit}!`,\r\n ); */\r\n adapter.mqttClient?.publish(topic, JSON.stringify(outputlimit));\r\n } else {\r\n /* adapter.log.debug(\r\n `[setOutputLimit] Output Limit for device key ${deviceKey} is already at ${limit}!`,\r\n ); */\r\n }\r\n }\r\n }\r\n};\r\n\r\nexport const setBuzzerSwitch = async (\r\n adapter: ZendureSolarflow,\r\n productKey: string,\r\n deviceKey: string,\r\n buzzerOn: boolean,\r\n): Promise<void> => {\r\n if (adapter.mqttClient && productKey && deviceKey) {\r\n const topic = `iot/${productKey}/${deviceKey}/properties/write`;\r\n\r\n const socSetLimit = { properties: { buzzerSwitch: buzzerOn ? 1 : 0 } };\r\n adapter.log.debug(\r\n `[setBuzzer] Setting Buzzer for device key ${deviceKey} to ${buzzerOn}!`,\r\n );\r\n adapter.mqttClient?.publish(topic, JSON.stringify(socSetLimit));\r\n }\r\n};\r\n\r\nexport const triggerFullTelemetryUpdate = async (\r\n adapter: ZendureSolarflow,\r\n productKey: string,\r\n deviceKey: string,\r\n): Promise<void> => {\r\n if (adapter.mqttClient && productKey && deviceKey) {\r\n const topic = `iot/${productKey}/${deviceKey}/properties/read`;\r\n\r\n const getAllContent = { properties: [\"getAll\"] };\r\n adapter.log.debug(\r\n `[triggerFullTelemetryUpdate] Triggering full telemetry update for device key ${deviceKey}!`,\r\n );\r\n adapter.mqttClient?.publish(topic, JSON.stringify(getAllContent));\r\n }\r\n};\r\n\r\nexport const setPassMode = async (\r\n adapter: ZendureSolarflow,\r\n productKey: string,\r\n deviceKey: string,\r\n passMode: number,\r\n): Promise<void> => {\r\n if (adapter.mqttClient && productKey && deviceKey) {\r\n const topic = `iot/${productKey}/${deviceKey}/properties/write`;\r\n\r\n const setPassModeContent = { properties: { passMode: passMode } };\r\n adapter.log.debug(\r\n `[setPassMode] Set passMode for device ${deviceKey} to ${passMode}!`,\r\n );\r\n adapter.mqttClient?.publish(topic, JSON.stringify(setPassModeContent));\r\n }\r\n};\r\n\r\nexport const setAutoRecover = async (\r\n adapter: ZendureSolarflow,\r\n productKey: string,\r\n deviceKey: string,\r\n autoRecover: boolean,\r\n): Promise<void> => {\r\n if (adapter.mqttClient && productKey && deviceKey) {\r\n const topic = `iot/${productKey}/${deviceKey}/properties/write`;\r\n\r\n const setAutoRecoverContent = {\r\n properties: { autoRecover: autoRecover ? 1 : 0 },\r\n };\r\n adapter.log.debug(\r\n `[setPassMode] Set autoRecover for device ${deviceKey} to ${autoRecover}!`,\r\n );\r\n adapter.mqttClient?.publish(topic, JSON.stringify(setAutoRecoverContent));\r\n }\r\n};\r\n\r\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 onSubscriberReportTopic: any = (error: Error | null) => {\r\n if (error) {\r\n adapter?.log.error(\"Subscription to MQTT failed! Error: \" + error);\r\n } else {\r\n adapter?.log.debug(\"Subscription of Report Topic successful!\");\r\n }\r\n};\r\n\r\nconst onSubscribeIotTopic: any = (\r\n error: Error | null,\r\n productKey: string,\r\n deviceKey: string,\r\n) => {\r\n if (error) {\r\n adapter?.log.error(\"Subscription to MQTT failed! Error: \" + error);\r\n } else if (adapter) {\r\n adapter?.log.debug(\"Subscription of IOT Topic successful!\");\r\n triggerFullTelemetryUpdate(adapter, productKey, deviceKey);\r\n }\r\n};\r\n\r\nexport const connectMqttClient = (_adapter: ZendureSolarflow): void => {\r\n adapter = _adapter;\r\n\r\n const options: mqtt.IClientOptions = {\r\n clientId: adapter.accessToken,\r\n username: \"zenApp\",\r\n password:\r\n adapter.config.server && adapter.config.server == \"eu\"\r\n ? \"H6s$j9CtNa0N\"\r\n : \"oK#PCgy6OZxd\",\r\n clean: true,\r\n protocolVersion: 5,\r\n };\r\n\r\n if (mqtt && adapter && adapter.paths && adapter.deviceList) {\r\n adapter.log.debug(\"[connectMqttClient] Connecting to MQTT client...\");\r\n adapter.mqttClient = mqtt.connect(\r\n \"mqtt://\" + adapter.paths.mqttUrl + \":\" + adapter.paths.mqttPort,\r\n options,\r\n ); // create a client\r\n\r\n if (adapter && adapter.mqttClient) {\r\n adapter.mqttClient.on(\"connect\", onConnected);\r\n adapter.mqttClient.on(\"error\", onError);\r\n\r\n // Subscribe to Topic (appkey von Zendure)\r\n adapter.deviceList.forEach((device: ISolarFlowDeviceDetails) => {\r\n if (adapter) {\r\n const reportTopic = `/${device.productKey}/${device.deviceKey}/properties/report`;\r\n const iotTopic = `iot/${device.productKey}/${device.deviceKey}/#`;\r\n\r\n adapter.log.debug(\r\n `[connectMqttClient] Subscribing to MQTT Topic: ${reportTopic}`,\r\n );\r\n adapter.mqttClient?.subscribe(reportTopic, onSubscriberReportTopic);\r\n adapter.log.debug(\r\n `[connectMqttClient] Subscribing to MQTT Topic: ${iotTopic}`,\r\n );\r\n adapter.mqttClient?.subscribe(iotTopic, (error) => {\r\n onSubscribeIotTopic(error, device.productKey, device.deviceKey);\r\n });\r\n }\r\n });\r\n\r\n adapter.mqttClient.on(\"message\", onMessage);\r\n }\r\n }\r\n};\r\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["/* eslint-disable @typescript-eslint/indent */\r\nimport * as mqtt from \"mqtt\";\r\nimport { ZendureSolarflow } from \"../main\";\r\nimport { ISolarFlowDeviceDetails } from \"../models/ISolarFlowDeviceDetails\";\r\nimport { checkVoltage, updateSolarFlowState } from \"./adapterService\";\r\nimport { IPackData } from \"../models/IPackData\";\r\nimport { setEnergyWhMax, setSocToZero } from \"./calculationService\";\r\n\r\nlet adapter: ZendureSolarflow | undefined = undefined;\r\n\r\n//triggerFullTelemetryUpdate\r\n\r\nexport const addOrUpdatePackData = async (\r\n productKey: string,\r\n deviceKey: string,\r\n packData: IPackData[],\r\n): Promise<void> => {\r\n if (adapter && productKey && deviceKey) {\r\n await packData.forEach(async (x) => {\r\n // Process data only with a serial id!\r\n if (x.sn && adapter) {\r\n // create a state for the serial id\r\n const key = (\r\n productKey +\r\n \".\" +\r\n deviceKey +\r\n \".packData.\" +\r\n x.sn\r\n ).replace(adapter.FORBIDDEN_CHARS, \"\");\r\n\r\n await adapter?.extendObjectAsync(key + \".sn\", {\r\n type: \"state\",\r\n common: {\r\n name: {\r\n de: \"Seriennummer\",\r\n en: \"Serial id\",\r\n },\r\n type: \"string\",\r\n desc: \"Serial ID\",\r\n role: \"value\",\r\n read: true,\r\n write: false,\r\n },\r\n native: {},\r\n });\r\n\r\n await adapter?.setStateAsync(key + \".sn\", x.sn, true);\r\n\r\n if (x.socLevel) {\r\n // State f\u00FCr socLevel\r\n await adapter?.extendObjectAsync(key + \".socLevel\", {\r\n type: \"state\",\r\n common: {\r\n name: {\r\n de: \"SOC der Batterie\",\r\n en: \"soc of battery\",\r\n },\r\n type: \"number\",\r\n desc: \"SOC Level\",\r\n role: \"value\",\r\n read: true,\r\n write: false,\r\n },\r\n native: {},\r\n });\r\n\r\n await adapter?.setStateAsync(key + \".socLevel\", x.socLevel, true);\r\n }\r\n\r\n if (x.maxTemp) {\r\n // State f\u00FCr maxTemp\r\n await adapter?.extendObjectAsync(key + \".maxTemp\", {\r\n type: \"state\",\r\n common: {\r\n name: {\r\n de: \"Max. Temperatur der Batterie\",\r\n en: \"max temp. of battery\",\r\n },\r\n type: \"number\",\r\n desc: \"Max. Temp\",\r\n role: \"value\",\r\n read: true,\r\n write: false,\r\n },\r\n native: {},\r\n });\r\n\r\n // Convert Kelvin to Celsius\r\n await adapter?.setStateAsync(\r\n key + \".maxTemp\",\r\n x.maxTemp / 10 - 273.15,\r\n true,\r\n );\r\n }\r\n\r\n if (x.minVol) {\r\n await adapter?.extendObjectAsync(key + \".minVol\", {\r\n type: \"state\",\r\n common: {\r\n name: \"minVol\",\r\n type: \"number\",\r\n desc: \"minVol\",\r\n role: \"value\",\r\n read: true,\r\n write: false,\r\n },\r\n native: {},\r\n });\r\n\r\n await adapter?.setStateAsync(key + \".minVol\", x.minVol / 100, true);\r\n }\r\n\r\n if (x.maxVol) {\r\n await adapter?.extendObjectAsync(key + \".maxVol\", {\r\n type: \"state\",\r\n common: {\r\n name: \"maxVol\",\r\n type: \"number\",\r\n desc: \"maxVol\",\r\n role: \"value\",\r\n read: true,\r\n write: false,\r\n },\r\n native: {},\r\n });\r\n\r\n await adapter?.setStateAsync(key + \".maxVol\", x.maxVol / 100, true);\r\n }\r\n\r\n if (x.totalVol) {\r\n await adapter?.extendObjectAsync(key + \".totalVol\", {\r\n type: \"state\",\r\n common: {\r\n name: \"totalVol\",\r\n type: \"number\",\r\n desc: \"totalVol\",\r\n role: \"value\",\r\n read: true,\r\n write: false,\r\n },\r\n native: {},\r\n });\r\n\r\n const totalVol = x.totalVol / 100;\r\n\r\n await adapter?.setStateAsync(key + \".totalVol\", totalVol, true);\r\n\r\n // Send Voltage to checkVoltage Method\r\n checkVoltage(adapter, productKey, deviceKey, totalVol);\r\n }\r\n }\r\n });\r\n }\r\n};\r\n\r\nconst onMessage = async (topic: string, message: Buffer): Promise<void> => {\r\n //console.log(message.toString())\r\n if (adapter) {\r\n const splitted = topic.split(\"/\");\r\n const productKey = splitted[1];\r\n const deviceKey = splitted[2];\r\n\r\n const obj = JSON.parse(message.toString());\r\n\r\n // lastUpdate f\u00FCr den deviceKey setzen\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"lastUpdate\",\r\n new Date().getTime(),\r\n );\r\n\r\n if (\r\n obj.properties?.electricLevel != null &&\r\n obj.properties?.electricLevel != undefined\r\n ) {\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"electricLevel\",\r\n obj.properties.electricLevel,\r\n );\r\n\r\n if (\r\n adapter?.config.useCalculation &&\r\n obj.properties.electricLevel == 100\r\n ) {\r\n setEnergyWhMax(adapter, productKey, deviceKey);\r\n }\r\n\r\n // if minSoc is reached, set the calculated soc to 0\r\n const minSoc = await adapter?.getStateAsync(`${productKey}.${deviceKey}.minSoc`);\r\n if (adapter?.config.useCalculation && minSoc && minSoc.val && minSoc.val >= obj.properties.electricLevel) {\r\n setSocToZero(adapter, productKey, deviceKey);\r\n }\r\n }\r\n\r\n if (\r\n obj.properties?.packState != null &&\r\n obj.properties?.packState != undefined\r\n ) {\r\n const value =\r\n obj.properties?.packState == 0\r\n ? \"Idle\"\r\n : obj.properties?.packState == 1\r\n ? \"Charging\"\r\n : obj.properties?.packState == 2\r\n ? \"Discharging\"\r\n : \"Unknown\";\r\n updateSolarFlowState(adapter, productKey, deviceKey, \"packState\", value);\r\n }\r\n\r\n if (\r\n obj.properties?.passMode != null &&\r\n obj.properties?.passMode != undefined\r\n ) {\r\n const value =\r\n obj.properties?.passMode == 0\r\n ? \"Automatic\"\r\n : obj.properties?.passMode == 1\r\n ? \"Always off\"\r\n : obj.properties?.passMode == 2\r\n ? \"Always on\"\r\n : \"Unknown\";\r\n updateSolarFlowState(adapter, productKey, deviceKey, \"passMode\", value);\r\n }\r\n\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\r\n if (\r\n obj.properties?.outputHomePower != null &&\r\n obj.properties?.outputHomePower != undefined\r\n ) {\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"outputHomePower\",\r\n obj.properties.outputHomePower,\r\n );\r\n }\r\n\r\n if (\r\n obj.properties?.outputLimit != null &&\r\n obj.properties?.outputLimit != undefined\r\n ) {\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"outputLimit\",\r\n obj.properties.outputLimit,\r\n );\r\n }\r\n\r\n if (\r\n obj.properties?.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\r\n if (\r\n obj.properties?.outputPackPower != null &&\r\n obj.properties?.outputPackPower != undefined\r\n ) {\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"outputPackPower\",\r\n obj.properties.outputPackPower,\r\n );\r\n\r\n // if outPutPackPower set packInputPower to 0\r\n updateSolarFlowState(adapter, productKey, deviceKey, \"packInputPower\", 0);\r\n }\r\n\r\n if (\r\n obj.properties?.packInputPower != null &&\r\n obj.properties?.packInputPower != undefined\r\n ) {\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"packInputPower\",\r\n obj.properties.packInputPower,\r\n );\r\n\r\n // if packInputPower set outputPackPower to 0\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"outputPackPower\",\r\n 0,\r\n );\r\n }\r\n\r\n if (\r\n obj.properties?.solarInputPower != null &&\r\n obj.properties?.solarInputPower != undefined\r\n ) {\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"solarInputPower\",\r\n obj.properties.solarInputPower,\r\n );\r\n }\r\n\r\n if (\r\n obj.properties?.pvPower1 != null &&\r\n obj.properties?.pvPower1 != undefined\r\n ) {\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"pvPower2\", // Reversed to adjust like offical app\r\n obj.properties.pvPower1,\r\n );\r\n }\r\n\r\n if (\r\n obj.properties?.pvPower2 != null &&\r\n obj.properties?.pvPower2 != undefined\r\n ) {\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"pvPower1\", // Reversed to adjust like offical app\r\n obj.properties.pvPower2,\r\n );\r\n }\r\n\r\n if (\r\n obj.properties?.solarPower1 != null &&\r\n obj.properties?.solarPower1 != undefined\r\n ) {\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"pvPower1\",\r\n obj.properties.solarPower1,\r\n );\r\n }\r\n\r\n if (\r\n obj.properties?.solarPower2 != null &&\r\n obj.properties?.solarPower2 != undefined\r\n ) {\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"pvPower2\",\r\n obj.properties.solarPower2,\r\n );\r\n }\r\n\r\n if (\r\n obj.properties?.remainOutTime != null &&\r\n obj.properties?.remainOutTime != undefined\r\n ) {\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"remainOutTime\",\r\n obj.properties.remainOutTime,\r\n );\r\n }\r\n\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\r\n if (obj.properties?.minSoc != null && obj.properties?.minSoc != undefined) {\r\n updateSolarFlowState(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n \"minSoc\",\r\n Number(obj.properties.minSoc) / 10,\r\n );\r\n }\r\n\r\n if (\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 (obj.packData) {\r\n addOrUpdatePackData(productKey, deviceKey, obj.packData);\r\n }\r\n }\r\n\r\n if (adapter?.mqttClient) {\r\n //client.end();\r\n }\r\n};\r\n\r\nexport const setChargeLimit = async (\r\n adapter: ZendureSolarflow,\r\n productKey: string,\r\n deviceKey: string,\r\n socSet: number,\r\n): Promise<void> => {\r\n if (adapter.mqttClient && productKey && deviceKey) {\r\n if (socSet > 40 && socSet <= 100) {\r\n const topic = `iot/${productKey}/${deviceKey}/properties/write`;\r\n\r\n const socSetLimit = { properties: { socSet: socSet * 10 } };\r\n adapter.log.debug(\r\n `[setChargeLimit] Setting ChargeLimit for device key ${deviceKey} to ${socSet}!`,\r\n );\r\n adapter.mqttClient?.publish(topic, JSON.stringify(socSetLimit));\r\n } else {\r\n adapter.log.debug(\r\n `[setChargeLimit] Charge limit is not in range 40<>100!`,\r\n );\r\n }\r\n }\r\n};\r\n\r\nexport const setDischargeLimit = async (\r\n adapter: ZendureSolarflow,\r\n productKey: string,\r\n deviceKey: string,\r\n minSoc: number,\r\n): Promise<void> => {\r\n if (adapter.mqttClient && productKey && deviceKey) {\r\n if (minSoc > 0 && minSoc < 90) {\r\n const topic = `iot/${productKey}/${deviceKey}/properties/write`;\r\n\r\n const socSetLimit = { properties: { minSoc: minSoc * 10 } };\r\n adapter.log.debug(\r\n `[setDischargeLimit] Setting Discharge Limit for device key ${deviceKey} to ${minSoc}!`,\r\n );\r\n adapter.mqttClient?.publish(topic, JSON.stringify(socSetLimit));\r\n } else {\r\n adapter.log.debug(\r\n `[setDischargeLimit] Discharge limit is not in range 0<>90!`,\r\n );\r\n }\r\n }\r\n};\r\n\r\nexport const setOutputLimit = async (\r\n adapter: ZendureSolarflow,\r\n productKey: string,\r\n deviceKey: string,\r\n limit: number,\r\n): Promise<void> => {\r\n if (adapter.mqttClient && productKey && deviceKey) {\r\n if (adapter.config.useLowVoltageBlock) {\r\n const lowVoltageBlockState = await adapter.getStateAsync(\r\n productKey + \".\" + deviceKey + \".control.lowVoltageBlock\",\r\n );\r\n if (\r\n lowVoltageBlockState &&\r\n lowVoltageBlockState.val &&\r\n lowVoltageBlockState.val == true\r\n ) {\r\n limit = 0;\r\n }\r\n }\r\n\r\n // Das Limit kann unter 100 nur in 30er Schritten gesetzt werden, dH. 30/60/90/100, wir rechnen das also um\r\n const currentLimit = (\r\n await adapter.getStateAsync(productKey + \".\" + deviceKey + \".outputLimit\")\r\n )?.val;\r\n\r\n if (currentLimit != null && currentLimit != undefined) {\r\n if (currentLimit != limit) {\r\n if (\r\n limit < 100 &&\r\n limit != 90 &&\r\n limit != 60 &&\r\n limit != 30 &&\r\n limit != 0\r\n ) {\r\n if (limit < 100 && limit > 90) {\r\n limit = 90;\r\n } else if (limit < 90 && limit > 60) {\r\n limit = 60;\r\n } else if (limit < 60 && limit > 30) {\r\n limit = 30;\r\n } else if (limit < 30) {\r\n limit = 30;\r\n }\r\n }\r\n\r\n // 'iot/{auth.productKey}/{auth.deviceKey}/properties/write' == Topic? Oder productKey,deviceKey aus Device Details?\r\n const topic = `iot/${productKey}/${deviceKey}/properties/write`;\r\n\r\n const outputlimit = { properties: { outputLimit: limit } };\r\n /* adapter.log.debug(\r\n `[setOutputLimit] Setting Output Limit for device key ${deviceKey} to ${limit}!`,\r\n ); */\r\n adapter.mqttClient?.publish(topic, JSON.stringify(outputlimit));\r\n } else {\r\n /* adapter.log.debug(\r\n `[setOutputLimit] Output Limit for device key ${deviceKey} is already at ${limit}!`,\r\n ); */\r\n }\r\n }\r\n }\r\n};\r\n\r\nexport const setBuzzerSwitch = async (\r\n adapter: ZendureSolarflow,\r\n productKey: string,\r\n deviceKey: string,\r\n buzzerOn: boolean,\r\n): Promise<void> => {\r\n if (adapter.mqttClient && productKey && deviceKey) {\r\n const topic = `iot/${productKey}/${deviceKey}/properties/write`;\r\n\r\n const socSetLimit = { properties: { buzzerSwitch: buzzerOn ? 1 : 0 } };\r\n adapter.log.debug(\r\n `[setBuzzer] Setting Buzzer for device key ${deviceKey} to ${buzzerOn}!`,\r\n );\r\n adapter.mqttClient?.publish(topic, JSON.stringify(socSetLimit));\r\n }\r\n};\r\n\r\nexport const triggerFullTelemetryUpdate = async (\r\n adapter: ZendureSolarflow,\r\n productKey: string,\r\n deviceKey: string,\r\n): Promise<void> => {\r\n if (adapter.mqttClient && productKey && deviceKey) {\r\n const topic = `iot/${productKey}/${deviceKey}/properties/read`;\r\n\r\n const getAllContent = { properties: [\"getAll\"] };\r\n adapter.log.debug(\r\n `[triggerFullTelemetryUpdate] Triggering full telemetry update for device key ${deviceKey}!`,\r\n );\r\n adapter.mqttClient?.publish(topic, JSON.stringify(getAllContent));\r\n }\r\n};\r\n\r\nexport const setPassMode = async (\r\n adapter: ZendureSolarflow,\r\n productKey: string,\r\n deviceKey: string,\r\n passMode: number,\r\n): Promise<void> => {\r\n if (adapter.mqttClient && productKey && deviceKey) {\r\n const topic = `iot/${productKey}/${deviceKey}/properties/write`;\r\n\r\n const setPassModeContent = { properties: { passMode: passMode } };\r\n adapter.log.debug(\r\n `[setPassMode] Set passMode for device ${deviceKey} to ${passMode}!`,\r\n );\r\n adapter.mqttClient?.publish(topic, JSON.stringify(setPassModeContent));\r\n }\r\n};\r\n\r\nexport const setAutoRecover = async (\r\n adapter: ZendureSolarflow,\r\n productKey: string,\r\n deviceKey: string,\r\n autoRecover: boolean,\r\n): Promise<void> => {\r\n if (adapter.mqttClient && productKey && deviceKey) {\r\n const topic = `iot/${productKey}/${deviceKey}/properties/write`;\r\n\r\n const setAutoRecoverContent = {\r\n properties: { autoRecover: autoRecover ? 1 : 0 },\r\n };\r\n adapter.log.debug(\r\n `[setPassMode] Set autoRecover for device ${deviceKey} to ${autoRecover}!`,\r\n );\r\n adapter.mqttClient?.publish(topic, JSON.stringify(setAutoRecoverContent));\r\n }\r\n};\r\n\r\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 onSubscriberReportTopic: any = (error: Error | null) => {\r\n if (error) {\r\n adapter?.log.error(\"Subscription to MQTT failed! Error: \" + error);\r\n } else {\r\n adapter?.log.debug(\"Subscription of Report Topic successful!\");\r\n }\r\n};\r\n\r\nconst onSubscribeIotTopic: any = (\r\n error: Error | null,\r\n productKey: string,\r\n deviceKey: string,\r\n) => {\r\n if (error) {\r\n adapter?.log.error(\"Subscription to MQTT failed! Error: \" + error);\r\n } else if (adapter) {\r\n adapter?.log.debug(\"Subscription of IOT Topic successful!\");\r\n triggerFullTelemetryUpdate(adapter, productKey, deviceKey);\r\n }\r\n};\r\n\r\nexport const connectMqttClient = (_adapter: ZendureSolarflow): void => {\r\n adapter = _adapter;\r\n\r\n const options: mqtt.IClientOptions = {\r\n clientId: adapter.accessToken,\r\n username: \"zenApp\",\r\n password:\r\n adapter.config.server && adapter.config.server == \"eu\"\r\n ? \"H6s$j9CtNa0N\"\r\n : \"oK#PCgy6OZxd\",\r\n clean: true,\r\n protocolVersion: 5,\r\n };\r\n\r\n if (mqtt && adapter && adapter.paths && adapter.deviceList) {\r\n adapter.log.debug(\"[connectMqttClient] Connecting to MQTT client...\");\r\n adapter.mqttClient = mqtt.connect(\r\n \"mqtt://\" + adapter.paths.mqttUrl + \":\" + adapter.paths.mqttPort,\r\n options,\r\n ); // create a client\r\n\r\n if (adapter && adapter.mqttClient) {\r\n adapter.mqttClient.on(\"connect\", onConnected);\r\n adapter.mqttClient.on(\"error\", onError);\r\n\r\n // Subscribe to Topic (appkey von Zendure)\r\n adapter.deviceList.forEach((device: ISolarFlowDeviceDetails) => {\r\n if (adapter) {\r\n const reportTopic = `/${device.productKey}/${device.deviceKey}/properties/report`;\r\n const iotTopic = `iot/${device.productKey}/${device.deviceKey}/#`;\r\n\r\n adapter.log.debug(\r\n `[connectMqttClient] Subscribing to MQTT Topic: ${reportTopic}`,\r\n );\r\n adapter.mqttClient?.subscribe(reportTopic, onSubscriberReportTopic);\r\n adapter.log.debug(\r\n `[connectMqttClient] Subscribing to MQTT Topic: ${iotTopic}`,\r\n );\r\n adapter.mqttClient?.subscribe(iotTopic, (error) => {\r\n onSubscribeIotTopic(error, device.productKey, device.deviceKey);\r\n });\r\n }\r\n });\r\n\r\n adapter.mqttClient.on(\"message\", onMessage);\r\n }\r\n }\r\n};\r\n"],
5
+ "mappings": "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",
6
6
  "names": ["adapter"]
7
7
  }
package/io-package.json CHANGED
@@ -1,8 +1,86 @@
1
1
  {
2
2
  "common": {
3
3
  "name": "zendure-solarflow",
4
- "version": "1.3.0",
4
+ "version": "1.3.1-alpha.5",
5
5
  "news": {
6
+ "1.3.1-alpha.5": {
7
+ "en": "Fix energyWh, energyWhMax and SOC in calculations if \"Low Voltage Check\" is not used, it will set the calculation soc to 0 if minSoc (discharge limit) is reached.\nFix missleading title in settings 'Username' to 'E-Mail'\nAdd calculation states for solar input 1 & 2",
8
+ "de": "Energie Wh, energyWhMax und SOC in Berechnungen, wenn \"Low Voltage Check\" nicht verwendet wird, wird die Berechnung soc auf 0 gesetzt, wenn minSoc (Entladungsgrenze) erreicht ist.\nFehlerhaften Titel in Einstellungen 'Username' zu 'E-Mail' beheben\nBerechnungszustände für den Solareingang 1 & 2 hinzufügen",
9
+ "ru": "Исправить энергию В, energyWhMax и SOC в расчетах, если не используется \"Low Voltage Check\", он установит расчетный сок до 0, если minSoc (дистрибуционный лимит) будет достигнут.\nФикс прокладка заголовка в настройках «Username» на «E-Mail»\nДобавить расчетные состояния для солнечного ввода 1 и 2",
10
+ "pt": "Energia fixa Wh, EnergyWhMax e SOC em cálculos se \"Low Voltage Check\" não for usado, ele irá definir o soc de cálculo para 0 se minSoc (limite de descarga) é alcançado.\nCorrigir o título de liderança em configurações 'Username' para 'E-Mail'\nAdicionar estados de cálculo para entrada solar 1 & 2",
11
+ "nl": "Vaste energie Wh, energyWhMax en SOC in berekeningen als \"Low Voltage Check\" niet wordt gebruikt, zal de berekening soc instellen op 0 als minSoc (ontladingslimiet) wordt bereikt.\nFix missleading titel in instellingen 'Username' naar 'E-Mail'\nBerekeningstoestanden toevoegen voor zonne-input 1 & 2",
12
+ "fr": "Fixer l'énergie Wh, energyWhMax et SOC dans les calculs si \"Low Voltage Check\" n'est pas utilisé, il mettra le calcul soc à 0 si minSoc (limite de décharge) est atteint.\nCorrection du titre de mauvaise conduite dans les paramètres 'Nom d'utilisateur' à 'E-Mail'\nAjouter les états de calcul pour l'entrée solaire 1 & 2",
13
+ "it": "Energia Wh, energyWhMax e SOC nei calcoli se \"Low Tensione Check\" non viene utilizzato, imposta il calcolo soc a 0 se si raggiunge minSoc (limite di scarico).\nFissare il titolo di missleading nelle impostazioni 'Username' a 'E-Mail'\nAggiungi stati di calcolo per l'ingresso solare 1 & 2",
14
+ "es": "Fijar energía Wh, energyWhMax y SOC en cálculos si \"Low Voltage Check\" no se utiliza, establecerá el cálculo soc a 0 si se alcanza minSoc (límite de descarga).\nFijar título de error en la configuración 'Username' a 'E-Mail'\nAgregar estados de cálculo para la entrada solar 1 & 2",
15
+ "pl": "Napraw energię Wh, energyWhMax i SOC w obliczeniach, jeśli \"Low voltage Check\" nie jest używany, to ustawi obliczenia soc do 0, jeśli minSoc (limit zrzutu) zostanie osiągnięty.\nNapraw misleading title w ustawieniach 'Nazwa użytkownika' na 'E- Mail'\nDodaj stany obliczeniowe dla wsadu słonecznego 1 i 2",
16
+ "uk": "Фіксована енергія Wh, energyWhMax і SOC в розрахунках, якщо не використовується перевірка напруги \"Low\", він буде встановлювати розрахунок соку до 0, якщо допускається мінімальна сума доходу.\nФіксувати ім'я користувача в 'E-Mail'\nДодавання розрахункових станів для сонячного введення 1 & 2",
17
+ "zh-cn": "修复能量 Wh, energyWhMax和SOC在计算中如果不使用\"低压检查\", 它会将计算 soc设为0, 如果达到 mensoc (放电限制).\n在设置“ 用户名 ” 中将错误的标题修复为“ E- Mail ”\n添加太阳输入 1 & 2 的计算状态"
18
+ },
19
+ "1.3.1-alpha.4": {
20
+ "en": "Fix energyWh, energyWhMax and SOC in calculations if \"Low Voltage Check\" is not used, it will set the calculation soc to 0 if minSoc (discharge limit) is reached.\nFix missleading title in settings 'Username' to 'E-Mail'\nAdd calculation states for solar input 1 & 2",
21
+ "de": "Energie Wh, energyWhMax und SOC in Berechnungen, wenn \"Low Voltage Check\" nicht verwendet wird, wird die Berechnung soc auf 0 gesetzt, wenn minSoc (Entladungsgrenze) erreicht ist.\nFehlerhaften Titel in Einstellungen 'Username' zu 'E-Mail' beheben\nBerechnungszustände für den Solareingang 1 & 2 hinzufügen",
22
+ "ru": "Исправить энергию В, energyWhMax и SOC в расчетах, если не используется \"Low Voltage Check\", он установит расчетный сок до 0, если minSoc (дистрибуционный лимит) будет достигнут.\nФикс прокладка заголовка в настройках «Username» на «E-Mail»\nДобавить расчетные состояния для солнечного ввода 1 и 2",
23
+ "pt": "Energia fixa Wh, EnergyWhMax e SOC em cálculos se \"Low Voltage Check\" não for usado, ele irá definir o soc de cálculo para 0 se minSoc (limite de descarga) é alcançado.\nCorrigir o título de liderança em configurações 'Username' para 'E-Mail'\nAdicionar estados de cálculo para entrada solar 1 & 2",
24
+ "nl": "Vaste energie Wh, energyWhMax en SOC in berekeningen als \"Low Voltage Check\" niet wordt gebruikt, zal de berekening soc instellen op 0 als minSoc (ontladingslimiet) wordt bereikt.\nFix missleading titel in instellingen 'Username' naar 'E-Mail'\nBerekeningstoestanden toevoegen voor zonne-input 1 & 2",
25
+ "fr": "Fixer l'énergie Wh, energyWhMax et SOC dans les calculs si \"Low Voltage Check\" n'est pas utilisé, il mettra le calcul soc à 0 si minSoc (limite de décharge) est atteint.\nCorrection du titre de mauvaise conduite dans les paramètres 'Nom d'utilisateur' à 'E-Mail'\nAjouter les états de calcul pour l'entrée solaire 1 & 2",
26
+ "it": "Energia Wh, energyWhMax e SOC nei calcoli se \"Low Tensione Check\" non viene utilizzato, imposta il calcolo soc a 0 se si raggiunge minSoc (limite di scarico).\nFissare il titolo di missleading nelle impostazioni 'Username' a 'E-Mail'\nAggiungi stati di calcolo per l'ingresso solare 1 & 2",
27
+ "es": "Fijar energía Wh, energyWhMax y SOC en cálculos si \"Low Voltage Check\" no se utiliza, establecerá el cálculo soc a 0 si se alcanza minSoc (límite de descarga).\nFijar título de error en la configuración 'Username' a 'E-Mail'\nAgregar estados de cálculo para la entrada solar 1 & 2",
28
+ "pl": "Napraw energię Wh, energyWhMax i SOC w obliczeniach, jeśli \"Low voltage Check\" nie jest używany, to ustawi obliczenia soc do 0, jeśli minSoc (limit zrzutu) zostanie osiągnięty.\nNapraw misleading title w ustawieniach 'Nazwa użytkownika' na 'E- Mail'\nDodaj stany obliczeniowe dla wsadu słonecznego 1 i 2",
29
+ "uk": "Фіксована енергія Wh, energyWhMax і SOC в розрахунках, якщо не використовується перевірка напруги \"Low\", він буде встановлювати розрахунок соку до 0, якщо допускається мінімальна сума доходу.\nФіксувати ім'я користувача в 'E-Mail'\nДодавання розрахункових станів для сонячного введення 1 & 2",
30
+ "zh-cn": "修复能量 Wh, energyWhMax和SOC在计算中如果不使用\"低压检查\", 它会将计算 soc设为0, 如果达到 mensoc (放电限制).\n在设置“ 用户名 ” 中将错误的标题修复为“ E- Mail ”\n添加太阳输入 1 & 2 的计算状态"
31
+ },
32
+ "1.3.1-alpha.3": {
33
+ "en": "Fix energyWh, energyWhMax and SOC in calculations if \"Low Voltage Check\" is not used, it will set the calculation soc to 0 if minSoc (discharge limit) is reached.\nFix missleading title in settings 'Username' to 'E-Mail'\nAdd calculation states for solar input 1 & 2",
34
+ "de": "Energie Wh, energyWhMax und SOC in Berechnungen, wenn \"Low Voltage Check\" nicht verwendet wird, wird die Berechnung soc auf 0 gesetzt, wenn minSoc (Entladungsgrenze) erreicht ist.\nFehlerhaften Titel in Einstellungen 'Username' zu 'E-Mail' beheben\nBerechnungszustände für den Solareingang 1 & 2 hinzufügen",
35
+ "ru": "Исправить энергию В, energyWhMax и SOC в расчетах, если не используется \"Low Voltage Check\", он установит расчетный сок до 0, если minSoc (дистрибуционный лимит) будет достигнут.\nФикс прокладка заголовка в настройках «Username» на «E-Mail»\nДобавить расчетные состояния для солнечного ввода 1 и 2",
36
+ "pt": "Energia fixa Wh, EnergyWhMax e SOC em cálculos se \"Low Voltage Check\" não for usado, ele irá definir o soc de cálculo para 0 se minSoc (limite de descarga) é alcançado.\nCorrigir o título de liderança em configurações 'Username' para 'E-Mail'\nAdicionar estados de cálculo para entrada solar 1 & 2",
37
+ "nl": "Vaste energie Wh, energyWhMax en SOC in berekeningen als \"Low Voltage Check\" niet wordt gebruikt, zal de berekening soc instellen op 0 als minSoc (ontladingslimiet) wordt bereikt.\nFix missleading titel in instellingen 'Username' naar 'E-Mail'\nBerekeningstoestanden toevoegen voor zonne-input 1 & 2",
38
+ "fr": "Fixer l'énergie Wh, energyWhMax et SOC dans les calculs si \"Low Voltage Check\" n'est pas utilisé, il mettra le calcul soc à 0 si minSoc (limite de décharge) est atteint.\nCorrection du titre de mauvaise conduite dans les paramètres 'Nom d'utilisateur' à 'E-Mail'\nAjouter les états de calcul pour l'entrée solaire 1 & 2",
39
+ "it": "Energia Wh, energyWhMax e SOC nei calcoli se \"Low Tensione Check\" non viene utilizzato, imposta il calcolo soc a 0 se si raggiunge minSoc (limite di scarico).\nFissare il titolo di missleading nelle impostazioni 'Username' a 'E-Mail'\nAggiungi stati di calcolo per l'ingresso solare 1 & 2",
40
+ "es": "Fijar energía Wh, energyWhMax y SOC en cálculos si \"Low Voltage Check\" no se utiliza, establecerá el cálculo soc a 0 si se alcanza minSoc (límite de descarga).\nFijar título de error en la configuración 'Username' a 'E-Mail'\nAgregar estados de cálculo para la entrada solar 1 & 2",
41
+ "pl": "Napraw energię Wh, energyWhMax i SOC w obliczeniach, jeśli \"Low voltage Check\" nie jest używany, to ustawi obliczenia soc do 0, jeśli minSoc (limit zrzutu) zostanie osiągnięty.\nNapraw misleading title w ustawieniach 'Nazwa użytkownika' na 'E- Mail'\nDodaj stany obliczeniowe dla wsadu słonecznego 1 i 2",
42
+ "uk": "Фіксована енергія Wh, energyWhMax і SOC в розрахунках, якщо не використовується перевірка напруги \"Low\", він буде встановлювати розрахунок соку до 0, якщо допускається мінімальна сума доходу.\nФіксувати ім'я користувача в 'E-Mail'\nДодавання розрахункових станів для сонячного введення 1 & 2",
43
+ "zh-cn": "修复能量 Wh, energyWhMax和SOC在计算中如果不使用\"低压检查\", 它会将计算 soc设为0, 如果达到 mensoc (放电限制).\n在设置“ 用户名 ” 中将错误的标题修复为“ E- Mail ”\n添加太阳输入 1 & 2 的计算状态"
44
+ },
45
+ "1.3.1-alpha.2": {
46
+ "en": "Fix energyWh, energyWhMax and SOC in calculations if \"Low Voltage Check\" is not used, it will set the calculation soc to 0 if minSoc (discharge limit) is reached.\nFix missleading title in settings 'Username' to 'E-Mail'\nAdd calculation states for solar input 1 & 2",
47
+ "de": "Energie Wh, energyWhMax und SOC in Berechnungen, wenn \"Low Voltage Check\" nicht verwendet wird, wird die Berechnung soc auf 0 gesetzt, wenn minSoc (Entladungsgrenze) erreicht ist.\nFehlerhaften Titel in Einstellungen 'Username' zu 'E-Mail' beheben\nBerechnungszustände für den Solareingang 1 & 2 hinzufügen",
48
+ "ru": "Исправить энергию В, energyWhMax и SOC в расчетах, если не используется \"Low Voltage Check\", он установит расчетный сок до 0, если minSoc (дистрибуционный лимит) будет достигнут.\nФикс прокладка заголовка в настройках «Username» на «E-Mail»\nДобавить расчетные состояния для солнечного ввода 1 и 2",
49
+ "pt": "Energia fixa Wh, EnergyWhMax e SOC em cálculos se \"Low Voltage Check\" não for usado, ele irá definir o soc de cálculo para 0 se minSoc (limite de descarga) é alcançado.\nCorrigir o título de liderança em configurações 'Username' para 'E-Mail'\nAdicionar estados de cálculo para entrada solar 1 & 2",
50
+ "nl": "Vaste energie Wh, energyWhMax en SOC in berekeningen als \"Low Voltage Check\" niet wordt gebruikt, zal de berekening soc instellen op 0 als minSoc (ontladingslimiet) wordt bereikt.\nFix missleading titel in instellingen 'Username' naar 'E-Mail'\nBerekeningstoestanden toevoegen voor zonne-input 1 & 2",
51
+ "fr": "Fixer l'énergie Wh, energyWhMax et SOC dans les calculs si \"Low Voltage Check\" n'est pas utilisé, il mettra le calcul soc à 0 si minSoc (limite de décharge) est atteint.\nCorrection du titre de mauvaise conduite dans les paramètres 'Nom d'utilisateur' à 'E-Mail'\nAjouter les états de calcul pour l'entrée solaire 1 & 2",
52
+ "it": "Energia Wh, energyWhMax e SOC nei calcoli se \"Low Tensione Check\" non viene utilizzato, imposta il calcolo soc a 0 se si raggiunge minSoc (limite di scarico).\nFissare il titolo di missleading nelle impostazioni 'Username' a 'E-Mail'\nAggiungi stati di calcolo per l'ingresso solare 1 & 2",
53
+ "es": "Fijar energía Wh, energyWhMax y SOC en cálculos si \"Low Voltage Check\" no se utiliza, establecerá el cálculo soc a 0 si se alcanza minSoc (límite de descarga).\nFijar título de error en la configuración 'Username' a 'E-Mail'\nAgregar estados de cálculo para la entrada solar 1 & 2",
54
+ "pl": "Napraw energię Wh, energyWhMax i SOC w obliczeniach, jeśli \"Low voltage Check\" nie jest używany, to ustawi obliczenia soc do 0, jeśli minSoc (limit zrzutu) zostanie osiągnięty.\nNapraw misleading title w ustawieniach 'Nazwa użytkownika' na 'E- Mail'\nDodaj stany obliczeniowe dla wsadu słonecznego 1 i 2",
55
+ "uk": "Фіксована енергія Wh, energyWhMax і SOC в розрахунках, якщо не використовується перевірка напруги \"Low\", він буде встановлювати розрахунок соку до 0, якщо допускається мінімальна сума доходу.\nФіксувати ім'я користувача в 'E-Mail'\nДодавання розрахункових станів для сонячного введення 1 & 2",
56
+ "zh-cn": "修复能量 Wh, energyWhMax和SOC在计算中如果不使用\"低压检查\", 它会将计算 soc设为0, 如果达到 mensoc (放电限制).\n在设置“ 用户名 ” 中将错误的标题修复为“ E- Mail ”\n添加太阳输入 1 & 2 的计算状态"
57
+ },
58
+ "1.3.1-alpha.1": {
59
+ "en": "Fix energyWh, energyWhMax and SOC in calculations if \"Low Voltage Check\" is not used, it will set the calculation soc to 0 if minSoc (discharge limit) is reached.\nFix missleading title in settings 'Username' to 'E-Mail'\nAdd calculation states for solar input 1 & 2",
60
+ "de": "Energie Wh, energyWhMax und SOC in Berechnungen, wenn \"Low Voltage Check\" nicht verwendet wird, wird die Berechnung soc auf 0 gesetzt, wenn minSoc (Entladungsgrenze) erreicht ist.\nFehlerhaften Titel in Einstellungen 'Username' zu 'E-Mail' beheben\nBerechnungszustände für den Solareingang 1 & 2 hinzufügen",
61
+ "ru": "Исправить энергию В, energyWhMax и SOC в расчетах, если не используется \"Low Voltage Check\", он установит расчетный сок до 0, если minSoc (дистрибуционный лимит) будет достигнут.\nФикс прокладка заголовка в настройках «Username» на «E-Mail»\nДобавить расчетные состояния для солнечного ввода 1 и 2",
62
+ "pt": "Energia fixa Wh, EnergyWhMax e SOC em cálculos se \"Low Voltage Check\" não for usado, ele irá definir o soc de cálculo para 0 se minSoc (limite de descarga) é alcançado.\nCorrigir o título de liderança em configurações 'Username' para 'E-Mail'\nAdicionar estados de cálculo para entrada solar 1 & 2",
63
+ "nl": "Vaste energie Wh, energyWhMax en SOC in berekeningen als \"Low Voltage Check\" niet wordt gebruikt, zal de berekening soc instellen op 0 als minSoc (ontladingslimiet) wordt bereikt.\nFix missleading titel in instellingen 'Username' naar 'E-Mail'\nBerekeningstoestanden toevoegen voor zonne-input 1 & 2",
64
+ "fr": "Fixer l'énergie Wh, energyWhMax et SOC dans les calculs si \"Low Voltage Check\" n'est pas utilisé, il mettra le calcul soc à 0 si minSoc (limite de décharge) est atteint.\nCorrection du titre de mauvaise conduite dans les paramètres 'Nom d'utilisateur' à 'E-Mail'\nAjouter les états de calcul pour l'entrée solaire 1 & 2",
65
+ "it": "Energia Wh, energyWhMax e SOC nei calcoli se \"Low Tensione Check\" non viene utilizzato, imposta il calcolo soc a 0 se si raggiunge minSoc (limite di scarico).\nFissare il titolo di missleading nelle impostazioni 'Username' a 'E-Mail'\nAggiungi stati di calcolo per l'ingresso solare 1 & 2",
66
+ "es": "Fijar energía Wh, energyWhMax y SOC en cálculos si \"Low Voltage Check\" no se utiliza, establecerá el cálculo soc a 0 si se alcanza minSoc (límite de descarga).\nFijar título de error en la configuración 'Username' a 'E-Mail'\nAgregar estados de cálculo para la entrada solar 1 & 2",
67
+ "pl": "Napraw energię Wh, energyWhMax i SOC w obliczeniach, jeśli \"Low voltage Check\" nie jest używany, to ustawi obliczenia soc do 0, jeśli minSoc (limit zrzutu) zostanie osiągnięty.\nNapraw misleading title w ustawieniach 'Nazwa użytkownika' na 'E- Mail'\nDodaj stany obliczeniowe dla wsadu słonecznego 1 i 2",
68
+ "uk": "Фіксована енергія Wh, energyWhMax і SOC в розрахунках, якщо не використовується перевірка напруги \"Low\", він буде встановлювати розрахунок соку до 0, якщо допускається мінімальна сума доходу.\nФіксувати ім'я користувача в 'E-Mail'\nДодавання розрахункових станів для сонячного введення 1 & 2",
69
+ "zh-cn": "修复能量 Wh, energyWhMax和SOC在计算中如果不使用\"低压检查\", 它会将计算 soc设为0, 如果达到 mensoc (放电限制).\n在设置“ 用户名 ” 中将错误的标题修复为“ E- Mail ”\n添加太阳输入 1 & 2 的计算状态"
70
+ },
71
+ "1.3.1-alpha.0": {
72
+ "en": "Fix energyWh, energyWhMax and SOC in calculations if \"Low Voltage Check\" is not used, it will set the caluclation soc to 0 if minSoc (discharge limit) is reached.",
73
+ "de": "Energie Wh, energyWhMax und SOC in Berechnungen, wenn \"Low Voltage Check\" nicht verwendet wird, wird es die Caluclation soc auf 0 setzen, wenn minSoc (Entladungsgrenze) erreicht ist.",
74
+ "ru": "Исправить энергию В, energyWhMax и SOC в расчетах, если не используется \"Low Voltage Check\", он установит калькуляцию soc до 0, если minSoc (до предела разгрузки) будет достигнут.",
75
+ "pt": "Energia fixa Wh, EnergyWhMax e SOC em cálculos se \"Low Voltage Check\" não for usado, ele irá definir o soc de calucação para 0 se minSoc (limite de descarga) é alcançado.",
76
+ "nl": "Vaste energie Wh, energyWhMax en SOC in berekeningen als \"Low Voltage Check\" niet wordt gebruikt, zal het instellen van de caluclation Soc op 0 als minSoc (ontladingslimiet) wordt bereikt.",
77
+ "fr": "Fixer l'énergie Wh, energyWhMax et SOC dans les calculs si \"Low Voltage Check\" n'est pas utilisé, il mettra la caluclation soc à 0 si minSoc (limite de décharge) est atteint.",
78
+ "it": "Energia Wh, energyWhMax e SOC nei calcoli se \"Low Tensione Check\" non viene utilizzato, imposta il soc di caluclazione a 0 se si raggiunge minSoc (limite di scarico).",
79
+ "es": "Fijar energía Wh, energyWhMax y SOC en cálculos si \"Low Voltage Check\" no se utiliza, establecerá la caluclation soc a 0 si se alcanza minSoc (límite de descarga).",
80
+ "pl": "Napraw energię Wh, energyWhMax i SOC w obliczeniach, jeśli \"Low voltage Check\" nie jest używany, to ustawi kalkulację soc do 0, jeśli minSoc (limit zrzutu) zostanie osiągnięty.",
81
+ "uk": "Фіксована енергія Wh, energyWhMax і SOC в розрахунках, якщо не використовується перевірка напруги \"Low\", він буде встановлювати кальуляції соку до 0, якщо допускається мінімальний ліміт витрати.",
82
+ "zh-cn": "修复能量 Wh, energyWhMax和SOC在计算中如果不使用\"低压检查\", 它会在达到mensoc(放电极限)时将卡路里 soc设置为0."
83
+ },
6
84
  "1.3.0": {
7
85
  "en": "Fix calculation for outputPackEnergy and packInputEnergy\nTrigger full telemetry update on adapter start\nAdd state and control for buzzer switch\nAdd state and control for bypass mode and automatic reset of bypass mode next day\nAdd states for pass (Bypass on/off), autoRecover (auto-mode for Bypass next day) and passMode (current bypass mode)\nAdd efficiency factor for calculations (96% charging, 92%-98%\\* for discharging - based on measuring from VoltAmpereLux Youtube channel - THANKS!)\nChanged calculations timeframe from 10secs to 30secs (performance related)",
8
86
  "de": "Fixberechnung für die Ausgabe PackEnergy und PackInputEnergy\nTrigger Full Telemetrie Update auf Adapterstart\nZustand und Steuerung für Summer Switch hinzufügen\nZustand und Steuerung für Bypass-Modus und automatische Rückstellung des Bypass-Modus am nächsten Tag hinzufügen\nFügen Sie Zustände für Pass (Bypass on/off), autoRecover (Auto-Modus für Bypass nächsten Tag) und passMode (current bypass mode) hinzu\nEffizienzfaktor für Berechnungen hinzufügen (96% Aufladung, 92%-98%\\* zur Entladung - basierend auf der Messung von VoltAmpere Lux Youtube Kanal - THANKS!)\nGeänderte Berechnungsdauer von 10 Sekunden auf 30 Sekunden (performance related)",
@@ -15,87 +93,8 @@
15
93
  "pl": "Napraw obliczenie dla wyjścia PackEnergy and packInputEnergy\nPełna aktualizacja telemetrii podczas uruchamiania adaptera\nDodaj stan i sterowanie przełącznika brzęczyka\nDodaj stan i sterowanie dla trybu bajpasu i automatycznego resetowania trybu bajpasu następnego dnia\nDodaj stany dla pass (Bypass włączone / wyłączone), autoRecover (tryb auto- dla Bypass następnego dnia) i passMode (obecny tryb bypass)\nDodać współczynnik wydajności do obliczeń (96% doładowania, 92% -98%\\ * do rozładowania - w oparciu o pomiar z VoltaAmpere Lux YouTube kanał - Dzięki!)\nZmienione ramy czasowe obliczeń od 10 do 30 sekund (związane z wydajnością)",
16
94
  "uk": "Фіксований розрахунок на виході ПакетЕнергія та пакетІнпутаціяЕнергія\nТригер повного оновлення телеметрії на старті адаптера\nДодати стан та контроль за комутатором\nДодати стан та контроль за режимом обходу та автоматичним скиданням режиму обходу наступного дня\nДодати стани для проходу (Вхід на / вихід), autoRecover (auto-mode for Bypass наступного дня) і passMode (поточний режим обходу)\nДодавання коефіцієнта ефективності розрахунку (96% зарядки, 92%-98%\\* для розвантаження - на основі вимірювання від VoltAmpere Lux Youtube канал - ДЯКУ!)\nЗмінено графіки розрахунку від 10secs до 30secs",
17
95
  "zh-cn": "修正输出计算 包能源与包投入能源\n适配器启动时触发全遥测更新\n为铃声开关添加状态和控制\n第二天添加绕行模式和绕行模式自动重置的状态和控制\n添加通过状态( Bypass on/off), 自动恢复( Auto-mode for Bypass 第二天) 和通过模式( 当前绕行模式)\n增加计算效率系数(充电96%,放电92%-98%)——根据VoltAmpere的测量结果 Lux Youtube频道 - 谢谢\n计算时限从10秒改为30秒(业绩相关)"
18
- },
19
- "1.2.7": {
20
- "en": "Fix calculation for outputPackEnergy and packInputEnergy\nTrigger full telemetry update on adapter start\nAdd state and control for buzzer switch\nAdd state and control for bypass mode and automatic reset of bypass mode next day",
21
- "de": "Fixberechnung für die Ausgabe PackEnergy und PackInputEnergy\nTrigger Full Telemetrie Update auf Adapterstart\nZustand und Steuerung für Summer Switch hinzufügen\nZustand und Steuerung für Bypass-Modus und automatische Rückstellung des Bypass-Modus am nächsten Tag hinzufügen",
22
- "ru": "Исчисление на основе исходных данных PackEnergy и packInputEnergy\nТреггер полного обновления телеметрии на запуске адаптера\nДобавить состояние и управление для выключателя\nДобавить состояние и управление для шунт-режима и автоматическая перезагрузка режима шунтирования на следующий день",
23
- "pt": "Cálculo fixo para saída PackEnergy e packInputEnergy\nAtivar atualização de telemetria completa no início do adaptador\nAdicionar estado e controle para interruptor de buzzer\nAdicionar estado e controle para o modo bypass e reset automático do modo bypass no dia seguinte",
24
- "nl": "Fix berekening voor output PackEnergy en PackInputEnergy\nVolledige telemetrie-update van de adapter starten\nStatus en controle voor zoemerschakelaar toevoegen\nToevoegen status en controle voor bypass modus en automatische reset van bypass modus volgende dag",
25
- "fr": "Correction du calcul de la sortie PackÉnergie et packInputÉnergie\nMise à jour complète de la télémétrie sur le démarrage de l'adaptateur\nAjouter l'état et le contrôle pour interrupteur de buzzer\nAjouter l'état et la commande pour le mode de contournement et la remise automatique du mode de contournement le lendemain",
26
- "it": "Fissare il calcolo per l'output PackEnergy e packInputEnergia\nAggiornamento completo della telemetria del trigger all'avvio dell'adattatore\nAggiungi stato e controllo per interruttore buzzer\nAggiungi stato e controllo per la modalità bypass e reset automatico della modalità bypass il giorno successivo",
27
- "es": "Cálculo fijo para la salida PackEnergía y paqueteInputEnergía\nTrigger actualización completa de telemetría en el comienzo del adaptador\nAñadir estado y control para interruptor de zumbido\nAgregar estado y control para modo bypass y reinicio automático del modo bypass al día siguiente",
28
- "pl": "Napraw obliczenie dla wyjścia PackEnergy and packInputEnergy\nPełna aktualizacja telemetrii podczas uruchamiania adaptera\nDodaj stan i sterowanie przełącznika brzęczyka\nDodaj stan i sterowanie dla trybu bajpasu i automatycznego resetowania trybu bajpasu następnego dnia",
29
- "uk": "Фіксований розрахунок на виході ПакетЕнергія та пакетІнпутаціяЕнергія\nТригер повного оновлення телеметрії на старті адаптера\nДодати стан та контроль за комутатором\nДодати стан та контроль за режимом обходу та автоматичним скиданням режиму обходу наступного дня",
30
- "zh-cn": "修正输出计算 包能源与包投入能源\n适配器启动时触发全遥测更新\n为铃声开关添加状态和控制\n第二天添加绕行模式和绕行模式自动重置的状态和控制"
31
- },
32
- "1.2.6": {
33
- "en": "Add states for pass (Bypass on/off), autoRecover (auto-mode for Bypass next day) and passMode (current bypass mode)\nAdd efficiency factor for calculations (96% charging, 92%-98%* for discharging)\nChanged calculations timeframe from 10secs to 30secs (performance related)",
34
- "de": "Fügen Sie Zustände für Pass (Bypass on/off), autoRecover (Auto-Modus für Bypass nächsten Tag) und passMode (current bypass mode) hinzu\nEffizienzfaktor für Berechnungen hinzufügen (96% Aufladung, 92%-98%* zur Entladung)\nGeänderte Berechnungsdauer von 10 Sekunden auf 30 Sekunden (performance related)",
35
- "ru": "Добавить состояния для прохода (Bypass on/off), autoRecover (автомод для Bypass на следующий день) и passMode (текущий режим обхода)\nДобавить коэффициент эффективности для расчетов (96% зарядки, 92%-98%* для разрядки)\nИзменение сроков расчетов с 10секс до 30секс (связанные с производительностью)",
36
- "pt": "Adicionar estados para passe (Bypass on/off), autoRecover (automodo para Bypass no dia seguinte) e passMode (modo de bypass atual)\nAdicionar fator de eficiência para cálculos (carga de 96%, 92%-98%* para descarregamento)\nPrazo de cálculos alterados de 10secs para 30secs (relacionado com o desempenho)",
37
- "nl": "Toevoegen statussen voor pass (Bypass aan/uit), autoRecover (auto-modus voor Bypass volgende dag) en passMode (huidige bypass modus)\nToevoegen efficiëntiefactor voor berekeningen (96% opladen, 92%-98%* voor het lossen)\nVeranderde berekeningsperiode van 10secs naar 30secs (prestatiegerelateerd)",
38
- "fr": "Ajouter les états de passage (Bypass on/off), autoRecover (auto-mode pour Bypass le lendemain) et passMode (mode de contournement courant)\nAjouter le facteur d'efficacité pour les calculs (96% de charge, 92%-98%* de décharge)\nTemps de calcul modifié de 10secs à 30secs (lié à la performance)",
39
- "it": "Aggiungi stati per pass (Bypass on/off), autoRecover (mode automatico per Bypass il giorno successivo) e passMode (modalità bypass corrente)\nAggiungi fattore di efficienza per i calcoli (96% di carica, 92%-98%* per lo scarico)\nTempo di calcolo modificato da 10sec a 30secs (correlazione delle prestazioni)",
40
- "es": "Añadir estados para pasar (Bypass on/off), autoRecover (auto-mode for Bypass next day) y passMode (modo de bypass corriente)\nAgregue el factor de eficiencia para los cálculos (96% de carga, 92%-98%* para descarga)\nCambio de cálculos timeframe de 10 segundos a 30 segundos (con relación al desempeño)",
41
- "pl": "Dodaj stany dla pass (Bypass włączone / wyłączone), autoRecover (tryb auto- dla Bypass następnego dnia) i passMode (obecny tryb bypass)\nDodać współczynnik wydajności do obliczeń (96% ładowania, 92% -98% * do rozładowania)\nZmienione ramy czasowe obliczeń od 10 do 30 sekund (związane z wydajnością)",
42
- "uk": "Додати стани для проходу (Вхід на / вихід), autoRecover (auto-mode for Bypass наступного дня) і passMode (поточний режим обходу)\nДодавання коефіцієнта ефективності розрахунку (96% зарядки, 92%-98%* для розвантаження)\nЗмінено графіки розрахунку від 10secs до 30secs",
43
- "zh-cn": "添加通过状态( Bypass on/off), 自动恢复( Auto-mode for Bypass 第二天) 和通过模式( 当前绕行模式)\n增加计算效率系数(充电96%,排气92%-98%)\n计算时限从10秒改为30秒(业绩相关)"
44
- },
45
- "1.2.5": {
46
- "en": "Fix error \"Read-only\" state written without ack-flag",
47
- "de": "Fehler \"nur lesen\" Zustand ohne ack-flag geschrieben",
48
- "ru": "Fix ошибка \"только для рекламы\" состояние написано без ack-flag",
49
- "pt": "Corrigir erro \"apenas leitura\" estado escrito sem ack-flag",
50
- "nl": "Fix error \"Alleen-lezen\" staat geschreven zonder ack-vlag",
51
- "fr": "Correction de l'erreur \"Read-only\" état écrit sans ack-flag",
52
- "it": "Corretto errore \"solo lettura\" stato scritto senza ack-flag",
53
- "es": "Correr error \"sólo lectura\" estado escrito sin ack-flag",
54
- "pl": "Popraw błąd \"Read- only\" stan napisany bez znacznika",
55
- "uk": "Виправлення помилки \"Читання-тільки\" стан, написаний без ack-flag",
56
- "zh-cn": "校正“ 仅读” 状态, 没有阿克旗"
57
- },
58
- "1.2.4": {
59
- "en": "Use setInterval instead of cronjob for refreshing access token",
60
- "de": "Verwenden Sie setInterval anstelle von cronjob für den erfrischenden Zugang zuken",
61
- "ru": "Использовать setInterval вместо cronjob для обновления токена доступа",
62
- "pt": "Use setInterval em vez de cronjob para atualizar o token de acesso",
63
- "nl": "Gebruik setInterval in plaats van cronjob voor verfrissende toegang token",
64
- "fr": "Utiliser setInterval au lieu de cronjob pour rafraîchir l'accès jeton",
65
- "it": "Utilizzare setInterval invece di cronjob per rinfrescare l'accesso token",
66
- "es": "Use setInterval en lugar de cronjob para el acceso refrescante token",
67
- "pl": "Użyj setInterval zamiast cronjob do odświeżania token dostępu",
68
- "uk": "Використовуйте setInterval замість cronjob для оновлення доступу token",
69
- "zh-cn": "使用设置 Interval 而非 cronjob 来刷新访问符"
70
- },
71
- "1.2.3": {
72
- "en": "Fix ACK on onStateChange\nUpdate Readme",
73
- "de": "Reparieren Sie ACK auf onState Veränderung\nUpdate Reader",
74
- "ru": "Fix ACK onState Изменение\nReadme",
75
- "pt": "Fix ACK onState Variação\nAtualizar o Readme",
76
- "nl": "Fix ACK op onState Verschil\nReadme bijwerken",
77
- "fr": "Correction de l'ACK sur l'état Changement\nMettre à jour Readme",
78
- "it": "Riparare il back suState Cambiamento\nAggiornamento",
79
- "es": "Arregla el estado Cambio\nActualización Readme",
80
- "pl": "Napraw ACK w stanie Zmiana\nAktualizacja Readme",
81
- "uk": "Виправлення ACK на onState Зареєструватися\nОновлення Readme",
82
- "zh-cn": "在状态上修复ACK 变动\n更新读取器"
83
- },
84
- "1.2.2": {
85
- "en": "Fix issue that renamed devices could not be found.\nAdd states for name, product name, serial ID and configured server.\nMake \"energyWhMax\" State writable, so you can adjust the max Value.\nSent a warning if a device is configured for a server not in use.",
86
- "de": "Problem behoben, dass umbenannte Geräte nicht gefunden werden konnten.\nFügen Sie Zustände für Name, Produktname, Serien-ID und konfigurierten Server hinzu.\nMachen Sie \"energyWhMax\" Zustand schreibbar, so können Sie den Maximalwert anpassen.\nGesendet eine Warnung, wenn ein Gerät für einen nicht im Einsatz befindlichen Server konfiguriert ist.",
87
- "ru": "Исправьте проблему, которую переименованные устройства не удалось найти.\nДобавить состояния для имени, имени продукта, последовательного идентификатора и настроенного сервера.\nСделайте состояние «energyWhMax» действительным, так что вы можете настроить максимальное значение.\nОтправить предупреждение, если устройство настроено для сервера, не используемого.",
88
- "pt": "Corrigir problema que os dispositivos renomeados não poderiam ser encontrados.\nAdicione estados para nome, nome do produto, ID serial e servidor configurado.\nFaça \"energyWhMax\" Estado writable, para que você possa ajustar o valor máximo.\nEnvia um aviso se um dispositivo estiver configurado para um servidor não estiver em uso.",
89
- "nl": "Fix probleem dat hernoemde apparaten kon niet worden gevonden.\nVoeg statuss toe voor naam, productnaam, seriële ID en geconfigureerde server.\nMaak \"energyWhMax\" staat beschrijfbaar, zodat u de maximale waarde kunt aanpassen.\nVerzonden een waarschuwing als een apparaat is geconfigureerd voor een server die niet in gebruik is.",
90
- "fr": "Correction d'un problème qui a été rebaptisé dispositifs ne pouvait pas être trouvé.\nAjouter des états pour le nom, le nom du produit, l'ID série et le serveur configuré.\nFaire \"energyWhMax\" État enregistrable, de sorte que vous pouvez ajuster la valeur maximale.\nEnvoyer un avertissement si un périphérique est configuré pour un serveur non utilisé.",
91
- "it": "Risolvere il problema che i dispositivi ribattezzati non potrebbero essere trovati.\nAggiungi stati per nome, nome del prodotto, ID seriale e server configurato.\nRendere \"energyWhMax\" Stato scrivibile, in modo da poter regolare il valore massimo.\nInviare un avviso se un dispositivo è configurato per un server non in uso.",
92
- "es": "Fijar el problema que no se pueden encontrar dispositivos renombrados.\nAñadir estados para nombre, nombre de producto, ID de serie y servidor configurado.\nHacer \"energíaWhMax\" estado writable, por lo que puede ajustar el valor máximo.\nEnviamos una advertencia si un dispositivo está configurado para un servidor que no está en uso.",
93
- "pl": "Naprawiono problem, że nie można było znaleźć przemianowanych urządzeń.\nDodaj stany nazwy, nazwy produktu, seryjnego identyfikatora i skonfigurowanego serwera.\nDodać \"energyWhMax\" Stan zapisywalny, dzięki czemu można dostosować wartość max.\nWysłał ostrzeżenie, jeśli urządzenie jest skonfigurowane dla serwera, który nie jest używany.",
94
- "uk": "Виправлення проблеми, які не можуть бути знайдені пристрої.\nДодайте штати для імені, назви товару, послідовний ідентифікатор і налаштований сервер.\nЗробіть \"енергетикаWhMax\" Держава, тому ви можете регулювати максимальну вартість.\nУвімкніть попередження, якщо пристрій налаштовано на сервер не у використанні.",
95
- "zh-cn": "无法找到重命名的设备 .\n添加名称、产品名称、序列ID和配置服务器的状态 .\n让“ energyWhMax” 状态可写入, 这样您就可以调整最大值 .\n如果为服务器配置了设备, 则发送警告 ."
96
96
  }
97
97
  },
98
- "title": "Zendure Solarflow",
99
98
  "titleLang": {
100
99
  "en": "Zendure Solarflow",
101
100
  "de": "Zendure Solarflow",
@@ -130,6 +129,9 @@
130
129
  "Solarflow"
131
130
  ],
132
131
  "license": "MIT",
132
+ "licenseInformation": {
133
+ "type": "free"
134
+ },
133
135
  "platform": "Javascript/Node.js",
134
136
  "main": "build/main.js",
135
137
  "icon": "zendure-solarflow.png",
@@ -139,6 +141,7 @@
139
141
  "loglevel": "info",
140
142
  "mode": "daemon",
141
143
  "type": "energy",
144
+ "tier": 2,
142
145
  "compact": true,
143
146
  "connectionType": "cloud",
144
147
  "dataSource": "poll",
package/package.json CHANGED
@@ -1,13 +1,13 @@
1
1
  {
2
2
  "name": "iobroker.zendure-solarflow",
3
- "version": "1.3.0",
3
+ "version": "1.3.1-alpha.5",
4
4
  "description": "zendure-solarflow",
5
5
  "author": {
6
6
  "name": "Peter",
7
7
  "email": "peter.frommert@outlook.com"
8
8
  },
9
- "homepage": "https://github.com/nograx/ioBroker.zendure-solarflow",
10
9
  "license": "MIT",
10
+ "homepage": "https://github.com/nograx/ioBroker.zendure-solarflow",
11
11
  "keywords": [
12
12
  "Zendure",
13
13
  "Solarflow"
@@ -20,7 +20,7 @@
20
20
  "node": ">= 18"
21
21
  },
22
22
  "dependencies": {
23
- "@iobroker/adapter-core": "^3.0.4",
23
+ "@iobroker/adapter-core": "^3.0.6",
24
24
  "@types/node-schedule": "^2.1.6",
25
25
  "axios": "^1.5.1",
26
26
  "mqtt": "^5.1.3"