chore: limit SocLimiter to devices providing Soc

This commit is contained in:
andig 2025-03-05 15:58:49 +01:00
parent 04223e501d
commit 8cb70a1cb7
3 changed files with 8 additions and 97 deletions

View file

@ -8,10 +8,10 @@ import (
func decorateHeatpump(base *Heatpump, meter func() (float64, error), meterEnergy func() (float64, error), battery func() (float64, error), socLimiter func() (int64, error)) api.Charger {
switch {
case battery == nil && meter == nil && socLimiter == nil:
case battery == nil && meter == nil:
return base
case battery == nil && meter != nil && meterEnergy == nil && socLimiter == nil:
case battery == nil && meter != nil && meterEnergy == nil:
return &struct {
*Heatpump
api.Meter
@ -22,7 +22,7 @@ func decorateHeatpump(base *Heatpump, meter func() (float64, error), meterEnergy
},
}
case battery == nil && meter != nil && meterEnergy != nil && socLimiter == nil:
case battery == nil && meter != nil && meterEnergy != nil:
return &struct {
*Heatpump
api.Meter
@ -82,51 +82,6 @@ func decorateHeatpump(base *Heatpump, meter func() (float64, error), meterEnergy
},
}
case battery == nil && meter == nil && socLimiter != nil:
return &struct {
*Heatpump
api.SocLimiter
}{
Heatpump: base,
SocLimiter: &decorateHeatpumpSocLimiterImpl{
socLimiter: socLimiter,
},
}
case battery == nil && meter != nil && meterEnergy == nil && socLimiter != nil:
return &struct {
*Heatpump
api.Meter
api.SocLimiter
}{
Heatpump: base,
Meter: &decorateHeatpumpMeterImpl{
meter: meter,
},
SocLimiter: &decorateHeatpumpSocLimiterImpl{
socLimiter: socLimiter,
},
}
case battery == nil && meter != nil && meterEnergy != nil && socLimiter != nil:
return &struct {
*Heatpump
api.Meter
api.MeterEnergy
api.SocLimiter
}{
Heatpump: base,
Meter: &decorateHeatpumpMeterImpl{
meter: meter,
},
MeterEnergy: &decorateHeatpumpMeterEnergyImpl{
meterEnergy: meterEnergy,
},
SocLimiter: &decorateHeatpumpSocLimiterImpl{
socLimiter: socLimiter,
},
}
case battery != nil && meter == nil && socLimiter != nil:
return &struct {
*Heatpump

View file

@ -8,10 +8,10 @@ import (
func decorateSgReady(base *SgReady, meter func() (float64, error), meterEnergy func() (float64, error), battery func() (float64, error), socLimiter func() (int64, error)) api.Charger {
switch {
case battery == nil && meter == nil && socLimiter == nil:
case battery == nil && meter == nil:
return base
case battery == nil && meter != nil && meterEnergy == nil && socLimiter == nil:
case battery == nil && meter != nil && meterEnergy == nil:
return &struct {
*SgReady
api.Meter
@ -22,7 +22,7 @@ func decorateSgReady(base *SgReady, meter func() (float64, error), meterEnergy f
},
}
case battery == nil && meter != nil && meterEnergy != nil && socLimiter == nil:
case battery == nil && meter != nil && meterEnergy != nil:
return &struct {
*SgReady
api.Meter
@ -82,51 +82,6 @@ func decorateSgReady(base *SgReady, meter func() (float64, error), meterEnergy f
},
}
case battery == nil && meter == nil && socLimiter != nil:
return &struct {
*SgReady
api.SocLimiter
}{
SgReady: base,
SocLimiter: &decorateSgReadySocLimiterImpl{
socLimiter: socLimiter,
},
}
case battery == nil && meter != nil && meterEnergy == nil && socLimiter != nil:
return &struct {
*SgReady
api.Meter
api.SocLimiter
}{
SgReady: base,
Meter: &decorateSgReadyMeterImpl{
meter: meter,
},
SocLimiter: &decorateSgReadySocLimiterImpl{
socLimiter: socLimiter,
},
}
case battery == nil && meter != nil && meterEnergy != nil && socLimiter != nil:
return &struct {
*SgReady
api.Meter
api.MeterEnergy
api.SocLimiter
}{
SgReady: base,
Meter: &decorateSgReadyMeterImpl{
meter: meter,
},
MeterEnergy: &decorateSgReadyMeterEnergyImpl{
meterEnergy: meterEnergy,
},
SocLimiter: &decorateSgReadySocLimiterImpl{
socLimiter: socLimiter,
},
}
case battery != nil && meter == nil && socLimiter != nil:
return &struct {
*SgReady

View file

@ -48,6 +48,7 @@ var a struct {
api.Battery
api.BatteryCapacity
api.BatteryController
api.SocLimiter
}
func typ(i any) string {
@ -58,7 +59,7 @@ var dependents = map[string][]string{
typ(&a.Meter): {typ(&a.MeterEnergy), typ(&a.PhaseCurrents), typ(&a.PhaseVoltages), typ(&a.PhasePowers), typ(&a.MaxACPowerGetter)},
typ(&a.PhaseCurrents): {typ(&a.PhasePowers)}, // phase powers are only used to determine currents sign
typ(&a.PhaseSwitcher): {typ(&a.PhaseGetter)},
typ(&a.Battery): {typ(&a.BatteryCapacity), typ(&a.BatteryController)},
typ(&a.Battery): {typ(&a.BatteryCapacity), typ(&a.BatteryController), typ(&a.SocLimiter)},
}
// hasIntersection returns if the slices intersect