Add envitron support
This commit is contained in:
parent
6643217fdb
commit
c6e735950f
12 changed files with 402 additions and 238 deletions
47
envitron/bind.go
Normal file
47
envitron/bind.go
Normal file
|
@ -0,0 +1,47 @@
|
|||
package envitron
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"io"
|
||||
|
||||
"github.com/labstack/echo"
|
||||
)
|
||||
|
||||
type jsonError struct {
|
||||
Message string `json:"error"`
|
||||
}
|
||||
|
||||
func (e jsonError) Error() string {
|
||||
return e.Message
|
||||
}
|
||||
|
||||
type bindError struct {
|
||||
Message string `json:"error"`
|
||||
Offset int64 `json:"offset"`
|
||||
Field string `json:"field,omitempty"`
|
||||
}
|
||||
|
||||
func (e bindError) Error() string {
|
||||
return e.Message
|
||||
}
|
||||
|
||||
type jsonBinder struct{}
|
||||
|
||||
func (b jsonBinder) Bind(i interface{}, c echo.Context) error {
|
||||
err := json.NewDecoder(c.Request().Body).Decode(i)
|
||||
if err == nil {
|
||||
return nil
|
||||
}
|
||||
|
||||
switch e := err.(type) {
|
||||
case *json.SyntaxError:
|
||||
return bindError{Message: `Syntax error`, Offset: e.Offset, Field: ``}
|
||||
case *json.UnmarshalTypeError:
|
||||
return bindError{Message: `Type error`, Offset: e.Offset, Field: e.Field}
|
||||
}
|
||||
|
||||
if err == io.ErrUnexpectedEOF || err == io.EOF {
|
||||
return jsonError{`Unexpected EOF`}
|
||||
}
|
||||
return jsonError{`Unknown error occurred while parsing JSON`}
|
||||
}
|
62
envitron/receive.go
Normal file
62
envitron/receive.go
Normal file
|
@ -0,0 +1,62 @@
|
|||
package envitron
|
||||
|
||||
import (
|
||||
"strconv"
|
||||
"time"
|
||||
|
||||
"git.fuyu.moe/5GPowerQuality/parser/data"
|
||||
"git.fuyu.moe/5GPowerQuality/parser/shared"
|
||||
"github.com/labstack/echo"
|
||||
)
|
||||
|
||||
func ReceiveData() {
|
||||
e := echo.New()
|
||||
e.Binder = jsonBinder{}
|
||||
|
||||
e.POST(`/`, handleReq)
|
||||
|
||||
e.Start(`:44444`)
|
||||
}
|
||||
|
||||
type input struct {
|
||||
Time shared.UnixTimestamp `json:"timestamp"`
|
||||
UID string `json:"uuid"`
|
||||
Modules []module `json:"modules"`
|
||||
}
|
||||
|
||||
type module struct {
|
||||
Port int `json:"port"`
|
||||
Voltage float64 `json:"volt"`
|
||||
Ampere float64 `json:"ampere"`
|
||||
}
|
||||
|
||||
func handleReq(c echo.Context) error {
|
||||
var i []input
|
||||
err := c.Bind(&i)
|
||||
if err != nil {
|
||||
return c.JSON(400, err)
|
||||
}
|
||||
|
||||
sets := data.Sets{}
|
||||
for _, v := range i {
|
||||
mID := data.GetMeterID(data.SourceEnvitron, v.UID)
|
||||
key := data.Key{Meter: mID, Time: time.Time(v.Time)}
|
||||
if _, ok := sets[key]; !ok {
|
||||
sets[key] = data.Set{}
|
||||
}
|
||||
|
||||
for _, m := range v.Modules {
|
||||
if m.Port == 4 {
|
||||
continue
|
||||
}
|
||||
p := strconv.Itoa(m.Port)
|
||||
|
||||
sets[key][`UGem`+p] = m.Voltage
|
||||
sets[key][`IGem`+p] = m.Ampere
|
||||
}
|
||||
}
|
||||
|
||||
data.InsertSets(sets)
|
||||
|
||||
return c.JSONBlob(200, []byte(`{"success": true}`))
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue