New parameter to fetch and send the grid frequency

This commit is contained in:
nemunaire 2022-12-04 10:54:23 +01:00
parent 91f23b4a59
commit bf1512cf0a
3 changed files with 123 additions and 1 deletions

96
frequency.go Normal file
View File

@ -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
}

27
main.go
View File

@ -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()
}

View File

@ -51,6 +51,7 @@ var (
}
MeasurementUnits = map[string]string{
"FREQ": "mHz",
"EAST": "Wh",
"EASF01": "Wh",
"EASF02": "Wh",