From a840405f3671bff286ea68f1f6eb0e43975b1a44 Mon Sep 17 00:00:00 2001
From: Sam Anthony
Date: Tue, 26 Nov 2024 18:51:15 -0500
Subject: server: chart of humidity vs time
---
server/building.go | 6 +++---
server/chart.go | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++
server/dashboard.go | 8 +++++---
server/dashboard.html | 4 ++++
server/record.go | 18 ++++++++---------
server/server.go | 1 +
6 files changed, 77 insertions(+), 15 deletions(-)
create mode 100644 server/chart.go
(limited to 'server')
diff --git a/server/building.go b/server/building.go
index 8772374..e275c65 100644
--- a/server/building.go
+++ b/server/building.go
@@ -23,10 +23,10 @@ func (b Building) average() (Humidity, bool) {
var sum Humidity = 0
nRooms := 0
for room, record := range b {
- c := make(chan Humidity)
+ c := make(chan Entry[Humidity])
record.getRecent <- c
- if humidity, ok := <-c; ok {
- sum += humidity
+ if e, ok := <-c; ok {
+ sum += e.v
nRooms++
} else {
log.Printf("Warning: no humidity for room '%s'\n", room)
diff --git a/server/chart.go b/server/chart.go
new file mode 100644
index 0000000..1f20d3c
--- /dev/null
+++ b/server/chart.go
@@ -0,0 +1,55 @@
+package main
+
+import (
+ "log"
+ "net/http"
+ "fmt"
+ "time"
+ "github.com/wcharczuk/go-chart/v2"
+)
+
+type ChartHandler struct {
+ building Building
+}
+
+func (h ChartHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
+ log.Println(r.Method, r.URL)
+
+ if r.Method != http.MethodGet {
+ w.WriteHeader(http.StatusMethodNotAllowed)
+ fmt.Fprintf(w, "invalid method: '%s'", r.Method)
+ return
+ }
+
+ var series []chart.Series
+ for room, record := range h.building {
+ var x []time.Time
+ var y []float64
+ c := make(chan Entry[Humidity])
+ record.get <- c
+ for e := range c {
+ x = append(x, e.t)
+ y = append(y, float64(e.v))
+ }
+ series = append(series, chart.TimeSeries{
+ Name: string(room),
+ XValues: x,
+ YValues: y,
+ })
+ }
+
+ graph := chart.Chart{
+ Background: chart.Style{
+ Padding: chart.Box{Top: 20, Left: 20},
+ },
+ Series: series,
+ }
+ graph.Elements = []chart.Renderable{
+ chart.Legend(&graph),
+ }
+
+ w.Header().Set("Content-Type", "image/png")
+ if err := graph.Render(chart.PNG, w); err != nil {
+ log.Println(err)
+ }
+}
diff --git a/server/dashboard.go b/server/dashboard.go
index 48a9423..1dca024 100644
--- a/server/dashboard.go
+++ b/server/dashboard.go
@@ -65,10 +65,12 @@ func (h DashboardHandler) buildDashboard() Dashboard {
rooms := make(map[RoomID]Humidity)
for id, record := range h.building {
- c := make(chan Humidity)
+ c := make(chan Entry[Humidity])
record.getRecent <- c
- humidity, ok := <-c
- if !ok {
+ var humidity Humidity
+ if e, ok := <-c; ok {
+ humidity = e.v
+ } else {
humidity = -1
}
rooms[id] = humidity
diff --git a/server/dashboard.html b/server/dashboard.html
index 23e1d97..50ad682 100644
--- a/server/dashboard.html
+++ b/server/dashboard.html
@@ -21,6 +21,7 @@
unknown
{{- end -}}
+
| Room | Humidity |
{{ range $id, $humidity := .Rooms }}
@@ -37,5 +38,8 @@
{{ end }}
+
+ Humidity per Room vs. Time
+