From eb472a6ed2d70213d71968ff6c13922c5771a838 Mon Sep 17 00:00:00 2001 From: Wangchong Zhou Date: Sat, 2 Apr 2022 18:39:26 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=20prometheus?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- include/DC1.h | 1 + src/DC1.cpp | 107 ++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 108 insertions(+) diff --git a/include/DC1.h b/include/DC1.h index 75e46d8..5951d91 100644 --- a/include/DC1.h +++ b/include/DC1.h @@ -63,6 +63,7 @@ class DC1 : public Module void httpDo(ESP8266WebServer *server); void httpSetting(ESP8266WebServer *server); void httpHa(ESP8266WebServer *server); + void httpMetrics(ESP8266WebServer *server); void logoLed(); diff --git a/src/DC1.cpp b/src/DC1.cpp index 0dc065f..4e07993 100644 --- a/src/DC1.cpp +++ b/src/DC1.cpp @@ -255,6 +255,7 @@ void DC1::httpAdd(ESP8266WebServer *server) server->on(F("/dc1_do"), std::bind(&DC1::httpDo, this, server)); server->on(F("/dc1_setting"), std::bind(&DC1::httpSetting, this, server)); server->on(F("/ha"), std::bind(&DC1::httpHa, this, server)); + server->on(F("/metrics"), std::bind(&DC1::httpMetrics, this, server)); #ifdef USE_HOMEKIT server->on(F("/homekit"), std::bind(&homekit_http, server)); #endif @@ -486,6 +487,112 @@ void DC1::httpHa(ESP8266WebServer *server) server->sendContent_P(tmpData); } } + +void DC1::httpMetrics(ESP8266WebServer *server) +{ + server->setContentLength(CONTENT_LENGTH_UNKNOWN); + server->send_P(200, PSTR("text/plain"), ""); + + float apparent_power = cse7766->Energy.apparent_power; + if (isnan(apparent_power)) + { + apparent_power = cse7766->Energy.voltage * cse7766->Energy.current; + } + if (apparent_power < cse7766->Energy.active_power) + { // Should be impossible + cse7766->Energy.active_power = apparent_power; + } + + float power_factor = cse7766->Energy.power_factor; + if (isnan(power_factor)) + { + power_factor = (cse7766->Energy.active_power && apparent_power) ? cse7766->Energy.active_power / apparent_power : 0; + if (power_factor > 1) + { + power_factor = 1; + } + } + + float reactive_power = cse7766->Energy.reactive_power; + if (isnan(reactive_power)) + { + reactive_power = 0; + uint32_t difference = ((uint32_t)(apparent_power * 100) - (uint32_t)(cse7766->Energy.active_power * 100)) / 10; + if ((cse7766->Energy.current > 0.005) && ((difference > 15) || (difference > (uint32_t)(apparent_power * 100 / 1000)))) + { + // calculating reactive power only if current is greater than 0.005A and + // difference between active and apparent power is greater than 1.5W or 1% + reactive_power = (float)(Util::RoundSqrtInt((uint32_t)(apparent_power * apparent_power * 100) - (uint32_t)(cse7766->Energy.active_power * cse7766->Energy.active_power * 100))) / 10; + } + } + + char voltage_chr[16]; + char current_chr[16]; + char active_power_chr[16]; + char apparent_power_chr[16]; + char reactive_power_chr[16]; + char power_factor_chr[16]; + char energy_total_chr[16]; + Util::dtostrfd(cse7766->Energy.voltage, 0, voltage_chr); + Util::dtostrfd(cse7766->Energy.current, 3, current_chr); + Util::dtostrfd(cse7766->Energy.active_power, 0, active_power_chr); + Util::dtostrfd(apparent_power, 0, apparent_power_chr); + Util::dtostrfd(reactive_power, 0, reactive_power_chr); + Util::dtostrfd(power_factor, 2, power_factor_chr); + Util::dtostrfd(cse7766->Energy.total, 3, energy_total_chr); + + snprintf_P(tmpData, sizeof(tmpData), + PSTR("# HELP dc1_voltage DC1 Voltage\n" + "# TYPE dc1_voltage gauge\n" + "dc1_voltage %s\n" + "# HELP dc1_current DC1 Current\n" + "# TYPE dc1_current gauge\n" + "dc1_current %s\n" + "# HELP dc1_power DC1 Power\n" + "# TYPE dc1_power gauge\n" + "dc1_power{type=\"active\"} %s\n" + "dc1_power{type=\"apparent\"} %s\n" + "dc1_power{type=\"reactive\"} %s\n" + ), + voltage_chr, current_chr, + active_power_chr, apparent_power_chr, reactive_power_chr); + server->sendContent_P(tmpData); + + snprintf_P(tmpData, sizeof(tmpData), + PSTR("# HELP dc1_power_factor DC1 Power factor\n" + "# TYPE dc1_power_factor gauge\n" + "dc1_power_factor %s\n" + "# HELP dc1_energe DC1 Energe total\n" + "# TYPE dc1_energe counter\n" + "dc1_energe %s\n" + "# HELP dc1_relay_state DC1 Relay state\n" + "# TYPE dc1_relay_state gauge\n" + ), + power_factor_chr, energy_total_chr); + server->sendContent_P(tmpData); + + for (size_t ch = 0; ch < channels; ch++) + { + snprintf_P(tmpData, sizeof(tmpData), + PSTR("dc1_relay_state{relay=\"%d\"} %d\n"), + ch, bitRead(lastState, ch) ? 1 : 0); + server->sendContent_P(tmpData); + } + + snprintf_P(tmpData, sizeof(tmpData), + PSTR("# HELP dc1_uptime DC1 Uptime in ms\n" + "# TYPE dc1_uptime gauge\n" + "dc1_uptime %d\n" + "# HELP dc1_free_mem DC1 Free memory in KB\n" + "# TYPE dc1_free_mem gauge\n" + "dc1_free_mem %d\n" + "# HELP rssi DC1 RSSI\n" + "# TYPE rssi gauge\n" + "rssi %d\n" + ), + millis(), ESP.getFreeHeap() / 1024, WiFi.RSSI() * 100); + server->sendContent_P(tmpData); +} #pragma endregion void DC1::logoLed() From 117c7d3e8bb709de468a3a7c49951fa75018b99b Mon Sep 17 00:00:00 2001 From: Wangchong Zhou Date: Tue, 23 Apr 2024 16:08:43 +0800 Subject: [PATCH 2/2] disable config write to flash --- src/DC1.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/DC1.cpp b/src/DC1.cpp index 4e07993..65df618 100644 --- a/src/DC1.cpp +++ b/src/DC1.cpp @@ -669,7 +669,7 @@ void DC1::switchRelay(uint8_t ch, bool isOn, bool isSave) { bitWrite(config.last_state, ch, isOn); bitSet(operationFlag, 1); - Config::delaySaveConfig(10); + // Config::delaySaveConfig(10); } if (ch == 0) @@ -756,7 +756,7 @@ void DC1::energyUpdate() config.energy_kWhdoy = Rtc::rtcTime.day_of_year; config.energy_kWhyesterday = config.energy_kWhtoday; config.energy_kWhtoday = 0; - Config::saveConfig(); + //Config::saveConfig(); cse7766->Energy.daily = (float)(config.energy_kWhtoday + cse7766->Energy.kWhtoday) / 100000; cse7766->Energy.total = (float)(config.energy_kWhtotal + cse7766->Energy.kWhtoday) / 100000; @@ -768,7 +768,7 @@ void DC1::energyUpdate() if (perSecond % 301 == 0 && cse7766->Energy.kWhtoday > 0) { energySync(); - Config::saveConfig(); + //Config::saveConfig(); } energyMarginCheck(); } @@ -806,7 +806,7 @@ void DC1::energyClear() cse7766->Energy.kWhtoday_delta = 0; energyInit(); - Config::saveConfig(); + //Config::saveConfig(); } void DC1::energyUpdateToday()