initial
This commit is contained in:
commit
f2aae6125d
150
main.go
Normal file
150
main.go
Normal file
@ -0,0 +1,150 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bufio"
|
||||||
|
"encoding/json"
|
||||||
|
"fmt"
|
||||||
|
"io"
|
||||||
|
"io/ioutil"
|
||||||
|
"log"
|
||||||
|
"net/http"
|
||||||
|
"net/url"
|
||||||
|
"os"
|
||||||
|
"strconv"
|
||||||
|
"strings"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
// AcuTime is a representation of time from the accurite
|
||||||
|
type AcuTime struct {
|
||||||
|
time.Time
|
||||||
|
}
|
||||||
|
|
||||||
|
var cTime = "2006-01-02 15:04:05"
|
||||||
|
|
||||||
|
func (ct *AcuTime) UnmarshalJSON(b []byte) (err error) {
|
||||||
|
s := strings.Trim(string(b), "\"")
|
||||||
|
if s == "null" {
|
||||||
|
ct.Time = time.Time{}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
ct.Time, err = time.Parse(cTime, s)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func (ct *AcuTime) MarshalJSON() ([]byte, error) {
|
||||||
|
if ct.Time.UnixNano() == nilTime {
|
||||||
|
return []byte("null"), nil
|
||||||
|
}
|
||||||
|
return []byte(fmt.Sprintf("\"%s\"", ct.Time.Format(cTime))), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
var nilTime = (time.Time{}).UnixNano()
|
||||||
|
|
||||||
|
func (ct *AcuTime) IsSet() bool {
|
||||||
|
return ct.UnixNano() != nilTime
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
// UnmarshalJSON specifies our custom format for timestamps
|
||||||
|
func (t AcuTime) UnmarshalJSON(a []byte) error {
|
||||||
|
// Mon Jan 2 15:04:05 MST 2006
|
||||||
|
// 2018/02/15 11:25:27
|
||||||
|
var err error
|
||||||
|
s := strings.Replace(string(a), `"`, "", -1)
|
||||||
|
t.Time, err = time.Parse(cTime, s)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Entry is a single json blob that is output by rtl_433
|
||||||
|
type Entry struct {
|
||||||
|
Time AcuTime `json:"time"`
|
||||||
|
Model string `json:"model"`
|
||||||
|
SensorID int `json:"sensor_id"`
|
||||||
|
Channel string `json:"channel"`
|
||||||
|
Sequence int `json:"sequence_num"`
|
||||||
|
Battery string `json:"battery"`
|
||||||
|
MessageTypeOne int
|
||||||
|
MessageTypeTwo int
|
||||||
|
MessageType int `json:"message_type"`
|
||||||
|
WindSpeed float64 `json:"wind_speed_mph"`
|
||||||
|
WindDirDeg float64 `json:"wind_dir_deg"`
|
||||||
|
WindDir string `json:"wind_dir"`
|
||||||
|
Rain float64 `json:"rainfall_accumulation_inch"`
|
||||||
|
TempF float64 `json:"temperature_F"`
|
||||||
|
Humidity int64 `json:"humidity"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func sendData(e Entry) error {
|
||||||
|
ws := strconv.FormatFloat(e.WindSpeed, 'f', -1, 64)
|
||||||
|
wdd := strconv.FormatFloat(e.WindDirDeg, 'f', -1, 64)
|
||||||
|
rain := strconv.FormatFloat(e.Rain, 'f', -1, 64)
|
||||||
|
tempf := strconv.FormatFloat(e.TempF, 'f', -1, 64)
|
||||||
|
humidity := strconv.FormatInt(e.Humidity, 10)
|
||||||
|
tm := e.Time.Format("2006-01-02T15:04:05.999Z")
|
||||||
|
fd := url.Values{
|
||||||
|
"sensor": []string{"AcuRite"},
|
||||||
|
"timestamp": []string{tm},
|
||||||
|
"humidity": []string{humidity},
|
||||||
|
"temp": []string{tempf},
|
||||||
|
"rain": []string{rain},
|
||||||
|
"wind_direction": []string{e.WindDir},
|
||||||
|
"wind_dir_deg": []string{wdd},
|
||||||
|
"wind_speed": []string{ws},
|
||||||
|
"battery": []string{e.Battery},
|
||||||
|
}
|
||||||
|
|
||||||
|
resp, err := http.PostForm("https://data.bolddaemon.com/data/store", fd)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
defer resp.Body.Close()
|
||||||
|
body, berr := ioutil.ReadAll(resp.Body)
|
||||||
|
if berr != nil {
|
||||||
|
return berr
|
||||||
|
}
|
||||||
|
|
||||||
|
log.Println(string(body))
|
||||||
|
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
scanner := bufio.NewScanner(os.Stdin)
|
||||||
|
var m Entry
|
||||||
|
m.MessageTypeOne = 0
|
||||||
|
m.MessageTypeTwo = 0
|
||||||
|
for scanner.Scan() {
|
||||||
|
dec := json.NewDecoder(strings.NewReader(scanner.Text()))
|
||||||
|
if err := dec.Decode(&m); err == io.EOF {
|
||||||
|
break
|
||||||
|
} else if err != nil {
|
||||||
|
log.Println(err)
|
||||||
|
break
|
||||||
|
//log.Fatal(err)
|
||||||
|
}
|
||||||
|
if m.Sequence == 2 {
|
||||||
|
if m.MessageTypeOne == 0 {
|
||||||
|
m.MessageTypeOne = m.MessageType
|
||||||
|
} else {
|
||||||
|
if m.MessageTypeOne != 0 && m.MessageTypeTwo == 0 {
|
||||||
|
m.MessageTypeOne = m.MessageType
|
||||||
|
m.MessageTypeTwo = m.MessageType
|
||||||
|
|
||||||
|
err := sendData(m)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
m.MessageTypeOne = 0
|
||||||
|
m.MessageTypeTwo = 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if err := scanner.Err(); err != nil {
|
||||||
|
fmt.Fprintln(os.Stderr, "ohgod", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user