mirror of
https://github.com/jpeletier/koolnova2mqtt.git
synced 2026-07-17 04:36:56 +00:00
update target temperature
This commit is contained in:
+43
-13
@@ -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
@@ -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
@@ -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)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user