Fix updating multiple pv meters (#1673)

This commit is contained in:
andig 2021-10-01 11:10:20 +02:00 • committed by GitHub
parent 370a1fedb9
commit dfcb7de0ea
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -230,46 +230,54 @@ func (site *Site) publish(key string, val interface{}) {
}
// updateMeter updates and publishes single meter
func (site *Site) updateMeter(name string, meter api.Meter, power *float64) error {
value, err := meter.CurrentPower()
if err != nil {
func (site *Site) updateMeter(meter api.Meter, power *float64) func() error {
return func() error {
value, err := meter.CurrentPower()
if err == nil {
*power = value // update value if no error
}
return err
}
*power = value // update value if no error
site.log.DEBUG.Printf("%s power: %.0fW", name, *power)
site.publish(name+"Power", *power)
return nil
}
// updateMeter updates and publishes single meter
func (site *Site) updateMeters() error {
retryMeter := func(s string, m api.Meter, f *float64) error {
if m == nil {
retryMeter := func(name string, meter api.Meter, power *float64) error {
if meter == nil {
return nil
}
err := retry.Do(func() error {
return site.updateMeter(s, m, f)
}, retryOptions...)
err := retry.Do(site.updateMeter(meter, power), retryOptions...)
if err != nil {
err = fmt.Errorf("updating %s meter: %v", s, err)
if err == nil {
site.log.DEBUG.Printf("%s power: %.0fW", name, *power)
site.publish(name+"Power", *power)
} else {
err = fmt.Errorf("updating %s meter: %v", name, err)
site.log.ERROR.Println(err)
}
return err
}
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
if len(site.pvMeters) > 0 {
site.pvPower = 0
for id, meter := range site.pvMeters {
var power float64
err := retry.Do(site.updateMeter(meter, &power), retryOptions...)
if err == nil {
site.pvPower += power
} else {
err = fmt.Errorf("updating pv meter %d: %v", id, err)
site.log.ERROR.Println(err)
}
}
site.log.DEBUG.Printf("pv power: %.0fW", site.pvPower)
site.publish("pvPower", site.pvPower)
}
err := retryMeter("grid", site.gridMeter, &site.gridPower)
@ -298,11 +306,6 @@ func (site *Site) updateMeters() error {
return err
}
// consumedPower estimates how much power the charger might have consumed given it was the only load
// func (site *Site) consumedPower() float64 {
// return consumedPower(lp.pvPower, lp.batteryPower, lp.gridPower)
// }
// sitePower returns the net power exported by the site minus a residual margin.
// negative values mean grid: export, battery: charging
func (site *Site) sitePower() (float64, error) {