diff --git a/src/Sensors.h b/src/Sensors.h index 53b9285..8095414 100644 --- a/src/Sensors.h +++ b/src/Sensors.h @@ -336,76 +336,61 @@ public: return updated; } - static float getMeanValueByPurpose(Purpose purpose, const ValueType valueType, const AverageType avgType = AverageType::MEAN, bool onlyConnected = true) { + static float getMeanValueByPurpose(Purpose purpose, const ValueType valueType, const AverageType avgType = AverageType::MEAN, const bool onlyConnected = true, const float defaultValue = NAN) { if (settings == nullptr || results == nullptr) { - return 0.0f; + return defaultValue; } uint8_t valueId = (uint8_t) valueType; if (!isValidValueId(valueId)) { - return 0.0f; + return defaultValue; } - if (avgType == AverageType::MEAN) { - float value = 0.0f; - uint8_t amount = 0; + float value = 0.0f; + uint8_t amount = 0; + if (avgType == AverageType::MEAN) { + float sum = 0.0f; for (uint8_t id = 0; id <= getMaxSensorId(); id++) { auto& sSensor = settings[id]; auto& rSensor = results[id]; if (sSensor.purpose == purpose && (!onlyConnected || rSensor.connected)) { - value += rSensor.values[valueId]; + sum += rSensor.values[valueId]; amount++; } } - if (!amount) { - return 0.0f; - - } else if (amount == 1) { - return value; - - } else { - return value / amount; - } + value = amount == 1 ? sum : (sum / amount); } else if (avgType == AverageType::MINIMUM) { - float value = NAN; - for (uint8_t id = 0; id <= getMaxSensorId(); id++) { auto& sSensor = settings[id]; auto& rSensor = results[id]; if (sSensor.purpose == purpose && (!onlyConnected || rSensor.connected)) { - if (value == NAN || rSensor.values[valueId] < value) { + if (amount == 0 || rSensor.values[valueId] < value) { value = rSensor.values[valueId]; + amount++; } } } - return value != NAN ? value : 0.0f; - } else if (avgType == AverageType::MAXIMUM) { - float value = NAN; - for (uint8_t id = 0; id <= getMaxSensorId(); id++) { auto& sSensor = settings[id]; auto& rSensor = results[id]; if (sSensor.purpose == purpose && (!onlyConnected || rSensor.connected)) { - if (value == NAN || rSensor.values[valueId] > value) { + if (amount == 0 || rSensor.values[valueId] > value) { value = rSensor.values[valueId]; + amount++; } } } - - return value != NAN ? value : 0.0f; - - } else { - // bad mean type - return 0.0f; } + + return amount > 0 ? value : defaultValue; } static bool existsConnectedSensorsByPurpose(Purpose purpose) { diff --git a/src/SensorsTask.h b/src/SensorsTask.h index 09b0333..905bd88 100644 --- a/src/SensorsTask.h +++ b/src/SensorsTask.h @@ -423,14 +423,50 @@ protected: } void updateMasterValues() { - vars.master.heating.outdoorTemp = Sensors::getMeanValueByPurpose(Sensors::Purpose::OUTDOOR_TEMP, Sensors::ValueType::PRIMARY, settings.heating.outdoorTempAvgType); - vars.master.heating.indoorTemp = Sensors::getMeanValueByPurpose(Sensors::Purpose::INDOOR_TEMP, Sensors::ValueType::PRIMARY, settings.heating.indoorTempAvgType); + vars.master.heating.indoorTemp = Sensors::getMeanValueByPurpose( + Sensors::Purpose::INDOOR_TEMP, + Sensors::ValueType::PRIMARY, + settings.heating.indoorTempAvgType, + true, + 0.0f + ); + vars.master.heating.outdoorTemp = Sensors::getMeanValueByPurpose( + Sensors::Purpose::OUTDOOR_TEMP, + Sensors::ValueType::PRIMARY, + settings.heating.outdoorTempAvgType, + true, + 0.0f + ); - vars.master.heating.currentTemp = Sensors::getMeanValueByPurpose(Sensors::Purpose::HEATING_TEMP, Sensors::ValueType::PRIMARY); - vars.master.heating.returnTemp = Sensors::getMeanValueByPurpose(Sensors::Purpose::HEATING_RETURN_TEMP, Sensors::ValueType::PRIMARY); + vars.master.heating.currentTemp = Sensors::getMeanValueByPurpose( + Sensors::Purpose::HEATING_TEMP, + Sensors::ValueType::PRIMARY, + Sensors::AverageType::MEAN, + true, + 0.0f + ); + vars.master.heating.returnTemp = Sensors::getMeanValueByPurpose( + Sensors::Purpose::HEATING_RETURN_TEMP, + Sensors::ValueType::PRIMARY, + Sensors::AverageType::MEAN, + true, + 0.0f + ); - vars.master.dhw.currentTemp = Sensors::getMeanValueByPurpose(Sensors::Purpose::DHW_TEMP, Sensors::ValueType::PRIMARY); - vars.master.dhw.returnTemp = Sensors::getMeanValueByPurpose(Sensors::Purpose::DHW_RETURN_TEMP, Sensors::ValueType::PRIMARY); + vars.master.dhw.currentTemp = Sensors::getMeanValueByPurpose( + Sensors::Purpose::DHW_TEMP, + Sensors::ValueType::PRIMARY, + Sensors::AverageType::MEAN, + true, + 0.0f + ); + vars.master.dhw.returnTemp = Sensors::getMeanValueByPurpose( + Sensors::Purpose::DHW_RETURN_TEMP, + Sensors::ValueType::PRIMARY, + Sensors::AverageType::MEAN, + true, + 0.0f + ); } void makeDallasInstances() {