|
|
|
|
@@ -59,6 +59,24 @@ void PrometheusHandler::handleRequest(AsyncWebServerRequest *req) {
|
|
|
|
|
this->text_sensor_row_(stream, obj, area, node, friendly_name);
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#ifdef USE_NUMBER
|
|
|
|
|
this->number_type_(stream);
|
|
|
|
|
for (auto *obj : App.get_numbers())
|
|
|
|
|
this->number_row_(stream, obj, area, node, friendly_name);
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#ifdef USE_SELECT
|
|
|
|
|
this->select_type_(stream);
|
|
|
|
|
for (auto *obj : App.get_selects())
|
|
|
|
|
this->select_row_(stream, obj, area, node, friendly_name);
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#ifdef USE_MEDIA_PLAYER
|
|
|
|
|
this->media_player_type_(stream);
|
|
|
|
|
for (auto *obj : App.get_media_players())
|
|
|
|
|
this->media_player_row_(stream, obj, area, node, friendly_name);
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
req->send(stream);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@@ -511,6 +529,156 @@ void PrometheusHandler::text_sensor_row_(AsyncResponseStream *stream, text_senso
|
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
// Type-specific implementation
|
|
|
|
|
#ifdef USE_NUMBER
|
|
|
|
|
void PrometheusHandler::number_type_(AsyncResponseStream *stream) {
|
|
|
|
|
stream->print(F("#TYPE esphome_number_value gauge\n"));
|
|
|
|
|
stream->print(F("#TYPE esphome_number_failed gauge\n"));
|
|
|
|
|
}
|
|
|
|
|
void PrometheusHandler::number_row_(AsyncResponseStream *stream, number::Number *obj, std::string &area,
|
|
|
|
|
std::string &node, std::string &friendly_name) {
|
|
|
|
|
if (obj->is_internal() && !this->include_internal_)
|
|
|
|
|
return;
|
|
|
|
|
if (!std::isnan(obj->state)) {
|
|
|
|
|
// We have a valid value, output this value
|
|
|
|
|
stream->print(F("esphome_number_failed{id=\""));
|
|
|
|
|
stream->print(relabel_id_(obj).c_str());
|
|
|
|
|
add_area_label_(stream, area);
|
|
|
|
|
add_node_label_(stream, node);
|
|
|
|
|
add_friendly_name_label_(stream, friendly_name);
|
|
|
|
|
stream->print(F("\",name=\""));
|
|
|
|
|
stream->print(relabel_name_(obj).c_str());
|
|
|
|
|
stream->print(F("\"} 0\n"));
|
|
|
|
|
// Data itself
|
|
|
|
|
stream->print(F("esphome_number_value{id=\""));
|
|
|
|
|
stream->print(relabel_id_(obj).c_str());
|
|
|
|
|
add_area_label_(stream, area);
|
|
|
|
|
add_node_label_(stream, node);
|
|
|
|
|
add_friendly_name_label_(stream, friendly_name);
|
|
|
|
|
stream->print(F("\",name=\""));
|
|
|
|
|
stream->print(relabel_name_(obj).c_str());
|
|
|
|
|
stream->print(F("\"} "));
|
|
|
|
|
stream->print(obj->state);
|
|
|
|
|
stream->print(F("\n"));
|
|
|
|
|
} else {
|
|
|
|
|
// Invalid state
|
|
|
|
|
stream->print(F("esphome_number_failed{id=\""));
|
|
|
|
|
stream->print(relabel_id_(obj).c_str());
|
|
|
|
|
add_area_label_(stream, area);
|
|
|
|
|
add_node_label_(stream, node);
|
|
|
|
|
add_friendly_name_label_(stream, friendly_name);
|
|
|
|
|
stream->print(F("\",name=\""));
|
|
|
|
|
stream->print(relabel_name_(obj).c_str());
|
|
|
|
|
stream->print(F("\"} 1\n"));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#ifdef USE_SELECT
|
|
|
|
|
void PrometheusHandler::select_type_(AsyncResponseStream *stream) {
|
|
|
|
|
stream->print(F("#TYPE esphome_select_value gauge\n"));
|
|
|
|
|
stream->print(F("#TYPE esphome_select_failed gauge\n"));
|
|
|
|
|
}
|
|
|
|
|
void PrometheusHandler::select_row_(AsyncResponseStream *stream, select::Select *obj, std::string &area,
|
|
|
|
|
std::string &node, std::string &friendly_name) {
|
|
|
|
|
if (obj->is_internal() && !this->include_internal_)
|
|
|
|
|
return;
|
|
|
|
|
if (obj->has_state()) {
|
|
|
|
|
// We have a valid value, output this value
|
|
|
|
|
stream->print(F("esphome_select_failed{id=\""));
|
|
|
|
|
stream->print(relabel_id_(obj).c_str());
|
|
|
|
|
add_area_label_(stream, area);
|
|
|
|
|
add_node_label_(stream, node);
|
|
|
|
|
add_friendly_name_label_(stream, friendly_name);
|
|
|
|
|
stream->print(F("\",name=\""));
|
|
|
|
|
stream->print(relabel_name_(obj).c_str());
|
|
|
|
|
stream->print(F("\"} 0\n"));
|
|
|
|
|
// Data itself
|
|
|
|
|
stream->print(F("esphome_select_value{id=\""));
|
|
|
|
|
stream->print(relabel_id_(obj).c_str());
|
|
|
|
|
add_area_label_(stream, area);
|
|
|
|
|
add_node_label_(stream, node);
|
|
|
|
|
add_friendly_name_label_(stream, friendly_name);
|
|
|
|
|
stream->print(F("\",name=\""));
|
|
|
|
|
stream->print(relabel_name_(obj).c_str());
|
|
|
|
|
stream->print(F("\",value=\""));
|
|
|
|
|
stream->print(obj->state.c_str());
|
|
|
|
|
stream->print(F("\"} "));
|
|
|
|
|
stream->print(F("1.0"));
|
|
|
|
|
stream->print(F("\n"));
|
|
|
|
|
} else {
|
|
|
|
|
// Invalid state
|
|
|
|
|
stream->print(F("esphome_select_failed{id=\""));
|
|
|
|
|
stream->print(relabel_id_(obj).c_str());
|
|
|
|
|
add_area_label_(stream, area);
|
|
|
|
|
add_node_label_(stream, node);
|
|
|
|
|
add_friendly_name_label_(stream, friendly_name);
|
|
|
|
|
stream->print(F("\",name=\""));
|
|
|
|
|
stream->print(relabel_name_(obj).c_str());
|
|
|
|
|
stream->print(F("\"} 1\n"));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#ifdef USE_MEDIA_PLAYER
|
|
|
|
|
void PrometheusHandler::media_player_type_(AsyncResponseStream *stream) {
|
|
|
|
|
stream->print(F("#TYPE esphome_media_player_state_value gauge\n"));
|
|
|
|
|
stream->print(F("#TYPE esphome_media_player_volume gauge\n"));
|
|
|
|
|
stream->print(F("#TYPE esphome_media_player_is_muted gauge\n"));
|
|
|
|
|
stream->print(F("#TYPE esphome_media_player_failed gauge\n"));
|
|
|
|
|
}
|
|
|
|
|
void PrometheusHandler::media_player_row_(AsyncResponseStream *stream, media_player::MediaPlayer *obj,
|
|
|
|
|
std::string &area, std::string &node, std::string &friendly_name) {
|
|
|
|
|
if (obj->is_internal() && !this->include_internal_)
|
|
|
|
|
return;
|
|
|
|
|
stream->print(F("esphome_media_player_failed{id=\""));
|
|
|
|
|
stream->print(relabel_id_(obj).c_str());
|
|
|
|
|
add_area_label_(stream, area);
|
|
|
|
|
add_node_label_(stream, node);
|
|
|
|
|
add_friendly_name_label_(stream, friendly_name);
|
|
|
|
|
stream->print(F("\",name=\""));
|
|
|
|
|
stream->print(relabel_name_(obj).c_str());
|
|
|
|
|
stream->print(F("\"} 0\n"));
|
|
|
|
|
// Data itself
|
|
|
|
|
stream->print(F("esphome_media_player_state_value{id=\""));
|
|
|
|
|
stream->print(relabel_id_(obj).c_str());
|
|
|
|
|
add_area_label_(stream, area);
|
|
|
|
|
add_node_label_(stream, node);
|
|
|
|
|
add_friendly_name_label_(stream, friendly_name);
|
|
|
|
|
stream->print(F("\",name=\""));
|
|
|
|
|
stream->print(relabel_name_(obj).c_str());
|
|
|
|
|
stream->print(F("\",value=\""));
|
|
|
|
|
stream->print(media_player::media_player_state_to_string(obj->state));
|
|
|
|
|
stream->print(F("\"} "));
|
|
|
|
|
stream->print(F("1.0"));
|
|
|
|
|
stream->print(F("\n"));
|
|
|
|
|
stream->print(F("esphome_media_player_volume{id=\""));
|
|
|
|
|
stream->print(relabel_id_(obj).c_str());
|
|
|
|
|
add_area_label_(stream, area);
|
|
|
|
|
add_node_label_(stream, node);
|
|
|
|
|
add_friendly_name_label_(stream, friendly_name);
|
|
|
|
|
stream->print(F("\",name=\""));
|
|
|
|
|
stream->print(relabel_name_(obj).c_str());
|
|
|
|
|
stream->print(F("\"} "));
|
|
|
|
|
stream->print(obj->volume);
|
|
|
|
|
stream->print(F("\n"));
|
|
|
|
|
stream->print(F("esphome_media_player_is_muted{id=\""));
|
|
|
|
|
stream->print(relabel_id_(obj).c_str());
|
|
|
|
|
add_area_label_(stream, area);
|
|
|
|
|
add_node_label_(stream, node);
|
|
|
|
|
add_friendly_name_label_(stream, friendly_name);
|
|
|
|
|
stream->print(F("\",name=\""));
|
|
|
|
|
stream->print(relabel_name_(obj).c_str());
|
|
|
|
|
stream->print(F("\"} "));
|
|
|
|
|
if (obj->is_muted()) {
|
|
|
|
|
stream->print(F("1.0"));
|
|
|
|
|
} else {
|
|
|
|
|
stream->print(F("0.0"));
|
|
|
|
|
}
|
|
|
|
|
stream->print(F("\n"));
|
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
} // namespace prometheus
|
|
|
|
|
} // namespace esphome
|
|
|
|
|
#endif
|
|
|
|
|
|