summarise data from openmeteo

This commit is contained in:
2026-01-26 13:20:30 +11:00
parent c315811ec3
commit 7526a7af93
3 changed files with 246 additions and 6 deletions

View File

@@ -39,6 +39,7 @@ func main() {
}()
latest := &mqttingest.Latest{}
forecastCache := &ForecastCache{}
d, err := db.Open(ctx, cfg.DB.ConnString)
if err != nil {
@@ -54,7 +55,7 @@ func main() {
// Start Open-Meteo poller (optional)
if cfg.Pollers.OpenMeteo.Enabled {
go runOpenMeteoPoller(ctx, d, site, cfg.Pollers.OpenMeteo.Model, cfg.Pollers.OpenMeteo.Interval)
go runOpenMeteoPoller(ctx, d, forecastCache, site, cfg.Pollers.OpenMeteo.Model, cfg.Pollers.OpenMeteo.Interval)
}
if cfg.Wunderground.Enabled {
@@ -83,6 +84,10 @@ func main() {
latest.Update(ts, p)
if snap, ok := latest.Snapshot(); ok {
logForecastDeviation(forecastCache, snap)
}
if err := d.InsertWS90(ctx, db.InsertWS90Params{
TS: ts,
Site: cfg.Site.Name,
@@ -119,20 +124,20 @@ func main() {
}
}
func runOpenMeteoPoller(ctx context.Context, d *db.DB, site providers.Site, model string, interval time.Duration) {
func runOpenMeteoPoller(ctx context.Context, d *db.DB, cache *ForecastCache, site providers.Site, model string, interval time.Duration) {
p := &providers.OpenMeteo{}
t := time.NewTicker(interval)
defer t.Stop()
// poll immediately at startup
pollOnce(ctx, d, p, site, model)
pollOnce(ctx, d, cache, p, site, model)
for {
select {
case <-ctx.Done():
return
case <-t.C:
pollOnce(ctx, d, p, site, model)
pollOnce(ctx, d, cache, p, site, model)
}
}
}
@@ -179,7 +184,7 @@ func runWundergroundUploader(ctx context.Context, latest *mqttingest.Latest, sta
}
}
func pollOnce(ctx context.Context, d *db.DB, p providers.Provider, site providers.Site, model string) {
func pollOnce(ctx context.Context, d *db.DB, cache *ForecastCache, p providers.Provider, site providers.Site, model string) {
log.Printf("forecast fetch start provider=%s model=%s site=%s", p.Name(), model, site.Name)
res, err := p.Fetch(ctx.Done(), site, model)
@@ -188,6 +193,14 @@ func pollOnce(ctx context.Context, d *db.DB, p providers.Provider, site provider
return
}
if cache != nil {
cache.Set(res)
}
if summary := forecastSummary(res); summary != "" {
log.Printf("forecast summary provider=%s model=%s %s", p.Name(), res.Model, summary)
}
for _, pt := range res.Hourly {
err := d.UpsertOpenMeteoHourly(ctx, db.InsertOpenMeteoHourlyParams{
TS: pt.TS,