package awn import ( "context" "net/http" "net/url" "time" "github.com/gorilla/schema" "gitea.libretechconsulting.com/rmcguire/ambient-weather-local-exporter/pkg/weather" ) type AWNProvider struct{} const providerName = "awn" func (awn *AWNProvider) Name() string { return providerName } // Takes an inbound request from the ambient device and maps // to a stable struct for weather updates func (awn *AWNProvider) ReqToWeather(_ context.Context, r *http.Request) ( *weather.WeatherUpdate, error, ) { awnUpdate, err := UnmarshalQueryParams(r.URL.Query()) if err != nil { return nil, err } return MapAwnUpdate(awnUpdate), nil } func MapAwnUpdate(awnUpdate *AmbientWeatherUpdate) *weather.WeatherUpdate { updateTime := time.Now() if awnUpdate.DateUTC != nil { ut, err := time.Parse(time.DateTime, *awnUpdate.DateUTC) if err == nil { updateTime = ut } } return &weather.WeatherUpdate{ DateUTC: &updateTime, StationID: awnUpdate.PassKey, StationType: awnUpdate.StationType, TempOutdoorF: awnUpdate.TempF, HumidityOudoor: awnUpdate.Humidity, WindSpeedMPH: awnUpdate.WindSpeedMPH, WindGustMPH: awnUpdate.WindGustMPH, MaxDailyGust: awnUpdate.MaxDailyGust, WindDir: awnUpdate.WindDir, WindDirAvg10m: awnUpdate.WindDirAVG10m, UV: awnUpdate.UV, SolarRadiation: awnUpdate.SolarRadiation, HourlyRainIn: awnUpdate.HourlyRainIn, EventRainIn: awnUpdate.EventRainIn, DailyRainIn: awnUpdate.DailyRainIn, WeeklyRainIn: awnUpdate.WeeklyRainIn, MonthlyRainIn: awnUpdate.MonthlyRainIn, YearlyRainIn: awnUpdate.YearlyRainIn, TotalRainIn: awnUpdate.TotalRainIn, Batteries: []weather.BatteryStatus{ { Component: "OutdoorSensor", Status: awnUpdate.BattOut, }, { Component: "IndoorSensor", Status: awnUpdate.BattIn, }, { Component: "RainSensor", Status: awnUpdate.BattRain, }, { Component: "CO2Sensor", Status: awnUpdate.BattCO2, }, }, TempIndoorF: awnUpdate.TempInF, HumidityIndoor: awnUpdate.HumidityIn, BaromRelativeIn: awnUpdate.BaromRelIn, BaromAbsoluteIn: awnUpdate.BaromAbsIn, } } func UnmarshalQueryParams(query url.Values) (*AmbientWeatherUpdate, error) { update := new(AmbientWeatherUpdate) decoder := schema.NewDecoder() if err := decoder.Decode(update, query); err != nil { return nil, err } return update, nil }