iobroker.zendure-solarflow 1.15.4 → 2.0.0-alpha.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4 -0
- package/build/constants/ac2400ControlStates.js +11 -0
- package/build/constants/ac2400ControlStates.js.map +2 -2
- package/build/constants/aceControlStates.js +11 -0
- package/build/constants/aceControlStates.js.map +2 -2
- package/build/constants/aioControlStates.js +11 -0
- package/build/constants/aioControlStates.js.map +2 -2
- package/build/constants/hubControlStates.js +11 -0
- package/build/constants/hubControlStates.js.map +2 -2
- package/build/constants/hyperControlStates.js +11 -0
- package/build/constants/hyperControlStates.js.map +2 -2
- package/build/constants/solarflow800ControlStates.js +11 -0
- package/build/constants/solarflow800ControlStates.js.map +2 -2
- package/build/constants/solarflow800ProControlStates.js +11 -0
- package/build/constants/solarflow800ProControlStates.js.map +2 -2
- package/build/helpers/helpers.js +56 -0
- package/build/helpers/helpers.js.map +2 -2
- package/build/main.js +9 -0
- package/build/main.js.map +2 -2
- package/build/models/IDeviceAutomationPayload.js +17 -0
- package/build/models/IDeviceAutomationPayload.js.map +7 -0
- package/build/services/adapterService.js +7 -1
- package/build/services/adapterService.js.map +2 -2
- package/build/services/mqttService.js +149 -53
- package/build/services/mqttService.js.map +2 -2
- package/io-package.json +14 -14
- package/package.json +1 -1
package/build/main.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/main.ts"],
|
|
4
|
-
"sourcesContent": ["/* eslint-disable @typescript-eslint/indent */\r\n/*\r\n * Created with @iobroker/create-adapter v2.5.0\r\n */\r\n\r\n// The adapter-core module gives you access to the core ioBroker functions\r\n// you need to create an adapter\r\nimport * as utils from \"@iobroker/adapter-core\";\r\nimport {\r\n connectCloudMqttClient,\r\n connectLocalMqttClient,\r\n setAcMode,\r\n setAcSwitch,\r\n setAutoModel,\r\n setAutoRecover,\r\n setBuzzerSwitch,\r\n setChargeLimit,\r\n setDcSwitch,\r\n setDischargeLimit,\r\n setHubState,\r\n setInputLimit,\r\n setOutputLimit,\r\n setPassMode,\r\n setSmartMode,\r\n} from \"./services/mqttService\";\r\nimport { getDeviceList, login } from \"./services/webService\";\r\nimport { ISolarFlowDeviceDetails } from \"./models/ISolarFlowDeviceDetails\";\r\nimport { ISolarFlowPaths } from \"./models/ISolarFlowPaths\";\r\nimport { pathsEu, pathsGlobal } from \"./constants/paths\";\r\nimport { Job } from \"node-schedule\";\r\nimport { MqttClient } from \"mqtt\";\r\nimport {\r\n checkDevicesServer,\r\n updateSolarFlowState,\r\n} from \"./services/adapterService\";\r\nimport { createSolarFlowStates } from \"./helpers/createSolarFlowStates\";\r\nimport { createDeveloperAccount } from \"./services/fallbackWebService\";\r\nimport { ISolarFlowDevRegisterData } from \"./models/ISolarflowDevRegisterResponse\";\r\nimport { connectFallbackMqttClient } from \"./services/fallbackMqttService\";\r\nimport { IPack2Device } from \"./models/IPack2Device\";\r\nimport { startRefreshAccessTokenTimerJob } from \"./services/jobSchedule\";\r\n\r\nexport class ZendureSolarflow extends utils.Adapter {\r\n public constructor(options: Partial<utils.AdapterOptions> = {}) {\r\n super({\r\n ...options,\r\n name: \"zendure-solarflow\",\r\n });\r\n this.on(\"ready\", this.onReady.bind(this));\r\n this.on(\"stateChange\", this.onStateChange.bind(this));\r\n this.on(\"unload\", this.onUnload.bind(this));\r\n }\r\n\r\n public userId: string | undefined = undefined; // User ID, needed for connection with Smart Plug\r\n public accessToken: string | undefined = undefined; // Access Token for Zendure Rest API\r\n public deviceList: ISolarFlowDeviceDetails[] = [];\r\n public paths: ISolarFlowPaths | undefined = undefined;\r\n public pack2Devices: IPack2Device[] = [];\r\n\r\n public lastLogin: Date | undefined = undefined;\r\n\r\n public mqttClient: MqttClient | undefined = undefined;\r\n\r\n public resetValuesJob: Job | undefined = undefined;\r\n public checkStatesJob: Job | undefined = undefined;\r\n public calculationJob: Job | undefined = undefined;\r\n public refreshAccessTokenInterval: ioBroker.Interval | undefined = undefined;\r\n public retryTimeout: ioBroker.Timeout | undefined = undefined;\r\n\r\n public createdSnNumberSolarflowStates: string[] = [];\r\n\r\n /**\r\n * Is called when databases are connected and adapter received configuration.\r\n */\r\n private async onReady(): Promise<void> {\r\n await this.extendObject(\"info\", {\r\n type: \"channel\",\r\n common: {\r\n name: \"Information\",\r\n },\r\n native: {},\r\n });\r\n\r\n await this.extendObject(`info.connection`, {\r\n type: \"state\",\r\n common: {\r\n name: {\r\n de: \"Mit Zendure Cloud verbunden\",\r\n en: \"Connected to Zendure cloud\",\r\n },\r\n type: \"boolean\",\r\n desc: \"connection\",\r\n role: \"indicator.connected\",\r\n read: true,\r\n write: false,\r\n },\r\n native: {},\r\n });\r\n\r\n await this.extendObject(`info.errorMessage`, {\r\n type: \"state\",\r\n common: {\r\n name: {\r\n de: \"Fehlermeldung der Verbindung zur Zendure Cloud\",\r\n en: \"Error message from Zendure Cloud\",\r\n },\r\n type: \"string\",\r\n desc: \"errorMessage\",\r\n role: \"value\",\r\n read: true,\r\n write: false,\r\n },\r\n native: {},\r\n });\r\n\r\n // Select paths by config value\r\n if (this.config.server && this.config.server == \"eu\") {\r\n this.paths = pathsEu;\r\n } else {\r\n this.paths = pathsGlobal;\r\n }\r\n\r\n this.log.debug(\"[onReady] Using server \" + this.config.server);\r\n\r\n this.setState(\"info.errorMessage\", \"\", true);\r\n\r\n if (this.config.server == \"local\") {\r\n this.log.debug(\"[onReady] Using local MQTT server\");\r\n\r\n connectLocalMqttClient(this);\r\n\r\n if (this.config.useRestart) {\r\n // Add interval to restart adapter every 3 hours\r\n startRefreshAccessTokenTimerJob(this);\r\n }\r\n } else if (this.config.useFallbackService && this.config.snNumber) {\r\n this.log.debug(\"[onReady] Using Fallback Mode (Dev-Server)\");\r\n // Use Fallback service. Using the developer version of the MQTT and Webservice from zendure\r\n createDeveloperAccount(this).then((data: ISolarFlowDevRegisterData) => {\r\n //console.log(data);\r\n if (data.appKey && data.mqttUrl && data.port && data.secret) {\r\n connectFallbackMqttClient(\r\n this,\r\n data.appKey,\r\n data.secret,\r\n data.mqttUrl,\r\n data.port\r\n );\r\n }\r\n });\r\n } else if (\r\n !this.config.useFallbackService &&\r\n this.config.userName &&\r\n this.config.password\r\n ) {\r\n // App mode: If Username and Password is provided, try to login and get the access token.\r\n let _accessToken: string | undefined = undefined;\r\n let retryCounter = 0;\r\n\r\n if (this.config.useRestart) {\r\n // Add interval to restart adapter every 3 hours\r\n startRefreshAccessTokenTimerJob(this);\r\n }\r\n\r\n while (retryCounter <= 10) {\r\n try {\r\n _accessToken = await login(this);\r\n } catch (ex: any) {\r\n this.setState(\"info.message\", ex.message, true);\r\n if (ex.message.includes(\"Request failed with status code 400\")) {\r\n this.log.warn(\r\n `[onReady] Error 400, maybe your credentials are invalid!`\r\n );\r\n break;\r\n } else {\r\n this.log.error(\r\n `[onReady] Error connecting to Zendure Cloud. Error: ${ex.message}`\r\n );\r\n }\r\n }\r\n\r\n if (_accessToken != undefined) {\r\n this.accessToken = _accessToken;\r\n break;\r\n }\r\n\r\n retryCounter++;\r\n\r\n const milliseconds = 4000 * retryCounter;\r\n\r\n this.log.warn(\r\n `[onReady] Retrying to connect to Zendure Cloud in ${milliseconds / 1000} seconds (Retry #${retryCounter} of 10).`\r\n );\r\n\r\n // Add a small sleep\r\n await new Promise(\r\n (r) =>\r\n (this.retryTimeout = this.setTimeout(r, milliseconds, undefined))\r\n );\r\n }\r\n\r\n if (_accessToken != undefined) {\r\n this.setState(\"info.connection\", true, true);\r\n this.lastLogin = new Date();\r\n\r\n // Try to get the device list\r\n getDeviceList(this)\r\n .then(async (result: ISolarFlowDeviceDetails[]) => {\r\n if (result) {\r\n // Device List found. Save in the adapter properties and connect to MQTT\r\n\r\n // Filtering to SolarFlow devices\r\n this.deviceList = result.filter(\r\n (device) =>\r\n device.productName.toLowerCase().includes(\"solarflow\") ||\r\n device.productName.toLowerCase().includes(\"hyper\") ||\r\n device.productName.toLowerCase() == \"ace 1500\" ||\r\n device.productName.toLowerCase().includes(\"smart plug\")\r\n );\r\n\r\n await checkDevicesServer(this);\r\n\r\n this.log.info(\r\n `[onReady] Found ${this.deviceList.length} SolarFlow device(s).`\r\n );\r\n\r\n await this.deviceList.forEach(\r\n async (device: ISolarFlowDeviceDetails) => {\r\n // Check if has subdevice e.g. ACE?\r\n if (device.packList && device.packList.length > 0) {\r\n device.packList.forEach(async (subDevice) => {\r\n if (\r\n subDevice.productName.toLocaleLowerCase() == \"ace 1500\"\r\n ) {\r\n device._connectedWithAce = true;\r\n // States erstellen\r\n await createSolarFlowStates(this, subDevice);\r\n\r\n await updateSolarFlowState(\r\n this,\r\n subDevice.productKey,\r\n subDevice.deviceKey,\r\n \"registeredServer\",\r\n this.config.server\r\n );\r\n }\r\n });\r\n }\r\n\r\n // States erstellen\r\n await createSolarFlowStates(this, device);\r\n\r\n if (\r\n !device.productName.toLowerCase().includes(\"smart plug\")\r\n ) {\r\n await updateSolarFlowState(\r\n this,\r\n device.productKey,\r\n device.deviceKey,\r\n \"registeredServer\",\r\n this.config.server\r\n );\r\n } else if (this?.userId && device.id) {\r\n await updateSolarFlowState(\r\n this,\r\n this.userId,\r\n device.id?.toString(),\r\n \"registeredServer\",\r\n this.config.server\r\n );\r\n }\r\n }\r\n );\r\n\r\n connectCloudMqttClient(this);\r\n }\r\n })\r\n .catch(() => {\r\n this.setState(\"info.connection\", false, true);\r\n this.log?.error(\"[onReady] Retrieving device failed!\");\r\n });\r\n }\r\n } else {\r\n this.setState(\"info.connection\", false, true);\r\n this.log.error(\"[onReady] No Login Information provided!\");\r\n //this.stop?.();\r\n }\r\n }\r\n\r\n /**\r\n * Is called when adapter shuts down - callback has to be called under any circumstances!\r\n */\r\n private async onUnload(callback: () => void): Promise<void> {\r\n try {\r\n if (this.refreshAccessTokenInterval) {\r\n this.clearInterval(this.refreshAccessTokenInterval);\r\n }\r\n\r\n try {\r\n await this.mqttClient?.endAsync();\r\n this.log.info(\"[onUnload] MQTT client stopped!\");\r\n this.mqttClient = undefined;\r\n } catch (ex: any) {\r\n this.log.error(\"[onUnload] Error stopping MQTT client: !\" + ex.message);\r\n }\r\n\r\n this.setState(\"info.connection\", false, true);\r\n\r\n // Scheduler beenden\r\n if (this.resetValuesJob) {\r\n this.resetValuesJob.cancel();\r\n this.resetValuesJob = undefined;\r\n }\r\n\r\n if (this.checkStatesJob) {\r\n this.checkStatesJob?.cancel();\r\n this.checkStatesJob = undefined;\r\n }\r\n\r\n if (this.calculationJob) {\r\n this.calculationJob.cancel();\r\n this.calculationJob = undefined;\r\n }\r\n\r\n if (this.retryTimeout) {\r\n this.clearTimeout(this.retryTimeout);\r\n }\r\n\r\n callback();\r\n } catch (e) {\r\n callback();\r\n }\r\n }\r\n\r\n /**\r\n * Is called if a subscribed state changes\r\n */\r\n private onStateChange(\r\n id: string,\r\n state: ioBroker.State | null | undefined\r\n ): void {\r\n if (state) {\r\n // The state was changed\r\n //this.log.debug(`state ${id} changed: ${state.val} (ack = ${state.ack})`);\r\n\r\n // Read product and device key from string\r\n const splitted = id.split(\".\");\r\n const productKey = splitted[2]; // Product Key\r\n const deviceKey = splitted[3]; // Device Key\r\n const stateName1 = splitted[4]; // Folder/State Name 1 (e.g. 'control')\r\n const stateName2 = splitted[5]; // State Name, like 'setOutputLimit'\r\n\r\n if (this.config.useFallbackService && stateName1 == \"control\") {\r\n this.log.warn(\r\n `[onStateChange] Using Fallback server, control of Solarflow device is not possible!`\r\n );\r\n }\r\n // !!! Only stateChanges with ack==false are allowed to be processed.\r\n else if (state.val != undefined && state.val != null && !state.ack) {\r\n switch (stateName1) {\r\n case \"control\":\r\n switch (stateName2) {\r\n case \"setOutputLimit\":\r\n setOutputLimit(this, productKey, deviceKey, Number(state.val));\r\n break;\r\n case \"setInputLimit\":\r\n setInputLimit(this, productKey, deviceKey, Number(state.val));\r\n break;\r\n case \"chargeLimit\":\r\n setChargeLimit(this, productKey, deviceKey, Number(state.val));\r\n break;\r\n case \"dischargeLimit\":\r\n setDischargeLimit(\r\n this,\r\n productKey,\r\n deviceKey,\r\n Number(state.val)\r\n );\r\n break;\r\n case \"passMode\":\r\n setPassMode(this, productKey, deviceKey, Number(state.val));\r\n break;\r\n case \"dcSwitch\":\r\n setDcSwitch(\r\n this,\r\n productKey,\r\n deviceKey,\r\n state.val ? true : false\r\n );\r\n break;\r\n case \"acSwitch\":\r\n setAcSwitch(\r\n this,\r\n productKey,\r\n deviceKey,\r\n state.val ? true : false\r\n );\r\n break;\r\n case \"acMode\":\r\n setAcMode(this, productKey, deviceKey, Number(state.val));\r\n break;\r\n case \"hubState\":\r\n setHubState(this, productKey, deviceKey, Number(state.val));\r\n break;\r\n case \"autoModel\":\r\n setAutoModel(this, productKey, deviceKey, Number(state.val));\r\n break;\r\n case \"autoRecover\":\r\n setAutoRecover(\r\n this,\r\n productKey,\r\n deviceKey,\r\n state.val ? true : false\r\n );\r\n break;\r\n case \"buzzerSwitch\":\r\n setBuzzerSwitch(\r\n this,\r\n productKey,\r\n deviceKey,\r\n state.val ? true : false\r\n );\r\n break;\r\n case \"smartMode\":\r\n setSmartMode(\r\n this,\r\n productKey,\r\n deviceKey,\r\n state.val ? true : false\r\n );\r\n break;\r\n }\r\n break;\r\n default:\r\n break;\r\n }\r\n } else {\r\n // The state was deleted\r\n //this.log.debug(`state ${id} deleted`);\r\n }\r\n }\r\n }\r\n}\r\n\r\nif (require.main !== module) {\r\n // Export the constructor in compact mode\r\n module.exports = (options: Partial<utils.AdapterOptions> | undefined) =>\r\n new ZendureSolarflow(options);\r\n} else {\r\n // otherwise start the instance directly\r\n (() => new ZendureSolarflow())();\r\n}\r\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAOA,YAAuB;AACvB,
|
|
4
|
+
"sourcesContent": ["/* eslint-disable @typescript-eslint/indent */\r\n/*\r\n * Created with @iobroker/create-adapter v2.5.0\r\n */\r\n\r\n// The adapter-core module gives you access to the core ioBroker functions\r\n// you need to create an adapter\r\nimport * as utils from \"@iobroker/adapter-core\";\r\nimport {\r\n connectCloudMqttClient,\r\n connectLocalMqttClient,\r\n setAcMode,\r\n setAcSwitch,\r\n setAutoModel,\r\n setAutoRecover,\r\n setBuzzerSwitch,\r\n setChargeLimit,\r\n setDcSwitch,\r\n setDeviceAutomationLimit,\r\n setDischargeLimit,\r\n setHubState,\r\n setInputLimit,\r\n setOutputLimit,\r\n setPassMode,\r\n setSmartMode,\r\n} from \"./services/mqttService\";\r\nimport { getDeviceList, login } from \"./services/webService\";\r\nimport { ISolarFlowDeviceDetails } from \"./models/ISolarFlowDeviceDetails\";\r\nimport { ISolarFlowPaths } from \"./models/ISolarFlowPaths\";\r\nimport { pathsEu, pathsGlobal } from \"./constants/paths\";\r\nimport { Job } from \"node-schedule\";\r\nimport { MqttClient } from \"mqtt\";\r\nimport {\r\n checkDevicesServer,\r\n updateSolarFlowState,\r\n} from \"./services/adapterService\";\r\nimport { createSolarFlowStates } from \"./helpers/createSolarFlowStates\";\r\nimport { createDeveloperAccount } from \"./services/fallbackWebService\";\r\nimport { ISolarFlowDevRegisterData } from \"./models/ISolarflowDevRegisterResponse\";\r\nimport { connectFallbackMqttClient } from \"./services/fallbackMqttService\";\r\nimport { IPack2Device } from \"./models/IPack2Device\";\r\nimport { startRefreshAccessTokenTimerJob } from \"./services/jobSchedule\";\r\n\r\nexport class ZendureSolarflow extends utils.Adapter {\r\n public constructor(options: Partial<utils.AdapterOptions> = {}) {\r\n super({\r\n ...options,\r\n name: \"zendure-solarflow\",\r\n });\r\n this.on(\"ready\", this.onReady.bind(this));\r\n this.on(\"stateChange\", this.onStateChange.bind(this));\r\n this.on(\"unload\", this.onUnload.bind(this));\r\n }\r\n\r\n public userId: string | undefined = undefined; // User ID, needed for connection with Smart Plug\r\n public accessToken: string | undefined = undefined; // Access Token for Zendure Rest API\r\n public deviceList: ISolarFlowDeviceDetails[] = [];\r\n public paths: ISolarFlowPaths | undefined = undefined;\r\n public pack2Devices: IPack2Device[] = [];\r\n\r\n public msgCounter: number = 700000;\r\n\r\n public lastLogin: Date | undefined = undefined;\r\n\r\n public mqttClient: MqttClient | undefined = undefined;\r\n\r\n public resetValuesJob: Job | undefined = undefined;\r\n public checkStatesJob: Job | undefined = undefined;\r\n public calculationJob: Job | undefined = undefined;\r\n public refreshAccessTokenInterval: ioBroker.Interval | undefined = undefined;\r\n public retryTimeout: ioBroker.Timeout | undefined = undefined;\r\n\r\n public createdSnNumberSolarflowStates: string[] = [];\r\n\r\n /**\r\n * Is called when databases are connected and adapter received configuration.\r\n */\r\n private async onReady(): Promise<void> {\r\n await this.extendObject(\"info\", {\r\n type: \"channel\",\r\n common: {\r\n name: \"Information\",\r\n },\r\n native: {},\r\n });\r\n\r\n await this.extendObject(`info.connection`, {\r\n type: \"state\",\r\n common: {\r\n name: {\r\n de: \"Mit Zendure Cloud verbunden\",\r\n en: \"Connected to Zendure cloud\",\r\n },\r\n type: \"boolean\",\r\n desc: \"connection\",\r\n role: \"indicator.connected\",\r\n read: true,\r\n write: false,\r\n },\r\n native: {},\r\n });\r\n\r\n await this.extendObject(`info.errorMessage`, {\r\n type: \"state\",\r\n common: {\r\n name: {\r\n de: \"Fehlermeldung der Verbindung zur Zendure Cloud\",\r\n en: \"Error message from Zendure Cloud\",\r\n },\r\n type: \"string\",\r\n desc: \"errorMessage\",\r\n role: \"value\",\r\n read: true,\r\n write: false,\r\n },\r\n native: {},\r\n });\r\n\r\n // Select paths by config value\r\n if (this.config.server && this.config.server == \"eu\") {\r\n this.paths = pathsEu;\r\n } else {\r\n this.paths = pathsGlobal;\r\n }\r\n\r\n this.log.debug(\"[onReady] Using server \" + this.config.server);\r\n\r\n this.setState(\"info.errorMessage\", \"\", true);\r\n\r\n if (this.config.server == \"local\") {\r\n this.log.debug(\"[onReady] Using local MQTT server\");\r\n\r\n connectLocalMqttClient(this);\r\n\r\n if (this.config.useRestart) {\r\n // Add interval to restart adapter every 3 hours\r\n startRefreshAccessTokenTimerJob(this);\r\n }\r\n } else if (this.config.useFallbackService && this.config.snNumber) {\r\n this.log.debug(\"[onReady] Using Fallback Mode (Dev-Server)\");\r\n // Use Fallback service. Using the developer version of the MQTT and Webservice from zendure\r\n createDeveloperAccount(this).then((data: ISolarFlowDevRegisterData) => {\r\n //console.log(data);\r\n if (data.appKey && data.mqttUrl && data.port && data.secret) {\r\n connectFallbackMqttClient(\r\n this,\r\n data.appKey,\r\n data.secret,\r\n data.mqttUrl,\r\n data.port\r\n );\r\n }\r\n });\r\n } else if (\r\n !this.config.useFallbackService &&\r\n this.config.userName &&\r\n this.config.password\r\n ) {\r\n // App mode: If Username and Password is provided, try to login and get the access token.\r\n let _accessToken: string | undefined = undefined;\r\n let retryCounter = 0;\r\n\r\n if (this.config.useRestart) {\r\n // Add interval to restart adapter every 3 hours\r\n startRefreshAccessTokenTimerJob(this);\r\n }\r\n\r\n while (retryCounter <= 10) {\r\n try {\r\n _accessToken = await login(this);\r\n } catch (ex: any) {\r\n this.setState(\"info.message\", ex.message, true);\r\n if (ex.message.includes(\"Request failed with status code 400\")) {\r\n this.log.warn(\r\n `[onReady] Error 400, maybe your credentials are invalid!`\r\n );\r\n break;\r\n } else {\r\n this.log.error(\r\n `[onReady] Error connecting to Zendure Cloud. Error: ${ex.message}`\r\n );\r\n }\r\n }\r\n\r\n if (_accessToken != undefined) {\r\n this.accessToken = _accessToken;\r\n break;\r\n }\r\n\r\n retryCounter++;\r\n\r\n const milliseconds = 4000 * retryCounter;\r\n\r\n this.log.warn(\r\n `[onReady] Retrying to connect to Zendure Cloud in ${milliseconds / 1000} seconds (Retry #${retryCounter} of 10).`\r\n );\r\n\r\n // Add a small sleep\r\n await new Promise(\r\n (r) =>\r\n (this.retryTimeout = this.setTimeout(r, milliseconds, undefined))\r\n );\r\n }\r\n\r\n if (_accessToken != undefined) {\r\n this.setState(\"info.connection\", true, true);\r\n this.lastLogin = new Date();\r\n\r\n // Try to get the device list\r\n getDeviceList(this)\r\n .then(async (result: ISolarFlowDeviceDetails[]) => {\r\n if (result) {\r\n // Device List found. Save in the adapter properties and connect to MQTT\r\n\r\n // Filtering to SolarFlow devices\r\n this.deviceList = result.filter(\r\n (device) =>\r\n device.productName.toLowerCase().includes(\"solarflow\") ||\r\n device.productName.toLowerCase().includes(\"hyper\") ||\r\n device.productName.toLowerCase() == \"ace 1500\" ||\r\n device.productName.toLowerCase().includes(\"smart plug\")\r\n );\r\n\r\n await checkDevicesServer(this);\r\n\r\n this.log.info(\r\n `[onReady] Found ${this.deviceList.length} SolarFlow device(s).`\r\n );\r\n\r\n await this.deviceList.forEach(\r\n async (device: ISolarFlowDeviceDetails) => {\r\n // Check if has subdevice e.g. ACE?\r\n if (device.packList && device.packList.length > 0) {\r\n device.packList.forEach(async (subDevice) => {\r\n if (\r\n subDevice.productName.toLocaleLowerCase() == \"ace 1500\"\r\n ) {\r\n device._connectedWithAce = true;\r\n // States erstellen\r\n await createSolarFlowStates(this, subDevice);\r\n\r\n await updateSolarFlowState(\r\n this,\r\n subDevice.productKey,\r\n subDevice.deviceKey,\r\n \"registeredServer\",\r\n this.config.server\r\n );\r\n }\r\n });\r\n }\r\n\r\n // States erstellen\r\n await createSolarFlowStates(this, device);\r\n\r\n if (\r\n !device.productName.toLowerCase().includes(\"smart plug\")\r\n ) {\r\n await updateSolarFlowState(\r\n this,\r\n device.productKey,\r\n device.deviceKey,\r\n \"registeredServer\",\r\n this.config.server\r\n );\r\n } else if (this?.userId && device.id) {\r\n await updateSolarFlowState(\r\n this,\r\n this.userId,\r\n device.id?.toString(),\r\n \"registeredServer\",\r\n this.config.server\r\n );\r\n }\r\n }\r\n );\r\n\r\n connectCloudMqttClient(this);\r\n }\r\n })\r\n .catch(() => {\r\n this.setState(\"info.connection\", false, true);\r\n this.log?.error(\"[onReady] Retrieving device failed!\");\r\n });\r\n }\r\n } else {\r\n this.setState(\"info.connection\", false, true);\r\n this.log.error(\"[onReady] No Login Information provided!\");\r\n //this.stop?.();\r\n }\r\n }\r\n\r\n /**\r\n * Is called when adapter shuts down - callback has to be called under any circumstances!\r\n */\r\n private async onUnload(callback: () => void): Promise<void> {\r\n try {\r\n if (this.refreshAccessTokenInterval) {\r\n this.clearInterval(this.refreshAccessTokenInterval);\r\n }\r\n\r\n try {\r\n await this.mqttClient?.endAsync();\r\n this.log.info(\"[onUnload] MQTT client stopped!\");\r\n this.mqttClient = undefined;\r\n } catch (ex: any) {\r\n this.log.error(\"[onUnload] Error stopping MQTT client: !\" + ex.message);\r\n }\r\n\r\n this.setState(\"info.connection\", false, true);\r\n\r\n // Scheduler beenden\r\n if (this.resetValuesJob) {\r\n this.resetValuesJob.cancel();\r\n this.resetValuesJob = undefined;\r\n }\r\n\r\n if (this.checkStatesJob) {\r\n this.checkStatesJob?.cancel();\r\n this.checkStatesJob = undefined;\r\n }\r\n\r\n if (this.calculationJob) {\r\n this.calculationJob.cancel();\r\n this.calculationJob = undefined;\r\n }\r\n\r\n if (this.retryTimeout) {\r\n this.clearTimeout(this.retryTimeout);\r\n }\r\n\r\n callback();\r\n } catch (e) {\r\n callback();\r\n }\r\n }\r\n\r\n /**\r\n * Is called if a subscribed state changes\r\n */\r\n private onStateChange(\r\n id: string,\r\n state: ioBroker.State | null | undefined\r\n ): void {\r\n if (state) {\r\n // The state was changed\r\n //this.log.debug(`state ${id} changed: ${state.val} (ack = ${state.ack})`);\r\n\r\n // Read product and device key from string\r\n const splitted = id.split(\".\");\r\n const productKey = splitted[2]; // Product Key\r\n const deviceKey = splitted[3]; // Device Key\r\n const stateName1 = splitted[4]; // Folder/State Name 1 (e.g. 'control')\r\n const stateName2 = splitted[5]; // State Name, like 'setOutputLimit'\r\n\r\n if (this.config.useFallbackService && stateName1 == \"control\") {\r\n this.log.warn(\r\n `[onStateChange] Using Fallback server, control of Solarflow device is not possible!`\r\n );\r\n }\r\n // !!! Only stateChanges with ack==false are allowed to be processed.\r\n else if (state.val != undefined && state.val != null && !state.ack) {\r\n switch (stateName1) {\r\n case \"control\":\r\n switch (stateName2) {\r\n case \"setOutputLimit\":\r\n setOutputLimit(this, productKey, deviceKey, Number(state.val));\r\n break;\r\n case \"setInputLimit\":\r\n setInputLimit(this, productKey, deviceKey, Number(state.val));\r\n break;\r\n case \"chargeLimit\":\r\n setChargeLimit(this, productKey, deviceKey, Number(state.val));\r\n break;\r\n case \"dischargeLimit\":\r\n setDischargeLimit(\r\n this,\r\n productKey,\r\n deviceKey,\r\n Number(state.val)\r\n );\r\n break;\r\n case \"passMode\":\r\n setPassMode(this, productKey, deviceKey, Number(state.val));\r\n break;\r\n case \"dcSwitch\":\r\n setDcSwitch(\r\n this,\r\n productKey,\r\n deviceKey,\r\n state.val ? true : false\r\n );\r\n break;\r\n case \"acSwitch\":\r\n setAcSwitch(\r\n this,\r\n productKey,\r\n deviceKey,\r\n state.val ? true : false\r\n );\r\n break;\r\n case \"acMode\":\r\n setAcMode(this, productKey, deviceKey, Number(state.val));\r\n break;\r\n case \"hubState\":\r\n setHubState(this, productKey, deviceKey, Number(state.val));\r\n break;\r\n case \"autoModel\":\r\n setAutoModel(this, productKey, deviceKey, Number(state.val));\r\n break;\r\n case \"autoRecover\":\r\n setAutoRecover(\r\n this,\r\n productKey,\r\n deviceKey,\r\n state.val ? true : false\r\n );\r\n break;\r\n case \"buzzerSwitch\":\r\n setBuzzerSwitch(\r\n this,\r\n productKey,\r\n deviceKey,\r\n state.val ? true : false\r\n );\r\n break;\r\n case \"smartMode\":\r\n setSmartMode(\r\n this,\r\n productKey,\r\n deviceKey,\r\n state.val ? true : false\r\n );\r\n break;\r\n case \"setDeviceAutomationLimit\":\r\n setDeviceAutomationLimit(\r\n this,\r\n productKey,\r\n deviceKey,\r\n Number(state.val)\r\n );\r\n break;\r\n }\r\n break;\r\n default:\r\n break;\r\n }\r\n } else {\r\n // The state was deleted\r\n //this.log.debug(`state ${id} deleted`);\r\n }\r\n }\r\n }\r\n}\r\n\r\nif (require.main !== module) {\r\n // Export the constructor in compact mode\r\n module.exports = (options: Partial<utils.AdapterOptions> | undefined) =>\r\n new ZendureSolarflow(options);\r\n} else {\r\n // otherwise start the instance directly\r\n (() => new ZendureSolarflow())();\r\n}\r\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -0,0 +1,17 @@
|
|
|
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 __copyProps = (to, from, except, desc) => {
|
|
7
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
8
|
+
for (let key of __getOwnPropNames(from))
|
|
9
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
10
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
11
|
+
}
|
|
12
|
+
return to;
|
|
13
|
+
};
|
|
14
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
15
|
+
var IDeviceAutomationPayload_exports = {};
|
|
16
|
+
module.exports = __toCommonJS(IDeviceAutomationPayload_exports);
|
|
17
|
+
//# sourceMappingURL=IDeviceAutomationPayload.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/models/IDeviceAutomationPayload.ts"],
|
|
4
|
+
"sourcesContent": ["/* eslint-disable @typescript-eslint/indent */\nexport interface IDeviceAutomationPayload {\n autoModelProgram: number;\n autoModelValue: IAutoModelValue | number;\n msgType: number;\n autoModel: number;\n}\n\ninterface IAutoModelValue {\n upTime?: number;\n chargingType: number;\n pullTime?: number;\n price?: number;\n chargingPower: number;\n prices?: number[];\n outPower: number;\n freq: number;\n}\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;AAAA;AAAA;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -42,6 +42,7 @@ const updateSolarFlowControlState = async (adapter, productKey, deviceKey, state
|
|
|
42
42
|
}
|
|
43
43
|
};
|
|
44
44
|
const checkVoltage = async (adapter, productKey, deviceKey, voltage) => {
|
|
45
|
+
var _a;
|
|
45
46
|
if (voltage < 46.1) {
|
|
46
47
|
if (adapter.config.useCalculation) {
|
|
47
48
|
(0, import_calculationService.setSocToZero)(adapter, productKey, deviceKey);
|
|
@@ -52,7 +53,12 @@ const checkVoltage = async (adapter, productKey, deviceKey, voltage) => {
|
|
|
52
53
|
true,
|
|
53
54
|
true
|
|
54
55
|
));
|
|
55
|
-
(
|
|
56
|
+
const autoModel = (_a = await adapter.getStateAsync(productKey + "." + deviceKey + ".autoModel")) == null ? void 0 : _a.val;
|
|
57
|
+
if (autoModel == 8) {
|
|
58
|
+
(0, import_mqttService.setDeviceAutomationLimit)(adapter, productKey, deviceKey, 0);
|
|
59
|
+
} else {
|
|
60
|
+
(0, import_mqttService.setOutputLimit)(adapter, productKey, deviceKey, 0);
|
|
61
|
+
}
|
|
56
62
|
if (adapter.config.forceShutdownOnLowVoltage) {
|
|
57
63
|
const currentSoc = await adapter.getStateAsync(
|
|
58
64
|
`${productKey}.${deviceKey}.electricLevel`
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/services/adapterService.ts"],
|
|
4
|
-
"sourcesContent": ["
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;
|
|
4
|
+
"sourcesContent": ["/* eslint-disable @typescript-eslint/indent */\r\nimport { ZendureSolarflow } from \"../main\";\r\nimport { setSocToZero } from \"./calculationService\";\r\nimport {\r\n setDeviceAutomationLimit,\r\n setDischargeLimit,\r\n setOutputLimit,\r\n} from \"./mqttService\";\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 | boolean\r\n): Promise<void> => {\r\n await adapter?.setState(`${productKey}.${deviceKey}.${state}`, val, true);\r\n};\r\n\r\nexport const updateSolarFlowControlState = async (\r\n adapter: ZendureSolarflow,\r\n productKey: string,\r\n deviceKey: string,\r\n state: string,\r\n val: number | string | boolean\r\n): Promise<void> => {\r\n // First check if state exist\r\n const stateExist = await adapter?.objectExists(\r\n `${productKey}.${deviceKey}.control.${state}`\r\n );\r\n\r\n // Update the control state\r\n if (stateExist) {\r\n await adapter?.setState(\r\n `${productKey}.${deviceKey}.control.${state}`,\r\n val,\r\n true\r\n );\r\n }\r\n};\r\n\r\nexport const checkVoltage = async (\r\n adapter: ZendureSolarflow,\r\n productKey: string,\r\n deviceKey: string,\r\n voltage: number\r\n): Promise<void> => {\r\n if (voltage < 46.1) {\r\n if (adapter.config.useCalculation) {\r\n setSocToZero(adapter, productKey, deviceKey);\r\n }\r\n\r\n if (adapter.config.useLowVoltageBlock) {\r\n // Activate Low Voltage Block\r\n await adapter?.setState(\r\n `${productKey}.${deviceKey}.control.lowVoltageBlock`,\r\n true,\r\n true\r\n );\r\n\r\n // Low Voltage Block activated, stop power input immediately\r\n const autoModel = (\r\n await adapter.getStateAsync(productKey + \".\" + deviceKey + \".autoModel\")\r\n )?.val;\r\n if (autoModel == 8) {\r\n setDeviceAutomationLimit(adapter, productKey, deviceKey, 0);\r\n } else {\r\n setOutputLimit(adapter, productKey, deviceKey, 0);\r\n }\r\n\r\n if (adapter.config.forceShutdownOnLowVoltage) {\r\n const currentSoc = await adapter.getStateAsync(\r\n `${productKey}.${deviceKey}.electricLevel`\r\n );\r\n\r\n if (currentSoc && Number(currentSoc.val) > 50) {\r\n // We can't shut down the device. Full charge needed!\r\n if (adapter.config.fullChargeIfNeeded) {\r\n await adapter?.setState(\r\n `${productKey}.${deviceKey}.control.fullChargeNeeded`,\r\n true,\r\n true\r\n );\r\n }\r\n } else {\r\n if (currentSoc && currentSoc.val) {\r\n setDischargeLimit(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n Number(currentSoc.val)\r\n );\r\n }\r\n\r\n // Check if device setting is correct\r\n const hubState = await adapter.getStateAsync(\r\n `${productKey}.${deviceKey}.hubState`\r\n );\r\n\r\n if (!hubState || Number(hubState.val) != 1) {\r\n adapter.log.warn(\r\n `[checkVoltage] hubState is not set to 'Stop output and shut down', device will NOT go offline!`\r\n );\r\n }\r\n }\r\n }\r\n }\r\n } else if (voltage >= 47.5) {\r\n // Deactivate Low Voltage Block\r\n const lowVoltageBlock = await adapter.getStateAsync(\r\n `${productKey}.${deviceKey}.control.lowVoltageBlock`\r\n );\r\n\r\n if (lowVoltageBlock && lowVoltageBlock.val == true) {\r\n await adapter?.setState(\r\n `${productKey}.${deviceKey}.control.lowVoltageBlock`,\r\n false,\r\n true\r\n );\r\n\r\n if (\r\n adapter.config.useLowVoltageBlock &&\r\n adapter.config.forceShutdownOnLowVoltage\r\n ) {\r\n setDischargeLimit(\r\n adapter,\r\n productKey,\r\n deviceKey,\r\n adapter.config.dischargeLimit ? adapter.config.dischargeLimit : 5\r\n );\r\n }\r\n }\r\n }\r\n};\r\n\r\nexport const checkDevicesServer = async (\r\n adapter: ZendureSolarflow\r\n): Promise<void> => {\r\n const channels = await adapter.getChannelsAsync();\r\n\r\n channels.forEach(async (channel) => {\r\n if (channel._id) {\r\n const splitted = channel._id.split(\".\");\r\n if (splitted.length == 4) {\r\n const productKey = splitted[2];\r\n const deviceKey = splitted[3];\r\n\r\n const currentServerState = await adapter.getStateAsync(\r\n `${productKey}.${deviceKey}.registeredServer`\r\n );\r\n\r\n if (\r\n currentServerState &&\r\n currentServerState.val &&\r\n currentServerState.val != adapter.config.server\r\n ) {\r\n adapter.log.warn(\r\n `Device with ProductKey '${productKey}' and DeviceKey '${deviceKey}' was configured on server '${currentServerState.val}', but adapter is configured to use server '${adapter.config.server}'! No data will be available!`\r\n );\r\n }\r\n }\r\n }\r\n });\r\n};\r\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -38,6 +38,7 @@ __export(mqttService_exports, {
|
|
|
38
38
|
setBuzzerSwitch: () => setBuzzerSwitch,
|
|
39
39
|
setChargeLimit: () => setChargeLimit,
|
|
40
40
|
setDcSwitch: () => setDcSwitch,
|
|
41
|
+
setDeviceAutomationLimit: () => setDeviceAutomationLimit,
|
|
41
42
|
setDischargeLimit: () => setDischargeLimit,
|
|
42
43
|
setHubState: () => setHubState,
|
|
43
44
|
setInputLimit: () => setInputLimit,
|
|
@@ -309,7 +310,9 @@ const onMessage = async (topic, message) => {
|
|
|
309
310
|
`${productKey}.${deviceKey}.productName`
|
|
310
311
|
);
|
|
311
312
|
if (adapter.log.level == "debug") {
|
|
312
|
-
adapter.log.debug(
|
|
313
|
+
adapter.log.debug(
|
|
314
|
+
`[onMessage] MQTT message on topic '${topic}': ${message.toString()}`
|
|
315
|
+
);
|
|
313
316
|
}
|
|
314
317
|
if (obj.timestamp) {
|
|
315
318
|
const currentTimeStamp = (/* @__PURE__ */ new Date()).getTime() / 1e3;
|
|
@@ -847,7 +850,7 @@ const onMessage = async (topic, message) => {
|
|
|
847
850
|
if (found) {
|
|
848
851
|
} else {
|
|
849
852
|
adapter == null ? void 0 : adapter.log.debug(
|
|
850
|
-
`[onMessage] ${productName == null ? void 0 : productName.val}: ${key} with value ${value} is a UNKNOWN Mqtt Property!`
|
|
853
|
+
`[onMessage] ${productName == null ? void 0 : productName.val}: ${key} with value ${JSON.stringify(value)} is a UNKNOWN Mqtt Property!`
|
|
851
854
|
);
|
|
852
855
|
}
|
|
853
856
|
});
|
|
@@ -917,6 +920,145 @@ const setHubState = async (adapter2, productKey, deviceKey, hubState) => {
|
|
|
917
920
|
}
|
|
918
921
|
}
|
|
919
922
|
};
|
|
923
|
+
const setDeviceAutomationLimit = async (adapter2, productKey, deviceKey, limit) => {
|
|
924
|
+
var _a, _b;
|
|
925
|
+
if (adapter2.mqttClient && productKey && deviceKey) {
|
|
926
|
+
adapter2.log.debug(
|
|
927
|
+
`[setDeviceAutomationLimit] Set device Automation limit to ${limit}!`
|
|
928
|
+
);
|
|
929
|
+
if (limit) {
|
|
930
|
+
limit = Math.round(limit);
|
|
931
|
+
} else {
|
|
932
|
+
limit = 0;
|
|
933
|
+
}
|
|
934
|
+
if (adapter2.config.useLowVoltageBlock) {
|
|
935
|
+
const lowVoltageBlockState = await adapter2.getStateAsync(
|
|
936
|
+
productKey + "." + deviceKey + ".control.lowVoltageBlock"
|
|
937
|
+
);
|
|
938
|
+
if (lowVoltageBlockState && lowVoltageBlockState.val && lowVoltageBlockState.val == true) {
|
|
939
|
+
limit = 0;
|
|
940
|
+
}
|
|
941
|
+
const fullChargeNeeded = await adapter2.getStateAsync(
|
|
942
|
+
productKey + "." + deviceKey + ".control.fullChargeNeeded"
|
|
943
|
+
);
|
|
944
|
+
if (fullChargeNeeded && fullChargeNeeded.val && fullChargeNeeded.val == true) {
|
|
945
|
+
limit = 0;
|
|
946
|
+
}
|
|
947
|
+
}
|
|
948
|
+
limit = (0, import_helpers.getMinAndMaxOutputLimitForProductKey)(productKey, limit);
|
|
949
|
+
const topic = `iot/${productKey}/${deviceKey}/function/invoke`;
|
|
950
|
+
adapter2.msgCounter += 1;
|
|
951
|
+
const timestamp = /* @__PURE__ */ new Date();
|
|
952
|
+
timestamp.setMilliseconds(0);
|
|
953
|
+
let _arguments = [
|
|
954
|
+
{
|
|
955
|
+
autoModelProgram: 2,
|
|
956
|
+
autoModelValue: limit,
|
|
957
|
+
msgType: 1,
|
|
958
|
+
autoModel: 8
|
|
959
|
+
}
|
|
960
|
+
];
|
|
961
|
+
const productName = (0, import_helpers.getProductNameFromProductKey)(productKey);
|
|
962
|
+
if (productName.toLowerCase().includes("2400 ac") || productName.toLowerCase().includes("solarflow 800")) {
|
|
963
|
+
const outputlimit = {
|
|
964
|
+
arguments: {
|
|
965
|
+
outputPower: limit,
|
|
966
|
+
chargeState: limit > 0 ? 0 : 1,
|
|
967
|
+
chargePower: limit > 0 ? 0 : -limit,
|
|
968
|
+
mode: 9
|
|
969
|
+
},
|
|
970
|
+
function: "deviceAutomation",
|
|
971
|
+
messageId: adapter2.msgCounter,
|
|
972
|
+
deviceKey,
|
|
973
|
+
timestamp: timestamp.getTime() / 1e3
|
|
974
|
+
};
|
|
975
|
+
(_a = adapter2.mqttClient) == null ? void 0 : _a.publish(topic, JSON.stringify(outputlimit));
|
|
976
|
+
} else if (productName.toLowerCase().includes("ace")) {
|
|
977
|
+
_arguments = [
|
|
978
|
+
{
|
|
979
|
+
autoModelProgram: 2,
|
|
980
|
+
autoModelValue: {
|
|
981
|
+
chargingType: limit > 0 ? 0 : 1,
|
|
982
|
+
chargingPower: limit > 0 ? 0 : -limit,
|
|
983
|
+
freq: 0,
|
|
984
|
+
outPower: limit
|
|
985
|
+
},
|
|
986
|
+
msgType: 1,
|
|
987
|
+
autoModel: 8
|
|
988
|
+
}
|
|
989
|
+
];
|
|
990
|
+
} else {
|
|
991
|
+
if (productName.toLowerCase().includes("hyper")) {
|
|
992
|
+
if (limit < 0) {
|
|
993
|
+
_arguments = [
|
|
994
|
+
{
|
|
995
|
+
autoModelProgram: 1,
|
|
996
|
+
autoModelValue: {
|
|
997
|
+
upTime: 0,
|
|
998
|
+
chargingType: 1,
|
|
999
|
+
pullTime: 1800,
|
|
1000
|
+
price: 2,
|
|
1001
|
+
chargingPower: -limit,
|
|
1002
|
+
prices: [
|
|
1003
|
+
1,
|
|
1004
|
+
1,
|
|
1005
|
+
1,
|
|
1006
|
+
1,
|
|
1007
|
+
1,
|
|
1008
|
+
1,
|
|
1009
|
+
1,
|
|
1010
|
+
1,
|
|
1011
|
+
1,
|
|
1012
|
+
1,
|
|
1013
|
+
1,
|
|
1014
|
+
1,
|
|
1015
|
+
1,
|
|
1016
|
+
1,
|
|
1017
|
+
1,
|
|
1018
|
+
1,
|
|
1019
|
+
1,
|
|
1020
|
+
1,
|
|
1021
|
+
1,
|
|
1022
|
+
1,
|
|
1023
|
+
1,
|
|
1024
|
+
1,
|
|
1025
|
+
1,
|
|
1026
|
+
1
|
|
1027
|
+
],
|
|
1028
|
+
outPower: 0,
|
|
1029
|
+
freq: 0
|
|
1030
|
+
},
|
|
1031
|
+
msgType: 1,
|
|
1032
|
+
autoModel: 8
|
|
1033
|
+
}
|
|
1034
|
+
];
|
|
1035
|
+
} else {
|
|
1036
|
+
_arguments = [
|
|
1037
|
+
{
|
|
1038
|
+
autoModelProgram: 2,
|
|
1039
|
+
autoModelValue: {
|
|
1040
|
+
chargingType: 0,
|
|
1041
|
+
chargingPower: 0,
|
|
1042
|
+
freq: 0,
|
|
1043
|
+
outPower: limit
|
|
1044
|
+
},
|
|
1045
|
+
msgType: 1,
|
|
1046
|
+
autoModel: 8
|
|
1047
|
+
}
|
|
1048
|
+
];
|
|
1049
|
+
}
|
|
1050
|
+
}
|
|
1051
|
+
const outputlimit = {
|
|
1052
|
+
arguments: _arguments,
|
|
1053
|
+
function: "deviceAutomation",
|
|
1054
|
+
messageId: adapter2.msgCounter,
|
|
1055
|
+
deviceKey,
|
|
1056
|
+
timestamp: timestamp.getTime() / 1e3
|
|
1057
|
+
};
|
|
1058
|
+
(_b = adapter2.mqttClient) == null ? void 0 : _b.publish(topic, JSON.stringify(outputlimit));
|
|
1059
|
+
}
|
|
1060
|
+
}
|
|
1061
|
+
};
|
|
920
1062
|
const setOutputLimit = async (adapter2, productKey, deviceKey, limit) => {
|
|
921
1063
|
var _a, _b, _c;
|
|
922
1064
|
if (adapter2.mqttClient && productKey && deviceKey) {
|
|
@@ -948,60 +1090,13 @@ const setOutputLimit = async (adapter2, productKey, deviceKey, limit) => {
|
|
|
948
1090
|
}
|
|
949
1091
|
const currentLimit = (_b = await adapter2.getStateAsync(productKey + "." + deviceKey + ".outputLimit")) == null ? void 0 : _b.val;
|
|
950
1092
|
if (currentLimit != null && currentLimit != void 0) {
|
|
951
|
-
const productName = (0, import_helpers.getProductNameFromProductKey)(productKey);
|
|
952
1093
|
if (currentLimit != limit) {
|
|
953
|
-
|
|
954
|
-
if (limit < 100 && limit > 90 && !(productName == null ? void 0 : productName.includes("hyper")) && !(productName == null ? void 0 : productName.includes("2400 ac")) && !(productName == null ? void 0 : productName.includes("solarflow 800"))) {
|
|
955
|
-
limit = 90;
|
|
956
|
-
} else if (limit > 60 && limit < 90 && !(productName == null ? void 0 : productName.includes("hyper")) && !(productName == null ? void 0 : productName.includes("2400 ac")) && !(productName == null ? void 0 : productName.includes("solarflow 800"))) {
|
|
957
|
-
limit = 60;
|
|
958
|
-
} else if (limit > 30 && limit < 60 && !(productName == null ? void 0 : productName.includes("hyper")) && !(productName == null ? void 0 : productName.includes("2400 ac")) && !(productName == null ? void 0 : productName.includes("solarflow 800"))) {
|
|
959
|
-
limit = 30;
|
|
960
|
-
} else if (limit < 30) {
|
|
961
|
-
limit = 30;
|
|
962
|
-
}
|
|
963
|
-
}
|
|
964
|
-
switch (productName == null ? void 0 : productName.toLocaleLowerCase()) {
|
|
965
|
-
case "hyper 2000":
|
|
966
|
-
if (limit > 1200) {
|
|
967
|
-
limit = 1200;
|
|
968
|
-
}
|
|
969
|
-
break;
|
|
970
|
-
case "solarflow 800":
|
|
971
|
-
if (limit > 800) {
|
|
972
|
-
limit = 800;
|
|
973
|
-
}
|
|
974
|
-
break;
|
|
975
|
-
case "solarflow2.0":
|
|
976
|
-
if (limit > 1200) {
|
|
977
|
-
limit = 1200;
|
|
978
|
-
}
|
|
979
|
-
break;
|
|
980
|
-
case "solarflow hub 2000":
|
|
981
|
-
if (limit > 1200) {
|
|
982
|
-
limit = 1200;
|
|
983
|
-
}
|
|
984
|
-
break;
|
|
985
|
-
case "solarflow aio zy":
|
|
986
|
-
if (limit > 1200) {
|
|
987
|
-
limit = 1200;
|
|
988
|
-
}
|
|
989
|
-
break;
|
|
990
|
-
case "solarflow 800 pro":
|
|
991
|
-
if (limit > 800) {
|
|
992
|
-
limit = 800;
|
|
993
|
-
}
|
|
994
|
-
break;
|
|
995
|
-
case "solarflow 2400 ac":
|
|
996
|
-
if (limit > 2400) {
|
|
997
|
-
limit = 2400;
|
|
998
|
-
}
|
|
999
|
-
break;
|
|
1000
|
-
default:
|
|
1001
|
-
break;
|
|
1002
|
-
}
|
|
1094
|
+
limit = (0, import_helpers.getMinAndMaxOutputLimitForProductKey)(productKey, limit);
|
|
1003
1095
|
const topic = `iot/${productKey}/${deviceKey}/properties/write`;
|
|
1004
1096
|
const outputlimit = { properties: { outputLimit: limit } };
|
|
1097
|
+
adapter2.msgCounter += 1;
|
|
1098
|
+
const timestamp = /* @__PURE__ */ new Date();
|
|
1099
|
+
timestamp.setMilliseconds(0);
|
|
1005
1100
|
(_c = adapter2.mqttClient) == null ? void 0 : _c.publish(topic, JSON.stringify(outputlimit));
|
|
1006
1101
|
}
|
|
1007
1102
|
}
|
|
@@ -1396,6 +1491,7 @@ const connectLocalMqttClient = (_adapter) => {
|
|
|
1396
1491
|
setBuzzerSwitch,
|
|
1397
1492
|
setChargeLimit,
|
|
1398
1493
|
setDcSwitch,
|
|
1494
|
+
setDeviceAutomationLimit,
|
|
1399
1495
|
setDischargeLimit,
|
|
1400
1496
|
setHubState,
|
|
1401
1497
|
setInputLimit,
|