Added hvac and fan modes

This commit is contained in:
Javier Peletier
2020-12-13 22:12:19 +01:00
parent a0c7e0e151
commit 4e84b93d90
3 changed files with 82 additions and 10 deletions
+14
View File
@@ -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 {
+32 -10
View File
@@ -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,
})
+36
View File
@@ -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
}