From 1c6152a2975d9b9e5a398200ceac63049e1f003e Mon Sep 17 00:00:00 2001 From: Stephan Mante Date: Wed, 5 Jun 2024 22:00:13 +0200 Subject: [PATCH] control role change to switch or level --- lib/controls/service_queue.js | 38 ++++++++++++++++---------------- main.js | 4 ++-- package-lock.json | 41 +++++++++++++++++++++-------------- 3 files changed, 46 insertions(+), 37 deletions(-) diff --git a/lib/controls/service_queue.js b/lib/controls/service_queue.js index ac859e0..ee2a552 100644 --- a/lib/controls/service_queue.js +++ b/lib/controls/service_queue.js @@ -12,7 +12,7 @@ class ServiceQueueMap { this.serviceFields = [ { - state: {id: 'battery.chargeFromGridFunction', name: 'Charge from Grid', type: 'boolean', role: 'value', desc: 'reg: 47087, len: 1'}, + state: {id: 'battery.chargeFromGridFunction', name: 'Charge from Grid', type: 'boolean', role: 'switch.enable', desc: 'reg: 47087, len: 1'}, type : deviceType.battery, fn: async event => { const ret = await this._writeRegisters(47087,event.value === true ? [1]: [0]); @@ -21,7 +21,7 @@ class ServiceQueueMap { } }, { - state: { id: 'battery.maximumChargePower', name: 'MaximumChargePower', type: 'number', unit: 'W', role: 'value.power', desc: 'reg: 47075, len: 2'}, + state: { id: 'battery.maximumChargePower', name: 'MaximumChargePower', type: 'number', unit: 'W', role: 'level.power', desc: 'reg: 47075, len: 2'}, type : deviceType.battery, fn: async event => { const max = this.inverterInfo.instance.stateCache.get(this.inverterInfo.path+'.battery.maximumChargePower')?.value ?? 2500; @@ -31,7 +31,7 @@ class ServiceQueueMap { } }, { - state: { id: 'battery.maximumDischargePower', name: 'MaximumDischargePower', type: 'number', unit: 'W', role: 'value.power', desc: 'reg: 47077, len: 2'}, + state: { id: 'battery.maximumDischargePower', name: 'MaximumDischargePower', type: 'number', unit: 'W', role: 'level.power', desc: 'reg: 47077, len: 2'}, type : deviceType.battery, fn: async event => { const max = this.inverterInfo.instance.stateCache.get(this.inverterInfo.path+'.battery.maximumDischargePower')?.value ?? 2500; @@ -41,7 +41,7 @@ class ServiceQueueMap { } }, { - state: {id: 'battery.chargingCutoffCapacity', name: 'Charging Cutoff Capacity', type: 'number', unit: '%', role: 'value', desc: 'reg: 47081, len: 1'}, + state: {id: 'battery.chargingCutoffCapacity', name: 'Charging Cutoff Capacity', type: 'number', unit: '%', role: 'level.max', desc: 'reg: 47081, len: 1'}, type : deviceType.battery, fn: async (event) => { if (event.value > 100) event.value = 100; @@ -53,7 +53,7 @@ class ServiceQueueMap { } }, { - state: {id: 'battery.dischargeCutoffCapacity', name: 'Discharge Cutoff Capacity', type: 'number', unit: '%', role: 'value', desc: 'reg: 47082, len: 1'}, + state: {id: 'battery.dischargeCutoffCapacity', name: 'Discharge Cutoff Capacity', type: 'number', unit: '%', role: 'level.min', desc: 'reg: 47082, len: 1'}, type : deviceType.battery, fn: async event => { if (event.value > 20) event.value = 20; @@ -64,7 +64,7 @@ class ServiceQueueMap { } }, { - state: {id: 'battery.gridChargeCutoffSOC', name: 'Grid Charge Cutoff SOC', type: 'number', unit: '%', role: 'value', desc: 'reg:47088, len:1'}, + state: {id: 'battery.gridChargeCutoffSOC', name: 'Grid Charge Cutoff SOC', type: 'number', unit: '%', role: 'level', desc: 'reg:47088, len:1'}, type : deviceType.battery, fn: async event => { if (event.value > 100) event.value = 100; @@ -75,7 +75,7 @@ class ServiceQueueMap { } }, { - state: {id: 'battery.workingModeSettings', name: 'Working Mode Settings', type: 'number', unit: '', role: 'value', desc: 'reg:47086, len:1'}, + state: {id: 'battery.workingModeSettings', name: 'Working Mode Settings', type: 'number', unit: '', role: 'level', desc: 'reg:47086, len:1'}, type : deviceType.battery, fn: async event => { if (event.value > 5) event.value = 2; @@ -86,7 +86,7 @@ class ServiceQueueMap { } }, { - state: { id: 'battery.powerOfChargeFromGrid', name: 'power Of charge from grid', type: 'number', unit: 'W', role: 'value.power', desc: 'reg: 47242, len: 2'}, + state: { id: 'battery.powerOfChargeFromGrid', name: 'power Of charge from grid', type: 'number', unit: 'W', role: 'level.power', desc: 'reg: 47242, len: 2'}, type : deviceType.battery, fn: async event => { const max = this.inverterInfo.instance.stateCache.get(this.inverterInfo.path+'.battery.maximumChargePower')?.value ?? 2500; @@ -97,7 +97,7 @@ class ServiceQueueMap { }, /* { - state: { id: 'battery.forcedChargingAndDischargingPower', name: 'Forced charging and discharging power', type: 'number', unit: 'W', role: 'value.power', desc: 'reg: 47084, len: 2'}, + state: { id: 'battery.forcedChargingAndDischargingPower', name: 'Forced charging and discharging power', type: 'number', unit: 'W', role: 'level.power', desc: 'reg: 47084, len: 2'}, type : deviceType.battery, fn: async event => { const max = this.inverterInfo.instance.stateCache.get(this.inverterInfo.path+'.battery.maximumChargePower')?.value ?? 2500; @@ -109,7 +109,7 @@ class ServiceQueueMap { */ /* { - state: { id: 'battery.maximumPowerOfChargeFromGrid', name: 'Maximum power of charge from grid', type: 'number', unit: 'W', role: 'value.power', desc: 'reg: 47244, len: 2'}, + state: { id: 'battery.maximumPowerOfChargeFromGrid', name: 'Maximum power of charge from grid', type: 'number', unit: 'W', role: 'level.power', desc: 'reg: 47244, len: 2'}, type : deviceType.battery, fn: async event => { const max = this.inverterInfo.instance.stateCache.get(this.inverterInfo.path+'.battery.maximumChargePower')?.value ?? 2500; @@ -120,7 +120,7 @@ class ServiceQueueMap { }, */ { - state: { id: 'battery.forcibleChargePower', name: 'Forcible charge power', type: 'number', unit: 'W', role: 'value.power', desc: 'reg: 47247, len: 2'}, + state: { id: 'battery.forcibleChargePower', name: 'Forcible charge power', type: 'number', unit: 'W', role: 'level.power', desc: 'reg: 47247, len: 2'}, type : deviceType.battery, fn: async event => { const max = this.inverterInfo.instance.stateCache.get(this.inverterInfo.path+'.battery.maximumChargePower')?.value ?? 2500; @@ -130,7 +130,7 @@ class ServiceQueueMap { } }, { - state: { id: 'battery.forcibleDischargePower', name: 'Forcible discharge power', type: 'number', unit: 'W', role: 'value.power', desc: 'reg: 47249, len: 2'}, + state: { id: 'battery.forcibleDischargePower', name: 'Forcible discharge power', type: 'number', unit: 'W', role: 'level.power', desc: 'reg: 47249, len: 2'}, type : deviceType.battery, fn: async event => { const max = this.inverterInfo.instance.stateCache.get(this.inverterInfo.path+'.battery.maximumDischargePower')?.value ?? 2500; @@ -140,7 +140,7 @@ class ServiceQueueMap { } }, { - state: { id: 'battery.targetSOC ', name: 'Target SOC ', type: 'number', unit: '%', role: 'value', desc: 'reg: 47101 , len: 1'}, + state: { id: 'battery.targetSOC ', name: 'Target SOC ', type: 'number', unit: '%', role: 'level', desc: 'reg: 47101 , len: 1'}, type : deviceType.gridPowerControl, fn: async event => { if (event.value > 100) event.value = 100; @@ -151,7 +151,7 @@ class ServiceQueueMap { } }, { - state: { id: 'battery.forcedChargingAndDischargingPeriod', name: 'Forced charging and discharging period', type: 'number', unit: '', role: 'value', desc: 'reg: 47083, len: 1'}, + state: { id: 'battery.forcedChargingAndDischargingPeriod', name: 'Forced charging and discharging period', type: 'number', unit: '', role: 'level', desc: 'reg: 47083, len: 1'}, type : deviceType.battery, fn: async event => { if (event.value > 1440) event.value = 1440; @@ -160,7 +160,7 @@ class ServiceQueueMap { } }, { - state: { id: 'battery.forcibleChargeOrDischargeSettingMode', name: 'Forcible charge/discharge setting mode (0: Duration,1: until SOC)', type: 'number', unit: '', role: 'value', desc: 'reg: 47246, len: 1'}, + state: { id: 'battery.forcibleChargeOrDischargeSettingMode', name: 'Forcible charge/discharge setting mode (0: Duration,1: until SOC)', type: 'number', unit: '', role: 'level', desc: 'reg: 47246, len: 1'}, type : deviceType.battery, fn: async event => { if (event.value > 1) event.value = 1; @@ -169,7 +169,7 @@ class ServiceQueueMap { } }, { - state: { id: 'battery.forcibleChargeOrDischarge', name: 'Forcible charge/discharge (0: Stop,1: Charge, 2: Discharge)', type: 'number', unit: '', role: 'value', desc: 'reg: 47100, len: 1'}, + state: { id: 'battery.forcibleChargeOrDischarge', name: 'Forcible charge/discharge (0: Stop,1: Charge, 2: Discharge)', type: 'number', unit: '', role: 'level', desc: 'reg: 47100, len: 1'}, type : deviceType.battery, fn: async event => { if (event.value > 2) event.value = 2; @@ -178,7 +178,7 @@ class ServiceQueueMap { } }, { - state: { id: 'grid.maximumFeedGridPower', name: 'Maximum Feed Grid Power', type: 'number', unit: 'kW', role: 'value.power', desc: 'reg: 47416, len: 2'}, + state: { id: 'grid.maximumFeedGridPower', name: 'Maximum Feed Grid Power', type: 'number', unit: 'kW', role: 'level.power', desc: 'reg: 47416, len: 2'}, type : deviceType.gridPowerControl, fn: async event => { const max = 100; //100 kW @@ -190,7 +190,7 @@ class ServiceQueueMap { } }, { - state: { id: 'grid.maximumFeedGridPower_percent', name: 'Maximum Feed Grid Power %', type: 'number', unit: '%', role: 'value', desc: 'reg: 47418, len: 1'}, + state: { id: 'grid.maximumFeedGridPower_percent', name: 'Maximum Feed Grid Power %', type: 'number', unit: '%', role: 'level', desc: 'reg: 47418, len: 1'}, type : deviceType.gridPowerControl, fn: async event => { if (event.value > 100) event.value = 100; @@ -201,7 +201,7 @@ class ServiceQueueMap { } }, { - state: {id: 'grid.activePowerControlMode', name: '(0: Unlimited (default), 1: DIactive scheduling, 5: Zero power grid connection, 6: Power-limited grid connection (kW), 7: Power-limited grid connection (%))', type: 'number', unit: '', role: 'value', desc: 'reg:47415, len:1'}, + state: {id: 'grid.activePowerControlMode', name: '(0: Unlimited (default), 1: DIactive scheduling, 5: Zero power grid connection, 6: Power-limited grid connection (kW), 7: Power-limited grid connection (%))', type: 'number', unit: '', role: 'level', desc: 'reg:47415, len:1'}, type : deviceType.gridPowerControl, fn: async event => { if (event.value > 7) event.value = 7; diff --git a/main.js b/main.js index 9527b64..057616e 100644 --- a/main.js +++ b/main.js @@ -490,13 +490,13 @@ class Sun2000 extends utils.Adapter { */ onUnload(callback) { try { - this.setState('info.connection', false, true); + this.logger.info('cleaned everything up...'); this.modbusServer && this.modbusServer.close(); this.pollingTimer && this.clearTimeout(this.pollingTimer); this.mitnightTimer && this.clearTimeout(this.mitnightTimer); this.watchDogHandle && this.clearInterval(this.watchDogHandle); this.modbusClient && this.modbusClient.close(); - this.logger.info('cleaned everything up...'); + this.setState('info.connection', false, true); callback(); } catch (e) { callback(); diff --git a/package-lock.json b/package-lock.json index 35158de..13dc49e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1006,6 +1006,28 @@ "node": ">=0.3.1" } }, + "node_modules/@iobroker/testing/node_modules/nise": { + "version": "5.1.9", + "resolved": "https://registry.npmjs.org/nise/-/nise-5.1.9.tgz", + "integrity": "sha512-qOnoujW4SV6e40dYxJOb3uvuoPHtmLzIk4TFo+j0jPJoC+5Z9xja5qH5JZobEPsa8+YYphMrOSwnrshEhG2qww==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^3.0.0", + "@sinonjs/fake-timers": "^11.2.2", + "@sinonjs/text-encoding": "^0.7.2", + "just-extend": "^6.2.0", + "path-to-regexp": "^6.2.1" + } + }, + "node_modules/@iobroker/testing/node_modules/nise/node_modules/@sinonjs/fake-timers": { + "version": "11.2.2", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-11.2.2.tgz", + "integrity": "sha512-G2piCSxQ7oWOxwGSAyFHfPIsyeJGXYtc6mFbnFA+kRXkiEnTl8c/8jul2S329iFBnDI9HGoeWWAZvuvOkZccgw==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^3.0.0" + } + }, "node_modules/@iobroker/testing/node_modules/sinon": { "version": "15.2.0", "resolved": "https://registry.npmjs.org/sinon/-/sinon-15.2.0.tgz", @@ -3718,9 +3740,9 @@ "dev": true }, "node_modules/nise": { - "version": "5.1.9", - "resolved": "https://registry.npmjs.org/nise/-/nise-5.1.9.tgz", - "integrity": "sha512-qOnoujW4SV6e40dYxJOb3uvuoPHtmLzIk4TFo+j0jPJoC+5Z9xja5qH5JZobEPsa8+YYphMrOSwnrshEhG2qww==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/nise/-/nise-6.0.0.tgz", + "integrity": "sha512-K8ePqo9BFvN31HXwEtTNGzgrPpmvgciDsFz8aztFjt4LqKO/JeFD8tBOeuDiCMXrIl/m1YvfH8auSpxfaD09wg==", "dev": true, "dependencies": { "@sinonjs/commons": "^3.0.0", @@ -4391,19 +4413,6 @@ "node": ">=0.3.1" } }, - "node_modules/sinon/node_modules/nise": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/nise/-/nise-6.0.0.tgz", - "integrity": "sha512-K8ePqo9BFvN31HXwEtTNGzgrPpmvgciDsFz8aztFjt4LqKO/JeFD8tBOeuDiCMXrIl/m1YvfH8auSpxfaD09wg==", - "dev": true, - "dependencies": { - "@sinonjs/commons": "^3.0.0", - "@sinonjs/fake-timers": "^11.2.2", - "@sinonjs/text-encoding": "^0.7.2", - "just-extend": "^6.2.0", - "path-to-regexp": "^6.2.1" - } - }, "node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",