From ced7051ce75ca430e046b6844e2fab3f55a6ac86 Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Mon, 16 Feb 2026 12:05:45 +0100 Subject: [PATCH] add prometheus metrics for temperaturesensors --- CHANGELOG_LATEST.md | 1 + src/core/temperaturesensor.cpp | 24 ++++++++++++++++++++++++ src/core/temperaturesensor.h | 2 ++ 3 files changed, 27 insertions(+) diff --git a/CHANGELOG_LATEST.md b/CHANGELOG_LATEST.md index c537e0dc4..626529fca 100644 --- a/CHANGELOG_LATEST.md +++ b/CHANGELOG_LATEST.md @@ -9,6 +9,7 @@ For more details go to [emsesp.org](https://emsesp.org/). - comfortpoint for BC400 [#2935](https://github.com/emsesp/EMS-ESP32/issues/2935) - customize device brand [#2784](https://github.com/emsesp/EMS-ESP32/issues/2784) - set model for ems-esp devices temperature, analog, etc. [#2958](https://github.com/emsesp/EMS-ESP32/discussions/2958) +- prometheus metrics for temperaturesensors [#2962](https://github.com/emsesp/EMS-ESP32/issues/2962) ## Fixed diff --git a/src/core/temperaturesensor.cpp b/src/core/temperaturesensor.cpp index 83624450b..afcfb4673 100644 --- a/src/core/temperaturesensor.cpp +++ b/src/core/temperaturesensor.cpp @@ -400,6 +400,15 @@ bool TemperatureSensor::get_value_info(JsonObject output, const char * cmd, cons return true; } + if (!strcmp(cmd, F_(metrics))) { + std::string metrics = get_metrics_prometheus(); + if (!metrics.empty()) { + output["api_data"] = metrics; + return true; + } + return false; + } + // this is for a specific sensor const char * attribute_s = Command::get_attribute(cmd); @@ -414,6 +423,21 @@ bool TemperatureSensor::get_value_info(JsonObject output, const char * cmd, cons return false; // not found } +// generate Prometheus metrics format from temperature values +std::string TemperatureSensor::get_metrics_prometheus() { + std::string result; + result.reserve(sensors_.size() * 120); + char val[10]; + for (auto & sensor : sensors_) { + result += (std::string) "# HELP emsesp_" + sensor.name() + " " + sensor.name() + ", " + + EMSdevice::uom_to_string(EMSESP::system_.fahrenheit() ? DeviceValueUOM::FAHRENHEIT : DeviceValueUOM::DEGREES) + ", readable, visible\n"; + result += (std::string) "# TYPE emsesp_" + sensor.name() + " gauge\n"; + result += + (std::string) "emsesp_" + sensor.name() + " " + Helpers::render_value(val, sensor.temperature_c, 10, EMSESP::system_.fahrenheit() ? 2 : 0) + "\n"; + } + return result; +} + // note we don't add the device and state classes here, as we do in the custom entity service void TemperatureSensor::get_value_json(JsonObject output, const Sensor & sensor) { output["id"] = sensor.id(); diff --git a/src/core/temperaturesensor.h b/src/core/temperaturesensor.h index 14c53a5e5..a4aa63dfe 100644 --- a/src/core/temperaturesensor.h +++ b/src/core/temperaturesensor.h @@ -96,6 +96,8 @@ class TemperatureSensor { bool updated_values(); bool get_value_info(JsonObject output, const char * cmd, const int8_t id = -1); + std::string get_metrics_prometheus(); + // return back reference to the sensor list, used by other classes std::vector> sensors() const { return sensors_;