From f04ec9255c6b38052201d5c06f478408990db9f5 Mon Sep 17 00:00:00 2001 From: Colin Powell Date: Thu, 18 Dec 2025 23:07:42 -0500 Subject: [PATCH] Add tiny webserver for JSON data --- main.go | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/main.go b/main.go index da1dded..68b33c3 100644 --- a/main.go +++ b/main.go @@ -4,6 +4,7 @@ import ( "bufio" "bytes" "database/sql" + "encoding/json" "fmt" "image" "image/jpeg" @@ -75,6 +76,7 @@ func main() { webcamURL := getEnv("WEBCAM_URL", "http://furnace.service:8082/stream") minBrightness := getEnvInt("MIN_BRIGHTNESS", 150) checkInterval := getEnvDuration("CHECK_INTERVAL", 2*time.Second) + webPort := getEnv("FURNACE_WEB_PORT", "8090") fmt.Println("Using DB:", dbPath) fmt.Println("Using webcam:", webcamURL) @@ -83,6 +85,9 @@ func main() { db, err := sql.Open("sqlite", dbPath) + go startWebServer(db, getEnv("HTTP_PORT", webPort)) + fmt.Println("Starting json data server on port ", webPort) + if err != nil { log.Fatal(err) } @@ -254,3 +259,35 @@ func sendNtfyNotification(light Light, on bool) { } resp.Body.Close() } + +func startWebServer(db *sql.DB, port string) { + http.HandleFunc("/lights", func(w http.ResponseWriter, r *http.Request) { + rows, err := db.Query(` + SELECT name, state, MAX(timestamp) + FROM light_checks + GROUP BY name + `) + if err != nil { + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + defer rows.Close() + + resp := make(map[string]string) + for rows.Next() { + var key, state string + var ts string + if err := rows.Scan(&key, &state, &ts); err != nil { + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + resp[lights[key].Name] = state + } + + w.Header().Set("Content-Type", "application/json") + json.NewEncoder(w).Encode(resp) + }) + + log.Println("HTTP server listening on", port) + log.Fatal(http.ListenAndServe(":"+port, nil)) +}