diff --git a/core/loadpoint_session.go b/core/loadpoint_session.go index d30315ab852..bc112604dd1 100644 --- a/core/loadpoint_session.go +++ b/core/loadpoint_session.go @@ -2,6 +2,7 @@ package core import ( "errors" + "math" "time" "github.com/evcc-io/evcc/api" @@ -12,6 +13,20 @@ import ( "github.com/jinzhu/now" ) +func roundFloat64(value float64, digits int) float64 { + factor := math.Pow10(digits) + return math.Round(value*factor) / factor +} + +func roundFloat64Ptr(value *float64, digits int) *float64 { + if value == nil { + return nil + } + + rounded := roundFloat64(*value, digits) + return &rounded +} + func (lp *Loadpoint) chargeMeterTotal() float64 { m, ok := api.Cap[api.MeterEnergy](lp.chargeMeter) if !ok { @@ -55,7 +70,9 @@ func (lp *Loadpoint) createSession() { if lp.site != nil { lp.session.ReferencePricePerKWh = tariff.AverageRate(lp.site.GetTariff(api.TariffUsageGrid), 24*time.Hour) - lp.session.ReferenceCo2PerKWh = tariff.AverageRate(lp.site.GetTariff(api.TariffUsageCo2), 24*time.Hour) + lp.session.ReferenceCo2PerKWh = roundFloat64Ptr( + tariff.AverageRate(lp.site.GetTariff(api.TariffUsageCo2), 24*time.Hour), 4, + ) } // energy @@ -71,10 +88,11 @@ func (lp *Loadpoint) applyEnergyMetrics(s *session.Session) { } s.SolarPercentage = new(lp.energyMetrics.SolarPercentage()) + s.SolarPercentage = roundFloat64Ptr(s.SolarPercentage, 4) s.Price = lp.energyMetrics.Price() - s.PricePerKWh = lp.energyMetrics.PricePerKWh() - s.Co2PerKWh = lp.energyMetrics.Co2PerKWh() - s.ChargedEnergy = lp.energyMetrics.TotalWh() / 1e3 + s.PricePerKWh = roundFloat64Ptr(lp.energyMetrics.PricePerKWh(), 5) + s.Co2PerKWh = roundFloat64Ptr(lp.energyMetrics.Co2PerKWh(), 4) + s.ChargedEnergy = roundFloat64(lp.energyMetrics.TotalWh()/1e3, 5) lp.db.Persist(s) } diff --git a/core/session/db.go b/core/session/db.go index ab21ff624da..5bed61121b3 100644 --- a/core/session/db.go +++ b/core/session/db.go @@ -1,6 +1,8 @@ package session import ( + "math" + "github.com/evcc-io/evcc/server/db" "github.com/evcc-io/evcc/util" "gorm.io/gorm" @@ -88,7 +90,7 @@ func (s *DB) ClosePendingSessionsInHistory(chargeMeterTotal float64) error { } if session.MeterStart != nil && session.MeterStop != nil { - session.ChargedEnergy = *session.MeterStop - *session.MeterStart + session.ChargedEnergy = math.Round((*session.MeterStop-*session.MeterStart)*1e5) / 1e5 s.Persist(session) } }