esphome 2025.6.3__py3-none-any.whl → 2025.7.0b2__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 (606) hide show
  1. esphome/__main__.py +1 -3
  2. esphome/codegen.py +2 -0
  3. esphome/components/ac_dimmer/ac_dimmer.cpp +6 -6
  4. esphome/components/adc/__init__.py +25 -1
  5. esphome/components/adc/adc_sensor.h +11 -11
  6. esphome/components/adc/adc_sensor_common.cpp +1 -1
  7. esphome/components/adc/adc_sensor_esp32.cpp +16 -8
  8. esphome/components/ade7880/ade7880.h +0 -2
  9. esphome/components/ads1115/ads1115.h +0 -1
  10. esphome/components/ads1118/ads1118.h +0 -1
  11. esphome/components/ags10/ags10.h +0 -2
  12. esphome/components/aic3204/aic3204.h +0 -1
  13. esphome/components/alarm_control_panel/__init__.py +5 -2
  14. esphome/components/alpha3/alpha3.h +0 -1
  15. esphome/components/am43/cover/am43_cover.h +0 -1
  16. esphome/components/am43/sensor/am43_sensor.h +0 -1
  17. esphome/components/analog_threshold/analog_threshold_binary_sensor.h +0 -2
  18. esphome/components/anova/anova.cpp +5 -1
  19. esphome/components/anova/anova.h +0 -1
  20. esphome/components/apds9960/apds9960.cpp +1 -1
  21. esphome/components/api/__init__.py +57 -21
  22. esphome/components/api/api_connection.cpp +344 -539
  23. esphome/components/api/api_connection.h +224 -141
  24. esphome/components/api/api_frame_helper.cpp +91 -127
  25. esphome/components/api/api_frame_helper.h +64 -54
  26. esphome/components/api/api_pb2.cpp +1837 -9044
  27. esphome/components/api/api_pb2.h +532 -685
  28. esphome/components/api/api_pb2_dump.cpp +4432 -0
  29. esphome/components/api/api_pb2_service.cpp +184 -425
  30. esphome/components/api/api_pb2_service.h +13 -6
  31. esphome/components/api/api_server.cpp +131 -167
  32. esphome/components/api/api_server.h +38 -10
  33. esphome/components/api/client.py +8 -2
  34. esphome/components/api/custom_api_device.h +8 -0
  35. esphome/components/api/list_entities.cpp +37 -104
  36. esphome/components/api/list_entities.h +33 -23
  37. esphome/components/api/proto.h +532 -26
  38. esphome/components/api/subscribe_state.cpp +23 -29
  39. esphome/components/api/subscribe_state.h +26 -19
  40. esphome/components/api/user_services.h +2 -0
  41. esphome/components/as5600/as5600.h +0 -1
  42. esphome/components/async_tcp/__init__.py +14 -5
  43. esphome/components/atc_mithermometer/atc_mithermometer.h +0 -1
  44. esphome/components/atm90e32/atm90e32.cpp +2 -1
  45. esphome/components/audio/audio_decoder.cpp +1 -1
  46. esphome/components/audio/audio_transfer_buffer.cpp +2 -2
  47. esphome/components/b_parasite/b_parasite.h +0 -1
  48. esphome/components/bedjet/bedjet_hub.cpp +5 -1
  49. esphome/components/bedjet/climate/bedjet_climate.cpp +5 -1
  50. esphome/components/beken_spi_led_strip/led_strip.cpp +4 -2
  51. esphome/components/bh1750/bh1750.cpp +5 -5
  52. esphome/components/binary_sensor/__init__.py +82 -5
  53. esphome/components/binary_sensor/automation.h +19 -1
  54. esphome/components/binary_sensor/binary_sensor.cpp +12 -30
  55. esphome/components/binary_sensor/binary_sensor.h +11 -25
  56. esphome/components/binary_sensor/filter.cpp +29 -24
  57. esphome/components/binary_sensor/filter.h +20 -10
  58. esphome/components/ble_client/output/ble_binary_output.h +0 -1
  59. esphome/components/ble_client/sensor/ble_rssi_sensor.cpp +5 -1
  60. esphome/components/ble_client/sensor/ble_rssi_sensor.h +0 -1
  61. esphome/components/ble_client/sensor/ble_sensor.cpp +5 -1
  62. esphome/components/ble_client/sensor/ble_sensor.h +0 -1
  63. esphome/components/ble_client/switch/ble_switch.h +0 -1
  64. esphome/components/ble_client/text_sensor/ble_text_sensor.cpp +5 -1
  65. esphome/components/ble_client/text_sensor/ble_text_sensor.h +0 -1
  66. esphome/components/ble_presence/ble_presence_device.h +0 -1
  67. esphome/components/ble_rssi/ble_rssi_sensor.h +0 -1
  68. esphome/components/ble_scanner/ble_scanner.h +0 -1
  69. esphome/components/bluetooth_proxy/bluetooth_connection.h +9 -2
  70. esphome/components/bluetooth_proxy/bluetooth_proxy.cpp +16 -6
  71. esphome/components/bluetooth_proxy/bluetooth_proxy.h +8 -2
  72. esphome/components/bme680/sensor.py +1 -1
  73. esphome/components/bmp581/bmp581.h +0 -2
  74. esphome/components/button/__init__.py +5 -2
  75. esphome/components/camera/__init__.py +1 -0
  76. esphome/components/camera/camera.cpp +22 -0
  77. esphome/components/camera/camera.h +80 -0
  78. esphome/components/canbus/__init__.py +1 -0
  79. esphome/components/cap1188/cap1188.h +0 -1
  80. esphome/components/captive_portal/__init__.py +12 -2
  81. esphome/components/captive_portal/captive_portal.cpp +12 -2
  82. esphome/components/captive_portal/captive_portal.h +5 -2
  83. esphome/components/ccs811/ccs811.h +0 -2
  84. esphome/components/climate/__init__.py +5 -2
  85. esphome/components/cm1106/sensor.py +2 -2
  86. esphome/components/const/__init__.py +2 -0
  87. esphome/components/copy/binary_sensor/copy_binary_sensor.h +0 -1
  88. esphome/components/copy/button/copy_button.h +0 -1
  89. esphome/components/copy/cover/copy_cover.h +0 -1
  90. esphome/components/copy/fan/copy_fan.h +0 -1
  91. esphome/components/copy/lock/copy_lock.h +0 -1
  92. esphome/components/copy/number/copy_number.h +0 -1
  93. esphome/components/copy/select/copy_select.h +0 -1
  94. esphome/components/copy/sensor/copy_sensor.h +0 -1
  95. esphome/components/copy/switch/copy_switch.h +0 -1
  96. esphome/components/copy/text/copy_text.h +0 -1
  97. esphome/components/copy/text_sensor/copy_text_sensor.h +0 -1
  98. esphome/components/cover/__init__.py +5 -2
  99. esphome/components/cs5460a/cs5460a.h +0 -1
  100. esphome/components/datetime/__init__.py +4 -2
  101. esphome/components/debug/__init__.py +20 -0
  102. esphome/components/debug/debug_esp32.cpp +2 -0
  103. esphome/components/deep_sleep/__init__.py +43 -9
  104. esphome/components/demo/__init__.py +2 -2
  105. esphome/components/display/display.cpp +4 -3
  106. esphome/components/display/display.h +0 -2
  107. esphome/components/display/display_buffer.cpp +1 -1
  108. esphome/components/ds2484/__init__.py +1 -0
  109. esphome/components/ds2484/ds2484.cpp +209 -0
  110. esphome/components/ds2484/ds2484.h +43 -0
  111. esphome/components/ds2484/one_wire.py +37 -0
  112. esphome/components/duty_time/duty_time_sensor.h +0 -1
  113. esphome/components/ens160_base/ens160_base.h +0 -1
  114. esphome/components/es7210/es7210.h +0 -1
  115. esphome/components/es7243e/es7243e.h +0 -1
  116. esphome/components/es8156/es8156.h +0 -1
  117. esphome/components/es8311/es8311.h +0 -1
  118. esphome/components/es8388/es8388.h +0 -1
  119. esphome/components/esp32/__init__.py +103 -135
  120. esphome/components/esp32/core.cpp +0 -4
  121. esphome/components/esp32/gpio.h +1 -1
  122. esphome/components/esp32/helpers.cpp +69 -0
  123. esphome/components/esp32_ble/ble.cpp +5 -6
  124. esphome/components/esp32_ble/ble.h +29 -14
  125. esphome/components/esp32_ble/ble_event.h +6 -6
  126. esphome/components/esp32_ble_client/ble_client_base.cpp +21 -6
  127. esphome/components/esp32_ble_client/ble_client_base.h +24 -9
  128. esphome/components/esp32_ble_tracker/__init__.py +2 -8
  129. esphome/components/esp32_ble_tracker/esp32_ble_tracker.cpp +5 -5
  130. esphome/components/esp32_ble_tracker/esp32_ble_tracker.h +11 -7
  131. esphome/components/esp32_camera/__init__.py +112 -98
  132. esphome/components/esp32_camera/esp32_camera.cpp +41 -31
  133. esphome/components/esp32_camera/esp32_camera.h +35 -30
  134. esphome/components/esp32_camera_web_server/__init__.py +2 -1
  135. esphome/components/esp32_camera_web_server/camera_web_server.cpp +8 -8
  136. esphome/components/esp32_camera_web_server/camera_web_server.h +3 -3
  137. esphome/components/esp32_hall/sensor.py +2 -21
  138. esphome/components/esp32_hosted/__init__.py +101 -0
  139. esphome/components/esp32_hosted/esp32_hosted.py.script +12 -0
  140. esphome/components/esp32_improv/esp32_improv_component.cpp +3 -0
  141. esphome/components/esp32_rmt/__init__.py +0 -58
  142. esphome/components/esp32_rmt_led_strip/led_strip.cpp +77 -63
  143. esphome/components/esp32_rmt_led_strip/led_strip.h +11 -17
  144. esphome/components/esp32_rmt_led_strip/light.py +14 -76
  145. esphome/components/esp32_touch/esp32_touch.h +174 -28
  146. esphome/components/esp32_touch/esp32_touch_common.cpp +162 -0
  147. esphome/components/esp32_touch/esp32_touch_v1.cpp +240 -0
  148. esphome/components/esp32_touch/esp32_touch_v2.cpp +397 -0
  149. esphome/components/esp8266/__init__.py +2 -0
  150. esphome/components/esp8266/gpio.cpp +10 -10
  151. esphome/components/esp8266/helpers.cpp +31 -0
  152. esphome/components/esphome/ota/__init__.py +1 -0
  153. esphome/components/esphome/ota/ota_esphome.cpp +24 -19
  154. esphome/components/ethernet/__init__.py +42 -23
  155. esphome/components/ethernet/esp_eth_phy_jl1101.c +0 -16
  156. esphome/components/ethernet/ethernet_component.cpp +69 -29
  157. esphome/components/ethernet/ethernet_component.h +18 -10
  158. esphome/components/event/__init__.py +5 -2
  159. esphome/components/ezo/ezo.h +0 -1
  160. esphome/components/ezo_pmp/ezo_pmp.h +0 -1
  161. esphome/components/fan/__init__.py +5 -2
  162. esphome/components/feedback/feedback_cover.h +0 -1
  163. esphome/components/font/__init__.py +92 -82
  164. esphome/components/font/font.cpp +9 -2
  165. esphome/components/font/font.h +20 -5
  166. esphome/components/fs3000/fs3000.h +0 -1
  167. esphome/components/gcja5/gcja5.h +0 -1
  168. esphome/components/gl_r01_i2c/__init__.py +0 -0
  169. esphome/components/gl_r01_i2c/gl_r01_i2c.cpp +68 -0
  170. esphome/components/gl_r01_i2c/gl_r01_i2c.h +22 -0
  171. esphome/components/gl_r01_i2c/sensor.py +36 -0
  172. esphome/components/gp8403/gp8403.h +0 -1
  173. esphome/components/gpio/binary_sensor/__init__.py +17 -0
  174. esphome/components/gpio/binary_sensor/gpio_binary_sensor.cpp +77 -3
  175. esphome/components/gpio/binary_sensor/gpio_binary_sensor.h +40 -0
  176. esphome/components/grove_gas_mc_v2/grove_gas_mc_v2.h +0 -2
  177. esphome/components/he60r/he60r.h +0 -1
  178. esphome/components/heatpumpir/climate.py +2 -1
  179. esphome/components/heatpumpir/heatpumpir.cpp +1 -0
  180. esphome/components/heatpumpir/heatpumpir.h +1 -0
  181. esphome/components/honeywellabp2_i2c/honeywellabp2.h +0 -1
  182. esphome/components/host/__init__.py +3 -1
  183. esphome/components/host/helpers.cpp +57 -0
  184. esphome/components/http_request/__init__.py +19 -1
  185. esphome/components/http_request/http_request.h +1 -1
  186. esphome/components/http_request/http_request_arduino.h +1 -0
  187. esphome/components/http_request/ota/ota_http_request.cpp +1 -1
  188. esphome/components/http_request/update/http_request_update.cpp +28 -9
  189. esphome/components/hydreon_rgxx/hydreon_rgxx.cpp +3 -9
  190. esphome/components/hydreon_rgxx/sensor.py +1 -1
  191. esphome/components/i2c/__init__.py +23 -11
  192. esphome/components/i2c/i2c_bus.h +8 -1
  193. esphome/components/i2c/i2c_bus_arduino.cpp +4 -3
  194. esphome/components/i2c/i2c_bus_arduino.h +6 -3
  195. esphome/components/i2c/i2c_bus_esp_idf.h +5 -3
  196. esphome/components/i2c_device/i2c_device.h +0 -1
  197. esphome/components/i2s_audio/__init__.py +2 -10
  198. esphome/components/i2s_audio/i2s_audio.cpp +1 -5
  199. esphome/components/i2s_audio/media_player/__init__.py +2 -2
  200. esphome/components/i2s_audio/speaker/i2s_audio_speaker.cpp +2 -2
  201. esphome/components/iaqcore/iaqcore.h +0 -2
  202. esphome/components/image/__init__.py +123 -24
  203. esphome/components/improv_serial/improv_serial_component.cpp +0 -4
  204. esphome/components/ina219/ina219.cpp +7 -0
  205. esphome/components/ina219/ina219.h +1 -0
  206. esphome/components/ina260/ina260.h +0 -2
  207. esphome/components/inkbird_ibsth1_mini/inkbird_ibsth1_mini.h +0 -1
  208. esphome/components/inkplate6/display.py +15 -0
  209. esphome/components/inkplate6/inkplate.cpp +2 -2
  210. esphome/components/integration/integration_sensor.h +0 -1
  211. esphome/components/internal_temperature/internal_temperature.cpp +8 -27
  212. esphome/components/internal_temperature/sensor.py +0 -26
  213. esphome/components/interval/interval.h +0 -2
  214. esphome/components/ld2410/button/__init__.py +3 -3
  215. esphome/components/ld2410/button/factory_reset_button.cpp +9 -0
  216. esphome/components/ld2410/button/{reset_button.h → factory_reset_button.h} +2 -2
  217. esphome/components/ld2410/ld2410.cpp +421 -268
  218. esphome/components/ld2410/ld2410.h +44 -146
  219. esphome/components/ld2410/number/__init__.py +2 -2
  220. esphome/components/ld2410/sensor.py +1 -1
  221. esphome/components/ld2410/switch/__init__.py +1 -1
  222. esphome/components/ld2420/ld2420.cpp +196 -100
  223. esphome/components/ld2420/ld2420.h +46 -118
  224. esphome/components/ld2420/number/__init__.py +2 -2
  225. esphome/components/ld2420/sensor/__init__.py +6 -2
  226. esphome/components/ld2420/sensor/ld2420_sensor.h +1 -1
  227. esphome/components/ld2450/button/__init__.py +3 -3
  228. esphome/components/ld2450/button/factory_reset_button.cpp +9 -0
  229. esphome/components/ld2450/button/{reset_button.h → factory_reset_button.h} +2 -2
  230. esphome/components/ld2450/ld2450.cpp +384 -232
  231. esphome/components/ld2450/ld2450.h +60 -69
  232. esphome/components/ld2450/switch/__init__.py +1 -1
  233. esphome/components/ledc/ledc_output.cpp +1 -63
  234. esphome/components/libretiny/__init__.py +5 -3
  235. esphome/components/libretiny/const.py +5 -0
  236. esphome/components/libretiny/generate_components.py +1 -0
  237. esphome/components/libretiny/helpers.cpp +35 -0
  238. esphome/components/libretiny/lt_component.cpp +5 -3
  239. esphome/components/light/__init__.py +4 -2
  240. esphome/components/light/addressable_light.h +3 -3
  241. esphome/components/light/light_call.cpp +180 -243
  242. esphome/components/light/light_call.h +72 -20
  243. esphome/components/light/light_color_values.h +14 -14
  244. esphome/components/light/light_state.h +15 -13
  245. esphome/components/light/transformers.h +2 -2
  246. esphome/components/ln882x/__init__.py +52 -0
  247. esphome/components/ln882x/boards.py +285 -0
  248. esphome/components/lock/__init__.py +5 -2
  249. esphome/components/logger/__init__.py +40 -3
  250. esphome/components/logger/logger.cpp +47 -12
  251. esphome/components/logger/logger.h +80 -49
  252. esphome/components/logger/logger_esp32.cpp +3 -3
  253. esphome/components/lps22/__init__.py +0 -0
  254. esphome/components/lps22/lps22.cpp +75 -0
  255. esphome/components/lps22/lps22.h +27 -0
  256. esphome/components/lps22/sensor.py +58 -0
  257. esphome/components/ltr390/ltr390.h +0 -1
  258. esphome/components/ltr501/ltr501.h +0 -1
  259. esphome/components/ltr_als_ps/ltr_als_ps.h +0 -1
  260. esphome/components/lvgl/__init__.py +1 -1
  261. esphome/components/lvgl/schemas.py +66 -6
  262. esphome/components/lvgl/styles.py +24 -16
  263. esphome/components/lvgl/widgets/__init__.py +12 -2
  264. esphome/components/lvgl/widgets/lv_bar.py +40 -19
  265. esphome/components/m5stack_8angle/light/m5stack_8angle_light.cpp +1 -1
  266. esphome/components/max9611/max9611.h +0 -1
  267. esphome/components/mcp23016/__init__.py +1 -1
  268. esphome/components/mcp23xxx_base/__init__.py +1 -1
  269. esphome/components/mcp4461/__init__.py +1 -1
  270. esphome/components/mcp4461/output/__init__.py +3 -2
  271. esphome/components/mcp9600/mcp9600.h +0 -2
  272. esphome/components/md5/md5.cpp +3 -3
  273. esphome/components/md5/md5.h +1 -6
  274. esphome/components/mdns/__init__.py +22 -11
  275. esphome/components/media_player/__init__.py +4 -3
  276. esphome/components/micro_wake_word/__init__.py +1 -5
  277. esphome/components/micro_wake_word/streaming_model.cpp +2 -2
  278. esphome/components/microphone/microphone.cpp +7 -9
  279. esphome/components/microphone/microphone.h +0 -2
  280. esphome/components/mipi_spi/display.py +1 -0
  281. esphome/components/mmc5603/mmc5603.cpp +1 -1
  282. esphome/components/modbus/modbus.cpp +33 -15
  283. esphome/components/modbus/modbus.h +9 -0
  284. esphome/components/modbus_controller/__init__.py +42 -10
  285. esphome/components/modbus_controller/modbus_controller.cpp +92 -11
  286. esphome/components/modbus_controller/modbus_controller.h +61 -7
  287. esphome/components/mopeka_pro_check/mopeka_pro_check.h +0 -1
  288. esphome/components/mopeka_std_check/mopeka_std_check.h +0 -1
  289. esphome/components/mpl3115a2/mpl3115a2.h +0 -2
  290. esphome/components/mqtt/__init__.py +16 -0
  291. esphome/components/mqtt/mqtt_backend.h +2 -1
  292. esphome/components/mqtt/mqtt_backend_esp32.cpp +132 -47
  293. esphome/components/mqtt/mqtt_backend_esp32.h +106 -4
  294. esphome/components/mqtt/mqtt_client.cpp +15 -9
  295. esphome/components/mqtt/mqtt_client.h +8 -3
  296. esphome/components/ms8607/ms8607.h +0 -1
  297. esphome/components/neopixelbus/light.py +4 -1
  298. esphome/components/neopixelbus/neopixelbus_light.h +1 -1
  299. esphome/components/network/__init__.py +4 -1
  300. esphome/components/network/ip_address.h +1 -0
  301. esphome/components/nextion/__init__.py +16 -0
  302. esphome/components/nextion/base_component.py +1 -0
  303. esphome/components/nextion/binary_sensor/nextion_binarysensor.cpp +1 -1
  304. esphome/components/nextion/display.py +14 -4
  305. esphome/components/nextion/nextion.cpp +166 -101
  306. esphome/components/nextion/nextion.h +84 -53
  307. esphome/components/nextion/nextion_commands.cpp +11 -10
  308. esphome/components/nextion/nextion_component.cpp +28 -28
  309. esphome/components/nextion/nextion_component.h +53 -18
  310. esphome/components/nextion/nextion_component_base.h +3 -0
  311. esphome/components/nextion/nextion_upload.cpp +36 -0
  312. esphome/components/nextion/nextion_upload_arduino.cpp +10 -35
  313. esphome/components/nextion/nextion_upload_idf.cpp +9 -33
  314. esphome/components/nextion/sensor/nextion_sensor.cpp +1 -1
  315. esphome/components/nextion/switch/nextion_switch.cpp +1 -1
  316. esphome/components/nextion/text_sensor/nextion_textsensor.cpp +1 -1
  317. esphome/components/nfc/nfc.cpp +3 -22
  318. esphome/components/nfc/nfc.h +3 -3
  319. esphome/components/number/__init__.py +5 -2
  320. esphome/components/online_image/__init__.py +5 -0
  321. esphome/components/online_image/online_image.cpp +6 -2
  322. esphome/components/online_image/online_image.h +4 -1
  323. esphome/components/opentherm/opentherm.cpp +7 -12
  324. esphome/components/openthread/__init__.py +47 -40
  325. esphome/components/openthread/const.py +1 -0
  326. esphome/components/openthread/openthread_esp.cpp +27 -5
  327. esphome/components/opt3001/__init__.py +0 -0
  328. esphome/components/opt3001/opt3001.cpp +122 -0
  329. esphome/components/opt3001/opt3001.h +27 -0
  330. esphome/components/opt3001/sensor.py +35 -0
  331. esphome/components/ota/__init__.py +17 -0
  332. esphome/components/ota/ota_backend.h +27 -1
  333. esphome/components/ota/ota_backend_arduino_esp32.cpp +12 -2
  334. esphome/components/ota/ota_backend_arduino_esp32.h +3 -0
  335. esphome/components/ota/ota_backend_arduino_esp8266.cpp +18 -4
  336. esphome/components/ota/ota_backend_arduino_esp8266.h +3 -0
  337. esphome/components/ota/ota_backend_arduino_libretiny.cpp +12 -2
  338. esphome/components/ota/ota_backend_arduino_libretiny.h +3 -0
  339. esphome/components/ota/ota_backend_arduino_rp2040.cpp +9 -2
  340. esphome/components/ota/ota_backend_arduino_rp2040.h +3 -0
  341. esphome/components/ota/ota_backend_esp_idf.cpp +10 -16
  342. esphome/components/ota/ota_backend_esp_idf.h +1 -0
  343. esphome/components/packages/__init__.py +5 -2
  344. esphome/components/packet_transport/binary_sensor.py +61 -4
  345. esphome/components/packet_transport/packet_transport.cpp +34 -1
  346. esphome/components/packet_transport/packet_transport.h +11 -5
  347. esphome/components/pcf8574/__init__.py +1 -1
  348. esphome/components/pi4ioe5v6408/__init__.py +84 -0
  349. esphome/components/pi4ioe5v6408/pi4ioe5v6408.cpp +171 -0
  350. esphome/components/pi4ioe5v6408/pi4ioe5v6408.h +70 -0
  351. esphome/components/pmsa003i/pmsa003i.h +0 -1
  352. esphome/components/pmsx003/pmsx003.h +0 -1
  353. esphome/components/pn7150/pn7150.cpp +7 -7
  354. esphome/components/pn7150/pn7150.h +0 -1
  355. esphome/components/pn7160/pn7160.cpp +7 -7
  356. esphome/components/pn7160/pn7160.h +0 -1
  357. esphome/components/preferences/syncer.h +2 -0
  358. esphome/components/prometheus/prometheus_handler.h +1 -1
  359. esphome/components/psram/psram.cpp +0 -20
  360. esphome/components/pulse_counter/pulse_counter_sensor.h +0 -1
  361. esphome/components/pulse_meter/pulse_meter_sensor.cpp +8 -4
  362. esphome/components/pulse_width/pulse_width.h +0 -1
  363. esphome/components/pvvx_mithermometer/display/pvvx_display.cpp +0 -4
  364. esphome/components/pvvx_mithermometer/display/pvvx_display.h +0 -2
  365. esphome/components/pvvx_mithermometer/pvvx_mithermometer.h +0 -1
  366. esphome/components/qr_code/__init__.py +13 -10
  367. esphome/components/qwiic_pir/qwiic_pir.h +0 -1
  368. esphome/components/radon_eye_ble/radon_eye_listener.cpp +1 -1
  369. esphome/components/rc522/rc522.h +0 -1
  370. esphome/components/rdm6300/rdm6300.h +0 -2
  371. esphome/components/remote_base/__init__.py +7 -5
  372. esphome/components/remote_base/remote_base.cpp +24 -21
  373. esphome/components/remote_base/remote_base.h +3 -26
  374. esphome/components/remote_receiver/__init__.py +40 -46
  375. esphome/components/remote_receiver/remote_receiver.h +4 -18
  376. esphome/components/remote_receiver/remote_receiver_esp32.cpp +0 -87
  377. esphome/components/remote_receiver/remote_receiver_esp8266.cpp +1 -1
  378. esphome/components/remote_transmitter/__init__.py +42 -43
  379. esphome/components/remote_transmitter/remote_transmitter.h +2 -14
  380. esphome/components/remote_transmitter/remote_transmitter_esp32.cpp +0 -77
  381. esphome/components/resistance/resistance_sensor.h +0 -1
  382. esphome/components/rp2040/__init__.py +2 -0
  383. esphome/components/rp2040/helpers.cpp +55 -0
  384. esphome/components/rp2040_pio_led_strip/led_strip.cpp +2 -2
  385. esphome/components/rpi_dpi_rgb/rpi_dpi_rgb.cpp +0 -4
  386. esphome/components/rtttl/__init__.py +4 -4
  387. esphome/components/rtttl/rtttl.cpp +10 -1
  388. esphome/components/ruuvitag/ruuvitag.h +0 -1
  389. esphome/components/safe_mode/safe_mode.cpp +2 -0
  390. esphome/components/safe_mode/safe_mode.h +4 -1
  391. esphome/components/scd30/scd30.h +0 -1
  392. esphome/components/scd30/sensor.py +2 -2
  393. esphome/components/scd4x/scd4x.cpp +61 -54
  394. esphome/components/scd4x/scd4x.h +17 -15
  395. esphome/components/scd4x/sensor.py +4 -4
  396. esphome/components/script/script.h +0 -2
  397. esphome/components/sdp3x/sensor.py +1 -1
  398. esphome/components/select/__init__.py +5 -2
  399. esphome/components/sen5x/sen5x.h +0 -1
  400. esphome/components/senseair/senseair.h +0 -1
  401. esphome/components/sensor/__init__.py +4 -2
  402. esphome/components/sensor/filter.cpp +1 -1
  403. esphome/components/sensor/sensor.cpp +12 -6
  404. esphome/components/sensor/sensor.h +13 -5
  405. esphome/components/servo/servo.h +0 -1
  406. esphome/components/sfa30/sfa30.h +0 -1
  407. esphome/components/sgp30/sgp30.h +0 -1
  408. esphome/components/sgp4x/sgp4x.h +0 -1
  409. esphome/components/shelly_dimmer/stm32flash.cpp +1 -2
  410. esphome/components/sht4x/sht4x.h +0 -1
  411. esphome/components/sm300d2/sm300d2.h +0 -2
  412. esphome/components/smt100/sensor.py +8 -4
  413. esphome/components/smt100/smt100.cpp +5 -5
  414. esphome/components/smt100/smt100.h +3 -3
  415. esphome/components/sn74hc595/__init__.py +1 -1
  416. esphome/components/sn74hc595/sn74hc595.cpp +5 -4
  417. esphome/components/sntp/sntp_component.cpp +9 -3
  418. esphome/components/sntp/time.py +2 -0
  419. esphome/components/socket/__init__.py +17 -0
  420. esphome/components/spi/__init__.py +27 -6
  421. esphome/components/spi/spi.cpp +3 -2
  422. esphome/components/spi/spi.h +9 -3
  423. esphome/components/spi/spi_arduino.cpp +3 -5
  424. esphome/components/spi/spi_esp_idf.cpp +40 -21
  425. esphome/components/spi_led_strip/spi_led_strip.cpp +1 -1
  426. esphome/components/sps30/sps30.h +0 -1
  427. esphome/components/ssd1306_base/ssd1306_base.cpp +1 -1
  428. esphome/components/st7701s/st7701s.cpp +0 -4
  429. esphome/components/status/status_binary_sensor.h +0 -2
  430. esphome/components/substitutions/__init__.py +76 -19
  431. esphome/components/substitutions/jinja.py +99 -0
  432. esphome/components/sun/sun.cpp +3 -4
  433. esphome/components/switch/__init__.py +5 -2
  434. esphome/components/switch/binary_sensor/switch_binary_sensor.h +0 -1
  435. esphome/components/sx126x/__init__.py +317 -0
  436. esphome/components/sx126x/automation.h +62 -0
  437. esphome/components/sx126x/packet_transport/__init__.py +26 -0
  438. esphome/components/sx126x/packet_transport/sx126x_transport.cpp +26 -0
  439. esphome/components/sx126x/packet_transport/sx126x_transport.h +25 -0
  440. esphome/components/sx126x/sx126x.cpp +523 -0
  441. esphome/components/sx126x/sx126x.h +140 -0
  442. esphome/components/sx126x/sx126x_reg.h +163 -0
  443. esphome/components/sx127x/__init__.py +325 -0
  444. esphome/components/sx127x/automation.h +62 -0
  445. esphome/components/sx127x/packet_transport/__init__.py +26 -0
  446. esphome/components/sx127x/packet_transport/sx127x_transport.cpp +26 -0
  447. esphome/components/sx127x/packet_transport/sx127x_transport.h +25 -0
  448. esphome/components/sx127x/sx127x.cpp +498 -0
  449. esphome/components/sx127x/sx127x.h +128 -0
  450. esphome/components/sx127x/sx127x_reg.h +295 -0
  451. esphome/components/syslog/esphome_syslog.cpp +5 -3
  452. esphome/components/syslog/esphome_syslog.h +1 -1
  453. esphome/components/tca9555/__init__.py +1 -1
  454. esphome/components/template/binary_sensor/template_binary_sensor.cpp +1 -9
  455. esphome/components/text/__init__.py +5 -2
  456. esphome/components/text_sensor/__init__.py +5 -2
  457. esphome/components/thermostat/thermostat_climate.cpp +34 -31
  458. esphome/components/thermostat/thermostat_climate.h +43 -39
  459. esphome/components/time/__init__.py +16 -2
  460. esphome/components/time/real_time_clock.cpp +4 -0
  461. esphome/components/time/real_time_clock.h +5 -1
  462. esphome/components/tlc5971/tlc5971.cpp +4 -1
  463. esphome/components/tmp1075/tmp1075.h +0 -2
  464. esphome/components/tof10120/tof10120_sensor.h +0 -1
  465. esphome/components/tormatic/tormatic_cover.h +0 -1
  466. esphome/components/total_daily_energy/total_daily_energy.h +0 -1
  467. esphome/components/tsl2591/tsl2591.cpp +1 -1
  468. esphome/components/ttp229_bsf/ttp229_bsf.h +0 -1
  469. esphome/components/ttp229_lsf/ttp229_lsf.h +0 -1
  470. esphome/components/tx20/tx20.cpp +2 -2
  471. esphome/components/uart/__init__.py +18 -0
  472. esphome/components/uart/uart_component_esp_idf.cpp +0 -4
  473. esphome/components/update/__init__.py +5 -2
  474. esphome/components/update/update_entity.h +8 -0
  475. esphome/components/usb_host/__init__.py +5 -2
  476. esphome/components/usb_host/usb_host_client.cpp +10 -10
  477. esphome/components/usb_uart/cp210x.cpp +1 -1
  478. esphome/components/usb_uart/usb_uart.cpp +41 -44
  479. esphome/components/usb_uart/usb_uart.h +4 -3
  480. esphome/components/valve/__init__.py +5 -2
  481. esphome/components/vbus/vbus.h +0 -1
  482. esphome/components/veml3235/veml3235.h +0 -1
  483. esphome/components/veml7700/veml7700.h +0 -1
  484. esphome/components/vl53l0x/vl53l0x_sensor.h +0 -1
  485. esphome/components/voice_assistant/voice_assistant.cpp +4 -4
  486. esphome/components/watchdog/watchdog.cpp +0 -4
  487. esphome/components/waveshare_epaper/waveshare_epaper.cpp +6 -6
  488. esphome/components/web_server/__init__.py +34 -19
  489. esphome/components/web_server/ota/__init__.py +32 -0
  490. esphome/components/web_server/ota/ota_web_server.cpp +210 -0
  491. esphome/components/web_server/ota/ota_web_server.h +26 -0
  492. esphome/components/web_server/web_server.cpp +305 -427
  493. esphome/components/web_server/web_server.h +33 -23
  494. esphome/components/web_server/web_server_v1.cpp +4 -5
  495. esphome/components/web_server_base/__init__.py +5 -2
  496. esphome/components/web_server_base/web_server_base.cpp +2 -94
  497. esphome/components/web_server_base/web_server_base.h +5 -25
  498. esphome/components/web_server_idf/multipart.cpp +254 -0
  499. esphome/components/web_server_idf/multipart.h +86 -0
  500. esphome/components/web_server_idf/utils.cpp +32 -0
  501. esphome/components/web_server_idf/utils.h +10 -0
  502. esphome/components/web_server_idf/web_server_idf.cpp +162 -16
  503. esphome/components/web_server_idf/web_server_idf.h +11 -10
  504. esphome/components/wiegand/wiegand.cpp +2 -2
  505. esphome/components/wifi/__init__.py +18 -0
  506. esphome/components/wifi/wifi_component.cpp +17 -22
  507. esphome/components/wifi/wifi_component.h +27 -23
  508. esphome/components/wifi/wifi_component_esp32_arduino.cpp +52 -59
  509. esphome/components/wifi/wifi_component_esp8266.cpp +46 -46
  510. esphome/components/wifi/wifi_component_esp_idf.cpp +35 -36
  511. esphome/components/wifi/wifi_component_libretiny.cpp +26 -27
  512. esphome/components/wifi/wifi_component_pico_w.cpp +3 -3
  513. esphome/components/wifi_info/wifi_info_text_sensor.cpp +6 -6
  514. esphome/components/wireguard/__init__.py +2 -11
  515. esphome/components/xiaomi_ble/xiaomi_ble.cpp +13 -1
  516. esphome/components/xiaomi_ble/xiaomi_ble.h +1 -0
  517. esphome/components/xiaomi_cgd1/xiaomi_cgd1.h +0 -1
  518. esphome/components/xiaomi_cgdk2/xiaomi_cgdk2.h +0 -1
  519. esphome/components/xiaomi_cgg1/xiaomi_cgg1.h +0 -1
  520. esphome/components/xiaomi_cgpr1/xiaomi_cgpr1.h +0 -1
  521. esphome/components/xiaomi_gcls002/xiaomi_gcls002.h +0 -1
  522. esphome/components/xiaomi_hhccjcy01/xiaomi_hhccjcy01.h +0 -1
  523. esphome/components/xiaomi_hhccjcy10/xiaomi_hhccjcy10.h +0 -1
  524. esphome/components/xiaomi_hhccpot002/xiaomi_hhccpot002.h +0 -1
  525. esphome/components/xiaomi_jqjcy01ym/xiaomi_jqjcy01ym.h +0 -1
  526. esphome/components/xiaomi_lywsd02/xiaomi_lywsd02.h +0 -1
  527. esphome/components/xiaomi_lywsd02mmc/xiaomi_lywsd02mmc.h +0 -1
  528. esphome/components/xiaomi_lywsd03mmc/xiaomi_lywsd03mmc.h +0 -1
  529. esphome/components/xiaomi_lywsdcgq/xiaomi_lywsdcgq.h +0 -1
  530. esphome/components/xiaomi_mhoc303/xiaomi_mhoc303.h +0 -1
  531. esphome/components/xiaomi_mhoc401/xiaomi_mhoc401.h +0 -1
  532. esphome/components/xiaomi_miscale/xiaomi_miscale.h +0 -1
  533. esphome/components/xiaomi_mjyd02yla/xiaomi_mjyd02yla.h +0 -1
  534. esphome/components/xiaomi_mue4094rt/xiaomi_mue4094rt.h +0 -1
  535. esphome/components/xiaomi_rtcgq02lm/xiaomi_rtcgq02lm.h +0 -1
  536. esphome/components/xiaomi_wx08zm/xiaomi_wx08zm.h +0 -1
  537. esphome/components/xiaomi_xmwsdj04mmc/__init__.py +0 -0
  538. esphome/components/xiaomi_xmwsdj04mmc/sensor.py +77 -0
  539. esphome/components/xiaomi_xmwsdj04mmc/xiaomi_xmwsdj04mmc.cpp +77 -0
  540. esphome/components/xiaomi_xmwsdj04mmc/xiaomi_xmwsdj04mmc.h +36 -0
  541. esphome/components/zio_ultrasonic/zio_ultrasonic.h +0 -2
  542. esphome/components/zyaura/zyaura.h +0 -1
  543. esphome/config.py +88 -22
  544. esphome/config_helpers.py +74 -1
  545. esphome/config_validation.py +12 -1
  546. esphome/const.py +65 -10
  547. esphome/core/__init__.py +18 -2
  548. esphome/core/application.cpp +163 -10
  549. esphome/core/application.h +145 -165
  550. esphome/core/area.h +19 -0
  551. esphome/core/automation.h +58 -9
  552. esphome/core/color.cpp +3 -5
  553. esphome/core/color.h +16 -16
  554. esphome/core/component.cpp +151 -18
  555. esphome/core/component.h +98 -4
  556. esphome/core/component_iterator.cpp +11 -9
  557. esphome/core/component_iterator.h +12 -10
  558. esphome/core/config.py +155 -6
  559. esphome/core/controller.cpp +4 -2
  560. esphome/core/controller.h +1 -1
  561. esphome/core/datatypes.h +2 -2
  562. esphome/core/defines.h +17 -2
  563. esphome/core/device.h +20 -0
  564. esphome/core/entity_base.cpp +20 -15
  565. esphome/core/entity_base.h +76 -0
  566. esphome/core/entity_helpers.py +168 -1
  567. esphome/core/event_pool.h +81 -0
  568. esphome/core/helpers.cpp +75 -230
  569. esphome/core/helpers.h +164 -104
  570. esphome/core/lock_free_queue.h +151 -0
  571. esphome/core/log.cpp +2 -2
  572. esphome/core/log.h +2 -0
  573. esphome/core/optional.h +5 -0
  574. esphome/core/ring_buffer.cpp +2 -2
  575. esphome/core/scheduler.cpp +275 -103
  576. esphome/core/scheduler.h +154 -17
  577. esphome/core/time.cpp +5 -5
  578. esphome/core/time.h +5 -5
  579. esphome/cpp_generator.py +17 -0
  580. esphome/cpp_helpers.py +0 -22
  581. esphome/cpp_types.py +3 -1
  582. esphome/dashboard/entries.py +1 -1
  583. esphome/dashboard/util/text.py +5 -21
  584. esphome/dashboard/web_server.py +9 -1
  585. esphome/helpers.py +47 -0
  586. esphome/loader.py +15 -1
  587. esphome/pins.py +14 -8
  588. esphome/wizard.py +17 -4
  589. esphome/writer.py +21 -3
  590. esphome/yaml_util.py +0 -2
  591. {esphome-2025.6.3.dist-info → esphome-2025.7.0b2.dist-info}/METADATA +10 -9
  592. {esphome-2025.6.3.dist-info → esphome-2025.7.0b2.dist-info}/RECORD +597 -538
  593. esphome/components/api/api_pb2_size.h +0 -361
  594. esphome/components/esp32_ble/ble_event_pool.h +0 -72
  595. esphome/components/esp32_ble/queue.h +0 -85
  596. esphome/components/esp32_hall/esp32_hall.cpp +0 -25
  597. esphome/components/esp32_hall/esp32_hall.h +0 -23
  598. esphome/components/esp32_touch/esp32_touch.cpp +0 -355
  599. esphome/components/ld2410/button/reset_button.cpp +0 -9
  600. esphome/components/ld2450/button/reset_button.cpp +0 -9
  601. esphome/components/openthread/tlv.py +0 -65
  602. /esphome/{dashboard/enum.py → enum.py} +0 -0
  603. {esphome-2025.6.3.dist-info → esphome-2025.7.0b2.dist-info}/WHEEL +0 -0
  604. {esphome-2025.6.3.dist-info → esphome-2025.7.0b2.dist-info}/entry_points.txt +0 -0
  605. {esphome-2025.6.3.dist-info → esphome-2025.7.0b2.dist-info}/licenses/LICENSE +0 -0
  606. {esphome-2025.6.3.dist-info → esphome-2025.7.0b2.dist-info}/top_level.txt +0 -0
@@ -6,6 +6,7 @@
6
6
  #include <string>
7
7
  #include "esphome/core/helpers.h"
8
8
  #include "esphome/core/log.h"
9
+ #include "esphome/core/application.h"
9
10
 
10
11
  namespace esphome {
11
12
  namespace mqtt {
@@ -13,49 +14,6 @@ namespace mqtt {
13
14
  static const char *const TAG = "mqtt.idf";
14
15
 
15
16
  bool MQTTBackendESP32::initialize_() {
16
- #if ESP_IDF_VERSION_MAJOR < 5
17
- mqtt_cfg_.user_context = (void *) this;
18
- mqtt_cfg_.buffer_size = MQTT_BUFFER_SIZE;
19
-
20
- mqtt_cfg_.host = this->host_.c_str();
21
- mqtt_cfg_.port = this->port_;
22
- mqtt_cfg_.keepalive = this->keep_alive_;
23
- mqtt_cfg_.disable_clean_session = !this->clean_session_;
24
-
25
- if (!this->username_.empty()) {
26
- mqtt_cfg_.username = this->username_.c_str();
27
- if (!this->password_.empty()) {
28
- mqtt_cfg_.password = this->password_.c_str();
29
- }
30
- }
31
-
32
- if (!this->lwt_topic_.empty()) {
33
- mqtt_cfg_.lwt_topic = this->lwt_topic_.c_str();
34
- this->mqtt_cfg_.lwt_qos = this->lwt_qos_;
35
- this->mqtt_cfg_.lwt_retain = this->lwt_retain_;
36
-
37
- if (!this->lwt_message_.empty()) {
38
- mqtt_cfg_.lwt_msg = this->lwt_message_.c_str();
39
- mqtt_cfg_.lwt_msg_len = this->lwt_message_.size();
40
- }
41
- }
42
-
43
- if (!this->client_id_.empty()) {
44
- mqtt_cfg_.client_id = this->client_id_.c_str();
45
- }
46
- if (ca_certificate_.has_value()) {
47
- mqtt_cfg_.cert_pem = ca_certificate_.value().c_str();
48
- mqtt_cfg_.skip_cert_common_name_check = skip_cert_cn_check_;
49
- mqtt_cfg_.transport = MQTT_TRANSPORT_OVER_SSL;
50
-
51
- if (this->cl_certificate_.has_value() && this->cl_key_.has_value()) {
52
- mqtt_cfg_.client_cert_pem = this->cl_certificate_.value().c_str();
53
- mqtt_cfg_.client_key_pem = this->cl_key_.value().c_str();
54
- }
55
- } else {
56
- mqtt_cfg_.transport = MQTT_TRANSPORT_OVER_TCP;
57
- }
58
- #else
59
17
  mqtt_cfg_.broker.address.hostname = this->host_.c_str();
60
18
  mqtt_cfg_.broker.address.port = this->port_;
61
19
  mqtt_cfg_.session.keepalive = this->keep_alive_;
@@ -94,15 +52,30 @@ bool MQTTBackendESP32::initialize_() {
94
52
  } else {
95
53
  mqtt_cfg_.broker.address.transport = MQTT_TRANSPORT_OVER_TCP;
96
54
  }
97
- #endif
55
+
98
56
  auto *mqtt_client = esp_mqtt_client_init(&mqtt_cfg_);
99
57
  if (mqtt_client) {
100
58
  handler_.reset(mqtt_client);
101
59
  is_initalized_ = true;
102
60
  esp_mqtt_client_register_event(mqtt_client, MQTT_EVENT_ANY, mqtt_event_handler, this);
61
+ #if defined(USE_MQTT_IDF_ENQUEUE)
62
+ // Create the task only after MQTT client is initialized successfully
63
+ // Use larger stack size when TLS is enabled
64
+ size_t stack_size = this->ca_certificate_.has_value() ? TASK_STACK_SIZE_TLS : TASK_STACK_SIZE;
65
+ xTaskCreate(esphome_mqtt_task, "esphome_mqtt", stack_size, (void *) this, TASK_PRIORITY, &this->task_handle_);
66
+ if (this->task_handle_ == nullptr) {
67
+ ESP_LOGE(TAG, "Failed to create MQTT task");
68
+ // Clean up MQTT client since we can't start the async task
69
+ handler_.reset();
70
+ is_initalized_ = false;
71
+ return false;
72
+ }
73
+ // Set the task handle so the queue can notify it
74
+ this->mqtt_queue_.set_task_to_notify(this->task_handle_);
75
+ #endif
103
76
  return true;
104
77
  } else {
105
- ESP_LOGE(TAG, "Failed to initialize IDF-MQTT");
78
+ ESP_LOGE(TAG, "Failed to init client");
106
79
  return false;
107
80
  }
108
81
  }
@@ -115,6 +88,26 @@ void MQTTBackendESP32::loop() {
115
88
  mqtt_event_handler_(event);
116
89
  mqtt_events_.pop();
117
90
  }
91
+
92
+ #if defined(USE_MQTT_IDF_ENQUEUE)
93
+ // Periodically log dropped messages to avoid blocking during spikes.
94
+ // During high load, many messages can be dropped in quick succession.
95
+ // Logging each drop immediately would flood the logs and potentially
96
+ // cause more drops if MQTT logging is enabled (cascade effect).
97
+ // Instead, we accumulate the count and log a summary periodically.
98
+ // IMPORTANT: Don't move this to the scheduler - if drops are due to memory
99
+ // pressure, the scheduler's heap allocations would make things worse.
100
+ uint32_t now = App.get_loop_component_start_time();
101
+ // Handle rollover: (now - last_time) works correctly with unsigned arithmetic
102
+ // even when now < last_time due to rollover
103
+ if ((now - this->last_dropped_log_time_) >= DROP_LOG_INTERVAL_MS) {
104
+ uint16_t dropped = this->mqtt_queue_.get_and_reset_dropped_count();
105
+ if (dropped > 0) {
106
+ ESP_LOGW(TAG, "Dropped %u messages (%us)", dropped, DROP_LOG_INTERVAL_MS / 1000);
107
+ }
108
+ this->last_dropped_log_time_ = now;
109
+ }
110
+ #endif
118
111
  }
119
112
 
120
113
  void MQTTBackendESP32::mqtt_event_handler_(const Event &event) {
@@ -127,12 +120,20 @@ void MQTTBackendESP32::mqtt_event_handler_(const Event &event) {
127
120
  case MQTT_EVENT_CONNECTED:
128
121
  ESP_LOGV(TAG, "MQTT_EVENT_CONNECTED");
129
122
  this->is_connected_ = true;
123
+ #if defined(USE_MQTT_IDF_ENQUEUE)
124
+ this->last_dropped_log_time_ = 0;
125
+ xTaskNotifyGive(this->task_handle_);
126
+ #endif
130
127
  this->on_connect_.call(event.session_present);
131
128
  break;
132
129
  case MQTT_EVENT_DISCONNECTED:
133
130
  ESP_LOGV(TAG, "MQTT_EVENT_DISCONNECTED");
134
131
  // TODO is there a way to get the disconnect reason?
135
132
  this->is_connected_ = false;
133
+ #if defined(USE_MQTT_IDF_ENQUEUE)
134
+ this->last_dropped_log_time_ = 0;
135
+ xTaskNotifyGive(this->task_handle_);
136
+ #endif
136
137
  this->on_disconnect_.call(MQTTClientDisconnectReason::TCP_DISCONNECTED);
137
138
  break;
138
139
 
@@ -152,11 +153,15 @@ void MQTTBackendESP32::mqtt_event_handler_(const Event &event) {
152
153
  case MQTT_EVENT_DATA: {
153
154
  static std::string topic;
154
155
  if (!event.topic.empty()) {
156
+ // When a single message arrives as multiple chunks, the topic will be empty
157
+ // on any but the first message, leading to event.topic being an empty string.
158
+ // To ensure handlers get the correct topic, cache the last seen topic to
159
+ // simulate always receiving the topic from underlying library
155
160
  topic = event.topic;
156
161
  }
157
162
  ESP_LOGV(TAG, "MQTT_EVENT_DATA %s", topic.c_str());
158
- this->on_message_.call(!event.topic.empty() ? topic.c_str() : nullptr, event.data.data(), event.data.size(),
159
- event.current_data_offset, event.total_data_len);
163
+ this->on_message_.call(topic.c_str(), event.data.data(), event.data.size(), event.current_data_offset,
164
+ event.total_data_len);
160
165
  } break;
161
166
  case MQTT_EVENT_ERROR:
162
167
  ESP_LOGE(TAG, "MQTT_EVENT_ERROR");
@@ -188,6 +193,86 @@ void MQTTBackendESP32::mqtt_event_handler(void *handler_args, esp_event_base_t b
188
193
  }
189
194
  }
190
195
 
196
+ #if defined(USE_MQTT_IDF_ENQUEUE)
197
+ void MQTTBackendESP32::esphome_mqtt_task(void *params) {
198
+ MQTTBackendESP32 *this_mqtt = (MQTTBackendESP32 *) params;
199
+
200
+ while (true) {
201
+ // Wait for notification indefinitely
202
+ ulTaskNotifyTake(pdTRUE, portMAX_DELAY);
203
+
204
+ // Process all queued items
205
+ struct QueueElement *elem;
206
+ while ((elem = this_mqtt->mqtt_queue_.pop()) != nullptr) {
207
+ if (this_mqtt->is_connected_) {
208
+ switch (elem->type) {
209
+ case MQTT_QUEUE_TYPE_SUBSCRIBE:
210
+ esp_mqtt_client_subscribe(this_mqtt->handler_.get(), elem->topic, elem->qos);
211
+ break;
212
+
213
+ case MQTT_QUEUE_TYPE_UNSUBSCRIBE:
214
+ esp_mqtt_client_unsubscribe(this_mqtt->handler_.get(), elem->topic);
215
+ break;
216
+
217
+ case MQTT_QUEUE_TYPE_PUBLISH:
218
+ esp_mqtt_client_publish(this_mqtt->handler_.get(), elem->topic, elem->payload, elem->payload_len, elem->qos,
219
+ elem->retain);
220
+ break;
221
+
222
+ default:
223
+ ESP_LOGE(TAG, "Invalid operation type from MQTT queue");
224
+ break;
225
+ }
226
+ }
227
+ this_mqtt->mqtt_event_pool_.release(elem);
228
+ }
229
+ }
230
+
231
+ // Clean up any remaining items in the queue
232
+ struct QueueElement *elem;
233
+ while ((elem = this_mqtt->mqtt_queue_.pop()) != nullptr) {
234
+ this_mqtt->mqtt_event_pool_.release(elem);
235
+ }
236
+
237
+ // Note: EventPool destructor will clean up the pool itself
238
+ // Task will delete itself
239
+ vTaskDelete(nullptr);
240
+ }
241
+
242
+ bool MQTTBackendESP32::enqueue_(MqttQueueTypeT type, const char *topic, int qos, bool retain, const char *payload,
243
+ size_t len) {
244
+ auto *elem = this->mqtt_event_pool_.allocate();
245
+
246
+ if (!elem) {
247
+ // Queue is full - increment counter but don't log immediately.
248
+ // Logging here can cause a cascade effect: if MQTT logging is enabled,
249
+ // each dropped message would generate a log message, which could itself
250
+ // be sent via MQTT, causing more drops and more logs in a feedback loop
251
+ // that eventually triggers a watchdog reset. Instead, we log periodically
252
+ // in loop() to prevent blocking the event loop during spikes.
253
+ this->mqtt_queue_.increment_dropped_count();
254
+ return false;
255
+ }
256
+
257
+ elem->type = type;
258
+ elem->qos = qos;
259
+ elem->retain = retain;
260
+
261
+ // Use the helper to allocate and copy data
262
+ if (!elem->set_data(topic, payload, len)) {
263
+ // Allocation failed, return elem to pool
264
+ this->mqtt_event_pool_.release(elem);
265
+ // Increment counter without logging to avoid cascade effect during memory pressure
266
+ this->mqtt_queue_.increment_dropped_count();
267
+ return false;
268
+ }
269
+
270
+ // Push to queue - always succeeds since we allocated from the pool
271
+ this->mqtt_queue_.push(elem);
272
+ return true;
273
+ }
274
+ #endif // USE_MQTT_IDF_ENQUEUE
275
+
191
276
  } // namespace mqtt
192
277
  } // namespace esphome
193
278
  #endif // USE_ESP32
@@ -6,9 +6,14 @@
6
6
 
7
7
  #include <string>
8
8
  #include <queue>
9
+ #include <cstring>
9
10
  #include <mqtt_client.h>
11
+ #include <freertos/FreeRTOS.h>
12
+ #include <freertos/task.h>
10
13
  #include "esphome/components/network/ip_address.h"
11
14
  #include "esphome/core/helpers.h"
15
+ #include "esphome/core/lock_free_queue.h"
16
+ #include "esphome/core/event_pool.h"
12
17
 
13
18
  namespace esphome {
14
19
  namespace mqtt {
@@ -42,9 +47,79 @@ struct Event {
42
47
  error_handle(*event.error_handle) {}
43
48
  };
44
49
 
50
+ enum MqttQueueTypeT : uint8_t {
51
+ MQTT_QUEUE_TYPE_NONE = 0,
52
+ MQTT_QUEUE_TYPE_SUBSCRIBE,
53
+ MQTT_QUEUE_TYPE_UNSUBSCRIBE,
54
+ MQTT_QUEUE_TYPE_PUBLISH,
55
+ };
56
+
57
+ struct QueueElement {
58
+ char *topic;
59
+ char *payload;
60
+ uint16_t payload_len; // MQTT max payload is 64KiB
61
+ uint8_t type : 2;
62
+ uint8_t qos : 2; // QoS only needs values 0-2
63
+ uint8_t retain : 1;
64
+ uint8_t reserved : 3; // Reserved for future use
65
+
66
+ QueueElement() : topic(nullptr), payload(nullptr), payload_len(0), qos(0), retain(0), reserved(0) {}
67
+
68
+ // Helper to set topic/payload (uses RAMAllocator)
69
+ bool set_data(const char *topic_str, const char *payload_data, size_t len) {
70
+ // Check payload size limit (MQTT max is 64KiB)
71
+ if (len > std::numeric_limits<uint16_t>::max()) {
72
+ return false;
73
+ }
74
+
75
+ // Use RAMAllocator with default flags (tries external RAM first, falls back to internal)
76
+ RAMAllocator<char> allocator;
77
+
78
+ // Allocate and copy topic
79
+ size_t topic_len = strlen(topic_str) + 1;
80
+ topic = allocator.allocate(topic_len);
81
+ if (!topic)
82
+ return false;
83
+ memcpy(topic, topic_str, topic_len);
84
+
85
+ if (payload_data && len) {
86
+ payload = allocator.allocate(len);
87
+ if (!payload) {
88
+ allocator.deallocate(topic, topic_len);
89
+ topic = nullptr;
90
+ return false;
91
+ }
92
+ memcpy(payload, payload_data, len);
93
+ payload_len = static_cast<uint16_t>(len);
94
+ } else {
95
+ payload = nullptr;
96
+ payload_len = 0;
97
+ }
98
+ return true;
99
+ }
100
+
101
+ // Helper to release (uses RAMAllocator)
102
+ void release() {
103
+ RAMAllocator<char> allocator;
104
+ if (topic) {
105
+ allocator.deallocate(topic, strlen(topic) + 1);
106
+ topic = nullptr;
107
+ }
108
+ if (payload) {
109
+ allocator.deallocate(payload, payload_len);
110
+ payload = nullptr;
111
+ }
112
+ payload_len = 0;
113
+ }
114
+ };
115
+
45
116
  class MQTTBackendESP32 final : public MQTTBackend {
46
117
  public:
47
118
  static const size_t MQTT_BUFFER_SIZE = 4096;
119
+ static const size_t TASK_STACK_SIZE = 3072;
120
+ static const size_t TASK_STACK_SIZE_TLS = 4096; // Larger stack for TLS operations
121
+ static const ssize_t TASK_PRIORITY = 5;
122
+ static const uint8_t MQTT_QUEUE_LENGTH = 30; // 30*12 bytes = 360
48
123
 
49
124
  void set_keep_alive(uint16_t keep_alive) final { this->keep_alive_ = keep_alive; }
50
125
  void set_client_id(const char *client_id) final { this->client_id_ = client_id; }
@@ -105,15 +180,23 @@ class MQTTBackendESP32 final : public MQTTBackend {
105
180
  }
106
181
 
107
182
  bool subscribe(const char *topic, uint8_t qos) final {
183
+ #if defined(USE_MQTT_IDF_ENQUEUE)
184
+ return enqueue_(MQTT_QUEUE_TYPE_SUBSCRIBE, topic, qos);
185
+ #else
108
186
  return esp_mqtt_client_subscribe(handler_.get(), topic, qos) != -1;
187
+ #endif
188
+ }
189
+ bool unsubscribe(const char *topic) final {
190
+ #if defined(USE_MQTT_IDF_ENQUEUE)
191
+ return enqueue_(MQTT_QUEUE_TYPE_UNSUBSCRIBE, topic);
192
+ #else
193
+ return esp_mqtt_client_unsubscribe(handler_.get(), topic) != -1;
194
+ #endif
109
195
  }
110
- bool unsubscribe(const char *topic) final { return esp_mqtt_client_unsubscribe(handler_.get(), topic) != -1; }
111
196
 
112
197
  bool publish(const char *topic, const char *payload, size_t length, uint8_t qos, bool retain) final {
113
198
  #if defined(USE_MQTT_IDF_ENQUEUE)
114
- // use the non-blocking version
115
- // it can delay sending a couple of seconds but won't block
116
- return esp_mqtt_client_enqueue(handler_.get(), topic, payload, length, qos, retain, true) != -1;
199
+ return enqueue_(MQTT_QUEUE_TYPE_PUBLISH, topic, qos, retain, payload, length);
117
200
  #else
118
201
  // might block for several seconds, either due to network timeout (10s)
119
202
  // or if publishing payloads longer than internal buffer (due to message fragmentation)
@@ -129,6 +212,12 @@ class MQTTBackendESP32 final : public MQTTBackend {
129
212
  void set_cl_key(const std::string &key) { cl_key_ = key; }
130
213
  void set_skip_cert_cn_check(bool skip_check) { skip_cert_cn_check_ = skip_check; }
131
214
 
215
+ // No destructor needed: ESPHome components live for the entire device runtime.
216
+ // The MQTT task and queue will run until the device reboots or loses power,
217
+ // at which point the entire process terminates and FreeRTOS cleans up all tasks.
218
+ // Implementing a destructor would add complexity and potential race conditions
219
+ // for a scenario that never occurs in practice.
220
+
132
221
  protected:
133
222
  bool initialize_();
134
223
  void mqtt_event_handler_(const Event &event);
@@ -160,6 +249,14 @@ class MQTTBackendESP32 final : public MQTTBackend {
160
249
  optional<std::string> cl_certificate_;
161
250
  optional<std::string> cl_key_;
162
251
  bool skip_cert_cn_check_{false};
252
+ #if defined(USE_MQTT_IDF_ENQUEUE)
253
+ static void esphome_mqtt_task(void *params);
254
+ EventPool<struct QueueElement, MQTT_QUEUE_LENGTH> mqtt_event_pool_;
255
+ NotifyingLockFreeQueue<struct QueueElement, MQTT_QUEUE_LENGTH> mqtt_queue_;
256
+ TaskHandle_t task_handle_{nullptr};
257
+ bool enqueue_(MqttQueueTypeT type, const char *topic, int qos = 0, bool retain = false, const char *payload = NULL,
258
+ size_t len = 0);
259
+ #endif
163
260
 
164
261
  // callbacks
165
262
  CallbackManager<on_connect_callback_t> on_connect_;
@@ -169,6 +266,11 @@ class MQTTBackendESP32 final : public MQTTBackend {
169
266
  CallbackManager<on_message_callback_t> on_message_;
170
267
  CallbackManager<on_publish_user_callback_t> on_publish_;
171
268
  std::queue<Event> mqtt_events_;
269
+
270
+ #if defined(USE_MQTT_IDF_ENQUEUE)
271
+ uint32_t last_dropped_log_time_{0};
272
+ static constexpr uint32_t DROP_LOG_INTERVAL_MS = 10000; // Log every 10 seconds
273
+ #endif
172
274
  };
173
275
 
174
276
  } // namespace mqtt
@@ -57,14 +57,15 @@ void MQTTClientComponent::setup() {
57
57
  });
58
58
  #ifdef USE_LOGGER
59
59
  if (this->is_log_message_enabled() && logger::global_logger != nullptr) {
60
- logger::global_logger->add_on_log_callback([this](int level, const char *tag, const char *message) {
61
- if (level <= this->log_level_ && this->is_connected()) {
62
- this->publish({.topic = this->log_message_.topic,
63
- .payload = message,
64
- .qos = this->log_message_.qos,
65
- .retain = this->log_message_.retain});
66
- }
67
- });
60
+ logger::global_logger->add_on_log_callback(
61
+ [this](int level, const char *tag, const char *message, size_t message_len) {
62
+ if (level <= this->log_level_ && this->is_connected()) {
63
+ this->publish({.topic = this->log_message_.topic,
64
+ .payload = std::string(message, message_len),
65
+ .qos = this->log_message_.qos,
66
+ .retain = this->log_message_.retain});
67
+ }
68
+ });
68
69
  }
69
70
  #endif
70
71
 
@@ -176,7 +177,8 @@ void MQTTClientComponent::dump_config() {
176
177
  }
177
178
  }
178
179
  bool MQTTClientComponent::can_proceed() {
179
- return network::is_disabled() || this->state_ == MQTT_CLIENT_DISABLED || this->is_connected();
180
+ return network::is_disabled() || this->state_ == MQTT_CLIENT_DISABLED || this->is_connected() ||
181
+ !this->wait_for_connection_;
180
182
  }
181
183
 
182
184
  void MQTTClientComponent::start_dnslookup_() {
@@ -228,6 +230,8 @@ void MQTTClientComponent::check_dnslookup_() {
228
230
  if (this->dns_resolve_error_) {
229
231
  ESP_LOGW(TAG, "Couldn't resolve IP address for '%s'", this->credentials_.address.c_str());
230
232
  this->state_ = MQTT_CLIENT_DISCONNECTED;
233
+ this->disconnect_reason_ = MQTTClientDisconnectReason::DNS_RESOLVE_ERROR;
234
+ this->on_disconnect_.call(MQTTClientDisconnectReason::DNS_RESOLVE_ERROR);
231
235
  return;
232
236
  }
233
237
 
@@ -697,7 +701,9 @@ void MQTTClientComponent::set_on_connect(mqtt_on_connect_callback_t &&callback)
697
701
  }
698
702
 
699
703
  void MQTTClientComponent::set_on_disconnect(mqtt_on_disconnect_callback_t &&callback) {
704
+ auto callback_copy = callback;
700
705
  this->mqtt_backend_.set_on_disconnect(std::forward<mqtt_on_disconnect_callback_t>(callback));
706
+ this->on_disconnect_.add(std::move(callback_copy));
701
707
  }
702
708
 
703
709
  #if ASYNC_TCP_SSL_ENABLED
@@ -4,11 +4,12 @@
4
4
 
5
5
  #ifdef USE_MQTT
6
6
 
7
- #include "esphome/core/component.h"
8
- #include "esphome/core/automation.h"
9
- #include "esphome/core/log.h"
10
7
  #include "esphome/components/json/json_util.h"
11
8
  #include "esphome/components/network/ip_address.h"
9
+ #include "esphome/core/automation.h"
10
+ #include "esphome/core/component.h"
11
+ #include "esphome/core/helpers.h"
12
+ #include "esphome/core/log.h"
12
13
  #if defined(USE_ESP32)
13
14
  #include "mqtt_backend_esp32.h"
14
15
  #elif defined(USE_ESP8266)
@@ -267,6 +268,8 @@ class MQTTClientComponent : public Component {
267
268
  void set_publish_nan_as_none(bool publish_nan_as_none);
268
269
  bool is_publish_nan_as_none() const;
269
270
 
271
+ void set_wait_for_connection(bool wait_for_connection) { this->wait_for_connection_ = wait_for_connection; }
272
+
270
273
  protected:
271
274
  void send_device_info_();
272
275
 
@@ -332,8 +335,10 @@ class MQTTClientComponent : public Component {
332
335
  uint32_t connect_begin_;
333
336
  uint32_t last_connected_{0};
334
337
  optional<MQTTClientDisconnectReason> disconnect_reason_{};
338
+ CallbackManager<MQTTBackend::on_disconnect_callback_t> on_disconnect_;
335
339
 
336
340
  bool publish_nan_as_none_{false};
341
+ bool wait_for_connection_{false};
337
342
  };
338
343
 
339
344
  extern MQTTClientComponent *global_mqtt_client; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables)
@@ -37,7 +37,6 @@ class MS8607Component : public PollingComponent, public i2c::I2CDevice {
37
37
  void setup() override;
38
38
  void update() override;
39
39
  void dump_config() override;
40
- float get_setup_priority() const override { return setup_priority::DATA; };
41
40
 
42
41
  void set_temperature_sensor(sensor::Sensor *temperature_sensor) { temperature_sensor_ = temperature_sensor; }
43
42
  void set_pressure_sensor(sensor::Sensor *pressure_sensor) { pressure_sensor_ = pressure_sensor; }
@@ -215,4 +215,7 @@ async def to_code(config):
215
215
 
216
216
  # https://github.com/Makuna/NeoPixelBus/blob/master/library.json
217
217
  # Version Listed Here: https://registry.platformio.org/libraries/makuna/NeoPixelBus/versions
218
- cg.add_library("makuna/NeoPixelBus", "2.7.3")
218
+ if CORE.is_esp32:
219
+ cg.add_library("makuna/NeoPixelBus", "2.8.0")
220
+ else:
221
+ cg.add_library("makuna/NeoPixelBus", "2.7.3")
@@ -1,6 +1,6 @@
1
1
  #pragma once
2
2
 
3
- #ifdef USE_ARDUINO
3
+ #if defined(USE_ARDUINO) && !defined(CLANG_TIDY)
4
4
 
5
5
  #include "esphome/core/color.h"
6
6
  #include "esphome/core/component.h"
@@ -2,7 +2,7 @@ import esphome.codegen as cg
2
2
  from esphome.components.esp32 import add_idf_sdkconfig_option
3
3
  import esphome.config_validation as cv
4
4
  from esphome.const import CONF_ENABLE_IPV6, CONF_MIN_IPV6_ADDR_COUNT
5
- from esphome.core import CORE
5
+ from esphome.core import CORE, coroutine_with_priority
6
6
 
7
7
  CODEOWNERS = ["@esphome/core"]
8
8
  AUTO_LOAD = ["mdns"]
@@ -36,8 +36,11 @@ CONFIG_SCHEMA = cv.Schema(
36
36
  )
37
37
 
38
38
 
39
+ @coroutine_with_priority(201.0)
39
40
  async def to_code(config):
40
41
  cg.add_define("USE_NETWORK")
42
+ if CORE.using_arduino and CORE.is_esp32:
43
+ cg.add_library("Networking", None)
41
44
  if (enable_ipv6 := config.get(CONF_ENABLE_IPV6, None)) is not None:
42
45
  cg.add_define("USE_NETWORK_IPV6", enable_ipv6)
43
46
  if enable_ipv6:
@@ -56,6 +56,7 @@ struct IPAddress {
56
56
  IP_ADDR4(&ip_addr_, first, second, third, fourth);
57
57
  }
58
58
  IPAddress(const ip_addr_t *other_ip) { ip_addr_copy(ip_addr_, *other_ip); }
59
+ IPAddress(const char *in_address) { ipaddr_aton(in_address, &ip_addr_); }
59
60
  IPAddress(const std::string &in_address) { ipaddr_aton(in_address.c_str(), &ip_addr_); }
60
61
  IPAddress(ip4_addr_t *other_ip) {
61
62
  memcpy((void *) &ip_addr_, (void *) other_ip, sizeof(ip4_addr_t));
@@ -1,5 +1,7 @@
1
1
  import esphome.codegen as cg
2
2
  from esphome.components import uart
3
+ from esphome.config_helpers import filter_source_files_from_platform
4
+ from esphome.const import PlatformFramework
3
5
 
4
6
  nextion_ns = cg.esphome_ns.namespace("nextion")
5
7
  Nextion = nextion_ns.class_("Nextion", cg.PollingComponent, uart.UARTDevice)
@@ -8,3 +10,17 @@ nextion_ref = Nextion.operator("ref")
8
10
  CONF_NEXTION_ID = "nextion_id"
9
11
  CONF_PUBLISH_STATE = "publish_state"
10
12
  CONF_SEND_TO_NEXTION = "send_to_nextion"
13
+
14
+ FILTER_SOURCE_FILES = filter_source_files_from_platform(
15
+ {
16
+ "nextion_upload_arduino.cpp": {
17
+ PlatformFramework.ESP32_ARDUINO,
18
+ PlatformFramework.ESP8266_ARDUINO,
19
+ PlatformFramework.RP2040_ARDUINO,
20
+ PlatformFramework.BK72XX_ARDUINO,
21
+ PlatformFramework.RTL87XX_ARDUINO,
22
+ PlatformFramework.LN882X_ARDUINO,
23
+ },
24
+ "nextion_upload_idf.cpp": {PlatformFramework.ESP32_IDF},
25
+ }
26
+ )
@@ -11,6 +11,7 @@ CONF_AUTO_WAKE_ON_TOUCH = "auto_wake_on_touch"
11
11
  CONF_BACKGROUND_PRESSED_COLOR = "background_pressed_color"
12
12
  CONF_COMMAND_SPACING = "command_spacing"
13
13
  CONF_COMPONENT_NAME = "component_name"
14
+ CONF_DUMP_DEVICE_INFO = "dump_device_info"
14
15
  CONF_EXIT_REPARSE_ON_START = "exit_reparse_on_start"
15
16
  CONF_FONT_ID = "font_id"
16
17
  CONF_FOREGROUND_PRESSED_COLOR = "foreground_pressed_color"
@@ -44,7 +44,7 @@ void NextionBinarySensor::set_state(bool state, bool publish, bool send_to_nexti
44
44
  return;
45
45
 
46
46
  if (send_to_nextion) {
47
- if (this->nextion_->is_sleeping() || !this->visible_) {
47
+ if (this->nextion_->is_sleeping() || !this->component_flags_.visible) {
48
48
  this->needs_to_send_update_ = true;
49
49
  } else {
50
50
  this->needs_to_send_update_ = false;
@@ -15,6 +15,7 @@ from . import Nextion, nextion_ns, nextion_ref
15
15
  from .base_component import (
16
16
  CONF_AUTO_WAKE_ON_TOUCH,
17
17
  CONF_COMMAND_SPACING,
18
+ CONF_DUMP_DEVICE_INFO,
18
19
  CONF_EXIT_REPARSE_ON_START,
19
20
  CONF_MAX_COMMANDS_PER_LOOP,
20
21
  CONF_MAX_QUEUE_SIZE,
@@ -57,6 +58,7 @@ CONFIG_SCHEMA = (
57
58
  cv.positive_time_period_milliseconds,
58
59
  cv.Range(max=TimePeriod(milliseconds=255)),
59
60
  ),
61
+ cv.Optional(CONF_DUMP_DEVICE_INFO, default=False): cv.boolean,
60
62
  cv.Optional(CONF_EXIT_REPARSE_ON_START, default=False): cv.boolean,
61
63
  cv.Optional(CONF_MAX_COMMANDS_PER_LOOP): cv.uint16_t,
62
64
  cv.Optional(CONF_MAX_QUEUE_SIZE): cv.positive_int,
@@ -95,7 +97,9 @@ CONFIG_SCHEMA = (
95
97
  cv.Optional(CONF_SKIP_CONNECTION_HANDSHAKE, default=False): cv.boolean,
96
98
  cv.Optional(CONF_START_UP_PAGE): cv.uint8_t,
97
99
  cv.Optional(CONF_TFT_URL): cv.url,
98
- cv.Optional(CONF_TOUCH_SLEEP_TIMEOUT): cv.int_range(min=3, max=65535),
100
+ cv.Optional(CONF_TOUCH_SLEEP_TIMEOUT): cv.Any(
101
+ 0, cv.int_range(min=3, max=65535)
102
+ ),
99
103
  cv.Optional(CONF_WAKE_UP_PAGE): cv.uint8_t,
100
104
  }
101
105
  )
@@ -150,7 +154,7 @@ async def to_code(config):
150
154
  cg.add_define("USE_NEXTION_TFT_UPLOAD")
151
155
  cg.add(var.set_tft_url(config[CONF_TFT_URL]))
152
156
  if CORE.is_esp32 and CORE.using_arduino:
153
- cg.add_library("WiFiClientSecure", None)
157
+ cg.add_library("NetworkClientSecure", None)
154
158
  cg.add_library("HTTPClient", None)
155
159
  elif CORE.is_esp32 and CORE.using_esp_idf:
156
160
  esp32.add_idf_sdkconfig_option("CONFIG_ESP_TLS_INSECURE", True)
@@ -167,13 +171,19 @@ async def to_code(config):
167
171
  cg.add(var.set_wake_up_page(config[CONF_WAKE_UP_PAGE]))
168
172
 
169
173
  if CONF_START_UP_PAGE in config:
174
+ cg.add_define("USE_NEXTION_CONF_START_UP_PAGE")
170
175
  cg.add(var.set_start_up_page(config[CONF_START_UP_PAGE]))
171
176
 
172
177
  cg.add(var.set_auto_wake_on_touch(config[CONF_AUTO_WAKE_ON_TOUCH]))
173
178
 
174
- cg.add(var.set_exit_reparse_on_start(config[CONF_EXIT_REPARSE_ON_START]))
179
+ if config[CONF_DUMP_DEVICE_INFO]:
180
+ cg.add_define("USE_NEXTION_CONFIG_DUMP_DEVICE_INFO")
181
+
182
+ if config[CONF_EXIT_REPARSE_ON_START]:
183
+ cg.add_define("USE_NEXTION_CONFIG_EXIT_REPARSE_ON_START")
175
184
 
176
- cg.add(var.set_skip_connection_handshake(config[CONF_SKIP_CONNECTION_HANDSHAKE]))
185
+ if config[CONF_SKIP_CONNECTION_HANDSHAKE]:
186
+ cg.add_define("USE_NEXTION_CONFIG_SKIP_CONNECTION_HANDSHAKE")
177
187
 
178
188
  if max_commands_per_loop := config.get(CONF_MAX_COMMANDS_PER_LOOP):
179
189
  cg.add_define("USE_NEXTION_MAX_COMMANDS_PER_LOOP")