Loadpoint: reset fake charge rater when interrupting session (#22293)

This commit is contained in:
andig 2025-07-10 20:19:42 +02:00 • committed by GitHub
parent 0899b44c5a
commit a2b8c1cbc2
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 34 additions and 4 deletions

View file

@ -4,6 +4,7 @@ import (
"github.com/evcc-io/evcc/api"
"github.com/evcc-io/evcc/core/keys"
"github.com/evcc-io/evcc/core/session"
"github.com/evcc-io/evcc/core/wrapper"
"github.com/jinzhu/now"
"github.com/samber/lo"
)
@ -72,10 +73,6 @@ func (lp *Loadpoint) stopSession() {
s.MeterStop = &meterStop
}
if chargedEnergy := lp.GetChargedEnergy() / 1e3; chargedEnergy > s.ChargedEnergy {
lp.energyMetrics.Update(chargedEnergy)
}
s.SolarPercentage = lo.ToPtr(lp.energyMetrics.SolarPercentage())
s.Price = lp.energyMetrics.Price()
s.PricePerKWh = lp.energyMetrics.PricePerKWh()
@ -125,5 +122,10 @@ func (lp *Loadpoint) resetHeatingSession() {
lp.stopSession()
lp.clearSession()
if cr, ok := lp.chargeRater.(wrapper.ChargeResetter); ok {
cr.ResetCharge()
}
lp.createSession()
}

View file

@ -24,6 +24,11 @@ type ChargeRater struct {
chargedEnergy float64
}
// ChargeResetter resets the charging session
type ChargeResetter interface {
ResetCharge()
}
// NewChargeRater creates charge rater and initializes realtime clock
func NewChargeRater(log *util.Logger, meter api.Meter) *ChargeRater {
return &ChargeRater{
@ -78,6 +83,29 @@ func (cr *ChargeRater) StopCharge() {
}
}
var _ ChargeResetter = (*ChargeRater)(nil)
// ChargeResetter resets the charging session
func (cr *ChargeRater) ResetCharge() {
cr.Lock()
defer cr.Unlock()
// get end energy amount
if m, ok := cr.meter.(api.MeterEnergy); ok {
if f, err := m.TotalEnergy(); err == nil {
cr.chargedEnergy += f - cr.startEnergy
cr.log.DEBUG.Printf("charge final energy: %.3fkWh", cr.chargedEnergy)
cr.startEnergy = f
} else {
cr.log.ERROR.Printf("charge total import: %v", err)
}
}
cr.chargedEnergy = 0
cr.start = cr.clck.Now()
}
// SetChargePower increments consumed energy by amount in kWh since last update
func (cr *ChargeRater) SetChargePower(power float64) {
cr.Lock()