From 0edb2cf952fde6a5f880fa1ef16951ffc8550e93 Mon Sep 17 00:00:00 2001 From: proddy Date: Wed, 13 Jun 2018 21:40:47 +0200 Subject: [PATCH] replaced bools with ints for better error handling --- src/ems.cpp | 88 +++++++++++++++++++---------------------------------- 1 file changed, 32 insertions(+), 56 deletions(-) diff --git a/src/ems.cpp b/src/ems.cpp index e361d0712..9308b7798 100644 --- a/src/ems.cpp +++ b/src/ems.cpp @@ -80,7 +80,7 @@ const uint8_t RX_READ_TIMEOUT_COUNT = 4; // 4 retries before timeout uint8_t emsLastRxCount; // used for retries when sending failed // init stats and counters and buffers -// uses -1 or 255 for values that haven't been set yet +// uses -1 or 255 for values that haven't been set yet (EMS_VALUE_INT_NOTSET and EMS_VALUE_FLOAT_NOTSET) void ems_init() { // overall status EMS_Sys_Status.emsRxPgks = 0; @@ -106,39 +106,39 @@ void ems_init() { EMS_Thermostat.mode = 255; // dummy value // UBAParameterWW - EMS_Boiler.wWActivated = false; // Warm Water activated - EMS_Boiler.wWSelTemp = 0; // Warm Water selected temperature - EMS_Boiler.wWCircPump = false; // Warm Water circulation pump available - EMS_Boiler.wWDesiredTemp = 0; // Warm Water desired temperature + EMS_Boiler.wWActivated = EMS_VALUE_INT_NOTSET; // Warm Water activated + EMS_Boiler.wWSelTemp = EMS_VALUE_INT_NOTSET; // Warm Water selected temperature + EMS_Boiler.wWCircPump = EMS_VALUE_INT_NOTSET; // Warm Water circulation pump available + EMS_Boiler.wWDesiredTemp = EMS_VALUE_INT_NOTSET; // Warm Water desired temperature // UBAMonitorFast - EMS_Boiler.selFlowTemp = 0; // Selected flow temperature - EMS_Boiler.curFlowTemp = -1; // Current flow temperature - EMS_Boiler.retTemp = -1; // Return temperature - EMS_Boiler.burnGas = false; // Gas on/off - EMS_Boiler.fanWork = false; // Fan on/off - EMS_Boiler.ignWork = false; // Ignition on/off - EMS_Boiler.heatPmp = false; // Boiler pump on/off - EMS_Boiler.wWHeat = false; // 3-way valve on WW - EMS_Boiler.wWCirc = false; // Circulation on/off - EMS_Boiler.selBurnPow = 0; // Burner max power - EMS_Boiler.curBurnPow = 0; // Burner current power - EMS_Boiler.flameCurr = -1; // Flame current in micro amps - EMS_Boiler.sysPress = -1; // System pressure + EMS_Boiler.selFlowTemp = EMS_VALUE_INT_NOTSET; // Selected flow temperature + EMS_Boiler.curFlowTemp = EMS_VALUE_FLOAT_NOTSET; // Current flow temperature + EMS_Boiler.retTemp = EMS_VALUE_FLOAT_NOTSET; // Return temperature + EMS_Boiler.burnGas = EMS_VALUE_INT_NOTSET; // Gas on/off + EMS_Boiler.fanWork = EMS_VALUE_INT_NOTSET; // Fan on/off + EMS_Boiler.ignWork = EMS_VALUE_INT_NOTSET; // Ignition on/off + EMS_Boiler.heatPmp = EMS_VALUE_INT_NOTSET; // Boiler pump on/off + EMS_Boiler.wWHeat = EMS_VALUE_INT_NOTSET; // 3-way valve on WW + EMS_Boiler.wWCirc = EMS_VALUE_INT_NOTSET; // Circulation on/off + EMS_Boiler.selBurnPow = EMS_VALUE_INT_NOTSET; // Burner max power + EMS_Boiler.curBurnPow = EMS_VALUE_INT_NOTSET; // Burner current power + EMS_Boiler.flameCurr = EMS_VALUE_FLOAT_NOTSET; // Flame current in micro amps + EMS_Boiler.sysPress = EMS_VALUE_FLOAT_NOTSET; // System pressure // UBAMonitorSlow - EMS_Boiler.extTemp = -1; // Outside temperature - EMS_Boiler.boilTemp = -1; // Boiler temperature - EMS_Boiler.pumpMod = 0; // Pump modulation - EMS_Boiler.burnStarts = 0; // # burner restarts - EMS_Boiler.burnWorkMin = 0; // Total burner operating time - EMS_Boiler.heatWorkMin = 0; // Total heat operating time + EMS_Boiler.extTemp = EMS_VALUE_FLOAT_NOTSET; // Outside temperature + EMS_Boiler.boilTemp = EMS_VALUE_FLOAT_NOTSET; // Boiler temperature + EMS_Boiler.pumpMod = EMS_VALUE_INT_NOTSET; // Pump modulation + EMS_Boiler.burnStarts = EMS_VALUE_INT_NOTSET; // # burner restarts + EMS_Boiler.burnWorkMin = EMS_VALUE_INT_NOTSET; // Total burner operating time + EMS_Boiler.heatWorkMin = EMS_VALUE_INT_NOTSET; // Total heat operating time // UBAMonitorWWMessage - EMS_Boiler.wWCurTmp = -1; // Warm Water current temperature: - EMS_Boiler.wWStarts = 0; // Warm Water # starts - EMS_Boiler.wWWorkM = 0; // Warm Water # minutes - EMS_Boiler.wWOneTime = false; // Warm Water one time function on/off + EMS_Boiler.wWCurTmp = EMS_VALUE_FLOAT_NOTSET; // Warm Water current temperature: + EMS_Boiler.wWStarts = EMS_VALUE_INT_NOTSET; // Warm Water # starts + EMS_Boiler.wWWorkM = EMS_VALUE_INT_NOTSET; // Warm Water # minutes + EMS_Boiler.wWOneTime = EMS_VALUE_INT_NOTSET; // Warm Water one time function on/off // init the Tx package _initTxBuffer(); @@ -473,6 +473,8 @@ bool _process_UBAParameterWW(uint8_t * data, uint8_t length) { EMS_Boiler.wWCircPump = (data[6] == 0xFF); // 0xFF means on EMS_Boiler.wWDesiredTemp = data[8]; + EMS_Sys_Status.emsRefreshed = true; // triggers a send the values back to Home Assistant via MQTT + return true; } @@ -541,8 +543,7 @@ bool _process_RC20StatusMessage(uint8_t * data, uint8_t length) { EMS_Thermostat.setpoint_roomTemp = ((float)data[1]) / (float)2; EMS_Thermostat.curr_roomTemp = _toFloat(2, data); - // set the updated flag to trigger a send back to HA - EMS_Sys_Status.emsRefreshed = true; + EMS_Sys_Status.emsRefreshed = true; // set the updated flag to trigger a send back to HA return true; } @@ -682,8 +683,7 @@ void ems_setThermostatTemp(float temperature) { if (_checkWriteQueueFull()) return; // check if there is already something in the queue - char s[10]; - myDebug("Setting thermostat temperature to %s C\n", _float_to_char(s, temperature)); + myDebug("Setting new thermostat temperature\n"); EMS_TxTelegram.action = EMS_TX_WRITE; EMS_TxTelegram.dest = EMS_ID_THERMOSTAT; @@ -760,10 +760,6 @@ void ems_setWarmWaterActivated(bool activated) { _buildTxTelegram(EMS_TxTelegram.checkValue); } -/* - * Helper functions for formatting and converting floats - */ - // function to turn a telegram int (2 bytes) to a float float _toFloat(uint8_t i, uint8_t * data) { if ((data[i] == 0x80) && (data[i + 1] == 0)) // 0x8000 is used when sensor is missing @@ -776,23 +772,3 @@ float _toFloat(uint8_t i, uint8_t * data) { uint16_t _toLong(uint8_t i, uint8_t * data) { return (((data[i]) << 16) + ((data[i + 1]) << 8) + (data[i + 2])); } - -// convert float to char -char * _float_to_char(char * a, float f, uint8_t precision) { - long p[] = {0, 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000}; - - char * ret = a; - // check for 0x8000 (sensor missing), which has a -1 value - if (f == -1) { - strcpy(ret, ""); - } else { - long whole = (long)f; - itoa(whole, a, 10); - while (*a != '\0') - a++; - *a++ = '.'; - long decimal = abs((long)((f - whole) * p[precision])); - itoa(decimal, a, 10); - } - return ret; -}