/
main.go
103 lines (88 loc) · 2.04 KB
/
main.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
package main
import (
"io"
"log"
"net/http"
"os"
"os/signal"
"strconv"
"syscall"
"github.com/avast/retry-go"
"github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/client_golang/prometheus/promhttp"
"github.com/bemasher/rtlamr/protocol"
"github.com/bemasher/rtltcp"
"github.com/bemasher/rtlamr/idm"
"github.com/bemasher/rtlamr/netidm"
"github.com/bemasher/rtlamr/r900"
"github.com/bemasher/rtlamr/r900bcd"
"github.com/bemasher/rtlamr/scm"
"github.com/bemasher/rtlamr/scmplus"
)
var (
consumption = prometheus.NewGaugeVec(prometheus.GaugeOpts{
Name: "rtlamr_consumption",
}, []string{
"id",
"type",
})
)
func main() {
prometheus.MustRegister(consumption)
http.Handle("/metrics", promhttp.Handler())
go http.ListenAndServe(":9090", nil)
d := protocol.NewDecoder()
rcvr := new(rtltcp.SDR)
err := retry.Do(func() error {
return rcvr.Connect(nil)
})
if err != nil {
panic(err)
}
d.Allocate()
go func() {
for {
block := make([]byte, d.Cfg.BlockSize2)
_, err := io.ReadFull(rcvr, block)
if err != nil {
if err == io.EOF {
// attempt reconnection
err = rcvr.Connect(nil)
if err != nil {
panic(err)
}
}
log.Printf("error reading data block: %v", err)
continue
}
for msg := range d.Decode(block) {
val := float64(0)
switch r := msg.(type) {
case scm.SCM:
val = float64(r.Consumption)
case scmplus.SCM:
val = float64(r.Consumption)
case r900.R900:
val = float64(r.Consumption)
case r900bcd.R900BCD:
val = float64(r.Consumption)
case netidm.NetIDM:
val = float64(r.LastConsumption)
case idm.IDM:
val = float64(r.LastConsumptionCount)
default:
log.Printf("Unknown message type: %#v", r)
continue
}
consumption.WithLabelValues(
strconv.Itoa(int(msg.MeterID())),
strconv.Itoa(int(msg.MeterType())),
).Set(val)
}
}
}()
sigCh := make(chan os.Signal, 1)
signal.Notify(sigCh, syscall.SIGINT, syscall.SIGTERM)
sig := <-sigCh
log.Println("Received Signal:", sig)
}