esphome 2025.5.2__py3-none-any.whl → 2025.6.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 (715) hide show
  1. esphome/__main__.py +20 -14
  2. esphome/components/a4988/a4988.cpp +1 -1
  3. esphome/components/absolute_humidity/absolute_humidity.cpp +6 -4
  4. esphome/components/ac_dimmer/ac_dimmer.cpp +4 -2
  5. esphome/components/adc/adc_sensor_esp32.cpp +5 -3
  6. esphome/components/adc/adc_sensor_esp8266.cpp +5 -3
  7. esphome/components/adc/adc_sensor_libretiny.cpp +5 -3
  8. esphome/components/adc/adc_sensor_rp2040.cpp +5 -3
  9. esphome/components/adc128s102/adc128s102.cpp +1 -1
  10. esphome/components/ade7880/ade7880.cpp +28 -17
  11. esphome/components/ade7953_base/ade7953_base.cpp +12 -9
  12. esphome/components/ade7953_i2c/ade7953_i2c.cpp +1 -1
  13. esphome/components/ade7953_spi/ade7953_spi.cpp +1 -1
  14. esphome/components/ads1115/ads1115.cpp +3 -5
  15. esphome/components/ads1118/ads1118.cpp +2 -1
  16. esphome/components/ags10/ags10.cpp +3 -2
  17. esphome/components/aht10/aht10.cpp +27 -29
  18. esphome/components/aic3204/aic3204.cpp +2 -2
  19. esphome/components/alarm_control_panel/__init__.py +1 -0
  20. esphome/components/am2315c/am2315c.cpp +2 -2
  21. esphome/components/am2320/am2320.cpp +2 -2
  22. esphome/components/am43/am43_base.h +1 -1
  23. esphome/components/am43/cover/am43_cover.cpp +4 -2
  24. esphome/components/analog_threshold/analog_threshold_binary_sensor.cpp +4 -2
  25. esphome/components/apds9306/apds9306.cpp +8 -5
  26. esphome/components/apds9960/apds9960.cpp +2 -2
  27. esphome/components/api/__init__.py +5 -0
  28. esphome/components/api/api_connection.cpp +712 -358
  29. esphome/components/api/api_connection.h +343 -284
  30. esphome/components/api/api_frame_helper.cpp +349 -344
  31. esphome/components/api/api_frame_helper.h +121 -94
  32. esphome/components/api/api_pb2.cpp +2 -0
  33. esphome/components/api/api_pb2.h +637 -1
  34. esphome/components/api/api_pb2_service.cpp +12 -688
  35. esphome/components/api/api_pb2_service.h +53 -207
  36. esphome/components/api/api_server.cpp +71 -29
  37. esphome/components/api/api_server.h +9 -0
  38. esphome/components/api/client.py +5 -2
  39. esphome/components/api/homeassistant_service.h +1 -1
  40. esphome/components/api/list_entities.cpp +1 -1
  41. esphome/components/api/proto.cpp +1 -0
  42. esphome/components/api/proto.h +4 -3
  43. esphome/components/api/subscribe_state.cpp +8 -16
  44. esphome/components/as3935/as3935.cpp +3 -3
  45. esphome/components/as5600/as5600.cpp +9 -7
  46. esphome/components/as7341/as7341.cpp +7 -5
  47. esphome/components/at581x/at581x.cpp +13 -10
  48. esphome/components/atm90e26/atm90e26.cpp +2 -2
  49. esphome/components/atm90e32/atm90e32.cpp +3 -3
  50. esphome/components/axs15231/touchscreen/axs15231_touchscreen.cpp +5 -3
  51. esphome/components/bang_bang/bang_bang_climate.cpp +8 -5
  52. esphome/components/bedjet/bedjet_hub.cpp +6 -4
  53. esphome/components/beken_spi_led_strip/led_strip.cpp +11 -7
  54. esphome/components/bh1750/bh1750.cpp +2 -2
  55. esphome/components/binary_sensor/__init__.py +1 -0
  56. esphome/components/binary_sensor/automation.cpp +1 -2
  57. esphome/components/bl0906/bl0906.cpp +1 -1
  58. esphome/components/bl0942/bl0942.cpp +11 -8
  59. esphome/components/bl0942/sensor.py +1 -1
  60. esphome/components/ble_client/__init__.py +5 -1
  61. esphome/components/ble_client/output/ble_binary_output.cpp +6 -3
  62. esphome/components/ble_client/sensor/ble_sensor.cpp +9 -6
  63. esphome/components/ble_client/text_sensor/ble_text_sensor.cpp +8 -5
  64. esphome/components/bluetooth_proxy/__init__.py +5 -1
  65. esphome/components/bluetooth_proxy/bluetooth_connection.cpp +5 -5
  66. esphome/components/bluetooth_proxy/bluetooth_proxy.cpp +16 -14
  67. esphome/components/bme280_base/bme280_base.cpp +3 -3
  68. esphome/components/bme680/bme680.cpp +3 -3
  69. esphome/components/bme680/sensor.py +2 -2
  70. esphome/components/bme680_bsec/bme680_bsec.cpp +11 -7
  71. esphome/components/bme680_bsec/sensor.py +7 -3
  72. esphome/components/bme68x_bsec2/__init__.py +6 -5
  73. esphome/components/bme68x_bsec2/bme68x_bsec2.cpp +17 -13
  74. esphome/components/bme68x_bsec2/sensor.py +4 -4
  75. esphome/components/bme68x_bsec2_i2c/bme68x_bsec2_i2c.cpp +1 -0
  76. esphome/components/bmi160/bmi160.cpp +11 -11
  77. esphome/components/bmp085/bmp085.cpp +2 -2
  78. esphome/components/bmp280_base/bmp280_base.cpp +3 -3
  79. esphome/components/bmp3xx_base/bmp3xx_base.cpp +13 -13
  80. esphome/components/bmp581/bmp581.cpp +33 -27
  81. esphome/components/bp1658cj/bp1658cj.cpp +5 -3
  82. esphome/components/bp5758d/bp5758d.cpp +1 -1
  83. esphome/components/button/__init__.py +1 -0
  84. esphome/components/canbus/canbus.cpp +1 -1
  85. esphome/components/cap1188/cap1188.cpp +6 -4
  86. esphome/components/captive_portal/captive_portal.cpp +1 -1
  87. esphome/components/ccs811/ccs811.cpp +3 -2
  88. esphome/components/cd74hc4067/cd74hc4067.cpp +1 -1
  89. esphome/components/ch422g/ch422g.cpp +2 -2
  90. esphome/components/chsc6x/chsc6x_touchscreen.cpp +6 -4
  91. esphome/components/climate/__init__.py +1 -0
  92. esphome/components/climate/climate.cpp +12 -7
  93. esphome/components/climate/climate.h +1 -1
  94. esphome/components/climate_ir/climate_ir.cpp +7 -4
  95. esphome/components/cm1106/__init__.py +1 -0
  96. esphome/components/cm1106/cm1106.cpp +112 -0
  97. esphome/components/cm1106/cm1106.h +40 -0
  98. esphome/components/cm1106/sensor.py +72 -0
  99. esphome/components/const/__init__.py +1 -0
  100. esphome/components/cover/__init__.py +1 -0
  101. esphome/components/cs5460a/cs5460a.cpp +16 -11
  102. esphome/components/cse7761/cse7761.cpp +2 -2
  103. esphome/components/cse7766/cse7766.cpp +0 -5
  104. esphome/components/cse7766/cse7766.h +5 -1
  105. esphome/components/cst226/touchscreen/cst226_touchscreen.cpp +1 -1
  106. esphome/components/cst816/touchscreen/cst816_touchscreen.cpp +6 -3
  107. esphome/components/current_based/current_based_cover.cpp +4 -2
  108. esphome/components/dac7678/dac7678_output.cpp +4 -4
  109. esphome/components/dallas_temp/dallas_temp.cpp +2 -3
  110. esphome/components/daly_bms/daly_bms.cpp +2 -1
  111. esphome/components/dashboard_import/__init__.py +1 -2
  112. esphome/components/datetime/__init__.py +3 -1
  113. esphome/components/debug/debug_component.cpp +1 -1
  114. esphome/components/debug/debug_component.h +1 -1
  115. esphome/components/debug/debug_esp32.cpp +4 -2
  116. esphome/components/deep_sleep/deep_sleep_component.cpp +11 -5
  117. esphome/components/deep_sleep/deep_sleep_esp32.cpp +7 -5
  118. esphome/components/demo/__init__.py +206 -0
  119. esphome/components/demo/demo_alarm_control_panel.h +65 -0
  120. esphome/components/demo/demo_button.h +15 -0
  121. esphome/components/demo/demo_date.h +34 -0
  122. esphome/components/demo/demo_datetime.h +40 -0
  123. esphome/components/demo/demo_lock.h +17 -0
  124. esphome/components/demo/demo_select.h +15 -0
  125. esphome/components/demo/demo_text.h +18 -0
  126. esphome/components/demo/demo_time.h +34 -0
  127. esphome/components/demo/demo_valve.h +54 -0
  128. esphome/components/dfrobot_sen0395/commands.cpp +3 -3
  129. esphome/components/dht/dht.cpp +29 -50
  130. esphome/components/dht12/dht12.cpp +2 -2
  131. esphome/components/display/display.h +5 -3
  132. esphome/components/dps310/dps310.cpp +7 -5
  133. esphome/components/ds1307/ds1307.cpp +2 -2
  134. esphome/components/dsmr/dsmr.cpp +5 -3
  135. esphome/components/duty_cycle/duty_cycle_sensor.cpp +2 -2
  136. esphome/components/duty_time/duty_time_sensor.cpp +5 -3
  137. esphome/components/ee895/ee895.cpp +3 -3
  138. esphome/components/ektf2232/touchscreen/ektf2232.cpp +1 -1
  139. esphome/components/emc2101/emc2101.cpp +11 -9
  140. esphome/components/ens160_base/ens160_base.cpp +2 -2
  141. esphome/components/ens210/ens210.cpp +2 -2
  142. esphome/components/es7210/es7210.cpp +6 -4
  143. esphome/components/es7243e/es7243e.cpp +1 -1
  144. esphome/components/es8156/es8156.cpp +1 -1
  145. esphome/components/es8311/es8311.cpp +8 -6
  146. esphome/components/es8388/__init__.py +0 -0
  147. esphome/components/es8388/audio_dac.py +26 -0
  148. esphome/components/es8388/es8388.cpp +289 -0
  149. esphome/components/es8388/es8388.h +81 -0
  150. esphome/components/es8388/es8388_const.h +83 -0
  151. esphome/components/es8388/select/__init__.py +47 -0
  152. esphome/components/es8388/select/adc_input_mic_select.cpp +12 -0
  153. esphome/components/es8388/select/adc_input_mic_select.h +15 -0
  154. esphome/components/es8388/select/dac_output_select.cpp +12 -0
  155. esphome/components/es8388/select/dac_output_select.h +15 -0
  156. esphome/components/esp32/__init__.py +88 -20
  157. esphome/components/esp32/boards.py +208 -125
  158. esphome/components/esp32/const.py +6 -0
  159. esphome/components/esp32/gpio.py +14 -1
  160. esphome/components/esp32/gpio_esp32_c5.py +45 -0
  161. esphome/components/esp32/gpio_esp32_p4.py +43 -0
  162. esphome/components/esp32/preferences.cpp +7 -7
  163. esphome/components/esp32_ble/__init__.py +115 -0
  164. esphome/components/esp32_ble/ble.cpp +11 -9
  165. esphome/components/esp32_ble/ble_uuid.h +1 -1
  166. esphome/components/esp32_ble_client/ble_client_base.cpp +4 -2
  167. esphome/components/esp32_ble_server/__init__.py +4 -1
  168. esphome/components/esp32_ble_server/ble_characteristic.cpp +1 -0
  169. esphome/components/esp32_ble_server/ble_server.h +0 -1
  170. esphome/components/esp32_ble_tracker/__init__.py +6 -2
  171. esphome/components/esp32_ble_tracker/esp32_ble_tracker.cpp +12 -9
  172. esphome/components/esp32_camera/esp32_camera.cpp +35 -27
  173. esphome/components/esp32_camera_web_server/camera_web_server.cpp +4 -2
  174. esphome/components/esp32_dac/esp32_dac.cpp +2 -2
  175. esphome/components/esp32_improv/__init__.py +5 -1
  176. esphome/components/esp32_improv/esp32_improv_component.cpp +2 -2
  177. esphome/components/esp32_rmt_led_strip/led_strip.cpp +11 -7
  178. esphome/components/esp32_rmt_led_strip/light.py +5 -1
  179. esphome/components/esp32_touch/esp32_touch.cpp +12 -8
  180. esphome/components/esp8266/preferences.cpp +6 -6
  181. esphome/components/esp8266_pwm/esp8266_pwm.cpp +3 -3
  182. esphome/components/esp_ldo/__init__.py +91 -0
  183. esphome/components/esp_ldo/esp_ldo.cpp +43 -0
  184. esphome/components/esp_ldo/esp_ldo.h +43 -0
  185. esphome/components/esphome/ota/ota_esphome.cpp +15 -8
  186. esphome/components/ethernet/ethernet_component.cpp +38 -26
  187. esphome/components/ethernet/ethernet_component.h +1 -1
  188. esphome/components/event/__init__.py +1 -0
  189. esphome/components/exposure_notifications/exposure_notifications.cpp +1 -1
  190. esphome/components/ezo/ezo.cpp +1 -1
  191. esphome/components/ezo_pmp/ezo_pmp.cpp +1 -1
  192. esphome/components/factory_reset/button/factory_reset_button.cpp +1 -1
  193. esphome/components/factory_reset/switch/factory_reset_switch.cpp +1 -1
  194. esphome/components/fan/__init__.py +1 -0
  195. esphome/components/fan/fan.cpp +4 -2
  196. esphome/components/fastled_base/fastled_light.cpp +7 -5
  197. esphome/components/fingerprint_grow/fingerprint_grow.cpp +8 -6
  198. esphome/components/fs3000/fs3000.cpp +1 -1
  199. esphome/components/ft5x06/touchscreen/ft5x06_touchscreen.cpp +7 -4
  200. esphome/components/ft63x6/ft63x6.cpp +5 -3
  201. esphome/components/gcja5/gcja5.cpp +0 -12
  202. esphome/components/gcja5/gcja5.h +8 -3
  203. esphome/components/gdk101/gdk101.cpp +2 -2
  204. esphome/components/globals/globals_component.h +13 -10
  205. esphome/components/gp2y1010au0f/gp2y1010au0f.cpp +4 -2
  206. esphome/components/gp8403/gp8403.cpp +4 -2
  207. esphome/components/gp8403/output/gp8403_output.cpp +4 -2
  208. esphome/components/gpio/one_wire/gpio_one_wire.cpp +2 -2
  209. esphome/components/gpio/output/gpio_binary_output.cpp +1 -1
  210. esphome/components/gpio/switch/gpio_switch.cpp +1 -1
  211. esphome/components/graphical_display_menu/graphical_display_menu.cpp +12 -8
  212. esphome/components/grove_gas_mc_v2/grove_gas_mc_v2.cpp +5 -6
  213. esphome/components/grove_tb6612fng/grove_tb6612fng.cpp +1 -1
  214. esphome/components/grove_tb6612fng/grove_tb6612fng.h +1 -1
  215. esphome/components/growatt_solar/growatt_solar.cpp +6 -3
  216. esphome/components/gt911/touchscreen/gt911_touchscreen.cpp +1 -1
  217. esphome/components/haier/haier_base.cpp +2 -2
  218. esphome/components/haier/hon_climate.cpp +13 -6
  219. esphome/components/havells_solar/havells_solar.cpp +5 -2
  220. esphome/components/hbridge/switch/hbridge_switch.cpp +1 -1
  221. esphome/components/hdc1080/hdc1080.cpp +2 -2
  222. esphome/components/he60r/he60r.cpp +4 -2
  223. esphome/components/hlw8012/hlw8012.cpp +6 -4
  224. esphome/components/hm3301/hm3301.cpp +2 -2
  225. esphome/components/hmc5883l/hmc5883l.cpp +2 -2
  226. esphome/components/homeassistant/time/homeassistant_time.cpp +4 -2
  227. esphome/components/honeywell_hih_i2c/honeywell_hih.cpp +4 -4
  228. esphome/components/honeywellabp/honeywellabp.cpp +4 -2
  229. esphome/components/honeywellabp2_i2c/honeywellabp2.cpp +8 -6
  230. esphome/components/hte501/hte501.cpp +3 -2
  231. esphome/components/http_request/__init__.py +2 -2
  232. esphome/components/http_request/http_request.cpp +7 -5
  233. esphome/components/http_request/http_request_idf.cpp +4 -2
  234. esphome/components/http_request/ota/ota_http_request.cpp +1 -1
  235. esphome/components/htu21d/htu21d.cpp +2 -2
  236. esphome/components/htu31d/htu31d.cpp +2 -2
  237. esphome/components/hx711/hx711.cpp +2 -2
  238. esphome/components/hydreon_rgxx/hydreon_rgxx.cpp +5 -3
  239. esphome/components/hyt271/hyt271.cpp +2 -2
  240. esphome/components/i2c/i2c_bus_arduino.cpp +14 -11
  241. esphome/components/i2c/i2c_bus_esp_idf.cpp +13 -11
  242. esphome/components/i2s_audio/__init__.py +2 -0
  243. esphome/components/i2s_audio/i2s_audio.cpp +3 -4
  244. esphome/components/i2s_audio/i2s_audio.h +1 -1
  245. esphome/components/i2s_audio/media_player/__init__.py +1 -1
  246. esphome/components/i2s_audio/media_player/i2s_audio_media_player.cpp +5 -3
  247. esphome/components/i2s_audio/microphone/i2s_audio_microphone.cpp +1 -1
  248. esphome/components/i2s_audio/speaker/i2s_audio_speaker.cpp +1 -1
  249. esphome/components/iaqcore/iaqcore.cpp +3 -3
  250. esphome/components/ili9xxx/ili9xxx_display.cpp +12 -7
  251. esphome/components/ili9xxx/ili9xxx_display.h +1 -1
  252. esphome/components/image/image.cpp +1 -0
  253. esphome/components/ina219/ina219.cpp +2 -2
  254. esphome/components/ina226/ina226.cpp +8 -5
  255. esphome/components/ina260/ina260.cpp +1 -1
  256. esphome/components/ina2xx_base/ina2xx_base.cpp +13 -9
  257. esphome/components/ina3221/ina3221.cpp +2 -2
  258. esphome/components/inkplate6/display.py +12 -2
  259. esphome/components/inkplate6/inkplate.cpp +13 -9
  260. esphome/components/inkplate6/inkplate.h +7 -6
  261. esphome/components/integration/integration_sensor.cpp +1 -1
  262. esphome/components/internal_temperature/internal_temperature.cpp +4 -4
  263. esphome/components/json/json_util.cpp +4 -5
  264. esphome/components/kamstrup_kmp/kamstrup_kmp.cpp +1 -1
  265. esphome/components/key_collector/key_collector.cpp +4 -2
  266. esphome/components/kmeteriso/kmeteriso.cpp +2 -1
  267. esphome/components/kuntze/kuntze.cpp +4 -2
  268. esphome/components/lc709203f/__init__.py +1 -0
  269. esphome/components/lc709203f/lc709203f.cpp +299 -0
  270. esphome/components/lc709203f/lc709203f.h +55 -0
  271. esphome/components/lc709203f/sensor.py +93 -0
  272. esphome/components/lcd_base/lcd_display.cpp +2 -2
  273. esphome/components/lcd_gpio/gpio_lcd_display.cpp +5 -3
  274. esphome/components/lcd_menu/lcd_menu.cpp +6 -4
  275. esphome/components/lcd_pcf8574/pcf8574_display.cpp +6 -4
  276. esphome/components/ld2410/ld2410.cpp +6 -7
  277. esphome/components/ld2420/ld2420.cpp +9 -7
  278. esphome/components/ld2450/ld2450.cpp +6 -4
  279. esphome/components/ld2450/sensor.py +2 -2
  280. esphome/components/ledc/ledc_output.cpp +32 -28
  281. esphome/components/libretiny/const.py +1 -1
  282. esphome/components/libretiny/preferences.cpp +6 -7
  283. esphome/components/light/__init__.py +2 -1
  284. esphome/components/light/esp_hsv_color.h +1 -1
  285. esphome/components/light/light_state.cpp +9 -5
  286. esphome/components/light/light_transformer.h +1 -1
  287. esphome/components/lightwaverf/LwTx.cpp +1 -1
  288. esphome/components/lightwaverf/lightwaverf.cpp +1 -1
  289. esphome/components/lilygo_t5_47/touchscreen/lilygo_t5_47_touchscreen.cpp +1 -1
  290. esphome/components/lock/__init__.py +1 -0
  291. esphome/components/lock/lock.h +1 -1
  292. esphome/components/logger/__init__.py +6 -0
  293. esphome/components/logger/logger.cpp +9 -5
  294. esphome/components/logger/logger_esp32.cpp +5 -5
  295. esphome/components/ltr390/ltr390.cpp +8 -5
  296. esphome/components/ltr501/ltr501.cpp +19 -14
  297. esphome/components/ltr_als_ps/ltr_als_ps.cpp +20 -13
  298. esphome/components/lvgl/__init__.py +2 -2
  299. esphome/components/lvgl/automation.py +5 -4
  300. esphome/components/lvgl/defines.py +0 -2
  301. esphome/components/lvgl/lv_validation.py +1 -3
  302. esphome/components/lvgl/lvcode.py +7 -8
  303. esphome/components/lvgl/lvgl_esphome.cpp +26 -10
  304. esphome/components/lvgl/schemas.py +22 -23
  305. esphome/components/lvgl/trigger.py +8 -3
  306. esphome/components/lvgl/widgets/__init__.py +2 -2
  307. esphome/components/lvgl/widgets/canvas.py +9 -3
  308. esphome/components/lvgl/widgets/line.py +2 -1
  309. esphome/components/lvgl/widgets/tabview.py +7 -0
  310. esphome/components/m5stack_8angle/m5stack_8angle.cpp +3 -3
  311. esphome/components/matrix_keypad/matrix_keypad.cpp +2 -2
  312. esphome/components/max17043/max17043.cpp +2 -2
  313. esphome/components/max31855/max31855.cpp +2 -1
  314. esphome/components/max31856/max31856.cpp +9 -11
  315. esphome/components/max31865/max31865.cpp +6 -4
  316. esphome/components/max44009/max44009.cpp +2 -2
  317. esphome/components/max6675/max6675.cpp +1 -1
  318. esphome/components/max6956/max6956.cpp +5 -3
  319. esphome/components/max7219/max7219.cpp +8 -6
  320. esphome/components/max7219digit/automation.h +52 -0
  321. esphome/components/max7219digit/display.py +93 -1
  322. esphome/components/max7219digit/max7219digit.cpp +16 -13
  323. esphome/components/max9611/max9611.cpp +9 -6
  324. esphome/components/mcp23008/mcp23008.cpp +1 -1
  325. esphome/components/mcp23016/mcp23016.cpp +1 -1
  326. esphome/components/mcp23017/mcp23017.cpp +1 -1
  327. esphome/components/mcp23s08/mcp23s08.cpp +1 -1
  328. esphome/components/mcp23s17/mcp23s17.cpp +1 -1
  329. esphome/components/mcp3008/mcp3008.cpp +1 -1
  330. esphome/components/mcp3008/sensor/mcp3008_sensor.cpp +5 -3
  331. esphome/components/mcp3204/mcp3204.cpp +1 -1
  332. esphome/components/mcp4461/mcp4461.cpp +2 -2
  333. esphome/components/mcp4725/mcp4725.cpp +2 -2
  334. esphome/components/mcp4728/mcp4728.cpp +2 -2
  335. esphome/components/mcp9600/mcp9600.cpp +1 -1
  336. esphome/components/mcp9808/mcp9808.cpp +4 -4
  337. esphome/components/mdns/mdns_component.cpp +8 -2
  338. esphome/components/mdns/mdns_component.h +3 -1
  339. esphome/components/mdns/mdns_esp32.cpp +2 -2
  340. esphome/components/media_player/__init__.py +1 -0
  341. esphome/components/micro_wake_word/micro_wake_word.cpp +1 -1
  342. esphome/components/micro_wake_word/streaming_model.cpp +10 -6
  343. esphome/components/micronova/micronova.h +2 -2
  344. esphome/components/mics_4514/mics_4514.cpp +2 -2
  345. esphome/components/midea/air_conditioner.cpp +7 -5
  346. esphome/components/midea_ir/midea_ir.cpp +1 -1
  347. esphome/components/mipi_spi/mipi_spi.cpp +24 -15
  348. esphome/components/mixer/speaker/mixer_speaker.cpp +8 -4
  349. esphome/components/mlx90393/sensor_mlx90393.cpp +2 -2
  350. esphome/components/mlx90614/mlx90614.cpp +4 -3
  351. esphome/components/mmc5603/mmc5603.cpp +2 -2
  352. esphome/components/mmc5983/mmc5983.cpp +1 -1
  353. esphome/components/modbus/modbus.cpp +7 -5
  354. esphome/components/modbus_controller/modbus_controller.cpp +6 -4
  355. esphome/components/modbus_controller/output/modbus_output.cpp +10 -6
  356. esphome/components/modbus_controller/switch/__init__.py +6 -2
  357. esphome/components/modbus_controller/switch/modbus_switch.cpp +4 -0
  358. esphome/components/modbus_controller/switch/modbus_switch.h +3 -0
  359. esphome/components/mpl3115a2/mpl3115a2.cpp +3 -2
  360. esphome/components/mpr121/mpr121.cpp +2 -2
  361. esphome/components/mpu6050/mpu6050.cpp +6 -6
  362. esphome/components/mpu6886/mpu6886.cpp +6 -6
  363. esphome/components/mqtt/mqtt_alarm_control_panel.cpp +7 -3
  364. esphome/components/mqtt/mqtt_backend_esp32.cpp +1 -1
  365. esphome/components/mqtt/mqtt_client.cpp +31 -24
  366. esphome/components/mqtt/mqtt_component.cpp +2 -2
  367. esphome/components/mqtt/mqtt_cover.cpp +8 -4
  368. esphome/components/mqtt/mqtt_fan.cpp +12 -6
  369. esphome/components/mqtt/mqtt_valve.cpp +4 -2
  370. esphome/components/ms5611/ms5611.cpp +2 -2
  371. esphome/components/ms8607/ms8607.cpp +2 -2
  372. esphome/components/msa3xx/msa3xx.cpp +16 -12
  373. esphome/components/my9231/my9231.cpp +7 -5
  374. esphome/components/nau7802/nau7802.cpp +6 -4
  375. esphome/components/neopixelbus/neopixelbus_light.h +2 -2
  376. esphome/components/network/ip_address.h +1 -1
  377. esphome/components/network/util.cpp +13 -0
  378. esphome/components/nextion/base_component.py +2 -0
  379. esphome/components/nextion/binary_sensor/nextion_binarysensor.cpp +2 -3
  380. esphome/components/nextion/display.py +34 -22
  381. esphome/components/nextion/nextion.cpp +182 -143
  382. esphome/components/nextion/nextion.h +36 -0
  383. esphome/components/nextion/nextion_commands.cpp +3 -3
  384. esphome/components/nextion/nextion_upload_arduino.cpp +58 -61
  385. esphome/components/nextion/nextion_upload_idf.cpp +69 -72
  386. esphome/components/nextion/sensor/nextion_sensor.cpp +4 -4
  387. esphome/components/nextion/switch/nextion_switch.cpp +2 -2
  388. esphome/components/nextion/text_sensor/nextion_textsensor.cpp +2 -2
  389. esphome/components/nfc/nci_message.h +1 -1
  390. esphome/components/nfc/ndef_record.h +1 -1
  391. esphome/components/nfc/ndef_record_text.h +1 -1
  392. esphome/components/nfc/ndef_record_uri.h +1 -1
  393. esphome/components/nfc/nfc.h +1 -1
  394. esphome/components/nfc/nfc_tag.h +1 -1
  395. esphome/components/noblex/noblex.cpp +1 -1
  396. esphome/components/npi19/npi19.cpp +5 -7
  397. esphome/components/number/__init__.py +11 -0
  398. esphome/components/online_image/__init__.py +13 -1
  399. esphome/components/online_image/online_image.cpp +26 -4
  400. esphome/components/online_image/online_image.h +21 -4
  401. esphome/components/opentherm/generate.py +3 -3
  402. esphome/components/opentherm/hub.cpp +11 -7
  403. esphome/components/opentherm/number/number.cpp +5 -3
  404. esphome/components/opentherm/opentherm.h +1 -1
  405. esphome/components/opentherm/schema.py +13 -13
  406. esphome/components/opentherm/validate.py +1 -1
  407. esphome/components/openthread/__init__.py +146 -0
  408. esphome/components/openthread/const.py +10 -0
  409. esphome/components/openthread/openthread.cpp +206 -0
  410. esphome/components/openthread/openthread.h +68 -0
  411. esphome/components/openthread/openthread_esp.cpp +164 -0
  412. esphome/components/openthread/tlv.py +58 -0
  413. esphome/components/openthread_info/__init__.py +0 -0
  414. esphome/components/openthread_info/openthread_info_text_sensor.cpp +24 -0
  415. esphome/components/openthread_info/openthread_info_text_sensor.h +218 -0
  416. esphome/components/openthread_info/text_sensor.py +105 -0
  417. esphome/components/output/float_output.cpp +1 -1
  418. esphome/components/output/switch/output_switch.cpp +1 -1
  419. esphome/components/packet_transport/packet_transport.cpp +6 -4
  420. esphome/components/pca6416a/pca6416a.cpp +2 -2
  421. esphome/components/pca9554/pca9554.cpp +6 -4
  422. esphome/components/pca9685/pca9685_output.cpp +12 -8
  423. esphome/components/pcd8544/pcd_8544.cpp +1 -1
  424. esphome/components/pcf85063/pcf85063.cpp +2 -2
  425. esphome/components/pcf8563/pcf8563.cpp +2 -2
  426. esphome/components/pcf8574/pcf8574.cpp +2 -2
  427. esphome/components/pid/pid_climate.cpp +8 -5
  428. esphome/components/pid/pid_climate.h +1 -1
  429. esphome/components/pid/sensor/pid_climate_sensor.cpp +1 -1
  430. esphome/components/pipsolar/output/pipsolar_output.cpp +1 -1
  431. esphome/components/pipsolar/pipsolar.cpp +3 -3
  432. esphome/components/pm1006/pm1006.cpp +3 -7
  433. esphome/components/pm1006/pm1006.h +4 -1
  434. esphome/components/pm2005/pm2005.cpp +12 -13
  435. esphome/components/pm2005/sensor.py +1 -1
  436. esphome/components/pmsa003i/pmsa003i.cpp +2 -2
  437. esphome/components/pmsx003/pmsx003.cpp +0 -4
  438. esphome/components/pmsx003/pmsx003.h +5 -2
  439. esphome/components/pmwcs3/pmwcs3.cpp +9 -13
  440. esphome/components/pmwcs3/pmwcs3.h +0 -1
  441. esphome/components/pn532/pn532.cpp +7 -7
  442. esphome/components/pn532/pn532.h +1 -1
  443. esphome/components/pn532_spi/pn532_spi.cpp +1 -1
  444. esphome/components/pn7150/pn7150.cpp +4 -4
  445. esphome/components/pn7160/pn7160.cpp +4 -4
  446. esphome/components/power_supply/power_supply.cpp +6 -4
  447. esphome/components/power_supply/power_supply.h +1 -1
  448. esphome/components/psram/__init__.py +59 -35
  449. esphome/components/pulse_counter/pulse_counter_sensor.cpp +7 -4
  450. esphome/components/pvvx_mithermometer/display/pvvx_display.cpp +8 -5
  451. esphome/components/pylontech/pylontech.cpp +2 -2
  452. esphome/components/pylontech/sensor/pylontech_sensor.cpp +4 -2
  453. esphome/components/pylontech/text_sensor/pylontech_text_sensor.cpp +4 -2
  454. esphome/components/pzemac/pzemac.cpp +4 -2
  455. esphome/components/pzemdc/pzemdc.cpp +4 -2
  456. esphome/components/qmc5883l/qmc5883l.cpp +2 -2
  457. esphome/components/qmp6988/qmp6988.cpp +2 -2
  458. esphome/components/qmp6988/qmp6988.h +1 -1
  459. esphome/components/qr_code/qr_code.cpp +5 -3
  460. esphome/components/qspi_dbi/qspi_dbi.cpp +1 -1
  461. esphome/components/qwiic_pir/qwiic_pir.cpp +26 -28
  462. esphome/components/rc522/rc522.cpp +5 -5
  463. esphome/components/rdm6300/rdm6300.cpp +1 -0
  464. esphome/components/remote_receiver/__init__.py +10 -2
  465. esphome/components/remote_receiver/remote_receiver_esp32.cpp +22 -12
  466. esphome/components/remote_receiver/remote_receiver_esp8266.cpp +10 -7
  467. esphome/components/remote_receiver/remote_receiver_libretiny.cpp +10 -7
  468. esphome/components/remote_transmitter/__init__.py +10 -2
  469. esphome/components/remote_transmitter/remote_transmitter_esp32.cpp +10 -6
  470. esphome/components/remote_transmitter/remote_transmitter_esp8266.cpp +5 -3
  471. esphome/components/remote_transmitter/remote_transmitter_libretiny.cpp +5 -3
  472. esphome/components/resistance/resistance_sensor.cpp +6 -3
  473. esphome/components/restart/button/restart_button.cpp +1 -1
  474. esphome/components/restart/switch/restart_switch.cpp +1 -1
  475. esphome/components/rotary_encoder/rotary_encoder.cpp +2 -2
  476. esphome/components/rp2040/__init__.py +7 -0
  477. esphome/components/rp2040/core.cpp +8 -1
  478. esphome/components/rp2040/preferences.cpp +3 -3
  479. esphome/components/rp2040_pio_led_strip/led_strip.cpp +11 -8
  480. esphome/components/rp2040_pio_led_strip/light.py +1 -1
  481. esphome/components/rp2040_pwm/rp2040_pwm.cpp +1 -1
  482. esphome/components/rpi_dpi_rgb/rpi_dpi_rgb.cpp +1 -1
  483. esphome/components/rtttl/rtttl.cpp +11 -9
  484. esphome/components/safe_mode/button/safe_mode_button.cpp +1 -1
  485. esphome/components/safe_mode/safe_mode.cpp +9 -8
  486. esphome/components/safe_mode/switch/safe_mode_switch.cpp +1 -1
  487. esphome/components/scd30/scd30.cpp +11 -8
  488. esphome/components/scd4x/scd4x.cpp +12 -8
  489. esphome/components/sdl/display.py +40 -0
  490. esphome/components/sdl/sdl_esphome.cpp +2 -2
  491. esphome/components/sdl/sdl_esphome.h +8 -0
  492. esphome/components/sdm_meter/sdm_meter.cpp +5 -2
  493. esphome/components/sdp3x/sdp3x.cpp +11 -11
  494. esphome/components/sds011/sds011.cpp +5 -6
  495. esphome/components/sds011/sds011.h +4 -1
  496. esphome/components/seeed_mr24hpc1/seeed_mr24hpc1.cpp +3 -2
  497. esphome/components/seeed_mr60bha2/seeed_mr60bha2.cpp +1 -0
  498. esphome/components/seeed_mr60fda2/seeed_mr60fda2.cpp +3 -2
  499. esphome/components/selec_meter/selec_meter.cpp +5 -2
  500. esphome/components/select/__init__.py +1 -0
  501. esphome/components/sen0321/sen0321.cpp +2 -2
  502. esphome/components/sen21231/sen21231.cpp +1 -1
  503. esphome/components/sen5x/sen5x.cpp +10 -7
  504. esphome/components/sensirion_common/i2c_sensirion.cpp +2 -1
  505. esphome/components/sensirion_common/i2c_sensirion.h +1 -0
  506. esphome/components/sensor/__init__.py +11 -1
  507. esphome/components/sensor/filter.h +1 -1
  508. esphome/components/sensor/sensor.h +9 -5
  509. esphome/components/servo/servo.cpp +12 -9
  510. esphome/components/servo/servo.h +1 -1
  511. esphome/components/sfa30/sfa30.cpp +1 -1
  512. esphome/components/sgp30/sgp30.cpp +10 -8
  513. esphome/components/sgp4x/sgp4x.cpp +49 -61
  514. esphome/components/sgp4x/sgp4x.h +0 -1
  515. esphome/components/shelly_dimmer/shelly_dimmer.cpp +11 -7
  516. esphome/components/sht3xd/sht3xd.cpp +1 -1
  517. esphome/components/sht4x/sht4x.cpp +2 -2
  518. esphome/components/shtcx/shtcx.cpp +13 -16
  519. esphome/components/shutdown/button/shutdown_button.cpp +1 -1
  520. esphome/components/shutdown/switch/shutdown_switch.cpp +1 -1
  521. esphome/components/sim800l/sim800l.cpp +2 -2
  522. esphome/components/slow_pwm/slow_pwm_output.cpp +4 -2
  523. esphome/components/sm16716/sm16716.cpp +1 -1
  524. esphome/components/sm2135/sm2135.cpp +1 -1
  525. esphome/components/sm2235/sm2235.cpp +5 -3
  526. esphome/components/sm2335/sm2335.cpp +5 -3
  527. esphome/components/sml/sml.cpp +1 -1
  528. esphome/components/sn74hc165/sn74hc165.cpp +1 -2
  529. esphome/components/sn74hc595/sn74hc595.cpp +1 -2
  530. esphome/components/sntp/sntp_component.cpp +1 -1
  531. esphome/components/socket/__init__.py +2 -0
  532. esphome/components/socket/bsd_sockets_impl.cpp +51 -7
  533. esphome/components/socket/lwip_raw_tcp_impl.cpp +5 -0
  534. esphome/components/socket/lwip_sockets_impl.cpp +51 -7
  535. esphome/components/socket/socket.cpp +31 -0
  536. esphome/components/socket/socket.h +27 -1
  537. esphome/components/sonoff_d1/sonoff_d1.cpp +7 -4
  538. esphome/components/sonoff_d1/sonoff_d1.h +2 -2
  539. esphome/components/sound_level/sound_level.cpp +4 -2
  540. esphome/components/speaker/media_player/__init__.py +3 -0
  541. esphome/components/speaker/media_player/speaker_media_player.cpp +1 -3
  542. esphome/components/speaker/media_player/speaker_media_player.h +6 -0
  543. esphome/components/spi/__init__.py +10 -2
  544. esphome/components/spi/spi.cpp +4 -4
  545. esphome/components/spi_device/spi_device.cpp +1 -2
  546. esphome/components/sprinkler/sprinkler.cpp +9 -6
  547. esphome/components/sps30/sps30.cpp +16 -15
  548. esphome/components/ssd1306_base/ssd1306_base.cpp +1 -1
  549. esphome/components/ssd1306_i2c/ssd1306_i2c.cpp +11 -8
  550. esphome/components/ssd1306_spi/ssd1306_spi.cpp +10 -7
  551. esphome/components/ssd1322_base/ssd1322_base.cpp +1 -1
  552. esphome/components/ssd1322_spi/ssd1322_spi.cpp +1 -1
  553. esphome/components/ssd1325_base/ssd1325_base.cpp +1 -1
  554. esphome/components/ssd1325_spi/ssd1325_spi.cpp +1 -1
  555. esphome/components/ssd1327_base/ssd1327_base.cpp +1 -1
  556. esphome/components/ssd1327_i2c/ssd1327_i2c.cpp +2 -2
  557. esphome/components/ssd1327_spi/ssd1327_spi.cpp +1 -1
  558. esphome/components/ssd1331_base/ssd1331_base.cpp +1 -1
  559. esphome/components/ssd1331_spi/ssd1331_spi.cpp +1 -1
  560. esphome/components/ssd1351_base/ssd1351_base.cpp +1 -1
  561. esphome/components/ssd1351_spi/ssd1351_spi.cpp +1 -1
  562. esphome/components/st7567_base/st7567_base.cpp +3 -3
  563. esphome/components/st7567_i2c/st7567_i2c.cpp +7 -5
  564. esphome/components/st7567_spi/st7567_spi.cpp +1 -1
  565. esphome/components/st7701s/st7701s.cpp +4 -2
  566. esphome/components/st7735/st7735.cpp +3 -3
  567. esphome/components/st7789v/st7789v.cpp +10 -7
  568. esphome/components/st7920/st7920.cpp +6 -4
  569. esphome/components/statsd/statsd.cpp +9 -5
  570. esphome/components/status_led/light/status_led_light.cpp +1 -1
  571. esphome/components/status_led/status_led.cpp +1 -1
  572. esphome/components/stepper/stepper.h +5 -3
  573. esphome/components/sts3x/sts3x.cpp +2 -2
  574. esphome/components/switch/__init__.py +1 -0
  575. esphome/components/switch/switch.cpp +18 -12
  576. esphome/components/switch/switch.h +1 -1
  577. esphome/components/sx1509/__init__.py +53 -20
  578. esphome/components/sx1509/sx1509.cpp +29 -5
  579. esphome/components/sx1509/sx1509.h +9 -1
  580. esphome/components/t6615/t6615.cpp +1 -0
  581. esphome/components/tc74/tc74.cpp +1 -1
  582. esphome/components/tca9548a/tca9548a.cpp +1 -1
  583. esphome/components/tca9555/tca9555.cpp +2 -2
  584. esphome/components/tcs34725/tcs34725.cpp +4 -4
  585. esphome/components/tee501/tee501.cpp +3 -2
  586. esphome/components/tem3200/tem3200.cpp +5 -6
  587. esphome/components/template/alarm_control_panel/__init__.py +6 -0
  588. esphome/components/template/alarm_control_panel/template_alarm_control_panel.cpp +38 -12
  589. esphome/components/template/alarm_control_panel/template_alarm_control_panel.h +3 -1
  590. esphome/components/template/cover/template_cover.cpp +1 -1
  591. esphome/components/template/select/template_select.cpp +6 -4
  592. esphome/components/template/text/template_text.cpp +2 -3
  593. esphome/components/template/valve/template_valve.cpp +5 -3
  594. esphome/components/text/__init__.py +10 -11
  595. esphome/components/text_sensor/__init__.py +1 -0
  596. esphome/components/thermostat/thermostat_climate.cpp +67 -43
  597. esphome/components/time/__init__.py +1 -2
  598. esphome/components/time_based/time_based_cover.cpp +4 -2
  599. esphome/components/tlc59208f/tlc59208f_output.cpp +8 -6
  600. esphome/components/tm1621/tm1621.cpp +3 -3
  601. esphome/components/tm1637/tm1637.cpp +9 -7
  602. esphome/components/tm1638/tm1638.cpp +7 -5
  603. esphome/components/tm1651/tm1651.cpp +2 -2
  604. esphome/components/tmp102/tmp102.cpp +1 -3
  605. esphome/components/tmp102/tmp102.h +0 -3
  606. esphome/components/tmp1075/tmp1075.cpp +12 -9
  607. esphome/components/tmp117/tmp117.cpp +2 -2
  608. esphome/components/tof10120/tof10120_sensor.cpp +2 -2
  609. esphome/components/tormatic/tormatic_cover.cpp +4 -2
  610. esphome/components/tsl2561/tsl2561.cpp +7 -5
  611. esphome/components/tsl2591/tsl2591.cpp +25 -27
  612. esphome/components/tt21100/touchscreen/tt21100.cpp +1 -1
  613. esphome/components/ttp229_bsf/ttp229_bsf.cpp +1 -1
  614. esphome/components/ttp229_lsf/ttp229_lsf.cpp +2 -2
  615. esphome/components/tuya/select/tuya_select.cpp +5 -3
  616. esphome/components/tx20/tx20.cpp +3 -3
  617. esphome/components/uart/__init__.py +4 -5
  618. esphome/components/uart/button/uart_button.cpp +1 -1
  619. esphome/components/uart/switch/uart_switch.cpp +2 -2
  620. esphome/components/uart/uart.cpp +2 -2
  621. esphome/components/uart/uart_component_esp32_arduino.cpp +8 -6
  622. esphome/components/uart/uart_component_esp8266.cpp +9 -7
  623. esphome/components/uart/uart_component_esp_idf.cpp +9 -7
  624. esphome/components/uart/uart_component_host.cpp +11 -8
  625. esphome/components/uart/uart_component_libretiny.cpp +8 -6
  626. esphome/components/uart/uart_component_rp2040.cpp +8 -6
  627. esphome/components/udp/udp_component.cpp +9 -5
  628. esphome/components/ufire_ec/ufire_ec.cpp +5 -3
  629. esphome/components/ufire_ise/ufire_ise.cpp +1 -1
  630. esphome/components/ultrasonic/ultrasonic_sensor.cpp +5 -3
  631. esphome/components/update/__init__.py +1 -0
  632. esphome/components/uponor_smatrix/climate/uponor_smatrix_climate.cpp +1 -1
  633. esphome/components/uponor_smatrix/sensor/uponor_smatrix_sensor.cpp +4 -2
  634. esphome/components/uponor_smatrix/uponor_smatrix.cpp +2 -1
  635. esphome/components/usb_host/__init__.py +64 -0
  636. esphome/components/usb_host/usb_host.h +116 -0
  637. esphome/components/usb_host/usb_host_client.cpp +394 -0
  638. esphome/components/usb_host/usb_host_component.cpp +35 -0
  639. esphome/components/usb_uart/__init__.py +134 -0
  640. esphome/components/usb_uart/ch34x.cpp +80 -0
  641. esphome/components/usb_uart/cp210x.cpp +126 -0
  642. esphome/components/usb_uart/usb_uart.cpp +328 -0
  643. esphome/components/usb_uart/usb_uart.h +151 -0
  644. esphome/components/valve/__init__.py +1 -0
  645. esphome/components/veml3235/veml3235.cpp +13 -9
  646. esphome/components/veml7700/veml7700.cpp +10 -6
  647. esphome/components/voice_assistant/voice_assistant.cpp +7 -7
  648. esphome/components/wake_on_lan/wake_on_lan.cpp +1 -1
  649. esphome/components/waveshare_epaper/waveshare_epaper.cpp +1 -1
  650. esphome/components/web_server/server_index_v2.h +632 -630
  651. esphome/components/web_server/server_index_v3.h +411 -409
  652. esphome/components/web_server/web_server.cpp +5 -3
  653. esphome/components/web_server_base/web_server_base.cpp +1 -1
  654. esphome/components/web_server_idf/utils.cpp +1 -1
  655. esphome/components/web_server_idf/web_server_idf.cpp +1 -1
  656. esphome/components/weikai/__init__.py +2 -0
  657. esphome/components/weikai/weikai.cpp +23 -21
  658. esphome/components/weikai_i2c/weikai_i2c.cpp +14 -9
  659. esphome/components/weikai_spi/weikai_spi.cpp +11 -6
  660. esphome/components/wiegand/wiegand.cpp +1 -1
  661. esphome/components/wifi/wifi_component.cpp +50 -37
  662. esphome/components/wifi/wifi_component.h +7 -4
  663. esphome/components/wifi/wifi_component_esp32_arduino.cpp +2 -2
  664. esphome/components/wifi/wifi_component_esp8266.cpp +3 -3
  665. esphome/components/wifi/wifi_component_libretiny.cpp +4 -4
  666. esphome/components/wireguard/wireguard.cpp +21 -21
  667. esphome/components/wl_134/text_sensor.py +1 -2
  668. esphome/components/wled/wled_light_effect.cpp +1 -1
  669. esphome/components/x9c/x9c.cpp +5 -3
  670. esphome/components/xgzp68xx/xgzp68xx.cpp +8 -6
  671. esphome/components/xiaomi_cgd1/xiaomi_cgd1.cpp +4 -2
  672. esphome/components/xiaomi_cgdk2/xiaomi_cgdk2.cpp +4 -2
  673. esphome/components/xiaomi_cgg1/xiaomi_cgg1.cpp +4 -2
  674. esphome/components/xiaomi_hhccjcy10/xiaomi_hhccjcy10.cpp +1 -1
  675. esphome/components/xiaomi_lywsd02mmc/xiaomi_lywsd02mmc.cpp +4 -2
  676. esphome/components/xiaomi_lywsd03mmc/xiaomi_lywsd03mmc.cpp +4 -2
  677. esphome/components/xiaomi_mhoc401/xiaomi_mhoc401.cpp +4 -2
  678. esphome/components/xl9535/xl9535.cpp +2 -2
  679. esphome/components/xpt2046/touchscreen/xpt2046.cpp +12 -11
  680. esphome/components/xpt2046/touchscreen/xpt2046.h +2 -2
  681. esphome/config.py +3 -2
  682. esphome/config_validation.py +46 -17
  683. esphome/const.py +10 -1
  684. esphome/core/__init__.py +37 -18
  685. esphome/core/application.cpp +188 -5
  686. esphome/core/application.h +110 -0
  687. esphome/core/component.h +13 -0
  688. esphome/core/config.py +12 -0
  689. esphome/core/defines.h +10 -2
  690. esphome/core/helpers.cpp +1 -1
  691. esphome/core/helpers.h +4 -4
  692. esphome/core/log.h +2 -0
  693. esphome/core/log_const_en.h +4 -0
  694. esphome/core/scheduler.cpp +2 -2
  695. esphome/coroutine.py +3 -4
  696. esphome/cpp_generator.py +32 -32
  697. esphome/dashboard/core.py +2 -2
  698. esphome/dashboard/web_server.py +2 -2
  699. esphome/git.py +4 -4
  700. esphome/helpers.py +5 -6
  701. esphome/loader.py +8 -7
  702. esphome/log.py +7 -1
  703. esphome/platformio_api.py +2 -3
  704. esphome/storage_json.py +13 -5
  705. esphome/types.py +12 -13
  706. esphome/util.py +1 -2
  707. esphome/writer.py +5 -3
  708. esphome/yaml_util.py +6 -1
  709. esphome/zeroconf.py +1 -1
  710. {esphome-2025.5.2.dist-info → esphome-2025.6.0b1.dist-info}/METADATA +12 -11
  711. {esphome-2025.5.2.dist-info → esphome-2025.6.0b1.dist-info}/RECORD +715 -662
  712. {esphome-2025.5.2.dist-info → esphome-2025.6.0b1.dist-info}/WHEEL +1 -1
  713. {esphome-2025.5.2.dist-info → esphome-2025.6.0b1.dist-info}/entry_points.txt +0 -0
  714. {esphome-2025.5.2.dist-info → esphome-2025.6.0b1.dist-info}/licenses/LICENSE +0 -0
  715. {esphome-2025.5.2.dist-info → esphome-2025.6.0b1.dist-info}/top_level.txt +0 -0
@@ -20,24 +20,18 @@ inline const char *to_string(SHTCXType type) {
20
20
  case SHTCX_TYPE_SHTC1:
21
21
  return "SHTC1";
22
22
  default:
23
- return "[Unknown model]";
23
+ return "UNKNOWN";
24
24
  }
25
25
  }
26
26
 
27
27
  void SHTCXComponent::setup() {
28
- ESP_LOGCONFIG(TAG, "Setting up SHTCx...");
28
+ ESP_LOGCONFIG(TAG, "Running setup");
29
29
  this->wake_up();
30
30
  this->soft_reset();
31
31
 
32
- if (!this->write_command(SHTCX_COMMAND_READ_ID_REGISTER)) {
33
- ESP_LOGE(TAG, "Error requesting Device ID");
34
- this->mark_failed();
35
- return;
36
- }
37
-
38
32
  uint16_t device_id_register;
39
- if (!this->read_data(&device_id_register, 1)) {
40
- ESP_LOGE(TAG, "Error reading Device ID");
33
+ if (!this->write_command(SHTCX_COMMAND_READ_ID_REGISTER) || !this->read_data(&device_id_register, 1)) {
34
+ ESP_LOGE(TAG, ESP_LOG_MSG_COMM_FAIL);
41
35
  this->mark_failed();
42
36
  return;
43
37
  }
@@ -53,31 +47,33 @@ void SHTCXComponent::setup() {
53
47
  } else {
54
48
  this->type_ = SHTCX_TYPE_UNKNOWN;
55
49
  }
56
- ESP_LOGCONFIG(TAG, " Device identified: %s (%04x)", to_string(this->type_), device_id_register);
57
50
  }
51
+
58
52
  void SHTCXComponent::dump_config() {
59
53
  ESP_LOGCONFIG(TAG, "SHTCx:");
60
54
  ESP_LOGCONFIG(TAG, " Model: %s (%04x)", to_string(this->type_), this->sensor_id_);
61
55
  LOG_I2C_DEVICE(this);
62
56
  if (this->is_failed()) {
63
- ESP_LOGE(TAG, "Communication with SHTCx failed!");
57
+ ESP_LOGE(TAG, ESP_LOG_MSG_COMM_FAIL);
64
58
  }
65
59
  LOG_UPDATE_INTERVAL(this);
66
60
 
67
61
  LOG_SENSOR(" ", "Temperature", this->temperature_sensor_);
68
62
  LOG_SENSOR(" ", "Humidity", this->humidity_sensor_);
69
63
  }
64
+
70
65
  float SHTCXComponent::get_setup_priority() const { return setup_priority::DATA; }
66
+
71
67
  void SHTCXComponent::update() {
72
68
  if (this->status_has_warning()) {
73
- ESP_LOGW(TAG, "Retrying to reconnect the sensor.");
69
+ ESP_LOGW(TAG, "Retrying communication");
74
70
  this->soft_reset();
75
71
  }
76
72
  if (this->type_ != SHTCX_TYPE_SHTC1) {
77
73
  this->wake_up();
78
74
  }
79
75
  if (!this->write_command(SHTCX_COMMAND_POLLING_H)) {
80
- ESP_LOGE(TAG, "sensor polling failed");
76
+ ESP_LOGE(TAG, "Polling failed");
81
77
  if (this->temperature_sensor_ != nullptr)
82
78
  this->temperature_sensor_->publish_state(NAN);
83
79
  if (this->humidity_sensor_ != nullptr)
@@ -91,13 +87,13 @@ void SHTCXComponent::update() {
91
87
  float humidity = NAN;
92
88
  uint16_t raw_data[2];
93
89
  if (!this->read_data(raw_data, 2)) {
94
- ESP_LOGE(TAG, "sensor read failed");
90
+ ESP_LOGE(TAG, ESP_LOG_MSG_COMM_FAIL);
95
91
  this->status_set_warning();
96
92
  } else {
97
93
  temperature = 175.0f * float(raw_data[0]) / 65536.0f - 45.0f;
98
94
  humidity = 100.0f * float(raw_data[1]) / 65536.0f;
99
95
 
100
- ESP_LOGD(TAG, "Got temperature=%.2f°C humidity=%.2f%%", temperature, humidity);
96
+ ESP_LOGD(TAG, "Temperature=%.2f°C Humidity=%.2f%%", temperature, humidity);
101
97
  }
102
98
  if (this->temperature_sensor_ != nullptr)
103
99
  this->temperature_sensor_->publish_state(temperature);
@@ -114,6 +110,7 @@ void SHTCXComponent::soft_reset() {
114
110
  this->write_command(SHTCX_COMMAND_SOFT_RESET);
115
111
  delayMicroseconds(200);
116
112
  }
113
+
117
114
  void SHTCXComponent::sleep() { this->write_command(SHTCX_COMMAND_SLEEP); }
118
115
 
119
116
  void SHTCXComponent::wake_up() {
@@ -17,7 +17,7 @@ static const char *const TAG = "shutdown.button";
17
17
 
18
18
  void ShutdownButton::dump_config() { LOG_BUTTON("", "Shutdown Button", this); }
19
19
  void ShutdownButton::press_action() {
20
- ESP_LOGI(TAG, "Shutting down...");
20
+ ESP_LOGI(TAG, "Shutting down");
21
21
  // Let MQTT settle a bit
22
22
  delay(100); // NOLINT
23
23
  App.run_safe_shutdown_hooks();
@@ -21,7 +21,7 @@ void ShutdownSwitch::write_state(bool state) {
21
21
  this->publish_state(false);
22
22
 
23
23
  if (state) {
24
- ESP_LOGI(TAG, "Shutting down...");
24
+ ESP_LOGI(TAG, "Shutting down");
25
25
  delay(100); // NOLINT
26
26
 
27
27
  App.run_safe_shutdown_hooks();
@@ -28,7 +28,7 @@ void Sim800LComponent::update() {
28
28
  this->state_ = STATE_DIALING1;
29
29
  } else if (this->registered_ && this->connect_pending_) {
30
30
  this->connect_pending_ = false;
31
- ESP_LOGI(TAG, "Connecting...");
31
+ ESP_LOGI(TAG, "Connecting");
32
32
  this->send_cmd_("ATA");
33
33
  this->state_ = STATE_ATA_SENT;
34
34
  } else if (this->registered_ && this->send_ussd_pending_) {
@@ -36,7 +36,7 @@ void Sim800LComponent::update() {
36
36
  this->state_ = STATE_SEND_USSD1;
37
37
  } else if (this->registered_ && this->disconnect_pending_) {
38
38
  this->disconnect_pending_ = false;
39
- ESP_LOGI(TAG, "Disconnecting...");
39
+ ESP_LOGI(TAG, "Disconnecting");
40
40
  this->send_cmd_("ATH");
41
41
  } else if (this->registered_ && this->call_state_ != 6) {
42
42
  send_cmd_("AT+CLCC");
@@ -63,8 +63,10 @@ void SlowPWMOutput::dump_config() {
63
63
  if (this->turn_off_trigger_) {
64
64
  ESP_LOGCONFIG(TAG, " Turn off automation configured");
65
65
  }
66
- ESP_LOGCONFIG(TAG, " Period: %d ms", this->period_);
67
- ESP_LOGCONFIG(TAG, " Restart cycle on state change: %s", YESNO(this->restart_cycle_on_state_change_));
66
+ ESP_LOGCONFIG(TAG,
67
+ " Period: %d ms\n"
68
+ " Restart cycle on state change: %s",
69
+ this->period_, YESNO(this->restart_cycle_on_state_change_));
68
70
  LOG_FLOAT_OUTPUT(this);
69
71
  }
70
72
 
@@ -7,7 +7,7 @@ namespace sm16716 {
7
7
  static const char *const TAG = "sm16716";
8
8
 
9
9
  void SM16716::setup() {
10
- ESP_LOGCONFIG(TAG, "Setting up SM16716OutputComponent...");
10
+ ESP_LOGCONFIG(TAG, "Running setup");
11
11
  this->data_pin_->setup();
12
12
  this->data_pin_->digital_write(false);
13
13
  this->clock_pin_->setup();
@@ -20,7 +20,7 @@ static const uint8_t SM2135_RGB = 0x00; // RGB channel
20
20
  static const uint8_t SM2135_CW = 0x80; // CW channel (Chip default)
21
21
 
22
22
  void SM2135::setup() {
23
- ESP_LOGCONFIG(TAG, "Setting up SM2135OutputComponent...");
23
+ ESP_LOGCONFIG(TAG, "Running setup");
24
24
  this->data_pin_->setup();
25
25
  this->data_pin_->digital_write(false);
26
26
  this->data_pin_->pin_mode(gpio::FLAG_OUTPUT);
@@ -7,7 +7,7 @@ namespace sm2235 {
7
7
  static const char *const TAG = "sm2235";
8
8
 
9
9
  void SM2235::setup() {
10
- ESP_LOGCONFIG(TAG, "Setting up sm2235 Output Component...");
10
+ ESP_LOGCONFIG(TAG, "Running setup");
11
11
  this->data_pin_->setup();
12
12
  this->data_pin_->digital_write(true);
13
13
  this->clock_pin_->setup();
@@ -19,8 +19,10 @@ void SM2235::dump_config() {
19
19
  ESP_LOGCONFIG(TAG, "sm2235:");
20
20
  LOG_PIN(" Data Pin: ", this->data_pin_);
21
21
  LOG_PIN(" Clock Pin: ", this->clock_pin_);
22
- ESP_LOGCONFIG(TAG, " Color Channels Max Power: %u", this->max_power_color_channels_);
23
- ESP_LOGCONFIG(TAG, " White Channels Max Power: %u", this->max_power_white_channels_);
22
+ ESP_LOGCONFIG(TAG,
23
+ " Color Channels Max Power: %u\n"
24
+ " White Channels Max Power: %u",
25
+ this->max_power_color_channels_, this->max_power_white_channels_);
24
26
  }
25
27
 
26
28
  } // namespace sm2235
@@ -7,7 +7,7 @@ namespace sm2335 {
7
7
  static const char *const TAG = "sm2335";
8
8
 
9
9
  void SM2335::setup() {
10
- ESP_LOGCONFIG(TAG, "Setting up sm2335 Output Component...");
10
+ ESP_LOGCONFIG(TAG, "Running setup");
11
11
  this->data_pin_->setup();
12
12
  this->data_pin_->digital_write(true);
13
13
  this->clock_pin_->setup();
@@ -19,8 +19,10 @@ void SM2335::dump_config() {
19
19
  ESP_LOGCONFIG(TAG, "sm2335:");
20
20
  LOG_PIN(" Data Pin: ", this->data_pin_);
21
21
  LOG_PIN(" Clock Pin: ", this->clock_pin_);
22
- ESP_LOGCONFIG(TAG, " Color Channels Max Power: %u", this->max_power_color_channels_);
23
- ESP_LOGCONFIG(TAG, " White Channels Max Power: %u", this->max_power_white_channels_);
22
+ ESP_LOGCONFIG(TAG,
23
+ " Color Channels Max Power: %u\n"
24
+ " White Channels Max Power: %u",
25
+ this->max_power_color_channels_, this->max_power_white_channels_);
24
26
  }
25
27
 
26
28
  } // namespace sm2335
@@ -1,6 +1,6 @@
1
1
  #include "sml.h"
2
- #include "esphome/core/log.h"
3
2
  #include "esphome/core/helpers.h"
3
+ #include "esphome/core/log.h"
4
4
  #include "sml_parser.h"
5
5
 
6
6
  namespace esphome {
@@ -7,8 +7,7 @@ namespace sn74hc165 {
7
7
  static const char *const TAG = "sn74hc165";
8
8
 
9
9
  void SN74HC165Component::setup() {
10
- ESP_LOGCONFIG(TAG, "Setting up SN74HC165...");
11
-
10
+ ESP_LOGCONFIG(TAG, "Running setup");
12
11
  // initialize pins
13
12
  this->clock_pin_->setup();
14
13
  this->data_pin_->setup();
@@ -7,8 +7,7 @@ namespace sn74hc595 {
7
7
  static const char *const TAG = "sn74hc595";
8
8
 
9
9
  void SN74HC595Component::pre_setup_() {
10
- ESP_LOGCONFIG(TAG, "Setting up SN74HC595...");
11
-
10
+ ESP_LOGCONFIG(TAG, "Running setup");
12
11
  if (this->have_oe_pin_) { // disable output
13
12
  this->oe_pin_->setup();
14
13
  this->oe_pin_->digital_write(true);
@@ -15,7 +15,7 @@ namespace sntp {
15
15
  static const char *const TAG = "sntp";
16
16
 
17
17
  void SNTPComponent::setup() {
18
- ESP_LOGCONFIG(TAG, "Setting up SNTP...");
18
+ ESP_LOGCONFIG(TAG, "Running setup");
19
19
  #if defined(USE_ESP_IDF)
20
20
  if (esp_sntp_enabled()) {
21
21
  esp_sntp_stop();
@@ -35,5 +35,7 @@ async def to_code(config):
35
35
  cg.add_define("USE_SOCKET_IMPL_LWIP_TCP")
36
36
  elif impl == IMPLEMENTATION_LWIP_SOCKETS:
37
37
  cg.add_define("USE_SOCKET_IMPL_LWIP_SOCKETS")
38
+ cg.add_define("USE_SOCKET_SELECT_SUPPORT")
38
39
  elif impl == IMPLEMENTATION_BSD_SOCKETS:
39
40
  cg.add_define("USE_SOCKET_IMPL_BSD_SOCKETS")
41
+ cg.add_define("USE_SOCKET_SELECT_SUPPORT")
@@ -5,6 +5,7 @@
5
5
  #ifdef USE_SOCKET_IMPL_BSD_SOCKETS
6
6
 
7
7
  #include <cstring>
8
+ #include "esphome/core/application.h"
8
9
 
9
10
  #ifdef USE_ESP32
10
11
  #include <esp_idf_version.h>
@@ -40,7 +41,20 @@ std::string format_sockaddr(const struct sockaddr_storage &storage) {
40
41
 
41
42
  class BSDSocketImpl : public Socket {
42
43
  public:
43
- BSDSocketImpl(int fd) : fd_(fd) {}
44
+ BSDSocketImpl(int fd, bool monitor_loop = false) : fd_(fd) {
45
+ #ifdef USE_SOCKET_SELECT_SUPPORT
46
+ // Register new socket with the application for select() if monitoring requested
47
+ if (monitor_loop && fd_ >= 0) {
48
+ // Only set loop_monitored_ to true if registration succeeds
49
+ loop_monitored_ = App.register_socket_fd(fd_);
50
+ } else {
51
+ loop_monitored_ = false;
52
+ }
53
+ #else
54
+ // Without select support, ignore monitor_loop parameter
55
+ (void) monitor_loop;
56
+ #endif
57
+ }
44
58
  ~BSDSocketImpl() override {
45
59
  if (!closed_) {
46
60
  close(); // NOLINT(clang-analyzer-optin.cplusplus.VirtualCall)
@@ -48,16 +62,35 @@ class BSDSocketImpl : public Socket {
48
62
  }
49
63
  int connect(const struct sockaddr *addr, socklen_t addrlen) override { return ::connect(fd_, addr, addrlen); }
50
64
  std::unique_ptr<Socket> accept(struct sockaddr *addr, socklen_t *addrlen) override {
65
+ return accept_impl_(addr, addrlen, false);
66
+ }
67
+ std::unique_ptr<Socket> accept_loop_monitored(struct sockaddr *addr, socklen_t *addrlen) override {
68
+ return accept_impl_(addr, addrlen, true);
69
+ }
70
+
71
+ private:
72
+ std::unique_ptr<Socket> accept_impl_(struct sockaddr *addr, socklen_t *addrlen, bool loop_monitored) {
51
73
  int fd = ::accept(fd_, addr, addrlen);
52
74
  if (fd == -1)
53
75
  return {};
54
- return make_unique<BSDSocketImpl>(fd);
76
+ return make_unique<BSDSocketImpl>(fd, loop_monitored);
55
77
  }
78
+
79
+ public:
56
80
  int bind(const struct sockaddr *addr, socklen_t addrlen) override { return ::bind(fd_, addr, addrlen); }
57
81
  int close() override {
58
- int ret = ::close(fd_);
59
- closed_ = true;
60
- return ret;
82
+ if (!closed_) {
83
+ #ifdef USE_SOCKET_SELECT_SUPPORT
84
+ // Unregister from select() before closing if monitored
85
+ if (loop_monitored_) {
86
+ App.unregister_socket_fd(fd_);
87
+ }
88
+ #endif
89
+ int ret = ::close(fd_);
90
+ closed_ = true;
91
+ return ret;
92
+ }
93
+ return 0;
61
94
  }
62
95
  int shutdown(int how) override { return ::shutdown(fd_, how); }
63
96
 
@@ -126,16 +159,27 @@ class BSDSocketImpl : public Socket {
126
159
  return 0;
127
160
  }
128
161
 
162
+ int get_fd() const override { return fd_; }
163
+
129
164
  protected:
130
165
  int fd_;
131
166
  bool closed_ = false;
132
167
  };
133
168
 
134
- std::unique_ptr<Socket> socket(int domain, int type, int protocol) {
169
+ // Helper to create a socket with optional monitoring
170
+ static std::unique_ptr<Socket> create_socket(int domain, int type, int protocol, bool loop_monitored = false) {
135
171
  int ret = ::socket(domain, type, protocol);
136
172
  if (ret == -1)
137
173
  return nullptr;
138
- return std::unique_ptr<Socket>{new BSDSocketImpl(ret)};
174
+ return std::unique_ptr<Socket>{new BSDSocketImpl(ret, loop_monitored)};
175
+ }
176
+
177
+ std::unique_ptr<Socket> socket(int domain, int type, int protocol) {
178
+ return create_socket(domain, type, protocol, false);
179
+ }
180
+
181
+ std::unique_ptr<Socket> socket_loop_monitored(int domain, int type, int protocol) {
182
+ return create_socket(domain, type, protocol, true);
139
183
  }
140
184
 
141
185
  } // namespace socket
@@ -606,6 +606,11 @@ std::unique_ptr<Socket> socket(int domain, int type, int protocol) {
606
606
  return std::unique_ptr<Socket>{sock};
607
607
  }
608
608
 
609
+ std::unique_ptr<Socket> socket_loop_monitored(int domain, int type, int protocol) {
610
+ // LWIPRawImpl doesn't use file descriptors, so monitoring is not applicable
611
+ return socket(domain, type, protocol);
612
+ }
613
+
609
614
  } // namespace socket
610
615
  } // namespace esphome
611
616
 
@@ -5,6 +5,7 @@
5
5
  #ifdef USE_SOCKET_IMPL_LWIP_SOCKETS
6
6
 
7
7
  #include <cstring>
8
+ #include "esphome/core/application.h"
8
9
 
9
10
  namespace esphome {
10
11
  namespace socket {
@@ -33,7 +34,20 @@ std::string format_sockaddr(const struct sockaddr_storage &storage) {
33
34
 
34
35
  class LwIPSocketImpl : public Socket {
35
36
  public:
36
- LwIPSocketImpl(int fd) : fd_(fd) {}
37
+ LwIPSocketImpl(int fd, bool monitor_loop = false) : fd_(fd) {
38
+ #ifdef USE_SOCKET_SELECT_SUPPORT
39
+ // Register new socket with the application for select() if monitoring requested
40
+ if (monitor_loop && fd_ >= 0) {
41
+ // Only set loop_monitored_ to true if registration succeeds
42
+ loop_monitored_ = App.register_socket_fd(fd_);
43
+ } else {
44
+ loop_monitored_ = false;
45
+ }
46
+ #else
47
+ // Without select support, ignore monitor_loop parameter
48
+ (void) monitor_loop;
49
+ #endif
50
+ }
37
51
  ~LwIPSocketImpl() override {
38
52
  if (!closed_) {
39
53
  close(); // NOLINT(clang-analyzer-optin.cplusplus.VirtualCall)
@@ -41,16 +55,35 @@ class LwIPSocketImpl : public Socket {
41
55
  }
42
56
  int connect(const struct sockaddr *addr, socklen_t addrlen) override { return lwip_connect(fd_, addr, addrlen); }
43
57
  std::unique_ptr<Socket> accept(struct sockaddr *addr, socklen_t *addrlen) override {
58
+ return accept_impl_(addr, addrlen, false);
59
+ }
60
+ std::unique_ptr<Socket> accept_loop_monitored(struct sockaddr *addr, socklen_t *addrlen) override {
61
+ return accept_impl_(addr, addrlen, true);
62
+ }
63
+
64
+ private:
65
+ std::unique_ptr<Socket> accept_impl_(struct sockaddr *addr, socklen_t *addrlen, bool loop_monitored) {
44
66
  int fd = lwip_accept(fd_, addr, addrlen);
45
67
  if (fd == -1)
46
68
  return {};
47
- return make_unique<LwIPSocketImpl>(fd);
69
+ return make_unique<LwIPSocketImpl>(fd, loop_monitored);
48
70
  }
71
+
72
+ public:
49
73
  int bind(const struct sockaddr *addr, socklen_t addrlen) override { return lwip_bind(fd_, addr, addrlen); }
50
74
  int close() override {
51
- int ret = lwip_close(fd_);
52
- closed_ = true;
53
- return ret;
75
+ if (!closed_) {
76
+ #ifdef USE_SOCKET_SELECT_SUPPORT
77
+ // Unregister from select() before closing if monitored
78
+ if (loop_monitored_) {
79
+ App.unregister_socket_fd(fd_);
80
+ }
81
+ #endif
82
+ int ret = lwip_close(fd_);
83
+ closed_ = true;
84
+ return ret;
85
+ }
86
+ return 0;
54
87
  }
55
88
  int shutdown(int how) override { return lwip_shutdown(fd_, how); }
56
89
 
@@ -98,16 +131,27 @@ class LwIPSocketImpl : public Socket {
98
131
  return 0;
99
132
  }
100
133
 
134
+ int get_fd() const override { return fd_; }
135
+
101
136
  protected:
102
137
  int fd_;
103
138
  bool closed_ = false;
104
139
  };
105
140
 
106
- std::unique_ptr<Socket> socket(int domain, int type, int protocol) {
141
+ // Helper to create a socket with optional monitoring
142
+ static std::unique_ptr<Socket> create_socket(int domain, int type, int protocol, bool loop_monitored = false) {
107
143
  int ret = lwip_socket(domain, type, protocol);
108
144
  if (ret == -1)
109
145
  return nullptr;
110
- return std::unique_ptr<Socket>{new LwIPSocketImpl(ret)};
146
+ return std::unique_ptr<Socket>{new LwIPSocketImpl(ret, loop_monitored)};
147
+ }
148
+
149
+ std::unique_ptr<Socket> socket(int domain, int type, int protocol) {
150
+ return create_socket(domain, type, protocol, false);
151
+ }
152
+
153
+ std::unique_ptr<Socket> socket_loop_monitored(int domain, int type, int protocol) {
154
+ return create_socket(domain, type, protocol, true);
111
155
  }
112
156
 
113
157
  } // namespace socket
@@ -4,12 +4,35 @@
4
4
  #include <cstring>
5
5
  #include <string>
6
6
  #include "esphome/core/log.h"
7
+ #include "esphome/core/application.h"
7
8
 
8
9
  namespace esphome {
9
10
  namespace socket {
10
11
 
11
12
  Socket::~Socket() {}
12
13
 
14
+ bool Socket::ready() const {
15
+ #ifdef USE_SOCKET_SELECT_SUPPORT
16
+ if (!loop_monitored_) {
17
+ // Non-monitored sockets always return true (assume data may be available)
18
+ return true;
19
+ }
20
+
21
+ // For loop-monitored sockets, check with the Application's select() results
22
+ int fd = this->get_fd();
23
+ if (fd < 0) {
24
+ // No valid file descriptor, assume ready (fallback behavior)
25
+ return true;
26
+ }
27
+
28
+ return App.is_socket_ready(fd);
29
+ #else
30
+ // Without select() support, we can't monitor sockets in the loop
31
+ // Always return true (assume data may be available)
32
+ return true;
33
+ #endif
34
+ }
35
+
13
36
  std::unique_ptr<Socket> socket_ip(int type, int protocol) {
14
37
  #if USE_NETWORK_IPV6
15
38
  return socket(AF_INET6, type, protocol);
@@ -18,6 +41,14 @@ std::unique_ptr<Socket> socket_ip(int type, int protocol) {
18
41
  #endif /* USE_NETWORK_IPV6 */
19
42
  }
20
43
 
44
+ std::unique_ptr<Socket> socket_ip_loop_monitored(int type, int protocol) {
45
+ #if USE_NETWORK_IPV6
46
+ return socket_loop_monitored(AF_INET6, type, protocol);
47
+ #else
48
+ return socket_loop_monitored(AF_INET, type, protocol);
49
+ #endif /* USE_NETWORK_IPV6 */
50
+ }
51
+
21
52
  socklen_t set_sockaddr(struct sockaddr *addr, socklen_t addrlen, const std::string &ip_address, uint16_t port) {
22
53
  #if USE_NETWORK_IPV6
23
54
  if (ip_address.find(':') != std::string::npos) {
@@ -17,6 +17,11 @@ class Socket {
17
17
  Socket &operator=(const Socket &) = delete;
18
18
 
19
19
  virtual std::unique_ptr<Socket> accept(struct sockaddr *addr, socklen_t *addrlen) = 0;
20
+ /// Accept a connection and monitor it in the main loop
21
+ /// NOTE: This function is NOT thread-safe and must only be called from the main loop
22
+ virtual std::unique_ptr<Socket> accept_loop_monitored(struct sockaddr *addr, socklen_t *addrlen) {
23
+ return accept(addr, addrlen); // Default implementation for backward compatibility
24
+ }
20
25
  virtual int bind(const struct sockaddr *addr, socklen_t addrlen) = 0;
21
26
  virtual int close() = 0;
22
27
  // not supported yet:
@@ -44,14 +49,35 @@ class Socket {
44
49
 
45
50
  virtual int setblocking(bool blocking) = 0;
46
51
  virtual int loop() { return 0; };
52
+
53
+ /// Get the underlying file descriptor (returns -1 if not supported)
54
+ virtual int get_fd() const { return -1; }
55
+
56
+ /// Check if socket has data ready to read
57
+ /// For loop-monitored sockets, checks with the Application's select() results
58
+ /// For non-monitored sockets, always returns true (assumes data may be available)
59
+ bool ready() const;
60
+
61
+ protected:
62
+ #ifdef USE_SOCKET_SELECT_SUPPORT
63
+ bool loop_monitored_{false}; ///< Whether this socket is monitored by the event loop
64
+ #endif
47
65
  };
48
66
 
49
67
  /// Create a socket of the given domain, type and protocol.
50
68
  std::unique_ptr<Socket> socket(int domain, int type, int protocol);
51
-
52
69
  /// Create a socket in the newest available IP domain (IPv6 or IPv4) of the given type and protocol.
53
70
  std::unique_ptr<Socket> socket_ip(int type, int protocol);
54
71
 
72
+ /// Create a socket and monitor it for data in the main loop.
73
+ /// Like socket() but also registers the socket with the Application's select() loop.
74
+ /// WARNING: These functions are NOT thread-safe. They must only be called from the main loop
75
+ /// as they register the socket file descriptor with the global Application instance.
76
+ /// NOTE: On ESP platforms, FD_SETSIZE is typically 10, limiting the number of monitored sockets.
77
+ /// File descriptors >= FD_SETSIZE will not be monitored and will log an error.
78
+ std::unique_ptr<Socket> socket_loop_monitored(int domain, int type, int protocol);
79
+ std::unique_ptr<Socket> socket_ip_loop_monitored(int type, int protocol);
80
+
55
81
  /// Set a sockaddr to the specified address and port for the IP version used by socket_ip().
56
82
  socklen_t set_sockaddr(struct sockaddr *addr, socklen_t addrlen, const std::string &ip_address, uint16_t port);
57
83
 
@@ -286,10 +286,13 @@ void SonoffD1Output::write_state(light::LightState *state) {
286
286
  }
287
287
 
288
288
  void SonoffD1Output::dump_config() {
289
- ESP_LOGCONFIG(TAG, "Sonoff D1 Dimmer: '%s'", this->light_state_ ? this->light_state_->get_name().c_str() : "");
290
- ESP_LOGCONFIG(TAG, " Use RM433 Remote: %s", ONOFF(this->use_rm433_remote_));
291
- ESP_LOGCONFIG(TAG, " Minimal brightness: %d", this->min_value_);
292
- ESP_LOGCONFIG(TAG, " Maximal brightness: %d", this->max_value_);
289
+ ESP_LOGCONFIG(TAG,
290
+ "Sonoff D1 Dimmer: '%s'\n"
291
+ " Use RM433 Remote: %s\n"
292
+ " Minimal brightness: %d\n"
293
+ " Maximal brightness: %d",
294
+ this->light_state_ ? this->light_state_->get_name().c_str() : "", ONOFF(this->use_rm433_remote_),
295
+ this->min_value_, this->max_value_);
293
296
  }
294
297
 
295
298
  void SonoffD1Output::loop() {
@@ -31,9 +31,9 @@
31
31
  -----
32
32
  */
33
33
 
34
- #include "esphome/core/log.h"
35
- #include "esphome/core/helpers.h"
36
34
  #include "esphome/core/component.h"
35
+ #include "esphome/core/helpers.h"
36
+ #include "esphome/core/log.h"
37
37
  #include "esphome/components/uart/uart.h"
38
38
  #include "esphome/components/light/light_output.h"
39
39
  #include "esphome/components/light/light_state.h"
@@ -19,8 +19,10 @@ static const uint32_t RING_BUFFER_DURATION_MS = 120;
19
19
  static const double MAX_SAMPLE_SQUARED_DENOMINATOR = INT16_MIN * INT16_MIN;
20
20
 
21
21
  void SoundLevelComponent::dump_config() {
22
- ESP_LOGCONFIG(TAG, "Sound Level Component:");
23
- ESP_LOGCONFIG(TAG, " Measurement Duration: %" PRIu32 " ms", measurement_duration_ms_);
22
+ ESP_LOGCONFIG(TAG,
23
+ "Sound Level Component:\n"
24
+ " Measurement Duration: %" PRIu32 " ms",
25
+ measurement_duration_ms_);
24
26
  LOG_SENSOR(" ", "Peak:", this->peak_sensor_);
25
27
 
26
28
  LOG_SENSOR(" ", "RMS:", this->rms_sensor_);
@@ -48,6 +48,7 @@ CONF_ON_UNMUTE = "on_unmute"
48
48
  CONF_ON_VOLUME = "on_volume"
49
49
  CONF_STREAM = "stream"
50
50
  CONF_VOLUME_INCREMENT = "volume_increment"
51
+ CONF_VOLUME_INITIAL = "volume_initial"
51
52
  CONF_VOLUME_MIN = "volume_min"
52
53
  CONF_VOLUME_MAX = "volume_max"
53
54
 
@@ -282,6 +283,7 @@ CONFIG_SCHEMA = cv.All(
282
283
  cv.Optional(CONF_FILES): cv.ensure_list(MEDIA_FILE_TYPE_SCHEMA),
283
284
  cv.Optional(CONF_TASK_STACK_IN_PSRAM, default=False): cv.boolean,
284
285
  cv.Optional(CONF_VOLUME_INCREMENT, default=0.05): cv.percentage,
286
+ cv.Optional(CONF_VOLUME_INITIAL, default=0.5): cv.percentage,
285
287
  cv.Optional(CONF_VOLUME_MAX, default=1.0): cv.percentage,
286
288
  cv.Optional(CONF_VOLUME_MIN, default=0.0): cv.percentage,
287
289
  cv.Optional(CONF_ON_MUTE): automation.validate_automation(single=True),
@@ -356,6 +358,7 @@ async def to_code(config):
356
358
  )
357
359
 
358
360
  cg.add(var.set_volume_increment(config[CONF_VOLUME_INCREMENT]))
361
+ cg.add(var.set_volume_initial(config[CONF_VOLUME_INITIAL]))
359
362
  cg.add(var.set_volume_max(config[CONF_VOLUME_MAX]))
360
363
  cg.add(var.set_volume_min(config[CONF_VOLUME_MIN]))
361
364
 
@@ -48,8 +48,6 @@ static const uint32_t MEDIA_CONTROLS_QUEUE_LENGTH = 20;
48
48
  static const UBaseType_t MEDIA_PIPELINE_TASK_PRIORITY = 1;
49
49
  static const UBaseType_t ANNOUNCEMENT_PIPELINE_TASK_PRIORITY = 1;
50
50
 
51
- static const float FIRST_BOOT_DEFAULT_VOLUME = 0.5f;
52
-
53
51
  static const char *const TAG = "speaker_media_player";
54
52
 
55
53
  void SpeakerMediaPlayer::setup() {
@@ -64,7 +62,7 @@ void SpeakerMediaPlayer::setup() {
64
62
  this->set_volume_(volume_restore_state.volume);
65
63
  this->set_mute_state_(volume_restore_state.is_muted);
66
64
  } else {
67
- this->set_volume_(FIRST_BOOT_DEFAULT_VOLUME);
65
+ this->set_volume_(this->volume_initial_);
68
66
  this->set_mute_state_(false);
69
67
  }
70
68