diff --git a/pkg/air-resource-net/rest.go b/pkg/air-resource-net/rest.go new file mode 100644 index 0000000..323857a --- /dev/null +++ b/pkg/air-resource-net/rest.go @@ -0,0 +1,34 @@ +package airresourcenet + +import ( + "encoding/json" + "fmt" + "strings" + + "code.jhot.me/jhot/hats/internal/util" + "github.com/go-resty/resty/v2" +) + +type AirResourceNetClient struct { + restClient *resty.Client + SiteCode string +} + +func New(site string) *AirResourceNetClient { + return &AirResourceNetClient{ + restClient: resty.New(). + SetBaseURL(fmt.Sprintf("https://www.air-resource.net/%s", strings.ToUpper(site))), + SiteCode: site, + } +} + +func (c *AirResourceNetClient) GetAirQualityData() (AirQualityData, error) { + var data AirQualityData + // Can't use .SetResult because the content type is text/plain + resp, err := util.CheckSuccess(c.restClient.R().Get(fmt.Sprintf("%sdatajson.txt", c.SiteCode))) + if err != nil { + return data, err + } + err = json.Unmarshal(resp.Body(), &data) + return data, err +} diff --git a/pkg/air-resource-net/structs.go b/pkg/air-resource-net/structs.go new file mode 100644 index 0000000..b7ec4e1 --- /dev/null +++ b/pkg/air-resource-net/structs.go @@ -0,0 +1,196 @@ +package airresourcenet + +type AirQualityData struct { + Version string `json:"version"` + Created string `json:"created"` + Name string `json:"name"` + State string `json:"state"` + Datadate string `json:"datadate"` + CurrentOzone8 string `json:"currentOzone8"` + CurrentOzone8AQI string `json:"currentOzone8AQI"` + CurrentOzone8AQIcolor string `json:"currentOzone8AQIcolor"` + CurrentOzone8AQItext string `json:"currentOzone8AQItext"` + CurrentOzoneNowcast string `json:"currentOzoneNowcast"` + CurrentOzoneNowcastAQI string `json:"currentOzoneNowcastAQI"` + CurrentOzoneNowcastAQIcolor string `json:"currentOzoneNowcastAQIcolor"` + CurrentOzoneNowcastAQItext string `json:"currentOzoneNowcastAQItext"` + CurrentPM25 string `json:"currentPM25"` + CurrentPM25AQI string `json:"currentPM25AQI"` + CurrentPM25AQIcolor string `json:"currentPM25AQIcolor"` + CurrentPM25AQItext string `json:"currentPM25AQItext"` + CurrentPM2524 string `json:"currentPM2524"` + CurrentPM2524AQI string `json:"currentPM2524AQI"` + CurrentPM2524AQIcolor string `json:"currentPM2524AQIcolor"` + CurrentPM2524AQItext string `json:"currentPM2524AQItext"` + CurrentPM25Nowcast string `json:"currentPM25Nowcast"` + CurrentPM25NowcastAQI string `json:"currentPM25NowcastAQI"` + CurrentPM25NowcastAQIcolor string `json:"currentPM25NowcastAQIcolor"` + CurrentPM25NowcastAQItext string `json:"currentPM25NowcastAQItext"` + CurrentPM1024 string `json:"currentPM1024"` + CurrentPM1024AQI string `json:"currentPM1024AQI"` + CurrentPM1024AQIcolor string `json:"currentPM1024AQIcolor"` + CurrentPM1024AQItext string `json:"currentPM1024AQItext"` + CurrentPM10Nowcast string `json:"currentPM10Nowcast"` + CurrentPM10NowcastAQI string `json:"currentPM10NowcastAQI"` + CurrentPM10NowcastAQIcolor string `json:"currentPM10NowcastAQIcolor"` + CurrentPM10NowcastAQItext string `json:"currentPM10NowcastAQItext"` + CurrentVisibility string `json:"currentVisibility"` + CurrentVisibilityAQI string `json:"currentVisibilityAQI"` + CurrentVisibilityAQIcolor string `json:"currentVisibilityAQIcolor"` + CurrentVisibilityAQItext string `json:"currentVisibilityAQItext"` + Locations []struct { + Name string `json:"name"` + Datadate string `json:"datadate"` + Latitude string `json:"latitude"` + Longitude string `json:"longitude"` + Elevation string `json:"elevation"` + Agency string `json:"agency"` + CurrentO3AQImax string `json:"currentO3AQImax,omitempty"` + CurrentO3AQIcolormax string `json:"currentO3AQIcolormax,omitempty"` + CurrentO3AQItextmax string `json:"currentO3AQItextmax,omitempty"` + Ozone struct { + Display string `json:"display"` + Units string `json:"units"` + UnitsMetric string `json:"unitsMetric"` + UnitsMobile string `json:"unitsMobile"` + UnitsMetricMobile string `json:"unitsMetricMobile"` + MetricMultiplier string `json:"metricMultiplier"` + MetricOffset string `json:"metricOffset"` + Current string `json:"current"` + Current8 string `json:"current8"` + CurrentNowcast string `json:"currentNowcast"` + Current8AQI string `json:"current8AQI"` + Current8AQIcolor string `json:"current8AQIcolor"` + Current8AQItext string `json:"current8AQItext"` + CurrentNowcastAQI string `json:"currentNowcastAQI"` + CurrentNowcastAQIcolor string `json:"currentNowcastAQIcolor"` + CurrentNowcastAQItext string `json:"currentNowcastAQItext"` + Data []int `json:"data"` + Data8 []int `json:"data8"` + Data8AQI []int `json:"data8AQI"` + DataNowcast []int `json:"dataNowcast"` + DataNowcastAQI []int `json:"dataNowcastAQI"` + } `json:"ozone,omitempty"` + AirTemperature struct { + Display string `json:"display"` + Units string `json:"units"` + UnitsMetric string `json:"unitsMetric"` + UnitsMobile string `json:"unitsMobile"` + UnitsMetricMobile string `json:"unitsMetricMobile"` + MetricMultiplier string `json:"metricMultiplier"` + MetricOffset string `json:"metricOffset"` + Current string `json:"current"` + Data []int `json:"data"` + } `json:"airTemperature,omitempty"` + WindSpeed struct { + Display string `json:"display"` + Units string `json:"units"` + UnitsMetric string `json:"unitsMetric"` + UnitsMobile string `json:"unitsMobile"` + UnitsMetricMobile string `json:"unitsMetricMobile"` + MetricMultiplier string `json:"metricMultiplier"` + MetricOffset string `json:"metricOffset"` + Current string `json:"current"` + Data []int `json:"data"` + } `json:"windSpeed,omitempty"` + WindDirection struct { + Display string `json:"display"` + Units string `json:"units"` + UnitsMetric string `json:"unitsMetric"` + UnitsMobile string `json:"unitsMobile"` + UnitsMetricMobile string `json:"unitsMetricMobile"` + MetricMultiplier string `json:"metricMultiplier"` + MetricOffset string `json:"metricOffset"` + Current string `json:"current"` + Data []int `json:"data"` + } `json:"windDirection,omitempty"` + Dummyparameter struct { + } `json:"dummyparameter"` + CurrentPMAQImax string `json:"currentPMAQImax,omitempty"` + CurrentPMAQIcolormax string `json:"currentPMAQIcolormax,omitempty"` + CurrentPMAQItextmax string `json:"currentPMAQItextmax,omitempty"` + Pm25 struct { + Display string `json:"display"` + Units string `json:"units"` + UnitsMetric string `json:"unitsMetric"` + UnitsMobile string `json:"unitsMobile"` + UnitsMetricMobile string `json:"unitsMetricMobile"` + MetricMultiplier string `json:"metricMultiplier"` + MetricOffset string `json:"metricOffset"` + Current string `json:"current"` + Current24 string `json:"current24"` + CurrentNowcast string `json:"currentNowcast"` + CurrentAQI string `json:"currentAQI"` + CurrentAQIcolor string `json:"currentAQIcolor"` + CurrentAQItext string `json:"currentAQItext"` + Current24AQI string `json:"current24AQI"` + Current24AQIcolor string `json:"current24AQIcolor"` + Current24AQItext string `json:"current24AQItext"` + CurrentNowcastAQI string `json:"currentNowcastAQI"` + CurrentNowcastAQIcolor string `json:"currentNowcastAQIcolor"` + CurrentNowcastAQItext string `json:"currentNowcastAQItext"` + Data []float64 `json:"data"` + Data24 []float64 `json:"data24"` + DataNowcast []float64 `json:"dataNowcast"` + DataAQI []int `json:"dataAQI"` + Data24AQI []int `json:"data24AQI"` + DataNowcastAQI []int `json:"dataNowcastAQI"` + } `json:"pm25,omitempty"` + Pm10 struct { + Display string `json:"display"` + Units string `json:"units"` + UnitsMetric string `json:"unitsMetric"` + UnitsMobile string `json:"unitsMobile"` + UnitsMetricMobile string `json:"unitsMetricMobile"` + MetricMultiplier string `json:"metricMultiplier"` + MetricOffset string `json:"metricOffset"` + Current24 string `json:"current24"` + CurrentNowcast string `json:"currentNowcast"` + Current24AQI string `json:"current24AQI"` + Current24AQIcolor string `json:"current24AQIcolor"` + Current24AQItext string `json:"current24AQItext"` + CurrentNowcastAQI string `json:"currentNowcastAQI"` + CurrentNowcastAQIcolor string `json:"currentNowcastAQIcolor"` + CurrentNowcastAQItext string `json:"currentNowcastAQItext"` + Data []float64 `json:"data"` + Data24 []float64 `json:"data24"` + DataNowcast []float64 `json:"dataNowcast"` + DataAQI []int `json:"dataAQI"` + Data24AQI []int `json:"data24AQI"` + DataNowcastAQI []int `json:"dataNowcastAQI"` + } `json:"pm10,omitempty"` + RelativeHumidity struct { + Display string `json:"display"` + Units string `json:"units"` + UnitsMetric string `json:"unitsMetric"` + UnitsMobile string `json:"unitsMobile"` + UnitsMetricMobile string `json:"unitsMetricMobile"` + MetricMultiplier string `json:"metricMultiplier"` + MetricOffset string `json:"metricOffset"` + Current string `json:"current"` + Data []int `json:"data"` + } `json:"relativeHumidity,omitempty"` + Precipitation struct { + Display string `json:"display"` + Units string `json:"units"` + UnitsMetric string `json:"unitsMetric"` + UnitsMobile string `json:"unitsMobile"` + UnitsMetricMobile string `json:"unitsMetricMobile"` + MetricMultiplier string `json:"metricMultiplier"` + MetricOffset string `json:"metricOffset"` + Current string `json:"current"` + Data []float64 `json:"data"` + } `json:"precipitation,omitempty"` + Et struct { + Display string `json:"display"` + Units string `json:"units"` + UnitsMetric string `json:"unitsMetric"` + UnitsMobile string `json:"unitsMobile"` + UnitsMetricMobile string `json:"unitsMetricMobile"` + MetricMultiplier string `json:"metricMultiplier"` + MetricOffset string `json:"metricOffset"` + Current string `json:"current"` + Data []float64 `json:"data"` + } `json:"et,omitempty"` + } `json:"locations"` +}