Allow specifiying multiple PV inverters as list in config (#1576)
Some checks failed
Build / Build (push) Failing after 7m21s
Build / Build UI (push) Failing after 3m4s
Validate Schema / build (push) Failing after 4s
Build / Publish :latest (push) Has been skipped
Build / Publish :release (push) Has been skipped
Build / Release (push) Has been skipped

This commit is contained in:
andig 2021-09-18 09:36:18 +02:00 • committed by GitHub
parent ac98b8a543
commit a277f158a5
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 42 additions and 16 deletions

View file

@ -194,6 +194,9 @@ func NewLoadPointFromConfig(log *util.Logger, cp configProvider, other map[strin
// single vehicle
if lp.VehicleRef != "" {
if len(lp.vehicles) > 0 {
return nil, errors.New("cannot have vehicle and vehicles both")
}
vehicle := cp.Vehicle(lp.VehicleRef)
lp.vehicles = append(lp.vehicles, vehicle)
}

View file

@ -39,9 +39,9 @@ type Site struct {
PrioritySoC float64 `mapstructure:"prioritySoC"` // prefer battery up to this SoC
// meters
gridMeter api.Meter // Grid usage meter
pvMeter api.Meter // PV generation meter
batteryMeter api.Meter // Battery charging meter
gridMeter api.Meter // Grid usage meter
pvMeters []api.Meter // PV generation meters
batteryMeter api.Meter // Battery charging meter
tariff api.Tariff // Tariff
loadpoints []*LoadPoint // Loadpoints
@ -54,9 +54,10 @@ type Site struct {
// MetersConfig contains the loadpoint's meter configuration
type MetersConfig struct {
GridMeterRef string `mapstructure:"grid"` // Grid usage meter reference
PVMeterRef string `mapstructure:"pv"` // PV generation meter reference
BatteryMeterRef string `mapstructure:"battery"` // Battery charging meter reference
GridMeterRef string `mapstructure:"grid"` // Grid usage meter
PVMeterRef string `mapstructure:"pv"` // PV meter
PVMetersRef []string `mapstructure:"pvs"` // Multiple PV meters
BatteryMeterRef string `mapstructure:"battery"` // Battery charging meter
}
// NewSiteFromConfig creates a new site
@ -79,15 +80,28 @@ func NewSiteFromConfig(
if site.Meters.GridMeterRef != "" {
site.gridMeter = cp.Meter(site.Meters.GridMeterRef)
}
if site.Meters.PVMeterRef != "" {
site.pvMeter = cp.Meter(site.Meters.PVMeterRef)
// multiple pv
for _, ref := range site.Meters.PVMetersRef {
pv := cp.Meter(ref)
site.pvMeters = append(site.pvMeters, pv)
}
// single pv
if site.Meters.PVMeterRef != "" {
if len(site.pvMeters) > 0 {
return nil, errors.New("cannot have pv and pvs both")
}
pv := cp.Meter(site.Meters.PVMeterRef)
site.pvMeters = append(site.pvMeters, pv)
}
if site.Meters.BatteryMeterRef != "" {
site.batteryMeter = cp.Meter(site.Meters.BatteryMeterRef)
}
// configure meter from references
if site.gridMeter == nil && site.pvMeter == nil {
if site.gridMeter == nil && len(site.pvMeters) == 0 {
return nil, errors.New("missing either grid or pv meter")
}
@ -135,7 +149,7 @@ func (site *Site) DumpConfig() {
site.log.INFO.Println("site config:")
site.log.INFO.Printf(" meters: grid %s pv %s battery %s",
presence[site.gridMeter != nil],
presence[site.pvMeter != nil],
presence[len(site.pvMeters) > 0],
presence[site.batteryMeter != nil],
)
@ -144,9 +158,11 @@ func (site *Site) DumpConfig() {
site.log.INFO.Println(meterCapabilities("grid", site.gridMeter))
}
site.publish("pvConfigured", site.pvMeter != nil)
if site.pvMeter != nil {
site.log.INFO.Println(meterCapabilities("pv", site.pvMeter))
site.publish("pvConfigured", len(site.pvMeters) > 0)
if len(site.pvMeters) > 0 {
for i, pv := range site.pvMeters {
site.log.INFO.Println(meterCapabilities(fmt.Sprintf("pv %d", i), pv))
}
}
site.publish("batteryConfigured", site.batteryMeter != nil)
@ -247,8 +263,14 @@ func (site *Site) updateMeters() error {
return err
}
// pv meter is not critical for operation
_ = retryMeter("pv", site.pvMeter, &site.pvPower)
site.pvPower = 0
for _, pv := range site.pvMeters {
var power float64
// pv meter is not critical for operation
if err := retryMeter("pv", pv, &power); err != nil {
site.pvPower += power
}
}
err := retryMeter("grid", site.gridMeter, &site.gridPower)
if err == nil {

View file

@ -58,7 +58,8 @@ site:
title: Home # display name for UI
meters:
grid: grid # grid meter
pv: pv # pv meter
pvs:
- pv # list of pv inverters/ meters
battery: battery # battery meter
prioritySoC: 60 # give home battery priority up to this soc (0 to disable)