Weather service proxy support
All checks were successful
Build and Publish / release (push) Successful in 3m51s

This commit is contained in:
2025-01-12 17:23:32 -05:00
parent 7fc1fc9b56
commit 19823ea08f
13 changed files with 285 additions and 255 deletions

View File

@ -13,6 +13,7 @@ import (
"go.opentelemetry.io/otel/attribute"
"go.opentelemetry.io/otel/codes"
"gitea.libretechconsulting.com/rmcguire/ambient-weather-local-exporter/pkg/ambient/config"
"gitea.libretechconsulting.com/rmcguire/ambient-weather-local-exporter/pkg/provider"
"gitea.libretechconsulting.com/rmcguire/ambient-weather-local-exporter/pkg/provider/awn"
"gitea.libretechconsulting.com/rmcguire/ambient-weather-local-exporter/pkg/provider/wunderground"
@ -24,7 +25,7 @@ type AmbientWeather struct {
// when either "AmbientWeather" or "Wunderground" are selected
// in the "Custom" section of the AWNet app, or the web UI
// of an Ambient WeatherHub
config *AmbientLocalExporterConfig
config *config.AmbientLocalExporterConfig
awnProvider provider.AmbientProvider
wuProvider provider.AmbientProvider
appCtx context.Context
@ -32,7 +33,7 @@ type AmbientWeather struct {
l *zerolog.Logger
}
func New(appCtx context.Context, awConfig *AmbientLocalExporterConfig) *AmbientWeather {
func New(appCtx context.Context, awConfig *config.AmbientLocalExporterConfig) *AmbientWeather {
return &AmbientWeather{
config: awConfig,
appCtx: appCtx,
@ -118,7 +119,7 @@ func (aw *AmbientWeather) handleProviderRequest(
// Proxy update to one or both services if configured to do so
// Uses a weather update to allow awn to publish to wunderground and
// visa versa.
if station := aw.config.GetStation(update.GetStationName()); station != nil {
if station := update.StationConfig; station != nil {
if station.ProxyToAWN {
err := aw.awnProvider.ProxyReq(ctx, update)
if err != nil {
@ -126,14 +127,12 @@ func (aw *AmbientWeather) handleProviderRequest(
}
}
if station.ProxyToWunderground {
err := aw.awnProvider.ProxyReq(ctx, update)
err := aw.wuProvider.ProxyReq(ctx, update)
if err != nil {
zerolog.Ctx(aw.appCtx).Err(err).Msg("failed to proxy to ambient weather")
}
}
}
return
}
func (aw *AmbientWeather) InitMetrics() {
@ -147,13 +146,7 @@ func (aw *AmbientWeather) enrichStation(update *weather.WeatherUpdate) {
if update != nil && update.StationID != nil && *update.StationID != "" {
for _, station := range aw.config.WeatherStations {
if *update.StationID == station.AWNPassKey || *update.StationID == station.WundergroundID {
update.StationInfo = &weather.StationInfo{
Type: update.StationType,
Equipment: &station.Equipment,
Name: &station.Name,
Keep: station.KeepMetrics,
Drop: station.DropMetrics,
}
update.StationConfig = &station
}
}
}

View File

@ -1,9 +1,7 @@
package ambient
package config
import (
"gitea.libretechconsulting.com/rmcguire/go-app/pkg/config"
"gitea.libretechconsulting.com/rmcguire/ambient-weather-local-exporter/pkg/weather"
)
// This configuration includes all config from go-app/config.AppConfig
@ -17,11 +15,10 @@ type WeatherStation struct {
Name string `yaml:"name"` // Human Friendly Name (e.g. Back Yard Weather)
Equipment string `yaml:"equipment"` // Equipment Type (e.g. WS-5000)
// One of these is required, based on the type
// set in the "Custom" weather service on your
// console, weather station, or weather hub
WundergroundID string `yaml:"wundergroundID"`
AWNPassKey string `yaml:"awnPassKey"`
// Required if proxying to awn/wu is enabled
WundergroundID string `yaml:"wundergroundID"`
WundergroundPassword string `yaml:"wundergroundPassword"`
AWNPassKey string `yaml:"awnPassKey"`
// Proxy updates to AWN or Wunderground
ProxyToAWN bool `yaml:"proxyToAWN"`
@ -31,16 +28,9 @@ type WeatherStation struct {
// will be excluded if present in discardMetrics
//
// If anything is present in keepMetrics, it is solely applied,
// ignoring discardMetrics
KeepMetrics []weather.WeatherUpdateField `yaml:"keepMetrics"`
DropMetrics []weather.WeatherUpdateField `yaml:"dropMetrics"`
}
func (wc *AmbientLocalExporterConfig) GetStation(name string) *WeatherStation {
for _, station := range wc.WeatherStations {
if station.Name == name {
return &station
}
}
return nil
// ignoring discardMetrics.
//
// Check weather.WeatherUpdateField for options
KeepMetrics []string `yaml:"keepMetrics"`
DropMetrics []string `yaml:"dropMetrics"`
}