From 5e1db5e14a2e78553ebf25f9b1e90935dd40b78d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=B8ren=20Rasmussen?= Date: Mon, 25 Jul 2022 22:55:24 +0200 Subject: [PATCH] Stay in idle mode until first temperature reading has occurred --- internal/controllers/chamber.go | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/internal/controllers/chamber.go b/internal/controllers/chamber.go index 918085a..2d68507 100644 --- a/internal/controllers/chamber.go +++ b/internal/controllers/chamber.go @@ -38,9 +38,10 @@ type ChamberController struct { isPaused bool // Current temperature readings. - ambientTemperature float64 - chamberTemperature float64 - wortTemperature float64 + ambientTemperature float64 + chamberTemperature float64 + wortTemperature float64 + lastTemperatureUpdate time.Time chTemp chan temperature.TemperatureReading chPause chan bool @@ -78,6 +79,7 @@ func (p *ChamberController) Run(ctx context.Context, wg *sync.WaitGroup) { p.ambientTemperature = t.Ambient p.chamberTemperature = t.Chamber p.wortTemperature = t.Wort + p.lastTemperatureUpdate = time.Now() case pause := <-p.chPause: p.setPause(pause) @@ -143,6 +145,11 @@ func (p *ChamberController) computeChamberState() ChamberState { //offset := p.pid.Compute(p.chamberTemperature, p.config.FermentationTemperature) //chamberTargetTemp := p.config.FermentationTemperature + offset + // Stay in idle mode until first temperature update is received + if p.lastTemperatureUpdate.IsZero() { + return ChamberStateIdle + } + runtimeSecs := time.Since(p.lastChamberStateChange).Seconds() if p.chamberState == ChamberStateCooling { @@ -198,5 +205,13 @@ func (p *ChamberController) computeChamberState() ChamberState { return ChamberStateIdle } + // Force idle mode when temperature updates are missing + if time.Since(p.lastTemperatureUpdate) > 1*time.Minute { + err := fmt.Errorf("no temperature update on controller for 1 minute - setting IDLE mode") + p.hub.CaptureException(err) + log.Print(err) + next = ChamberStateIdle + } + return next }