Ryan D McGuire
e8fbacfe6d
All checks were successful
Build and Publish / release (push) Successful in 2m53s
110 lines
2.6 KiB
Go
110 lines
2.6 KiB
Go
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"
|
|
awnURL = "http://ambientweather.net/data/report"
|
|
)
|
|
|
|
// Battery Sensors
|
|
const (
|
|
BattOutdoorSensor = "OutdoorSensor"
|
|
BattIndoorSensor = "IndoorSensor"
|
|
BattRainSensor = "RainSensor"
|
|
BattCO2Sensor = "CO2Sensor"
|
|
)
|
|
|
|
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: BattOutdoorSensor,
|
|
Status: awnUpdate.BattOut,
|
|
},
|
|
{
|
|
Component: BattIndoorSensor,
|
|
Status: awnUpdate.BattIn,
|
|
},
|
|
{
|
|
Component: BattRainSensor,
|
|
Status: awnUpdate.BattRain,
|
|
},
|
|
{
|
|
Component: BattCO2Sensor,
|
|
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
|
|
}
|