ESPHome 2025.5.0
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_TEXT_SENSOR
57 this->text_sensor_type_(stream);
58 for (auto *obj : App.get_text_sensors())
59 this->text_sensor_row_(stream, obj, area, node, friendly_name);
60#endif
61
62#ifdef USE_NUMBER
63 this->number_type_(stream);
64 for (auto *obj : App.get_numbers())
65 this->number_row_(stream, obj, area, node, friendly_name);
66#endif
67
68#ifdef USE_SELECT
69 this->select_type_(stream);
70 for (auto *obj : App.get_selects())
71 this->select_row_(stream, obj, area, node, friendly_name);
72#endif
73
74#ifdef USE_MEDIA_PLAYER
75 this->media_player_type_(stream);
76 for (auto *obj : App.get_media_players())
77 this->media_player_row_(stream, obj, area, node, friendly_name);
78#endif
79
80#ifdef USE_UPDATE
81 this->update_entity_type_(stream);
82 for (auto *obj : App.get_updates())
83 this->update_entity_row_(stream, obj, area, node, friendly_name);
84#endif
85
86#ifdef USE_VALVE
87 this->valve_type_(stream);
88 for (auto *obj : App.get_valves())
89 this->valve_row_(stream, obj, area, node, friendly_name);
90#endif
91
92#ifdef USE_CLIMATE
93 this->climate_type_(stream);
94 for (auto *obj : App.get_climates())
95 this->climate_row_(stream, obj, area, node, friendly_name);
96#endif
97
98 req->send(stream);
99}
100
102 auto item = relabel_map_id_.find(obj);
103 return item == relabel_map_id_.end() ? obj->get_object_id() : item->second;
104}
105
107 auto item = relabel_map_name_.find(obj);
108 return item == relabel_map_name_.end() ? obj->get_name() : item->second;
109}
110
111void PrometheusHandler::add_area_label_(AsyncResponseStream *stream, std::string &area) {
112 if (!area.empty()) {
113 stream->print(F("\",area=\""));
114 stream->print(area.c_str());
115 }
116}
117
118void PrometheusHandler::add_node_label_(AsyncResponseStream *stream, std::string &node) {
119 if (!node.empty()) {
120 stream->print(F("\",node=\""));
121 stream->print(node.c_str());
122 }
123}
124
125void PrometheusHandler::add_friendly_name_label_(AsyncResponseStream *stream, std::string &friendly_name) {
126 if (!friendly_name.empty()) {
127 stream->print(F("\",friendly_name=\""));
128 stream->print(friendly_name.c_str());
129 }
130}
131
132// Type-specific implementation
133#ifdef USE_SENSOR
134void PrometheusHandler::sensor_type_(AsyncResponseStream *stream) {
135 stream->print(F("#TYPE esphome_sensor_value gauge\n"));
136 stream->print(F("#TYPE esphome_sensor_failed gauge\n"));
137}
138void PrometheusHandler::sensor_row_(AsyncResponseStream *stream, sensor::Sensor *obj, std::string &area,
139 std::string &node, std::string &friendly_name) {
140 if (obj->is_internal() && !this->include_internal_)
141 return;
142 if (!std::isnan(obj->state)) {
143 // We have a valid value, output this value
144 stream->print(F("esphome_sensor_failed{id=\""));
145 stream->print(relabel_id_(obj).c_str());
146 add_area_label_(stream, area);
147 add_node_label_(stream, node);
148 add_friendly_name_label_(stream, friendly_name);
149 stream->print(F("\",name=\""));
150 stream->print(relabel_name_(obj).c_str());
151 stream->print(F("\"} 0\n"));
152 // Data itself
153 stream->print(F("esphome_sensor_value{id=\""));
154 stream->print(relabel_id_(obj).c_str());
155 add_area_label_(stream, area);
156 add_node_label_(stream, node);
157 add_friendly_name_label_(stream, friendly_name);
158 stream->print(F("\",name=\""));
159 stream->print(relabel_name_(obj).c_str());
160 stream->print(F("\",unit=\""));
161 stream->print(obj->get_unit_of_measurement().c_str());
162 stream->print(F("\"} "));
163 stream->print(value_accuracy_to_string(obj->state, obj->get_accuracy_decimals()).c_str());
164 stream->print(F("\n"));
165 } else {
166 // Invalid state
167 stream->print(F("esphome_sensor_failed{id=\""));
168 stream->print(relabel_id_(obj).c_str());
169 add_area_label_(stream, area);
170 add_node_label_(stream, node);
171 add_friendly_name_label_(stream, friendly_name);
172 stream->print(F("\",name=\""));
173 stream->print(relabel_name_(obj).c_str());
174 stream->print(F("\"} 1\n"));
175 }
176}
177#endif
178
179// Type-specific implementation
180#ifdef USE_BINARY_SENSOR
181void PrometheusHandler::binary_sensor_type_(AsyncResponseStream *stream) {
182 stream->print(F("#TYPE esphome_binary_sensor_value gauge\n"));
183 stream->print(F("#TYPE esphome_binary_sensor_failed gauge\n"));
184}
186 std::string &area, std::string &node, std::string &friendly_name) {
187 if (obj->is_internal() && !this->include_internal_)
188 return;
189 if (obj->has_state()) {
190 // We have a valid value, output this value
191 stream->print(F("esphome_binary_sensor_failed{id=\""));
192 stream->print(relabel_id_(obj).c_str());
193 add_area_label_(stream, area);
194 add_node_label_(stream, node);
195 add_friendly_name_label_(stream, friendly_name);
196 stream->print(F("\",name=\""));
197 stream->print(relabel_name_(obj).c_str());
198 stream->print(F("\"} 0\n"));
199 // Data itself
200 stream->print(F("esphome_binary_sensor_value{id=\""));
201 stream->print(relabel_id_(obj).c_str());
202 add_area_label_(stream, area);
203 add_node_label_(stream, node);
204 add_friendly_name_label_(stream, friendly_name);
205 stream->print(F("\",name=\""));
206 stream->print(relabel_name_(obj).c_str());
207 stream->print(F("\"} "));
208 stream->print(obj->state);
209 stream->print(F("\n"));
210 } else {
211 // Invalid state
212 stream->print(F("esphome_binary_sensor_failed{id=\""));
213 stream->print(relabel_id_(obj).c_str());
214 add_area_label_(stream, area);
215 add_node_label_(stream, node);
216 add_friendly_name_label_(stream, friendly_name);
217 stream->print(F("\",name=\""));
218 stream->print(relabel_name_(obj).c_str());
219 stream->print(F("\"} 1\n"));
220 }
221}
222#endif
223
224#ifdef USE_FAN
225void PrometheusHandler::fan_type_(AsyncResponseStream *stream) {
226 stream->print(F("#TYPE esphome_fan_value gauge\n"));
227 stream->print(F("#TYPE esphome_fan_failed gauge\n"));
228 stream->print(F("#TYPE esphome_fan_speed gauge\n"));
229 stream->print(F("#TYPE esphome_fan_oscillation gauge\n"));
230}
231void PrometheusHandler::fan_row_(AsyncResponseStream *stream, fan::Fan *obj, std::string &area, std::string &node,
232 std::string &friendly_name) {
233 if (obj->is_internal() && !this->include_internal_)
234 return;
235 stream->print(F("esphome_fan_failed{id=\""));
236 stream->print(relabel_id_(obj).c_str());
237 add_area_label_(stream, area);
238 add_node_label_(stream, node);
239 add_friendly_name_label_(stream, friendly_name);
240 stream->print(F("\",name=\""));
241 stream->print(relabel_name_(obj).c_str());
242 stream->print(F("\"} 0\n"));
243 // Data itself
244 stream->print(F("esphome_fan_value{id=\""));
245 stream->print(relabel_id_(obj).c_str());
246 add_area_label_(stream, area);
247 add_node_label_(stream, node);
248 add_friendly_name_label_(stream, friendly_name);
249 stream->print(F("\",name=\""));
250 stream->print(relabel_name_(obj).c_str());
251 stream->print(F("\"} "));
252 stream->print(obj->state);
253 stream->print(F("\n"));
254 // Speed if available
255 if (obj->get_traits().supports_speed()) {
256 stream->print(F("esphome_fan_speed{id=\""));
257 stream->print(relabel_id_(obj).c_str());
258 add_area_label_(stream, area);
259 add_node_label_(stream, node);
260 add_friendly_name_label_(stream, friendly_name);
261 stream->print(F("\",name=\""));
262 stream->print(relabel_name_(obj).c_str());
263 stream->print(F("\"} "));
264 stream->print(obj->speed);
265 stream->print(F("\n"));
266 }
267 // Oscillation if available
268 if (obj->get_traits().supports_oscillation()) {
269 stream->print(F("esphome_fan_oscillation{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(F("\",name=\""));
275 stream->print(relabel_name_(obj).c_str());
276 stream->print(F("\"} "));
277 stream->print(obj->oscillating);
278 stream->print(F("\n"));
279 }
280}
281#endif
282
283#ifdef USE_LIGHT
284void PrometheusHandler::light_type_(AsyncResponseStream *stream) {
285 stream->print(F("#TYPE esphome_light_state gauge\n"));
286 stream->print(F("#TYPE esphome_light_color gauge\n"));
287 stream->print(F("#TYPE esphome_light_effect_active gauge\n"));
288}
289void PrometheusHandler::light_row_(AsyncResponseStream *stream, light::LightState *obj, std::string &area,
290 std::string &node, std::string &friendly_name) {
291 if (obj->is_internal() && !this->include_internal_)
292 return;
293 // State
294 stream->print(F("esphome_light_state{id=\""));
295 stream->print(relabel_id_(obj).c_str());
296 add_area_label_(stream, area);
297 add_node_label_(stream, node);
298 add_friendly_name_label_(stream, friendly_name);
299 stream->print(F("\",name=\""));
300 stream->print(relabel_name_(obj).c_str());
301 stream->print(F("\"} "));
302 stream->print(obj->remote_values.is_on());
303 stream->print(F("\n"));
304 // Brightness and RGBW
306 float brightness, r, g, b, w;
307 color.as_brightness(&brightness);
308 color.as_rgbw(&r, &g, &b, &w);
309 stream->print(F("esphome_light_color{id=\""));
310 stream->print(relabel_id_(obj).c_str());
311 add_area_label_(stream, area);
312 add_node_label_(stream, node);
313 add_friendly_name_label_(stream, friendly_name);
314 stream->print(F("\",name=\""));
315 stream->print(relabel_name_(obj).c_str());
316 stream->print(F("\",channel=\"brightness\"} "));
317 stream->print(brightness);
318 stream->print(F("\n"));
319 stream->print(F("esphome_light_color{id=\""));
320 stream->print(relabel_id_(obj).c_str());
321 add_area_label_(stream, area);
322 add_node_label_(stream, node);
323 add_friendly_name_label_(stream, friendly_name);
324 stream->print(F("\",name=\""));
325 stream->print(relabel_name_(obj).c_str());
326 stream->print(F("\",channel=\"r\"} "));
327 stream->print(r);
328 stream->print(F("\n"));
329 stream->print(F("esphome_light_color{id=\""));
330 stream->print(relabel_id_(obj).c_str());
331 add_area_label_(stream, area);
332 add_node_label_(stream, node);
333 add_friendly_name_label_(stream, friendly_name);
334 stream->print(F("\",name=\""));
335 stream->print(relabel_name_(obj).c_str());
336 stream->print(F("\",channel=\"g\"} "));
337 stream->print(g);
338 stream->print(F("\n"));
339 stream->print(F("esphome_light_color{id=\""));
340 stream->print(relabel_id_(obj).c_str());
341 add_area_label_(stream, area);
342 add_node_label_(stream, node);
343 add_friendly_name_label_(stream, friendly_name);
344 stream->print(F("\",name=\""));
345 stream->print(relabel_name_(obj).c_str());
346 stream->print(F("\",channel=\"b\"} "));
347 stream->print(b);
348 stream->print(F("\n"));
349 stream->print(F("esphome_light_color{id=\""));
350 stream->print(relabel_id_(obj).c_str());
351 add_area_label_(stream, area);
352 add_node_label_(stream, node);
353 add_friendly_name_label_(stream, friendly_name);
354 stream->print(F("\",name=\""));
355 stream->print(relabel_name_(obj).c_str());
356 stream->print(F("\",channel=\"w\"} "));
357 stream->print(w);
358 stream->print(F("\n"));
359 // Effect
360 std::string effect = obj->get_effect_name();
361 if (effect == "None") {
362 stream->print(F("esphome_light_effect_active{id=\""));
363 stream->print(relabel_id_(obj).c_str());
364 add_area_label_(stream, area);
365 add_node_label_(stream, node);
366 add_friendly_name_label_(stream, friendly_name);
367 stream->print(F("\",name=\""));
368 stream->print(relabel_name_(obj).c_str());
369 stream->print(F("\",effect=\"None\"} 0\n"));
370 } else {
371 stream->print(F("esphome_light_effect_active{id=\""));
372 stream->print(relabel_id_(obj).c_str());
373 add_area_label_(stream, area);
374 add_node_label_(stream, node);
375 add_friendly_name_label_(stream, friendly_name);
376 stream->print(F("\",name=\""));
377 stream->print(relabel_name_(obj).c_str());
378 stream->print(F("\",effect=\""));
379 stream->print(effect.c_str());
380 stream->print(F("\"} 1\n"));
381 }
382}
383#endif
384
385#ifdef USE_COVER
386void PrometheusHandler::cover_type_(AsyncResponseStream *stream) {
387 stream->print(F("#TYPE esphome_cover_value gauge\n"));
388 stream->print(F("#TYPE esphome_cover_failed gauge\n"));
389}
390void PrometheusHandler::cover_row_(AsyncResponseStream *stream, cover::Cover *obj, std::string &area, std::string &node,
391 std::string &friendly_name) {
392 if (obj->is_internal() && !this->include_internal_)
393 return;
394 if (!std::isnan(obj->position)) {
395 // We have a valid value, output this value
396 stream->print(F("esphome_cover_failed{id=\""));
397 stream->print(relabel_id_(obj).c_str());
398 add_area_label_(stream, area);
399 add_node_label_(stream, node);
400 add_friendly_name_label_(stream, friendly_name);
401 stream->print(F("\",name=\""));
402 stream->print(relabel_name_(obj).c_str());
403 stream->print(F("\"} 0\n"));
404 // Data itself
405 stream->print(F("esphome_cover_value{id=\""));
406 stream->print(relabel_id_(obj).c_str());
407 add_area_label_(stream, area);
408 add_node_label_(stream, node);
409 add_friendly_name_label_(stream, friendly_name);
410 stream->print(F("\",name=\""));
411 stream->print(relabel_name_(obj).c_str());
412 stream->print(F("\"} "));
413 stream->print(obj->position);
414 stream->print(F("\n"));
415 if (obj->get_traits().get_supports_tilt()) {
416 stream->print(F("esphome_cover_tilt{id=\""));
417 stream->print(relabel_id_(obj).c_str());
418 add_area_label_(stream, area);
419 add_node_label_(stream, node);
420 add_friendly_name_label_(stream, friendly_name);
421 stream->print(F("\",name=\""));
422 stream->print(relabel_name_(obj).c_str());
423 stream->print(F("\"} "));
424 stream->print(obj->tilt);
425 stream->print(F("\n"));
426 }
427 } else {
428 // Invalid state
429 stream->print(F("esphome_cover_failed{id=\""));
430 stream->print(relabel_id_(obj).c_str());
431 add_area_label_(stream, area);
432 add_node_label_(stream, node);
433 add_friendly_name_label_(stream, friendly_name);
434 stream->print(F("\",name=\""));
435 stream->print(relabel_name_(obj).c_str());
436 stream->print(F("\"} 1\n"));
437 }
438}
439#endif
440
441#ifdef USE_SWITCH
442void PrometheusHandler::switch_type_(AsyncResponseStream *stream) {
443 stream->print(F("#TYPE esphome_switch_value gauge\n"));
444 stream->print(F("#TYPE esphome_switch_failed gauge\n"));
445}
446void PrometheusHandler::switch_row_(AsyncResponseStream *stream, switch_::Switch *obj, std::string &area,
447 std::string &node, std::string &friendly_name) {
448 if (obj->is_internal() && !this->include_internal_)
449 return;
450 stream->print(F("esphome_switch_failed{id=\""));
451 stream->print(relabel_id_(obj).c_str());
452 add_area_label_(stream, area);
453 add_node_label_(stream, node);
454 add_friendly_name_label_(stream, friendly_name);
455 stream->print(F("\",name=\""));
456 stream->print(relabel_name_(obj).c_str());
457 stream->print(F("\"} 0\n"));
458 // Data itself
459 stream->print(F("esphome_switch_value{id=\""));
460 stream->print(relabel_id_(obj).c_str());
461 add_area_label_(stream, area);
462 add_node_label_(stream, node);
463 add_friendly_name_label_(stream, friendly_name);
464 stream->print(F("\",name=\""));
465 stream->print(relabel_name_(obj).c_str());
466 stream->print(F("\"} "));
467 stream->print(obj->state);
468 stream->print(F("\n"));
469}
470#endif
471
472#ifdef USE_LOCK
473void PrometheusHandler::lock_type_(AsyncResponseStream *stream) {
474 stream->print(F("#TYPE esphome_lock_value gauge\n"));
475 stream->print(F("#TYPE esphome_lock_failed gauge\n"));
476}
477void PrometheusHandler::lock_row_(AsyncResponseStream *stream, lock::Lock *obj, std::string &area, std::string &node,
478 std::string &friendly_name) {
479 if (obj->is_internal() && !this->include_internal_)
480 return;
481 stream->print(F("esphome_lock_failed{id=\""));
482 stream->print(relabel_id_(obj).c_str());
483 add_area_label_(stream, area);
484 add_node_label_(stream, node);
485 add_friendly_name_label_(stream, friendly_name);
486 stream->print(F("\",name=\""));
487 stream->print(relabel_name_(obj).c_str());
488 stream->print(F("\"} 0\n"));
489 // Data itself
490 stream->print(F("esphome_lock_value{id=\""));
491 stream->print(relabel_id_(obj).c_str());
492 add_area_label_(stream, area);
493 add_node_label_(stream, node);
494 add_friendly_name_label_(stream, friendly_name);
495 stream->print(F("\",name=\""));
496 stream->print(relabel_name_(obj).c_str());
497 stream->print(F("\"} "));
498 stream->print(obj->state);
499 stream->print(F("\n"));
500}
501#endif
502
503// Type-specific implementation
504#ifdef USE_TEXT_SENSOR
505void PrometheusHandler::text_sensor_type_(AsyncResponseStream *stream) {
506 stream->print(F("#TYPE esphome_text_sensor_value gauge\n"));
507 stream->print(F("#TYPE esphome_text_sensor_failed gauge\n"));
508}
509void PrometheusHandler::text_sensor_row_(AsyncResponseStream *stream, text_sensor::TextSensor *obj, std::string &area,
510 std::string &node, std::string &friendly_name) {
511 if (obj->is_internal() && !this->include_internal_)
512 return;
513 if (obj->has_state()) {
514 // We have a valid value, output this value
515 stream->print(F("esphome_text_sensor_failed{id=\""));
516 stream->print(relabel_id_(obj).c_str());
517 add_area_label_(stream, area);
518 add_node_label_(stream, node);
519 add_friendly_name_label_(stream, friendly_name);
520 stream->print(F("\",name=\""));
521 stream->print(relabel_name_(obj).c_str());
522 stream->print(F("\"} 0\n"));
523 // Data itself
524 stream->print(F("esphome_text_sensor_value{id=\""));
525 stream->print(relabel_id_(obj).c_str());
526 add_area_label_(stream, area);
527 add_node_label_(stream, node);
528 add_friendly_name_label_(stream, friendly_name);
529 stream->print(F("\",name=\""));
530 stream->print(relabel_name_(obj).c_str());
531 stream->print(F("\",value=\""));
532 stream->print(obj->state.c_str());
533 stream->print(F("\"} "));
534 stream->print(F("1.0"));
535 stream->print(F("\n"));
536 } else {
537 // Invalid state
538 stream->print(F("esphome_text_sensor_failed{id=\""));
539 stream->print(relabel_id_(obj).c_str());
540 add_area_label_(stream, area);
541 add_node_label_(stream, node);
542 add_friendly_name_label_(stream, friendly_name);
543 stream->print(F("\",name=\""));
544 stream->print(relabel_name_(obj).c_str());
545 stream->print(F("\"} 1\n"));
546 }
547}
548#endif
549
550// Type-specific implementation
551#ifdef USE_NUMBER
552void PrometheusHandler::number_type_(AsyncResponseStream *stream) {
553 stream->print(F("#TYPE esphome_number_value gauge\n"));
554 stream->print(F("#TYPE esphome_number_failed gauge\n"));
555}
556void PrometheusHandler::number_row_(AsyncResponseStream *stream, number::Number *obj, std::string &area,
557 std::string &node, std::string &friendly_name) {
558 if (obj->is_internal() && !this->include_internal_)
559 return;
560 if (!std::isnan(obj->state)) {
561 // We have a valid value, output this value
562 stream->print(F("esphome_number_failed{id=\""));
563 stream->print(relabel_id_(obj).c_str());
564 add_area_label_(stream, area);
565 add_node_label_(stream, node);
566 add_friendly_name_label_(stream, friendly_name);
567 stream->print(F("\",name=\""));
568 stream->print(relabel_name_(obj).c_str());
569 stream->print(F("\"} 0\n"));
570 // Data itself
571 stream->print(F("esphome_number_value{id=\""));
572 stream->print(relabel_id_(obj).c_str());
573 add_area_label_(stream, area);
574 add_node_label_(stream, node);
575 add_friendly_name_label_(stream, friendly_name);
576 stream->print(F("\",name=\""));
577 stream->print(relabel_name_(obj).c_str());
578 stream->print(F("\"} "));
579 stream->print(obj->state);
580 stream->print(F("\n"));
581 } else {
582 // Invalid state
583 stream->print(F("esphome_number_failed{id=\""));
584 stream->print(relabel_id_(obj).c_str());
585 add_area_label_(stream, area);
586 add_node_label_(stream, node);
587 add_friendly_name_label_(stream, friendly_name);
588 stream->print(F("\",name=\""));
589 stream->print(relabel_name_(obj).c_str());
590 stream->print(F("\"} 1\n"));
591 }
592}
593#endif
594
595#ifdef USE_SELECT
596void PrometheusHandler::select_type_(AsyncResponseStream *stream) {
597 stream->print(F("#TYPE esphome_select_value gauge\n"));
598 stream->print(F("#TYPE esphome_select_failed gauge\n"));
599}
600void PrometheusHandler::select_row_(AsyncResponseStream *stream, select::Select *obj, std::string &area,
601 std::string &node, std::string &friendly_name) {
602 if (obj->is_internal() && !this->include_internal_)
603 return;
604 if (obj->has_state()) {
605 // We have a valid value, output this value
606 stream->print(F("esphome_select_failed{id=\""));
607 stream->print(relabel_id_(obj).c_str());
608 add_area_label_(stream, area);
609 add_node_label_(stream, node);
610 add_friendly_name_label_(stream, friendly_name);
611 stream->print(F("\",name=\""));
612 stream->print(relabel_name_(obj).c_str());
613 stream->print(F("\"} 0\n"));
614 // Data itself
615 stream->print(F("esphome_select_value{id=\""));
616 stream->print(relabel_id_(obj).c_str());
617 add_area_label_(stream, area);
618 add_node_label_(stream, node);
619 add_friendly_name_label_(stream, friendly_name);
620 stream->print(F("\",name=\""));
621 stream->print(relabel_name_(obj).c_str());
622 stream->print(F("\",value=\""));
623 stream->print(obj->state.c_str());
624 stream->print(F("\"} "));
625 stream->print(F("1.0"));
626 stream->print(F("\n"));
627 } else {
628 // Invalid state
629 stream->print(F("esphome_select_failed{id=\""));
630 stream->print(relabel_id_(obj).c_str());
631 add_area_label_(stream, area);
632 add_node_label_(stream, node);
633 add_friendly_name_label_(stream, friendly_name);
634 stream->print(F("\",name=\""));
635 stream->print(relabel_name_(obj).c_str());
636 stream->print(F("\"} 1\n"));
637 }
638}
639#endif
640
641#ifdef USE_MEDIA_PLAYER
642void PrometheusHandler::media_player_type_(AsyncResponseStream *stream) {
643 stream->print(F("#TYPE esphome_media_player_state_value gauge\n"));
644 stream->print(F("#TYPE esphome_media_player_volume gauge\n"));
645 stream->print(F("#TYPE esphome_media_player_is_muted gauge\n"));
646 stream->print(F("#TYPE esphome_media_player_failed gauge\n"));
647}
649 std::string &area, std::string &node, std::string &friendly_name) {
650 if (obj->is_internal() && !this->include_internal_)
651 return;
652 stream->print(F("esphome_media_player_failed{id=\""));
653 stream->print(relabel_id_(obj).c_str());
654 add_area_label_(stream, area);
655 add_node_label_(stream, node);
656 add_friendly_name_label_(stream, friendly_name);
657 stream->print(F("\",name=\""));
658 stream->print(relabel_name_(obj).c_str());
659 stream->print(F("\"} 0\n"));
660 // Data itself
661 stream->print(F("esphome_media_player_state_value{id=\""));
662 stream->print(relabel_id_(obj).c_str());
663 add_area_label_(stream, area);
664 add_node_label_(stream, node);
665 add_friendly_name_label_(stream, friendly_name);
666 stream->print(F("\",name=\""));
667 stream->print(relabel_name_(obj).c_str());
668 stream->print(F("\",value=\""));
670 stream->print(F("\"} "));
671 stream->print(F("1.0"));
672 stream->print(F("\n"));
673 stream->print(F("esphome_media_player_volume{id=\""));
674 stream->print(relabel_id_(obj).c_str());
675 add_area_label_(stream, area);
676 add_node_label_(stream, node);
677 add_friendly_name_label_(stream, friendly_name);
678 stream->print(F("\",name=\""));
679 stream->print(relabel_name_(obj).c_str());
680 stream->print(F("\"} "));
681 stream->print(obj->volume);
682 stream->print(F("\n"));
683 stream->print(F("esphome_media_player_is_muted{id=\""));
684 stream->print(relabel_id_(obj).c_str());
685 add_area_label_(stream, area);
686 add_node_label_(stream, node);
687 add_friendly_name_label_(stream, friendly_name);
688 stream->print(F("\",name=\""));
689 stream->print(relabel_name_(obj).c_str());
690 stream->print(F("\"} "));
691 if (obj->is_muted()) {
692 stream->print(F("1.0"));
693 } else {
694 stream->print(F("0.0"));
695 }
696 stream->print(F("\n"));
697}
698#endif
699
700#ifdef USE_UPDATE
701void PrometheusHandler::update_entity_type_(AsyncResponseStream *stream) {
702 stream->print(F("#TYPE esphome_update_entity_state gauge\n"));
703 stream->print(F("#TYPE esphome_update_entity_info gauge\n"));
704 stream->print(F("#TYPE esphome_update_entity_failed gauge\n"));
705}
706
708 switch (state) {
710 stream->print("unknown");
711 break;
713 stream->print("none");
714 break;
716 stream->print("available");
717 break;
719 stream->print("installing");
720 break;
721 default:
722 stream->print("invalid");
723 break;
724 }
725}
726
727void PrometheusHandler::update_entity_row_(AsyncResponseStream *stream, update::UpdateEntity *obj, std::string &area,
728 std::string &node, std::string &friendly_name) {
729 if (obj->is_internal() && !this->include_internal_)
730 return;
731 if (obj->has_state()) {
732 // We have a valid value, output this value
733 stream->print(F("esphome_update_entity_failed{id=\""));
734 stream->print(relabel_id_(obj).c_str());
735 add_area_label_(stream, area);
736 add_node_label_(stream, node);
737 add_friendly_name_label_(stream, friendly_name);
738 stream->print(F("\",name=\""));
739 stream->print(relabel_name_(obj).c_str());
740 stream->print(F("\"} 0\n"));
741 // First update state
742 stream->print(F("esphome_update_entity_state{id=\""));
743 stream->print(relabel_id_(obj).c_str());
744 add_area_label_(stream, area);
745 add_node_label_(stream, node);
746 add_friendly_name_label_(stream, friendly_name);
747 stream->print(F("\",name=\""));
748 stream->print(relabel_name_(obj).c_str());
749 stream->print(F("\",value=\""));
750 handle_update_state_(stream, obj->state);
751 stream->print(F("\"} "));
752 stream->print(F("1.0"));
753 stream->print(F("\n"));
754 // Next update info
755 stream->print(F("esphome_update_entity_info{id=\""));
756 stream->print(relabel_id_(obj).c_str());
757 add_area_label_(stream, area);
758 add_node_label_(stream, node);
759 add_friendly_name_label_(stream, friendly_name);
760 stream->print(F("\",name=\""));
761 stream->print(relabel_name_(obj).c_str());
762 stream->print(F("\",current_version=\""));
763 stream->print(obj->update_info.current_version.c_str());
764 stream->print(F("\",latest_version=\""));
765 stream->print(obj->update_info.latest_version.c_str());
766 stream->print(F("\",title=\""));
767 stream->print(obj->update_info.title.c_str());
768 stream->print(F("\"} "));
769 stream->print(F("1.0"));
770 stream->print(F("\n"));
771 } else {
772 // Invalid state
773 stream->print(F("esphome_update_entity_failed{id=\""));
774 stream->print(relabel_id_(obj).c_str());
775 add_area_label_(stream, area);
776 add_node_label_(stream, node);
777 add_friendly_name_label_(stream, friendly_name);
778 stream->print(F("\",name=\""));
779 stream->print(relabel_name_(obj).c_str());
780 stream->print(F("\"} 1\n"));
781 }
782}
783#endif
784
785#ifdef USE_VALVE
786void PrometheusHandler::valve_type_(AsyncResponseStream *stream) {
787 stream->print(F("#TYPE esphome_valve_operation gauge\n"));
788 stream->print(F("#TYPE esphome_valve_failed gauge\n"));
789 stream->print(F("#TYPE esphome_valve_position gauge\n"));
790}
791
792void PrometheusHandler::valve_row_(AsyncResponseStream *stream, valve::Valve *obj, std::string &area, std::string &node,
793 std::string &friendly_name) {
794 if (obj->is_internal() && !this->include_internal_)
795 return;
796 stream->print(F("esphome_valve_failed{id=\""));
797 stream->print(relabel_id_(obj).c_str());
798 add_area_label_(stream, area);
799 add_node_label_(stream, node);
800 add_friendly_name_label_(stream, friendly_name);
801 stream->print(F("\",name=\""));
802 stream->print(relabel_name_(obj).c_str());
803 stream->print(F("\"} 0\n"));
804 // Data itself
805 stream->print(F("esphome_valve_operation{id=\""));
806 stream->print(relabel_id_(obj).c_str());
807 add_area_label_(stream, area);
808 add_node_label_(stream, node);
809 add_friendly_name_label_(stream, friendly_name);
810 stream->print(F("\",name=\""));
811 stream->print(relabel_name_(obj).c_str());
812 stream->print(F("\",operation=\""));
814 stream->print(F("\"} "));
815 stream->print(F("1.0"));
816 stream->print(F("\n"));
817 // Now see if position is supported
818 if (obj->get_traits().get_supports_position()) {
819 stream->print(F("esphome_valve_position{id=\""));
820 stream->print(relabel_id_(obj).c_str());
821 add_area_label_(stream, area);
822 add_node_label_(stream, node);
823 add_friendly_name_label_(stream, friendly_name);
824 stream->print(F("\",name=\""));
825 stream->print(relabel_name_(obj).c_str());
826 stream->print(F("\"} "));
827 stream->print(obj->position);
828 stream->print(F("\n"));
829 }
830}
831#endif
832
833#ifdef USE_CLIMATE
834void PrometheusHandler::climate_type_(AsyncResponseStream *stream) {
835 stream->print(F("#TYPE esphome_climate_setting gauge\n"));
836 stream->print(F("#TYPE esphome_climate_value gauge\n"));
837 stream->print(F("#TYPE esphome_climate_failed gauge\n"));
838}
839
840void PrometheusHandler::climate_setting_row_(AsyncResponseStream *stream, climate::Climate *obj, std::string &area,
841 std::string &node, std::string &friendly_name, std::string &setting,
842 const LogString *setting_value) {
843 stream->print(F("esphome_climate_setting{id=\""));
844 stream->print(relabel_id_(obj).c_str());
845 add_area_label_(stream, area);
846 add_node_label_(stream, node);
847 add_friendly_name_label_(stream, friendly_name);
848 stream->print(F("\",name=\""));
849 stream->print(relabel_name_(obj).c_str());
850 stream->print(F("\",category=\""));
851 stream->print(setting.c_str());
852 stream->print(F("\",setting_value=\""));
853 stream->print(LOG_STR_ARG(setting_value));
854 stream->print(F("\"} "));
855 stream->print(F("1.0"));
856 stream->print(F("\n"));
857}
858
859void PrometheusHandler::climate_value_row_(AsyncResponseStream *stream, climate::Climate *obj, std::string &area,
860 std::string &node, std::string &friendly_name, std::string &category,
861 std::string &climate_value) {
862 stream->print(F("esphome_climate_value{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(F("\",name=\""));
868 stream->print(relabel_name_(obj).c_str());
869 stream->print(F("\",category=\""));
870 stream->print(category.c_str());
871 stream->print(F("\"} "));
872 stream->print(climate_value.c_str());
873 stream->print(F("\n"));
874}
875
876void PrometheusHandler::climate_failed_row_(AsyncResponseStream *stream, climate::Climate *obj, std::string &area,
877 std::string &node, std::string &friendly_name, std::string &category,
878 bool is_failed_value) {
879 stream->print(F("esphome_climate_failed{id=\""));
880 stream->print(relabel_id_(obj).c_str());
881 add_area_label_(stream, area);
882 add_node_label_(stream, node);
883 add_friendly_name_label_(stream, friendly_name);
884 stream->print(F("\",name=\""));
885 stream->print(relabel_name_(obj).c_str());
886 stream->print(F("\",category=\""));
887 stream->print(category.c_str());
888 stream->print(F("\"} "));
889 if (is_failed_value) {
890 stream->print(F("1.0"));
891 } else {
892 stream->print(F("0.0"));
893 }
894 stream->print(F("\n"));
895}
896
897void PrometheusHandler::climate_row_(AsyncResponseStream *stream, climate::Climate *obj, std::string &area,
898 std::string &node, std::string &friendly_name) {
899 if (obj->is_internal() && !this->include_internal_)
900 return;
901 // Data itself
902 bool any_failures = false;
903 std::string climate_mode_category = "mode";
904 const auto *climate_mode_value = climate::climate_mode_to_string(obj->mode);
905 climate_setting_row_(stream, obj, area, node, friendly_name, climate_mode_category, climate_mode_value);
906 const auto traits = obj->get_traits();
907 // Now see if traits is supported
908 int8_t target_accuracy = traits.get_target_temperature_accuracy_decimals();
909 int8_t current_accuracy = traits.get_current_temperature_accuracy_decimals();
910 // max temp
911 std::string max_temp = "maximum_temperature";
912 auto max_temp_value = value_accuracy_to_string(traits.get_visual_max_temperature(), target_accuracy);
913 climate_value_row_(stream, obj, area, node, friendly_name, max_temp, max_temp_value);
914 // max temp
915 std::string min_temp = "mininum_temperature";
916 auto min_temp_value = value_accuracy_to_string(traits.get_visual_min_temperature(), target_accuracy);
917 climate_value_row_(stream, obj, area, node, friendly_name, min_temp, min_temp_value);
918 // now check optional traits
919 if (traits.get_supports_current_temperature()) {
920 std::string current_temp = "current_temperature";
921 if (std::isnan(obj->current_temperature)) {
922 climate_failed_row_(stream, obj, area, node, friendly_name, current_temp, true);
923 any_failures = true;
924 } else {
925 auto current_temp_value = value_accuracy_to_string(obj->current_temperature, current_accuracy);
926 climate_value_row_(stream, obj, area, node, friendly_name, current_temp, current_temp_value);
927 climate_failed_row_(stream, obj, area, node, friendly_name, current_temp, false);
928 }
929 }
930 if (traits.get_supports_current_humidity()) {
931 std::string current_humidity = "current_humidity";
932 if (std::isnan(obj->current_humidity)) {
933 climate_failed_row_(stream, obj, area, node, friendly_name, current_humidity, true);
934 any_failures = true;
935 } else {
936 auto current_humidity_value = value_accuracy_to_string(obj->current_humidity, 0);
937 climate_value_row_(stream, obj, area, node, friendly_name, current_humidity, current_humidity_value);
938 climate_failed_row_(stream, obj, area, node, friendly_name, current_humidity, false);
939 }
940 }
941 if (traits.get_supports_target_humidity()) {
942 std::string target_humidity = "target_humidity";
943 if (std::isnan(obj->target_humidity)) {
944 climate_failed_row_(stream, obj, area, node, friendly_name, target_humidity, true);
945 any_failures = true;
946 } else {
947 auto target_humidity_value = value_accuracy_to_string(obj->target_humidity, 0);
948 climate_value_row_(stream, obj, area, node, friendly_name, target_humidity, target_humidity_value);
949 climate_failed_row_(stream, obj, area, node, friendly_name, target_humidity, false);
950 }
951 }
952 if (traits.get_supports_two_point_target_temperature()) {
953 std::string target_temp_low = "target_temperature_low";
954 auto target_temp_low_value = value_accuracy_to_string(obj->target_temperature_low, target_accuracy);
955 climate_value_row_(stream, obj, area, node, friendly_name, target_temp_low, target_temp_low_value);
956 std::string target_temp_high = "target_temperature_high";
957 auto target_temp_high_value = value_accuracy_to_string(obj->target_temperature_high, target_accuracy);
958 climate_value_row_(stream, obj, area, node, friendly_name, target_temp_high, target_temp_high_value);
959 } else {
960 std::string target_temp = "target_temperature";
961 auto target_temp_value = value_accuracy_to_string(obj->target_temperature, target_accuracy);
962 climate_value_row_(stream, obj, area, node, friendly_name, target_temp, target_temp_value);
963 }
964 if (traits.get_supports_action()) {
965 std::string climate_trait_category = "action";
966 const auto *climate_trait_value = climate::climate_action_to_string(obj->action);
967 climate_setting_row_(stream, obj, area, node, friendly_name, climate_trait_category, climate_trait_value);
968 }
969 if (traits.get_supports_fan_modes()) {
970 std::string climate_trait_category = "fan_mode";
971 if (obj->fan_mode.has_value()) {
972 const auto *climate_trait_value = climate::climate_fan_mode_to_string(obj->fan_mode.value());
973 climate_setting_row_(stream, obj, area, node, friendly_name, climate_trait_category, climate_trait_value);
974 climate_failed_row_(stream, obj, area, node, friendly_name, climate_trait_category, false);
975 } else {
976 climate_failed_row_(stream, obj, area, node, friendly_name, climate_trait_category, true);
977 any_failures = true;
978 }
979 }
980 if (traits.get_supports_presets()) {
981 std::string climate_trait_category = "preset";
982 if (obj->preset.has_value()) {
983 const auto *climate_trait_value = climate::climate_preset_to_string(obj->preset.value());
984 climate_setting_row_(stream, obj, area, node, friendly_name, climate_trait_category, climate_trait_value);
985 climate_failed_row_(stream, obj, area, node, friendly_name, climate_trait_category, false);
986 } else {
987 climate_failed_row_(stream, obj, area, node, friendly_name, climate_trait_category, true);
988 any_failures = true;
989 }
990 }
991 if (traits.get_supports_swing_modes()) {
992 std::string climate_trait_category = "swing_mode";
993 const auto *climate_trait_value = climate::climate_swing_mode_to_string(obj->swing_mode);
994 climate_setting_row_(stream, obj, area, node, friendly_name, climate_trait_category, climate_trait_value);
995 }
996 std::string all_climate_category = "all";
997 climate_failed_row_(stream, obj, area, node, friendly_name, all_climate_category, any_failures);
998}
999#endif
1000
1001} // namespace prometheus
1002} // namespace esphome
1003#endif
const std::string & get_area() const
Get the area of this Application set by pre_setup().
const std::string & get_friendly_name() const
Get the friendly name of this Application set by pre_setup().
const std::vector< valve::Valve * > & get_valves()
const std::vector< fan::Fan * > & get_fans()
const std::vector< switch_::Switch * > & get_switches()
const std::vector< sensor::Sensor * > & get_sensors()
const std::vector< text_sensor::TextSensor * > & get_text_sensors()
const std::vector< lock::Lock * > & get_locks()
const std::vector< select::Select * > & get_selects()
const std::vector< climate::Climate * > & get_climates()
const std::vector< light::LightState * > & get_lights()
const std::vector< update::UpdateEntity * > & get_updates()
const std::string & get_name() const
Get the name of this Application set by pre_setup().
const std::vector< cover::Cover * > & get_covers()
const std::vector< media_player::MediaPlayer * > & get_media_players()
const std::vector< binary_sensor::BinarySensor * > & get_binary_sensors()
const std::vector< number::Number * > & get_numbers()
std::string get_unit_of_measurement()
Get the unit of measurement, using the manual override if set.
bool is_internal() const
const StringRef & get_name() const
std::string get_object_id() const
Base class for all binary_sensor-type classes.
virtual bool has_state() const
Return whether this binary sensor has outputted a state.
bool state
The current reported state of the binary sensor.
ClimateDevice - This is the base class for all climate integrations.
Definition climate.h:168
ClimateMode mode
The active mode of the climate device.
Definition climate.h:173
optional< ClimateFanMode > fan_mode
The active fan mode of the climate device.
Definition climate.h:199
ClimateTraits get_traits()
Get the traits of this climate device with all overrides applied.
Definition climate.cpp:440
float target_temperature
The target temperature of the climate device.
Definition climate.h:186
float current_humidity
The current humidity of the climate device, as reported from the integration.
Definition climate.h:182
ClimateSwingMode swing_mode
The active swing mode of the climate device.
Definition climate.h:202
float target_temperature_low
The minimum target temperature of the climate device, for climate devices with split target temperatu...
Definition climate.h:189
float current_temperature
The current temperature of the climate device, as reported from the integration.
Definition climate.h:179
ClimateAction action
The active state of the climate device.
Definition climate.h:176
optional< ClimatePreset > preset
The active preset of the climate device.
Definition climate.h:208
float target_humidity
The target humidity of the climate device.
Definition climate.h:196
float target_temperature_high
The maximum target temperature of the climate device, for climate devices with split target temperatu...
Definition climate.h:191
int8_t get_target_temperature_accuracy_decimals() const
Base class for all cover devices.
Definition cover.h:111
float tilt
The current tilt value of the cover from 0.0 to 1.0.
Definition cover.h:124
float position
The position of the cover from 0.0 (fully closed) to 1.0 (fully open).
Definition cover.h:122
virtual CoverTraits get_traits()=0
virtual FanTraits get_traits()=0
bool oscillating
The current oscillation state of the fan.
Definition fan.h:112
bool state
The current on/off state of the fan.
Definition fan.h:110
int speed
The current fan speed level.
Definition fan.h:114
bool supports_speed() const
Return if this fan supports speed modes.
Definition fan_traits.h:20
bool supports_oscillation() const
Return if this fan supports oscillation.
Definition fan_traits.h:16
This class represents the color state for a light object.
bool is_on() const
Get the binary true/false state of these light color values.
void as_rgbw(float *red, float *green, float *blue, float *white, float gamma=0, bool color_interlock=false) const
Convert these light color values to an RGBW representation and write them to red, green,...
void as_brightness(float *brightness, float gamma=0) const
Convert these light color values to a brightness-only representation and write them to brightness.
This class represents the communication layer between the front-end MQTT layer and the hardware outpu...
Definition light_state.h:63
LightColorValues remote_values
The remote color values reported to the frontend.
std::string get_effect_name()
Return the name of the current effect, or if no effect is active "None".
LightColorValues current_values
The current values of the light as outputted to the light.
Definition light_state.h:94
Base class for all locks.
Definition lock.h:103
LockState state
The current reported state of the lock.
Definition lock.h:122
Base-class for all numbers.
Definition number.h:39
bool has_value() const
Definition optional.h:87
value_type const & value() const
Definition optional.h:89
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 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 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 text_sensor_type_(AsyncResponseStream *stream)
Return the type for prometheus.
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 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.
Base-class for all selects.
Definition select.h:31
std::string state
Definition select.h:33
bool has_state() const
Return whether this select component has gotten a full state yet.
Definition select.h:39
Base-class for all sensors.
Definition sensor.h:57
float state
This member variable stores the last state that has passed through all filters.
Definition sensor.h:131
int8_t get_accuracy_decimals()
Get the accuracy in decimals, using the manual override if set.
Definition sensor.cpp:25
Base class for all switches.
Definition switch.h:39
bool state
The current reported state of the binary sensor.
Definition switch.h:53
const UpdateState & state
const UpdateInfo & update_info
Base class for all valve devices.
Definition valve.h:105
float position
The position of the valve from 0.0 (fully closed) to 1.0 (fully open).
Definition valve.h:116
ValveOperation current_operation
The current operation of the valve (idle, opening, closing).
Definition valve.h:110
virtual ValveTraits get_traits()=0
bool get_supports_position() const
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.
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.
const char * media_player_state_to_string(MediaPlayerState state)
const char * valve_operation_to_str(ValveOperation op)
Definition valve.cpp:21
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:435
Application App
Global storage of Application pointer - only one Application can exist.