From 4e84b93d903fb982a0630c675b724210168e3a67 Mon Sep 17 00:00:00 2001 From: Javier Peletier Date: Sun, 13 Dec 2020 22:12:19 +0100 Subject: [PATCH] Added hvac and fan modes --- main.go | 14 +++++++++++++ zonewatcher/constants.go | 42 +++++++++++++++++++++++++++++--------- zonewatcher/zonewatcher.go | 36 ++++++++++++++++++++++++++++++++ 3 files changed, 82 insertions(+), 10 deletions(-) diff --git a/main.go b/main.go index fa96421..57b414d 100644 --- a/main.go +++ b/main.go @@ -130,6 +130,20 @@ func main() { zone.OnTargetTempChange = func(targetTemp float32) { mqttClient.Publish(getTopic(zone.Zone, "targetTemperature"), 0, false, fmt.Sprintf("%g", targetTemp)) } + zone.OnFanModeChange = func(fanMode zonewatcher.FanMode) { + fanModeStr, found := zonewatcher.FanModes.GetInverse(fanMode) + if !found { + log.Printf("Unknown fan mode %d", fanMode) + } + mqttClient.Publish(getTopic(zone.Zone, "fanMode"), 0, false, fanModeStr) + } + zone.OnHvacModeChange = func(hvacMode zonewatcher.HvacMode) { + hvacModeStr, found := zonewatcher.HvacModes.GetInverse(hvacMode) + if !found { + log.Printf("Unknown hvac mode %d", hvacMode) + } + mqttClient.Publish(getTopic(zone.Zone, "hvacMode"), 0, false, hvacModeStr) + } } if token := mqttClient.Connect(); token.Wait() && token.Error() != nil { diff --git a/zonewatcher/constants.go b/zonewatcher/constants.go index 9a0c002..558843b 100644 --- a/zonewatcher/constants.go +++ b/zonewatcher/constants.go @@ -1,19 +1,41 @@ package zonewatcher +import "koolnova2mqtt/bimap" + const REG_PER_ZONE = 4 const REG_ENABLED = 1 const REG_MODE = 2 const REG_TARGET_TEMP = 3 const REG_CURRENT_TEMP = 4 -const FAN_OFF = 0x00 -const FAN_LOW = 0x10 -const FAN_MED = 0x20 -const FAN_HIGH = 0x30 -const FAN_AUTO = 0x40 +type FanMode byte -const MODE_AIR_COOLING = 0x01 -const MODE_AIR_HEATING = 0x02 -const MODE_UNDERFLOOR_HEATING = 0x04 -const MODE_UNDERFLOOR_AIR_COOLING = 0x05 -const MODE_UNDERFLOOR_AIR_HEATING = 0x06 +const FAN_OFF FanMode = 0x00 +const FAN_LOW FanMode = 0x10 +const FAN_MED FanMode = 0x20 +const FAN_HIGH FanMode = 0x30 +const FAN_AUTO FanMode = 0x40 + +type HvacMode byte + +const MODE_AIR_COOLING HvacMode = 0x01 +const MODE_AIR_HEATING HvacMode = 0x02 +const MODE_UNDERFLOOR_HEATING HvacMode = 0x04 +const MODE_UNDERFLOOR_AIR_COOLING HvacMode = 0x05 +const MODE_UNDERFLOOR_AIR_HEATING HvacMode = 0x06 + +var FanModes = bimap.New(map[interface{}]interface{}{ + "off": FAN_OFF, + "low": FAN_LOW, + "medium": FAN_MED, + "high": FAN_HIGH, + "auto": FAN_AUTO, +}) + +var HvacModes = bimap.New(map[interface{}]interface{}{ + "air cooling": MODE_AIR_COOLING, + "air heating": MODE_AIR_HEATING, + "underfloor heating": MODE_UNDERFLOOR_HEATING, + "underfloor air cooling": MODE_UNDERFLOOR_AIR_COOLING, + "underfloor air heating": MODE_UNDERFLOOR_AIR_HEATING, +}) diff --git a/zonewatcher/zonewatcher.go b/zonewatcher/zonewatcher.go index 36536d4..4277348 100644 --- a/zonewatcher/zonewatcher.go +++ b/zonewatcher/zonewatcher.go @@ -19,6 +19,8 @@ type ZoneWatcher struct { Config OnCurrentTempChange func(newTemp float32) OnTargetTempChange func(newTemp float32) + OnFanModeChange func(newMode FanMode) + OnHvacModeChange func(newMode HvacMode) } func New(config *Config) *ZoneWatcher { @@ -49,6 +51,24 @@ func New(config *Config) *ZoneWatcher { } zw.OnTargetTempChange(temp) }) + zw.RegisterCallback(REG_MODE, func() { + fanMode, err := zw.GetFanMode() + if err != nil { + log.Printf("Cannot read fan mode: %s\n", err) + return + } + hvacMode, err := zw.GetHvacMode() + if err != nil { + log.Printf("Cannot hvac mode: %s\n", err) + return + } + if zw.OnFanModeChange != nil { + zw.OnFanModeChange(fanMode) + } + if zw.OnHvacModeChange != nil { + zw.OnHvacModeChange(hvacMode) + } + }) return zw } @@ -101,3 +121,19 @@ func (zw *ZoneWatcher) GetTargetTemperature() (float32, error) { } return float32(r3) / 2.0, nil } + +func (zw *ZoneWatcher) GetFanMode() (FanMode, error) { + r2, err := zw.ReadRegister(REG_MODE) + if err != nil { + return 0, err + } + return (FanMode)(r2 & 0x00F0), nil +} + +func (zw *ZoneWatcher) GetHvacMode() (HvacMode, error) { + r2, err := zw.ReadRegister(REG_MODE) + if err != nil { + return 0, err + } + return (HvacMode)(r2 & 0x000F), nil +}