Compare commits

..

No commits in common. "d101053188e9a18f05407a48864f7312e3dd4093" and "0d83d14329e60a4adf7b76d40b023dec0998cc9e" have entirely different histories.

3 changed files with 132 additions and 125 deletions

View File

@ -22,11 +22,11 @@ type Error string
func (e Error) Error() string { return string(e) } func (e Error) Error() string { return string(e) }
type DeviceState struct { type DeviceState struct {
Mode string `json:"mode"` Mode string `json:"mode"`
Setpoint int `json:"setpoint"` Setpoint int `json:"setpoint"`
Time time.Time `json:"time"` Time time.Time `json:"time"`
ProgramName string `json:"program_name"` Program_name string `json:"program_name"`
UntilTime time.Time `json:"until_time"` Until_time time.Time `json:"until_time"`
} }
func (s *DeviceState) Equivalent(state DeviceState) bool { func (s *DeviceState) Equivalent(state DeviceState) bool {
@ -50,11 +50,11 @@ func (s *DeviceState) Equivalent(state DeviceState) bool {
if state.Setpoint != s.Setpoint { if state.Setpoint != s.Setpoint {
return false return false
} }
if !state.UntilTime.Equal(s.UntilTime) { if !state.Until_time.Equal(s.Until_time) {
return false return false
} }
case "program": case "program":
if state.ProgramName != s.ProgramName { if state.Program_name != s.Program_name {
return false return false
} }
} }
@ -81,8 +81,8 @@ func (d Device) ListenTopic() (string, error) {
func (d *Device) Program() (WeekProgram, error) { func (d *Device) Program() (WeekProgram, error) {
// return current device program if specified or default one // return current device program if specified or default one
prog_name := "default" prog_name := "default"
if d.State.ProgramName != "" { if d.State.Program_name != "" {
prog_name = d.State.ProgramName prog_name = d.State.Program_name
} }
program, ok := d.Settings.Programs[prog_name] program, ok := d.Settings.Programs[prog_name]
@ -94,10 +94,11 @@ func (d *Device) Program() (WeekProgram, error) {
} }
func (d *Device) ProgramName() string { func (d *Device) ProgramName() string {
if d.State.ProgramName != "" { prog_name := "default"
return d.State.ProgramName if d.State.Program_name != "" {
prog_name = d.State.Program_name
} }
return "default" return prog_name
} }
func (d *Device) publishState(pubchan chan Message) error { func (d *Device) publishState(pubchan chan Message) error {
@ -151,7 +152,11 @@ func (d *Device) SetState(log *zerolog.Logger, state DeviceState, pubchan chan M
return err return err
} }
return d.publishState(pubchan) if err := d.publishState(pubchan); err != nil {
return err
}
return nil
} }
func (d *Device) CheckSetpoint(log *zerolog.Logger, pubchan chan Message) error { func (d *Device) CheckSetpoint(log *zerolog.Logger, pubchan chan Message) error {
@ -161,7 +166,9 @@ func (d *Device) CheckSetpoint(log *zerolog.Logger, pubchan chan Message) error
} }
if change { if change {
return d.publishState(pubchan) if err := d.publishState(pubchan); err != nil {
return err
}
} }
return nil return nil
@ -175,7 +182,7 @@ func (d *Device) update(log *zerolog.Logger, pubchan chan Message) (bool, error)
Int("current_setpoint", d.CurrentSetpoint). Int("current_setpoint", d.CurrentSetpoint).
Str("State.Mode", d.State.Mode). Str("State.Mode", d.State.Mode).
Int("State.Setpoint", d.State.Setpoint). Int("State.Setpoint", d.State.Setpoint).
Str("State.Program_name", d.State.ProgramName). Str("State.Program_name", d.State.Program_name).
Logger() Logger()
log.Debug().Msg("check if setpoint need an update") log.Debug().Msg("check if setpoint need an update")
@ -245,10 +252,10 @@ func (d *Device) handle_reset_state(log *zerolog.Logger, pubchan chan Message) (
} }
d.State = DeviceState{ d.State = DeviceState{
Setpoint: value, Setpoint: value,
Mode: "program", Mode: "program",
ProgramName: d.ProgramName(), Program_name: d.ProgramName(),
Time: timeNow(), Time: timeNow(),
} }
if d.CurrentSetpoint != value { if d.CurrentSetpoint != value {
@ -277,9 +284,9 @@ func (d *Device) handle_always(log *zerolog.Logger, pubchan chan Message) (bool,
} }
func (d *Device) handle_until_time(log *zerolog.Logger, pubchan chan Message) (bool, error) { func (d *Device) handle_until_time(log *zerolog.Logger, pubchan chan Message) (bool, error) {
*log = log.With().Time("until_time", d.State.UntilTime).Logger() *log = log.With().Time("until_time", d.State.Until_time).Logger()
if d.State.UntilTime.Before(timeNow()) { if d.State.Until_time.Before(timeNow()) {
log.Info().Msg("until_time passed, reset") log.Info().Msg("until_time passed, reset")
return d.handle_reset_state(log, pubchan) return d.handle_reset_state(log, pubchan)
} }
@ -329,7 +336,7 @@ func (d *Device) handle_until_next(log *zerolog.Logger, pubchan chan Message) (b
} }
func (d *Device) handle_program(log *zerolog.Logger, pubchan chan Message) (bool, error) { func (d *Device) handle_program(log *zerolog.Logger, pubchan chan Message) (bool, error) {
*log = log.With().Str("program", d.State.ProgramName).Logger() *log = log.With().Str("program", d.State.Program_name).Logger()
program, err := d.Program() program, err := d.Program()
if err != nil { if err != nil {
@ -342,13 +349,13 @@ func (d *Device) handle_program(log *zerolog.Logger, pubchan chan Message) (bool
if err != nil { if err != nil {
return false, err return false, err
} }
d.State.Setpoint = value
if d.CurrentSetpoint != value { if d.CurrentSetpoint != value {
log.Info().Msg("publish setpoint update") log.Info().Msg("publish setpoint update")
if err := d.SetSetpoint(value, pubchan); err != nil { if err := d.SetSetpoint(value, pubchan); err != nil {
return false, err return false, err
} }
d.State.Setpoint = value
return true, nil return true, nil
} }

View File

@ -48,10 +48,10 @@ var test_device = Device{
}, },
CurrentSetpoint: 0, CurrentSetpoint: 0,
State: DeviceState{ State: DeviceState{
Mode: "program", Mode: "program",
Setpoint: 14, Setpoint: 14,
Time: test_time, Time: test_time,
ProgramName: "default", Program_name: "default",
}, },
} }
@ -64,10 +64,10 @@ func TestStateEquivalent(t *testing.T) {
}{ }{
{ {
DeviceState{ DeviceState{
Mode: "program", Mode: "program",
Setpoint: 14, Setpoint: 14,
Time: test_time, Time: test_time,
ProgramName: "default", Program_name: "default",
}, },
DeviceState{ DeviceState{
Mode: "always", Mode: "always",
@ -78,46 +78,46 @@ func TestStateEquivalent(t *testing.T) {
}, },
{ {
DeviceState{ DeviceState{
Mode: "program", Mode: "program",
Setpoint: 14, Setpoint: 14,
Time: test_time, Time: test_time,
ProgramName: "default", Program_name: "default",
}, },
DeviceState{ DeviceState{
Mode: "program", Mode: "program",
Setpoint: 14, Setpoint: 14,
Time: test_time.Add(1 * time.Minute), Time: test_time.Add(1 * time.Minute),
ProgramName: "default", Program_name: "default",
}, },
false, false,
}, },
{ {
DeviceState{ DeviceState{
Mode: "program", Mode: "program",
Setpoint: 14, Setpoint: 14,
Time: test_time, Time: test_time,
ProgramName: "default", Program_name: "default",
}, },
DeviceState{ DeviceState{
Mode: "program", Mode: "program",
Setpoint: 13, Setpoint: 13,
Time: test_time, Time: test_time,
ProgramName: "default", Program_name: "default",
}, },
true, true,
}, },
{ {
DeviceState{ DeviceState{
Mode: "program", Mode: "program",
Setpoint: 14, Setpoint: 14,
Time: test_time, Time: test_time,
ProgramName: "default", Program_name: "default",
}, },
DeviceState{ DeviceState{
Mode: "program", Mode: "program",
Setpoint: 13, Setpoint: 13,
Time: test_time, Time: test_time,
ProgramName: "other", Program_name: "other",
}, },
false, false,
}, },
@ -128,11 +128,11 @@ func TestStateEquivalent(t *testing.T) {
Time: test_time, Time: test_time,
}, },
DeviceState{ DeviceState{
Mode: "always", Mode: "always",
Setpoint: 14, Setpoint: 14,
Time: test_time, Time: test_time,
ProgramName: "other", Program_name: "other",
UntilTime: test_time, Until_time: test_time,
}, },
true, true,
}, },
@ -143,11 +143,11 @@ func TestStateEquivalent(t *testing.T) {
Time: test_time, Time: test_time,
}, },
DeviceState{ DeviceState{
Mode: "always", Mode: "always",
Setpoint: 15, Setpoint: 15,
Time: test_time, Time: test_time,
ProgramName: "other", Program_name: "other",
UntilTime: test_time, Until_time: test_time,
}, },
false, false,
}, },
@ -158,11 +158,11 @@ func TestStateEquivalent(t *testing.T) {
Time: test_time, Time: test_time,
}, },
DeviceState{ DeviceState{
Mode: "until_next", Mode: "until_next",
Setpoint: 14, Setpoint: 14,
Time: test_time, Time: test_time,
ProgramName: "other", Program_name: "other",
UntilTime: test_time, Until_time: test_time,
}, },
true, true,
}, },
@ -173,59 +173,59 @@ func TestStateEquivalent(t *testing.T) {
Time: test_time, Time: test_time,
}, },
DeviceState{ DeviceState{
Mode: "until_next", Mode: "until_next",
Setpoint: 13, Setpoint: 13,
Time: test_time, Time: test_time,
ProgramName: "other", Program_name: "other",
UntilTime: test_time, Until_time: test_time,
}, },
false, false,
}, },
{ {
DeviceState{ DeviceState{
Mode: "until_time", Mode: "until_time",
Setpoint: 14, Setpoint: 14,
Time: test_time, Time: test_time,
UntilTime: test_time.Add(1 * time.Hour), Until_time: test_time.Add(1 * time.Hour),
}, },
DeviceState{ DeviceState{
Mode: "until_time", Mode: "until_time",
Setpoint: 14, Setpoint: 14,
Time: test_time, Time: test_time,
ProgramName: "other", Program_name: "other",
UntilTime: test_time.Add(1 * time.Hour), Until_time: test_time.Add(1 * time.Hour),
}, },
true, true,
}, },
{ {
DeviceState{ DeviceState{
Mode: "until_time", Mode: "until_time",
Setpoint: 14, Setpoint: 14,
Time: test_time, Time: test_time,
UntilTime: test_time.Add(1 * time.Hour), Until_time: test_time.Add(1 * time.Hour),
}, },
DeviceState{ DeviceState{
Mode: "until_time", Mode: "until_time",
Setpoint: 13, Setpoint: 13,
Time: test_time, Time: test_time,
ProgramName: "other", Program_name: "other",
UntilTime: test_time.Add(1 * time.Hour), Until_time: test_time.Add(1 * time.Hour),
}, },
false, false,
}, },
{ {
DeviceState{ DeviceState{
Mode: "until_time", Mode: "until_time",
Setpoint: 14, Setpoint: 14,
Time: test_time, Time: test_time,
UntilTime: test_time.Add(1 * time.Hour), Until_time: test_time.Add(1 * time.Hour),
}, },
DeviceState{ DeviceState{
Mode: "until_time", Mode: "until_time",
Setpoint: 14, Setpoint: 14,
Time: test_time, Time: test_time,
ProgramName: "other", Program_name: "other",
UntilTime: test_time.Add(2 * time.Hour), Until_time: test_time.Add(2 * time.Hour),
}, },
false, false,
}, },
@ -262,7 +262,7 @@ func TestListenTopic(t *testing.T) {
func TestProgram(t *testing.T) { func TestProgram(t *testing.T) {
//case 1: no program set in state return default //case 1: no program set in state return default
case1_device := test_device case1_device := test_device
case1_device.State.ProgramName = "" case1_device.State.Program_name = ""
//case 2: program set "confort" must return it //case 2: program set "confort" must return it
var test_confort_weekprogram = WeekProgram{ var test_confort_weekprogram = WeekProgram{
@ -279,11 +279,11 @@ func TestProgram(t *testing.T) {
"default": test_weekprogram, "default": test_weekprogram,
"confort": test_confort_weekprogram, "confort": test_confort_weekprogram,
} }
case2_device.State.ProgramName = "confort" case2_device.State.Program_name = "confort"
//case 3: program set "confort" but not exist //case 3: program set "confort" but not exist
case3_device := test_device case3_device := test_device
case3_device.State.ProgramName = "confort" case3_device.State.Program_name = "confort"
var tests = []struct { var tests = []struct {
name string name string
@ -324,15 +324,15 @@ func TestUpdate(t *testing.T) {
device1 := test_device device1 := test_device
device1.Name = "1" device1.Name = "1"
device1.State = DeviceState{ device1.State = DeviceState{
Mode: "program", Mode: "program",
Setpoint: 0, Setpoint: 0,
Time: test_time, Time: test_time,
ProgramName: "", Program_name: "",
} }
device2 := test_device device2 := test_device
device2.Name = "2" device2.Name = "2"
device2.State.ProgramName = "unknown" device2.State.Program_name = "unknown"
device3 := test_device device3 := test_device
device3.Name = "3" device3.Name = "3"
@ -345,20 +345,20 @@ func TestUpdate(t *testing.T) {
device4.Name = "4" device4.Name = "4"
device4.CurrentSetpoint = 22 device4.CurrentSetpoint = 22
device4.State = DeviceState{ device4.State = DeviceState{
Mode: "until_time", Mode: "until_time",
Setpoint: 22, Setpoint: 22,
Time: timeNow(), Time: timeNow(),
UntilTime: timeNow().Add(2 * time.Hour), Until_time: timeNow().Add(2 * time.Hour),
} }
device5 := test_device device5 := test_device
device5.Name = "5" device5.Name = "5"
device5.CurrentSetpoint = 17 device5.CurrentSetpoint = 17
device5.State = DeviceState{ device5.State = DeviceState{
Mode: "until_time", Mode: "until_time",
Setpoint: 22, Setpoint: 22,
Time: timeNow().Add(-2 * time.Hour), Time: timeNow().Add(-2 * time.Hour),
UntilTime: timeNow().Add(-1 * time.Minute), Until_time: timeNow().Add(-1 * time.Minute),
} }
device6 := test_device device6 := test_device

View File

@ -34,13 +34,13 @@ func (d DayOfWeek) DaysBetween(n DayOfWeek) int {
} }
const ( const (
Monday DayOfWeek = iota Monday DayOfWeek = 0
Thuesday Thuesday DayOfWeek = 1
Wednesday Wednesday DayOfWeek = 2
Thursday Thursday DayOfWeek = 3
Friday Friday DayOfWeek = 4
Saturday Saturday DayOfWeek = 5
Sunday Sunday DayOfWeek = 6
) )
func WeekDayEnToFr(weekday time.Weekday) DayOfWeek { func WeekDayEnToFr(weekday time.Weekday) DayOfWeek {