update target temperature

This commit is contained in:
Javier Peletier
2020-12-15 16:55:25 +01:00
parent 098f5c1d61
commit a7298c3ff4
5 changed files with 182 additions and 40 deletions
+43 -13
View File
@@ -4,18 +4,22 @@ import (
"encoding/json"
"fmt"
"koolnova2mqtt/watcher"
"log"
"strconv"
)
type Publish func(topic string, qos byte, retained bool, payload string)
type Subscribe func(topic string, callback func(message string)) error
type Config struct {
ModuleName string
SlaveID byte
Publish Publish
TopicPrefix string
HassPrefix string
ReadRegister watcher.ReadRegister
ModuleName string
SlaveID byte
Publish Publish
Subscribe Subscribe
TopicPrefix string
HassPrefix string
ReadRegister watcher.ReadRegister
WriteRegister watcher.WriteRegister
}
type Bridge struct {
@@ -51,6 +55,7 @@ func NewBridge(config *Config) *Bridge {
RegisterSize: 2,
SlaveID: config.SlaveID,
Read: config.ReadRegister,
Write: config.WriteRegister,
})
sysw := watcher.New(&watcher.Config{
@@ -59,6 +64,7 @@ func NewBridge(config *Config) *Bridge {
RegisterSize: 2,
SlaveID: config.SlaveID,
Read: config.ReadRegister,
Write: config.WriteRegister,
})
b := &Bridge{
@@ -70,7 +76,7 @@ func NewBridge(config *Config) *Bridge {
return b
}
func (b *Bridge) Start() {
func (b *Bridge) Start() error {
sys := NewSys(&SysConfig{
Watcher: b.sysw,
})
@@ -78,13 +84,13 @@ func (b *Bridge) Start() {
err := b.zw.Poll()
if err != nil {
fmt.Println(err)
return
return err
}
err = b.sysw.Poll()
if err != nil {
fmt.Println(err)
return
return err
}
getHVACMode := func() string {
@@ -113,13 +119,22 @@ func (b *Bridge) Start() {
}
zones, err := getActiveZones(b.zw)
publishHvacMode := func() {
for _, zone := range zones {
if zone.IsOn() {
hvacModeTopic := b.getZoneTopic(zone.ZoneNumber, "hvacMode")
mode := getHVACMode()
b.Publish(hvacModeTopic, 0, true, mode)
}
}
}
var hvacModes []string
for k, _ := range KnModes.GetForwardMap() {
hvacModes = append(hvacModes, k.(string))
}
hvacModeTopic := b.getSysTopic("hvacMode")
hvacModeTopicSet := hvacModeTopic + "/set"
holdModeTopic := b.getSysTopic("holdMode")
holdModeSetTopic := holdModeTopic + "/set"
@@ -130,6 +145,8 @@ func (b *Bridge) Start() {
targetTempSetTopic := targetTempTopic + "/set"
fanModeTopic := b.getZoneTopic(zone.ZoneNumber, "fanMode")
fanModeSetTopic := fanModeTopic + "/set"
hvacModeTopic := b.getZoneTopic(zone.ZoneNumber, "hvacMode")
hvacModeTopicSet := hvacModeTopic + "/set"
zone.OnCurrentTempChange = func(currentTemp float32) {
b.Publish(currentTempTopic, 0, true, fmt.Sprintf("%g", currentTemp))
@@ -144,6 +161,18 @@ func (b *Bridge) Start() {
}
err = b.Subscribe(targetTempSetTopic, func(message string) {
targetTemp, err := strconv.ParseFloat(message, 32)
if err != nil {
log.Printf("Error parsing targetTemperature in topic %s: %s", targetTempSetTopic, err)
return
}
err = zone.SetTargetTemperature(float32(targetTemp))
if err != nil {
log.Printf("Cannot set target temperature to %g in zone %d", targetTemp, zone.ZoneNumber)
}
})
name := fmt.Sprintf("%s_zone%d", b.ModuleName, zone.ZoneNumber)
config := map[string]interface{}{
"name": name,
@@ -191,10 +220,10 @@ func (b *Bridge) Start() {
sys.OnSystemEnabledChange = func() {
enabled := sys.GetSystemEnabled()
b.Publish(b.getSysTopic("enabled"), 0, true, fmt.Sprintf("%t", enabled))
b.Publish(hvacModeTopic, 0, true, getHVACMode())
publishHvacMode()
}
sys.OnKnModeChange = func() {
b.Publish(hvacModeTopic, 0, true, getHVACMode())
publishHvacMode()
b.Publish(holdModeTopic, 0, true, getHoldMode())
}
@@ -204,6 +233,7 @@ func (b *Bridge) Start() {
b.Publish(b.getSysTopic("serialBaud"), 0, true, strconv.Itoa(sys.GetBaudRate()))
b.Publish(b.getSysTopic("serialParity"), 0, true, sys.GetParity())
b.Publish(b.getSysTopic("slaveId"), 0, true, strconv.Itoa(sys.GetSlaveID()))
return nil
}
func (b *Bridge) Tick() {
+2 -2
View File
@@ -56,8 +56,8 @@ var KnModes = bimap.New(map[interface{}]interface{}{
"underfloor air heating": MODE_UNDERFLOOR_AIR_HEATING,
})
const HOLD_MODE_UNDERFLOOR_ONLY = "underfloor only"
const HOLD_MODE_FAN_ONLY = "fan only"
const HOLD_MODE_UNDERFLOOR_ONLY = "underfloor"
const HOLD_MODE_FAN_ONLY = "fan"
const HOLD_MODE_UNDERFLOOR_AND_FAN = "underfloor and fan"
const HVAC_MODE_OFF = "off"
+13 -1
View File
@@ -6,6 +6,7 @@ import (
type Watcher interface {
ReadRegister(address uint16) (value []byte)
WriteRegister(address uint16, value uint16) error
RegisterCallback(address uint16, callback func(address uint16))
}
@@ -62,11 +63,14 @@ func (z *Zone) RegisterCallback(num int, f func()) {
}
func (z *Zone) ReadRegister(num int) uint16 {
b := z.Watcher.ReadRegister(uint16(z.ZoneNumber*REG_PER_ZONE + num))
return binary.BigEndian.Uint16(b)
}
func (z *Zone) WriteRegister(num int, value uint16) error {
return z.Watcher.WriteRegister(uint16(z.ZoneNumber*REG_PER_ZONE+num), value)
}
func (z *Zone) IsOn() bool {
r1 := z.ReadRegister(REG_ENABLED)
return r1&0x1 != 0
@@ -87,6 +91,10 @@ func (z *Zone) GetTargetTemperature() float32 {
return reg2temp(r3)
}
func (z *Zone) SetTargetTemperature(targetTemp float32) error {
return z.WriteRegister(REG_TARGET_TEMP, temp2reg(targetTemp))
}
func (z *Zone) GetFanMode() FanMode {
r2 := z.ReadRegister(REG_MODE)
return (FanMode)(r2&0x00F0) >> 4
@@ -100,3 +108,7 @@ func (z *Zone) GetHvacMode() KnMode {
func reg2temp(r uint16) float32 {
return float32(0x00FF&r) / 2.0
}
func temp2reg(t float32) uint16 {
return uint16(t * 2)
}