diff --git a/pkg/device/device_test.go b/pkg/device/device_test.go new file mode 100644 index 0000000..16f8fa1 --- /dev/null +++ b/pkg/device/device_test.go @@ -0,0 +1,24 @@ +package device + +import ( + "testing" +) + +var goodDefaultDevice = Device { + Name: "valid", + Settings: DefaultDeviceSettings, + CurrentSetpoint: 0, + State: DeviceState{}, +} + + +func TestStateTopic(t *testing.T) { + topic := goodDefaultDevice.StateTopic() + if topic != "heater/valid/state" { + t.Errorf("Got %s; want heater/valid/state", topic) + } +} + + +func TestCheckSetpoint(t *testing.T) { +} diff --git a/pkg/device/settings.go b/pkg/device/settings.go index e736e99..18ecede 100644 --- a/pkg/device/settings.go +++ b/pkg/device/settings.go @@ -23,26 +23,24 @@ func (d DayOfWeek) Previous() DayOfWeek { return d-1 } -func (d DayOfWeek) DurationBetween(n DayOfWeek) time.Duration { - // return duration between two day of week - var duration time.Duration - if (d-n == 0) { - duration, _ = time.ParseDuration("168h") +func (d DayOfWeek) DaysBetween(n DayOfWeek) int { + var between int + if (n < d) { + between = 7 - int(d-n) } else { - duration, _ = time.ParseDuration(fmt.Sprintf("%dh", (d-n)*24 )) + between = int(n-d) } - return duration + return between } - const ( - Monday DayOfWeek = 0 - Thuesday = 1 - Wednesday = 2 - Thursday = 3 - Friday = 4 - Saturday = 5 - Sunday = 6 + Monday DayOfWeek = 0 + Thuesday DayOfWeek = 1 + Wednesday DayOfWeek = 2 + Thursday DayOfWeek = 3 + Friday DayOfWeek = 4 + Saturday DayOfWeek = 5 + Sunday DayOfWeek = 6 ) func WeekDayEnToFr(weekday time.Weekday) DayOfWeek { @@ -77,6 +75,8 @@ type Setpoint struct { Preset_id int `json:"preset_id"` } + + type WeekProgram map[DayOfWeek][]Setpoint func (p WeekProgram) Current() Setpoint { @@ -119,8 +119,9 @@ func (p WeekProgram) NextTime(t time.Time) (time.Time, error) { setpoint = get(weekday, daytime) if (setpoint != Setpoint{}) { // setpoint found, compute time - next := t.Add( startweekday.DurationBetween(weekday) ) - next = t.Add( time.Duration(setpoint.Start - daytime ) * time.Minute ) + next := time.Date(t.Year(), t.Month(), t.Day() + startweekday.DaysBetween(weekday), 0, 0, 0, 0, time.Local) + + next = next.Add(time.Duration( (setpoint.Start) * int(time.Minute) )) return next, nil } weekday = weekday.Next() @@ -204,3 +205,45 @@ type DeviceSettings struct { Presets []Preset `json:"presets"` TVR TVRSettings `json:"TVR"` } + +////////////////////////////////////////////// +// Defaults + +var DefaultPresets = []Preset{ + {Label: "default", Value: 17, Color: "#012a36"}, + {Label: "normal", Value: 19, Color: "#b6244f"}, +} + +var defaultSetpoints = []Setpoint{ + {Start: 7*60, Preset_id: 1}, + {Start: 8*60, Preset_id: 0}, + {Start: 16*60, Preset_id: 1}, + {Start: 22*60, Preset_id: 0}, +} + +var DefaultWeekProgram = WeekProgram{ + Monday: defaultSetpoints, + Thuesday: defaultSetpoints, + Wednesday: defaultSetpoints, + Thursday : defaultSetpoints, + Friday: defaultSetpoints, + Saturday: defaultSetpoints, + Sunday: defaultSetpoints, +} + +var DefaultPrograms = Programs{ + "default": DefaultWeekProgram, +} + +var DefaultTVRSettings = TVRSettings { + Setpoint_topic : "zigbee2mqtt/TVR/{{.Device}}/set", + Setpoint_payload : "{\"current_heating_setpoint\": {{.Setpoint}}}", + Setpoint_state_topic : "zigbee2mqtt/TVR/{{.Device}}", + Setpoint_state_jp : "$.current_heating_setpoint", +} + +var DefaultDeviceSettings = DeviceSettings{ + Programs: DefaultPrograms, + Presets: DefaultPresets, + TVR: DefaultTVRSettings, +} diff --git a/pkg/device/settings_test.go b/pkg/device/settings_test.go new file mode 100644 index 0000000..685e72f --- /dev/null +++ b/pkg/device/settings_test.go @@ -0,0 +1,82 @@ +package device + +import ( + "testing" + "time" + "fmt" +) + +func TestDaysBetween(t *testing.T) { + var tests = []struct{ + day1 DayOfWeek + day2 DayOfWeek + want int + }{ + { Monday, Thuesday, 1 }, + { Thuesday, Monday, 6 }, + { Sunday, Monday, 1 }, + { Sunday, Thuesday, 2 }, + { Friday, Friday, 0 }, + } + for _, tt := range tests { + testname := fmt.Sprintf("Days between %d and %d", tt.day1, tt.day2 ) + t.Run(testname, func(t *testing.T) { + between := tt.day1.DaysBetween(tt.day2) + if between != tt.want { + t.Errorf("got %d, want %d", between, tt.want) + } + }) + } +} + + +func TestNextTime(t *testing.T) { + + defaultSetpoints := []Setpoint{ + {Start: 7*60, Preset_id: 1}, + {Start: 8*60, Preset_id: 0}, + {Start: 16*60, Preset_id: 1}, + {Start: 22*60, Preset_id: 0}, + } + + program := WeekProgram{ + Monday: defaultSetpoints, + Thuesday: defaultSetpoints, + Wednesday: defaultSetpoints, + Thursday : defaultSetpoints, + Friday: defaultSetpoints, + Saturday: defaultSetpoints, + Sunday: defaultSetpoints, + } + + var tests = []struct{ + time time.Time + want time.Time + }{ + { + time.Date(2022, time.October, 23, 9, 0, 0, 0, time.Local), + time.Date(2022, time.October, 23, 16, 0, 0, 0, time.Local), + }, + { + time.Date(2022, time.October, 24, 5, 0, 0, 0, time.Local), + time.Date(2022, time.October, 24, 7, 0, 0, 0, time.Local), + }, + { + time.Date(2022, time.October, 23, 23, 0, 0, 0, time.Local), + time.Date(2022, time.October, 24, 7, 0, 0, 0, time.Local), + }, + } + for _, tt := range tests { + testname := fmt.Sprintf("%s", tt.time.String() ) + t.Run(testname, func(t *testing.T) { + next, err := program.NextTime(tt.time) + if err != nil { + t.Fatalf("unexpected error") + } + if !next.Equal(tt.want) { + t.Errorf("got %s, want %s", next.String(), tt.want.String()) + } + }) + } + +}