iobroker.zendure-solarflow 1.1.11 → 1.1.13

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/adapterService.ts"],
4
- "sourcesContent": ["import { ZendureSolarflow } from \"../main\";\r\nimport { IPackData } from \"../models/IPackData\";\r\nimport { ISolarFlowDeviceDetails } from \"../models/ISolarFlowDeviceDetails\";\r\nimport { getDeviceList } from \"./webService\";\r\n\r\n/* eslint-disable @typescript-eslint/indent */\r\nconst createCalculationStates = async (\r\n adapter: ZendureSolarflow,\r\n productKey: string,\r\n deviceKey: string,\r\n): Promise<void> => {\r\n /*\r\n Start Solar Input Energy states\r\n */\r\n await adapter?.extendObjectAsync(\r\n productKey + \".\" + deviceKey + \".calculations.solarInputEnergyTodayWh\",\r\n {\r\n type: \"state\",\r\n common: {\r\n name: {\r\n de: \"Heutiger Solarertrag (Wh)\",\r\n en: \"Todays solar input (Wh)\",\r\n },\r\n type: \"number\",\r\n desc: \"solarInputEnergyTodayWh\",\r\n role: \"value.energy\",\r\n read: true,\r\n write: false,\r\n unit: \"Wh\",\r\n },\r\n native: {},\r\n },\r\n );\r\n\r\n await adapter?.extendObjectAsync(\r\n productKey + \".\" + deviceKey + \".calculations.solarInputEnergyTodaykWh\",\r\n {\r\n type: \"state\",\r\n common: {\r\n name: {\r\n de: \"Heutiger Solarertrag (kWh)\",\r\n en: \"Todays solar input (kWh)\",\r\n },\r\n type: \"number\",\r\n desc: \"solarInputEnergyTodaykWh\",\r\n role: \"value.energy\",\r\n read: true,\r\n write: false,\r\n unit: \"kWh\",\r\n },\r\n native: {},\r\n },\r\n );\r\n\r\n /*\r\n Start output pack Energy states\r\n */\r\n await adapter?.extendObjectAsync(\r\n productKey + \".\" + deviceKey + \".calculations.outputPackEnergyTodayWh\",\r\n {\r\n type: \"state\",\r\n common: {\r\n name: {\r\n de: \"Heutige Ladung zum Akku (Wh)\",\r\n en: \"todays charge energy to battery (Wh)\",\r\n },\r\n type: \"number\",\r\n desc: \"outputPackEnergyTodayWh\",\r\n role: \"value.energy\",\r\n read: true,\r\n write: false,\r\n unit: \"Wh\",\r\n },\r\n native: {},\r\n },\r\n );\r\n\r\n await adapter?.extendObjectAsync(\r\n productKey + \".\" + deviceKey + \".calculations.outputPackEnergyTodaykWh\",\r\n {\r\n type: \"state\",\r\n common: {\r\n name: {\r\n de: \"Heutige Ladung zum Akku (kWh)\",\r\n en: \"todays charge energy to battery (kWh)\",\r\n },\r\n type: \"number\",\r\n desc: \"outputPackEnergyTodaykWh\",\r\n role: \"value.energy\",\r\n read: true,\r\n write: false,\r\n unit: \"kWh\",\r\n },\r\n native: {},\r\n },\r\n );\r\n\r\n /*\r\n Start Pack Input Energy states\r\n */\r\n await adapter?.extendObjectAsync(\r\n productKey + \".\" + deviceKey + \".calculations.packInputEnergyTodayWh\",\r\n {\r\n type: \"state\",\r\n common: {\r\n name: {\r\n de: \"Heutige Ladung zum Akku (Wh)\",\r\n en: \"todays charge energy to battery (Wh)\",\r\n },\r\n type: \"number\",\r\n desc: \"packInputEnergyTodayWh\",\r\n role: \"value.energy\",\r\n read: true,\r\n write: false,\r\n unit: \"Wh\",\r\n },\r\n native: {},\r\n },\r\n );\r\n\r\n await adapter?.extendObjectAsync(\r\n productKey + \".\" + deviceKey + \".calculations.packInputEnergyTodaykWh\",\r\n {\r\n type: \"state\",\r\n common: {\r\n name: {\r\n de: \"Heutige Einspeisung aus Akku (kWh)\",\r\n en: \"Todays discharge energy from battery (kWh)\",\r\n },\r\n type: \"number\",\r\n desc: \"packInputEnergyTodaykWh\",\r\n role: \"value.energy\",\r\n read: true,\r\n write: false,\r\n unit: \"kWh\",\r\n },\r\n native: {},\r\n },\r\n );\r\n\r\n /*\r\n Start outputHome Energy states\r\n */\r\n await adapter?.extendObjectAsync(\r\n productKey + \".\" + deviceKey + \".calculations.outputHomeEnergyTodayWh\",\r\n {\r\n type: \"state\",\r\n common: {\r\n name: {\r\n de: \"Heutige Einspeisung ins Haus (Wh)\",\r\n en: \"Todays input energy to home (Wh)\",\r\n },\r\n type: \"number\",\r\n desc: \"outputHomeEnergyTodayWh\",\r\n role: \"value.energy\",\r\n read: true,\r\n write: false,\r\n unit: \"Wh\",\r\n },\r\n native: {},\r\n },\r\n );\r\n\r\n await adapter?.extendObjectAsync(\r\n productKey + \".\" + deviceKey + \".calculations.outputHomeEnergyTodaykWh\",\r\n {\r\n type: \"state\",\r\n common: {\r\n name: {\r\n de: \"Heutige Einspeisung ins Haus (kWh)\",\r\n en: \"Todays input energy to home (kWh)\",\r\n },\r\n type: \"number\",\r\n desc: \"outputHomeEnergyTodaykWh\",\r\n role: \"value.energy\",\r\n read: true,\r\n write: false,\r\n unit: \"kWh\",\r\n },\r\n native: {},\r\n },\r\n );\r\n /*\r\n End Energy states\r\n */\r\n\r\n // Calculation input time\r\n await adapter?.extendObjectAsync(\r\n productKey + \".\" + deviceKey + \".calculations.remainInputTime\",\r\n {\r\n type: \"state\",\r\n common: {\r\n name: {\r\n de: \"Erwartete Ladedauer (hh:mm)\",\r\n en: \"remaining charge time (hh:mm)\",\r\n },\r\n type: \"string\",\r\n desc: \"calcRemainInputTime\",\r\n role: \"value\",\r\n read: true,\r\n write: false,\r\n },\r\n native: {},\r\n },\r\n );\r\n\r\n // Calculation remainOutTime\r\n await adapter?.extendObjectAsync(\r\n productKey + \".\" + deviceKey + \".calculations.remainOutTime\",\r\n {\r\n type: \"state\",\r\n common: {\r\n name: {\r\n de: \"Erwartete Entladedauer (hh:mm)\",\r\n en: \"remaining discharge time (hh:mm)\",\r\n },\r\n type: \"string\",\r\n desc: \"calcRemainOutTime\",\r\n role: \"value\",\r\n read: true,\r\n write: false,\r\n },\r\n native: {},\r\n },\r\n );\r\n};\r\n\r\nconst createControlStates = async (\r\n adapter: ZendureSolarflow,\r\n productKey: string,\r\n deviceKey: string,\r\n): Promise<void> => {\r\n // Create control folder\r\n await adapter?.extendObjectAsync(productKey + \".\" + deviceKey + \".control\", {\r\n type: \"channel\",\r\n common: {\r\n name: {\r\n de: \"Steuerung f\u00FCr Ger\u00E4t \" + deviceKey,\r\n en: \"Control for device \" + deviceKey,\r\n },\r\n },\r\n native: {},\r\n });\r\n\r\n // State zum Setzen des Output Limit\r\n await adapter?.extendObjectAsync(\r\n productKey + \".\" + deviceKey + \".control.\" + \"setOutputLimit\",\r\n {\r\n type: \"state\",\r\n common: {\r\n name: {\r\n de: \"Einzustellende Ausgangsleistung\",\r\n en: \"Control of the output limit\",\r\n },\r\n type: \"number\",\r\n desc: \"setOutputLimit\",\r\n role: \"value.power\",\r\n read: true,\r\n write: true,\r\n min: 0,\r\n unit: \"W\",\r\n },\r\n native: {},\r\n },\r\n );\r\n\r\n // State zum Setzen des Charge Limit\r\n await adapter?.extendObjectAsync(\r\n productKey + \".\" + deviceKey + \".control.\" + \"chargeLimit\",\r\n {\r\n type: \"state\",\r\n common: {\r\n name: {\r\n de: \"Setzen des Lade-Limits\",\r\n en: \"Control of the charge limit\",\r\n },\r\n type: \"number\",\r\n desc: \"chargeLimit\",\r\n role: \"value.battery\",\r\n read: true,\r\n write: true,\r\n min: 40,\r\n max: 100,\r\n unit: \"%\",\r\n },\r\n native: {},\r\n },\r\n );\r\n\r\n // State zum Setzen des Discharge Limit\r\n await adapter?.extendObjectAsync(\r\n productKey + \".\" + deviceKey + \".control.\" + \"dischargeLimit\",\r\n {\r\n type: \"state\",\r\n common: {\r\n name: {\r\n de: \"Setzen des Entlade-Limits\",\r\n en: \"Control of the discharge limit\",\r\n },\r\n type: \"number\",\r\n desc: \"dischargeLimit\",\r\n role: \"value.battery\",\r\n read: true,\r\n write: true,\r\n min: 0,\r\n max: 90,\r\n unit: \"%\",\r\n },\r\n native: {},\r\n },\r\n );\r\n\r\n // Subcribe to control states\r\n adapter?.subscribeStates(\r\n productKey + \".\" + deviceKey + \".control.\" + \"setOutputLimit\",\r\n );\r\n\r\n adapter?.subscribeStates(\r\n productKey + \".\" + deviceKey + \".control.\" + \"chargeLimit\",\r\n );\r\n\r\n adapter?.subscribeStates(\r\n productKey + \".\" + deviceKey + \".control.\" + \"dischargeLimit\",\r\n );\r\n};\r\n\r\nexport const createSolarFlowStates = async (\r\n adapter: ZendureSolarflow,\r\n productKey: string,\r\n deviceKey: string,\r\n): Promise<void> => {\r\n productKey = productKey.replace(adapter.FORBIDDEN_CHARS, \"\");\r\n deviceKey = deviceKey.replace(adapter.FORBIDDEN_CHARS, \"\");\r\n\r\n // Create device (e.g. the product type -> SolarFlow)\r\n await adapter?.extendObjectAsync(productKey, {\r\n type: \"device\",\r\n common: {\r\n name: { de: \"Produkt \" + productKey, en: \"Product \" + productKey },\r\n },\r\n native: {},\r\n });\r\n\r\n // Create channel (e.g. the device specific key)\r\n await adapter?.extendObjectAsync(productKey + \".\" + deviceKey, {\r\n type: \"channel\",\r\n common: {\r\n name: { de: \"Device Key \" + deviceKey, en: \"Device Key \" + deviceKey },\r\n },\r\n native: {},\r\n });\r\n\r\n // Create calculations folder\r\n await adapter?.extendObjectAsync(\r\n productKey + \".\" + deviceKey + \".calculations\",\r\n {\r\n type: \"channel\",\r\n common: {\r\n name: {\r\n de: \"Berechnungen f\u00FCr Ger\u00E4t \" + deviceKey,\r\n en: \"Calculations for Device \" + deviceKey,\r\n },\r\n },\r\n native: {},\r\n },\r\n );\r\n\r\n // Create pack data folder\r\n await adapter?.extendObjectAsync(productKey + \".\" + deviceKey + \".packData\", {\r\n type: \"channel\",\r\n common: {\r\n name: {\r\n de: \"Akku Packs\",\r\n en: \"Battery packs\",\r\n },\r\n },\r\n native: {},\r\n });\r\n\r\n await adapter?.extendObjectAsync(\r\n productKey + \".\" + deviceKey + \".\" + \"lastUpdate\",\r\n {\r\n type: \"state\",\r\n common: {\r\n name: { de: \"Letztes Update\", en: \"Last Update\" },\r\n type: \"number\",\r\n desc: \"lastUpdate\",\r\n role: \"value.time\",\r\n read: true,\r\n write: false,\r\n },\r\n native: {},\r\n },\r\n );\r\n\r\n await adapter?.extendObjectAsync(\r\n productKey + \".\" + deviceKey + \".\" + \"electricLevel\",\r\n {\r\n type: \"state\",\r\n common: {\r\n name: { de: \"SOC Gesamtsystem\", en: \"SOC of the system\" },\r\n type: \"number\",\r\n desc: \"electricLevel\",\r\n role: \"value.battery\",\r\n read: true,\r\n write: false,\r\n unit: \"%\",\r\n },\r\n native: {},\r\n },\r\n );\r\n\r\n await adapter?.extendObjectAsync(\r\n productKey + \".\" + deviceKey + \".\" + \"outputHomePower\",\r\n {\r\n type: \"state\",\r\n common: {\r\n name: { de: \"Ausgangsleistung\", en: \"output power\" },\r\n type: \"number\",\r\n desc: \"outputHomePower\",\r\n role: \"value.power\",\r\n read: true,\r\n write: false,\r\n unit: \"W\",\r\n },\r\n native: {},\r\n },\r\n );\r\n\r\n await adapter?.extendObjectAsync(\r\n productKey + \".\" + deviceKey + \".\" + \"outputLimit\",\r\n {\r\n type: \"state\",\r\n common: {\r\n name: { de: \"Limit der Ausgangsleistung\", en: \"limit of output power\" },\r\n type: \"number\",\r\n desc: \"outputLimit\",\r\n role: \"value.power\",\r\n read: true,\r\n write: false,\r\n unit: \"W\",\r\n },\r\n native: {},\r\n },\r\n );\r\n\r\n await adapter?.extendObjectAsync(\r\n productKey + \".\" + deviceKey + \".\" + \"outputPackPower\",\r\n {\r\n type: \"state\",\r\n common: {\r\n name: { de: \"Ladeleistung zum Akku\", en: \"charge power\" },\r\n type: \"number\",\r\n desc: \"outputPackPower\",\r\n role: \"value.power\",\r\n read: true,\r\n write: false,\r\n unit: \"W\",\r\n },\r\n native: {},\r\n },\r\n );\r\n\r\n await adapter?.extendObjectAsync(\r\n productKey + \".\" + deviceKey + \".\" + \"packInputPower\",\r\n {\r\n type: \"state\",\r\n common: {\r\n name: { de: \"Entladeleistung zum Akku\", en: \"discharge power\" },\r\n type: \"number\",\r\n desc: \"packInputPower\",\r\n role: \"value.power\",\r\n read: true,\r\n write: false,\r\n unit: \"W\",\r\n },\r\n native: {},\r\n },\r\n );\r\n\r\n await adapter?.extendObjectAsync(\r\n productKey + \".\" + deviceKey + \".\" + \"solarInputPower\",\r\n {\r\n type: \"state\",\r\n common: {\r\n name: { de: \"Leistung der Solarmodule\", en: \"solar power\" },\r\n type: \"number\",\r\n desc: \"solarInputPower\",\r\n role: \"value.power\",\r\n read: true,\r\n write: false,\r\n unit: \"W\",\r\n },\r\n native: {},\r\n },\r\n );\r\n\r\n await adapter?.extendObjectAsync(\r\n productKey + \".\" + deviceKey + \".\" + \"pvPower1\",\r\n {\r\n type: \"state\",\r\n common: {\r\n name: { de: \"Leistung PV 1\", en: \"solar power channel 1\" },\r\n type: \"number\",\r\n desc: \"pvPower1\",\r\n role: \"value.power\",\r\n read: true,\r\n write: false,\r\n unit: \"W\",\r\n },\r\n native: {},\r\n },\r\n );\r\n\r\n await adapter?.extendObjectAsync(\r\n productKey + \".\" + deviceKey + \".\" + \"pvPower2\",\r\n {\r\n type: \"state\",\r\n common: {\r\n name: { de: \"Leistung PV 2\", en: \"solar power channel 2\" },\r\n type: \"number\",\r\n desc: \"pvPower2\",\r\n role: \"value.power\",\r\n read: true,\r\n write: false,\r\n unit: \"W\",\r\n },\r\n native: {},\r\n },\r\n );\r\n\r\n await adapter?.extendObjectAsync(\r\n productKey + \".\" + deviceKey + \".\" + \"remainInputTime\",\r\n {\r\n type: \"state\",\r\n common: {\r\n name: { de: \"Erwartete Ladedauer\", en: \"remaining charge time\" },\r\n type: \"number\",\r\n desc: \"remainInputTime\",\r\n role: \"value.interval\",\r\n read: true,\r\n write: false,\r\n },\r\n native: {},\r\n },\r\n );\r\n\r\n await adapter?.extendObjectAsync(\r\n productKey + \".\" + deviceKey + \".\" + \"remainOutTime\",\r\n {\r\n type: \"state\",\r\n common: {\r\n name: {\r\n de: \"Erwartete Entladedauer (Minuten)\",\r\n en: \"remaining discharge time (minutes)\",\r\n },\r\n type: \"number\",\r\n desc: \"remainOutTime\",\r\n role: \"value.interval\",\r\n read: true,\r\n write: false,\r\n },\r\n native: {},\r\n },\r\n );\r\n\r\n await adapter?.extendObjectAsync(\r\n productKey + \".\" + deviceKey + \".\" + \"socSet\",\r\n {\r\n type: \"state\",\r\n common: {\r\n name: { de: \"Max. SOC\", en: \"max. SOC\" },\r\n type: \"number\",\r\n desc: \"socSet\",\r\n role: \"value.battery\",\r\n read: true,\r\n write: false,\r\n unit: \"%\",\r\n },\r\n native: {},\r\n },\r\n );\r\n\r\n await adapter?.extendObjectAsync(\r\n productKey + \".\" + deviceKey + \".\" + \"minSoc\",\r\n {\r\n type: \"state\",\r\n common: {\r\n name: { de: \"Min. SOC\", en: \"min. SOC\" },\r\n type: \"number\",\r\n desc: \"minSoc\",\r\n role: \"value.battery\",\r\n read: true,\r\n write: false,\r\n unit: \"%\",\r\n },\r\n native: {},\r\n },\r\n );\r\n\r\n // Subscibe to State updates to listen to changes\r\n adapter?.subscribeStates(\r\n productKey + \".\" + deviceKey + \".\" + \"solarInputPower\",\r\n );\r\n\r\n adapter?.subscribeStates(\r\n productKey + \".\" + deviceKey + \".\" + \"outputPackPower\",\r\n );\r\n\r\n adapter?.subscribeStates(\r\n productKey + \".\" + deviceKey + \".\" + \"packInputPower\",\r\n );\r\n\r\n adapter?.subscribeStates(\r\n productKey + \".\" + deviceKey + \".\" + \"outputHomePower\",\r\n );\r\n\r\n await createControlStates(adapter, productKey, deviceKey);\r\n await createCalculationStates(adapter, productKey, deviceKey);\r\n};\r\n\r\nexport const addOrUpdatePackData = async (\r\n adapter: ZendureSolarflow,\r\n productKey: string,\r\n deviceKey: string,\r\n packData: IPackData[],\r\n): Promise<void> => {\r\n await packData.forEach(async (x) => {\r\n // Process data only with a serial id!\r\n if (x.sn) {\r\n // create a state for the serial id\r\n const key = (productKey + \".\" + deviceKey + \".packData.\" + x.sn).replace(\r\n adapter.FORBIDDEN_CHARS,\r\n \"\",\r\n );\r\n\r\n await adapter?.extendObjectAsync(key + \".sn\", {\r\n type: \"state\",\r\n common: {\r\n name: {\r\n de: \"Seriennummer\",\r\n en: \"Serial id\",\r\n },\r\n type: \"string\",\r\n desc: \"Serial ID\",\r\n role: \"value\",\r\n read: true,\r\n write: false,\r\n },\r\n native: {},\r\n });\r\n\r\n await adapter?.setStateAsync(key + \".sn\", x.sn, true);\r\n\r\n if (x.socLevel) {\r\n // State f\u00FCr socLevel\r\n await adapter?.extendObjectAsync(key + \".socLevel\", {\r\n type: \"state\",\r\n common: {\r\n name: {\r\n de: \"SOC der Batterie\",\r\n en: \"soc of battery\",\r\n },\r\n type: \"number\",\r\n desc: \"SOC Level\",\r\n role: \"value\",\r\n read: true,\r\n write: false,\r\n },\r\n native: {},\r\n });\r\n\r\n await adapter?.setStateAsync(key + \".socLevel\", x.socLevel, true);\r\n }\r\n\r\n if (x.maxTemp) {\r\n // State f\u00FCr maxTemp\r\n await adapter?.extendObjectAsync(key + \".maxTemp\", {\r\n type: \"state\",\r\n common: {\r\n name: {\r\n de: \"Max. Temperatur der Batterie\",\r\n en: \"max temp. of battery\",\r\n },\r\n type: \"number\",\r\n desc: \"Max. Temp\",\r\n role: \"value\",\r\n read: true,\r\n write: false,\r\n },\r\n native: {},\r\n });\r\n\r\n // Convert Kelvin to Celsius\r\n await adapter?.setStateAsync(\r\n key + \".maxTemp\",\r\n x.maxTemp / 10 - 273.15,\r\n true,\r\n );\r\n }\r\n\r\n if (x.minVol) {\r\n await adapter?.extendObjectAsync(key + \".minVol\", {\r\n type: \"state\",\r\n common: {\r\n name: \"minVol\",\r\n type: \"number\",\r\n desc: \"minVol\",\r\n role: \"value\",\r\n read: true,\r\n write: false,\r\n },\r\n native: {},\r\n });\r\n\r\n await adapter?.setStateAsync(key + \".minVol\", x.minVol / 100, true);\r\n }\r\n\r\n if (x.maxVol) {\r\n await adapter?.extendObjectAsync(key + \".maxVol\", {\r\n type: \"state\",\r\n common: {\r\n name: \"maxVol\",\r\n type: \"number\",\r\n desc: \"maxVol\",\r\n role: \"value\",\r\n read: true,\r\n write: false,\r\n },\r\n native: {},\r\n });\r\n\r\n await adapter?.setStateAsync(key + \".maxVol\", x.maxVol / 100, true);\r\n }\r\n\r\n if (x.totalVol) {\r\n await adapter?.extendObjectAsync(key + \".totalVol\", {\r\n type: \"state\",\r\n common: {\r\n name: \"totalVol\",\r\n type: \"number\",\r\n desc: \"totalVol\",\r\n role: \"value\",\r\n read: true,\r\n write: false,\r\n },\r\n native: {},\r\n });\r\n\r\n await adapter?.setStateAsync(key + \".totalVol\", x.totalVol / 100, true);\r\n }\r\n }\r\n });\r\n};\r\n\r\nexport const startCheckStatesTimer = async (\r\n adapter: ZendureSolarflow,\r\n): Promise<void> => {\r\n // Check for states that has no updates in the last 5 minutes and set them to 0\r\n const statesToReset: string[] = [\r\n \"outputHomePower\",\r\n \"outputPackPower\",\r\n \"packInputPower\",\r\n \"solarInputPower\",\r\n ];\r\n\r\n adapter.interval = adapter.setInterval(async () => {\r\n getDeviceList(adapter)\r\n .then((deviceList: ISolarFlowDeviceDetails[]) => {\r\n deviceList.forEach(async (device: ISolarFlowDeviceDetails) => {\r\n const lastUpdate = await adapter?.getStateAsync(\r\n device.productKey + \".\" + device.deviceKey + \".lastUpdate\",\r\n );\r\n\r\n const tenMinutesAgo = Date.now() / 1000 - 10 * 60; // Ten minutes ago\r\n\r\n if (\r\n lastUpdate &&\r\n lastUpdate.val &&\r\n Number(lastUpdate.val) < tenMinutesAgo\r\n ) {\r\n adapter.log.debug(\r\n `Last update for deviceKey ${device.deviceKey} was at ${new Date(\r\n Number(lastUpdate),\r\n )}, checking for pseudo power values!`,\r\n );\r\n // State was not updated in the last 10 minutes... set states to 0\r\n await statesToReset.forEach(async (stateName: string) => {\r\n await adapter?.setStateAsync(\r\n device.productKey + \".\" + device.deviceKey + \".\" + stateName,\r\n 0,\r\n true,\r\n );\r\n });\r\n\r\n // set electricLevel from deviceList\r\n await adapter?.setStateAsync(\r\n device.productKey + \".\" + device.deviceKey + \".electricLevel\",\r\n device.electricity,\r\n true,\r\n );\r\n }\r\n });\r\n })\r\n .catch(() => {\r\n adapter.log?.error(\"Retrieving device failed!\");\r\n return null;\r\n });\r\n }, 50000);\r\n};\r\n\r\nexport const calculateEnergy = async (\r\n adapter: ZendureSolarflow,\r\n productKey: string,\r\n deviceKey: string,\r\n stateKey: string, // e.g. packInput, outputHome, outputPack, solarInput\r\n state: ioBroker.State,\r\n): Promise<void> => {\r\n const stateNameWh =\r\n productKey +\r\n \".\" +\r\n deviceKey +\r\n \".calculations.\" +\r\n stateKey +\r\n \"EnergyTodayWh\";\r\n\r\n const stateNamekWh =\r\n productKey +\r\n \".\" +\r\n deviceKey +\r\n \".calculations.\" +\r\n stateKey +\r\n \"EnergyTodaykWh\";\r\n const currentVal = await adapter?.getStateAsync(stateNameWh);\r\n\r\n if (\r\n currentVal &&\r\n currentVal.lc &&\r\n state.val != undefined &&\r\n state.val != null\r\n ) {\r\n const timeFrame = state.lc - currentVal?.lc;\r\n const newVal =\r\n Number(currentVal.val) + (Number(state.val) * timeFrame) / 3600000; // Wh\r\n\r\n adapter?.setStateAsync(stateNameWh, newVal, true);\r\n adapter?.setStateAsync(\r\n stateNamekWh,\r\n Number((newVal / 1000).toFixed(2)),\r\n true,\r\n );\r\n } else {\r\n adapter?.setStateAsync(stateNameWh, 0, true);\r\n adapter?.setStateAsync(stateNamekWh, 0, true);\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 const names = [\"packInput\", \"outputHome\", \"outputPack\", \"solarInput\"];\r\n\r\n names.forEach((name: string) => {\r\n const stateNameWh =\r\n device.productKey +\r\n \".\" +\r\n device.deviceKey +\r\n \".calculations.\" +\r\n name +\r\n \"EnergyTodayWh\";\r\n const stateNamekWh =\r\n device.productKey +\r\n \".\" +\r\n device.deviceKey +\r\n \".calculations.\" +\r\n name +\r\n \"EnergyTodaykWh\";\r\n\r\n adapter?.setStateAsync(stateNameWh, 0, true);\r\n adapter?.setStateAsync(stateNamekWh, 0, true);\r\n });\r\n });\r\n};\r\n\r\nexport const updateSolarFlowState = async (\r\n adapter: ZendureSolarflow,\r\n productKey: string,\r\n deviceKey: string,\r\n state: string,\r\n val: number | string,\r\n): Promise<void> => {\r\n adapter?.setStateAsync(productKey + \".\" + deviceKey + \".\" + state, val, true);\r\n};\r\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { ZendureSolarflow } from \"../main\";\r\n\r\n/* eslint-disable @typescript-eslint/indent */\r\n\r\nexport const updateSolarFlowState = async (\r\n adapter: ZendureSolarflow,\r\n productKey: string,\r\n deviceKey: string,\r\n state: string,\r\n val: number | string,\r\n): Promise<void> => {\r\n adapter?.setStateAsync(productKey + \".\" + deviceKey + \".\" + state, val, true);\r\n};\r\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAIO,MAAM,uBAAuB,OAClC,SACA,YACA,WACA,OACA,QACkB;AAClB,qCAAS,cAAc,aAAa,MAAM,YAAY,MAAM,OAAO,KAAK;AAC1E;",
6
6
  "names": []
7
7
  }
@@ -0,0 +1,98 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var calculationService_exports = {};
20
+ __export(calculationService_exports, {
21
+ calculateEnergy: () => calculateEnergy,
22
+ calculateSocAndEnergy: () => calculateSocAndEnergy,
23
+ resetTodaysValues: () => resetTodaysValues
24
+ });
25
+ module.exports = __toCommonJS(calculationService_exports);
26
+ const calculateSocAndEnergy = async (adapter, productKey, deviceKey, stateKey, value) => {
27
+ const currentEnergyState = await (adapter == null ? void 0 : adapter.getStateAsync(
28
+ productKey + "." + deviceKey + ".calculations.energyWh"
29
+ ));
30
+ const currentEnergyMaxState = await (adapter == null ? void 0 : adapter.getStateAsync(
31
+ productKey + "." + deviceKey + ".calculations.energyWhMax"
32
+ ));
33
+ const newValue = stateKey == "outputPack" ? Number(currentEnergyState == null ? void 0 : currentEnergyState.val) + value : Number(currentEnergyState == null ? void 0 : currentEnergyState.val) - value;
34
+ if (newValue > 0) {
35
+ adapter == null ? void 0 : adapter.setStateAsync(
36
+ productKey + "." + deviceKey + ".calculations.energyWh",
37
+ newValue,
38
+ true
39
+ );
40
+ if (currentEnergyMaxState) {
41
+ const soc = newValue / Number(currentEnergyMaxState.val) * 100;
42
+ adapter == null ? void 0 : adapter.setStateAsync(
43
+ productKey + "." + deviceKey + ".calculations.soc",
44
+ soc,
45
+ true
46
+ );
47
+ if (newValue > Number(currentEnergyMaxState.val)) {
48
+ adapter == null ? void 0 : adapter.setStateAsync(
49
+ productKey + "." + deviceKey + ".calculations.energyWhMax",
50
+ newValue,
51
+ true
52
+ );
53
+ }
54
+ }
55
+ }
56
+ };
57
+ const calculateEnergy = async (adapter, productKey, deviceKey, stateKey, state) => {
58
+ const stateNameWh = productKey + "." + deviceKey + ".calculations." + stateKey + "EnergyTodayWh";
59
+ const stateNamekWh = productKey + "." + deviceKey + ".calculations." + stateKey + "EnergyTodaykWh";
60
+ const currentState = await (adapter == null ? void 0 : adapter.getStateAsync(stateNameWh));
61
+ if ((currentState == null ? void 0 : currentState.val) == 0) {
62
+ adapter == null ? void 0 : adapter.setStateAsync(stateNameWh, 1e-6, true);
63
+ } else if (currentState && currentState.lc && state.val != void 0 && state.val != null) {
64
+ const timeFrame = state.lc - (currentState == null ? void 0 : currentState.lc);
65
+ const addValue = Number(state.val) * timeFrame / 36e5;
66
+ const newValue = Number(currentState.val) + addValue;
67
+ adapter == null ? void 0 : adapter.setStateAsync(stateNameWh, newValue, true);
68
+ adapter == null ? void 0 : adapter.setStateAsync(
69
+ stateNamekWh,
70
+ Number((newValue / 1e3).toFixed(2)),
71
+ true
72
+ );
73
+ if (stateKey == "outputPack" || stateKey == "packInput") {
74
+ calculateSocAndEnergy(adapter, productKey, deviceKey, stateKey, addValue);
75
+ }
76
+ } else {
77
+ adapter == null ? void 0 : adapter.setStateAsync(stateNameWh, 0, true);
78
+ adapter == null ? void 0 : adapter.setStateAsync(stateNamekWh, 0, true);
79
+ }
80
+ };
81
+ const resetTodaysValues = async (adapter) => {
82
+ adapter.deviceList.forEach((device) => {
83
+ const names = ["packInput", "outputHome", "outputPack", "solarInput"];
84
+ names.forEach((name) => {
85
+ const stateNameWh = device.productKey + "." + device.deviceKey + ".calculations." + name + "EnergyTodayWh";
86
+ const stateNamekWh = device.productKey + "." + device.deviceKey + ".calculations." + name + "EnergyTodaykWh";
87
+ adapter == null ? void 0 : adapter.setStateAsync(stateNameWh, 0, true);
88
+ adapter == null ? void 0 : adapter.setStateAsync(stateNamekWh, 0, true);
89
+ });
90
+ });
91
+ };
92
+ // Annotate the CommonJS export names for ESM import in node:
93
+ 0 && (module.exports = {
94
+ calculateEnergy,
95
+ calculateSocAndEnergy,
96
+ resetTodaysValues
97
+ });
98
+ //# sourceMappingURL=calculationService.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/services/calculationService.ts"],
4
+ "sourcesContent": ["/* eslint-disable @typescript-eslint/indent */\r\n\r\nimport { ZendureSolarflow } from \"../main\";\r\nimport { ISolarFlowDeviceDetails } from \"../models/ISolarFlowDeviceDetails\";\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 newValue =\r\n stateKey == \"outputPack\"\r\n ? Number(currentEnergyState?.val) + value\r\n : Number(currentEnergyState?.val) - value;\r\n\r\n if (newValue > 0) {\r\n adapter?.setStateAsync(\r\n productKey + \".\" + deviceKey + \".calculations.energyWh\",\r\n newValue,\r\n true,\r\n );\r\n\r\n if (currentEnergyMaxState) {\r\n const soc = (newValue / Number(currentEnergyMaxState.val)) * 100;\r\n adapter?.setStateAsync(\r\n productKey + \".\" + deviceKey + \".calculations.soc\",\r\n soc,\r\n true,\r\n );\r\n\r\n if (newValue > Number(currentEnergyMaxState.val)) {\r\n // Extend maxVal\r\n 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\n\r\nexport const calculateEnergy = async (\r\n adapter: ZendureSolarflow,\r\n productKey: string,\r\n deviceKey: string,\r\n stateKey: string, // e.g. packInput, outputHome, outputPack, solarInput\r\n state: ioBroker.State,\r\n): Promise<void> => {\r\n const stateNameWh =\r\n productKey +\r\n \".\" +\r\n deviceKey +\r\n \".calculations.\" +\r\n stateKey +\r\n \"EnergyTodayWh\";\r\n\r\n const stateNamekWh =\r\n productKey +\r\n \".\" +\r\n deviceKey +\r\n \".calculations.\" +\r\n stateKey +\r\n \"EnergyTodaykWh\";\r\n const currentState = await adapter?.getStateAsync(stateNameWh);\r\n\r\n if (currentState?.val == 0) {\r\n // Workaround, set Val to very low value to avoid Jump in data...\r\n adapter?.setStateAsync(stateNameWh, 0.000001, true);\r\n } else if (\r\n currentState &&\r\n currentState.lc &&\r\n state.val != undefined &&\r\n state.val != null\r\n ) {\r\n const timeFrame = state.lc - currentState?.lc;\r\n\r\n const addValue = (Number(state.val) * timeFrame) / 3600000; // Wh\r\n const newValue = Number(currentState.val) + addValue;\r\n\r\n adapter?.setStateAsync(stateNameWh, newValue, true);\r\n adapter?.setStateAsync(\r\n stateNamekWh,\r\n Number((newValue / 1000).toFixed(2)),\r\n true,\r\n );\r\n\r\n // SOC and energy in batteries\r\n if (stateKey == \"outputPack\" || stateKey == \"packInput\") {\r\n calculateSocAndEnergy(adapter, productKey, deviceKey, stateKey, addValue);\r\n }\r\n } else {\r\n adapter?.setStateAsync(stateNameWh, 0, true);\r\n adapter?.setStateAsync(stateNamekWh, 0, true);\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 const names = [\"packInput\", \"outputHome\", \"outputPack\", \"solarInput\"];\r\n\r\n names.forEach((name: string) => {\r\n const stateNameWh =\r\n device.productKey +\r\n \".\" +\r\n device.deviceKey +\r\n \".calculations.\" +\r\n name +\r\n \"EnergyTodayWh\";\r\n const stateNamekWh =\r\n device.productKey +\r\n \".\" +\r\n device.deviceKey +\r\n \".calculations.\" +\r\n name +\r\n \"EnergyTodaykWh\";\r\n\r\n adapter?.setStateAsync(stateNameWh, 0, true);\r\n adapter?.setStateAsync(stateNamekWh, 0, true);\r\n });\r\n });\r\n};\r\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAKO,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,WACJ,YAAY,eACR,OAAO,yDAAoB,GAAG,IAAI,QAClC,OAAO,yDAAoB,GAAG,IAAI;AAExC,MAAI,WAAW,GAAG;AAChB,uCAAS;AAAA,MACP,aAAa,MAAM,YAAY;AAAA,MAC/B;AAAA,MACA;AAAA;AAGF,QAAI,uBAAuB;AACzB,YAAM,MAAO,WAAW,OAAO,sBAAsB,GAAG,IAAK;AAC7D,yCAAS;AAAA,QACP,aAAa,MAAM,YAAY;AAAA,QAC/B;AAAA,QACA;AAAA;AAGF,UAAI,WAAW,OAAO,sBAAsB,GAAG,GAAG;AAEhD,2CAAS;AAAA,UACP,aAAa,MAAM,YAAY;AAAA,UAC/B;AAAA,UACA;AAAA;AAAA,MAEJ;AAAA,IACF;AAAA,EACF;AACF;AAEO,MAAM,kBAAkB,OAC7B,SACA,YACA,WACA,UACA,UACkB;AAClB,QAAM,cACJ,aACA,MACA,YACA,mBACA,WACA;AAEF,QAAM,eACJ,aACA,MACA,YACA,mBACA,WACA;AACF,QAAM,eAAe,OAAM,mCAAS,cAAc;AAElD,OAAI,6CAAc,QAAO,GAAG;AAE1B,uCAAS,cAAc,aAAa,MAAU;AAAA,EAChD,WACE,gBACA,aAAa,MACb,MAAM,OAAO,UACb,MAAM,OAAO,MACb;AACA,UAAM,YAAY,MAAM,MAAK,6CAAc;AAE3C,UAAM,WAAY,OAAO,MAAM,GAAG,IAAI,YAAa;AACnD,UAAM,WAAW,OAAO,aAAa,GAAG,IAAI;AAE5C,uCAAS,cAAc,aAAa,UAAU;AAC9C,uCAAS;AAAA,MACP;AAAA,MACA,QAAQ,WAAW,KAAM,QAAQ,CAAC,CAAC;AAAA,MACnC;AAAA;AAIF,QAAI,YAAY,gBAAgB,YAAY,aAAa;AACvD,4BAAsB,SAAS,YAAY,WAAW,UAAU,QAAQ;AAAA,IAC1E;AAAA,EACF,OAAO;AACL,uCAAS,cAAc,aAAa,GAAG;AACvC,uCAAS,cAAc,cAAc,GAAG;AAAA,EAC1C;AACF;AAEO,MAAM,oBAAoB,OAC/B,YACkB;AAClB,UAAQ,WAAW,QAAQ,CAAC,WAAoC;AAC9D,UAAM,QAAQ,CAAC,aAAa,cAAc,cAAc,YAAY;AAEpE,UAAM,QAAQ,CAAC,SAAiB;AAC9B,YAAM,cACJ,OAAO,aACP,MACA,OAAO,YACP,mBACA,OACA;AACF,YAAM,eACJ,OAAO,aACP,MACA,OAAO,YACP,mBACA,OACA;AAEF,yCAAS,cAAc,aAAa,GAAG;AACvC,yCAAS,cAAc,cAAc,GAAG;AAAA,IAC1C,CAAC;AAAA,EACH,CAAC;AACH;",
6
+ "names": []
7
+ }
@@ -0,0 +1,90 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var jobSchedule_exports = {};
20
+ __export(jobSchedule_exports, {
21
+ startCheckStatesJob: () => startCheckStatesJob,
22
+ startReloginAndResetValuesJob: () => startReloginAndResetValuesJob
23
+ });
24
+ module.exports = __toCommonJS(jobSchedule_exports);
25
+ var import_node_schedule = require("node-schedule");
26
+ var import_mqttService = require("./mqttService");
27
+ var import_webService = require("./webService");
28
+ var import_calculationService = require("./calculationService");
29
+ const startReloginAndResetValuesJob = async (adapter) => {
30
+ adapter.resetValuesJob = (0, import_node_schedule.scheduleJob)("0 0 * * *", () => {
31
+ var _a;
32
+ adapter.log.debug(`Refreshing accessToken!`);
33
+ if (adapter.config.userName && adapter.config.password) {
34
+ (_a = (0, import_webService.login)(adapter)) == null ? void 0 : _a.then((_accessToken) => {
35
+ adapter.accessToken = _accessToken;
36
+ adapter.lastLogin = /* @__PURE__ */ new Date();
37
+ adapter.connected = true;
38
+ (0, import_mqttService.connectMqttClient)(adapter);
39
+ });
40
+ }
41
+ (0, import_calculationService.resetTodaysValues)(adapter);
42
+ });
43
+ };
44
+ const startCheckStatesJob = async (adapter) => {
45
+ const statesToReset = [
46
+ "outputHomePower",
47
+ "outputPackPower",
48
+ "packInputPower",
49
+ "solarInputPower"
50
+ ];
51
+ adapter.checkStatesJob = (0, import_node_schedule.scheduleJob)("*/10 * * * *", async () => {
52
+ (0, import_webService.getDeviceList)(adapter).then((deviceList) => {
53
+ deviceList.forEach(async (device) => {
54
+ const lastUpdate = await (adapter == null ? void 0 : adapter.getStateAsync(
55
+ device.productKey + "." + device.deviceKey + ".lastUpdate"
56
+ ));
57
+ const tenMinutesAgo = Date.now() / 1e3 - 10 * 60;
58
+ if (lastUpdate && lastUpdate.val && Number(lastUpdate.val) < tenMinutesAgo) {
59
+ adapter.log.debug(
60
+ `Last update for deviceKey ${device.deviceKey} was at ${new Date(
61
+ Number(lastUpdate)
62
+ )}, checking for pseudo power values!`
63
+ );
64
+ await statesToReset.forEach(async (stateName) => {
65
+ await (adapter == null ? void 0 : adapter.setStateAsync(
66
+ device.productKey + "." + device.deviceKey + "." + stateName,
67
+ 0,
68
+ true
69
+ ));
70
+ });
71
+ await (adapter == null ? void 0 : adapter.setStateAsync(
72
+ device.productKey + "." + device.deviceKey + ".electricLevel",
73
+ device.electricity,
74
+ true
75
+ ));
76
+ }
77
+ });
78
+ }).catch(() => {
79
+ var _a;
80
+ (_a = adapter.log) == null ? void 0 : _a.error("Retrieving device failed!");
81
+ return null;
82
+ });
83
+ });
84
+ };
85
+ // Annotate the CommonJS export names for ESM import in node:
86
+ 0 && (module.exports = {
87
+ startCheckStatesJob,
88
+ startReloginAndResetValuesJob
89
+ });
90
+ //# sourceMappingURL=jobSchedule.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/services/jobSchedule.ts"],
4
+ "sourcesContent": ["/* eslint-disable @typescript-eslint/indent */\r\nimport { scheduleJob } from \"node-schedule\";\r\nimport { ZendureSolarflow } from \"../main\";\r\nimport { connectMqttClient } from \"./mqttService\";\r\nimport { getDeviceList, login } from \"./webService\";\r\nimport { ISolarFlowDeviceDetails } from \"../models/ISolarFlowDeviceDetails\";\r\nimport { resetTodaysValues } from \"./calculationService\";\r\n\r\nexport const startReloginAndResetValuesJob = async (\r\n adapter: ZendureSolarflow,\r\n): Promise<void> => {\r\n adapter.resetValuesJob = scheduleJob(\"0 0 * * *\", () => {\r\n // Relogin at night to get a fresh accessToken!\r\n adapter.log.debug(`Refreshing accessToken!`);\r\n\r\n if (adapter.config.userName && adapter.config.password) {\r\n login(adapter)?.then((_accessToken: string) => {\r\n adapter.accessToken = _accessToken;\r\n adapter.lastLogin = new Date();\r\n adapter.connected = true;\r\n\r\n connectMqttClient(adapter);\r\n });\r\n }\r\n\r\n // Reset Values\r\n resetTodaysValues(adapter);\r\n });\r\n};\r\n\r\nexport const startCheckStatesJob = async (\r\n adapter: ZendureSolarflow,\r\n): Promise<void> => {\r\n // Check for states that has no updates in the last 5 minutes and set them to 0\r\n const statesToReset: string[] = [\r\n \"outputHomePower\",\r\n \"outputPackPower\",\r\n \"packInputPower\",\r\n \"solarInputPower\",\r\n ];\r\n\r\n adapter.checkStatesJob = scheduleJob(\"*/10 * * * *\", async () => {\r\n getDeviceList(adapter)\r\n .then((deviceList: ISolarFlowDeviceDetails[]) => {\r\n deviceList.forEach(async (device: ISolarFlowDeviceDetails) => {\r\n const lastUpdate = await adapter?.getStateAsync(\r\n device.productKey + \".\" + device.deviceKey + \".lastUpdate\",\r\n );\r\n\r\n const tenMinutesAgo = Date.now() / 1000 - 10 * 60; // Ten minutes ago\r\n\r\n if (\r\n lastUpdate &&\r\n lastUpdate.val &&\r\n Number(lastUpdate.val) < tenMinutesAgo\r\n ) {\r\n adapter.log.debug(\r\n `Last update for deviceKey ${device.deviceKey} was at ${new Date(\r\n Number(lastUpdate),\r\n )}, checking for pseudo power values!`,\r\n );\r\n // State was not updated in the last 10 minutes... set states to 0\r\n await statesToReset.forEach(async (stateName: string) => {\r\n await adapter?.setStateAsync(\r\n device.productKey + \".\" + device.deviceKey + \".\" + stateName,\r\n 0,\r\n true,\r\n );\r\n });\r\n\r\n // set electricLevel from deviceList\r\n await adapter?.setStateAsync(\r\n device.productKey + \".\" + device.deviceKey + \".electricLevel\",\r\n device.electricity,\r\n true,\r\n );\r\n }\r\n });\r\n })\r\n .catch(() => {\r\n adapter.log?.error(\"Retrieving device failed!\");\r\n return null;\r\n });\r\n });\r\n};\r\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,2BAA4B;AAE5B,yBAAkC;AAClC,wBAAqC;AAErC,gCAAkC;AAE3B,MAAM,gCAAgC,OAC3C,YACkB;AAClB,UAAQ,qBAAiB,kCAAY,aAAa,MAAM;AAX1D;AAaI,YAAQ,IAAI,MAAM,yBAAyB;AAE3C,QAAI,QAAQ,OAAO,YAAY,QAAQ,OAAO,UAAU;AACtD,yCAAM,OAAO,MAAb,mBAAgB,KAAK,CAAC,iBAAyB;AAC7C,gBAAQ,cAAc;AACtB,gBAAQ,YAAY,oBAAI,KAAK;AAC7B,gBAAQ,YAAY;AAEpB,kDAAkB,OAAO;AAAA,MAC3B;AAAA,IACF;AAGA,qDAAkB,OAAO;AAAA,EAC3B,CAAC;AACH;AAEO,MAAM,sBAAsB,OACjC,YACkB;AAElB,QAAM,gBAA0B;AAAA,IAC9B;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,UAAQ,qBAAiB,kCAAY,gBAAgB,YAAY;AAC/D,yCAAc,OAAO,EAClB,KAAK,CAAC,eAA0C;AAC/C,iBAAW,QAAQ,OAAO,WAAoC;AAC5D,cAAM,aAAa,OAAM,mCAAS;AAAA,UAChC,OAAO,aAAa,MAAM,OAAO,YAAY;AAAA;AAG/C,cAAM,gBAAgB,KAAK,IAAI,IAAI,MAAO,KAAK;AAE/C,YACE,cACA,WAAW,OACX,OAAO,WAAW,GAAG,IAAI,eACzB;AACA,kBAAQ,IAAI;AAAA,YACV,6BAA6B,OAAO,SAAS,WAAW,IAAI;AAAA,cAC1D,OAAO,UAAU;AAAA,YACnB,CAAC;AAAA,UACH;AAEA,gBAAM,cAAc,QAAQ,OAAO,cAAsB;AACvD,mBAAM,mCAAS;AAAA,cACb,OAAO,aAAa,MAAM,OAAO,YAAY,MAAM;AAAA,cACnD;AAAA,cACA;AAAA;AAAA,UAEJ,CAAC;AAGD,iBAAM,mCAAS;AAAA,YACb,OAAO,aAAa,MAAM,OAAO,YAAY;AAAA,YAC7C,OAAO;AAAA,YACP;AAAA;AAAA,QAEJ;AAAA,MACF,CAAC;AAAA,IACH,CAAC,EACA,MAAM,MAAM;AA/EnB;AAgFQ,oBAAQ,QAAR,mBAAa,MAAM;AACnB,aAAO;AAAA,IACT,CAAC;AAAA,EACL,CAAC;AACH;",
6
+ "names": []
7
+ }
@@ -28,6 +28,7 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
28
28
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
29
  var mqttService_exports = {};
30
30
  __export(mqttService_exports, {
31
+ addOrUpdatePackData: () => addOrUpdatePackData,
31
32
  connectMqttClient: () => connectMqttClient,
32
33
  setChargeLimit: () => setChargeLimit,
33
34
  setDischargeLimit: () => setDischargeLimit,
@@ -37,6 +38,7 @@ module.exports = __toCommonJS(mqttService_exports);
37
38
  var mqtt = __toESM(require("mqtt"));
38
39
  var import_adapterService = require("./adapterService");
39
40
  var import_timeHelper = require("../helpers/timeHelper");
41
+ var import_createSolarFlowStates = require("../helpers/createSolarFlowStates");
40
42
  let client = void 0;
41
43
  let adapter = void 0;
42
44
  const onConnected = () => {
@@ -52,6 +54,117 @@ const onSubscribe = (error) => {
52
54
  adapter == null ? void 0 : adapter.log.debug("Subscription successful!");
53
55
  }
54
56
  };
57
+ const addOrUpdatePackData = async (adapter2, productKey, deviceKey, packData) => {
58
+ await packData.forEach(async (x) => {
59
+ if (x.sn) {
60
+ const key = (productKey + "." + deviceKey + ".packData." + x.sn).replace(
61
+ adapter2.FORBIDDEN_CHARS,
62
+ ""
63
+ );
64
+ await (adapter2 == null ? void 0 : adapter2.extendObjectAsync(key + ".sn", {
65
+ type: "state",
66
+ common: {
67
+ name: {
68
+ de: "Seriennummer",
69
+ en: "Serial id"
70
+ },
71
+ type: "string",
72
+ desc: "Serial ID",
73
+ role: "value",
74
+ read: true,
75
+ write: false
76
+ },
77
+ native: {}
78
+ }));
79
+ await (adapter2 == null ? void 0 : adapter2.setStateAsync(key + ".sn", x.sn, true));
80
+ if (x.socLevel) {
81
+ await (adapter2 == null ? void 0 : adapter2.extendObjectAsync(key + ".socLevel", {
82
+ type: "state",
83
+ common: {
84
+ name: {
85
+ de: "SOC der Batterie",
86
+ en: "soc of battery"
87
+ },
88
+ type: "number",
89
+ desc: "SOC Level",
90
+ role: "value",
91
+ read: true,
92
+ write: false
93
+ },
94
+ native: {}
95
+ }));
96
+ await (adapter2 == null ? void 0 : adapter2.setStateAsync(key + ".socLevel", x.socLevel, true));
97
+ }
98
+ if (x.maxTemp) {
99
+ await (adapter2 == null ? void 0 : adapter2.extendObjectAsync(key + ".maxTemp", {
100
+ type: "state",
101
+ common: {
102
+ name: {
103
+ de: "Max. Temperatur der Batterie",
104
+ en: "max temp. of battery"
105
+ },
106
+ type: "number",
107
+ desc: "Max. Temp",
108
+ role: "value",
109
+ read: true,
110
+ write: false
111
+ },
112
+ native: {}
113
+ }));
114
+ await (adapter2 == null ? void 0 : adapter2.setStateAsync(
115
+ key + ".maxTemp",
116
+ x.maxTemp / 10 - 273.15,
117
+ true
118
+ ));
119
+ }
120
+ if (x.minVol) {
121
+ await (adapter2 == null ? void 0 : adapter2.extendObjectAsync(key + ".minVol", {
122
+ type: "state",
123
+ common: {
124
+ name: "minVol",
125
+ type: "number",
126
+ desc: "minVol",
127
+ role: "value",
128
+ read: true,
129
+ write: false
130
+ },
131
+ native: {}
132
+ }));
133
+ await (adapter2 == null ? void 0 : adapter2.setStateAsync(key + ".minVol", x.minVol / 100, true));
134
+ }
135
+ if (x.maxVol) {
136
+ await (adapter2 == null ? void 0 : adapter2.extendObjectAsync(key + ".maxVol", {
137
+ type: "state",
138
+ common: {
139
+ name: "maxVol",
140
+ type: "number",
141
+ desc: "maxVol",
142
+ role: "value",
143
+ read: true,
144
+ write: false
145
+ },
146
+ native: {}
147
+ }));
148
+ await (adapter2 == null ? void 0 : adapter2.setStateAsync(key + ".maxVol", x.maxVol / 100, true));
149
+ }
150
+ if (x.totalVol) {
151
+ await (adapter2 == null ? void 0 : adapter2.extendObjectAsync(key + ".totalVol", {
152
+ type: "state",
153
+ common: {
154
+ name: "totalVol",
155
+ type: "number",
156
+ desc: "totalVol",
157
+ role: "value",
158
+ read: true,
159
+ write: false
160
+ },
161
+ native: {}
162
+ }));
163
+ await (adapter2 == null ? void 0 : adapter2.setStateAsync(key + ".totalVol", x.totalVol / 100, true));
164
+ }
165
+ }
166
+ });
167
+ };
55
168
  const onMessage = async (topic, message) => {
56
169
  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;
57
170
  if (adapter) {
@@ -174,46 +287,48 @@ const onMessage = async (topic, message) => {
174
287
  "remainOutTime",
175
288
  obj.properties.remainOutTime
176
289
  );
177
- const packInputPower = Number(
178
- (_w = await adapter.getStateAsync(
179
- productKey + "." + deviceKey + ".packInputPower"
180
- )) == null ? void 0 : _w.val
181
- );
182
- const outputPackPower = Number(
183
- (_x = await adapter.getStateAsync(
184
- productKey + "." + deviceKey + ".outputPackPower"
185
- )) == null ? void 0 : _x.val
186
- );
187
- if (packInputPower && packInputPower > 0) {
188
- (0, import_adapterService.updateSolarFlowState)(
189
- adapter,
190
- productKey,
191
- deviceKey,
192
- "calculations.remainOutTime",
193
- obj.properties.remainOutTime < 59940 ? (0, import_timeHelper.toHoursAndMinutes)(obj.properties.remainOutTime) : ""
290
+ if (adapter.config.useCalculation) {
291
+ const packInputPower = Number(
292
+ (_w = await adapter.getStateAsync(
293
+ productKey + "." + deviceKey + ".packInputPower"
294
+ )) == null ? void 0 : _w.val
194
295
  );
195
- (0, import_adapterService.updateSolarFlowState)(
196
- adapter,
197
- productKey,
198
- deviceKey,
199
- "calculations.remainInputTime",
200
- ""
201
- );
202
- } else if (outputPackPower && outputPackPower > 0) {
203
- (0, import_adapterService.updateSolarFlowState)(
204
- adapter,
205
- productKey,
206
- deviceKey,
207
- "calculations.remainInputTime",
208
- obj.properties.remainInputTime < 59940 ? (0, import_timeHelper.toHoursAndMinutes)(obj.properties.remainInputTime) : ""
209
- );
210
- (0, import_adapterService.updateSolarFlowState)(
211
- adapter,
212
- productKey,
213
- deviceKey,
214
- "calculations.remainOutTime",
215
- ""
296
+ const outputPackPower = Number(
297
+ (_x = await adapter.getStateAsync(
298
+ productKey + "." + deviceKey + ".outputPackPower"
299
+ )) == null ? void 0 : _x.val
216
300
  );
301
+ if (packInputPower && packInputPower > 0) {
302
+ (0, import_adapterService.updateSolarFlowState)(
303
+ adapter,
304
+ productKey,
305
+ deviceKey,
306
+ "calculations.remainOutTime",
307
+ obj.properties.remainOutTime < 59940 ? (0, import_timeHelper.toHoursAndMinutes)(obj.properties.remainOutTime) : ""
308
+ );
309
+ (0, import_adapterService.updateSolarFlowState)(
310
+ adapter,
311
+ productKey,
312
+ deviceKey,
313
+ "calculations.remainInputTime",
314
+ ""
315
+ );
316
+ } else if (outputPackPower && outputPackPower > 0) {
317
+ (0, import_adapterService.updateSolarFlowState)(
318
+ adapter,
319
+ productKey,
320
+ deviceKey,
321
+ "calculations.remainInputTime",
322
+ obj.properties.remainInputTime < 59940 ? (0, import_timeHelper.toHoursAndMinutes)(obj.properties.remainInputTime) : ""
323
+ );
324
+ (0, import_adapterService.updateSolarFlowState)(
325
+ adapter,
326
+ productKey,
327
+ deviceKey,
328
+ "calculations.remainOutTime",
329
+ ""
330
+ );
331
+ }
217
332
  }
218
333
  }
219
334
  if (((_y = obj.properties) == null ? void 0 : _y.socSet) != null && ((_z = obj.properties) == null ? void 0 : _z.socSet) != void 0) {
@@ -235,7 +350,7 @@ const onMessage = async (topic, message) => {
235
350
  );
236
351
  }
237
352
  if (obj.packData) {
238
- (0, import_adapterService.addOrUpdatePackData)(adapter, productKey, deviceKey, obj.packData);
353
+ addOrUpdatePackData(adapter, productKey, deviceKey, obj.packData);
239
354
  }
240
355
  }
241
356
  if (client) {
@@ -319,7 +434,7 @@ const connectMqttClient = (_adapter) => {
319
434
  client.on("error", onError);
320
435
  adapter.deviceList.forEach((device) => {
321
436
  if (adapter) {
322
- (0, import_adapterService.createSolarFlowStates)(adapter, device.productKey, device.deviceKey);
437
+ (0, import_createSolarFlowStates.createSolarFlowStates)(adapter, device.productKey, device.deviceKey);
323
438
  (0, import_adapterService.updateSolarFlowState)(
324
439
  adapter,
325
440
  device.productKey,
@@ -341,6 +456,7 @@ const connectMqttClient = (_adapter) => {
341
456
  };
342
457
  // Annotate the CommonJS export names for ESM import in node:
343
458
  0 && (module.exports = {
459
+ addOrUpdatePackData,
344
460
  connectMqttClient,
345
461
  setChargeLimit,
346
462
  setDischargeLimit,