1
0
mirror of https://github.com/esphome/esphome.git synced 2025-10-07 04:13:47 +01:00

fix compat

This commit is contained in:
J. Nick Koston
2025-10-03 07:36:23 -05:00
parent 0388dad588
commit fddeb482b5
5 changed files with 291 additions and 285 deletions

View File

@@ -11,14 +11,14 @@ namespace captive_portal {
static const char *const TAG = "captive_portal"; static const char *const TAG = "captive_portal";
void CaptivePortal::handle_config(AsyncWebServerRequest *request) { void CaptivePortal::handle_config(AsyncWebServerRequest *request) {
AsyncResponseStream *stream = request->beginResponseStream(F("application/json")); AsyncResponseStream *stream = request->beginResponseStream(ESPHOME_F("application/json"));
stream->addHeader(F("cache-control"), F("public, max-age=0, must-revalidate")); stream->addHeader(ESPHOME_F("cache-control"), ESPHOME_F("public, max-age=0, must-revalidate"));
#ifdef USE_ESP8266 #ifdef USE_ESP8266
stream->print(F("{\"mac\":\"")); stream->print(ESPHOME_F("{\"mac\":\""));
stream->print(get_mac_address_pretty().c_str()); stream->print(get_mac_address_pretty().c_str());
stream->print(F("\",\"name\":\"")); stream->print(ESPHOME_F("\",\"name\":\""));
stream->print(App.get_name().c_str()); stream->print(App.get_name().c_str());
stream->print(F("\",\"aps\":[{}")); stream->print(ESPHOME_F("\",\"aps\":[{}"));
#else #else
stream->printf(R"({"mac":"%s","name":"%s","aps":[{})", get_mac_address_pretty().c_str(), App.get_name().c_str()); stream->printf(R"({"mac":"%s","name":"%s","aps":[{})", get_mac_address_pretty().c_str(), App.get_name().c_str());
#endif #endif
@@ -29,19 +29,19 @@ void CaptivePortal::handle_config(AsyncWebServerRequest *request) {
// Assumes no " in ssid, possible unicode isses? // Assumes no " in ssid, possible unicode isses?
#ifdef USE_ESP8266 #ifdef USE_ESP8266
stream->print(F(",{\"ssid\":\"")); stream->print(ESPHOME_F(",{\"ssid\":\""));
stream->print(scan.get_ssid().c_str()); stream->print(scan.get_ssid().c_str());
stream->print(F("\",\"rssi\":")); stream->print(ESPHOME_F("\",\"rssi\":"));
stream->print(scan.get_rssi()); stream->print(scan.get_rssi());
stream->print(F(",\"lock\":")); stream->print(ESPHOME_F(",\"lock\":"));
stream->print(scan.get_with_auth()); stream->print(scan.get_with_auth());
stream->print(F("}")); stream->print(ESPHOME_F("}"));
#else #else
stream->printf(R"(,{"ssid":"%s","rssi":%d,"lock":%d})", scan.get_ssid().c_str(), scan.get_rssi(), stream->printf(R"(,{"ssid":"%s","rssi":%d,"lock":%d})", scan.get_ssid().c_str(), scan.get_rssi(),
scan.get_with_auth()); scan.get_with_auth());
#endif #endif
} }
stream->print(F("]}")); stream->print(ESPHOME_F("]}"));
request->send(stream); request->send(stream);
} }
void CaptivePortal::handle_wifisave(AsyncWebServerRequest *request) { void CaptivePortal::handle_wifisave(AsyncWebServerRequest *request) {
@@ -52,7 +52,7 @@ void CaptivePortal::handle_wifisave(AsyncWebServerRequest *request) {
ESP_LOGI(TAG, " Password=" LOG_SECRET("'%s'"), psk.c_str()); ESP_LOGI(TAG, " Password=" LOG_SECRET("'%s'"), psk.c_str());
wifi::global_wifi_component->save_wifi_sta(ssid, psk); wifi::global_wifi_component->save_wifi_sta(ssid, psk);
wifi::global_wifi_component->start_scanning(); wifi::global_wifi_component->start_scanning();
request->redirect(F("/?save")); request->redirect(ESPHOME_F("/?save"));
} }
void CaptivePortal::setup() { void CaptivePortal::setup() {
@@ -75,7 +75,7 @@ void CaptivePortal::start() {
#ifdef USE_ARDUINO #ifdef USE_ARDUINO
this->dns_server_ = make_unique<DNSServer>(); this->dns_server_ = make_unique<DNSServer>();
this->dns_server_->setErrorReplyCode(DNSReplyCode::NoError); this->dns_server_->setErrorReplyCode(DNSReplyCode::NoError);
this->dns_server_->start(53, F("*"), ip); this->dns_server_->start(53, ESPHOME_F("*"), ip);
#endif #endif
this->initialized_ = true; this->initialized_ = true;
@@ -88,10 +88,10 @@ void CaptivePortal::start() {
} }
void CaptivePortal::handleRequest(AsyncWebServerRequest *req) { void CaptivePortal::handleRequest(AsyncWebServerRequest *req) {
if (req->url() == F("/config.json")) { if (req->url() == ESPHOME_F("/config.json")) {
this->handle_config(req); this->handle_config(req);
return; return;
} else if (req->url() == F("/wifisave")) { } else if (req->url() == ESPHOME_F("/wifisave")) {
this->handle_wifisave(req); this->handle_wifisave(req);
return; return;
} }
@@ -100,11 +100,11 @@ void CaptivePortal::handleRequest(AsyncWebServerRequest *req) {
// This includes OS captive portal detection endpoints which will trigger // This includes OS captive portal detection endpoints which will trigger
// the captive portal when they don't receive their expected responses // the captive portal when they don't receive their expected responses
#ifndef USE_ESP8266 #ifndef USE_ESP8266
auto *response = req->beginResponse(200, F("text/html"), INDEX_GZ, sizeof(INDEX_GZ)); auto *response = req->beginResponse(200, ESPHOME_F("text/html"), INDEX_GZ, sizeof(INDEX_GZ));
#else #else
auto *response = req->beginResponse_P(200, F("text/html"), INDEX_GZ, sizeof(INDEX_GZ)); auto *response = req->beginResponse_P(200, ESPHOME_F("text/html"), INDEX_GZ, sizeof(INDEX_GZ));
#endif #endif
response->addHeader(F("Content-Encoding"), F("gzip")); response->addHeader(ESPHOME_F("Content-Encoding"), ESPHOME_F("gzip"));
req->send(response); req->send(response);
} }

View File

@@ -110,21 +110,21 @@ std::string PrometheusHandler::relabel_name_(EntityBase *obj) {
void PrometheusHandler::add_area_label_(AsyncResponseStream *stream, std::string &area) { void PrometheusHandler::add_area_label_(AsyncResponseStream *stream, std::string &area) {
if (!area.empty()) { if (!area.empty()) {
stream->print(F("\",area=\"")); stream->print(ESPHOME_F("\",area=\""));
stream->print(area.c_str()); stream->print(area.c_str());
} }
} }
void PrometheusHandler::add_node_label_(AsyncResponseStream *stream, std::string &node) { void PrometheusHandler::add_node_label_(AsyncResponseStream *stream, std::string &node) {
if (!node.empty()) { if (!node.empty()) {
stream->print(F("\",node=\"")); stream->print(ESPHOME_F("\",node=\""));
stream->print(node.c_str()); stream->print(node.c_str());
} }
} }
void PrometheusHandler::add_friendly_name_label_(AsyncResponseStream *stream, std::string &friendly_name) { void PrometheusHandler::add_friendly_name_label_(AsyncResponseStream *stream, std::string &friendly_name) {
if (!friendly_name.empty()) { if (!friendly_name.empty()) {
stream->print(F("\",friendly_name=\"")); stream->print(ESPHOME_F("\",friendly_name=\""));
stream->print(friendly_name.c_str()); stream->print(friendly_name.c_str());
} }
} }
@@ -132,8 +132,8 @@ void PrometheusHandler::add_friendly_name_label_(AsyncResponseStream *stream, st
// Type-specific implementation // Type-specific implementation
#ifdef USE_SENSOR #ifdef USE_SENSOR
void PrometheusHandler::sensor_type_(AsyncResponseStream *stream) { void PrometheusHandler::sensor_type_(AsyncResponseStream *stream) {
stream->print(F("#TYPE esphome_sensor_value gauge\n")); stream->print(ESPHOME_F("#TYPE esphome_sensor_value gauge\n"));
stream->print(F("#TYPE esphome_sensor_failed gauge\n")); stream->print(ESPHOME_F("#TYPE esphome_sensor_failed gauge\n"));
} }
void PrometheusHandler::sensor_row_(AsyncResponseStream *stream, sensor::Sensor *obj, std::string &area, void PrometheusHandler::sensor_row_(AsyncResponseStream *stream, sensor::Sensor *obj, std::string &area,
std::string &node, std::string &friendly_name) { std::string &node, std::string &friendly_name) {
@@ -141,37 +141,37 @@ void PrometheusHandler::sensor_row_(AsyncResponseStream *stream, sensor::Sensor
return; return;
if (!std::isnan(obj->state)) { if (!std::isnan(obj->state)) {
// We have a valid value, output this value // We have a valid value, output this value
stream->print(F("esphome_sensor_failed{id=\"")); stream->print(ESPHOME_F("esphome_sensor_failed{id=\""));
stream->print(relabel_id_(obj).c_str()); stream->print(relabel_id_(obj).c_str());
add_area_label_(stream, area); add_area_label_(stream, area);
add_node_label_(stream, node); add_node_label_(stream, node);
add_friendly_name_label_(stream, friendly_name); add_friendly_name_label_(stream, friendly_name);
stream->print(F("\",name=\"")); stream->print(ESPHOME_F("\",name=\""));
stream->print(relabel_name_(obj).c_str()); stream->print(relabel_name_(obj).c_str());
stream->print(F("\"} 0\n")); stream->print(ESPHOME_F("\"} 0\n"));
// Data itself // Data itself
stream->print(F("esphome_sensor_value{id=\"")); stream->print(ESPHOME_F("esphome_sensor_value{id=\""));
stream->print(relabel_id_(obj).c_str()); stream->print(relabel_id_(obj).c_str());
add_area_label_(stream, area); add_area_label_(stream, area);
add_node_label_(stream, node); add_node_label_(stream, node);
add_friendly_name_label_(stream, friendly_name); add_friendly_name_label_(stream, friendly_name);
stream->print(F("\",name=\"")); stream->print(ESPHOME_F("\",name=\""));
stream->print(relabel_name_(obj).c_str()); stream->print(relabel_name_(obj).c_str());
stream->print(F("\",unit=\"")); stream->print(ESPHOME_F("\",unit=\""));
stream->print(obj->get_unit_of_measurement().c_str()); stream->print(obj->get_unit_of_measurement().c_str());
stream->print(F("\"} ")); stream->print(ESPHOME_F("\"} "));
stream->print(value_accuracy_to_string(obj->state, obj->get_accuracy_decimals()).c_str()); stream->print(value_accuracy_to_string(obj->state, obj->get_accuracy_decimals()).c_str());
stream->print(F("\n")); stream->print(ESPHOME_F("\n"));
} else { } else {
// Invalid state // Invalid state
stream->print(F("esphome_sensor_failed{id=\"")); stream->print(ESPHOME_F("esphome_sensor_failed{id=\""));
stream->print(relabel_id_(obj).c_str()); stream->print(relabel_id_(obj).c_str());
add_area_label_(stream, area); add_area_label_(stream, area);
add_node_label_(stream, node); add_node_label_(stream, node);
add_friendly_name_label_(stream, friendly_name); add_friendly_name_label_(stream, friendly_name);
stream->print(F("\",name=\"")); stream->print(ESPHOME_F("\",name=\""));
stream->print(relabel_name_(obj).c_str()); stream->print(relabel_name_(obj).c_str());
stream->print(F("\"} 1\n")); stream->print(ESPHOME_F("\"} 1\n"));
} }
} }
#endif #endif
@@ -179,8 +179,8 @@ void PrometheusHandler::sensor_row_(AsyncResponseStream *stream, sensor::Sensor
// Type-specific implementation // Type-specific implementation
#ifdef USE_BINARY_SENSOR #ifdef USE_BINARY_SENSOR
void PrometheusHandler::binary_sensor_type_(AsyncResponseStream *stream) { void PrometheusHandler::binary_sensor_type_(AsyncResponseStream *stream) {
stream->print(F("#TYPE esphome_binary_sensor_value gauge\n")); stream->print(ESPHOME_F("#TYPE esphome_binary_sensor_value gauge\n"));
stream->print(F("#TYPE esphome_binary_sensor_failed gauge\n")); stream->print(ESPHOME_F("#TYPE esphome_binary_sensor_failed gauge\n"));
} }
void PrometheusHandler::binary_sensor_row_(AsyncResponseStream *stream, binary_sensor::BinarySensor *obj, void PrometheusHandler::binary_sensor_row_(AsyncResponseStream *stream, binary_sensor::BinarySensor *obj,
std::string &area, std::string &node, std::string &friendly_name) { std::string &area, std::string &node, std::string &friendly_name) {
@@ -188,204 +188,204 @@ void PrometheusHandler::binary_sensor_row_(AsyncResponseStream *stream, binary_s
return; return;
if (obj->has_state()) { if (obj->has_state()) {
// We have a valid value, output this value // We have a valid value, output this value
stream->print(F("esphome_binary_sensor_failed{id=\"")); stream->print(ESPHOME_F("esphome_binary_sensor_failed{id=\""));
stream->print(relabel_id_(obj).c_str()); stream->print(relabel_id_(obj).c_str());
add_area_label_(stream, area); add_area_label_(stream, area);
add_node_label_(stream, node); add_node_label_(stream, node);
add_friendly_name_label_(stream, friendly_name); add_friendly_name_label_(stream, friendly_name);
stream->print(F("\",name=\"")); stream->print(ESPHOME_F("\",name=\""));
stream->print(relabel_name_(obj).c_str()); stream->print(relabel_name_(obj).c_str());
stream->print(F("\"} 0\n")); stream->print(ESPHOME_F("\"} 0\n"));
// Data itself // Data itself
stream->print(F("esphome_binary_sensor_value{id=\"")); stream->print(ESPHOME_F("esphome_binary_sensor_value{id=\""));
stream->print(relabel_id_(obj).c_str()); stream->print(relabel_id_(obj).c_str());
add_area_label_(stream, area); add_area_label_(stream, area);
add_node_label_(stream, node); add_node_label_(stream, node);
add_friendly_name_label_(stream, friendly_name); add_friendly_name_label_(stream, friendly_name);
stream->print(F("\",name=\"")); stream->print(ESPHOME_F("\",name=\""));
stream->print(relabel_name_(obj).c_str()); stream->print(relabel_name_(obj).c_str());
stream->print(F("\"} ")); stream->print(ESPHOME_F("\"} "));
stream->print(obj->state); stream->print(obj->state);
stream->print(F("\n")); stream->print(ESPHOME_F("\n"));
} else { } else {
// Invalid state // Invalid state
stream->print(F("esphome_binary_sensor_failed{id=\"")); stream->print(ESPHOME_F("esphome_binary_sensor_failed{id=\""));
stream->print(relabel_id_(obj).c_str()); stream->print(relabel_id_(obj).c_str());
add_area_label_(stream, area); add_area_label_(stream, area);
add_node_label_(stream, node); add_node_label_(stream, node);
add_friendly_name_label_(stream, friendly_name); add_friendly_name_label_(stream, friendly_name);
stream->print(F("\",name=\"")); stream->print(ESPHOME_F("\",name=\""));
stream->print(relabel_name_(obj).c_str()); stream->print(relabel_name_(obj).c_str());
stream->print(F("\"} 1\n")); stream->print(ESPHOME_F("\"} 1\n"));
} }
} }
#endif #endif
#ifdef USE_FAN #ifdef USE_FAN
void PrometheusHandler::fan_type_(AsyncResponseStream *stream) { void PrometheusHandler::fan_type_(AsyncResponseStream *stream) {
stream->print(F("#TYPE esphome_fan_value gauge\n")); stream->print(ESPHOME_F("#TYPE esphome_fan_value gauge\n"));
stream->print(F("#TYPE esphome_fan_failed gauge\n")); stream->print(ESPHOME_F("#TYPE esphome_fan_failed gauge\n"));
stream->print(F("#TYPE esphome_fan_speed gauge\n")); stream->print(ESPHOME_F("#TYPE esphome_fan_speed gauge\n"));
stream->print(F("#TYPE esphome_fan_oscillation gauge\n")); stream->print(ESPHOME_F("#TYPE esphome_fan_oscillation gauge\n"));
} }
void PrometheusHandler::fan_row_(AsyncResponseStream *stream, fan::Fan *obj, std::string &area, std::string &node, void PrometheusHandler::fan_row_(AsyncResponseStream *stream, fan::Fan *obj, std::string &area, std::string &node,
std::string &friendly_name) { std::string &friendly_name) {
if (obj->is_internal() && !this->include_internal_) if (obj->is_internal() && !this->include_internal_)
return; return;
stream->print(F("esphome_fan_failed{id=\"")); stream->print(ESPHOME_F("esphome_fan_failed{id=\""));
stream->print(relabel_id_(obj).c_str()); stream->print(relabel_id_(obj).c_str());
add_area_label_(stream, area); add_area_label_(stream, area);
add_node_label_(stream, node); add_node_label_(stream, node);
add_friendly_name_label_(stream, friendly_name); add_friendly_name_label_(stream, friendly_name);
stream->print(F("\",name=\"")); stream->print(ESPHOME_F("\",name=\""));
stream->print(relabel_name_(obj).c_str()); stream->print(relabel_name_(obj).c_str());
stream->print(F("\"} 0\n")); stream->print(ESPHOME_F("\"} 0\n"));
// Data itself // Data itself
stream->print(F("esphome_fan_value{id=\"")); stream->print(ESPHOME_F("esphome_fan_value{id=\""));
stream->print(relabel_id_(obj).c_str()); stream->print(relabel_id_(obj).c_str());
add_area_label_(stream, area); add_area_label_(stream, area);
add_node_label_(stream, node); add_node_label_(stream, node);
add_friendly_name_label_(stream, friendly_name); add_friendly_name_label_(stream, friendly_name);
stream->print(F("\",name=\"")); stream->print(ESPHOME_F("\",name=\""));
stream->print(relabel_name_(obj).c_str()); stream->print(relabel_name_(obj).c_str());
stream->print(F("\"} ")); stream->print(ESPHOME_F("\"} "));
stream->print(obj->state); stream->print(obj->state);
stream->print(F("\n")); stream->print(ESPHOME_F("\n"));
// Speed if available // Speed if available
if (obj->get_traits().supports_speed()) { if (obj->get_traits().supports_speed()) {
stream->print(F("esphome_fan_speed{id=\"")); stream->print(ESPHOME_F("esphome_fan_speed{id=\""));
stream->print(relabel_id_(obj).c_str()); stream->print(relabel_id_(obj).c_str());
add_area_label_(stream, area); add_area_label_(stream, area);
add_node_label_(stream, node); add_node_label_(stream, node);
add_friendly_name_label_(stream, friendly_name); add_friendly_name_label_(stream, friendly_name);
stream->print(F("\",name=\"")); stream->print(ESPHOME_F("\",name=\""));
stream->print(relabel_name_(obj).c_str()); stream->print(relabel_name_(obj).c_str());
stream->print(F("\"} ")); stream->print(ESPHOME_F("\"} "));
stream->print(obj->speed); stream->print(obj->speed);
stream->print(F("\n")); stream->print(ESPHOME_F("\n"));
} }
// Oscillation if available // Oscillation if available
if (obj->get_traits().supports_oscillation()) { if (obj->get_traits().supports_oscillation()) {
stream->print(F("esphome_fan_oscillation{id=\"")); stream->print(ESPHOME_F("esphome_fan_oscillation{id=\""));
stream->print(relabel_id_(obj).c_str()); stream->print(relabel_id_(obj).c_str());
add_area_label_(stream, area); add_area_label_(stream, area);
add_node_label_(stream, node); add_node_label_(stream, node);
add_friendly_name_label_(stream, friendly_name); add_friendly_name_label_(stream, friendly_name);
stream->print(F("\",name=\"")); stream->print(ESPHOME_F("\",name=\""));
stream->print(relabel_name_(obj).c_str()); stream->print(relabel_name_(obj).c_str());
stream->print(F("\"} ")); stream->print(ESPHOME_F("\"} "));
stream->print(obj->oscillating); stream->print(obj->oscillating);
stream->print(F("\n")); stream->print(ESPHOME_F("\n"));
} }
} }
#endif #endif
#ifdef USE_LIGHT #ifdef USE_LIGHT
void PrometheusHandler::light_type_(AsyncResponseStream *stream) { void PrometheusHandler::light_type_(AsyncResponseStream *stream) {
stream->print(F("#TYPE esphome_light_state gauge\n")); stream->print(ESPHOME_F("#TYPE esphome_light_state gauge\n"));
stream->print(F("#TYPE esphome_light_color gauge\n")); stream->print(ESPHOME_F("#TYPE esphome_light_color gauge\n"));
stream->print(F("#TYPE esphome_light_effect_active gauge\n")); stream->print(ESPHOME_F("#TYPE esphome_light_effect_active gauge\n"));
} }
void PrometheusHandler::light_row_(AsyncResponseStream *stream, light::LightState *obj, std::string &area, void PrometheusHandler::light_row_(AsyncResponseStream *stream, light::LightState *obj, std::string &area,
std::string &node, std::string &friendly_name) { std::string &node, std::string &friendly_name) {
if (obj->is_internal() && !this->include_internal_) if (obj->is_internal() && !this->include_internal_)
return; return;
// State // State
stream->print(F("esphome_light_state{id=\"")); stream->print(ESPHOME_F("esphome_light_state{id=\""));
stream->print(relabel_id_(obj).c_str()); stream->print(relabel_id_(obj).c_str());
add_area_label_(stream, area); add_area_label_(stream, area);
add_node_label_(stream, node); add_node_label_(stream, node);
add_friendly_name_label_(stream, friendly_name); add_friendly_name_label_(stream, friendly_name);
stream->print(F("\",name=\"")); stream->print(ESPHOME_F("\",name=\""));
stream->print(relabel_name_(obj).c_str()); stream->print(relabel_name_(obj).c_str());
stream->print(F("\"} ")); stream->print(ESPHOME_F("\"} "));
stream->print(obj->remote_values.is_on()); stream->print(obj->remote_values.is_on());
stream->print(F("\n")); stream->print(ESPHOME_F("\n"));
// Brightness and RGBW // Brightness and RGBW
light::LightColorValues color = obj->current_values; light::LightColorValues color = obj->current_values;
float brightness, r, g, b, w; float brightness, r, g, b, w;
color.as_brightness(&brightness); color.as_brightness(&brightness);
color.as_rgbw(&r, &g, &b, &w); color.as_rgbw(&r, &g, &b, &w);
stream->print(F("esphome_light_color{id=\"")); stream->print(ESPHOME_F("esphome_light_color{id=\""));
stream->print(relabel_id_(obj).c_str()); stream->print(relabel_id_(obj).c_str());
add_area_label_(stream, area); add_area_label_(stream, area);
add_node_label_(stream, node); add_node_label_(stream, node);
add_friendly_name_label_(stream, friendly_name); add_friendly_name_label_(stream, friendly_name);
stream->print(F("\",name=\"")); stream->print(ESPHOME_F("\",name=\""));
stream->print(relabel_name_(obj).c_str()); stream->print(relabel_name_(obj).c_str());
stream->print(F("\",channel=\"brightness\"} ")); stream->print(ESPHOME_F("\",channel=\"brightness\"} "));
stream->print(brightness); stream->print(brightness);
stream->print(F("\n")); stream->print(ESPHOME_F("\n"));
stream->print(F("esphome_light_color{id=\"")); stream->print(ESPHOME_F("esphome_light_color{id=\""));
stream->print(relabel_id_(obj).c_str()); stream->print(relabel_id_(obj).c_str());
add_area_label_(stream, area); add_area_label_(stream, area);
add_node_label_(stream, node); add_node_label_(stream, node);
add_friendly_name_label_(stream, friendly_name); add_friendly_name_label_(stream, friendly_name);
stream->print(F("\",name=\"")); stream->print(ESPHOME_F("\",name=\""));
stream->print(relabel_name_(obj).c_str()); stream->print(relabel_name_(obj).c_str());
stream->print(F("\",channel=\"r\"} ")); stream->print(ESPHOME_F("\",channel=\"r\"} "));
stream->print(r); stream->print(r);
stream->print(F("\n")); stream->print(ESPHOME_F("\n"));
stream->print(F("esphome_light_color{id=\"")); stream->print(ESPHOME_F("esphome_light_color{id=\""));
stream->print(relabel_id_(obj).c_str()); stream->print(relabel_id_(obj).c_str());
add_area_label_(stream, area); add_area_label_(stream, area);
add_node_label_(stream, node); add_node_label_(stream, node);
add_friendly_name_label_(stream, friendly_name); add_friendly_name_label_(stream, friendly_name);
stream->print(F("\",name=\"")); stream->print(ESPHOME_F("\",name=\""));
stream->print(relabel_name_(obj).c_str()); stream->print(relabel_name_(obj).c_str());
stream->print(F("\",channel=\"g\"} ")); stream->print(ESPHOME_F("\",channel=\"g\"} "));
stream->print(g); stream->print(g);
stream->print(F("\n")); stream->print(ESPHOME_F("\n"));
stream->print(F("esphome_light_color{id=\"")); stream->print(ESPHOME_F("esphome_light_color{id=\""));
stream->print(relabel_id_(obj).c_str()); stream->print(relabel_id_(obj).c_str());
add_area_label_(stream, area); add_area_label_(stream, area);
add_node_label_(stream, node); add_node_label_(stream, node);
add_friendly_name_label_(stream, friendly_name); add_friendly_name_label_(stream, friendly_name);
stream->print(F("\",name=\"")); stream->print(ESPHOME_F("\",name=\""));
stream->print(relabel_name_(obj).c_str()); stream->print(relabel_name_(obj).c_str());
stream->print(F("\",channel=\"b\"} ")); stream->print(ESPHOME_F("\",channel=\"b\"} "));
stream->print(b); stream->print(b);
stream->print(F("\n")); stream->print(ESPHOME_F("\n"));
stream->print(F("esphome_light_color{id=\"")); stream->print(ESPHOME_F("esphome_light_color{id=\""));
stream->print(relabel_id_(obj).c_str()); stream->print(relabel_id_(obj).c_str());
add_area_label_(stream, area); add_area_label_(stream, area);
add_node_label_(stream, node); add_node_label_(stream, node);
add_friendly_name_label_(stream, friendly_name); add_friendly_name_label_(stream, friendly_name);
stream->print(F("\",name=\"")); stream->print(ESPHOME_F("\",name=\""));
stream->print(relabel_name_(obj).c_str()); stream->print(relabel_name_(obj).c_str());
stream->print(F("\",channel=\"w\"} ")); stream->print(ESPHOME_F("\",channel=\"w\"} "));
stream->print(w); stream->print(w);
stream->print(F("\n")); stream->print(ESPHOME_F("\n"));
// Effect // Effect
std::string effect = obj->get_effect_name(); std::string effect = obj->get_effect_name();
if (effect == "None") { if (effect == "None") {
stream->print(F("esphome_light_effect_active{id=\"")); stream->print(ESPHOME_F("esphome_light_effect_active{id=\""));
stream->print(relabel_id_(obj).c_str()); stream->print(relabel_id_(obj).c_str());
add_area_label_(stream, area); add_area_label_(stream, area);
add_node_label_(stream, node); add_node_label_(stream, node);
add_friendly_name_label_(stream, friendly_name); add_friendly_name_label_(stream, friendly_name);
stream->print(F("\",name=\"")); stream->print(ESPHOME_F("\",name=\""));
stream->print(relabel_name_(obj).c_str()); stream->print(relabel_name_(obj).c_str());
stream->print(F("\",effect=\"None\"} 0\n")); stream->print(ESPHOME_F("\",effect=\"None\"} 0\n"));
} else { } else {
stream->print(F("esphome_light_effect_active{id=\"")); stream->print(ESPHOME_F("esphome_light_effect_active{id=\""));
stream->print(relabel_id_(obj).c_str()); stream->print(relabel_id_(obj).c_str());
add_area_label_(stream, area); add_area_label_(stream, area);
add_node_label_(stream, node); add_node_label_(stream, node);
add_friendly_name_label_(stream, friendly_name); add_friendly_name_label_(stream, friendly_name);
stream->print(F("\",name=\"")); stream->print(ESPHOME_F("\",name=\""));
stream->print(relabel_name_(obj).c_str()); stream->print(relabel_name_(obj).c_str());
stream->print(F("\",effect=\"")); stream->print(ESPHOME_F("\",effect=\""));
stream->print(effect.c_str()); stream->print(effect.c_str());
stream->print(F("\"} 1\n")); stream->print(ESPHOME_F("\"} 1\n"));
} }
} }
#endif #endif
#ifdef USE_COVER #ifdef USE_COVER
void PrometheusHandler::cover_type_(AsyncResponseStream *stream) { void PrometheusHandler::cover_type_(AsyncResponseStream *stream) {
stream->print(F("#TYPE esphome_cover_value gauge\n")); stream->print(ESPHOME_F("#TYPE esphome_cover_value gauge\n"));
stream->print(F("#TYPE esphome_cover_failed gauge\n")); stream->print(ESPHOME_F("#TYPE esphome_cover_failed gauge\n"));
} }
void PrometheusHandler::cover_row_(AsyncResponseStream *stream, cover::Cover *obj, std::string &area, std::string &node, void PrometheusHandler::cover_row_(AsyncResponseStream *stream, cover::Cover *obj, std::string &area, std::string &node,
std::string &friendly_name) { std::string &friendly_name) {
@@ -393,118 +393,118 @@ void PrometheusHandler::cover_row_(AsyncResponseStream *stream, cover::Cover *ob
return; return;
if (!std::isnan(obj->position)) { if (!std::isnan(obj->position)) {
// We have a valid value, output this value // We have a valid value, output this value
stream->print(F("esphome_cover_failed{id=\"")); stream->print(ESPHOME_F("esphome_cover_failed{id=\""));
stream->print(relabel_id_(obj).c_str()); stream->print(relabel_id_(obj).c_str());
add_area_label_(stream, area); add_area_label_(stream, area);
add_node_label_(stream, node); add_node_label_(stream, node);
add_friendly_name_label_(stream, friendly_name); add_friendly_name_label_(stream, friendly_name);
stream->print(F("\",name=\"")); stream->print(ESPHOME_F("\",name=\""));
stream->print(relabel_name_(obj).c_str()); stream->print(relabel_name_(obj).c_str());
stream->print(F("\"} 0\n")); stream->print(ESPHOME_F("\"} 0\n"));
// Data itself // Data itself
stream->print(F("esphome_cover_value{id=\"")); stream->print(ESPHOME_F("esphome_cover_value{id=\""));
stream->print(relabel_id_(obj).c_str()); stream->print(relabel_id_(obj).c_str());
add_area_label_(stream, area); add_area_label_(stream, area);
add_node_label_(stream, node); add_node_label_(stream, node);
add_friendly_name_label_(stream, friendly_name); add_friendly_name_label_(stream, friendly_name);
stream->print(F("\",name=\"")); stream->print(ESPHOME_F("\",name=\""));
stream->print(relabel_name_(obj).c_str()); stream->print(relabel_name_(obj).c_str());
stream->print(F("\"} ")); stream->print(ESPHOME_F("\"} "));
stream->print(obj->position); stream->print(obj->position);
stream->print(F("\n")); stream->print(ESPHOME_F("\n"));
if (obj->get_traits().get_supports_tilt()) { if (obj->get_traits().get_supports_tilt()) {
stream->print(F("esphome_cover_tilt{id=\"")); stream->print(ESPHOME_F("esphome_cover_tilt{id=\""));
stream->print(relabel_id_(obj).c_str()); stream->print(relabel_id_(obj).c_str());
add_area_label_(stream, area); add_area_label_(stream, area);
add_node_label_(stream, node); add_node_label_(stream, node);
add_friendly_name_label_(stream, friendly_name); add_friendly_name_label_(stream, friendly_name);
stream->print(F("\",name=\"")); stream->print(ESPHOME_F("\",name=\""));
stream->print(relabel_name_(obj).c_str()); stream->print(relabel_name_(obj).c_str());
stream->print(F("\"} ")); stream->print(ESPHOME_F("\"} "));
stream->print(obj->tilt); stream->print(obj->tilt);
stream->print(F("\n")); stream->print(ESPHOME_F("\n"));
} }
} else { } else {
// Invalid state // Invalid state
stream->print(F("esphome_cover_failed{id=\"")); stream->print(ESPHOME_F("esphome_cover_failed{id=\""));
stream->print(relabel_id_(obj).c_str()); stream->print(relabel_id_(obj).c_str());
add_area_label_(stream, area); add_area_label_(stream, area);
add_node_label_(stream, node); add_node_label_(stream, node);
add_friendly_name_label_(stream, friendly_name); add_friendly_name_label_(stream, friendly_name);
stream->print(F("\",name=\"")); stream->print(ESPHOME_F("\",name=\""));
stream->print(relabel_name_(obj).c_str()); stream->print(relabel_name_(obj).c_str());
stream->print(F("\"} 1\n")); stream->print(ESPHOME_F("\"} 1\n"));
} }
} }
#endif #endif
#ifdef USE_SWITCH #ifdef USE_SWITCH
void PrometheusHandler::switch_type_(AsyncResponseStream *stream) { void PrometheusHandler::switch_type_(AsyncResponseStream *stream) {
stream->print(F("#TYPE esphome_switch_value gauge\n")); stream->print(ESPHOME_F("#TYPE esphome_switch_value gauge\n"));
stream->print(F("#TYPE esphome_switch_failed gauge\n")); stream->print(ESPHOME_F("#TYPE esphome_switch_failed gauge\n"));
} }
void PrometheusHandler::switch_row_(AsyncResponseStream *stream, switch_::Switch *obj, std::string &area, void PrometheusHandler::switch_row_(AsyncResponseStream *stream, switch_::Switch *obj, std::string &area,
std::string &node, std::string &friendly_name) { std::string &node, std::string &friendly_name) {
if (obj->is_internal() && !this->include_internal_) if (obj->is_internal() && !this->include_internal_)
return; return;
stream->print(F("esphome_switch_failed{id=\"")); stream->print(ESPHOME_F("esphome_switch_failed{id=\""));
stream->print(relabel_id_(obj).c_str()); stream->print(relabel_id_(obj).c_str());
add_area_label_(stream, area); add_area_label_(stream, area);
add_node_label_(stream, node); add_node_label_(stream, node);
add_friendly_name_label_(stream, friendly_name); add_friendly_name_label_(stream, friendly_name);
stream->print(F("\",name=\"")); stream->print(ESPHOME_F("\",name=\""));
stream->print(relabel_name_(obj).c_str()); stream->print(relabel_name_(obj).c_str());
stream->print(F("\"} 0\n")); stream->print(ESPHOME_F("\"} 0\n"));
// Data itself // Data itself
stream->print(F("esphome_switch_value{id=\"")); stream->print(ESPHOME_F("esphome_switch_value{id=\""));
stream->print(relabel_id_(obj).c_str()); stream->print(relabel_id_(obj).c_str());
add_area_label_(stream, area); add_area_label_(stream, area);
add_node_label_(stream, node); add_node_label_(stream, node);
add_friendly_name_label_(stream, friendly_name); add_friendly_name_label_(stream, friendly_name);
stream->print(F("\",name=\"")); stream->print(ESPHOME_F("\",name=\""));
stream->print(relabel_name_(obj).c_str()); stream->print(relabel_name_(obj).c_str());
stream->print(F("\"} ")); stream->print(ESPHOME_F("\"} "));
stream->print(obj->state); stream->print(obj->state);
stream->print(F("\n")); stream->print(ESPHOME_F("\n"));
} }
#endif #endif
#ifdef USE_LOCK #ifdef USE_LOCK
void PrometheusHandler::lock_type_(AsyncResponseStream *stream) { void PrometheusHandler::lock_type_(AsyncResponseStream *stream) {
stream->print(F("#TYPE esphome_lock_value gauge\n")); stream->print(ESPHOME_F("#TYPE esphome_lock_value gauge\n"));
stream->print(F("#TYPE esphome_lock_failed gauge\n")); stream->print(ESPHOME_F("#TYPE esphome_lock_failed gauge\n"));
} }
void PrometheusHandler::lock_row_(AsyncResponseStream *stream, lock::Lock *obj, std::string &area, std::string &node, void PrometheusHandler::lock_row_(AsyncResponseStream *stream, lock::Lock *obj, std::string &area, std::string &node,
std::string &friendly_name) { std::string &friendly_name) {
if (obj->is_internal() && !this->include_internal_) if (obj->is_internal() && !this->include_internal_)
return; return;
stream->print(F("esphome_lock_failed{id=\"")); stream->print(ESPHOME_F("esphome_lock_failed{id=\""));
stream->print(relabel_id_(obj).c_str()); stream->print(relabel_id_(obj).c_str());
add_area_label_(stream, area); add_area_label_(stream, area);
add_node_label_(stream, node); add_node_label_(stream, node);
add_friendly_name_label_(stream, friendly_name); add_friendly_name_label_(stream, friendly_name);
stream->print(F("\",name=\"")); stream->print(ESPHOME_F("\",name=\""));
stream->print(relabel_name_(obj).c_str()); stream->print(relabel_name_(obj).c_str());
stream->print(F("\"} 0\n")); stream->print(ESPHOME_F("\"} 0\n"));
// Data itself // Data itself
stream->print(F("esphome_lock_value{id=\"")); stream->print(ESPHOME_F("esphome_lock_value{id=\""));
stream->print(relabel_id_(obj).c_str()); stream->print(relabel_id_(obj).c_str());
add_area_label_(stream, area); add_area_label_(stream, area);
add_node_label_(stream, node); add_node_label_(stream, node);
add_friendly_name_label_(stream, friendly_name); add_friendly_name_label_(stream, friendly_name);
stream->print(F("\",name=\"")); stream->print(ESPHOME_F("\",name=\""));
stream->print(relabel_name_(obj).c_str()); stream->print(relabel_name_(obj).c_str());
stream->print(F("\"} ")); stream->print(ESPHOME_F("\"} "));
stream->print(obj->state); stream->print(obj->state);
stream->print(F("\n")); stream->print(ESPHOME_F("\n"));
} }
#endif #endif
// Type-specific implementation // Type-specific implementation
#ifdef USE_TEXT_SENSOR #ifdef USE_TEXT_SENSOR
void PrometheusHandler::text_sensor_type_(AsyncResponseStream *stream) { void PrometheusHandler::text_sensor_type_(AsyncResponseStream *stream) {
stream->print(F("#TYPE esphome_text_sensor_value gauge\n")); stream->print(ESPHOME_F("#TYPE esphome_text_sensor_value gauge\n"));
stream->print(F("#TYPE esphome_text_sensor_failed gauge\n")); stream->print(ESPHOME_F("#TYPE esphome_text_sensor_failed gauge\n"));
} }
void PrometheusHandler::text_sensor_row_(AsyncResponseStream *stream, text_sensor::TextSensor *obj, std::string &area, void PrometheusHandler::text_sensor_row_(AsyncResponseStream *stream, text_sensor::TextSensor *obj, std::string &area,
std::string &node, std::string &friendly_name) { std::string &node, std::string &friendly_name) {
@@ -512,37 +512,37 @@ void PrometheusHandler::text_sensor_row_(AsyncResponseStream *stream, text_senso
return; return;
if (obj->has_state()) { if (obj->has_state()) {
// We have a valid value, output this value // We have a valid value, output this value
stream->print(F("esphome_text_sensor_failed{id=\"")); stream->print(ESPHOME_F("esphome_text_sensor_failed{id=\""));
stream->print(relabel_id_(obj).c_str()); stream->print(relabel_id_(obj).c_str());
add_area_label_(stream, area); add_area_label_(stream, area);
add_node_label_(stream, node); add_node_label_(stream, node);
add_friendly_name_label_(stream, friendly_name); add_friendly_name_label_(stream, friendly_name);
stream->print(F("\",name=\"")); stream->print(ESPHOME_F("\",name=\""));
stream->print(relabel_name_(obj).c_str()); stream->print(relabel_name_(obj).c_str());
stream->print(F("\"} 0\n")); stream->print(ESPHOME_F("\"} 0\n"));
// Data itself // Data itself
stream->print(F("esphome_text_sensor_value{id=\"")); stream->print(ESPHOME_F("esphome_text_sensor_value{id=\""));
stream->print(relabel_id_(obj).c_str()); stream->print(relabel_id_(obj).c_str());
add_area_label_(stream, area); add_area_label_(stream, area);
add_node_label_(stream, node); add_node_label_(stream, node);
add_friendly_name_label_(stream, friendly_name); add_friendly_name_label_(stream, friendly_name);
stream->print(F("\",name=\"")); stream->print(ESPHOME_F("\",name=\""));
stream->print(relabel_name_(obj).c_str()); stream->print(relabel_name_(obj).c_str());
stream->print(F("\",value=\"")); stream->print(ESPHOME_F("\",value=\""));
stream->print(obj->state.c_str()); stream->print(obj->state.c_str());
stream->print(F("\"} ")); stream->print(ESPHOME_F("\"} "));
stream->print(F("1.0")); stream->print(ESPHOME_F("1.0"));
stream->print(F("\n")); stream->print(ESPHOME_F("\n"));
} else { } else {
// Invalid state // Invalid state
stream->print(F("esphome_text_sensor_failed{id=\"")); stream->print(ESPHOME_F("esphome_text_sensor_failed{id=\""));
stream->print(relabel_id_(obj).c_str()); stream->print(relabel_id_(obj).c_str());
add_area_label_(stream, area); add_area_label_(stream, area);
add_node_label_(stream, node); add_node_label_(stream, node);
add_friendly_name_label_(stream, friendly_name); add_friendly_name_label_(stream, friendly_name);
stream->print(F("\",name=\"")); stream->print(ESPHOME_F("\",name=\""));
stream->print(relabel_name_(obj).c_str()); stream->print(relabel_name_(obj).c_str());
stream->print(F("\"} 1\n")); stream->print(ESPHOME_F("\"} 1\n"));
} }
} }
#endif #endif
@@ -550,8 +550,8 @@ void PrometheusHandler::text_sensor_row_(AsyncResponseStream *stream, text_senso
// Type-specific implementation // Type-specific implementation
#ifdef USE_NUMBER #ifdef USE_NUMBER
void PrometheusHandler::number_type_(AsyncResponseStream *stream) { void PrometheusHandler::number_type_(AsyncResponseStream *stream) {
stream->print(F("#TYPE esphome_number_value gauge\n")); stream->print(ESPHOME_F("#TYPE esphome_number_value gauge\n"));
stream->print(F("#TYPE esphome_number_failed gauge\n")); stream->print(ESPHOME_F("#TYPE esphome_number_failed gauge\n"));
} }
void PrometheusHandler::number_row_(AsyncResponseStream *stream, number::Number *obj, std::string &area, void PrometheusHandler::number_row_(AsyncResponseStream *stream, number::Number *obj, std::string &area,
std::string &node, std::string &friendly_name) { std::string &node, std::string &friendly_name) {
@@ -559,43 +559,43 @@ void PrometheusHandler::number_row_(AsyncResponseStream *stream, number::Number
return; return;
if (!std::isnan(obj->state)) { if (!std::isnan(obj->state)) {
// We have a valid value, output this value // We have a valid value, output this value
stream->print(F("esphome_number_failed{id=\"")); stream->print(ESPHOME_F("esphome_number_failed{id=\""));
stream->print(relabel_id_(obj).c_str()); stream->print(relabel_id_(obj).c_str());
add_area_label_(stream, area); add_area_label_(stream, area);
add_node_label_(stream, node); add_node_label_(stream, node);
add_friendly_name_label_(stream, friendly_name); add_friendly_name_label_(stream, friendly_name);
stream->print(F("\",name=\"")); stream->print(ESPHOME_F("\",name=\""));
stream->print(relabel_name_(obj).c_str()); stream->print(relabel_name_(obj).c_str());
stream->print(F("\"} 0\n")); stream->print(ESPHOME_F("\"} 0\n"));
// Data itself // Data itself
stream->print(F("esphome_number_value{id=\"")); stream->print(ESPHOME_F("esphome_number_value{id=\""));
stream->print(relabel_id_(obj).c_str()); stream->print(relabel_id_(obj).c_str());
add_area_label_(stream, area); add_area_label_(stream, area);
add_node_label_(stream, node); add_node_label_(stream, node);
add_friendly_name_label_(stream, friendly_name); add_friendly_name_label_(stream, friendly_name);
stream->print(F("\",name=\"")); stream->print(ESPHOME_F("\",name=\""));
stream->print(relabel_name_(obj).c_str()); stream->print(relabel_name_(obj).c_str());
stream->print(F("\"} ")); stream->print(ESPHOME_F("\"} "));
stream->print(obj->state); stream->print(obj->state);
stream->print(F("\n")); stream->print(ESPHOME_F("\n"));
} else { } else {
// Invalid state // Invalid state
stream->print(F("esphome_number_failed{id=\"")); stream->print(ESPHOME_F("esphome_number_failed{id=\""));
stream->print(relabel_id_(obj).c_str()); stream->print(relabel_id_(obj).c_str());
add_area_label_(stream, area); add_area_label_(stream, area);
add_node_label_(stream, node); add_node_label_(stream, node);
add_friendly_name_label_(stream, friendly_name); add_friendly_name_label_(stream, friendly_name);
stream->print(F("\",name=\"")); stream->print(ESPHOME_F("\",name=\""));
stream->print(relabel_name_(obj).c_str()); stream->print(relabel_name_(obj).c_str());
stream->print(F("\"} 1\n")); stream->print(ESPHOME_F("\"} 1\n"));
} }
} }
#endif #endif
#ifdef USE_SELECT #ifdef USE_SELECT
void PrometheusHandler::select_type_(AsyncResponseStream *stream) { void PrometheusHandler::select_type_(AsyncResponseStream *stream) {
stream->print(F("#TYPE esphome_select_value gauge\n")); stream->print(ESPHOME_F("#TYPE esphome_select_value gauge\n"));
stream->print(F("#TYPE esphome_select_failed gauge\n")); stream->print(ESPHOME_F("#TYPE esphome_select_failed gauge\n"));
} }
void PrometheusHandler::select_row_(AsyncResponseStream *stream, select::Select *obj, std::string &area, void PrometheusHandler::select_row_(AsyncResponseStream *stream, select::Select *obj, std::string &area,
std::string &node, std::string &friendly_name) { std::string &node, std::string &friendly_name) {
@@ -603,105 +603,105 @@ void PrometheusHandler::select_row_(AsyncResponseStream *stream, select::Select
return; return;
if (obj->has_state()) { if (obj->has_state()) {
// We have a valid value, output this value // We have a valid value, output this value
stream->print(F("esphome_select_failed{id=\"")); stream->print(ESPHOME_F("esphome_select_failed{id=\""));
stream->print(relabel_id_(obj).c_str()); stream->print(relabel_id_(obj).c_str());
add_area_label_(stream, area); add_area_label_(stream, area);
add_node_label_(stream, node); add_node_label_(stream, node);
add_friendly_name_label_(stream, friendly_name); add_friendly_name_label_(stream, friendly_name);
stream->print(F("\",name=\"")); stream->print(ESPHOME_F("\",name=\""));
stream->print(relabel_name_(obj).c_str()); stream->print(relabel_name_(obj).c_str());
stream->print(F("\"} 0\n")); stream->print(ESPHOME_F("\"} 0\n"));
// Data itself // Data itself
stream->print(F("esphome_select_value{id=\"")); stream->print(ESPHOME_F("esphome_select_value{id=\""));
stream->print(relabel_id_(obj).c_str()); stream->print(relabel_id_(obj).c_str());
add_area_label_(stream, area); add_area_label_(stream, area);
add_node_label_(stream, node); add_node_label_(stream, node);
add_friendly_name_label_(stream, friendly_name); add_friendly_name_label_(stream, friendly_name);
stream->print(F("\",name=\"")); stream->print(ESPHOME_F("\",name=\""));
stream->print(relabel_name_(obj).c_str()); stream->print(relabel_name_(obj).c_str());
stream->print(F("\",value=\"")); stream->print(ESPHOME_F("\",value=\""));
stream->print(obj->state.c_str()); stream->print(obj->state.c_str());
stream->print(F("\"} ")); stream->print(ESPHOME_F("\"} "));
stream->print(F("1.0")); stream->print(ESPHOME_F("1.0"));
stream->print(F("\n")); stream->print(ESPHOME_F("\n"));
} else { } else {
// Invalid state // Invalid state
stream->print(F("esphome_select_failed{id=\"")); stream->print(ESPHOME_F("esphome_select_failed{id=\""));
stream->print(relabel_id_(obj).c_str()); stream->print(relabel_id_(obj).c_str());
add_area_label_(stream, area); add_area_label_(stream, area);
add_node_label_(stream, node); add_node_label_(stream, node);
add_friendly_name_label_(stream, friendly_name); add_friendly_name_label_(stream, friendly_name);
stream->print(F("\",name=\"")); stream->print(ESPHOME_F("\",name=\""));
stream->print(relabel_name_(obj).c_str()); stream->print(relabel_name_(obj).c_str());
stream->print(F("\"} 1\n")); stream->print(ESPHOME_F("\"} 1\n"));
} }
} }
#endif #endif
#ifdef USE_MEDIA_PLAYER #ifdef USE_MEDIA_PLAYER
void PrometheusHandler::media_player_type_(AsyncResponseStream *stream) { void PrometheusHandler::media_player_type_(AsyncResponseStream *stream) {
stream->print(F("#TYPE esphome_media_player_state_value gauge\n")); stream->print(ESPHOME_F("#TYPE esphome_media_player_state_value gauge\n"));
stream->print(F("#TYPE esphome_media_player_volume gauge\n")); stream->print(ESPHOME_F("#TYPE esphome_media_player_volume gauge\n"));
stream->print(F("#TYPE esphome_media_player_is_muted gauge\n")); stream->print(ESPHOME_F("#TYPE esphome_media_player_is_muted gauge\n"));
stream->print(F("#TYPE esphome_media_player_failed gauge\n")); stream->print(ESPHOME_F("#TYPE esphome_media_player_failed gauge\n"));
} }
void PrometheusHandler::media_player_row_(AsyncResponseStream *stream, media_player::MediaPlayer *obj, void PrometheusHandler::media_player_row_(AsyncResponseStream *stream, media_player::MediaPlayer *obj,
std::string &area, std::string &node, std::string &friendly_name) { std::string &area, std::string &node, std::string &friendly_name) {
if (obj->is_internal() && !this->include_internal_) if (obj->is_internal() && !this->include_internal_)
return; return;
stream->print(F("esphome_media_player_failed{id=\"")); stream->print(ESPHOME_F("esphome_media_player_failed{id=\""));
stream->print(relabel_id_(obj).c_str()); stream->print(relabel_id_(obj).c_str());
add_area_label_(stream, area); add_area_label_(stream, area);
add_node_label_(stream, node); add_node_label_(stream, node);
add_friendly_name_label_(stream, friendly_name); add_friendly_name_label_(stream, friendly_name);
stream->print(F("\",name=\"")); stream->print(ESPHOME_F("\",name=\""));
stream->print(relabel_name_(obj).c_str()); stream->print(relabel_name_(obj).c_str());
stream->print(F("\"} 0\n")); stream->print(ESPHOME_F("\"} 0\n"));
// Data itself // Data itself
stream->print(F("esphome_media_player_state_value{id=\"")); stream->print(ESPHOME_F("esphome_media_player_state_value{id=\""));
stream->print(relabel_id_(obj).c_str()); stream->print(relabel_id_(obj).c_str());
add_area_label_(stream, area); add_area_label_(stream, area);
add_node_label_(stream, node); add_node_label_(stream, node);
add_friendly_name_label_(stream, friendly_name); add_friendly_name_label_(stream, friendly_name);
stream->print(F("\",name=\"")); stream->print(ESPHOME_F("\",name=\""));
stream->print(relabel_name_(obj).c_str()); stream->print(relabel_name_(obj).c_str());
stream->print(F("\",value=\"")); stream->print(ESPHOME_F("\",value=\""));
stream->print(media_player::media_player_state_to_string(obj->state)); stream->print(media_player::media_player_state_to_string(obj->state));
stream->print(F("\"} ")); stream->print(ESPHOME_F("\"} "));
stream->print(F("1.0")); stream->print(ESPHOME_F("1.0"));
stream->print(F("\n")); stream->print(ESPHOME_F("\n"));
stream->print(F("esphome_media_player_volume{id=\"")); stream->print(ESPHOME_F("esphome_media_player_volume{id=\""));
stream->print(relabel_id_(obj).c_str()); stream->print(relabel_id_(obj).c_str());
add_area_label_(stream, area); add_area_label_(stream, area);
add_node_label_(stream, node); add_node_label_(stream, node);
add_friendly_name_label_(stream, friendly_name); add_friendly_name_label_(stream, friendly_name);
stream->print(F("\",name=\"")); stream->print(ESPHOME_F("\",name=\""));
stream->print(relabel_name_(obj).c_str()); stream->print(relabel_name_(obj).c_str());
stream->print(F("\"} ")); stream->print(ESPHOME_F("\"} "));
stream->print(obj->volume); stream->print(obj->volume);
stream->print(F("\n")); stream->print(ESPHOME_F("\n"));
stream->print(F("esphome_media_player_is_muted{id=\"")); stream->print(ESPHOME_F("esphome_media_player_is_muted{id=\""));
stream->print(relabel_id_(obj).c_str()); stream->print(relabel_id_(obj).c_str());
add_area_label_(stream, area); add_area_label_(stream, area);
add_node_label_(stream, node); add_node_label_(stream, node);
add_friendly_name_label_(stream, friendly_name); add_friendly_name_label_(stream, friendly_name);
stream->print(F("\",name=\"")); stream->print(ESPHOME_F("\",name=\""));
stream->print(relabel_name_(obj).c_str()); stream->print(relabel_name_(obj).c_str());
stream->print(F("\"} ")); stream->print(ESPHOME_F("\"} "));
if (obj->is_muted()) { if (obj->is_muted()) {
stream->print(F("1.0")); stream->print(ESPHOME_F("1.0"));
} else { } else {
stream->print(F("0.0")); stream->print(ESPHOME_F("0.0"));
} }
stream->print(F("\n")); stream->print(ESPHOME_F("\n"));
} }
#endif #endif
#ifdef USE_UPDATE #ifdef USE_UPDATE
void PrometheusHandler::update_entity_type_(AsyncResponseStream *stream) { void PrometheusHandler::update_entity_type_(AsyncResponseStream *stream) {
stream->print(F("#TYPE esphome_update_entity_state gauge\n")); stream->print(ESPHOME_F("#TYPE esphome_update_entity_state gauge\n"));
stream->print(F("#TYPE esphome_update_entity_info gauge\n")); stream->print(ESPHOME_F("#TYPE esphome_update_entity_info gauge\n"));
stream->print(F("#TYPE esphome_update_entity_failed gauge\n")); stream->print(ESPHOME_F("#TYPE esphome_update_entity_failed gauge\n"));
} }
void PrometheusHandler::handle_update_state_(AsyncResponseStream *stream, update::UpdateState state) { void PrometheusHandler::handle_update_state_(AsyncResponseStream *stream, update::UpdateState state) {
@@ -730,168 +730,168 @@ void PrometheusHandler::update_entity_row_(AsyncResponseStream *stream, update::
return; return;
if (obj->has_state()) { if (obj->has_state()) {
// We have a valid value, output this value // We have a valid value, output this value
stream->print(F("esphome_update_entity_failed{id=\"")); stream->print(ESPHOME_F("esphome_update_entity_failed{id=\""));
stream->print(relabel_id_(obj).c_str()); stream->print(relabel_id_(obj).c_str());
add_area_label_(stream, area); add_area_label_(stream, area);
add_node_label_(stream, node); add_node_label_(stream, node);
add_friendly_name_label_(stream, friendly_name); add_friendly_name_label_(stream, friendly_name);
stream->print(F("\",name=\"")); stream->print(ESPHOME_F("\",name=\""));
stream->print(relabel_name_(obj).c_str()); stream->print(relabel_name_(obj).c_str());
stream->print(F("\"} 0\n")); stream->print(ESPHOME_F("\"} 0\n"));
// First update state // First update state
stream->print(F("esphome_update_entity_state{id=\"")); stream->print(ESPHOME_F("esphome_update_entity_state{id=\""));
stream->print(relabel_id_(obj).c_str()); stream->print(relabel_id_(obj).c_str());
add_area_label_(stream, area); add_area_label_(stream, area);
add_node_label_(stream, node); add_node_label_(stream, node);
add_friendly_name_label_(stream, friendly_name); add_friendly_name_label_(stream, friendly_name);
stream->print(F("\",name=\"")); stream->print(ESPHOME_F("\",name=\""));
stream->print(relabel_name_(obj).c_str()); stream->print(relabel_name_(obj).c_str());
stream->print(F("\",value=\"")); stream->print(ESPHOME_F("\",value=\""));
handle_update_state_(stream, obj->state); handle_update_state_(stream, obj->state);
stream->print(F("\"} ")); stream->print(ESPHOME_F("\"} "));
stream->print(F("1.0")); stream->print(ESPHOME_F("1.0"));
stream->print(F("\n")); stream->print(ESPHOME_F("\n"));
// Next update info // Next update info
stream->print(F("esphome_update_entity_info{id=\"")); stream->print(ESPHOME_F("esphome_update_entity_info{id=\""));
stream->print(relabel_id_(obj).c_str()); stream->print(relabel_id_(obj).c_str());
add_area_label_(stream, area); add_area_label_(stream, area);
add_node_label_(stream, node); add_node_label_(stream, node);
add_friendly_name_label_(stream, friendly_name); add_friendly_name_label_(stream, friendly_name);
stream->print(F("\",name=\"")); stream->print(ESPHOME_F("\",name=\""));
stream->print(relabel_name_(obj).c_str()); stream->print(relabel_name_(obj).c_str());
stream->print(F("\",current_version=\"")); stream->print(ESPHOME_F("\",current_version=\""));
stream->print(obj->update_info.current_version.c_str()); stream->print(obj->update_info.current_version.c_str());
stream->print(F("\",latest_version=\"")); stream->print(ESPHOME_F("\",latest_version=\""));
stream->print(obj->update_info.latest_version.c_str()); stream->print(obj->update_info.latest_version.c_str());
stream->print(F("\",title=\"")); stream->print(ESPHOME_F("\",title=\""));
stream->print(obj->update_info.title.c_str()); stream->print(obj->update_info.title.c_str());
stream->print(F("\"} ")); stream->print(ESPHOME_F("\"} "));
stream->print(F("1.0")); stream->print(ESPHOME_F("1.0"));
stream->print(F("\n")); stream->print(ESPHOME_F("\n"));
} else { } else {
// Invalid state // Invalid state
stream->print(F("esphome_update_entity_failed{id=\"")); stream->print(ESPHOME_F("esphome_update_entity_failed{id=\""));
stream->print(relabel_id_(obj).c_str()); stream->print(relabel_id_(obj).c_str());
add_area_label_(stream, area); add_area_label_(stream, area);
add_node_label_(stream, node); add_node_label_(stream, node);
add_friendly_name_label_(stream, friendly_name); add_friendly_name_label_(stream, friendly_name);
stream->print(F("\",name=\"")); stream->print(ESPHOME_F("\",name=\""));
stream->print(relabel_name_(obj).c_str()); stream->print(relabel_name_(obj).c_str());
stream->print(F("\"} 1\n")); stream->print(ESPHOME_F("\"} 1\n"));
} }
} }
#endif #endif
#ifdef USE_VALVE #ifdef USE_VALVE
void PrometheusHandler::valve_type_(AsyncResponseStream *stream) { void PrometheusHandler::valve_type_(AsyncResponseStream *stream) {
stream->print(F("#TYPE esphome_valve_operation gauge\n")); stream->print(ESPHOME_F("#TYPE esphome_valve_operation gauge\n"));
stream->print(F("#TYPE esphome_valve_failed gauge\n")); stream->print(ESPHOME_F("#TYPE esphome_valve_failed gauge\n"));
stream->print(F("#TYPE esphome_valve_position gauge\n")); stream->print(ESPHOME_F("#TYPE esphome_valve_position gauge\n"));
} }
void PrometheusHandler::valve_row_(AsyncResponseStream *stream, valve::Valve *obj, std::string &area, std::string &node, void PrometheusHandler::valve_row_(AsyncResponseStream *stream, valve::Valve *obj, std::string &area, std::string &node,
std::string &friendly_name) { std::string &friendly_name) {
if (obj->is_internal() && !this->include_internal_) if (obj->is_internal() && !this->include_internal_)
return; return;
stream->print(F("esphome_valve_failed{id=\"")); stream->print(ESPHOME_F("esphome_valve_failed{id=\""));
stream->print(relabel_id_(obj).c_str()); stream->print(relabel_id_(obj).c_str());
add_area_label_(stream, area); add_area_label_(stream, area);
add_node_label_(stream, node); add_node_label_(stream, node);
add_friendly_name_label_(stream, friendly_name); add_friendly_name_label_(stream, friendly_name);
stream->print(F("\",name=\"")); stream->print(ESPHOME_F("\",name=\""));
stream->print(relabel_name_(obj).c_str()); stream->print(relabel_name_(obj).c_str());
stream->print(F("\"} 0\n")); stream->print(ESPHOME_F("\"} 0\n"));
// Data itself // Data itself
stream->print(F("esphome_valve_operation{id=\"")); stream->print(ESPHOME_F("esphome_valve_operation{id=\""));
stream->print(relabel_id_(obj).c_str()); stream->print(relabel_id_(obj).c_str());
add_area_label_(stream, area); add_area_label_(stream, area);
add_node_label_(stream, node); add_node_label_(stream, node);
add_friendly_name_label_(stream, friendly_name); add_friendly_name_label_(stream, friendly_name);
stream->print(F("\",name=\"")); stream->print(ESPHOME_F("\",name=\""));
stream->print(relabel_name_(obj).c_str()); stream->print(relabel_name_(obj).c_str());
stream->print(F("\",operation=\"")); stream->print(ESPHOME_F("\",operation=\""));
stream->print(valve::valve_operation_to_str(obj->current_operation)); stream->print(valve::valve_operation_to_str(obj->current_operation));
stream->print(F("\"} ")); stream->print(ESPHOME_F("\"} "));
stream->print(F("1.0")); stream->print(ESPHOME_F("1.0"));
stream->print(F("\n")); stream->print(ESPHOME_F("\n"));
// Now see if position is supported // Now see if position is supported
if (obj->get_traits().get_supports_position()) { if (obj->get_traits().get_supports_position()) {
stream->print(F("esphome_valve_position{id=\"")); stream->print(ESPHOME_F("esphome_valve_position{id=\""));
stream->print(relabel_id_(obj).c_str()); stream->print(relabel_id_(obj).c_str());
add_area_label_(stream, area); add_area_label_(stream, area);
add_node_label_(stream, node); add_node_label_(stream, node);
add_friendly_name_label_(stream, friendly_name); add_friendly_name_label_(stream, friendly_name);
stream->print(F("\",name=\"")); stream->print(ESPHOME_F("\",name=\""));
stream->print(relabel_name_(obj).c_str()); stream->print(relabel_name_(obj).c_str());
stream->print(F("\"} ")); stream->print(ESPHOME_F("\"} "));
stream->print(obj->position); stream->print(obj->position);
stream->print(F("\n")); stream->print(ESPHOME_F("\n"));
} }
} }
#endif #endif
#ifdef USE_CLIMATE #ifdef USE_CLIMATE
void PrometheusHandler::climate_type_(AsyncResponseStream *stream) { void PrometheusHandler::climate_type_(AsyncResponseStream *stream) {
stream->print(F("#TYPE esphome_climate_setting gauge\n")); stream->print(ESPHOME_F("#TYPE esphome_climate_setting gauge\n"));
stream->print(F("#TYPE esphome_climate_value gauge\n")); stream->print(ESPHOME_F("#TYPE esphome_climate_value gauge\n"));
stream->print(F("#TYPE esphome_climate_failed gauge\n")); stream->print(ESPHOME_F("#TYPE esphome_climate_failed gauge\n"));
} }
void PrometheusHandler::climate_setting_row_(AsyncResponseStream *stream, climate::Climate *obj, std::string &area, void PrometheusHandler::climate_setting_row_(AsyncResponseStream *stream, climate::Climate *obj, std::string &area,
std::string &node, std::string &friendly_name, std::string &setting, std::string &node, std::string &friendly_name, std::string &setting,
const LogString *setting_value) { const LogString *setting_value) {
stream->print(F("esphome_climate_setting{id=\"")); stream->print(ESPHOME_F("esphome_climate_setting{id=\""));
stream->print(relabel_id_(obj).c_str()); stream->print(relabel_id_(obj).c_str());
add_area_label_(stream, area); add_area_label_(stream, area);
add_node_label_(stream, node); add_node_label_(stream, node);
add_friendly_name_label_(stream, friendly_name); add_friendly_name_label_(stream, friendly_name);
stream->print(F("\",name=\"")); stream->print(ESPHOME_F("\",name=\""));
stream->print(relabel_name_(obj).c_str()); stream->print(relabel_name_(obj).c_str());
stream->print(F("\",category=\"")); stream->print(ESPHOME_F("\",category=\""));
stream->print(setting.c_str()); stream->print(setting.c_str());
stream->print(F("\",setting_value=\"")); stream->print(ESPHOME_F("\",setting_value=\""));
stream->print(LOG_STR_ARG(setting_value)); stream->print(LOG_STR_ARG(setting_value));
stream->print(F("\"} ")); stream->print(ESPHOME_F("\"} "));
stream->print(F("1.0")); stream->print(ESPHOME_F("1.0"));
stream->print(F("\n")); stream->print(ESPHOME_F("\n"));
} }
void PrometheusHandler::climate_value_row_(AsyncResponseStream *stream, climate::Climate *obj, std::string &area, void PrometheusHandler::climate_value_row_(AsyncResponseStream *stream, climate::Climate *obj, std::string &area,
std::string &node, std::string &friendly_name, std::string &category, std::string &node, std::string &friendly_name, std::string &category,
std::string &climate_value) { std::string &climate_value) {
stream->print(F("esphome_climate_value{id=\"")); stream->print(ESPHOME_F("esphome_climate_value{id=\""));
stream->print(relabel_id_(obj).c_str()); stream->print(relabel_id_(obj).c_str());
add_area_label_(stream, area); add_area_label_(stream, area);
add_node_label_(stream, node); add_node_label_(stream, node);
add_friendly_name_label_(stream, friendly_name); add_friendly_name_label_(stream, friendly_name);
stream->print(F("\",name=\"")); stream->print(ESPHOME_F("\",name=\""));
stream->print(relabel_name_(obj).c_str()); stream->print(relabel_name_(obj).c_str());
stream->print(F("\",category=\"")); stream->print(ESPHOME_F("\",category=\""));
stream->print(category.c_str()); stream->print(category.c_str());
stream->print(F("\"} ")); stream->print(ESPHOME_F("\"} "));
stream->print(climate_value.c_str()); stream->print(climate_value.c_str());
stream->print(F("\n")); stream->print(ESPHOME_F("\n"));
} }
void PrometheusHandler::climate_failed_row_(AsyncResponseStream *stream, climate::Climate *obj, std::string &area, void PrometheusHandler::climate_failed_row_(AsyncResponseStream *stream, climate::Climate *obj, std::string &area,
std::string &node, std::string &friendly_name, std::string &category, std::string &node, std::string &friendly_name, std::string &category,
bool is_failed_value) { bool is_failed_value) {
stream->print(F("esphome_climate_failed{id=\"")); stream->print(ESPHOME_F("esphome_climate_failed{id=\""));
stream->print(relabel_id_(obj).c_str()); stream->print(relabel_id_(obj).c_str());
add_area_label_(stream, area); add_area_label_(stream, area);
add_node_label_(stream, node); add_node_label_(stream, node);
add_friendly_name_label_(stream, friendly_name); add_friendly_name_label_(stream, friendly_name);
stream->print(F("\",name=\"")); stream->print(ESPHOME_F("\",name=\""));
stream->print(relabel_name_(obj).c_str()); stream->print(relabel_name_(obj).c_str());
stream->print(F("\",category=\"")); stream->print(ESPHOME_F("\",category=\""));
stream->print(category.c_str()); stream->print(category.c_str());
stream->print(F("\"} ")); stream->print(ESPHOME_F("\"} "));
if (is_failed_value) { if (is_failed_value) {
stream->print(F("1.0")); stream->print(ESPHOME_F("1.0"));
} else { } else {
stream->print(F("0.0")); stream->print(ESPHOME_F("0.0"));
} }
stream->print(F("\n")); stream->print(ESPHOME_F("\n"));
} }
void PrometheusHandler::climate_row_(AsyncResponseStream *stream, climate::Climate *obj, std::string &area, void PrometheusHandler::climate_row_(AsyncResponseStream *stream, climate::Climate *obj, std::string &area,

View File

@@ -34,23 +34,23 @@ void WebServer::set_js_url(const char *js_url) { this->js_url_ = js_url; }
void WebServer::handle_index_request(AsyncWebServerRequest *request) { void WebServer::handle_index_request(AsyncWebServerRequest *request) {
AsyncResponseStream *stream = request->beginResponseStream("text/html"); AsyncResponseStream *stream = request->beginResponseStream("text/html");
const std::string &title = App.get_name(); const std::string &title = App.get_name();
stream->print(F("<!DOCTYPE html><html lang=\"en\"><head><meta charset=UTF-8><meta " stream->print(ESPHOME_F("<!DOCTYPE html><html lang=\"en\"><head><meta charset=UTF-8><meta "
"name=viewport content=\"width=device-width, initial-scale=1,user-scalable=no\"><title>")); "name=viewport content=\"width=device-width, initial-scale=1,user-scalable=no\"><title>"));
stream->print(title.c_str()); stream->print(title.c_str());
stream->print(F("</title>")); stream->print(ESPHOME_F("</title>"));
#ifdef USE_WEBSERVER_CSS_INCLUDE #ifdef USE_WEBSERVER_CSS_INCLUDE
stream->print(F("<link rel=\"stylesheet\" href=\"/0.css\">")); stream->print(ESPHOME_F("<link rel=\"stylesheet\" href=\"/0.css\">"));
#endif #endif
if (strlen(this->css_url_) > 0) { if (strlen(this->css_url_) > 0) {
stream->print(F(R"(<link rel="stylesheet" href=")")); stream->print(F(R"(<link rel="stylesheet" href=")"));
stream->print(this->css_url_); stream->print(this->css_url_);
stream->print(F("\">")); stream->print(ESPHOME_F("\">"));
} }
stream->print(F("</head><body>")); stream->print(ESPHOME_F("</head><body>"));
stream->print(F("<article class=\"markdown-body\"><h1>")); stream->print(ESPHOME_F("<article class=\"markdown-body\"><h1>"));
stream->print(title.c_str()); stream->print(title.c_str());
stream->print(F("</h1>")); stream->print(ESPHOME_F("</h1>"));
stream->print(F("<h2>States</h2><table id=\"states\"><thead><tr><th>Name<th>State<th>Actions<tbody>")); stream->print(ESPHOME_F("<h2>States</h2><table id=\"states\"><thead><tr><th>Name<th>State<th>Actions<tbody>"));
#ifdef USE_SENSOR #ifdef USE_SENSOR
for (auto *obj : App.get_sensors()) { for (auto *obj : App.get_sensors()) {
@@ -190,26 +190,28 @@ void WebServer::handle_index_request(AsyncWebServerRequest *request) {
} }
#endif #endif
stream->print(F("</tbody></table><p>See <a href=\"https://esphome.io/web-api/index.html\">ESPHome Web API</a> for " stream->print(
ESPHOME_F("</tbody></table><p>See <a href=\"https://esphome.io/web-api/index.html\">ESPHome Web API</a> for "
"REST API documentation.</p>")); "REST API documentation.</p>"));
#if defined(USE_WEBSERVER_OTA) && !defined(USE_WEBSERVER_OTA_DISABLED) #if defined(USE_WEBSERVER_OTA) && !defined(USE_WEBSERVER_OTA_DISABLED)
// Show OTA form only if web_server OTA is not explicitly disabled // Show OTA form only if web_server OTA is not explicitly disabled
// Note: USE_WEBSERVER_OTA_DISABLED only affects web_server, not captive_portal // Note: USE_WEBSERVER_OTA_DISABLED only affects web_server, not captive_portal
stream->print(F("<h2>OTA Update</h2><form method=\"POST\" action=\"/update\" enctype=\"multipart/form-data\"><input " stream->print(
ESPHOME_F("<h2>OTA Update</h2><form method=\"POST\" action=\"/update\" enctype=\"multipart/form-data\"><input "
"type=\"file\" name=\"update\"><input type=\"submit\" value=\"Update\"></form>")); "type=\"file\" name=\"update\"><input type=\"submit\" value=\"Update\"></form>"));
#endif #endif
stream->print(F("<h2>Debug Log</h2><pre id=\"log\"></pre>")); stream->print(ESPHOME_F("<h2>Debug Log</h2><pre id=\"log\"></pre>"));
#ifdef USE_WEBSERVER_JS_INCLUDE #ifdef USE_WEBSERVER_JS_INCLUDE
if (this->js_include_ != nullptr) { if (this->js_include_ != nullptr) {
stream->print(F("<script type=\"module\" src=\"/0.js\"></script>")); stream->print(ESPHOME_F("<script type=\"module\" src=\"/0.js\"></script>"));
} }
#endif #endif
if (strlen(this->js_url_) > 0) { if (strlen(this->js_url_) > 0) {
stream->print(F("<script src=\"")); stream->print(ESPHOME_F("<script src=\""));
stream->print(this->js_url_); stream->print(this->js_url_);
stream->print(F("\"></script>")); stream->print(ESPHOME_F("\"></script>"));
} }
stream->print(F("</article></body></html>")); stream->print(ESPHOME_F("</article></body></html>"));
request->send(stream); request->send(stream);
} }

View File

@@ -7,10 +7,24 @@
#include "esphome/core/component.h" #include "esphome/core/component.h"
// Platform-agnostic macros for web server components
// On ESP32 (both Arduino and IDF): Use plain strings (no PROGMEM)
// On ESP8266: Use Arduino's F() macro for PROGMEM strings
#ifdef USE_ESP32
#define ESPHOME_F(string_literal) (string_literal)
#define ESPHOME_PGM_P const char *
#define ESPHOME_strncpy_P strncpy
#else
// ESP8266 uses Arduino macros
#define ESPHOME_F(string_literal) F(string_literal)
#define ESPHOME_PGM_P PGM_P
#define ESPHOME_strncpy_P strncpy_P
#endif
#if USE_ESP32 #if USE_ESP32
#include "esphome/core/hal.h" #include "esphome/core/hal.h"
#include "esphome/components/web_server_idf/web_server_idf.h" #include "esphome/components/web_server_idf/web_server_idf.h"
#elif USE_ARDUINO #else
#include <ESPAsyncWebServer.h> #include <ESPAsyncWebServer.h>
#endif #endif

View File

@@ -26,13 +26,6 @@ class ListEntitiesIterator;
#endif #endif
namespace web_server_idf { namespace web_server_idf {
#ifndef USE_ARDUINO
using String = std::string;
#define F(string_literal) (string_literal)
#define PGM_P const char *
#define strncpy_P strncpy
#endif
class AsyncWebParameter { class AsyncWebParameter {
public: public:
AsyncWebParameter(std::string value) : value_(std::move(value)) {} AsyncWebParameter(std::string value) : value_(std::move(value)) {}
@@ -89,9 +82,6 @@ class AsyncResponseStream : public AsyncWebServerResponse {
void print(const char *str) { this->content_.append(str); } void print(const char *str) { this->content_.append(str); }
void print(const std::string &str) { this->content_.append(str); } void print(const std::string &str) { this->content_.append(str); }
void print(float value); void print(float value);
#ifdef USE_ARDUINO
void print(const __FlashStringHelper *str) { this->content_.append(reinterpret_cast<PGM_P>(str)); }
#endif
void printf(const char *fmt, ...) __attribute__((format(printf, 2, 3))); void printf(const char *fmt, ...) __attribute__((format(printf, 2, 3)));
protected: protected: