diff --git a/core/loadpoint_session.go b/core/loadpoint_session.go index 96ab15ccc..31e3214ad 100644 --- a/core/loadpoint_session.go +++ b/core/loadpoint_session.go @@ -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() } diff --git a/core/wrapper/chargerater.go b/core/wrapper/chargerater.go index 2d5932cbe..4bd10eff6 100644 --- a/core/wrapper/chargerater.go +++ b/core/wrapper/chargerater.go @@ -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()