Refactor and complete providers

This commit is contained in:
2025-01-04 17:51:55 -05:00
parent 9094cb3d3e
commit 398cfdb77c
12 changed files with 401 additions and 109 deletions

View File

@@ -0,0 +1,70 @@
package wunderground
import (
"context"
"net/http"
"net/url"
"time"
"github.com/gorilla/schema"
"gitea.libretechconsulting.com/rmcguire/ambient-weather-local-exporter/pkg/weather"
)
type WUProvider struct{}
const providerName = "weatherunderground"
func (wu *WUProvider) Name() string {
return providerName
}
// Takes an inbound request from the ambient device and maps
// to a stable struct for weather updates
func (wu *WUProvider) ReqToWeather(_ context.Context, r *http.Request) (
*weather.WeatherUpdate, error,
) {
wuUpdate, err := UnmarshalQueryParams(r.URL.Query())
if err != nil {
return nil, err
}
return MapWUUpdate(wuUpdate), nil
}
func MapWUUpdate(wuUpdate *WundergroundUpdate) *weather.WeatherUpdate {
updateTime, err := time.Parse(time.DateTime, wuUpdate.DateUTC)
if err != nil {
updateTime = time.Now()
}
return &weather.WeatherUpdate{
StationType: wuUpdate.SoftwareType,
DateUTC: &updateTime,
TempF: wuUpdate.Tempf,
Humidity: wuUpdate.Humidity,
WindSpeedMPH: wuUpdate.WindGustMPH,
WindGustMPH: wuUpdate.WindGustMPH,
WindDir: wuUpdate.WindDir,
UV: wuUpdate.UV,
SolarRadiation: wuUpdate.SolarRadiation,
HourlyRainIn: wuUpdate.RainIn,
DailyRainIn: wuUpdate.DailyRainIn,
WeeklyRainIn: wuUpdate.WeeklyRainIn,
MonthlyRainIn: wuUpdate.MonthlyRainIn,
YearlyRainIn: wuUpdate.YearlyRainIn,
TempInsideF: wuUpdate.IndoorTempF,
HumidityInside: wuUpdate.IndoorHumidity,
BaromRelativeIn: wuUpdate.BaromIn,
}
}
func UnmarshalQueryParams(query url.Values) (*WundergroundUpdate, error) {
update := new(WundergroundUpdate)
if err := schema.NewDecoder().Decode(update, query); err != nil {
return nil, err
}
return update, nil
}

View File

@@ -0,0 +1,29 @@
package wunderground
type WundergroundUpdate struct {
ID string `json:"ID,omitempty" schema:"ID"`
Password string `json:"PASSWORD,omitempty" schema:"PASSWORD"`
UV int `json:"UV,omitempty" schema:"UV"`
Action string `json:"action,omitempty" schema:"action"`
BaromIn float32 `json:"baromin,omitempty" schema:"baromin"`
DailyRainIn float32 `json:"dailyrainin,omitempty" schema:"dailyrainin"`
DateUTC string `json:"dateutc,omitempty" schema:"dateutc"`
DewPtF float32 `json:"dewptf,omitempty" schema:"dewptf"`
Humidity int `json:"humidity,omitempty" schema:"humidity"`
IndoorHumidity int `json:"indoorhumidity,omitempty" schema:"indoorhumidity"`
IndoorTempF float32 `json:"indoortempf,omitempty" schema:"indoortempf"`
LowBatt bool `json:"lowbatt,omitempty" schema:"lowbatt"`
MonthlyRainIn float32 `json:"monthlyrainin,omitempty" schema:"monthlyrainin"`
RainIn float32 `json:"rainin,omitempty" schema:"rainin"`
Realtime bool `json:"realtime,omitempty" schema:"realtime"`
Rtfreq int `json:"rtfreq,omitempty" schema:"rtfreq"`
SoftwareType string `json:"softwaretype,omitempty" schema:"softwaretype"`
SolarRadiation float32 `json:"solarradiation,omitempty" schema:"solarradiation"`
Tempf float32 `json:"tempf,omitempty" schema:"tempf"`
WeeklyRainIn float32 `json:"weeklyrainin,omitempty" schema:"weeklyrainin"`
WindChillF float32 `json:"windchillf,omitempty" schema:"windchillf"`
WindDir int `json:"winddir,omitempty" schema:"winddir"`
WindGustMPH float32 `json:"windgustmph,omitempty" schema:"windgustmph"`
WindSpeedMPH float32 `json:"windspeedmph,omitempty" schema:"windspeedmph"`
YearlyRainIn float32 `json:"yearlyrainin,omitempty" schema:"yearlyrainin"`
}