@@ -18,6 +18,7 @@ import (
1818 "github.com/evcc-io/evcc/core/coordinator"
1919 "github.com/evcc-io/evcc/core/keys"
2020 "github.com/evcc-io/evcc/core/loadpoint"
21+ "github.com/evcc-io/evcc/core/metrics"
2122 "github.com/evcc-io/evcc/core/planner"
2223 "github.com/evcc-io/evcc/core/prioritizer"
2324 "github.com/evcc-io/evcc/core/session"
@@ -100,6 +101,9 @@ type Site struct {
100101 fcstEnergy * meterEnergy
101102 pvEnergy map [string ]* meterEnergy
102103
104+ householdEnergy * meterEnergy
105+ householdSlotStart time.Time
106+
103107 // cached state
104108 gridPower float64 // Grid power
105109 pvPower float64 // PV power
@@ -248,10 +252,11 @@ func (site *Site) Boot(log *util.Logger, loadpoints []*Loadpoint, tariffs *tarif
248252// NewSite creates a Site with sane defaults
249253func NewSite () * Site {
250254 site := & Site {
251- log : util .NewLogger ("site" ),
252- Voltage : 230 , // V
253- pvEnergy : make (map [string ]* meterEnergy ),
254- fcstEnergy : & meterEnergy {clock : clock .New ()},
255+ log : util .NewLogger ("site" ),
256+ Voltage : 230 , // V
257+ pvEnergy : make (map [string ]* meterEnergy ),
258+ fcstEnergy : & meterEnergy {clock : clock .New ()},
259+ householdEnergy : & meterEnergy {clock : clock .New ()},
255260 }
256261
257262 return site
@@ -764,6 +769,39 @@ func (site *Site) updateMeters() error {
764769 return eg .Wait ()
765770}
766771
772+ func (site * Site ) updateHouseholdConsumption (totalChargePower float64 ) {
773+ householdPower := site .gridPower + site .pvPower + site .batteryPower - totalChargePower
774+ if householdPower <= 0 {
775+ return
776+ }
777+
778+ site .householdEnergy .AddPower (householdPower )
779+
780+ now := site .householdEnergy .clock .Now ()
781+
782+ if site .householdSlotStart .IsZero () {
783+ site .householdSlotStart = now
784+ return
785+ }
786+
787+ slotDuration := time .Minute
788+ slotStart := now .Truncate (slotDuration )
789+
790+ if slotStart .After (site .householdSlotStart ) {
791+ // next slot has started
792+ if slotStart .Sub (site .householdSlotStart ) >= slotDuration {
793+ // more or less full slot
794+ site .log .DEBUG .Printf ("15min household consumption: %.0fWh" , site .householdEnergy .Accumulated )
795+ if err := metrics .Persist (site .householdSlotStart , site .householdEnergy .Accumulated ); err != nil {
796+ site .log .ERROR .Printf ("persist household consumption: %v" , err )
797+ }
798+ }
799+
800+ site .householdSlotStart = slotStart
801+ site .householdEnergy .Accumulated = 0
802+ }
803+ }
804+
767805// sitePower returns
768806// - the net power exported by the site minus a residual margin
769807// (negative values mean grid: export, battery: charging
@@ -935,6 +973,8 @@ func (site *Site) update(lp updater) {
935973 site .log .ERROR .Println (err )
936974 }
937975
976+ site .updateHouseholdConsumption (totalChargePower )
977+
938978 site .stats .Update (site )
939979}
940980
0 commit comments