more chart development

This commit is contained in:
2026-01-27 17:16:36 +11:00
parent 47df7bc431
commit 2953690d5c
5 changed files with 306 additions and 65 deletions

View File

@@ -28,6 +28,8 @@ type dashboardResponse struct {
Site string `json:"site"`
Model string `json:"model"`
OpenMeteoURL string `json:"open_meteo_url,omitempty"`
RangeStart time.Time `json:"range_start"`
RangeEnd time.Time `json:"range_end"`
Observations []db.ObservationPoint `json:"observations"`
Forecast db.ForecastSeries `json:"forecast"`
Latest *db.ObservationPoint `json:"latest"`
@@ -90,6 +92,8 @@ func (s *webServer) handleDashboard(w http.ResponseWriter, r *http.Request) {
if rangeStr == "" {
rangeStr = "24h"
}
startStr := r.URL.Query().Get("start")
endStr := r.URL.Query().Get("end")
bucket := r.URL.Query().Get("bucket")
if bucket == "" {
bucket = "5m"
@@ -99,13 +103,37 @@ func (s *webServer) handleDashboard(w http.ResponseWriter, r *http.Request) {
return
}
rangeDur, err := time.ParseDuration(rangeStr)
if err != nil || rangeDur <= 0 {
http.Error(w, "invalid range", http.StatusBadRequest)
return
var (
start time.Time
end time.Time
err error
)
if startStr != "" || endStr != "" {
if startStr == "" || endStr == "" {
http.Error(w, "start and end required", http.StatusBadRequest)
return
}
start, err = parseTimeParam(startStr)
if err != nil {
http.Error(w, "invalid start", http.StatusBadRequest)
return
}
end, err = parseTimeParam(endStr)
if err != nil {
http.Error(w, "invalid end", http.StatusBadRequest)
return
}
} else {
rangeDur, err := time.ParseDuration(rangeStr)
if err != nil || rangeDur <= 0 {
http.Error(w, "invalid range", http.StatusBadRequest)
return
}
end = time.Now().UTC()
start = end.Add(-rangeDur)
}
observations, err := s.db.ObservationSeries(r.Context(), s.site.Name, bucket, int64(rangeDur.Seconds()))
observations, err := s.db.ObservationSeries(r.Context(), s.site.Name, bucket, start, end)
if err != nil {
http.Error(w, "failed to query observations", http.StatusInternalServerError)
log.Printf("web dashboard observations error: %v", err)
@@ -136,6 +164,8 @@ func (s *webServer) handleDashboard(w http.ResponseWriter, r *http.Request) {
Site: s.site.Name,
Model: s.model,
OpenMeteoURL: openMeteoURL,
RangeStart: start,
RangeEnd: end,
Observations: observations,
Forecast: forecast,
Latest: latest,
@@ -147,3 +177,13 @@ func (s *webServer) handleDashboard(w http.ResponseWriter, r *http.Request) {
log.Printf("web dashboard encode error: %v", err)
}
}
func parseTimeParam(v string) (time.Time, error) {
if t, err := time.Parse(time.RFC3339, v); err == nil {
return t, nil
}
if t, err := time.Parse("2006-01-02", v); err == nil {
return t, nil
}
return time.Time{}, errors.New("unsupported time format")
}