()
| 115 | var errOptimizerNotReady = errors.New("battery measurements not ready") |
| 116 | |
| 117 | func (site *Site) optimizerUpdateAsync() { |
| 118 | if !mu.TryLock() { |
| 119 | return |
| 120 | } |
| 121 | defer mu.Unlock() |
| 122 | |
| 123 | if time.Since(optimizerUpdated) < 2*time.Minute { |
| 124 | return |
| 125 | } |
| 126 | |
| 127 | var err error |
| 128 | |
| 129 | defer func() { |
| 130 | if r := recover(); r != nil { |
| 131 | err = fmt.Errorf("panic %v", r) |
| 132 | } |
| 133 | |
| 134 | // not ready yet: keep the gate open for an immediate retry next cycle |
| 135 | if errors.Is(err, errOptimizerNotReady) { |
| 136 | return |
| 137 | } |
| 138 | |
| 139 | optimizerUpdated = time.Now() |
| 140 | |
| 141 | if err != nil { |
| 142 | site.log.ERROR.Println("optimizer:", err) |
| 143 | } |
| 144 | }() |
| 145 | |
| 146 | err = site.optimizerUpdate(site.battery.Devices) |
| 147 | } |
| 148 | |
| 149 | func (site *Site) optimizerUpdate(battery []types.Measurement) error { |
| 150 | solarTariff := site.GetTariff(api.TariffUsageSolar) |
no test coverage detected