From dbc71139a5708b371ffb0b7580f562674707c558 Mon Sep 17 00:00:00 2001 From: Sam Anthony Date: Thu, 21 Nov 2024 16:47:08 -0500 Subject: server dashboard --- server/dashboard.go | 78 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 78 insertions(+) create mode 100644 server/dashboard.go (limited to 'server/dashboard.go') diff --git a/server/dashboard.go b/server/dashboard.go new file mode 100644 index 0000000..0e9cd41 --- /dev/null +++ b/server/dashboard.go @@ -0,0 +1,78 @@ +package main + +import ( + "fmt" + "html/template" + "log" + "net/http" +) + +const dashboardHtml = ` + + + + HVAC Dashboard + + +

Average humidity: {{ printf "%.1f %%" .Average }}

+ + + {{ range .Rooms }} + + {{ end }} +
RoomHumidity
{{ .RoomID }}{{ printf "%.1f %%" .Humidity }}
+ +` + +var dashboard = template.Must(template.New("dashboard").Parse(dashboardHtml)) + +type Dashboard struct { + Average Humidity + Rooms []Room +} + +type Room struct { + RoomID + Humidity +} + +type DashboardHandler struct { + Building +} + +func (h DashboardHandler) 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 + } + + db := newDashboard(h.Building) + err := dashboard.Execute(w, db) + if err != nil { + log.Println(err) + } +} + +func newDashboard(b Building) Dashboard { + average, ok := b.average() + if !ok { + average = -1 + } + + // TODO: sort by room ID. + rooms := make([]Room, 0, len(b)) + for id, record := range b { + c := make(chan Humidity) + record.getRecent <- c + humidity, ok := <-c + if !ok { + humidity = -1 + } + rooms = append(rooms, Room{id, humidity}) + } + + return Dashboard{average, rooms} +} -- cgit v1.2.3