summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSam Anthony <sam@samanthony.xyz>2024-11-26 12:12:43 -0500
committerSam Anthony <sam@samanthony.xyz>2024-11-26 12:12:43 -0500
commit25ca0eaea3f8c83d2a209a4790b27b712bcba09c (patch)
tree729b80155e5c953518709add004bde7660ebfadf
parentea85258e026265656bdad9fb45d263d9f5e3e05d (diff)
downloadsoen422-25ca0eaea3f8c83d2a209a4790b27b712bcba09c.zip
server: display target humidity
-rw-r--r--server/dashboard.go11
-rw-r--r--server/dashboard.html3
-rw-r--r--server/server.go13
-rw-r--r--server/target.go19
4 files changed, 29 insertions, 17 deletions
diff --git a/server/dashboard.go b/server/dashboard.go
index 9a9c0b5..48a9423 100644
--- a/server/dashboard.go
+++ b/server/dashboard.go
@@ -15,12 +15,14 @@ var dashboardHtml string
var dashboard = template.Must(template.New("dashboard").Parse(dashboardHtml))
type Dashboard struct {
+ Target Humidity
Average Humidity
DutyCycle DutyCycle
Rooms map[RoomID]Humidity
}
type DashboardHandler struct {
+ target share.Val[Humidity]
building Building
dutyCycle share.Val[DutyCycle]
}
@@ -42,6 +44,13 @@ func (h DashboardHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
}
func (h DashboardHandler) buildDashboard() Dashboard {
+ var target Humidity
+ if targetp, ok := h.target.TryGet(); ok {
+ target = *targetp
+ } else {
+ target = 0
+ }
+
average, ok := h.building.average()
if !ok {
average = -1
@@ -65,5 +74,5 @@ func (h DashboardHandler) buildDashboard() Dashboard {
rooms[id] = humidity
}
- return Dashboard{average, duty, rooms}
+ return Dashboard{target, average, duty, rooms}
}
diff --git a/server/dashboard.html b/server/dashboard.html
index 29f1f8b..23e1d97 100644
--- a/server/dashboard.html
+++ b/server/dashboard.html
@@ -4,7 +4,8 @@
<title>HVAC Dashboard</title>
</head>
<body>
- <p>Average humidity:
+ <p>Target humidity: {{ printf "%.1f%%" .Target }}</p>
+ <p>Average measured humidity:
{{/* A value less than 0 means no data. */}}
{{- if ge .Average 0.0 -}}
{{ printf "%.1f%%" .Average }}
diff --git a/server/server.go b/server/server.go
index b104bbb..fc19d94 100644
--- a/server/server.go
+++ b/server/server.go
@@ -7,7 +7,11 @@ import (
"net/http"
)
-const addr = ":9090"
+const (
+ addr = ":9090"
+
+ targetHumidityDefault = 35.0
+)
var roomIDs = []RoomID{
"SNbeEcs7XVWMEvjeEYgwZnp9XYjToVhh",
@@ -17,14 +21,17 @@ var roomIDs = []RoomID{
type RoomID string
func main() {
+ target := share.NewVal[Humidity]()
+ target.Set <- targetHumidityDefault
building := newBuilding(roomIDs)
dutyCycle := share.NewVal[DutyCycle]()
+ defer target.Close()
defer building.Close()
defer dutyCycle.Close()
- http.Handle("/", DashboardHandler{building, dutyCycle})
+ http.Handle("/", DashboardHandler{target, building, dutyCycle})
http.Handle("/humidity", HumidityHandler{building})
- http.Handle("/target_humidity", new(TargetHumidityHandler))
+ http.Handle("/target_humidity", TargetHumidityHandler{target})
http.Handle("/duty_cycle", DutyCycleHandler{dutyCycle})
fmt.Printf("Listening on %s...\n", addr)
diff --git a/server/target.go b/server/target.go
index 4c58f1d..2d7ca80 100644
--- a/server/target.go
+++ b/server/target.go
@@ -2,18 +2,17 @@ package main
import (
"fmt"
+ "github.com/sam-rba/share"
"log"
"net/http"
"strconv"
- "sync"
)
type TargetHumidityHandler struct {
- mu sync.Mutex
- target Humidity
+ target share.Val[Humidity]
}
-func (h *TargetHumidityHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
+func (h TargetHumidityHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
log.Println(r.Method, r.URL)
switch r.Method {
case http.MethodGet:
@@ -26,20 +25,16 @@ func (h *TargetHumidityHandler) ServeHTTP(w http.ResponseWriter, r *http.Request
}
}
-func (h *TargetHumidityHandler) get(w http.ResponseWriter, r *http.Request) {
- h.mu.Lock()
- defer h.mu.Unlock()
- fmt.Fprintf(w, "%.2f", h.target)
+func (h TargetHumidityHandler) get(w http.ResponseWriter, r *http.Request) {
+ fmt.Fprintf(w, "%.2f", h.target.Get())
}
-func (h *TargetHumidityHandler) post(w http.ResponseWriter, r *http.Request) {
+func (h TargetHumidityHandler) post(w http.ResponseWriter, r *http.Request) {
target, err := strconv.ParseFloat(r.URL.RawQuery, 32)
if err != nil {
badRequest(w, "invalid humidity: '%s'", r.URL.RawQuery)
return
}
- h.mu.Lock()
- defer h.mu.Unlock()
- h.target = Humidity(target)
+ h.target.Set <- Humidity(target)
}