From 1c4da53e7535d3ca172f32d6a8a8786748a2db71 Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Tue, 5 Sep 2023 11:37:26 +0200 Subject: [PATCH] publish energy in api/mqtt with 2 digits --- src/devices/boiler.cpp | 42 +++++++++++++++++++++++------------------- src/devices/boiler.h | 4 ++-- src/helpers.cpp | 5 ++++- src/version.h | 2 +- 4 files changed, 30 insertions(+), 23 deletions(-) diff --git a/src/devices/boiler.cpp b/src/devices/boiler.cpp index 18803a585..b96ea8971 100644 --- a/src/devices/boiler.cpp +++ b/src/devices/boiler.cpp @@ -854,16 +854,16 @@ Boiler::Boiler(uint8_t device_type, int8_t device_id, uint8_t product_id, const if (model() != EMS_DEVICE_FLAG_HEATPUMP) { register_telegram_type(0x04, "UBAFactory", true, MAKE_PF_CB(process_UBAFactory)); register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &nomPower_, DeviceValueType::UINT, FL_(nomPower), DeviceValueUOM::KW, MAKE_CF_CB(set_nomPower)); - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &nrgHeat_, DeviceValueType::ULONG, FL_(nrgHeat), DeviceValueUOM::KWH, MAKE_CF_CB(set_nrgHeat)); - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &nrgWw_, DeviceValueType::ULONG, FL_(nrgWw), DeviceValueUOM::KWH, MAKE_CF_CB(set_nrgWw)); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &nrgHeat_, DeviceValueType::ULONG, DeviceValueNumOp::DV_NUMOP_DIV100, FL_(nrgHeat), DeviceValueUOM::KWH, MAKE_CF_CB(set_nrgHeat), 0, 10000000UL); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &nrgWw_, DeviceValueType::ULONG, DeviceValueNumOp::DV_NUMOP_DIV100, FL_(nrgWw), DeviceValueUOM::KWH, MAKE_CF_CB(set_nrgWw), 0, 10000000UL); nrgHeatF_ = EMSESP::nvs_.getDouble(FL_(nrgHeat)[0], 0); nrgWwF_ = EMSESP::nvs_.getDouble(FL_(nrgWw)[0], 0); nomPower_ = EMSESP::nvs_.getUChar(FL_(nomPower)[0], 0); - if (nrgHeatF_ < 0 || nrgHeatF_ >= EMS_VALUE_ULONG_NOTSET) { + if (nrgHeatF_ < 0 || nrgHeatF_ >= EMS_VALUE_ULLONG_NOTSET) { nrgHeatF_ = 0; } - if (nrgWwF_ < 0 || nrgWwF_ >= EMS_VALUE_ULONG_NOTSET) { + if (nrgWwF_ < 0 || nrgWwF_ >= EMS_VALUE_ULLONG_NOTSET) { nrgWwF_ = 0; } if (nomPower_ == EMS_VALUE_UINT_NOTSET) { @@ -939,9 +939,9 @@ void Boiler::check_active() { static uint8_t heatBurnPow = 0; static uint8_t wwBurnPow = 0; static uint8_t lastSaveHour = 0; - // resolution needed: 0.01 Wh = 0.01 Ws / 3600 = (% * kW * ms) / 3600 - nrgHeatF_ += (double_t)(((uint32_t)heatBurnPow * nomPower_ * (uuid::get_uptime() - powLastReadTime_)) / 3600) / 100000UL; - nrgWwF_ += (double_t)(((uint32_t)wwBurnPow * nomPower_ * (uuid::get_uptime() - powLastReadTime_)) / 3600) / 100000UL; + // store in units of 0.01 kWh, resolution needed: 0.01 Wh = 0.01 Ws / 3600 = (% * kW * ms) / 3600 + nrgHeatF_ += ((double)((uint32_t)heatBurnPow * nomPower_ * (uuid::get_uptime() - powLastReadTime_)) / 3600) / 1000UL; + nrgWwF_ += ((double)((uint32_t)wwBurnPow * nomPower_ * (uuid::get_uptime() - powLastReadTime_)) / 3600) / 1000UL; has_update(nrgHeat_, (uint32_t)(nrgHeatF_ + 0.5)); has_update(nrgWw_, (uint32_t)(nrgWwF_ + 0.5)); // check for store values @@ -1014,7 +1014,9 @@ void Boiler::process_UBAMonitorFast(std::shared_ptr telegram) { has_update(telegram, serviceCodeNumber_, 20); - check_active(); // do a quick check to see if the hot water or heating is active + if (telegram->offset <= 4 && telegram->offset + telegram->message_length > 5) { + check_active(); // do a quick check to see if the hot water or heating is active + } } /* @@ -1153,7 +1155,9 @@ void Boiler::process_UBAMonitorFastPlus(std::shared_ptr telegram boilerState_ |= state & 0x04 ? 0x02 : 0; } - check_active(); // do a quick check to see if the hot water or heating is active + if (telegram->offset <= 10 && telegram->offset + telegram->message_length > 11) { + check_active(); // do a quick check to see if the hot water or heating is active + } } /* @@ -2722,26 +2726,26 @@ bool Boiler::set_wwAltOpPrio(const char * value, const int8_t id) { // energy counters. Setting an invalid value does not update, but trigger a store. bool Boiler::set_nrgHeat(const char * value, const int8_t id) { - int v; - if (!Helpers::value2number(value, v)) { + float v; + if (!Helpers::value2float(value, v)) { return false; } - if (v >= 0 && v < EMS_VALUE_ULONG_NOTSET) { - nrgHeatF_ = v; - has_update(nrgHeat_, (uint32_t)nrgHeatF_); + if (v >= 0) { + nrgHeatF_ = v * 100; + has_update(nrgHeat_, (uint32_t)(nrgHeatF_ + 0.5)); } store_energy(); return true; } bool Boiler::set_nrgWw(const char * value, const int8_t id) { - int v; - if (!Helpers::value2number(value, v)) { + float v; + if (!Helpers::value2float(value, v)) { return false; } - if (v >= 0 && v < EMS_VALUE_ULONG_NOTSET) { - nrgWwF_ = v; - has_update(nrgWw_, (uint32_t)nrgWwF_); + if (v >= 0) { + nrgWwF_ = v * 100; + has_update(nrgWw_, (uint32_t)(nrgWwF_ + 0.5)); } store_energy(); return true; diff --git a/src/devices/boiler.h b/src/devices/boiler.h index c22d1896e..8de95bb61 100644 --- a/src/devices/boiler.h +++ b/src/devices/boiler.h @@ -260,8 +260,8 @@ class Boiler : public EMSdevice { uint8_t setReturnTemp_; // special - double_t nrgHeatF_; - double_t nrgWwF_; + double nrgHeatF_; + double nrgWwF_; uint32_t nrgHeat_; uint32_t nrgWw_; uint8_t nomPower_; diff --git a/src/helpers.cpp b/src/helpers.cpp index 35de71b8a..c9c5eb9b5 100644 --- a/src/helpers.cpp +++ b/src/helpers.cpp @@ -345,7 +345,7 @@ char * Helpers::render_value(char * result, const uint32_t value, const int8_t f } result[0] = '\0'; uint32_t new_value = fahrenheit ? format ? value * 1.8 + 32 * format * (fahrenheit - 1) : value * 1.8 + 32 * (fahrenheit - 1) : value; - char s[10] = {0}; + char s[14] = {0}; #ifndef EMSESP_STANDALONE if (!format) { @@ -354,6 +354,9 @@ char * Helpers::render_value(char * result, const uint32_t value, const int8_t f strlcpy(result, ltoa(new_value / format, s, 10), sizeof(s)); strlcat(result, ".", sizeof(s)); strlcat(result, itoa(((new_value % format) * 10) / format, s, 10), sizeof(s)); + if (format == 100) { + strlcat(result, itoa(new_value % 10, s, 10), sizeof(s)); + } } else { strlcpy(result, ltoa(new_value * format * -1, s, 10), sizeof(s)); } diff --git a/src/version.h b/src/version.h index af0cc804a..bed473405 100644 --- a/src/version.h +++ b/src/version.h @@ -1 +1 @@ -#define EMSESP_APP_VERSION "3.6.1-dev.0e" +#define EMSESP_APP_VERSION "3.6.1-dev.0f"