completed readonly

This commit is contained in:
Javier Peletier
2020-12-14 00:40:35 +01:00
parent b99a58e79e
commit 119adb54db
4 changed files with 314 additions and 31 deletions
+39 -5
View File
@@ -8,13 +8,22 @@ const REG_MODE = 2
const REG_TARGET_TEMP = 3
const REG_CURRENT_TEMP = 4
const REG_AIRFLOW = 65
const REG_AC_TARGET_TEMP = 69
const REG_AC_TARGET_FAN_MODE = 73
const REG_SERIAL_CONFIG = 77
const REG_SLAVE_ID = 78
const REG_EFFICIENCY = 79
const REG_SYSTEM_ENABLED = 81
const REG_SYS_HVAC_MODE = 82
type FanMode byte
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
const FAN_OFF FanMode = 0
const FAN_LOW FanMode = 1
const FAN_MED FanMode = 2
const FAN_HIGH FanMode = 3
const FAN_AUTO FanMode = 4
type HvacMode byte
@@ -39,3 +48,28 @@ var HvacModes = bimap.New(map[interface{}]interface{}{
"underfloor air cooling": MODE_UNDERFLOOR_AIR_COOLING,
"underfloor air heating": MODE_UNDERFLOOR_AIR_HEATING,
})
type ACMachine int
const ACMachines = 4
const AC1 ACMachine = 1
const AC2 ACMachine = 2
const AC3 ACMachine = 3
const AC4 ACMachine = 4
func FanMode2Str(fm FanMode) string {
st, ok := FanModes.GetInverse(fm)
if !ok {
st = "unknown"
}
return st.(string)
}
func HvacMode2Str(hm HvacMode) string {
st, ok := HvacModes.GetInverse(hm)
if !ok {
st = "unknown"
}
return st.(string)
}
+156
View File
@@ -0,0 +1,156 @@
package kn
import "errors"
type SysConfig struct {
Watcher Watcher
}
type Sys struct {
SysConfig
OnACAirflowChange func(ac ACMachine)
OnACTargetTempChange func(ac ACMachine)
OnACTargetFanModeChange func(ac ACMachine)
OnEfficiencyChange func()
OnSystemEnabledChange func()
OnHvacModeChange func()
}
var ErrUnknownSerialConfig = errors.New("Uknown serial configuration")
func NewSys(config *SysConfig) *Sys {
s := &Sys{
SysConfig: *config,
}
for n := byte(0); n < ACMachines; n++ {
func(ac ACMachine) {
s.Watcher.RegisterCallback(uint16(REG_AIRFLOW+ac-1), func(address uint16) {
if s.OnACAirflowChange != nil {
s.OnACAirflowChange(ac)
}
})
s.Watcher.RegisterCallback(uint16(REG_AC_TARGET_TEMP+ac-1), func(address uint16) {
if s.OnACTargetTempChange != nil {
s.OnACTargetTempChange(ac)
}
})
s.Watcher.RegisterCallback(uint16(REG_AC_TARGET_FAN_MODE+ac-1), func(address uint16) {
if s.OnACTargetFanModeChange != nil {
s.OnACTargetFanModeChange(ac)
}
})
}(ACMachine(n + 1))
}
s.Watcher.RegisterCallback(REG_EFFICIENCY, func(address uint16) {
if s.OnEfficiencyChange != nil {
s.OnEfficiencyChange()
}
})
s.Watcher.RegisterCallback(REG_SYSTEM_ENABLED, func(address uint16) {
if s.OnSystemEnabledChange != nil {
s.OnSystemEnabledChange()
}
})
s.Watcher.RegisterCallback(REG_SYS_HVAC_MODE, func(address uint16) {
if s.OnHvacModeChange != nil {
s.OnHvacModeChange()
}
})
return s
}
func (s *Sys) ReadRegister(n int) (int, error) {
r, err := s.Watcher.ReadRegister(uint16(n))
if err != nil || len(r) != 2 {
return 0, nil
}
return int(r[1]), nil
}
func (s *Sys) GetAirflow(ac ACMachine) (int, error) {
r, err := s.ReadRegister(REG_AIRFLOW + int(ac) - 1)
if err != nil {
return 0, err
}
return r, nil
}
func (s *Sys) GetMachineTargetTemp(ac ACMachine) (float32, error) {
r, err := s.ReadRegister(REG_AC_TARGET_TEMP + int(ac) - 1)
if err != nil {
return 0, err
}
return reg2temp(uint16(r)), nil
}
func (s *Sys) GetTargetFanMode(ac ACMachine) (FanMode, error) {
r, err := s.ReadRegister(REG_AC_TARGET_FAN_MODE + int(ac) - 1)
if err != nil {
return 0, err
}
return FanMode(r), nil
}
func (s *Sys) GetBaudRate() (int, error) {
r, err := s.ReadRegister(REG_SERIAL_CONFIG)
if err != nil {
return 0, err
}
switch r {
case 2, 6:
return 9600, nil
case 3, 7:
return 19200, nil
}
return 0, ErrUnknownSerialConfig
}
func (s *Sys) GetParity() (string, error) {
r, err := s.ReadRegister(REG_SERIAL_CONFIG)
if err != nil {
return "", err
}
switch r {
case 2, 3:
return "even", nil
case 6, 7:
return "none", nil
}
return "", ErrUnknownSerialConfig
}
func (s *Sys) GetSlaveID() (int, error) {
r, err := s.ReadRegister(REG_SLAVE_ID)
if err != nil {
return 0, err
}
return r, nil
}
func (s *Sys) GetEfficiency() (int, error) {
r, err := s.ReadRegister(REG_EFFICIENCY)
if err != nil {
return 0, err
}
return r, nil
}
func (s *Sys) GetSystemEnabled() (bool, error) {
r, err := s.ReadRegister(REG_SYSTEM_ENABLED)
if err != nil {
return false, err
}
return r != 0, nil
}
func (s *Sys) GetSystemHVACMode() (HvacMode, error) {
r, err := s.ReadRegister(REG_SYS_HVAC_MODE)
if err != nil {
return 0, err
}
return HvacMode(r), nil
}
+9 -5
View File
@@ -93,7 +93,7 @@ func (z *Zone) IsOn() (bool, error) {
return false, err
}
return r1&uint16(0x1) != 0, nil
return r1&0x1 != 0, nil
}
func (z *Zone) IsPresent() (bool, error) {
@@ -102,7 +102,7 @@ func (z *Zone) IsPresent() (bool, error) {
return false, err
}
return r1&uint16(0x2) != 0, nil
return r1&0x2 != 0, nil
}
func (z *Zone) GetCurrentTemperature() (float32, error) {
@@ -111,7 +111,7 @@ func (z *Zone) GetCurrentTemperature() (float32, error) {
return 0.0, err
}
return float32(r4) / 2.0, nil
return reg2temp(r4), nil
}
func (z *Zone) GetTargetTemperature() (float32, error) {
@@ -119,7 +119,7 @@ func (z *Zone) GetTargetTemperature() (float32, error) {
if err != nil {
return 0.0, err
}
return float32(r3) / 2.0, nil
return reg2temp(r3), nil
}
func (z *Zone) GetFanMode() (FanMode, error) {
@@ -127,7 +127,7 @@ func (z *Zone) GetFanMode() (FanMode, error) {
if err != nil {
return 0, err
}
return (FanMode)(r2 & 0x00F0), nil
return (FanMode)(r2&0x00F0) >> 4, nil
}
func (z *Zone) GetHvacMode() (HvacMode, error) {
@@ -137,3 +137,7 @@ func (z *Zone) GetHvacMode() (HvacMode, error) {
}
return (HvacMode)(r2 & 0x000F), nil
}
func reg2temp(r uint16) float32 {
return float32(0x00FF&r) / 2.0
}