diff --git a/main.go b/main.go index 7f36efa..9f5bcd5 100644 --- a/main.go +++ b/main.go @@ -2,7 +2,10 @@ package main import ( "log" + "os" + "os/signal" "sync" + "syscall" "github.com/alexflint/go-arg" "github.com/stianeikeland/go-rpio" @@ -31,10 +34,14 @@ func main() { } // Launch the thermostat go routines + sig := make(chan os.Signal) + signal.Notify(sig, os.Interrupt, syscall.SIGTERM) + signal.Notify(sig, os.Interrupt, syscall.SIGINT) + var wg sync.WaitGroup for _, sensor := range config.Sensors { wg.Add(1) - go RunThermostat(sensor) + go RunThermostat(sensor, sig, &wg) } wg.Wait() diff --git a/run.go b/run.go index db63485..dea49f3 100644 --- a/run.go +++ b/run.go @@ -3,6 +3,8 @@ package main import ( "errors" "log" + "os" + "sync" "time" "github.com/stianeikeland/go-rpio" @@ -61,7 +63,7 @@ func GetPinState(pin rpio.Pin, invert bool) bool { } // RunThermostat monitors the temperature of the supplied sensor and does its best to keep it at the desired state. -func RunThermostat(sensor Sensor) { +func RunThermostat(sensor Sensor, sig chan os.Signal, wg *sync.WaitGroup) { var s State s.Changed = time.Now() @@ -74,7 +76,13 @@ func RunThermostat(sensor Sensor) { SetPinState(cpin, false, sensor.CoolInvert) SetPinState(hpin, false, sensor.HeatInvert) - for { + run := true + go func() { + <-sig + run = false + }() + + for run { t, err := ReadTemperature(sensor.ID) if err != nil { log.Panicln(err) @@ -115,4 +123,8 @@ func RunThermostat(sensor Sensor) { //s.Heating = GetPinState(hpin, sensor.HeatInvert) log.Printf("%s Temp: %.2f, Cooling: %t, Heating: %t, Duration: %.1f", sensor.Alias, s.Temp, s.Cooling, s.Heating, min) } + + SetPinState(cpin, false, sensor.CoolInvert) + SetPinState(hpin, false, sensor.HeatInvert) + wg.Done() }