esphome 2025.5.1__py3-none-any.whl → 2025.6.0__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 (753) 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 +753 -379
  29. esphome/components/api/api_connection.h +341 -283
  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 +5 -0
  33. esphome/components/api/api_pb2.h +703 -227
  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 -4
  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 +5 -4
  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 +18 -16
  67. esphome/components/bluetooth_proxy/bluetooth_proxy.h +1 -1
  68. esphome/components/bme280_base/bme280_base.cpp +5 -6
  69. esphome/components/bme680/bme680.cpp +3 -3
  70. esphome/components/bme680/sensor.py +2 -2
  71. esphome/components/bme680_bsec/bme680_bsec.cpp +11 -7
  72. esphome/components/bme680_bsec/sensor.py +7 -3
  73. esphome/components/bme68x_bsec2/__init__.py +6 -5
  74. esphome/components/bme68x_bsec2/bme68x_bsec2.cpp +17 -13
  75. esphome/components/bme68x_bsec2/sensor.py +4 -4
  76. esphome/components/bme68x_bsec2_i2c/bme68x_bsec2_i2c.cpp +1 -0
  77. esphome/components/bmi160/bmi160.cpp +11 -11
  78. esphome/components/bmp085/bmp085.cpp +2 -2
  79. esphome/components/bmp280_base/bmp280_base.cpp +3 -3
  80. esphome/components/bmp3xx_base/bmp3xx_base.cpp +13 -13
  81. esphome/components/bmp581/bmp581.cpp +33 -27
  82. esphome/components/bp1658cj/bp1658cj.cpp +5 -3
  83. esphome/components/bp5758d/bp5758d.cpp +1 -1
  84. esphome/components/button/__init__.py +1 -0
  85. esphome/components/canbus/canbus.cpp +1 -1
  86. esphome/components/cap1188/cap1188.cpp +6 -4
  87. esphome/components/captive_portal/captive_portal.cpp +1 -1
  88. esphome/components/ccs811/ccs811.cpp +3 -2
  89. esphome/components/cd74hc4067/cd74hc4067.cpp +1 -1
  90. esphome/components/ch422g/ch422g.cpp +2 -2
  91. esphome/components/chsc6x/chsc6x_touchscreen.cpp +6 -4
  92. esphome/components/climate/__init__.py +1 -0
  93. esphome/components/climate/climate.cpp +12 -7
  94. esphome/components/climate/climate.h +1 -1
  95. esphome/components/climate_ir/climate_ir.cpp +7 -4
  96. esphome/components/cm1106/__init__.py +1 -0
  97. esphome/components/cm1106/cm1106.cpp +112 -0
  98. esphome/components/cm1106/cm1106.h +40 -0
  99. esphome/components/cm1106/sensor.py +72 -0
  100. esphome/components/const/__init__.py +1 -0
  101. esphome/components/cover/__init__.py +1 -0
  102. esphome/components/cs5460a/cs5460a.cpp +16 -11
  103. esphome/components/cse7761/cse7761.cpp +2 -2
  104. esphome/components/cse7766/cse7766.cpp +0 -5
  105. esphome/components/cse7766/cse7766.h +5 -1
  106. esphome/components/cst226/touchscreen/cst226_touchscreen.cpp +1 -1
  107. esphome/components/cst816/touchscreen/cst816_touchscreen.cpp +6 -3
  108. esphome/components/current_based/current_based_cover.cpp +4 -2
  109. esphome/components/dac7678/dac7678_output.cpp +4 -4
  110. esphome/components/dallas_temp/dallas_temp.cpp +2 -3
  111. esphome/components/daly_bms/daly_bms.cpp +2 -1
  112. esphome/components/dashboard_import/__init__.py +1 -2
  113. esphome/components/datetime/__init__.py +3 -1
  114. esphome/components/datetime/date_entity.cpp +5 -5
  115. esphome/components/datetime/datetime_base.h +0 -5
  116. esphome/components/datetime/datetime_entity.cpp +8 -8
  117. esphome/components/datetime/time_entity.cpp +4 -4
  118. esphome/components/debug/debug_component.cpp +1 -5
  119. esphome/components/debug/debug_component.h +1 -1
  120. esphome/components/debug/debug_esp32.cpp +4 -2
  121. esphome/components/deep_sleep/deep_sleep_component.cpp +11 -5
  122. esphome/components/deep_sleep/deep_sleep_esp32.cpp +7 -5
  123. esphome/components/demo/__init__.py +206 -0
  124. esphome/components/demo/demo_alarm_control_panel.h +65 -0
  125. esphome/components/demo/demo_button.h +15 -0
  126. esphome/components/demo/demo_date.h +34 -0
  127. esphome/components/demo/demo_datetime.h +40 -0
  128. esphome/components/demo/demo_lock.h +17 -0
  129. esphome/components/demo/demo_select.h +15 -0
  130. esphome/components/demo/demo_text.h +18 -0
  131. esphome/components/demo/demo_time.h +34 -0
  132. esphome/components/demo/demo_valve.h +54 -0
  133. esphome/components/dfrobot_sen0395/commands.cpp +3 -3
  134. esphome/components/dht/dht.cpp +29 -50
  135. esphome/components/dht12/dht12.cpp +2 -2
  136. esphome/components/display/display.h +5 -3
  137. esphome/components/dps310/dps310.cpp +7 -5
  138. esphome/components/ds1307/ds1307.cpp +2 -2
  139. esphome/components/dsmr/dsmr.cpp +5 -3
  140. esphome/components/duty_cycle/duty_cycle_sensor.cpp +2 -2
  141. esphome/components/duty_time/duty_time_sensor.cpp +5 -3
  142. esphome/components/ee895/ee895.cpp +3 -3
  143. esphome/components/ektf2232/touchscreen/ektf2232.cpp +1 -1
  144. esphome/components/emc2101/emc2101.cpp +11 -9
  145. esphome/components/ens160_base/ens160_base.cpp +2 -2
  146. esphome/components/ens210/ens210.cpp +2 -2
  147. esphome/components/es7210/es7210.cpp +6 -4
  148. esphome/components/es7243e/es7243e.cpp +1 -1
  149. esphome/components/es8156/es8156.cpp +1 -1
  150. esphome/components/es8311/es8311.cpp +8 -6
  151. esphome/components/es8388/__init__.py +0 -0
  152. esphome/components/es8388/audio_dac.py +26 -0
  153. esphome/components/es8388/es8388.cpp +289 -0
  154. esphome/components/es8388/es8388.h +81 -0
  155. esphome/components/es8388/es8388_const.h +83 -0
  156. esphome/components/es8388/select/__init__.py +47 -0
  157. esphome/components/es8388/select/adc_input_mic_select.cpp +12 -0
  158. esphome/components/es8388/select/adc_input_mic_select.h +15 -0
  159. esphome/components/es8388/select/dac_output_select.cpp +12 -0
  160. esphome/components/es8388/select/dac_output_select.h +15 -0
  161. esphome/components/esp32/__init__.py +118 -23
  162. esphome/components/esp32/boards.py +208 -125
  163. esphome/components/esp32/const.py +6 -0
  164. esphome/components/esp32/gpio.py +14 -1
  165. esphome/components/esp32/gpio_esp32_c5.py +45 -0
  166. esphome/components/esp32/gpio_esp32_p4.py +43 -0
  167. esphome/components/esp32/preferences.cpp +7 -7
  168. esphome/components/esp32_ble/__init__.py +115 -0
  169. esphome/components/esp32_ble/ble.cpp +101 -54
  170. esphome/components/esp32_ble/ble.h +24 -5
  171. esphome/components/esp32_ble/ble_event.h +172 -32
  172. esphome/components/esp32_ble/ble_scan_result.h +24 -0
  173. esphome/components/esp32_ble/ble_uuid.h +1 -1
  174. esphome/components/esp32_ble/queue.h +53 -27
  175. esphome/components/esp32_ble_client/ble_client_base.cpp +4 -2
  176. esphome/components/esp32_ble_server/__init__.py +4 -1
  177. esphome/components/esp32_ble_server/ble_characteristic.cpp +1 -0
  178. esphome/components/esp32_ble_server/ble_server.h +0 -1
  179. esphome/components/esp32_ble_tracker/__init__.py +7 -2
  180. esphome/components/esp32_ble_tracker/esp32_ble_tracker.cpp +107 -75
  181. esphome/components/esp32_ble_tracker/esp32_ble_tracker.h +16 -16
  182. esphome/components/esp32_camera/esp32_camera.cpp +35 -27
  183. esphome/components/esp32_camera_web_server/camera_web_server.cpp +4 -2
  184. esphome/components/esp32_dac/esp32_dac.cpp +2 -2
  185. esphome/components/esp32_improv/__init__.py +5 -1
  186. esphome/components/esp32_improv/esp32_improv_component.cpp +2 -2
  187. esphome/components/esp32_rmt_led_strip/led_strip.cpp +11 -7
  188. esphome/components/esp32_rmt_led_strip/light.py +5 -1
  189. esphome/components/esp32_touch/esp32_touch.cpp +12 -8
  190. esphome/components/esp8266/gpio.cpp +10 -1
  191. esphome/components/esp8266/preferences.cpp +6 -6
  192. esphome/components/esp8266_pwm/esp8266_pwm.cpp +3 -3
  193. esphome/components/esp_ldo/__init__.py +91 -0
  194. esphome/components/esp_ldo/esp_ldo.cpp +43 -0
  195. esphome/components/esp_ldo/esp_ldo.h +43 -0
  196. esphome/components/esphome/ota/ota_esphome.cpp +15 -8
  197. esphome/components/ethernet/ethernet_component.cpp +38 -26
  198. esphome/components/ethernet/ethernet_component.h +1 -1
  199. esphome/components/event/__init__.py +1 -0
  200. esphome/components/exposure_notifications/exposure_notifications.cpp +1 -1
  201. esphome/components/ezo/ezo.cpp +1 -1
  202. esphome/components/ezo_pmp/ezo_pmp.cpp +1 -1
  203. esphome/components/factory_reset/button/factory_reset_button.cpp +1 -1
  204. esphome/components/factory_reset/switch/factory_reset_switch.cpp +1 -1
  205. esphome/components/fan/__init__.py +1 -0
  206. esphome/components/fan/fan.cpp +30 -19
  207. esphome/components/fastled_base/fastled_light.cpp +7 -5
  208. esphome/components/fingerprint_grow/fingerprint_grow.cpp +8 -6
  209. esphome/components/fs3000/fs3000.cpp +1 -1
  210. esphome/components/ft5x06/touchscreen/ft5x06_touchscreen.cpp +7 -4
  211. esphome/components/ft63x6/ft63x6.cpp +5 -3
  212. esphome/components/gcja5/gcja5.cpp +0 -12
  213. esphome/components/gcja5/gcja5.h +8 -3
  214. esphome/components/gdk101/gdk101.cpp +2 -2
  215. esphome/components/globals/globals_component.h +13 -10
  216. esphome/components/gp2y1010au0f/gp2y1010au0f.cpp +4 -2
  217. esphome/components/gp8403/gp8403.cpp +4 -2
  218. esphome/components/gp8403/output/gp8403_output.cpp +4 -2
  219. esphome/components/gpio/one_wire/gpio_one_wire.cpp +2 -2
  220. esphome/components/gpio/output/gpio_binary_output.cpp +1 -1
  221. esphome/components/gpio/switch/gpio_switch.cpp +1 -1
  222. esphome/components/graphical_display_menu/graphical_display_menu.cpp +12 -8
  223. esphome/components/grove_gas_mc_v2/grove_gas_mc_v2.cpp +5 -6
  224. esphome/components/grove_tb6612fng/grove_tb6612fng.cpp +1 -1
  225. esphome/components/grove_tb6612fng/grove_tb6612fng.h +1 -1
  226. esphome/components/growatt_solar/growatt_solar.cpp +6 -3
  227. esphome/components/gt911/touchscreen/gt911_touchscreen.cpp +1 -1
  228. esphome/components/haier/haier_base.cpp +2 -2
  229. esphome/components/haier/hon_climate.cpp +13 -6
  230. esphome/components/havells_solar/havells_solar.cpp +5 -2
  231. esphome/components/hbridge/switch/hbridge_switch.cpp +1 -1
  232. esphome/components/hdc1080/hdc1080.cpp +2 -2
  233. esphome/components/he60r/he60r.cpp +4 -2
  234. esphome/components/hlw8012/hlw8012.cpp +6 -4
  235. esphome/components/hm3301/hm3301.cpp +2 -2
  236. esphome/components/hmc5883l/hmc5883l.cpp +2 -2
  237. esphome/components/homeassistant/time/homeassistant_time.cpp +4 -2
  238. esphome/components/honeywell_hih_i2c/honeywell_hih.cpp +4 -4
  239. esphome/components/honeywellabp/honeywellabp.cpp +4 -2
  240. esphome/components/honeywellabp2_i2c/honeywellabp2.cpp +8 -6
  241. esphome/components/hte501/hte501.cpp +3 -2
  242. esphome/components/http_request/__init__.py +2 -2
  243. esphome/components/http_request/http_request.cpp +7 -5
  244. esphome/components/http_request/http_request_idf.cpp +4 -2
  245. esphome/components/http_request/ota/ota_http_request.cpp +1 -1
  246. esphome/components/htu21d/htu21d.cpp +2 -2
  247. esphome/components/htu31d/htu31d.cpp +2 -2
  248. esphome/components/hx711/hx711.cpp +2 -2
  249. esphome/components/hydreon_rgxx/hydreon_rgxx.cpp +5 -3
  250. esphome/components/hyt271/hyt271.cpp +2 -2
  251. esphome/components/i2c/i2c_bus_arduino.cpp +14 -11
  252. esphome/components/i2c/i2c_bus_esp_idf.cpp +13 -11
  253. esphome/components/i2s_audio/__init__.py +2 -0
  254. esphome/components/i2s_audio/i2s_audio.cpp +3 -4
  255. esphome/components/i2s_audio/i2s_audio.h +1 -1
  256. esphome/components/i2s_audio/media_player/__init__.py +1 -1
  257. esphome/components/i2s_audio/media_player/i2s_audio_media_player.cpp +5 -3
  258. esphome/components/i2s_audio/microphone/i2s_audio_microphone.cpp +85 -77
  259. esphome/components/i2s_audio/microphone/i2s_audio_microphone.h +6 -0
  260. esphome/components/i2s_audio/speaker/i2s_audio_speaker.cpp +29 -11
  261. esphome/components/i2s_audio/speaker/i2s_audio_speaker.h +1 -0
  262. esphome/components/iaqcore/iaqcore.cpp +3 -3
  263. esphome/components/ili9xxx/ili9xxx_display.cpp +12 -7
  264. esphome/components/ili9xxx/ili9xxx_display.h +1 -1
  265. esphome/components/image/image.cpp +1 -0
  266. esphome/components/ina219/ina219.cpp +2 -2
  267. esphome/components/ina226/ina226.cpp +8 -5
  268. esphome/components/ina260/ina260.cpp +1 -1
  269. esphome/components/ina2xx_base/ina2xx_base.cpp +13 -9
  270. esphome/components/ina3221/ina3221.cpp +2 -2
  271. esphome/components/inkplate6/display.py +12 -2
  272. esphome/components/inkplate6/inkplate.cpp +13 -9
  273. esphome/components/inkplate6/inkplate.h +7 -6
  274. esphome/components/integration/integration_sensor.cpp +1 -1
  275. esphome/components/internal_temperature/internal_temperature.cpp +4 -4
  276. esphome/components/json/json_util.cpp +4 -5
  277. esphome/components/kamstrup_kmp/kamstrup_kmp.cpp +1 -1
  278. esphome/components/key_collector/key_collector.cpp +4 -2
  279. esphome/components/kmeteriso/kmeteriso.cpp +4 -4
  280. esphome/components/kuntze/kuntze.cpp +4 -2
  281. esphome/components/lc709203f/__init__.py +1 -0
  282. esphome/components/lc709203f/lc709203f.cpp +299 -0
  283. esphome/components/lc709203f/lc709203f.h +55 -0
  284. esphome/components/lc709203f/sensor.py +93 -0
  285. esphome/components/lcd_base/lcd_display.cpp +2 -2
  286. esphome/components/lcd_gpio/gpio_lcd_display.cpp +5 -3
  287. esphome/components/lcd_menu/lcd_menu.cpp +6 -4
  288. esphome/components/lcd_pcf8574/pcf8574_display.cpp +6 -4
  289. esphome/components/ld2410/ld2410.cpp +6 -7
  290. esphome/components/ld2420/ld2420.cpp +9 -7
  291. esphome/components/ld2450/ld2450.cpp +6 -4
  292. esphome/components/ld2450/sensor.py +2 -2
  293. esphome/components/ledc/ledc_output.cpp +32 -28
  294. esphome/components/libretiny/const.py +1 -1
  295. esphome/components/libretiny/preferences.cpp +6 -7
  296. esphome/components/light/__init__.py +2 -1
  297. esphome/components/light/esp_hsv_color.h +1 -1
  298. esphome/components/light/light_state.cpp +9 -5
  299. esphome/components/light/light_state.h +15 -15
  300. esphome/components/light/light_transformer.h +1 -1
  301. esphome/components/lightwaverf/LwTx.cpp +1 -1
  302. esphome/components/lightwaverf/lightwaverf.cpp +1 -1
  303. esphome/components/lilygo_t5_47/touchscreen/lilygo_t5_47_touchscreen.cpp +1 -1
  304. esphome/components/lock/__init__.py +1 -0
  305. esphome/components/lock/lock.h +1 -1
  306. esphome/components/logger/__init__.py +6 -0
  307. esphome/components/logger/logger.cpp +11 -20
  308. esphome/components/logger/logger.h +5 -6
  309. esphome/components/logger/logger_esp32.cpp +5 -5
  310. esphome/components/ltr390/ltr390.cpp +8 -5
  311. esphome/components/ltr501/ltr501.cpp +19 -14
  312. esphome/components/ltr_als_ps/ltr_als_ps.cpp +20 -13
  313. esphome/components/lvgl/__init__.py +2 -2
  314. esphome/components/lvgl/automation.py +5 -4
  315. esphome/components/lvgl/defines.py +0 -2
  316. esphome/components/lvgl/lv_validation.py +1 -3
  317. esphome/components/lvgl/lvcode.py +7 -8
  318. esphome/components/lvgl/lvgl_esphome.cpp +26 -10
  319. esphome/components/lvgl/schemas.py +22 -23
  320. esphome/components/lvgl/trigger.py +8 -3
  321. esphome/components/lvgl/widgets/__init__.py +2 -2
  322. esphome/components/lvgl/widgets/canvas.py +9 -3
  323. esphome/components/lvgl/widgets/line.py +2 -1
  324. esphome/components/lvgl/widgets/tabview.py +7 -0
  325. esphome/components/m5stack_8angle/m5stack_8angle.cpp +3 -3
  326. esphome/components/matrix_keypad/matrix_keypad.cpp +2 -2
  327. esphome/components/max17043/max17043.cpp +2 -2
  328. esphome/components/max31855/max31855.cpp +2 -1
  329. esphome/components/max31856/max31856.cpp +9 -11
  330. esphome/components/max31865/max31865.cpp +6 -4
  331. esphome/components/max44009/max44009.cpp +2 -2
  332. esphome/components/max6675/max6675.cpp +1 -1
  333. esphome/components/max6956/max6956.cpp +5 -3
  334. esphome/components/max7219/max7219.cpp +8 -6
  335. esphome/components/max7219digit/automation.h +52 -0
  336. esphome/components/max7219digit/display.py +93 -1
  337. esphome/components/max7219digit/max7219digit.cpp +16 -13
  338. esphome/components/max9611/max9611.cpp +9 -6
  339. esphome/components/mcp23008/mcp23008.cpp +1 -1
  340. esphome/components/mcp23016/mcp23016.cpp +1 -1
  341. esphome/components/mcp23017/mcp23017.cpp +1 -1
  342. esphome/components/mcp23s08/mcp23s08.cpp +1 -1
  343. esphome/components/mcp23s17/mcp23s17.cpp +1 -1
  344. esphome/components/mcp3008/mcp3008.cpp +1 -1
  345. esphome/components/mcp3008/sensor/mcp3008_sensor.cpp +5 -3
  346. esphome/components/mcp3204/mcp3204.cpp +1 -1
  347. esphome/components/mcp4461/mcp4461.cpp +2 -2
  348. esphome/components/mcp4725/mcp4725.cpp +2 -2
  349. esphome/components/mcp4728/mcp4728.cpp +2 -2
  350. esphome/components/mcp9600/mcp9600.cpp +1 -1
  351. esphome/components/mcp9808/mcp9808.cpp +4 -4
  352. esphome/components/mdns/mdns_component.cpp +8 -2
  353. esphome/components/mdns/mdns_component.h +3 -1
  354. esphome/components/mdns/mdns_esp32.cpp +2 -2
  355. esphome/components/media_player/__init__.py +1 -0
  356. esphome/components/micro_wake_word/micro_wake_word.cpp +1 -1
  357. esphome/components/micro_wake_word/streaming_model.cpp +10 -6
  358. esphome/components/micronova/micronova.h +2 -2
  359. esphome/components/mics_4514/mics_4514.cpp +2 -2
  360. esphome/components/midea/air_conditioner.cpp +7 -5
  361. esphome/components/midea_ir/midea_ir.cpp +1 -1
  362. esphome/components/mipi_spi/mipi_spi.cpp +24 -15
  363. esphome/components/mixer/speaker/mixer_speaker.cpp +8 -4
  364. esphome/components/mlx90393/sensor_mlx90393.cpp +2 -2
  365. esphome/components/mlx90614/mlx90614.cpp +4 -3
  366. esphome/components/mmc5603/mmc5603.cpp +2 -2
  367. esphome/components/mmc5983/mmc5983.cpp +1 -1
  368. esphome/components/modbus/modbus.cpp +7 -5
  369. esphome/components/modbus_controller/modbus_controller.cpp +6 -4
  370. esphome/components/modbus_controller/output/modbus_output.cpp +10 -6
  371. esphome/components/modbus_controller/switch/__init__.py +6 -2
  372. esphome/components/modbus_controller/switch/modbus_switch.cpp +4 -0
  373. esphome/components/modbus_controller/switch/modbus_switch.h +3 -0
  374. esphome/components/mpl3115a2/mpl3115a2.cpp +3 -2
  375. esphome/components/mpr121/mpr121.cpp +2 -2
  376. esphome/components/mpu6050/mpu6050.cpp +6 -6
  377. esphome/components/mpu6886/mpu6886.cpp +6 -6
  378. esphome/components/mqtt/mqtt_alarm_control_panel.cpp +7 -3
  379. esphome/components/mqtt/mqtt_backend_esp32.cpp +1 -1
  380. esphome/components/mqtt/mqtt_client.cpp +31 -24
  381. esphome/components/mqtt/mqtt_component.cpp +3 -3
  382. esphome/components/mqtt/mqtt_cover.cpp +8 -4
  383. esphome/components/mqtt/mqtt_fan.cpp +12 -6
  384. esphome/components/mqtt/mqtt_valve.cpp +4 -2
  385. esphome/components/ms5611/ms5611.cpp +2 -2
  386. esphome/components/ms8607/ms8607.cpp +2 -2
  387. esphome/components/msa3xx/msa3xx.cpp +16 -12
  388. esphome/components/my9231/my9231.cpp +7 -5
  389. esphome/components/nau7802/nau7802.cpp +6 -4
  390. esphome/components/neopixelbus/neopixelbus_light.h +2 -2
  391. esphome/components/network/ip_address.h +1 -1
  392. esphome/components/network/util.cpp +13 -0
  393. esphome/components/nextion/base_component.py +2 -0
  394. esphome/components/nextion/binary_sensor/nextion_binarysensor.cpp +3 -4
  395. esphome/components/nextion/display.py +34 -22
  396. esphome/components/nextion/nextion.cpp +182 -143
  397. esphome/components/nextion/nextion.h +36 -0
  398. esphome/components/nextion/nextion_commands.cpp +3 -3
  399. esphome/components/nextion/nextion_upload_arduino.cpp +69 -69
  400. esphome/components/nextion/nextion_upload_idf.cpp +79 -80
  401. esphome/components/nextion/sensor/nextion_sensor.cpp +5 -5
  402. esphome/components/nextion/switch/nextion_switch.cpp +2 -2
  403. esphome/components/nextion/text_sensor/nextion_textsensor.cpp +3 -3
  404. esphome/components/nfc/nci_message.h +1 -1
  405. esphome/components/nfc/ndef_record.h +1 -1
  406. esphome/components/nfc/ndef_record_text.h +1 -1
  407. esphome/components/nfc/ndef_record_uri.h +1 -1
  408. esphome/components/nfc/nfc.h +1 -1
  409. esphome/components/nfc/nfc_tag.h +1 -1
  410. esphome/components/noblex/noblex.cpp +1 -1
  411. esphome/components/npi19/npi19.cpp +5 -7
  412. esphome/components/number/__init__.py +11 -0
  413. esphome/components/number/number.cpp +1 -1
  414. esphome/components/number/number.h +0 -4
  415. esphome/components/online_image/__init__.py +13 -1
  416. esphome/components/online_image/online_image.cpp +26 -4
  417. esphome/components/online_image/online_image.h +21 -4
  418. esphome/components/opentherm/generate.py +3 -3
  419. esphome/components/opentherm/hub.cpp +11 -7
  420. esphome/components/opentherm/number/number.cpp +5 -3
  421. esphome/components/opentherm/opentherm.h +1 -1
  422. esphome/components/opentherm/schema.py +13 -13
  423. esphome/components/opentherm/validate.py +1 -1
  424. esphome/components/openthread/__init__.py +146 -0
  425. esphome/components/openthread/const.py +10 -0
  426. esphome/components/openthread/openthread.cpp +206 -0
  427. esphome/components/openthread/openthread.h +68 -0
  428. esphome/components/openthread/openthread_esp.cpp +164 -0
  429. esphome/components/openthread/tlv.py +58 -0
  430. esphome/components/openthread_info/__init__.py +0 -0
  431. esphome/components/openthread_info/openthread_info_text_sensor.cpp +24 -0
  432. esphome/components/openthread_info/openthread_info_text_sensor.h +218 -0
  433. esphome/components/openthread_info/text_sensor.py +105 -0
  434. esphome/components/output/float_output.cpp +1 -1
  435. esphome/components/output/switch/output_switch.cpp +1 -1
  436. esphome/components/packet_transport/packet_transport.cpp +6 -4
  437. esphome/components/pca6416a/pca6416a.cpp +2 -2
  438. esphome/components/pca9554/pca9554.cpp +6 -4
  439. esphome/components/pca9685/pca9685_output.cpp +12 -8
  440. esphome/components/pcd8544/pcd_8544.cpp +1 -1
  441. esphome/components/pcf85063/pcf85063.cpp +2 -2
  442. esphome/components/pcf8563/pcf8563.cpp +2 -2
  443. esphome/components/pcf8574/pcf8574.cpp +2 -2
  444. esphome/components/pid/pid_climate.cpp +8 -5
  445. esphome/components/pid/pid_climate.h +1 -1
  446. esphome/components/pid/sensor/pid_climate_sensor.cpp +1 -1
  447. esphome/components/pipsolar/output/pipsolar_output.cpp +1 -1
  448. esphome/components/pipsolar/pipsolar.cpp +3 -3
  449. esphome/components/pm1006/pm1006.cpp +3 -7
  450. esphome/components/pm1006/pm1006.h +4 -1
  451. esphome/components/pm2005/pm2005.cpp +12 -13
  452. esphome/components/pm2005/sensor.py +1 -1
  453. esphome/components/pmsa003i/pmsa003i.cpp +2 -2
  454. esphome/components/pmsx003/pmsx003.cpp +0 -4
  455. esphome/components/pmsx003/pmsx003.h +5 -2
  456. esphome/components/pmwcs3/pmwcs3.cpp +9 -13
  457. esphome/components/pmwcs3/pmwcs3.h +0 -1
  458. esphome/components/pn532/pn532.cpp +7 -7
  459. esphome/components/pn532/pn532.h +1 -1
  460. esphome/components/pn532_spi/pn532_spi.cpp +1 -1
  461. esphome/components/pn7150/pn7150.cpp +4 -4
  462. esphome/components/pn7160/pn7160.cpp +4 -4
  463. esphome/components/power_supply/power_supply.cpp +6 -4
  464. esphome/components/power_supply/power_supply.h +1 -1
  465. esphome/components/prometheus/__init__.py +0 -1
  466. esphome/components/psram/__init__.py +59 -35
  467. esphome/components/pulse_counter/pulse_counter_sensor.cpp +7 -4
  468. esphome/components/pvvx_mithermometer/display/pvvx_display.cpp +8 -5
  469. esphome/components/pylontech/pylontech.cpp +2 -2
  470. esphome/components/pylontech/sensor/pylontech_sensor.cpp +4 -2
  471. esphome/components/pylontech/text_sensor/pylontech_text_sensor.cpp +4 -2
  472. esphome/components/pzemac/pzemac.cpp +4 -2
  473. esphome/components/pzemdc/pzemdc.cpp +4 -2
  474. esphome/components/qmc5883l/qmc5883l.cpp +2 -2
  475. esphome/components/qmp6988/qmp6988.cpp +2 -2
  476. esphome/components/qmp6988/qmp6988.h +1 -1
  477. esphome/components/qr_code/qr_code.cpp +5 -3
  478. esphome/components/qspi_dbi/qspi_dbi.cpp +1 -1
  479. esphome/components/qwiic_pir/qwiic_pir.cpp +26 -28
  480. esphome/components/rc522/rc522.cpp +5 -5
  481. esphome/components/rdm6300/rdm6300.cpp +1 -0
  482. esphome/components/remote_receiver/__init__.py +10 -2
  483. esphome/components/remote_receiver/remote_receiver_esp32.cpp +22 -12
  484. esphome/components/remote_receiver/remote_receiver_esp8266.cpp +10 -7
  485. esphome/components/remote_receiver/remote_receiver_libretiny.cpp +10 -7
  486. esphome/components/remote_transmitter/__init__.py +10 -2
  487. esphome/components/remote_transmitter/remote_transmitter_esp32.cpp +10 -6
  488. esphome/components/remote_transmitter/remote_transmitter_esp8266.cpp +5 -3
  489. esphome/components/remote_transmitter/remote_transmitter_libretiny.cpp +5 -3
  490. esphome/components/resistance/resistance_sensor.cpp +6 -3
  491. esphome/components/restart/button/restart_button.cpp +1 -1
  492. esphome/components/restart/switch/restart_switch.cpp +1 -1
  493. esphome/components/rotary_encoder/rotary_encoder.cpp +2 -2
  494. esphome/components/rp2040/__init__.py +7 -0
  495. esphome/components/rp2040/core.cpp +8 -1
  496. esphome/components/rp2040/gpio.cpp +26 -9
  497. esphome/components/rp2040/preferences.cpp +3 -3
  498. esphome/components/rp2040_pio_led_strip/led_strip.cpp +11 -8
  499. esphome/components/rp2040_pio_led_strip/light.py +1 -1
  500. esphome/components/rp2040_pwm/rp2040_pwm.cpp +1 -1
  501. esphome/components/rpi_dpi_rgb/rpi_dpi_rgb.cpp +1 -1
  502. esphome/components/rtttl/rtttl.cpp +11 -9
  503. esphome/components/safe_mode/button/safe_mode_button.cpp +1 -1
  504. esphome/components/safe_mode/safe_mode.cpp +9 -8
  505. esphome/components/safe_mode/switch/safe_mode_switch.cpp +1 -1
  506. esphome/components/scd30/scd30.cpp +11 -8
  507. esphome/components/scd4x/scd4x.cpp +12 -8
  508. esphome/components/sdl/display.py +40 -0
  509. esphome/components/sdl/sdl_esphome.cpp +2 -2
  510. esphome/components/sdl/sdl_esphome.h +8 -0
  511. esphome/components/sdm_meter/sdm_meter.cpp +5 -2
  512. esphome/components/sdp3x/sdp3x.cpp +11 -11
  513. esphome/components/sds011/sds011.cpp +5 -6
  514. esphome/components/sds011/sds011.h +4 -1
  515. esphome/components/seeed_mr24hpc1/seeed_mr24hpc1.cpp +3 -2
  516. esphome/components/seeed_mr60bha2/seeed_mr60bha2.cpp +1 -0
  517. esphome/components/seeed_mr60fda2/seeed_mr60fda2.cpp +3 -2
  518. esphome/components/selec_meter/selec_meter.cpp +5 -2
  519. esphome/components/select/__init__.py +1 -0
  520. esphome/components/select/select.cpp +1 -1
  521. esphome/components/select/select.h +0 -4
  522. esphome/components/sen0321/sen0321.cpp +2 -2
  523. esphome/components/sen21231/sen21231.cpp +1 -1
  524. esphome/components/sen5x/sen5x.cpp +10 -7
  525. esphome/components/sensirion_common/i2c_sensirion.cpp +2 -1
  526. esphome/components/sensirion_common/i2c_sensirion.h +1 -0
  527. esphome/components/sensor/__init__.py +11 -1
  528. esphome/components/sensor/filter.h +1 -1
  529. esphome/components/sensor/sensor.cpp +8 -4
  530. esphome/components/sensor/sensor.h +12 -11
  531. esphome/components/servo/servo.cpp +12 -9
  532. esphome/components/servo/servo.h +1 -1
  533. esphome/components/sfa30/sfa30.cpp +1 -1
  534. esphome/components/sgp30/sgp30.cpp +10 -8
  535. esphome/components/sgp4x/sgp4x.cpp +49 -61
  536. esphome/components/sgp4x/sgp4x.h +0 -1
  537. esphome/components/shelly_dimmer/shelly_dimmer.cpp +11 -7
  538. esphome/components/sht3xd/sht3xd.cpp +1 -1
  539. esphome/components/sht4x/sht4x.cpp +2 -2
  540. esphome/components/shtcx/shtcx.cpp +13 -16
  541. esphome/components/shutdown/button/shutdown_button.cpp +1 -1
  542. esphome/components/shutdown/switch/shutdown_switch.cpp +1 -1
  543. esphome/components/sim800l/sim800l.cpp +2 -2
  544. esphome/components/slow_pwm/slow_pwm_output.cpp +4 -2
  545. esphome/components/sm16716/sm16716.cpp +1 -1
  546. esphome/components/sm2135/sm2135.cpp +1 -1
  547. esphome/components/sm2235/sm2235.cpp +5 -3
  548. esphome/components/sm2335/sm2335.cpp +5 -3
  549. esphome/components/sml/sml.cpp +1 -1
  550. esphome/components/sn74hc165/sn74hc165.cpp +1 -2
  551. esphome/components/sn74hc595/sn74hc595.cpp +1 -2
  552. esphome/components/sntp/sntp_component.cpp +1 -1
  553. esphome/components/socket/__init__.py +2 -0
  554. esphome/components/socket/bsd_sockets_impl.cpp +51 -7
  555. esphome/components/socket/lwip_raw_tcp_impl.cpp +5 -0
  556. esphome/components/socket/lwip_sockets_impl.cpp +51 -7
  557. esphome/components/socket/socket.cpp +31 -0
  558. esphome/components/socket/socket.h +27 -1
  559. esphome/components/sonoff_d1/sonoff_d1.cpp +7 -4
  560. esphome/components/sonoff_d1/sonoff_d1.h +2 -2
  561. esphome/components/sound_level/sound_level.cpp +4 -2
  562. esphome/components/speaker/media_player/__init__.py +3 -0
  563. esphome/components/speaker/media_player/speaker_media_player.cpp +1 -3
  564. esphome/components/speaker/media_player/speaker_media_player.h +6 -0
  565. esphome/components/spi/__init__.py +10 -2
  566. esphome/components/spi/spi.cpp +4 -4
  567. esphome/components/spi/spi_arduino.cpp +22 -9
  568. esphome/components/spi_device/spi_device.cpp +1 -2
  569. esphome/components/sprinkler/sprinkler.cpp +9 -6
  570. esphome/components/sps30/sps30.cpp +16 -15
  571. esphome/components/ssd1306_base/ssd1306_base.cpp +1 -1
  572. esphome/components/ssd1306_i2c/ssd1306_i2c.cpp +11 -8
  573. esphome/components/ssd1306_spi/ssd1306_spi.cpp +10 -7
  574. esphome/components/ssd1322_base/ssd1322_base.cpp +1 -1
  575. esphome/components/ssd1322_spi/ssd1322_spi.cpp +1 -1
  576. esphome/components/ssd1325_base/ssd1325_base.cpp +1 -1
  577. esphome/components/ssd1325_spi/ssd1325_spi.cpp +1 -1
  578. esphome/components/ssd1327_base/ssd1327_base.cpp +1 -1
  579. esphome/components/ssd1327_i2c/ssd1327_i2c.cpp +2 -2
  580. esphome/components/ssd1327_spi/ssd1327_spi.cpp +1 -1
  581. esphome/components/ssd1331_base/ssd1331_base.cpp +1 -1
  582. esphome/components/ssd1331_spi/ssd1331_spi.cpp +1 -1
  583. esphome/components/ssd1351_base/ssd1351_base.cpp +1 -1
  584. esphome/components/ssd1351_spi/ssd1351_spi.cpp +1 -1
  585. esphome/components/st7567_base/st7567_base.cpp +3 -3
  586. esphome/components/st7567_i2c/st7567_i2c.cpp +7 -5
  587. esphome/components/st7567_spi/st7567_spi.cpp +1 -1
  588. esphome/components/st7701s/st7701s.cpp +4 -2
  589. esphome/components/st7735/st7735.cpp +3 -3
  590. esphome/components/st7789v/st7789v.cpp +10 -7
  591. esphome/components/st7920/st7920.cpp +6 -4
  592. esphome/components/statsd/statsd.cpp +9 -5
  593. esphome/components/status_led/light/status_led_light.cpp +3 -3
  594. esphome/components/status_led/light/status_led_light.h +1 -1
  595. esphome/components/status_led/status_led.cpp +1 -1
  596. esphome/components/stepper/stepper.h +5 -3
  597. esphome/components/sts3x/sts3x.cpp +2 -2
  598. esphome/components/switch/__init__.py +1 -0
  599. esphome/components/switch/switch.cpp +18 -12
  600. esphome/components/switch/switch.h +14 -8
  601. esphome/components/sx1509/__init__.py +53 -20
  602. esphome/components/sx1509/sx1509.cpp +29 -5
  603. esphome/components/sx1509/sx1509.h +9 -1
  604. esphome/components/t6615/t6615.cpp +1 -0
  605. esphome/components/tc74/tc74.cpp +1 -1
  606. esphome/components/tca9548a/tca9548a.cpp +1 -1
  607. esphome/components/tca9555/tca9555.cpp +2 -2
  608. esphome/components/tcs34725/tcs34725.cpp +4 -4
  609. esphome/components/tee501/tee501.cpp +3 -2
  610. esphome/components/tem3200/tem3200.cpp +5 -6
  611. esphome/components/template/alarm_control_panel/__init__.py +6 -0
  612. esphome/components/template/alarm_control_panel/template_alarm_control_panel.cpp +43 -12
  613. esphome/components/template/alarm_control_panel/template_alarm_control_panel.h +4 -1
  614. esphome/components/template/cover/template_cover.cpp +1 -1
  615. esphome/components/template/select/template_select.cpp +6 -4
  616. esphome/components/template/text/template_text.cpp +2 -3
  617. esphome/components/template/valve/template_valve.cpp +5 -3
  618. esphome/components/text/__init__.py +10 -11
  619. esphome/components/text/text.cpp +1 -1
  620. esphome/components/text/text.h +0 -4
  621. esphome/components/text_sensor/__init__.py +1 -0
  622. esphome/components/text_sensor/text_sensor.cpp +8 -4
  623. esphome/components/text_sensor/text_sensor.h +6 -6
  624. esphome/components/thermostat/thermostat_climate.cpp +67 -43
  625. esphome/components/time/__init__.py +1 -2
  626. esphome/components/time_based/time_based_cover.cpp +4 -2
  627. esphome/components/tlc59208f/tlc59208f_output.cpp +8 -6
  628. esphome/components/tm1621/tm1621.cpp +3 -3
  629. esphome/components/tm1637/tm1637.cpp +9 -7
  630. esphome/components/tm1638/tm1638.cpp +7 -5
  631. esphome/components/tm1651/tm1651.cpp +2 -2
  632. esphome/components/tmp102/tmp102.cpp +1 -3
  633. esphome/components/tmp102/tmp102.h +0 -3
  634. esphome/components/tmp1075/tmp1075.cpp +12 -9
  635. esphome/components/tmp117/tmp117.cpp +2 -2
  636. esphome/components/tof10120/tof10120_sensor.cpp +2 -2
  637. esphome/components/tormatic/tormatic_cover.cpp +4 -2
  638. esphome/components/tsl2561/tsl2561.cpp +7 -5
  639. esphome/components/tsl2591/tsl2591.cpp +25 -27
  640. esphome/components/tt21100/touchscreen/tt21100.cpp +1 -1
  641. esphome/components/ttp229_bsf/ttp229_bsf.cpp +1 -1
  642. esphome/components/ttp229_lsf/ttp229_lsf.cpp +2 -2
  643. esphome/components/tuya/select/tuya_select.cpp +5 -3
  644. esphome/components/tx20/tx20.cpp +3 -3
  645. esphome/components/uart/__init__.py +4 -5
  646. esphome/components/uart/button/uart_button.cpp +1 -1
  647. esphome/components/uart/switch/uart_switch.cpp +2 -2
  648. esphome/components/uart/uart.cpp +2 -2
  649. esphome/components/uart/uart_component_esp32_arduino.cpp +8 -6
  650. esphome/components/uart/uart_component_esp8266.cpp +9 -7
  651. esphome/components/uart/uart_component_esp_idf.cpp +9 -7
  652. esphome/components/uart/uart_component_host.cpp +11 -8
  653. esphome/components/uart/uart_component_libretiny.cpp +8 -6
  654. esphome/components/uart/uart_component_rp2040.cpp +8 -6
  655. esphome/components/udp/udp_component.cpp +9 -5
  656. esphome/components/ufire_ec/ufire_ec.cpp +5 -3
  657. esphome/components/ufire_ise/ufire_ise.cpp +1 -1
  658. esphome/components/ultrasonic/ultrasonic_sensor.cpp +5 -3
  659. esphome/components/update/__init__.py +1 -0
  660. esphome/components/update/update_entity.cpp +1 -1
  661. esphome/components/update/update_entity.h +0 -3
  662. esphome/components/uponor_smatrix/climate/uponor_smatrix_climate.cpp +1 -1
  663. esphome/components/uponor_smatrix/sensor/uponor_smatrix_sensor.cpp +4 -2
  664. esphome/components/uponor_smatrix/uponor_smatrix.cpp +2 -1
  665. esphome/components/uptime/sensor/uptime_timestamp_sensor.cpp +1 -1
  666. esphome/components/usb_host/__init__.py +64 -0
  667. esphome/components/usb_host/usb_host.h +116 -0
  668. esphome/components/usb_host/usb_host_client.cpp +394 -0
  669. esphome/components/usb_host/usb_host_component.cpp +35 -0
  670. esphome/components/usb_uart/__init__.py +134 -0
  671. esphome/components/usb_uart/ch34x.cpp +80 -0
  672. esphome/components/usb_uart/cp210x.cpp +126 -0
  673. esphome/components/usb_uart/usb_uart.cpp +328 -0
  674. esphome/components/usb_uart/usb_uart.h +151 -0
  675. esphome/components/valve/__init__.py +1 -0
  676. esphome/components/veml3235/veml3235.cpp +13 -9
  677. esphome/components/veml7700/veml7700.cpp +10 -6
  678. esphome/components/voice_assistant/voice_assistant.cpp +7 -7
  679. esphome/components/wake_on_lan/wake_on_lan.cpp +1 -1
  680. esphome/components/waveshare_epaper/waveshare_epaper.cpp +1 -1
  681. esphome/components/web_server/server_index_v2.h +632 -630
  682. esphome/components/web_server/server_index_v3.h +411 -409
  683. esphome/components/web_server/web_server.cpp +5 -3
  684. esphome/components/web_server_base/web_server_base.cpp +1 -1
  685. esphome/components/web_server_idf/__init__.py +0 -2
  686. esphome/components/web_server_idf/utils.cpp +1 -1
  687. esphome/components/web_server_idf/web_server_idf.cpp +7 -3
  688. esphome/components/web_server_idf/web_server_idf.h +7 -0
  689. esphome/components/weikai/__init__.py +2 -0
  690. esphome/components/weikai/weikai.cpp +24 -22
  691. esphome/components/weikai_i2c/weikai_i2c.cpp +14 -9
  692. esphome/components/weikai_spi/weikai_spi.cpp +11 -6
  693. esphome/components/wiegand/wiegand.cpp +1 -1
  694. esphome/components/wifi/wifi_component.cpp +50 -37
  695. esphome/components/wifi/wifi_component.h +7 -4
  696. esphome/components/wifi/wifi_component_esp32_arduino.cpp +2 -2
  697. esphome/components/wifi/wifi_component_esp8266.cpp +3 -3
  698. esphome/components/wifi/wifi_component_libretiny.cpp +4 -4
  699. esphome/components/wireguard/wireguard.cpp +21 -21
  700. esphome/components/wl_134/text_sensor.py +1 -2
  701. esphome/components/wled/wled_light_effect.cpp +1 -1
  702. esphome/components/x9c/x9c.cpp +5 -3
  703. esphome/components/xgzp68xx/xgzp68xx.cpp +8 -6
  704. esphome/components/xiaomi_cgd1/xiaomi_cgd1.cpp +4 -2
  705. esphome/components/xiaomi_cgdk2/xiaomi_cgdk2.cpp +4 -2
  706. esphome/components/xiaomi_cgg1/xiaomi_cgg1.cpp +4 -2
  707. esphome/components/xiaomi_hhccjcy10/xiaomi_hhccjcy10.cpp +1 -1
  708. esphome/components/xiaomi_lywsd02mmc/xiaomi_lywsd02mmc.cpp +4 -2
  709. esphome/components/xiaomi_lywsd03mmc/xiaomi_lywsd03mmc.cpp +4 -2
  710. esphome/components/xiaomi_mhoc401/xiaomi_mhoc401.cpp +4 -2
  711. esphome/components/xl9535/xl9535.cpp +2 -2
  712. esphome/components/xpt2046/touchscreen/xpt2046.cpp +12 -11
  713. esphome/components/xpt2046/touchscreen/xpt2046.h +2 -2
  714. esphome/config.py +3 -2
  715. esphome/config_validation.py +46 -17
  716. esphome/const.py +10 -1
  717. esphome/core/__init__.py +37 -18
  718. esphome/core/application.cpp +197 -8
  719. esphome/core/application.h +116 -6
  720. esphome/core/component.cpp +36 -15
  721. esphome/core/component.h +43 -13
  722. esphome/core/config.py +12 -0
  723. esphome/core/defines.h +10 -2
  724. esphome/core/entity_base.cpp +4 -16
  725. esphome/core/entity_base.h +27 -13
  726. esphome/core/hal.h +5 -0
  727. esphome/core/helpers.cpp +1 -1
  728. esphome/core/helpers.h +5 -5
  729. esphome/core/log.h +2 -0
  730. esphome/core/log_const_en.h +4 -0
  731. esphome/core/scheduler.cpp +2 -2
  732. esphome/coroutine.py +3 -4
  733. esphome/cpp_generator.py +32 -32
  734. esphome/dashboard/core.py +2 -2
  735. esphome/dashboard/web_server.py +2 -2
  736. esphome/git.py +4 -4
  737. esphome/helpers.py +5 -6
  738. esphome/loader.py +8 -7
  739. esphome/log.py +7 -1
  740. esphome/platformio_api.py +2 -3
  741. esphome/storage_json.py +13 -5
  742. esphome/types.py +12 -13
  743. esphome/util.py +1 -2
  744. esphome/wizard.py +0 -16
  745. esphome/writer.py +5 -3
  746. esphome/yaml_util.py +6 -1
  747. esphome/zeroconf.py +1 -1
  748. {esphome-2025.5.1.dist-info → esphome-2025.6.0.dist-info}/METADATA +12 -11
  749. {esphome-2025.5.1.dist-info → esphome-2025.6.0.dist-info}/RECORD +753 -699
  750. {esphome-2025.5.1.dist-info → esphome-2025.6.0.dist-info}/WHEEL +1 -1
  751. {esphome-2025.5.1.dist-info → esphome-2025.6.0.dist-info}/entry_points.txt +0 -0
  752. {esphome-2025.5.1.dist-info → esphome-2025.6.0.dist-info}/licenses/LICENSE +0 -0
  753. {esphome-2025.5.1.dist-info → esphome-2025.6.0.dist-info}/top_level.txt +0 -0
@@ -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
 
@@ -55,6 +55,9 @@ class SpeakerMediaPlayer : public Component, public media_player::MediaPlayer {
55
55
  // Percentage to increase or decrease the volume for volume up or volume down commands
56
56
  void set_volume_increment(float volume_increment) { this->volume_increment_ = volume_increment; }
57
57
 
58
+ // Volume used initially on first boot when no volume had been previously saved
59
+ void set_volume_initial(float volume_initial) { this->volume_initial_ = volume_initial; }
60
+
58
61
  void set_volume_max(float volume_max) { this->volume_max_ = volume_max; }
59
62
  void set_volume_min(float volume_min) { this->volume_min_ = volume_min; }
60
63
 
@@ -128,6 +131,9 @@ class SpeakerMediaPlayer : public Component, public media_player::MediaPlayer {
128
131
  // The amount to change the volume on volume up/down commands
129
132
  float volume_increment_;
130
133
 
134
+ // The initial volume used by Setup when no previous volume was saved
135
+ float volume_initial_;
136
+
131
137
  float volume_max_;
132
138
  float volume_min_;
133
139
 
@@ -2,12 +2,14 @@ import re
2
2
 
3
3
  from esphome import pins
4
4
  import esphome.codegen as cg
5
+ from esphome.components.esp32 import only_on_variant
5
6
  from esphome.components.esp32.const import (
6
7
  KEY_ESP32,
7
8
  VARIANT_ESP32C2,
8
9
  VARIANT_ESP32C3,
9
10
  VARIANT_ESP32C6,
10
11
  VARIANT_ESP32H2,
12
+ VARIANT_ESP32P4,
11
13
  VARIANT_ESP32S2,
12
14
  VARIANT_ESP32S3,
13
15
  )
@@ -287,7 +289,15 @@ def spi_mode_schema(mode):
287
289
  if mode == TYPE_SINGLE:
288
290
  return SPI_SINGLE_SCHEMA
289
291
  pin_count = 4 if mode == TYPE_QUAD else 8
292
+ onlys = [cv.only_on([PLATFORM_ESP32]), cv.only_with_esp_idf]
293
+ if pin_count == 8:
294
+ onlys.append(
295
+ only_on_variant(
296
+ supported=[VARIANT_ESP32S3, VARIANT_ESP32S2, VARIANT_ESP32P4]
297
+ )
298
+ )
290
299
  return cv.All(
300
+ *onlys,
291
301
  cv.Schema(
292
302
  {
293
303
  cv.GenerateID(): cv.declare_id(TYPE_CLASS[mode]),
@@ -308,8 +318,6 @@ def spi_mode_schema(mode):
308
318
  ),
309
319
  }
310
320
  ),
311
- cv.only_on([PLATFORM_ESP32]),
312
- cv.only_with_esp_idf,
313
321
  )
314
322
 
315
323
 
@@ -18,7 +18,7 @@ GPIOPin *const NullPin::NULL_PIN = new NullPin(); // NOLINT(cppcoreguidelines-a
18
18
  SPIDelegate *SPIComponent::register_device(SPIClient *device, SPIMode mode, SPIBitOrder bit_order, uint32_t data_rate,
19
19
  GPIOPin *cs_pin) {
20
20
  if (this->devices_.count(device) != 0) {
21
- ESP_LOGE(TAG, "SPI device already registered");
21
+ ESP_LOGE(TAG, "Device already registered");
22
22
  return this->devices_[device];
23
23
  }
24
24
  SPIDelegate *delegate = this->spi_bus_->get_delegate(data_rate, bit_order, mode, cs_pin); // NOLINT
@@ -28,7 +28,7 @@ SPIDelegate *SPIComponent::register_device(SPIClient *device, SPIMode mode, SPIB
28
28
 
29
29
  void SPIComponent::unregister_device(SPIClient *device) {
30
30
  if (this->devices_.count(device) == 0) {
31
- esph_log_e(TAG, "SPI device not registered");
31
+ esph_log_e(TAG, "Device not registered");
32
32
  return;
33
33
  }
34
34
  delete this->devices_[device]; // NOLINT
@@ -36,14 +36,14 @@ void SPIComponent::unregister_device(SPIClient *device) {
36
36
  }
37
37
 
38
38
  void SPIComponent::setup() {
39
- ESP_LOGD(TAG, "Setting up SPI bus...");
39
+ ESP_LOGCONFIG(TAG, "Running setup");
40
40
 
41
41
  if (this->sdo_pin_ == nullptr)
42
42
  this->sdo_pin_ = NullPin::NULL_PIN;
43
43
  if (this->sdi_pin_ == nullptr)
44
44
  this->sdi_pin_ = NullPin::NULL_PIN;
45
45
  if (this->clk_pin_ == nullptr) {
46
- ESP_LOGE(TAG, "No clock pin for SPI");
46
+ ESP_LOGE(TAG, "No clock pin");
47
47
  this->mark_failed();
48
48
  return;
49
49
  }
@@ -3,7 +3,6 @@
3
3
 
4
4
  namespace esphome {
5
5
  namespace spi {
6
-
7
6
  #ifdef USE_ARDUINO
8
7
 
9
8
  static const char *const TAG = "spi-esp-arduino";
@@ -38,17 +37,31 @@ class SPIDelegateHw : public SPIDelegate {
38
37
 
39
38
  void write16(uint16_t data) override { this->channel_->transfer16(data); }
40
39
 
41
- #ifdef USE_RP2040
42
40
  void write_array(const uint8_t *ptr, size_t length) override {
43
- // avoid overwriting the supplied buffer
44
- uint8_t *rxbuf = new uint8_t[length]; // NOLINT(cppcoreguidelines-owning-memory)
45
- memcpy(rxbuf, ptr, length);
46
- this->channel_->transfer((void *) rxbuf, length);
47
- delete[] rxbuf; // NOLINT(cppcoreguidelines-owning-memory)
48
- }
41
+ if (length == 1) {
42
+ this->channel_->transfer(*ptr);
43
+ return;
44
+ }
45
+ #ifdef USE_RP2040
46
+ // avoid overwriting the supplied buffer. Use vector for automatic deallocation
47
+ auto rxbuf = std::vector<uint8_t>(length);
48
+ memcpy(rxbuf.data(), ptr, length);
49
+ this->channel_->transfer((void *) rxbuf.data(), length);
50
+ #elif defined(USE_ESP8266)
51
+ // ESP8266 SPI library requires the pointer to be word aligned, but the data may not be
52
+ // so we need to copy the data to a temporary buffer
53
+ if (reinterpret_cast<uintptr_t>(ptr) & 0x3) {
54
+ ESP_LOGVV(TAG, "SPI write buffer not word aligned, copying to temporary buffer");
55
+ auto txbuf = std::vector<uint8_t>(length);
56
+ memcpy(txbuf.data(), ptr, length);
57
+ this->channel_->writeBytes(txbuf.data(), length);
58
+ } else {
59
+ this->channel_->writeBytes(ptr, length);
60
+ }
49
61
  #else
50
- void write_array(const uint8_t *ptr, size_t length) override { this->channel_->writeBytes(ptr, length); }
62
+ this->channel_->writeBytes(ptr, length);
51
63
  #endif
64
+ }
52
65
 
53
66
  void read_array(uint8_t *ptr, size_t length) override { this->channel_->transfer(ptr, length); }
54
67
 
@@ -9,9 +9,8 @@ namespace spi_device {
9
9
  static const char *const TAG = "spi_device";
10
10
 
11
11
  void SPIDeviceComponent::setup() {
12
- ESP_LOGD(TAG, "Setting up SPIDevice...");
12
+ ESP_LOGCONFIG(TAG, "Running setup");
13
13
  this->spi_setup();
14
- ESP_LOGCONFIG(TAG, "SPIDevice started!");
15
14
  }
16
15
 
17
16
  void SPIDeviceComponent::dump_config() {
@@ -1712,15 +1712,18 @@ void Sprinkler::dump_config() {
1712
1712
  if (this->valve_overlap_) {
1713
1713
  ESP_LOGCONFIG(TAG, " Valve Overlap: %" PRIu32 " seconds", this->switching_delay_.value_or(0));
1714
1714
  } else {
1715
- ESP_LOGCONFIG(TAG, " Valve Open Delay: %" PRIu32 " seconds", this->switching_delay_.value_or(0));
1716
- ESP_LOGCONFIG(TAG, " Pump Switch Off During Valve Open Delay: %s",
1717
- YESNO(this->pump_switch_off_during_valve_open_delay_));
1715
+ ESP_LOGCONFIG(TAG,
1716
+ " Valve Open Delay: %" PRIu32 " seconds\n"
1717
+ " Pump Switch Off During Valve Open Delay: %s",
1718
+ this->switching_delay_.value_or(0), YESNO(this->pump_switch_off_during_valve_open_delay_));
1718
1719
  }
1719
1720
  }
1720
1721
  for (size_t valve_number = 0; valve_number < this->number_of_valves(); valve_number++) {
1721
- ESP_LOGCONFIG(TAG, " Valve %zu:", valve_number);
1722
- ESP_LOGCONFIG(TAG, " Name: %s", this->valve_name(valve_number));
1723
- ESP_LOGCONFIG(TAG, " Run Duration: %" PRIu32 " seconds", this->valve_run_duration(valve_number));
1722
+ ESP_LOGCONFIG(TAG,
1723
+ " Valve %zu:\n"
1724
+ " Name: %s\n"
1725
+ " Run Duration: %" PRIu32 " seconds",
1726
+ valve_number, this->valve_name(valve_number), this->valve_run_duration(valve_number));
1724
1727
  if (this->valve_[valve_number].valve_switch.pulse_duration()) {
1725
1728
  ESP_LOGCONFIG(TAG, " Pulse Duration: %" PRIu32 " milliseconds",
1726
1729
  this->valve_[valve_number].valve_switch.pulse_duration());