From 6e943a040535c74da3a428501c02ad2d28fe8f7c Mon Sep 17 00:00:00 2001 From: andig Date: Wed, 5 Oct 2022 17:49:38 +0200 Subject: [PATCH] Add CoarseCurrent feature for vehicles that can't follow mA charging (#4662) --- api/feature.go | 1 + api/feature_enumer.go | 16 ++++++++++------ core/loadpoint.go | 20 ++++++++++---------- core/loadpoint_api.go | 9 ++++----- 4 files changed, 25 insertions(+), 21 deletions(-) diff --git a/api/feature.go b/api/feature.go index 9d615d73a..788051860 100644 --- a/api/feature.go +++ b/api/feature.go @@ -14,4 +14,5 @@ func (f *Feature) UnmarshalText(text []byte) error { const ( _ Feature = iota Offline + CoarseCurrent ) diff --git a/api/feature_enumer.go b/api/feature_enumer.go index 55293ab84..0beaac830 100644 --- a/api/feature_enumer.go +++ b/api/feature_enumer.go @@ -7,11 +7,11 @@ import ( "strings" ) -const _FeatureName = "Offline" +const _FeatureName = "OfflineCoarseCurrent" -var _FeatureIndex = [...]uint8{0, 7} +var _FeatureIndex = [...]uint8{0, 7, 20} -const _FeatureLowerName = "offline" +const _FeatureLowerName = "offlinecoarsecurrent" func (i Feature) String() string { i -= 1 @@ -26,17 +26,21 @@ func (i Feature) String() string { func _FeatureNoOp() { var x [1]struct{} _ = x[Offline-(1)] + _ = x[CoarseCurrent-(2)] } -var _FeatureValues = []Feature{Offline} +var _FeatureValues = []Feature{Offline, CoarseCurrent} var _FeatureNameToValueMap = map[string]Feature{ - _FeatureName[0:7]: Offline, - _FeatureLowerName[0:7]: Offline, + _FeatureName[0:7]: Offline, + _FeatureLowerName[0:7]: Offline, + _FeatureName[7:20]: CoarseCurrent, + _FeatureLowerName[7:20]: CoarseCurrent, } var _FeatureNames = []string{ _FeatureName[0:7], + _FeatureName[7:20], } // FeatureString retrieves an enum value from the enum constants string name. diff --git a/core/loadpoint.go b/core/loadpoint.go index e39c84e30..4c1182654 100644 --- a/core/loadpoint.go +++ b/core/loadpoint.go @@ -613,7 +613,7 @@ func (lp *LoadPoint) setLimit(chargeCurrent float64, force bool) error { // set current if chargeCurrent != lp.chargeCurrent && chargeCurrent >= lp.GetMinCurrent() { var err error - if charger, ok := lp.charger.(api.ChargerEx); ok { + if charger, ok := lp.charger.(api.ChargerEx); ok && !lp.vehicleHasFeature(api.CoarseCurrent) { err = charger.MaxCurrentMillis(chargeCurrent) } else { chargeCurrent = math.Trunc(chargeCurrent) @@ -697,12 +697,7 @@ func (lp *LoadPoint) setStatus(status api.ChargeStatus) { // targetEnergyReached checks if target is configured and reached func (lp *LoadPoint) targetEnergyReached() bool { - v, ok := lp.vehicle.(api.FeatureDescriber) - if ok { - ok = v.Has(api.Offline) - } - - return (v == nil || ok) && + return (lp.vehicle == nil || lp.vehicleHasFeature(api.Offline)) && lp.targetEnergy > 0 && lp.chargedEnergy/1e3 >= float64(lp.targetEnergy) } @@ -941,13 +936,18 @@ func (lp *LoadPoint) unpublishVehicle() { lp.vehiclePublishFeature(api.Offline) } -// vehiclePublishFeature availability of vehicle features -func (lp *LoadPoint) vehiclePublishFeature(f api.Feature) { +// vehicleHasFeature checks availability of vehicle feature +func (lp *LoadPoint) vehicleHasFeature(f api.Feature) bool { v, ok := lp.vehicle.(api.FeatureDescriber) if ok { ok = v.Has(f) } - lp.publish("vehicleFeature"+f.String(), ok) + return ok +} + +// vehiclePublishFeature availability of vehicle features +func (lp *LoadPoint) vehiclePublishFeature(f api.Feature) { + lp.publish("vehicleFeature"+f.String(), lp.vehicleHasFeature(f)) } // vehicleUnidentified returns true if there are associated vehicles and detection is running. diff --git a/core/loadpoint_api.go b/core/loadpoint_api.go index 3d28a716d..2d789d285 100644 --- a/core/loadpoint_api.go +++ b/core/loadpoint_api.go @@ -59,11 +59,10 @@ func (lp *LoadPoint) GetTargetEnergy() int { // setTargetEnergy sets loadpoint charge target energy (no mutex) func (lp *LoadPoint) setTargetEnergy(energy int) { lp.targetEnergy = energy - // test guard - if lp.socTimer != nil { - // TODO soctimer - // lp.socTimer.Energy = energy - } + // TODO soctimer + // if lp.socTimer != nil { + // lp.socTimer.Energy = energy + // } lp.publish("targetEnergy", energy) }