gh-6 Device operating mode parsed from bitfield. Bitfields are now 16 bits long, as they should be

This commit is contained in:
Jarno Rankinen 2023-02-19 22:34:34 +02:00
parent ea00590e33
commit aba5156e7a
1 changed files with 41 additions and 3 deletions

View File

@ -93,7 +93,7 @@ func newRegister(address, symbol, typ, multiplier, description string) pingvinRe
}
}
reserved := symbol == "Reserved" && description == "Reserved"
register := pingvinRegister{addr, symbol, 0, "00000000", typ, description, reserved, multipl}
register := pingvinRegister{addr, symbol, 0, "0000000000000000", typ, description, reserved, multipl}
return register
}
@ -215,7 +215,15 @@ func (p *PingvinKL) updateRegisters() {
}
if p.Registers[k].Type == "bitfield" {
p.Registers[k].Value = int(value)
p.Registers[k].Bitfield = fmt.Sprintf("%08b", uvalue)
// p.Registers[k].Bitfield = fmt.Sprintf("%16b", uvalue)
p.Registers[k].Bitfield = ""
for i := 16; i >= 0; i-- {
x := 0
if p.Registers[k].Value>>i&0x1 == 1 {
x = 1
}
p.Registers[k].Bitfield = fmt.Sprintf("%s%s", p.Registers[k].Bitfield, strconv.Itoa(x))
}
}
k++
}
@ -271,12 +279,42 @@ func (p *PingvinKL) populateStatus() {
p.Status.VentInfo.ExtractHum48h = p.Registers[50].Value / p.Registers[50].Multiplier
p.Status.HrcEffIn = p.Registers[29].Value / p.Registers[29].Multiplier
p.Status.HrcEffEx = p.Registers[30].Value / p.Registers[30].Multiplier
// TODO: Operating mode in separate function
p.Status.OpMode = parseStatus(p.Registers[44].Value)
// TODO: Alarms, n of alarms
p.Status.DaysUntilService = p.Registers[538].Value / p.Registers[538].Multiplier
// TODO: Uptime & date in separate functions
}
func parseStatus(value int) string {
val := int16(value)
pingvinStatuses := []string{
"Normal",
"Max heating",
"Max cooling",
"Stopped by alarm",
"Stopped by user",
"Away",
"reserved",
"Temperature boost",
"CO2 boost",
"RH boost",
"Manual boost",
"Overpressure",
"Cooker hood mode",
"Central vac mode",
"Electric heater cooloff",
"Summer night cooling",
"HRC defrost",
}
for i := 1; i <= 16; i++ {
if val>>i&0x1 == 1 {
return pingvinStatuses[i]
}
}
return "Normal"
}
func (p *PingvinKL) Monitor(interval int) {
for {
time.Sleep(time.Duration(interval) * time.Second)