Prometheus API: use integrated serialString() method to fetch serial number

This commit is contained in:
Thomas Basler 2022-11-10 19:44:50 +01:00
parent 8e4e055930
commit d62c5b239f
2 changed files with 5 additions and 8 deletions

View File

@ -11,7 +11,7 @@ public:
private: private:
void onPrometheusMetrics(AsyncWebServerRequest* request); void onPrometheusMetrics(AsyncWebServerRequest* request);
void addField(AsyncResponseStream* stream, const char* serial, uint8_t idx, std::shared_ptr<InverterAbstract> inv, uint8_t channel, uint8_t fieldId, const char* channelName = NULL); void addField(AsyncResponseStream* stream, String& serial, uint8_t idx, std::shared_ptr<InverterAbstract> inv, uint8_t channel, uint8_t fieldId, const char* channelName = NULL);
AsyncWebServer* _server; AsyncWebServer* _server;
}; };

View File

@ -49,17 +49,14 @@ void WebApiPrometheusClass::onPrometheusMetrics(AsyncWebServerRequest* request)
for (uint8_t i = 0; i < Hoymiles.getNumInverters(); i++) { for (uint8_t i = 0; i < Hoymiles.getNumInverters(); i++) {
auto inv = Hoymiles.getInverterByPos(i); auto inv = Hoymiles.getInverterByPos(i);
char serial[sizeof(uint64_t) * 8 + 1]; String serial = inv->serialString();
snprintf(serial, sizeof(serial), "%0x%08x",
((uint32_t)((inv->serial() >> 32) & 0xFFFFFFFF)),
((uint32_t)(inv->serial() & 0xFFFFFFFF)));
const char* name = inv->name(); const char* name = inv->name();
if (i == 0) { if (i == 0) {
stream->print(F("# HELP opendtu_last_update last update from inverter in s\n")); stream->print(F("# HELP opendtu_last_update last update from inverter in s\n"));
stream->print(F("# TYPE opendtu_last_update gauge\n")); stream->print(F("# TYPE opendtu_last_update gauge\n"));
} }
stream->printf("opendtu_last_update{serial=\"%s\",unit=\"%d\",name=\"%s\"} %d\n", stream->printf("opendtu_last_update{serial=\"%s\",unit=\"%d\",name=\"%s\"} %d\n",
serial, i, name, inv->Statistics()->getLastUpdate() / 1000); serial.c_str(), i, name, inv->Statistics()->getLastUpdate() / 1000);
// Loop all channels // Loop all channels
for (uint8_t c = 0; c <= inv->Statistics()->getChannelCount(); c++) { for (uint8_t c = 0; c <= inv->Statistics()->getChannelCount(); c++) {
@ -87,7 +84,7 @@ void WebApiPrometheusClass::onPrometheusMetrics(AsyncWebServerRequest* request)
request->send(stream); request->send(stream);
} }
void WebApiPrometheusClass::addField(AsyncResponseStream* stream, const char* serial, uint8_t idx, std::shared_ptr<InverterAbstract> inv, uint8_t channel, uint8_t fieldId, const char* channelName) void WebApiPrometheusClass::addField(AsyncResponseStream* stream, String& serial, uint8_t idx, std::shared_ptr<InverterAbstract> inv, uint8_t channel, uint8_t fieldId, const char* channelName)
{ {
if (inv->Statistics()->hasChannelFieldValue(channel, fieldId)) { if (inv->Statistics()->hasChannelFieldValue(channel, fieldId)) {
const char* chanName = (channelName == NULL) ? inv->Statistics()->getChannelFieldName(channel, fieldId) : channelName; const char* chanName = (channelName == NULL) ? inv->Statistics()->getChannelFieldName(channel, fieldId) : channelName;
@ -95,6 +92,6 @@ void WebApiPrometheusClass::addField(AsyncResponseStream* stream, const char* se
stream->printf("# HELP opendtu_%s in %s\n", chanName, inv->Statistics()->getChannelFieldUnit(channel, fieldId)); stream->printf("# HELP opendtu_%s in %s\n", chanName, inv->Statistics()->getChannelFieldUnit(channel, fieldId));
stream->printf("# TYPE opendtu_%s gauge\n", chanName); stream->printf("# TYPE opendtu_%s gauge\n", chanName);
} }
stream->printf("opendtu_%s{serial=\"%s\",unit=\"%d\",name=\"%s\",channel=\"%d\"} %f\n", chanName, serial, idx, inv->name(), channel, inv->Statistics()->getChannelFieldValue(channel, fieldId)); stream->printf("opendtu_%s{serial=\"%s\",unit=\"%d\",name=\"%s\",channel=\"%d\"} %f\n", chanName, serial.c_str(), idx, inv->name(), channel, inv->Statistics()->getChannelFieldValue(channel, fieldId));
} }
} }