diff --git a/cmd/fermentord/config.go b/cmd/fermentord/config.go index 6df2c72..02d18f2 100644 --- a/cmd/fermentord/config.go +++ b/cmd/fermentord/config.go @@ -28,6 +28,7 @@ func loadConfiguration() *controllers.ControllerConfig { viper.SetDefault("limits.min_cooler_runtime_secs", 300) viper.SetDefault("limits.max_cooler_runtime_secs", 86400) viper.SetDefault("limits.min_cooler_cooldown_secs", 300) + viper.SetDefault("liimts.heater_grace_time_secs", 1800) viper.AddConfigPath("/etc") viper.AddConfigPath("/usr/local/etc") diff --git a/internal/controllers/chamber.go b/internal/controllers/chamber.go index 19fd6f7..8069e9f 100644 --- a/internal/controllers/chamber.go +++ b/internal/controllers/chamber.go @@ -168,7 +168,13 @@ func (p *ChamberController) computeChamberState() ChamberState { } // Ensure compressor cooldown - if p.chamberState != ChamberStateCooling && next == ChamberStateCooling && time.Since(p.lastCoolerStateChange).Seconds() < p.config.Limits.MinCoolerCooldownSecs { + if p.chamberState != ChamberStateCooling && next == ChamberStateCooling && + time.Since(p.lastCoolerStateChange).Seconds() < p.config.Limits.MinCoolerCooldownSecs { + return ChamberStateIdle + } + + // Ensure that heater wont run just after cooling cycle + if p.chamberState != ChamberStateHeating && next == ChamberStateHeating && time.Since(p.lastCoolerStateChange).Seconds() < p.config.Limits.HeaterGraceTimeSecs { return ChamberStateIdle } diff --git a/internal/controllers/config.go b/internal/controllers/config.go index 9a4f6eb..8676b60 100644 --- a/internal/controllers/config.go +++ b/internal/controllers/config.go @@ -29,9 +29,10 @@ type ControllerConfig struct { Limits struct { MinChamberTemperature float64 `mapstructure:"min_chamber_temp"` MaxChamberTemperature float64 `mapstructure:"max_chamber_temp"` - MinCoolerRuntimeSecs float64 `mapstructure:"min_cooler_runtime_secs"` // 900 - MaxCoolerRuntimeSecs float64 `mapstructure:"max_cooler_runtime_secs"` // 86400 - MinCoolerCooldownSecs float64 `mapstructure:"min_cooler_cooldown_secs"` // 900 + MinCoolerRuntimeSecs float64 `mapstructure:"min_cooler_runtime_secs"` + MaxCoolerRuntimeSecs float64 `mapstructure:"max_cooler_runtime_secs"` + MinCoolerCooldownSecs float64 `mapstructure:"min_cooler_cooldown_secs"` + HeaterGraceTimeSecs float64 `mapstructure:"heater_grace_time_secs"` } `mapstructure:"limits"` PID struct {