From bf5007598ee9b29aec683da9a44325113bf5dc28 Mon Sep 17 00:00:00 2001 From: Julian Gog Date: Mon, 17 Oct 2022 21:11:10 +0200 Subject: [PATCH] add convertToPromUnits funcionality and add promUnits and promType to type and topic --- tools/esp8266/app.cpp | 22 +++++++++++++++++++--- tools/esp8266/app.h | 3 ++- tools/esp8266/web.cpp | 2 +- 3 files changed, 22 insertions(+), 5 deletions(-) diff --git a/tools/esp8266/app.cpp b/tools/esp8266/app.cpp index 7a8f174e..8d20a4ee 100644 --- a/tools/esp8266/app.cpp +++ b/tools/esp8266/app.cpp @@ -575,6 +575,20 @@ String app::getJson(void) { } //----------------------------------------------------------------------------- +std::pair app::convertToPromUnits(String shortUnit) { + + if(shortUnit == "A") return {"amplere", "gauge"}; + if(shortUnit == "V") return {"volts", "gauge"}; + if(shortUnit == "%") return {"ratio", "gauge"}; + if(shortUnit == "W") return {"watts", "gauge"}; + if(shortUnit == "Wh") return {"watts_daily", "counter"}; + if(shortUnit == "kWh") return {"watts_total", "counter"}; + if(shortUnit == "°C") return {"celsius", "gauge"}; + + return {"", "gauge"}; +} + + String app::getMetrics(void) { DPRINTLN(DBG_VERBOSE, F("app::showMetrics")); String metrics; @@ -586,12 +600,14 @@ String app::getMetrics(void) { for(uint8_t id = 0; id < mSys->getNumInverters(); id++) { Inverter<> *iv = mSys->getInverterByPos(id); if(NULL != iv) { - char type[40], topic[60], val[25]; + char type[60], topic[60], val[25]; for(uint8_t i = 0; i < iv->listLen; i++) { uint8_t channel = iv->assign[i].ch; if(channel == 0) { - snprintf(type, 40, "# TYPE ahoy_solar_%s_ gauge", iv->getFieldName(i)); - snprintf(topic, 60, "ahoy_solar_%s_{inverter=\"%s\"}", iv->getFieldName(i), iv->name); + String promUnit, promType; + std::tie(promUnit, promType) = convertToPromUnits( iv->getUnit(i) ); + snprintf(type, 60, "# TYPE ahoy_solar_%s_%s %s", iv->getFieldName(i), promUnit.c_str(), promType.c_str()); + snprintf(topic, 60, "ahoy_solar_%s_%s{inverter=\"%s\"}", iv->getFieldName(i), promUnit.c_str(), iv->name); snprintf(val, 25, "%.3f", iv->getValue(i)); metrics += String(type) + "\n" + String(topic) + " " + String(val) + "\n"; } diff --git a/tools/esp8266/app.h b/tools/esp8266/app.h index bc667b79..fd719d32 100644 --- a/tools/esp8266/app.h +++ b/tools/esp8266/app.h @@ -9,7 +9,6 @@ #include "dbg.h" #include "Arduino.h" - #include #include #include @@ -158,6 +157,8 @@ class app { void processPayload(bool retransmit); void processPayload(bool retransmit, uint8_t cmd); + std::pair convertToPromUnits(String shortUnit); + void sendMqttDiscoveryConfig(void); const char* getFieldDeviceClass(uint8_t fieldId); const char* getFieldStateClass(uint8_t fieldId); diff --git a/tools/esp8266/web.cpp b/tools/esp8266/web.cpp index 082cfe52..5f6c2a38 100644 --- a/tools/esp8266/web.cpp +++ b/tools/esp8266/web.cpp @@ -572,7 +572,7 @@ void web::showJson(void) { //----------------------------------------------------------------------------- void web::showMetrics(void) { DPRINTLN(DBG_VERBOSE, F("web::showMetrics")); - mWeb->send(200, F("application/metrics"), mMain->getMetrics()); + mWeb->send(200, F("text/plain"), mMain->getMetrics()); } //-----------------------------------------------------------------------------