publish energy in api/mqtt with 2 digits

This commit is contained in:
MichaelDvP
2023-09-05 11:37:26 +02:00
parent 09a15727c7
commit 1c4da53e75
4 changed files with 30 additions and 23 deletions

View File

@@ -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<const Telegram> 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<const Telegram> 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;

View File

@@ -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_;

View File

@@ -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));
}

View File

@@ -1 +1 @@
#define EMSESP_APP_VERSION "3.6.1-dev.0e"
#define EMSESP_APP_VERSION "3.6.1-dev.0f"