Include influxdb
This commit is contained in:
parent
7dc2d509c8
commit
383cc1b94e
1
go.mod
1
go.mod
@ -3,6 +3,7 @@ module github.com/nemunaire/linky2influx
|
|||||||
go 1.15
|
go 1.15
|
||||||
|
|
||||||
require (
|
require (
|
||||||
|
github.com/influxdata/influxdb-client-go/v2 v2.2.2
|
||||||
github.com/tarm/serial v0.0.0-20180830185346-98f6abe2eb07
|
github.com/tarm/serial v0.0.0-20180830185346-98f6abe2eb07
|
||||||
golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c // indirect
|
golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c // indirect
|
||||||
)
|
)
|
||||||
|
60
go.sum
60
go.sum
@ -1,4 +1,64 @@
|
|||||||
|
github.com/cyberdelia/templates v0.0.0-20141128023046-ca7fffd4298c/go.mod h1:GyV+0YP4qX0UQ7r2MoYZ+AvYDp12OF5yg4q8rGnyNh4=
|
||||||
|
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||||
|
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||||
|
github.com/deepmap/oapi-codegen v1.3.13 h1:9HKGCsdJqE4dnrQ8VerFS0/1ZOJPmAhN+g8xgp8y3K4=
|
||||||
|
github.com/deepmap/oapi-codegen v1.3.13/go.mod h1:WAmG5dWY8/PYHt4vKxlt90NsbHMAOCiteYKZMiIRfOo=
|
||||||
|
github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
|
||||||
|
github.com/getkin/kin-openapi v0.13.0/go.mod h1:WGRs2ZMM1Q8LR1QBEwUxC6RJEfaBcD0s+pcEVXFuAjw=
|
||||||
|
github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
|
||||||
|
github.com/go-chi/chi v4.0.2+incompatible/go.mod h1:eB3wogJHnLi3x/kFX2A+IbTBlXxmMeXJVKy9tTv1XzQ=
|
||||||
|
github.com/golangci/lint-1 v0.0.0-20181222135242-d2cdd8c08219/go.mod h1:/X8TswGSh1pIozq4ZwCfxS0WA5JGXguxk94ar/4c87Y=
|
||||||
|
github.com/influxdata/influxdb-client-go v1.4.0 h1:+KavOkwhLClHFfYcJMHHnTL5CZQhXJzOm5IKHI9BqJk=
|
||||||
|
github.com/influxdata/influxdb-client-go/v2 v2.2.2 h1:O0CGIuIwQafvAxttAJ/VqMKfbWWn2Mt8rbOmaM2Zj4w=
|
||||||
|
github.com/influxdata/influxdb-client-go/v2 v2.2.2/go.mod h1:fa/d1lAdUHxuc1jedx30ZfNG573oQTQmUni3N6pcW+0=
|
||||||
|
github.com/influxdata/line-protocol v0.0.0-20200327222509-2487e7298839 h1:W9WBk7wlPfJLvMCdtV4zPulc4uCPrlywQOmbFOhgQNU=
|
||||||
|
github.com/influxdata/line-protocol v0.0.0-20200327222509-2487e7298839/go.mod h1:xaLFMmpvUxqXtVkUJfg9QmT88cDaCJ3ZKgdZ78oO8Qo=
|
||||||
|
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
|
||||||
|
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
|
||||||
|
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
|
||||||
|
github.com/labstack/echo/v4 v4.1.11/go.mod h1:i541M3Fj6f76NZtHSj7TXnyM8n2gaodfvfxNnFqi74g=
|
||||||
|
github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k=
|
||||||
|
github.com/matryer/moq v0.0.0-20190312154309-6cfb0558e1bd/go.mod h1:9ELz6aaclSIGnZBoaSLZ3NAl1VTufbOrXBPvtcy6WiQ=
|
||||||
|
github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=
|
||||||
|
github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=
|
||||||
|
github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
|
||||||
|
github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ=
|
||||||
|
github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84=
|
||||||
|
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
||||||
|
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
|
||||||
|
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
||||||
|
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||||
|
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||||
|
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
|
||||||
|
github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
|
||||||
github.com/tarm/serial v0.0.0-20180830185346-98f6abe2eb07 h1:UyzmZLoiDWMRywV4DUYb9Fbt8uiOSooupjTq10vpvnU=
|
github.com/tarm/serial v0.0.0-20180830185346-98f6abe2eb07 h1:UyzmZLoiDWMRywV4DUYb9Fbt8uiOSooupjTq10vpvnU=
|
||||||
github.com/tarm/serial v0.0.0-20180830185346-98f6abe2eb07/go.mod h1:kDXzergiv9cbyO7IOYJZWg1U88JhDg3PB6klq9Hg2pA=
|
github.com/tarm/serial v0.0.0-20180830185346-98f6abe2eb07/go.mod h1:kDXzergiv9cbyO7IOYJZWg1U88JhDg3PB6klq9Hg2pA=
|
||||||
|
github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc=
|
||||||
|
github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8=
|
||||||
|
github.com/valyala/fasttemplate v1.1.0/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8=
|
||||||
|
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
||||||
|
golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||||
|
golang.org/x/crypto v0.0.0-20191112222119-e1110fd1c708/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||||
|
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||||
|
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||||
|
golang.org/x/net v0.0.0-20191112182307-2180aed22343 h1:00ohfJ4K98s3m6BGUoBd8nyfp4Yl0GoIKvw5abItTjI=
|
||||||
|
golang.org/x/net v0.0.0-20191112182307-2180aed22343/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||||
|
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
|
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
|
golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
|
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20191115151921-52ab43148777/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c h1:VwygUrnw9jn88c4u8GD3rZQbqrP/tgas88tPUbBxQrk=
|
golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c h1:VwygUrnw9jn88c4u8GD3rZQbqrP/tgas88tPUbBxQrk=
|
||||||
golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||||
|
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
|
||||||
|
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||||
|
golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||||
|
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||||
|
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||||
|
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||||
|
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||||
|
gopkg.in/yaml.v2 v2.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU=
|
||||||
|
gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||||
|
168
main.go
168
main.go
@ -2,19 +2,25 @@ package main
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
|
"context"
|
||||||
"flag"
|
"flag"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
"log"
|
"log"
|
||||||
"os"
|
"os"
|
||||||
"os/signal"
|
"os/signal"
|
||||||
|
"strconv"
|
||||||
"syscall"
|
"syscall"
|
||||||
"time"
|
"time"
|
||||||
"unicode"
|
"unicode"
|
||||||
|
|
||||||
|
"github.com/influxdata/influxdb-client-go/v2"
|
||||||
|
"github.com/influxdata/influxdb-client-go/v2/api/write"
|
||||||
"github.com/tarm/serial"
|
"github.com/tarm/serial"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
var myZone = ""
|
||||||
|
|
||||||
func readSerial(s *serial.Port, c chan []byte) {
|
func readSerial(s *serial.Port, c chan []byte) {
|
||||||
var unread bytes.Buffer
|
var unread bytes.Buffer
|
||||||
buf := make([]byte, 128)
|
buf := make([]byte, 128)
|
||||||
@ -44,8 +50,109 @@ func readSerial(s *serial.Port, c chan []byte) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func treatFrames(frames chan []byte) {
|
func defaultTags() map[string]string {
|
||||||
|
ret := map[string]string{}
|
||||||
|
|
||||||
|
if myZone != "" {
|
||||||
|
ret["zone"] = myZone
|
||||||
|
}
|
||||||
|
|
||||||
|
if host, err := os.Hostname(); err == nil {
|
||||||
|
ret["host"] = host
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret
|
||||||
|
}
|
||||||
|
|
||||||
|
func fillUnit(tags *map[string]string, key string) {
|
||||||
|
if v, ok := MeasurementUnits[key]; ok {
|
||||||
|
(*tags)["unit"] = v
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func getValue(key string, data []byte) interface{} {
|
||||||
|
if _, ok := MeasurementUnits[key]; ok {
|
||||||
|
ret, _ := strconv.Atoi(string(data))
|
||||||
|
return ret
|
||||||
|
} else {
|
||||||
|
return string(data)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func genMeasurements(m map[string][]byte, horodate time.Time) (points []*write.Point) {
|
||||||
|
measurmentdone := []string{}
|
||||||
|
|
||||||
|
// Treat MeasurementGroups
|
||||||
|
for kgrp, grp := range MeasurementGroups {
|
||||||
|
fields := map[string]interface{}{}
|
||||||
|
|
||||||
|
for _, k := range grp {
|
||||||
|
measurmentdone = append(measurmentdone, k)
|
||||||
|
|
||||||
|
if v, ok := m[k]; ok {
|
||||||
|
fields[k] = getValue(k, v)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(fields) == 0 {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
tags := defaultTags()
|
||||||
|
fillUnit(&tags, grp[0])
|
||||||
|
|
||||||
|
points = append(points, influxdb2.NewPoint(kgrp,
|
||||||
|
tags,
|
||||||
|
fields,
|
||||||
|
horodate,
|
||||||
|
))
|
||||||
|
}
|
||||||
|
|
||||||
|
// Treat int
|
||||||
|
munits:
|
||||||
|
for k := range MeasurementUnits {
|
||||||
|
if _, ok := m[k]; !ok {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, mg := range measurmentdone {
|
||||||
|
if mg == k {
|
||||||
|
continue munits
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
tags := defaultTags()
|
||||||
|
fillUnit(&tags, k)
|
||||||
|
|
||||||
|
points = append(points, influxdb2.NewPoint(k,
|
||||||
|
tags,
|
||||||
|
map[string]interface{}{"value": getValue(k, m[k])},
|
||||||
|
horodate,
|
||||||
|
))
|
||||||
|
}
|
||||||
|
|
||||||
|
// Treat string
|
||||||
|
for _, k := range MeasurementStrings {
|
||||||
|
if _, ok := m[k]; !ok {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
tags := defaultTags()
|
||||||
|
fillUnit(&tags, k)
|
||||||
|
|
||||||
|
points = append(points, influxdb2.NewPoint(k,
|
||||||
|
tags,
|
||||||
|
map[string]interface{}{"value": getValue(k, m[k])},
|
||||||
|
horodate,
|
||||||
|
))
|
||||||
|
}
|
||||||
|
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func treatFrames(frames chan []byte, client influxdb2.Client) {
|
||||||
first := true
|
first := true
|
||||||
|
writeAPI := client.WriteAPIBlocking("", "teleinfo/autogen")
|
||||||
for {
|
for {
|
||||||
frame := <-frames
|
frame := <-frames
|
||||||
|
|
||||||
@ -55,6 +162,12 @@ func treatFrames(frames chan []byte) {
|
|||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
|
points := []*write.Point{}
|
||||||
|
|
||||||
|
var defaultHorodate time.Time
|
||||||
|
|
||||||
|
m := map[string][]byte{}
|
||||||
|
|
||||||
for _, line := range bytes.Split(frame, []byte("\r\n")) {
|
for _, line := range bytes.Split(frame, []byte("\r\n")) {
|
||||||
key, horodate, data, err := treatLine(line)
|
key, horodate, data, err := treatLine(line)
|
||||||
|
|
||||||
@ -63,7 +176,35 @@ func treatFrames(frames chan []byte) {
|
|||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
fmt.Println(key, horodate, data)
|
// Skip ADCO, this is the Linky address, confidential and unrelevant
|
||||||
|
if key == "ADCO" {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
if key == "DATE" {
|
||||||
|
defaultHorodate = *horodate
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
if horodate == nil {
|
||||||
|
m[key] = data
|
||||||
|
} else {
|
||||||
|
tags := defaultTags()
|
||||||
|
fillUnit(&tags, key)
|
||||||
|
|
||||||
|
points = append(points, influxdb2.NewPoint(key,
|
||||||
|
tags,
|
||||||
|
map[string]interface{}{"value": getValue(key, data)},
|
||||||
|
*horodate,
|
||||||
|
))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
points = append(points, genMeasurements(m, defaultHorodate)...)
|
||||||
|
|
||||||
|
err := writeAPI.WritePoint(context.Background(), points...)
|
||||||
|
if err != nil {
|
||||||
|
log.Println("Unable to write points:", err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -87,9 +228,9 @@ func getHorodate(fields *[][]byte) (*time.Time, error) {
|
|||||||
|
|
||||||
// Handle "saison"
|
// Handle "saison"
|
||||||
if (*fields)[1][0] == 'E' || (*fields)[1][0] == 'e' {
|
if (*fields)[1][0] == 'E' || (*fields)[1][0] == 'e' {
|
||||||
horodate = horodate.Add(2 * time.Hour)
|
horodate = horodate.Add(-2 * time.Hour)
|
||||||
} else {
|
} else {
|
||||||
horodate = horodate.Add(1 * time.Hour)
|
horodate = horodate.Add(-1 * time.Hour)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Mark field as treated
|
// Mark field as treated
|
||||||
@ -101,7 +242,7 @@ func getHorodate(fields *[][]byte) (*time.Time, error) {
|
|||||||
return nil, nil
|
return nil, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func treatLine(line []byte) (key string, horodate *time.Time, data [][]byte, err error) {
|
func treatLine(line []byte) (key string, horodate *time.Time, data []byte, err error) {
|
||||||
line = bytes.TrimSpace(line)
|
line = bytes.TrimSpace(line)
|
||||||
|
|
||||||
if len(line) <= 1 {
|
if len(line) <= 1 {
|
||||||
@ -122,17 +263,20 @@ func treatLine(line []byte) (key string, horodate *time.Time, data [][]byte, err
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
data = fields[1 : len(fields)-1]
|
data = bytes.Join(fields[1:len(fields)-1], []byte{' '})
|
||||||
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
var interval = flag.Duration("interval", 5*time.Second, "Minimum time between releve")
|
var influxScheme = flag.String("influx-scheme", "http", "Scheme to use to contact InfluxDB")
|
||||||
|
var influxHost = flag.String("influx-host", "localhost", "Host where lives InfluxDB")
|
||||||
|
var influxPort = flag.Uint("influx-port", 8086, "Port where InfluxDB is accessible")
|
||||||
|
var influxUser = flag.String("influx-username", "influx", "Username to use to perform authentication")
|
||||||
|
var influxPass = flag.String("influx-password", "", "Password to use to perform authentication")
|
||||||
|
flag.StringVar(&myZone, "tag-zone", myZone, "Tag zone to add to points")
|
||||||
flag.Parse()
|
flag.Parse()
|
||||||
|
|
||||||
log.Println(interval)
|
|
||||||
|
|
||||||
if len(flag.Args()) < 1 {
|
if len(flag.Args()) < 1 {
|
||||||
log.Println("missing required argument: serial device (eg. /dev/ttyUSB0)")
|
log.Println("missing required argument: serial device (eg. /dev/ttyUSB0)")
|
||||||
return
|
return
|
||||||
@ -151,11 +295,15 @@ func main() {
|
|||||||
log.Fatal(err)
|
log.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
client := influxdb2.NewClient(fmt.Sprintf("%s://%s:%d", *influxScheme, *influxHost, *influxPort), fmt.Sprintf("%s:%s", *influxUser, *influxPass))
|
||||||
|
|
||||||
frames := make(chan []byte)
|
frames := make(chan []byte)
|
||||||
go readSerial(s, frames)
|
go readSerial(s, frames)
|
||||||
go treatFrames(frames)
|
go treatFrames(frames, client)
|
||||||
|
|
||||||
interrupt := make(chan os.Signal, 1)
|
interrupt := make(chan os.Signal, 1)
|
||||||
signal.Notify(interrupt, os.Interrupt, syscall.SIGTERM)
|
signal.Notify(interrupt, os.Interrupt, syscall.SIGTERM)
|
||||||
<-interrupt
|
<-interrupt
|
||||||
|
|
||||||
|
client.Close()
|
||||||
}
|
}
|
||||||
|
99
measurements.go
Normal file
99
measurements.go
Normal file
@ -0,0 +1,99 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
var (
|
||||||
|
MeasurementGroups = map[string][]string{
|
||||||
|
"EAS": []string{"EAST", "EASF01", "EASF02", "EASF03", "EASF04", "EASF05", "EASF06", "EASF07", "EASF08", "EASF09", "EASF10", "EASD01", "EASD02", "EASD03", "EASD04"},
|
||||||
|
"ERQ": []string{"ERQ1", "ERQ2", "ERQ3", "ERQ4"},
|
||||||
|
"IRMS": []string{"IRMS1", "IRMS2", "IRMS3"},
|
||||||
|
"URMS": []string{"URMS1", "URMS2", "URMS3"},
|
||||||
|
"SINSTS": []string{"SINSTS", "SINSTS1", "SINSTS2", "SINSTS3"},
|
||||||
|
}
|
||||||
|
|
||||||
|
MeasurementStrings = []string{
|
||||||
|
"ADSC",
|
||||||
|
"VTIC",
|
||||||
|
"DATE",
|
||||||
|
"NGTF",
|
||||||
|
"LTARF",
|
||||||
|
"STGE",
|
||||||
|
"DPM1",
|
||||||
|
"FPM1",
|
||||||
|
"DPM2",
|
||||||
|
"FPM2",
|
||||||
|
"DPM3",
|
||||||
|
"FPM3",
|
||||||
|
"MSG1",
|
||||||
|
"MSG2",
|
||||||
|
"PRM",
|
||||||
|
"RELAIS",
|
||||||
|
"NTARF",
|
||||||
|
"NJOURF",
|
||||||
|
"NJOURF+1",
|
||||||
|
"PJOURF+1",
|
||||||
|
"PPOINTE",
|
||||||
|
}
|
||||||
|
|
||||||
|
MeasurementUnits = map[string]string{
|
||||||
|
"EAST": "Wh",
|
||||||
|
"EASF01": "Wh",
|
||||||
|
"EASF02": "Wh",
|
||||||
|
"EASF03": "Wh",
|
||||||
|
"EASF04": "Wh",
|
||||||
|
"EASF05": "Wh",
|
||||||
|
"EASF06": "Wh",
|
||||||
|
"EASF07": "Wh",
|
||||||
|
"EASF08": "Wh",
|
||||||
|
"EASF09": "Wh",
|
||||||
|
"EASF10": "Wh",
|
||||||
|
"EASD01": "Wh",
|
||||||
|
"EASD02": "Wh",
|
||||||
|
"EASD03": "Wh",
|
||||||
|
"EASD04": "Wh",
|
||||||
|
|
||||||
|
"EAIT": "Wh",
|
||||||
|
|
||||||
|
"ERQ1": "VArh",
|
||||||
|
"ERQ2": "VArh",
|
||||||
|
"ERQ3": "VArh",
|
||||||
|
"ERQ4": "VArh",
|
||||||
|
|
||||||
|
"IRMS1": "A",
|
||||||
|
"IRMS2": "A",
|
||||||
|
"IRMS3": "A",
|
||||||
|
|
||||||
|
"URMS1": "V",
|
||||||
|
"URMS2": "V",
|
||||||
|
"URMS3": "V",
|
||||||
|
|
||||||
|
"PREF": "kVA",
|
||||||
|
"PCOUP": "kVA",
|
||||||
|
|
||||||
|
"SINSTS": "VA",
|
||||||
|
"SINSTS1": "VA",
|
||||||
|
"SINSTS2": "VA",
|
||||||
|
"SINSTS3": "VA",
|
||||||
|
|
||||||
|
"SMAXSN": "VA",
|
||||||
|
"SMAXSN1": "VA",
|
||||||
|
"SMAXSN2": "VA",
|
||||||
|
"SMAXSN3": "VA",
|
||||||
|
"SMAXSN-1": "VA",
|
||||||
|
"SMAXSN1-1": "VA",
|
||||||
|
"SMAXSN2-1": "VA",
|
||||||
|
"SMAXSN3-1": "VA",
|
||||||
|
|
||||||
|
"SINSTI": "VA",
|
||||||
|
|
||||||
|
"SMAXIN": "VA",
|
||||||
|
"SMAXIN-1": "VA",
|
||||||
|
|
||||||
|
"CCASN": "W",
|
||||||
|
"CCASN-1": "W",
|
||||||
|
"CCAIN": "W",
|
||||||
|
"CCAIN-1": "W",
|
||||||
|
|
||||||
|
"UMOY1": "V",
|
||||||
|
"UMOY2": "V",
|
||||||
|
"UMOY3": "V",
|
||||||
|
}
|
||||||
|
)
|
Loading…
Reference in New Issue
Block a user