ESPHome 2026.1.0-dev
Loading...
Searching...
No Matches
prometheus_handler.cpp
Go to the documentation of this file.
2#ifdef USE_NETWORK
4
5namespace esphome {
6namespace prometheus {
7
8void PrometheusHandler::handleRequest(AsyncWebServerRequest *req) {
9 AsyncResponseStream *stream = req->beginResponseStream("text/plain; version=0.0.4; charset=utf-8");
10 std::string area = App.get_area();
11 std::string node = App.get_name();
12 std::string friendly_name = App.get_friendly_name();
13
14#ifdef USE_SENSOR
15 this->sensor_type_(stream);
16 for (auto *obj : App.get_sensors())
17 this->sensor_row_(stream, obj, area, node, friendly_name);
18#endif
19
20#ifdef USE_BINARY_SENSOR
21 this->binary_sensor_type_(stream);
22 for (auto *obj : App.get_binary_sensors())
23 this->binary_sensor_row_(stream, obj, area, node, friendly_name);
24#endif
25
26#ifdef USE_FAN
27 this->fan_type_(stream);
28 for (auto *obj : App.get_fans())
29 this->fan_row_(stream, obj, area, node, friendly_name);
30#endif
31
32#ifdef USE_LIGHT
33 this->light_type_(stream);
34 for (auto *obj : App.get_lights())
35 this->light_row_(stream, obj, area, node, friendly_name);
36#endif
37
38#ifdef USE_COVER
39 this->cover_type_(stream);
40 for (auto *obj : App.get_covers())
41 this->cover_row_(stream, obj, area, node, friendly_name);
42#endif
43
44#ifdef USE_SWITCH
45 this->switch_type_(stream);
46 for (auto *obj : App.get_switches())
47 this->switch_row_(stream, obj, area, node, friendly_name);
48#endif
49
50#ifdef USE_LOCK
51 this->lock_type_(stream);
52 for (auto *obj : App.get_locks())
53 this->lock_row_(stream, obj, area, node, friendly_name);
54#endif
55
56#ifdef USE_EVENT
57 this->event_type_(stream);
58 for (auto *obj : App.get_events())
59 this->event_row_(stream, obj, area, node, friendly_name);
60#endif
61
62#ifdef USE_TEXT
63 this->text_type_(stream);
64 for (auto *obj : App.get_texts())
65 this->text_row_(stream, obj, area, node, friendly_name);
66#endif
67
68#ifdef USE_TEXT_SENSOR
69 this->text_sensor_type_(stream);
70 for (auto *obj : App.get_text_sensors())
71 this->text_sensor_row_(stream, obj, area, node, friendly_name);
72#endif
73
74#ifdef USE_NUMBER
75 this->number_type_(stream);
76 for (auto *obj : App.get_numbers())
77 this->number_row_(stream, obj, area, node, friendly_name);
78#endif
79
80#ifdef USE_SELECT
81 this->select_type_(stream);
82 for (auto *obj : App.get_selects())
83 this->select_row_(stream, obj, area, node, friendly_name);
84#endif
85
86#ifdef USE_MEDIA_PLAYER
87 this->media_player_type_(stream);
88 for (auto *obj : App.get_media_players())
89 this->media_player_row_(stream, obj, area, node, friendly_name);
90#endif
91
92#ifdef USE_UPDATE
93 this->update_entity_type_(stream);
94 for (auto *obj : App.get_updates())
95 this->update_entity_row_(stream, obj, area, node, friendly_name);
96#endif
97
98#ifdef USE_VALVE
99 this->valve_type_(stream);
100 for (auto *obj : App.get_valves())
101 this->valve_row_(stream, obj, area, node, friendly_name);
102#endif
103
104#ifdef USE_CLIMATE
105 this->climate_type_(stream);
106 for (auto *obj : App.get_climates())
107 this->climate_row_(stream, obj, area, node, friendly_name);
108#endif
109
110 req->send(stream);
111}
112
113std::string PrometheusHandler::relabel_id_(EntityBase *obj) {
114 auto item = relabel_map_id_.find(obj);
115 if (item != relabel_map_id_.end()) {
116 return item->second;
117 }
118 char object_id_buf[OBJECT_ID_MAX_LEN];
119 return obj->get_object_id_to(object_id_buf).str();
120}
121
122std::string PrometheusHandler::relabel_name_(EntityBase *obj) {
123 auto item = relabel_map_name_.find(obj);
124 return item == relabel_map_name_.end() ? obj->get_name() : item->second;
125}
126
127void PrometheusHandler::add_area_label_(AsyncResponseStream *stream, std::string &area) {
128 if (!area.empty()) {
129 stream->print(ESPHOME_F("\",area=\""));
130 stream->print(area.c_str());
131 }
132}
133
134void PrometheusHandler::add_node_label_(AsyncResponseStream *stream, std::string &node) {
135 if (!node.empty()) {
136 stream->print(ESPHOME_F("\",node=\""));
137 stream->print(node.c_str());
138 }
139}
140
141void PrometheusHandler::add_friendly_name_label_(AsyncResponseStream *stream, std::string &friendly_name) {
142 if (!friendly_name.empty()) {
143 stream->print(ESPHOME_F("\",friendly_name=\""));
144 stream->print(friendly_name.c_str());
145 }
146}
147
148#ifdef USE_ESP8266
149void PrometheusHandler::print_metric_labels_(AsyncResponseStream *stream, const __FlashStringHelper *metric_name,
150 EntityBase *obj, std::string &area, std::string &node,
151 std::string &friendly_name) {
152#else
153void PrometheusHandler::print_metric_labels_(AsyncResponseStream *stream, const char *metric_name, EntityBase *obj,
154 std::string &area, std::string &node, std::string &friendly_name) {
155#endif
156 stream->print(metric_name);
157 stream->print(ESPHOME_F("{id=\""));
158 stream->print(relabel_id_(obj).c_str());
159 add_area_label_(stream, area);
160 add_node_label_(stream, node);
161 add_friendly_name_label_(stream, friendly_name);
162 stream->print(ESPHOME_F("\",name=\""));
163 stream->print(relabel_name_(obj).c_str());
164}
165
166// Type-specific implementation
167#ifdef USE_SENSOR
168void PrometheusHandler::sensor_type_(AsyncResponseStream *stream) {
169 stream->print(ESPHOME_F("#TYPE esphome_sensor_value gauge\n"));
170 stream->print(ESPHOME_F("#TYPE esphome_sensor_failed gauge\n"));
171}
172void PrometheusHandler::sensor_row_(AsyncResponseStream *stream, sensor::Sensor *obj, std::string &area,
173 std::string &node, std::string &friendly_name) {
174 if (obj->is_internal() && !this->include_internal_)
175 return;
176 if (!std::isnan(obj->state)) {
177 // We have a valid value, output this value
178 stream->print(ESPHOME_F("esphome_sensor_failed{id=\""));
179 stream->print(relabel_id_(obj).c_str());
180 add_area_label_(stream, area);
181 add_node_label_(stream, node);
182 add_friendly_name_label_(stream, friendly_name);
183 stream->print(ESPHOME_F("\",name=\""));
184 stream->print(relabel_name_(obj).c_str());
185 stream->print(ESPHOME_F("\"} 0\n"));
186 // Data itself
187 stream->print(ESPHOME_F("esphome_sensor_value{id=\""));
188 stream->print(relabel_id_(obj).c_str());
189 add_area_label_(stream, area);
190 add_node_label_(stream, node);
191 add_friendly_name_label_(stream, friendly_name);
192 stream->print(ESPHOME_F("\",name=\""));
193 stream->print(relabel_name_(obj).c_str());
194 stream->print(ESPHOME_F("\",unit=\""));
195 stream->print(obj->get_unit_of_measurement_ref().c_str());
196 stream->print(ESPHOME_F("\"} "));
197 stream->print(value_accuracy_to_string(obj->state, obj->get_accuracy_decimals()).c_str());
198 stream->print(ESPHOME_F("\n"));
199 } else {
200 // Invalid state
201 stream->print(ESPHOME_F("esphome_sensor_failed{id=\""));
202 stream->print(relabel_id_(obj).c_str());
203 add_area_label_(stream, area);
204 add_node_label_(stream, node);
205 add_friendly_name_label_(stream, friendly_name);
206 stream->print(ESPHOME_F("\",name=\""));
207 stream->print(relabel_name_(obj).c_str());
208 stream->print(ESPHOME_F("\"} 1\n"));
209 }
210}
211#endif
212
213// Type-specific implementation
214#ifdef USE_BINARY_SENSOR
215void PrometheusHandler::binary_sensor_type_(AsyncResponseStream *stream) {
216 stream->print(ESPHOME_F("#TYPE esphome_binary_sensor_value gauge\n"));
217 stream->print(ESPHOME_F("#TYPE esphome_binary_sensor_failed gauge\n"));
218}
219void PrometheusHandler::binary_sensor_row_(AsyncResponseStream *stream, binary_sensor::BinarySensor *obj,
220 std::string &area, std::string &node, std::string &friendly_name) {
221 if (obj->is_internal() && !this->include_internal_)
222 return;
223 if (obj->has_state()) {
224 // We have a valid value, output this value
225 stream->print(ESPHOME_F("esphome_binary_sensor_failed{id=\""));
226 stream->print(relabel_id_(obj).c_str());
227 add_area_label_(stream, area);
228 add_node_label_(stream, node);
229 add_friendly_name_label_(stream, friendly_name);
230 stream->print(ESPHOME_F("\",name=\""));
231 stream->print(relabel_name_(obj).c_str());
232 stream->print(ESPHOME_F("\"} 0\n"));
233 // Data itself
234 stream->print(ESPHOME_F("esphome_binary_sensor_value{id=\""));
235 stream->print(relabel_id_(obj).c_str());
236 add_area_label_(stream, area);
237 add_node_label_(stream, node);
238 add_friendly_name_label_(stream, friendly_name);
239 stream->print(ESPHOME_F("\",name=\""));
240 stream->print(relabel_name_(obj).c_str());
241 stream->print(ESPHOME_F("\"} "));
242 stream->print(obj->state);
243 stream->print(ESPHOME_F("\n"));
244 } else {
245 // Invalid state
246 stream->print(ESPHOME_F("esphome_binary_sensor_failed{id=\""));
247 stream->print(relabel_id_(obj).c_str());
248 add_area_label_(stream, area);
249 add_node_label_(stream, node);
250 add_friendly_name_label_(stream, friendly_name);
251 stream->print(ESPHOME_F("\",name=\""));
252 stream->print(relabel_name_(obj).c_str());
253 stream->print(ESPHOME_F("\"} 1\n"));
254 }
255}
256#endif
257
258#ifdef USE_FAN
259void PrometheusHandler::fan_type_(AsyncResponseStream *stream) {
260 stream->print(ESPHOME_F("#TYPE esphome_fan_value gauge\n"));
261 stream->print(ESPHOME_F("#TYPE esphome_fan_failed gauge\n"));
262 stream->print(ESPHOME_F("#TYPE esphome_fan_speed gauge\n"));
263 stream->print(ESPHOME_F("#TYPE esphome_fan_oscillation gauge\n"));
264}
265void PrometheusHandler::fan_row_(AsyncResponseStream *stream, fan::Fan *obj, std::string &area, std::string &node,
266 std::string &friendly_name) {
267 if (obj->is_internal() && !this->include_internal_)
268 return;
269 stream->print(ESPHOME_F("esphome_fan_failed{id=\""));
270 stream->print(relabel_id_(obj).c_str());
271 add_area_label_(stream, area);
272 add_node_label_(stream, node);
273 add_friendly_name_label_(stream, friendly_name);
274 stream->print(ESPHOME_F("\",name=\""));
275 stream->print(relabel_name_(obj).c_str());
276 stream->print(ESPHOME_F("\"} 0\n"));
277 // Data itself
278 stream->print(ESPHOME_F("esphome_fan_value{id=\""));
279 stream->print(relabel_id_(obj).c_str());
280 add_area_label_(stream, area);
281 add_node_label_(stream, node);
282 add_friendly_name_label_(stream, friendly_name);
283 stream->print(ESPHOME_F("\",name=\""));
284 stream->print(relabel_name_(obj).c_str());
285 stream->print(ESPHOME_F("\"} "));
286 stream->print(obj->state);
287 stream->print(ESPHOME_F("\n"));
288 // Speed if available
289 if (obj->get_traits().supports_speed()) {
290 stream->print(ESPHOME_F("esphome_fan_speed{id=\""));
291 stream->print(relabel_id_(obj).c_str());
292 add_area_label_(stream, area);
293 add_node_label_(stream, node);
294 add_friendly_name_label_(stream, friendly_name);
295 stream->print(ESPHOME_F("\",name=\""));
296 stream->print(relabel_name_(obj).c_str());
297 stream->print(ESPHOME_F("\"} "));
298 stream->print(obj->speed);
299 stream->print(ESPHOME_F("\n"));
300 }
301 // Oscillation if available
302 if (obj->get_traits().supports_oscillation()) {
303 stream->print(ESPHOME_F("esphome_fan_oscillation{id=\""));
304 stream->print(relabel_id_(obj).c_str());
305 add_area_label_(stream, area);
306 add_node_label_(stream, node);
307 add_friendly_name_label_(stream, friendly_name);
308 stream->print(ESPHOME_F("\",name=\""));
309 stream->print(relabel_name_(obj).c_str());
310 stream->print(ESPHOME_F("\"} "));
311 stream->print(obj->oscillating);
312 stream->print(ESPHOME_F("\n"));
313 }
314}
315#endif
316
317#ifdef USE_LIGHT
318void PrometheusHandler::light_type_(AsyncResponseStream *stream) {
319 stream->print(ESPHOME_F("#TYPE esphome_light_state gauge\n"));
320 stream->print(ESPHOME_F("#TYPE esphome_light_color gauge\n"));
321 stream->print(ESPHOME_F("#TYPE esphome_light_effect_active gauge\n"));
322}
323void PrometheusHandler::light_row_(AsyncResponseStream *stream, light::LightState *obj, std::string &area,
324 std::string &node, std::string &friendly_name) {
325 if (obj->is_internal() && !this->include_internal_)
326 return;
327 // State
328 print_metric_labels_(stream, ESPHOME_F("esphome_light_state"), obj, area, node, friendly_name);
329 stream->print(ESPHOME_F("\"} "));
330 stream->print(obj->remote_values.is_on());
331 stream->print(ESPHOME_F("\n"));
332 // Brightness and RGBW
333 light::LightColorValues color = obj->current_values;
334 float brightness, r, g, b, w;
335 color.as_brightness(&brightness);
336 color.as_rgbw(&r, &g, &b, &w);
337 if (obj->get_traits().supports_color_capability(light::ColorCapability::BRIGHTNESS)) {
338 print_metric_labels_(stream, ESPHOME_F("esphome_light_color"), obj, area, node, friendly_name);
339 stream->print(ESPHOME_F("\",channel=\"brightness\"} "));
340 stream->print(brightness);
341 stream->print(ESPHOME_F("\n"));
342 }
343 if (obj->get_traits().supports_color_capability(light::ColorCapability::RGB)) {
344 print_metric_labels_(stream, ESPHOME_F("esphome_light_color"), obj, area, node, friendly_name);
345 stream->print(ESPHOME_F("\",channel=\"r\"} "));
346 stream->print(r);
347 stream->print(ESPHOME_F("\n"));
348 print_metric_labels_(stream, ESPHOME_F("esphome_light_color"), obj, area, node, friendly_name);
349 stream->print(ESPHOME_F("\",channel=\"g\"} "));
350 stream->print(g);
351 stream->print(ESPHOME_F("\n"));
352 print_metric_labels_(stream, ESPHOME_F("esphome_light_color"), obj, area, node, friendly_name);
353 stream->print(ESPHOME_F("\",channel=\"b\"} "));
354 stream->print(b);
355 stream->print(ESPHOME_F("\n"));
356 }
357 if (obj->get_traits().supports_color_capability(light::ColorCapability::WHITE)) {
358 print_metric_labels_(stream, ESPHOME_F("esphome_light_color"), obj, area, node, friendly_name);
359 stream->print(ESPHOME_F("\",channel=\"w\"} "));
360 stream->print(w);
361 stream->print(ESPHOME_F("\n"));
362 }
363 // Skip effect metrics if light has no effects
364 if (!obj->get_effects().empty()) {
365 // Effect
366 std::string effect = obj->get_effect_name();
367 print_metric_labels_(stream, ESPHOME_F("esphome_light_effect_active"), obj, area, node, friendly_name);
368 stream->print(ESPHOME_F("\",effect=\""));
369 // Only vary based on effect
370 if (effect == "None") {
371 stream->print(ESPHOME_F("None\"} 0\n"));
372 } else {
373 stream->print(effect.c_str());
374 stream->print(ESPHOME_F("\"} 1\n"));
375 }
376 }
377}
378#endif
379
380#ifdef USE_COVER
381void PrometheusHandler::cover_type_(AsyncResponseStream *stream) {
382 stream->print(ESPHOME_F("#TYPE esphome_cover_value gauge\n"));
383 stream->print(ESPHOME_F("#TYPE esphome_cover_failed gauge\n"));
384}
385void PrometheusHandler::cover_row_(AsyncResponseStream *stream, cover::Cover *obj, std::string &area, std::string &node,
386 std::string &friendly_name) {
387 if (obj->is_internal() && !this->include_internal_)
388 return;
389 if (!std::isnan(obj->position)) {
390 // We have a valid value, output this value
391 stream->print(ESPHOME_F("esphome_cover_failed{id=\""));
392 stream->print(relabel_id_(obj).c_str());
393 add_area_label_(stream, area);
394 add_node_label_(stream, node);
395 add_friendly_name_label_(stream, friendly_name);
396 stream->print(ESPHOME_F("\",name=\""));
397 stream->print(relabel_name_(obj).c_str());
398 stream->print(ESPHOME_F("\"} 0\n"));
399 // Data itself
400 stream->print(ESPHOME_F("esphome_cover_value{id=\""));
401 stream->print(relabel_id_(obj).c_str());
402 add_area_label_(stream, area);
403 add_node_label_(stream, node);
404 add_friendly_name_label_(stream, friendly_name);
405 stream->print(ESPHOME_F("\",name=\""));
406 stream->print(relabel_name_(obj).c_str());
407 stream->print(ESPHOME_F("\"} "));
408 stream->print(obj->position);
409 stream->print(ESPHOME_F("\n"));
410 if (obj->get_traits().get_supports_tilt()) {
411 stream->print(ESPHOME_F("esphome_cover_tilt{id=\""));
412 stream->print(relabel_id_(obj).c_str());
413 add_area_label_(stream, area);
414 add_node_label_(stream, node);
415 add_friendly_name_label_(stream, friendly_name);
416 stream->print(ESPHOME_F("\",name=\""));
417 stream->print(relabel_name_(obj).c_str());
418 stream->print(ESPHOME_F("\"} "));
419 stream->print(obj->tilt);
420 stream->print(ESPHOME_F("\n"));
421 }
422 } else {
423 // Invalid state
424 stream->print(ESPHOME_F("esphome_cover_failed{id=\""));
425 stream->print(relabel_id_(obj).c_str());
426 add_area_label_(stream, area);
427 add_node_label_(stream, node);
428 add_friendly_name_label_(stream, friendly_name);
429 stream->print(ESPHOME_F("\",name=\""));
430 stream->print(relabel_name_(obj).c_str());
431 stream->print(ESPHOME_F("\"} 1\n"));
432 }
433}
434#endif
435
436#ifdef USE_SWITCH
437void PrometheusHandler::switch_type_(AsyncResponseStream *stream) {
438 stream->print(ESPHOME_F("#TYPE esphome_switch_value gauge\n"));
439 stream->print(ESPHOME_F("#TYPE esphome_switch_failed gauge\n"));
440}
441void PrometheusHandler::switch_row_(AsyncResponseStream *stream, switch_::Switch *obj, std::string &area,
442 std::string &node, std::string &friendly_name) {
443 if (obj->is_internal() && !this->include_internal_)
444 return;
445 stream->print(ESPHOME_F("esphome_switch_failed{id=\""));
446 stream->print(relabel_id_(obj).c_str());
447 add_area_label_(stream, area);
448 add_node_label_(stream, node);
449 add_friendly_name_label_(stream, friendly_name);
450 stream->print(ESPHOME_F("\",name=\""));
451 stream->print(relabel_name_(obj).c_str());
452 stream->print(ESPHOME_F("\"} 0\n"));
453 // Data itself
454 stream->print(ESPHOME_F("esphome_switch_value{id=\""));
455 stream->print(relabel_id_(obj).c_str());
456 add_area_label_(stream, area);
457 add_node_label_(stream, node);
458 add_friendly_name_label_(stream, friendly_name);
459 stream->print(ESPHOME_F("\",name=\""));
460 stream->print(relabel_name_(obj).c_str());
461 stream->print(ESPHOME_F("\"} "));
462 stream->print(obj->state);
463 stream->print(ESPHOME_F("\n"));
464}
465#endif
466
467#ifdef USE_LOCK
468void PrometheusHandler::lock_type_(AsyncResponseStream *stream) {
469 stream->print(ESPHOME_F("#TYPE esphome_lock_value gauge\n"));
470 stream->print(ESPHOME_F("#TYPE esphome_lock_failed gauge\n"));
471}
472void PrometheusHandler::lock_row_(AsyncResponseStream *stream, lock::Lock *obj, std::string &area, std::string &node,
473 std::string &friendly_name) {
474 if (obj->is_internal() && !this->include_internal_)
475 return;
476 stream->print(ESPHOME_F("esphome_lock_failed{id=\""));
477 stream->print(relabel_id_(obj).c_str());
478 add_area_label_(stream, area);
479 add_node_label_(stream, node);
480 add_friendly_name_label_(stream, friendly_name);
481 stream->print(ESPHOME_F("\",name=\""));
482 stream->print(relabel_name_(obj).c_str());
483 stream->print(ESPHOME_F("\"} 0\n"));
484 // Data itself
485 stream->print(ESPHOME_F("esphome_lock_value{id=\""));
486 stream->print(relabel_id_(obj).c_str());
487 add_area_label_(stream, area);
488 add_node_label_(stream, node);
489 add_friendly_name_label_(stream, friendly_name);
490 stream->print(ESPHOME_F("\",name=\""));
491 stream->print(relabel_name_(obj).c_str());
492 stream->print(ESPHOME_F("\"} "));
493 stream->print(obj->state);
494 stream->print(ESPHOME_F("\n"));
495}
496#endif
497
498// Type-specific implementation
499#ifdef USE_TEXT_SENSOR
500void PrometheusHandler::text_sensor_type_(AsyncResponseStream *stream) {
501 stream->print(ESPHOME_F("#TYPE esphome_text_sensor_value gauge\n"));
502 stream->print(ESPHOME_F("#TYPE esphome_text_sensor_failed gauge\n"));
503}
504void PrometheusHandler::text_sensor_row_(AsyncResponseStream *stream, text_sensor::TextSensor *obj, std::string &area,
505 std::string &node, std::string &friendly_name) {
506 if (obj->is_internal() && !this->include_internal_)
507 return;
508 if (obj->has_state()) {
509 // We have a valid value, output this value
510 stream->print(ESPHOME_F("esphome_text_sensor_failed{id=\""));
511 stream->print(relabel_id_(obj).c_str());
512 add_area_label_(stream, area);
513 add_node_label_(stream, node);
514 add_friendly_name_label_(stream, friendly_name);
515 stream->print(ESPHOME_F("\",name=\""));
516 stream->print(relabel_name_(obj).c_str());
517 stream->print(ESPHOME_F("\"} 0\n"));
518 // Data itself
519 stream->print(ESPHOME_F("esphome_text_sensor_value{id=\""));
520 stream->print(relabel_id_(obj).c_str());
521 add_area_label_(stream, area);
522 add_node_label_(stream, node);
523 add_friendly_name_label_(stream, friendly_name);
524 stream->print(ESPHOME_F("\",name=\""));
525 stream->print(relabel_name_(obj).c_str());
526 stream->print(ESPHOME_F("\",value=\""));
527 stream->print(obj->state.c_str());
528 stream->print(ESPHOME_F("\"} "));
529 stream->print(ESPHOME_F("1.0"));
530 stream->print(ESPHOME_F("\n"));
531 } else {
532 // Invalid state
533 stream->print(ESPHOME_F("esphome_text_sensor_failed{id=\""));
534 stream->print(relabel_id_(obj).c_str());
535 add_area_label_(stream, area);
536 add_node_label_(stream, node);
537 add_friendly_name_label_(stream, friendly_name);
538 stream->print(ESPHOME_F("\",name=\""));
539 stream->print(relabel_name_(obj).c_str());
540 stream->print(ESPHOME_F("\"} 1\n"));
541 }
542}
543#endif
544
545// Type-specific implementation
546#ifdef USE_TEXT
547void PrometheusHandler::text_type_(AsyncResponseStream *stream) {
548 stream->print(ESPHOME_F("#TYPE esphome_text_value gauge\n"));
549 stream->print(ESPHOME_F("#TYPE esphome_text_failed gauge\n"));
550}
551void PrometheusHandler::text_row_(AsyncResponseStream *stream, text::Text *obj, std::string &area, std::string &node,
552 std::string &friendly_name) {
553 if (obj->is_internal() && !this->include_internal_)
554 return;
555 if (obj->has_state()) {
556 // We have a valid value, output this value
557 stream->print(ESPHOME_F("esphome_text_failed{id=\""));
558 stream->print(relabel_id_(obj).c_str());
559 add_area_label_(stream, area);
560 add_node_label_(stream, node);
561 add_friendly_name_label_(stream, friendly_name);
562 stream->print(ESPHOME_F("\",name=\""));
563 stream->print(relabel_name_(obj).c_str());
564 stream->print(ESPHOME_F("\"} 0\n"));
565 // Data itself
566 stream->print(ESPHOME_F("esphome_text_value{id=\""));
567 stream->print(relabel_id_(obj).c_str());
568 add_area_label_(stream, area);
569 add_node_label_(stream, node);
570 add_friendly_name_label_(stream, friendly_name);
571 stream->print(ESPHOME_F("\",name=\""));
572 stream->print(relabel_name_(obj).c_str());
573 stream->print(ESPHOME_F("\",value=\""));
574 stream->print(obj->state.c_str());
575 stream->print(ESPHOME_F("\"} "));
576 stream->print(ESPHOME_F("1.0"));
577 stream->print(ESPHOME_F("\n"));
578 } else {
579 // Invalid state
580 stream->print(ESPHOME_F("esphome_text_failed{id=\""));
581 stream->print(relabel_id_(obj).c_str());
582 add_area_label_(stream, area);
583 add_node_label_(stream, node);
584 add_friendly_name_label_(stream, friendly_name);
585 stream->print(ESPHOME_F("\",name=\""));
586 stream->print(relabel_name_(obj).c_str());
587 stream->print(ESPHOME_F("\"} 1\n"));
588 }
589}
590#endif
591
592// Type-specific implementation
593#ifdef USE_EVENT
594void PrometheusHandler::event_type_(AsyncResponseStream *stream) {
595 stream->print(ESPHOME_F("#TYPE esphome_event_value gauge\n"));
596 stream->print(ESPHOME_F("#TYPE esphome_event_failed gauge\n"));
597}
598void PrometheusHandler::event_row_(AsyncResponseStream *stream, event::Event *obj, std::string &area, std::string &node,
599 std::string &friendly_name) {
600 if (obj->is_internal() && !this->include_internal_)
601 return;
602 if (obj->get_last_event_type() != nullptr) {
603 // We have a valid event type, output this value
604 stream->print(ESPHOME_F("esphome_event_failed{id=\""));
605 stream->print(relabel_id_(obj).c_str());
606 add_area_label_(stream, area);
607 add_node_label_(stream, node);
608 add_friendly_name_label_(stream, friendly_name);
609 stream->print(ESPHOME_F("\",name=\""));
610 stream->print(relabel_name_(obj).c_str());
611 stream->print(ESPHOME_F("\"} 0\n"));
612 // Data itself
613 stream->print(ESPHOME_F("esphome_event_value{id=\""));
614 stream->print(relabel_id_(obj).c_str());
615 add_area_label_(stream, area);
616 add_node_label_(stream, node);
617 add_friendly_name_label_(stream, friendly_name);
618 stream->print(ESPHOME_F("\",name=\""));
619 stream->print(relabel_name_(obj).c_str());
620 stream->print(ESPHOME_F("\",last_event_type=\""));
621 stream->print(obj->get_last_event_type());
622 stream->print(ESPHOME_F("\"} "));
623 stream->print(ESPHOME_F("1.0"));
624 stream->print(ESPHOME_F("\n"));
625 } else {
626 // No event triggered yet
627 stream->print(ESPHOME_F("esphome_event_failed{id=\""));
628 stream->print(relabel_id_(obj).c_str());
629 add_area_label_(stream, area);
630 add_node_label_(stream, node);
631 add_friendly_name_label_(stream, friendly_name);
632 stream->print(ESPHOME_F("\",name=\""));
633 stream->print(relabel_name_(obj).c_str());
634 stream->print(ESPHOME_F("\"} 1\n"));
635 }
636}
637#endif
638
639// Type-specific implementation
640#ifdef USE_NUMBER
641void PrometheusHandler::number_type_(AsyncResponseStream *stream) {
642 stream->print(ESPHOME_F("#TYPE esphome_number_value gauge\n"));
643 stream->print(ESPHOME_F("#TYPE esphome_number_failed gauge\n"));
644}
645void PrometheusHandler::number_row_(AsyncResponseStream *stream, number::Number *obj, std::string &area,
646 std::string &node, std::string &friendly_name) {
647 if (obj->is_internal() && !this->include_internal_)
648 return;
649 if (!std::isnan(obj->state)) {
650 // We have a valid value, output this value
651 stream->print(ESPHOME_F("esphome_number_failed{id=\""));
652 stream->print(relabel_id_(obj).c_str());
653 add_area_label_(stream, area);
654 add_node_label_(stream, node);
655 add_friendly_name_label_(stream, friendly_name);
656 stream->print(ESPHOME_F("\",name=\""));
657 stream->print(relabel_name_(obj).c_str());
658 stream->print(ESPHOME_F("\"} 0\n"));
659 // Data itself
660 stream->print(ESPHOME_F("esphome_number_value{id=\""));
661 stream->print(relabel_id_(obj).c_str());
662 add_area_label_(stream, area);
663 add_node_label_(stream, node);
664 add_friendly_name_label_(stream, friendly_name);
665 stream->print(ESPHOME_F("\",name=\""));
666 stream->print(relabel_name_(obj).c_str());
667 stream->print(ESPHOME_F("\"} "));
668 stream->print(obj->state);
669 stream->print(ESPHOME_F("\n"));
670 } else {
671 // Invalid state
672 stream->print(ESPHOME_F("esphome_number_failed{id=\""));
673 stream->print(relabel_id_(obj).c_str());
674 add_area_label_(stream, area);
675 add_node_label_(stream, node);
676 add_friendly_name_label_(stream, friendly_name);
677 stream->print(ESPHOME_F("\",name=\""));
678 stream->print(relabel_name_(obj).c_str());
679 stream->print(ESPHOME_F("\"} 1\n"));
680 }
681}
682#endif
683
684#ifdef USE_SELECT
685void PrometheusHandler::select_type_(AsyncResponseStream *stream) {
686 stream->print(ESPHOME_F("#TYPE esphome_select_value gauge\n"));
687 stream->print(ESPHOME_F("#TYPE esphome_select_failed gauge\n"));
688}
689void PrometheusHandler::select_row_(AsyncResponseStream *stream, select::Select *obj, std::string &area,
690 std::string &node, std::string &friendly_name) {
691 if (obj->is_internal() && !this->include_internal_)
692 return;
693 if (obj->has_state()) {
694 // We have a valid value, output this value
695 stream->print(ESPHOME_F("esphome_select_failed{id=\""));
696 stream->print(relabel_id_(obj).c_str());
697 add_area_label_(stream, area);
698 add_node_label_(stream, node);
699 add_friendly_name_label_(stream, friendly_name);
700 stream->print(ESPHOME_F("\",name=\""));
701 stream->print(relabel_name_(obj).c_str());
702 stream->print(ESPHOME_F("\"} 0\n"));
703 // Data itself
704 stream->print(ESPHOME_F("esphome_select_value{id=\""));
705 stream->print(relabel_id_(obj).c_str());
706 add_area_label_(stream, area);
707 add_node_label_(stream, node);
708 add_friendly_name_label_(stream, friendly_name);
709 stream->print(ESPHOME_F("\",name=\""));
710 stream->print(relabel_name_(obj).c_str());
711 stream->print(ESPHOME_F("\",value=\""));
712 stream->print(obj->current_option());
713 stream->print(ESPHOME_F("\"} "));
714 stream->print(ESPHOME_F("1.0"));
715 stream->print(ESPHOME_F("\n"));
716 } else {
717 // Invalid state
718 stream->print(ESPHOME_F("esphome_select_failed{id=\""));
719 stream->print(relabel_id_(obj).c_str());
720 add_area_label_(stream, area);
721 add_node_label_(stream, node);
722 add_friendly_name_label_(stream, friendly_name);
723 stream->print(ESPHOME_F("\",name=\""));
724 stream->print(relabel_name_(obj).c_str());
725 stream->print(ESPHOME_F("\"} 1\n"));
726 }
727}
728#endif
729
730#ifdef USE_MEDIA_PLAYER
731void PrometheusHandler::media_player_type_(AsyncResponseStream *stream) {
732 stream->print(ESPHOME_F("#TYPE esphome_media_player_state_value gauge\n"));
733 stream->print(ESPHOME_F("#TYPE esphome_media_player_volume gauge\n"));
734 stream->print(ESPHOME_F("#TYPE esphome_media_player_is_muted gauge\n"));
735 stream->print(ESPHOME_F("#TYPE esphome_media_player_failed gauge\n"));
736}
737void PrometheusHandler::media_player_row_(AsyncResponseStream *stream, media_player::MediaPlayer *obj,
738 std::string &area, std::string &node, std::string &friendly_name) {
739 if (obj->is_internal() && !this->include_internal_)
740 return;
741 stream->print(ESPHOME_F("esphome_media_player_failed{id=\""));
742 stream->print(relabel_id_(obj).c_str());
743 add_area_label_(stream, area);
744 add_node_label_(stream, node);
745 add_friendly_name_label_(stream, friendly_name);
746 stream->print(ESPHOME_F("\",name=\""));
747 stream->print(relabel_name_(obj).c_str());
748 stream->print(ESPHOME_F("\"} 0\n"));
749 // Data itself
750 stream->print(ESPHOME_F("esphome_media_player_state_value{id=\""));
751 stream->print(relabel_id_(obj).c_str());
752 add_area_label_(stream, area);
753 add_node_label_(stream, node);
754 add_friendly_name_label_(stream, friendly_name);
755 stream->print(ESPHOME_F("\",name=\""));
756 stream->print(relabel_name_(obj).c_str());
757 stream->print(ESPHOME_F("\",value=\""));
758 stream->print(media_player::media_player_state_to_string(obj->state));
759 stream->print(ESPHOME_F("\"} "));
760 stream->print(ESPHOME_F("1.0"));
761 stream->print(ESPHOME_F("\n"));
762 stream->print(ESPHOME_F("esphome_media_player_volume{id=\""));
763 stream->print(relabel_id_(obj).c_str());
764 add_area_label_(stream, area);
765 add_node_label_(stream, node);
766 add_friendly_name_label_(stream, friendly_name);
767 stream->print(ESPHOME_F("\",name=\""));
768 stream->print(relabel_name_(obj).c_str());
769 stream->print(ESPHOME_F("\"} "));
770 stream->print(obj->volume);
771 stream->print(ESPHOME_F("\n"));
772 stream->print(ESPHOME_F("esphome_media_player_is_muted{id=\""));
773 stream->print(relabel_id_(obj).c_str());
774 add_area_label_(stream, area);
775 add_node_label_(stream, node);
776 add_friendly_name_label_(stream, friendly_name);
777 stream->print(ESPHOME_F("\",name=\""));
778 stream->print(relabel_name_(obj).c_str());
779 stream->print(ESPHOME_F("\"} "));
780 if (obj->is_muted()) {
781 stream->print(ESPHOME_F("1.0"));
782 } else {
783 stream->print(ESPHOME_F("0.0"));
784 }
785 stream->print(ESPHOME_F("\n"));
786}
787#endif
788
789#ifdef USE_UPDATE
790void PrometheusHandler::update_entity_type_(AsyncResponseStream *stream) {
791 stream->print(ESPHOME_F("#TYPE esphome_update_entity_state gauge\n"));
792 stream->print(ESPHOME_F("#TYPE esphome_update_entity_info gauge\n"));
793 stream->print(ESPHOME_F("#TYPE esphome_update_entity_failed gauge\n"));
794}
795
796void PrometheusHandler::handle_update_state_(AsyncResponseStream *stream, update::UpdateState state) {
797 switch (state) {
799 stream->print("unknown");
800 break;
802 stream->print("none");
803 break;
805 stream->print("available");
806 break;
808 stream->print("installing");
809 break;
810 default:
811 stream->print("invalid");
812 break;
813 }
814}
815
816void PrometheusHandler::update_entity_row_(AsyncResponseStream *stream, update::UpdateEntity *obj, std::string &area,
817 std::string &node, std::string &friendly_name) {
818 if (obj->is_internal() && !this->include_internal_)
819 return;
820 if (obj->has_state()) {
821 // We have a valid value, output this value
822 stream->print(ESPHOME_F("esphome_update_entity_failed{id=\""));
823 stream->print(relabel_id_(obj).c_str());
824 add_area_label_(stream, area);
825 add_node_label_(stream, node);
826 add_friendly_name_label_(stream, friendly_name);
827 stream->print(ESPHOME_F("\",name=\""));
828 stream->print(relabel_name_(obj).c_str());
829 stream->print(ESPHOME_F("\"} 0\n"));
830 // First update state
831 stream->print(ESPHOME_F("esphome_update_entity_state{id=\""));
832 stream->print(relabel_id_(obj).c_str());
833 add_area_label_(stream, area);
834 add_node_label_(stream, node);
835 add_friendly_name_label_(stream, friendly_name);
836 stream->print(ESPHOME_F("\",name=\""));
837 stream->print(relabel_name_(obj).c_str());
838 stream->print(ESPHOME_F("\",value=\""));
839 handle_update_state_(stream, obj->state);
840 stream->print(ESPHOME_F("\"} "));
841 stream->print(ESPHOME_F("1.0"));
842 stream->print(ESPHOME_F("\n"));
843 // Next update info
844 stream->print(ESPHOME_F("esphome_update_entity_info{id=\""));
845 stream->print(relabel_id_(obj).c_str());
846 add_area_label_(stream, area);
847 add_node_label_(stream, node);
848 add_friendly_name_label_(stream, friendly_name);
849 stream->print(ESPHOME_F("\",name=\""));
850 stream->print(relabel_name_(obj).c_str());
851 stream->print(ESPHOME_F("\",current_version=\""));
852 stream->print(obj->update_info.current_version.c_str());
853 stream->print(ESPHOME_F("\",latest_version=\""));
854 stream->print(obj->update_info.latest_version.c_str());
855 stream->print(ESPHOME_F("\",title=\""));
856 stream->print(obj->update_info.title.c_str());
857 stream->print(ESPHOME_F("\"} "));
858 stream->print(ESPHOME_F("1.0"));
859 stream->print(ESPHOME_F("\n"));
860 } else {
861 // Invalid state
862 stream->print(ESPHOME_F("esphome_update_entity_failed{id=\""));
863 stream->print(relabel_id_(obj).c_str());
864 add_area_label_(stream, area);
865 add_node_label_(stream, node);
866 add_friendly_name_label_(stream, friendly_name);
867 stream->print(ESPHOME_F("\",name=\""));
868 stream->print(relabel_name_(obj).c_str());
869 stream->print(ESPHOME_F("\"} 1\n"));
870 }
871}
872#endif
873
874#ifdef USE_VALVE
875void PrometheusHandler::valve_type_(AsyncResponseStream *stream) {
876 stream->print(ESPHOME_F("#TYPE esphome_valve_operation gauge\n"));
877 stream->print(ESPHOME_F("#TYPE esphome_valve_failed gauge\n"));
878 stream->print(ESPHOME_F("#TYPE esphome_valve_position gauge\n"));
879}
880
881void PrometheusHandler::valve_row_(AsyncResponseStream *stream, valve::Valve *obj, std::string &area, std::string &node,
882 std::string &friendly_name) {
883 if (obj->is_internal() && !this->include_internal_)
884 return;
885 stream->print(ESPHOME_F("esphome_valve_failed{id=\""));
886 stream->print(relabel_id_(obj).c_str());
887 add_area_label_(stream, area);
888 add_node_label_(stream, node);
889 add_friendly_name_label_(stream, friendly_name);
890 stream->print(ESPHOME_F("\",name=\""));
891 stream->print(relabel_name_(obj).c_str());
892 stream->print(ESPHOME_F("\"} 0\n"));
893 // Data itself
894 stream->print(ESPHOME_F("esphome_valve_operation{id=\""));
895 stream->print(relabel_id_(obj).c_str());
896 add_area_label_(stream, area);
897 add_node_label_(stream, node);
898 add_friendly_name_label_(stream, friendly_name);
899 stream->print(ESPHOME_F("\",name=\""));
900 stream->print(relabel_name_(obj).c_str());
901 stream->print(ESPHOME_F("\",operation=\""));
902#ifdef USE_STORE_LOG_STR_IN_FLASH
903 stream->print((const __FlashStringHelper *) valve::valve_operation_to_str(obj->current_operation));
904#else
905 stream->print((const char *) valve::valve_operation_to_str(obj->current_operation));
906#endif
907 stream->print(ESPHOME_F("\"} "));
908 stream->print(ESPHOME_F("1.0"));
909 stream->print(ESPHOME_F("\n"));
910 // Now see if position is supported
911 if (obj->get_traits().get_supports_position()) {
912 stream->print(ESPHOME_F("esphome_valve_position{id=\""));
913 stream->print(relabel_id_(obj).c_str());
914 add_area_label_(stream, area);
915 add_node_label_(stream, node);
916 add_friendly_name_label_(stream, friendly_name);
917 stream->print(ESPHOME_F("\",name=\""));
918 stream->print(relabel_name_(obj).c_str());
919 stream->print(ESPHOME_F("\"} "));
920 stream->print(obj->position);
921 stream->print(ESPHOME_F("\n"));
922 }
923}
924#endif
925
926#ifdef USE_CLIMATE
927void PrometheusHandler::climate_type_(AsyncResponseStream *stream) {
928 stream->print(ESPHOME_F("#TYPE esphome_climate_setting gauge\n"));
929 stream->print(ESPHOME_F("#TYPE esphome_climate_value gauge\n"));
930 stream->print(ESPHOME_F("#TYPE esphome_climate_failed gauge\n"));
931}
932
933void PrometheusHandler::climate_setting_row_(AsyncResponseStream *stream, climate::Climate *obj, std::string &area,
934 std::string &node, std::string &friendly_name, std::string &setting,
935 const LogString *setting_value) {
936 stream->print(ESPHOME_F("esphome_climate_setting{id=\""));
937 stream->print(relabel_id_(obj).c_str());
938 add_area_label_(stream, area);
939 add_node_label_(stream, node);
940 add_friendly_name_label_(stream, friendly_name);
941 stream->print(ESPHOME_F("\",name=\""));
942 stream->print(relabel_name_(obj).c_str());
943 stream->print(ESPHOME_F("\",category=\""));
944 stream->print(setting.c_str());
945 stream->print(ESPHOME_F("\",setting_value=\""));
946 stream->print(LOG_STR_ARG(setting_value));
947 stream->print(ESPHOME_F("\"} "));
948 stream->print(ESPHOME_F("1.0"));
949 stream->print(ESPHOME_F("\n"));
950}
951
952void PrometheusHandler::climate_value_row_(AsyncResponseStream *stream, climate::Climate *obj, std::string &area,
953 std::string &node, std::string &friendly_name, std::string &category,
954 std::string &climate_value) {
955 stream->print(ESPHOME_F("esphome_climate_value{id=\""));
956 stream->print(relabel_id_(obj).c_str());
957 add_area_label_(stream, area);
958 add_node_label_(stream, node);
959 add_friendly_name_label_(stream, friendly_name);
960 stream->print(ESPHOME_F("\",name=\""));
961 stream->print(relabel_name_(obj).c_str());
962 stream->print(ESPHOME_F("\",category=\""));
963 stream->print(category.c_str());
964 stream->print(ESPHOME_F("\"} "));
965 stream->print(climate_value.c_str());
966 stream->print(ESPHOME_F("\n"));
967}
968
969void PrometheusHandler::climate_failed_row_(AsyncResponseStream *stream, climate::Climate *obj, std::string &area,
970 std::string &node, std::string &friendly_name, std::string &category,
971 bool is_failed_value) {
972 stream->print(ESPHOME_F("esphome_climate_failed{id=\""));
973 stream->print(relabel_id_(obj).c_str());
974 add_area_label_(stream, area);
975 add_node_label_(stream, node);
976 add_friendly_name_label_(stream, friendly_name);
977 stream->print(ESPHOME_F("\",name=\""));
978 stream->print(relabel_name_(obj).c_str());
979 stream->print(ESPHOME_F("\",category=\""));
980 stream->print(category.c_str());
981 stream->print(ESPHOME_F("\"} "));
982 if (is_failed_value) {
983 stream->print(ESPHOME_F("1.0"));
984 } else {
985 stream->print(ESPHOME_F("0.0"));
986 }
987 stream->print(ESPHOME_F("\n"));
988}
989
990void PrometheusHandler::climate_row_(AsyncResponseStream *stream, climate::Climate *obj, std::string &area,
991 std::string &node, std::string &friendly_name) {
992 if (obj->is_internal() && !this->include_internal_)
993 return;
994 // Data itself
995 bool any_failures = false;
996 std::string climate_mode_category = "mode";
997 const auto *climate_mode_value = climate::climate_mode_to_string(obj->mode);
998 climate_setting_row_(stream, obj, area, node, friendly_name, climate_mode_category, climate_mode_value);
999 const auto traits = obj->get_traits();
1000 // Now see if traits is supported
1001 int8_t target_accuracy = traits.get_target_temperature_accuracy_decimals();
1002 int8_t current_accuracy = traits.get_current_temperature_accuracy_decimals();
1003 // max temp
1004 std::string max_temp = "maximum_temperature";
1005 auto max_temp_value = value_accuracy_to_string(traits.get_visual_max_temperature(), target_accuracy);
1006 climate_value_row_(stream, obj, area, node, friendly_name, max_temp, max_temp_value);
1007 // max temp
1008 std::string min_temp = "mininum_temperature";
1009 auto min_temp_value = value_accuracy_to_string(traits.get_visual_min_temperature(), target_accuracy);
1010 climate_value_row_(stream, obj, area, node, friendly_name, min_temp, min_temp_value);
1011 // now check optional traits
1012 if (traits.has_feature_flags(climate::CLIMATE_SUPPORTS_CURRENT_TEMPERATURE)) {
1013 std::string current_temp = "current_temperature";
1014 if (std::isnan(obj->current_temperature)) {
1015 climate_failed_row_(stream, obj, area, node, friendly_name, current_temp, true);
1016 any_failures = true;
1017 } else {
1018 auto current_temp_value = value_accuracy_to_string(obj->current_temperature, current_accuracy);
1019 climate_value_row_(stream, obj, area, node, friendly_name, current_temp, current_temp_value);
1020 climate_failed_row_(stream, obj, area, node, friendly_name, current_temp, false);
1021 }
1022 }
1023 if (traits.has_feature_flags(climate::CLIMATE_SUPPORTS_CURRENT_HUMIDITY)) {
1024 std::string current_humidity = "current_humidity";
1025 if (std::isnan(obj->current_humidity)) {
1026 climate_failed_row_(stream, obj, area, node, friendly_name, current_humidity, true);
1027 any_failures = true;
1028 } else {
1029 auto current_humidity_value = value_accuracy_to_string(obj->current_humidity, 0);
1030 climate_value_row_(stream, obj, area, node, friendly_name, current_humidity, current_humidity_value);
1031 climate_failed_row_(stream, obj, area, node, friendly_name, current_humidity, false);
1032 }
1033 }
1034 if (traits.has_feature_flags(climate::CLIMATE_SUPPORTS_TARGET_HUMIDITY)) {
1035 std::string target_humidity = "target_humidity";
1036 if (std::isnan(obj->target_humidity)) {
1037 climate_failed_row_(stream, obj, area, node, friendly_name, target_humidity, true);
1038 any_failures = true;
1039 } else {
1040 auto target_humidity_value = value_accuracy_to_string(obj->target_humidity, 0);
1041 climate_value_row_(stream, obj, area, node, friendly_name, target_humidity, target_humidity_value);
1042 climate_failed_row_(stream, obj, area, node, friendly_name, target_humidity, false);
1043 }
1044 }
1045 if (traits.has_feature_flags(climate::CLIMATE_SUPPORTS_TWO_POINT_TARGET_TEMPERATURE |
1047 std::string target_temp_low = "target_temperature_low";
1048 auto target_temp_low_value = value_accuracy_to_string(obj->target_temperature_low, target_accuracy);
1049 climate_value_row_(stream, obj, area, node, friendly_name, target_temp_low, target_temp_low_value);
1050 std::string target_temp_high = "target_temperature_high";
1051 auto target_temp_high_value = value_accuracy_to_string(obj->target_temperature_high, target_accuracy);
1052 climate_value_row_(stream, obj, area, node, friendly_name, target_temp_high, target_temp_high_value);
1053 } else {
1054 std::string target_temp = "target_temperature";
1055 auto target_temp_value = value_accuracy_to_string(obj->target_temperature, target_accuracy);
1056 climate_value_row_(stream, obj, area, node, friendly_name, target_temp, target_temp_value);
1057 }
1058 if (traits.has_feature_flags(climate::CLIMATE_SUPPORTS_ACTION)) {
1059 std::string climate_trait_category = "action";
1060 const auto *climate_trait_value = climate::climate_action_to_string(obj->action);
1061 climate_setting_row_(stream, obj, area, node, friendly_name, climate_trait_category, climate_trait_value);
1062 }
1063 if (traits.get_supports_fan_modes()) {
1064 std::string climate_trait_category = "fan_mode";
1065 if (obj->fan_mode.has_value()) {
1066 const auto *climate_trait_value = climate::climate_fan_mode_to_string(obj->fan_mode.value());
1067 climate_setting_row_(stream, obj, area, node, friendly_name, climate_trait_category, climate_trait_value);
1068 climate_failed_row_(stream, obj, area, node, friendly_name, climate_trait_category, false);
1069 } else {
1070 climate_failed_row_(stream, obj, area, node, friendly_name, climate_trait_category, true);
1071 any_failures = true;
1072 }
1073 }
1074 if (traits.get_supports_presets()) {
1075 std::string climate_trait_category = "preset";
1076 if (obj->preset.has_value()) {
1077 const auto *climate_trait_value = climate::climate_preset_to_string(obj->preset.value());
1078 climate_setting_row_(stream, obj, area, node, friendly_name, climate_trait_category, climate_trait_value);
1079 climate_failed_row_(stream, obj, area, node, friendly_name, climate_trait_category, false);
1080 } else {
1081 climate_failed_row_(stream, obj, area, node, friendly_name, climate_trait_category, true);
1082 any_failures = true;
1083 }
1084 }
1085 if (traits.get_supports_swing_modes()) {
1086 std::string climate_trait_category = "swing_mode";
1087 const auto *climate_trait_value = climate::climate_swing_mode_to_string(obj->swing_mode);
1088 climate_setting_row_(stream, obj, area, node, friendly_name, climate_trait_category, climate_trait_value);
1089 }
1090 std::string all_climate_category = "all";
1091 climate_failed_row_(stream, obj, area, node, friendly_name, all_climate_category, any_failures);
1092}
1093#endif
1094
1095} // namespace prometheus
1096} // namespace esphome
1097#endif
const std::string & get_friendly_name() const
Get the friendly name of this Application set by pre_setup().
const char * get_area() const
Get the area of this Application set by pre_setup().
const std::string & get_name() const
Get the name of this Application set by pre_setup().
auto & get_binary_sensors() const
void number_type_(AsyncResponseStream *stream)
Return the type for prometheus.
void add_friendly_name_label_(AsyncResponseStream *stream, std::string &friendly_name)
void handle_update_state_(AsyncResponseStream *stream, update::UpdateState state)
void climate_setting_row_(AsyncResponseStream *stream, climate::Climate *obj, std::string &area, std::string &node, std::string &friendly_name, std::string &setting, const LogString *setting_value)
void event_type_(AsyncResponseStream *stream)
Return the type for prometheus.
void media_player_row_(AsyncResponseStream *stream, media_player::MediaPlayer *obj, std::string &area, std::string &node, std::string &friendly_name)
Return the media player state as prometheus data point.
void light_type_(AsyncResponseStream *stream)
Return the type for prometheus.
void text_type_(AsyncResponseStream *stream)
Return the type for prometheus.
void update_entity_row_(AsyncResponseStream *stream, update::UpdateEntity *obj, std::string &area, std::string &node, std::string &friendly_name)
Return the update state and info as prometheus data point.
std::map< EntityBase *, std::string > relabel_map_id_
void fan_row_(AsyncResponseStream *stream, fan::Fan *obj, std::string &area, std::string &node, std::string &friendly_name)
Return the fan state as prometheus data point.
void climate_type_(AsyncResponseStream *stream)
Return the type for prometheus.
void binary_sensor_type_(AsyncResponseStream *stream)
Return the type for prometheus.
void switch_row_(AsyncResponseStream *stream, switch_::Switch *obj, std::string &area, std::string &node, std::string &friendly_name)
Return the switch values state as prometheus data point.
std::map< EntityBase *, std::string > relabel_map_name_
void sensor_row_(AsyncResponseStream *stream, sensor::Sensor *obj, std::string &area, std::string &node, std::string &friendly_name)
Return the sensor state as prometheus data point.
void light_row_(AsyncResponseStream *stream, light::LightState *obj, std::string &area, std::string &node, std::string &friendly_name)
Return the light values state as prometheus data point.
void climate_row_(AsyncResponseStream *stream, climate::Climate *obj, std::string &area, std::string &node, std::string &friendly_name)
Return the climate state as prometheus data point.
void update_entity_type_(AsyncResponseStream *stream)
Return the type for prometheus.
void climate_failed_row_(AsyncResponseStream *stream, climate::Climate *obj, std::string &area, std::string &node, std::string &friendly_name, std::string &category, bool is_failed_value)
void binary_sensor_row_(AsyncResponseStream *stream, binary_sensor::BinarySensor *obj, std::string &area, std::string &node, std::string &friendly_name)
Return the binary sensor state as prometheus data point.
void number_row_(AsyncResponseStream *stream, number::Number *obj, std::string &area, std::string &node, std::string &friendly_name)
Return the number state as prometheus data point.
void valve_type_(AsyncResponseStream *stream)
Return the type for prometheus.
void switch_type_(AsyncResponseStream *stream)
Return the type for prometheus.
void media_player_type_(AsyncResponseStream *stream)
Return the type for prometheus.
void print_metric_labels_(AsyncResponseStream *stream, const __FlashStringHelper *metric_name, EntityBase *obj, std::string &area, std::string &node, std::string &friendly_name)
Print metric name and common labels (id, area, node, friendly_name, name)
void event_row_(AsyncResponseStream *stream, event::Event *obj, std::string &area, std::string &node, std::string &friendly_name)
Return the event values state as prometheus data point.
void text_sensor_type_(AsyncResponseStream *stream)
Return the type for prometheus.
std::string relabel_id_(EntityBase *obj)
void text_sensor_row_(AsyncResponseStream *stream, text_sensor::TextSensor *obj, std::string &area, std::string &node, std::string &friendly_name)
Return the text sensor values state as prometheus data point.
void add_area_label_(AsyncResponseStream *stream, std::string &area)
void select_row_(AsyncResponseStream *stream, select::Select *obj, std::string &area, std::string &node, std::string &friendly_name)
Return the select state as prometheus data point.
std::string relabel_name_(EntityBase *obj)
void cover_type_(AsyncResponseStream *stream)
Return the type for prometheus.
void select_type_(AsyncResponseStream *stream)
Return the type for prometheus.
void add_node_label_(AsyncResponseStream *stream, std::string &node)
void handleRequest(AsyncWebServerRequest *req) override
void text_row_(AsyncResponseStream *stream, text::Text *obj, std::string &area, std::string &node, std::string &friendly_name)
Return the text values state as prometheus data point.
void climate_value_row_(AsyncResponseStream *stream, climate::Climate *obj, std::string &area, std::string &node, std::string &friendly_name, std::string &category, std::string &climate_value)
void cover_row_(AsyncResponseStream *stream, cover::Cover *obj, std::string &area, std::string &node, std::string &friendly_name)
Return the cover values state as prometheus data point.
void lock_type_(AsyncResponseStream *stream)
Return the type for prometheus.
void valve_row_(AsyncResponseStream *stream, valve::Valve *obj, std::string &area, std::string &node, std::string &friendly_name)
Return the valve state as prometheus data point.
void fan_type_(AsyncResponseStream *stream)
Return the type for prometheus.
void sensor_type_(AsyncResponseStream *stream)
Return the type for prometheus.
void lock_row_(AsyncResponseStream *stream, lock::Lock *obj, std::string &area, std::string &node, std::string &friendly_name)
Return the lock values state as prometheus data point.
float target_humidity
Definition climate.h:19
bool state
Definition fan.h:0
const LogString * climate_action_to_string(ClimateAction action)
Convert the given ClimateAction to a human-readable string.
@ CLIMATE_SUPPORTS_CURRENT_HUMIDITY
@ CLIMATE_SUPPORTS_TWO_POINT_TARGET_TEMPERATURE
@ CLIMATE_SUPPORTS_CURRENT_TEMPERATURE
@ CLIMATE_REQUIRES_TWO_POINT_TARGET_TEMPERATURE
const LogString * climate_swing_mode_to_string(ClimateSwingMode swing_mode)
Convert the given ClimateSwingMode to a human-readable string.
const LogString * climate_preset_to_string(ClimatePreset preset)
Convert the given PresetMode to a human-readable string.
const LogString * climate_fan_mode_to_string(ClimateFanMode fan_mode)
Convert the given ClimateFanMode to a human-readable string.
const LogString * climate_mode_to_string(ClimateMode mode)
Convert the given ClimateMode to a human-readable string.
@ BRIGHTNESS
Master brightness of the light can be controlled.
@ RGB
Color can be controlled using RGB format (includes a brightness control for the color).
@ WHITE
Brightness of white channel can be controlled separately from other channels.
const char * media_player_state_to_string(MediaPlayerState state)
const LogString * valve_operation_to_str(ValveOperation op)
Definition valve.cpp:24
Providing packet encoding functions for exchanging data with a remote host.
Definition a01nyub.cpp:7
std::string value_accuracy_to_string(float value, int8_t accuracy_decimals)
Create a string from a value and an accuracy in decimals.
Definition helpers.cpp:415
Application App
Global storage of Application pointer - only one Application can exist.