mirror of
https://github.com/jpeletier/koolnova2mqtt.git
synced 2026-01-12 03:24:23 +00:00
142 lines
2.9 KiB
Go
142 lines
2.9 KiB
Go
package kn
|
|
|
|
import (
|
|
"errors"
|
|
)
|
|
|
|
const NUM_ZONES = 16
|
|
|
|
const REG_PER_ZONE = 4
|
|
const REG_ENABLED = 1
|
|
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_KN_MODE = 82
|
|
|
|
const FIRST_ZONE_REGISTER = REG_ENABLED
|
|
const TOTAL_ZONE_REGISTERS = NUM_ZONES * REG_PER_ZONE
|
|
const FIRST_SYS_REGISTER = REG_AIRFLOW
|
|
const TOTAL_SYS_REGISTERS = 18
|
|
|
|
type FanMode byte
|
|
|
|
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 KnMode byte
|
|
|
|
const MODE_AIR_COOLING KnMode = 0x01
|
|
const MODE_AIR_HEATING KnMode = 0x02
|
|
const MODE_UNDERFLOOR_HEATING KnMode = 0x04
|
|
const MODE_UNDERFLOOR_AIR_COOLING KnMode = 0x05
|
|
const MODE_UNDERFLOOR_AIR_HEATING KnMode = 0x06
|
|
|
|
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"
|
|
const HVAC_MODE_COOL = "cool"
|
|
const HVAC_MODE_HEAT = "heat"
|
|
|
|
type ACMachine int
|
|
|
|
const ACMachines = 4
|
|
|
|
const AC1 ACMachine = 1
|
|
const AC2 ACMachine = 2
|
|
const AC3 ACMachine = 3
|
|
const AC4 ACMachine = 4
|
|
|
|
const HA_COMPONENT_SENSOR = "sensor"
|
|
const HA_COMPONENT_CLIMATE = "climate"
|
|
|
|
func FanMode2Str(fm FanMode) string {
|
|
switch fm {
|
|
case FAN_OFF:
|
|
return "off"
|
|
case FAN_LOW:
|
|
return "low"
|
|
case FAN_MED:
|
|
return "medium"
|
|
case FAN_HIGH:
|
|
return "high"
|
|
case FAN_AUTO:
|
|
return "auto"
|
|
default:
|
|
return "unknown"
|
|
}
|
|
}
|
|
|
|
func Str2FanMode(st string) (FanMode, error) {
|
|
switch st {
|
|
case "off":
|
|
return FAN_OFF, nil
|
|
case "low":
|
|
return FAN_LOW, nil
|
|
case "medium":
|
|
return FAN_MED, nil
|
|
case "high":
|
|
return FAN_HIGH, nil
|
|
case "auto":
|
|
return FAN_AUTO, nil
|
|
default:
|
|
return FAN_OFF, errors.New("Unknown fan mode")
|
|
}
|
|
}
|
|
|
|
func ApplyHvacMode(knMode KnMode, hvacMode string) KnMode {
|
|
switch knMode {
|
|
case MODE_AIR_COOLING:
|
|
if hvacMode == HVAC_MODE_HEAT {
|
|
return MODE_AIR_HEATING
|
|
}
|
|
case MODE_AIR_HEATING:
|
|
if hvacMode == HVAC_MODE_COOL {
|
|
return MODE_AIR_COOLING
|
|
}
|
|
case MODE_UNDERFLOOR_AIR_COOLING:
|
|
if hvacMode == HVAC_MODE_HEAT {
|
|
return MODE_UNDERFLOOR_AIR_HEATING
|
|
}
|
|
case MODE_UNDERFLOOR_AIR_HEATING, MODE_UNDERFLOOR_HEATING:
|
|
if hvacMode == HVAC_MODE_COOL {
|
|
return MODE_UNDERFLOOR_AIR_COOLING
|
|
}
|
|
}
|
|
return knMode
|
|
}
|
|
|
|
func ApplyHoldMode(knMode KnMode, holdMode string) KnMode {
|
|
cool := knMode == MODE_AIR_COOLING || knMode == MODE_UNDERFLOOR_AIR_COOLING
|
|
switch holdMode {
|
|
case HOLD_MODE_FAN_ONLY:
|
|
if cool {
|
|
return MODE_AIR_COOLING
|
|
}
|
|
return MODE_AIR_HEATING
|
|
case HOLD_MODE_UNDERFLOOR_ONLY:
|
|
if cool {
|
|
return MODE_UNDERFLOOR_AIR_COOLING
|
|
}
|
|
return MODE_UNDERFLOOR_HEATING
|
|
case HOLD_MODE_UNDERFLOOR_AND_FAN:
|
|
if cool {
|
|
return MODE_UNDERFLOOR_AIR_COOLING
|
|
}
|
|
return MODE_UNDERFLOOR_AIR_HEATING
|
|
}
|
|
return knMode
|
|
}
|