From 8bb3708a624dd7cc676a7acade85da73b42a4ecd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9?= Date: Thu, 27 Feb 2025 12:53:15 +0100 Subject: [PATCH] Dishwasher Mode added see issue #333 --- README.md | 9 ++ docu/settings/semp_dishwasher_sequence.png | Bin 0 -> 82027 bytes lib/semp/Device.js | 161 +++++++++++++++++++-- lib/semp/Planningrequest.js | 18 ++- lib/semp/Timeframe.js | 24 ++- 5 files changed, 194 insertions(+), 18 deletions(-) create mode 100644 docu/settings/semp_dishwasher_sequence.png diff --git a/README.md b/README.md index fbec818..b4cf6a5 100644 --- a/README.md +++ b/README.md @@ -57,6 +57,15 @@ An description about general usage of energy requests see [SMA docu](https://git ## Requirements +## Dishwasher Mode + +The adapter can be used to control a dishwasher. The dishwasher is switched on when there is enough solar energy. +Details of implementation can be found in issue #333. + +![Flowchart](https://github.com/rg-engineering/ioBroker.semp/blob/master/docu/settings/semp_dishwasher_sequence.png) + + + ## known issues * please create issues at [github](https://github.com/rg-engineering/ioBroker.semp/issues) if you find bugs or whish new features diff --git a/docu/settings/semp_dishwasher_sequence.png b/docu/settings/semp_dishwasher_sequence.png new file mode 100644 index 0000000000000000000000000000000000000000..d2f0a6f292bc48415d4d12d2a205eb09e1474d08 GIT binary patch literal 82027 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 literal 0 HcmV?d00001 diff --git a/lib/semp/Device.js b/lib/semp/Device.js index aeea6d5..66109a8 100644 --- a/lib/semp/Device.js +++ b/lib/semp/Device.js @@ -122,7 +122,18 @@ class Device { startCharge: "charge starting", charging: "charging", fastCharging: "fast charging", - stopCharge: "charge stopping" + stopCharge: "charge stopping", + //dishwasher + off: "off", + TimeframeOn: "Timeframe On", + FinishedWaiting4TF: "FinishedWaiting4TF", + TFendedWaiting4Device: "TFendedWaiting4Device", + TFended: "TFended", + DeviceFinished: "DeviceFinished", + DeviceInStandby:"DeviceInStandby" + + + }; this.Gateway = gateway; @@ -146,7 +157,8 @@ class Device { MinEnergy: 0.1 * this.device.BatteryCapacity, MinPower: this.device.MinPower, MaxPower: this.device.MaxPower, - WallboxChargeTime: this.device.WallboxChargeTime + WallboxChargeTime: this.device.WallboxChargeTime, + DishWasherMode: (this.device.Type == "DishWasher") ? true : false }; this.planningrequest = null; @@ -431,6 +443,15 @@ class Device { } + + + if (device.Type == "DishWasher") { + this.dishwasherstate = this.states.off; + this.DishwasherSwitchState = "Off"; + this.DishWasherRecommendation = false; + this.DishwasherStatusTimerID = setInterval(this.DishWasherSequence.bind(this), 10*1000); + } + this.deviceStatus = { DeviceId: device.ID, EMSignalsAccepted: true, @@ -479,6 +500,11 @@ class Device { this.CancelRequestTimerID = null; } + if (this.DishwasherStatusTimerID) { + clearTimeout(this.DishwasherStatusTimerID); + this.DishwasherStatusTimerID = null; + } + for (let i = 0; i < this.UrlTimerId.length; i++) { clearInterval(this.UrlTimerId[i]); this.UrlTimerId[i] = null; @@ -512,6 +538,12 @@ class Device { await this.Switch(false); } + async SwitchOn() { + + this.Gateway.parentAdapter.log.debug(this.device.Name + " turn device on"); + + await this.Switch(true); + } setLastPower(watts, minPower, maxPower) { @@ -548,6 +580,7 @@ class Device { //going to on if (this.deviceStatus.Status == "On" || this.StatusDetectionOnTimerID != null) { //nothing to do, already true or timer started + this.Gateway.parentAdapter.log.debug(this.device.Name + " already on, no timer start"); } else { this.StatusDetectionOnTimerID = setTimeout(this.SetStatusOn.bind(this), this.device.StatusDetectionLimitTimeOn * 60 * 1000); @@ -633,13 +666,6 @@ class Device { } setOnOff(state) { - //could be On, Off, Offline - this.Gateway.parentAdapter.log.debug(this.device.Name + " setState " + state); - this.deviceStatus.Status = state; - - if (this.planningrequest != null) { - this.planningrequest.SetDeviceStatus(state); - } if (state == "On") { //cancel timer if running @@ -648,6 +674,26 @@ class Device { this.CancelRequestTimerID = null; } } + + if (this.device.Type == "DishWasher") { + + //just store the state + this.DishwasherSwitchState = state; + + } + else { + + + //could be On, Off, Offline + this.Gateway.parentAdapter.log.debug(this.device.Name + " setState " + state); + this.deviceStatus.Status = state; + + if (this.planningrequest != null) { + this.planningrequest.SetDeviceStatus(state); + } + + + } this.SetState(); if (this.device.MeasurementMethod == "Estimation") { @@ -666,6 +712,87 @@ class Device { } + DishWasherSequence() { + //squence see draw.io diagram + + let lastDishwasherState = this.dishwasherstate; + + this.deviceStatus.Status = "Off"; + + if (this.dishwasherstate == this.states.off) { + + //check if timeframe is active + if (this.planningrequest != null && this.planningrequest.getAnyTimefraneActive()) { + this.dishwasherstate = this.states.TimeframeOn; + } + } + else if (this.dishwasherstate == this.states.TimeframeOn) { + //now waitung until user switches device on + if (this.DishwasherSwitchState == "On") { + this.dishwasherstate = this.states.waiting4On; + + //switch off the device completely + this.SwitchOff(); + + + //todo erst mal auf Off warten? + } + + } + else if (this.dishwasherstate == this.states.waiting4On) { + //now waitung for On-recommndation + if (this.DishWasherRecommendation) { + this.dishwasherstate = this.states.on; + this.Gateway.parentAdapter.log.debug(this.device.Name + " set new recommendation state to on" ); + + this.Switch(true); + this.dishwasherstate = this.states.on; + } + if (this.planningrequest == null || this.planningrequest.getAnyTimefraneActive() == false) { + this.dishwasherstate = this.states.TFended; + } + + } + else if (this.dishwasherstate == this.states.on) { + this.deviceStatus.Status = "On"; + + if (this.planningrequest == null || this.planningrequest.getAnyTimefraneActive()==false) { + this.dishwasherstate = this.states.TFendedWaiting4Device; + } + if (this.DishwasherSwitchState == "Off") { + this.dishwasherstate = this.states.FinishedWaiting4TF; + } + } + else if (this.dishwasherstate == this.states.FinishedWaiting4TF) { + if (this.planningrequest == null || this.planningrequest.getAnyTimefraneActive() == false) { + this.dishwasherstate = this.states.TFended; + } + } + else if (this.dishwasherstate == this.states.TFendedWaiting4Device) { + this.deviceStatus.Status = "On"; + if (this.DishwasherSwitchState == "Off") { + this.dishwasherstate = this.states.DeviceFinished; + } + } + else if (this.dishwasherstate == this.states.TFended) { + this.dishwasherstate = this.states.DeviceInStandby; + } + else if (this.dishwasherstate == this.states.DeviceFinished) { + this.dishwasherstate = this.states.DeviceInStandby; + } + else if (this.dishwasherstate == this.states.DeviceInStandby) { + //check if timeframe is active + if (this.planningrequest != null && this.planningrequest.getAnyTimefraneActive()) { + this.dishwasherstate = this.states.TimeframeOn; + } + } + if (lastDishwasherState != this.dishwasherstate) { + //log only if state changed + this.Gateway.parentAdapter.log.debug(this.device.Name + " new dishwasher state " + this.dishwasherstate); + } + } + + async sendEMRecommendation(em2dev) { if (this.device.Type == "EVCharger" && this.isFastCharging) { @@ -843,9 +970,19 @@ class Device { if (this.device.HasOIDSwitch) { - this.Gateway.parentAdapter.log.debug(this.device.Name + " set new recommendation state to " + value); + if (this.device.Type == "DishWasher") { + this.DishWasherRecommendation = value; + } + else { + + + this.Gateway.parentAdapter.log.debug(this.device.Name + " set new recommendation state to " + value); + + await this.Switch(value); + } + + - await this.Switch(value); } if (this.device.Type == "EVCharger") { if (value) { @@ -1278,7 +1415,7 @@ class Device { this.Gateway.parentAdapter.log.debug(this.device.Name + " in SetState, set new state " + state); } else { - this.Gateway.parentAdapter.log.debug(this.device.Name + " in SetState, no new state to set"); + this.Gateway.parentAdapter.log.debug(this.device.Name + " in SetState, no new state to set, is " + state); } } diff --git a/lib/semp/Planningrequest.js b/lib/semp/Planningrequest.js index d5a44bf..fbeb05f 100644 --- a/lib/semp/Planningrequest.js +++ b/lib/semp/Planningrequest.js @@ -50,7 +50,9 @@ class Planningrequest { const settings = { EnergyRequestPeriod: this.settings.EnergyRequestPeriods[r], DeviceName: this.settings.DeviceName, - SwitchOffAtEndOfTimer: this.settings.SwitchOffAtEndOfTimer + //SwitchOffAtEndOfTimer: this.settings.SwitchOffAtEndOfTimer + //xxx + DishWasherMode: this.settings.DishWasherMode }; this.parentAdapter.log.debug("planningrequest " + JSON.stringify(this.settings) + " " + JSON.stringify(settings)); @@ -127,6 +129,20 @@ class Planningrequest { return PlanningrequestData; } + getAnyTimefraneActive() { + + let bRet = false; + for (let t = 0; t < this.timeframes.length; t++) { + if (this.timeframes[t].GetIsActive()) { + bRet = true; + } + + } + + return bRet; + } + + Check2Switch() { let SwitchOff = false; diff --git a/lib/semp/Timeframe.js b/lib/semp/Timeframe.js index fb01f35..db8c464 100644 --- a/lib/semp/Timeframe.js +++ b/lib/semp/Timeframe.js @@ -13,6 +13,7 @@ class Timeframe { this.settings = settings.EnergyRequestPeriod; this.deviceName = settings.DeviceName; + this.DishWasherMode = settings.DishWasherMode; this.isActive = false; this.parentAdapter = parentAdapter; @@ -196,17 +197,17 @@ class Timeframe { const current = await this.parentAdapter.getStateAsync(key); - this.parentAdapter.log.debug(key + ": timeframe " + JSON.stringify(current)); + //this.parentAdapter.log.debug(key + ": timeframe " + JSON.stringify(current)); if (current != null) { if (current.val == true || current.val == "true") { this.enabled = true; - this.parentAdapter.log.debug( "timeframe enabled " ); + //this.parentAdapter.log.debug( "timeframe enabled " ); } else { this.enabled = false; - this.parentAdapter.log.debug( "timeframe disabled "); + //this.parentAdapter.log.debug( "timeframe disabled "); } } } @@ -312,8 +313,17 @@ class Timeframe { if (this.EarliestStart == 0 && this.LatestEnd == 0) { - SwitchOff = true; - this.parentAdapter.log.debug(this.deviceName + " turn device off at end of LatestEnd"); + + + //xxx hier im Sp�lmaschinen-Modus nicht ausschalten + if (this.DishWasherMode) { + this.parentAdapter.log.debug(this.deviceName + " not to turn device off at end of LatestEnd, dishwasher"); + } + else { + SwitchOff = true; + this.parentAdapter.log.debug(this.deviceName + " turn device off at end of LatestEnd"); + + } this.isActive = false; this.Start(); } @@ -539,6 +549,10 @@ class Timeframe { this.parentAdapter.setState(key, { ack: true, val: val }); } + + GetIsActive() { + return this.isActive; + } }