]> git.giacomolli.uk - onehouse/blob - driver/alamo/control_settings.go
Poll and command shared Alamo thermostats
[onehouse] / driver / alamo / control_settings.go
1 package alamo
2
3 import (
4 "bytes"
5 "encoding/json"
6 "fmt"
7 )
8
9 type controlSettings struct {
10 Mode string `json:"mode"`
11 TargetTemperature float64 `json:"target_temperature"`
12 }
13
14 func decodeControl(value json.RawMessage) (controlSettings, error) {
15 var fields struct {
16 Mode *string `json:"mode"`
17 Target *float64 `json:"target_temperature"`
18 }
19
20 decoder := json.NewDecoder(bytes.NewReader(value))
21 decoder.DisallowUnknownFields()
22
23 err := decoder.Decode(&fields)
24 if err != nil {
25 return controlSettings{}, fmt.Errorf("decode control settings: %w", err)
26 }
27
28 if !json.Valid(value) || fields.Mode == nil || fields.Target == nil {
29 return controlSettings{}, fmt.Errorf("control settings must contain mode and target temperature")
30 }
31
32 if *fields.Mode != "off" && *fields.Mode != "heat" {
33 return controlSettings{}, fmt.Errorf("control mode must be off or heat")
34 }
35
36 if !finite(*fields.Target) {
37 return controlSettings{}, fmt.Errorf("target temperature must be finite")
38 }
39
40 return controlSettings{
41 Mode: *fields.Mode,
42 TargetTemperature: *fields.Target,
43 }, nil
44 }