smartbridge/cmd/smartbridge/main.go
Felix Niederwanger 6b17a4fd00
Push import/export values
Fix the data entry for import/export to use the actual value.
2023-06-06 21:36:42 +02:00

100 lines
2.8 KiB
Go

package main
import (
"fmt"
"os"
"os/signal"
"syscall"
"time"
)
var mqtt_c Mqtt
var influx InfluxDB
func registerTerminationSignal() {
sigs := make(chan os.Signal, 1)
signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM, syscall.SIGABRT)
go func() {
sig := <-sigs
fmt.Println(sig)
os.Exit(1)
}()
}
func loadConfig(filename string) {
if !fileExists(filename) {
return
}
if err := cf.LoadYAML(filename); err != nil {
fmt.Fprintf(os.Stderr, "error loading configuration '%s': %s\n", filename, err)
os.Exit(1)
}
}
func main() {
var err error
cf.SetDefaults()
// Try to load default locations
loadConfig("/etc/smartbridge.yml")
loadConfig("./smartbridge.yml")
// Program arguments are configuration files
for i := 1; i < len(os.Args); i++ {
arg := os.Args[i]
if err := cf.LoadYAML(arg); err != nil {
fmt.Fprintf(os.Stderr, "error loading configuration '%s': %s\n", arg, err)
os.Exit(1)
}
}
mqtt_c, err = ConnectMqtt(cf.Mqtt)
if err != nil {
fmt.Fprintf(os.Stderr, "mqtt error: %s\n", err)
os.Exit(101)
}
if cf.Influx.URL != "" {
influx, err = ConnectInfluxDB(cf.Influx.URL, cf.Influx.Token)
if err != nil {
fmt.Fprintf(os.Stderr, "influxdb error: %s\n", err)
os.Exit(1)
}
}
registerTerminationSignal()
fmt.Println("smartbridge SBWF3102 reader")
for true {
reading, err := ReadSmartbridge(cf.Remote)
if err != nil {
fmt.Fprintf(os.Stderr, "%s\n", err)
}
if reading.Status != "ok" {
fmt.Fprintf(os.Stderr, "status: %s\n", reading.Status)
} else {
data := fmt.Sprintf("{\"current\":%d,\"unit\":\"W\",\"min\":%d,\"max\":%d,\"import\":%d,\"export\":%d,\"importexportunit\":\"Wh\",\"timestamp\":%d}", reading.Electricity.Power.Current.Value, reading.Electricity.Power.Minimun.Value, reading.Electricity.Power.Maximum.Value, reading.Electricity.Import.Current.Value, reading.Electricity.Export.Current.Value, time.Now().Unix())
if cf.Verbose {
fmt.Print(cf.Mqtt.topic)
fmt.Print(" ")
fmt.Println(data)
}
mqtt_c.Publish(cf.Mqtt.topic, data)
if cf.Influx.URL != "" {
// Write current values
tags := map[string]string{"unit": "W"}
fields := map[string]interface{}{"value": reading.Electricity.Power.Current.Value}
if err := influx.Write(cf.Influx.Organization, cf.Influx.Bucket, cf.Influx.Measurement, tags, fields); err != nil {
fmt.Fprintf(os.Stderr, "influxdb error: %s\n", err)
}
// Import and Export values
tags = map[string]string{"unit": "Wh"}
fields = map[string]interface{}{"import": reading.Electricity.Import.Current.Value, "export": reading.Electricity.Export.Current.Value}
if err := influx.Write(cf.Influx.Organization, cf.Influx.Bucket, cf.Influx.Measurement, tags, fields); err != nil {
fmt.Fprintf(os.Stderr, "influxdb error: %s\n", err)
}
}
}
time.Sleep(time.Second * time.Duration(cf.Delay))
}
}