1
0
Fork 0
mirror of https://github.com/shouptech/tempgopher.git synced 2026-02-03 16:49:42 +00:00

Pass states via chan

This commit is contained in:
Emma 2018-09-30 08:43:54 -06:00
parent b4960e77ed
commit 3e302c20f9
2 changed files with 17 additions and 12 deletions

View file

@ -45,11 +45,13 @@ func main() {
run = false run = false
}() }()
sc := make(chan State)
// Launch the thermostat go routines // Launch the thermostat go routines
var wg sync.WaitGroup var wg sync.WaitGroup
for _, sensor := range config.Sensors { for _, sensor := range config.Sensors {
wg.Add(1) wg.Add(1)
go RunThermostat(sensor, &run, &wg) go RunThermostat(sensor, sc, &run, &wg)
} }
wg.Wait() wg.Wait()

25
run.go
View file

@ -12,6 +12,7 @@ import (
// State represents the current state of the thermostat // State represents the current state of the thermostat
type State struct { type State struct {
ID string
Temp float64 Temp float64
Cooling bool Cooling bool
Heating bool Heating bool
@ -35,9 +36,9 @@ func ReadTemperature(id string) (float64, error) {
return 0.0, errors.New("Sensor not found") return 0.0, errors.New("Sensor not found")
} }
// SetPinState is used to turn a pin on or off. // PinSwitch is used to turn a pin on or off.
// If invert is false, the pin will be high turned on, and low when turned off. // If invert is false, the pin will be high turned on, and low when turned off.
func SetPinState(pin rpio.Pin, on bool, invert bool) { func PinSwitch(pin rpio.Pin, on bool, invert bool) {
switch { switch {
case on && !invert: case on && !invert:
pin.High() pin.High()
@ -51,8 +52,9 @@ func SetPinState(pin rpio.Pin, on bool, invert bool) {
} }
// RunThermostat monitors the temperature of the supplied sensor and does its best to keep it at the desired state. // RunThermostat monitors the temperature of the supplied sensor and does its best to keep it at the desired state.
func RunThermostat(sensor Sensor, run *bool, wg *sync.WaitGroup) { func RunThermostat(sensor Sensor, sc chan<- State, run *bool, wg *sync.WaitGroup) {
var s State var s State
s.ID = sensor.ID
s.Changed = time.Now() s.Changed = time.Now()
cpin := rpio.Pin(sensor.CoolGPIO) cpin := rpio.Pin(sensor.CoolGPIO)
@ -61,8 +63,8 @@ func RunThermostat(sensor Sensor, run *bool, wg *sync.WaitGroup) {
hpin := rpio.Pin(sensor.HeatGPIO) hpin := rpio.Pin(sensor.HeatGPIO)
hpin.Output() hpin.Output()
SetPinState(cpin, false, sensor.CoolInvert) PinSwitch(cpin, false, sensor.CoolInvert)
SetPinState(hpin, false, sensor.HeatInvert) PinSwitch(hpin, false, sensor.HeatInvert)
for *run { for *run {
t, err := ReadTemperature(sensor.ID) t, err := ReadTemperature(sensor.ID)
@ -76,26 +78,26 @@ func RunThermostat(sensor Sensor, run *bool, wg *sync.WaitGroup) {
case t > sensor.HighTemp && t < sensor.HighTemp: case t > sensor.HighTemp && t < sensor.HighTemp:
log.Panic("Invalid state! Temperature is too high AND too low!") log.Panic("Invalid state! Temperature is too high AND too low!")
case t > sensor.HighTemp && s.Heating: case t > sensor.HighTemp && s.Heating:
SetPinState(hpin, false, sensor.HeatInvert) PinSwitch(hpin, false, sensor.HeatInvert)
log.Printf("%s Turned off heat", sensor.Alias) log.Printf("%s Turned off heat", sensor.Alias)
s.Heating = false s.Heating = false
s.Changed = time.Now() s.Changed = time.Now()
case t > sensor.HighTemp && s.Cooling: case t > sensor.HighTemp && s.Cooling:
break break
case t > sensor.HighTemp && min > sensor.CoolMinutes: case t > sensor.HighTemp && min > sensor.CoolMinutes:
SetPinState(cpin, true, sensor.CoolInvert) PinSwitch(cpin, true, sensor.CoolInvert)
log.Printf("%s Turned on cool", sensor.Alias) log.Printf("%s Turned on cool", sensor.Alias)
s.Cooling = true s.Cooling = true
s.Changed = time.Now() s.Changed = time.Now()
case t < sensor.LowTemp && s.Cooling: case t < sensor.LowTemp && s.Cooling:
SetPinState(cpin, false, sensor.CoolInvert) PinSwitch(cpin, false, sensor.CoolInvert)
log.Printf("%s Turned off cool", sensor.Alias) log.Printf("%s Turned off cool", sensor.Alias)
s.Cooling = false s.Cooling = false
s.Changed = time.Now() s.Changed = time.Now()
case t < sensor.LowTemp && s.Heating: case t < sensor.LowTemp && s.Heating:
break break
case t < sensor.LowTemp && min > sensor.HeatMinutes: case t < sensor.LowTemp && min > sensor.HeatMinutes:
SetPinState(hpin, true, sensor.HeatInvert) PinSwitch(hpin, true, sensor.HeatInvert)
log.Printf("%s Turned on heat", sensor.Alias) log.Printf("%s Turned on heat", sensor.Alias)
s.Heating = true s.Heating = true
s.Changed = time.Now() s.Changed = time.Now()
@ -105,9 +107,10 @@ func RunThermostat(sensor Sensor, run *bool, wg *sync.WaitGroup) {
s.Temp = t s.Temp = t
log.Printf("%s Temp: %.2f, Cooling: %t, Heating: %t, Duration: %.1f", sensor.Alias, s.Temp, s.Cooling, s.Heating, min) log.Printf("%s Temp: %.2f, Cooling: %t, Heating: %t, Duration: %.1f", sensor.Alias, s.Temp, s.Cooling, s.Heating, min)
sc <- s
} }
SetPinState(cpin, false, sensor.CoolInvert) PinSwitch(cpin, false, sensor.CoolInvert)
SetPinState(hpin, false, sensor.HeatInvert) PinSwitch(hpin, false, sensor.HeatInvert)
wg.Done() wg.Done()
} }