diff --git a/core/site.go b/core/site.go index ff4e3f0a6..e223e0770 100644 --- a/core/site.go +++ b/core/site.go @@ -63,6 +63,7 @@ type Site struct { gridMeter api.Meter // Grid usage meter pvMeters []api.Meter // PV generation meters batteryMeters []api.Meter // Battery charging meters + loadMeter api.Meter // Smart load meter tariffs tariff.Tariffs // Tariff loadpoints []*Loadpoint // Loadpoints @@ -86,6 +87,7 @@ type MetersConfig struct { PVMetersRef []string `mapstructure:"pvs"` // Multiple PV meters BatteryMeterRef string `mapstructure:"battery"` // Battery charging meter BatteryMetersRef []string `mapstructure:"batteries"` // Multiple Battery charging meters + SmartLoadRef string `mapstructure:"smart"` // Smart loads meter } // NewSiteFromConfig creates a new site @@ -198,6 +200,14 @@ func NewSiteFromConfig( site.batteryMeters = append(site.batteryMeters, battery) } + // smart load meter + if site.Meters.SmartLoadRef != "" { + var err error + if site.loadMeter, err = cp.Meter(site.Meters.SmartLoadRef); err != nil { + return nil, err + } + } + // configure meter from references if site.gridMeter == nil && len(site.pvMeters) == 0 { return nil, errors.New("missing either grid or pv meter") @@ -552,6 +562,17 @@ func (site *Site) sitePower(totalChargePower float64) (float64, error) { sitePower := sitePower(site.log, site.MaxGridSupplyWhileBatteryCharging, site.gridPower, batteryPower, site.ResidualPower) + // deduct smart loads + if site.loadMeter != nil { + if power, err := site.loadMeter.CurrentPower(); err != nil { + site.log.ERROR.Printf("smart load meter: %v", err) + } else { + site.log.DEBUG.Printf("smart load power: %.0fW", power) + site.publish("smartLoadPower", power) + sitePower -= power + } + } + site.log.DEBUG.Printf("site power: %.0fW", sitePower) return sitePower, nil diff --git a/evcc.dist.yaml b/evcc.dist.yaml index c550319f1..5a5996d82 100644 --- a/evcc.dist.yaml +++ b/evcc.dist.yaml @@ -69,6 +69,8 @@ meters: type: ... - name: charge type: ... + - name: smart + type: ... # charger definitions # name can be freely chosen and is used as reference when assigning charger to vehicle @@ -103,7 +105,9 @@ site: grid: grid # grid meter pvs: - pv # list of pv inverters/ meters - battery: battery # battery meter + batteries: + - battery # list of battery meters + smart: smart # additional smart loads meter prioritySoc: # give home battery priority up to this soc (empty to disable) bufferSoc: # ignore home battery discharge above soc (empty to disable) diff --git a/schema.json b/schema.json index 8a90113c9..19c0bcee3 100644 --- a/schema.json +++ b/schema.json @@ -176,6 +176,9 @@ }, "minItems": 1, "uniqueItems": true + }, + "smart": { + "type": "string" } } }, @@ -326,4 +329,4 @@ ] } } -} +} \ No newline at end of file