esphome 2024.12.4__py3-none-any.whl → 2025.2.0b1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (355) hide show
  1. esphome/__main__.py +16 -3
  2. esphome/components/adc/__init__.py +17 -11
  3. esphome/components/adc/adc_sensor.h +17 -0
  4. esphome/components/adc/adc_sensor_common.cpp +55 -0
  5. esphome/components/adc/adc_sensor_esp32.cpp +8 -5
  6. esphome/components/adc/adc_sensor_esp8266.cpp +10 -6
  7. esphome/components/adc/adc_sensor_libretiny.cpp +11 -6
  8. esphome/components/adc/adc_sensor_rp2040.cpp +13 -10
  9. esphome/components/adc/sensor.py +9 -3
  10. esphome/components/ads1115/ads1115.cpp +56 -7
  11. esphome/components/ads1115/ads1115.h +13 -1
  12. esphome/components/ads1115/sensor/__init__.py +16 -0
  13. esphome/components/ads1115/sensor/ads1115_sensor.cpp +2 -1
  14. esphome/components/ads1115/sensor/ads1115_sensor.h +2 -0
  15. esphome/components/animation/__init__.py +23 -261
  16. esphome/components/animation/animation.cpp +2 -2
  17. esphome/components/animation/animation.h +2 -1
  18. esphome/components/api/api_pb2.cpp +14 -0
  19. esphome/components/api/api_pb2.h +1 -0
  20. esphome/components/audio/__init__.py +112 -0
  21. esphome/components/audio/audio.cpp +67 -0
  22. esphome/components/audio/audio.h +125 -7
  23. esphome/components/audio/audio_decoder.cpp +361 -0
  24. esphome/components/audio/audio_decoder.h +135 -0
  25. esphome/components/audio/audio_reader.cpp +308 -0
  26. esphome/components/audio/audio_reader.h +85 -0
  27. esphome/components/audio/audio_resampler.cpp +159 -0
  28. esphome/components/audio/audio_resampler.h +101 -0
  29. esphome/components/audio/audio_transfer_buffer.cpp +165 -0
  30. esphome/components/audio/audio_transfer_buffer.h +139 -0
  31. esphome/components/audio_adc/__init__.py +41 -0
  32. esphome/components/audio_adc/audio_adc.h +17 -0
  33. esphome/components/audio_adc/automation.h +23 -0
  34. esphome/components/bk72xx/__init__.py +1 -0
  35. esphome/components/ble_client/ble_client.cpp +1 -2
  36. esphome/components/ble_client/sensor/__init__.py +1 -1
  37. esphome/components/ble_client/text_sensor/__init__.py +1 -1
  38. esphome/components/bluetooth_proxy/bluetooth_connection.cpp +5 -0
  39. esphome/components/bluetooth_proxy/bluetooth_connection.h +1 -0
  40. esphome/components/bluetooth_proxy/bluetooth_proxy.cpp +5 -0
  41. esphome/components/ch422g/ch422g.h +2 -0
  42. esphome/components/climate/__init__.py +1 -1
  43. esphome/components/climate_ir/climate_ir.cpp +2 -1
  44. esphome/components/coolix/coolix.cpp +2 -1
  45. esphome/components/custom/__init__.py +0 -3
  46. esphome/components/custom/binary_sensor/__init__.py +2 -28
  47. esphome/components/custom/climate/__init__.py +2 -27
  48. esphome/components/custom/cover/__init__.py +2 -27
  49. esphome/components/custom/light/__init__.py +2 -27
  50. esphome/components/custom/output/__init__.py +2 -58
  51. esphome/components/custom/sensor/__init__.py +2 -24
  52. esphome/components/custom/switch/__init__.py +2 -24
  53. esphome/components/custom/text_sensor/__init__.py +2 -29
  54. esphome/components/custom_component/__init__.py +3 -27
  55. esphome/components/daly_bms/daly_bms.cpp +6 -0
  56. esphome/components/daly_bms/daly_bms.h +2 -0
  57. esphome/components/daly_bms/sensor.py +6 -0
  58. esphome/components/debug/debug_component.cpp +4 -0
  59. esphome/components/debug/debug_component.h +14 -0
  60. esphome/components/debug/debug_esp32.cpp +154 -74
  61. esphome/components/dfplayer/dfplayer.cpp +15 -2
  62. esphome/components/dfrobot_sen0395/dfrobot_sen0395.cpp +2 -1
  63. esphome/components/dht/dht.cpp +2 -1
  64. esphome/components/display/__init__.py +18 -5
  65. esphome/components/display/display.cpp +2 -1
  66. esphome/components/display/rect.cpp +2 -1
  67. esphome/components/es7210/__init__.py +0 -0
  68. esphome/components/es7210/audio_adc.py +51 -0
  69. esphome/components/es7210/es7210.cpp +228 -0
  70. esphome/components/es7210/es7210.h +62 -0
  71. esphome/components/es7210/es7210_const.h +129 -0
  72. esphome/components/es7243e/__init__.py +0 -0
  73. esphome/components/es7243e/audio_adc.py +34 -0
  74. esphome/components/es7243e/es7243e.cpp +125 -0
  75. esphome/components/es7243e/es7243e.h +37 -0
  76. esphome/components/es7243e/es7243e_const.h +54 -0
  77. esphome/components/es8156/__init__.py +0 -0
  78. esphome/components/es8156/audio_dac.py +27 -0
  79. esphome/components/es8156/es8156.cpp +87 -0
  80. esphome/components/es8156/es8156.h +51 -0
  81. esphome/components/es8156/es8156_const.h +68 -0
  82. esphome/components/es8311/audio_dac.py +1 -2
  83. esphome/components/esp32/__init__.py +1 -0
  84. esphome/components/esp32/core.cpp +5 -1
  85. esphome/components/esp32/gpio.h +2 -0
  86. esphome/components/esp32_ble/__init__.py +39 -0
  87. esphome/components/esp32_ble/queue.h +4 -4
  88. esphome/components/esp32_ble_client/ble_client_base.cpp +46 -0
  89. esphome/components/esp32_ble_client/ble_client_base.h +2 -0
  90. esphome/components/esp32_ble_server/__init__.py +582 -12
  91. esphome/components/esp32_ble_server/ble_characteristic.cpp +48 -60
  92. esphome/components/esp32_ble_server/ble_characteristic.h +24 -17
  93. esphome/components/esp32_ble_server/ble_descriptor.cpp +21 -9
  94. esphome/components/esp32_ble_server/ble_descriptor.h +17 -6
  95. esphome/components/esp32_ble_server/ble_server.cpp +62 -67
  96. esphome/components/esp32_ble_server/ble_server.h +28 -32
  97. esphome/components/esp32_ble_server/ble_server_automations.cpp +77 -0
  98. esphome/components/esp32_ble_server/ble_server_automations.h +115 -0
  99. esphome/components/esp32_ble_server/ble_service.cpp +17 -15
  100. esphome/components/esp32_ble_server/ble_service.h +10 -14
  101. esphome/components/esp32_ble_tracker/__init__.py +6 -39
  102. esphome/components/esp32_ble_tracker/esp32_ble_tracker.cpp +33 -10
  103. esphome/components/esp32_ble_tracker/esp32_ble_tracker.h +8 -4
  104. esphome/components/esp32_improv/__init__.py +2 -8
  105. esphome/components/esp32_improv/esp32_improv_component.cpp +21 -20
  106. esphome/components/esp32_improv/esp32_improv_component.h +3 -4
  107. esphome/components/esp32_rmt/__init__.py +28 -3
  108. esphome/components/esp32_rmt_led_strip/led_strip.cpp +73 -6
  109. esphome/components/esp32_rmt_led_strip/led_strip.h +21 -3
  110. esphome/components/esp32_rmt_led_strip/light.py +72 -7
  111. esphome/components/esp32_touch/esp32_touch.cpp +5 -0
  112. esphome/components/esp8266/__init__.py +1 -0
  113. esphome/components/esp8266/gpio.h +1 -0
  114. esphome/components/ethernet/__init__.py +10 -10
  115. esphome/components/event/event.cpp +4 -2
  116. esphome/components/event/event.h +2 -0
  117. esphome/components/event_emitter/__init__.py +5 -0
  118. esphome/components/event_emitter/event_emitter.cpp +14 -0
  119. esphome/components/event_emitter/event_emitter.h +63 -0
  120. esphome/components/gcja5/gcja5.cpp +2 -1
  121. esphome/components/haier/haier_base.cpp +2 -1
  122. esphome/components/haier/hon_climate.cpp +2 -1
  123. esphome/components/heatpumpir/heatpumpir.cpp +2 -1
  124. esphome/components/host/__init__.py +1 -0
  125. esphome/components/host/gpio.h +1 -0
  126. esphome/components/http_request/http_request.h +2 -2
  127. esphome/components/http_request/http_request_arduino.cpp +1 -1
  128. esphome/components/http_request/http_request_idf.cpp +1 -1
  129. esphome/components/i2c/i2c_bus_esp_idf.cpp +4 -0
  130. esphome/components/i2s_audio/microphone/i2s_audio_microphone.cpp +7 -5
  131. esphome/components/i2s_audio/speaker/__init__.py +53 -6
  132. esphome/components/i2s_audio/speaker/i2s_audio_speaker.cpp +92 -46
  133. esphome/components/i2s_audio/speaker/i2s_audio_speaker.h +8 -0
  134. esphome/components/ili9xxx/display.py +29 -11
  135. esphome/components/ili9xxx/ili9xxx_display.cpp +2 -5
  136. esphome/components/ili9xxx/ili9xxx_display.h +2 -1
  137. esphome/components/image/__init__.py +443 -255
  138. esphome/components/image/image.cpp +115 -61
  139. esphome/components/image/image.h +15 -24
  140. esphome/components/json/json_util.cpp +8 -34
  141. esphome/components/libretiny/__init__.py +1 -0
  142. esphome/components/libretiny/gpio_arduino.h +1 -0
  143. esphome/components/light/light_color_values.h +1 -1
  144. esphome/components/logger/__init__.py +43 -7
  145. esphome/components/logger/logger.cpp +16 -11
  146. esphome/components/logger/logger.h +11 -7
  147. esphome/components/logger/select/__init__.py +29 -0
  148. esphome/components/logger/select/logger_level_select.cpp +27 -0
  149. esphome/components/logger/select/logger_level_select.h +15 -0
  150. esphome/components/lvgl/__init__.py +96 -73
  151. esphome/components/lvgl/automation.py +39 -7
  152. esphome/components/lvgl/defines.py +8 -2
  153. esphome/components/lvgl/lvgl_esphome.cpp +8 -15
  154. esphome/components/lvgl/lvgl_esphome.h +20 -5
  155. esphome/components/lvgl/schemas.py +25 -14
  156. esphome/components/lvgl/trigger.py +27 -3
  157. esphome/components/lvgl/widgets/dropdown.py +1 -1
  158. esphome/components/lvgl/widgets/keyboard.py +8 -1
  159. esphome/components/lvgl/widgets/meter.py +2 -1
  160. esphome/components/lvgl/widgets/msgbox.py +1 -1
  161. esphome/components/lvgl/widgets/obj.py +1 -12
  162. esphome/components/lvgl/widgets/page.py +37 -2
  163. esphome/components/lvgl/widgets/tabview.py +1 -1
  164. esphome/components/max6956/max6956.h +2 -0
  165. esphome/components/mcp23016/mcp23016.h +2 -0
  166. esphome/components/mcp23xxx_base/mcp23xxx_base.h +2 -0
  167. esphome/components/mdns/__init__.py +1 -1
  168. esphome/components/media_player/__init__.py +37 -8
  169. esphome/components/media_player/automation.h +11 -2
  170. esphome/components/media_player/media_player.cpp +8 -0
  171. esphome/components/media_player/media_player.h +8 -4
  172. esphome/components/micronova/switch/micronova_switch.cpp +4 -2
  173. esphome/components/midea/ac_automations.h +3 -1
  174. esphome/components/midea/air_conditioner.cpp +7 -5
  175. esphome/components/midea/air_conditioner.h +1 -1
  176. esphome/components/midea/climate.py +4 -2
  177. esphome/components/midea/ir_transmitter.h +36 -5
  178. esphome/components/mixer/__init__.py +0 -0
  179. esphome/components/mixer/speaker/__init__.py +172 -0
  180. esphome/components/mixer/speaker/automation.h +19 -0
  181. esphome/components/mixer/speaker/mixer_speaker.cpp +624 -0
  182. esphome/components/mixer/speaker/mixer_speaker.h +207 -0
  183. esphome/components/mpr121/mpr121.h +2 -0
  184. esphome/components/mqtt/__init__.py +1 -1
  185. esphome/components/mqtt/mqtt_client.cpp +7 -1
  186. esphome/components/mqtt/mqtt_client.h +1 -1
  187. esphome/components/mqtt/mqtt_climate.cpp +2 -2
  188. esphome/components/network/ip_address.h +2 -0
  189. esphome/components/nextion/automation.h +17 -0
  190. esphome/components/nextion/display.py +42 -17
  191. esphome/components/nextion/nextion.cpp +4 -10
  192. esphome/components/nextion/nextion.h +89 -82
  193. esphome/components/nextion/nextion_commands.cpp +10 -10
  194. esphome/components/ntc/sensor.py +2 -4
  195. esphome/components/online_image/__init__.py +98 -46
  196. esphome/components/online_image/bmp_image.cpp +101 -0
  197. esphome/components/online_image/bmp_image.h +40 -0
  198. esphome/components/online_image/image_decoder.cpp +28 -2
  199. esphome/components/online_image/image_decoder.h +24 -15
  200. esphome/components/online_image/jpeg_image.cpp +90 -0
  201. esphome/components/online_image/jpeg_image.h +34 -0
  202. esphome/components/online_image/online_image.cpp +112 -53
  203. esphome/components/online_image/online_image.h +24 -7
  204. esphome/components/online_image/png_image.cpp +7 -3
  205. esphome/components/online_image/png_image.h +2 -1
  206. esphome/components/opentherm/__init__.py +73 -7
  207. esphome/components/opentherm/automation.h +25 -0
  208. esphome/components/opentherm/const.py +1 -0
  209. esphome/components/opentherm/generate.py +39 -6
  210. esphome/components/opentherm/hub.cpp +117 -79
  211. esphome/components/opentherm/hub.h +31 -15
  212. esphome/components/opentherm/opentherm.cpp +47 -23
  213. esphome/components/opentherm/opentherm.h +27 -6
  214. esphome/components/opentherm/opentherm_macros.h +11 -0
  215. esphome/components/opentherm/schema.py +78 -1
  216. esphome/components/opentherm/validate.py +7 -2
  217. esphome/components/pca6416a/pca6416a.h +2 -0
  218. esphome/components/pca9554/pca9554.h +2 -0
  219. esphome/components/pcf8574/pcf8574.h +2 -0
  220. esphome/components/preferences/__init__.py +2 -4
  221. esphome/components/preferences/syncer.h +10 -3
  222. esphome/components/prometheus/prometheus_handler.cpp +313 -0
  223. esphome/components/prometheus/prometheus_handler.h +48 -7
  224. esphome/components/psram/psram.cpp +8 -1
  225. esphome/components/pulse_counter/pulse_counter_sensor.cpp +14 -9
  226. esphome/components/pulse_counter/pulse_counter_sensor.h +4 -4
  227. esphome/components/pulse_meter/pulse_meter_sensor.cpp +2 -0
  228. esphome/components/qspi_dbi/__init__.py +3 -0
  229. esphome/components/qspi_dbi/display.py +74 -47
  230. esphome/components/qspi_dbi/models.py +245 -2
  231. esphome/components/qspi_dbi/qspi_dbi.cpp +9 -16
  232. esphome/components/qspi_dbi/qspi_dbi.h +2 -2
  233. esphome/components/remote_base/__init__.py +77 -25
  234. esphome/components/remote_base/remote_base.cpp +1 -1
  235. esphome/components/remote_base/remote_base.h +20 -2
  236. esphome/components/remote_base/toto_protocol.cpp +100 -0
  237. esphome/components/remote_base/toto_protocol.h +45 -0
  238. esphome/components/remote_receiver/__init__.py +55 -10
  239. esphome/components/remote_receiver/remote_receiver.h +36 -3
  240. esphome/components/remote_receiver/remote_receiver_esp32.cpp +145 -6
  241. esphome/components/remote_transmitter/__init__.py +62 -4
  242. esphome/components/remote_transmitter/remote_transmitter.h +21 -2
  243. esphome/components/remote_transmitter/remote_transmitter_esp32.cpp +140 -4
  244. esphome/components/remote_transmitter/remote_transmitter_esp8266.cpp +3 -3
  245. esphome/components/remote_transmitter/remote_transmitter_libretiny.cpp +3 -3
  246. esphome/components/resampler/__init__.py +0 -0
  247. esphome/components/resampler/speaker/__init__.py +103 -0
  248. esphome/components/resampler/speaker/resampler_speaker.cpp +318 -0
  249. esphome/components/resampler/speaker/resampler_speaker.h +107 -0
  250. esphome/components/resistance/resistance_sensor.h +2 -3
  251. esphome/components/resistance/sensor.py +2 -9
  252. esphome/components/rotary_encoder/rotary_encoder.cpp +8 -4
  253. esphome/components/rp2040/__init__.py +1 -0
  254. esphome/components/rp2040/gpio.h +1 -0
  255. esphome/components/rtl87xx/__init__.py +2 -0
  256. esphome/components/sdl/binary_sensor.py +270 -0
  257. esphome/components/sdl/sdl_esphome.cpp +16 -0
  258. esphome/components/sdl/sdl_esphome.h +9 -0
  259. esphome/components/seeed_mr60bha2/binary_sensor.py +25 -0
  260. esphome/components/seeed_mr60bha2/seeed_mr60bha2.cpp +26 -2
  261. esphome/components/seeed_mr60bha2/seeed_mr60bha2.h +9 -20
  262. esphome/components/seeed_mr60bha2/sensor.py +9 -1
  263. esphome/components/sn74hc165/sn74hc165.h +3 -0
  264. esphome/components/sn74hc595/sn74hc595.h +3 -0
  265. esphome/components/speaker/__init__.py +5 -4
  266. esphome/components/speaker/media_player/__init__.py +458 -0
  267. esphome/components/speaker/media_player/audio_pipeline.cpp +568 -0
  268. esphome/components/speaker/media_player/audio_pipeline.h +159 -0
  269. esphome/components/speaker/media_player/automation.h +26 -0
  270. esphome/components/speaker/media_player/speaker_media_player.cpp +577 -0
  271. esphome/components/speaker/media_player/speaker_media_player.h +160 -0
  272. esphome/components/speaker/speaker.h +20 -0
  273. esphome/components/spi/__init__.py +1 -5
  274. esphome/components/spi/spi.cpp +7 -1
  275. esphome/components/spi/spi.h +21 -2
  276. esphome/components/spi_led_strip/light.py +3 -5
  277. esphome/components/spi_led_strip/spi_led_strip.cpp +67 -0
  278. esphome/components/spi_led_strip/spi_led_strip.h +8 -60
  279. esphome/components/sprinkler/sprinkler.cpp +3 -1
  280. esphome/components/sx1509/sx1509_gpio_pin.h +2 -0
  281. esphome/components/tca9555/tca9555.h +2 -0
  282. esphome/components/toshiba/toshiba.cpp +2 -1
  283. esphome/components/tuya/light/tuya_light.cpp +4 -2
  284. esphome/components/uart/uart_component_esp32_arduino.cpp +2 -2
  285. esphome/components/uart/uart_component_esp_idf.cpp +2 -2
  286. esphome/components/udp/__init__.py +8 -2
  287. esphome/components/udp/udp_component.cpp +25 -56
  288. esphome/components/udp/udp_component.h +3 -0
  289. esphome/components/uponor_smatrix/sensor/__init__.py +14 -4
  290. esphome/components/uponor_smatrix/sensor/uponor_smatrix_sensor.cpp +5 -0
  291. esphome/components/uponor_smatrix/sensor/uponor_smatrix_sensor.h +1 -0
  292. esphome/components/uptime/text_sensor/__init__.py +19 -0
  293. esphome/components/uptime/text_sensor/uptime_text_sensor.cpp +63 -0
  294. esphome/components/uptime/text_sensor/uptime_text_sensor.h +25 -0
  295. esphome/components/voice_assistant/voice_assistant.cpp +24 -14
  296. esphome/components/voice_assistant/voice_assistant.h +8 -0
  297. esphome/components/waveshare_epaper/display.py +22 -1
  298. esphome/components/waveshare_epaper/waveshare_213v3.cpp +9 -3
  299. esphome/components/waveshare_epaper/waveshare_epaper.cpp +1155 -44
  300. esphome/components/waveshare_epaper/waveshare_epaper.h +208 -7
  301. esphome/components/web_server/web_server.cpp +28 -6
  302. esphome/components/weikai/weikai.h +2 -0
  303. esphome/components/wifi/__init__.py +6 -6
  304. esphome/components/wifi/wifi_component.cpp +1 -1
  305. esphome/components/wifi/wifi_component_esp32_arduino.cpp +30 -1
  306. esphome/components/wireguard/__init__.py +2 -2
  307. esphome/components/xl9535/xl9535.h +2 -0
  308. esphome/components/xxtea/__init__.py +3 -0
  309. esphome/components/xxtea/xxtea.cpp +46 -0
  310. esphome/components/xxtea/xxtea.h +26 -0
  311. esphome/components/yashima/yashima.cpp +2 -1
  312. esphome/config.py +9 -5
  313. esphome/config_validation.py +55 -17
  314. esphome/const.py +7 -10
  315. esphome/core/__init__.py +6 -13
  316. esphome/core/base_automation.h +1 -0
  317. esphome/core/config.py +57 -72
  318. esphome/core/defines.h +9 -1
  319. esphome/core/gpio.h +7 -0
  320. esphome/core/helpers.cpp +19 -15
  321. esphome/core/helpers.h +57 -8
  322. esphome/core/log.h +9 -7
  323. esphome/cpp_generator.py +2 -2
  324. esphome/espota2.py +3 -2
  325. esphome/loader.py +12 -4
  326. esphome/log.py +5 -7
  327. esphome/yaml_util.py +2 -2
  328. {esphome-2024.12.4.dist-info → esphome-2025.2.0b1.dist-info}/METADATA +12 -7
  329. {esphome-2024.12.4.dist-info → esphome-2025.2.0b1.dist-info}/RECORD +338 -289
  330. esphome/components/custom/binary_sensor/custom_binary_sensor.cpp +0 -16
  331. esphome/components/custom/binary_sensor/custom_binary_sensor.h +0 -26
  332. esphome/components/custom/climate/custom_climate.h +0 -22
  333. esphome/components/custom/cover/custom_cover.h +0 -21
  334. esphome/components/custom/light/custom_light_output.h +0 -24
  335. esphome/components/custom/output/custom_output.h +0 -37
  336. esphome/components/custom/sensor/custom_sensor.cpp +0 -16
  337. esphome/components/custom/sensor/custom_sensor.h +0 -24
  338. esphome/components/custom/switch/custom_switch.cpp +0 -16
  339. esphome/components/custom/switch/custom_switch.h +0 -24
  340. esphome/components/custom/text_sensor/custom_text_sensor.cpp +0 -16
  341. esphome/components/custom/text_sensor/custom_text_sensor.h +0 -26
  342. esphome/components/custom_component/custom_component.h +0 -28
  343. esphome/components/esp32_ble_server/ble_2901.cpp +0 -18
  344. esphome/components/esp32_ble_server/ble_2901.h +0 -19
  345. esphome/components/resistance_sampler/__init__.py +0 -6
  346. esphome/components/resistance_sampler/resistance_sampler.h +0 -10
  347. esphome/components/uptime/{sensor.py → sensor/__init__.py} +3 -3
  348. /esphome/components/uptime/{uptime_seconds_sensor.cpp → sensor/uptime_seconds_sensor.cpp} +0 -0
  349. /esphome/components/uptime/{uptime_seconds_sensor.h → sensor/uptime_seconds_sensor.h} +0 -0
  350. /esphome/components/uptime/{uptime_timestamp_sensor.cpp → sensor/uptime_timestamp_sensor.cpp} +0 -0
  351. /esphome/components/uptime/{uptime_timestamp_sensor.h → sensor/uptime_timestamp_sensor.h} +0 -0
  352. {esphome-2024.12.4.dist-info → esphome-2025.2.0b1.dist-info}/LICENSE +0 -0
  353. {esphome-2024.12.4.dist-info → esphome-2025.2.0b1.dist-info}/WHEEL +0 -0
  354. {esphome-2024.12.4.dist-info → esphome-2025.2.0b1.dist-info}/entry_points.txt +0 -0
  355. {esphome-2024.12.4.dist-info → esphome-2025.2.0b1.dist-info}/top_level.txt +0 -0
@@ -28,6 +28,9 @@ namespace opentherm {
28
28
  #ifndef OPENTHERM_INPUT_SENSOR_LIST
29
29
  #define OPENTHERM_INPUT_SENSOR_LIST(F, sep)
30
30
  #endif
31
+ #ifndef OPENTHERM_SETTING_LIST
32
+ #define OPENTHERM_SETTING_LIST(F, sep)
33
+ #endif
31
34
 
32
35
  // Use macros to create fields for every entity specified in the ESPHome configuration
33
36
  #define OPENTHERM_DECLARE_SENSOR(entity) sensor::Sensor *entity;
@@ -36,6 +39,7 @@ namespace opentherm {
36
39
  #define OPENTHERM_DECLARE_NUMBER(entity) OpenthermNumber *entity;
37
40
  #define OPENTHERM_DECLARE_OUTPUT(entity) OpenthermOutput *entity;
38
41
  #define OPENTHERM_DECLARE_INPUT_SENSOR(entity) sensor::Sensor *entity;
42
+ #define OPENTHERM_DECLARE_SETTING(type, entity, def) type entity = def;
39
43
 
40
44
  // Setter macros
41
45
  #define OPENTHERM_SET_SENSOR(entity) \
@@ -56,6 +60,9 @@ namespace opentherm {
56
60
  #define OPENTHERM_SET_INPUT_SENSOR(entity) \
57
61
  void set_##entity(sensor::Sensor *sensor) { this->entity = sensor; }
58
62
 
63
+ #define OPENTHERM_SET_SETTING(type, entity, def) \
64
+ void set_##entity(type value) { this->entity = value; }
65
+
59
66
  // ===== hub.cpp macros =====
60
67
 
61
68
  // *_MESSAGE_HANDLERS are generated in defines.h and look like this:
@@ -85,6 +92,9 @@ namespace opentherm {
85
92
  #ifndef OPENTHERM_INPUT_SENSOR_MESSAGE_HANDLERS
86
93
  #define OPENTHERM_INPUT_SENSOR_MESSAGE_HANDLERS(MESSAGE, ENTITY, entity_sep, postscript, msg_sep)
87
94
  #endif
95
+ #ifndef OPENTHERM_SETTING_MESSAGE_HANDLERS
96
+ #define OPENTHERM_SETTING_MESSAGE_HANDLERS(MESSAGE, ENTITY, entity_sep, postscript, msg_sep)
97
+ #endif
88
98
 
89
99
  // Write data request builders
90
100
  #define OPENTHERM_MESSAGE_WRITE_MESSAGE(msg) \
@@ -92,6 +102,7 @@ namespace opentherm {
92
102
  data.type = MessageType::WRITE_DATA; \
93
103
  data.id = request_id;
94
104
  #define OPENTHERM_MESSAGE_WRITE_ENTITY(key, msg_data) message_data::write_##msg_data(this->key->state, data);
105
+ #define OPENTHERM_MESSAGE_WRITE_SETTING(key, msg_data) message_data::write_##msg_data(this->key, data);
95
106
  #define OPENTHERM_MESSAGE_WRITE_POSTSCRIPT \
96
107
  return data; \
97
108
  }
@@ -2,8 +2,9 @@
2
2
  # inputs of the OpenTherm component.
3
3
 
4
4
  from dataclasses import dataclass
5
- from typing import Optional, TypeVar
5
+ from typing import Optional, TypeVar, Any
6
6
 
7
+ import esphome.config_validation as cv
7
8
  from esphome.const import (
8
9
  UNIT_CELSIUS,
9
10
  UNIT_EMPTY,
@@ -64,6 +65,7 @@ class SensorSchema(EntitySchema):
64
65
  icon: Optional[str] = None
65
66
  device_class: Optional[str] = None
66
67
  disabled_by_default: bool = False
68
+ order: Optional[int] = None
67
69
 
68
70
 
69
71
  SENSORS: dict[str, SensorSchema] = {
@@ -399,6 +401,7 @@ SENSORS: dict[str, SensorSchema] = {
399
401
  message="OT_VERSION_DEVICE",
400
402
  keep_updated=False,
401
403
  message_data="f88",
404
+ order=2,
402
405
  ),
403
406
  "device_type": SensorSchema(
404
407
  description="Device product type",
@@ -409,6 +412,7 @@ SENSORS: dict[str, SensorSchema] = {
409
412
  message="VERSION_DEVICE",
410
413
  keep_updated=False,
411
414
  message_data="u8_hb",
415
+ order=0,
412
416
  ),
413
417
  "device_version": SensorSchema(
414
418
  description="Device product version",
@@ -419,6 +423,7 @@ SENSORS: dict[str, SensorSchema] = {
419
423
  message="VERSION_DEVICE",
420
424
  keep_updated=False,
421
425
  message_data="u8_lb",
426
+ order=0,
422
427
  ),
423
428
  "device_id": SensorSchema(
424
429
  description="Device ID code",
@@ -429,6 +434,7 @@ SENSORS: dict[str, SensorSchema] = {
429
434
  message="DEVICE_CONFIG",
430
435
  keep_updated=False,
431
436
  message_data="u8_lb",
437
+ order=4,
432
438
  ),
433
439
  "otc_hc_ratio_ub": SensorSchema(
434
440
  description="OTC heat curve ratio upper bound",
@@ -457,6 +463,7 @@ SENSORS: dict[str, SensorSchema] = {
457
463
  class BinarySensorSchema(EntitySchema):
458
464
  icon: Optional[str] = None
459
465
  device_class: Optional[str] = None
466
+ order: Optional[int] = None
460
467
 
461
468
 
462
469
  BINARY_SENSORS: dict[str, BinarySensorSchema] = {
@@ -525,48 +532,56 @@ BINARY_SENSORS: dict[str, BinarySensorSchema] = {
525
532
  message="DEVICE_CONFIG",
526
533
  keep_updated=False,
527
534
  message_data="flag8_hb_0",
535
+ order=4,
528
536
  ),
529
537
  "control_type_on_off": BinarySensorSchema(
530
538
  description="Configuration: Control type is on/off",
531
539
  message="DEVICE_CONFIG",
532
540
  keep_updated=False,
533
541
  message_data="flag8_hb_1",
542
+ order=4,
534
543
  ),
535
544
  "cooling_supported": BinarySensorSchema(
536
545
  description="Configuration: Cooling supported",
537
546
  message="DEVICE_CONFIG",
538
547
  keep_updated=False,
539
548
  message_data="flag8_hb_2",
549
+ order=4,
540
550
  ),
541
551
  "dhw_storage_tank": BinarySensorSchema(
542
552
  description="Configuration: DHW storage tank",
543
553
  message="DEVICE_CONFIG",
544
554
  keep_updated=False,
545
555
  message_data="flag8_hb_3",
556
+ order=4,
546
557
  ),
547
558
  "controller_pump_control_allowed": BinarySensorSchema(
548
559
  description="Configuration: Controller pump control allowed",
549
560
  message="DEVICE_CONFIG",
550
561
  keep_updated=False,
551
562
  message_data="flag8_hb_4",
563
+ order=4,
552
564
  ),
553
565
  "ch2_present": BinarySensorSchema(
554
566
  description="Configuration: CH2 present",
555
567
  message="DEVICE_CONFIG",
556
568
  keep_updated=False,
557
569
  message_data="flag8_hb_5",
570
+ order=4,
558
571
  ),
559
572
  "water_filling": BinarySensorSchema(
560
573
  description="Configuration: Remote water filling",
561
574
  message="DEVICE_CONFIG",
562
575
  keep_updated=False,
563
576
  message_data="flag8_hb_6",
577
+ order=4,
564
578
  ),
565
579
  "heat_mode": BinarySensorSchema(
566
580
  description="Configuration: Heating or cooling",
567
581
  message="DEVICE_CONFIG",
568
582
  keep_updated=False,
569
583
  message_data="flag8_hb_7",
584
+ order=4,
570
585
  ),
571
586
  "dhw_setpoint_transfer_enabled": BinarySensorSchema(
572
587
  description="Remote boiler parameters: DHW setpoint transfer enabled",
@@ -812,3 +827,65 @@ INPUTS: dict[str, InputSchema] = {
812
827
  auto_max_value=AutoConfigure(message="OTC_CURVE_BOUNDS", message_data="u8_hb"),
813
828
  ),
814
829
  }
830
+
831
+
832
+ @dataclass
833
+ class SettingSchema(EntitySchema):
834
+ backing_type: str
835
+ validation_schema: cv.Schema
836
+ default_value: Any
837
+ order: Optional[int] = None
838
+
839
+
840
+ SETTINGS: dict[str, SettingSchema] = {
841
+ "controller_product_type": SettingSchema(
842
+ description="Controller product type",
843
+ message="VERSION_CONTROLLER",
844
+ keep_updated=False,
845
+ message_data="u8_hb",
846
+ backing_type="uint8_t",
847
+ validation_schema=cv.int_range(min=0, max=255),
848
+ default_value=0,
849
+ order=1,
850
+ ),
851
+ "controller_product_version": SettingSchema(
852
+ description="Controller product version",
853
+ message="VERSION_CONTROLLER",
854
+ keep_updated=False,
855
+ message_data="u8_lb",
856
+ backing_type="uint8_t",
857
+ validation_schema=cv.int_range(min=0, max=255),
858
+ default_value=0,
859
+ order=1,
860
+ ),
861
+ "opentherm_version_controller": SettingSchema(
862
+ description="Version of OpenTherm implemented by controller",
863
+ message="OT_VERSION_CONTROLLER",
864
+ keep_updated=False,
865
+ message_data="f88",
866
+ backing_type="float",
867
+ validation_schema=cv.positive_float,
868
+ default_value=0,
869
+ order=3,
870
+ ),
871
+ "controller_configuration": SettingSchema(
872
+ description="Controller configuration",
873
+ message="CONTROLLER_CONFIG",
874
+ keep_updated=False,
875
+ message_data="u8_hb",
876
+ backing_type="uint8_t",
877
+ validation_schema=cv.int_range(min=0, max=255),
878
+ default_value=0,
879
+ order=5,
880
+ ),
881
+ "controller_id": SettingSchema(
882
+ description="Controller ID code",
883
+ message="CONTROLLER_CONFIG",
884
+ keep_updated=False,
885
+ message_data="u8_lb",
886
+ backing_type="uint8_t",
887
+ validation_schema=cv.int_range(min=0, max=255),
888
+ default_value=0,
889
+ order=5,
890
+ ),
891
+ }
@@ -9,12 +9,17 @@ from .schema import TSchema
9
9
 
10
10
 
11
11
  def create_entities_schema(
12
- entities: dict[str, schema.EntitySchema],
12
+ entities: dict[str, TSchema],
13
13
  get_entity_validation_schema: Callable[[TSchema], cv.Schema],
14
14
  ) -> Schema:
15
15
  entity_schema = {}
16
16
  for key, entity in entities.items():
17
- entity_schema[cv.Optional(key)] = get_entity_validation_schema(entity)
17
+ schema_key = (
18
+ cv.Optional(key, entity.default_value)
19
+ if hasattr(entity, "default_value")
20
+ else cv.Optional(key)
21
+ )
22
+ entity_schema[schema_key] = get_entity_validation_schema(entity)
18
23
  return cv.Schema(entity_schema)
19
24
 
20
25
 
@@ -52,6 +52,8 @@ class PCA6416AGPIOPin : public GPIOPin {
52
52
  void set_inverted(bool inverted) { inverted_ = inverted; }
53
53
  void set_flags(gpio::Flags flags) { flags_ = flags; }
54
54
 
55
+ gpio::Flags get_flags() const override { return this->flags_; }
56
+
55
57
  protected:
56
58
  PCA6416AComponent *parent_;
57
59
  uint8_t pin_;
@@ -65,6 +65,8 @@ class PCA9554GPIOPin : public GPIOPin {
65
65
  void set_inverted(bool inverted) { inverted_ = inverted; }
66
66
  void set_flags(gpio::Flags flags) { flags_ = flags; }
67
67
 
68
+ gpio::Flags get_flags() const override { return this->flags_; }
69
+
68
70
  protected:
69
71
  PCA9554Component *parent_;
70
72
  uint8_t pin_;
@@ -54,6 +54,8 @@ class PCF8574GPIOPin : public GPIOPin {
54
54
  void set_inverted(bool inverted) { inverted_ = inverted; }
55
55
  void set_flags(gpio::Flags flags) { flags_ = flags; }
56
56
 
57
+ gpio::Flags get_flags() const override { return this->flags_; }
58
+
57
59
  protected:
58
60
  PCF8574Component *parent_;
59
61
  uint8_t pin_;
@@ -1,6 +1,6 @@
1
- from esphome.const import CONF_ID
2
1
  import esphome.codegen as cg
3
2
  import esphome.config_validation as cv
3
+ from esphome.const import CONF_ID
4
4
 
5
5
  CODEOWNERS = ["@esphome/core"]
6
6
 
@@ -11,9 +11,7 @@ CONF_FLASH_WRITE_INTERVAL = "flash_write_interval"
11
11
  CONFIG_SCHEMA = cv.Schema(
12
12
  {
13
13
  cv.GenerateID(): cv.declare_id(IntervalSyncer),
14
- cv.Optional(
15
- CONF_FLASH_WRITE_INTERVAL, default="60s"
16
- ): cv.positive_time_period_milliseconds,
14
+ cv.Optional(CONF_FLASH_WRITE_INTERVAL, default="60s"): cv.update_interval,
17
15
  }
18
16
  ).extend(cv.COMPONENT_SCHEMA)
19
17
 
@@ -8,15 +8,22 @@ namespace preferences {
8
8
 
9
9
  class IntervalSyncer : public Component {
10
10
  public:
11
- void set_write_interval(uint32_t write_interval) { write_interval_ = write_interval; }
11
+ void set_write_interval(uint32_t write_interval) { this->write_interval_ = write_interval; }
12
12
  void setup() override {
13
- set_interval(write_interval_, []() { global_preferences->sync(); });
13
+ if (this->write_interval_ != 0) {
14
+ set_interval(this->write_interval_, []() { global_preferences->sync(); });
15
+ }
16
+ }
17
+ void loop() override {
18
+ if (this->write_interval_ == 0) {
19
+ global_preferences->sync();
20
+ }
14
21
  }
15
22
  void on_shutdown() override { global_preferences->sync(); }
16
23
  float get_setup_priority() const override { return setup_priority::BUS; }
17
24
 
18
25
  protected:
19
- uint32_t write_interval_;
26
+ uint32_t write_interval_{60000};
20
27
  };
21
28
 
22
29
  } // namespace preferences
@@ -59,6 +59,36 @@ void PrometheusHandler::handleRequest(AsyncWebServerRequest *req) {
59
59
  this->text_sensor_row_(stream, obj, area, node, friendly_name);
60
60
  #endif
61
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
+
62
92
  req->send(stream);
63
93
  }
64
94
 
@@ -511,6 +541,289 @@ void PrometheusHandler::text_sensor_row_(AsyncResponseStream *stream, text_senso
511
541
  }
512
542
  #endif
513
543
 
544
+ // Type-specific implementation
545
+ #ifdef USE_NUMBER
546
+ void PrometheusHandler::number_type_(AsyncResponseStream *stream) {
547
+ stream->print(F("#TYPE esphome_number_value gauge\n"));
548
+ stream->print(F("#TYPE esphome_number_failed gauge\n"));
549
+ }
550
+ void PrometheusHandler::number_row_(AsyncResponseStream *stream, number::Number *obj, std::string &area,
551
+ std::string &node, std::string &friendly_name) {
552
+ if (obj->is_internal() && !this->include_internal_)
553
+ return;
554
+ if (!std::isnan(obj->state)) {
555
+ // We have a valid value, output this value
556
+ stream->print(F("esphome_number_failed{id=\""));
557
+ stream->print(relabel_id_(obj).c_str());
558
+ add_area_label_(stream, area);
559
+ add_node_label_(stream, node);
560
+ add_friendly_name_label_(stream, friendly_name);
561
+ stream->print(F("\",name=\""));
562
+ stream->print(relabel_name_(obj).c_str());
563
+ stream->print(F("\"} 0\n"));
564
+ // Data itself
565
+ stream->print(F("esphome_number_value{id=\""));
566
+ stream->print(relabel_id_(obj).c_str());
567
+ add_area_label_(stream, area);
568
+ add_node_label_(stream, node);
569
+ add_friendly_name_label_(stream, friendly_name);
570
+ stream->print(F("\",name=\""));
571
+ stream->print(relabel_name_(obj).c_str());
572
+ stream->print(F("\"} "));
573
+ stream->print(obj->state);
574
+ stream->print(F("\n"));
575
+ } else {
576
+ // Invalid state
577
+ stream->print(F("esphome_number_failed{id=\""));
578
+ stream->print(relabel_id_(obj).c_str());
579
+ add_area_label_(stream, area);
580
+ add_node_label_(stream, node);
581
+ add_friendly_name_label_(stream, friendly_name);
582
+ stream->print(F("\",name=\""));
583
+ stream->print(relabel_name_(obj).c_str());
584
+ stream->print(F("\"} 1\n"));
585
+ }
586
+ }
587
+ #endif
588
+
589
+ #ifdef USE_SELECT
590
+ void PrometheusHandler::select_type_(AsyncResponseStream *stream) {
591
+ stream->print(F("#TYPE esphome_select_value gauge\n"));
592
+ stream->print(F("#TYPE esphome_select_failed gauge\n"));
593
+ }
594
+ void PrometheusHandler::select_row_(AsyncResponseStream *stream, select::Select *obj, std::string &area,
595
+ std::string &node, std::string &friendly_name) {
596
+ if (obj->is_internal() && !this->include_internal_)
597
+ return;
598
+ if (obj->has_state()) {
599
+ // We have a valid value, output this value
600
+ stream->print(F("esphome_select_failed{id=\""));
601
+ stream->print(relabel_id_(obj).c_str());
602
+ add_area_label_(stream, area);
603
+ add_node_label_(stream, node);
604
+ add_friendly_name_label_(stream, friendly_name);
605
+ stream->print(F("\",name=\""));
606
+ stream->print(relabel_name_(obj).c_str());
607
+ stream->print(F("\"} 0\n"));
608
+ // Data itself
609
+ stream->print(F("esphome_select_value{id=\""));
610
+ stream->print(relabel_id_(obj).c_str());
611
+ add_area_label_(stream, area);
612
+ add_node_label_(stream, node);
613
+ add_friendly_name_label_(stream, friendly_name);
614
+ stream->print(F("\",name=\""));
615
+ stream->print(relabel_name_(obj).c_str());
616
+ stream->print(F("\",value=\""));
617
+ stream->print(obj->state.c_str());
618
+ stream->print(F("\"} "));
619
+ stream->print(F("1.0"));
620
+ stream->print(F("\n"));
621
+ } else {
622
+ // Invalid state
623
+ stream->print(F("esphome_select_failed{id=\""));
624
+ stream->print(relabel_id_(obj).c_str());
625
+ add_area_label_(stream, area);
626
+ add_node_label_(stream, node);
627
+ add_friendly_name_label_(stream, friendly_name);
628
+ stream->print(F("\",name=\""));
629
+ stream->print(relabel_name_(obj).c_str());
630
+ stream->print(F("\"} 1\n"));
631
+ }
632
+ }
633
+ #endif
634
+
635
+ #ifdef USE_MEDIA_PLAYER
636
+ void PrometheusHandler::media_player_type_(AsyncResponseStream *stream) {
637
+ stream->print(F("#TYPE esphome_media_player_state_value gauge\n"));
638
+ stream->print(F("#TYPE esphome_media_player_volume gauge\n"));
639
+ stream->print(F("#TYPE esphome_media_player_is_muted gauge\n"));
640
+ stream->print(F("#TYPE esphome_media_player_failed gauge\n"));
641
+ }
642
+ void PrometheusHandler::media_player_row_(AsyncResponseStream *stream, media_player::MediaPlayer *obj,
643
+ std::string &area, std::string &node, std::string &friendly_name) {
644
+ if (obj->is_internal() && !this->include_internal_)
645
+ return;
646
+ stream->print(F("esphome_media_player_failed{id=\""));
647
+ stream->print(relabel_id_(obj).c_str());
648
+ add_area_label_(stream, area);
649
+ add_node_label_(stream, node);
650
+ add_friendly_name_label_(stream, friendly_name);
651
+ stream->print(F("\",name=\""));
652
+ stream->print(relabel_name_(obj).c_str());
653
+ stream->print(F("\"} 0\n"));
654
+ // Data itself
655
+ stream->print(F("esphome_media_player_state_value{id=\""));
656
+ stream->print(relabel_id_(obj).c_str());
657
+ add_area_label_(stream, area);
658
+ add_node_label_(stream, node);
659
+ add_friendly_name_label_(stream, friendly_name);
660
+ stream->print(F("\",name=\""));
661
+ stream->print(relabel_name_(obj).c_str());
662
+ stream->print(F("\",value=\""));
663
+ stream->print(media_player::media_player_state_to_string(obj->state));
664
+ stream->print(F("\"} "));
665
+ stream->print(F("1.0"));
666
+ stream->print(F("\n"));
667
+ stream->print(F("esphome_media_player_volume{id=\""));
668
+ stream->print(relabel_id_(obj).c_str());
669
+ add_area_label_(stream, area);
670
+ add_node_label_(stream, node);
671
+ add_friendly_name_label_(stream, friendly_name);
672
+ stream->print(F("\",name=\""));
673
+ stream->print(relabel_name_(obj).c_str());
674
+ stream->print(F("\"} "));
675
+ stream->print(obj->volume);
676
+ stream->print(F("\n"));
677
+ stream->print(F("esphome_media_player_is_muted{id=\""));
678
+ stream->print(relabel_id_(obj).c_str());
679
+ add_area_label_(stream, area);
680
+ add_node_label_(stream, node);
681
+ add_friendly_name_label_(stream, friendly_name);
682
+ stream->print(F("\",name=\""));
683
+ stream->print(relabel_name_(obj).c_str());
684
+ stream->print(F("\"} "));
685
+ if (obj->is_muted()) {
686
+ stream->print(F("1.0"));
687
+ } else {
688
+ stream->print(F("0.0"));
689
+ }
690
+ stream->print(F("\n"));
691
+ }
692
+ #endif
693
+
694
+ #ifdef USE_UPDATE
695
+ void PrometheusHandler::update_entity_type_(AsyncResponseStream *stream) {
696
+ stream->print(F("#TYPE esphome_update_entity_state gauge\n"));
697
+ stream->print(F("#TYPE esphome_update_entity_info gauge\n"));
698
+ stream->print(F("#TYPE esphome_update_entity_failed gauge\n"));
699
+ }
700
+
701
+ void PrometheusHandler::handle_update_state_(AsyncResponseStream *stream, update::UpdateState state) {
702
+ switch (state) {
703
+ case update::UpdateState::UPDATE_STATE_UNKNOWN:
704
+ stream->print("unknown");
705
+ break;
706
+ case update::UpdateState::UPDATE_STATE_NO_UPDATE:
707
+ stream->print("none");
708
+ break;
709
+ case update::UpdateState::UPDATE_STATE_AVAILABLE:
710
+ stream->print("available");
711
+ break;
712
+ case update::UpdateState::UPDATE_STATE_INSTALLING:
713
+ stream->print("installing");
714
+ break;
715
+ default:
716
+ stream->print("invalid");
717
+ break;
718
+ }
719
+ }
720
+
721
+ void PrometheusHandler::update_entity_row_(AsyncResponseStream *stream, update::UpdateEntity *obj, std::string &area,
722
+ std::string &node, std::string &friendly_name) {
723
+ if (obj->is_internal() && !this->include_internal_)
724
+ return;
725
+ if (obj->has_state()) {
726
+ // We have a valid value, output this value
727
+ stream->print(F("esphome_update_entity_failed{id=\""));
728
+ stream->print(relabel_id_(obj).c_str());
729
+ add_area_label_(stream, area);
730
+ add_node_label_(stream, node);
731
+ add_friendly_name_label_(stream, friendly_name);
732
+ stream->print(F("\",name=\""));
733
+ stream->print(relabel_name_(obj).c_str());
734
+ stream->print(F("\"} 0\n"));
735
+ // First update state
736
+ stream->print(F("esphome_update_entity_state{id=\""));
737
+ stream->print(relabel_id_(obj).c_str());
738
+ add_area_label_(stream, area);
739
+ add_node_label_(stream, node);
740
+ add_friendly_name_label_(stream, friendly_name);
741
+ stream->print(F("\",name=\""));
742
+ stream->print(relabel_name_(obj).c_str());
743
+ stream->print(F("\",value=\""));
744
+ handle_update_state_(stream, obj->state);
745
+ stream->print(F("\"} "));
746
+ stream->print(F("1.0"));
747
+ stream->print(F("\n"));
748
+ // Next update info
749
+ stream->print(F("esphome_update_entity_info{id=\""));
750
+ stream->print(relabel_id_(obj).c_str());
751
+ add_area_label_(stream, area);
752
+ add_node_label_(stream, node);
753
+ add_friendly_name_label_(stream, friendly_name);
754
+ stream->print(F("\",name=\""));
755
+ stream->print(relabel_name_(obj).c_str());
756
+ stream->print(F("\",current_version=\""));
757
+ stream->print(obj->update_info.current_version.c_str());
758
+ stream->print(F("\",latest_version=\""));
759
+ stream->print(obj->update_info.latest_version.c_str());
760
+ stream->print(F("\",title=\""));
761
+ stream->print(obj->update_info.title.c_str());
762
+ stream->print(F("\"} "));
763
+ stream->print(F("1.0"));
764
+ stream->print(F("\n"));
765
+ } else {
766
+ // Invalid state
767
+ stream->print(F("esphome_update_entity_failed{id=\""));
768
+ stream->print(relabel_id_(obj).c_str());
769
+ add_area_label_(stream, area);
770
+ add_node_label_(stream, node);
771
+ add_friendly_name_label_(stream, friendly_name);
772
+ stream->print(F("\",name=\""));
773
+ stream->print(relabel_name_(obj).c_str());
774
+ stream->print(F("\"} 1\n"));
775
+ }
776
+ }
777
+ #endif
778
+
779
+ #ifdef USE_VALVE
780
+ void PrometheusHandler::valve_type_(AsyncResponseStream *stream) {
781
+ stream->print(F("#TYPE esphome_valve_operation gauge\n"));
782
+ stream->print(F("#TYPE esphome_valve_failed gauge\n"));
783
+ stream->print(F("#TYPE esphome_valve_position gauge\n"));
784
+ }
785
+
786
+ void PrometheusHandler::valve_row_(AsyncResponseStream *stream, valve::Valve *obj, std::string &area, std::string &node,
787
+ std::string &friendly_name) {
788
+ if (obj->is_internal() && !this->include_internal_)
789
+ return;
790
+ stream->print(F("esphome_valve_failed{id=\""));
791
+ stream->print(relabel_id_(obj).c_str());
792
+ add_area_label_(stream, area);
793
+ add_node_label_(stream, node);
794
+ add_friendly_name_label_(stream, friendly_name);
795
+ stream->print(F("\",name=\""));
796
+ stream->print(relabel_name_(obj).c_str());
797
+ stream->print(F("\"} 0\n"));
798
+ // Data itself
799
+ stream->print(F("esphome_valve_operation{id=\""));
800
+ stream->print(relabel_id_(obj).c_str());
801
+ add_area_label_(stream, area);
802
+ add_node_label_(stream, node);
803
+ add_friendly_name_label_(stream, friendly_name);
804
+ stream->print(F("\",name=\""));
805
+ stream->print(relabel_name_(obj).c_str());
806
+ stream->print(F("\",operation=\""));
807
+ stream->print(valve::valve_operation_to_str(obj->current_operation));
808
+ stream->print(F("\"} "));
809
+ stream->print(F("1.0"));
810
+ stream->print(F("\n"));
811
+ // Now see if position is supported
812
+ if (obj->get_traits().get_supports_position()) {
813
+ stream->print(F("esphome_valve_position{id=\""));
814
+ stream->print(relabel_id_(obj).c_str());
815
+ add_area_label_(stream, area);
816
+ add_node_label_(stream, node);
817
+ add_friendly_name_label_(stream, friendly_name);
818
+ stream->print(F("\",name=\""));
819
+ stream->print(relabel_name_(obj).c_str());
820
+ stream->print(F("\"} "));
821
+ stream->print(obj->position);
822
+ stream->print(F("\n"));
823
+ }
824
+ }
825
+ #endif
826
+
514
827
  } // namespace prometheus
515
828
  } // namespace esphome
516
829
  #endif