Fix updating multiple pv meters (#1673)
This commit is contained in:
parent
370a1fedb9
commit
dfcb7de0ea
1 changed files with 31 additions and 28 deletions
59
core/site.go
59
core/site.go
|
|
@ -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) {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue