9 type controlSettings struct {
10 Mode string `json:"mode"`
11 TargetTemperature float64 `json:"target_temperature"`
14 func decodeControl(value json.RawMessage) (controlSettings, error) {
16 Mode *string `json:"mode"`
17 Target *float64 `json:"target_temperature"`
20 decoder := json.NewDecoder(bytes.NewReader(value))
21 decoder.DisallowUnknownFields()
23 err := decoder.Decode(&fields)
25 return controlSettings{}, fmt.Errorf("decode control settings: %w", err)
28 if !json.Valid(value) || fields.Mode == nil || fields.Target == nil {
29 return controlSettings{}, fmt.Errorf("control settings must contain mode and target temperature")
32 if *fields.Mode != "off" && *fields.Mode != "heat" {
33 return controlSettings{}, fmt.Errorf("control mode must be off or heat")
36 if !finite(*fields.Target) {
37 return controlSettings{}, fmt.Errorf("target temperature must be finite")
40 return controlSettings{
42 TargetTemperature: *fields.Target,