From 4bf9083b238383d626e98c1d85f8218063e0f964 Mon Sep 17 00:00:00 2001 From: Thomas Basler Date: Tue, 22 Aug 2023 11:45:14 +0200 Subject: [PATCH] Prometheus Endpoint: Publish only relevant amount of digits Implemented method to return the correctly formatted field value as string --- lib/Hoymiles/src/parser/StatisticsParser.cpp | 7 +++++++ lib/Hoymiles/src/parser/StatisticsParser.h | 1 + src/MqttHandleInverter.cpp | 6 +----- src/WebApi_prometheus.cpp | 4 ++-- 4 files changed, 11 insertions(+), 7 deletions(-) diff --git a/lib/Hoymiles/src/parser/StatisticsParser.cpp b/lib/Hoymiles/src/parser/StatisticsParser.cpp index 2218ca4..ac61be8 100644 --- a/lib/Hoymiles/src/parser/StatisticsParser.cpp +++ b/lib/Hoymiles/src/parser/StatisticsParser.cpp @@ -150,6 +150,13 @@ float StatisticsParser::getChannelFieldValue(ChannelType_t type, ChannelNum_t ch return 0; } +String StatisticsParser::getChannelFieldValueString(ChannelType_t type, ChannelNum_t channel, FieldId_t fieldId) +{ + return String( + getChannelFieldValue(type, channel, fieldId), + static_cast(getChannelFieldDigits(type, channel, fieldId))); +} + bool StatisticsParser::hasChannelFieldValue(ChannelType_t type, ChannelNum_t channel, FieldId_t fieldId) { const byteAssign_t* pos = getAssignmentByChannelField(type, channel, fieldId); diff --git a/lib/Hoymiles/src/parser/StatisticsParser.h b/lib/Hoymiles/src/parser/StatisticsParser.h index 436dba2..13d7d4f 100644 --- a/lib/Hoymiles/src/parser/StatisticsParser.h +++ b/lib/Hoymiles/src/parser/StatisticsParser.h @@ -119,6 +119,7 @@ public: fieldSettings_t* getSettingByChannelField(ChannelType_t type, ChannelNum_t channel, FieldId_t fieldId); float getChannelFieldValue(ChannelType_t type, ChannelNum_t channel, FieldId_t fieldId); + String getChannelFieldValueString(ChannelType_t type, ChannelNum_t channel, FieldId_t fieldId); bool hasChannelFieldValue(ChannelType_t type, ChannelNum_t channel, FieldId_t fieldId); const char* getChannelFieldUnit(ChannelType_t type, ChannelNum_t channel, FieldId_t fieldId); const char* getChannelFieldName(ChannelType_t type, ChannelNum_t channel, FieldId_t fieldId); diff --git a/src/MqttHandleInverter.cpp b/src/MqttHandleInverter.cpp index a42803c..c9621e3 100644 --- a/src/MqttHandleInverter.cpp +++ b/src/MqttHandleInverter.cpp @@ -126,11 +126,7 @@ void MqttHandleInverterClass::publishField(std::shared_ptr inv return; } - String value = String( - inv->Statistics()->getChannelFieldValue(type, channel, fieldId), - static_cast(inv->Statistics()->getChannelFieldDigits(type, channel, fieldId))); - - MqttSettings.publish(topic, value); + MqttSettings.publish(topic, inv->Statistics()->getChannelFieldValueString(type, channel, fieldId)); } String MqttHandleInverterClass::getTopic(std::shared_ptr inv, ChannelType_t type, ChannelNum_t channel, FieldId_t fieldId) diff --git a/src/WebApi_prometheus.cpp b/src/WebApi_prometheus.cpp index 1866494..968438c 100644 --- a/src/WebApi_prometheus.cpp +++ b/src/WebApi_prometheus.cpp @@ -114,14 +114,14 @@ void WebApiPrometheusClass::addField(AsyncResponseStream* stream, String& serial stream->printf("# HELP opendtu_%s in %s\n", chanName, inv->Statistics()->getChannelFieldUnit(type, channel, fieldId)); stream->printf("# TYPE opendtu_%s %s\n", chanName, _metricTypes[_fieldMetricAssignment[fieldId]]); } - stream->printf("opendtu_%s{serial=\"%s\",unit=\"%d\",name=\"%s\",type=\"%s\",channel=\"%d\"} %f\n", + stream->printf("opendtu_%s{serial=\"%s\",unit=\"%d\",name=\"%s\",type=\"%s\",channel=\"%d\"} %s\n", chanName, serial.c_str(), idx, inv->name(), inv->Statistics()->getChannelTypeName(type), channel, - inv->Statistics()->getChannelFieldValue(type, channel, fieldId)); + inv->Statistics()->getChannelFieldValueString(type, channel, fieldId).c_str()); } }