Modify the API format a bit and fix bug with the packet parsing logic

This commit is contained in:
Kelvin Ly 2023-05-15 10:22:45 -04:00
parent 25d3788478
commit 0ca4da4b6c
3 changed files with 31 additions and 20 deletions

View File

@ -22,10 +22,10 @@ func CreateTable(db *sql.DB) error {
} }
type Datapoint struct { type Datapoint struct {
Time uint64 Time uint64 `json:"t"`
Temperature float32 Temperature float32 `json:"temp"`
Humidity float32 Humidity float32 `json:"hum"`
HumidifierVolts float32 HumidifierVolts float32 `json:"hv"`
} }
func QueryHistory(db *sql.DB, start int64) ([]Datapoint, error) { func QueryHistory(db *sql.DB, start int64) ([]Datapoint, error) {

View File

@ -42,9 +42,9 @@ func (s *ShroomStatus) Update() {
func parseMsg(line []byte, db *sql.DB, status *ShroomStatus) { func parseMsg(line []byte, db *sql.DB, status *ShroomStatus) {
data := ShroomData{ data := ShroomData{
Time: 0, Time: 0,
Temperature: -1, Temperature: -274,
Humidity: -1, Humidity: -100,
HumidifierVolts: -1, HumidifierVolts: -100,
Status: 0, Status: 0,
} }
err := json.Unmarshal(line, &data) err := json.Unmarshal(line, &data)
@ -54,7 +54,7 @@ func parseMsg(line []byte, db *sql.DB, status *ShroomStatus) {
log.Println(line) log.Println(line)
return return
} }
if data.Time > 0 && data.Temperature > 0 && data.Humidity > 0 && data.HumidifierVolts > 0 { if data.Time > 0 && data.Temperature > -274 && data.Humidity > -100 && data.HumidifierVolts > -100 {
err = InsertRow(db, &data) err = InsertRow(db, &data)
if err != nil { if err != nil {
log.Println("unable to write to database: ", err) log.Println("unable to write to database: ", err)
@ -68,7 +68,7 @@ func parseMsg(line []byte, db *sql.DB, status *ShroomStatus) {
status.Unlock() status.Unlock()
status.Update() status.Update()
} else { } else {
log.Println("unknown packet: ", line) log.Println("unknown packet: ", line, string(line))
} }
} }

View File

@ -16,6 +16,8 @@ import (
"io/fs" "io/fs"
"log" "log"
"net/http" "net/http"
"strconv"
"strings"
"time" "time"
) )
@ -27,10 +29,19 @@ type statusJson struct {
Humidifier bool `json:"humidifier"` Humidifier bool `json:"humidifier"`
} }
func dumpData(db *sql.DB, offset int64) func(http.ResponseWriter, *http.Request) { func dumpData(db *sql.DB, multiplier int64) func(http.ResponseWriter, *http.Request) {
return func(w http.ResponseWriter, _req *http.Request) { return func(w http.ResponseWriter, req *http.Request) {
now := time.Now().Unix() now := time.Now().Unix()
t := now + offset path := strings.Split(req.URL.Path, "/")
last := path[len(path)-1]
count, err := strconv.Atoi(last)
if err != nil {
w.WriteHeader(400)
w.Write([]byte("could not read integer in path: " + err.Error()))
return
}
offset := int64(count) * multiplier
t := now - offset
msg, err := s.GetRows(db, t) msg, err := s.GetRows(db, t)
if err != nil { if err != nil {
w.WriteHeader(500) w.WriteHeader(500)
@ -65,10 +76,10 @@ func main() {
log.Fatal("unable to use subdirectory of embedded fs: ", err) log.Fatal("unable to use subdirectory of embedded fs: ", err)
} }
dumpWeek := dumpData(db, -7*24*60*60) dumpWeek := dumpData(db, 7*24*60*60*1000)
dumpDay := dumpData(db, -24*60*60) dumpDay := dumpData(db, 24*60*60*1000)
dumpHour := dumpData(db, -60*60) dumpHour := dumpData(db, 60*60*1000)
dumpMinute := dumpData(db, -60) dumpMinute := dumpData(db, 60*1000)
lastPoint := func(w http.ResponseWriter, _req *http.Request) { lastPoint := func(w http.ResponseWriter, _req *http.Request) {
msg, err := s.LastTime(db) msg, err := s.LastTime(db)
@ -115,10 +126,10 @@ func main() {
http.Handle("/d/", http.StripPrefix("/d/", http.FileServer(http.Dir("./dev")))) http.Handle("/d/", http.StripPrefix("/d/", http.FileServer(http.Dir("./dev"))))
http.Handle("/", http.FileServer(http.FS(contentSub))) http.Handle("/", http.FileServer(http.FS(contentSub)))
http.HandleFunc("/api/last/week", dumpWeek) http.HandleFunc("/api/last/weeks/", dumpWeek)
http.HandleFunc("/api/last/day", dumpDay) http.HandleFunc("/api/last/days/", dumpDay)
http.HandleFunc("/api/last/hour", dumpHour) http.HandleFunc("/api/last/hours/", dumpHour)
http.HandleFunc("/api/last/minute", dumpMinute) http.HandleFunc("/api/last/minutes/", dumpMinute)
http.HandleFunc("/api/latest", lastPoint) http.HandleFunc("/api/latest", lastPoint)
http.HandleFunc("/api/status", getStatus) http.HandleFunc("/api/status", getStatus)
http.HandleFunc("/api/admin", adminHandler) http.HandleFunc("/api/admin", adminHandler)