85 lines
1.6 KiB
Go
85 lines
1.6 KiB
Go
package main
|
|
|
|
import (
|
|
"encoding/csv"
|
|
"encoding/json"
|
|
"fmt"
|
|
"net/http"
|
|
"os"
|
|
"strconv"
|
|
"time"
|
|
|
|
"git.ultraware.nl/Ultraware/util"
|
|
)
|
|
|
|
type day struct {
|
|
Date int `json:"valid_time_gmt"`
|
|
AvgTemperature int `json:"temp"`
|
|
}
|
|
|
|
type data struct {
|
|
Observations []day `json:"observations"`
|
|
}
|
|
|
|
func main() {
|
|
from := getNextDate()
|
|
if from.After(time.Now()) {
|
|
fmt.Println(`Nothing to get, exiting ...`)
|
|
os.Exit(0)
|
|
}
|
|
|
|
to := from.AddDate(0, 0, 21)
|
|
if to.After(time.Now()) {
|
|
to = time.Now()
|
|
}
|
|
|
|
url := `https://api.weather.com/v1/location/EHGG:9:NL/observations/historical.json?apiKey=6532d6454b8aa370768e63d6ba5a832e&units=e&startDate=` + from.Format(`20060102`) + `&endDate=` + to.Format(`20060102`)
|
|
|
|
resp, err := http.Get(url)
|
|
util.PanicOnErr(err)
|
|
// f, err := os.Open(`data.json`)
|
|
// util.PanicOnErr(err)
|
|
|
|
var d data
|
|
|
|
err = json.NewDecoder(resp.Body).Decode(&d)
|
|
util.PanicOnErr(err)
|
|
|
|
out, err := os.OpenFile(`weather.csv`, os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0600)
|
|
util.PanicOnErr(err)
|
|
|
|
csvout := csv.NewWriter(out)
|
|
for _, day := range d.Observations {
|
|
csvout.Write([]string{strconv.Itoa(day.Date), fToCString(day.AvgTemperature)})
|
|
}
|
|
csvout.Flush()
|
|
}
|
|
|
|
func getNextDate() time.Time {
|
|
f, err := os.Open(`weather.csv`)
|
|
if err != nil {
|
|
return time.Date(2019, 11, 1, 0, 0, 0, 0, time.Local)
|
|
}
|
|
|
|
csvf := csv.NewReader(f)
|
|
var last []string
|
|
for {
|
|
row, err := csvf.Read()
|
|
if err != nil {
|
|
break
|
|
}
|
|
last = row
|
|
}
|
|
|
|
u, err := strconv.ParseInt(last[0], 10, 64)
|
|
util.PanicOnErr(err)
|
|
|
|
t := time.Unix(u, 0)
|
|
|
|
return t.AddDate(0, 0, 1)
|
|
}
|
|
|
|
func fToCString(temp int) string {
|
|
return strconv.FormatFloat(float64(temp-32)/1.8, 'f', 1, 64)
|
|
}
|