From bf1512cf0a528c171e667596f1d54b3612afa75c Mon Sep 17 00:00:00 2001 From: Pierre-Olivier Mercier Date: Sun, 4 Dec 2022 10:54:23 +0100 Subject: [PATCH] New parameter to fetch and send the grid frequency --- frequency.go | 96 +++++++++++++++++++++++++++++++++++++++++++++++++ main.go | 27 +++++++++++++- measurements.go | 1 + 3 files changed, 123 insertions(+), 1 deletion(-) create mode 100644 frequency.go diff --git a/frequency.go b/frequency.go new file mode 100644 index 0000000..17be790 --- /dev/null +++ b/frequency.go @@ -0,0 +1,96 @@ +package main + +import ( + "encoding/json" + "fmt" + "log" + "net/http" + "strconv" + "strings" + "time" +) + +const SwissGridAPI = "https://www.swissgrid.ch/bin/services/apicache?path=/content/swissgrid/fr/home/operation/grid-data/current-data/jcr:content/parsys/livedatawidget_10292" + +type SwissGridItem struct { + Id string `json:"id"` + Label string `json:"label"` + Value string `json:"value"` + MergeColumns bool `json:"mergeColumns"` + IsLabelBold bool `json:"isLabelBold"` + IsValueBold bool `json:"isValueBold"` +} +type SwissGridMaker struct { + Id string `json:"id"` + X float64 `json:"x"` + Y float64 `json:"y"` + Text1 string `json:"text1"` + Text2 string `json:"text2"` + TextColor string `json:"textColor"` + BackgroundColor string `json:"backgroundColor"` + BorderColor string `json:"borderColor"` + Type string `json:"type"` + Direction string `json:"direction"` + Rotation *string `json:"rotation"` + Opacity float64 `json:"opacity"` + FontSizeDesktop string `json:"fontSizeDesktop"` + FontSizeTablet string `json:"fontSizeTablet"` + FontSizePhone string `json:"fontSizePhone"` +} + +type SwissGridData struct { + Data struct { + Table []SwissGridItem `json:"table"` + Marker []SwissGridItem `json:"marker"` + } `json:"data"` +} + +func FetchFrequency() (*SwissGridData, error) { + res, err := http.Get(SwissGridAPI) + if err != nil { + return nil, err + } + defer res.Body.Close() + + if res.StatusCode > 299 { + return nil, fmt.Errorf("Response failed with status code: %d", res.StatusCode) + } + + dec := json.NewDecoder(res.Body) + var data SwissGridData + err = dec.Decode(&data) + if err != nil { + return nil, err + } + + return &data, err +} + +func WriteFrequency(writer TICWriter, freq *SwissGridData) error { + for _, i := range freq.Data.Table { + if i.Id == "FreqAct" { + f, err := strconv.ParseFloat(strings.Fields(i.Value)[0], 64) + if err != nil { + return err + } + + point := Point{ + Data: []byte(fmt.Sprintf("%.0f", f*1000)), + } + + err = writer.AddPoints( + map[string]Point{ + "FREQ": point, + }, + time.Now(), + ) + if err != nil { + log.Println("Unable to write frequency point:", err) + } + + break + } + } + + return nil +} diff --git a/main.go b/main.go index 5178b1d..c68cfbc 100644 --- a/main.go +++ b/main.go @@ -175,6 +175,7 @@ type TICWriter interface { func main() { var legacyMode = flag.Bool("legacy-mode", false, "Assume teleinformation in legacy mode") + var pushFrequency = flag.Bool("push-frequency", false, "Also fetch data about the grid frequency") flag.Parse() if len(flag.Args()) < 1 { @@ -217,7 +218,31 @@ func main() { interrupt := make(chan os.Signal, 1) signal.Notify(interrupt, os.Interrupt, syscall.SIGTERM) - <-interrupt + if *pushFrequency { + ticker := time.NewTicker(25 * time.Second) + defer ticker.Stop() + + frequencyloop: + for { + select { + case <-ticker.C: + freq, err := FetchFrequency() + if err != nil { + log.Println("An error occurs during FetchFrequency: ", err.Error()) + continue frequencyloop + } + + err = WriteFrequency(writer, freq) + if err != nil { + log.Println("An error occurs during WriteFrequency: ", err.Error()) + } + case <-interrupt: + break frequencyloop + } + } + } else { + <-interrupt + } writer.Close() } diff --git a/measurements.go b/measurements.go index 0048fae..8571ae6 100644 --- a/measurements.go +++ b/measurements.go @@ -51,6 +51,7 @@ var ( } MeasurementUnits = map[string]string{ + "FREQ": "mHz", "EAST": "Wh", "EASF01": "Wh", "EASF02": "Wh",