esphome 2025.6.2__py3-none-any.whl → 2025.7.0b1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (601) 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 +42 -20
  22. esphome/components/api/api_connection.cpp +318 -391
  23. esphome/components/api/api_connection.h +206 -126
  24. esphome/components/api/api_frame_helper.cpp +89 -124
  25. esphome/components/api/api_frame_helper.h +57 -45
  26. esphome/components/api/api_pb2.cpp +414 -4350
  27. esphome/components/api/api_pb2.h +287 -198
  28. esphome/components/api/api_pb2_dump.cpp +4333 -0
  29. esphome/components/api/api_pb2_service.cpp +180 -425
  30. esphome/components/api/api_pb2_service.h +7 -6
  31. esphome/components/api/api_pb2_size.h +2 -4
  32. esphome/components/api/api_server.cpp +138 -167
  33. esphome/components/api/api_server.h +66 -12
  34. esphome/components/api/client.py +10 -4
  35. esphome/components/api/list_entities.cpp +36 -105
  36. esphome/components/api/list_entities.h +31 -23
  37. esphome/components/api/proto.h +26 -3
  38. esphome/components/api/subscribe_state.cpp +23 -29
  39. esphome/components/api/subscribe_state.h +26 -19
  40. esphome/components/as5600/as5600.h +0 -1
  41. esphome/components/async_tcp/__init__.py +14 -5
  42. esphome/components/atc_mithermometer/atc_mithermometer.h +0 -1
  43. esphome/components/atm90e32/atm90e32.cpp +2 -1
  44. esphome/components/audio/audio_decoder.cpp +1 -1
  45. esphome/components/audio/audio_transfer_buffer.cpp +2 -2
  46. esphome/components/b_parasite/b_parasite.h +0 -1
  47. esphome/components/bedjet/bedjet_hub.cpp +5 -1
  48. esphome/components/bedjet/climate/bedjet_climate.cpp +5 -1
  49. esphome/components/beken_spi_led_strip/led_strip.cpp +4 -2
  50. esphome/components/bh1750/bh1750.cpp +5 -5
  51. esphome/components/binary_sensor/__init__.py +82 -5
  52. esphome/components/binary_sensor/automation.h +19 -1
  53. esphome/components/binary_sensor/binary_sensor.cpp +12 -30
  54. esphome/components/binary_sensor/binary_sensor.h +11 -25
  55. esphome/components/binary_sensor/filter.cpp +29 -24
  56. esphome/components/binary_sensor/filter.h +20 -10
  57. esphome/components/ble_client/output/ble_binary_output.h +0 -1
  58. esphome/components/ble_client/sensor/ble_rssi_sensor.cpp +5 -1
  59. esphome/components/ble_client/sensor/ble_rssi_sensor.h +0 -1
  60. esphome/components/ble_client/sensor/ble_sensor.cpp +5 -1
  61. esphome/components/ble_client/sensor/ble_sensor.h +0 -1
  62. esphome/components/ble_client/switch/ble_switch.h +0 -1
  63. esphome/components/ble_client/text_sensor/ble_text_sensor.cpp +5 -1
  64. esphome/components/ble_client/text_sensor/ble_text_sensor.h +0 -1
  65. esphome/components/ble_presence/ble_presence_device.h +0 -1
  66. esphome/components/ble_rssi/ble_rssi_sensor.h +0 -1
  67. esphome/components/ble_scanner/ble_scanner.h +0 -1
  68. esphome/components/bluetooth_proxy/bluetooth_connection.h +9 -2
  69. esphome/components/bluetooth_proxy/bluetooth_proxy.cpp +16 -6
  70. esphome/components/bluetooth_proxy/bluetooth_proxy.h +8 -2
  71. esphome/components/bme680/sensor.py +1 -1
  72. esphome/components/bmp581/bmp581.h +0 -2
  73. esphome/components/button/__init__.py +5 -2
  74. esphome/components/camera/__init__.py +1 -0
  75. esphome/components/camera/camera.cpp +22 -0
  76. esphome/components/camera/camera.h +80 -0
  77. esphome/components/canbus/__init__.py +1 -0
  78. esphome/components/cap1188/cap1188.h +0 -1
  79. esphome/components/captive_portal/__init__.py +12 -2
  80. esphome/components/captive_portal/captive_portal.cpp +12 -2
  81. esphome/components/captive_portal/captive_portal.h +5 -2
  82. esphome/components/ccs811/ccs811.h +0 -2
  83. esphome/components/climate/__init__.py +5 -2
  84. esphome/components/cm1106/sensor.py +2 -2
  85. esphome/components/const/__init__.py +2 -0
  86. esphome/components/copy/binary_sensor/copy_binary_sensor.h +0 -1
  87. esphome/components/copy/button/copy_button.h +0 -1
  88. esphome/components/copy/cover/copy_cover.h +0 -1
  89. esphome/components/copy/fan/copy_fan.h +0 -1
  90. esphome/components/copy/lock/copy_lock.h +0 -1
  91. esphome/components/copy/number/copy_number.h +0 -1
  92. esphome/components/copy/select/copy_select.h +0 -1
  93. esphome/components/copy/sensor/copy_sensor.h +0 -1
  94. esphome/components/copy/switch/copy_switch.h +0 -1
  95. esphome/components/copy/text/copy_text.h +0 -1
  96. esphome/components/copy/text_sensor/copy_text_sensor.h +0 -1
  97. esphome/components/cover/__init__.py +5 -2
  98. esphome/components/cs5460a/cs5460a.h +0 -1
  99. esphome/components/datetime/__init__.py +4 -2
  100. esphome/components/debug/__init__.py +20 -0
  101. esphome/components/deep_sleep/__init__.py +43 -9
  102. esphome/components/demo/__init__.py +2 -2
  103. esphome/components/display/display.cpp +4 -3
  104. esphome/components/display/display.h +0 -2
  105. esphome/components/display/display_buffer.cpp +1 -1
  106. esphome/components/ds2484/__init__.py +1 -0
  107. esphome/components/ds2484/ds2484.cpp +209 -0
  108. esphome/components/ds2484/ds2484.h +43 -0
  109. esphome/components/ds2484/one_wire.py +37 -0
  110. esphome/components/duty_time/duty_time_sensor.h +0 -1
  111. esphome/components/ens160_base/ens160_base.h +0 -1
  112. esphome/components/es7210/es7210.h +0 -1
  113. esphome/components/es7243e/es7243e.h +0 -1
  114. esphome/components/es8156/es8156.h +0 -1
  115. esphome/components/es8311/es8311.h +0 -1
  116. esphome/components/es8388/es8388.h +0 -1
  117. esphome/components/esp32/__init__.py +102 -135
  118. esphome/components/esp32/core.cpp +0 -4
  119. esphome/components/esp32/gpio.h +1 -1
  120. esphome/components/esp32/helpers.cpp +69 -0
  121. esphome/components/esp32_ble/ble.cpp +5 -6
  122. esphome/components/esp32_ble/ble.h +29 -14
  123. esphome/components/esp32_ble/ble_event.h +6 -6
  124. esphome/components/esp32_ble_client/ble_client_base.cpp +21 -6
  125. esphome/components/esp32_ble_client/ble_client_base.h +24 -9
  126. esphome/components/esp32_ble_tracker/__init__.py +2 -8
  127. esphome/components/esp32_ble_tracker/esp32_ble_tracker.cpp +5 -5
  128. esphome/components/esp32_ble_tracker/esp32_ble_tracker.h +11 -7
  129. esphome/components/esp32_camera/__init__.py +111 -97
  130. esphome/components/esp32_camera/esp32_camera.cpp +41 -31
  131. esphome/components/esp32_camera/esp32_camera.h +35 -30
  132. esphome/components/esp32_camera_web_server/__init__.py +2 -1
  133. esphome/components/esp32_camera_web_server/camera_web_server.cpp +8 -8
  134. esphome/components/esp32_camera_web_server/camera_web_server.h +3 -3
  135. esphome/components/esp32_hall/sensor.py +2 -21
  136. esphome/components/esp32_hosted/__init__.py +101 -0
  137. esphome/components/esp32_hosted/esp32_hosted.py.script +12 -0
  138. esphome/components/esp32_improv/esp32_improv_component.cpp +3 -0
  139. esphome/components/esp32_rmt/__init__.py +0 -58
  140. esphome/components/esp32_rmt_led_strip/led_strip.cpp +77 -63
  141. esphome/components/esp32_rmt_led_strip/led_strip.h +11 -17
  142. esphome/components/esp32_rmt_led_strip/light.py +14 -76
  143. esphome/components/esp32_touch/esp32_touch.h +174 -28
  144. esphome/components/esp32_touch/esp32_touch_common.cpp +162 -0
  145. esphome/components/esp32_touch/esp32_touch_v1.cpp +238 -0
  146. esphome/components/esp32_touch/esp32_touch_v2.cpp +397 -0
  147. esphome/components/esp8266/__init__.py +1 -0
  148. esphome/components/esp8266/gpio.cpp +10 -10
  149. esphome/components/esp8266/helpers.cpp +31 -0
  150. esphome/components/esphome/ota/__init__.py +1 -0
  151. esphome/components/esphome/ota/ota_esphome.cpp +24 -19
  152. esphome/components/ethernet/__init__.py +42 -23
  153. esphome/components/ethernet/esp_eth_phy_jl1101.c +0 -16
  154. esphome/components/ethernet/ethernet_component.cpp +69 -29
  155. esphome/components/ethernet/ethernet_component.h +18 -10
  156. esphome/components/event/__init__.py +5 -2
  157. esphome/components/ezo/ezo.h +0 -1
  158. esphome/components/ezo_pmp/ezo_pmp.h +0 -1
  159. esphome/components/fan/__init__.py +5 -2
  160. esphome/components/feedback/feedback_cover.h +0 -1
  161. esphome/components/font/__init__.py +92 -82
  162. esphome/components/font/font.cpp +9 -2
  163. esphome/components/font/font.h +20 -5
  164. esphome/components/fs3000/fs3000.h +0 -1
  165. esphome/components/gcja5/gcja5.h +0 -1
  166. esphome/components/gl_r01_i2c/__init__.py +0 -0
  167. esphome/components/gl_r01_i2c/gl_r01_i2c.cpp +68 -0
  168. esphome/components/gl_r01_i2c/gl_r01_i2c.h +22 -0
  169. esphome/components/gl_r01_i2c/sensor.py +36 -0
  170. esphome/components/gp8403/gp8403.h +0 -1
  171. esphome/components/gpio/binary_sensor/__init__.py +17 -0
  172. esphome/components/gpio/binary_sensor/gpio_binary_sensor.cpp +77 -3
  173. esphome/components/gpio/binary_sensor/gpio_binary_sensor.h +40 -0
  174. esphome/components/grove_gas_mc_v2/grove_gas_mc_v2.h +0 -2
  175. esphome/components/he60r/he60r.h +0 -1
  176. esphome/components/heatpumpir/climate.py +2 -1
  177. esphome/components/heatpumpir/heatpumpir.cpp +1 -0
  178. esphome/components/heatpumpir/heatpumpir.h +1 -0
  179. esphome/components/honeywellabp2_i2c/honeywellabp2.h +0 -1
  180. esphome/components/host/__init__.py +2 -1
  181. esphome/components/host/helpers.cpp +57 -0
  182. esphome/components/http_request/__init__.py +19 -1
  183. esphome/components/http_request/http_request.h +1 -1
  184. esphome/components/http_request/http_request_arduino.cpp +0 -1
  185. esphome/components/http_request/http_request_arduino.h +1 -0
  186. esphome/components/http_request/http_request_idf.cpp +0 -1
  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 +430 -261
  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 +4 -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 +126 -45
  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 +31 -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 +1 -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 +1 -5
  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/valve/__init__.py +5 -2
  477. esphome/components/vbus/vbus.h +0 -1
  478. esphome/components/veml3235/veml3235.h +0 -1
  479. esphome/components/veml7700/veml7700.h +0 -1
  480. esphome/components/vl53l0x/vl53l0x_sensor.h +0 -1
  481. esphome/components/voice_assistant/voice_assistant.cpp +4 -4
  482. esphome/components/watchdog/watchdog.cpp +0 -4
  483. esphome/components/waveshare_epaper/waveshare_epaper.cpp +6 -6
  484. esphome/components/web_server/__init__.py +34 -19
  485. esphome/components/web_server/ota/__init__.py +32 -0
  486. esphome/components/web_server/ota/ota_web_server.cpp +210 -0
  487. esphome/components/web_server/ota/ota_web_server.h +26 -0
  488. esphome/components/web_server/web_server.cpp +311 -430
  489. esphome/components/web_server/web_server.h +33 -23
  490. esphome/components/web_server/web_server_v1.cpp +4 -5
  491. esphome/components/web_server_base/__init__.py +5 -2
  492. esphome/components/web_server_base/web_server_base.cpp +2 -94
  493. esphome/components/web_server_base/web_server_base.h +5 -25
  494. esphome/components/web_server_idf/multipart.cpp +254 -0
  495. esphome/components/web_server_idf/multipart.h +86 -0
  496. esphome/components/web_server_idf/utils.cpp +32 -0
  497. esphome/components/web_server_idf/utils.h +10 -0
  498. esphome/components/web_server_idf/web_server_idf.cpp +162 -16
  499. esphome/components/web_server_idf/web_server_idf.h +11 -10
  500. esphome/components/wiegand/wiegand.cpp +2 -2
  501. esphome/components/wifi/__init__.py +18 -0
  502. esphome/components/wifi/wifi_component.cpp +17 -22
  503. esphome/components/wifi/wifi_component.h +27 -23
  504. esphome/components/wifi/wifi_component_esp32_arduino.cpp +52 -59
  505. esphome/components/wifi/wifi_component_esp8266.cpp +46 -46
  506. esphome/components/wifi/wifi_component_esp_idf.cpp +35 -36
  507. esphome/components/wifi/wifi_component_libretiny.cpp +26 -27
  508. esphome/components/wifi/wifi_component_pico_w.cpp +3 -3
  509. esphome/components/wifi_info/wifi_info_text_sensor.cpp +6 -6
  510. esphome/components/wireguard/__init__.py +2 -11
  511. esphome/components/xiaomi_ble/xiaomi_ble.cpp +13 -1
  512. esphome/components/xiaomi_ble/xiaomi_ble.h +1 -0
  513. esphome/components/xiaomi_cgd1/xiaomi_cgd1.h +0 -1
  514. esphome/components/xiaomi_cgdk2/xiaomi_cgdk2.h +0 -1
  515. esphome/components/xiaomi_cgg1/xiaomi_cgg1.h +0 -1
  516. esphome/components/xiaomi_cgpr1/xiaomi_cgpr1.h +0 -1
  517. esphome/components/xiaomi_gcls002/xiaomi_gcls002.h +0 -1
  518. esphome/components/xiaomi_hhccjcy01/xiaomi_hhccjcy01.h +0 -1
  519. esphome/components/xiaomi_hhccjcy10/xiaomi_hhccjcy10.h +0 -1
  520. esphome/components/xiaomi_hhccpot002/xiaomi_hhccpot002.h +0 -1
  521. esphome/components/xiaomi_jqjcy01ym/xiaomi_jqjcy01ym.h +0 -1
  522. esphome/components/xiaomi_lywsd02/xiaomi_lywsd02.h +0 -1
  523. esphome/components/xiaomi_lywsd02mmc/xiaomi_lywsd02mmc.h +0 -1
  524. esphome/components/xiaomi_lywsd03mmc/xiaomi_lywsd03mmc.h +0 -1
  525. esphome/components/xiaomi_lywsdcgq/xiaomi_lywsdcgq.h +0 -1
  526. esphome/components/xiaomi_mhoc303/xiaomi_mhoc303.h +0 -1
  527. esphome/components/xiaomi_mhoc401/xiaomi_mhoc401.h +0 -1
  528. esphome/components/xiaomi_miscale/xiaomi_miscale.h +0 -1
  529. esphome/components/xiaomi_mjyd02yla/xiaomi_mjyd02yla.h +0 -1
  530. esphome/components/xiaomi_mue4094rt/xiaomi_mue4094rt.h +0 -1
  531. esphome/components/xiaomi_rtcgq02lm/xiaomi_rtcgq02lm.h +0 -1
  532. esphome/components/xiaomi_wx08zm/xiaomi_wx08zm.h +0 -1
  533. esphome/components/xiaomi_xmwsdj04mmc/__init__.py +0 -0
  534. esphome/components/xiaomi_xmwsdj04mmc/sensor.py +77 -0
  535. esphome/components/xiaomi_xmwsdj04mmc/xiaomi_xmwsdj04mmc.cpp +77 -0
  536. esphome/components/xiaomi_xmwsdj04mmc/xiaomi_xmwsdj04mmc.h +36 -0
  537. esphome/components/zio_ultrasonic/zio_ultrasonic.h +0 -2
  538. esphome/components/zyaura/zyaura.h +0 -1
  539. esphome/config.py +88 -22
  540. esphome/config_helpers.py +74 -1
  541. esphome/config_validation.py +12 -1
  542. esphome/const.py +65 -10
  543. esphome/core/__init__.py +18 -2
  544. esphome/core/application.cpp +163 -10
  545. esphome/core/application.h +145 -165
  546. esphome/core/area.h +19 -0
  547. esphome/core/automation.h +58 -9
  548. esphome/core/color.cpp +3 -5
  549. esphome/core/color.h +16 -16
  550. esphome/core/component.cpp +151 -18
  551. esphome/core/component.h +98 -4
  552. esphome/core/component_iterator.cpp +7 -7
  553. esphome/core/component_iterator.h +9 -7
  554. esphome/core/config.py +155 -6
  555. esphome/core/controller.cpp +4 -2
  556. esphome/core/controller.h +1 -1
  557. esphome/core/datatypes.h +2 -2
  558. esphome/core/defines.h +17 -2
  559. esphome/core/device.h +20 -0
  560. esphome/core/entity_base.cpp +20 -15
  561. esphome/core/entity_base.h +76 -0
  562. esphome/core/entity_helpers.py +162 -1
  563. esphome/core/event_pool.h +81 -0
  564. esphome/core/helpers.cpp +75 -230
  565. esphome/core/helpers.h +164 -104
  566. esphome/core/lock_free_queue.h +151 -0
  567. esphome/core/log.cpp +2 -2
  568. esphome/core/log.h +2 -0
  569. esphome/core/optional.h +5 -0
  570. esphome/core/ring_buffer.cpp +2 -2
  571. esphome/core/scheduler.cpp +278 -103
  572. esphome/core/scheduler.h +157 -17
  573. esphome/core/time.cpp +5 -5
  574. esphome/core/time.h +5 -5
  575. esphome/cpp_generator.py +17 -0
  576. esphome/cpp_helpers.py +0 -22
  577. esphome/cpp_types.py +3 -1
  578. esphome/dashboard/entries.py +1 -1
  579. esphome/dashboard/util/text.py +5 -21
  580. esphome/dashboard/web_server.py +9 -1
  581. esphome/helpers.py +47 -0
  582. esphome/loader.py +15 -1
  583. esphome/pins.py +14 -8
  584. esphome/wizard.py +16 -3
  585. esphome/writer.py +21 -3
  586. esphome/yaml_util.py +0 -2
  587. {esphome-2025.6.2.dist-info → esphome-2025.7.0b1.dist-info}/METADATA +10 -9
  588. {esphome-2025.6.2.dist-info → esphome-2025.7.0b1.dist-info}/RECORD +593 -533
  589. esphome/components/esp32_ble/ble_event_pool.h +0 -72
  590. esphome/components/esp32_ble/queue.h +0 -85
  591. esphome/components/esp32_hall/esp32_hall.cpp +0 -25
  592. esphome/components/esp32_hall/esp32_hall.h +0 -23
  593. esphome/components/esp32_touch/esp32_touch.cpp +0 -355
  594. esphome/components/ld2410/button/reset_button.cpp +0 -9
  595. esphome/components/ld2450/button/reset_button.cpp +0 -9
  596. esphome/components/openthread/tlv.py +0 -65
  597. /esphome/{dashboard/enum.py → enum.py} +0 -0
  598. {esphome-2025.6.2.dist-info → esphome-2025.7.0b1.dist-info}/WHEEL +0 -0
  599. {esphome-2025.6.2.dist-info → esphome-2025.7.0b1.dist-info}/entry_points.txt +0 -0
  600. {esphome-2025.6.2.dist-info → esphome-2025.7.0b1.dist-info}/licenses/LICENSE +0 -0
  601. {esphome-2025.6.2.dist-info → esphome-2025.7.0b1.dist-info}/top_level.txt +0 -0
@@ -932,21 +932,6 @@ class Nextion : public NextionBase, public PollingComponent, public uart::UARTDe
932
932
  */
933
933
  void set_backlight_brightness(float brightness);
934
934
 
935
- /**
936
- * Sets whether the Nextion display should skip the connection handshake process.
937
- * @param skip_handshake True or false. When skip_connection_handshake is true,
938
- * the connection will be established without performing the handshake.
939
- * This can be useful when using Nextion Simulator.
940
- *
941
- * Example:
942
- * ```cpp
943
- * it.set_skip_connection_handshake(true);
944
- * ```
945
- *
946
- * When set to true, the display will be marked as connected without performing a handshake.
947
- */
948
- void set_skip_connection_handshake(bool skip_handshake) { this->skip_connection_handshake_ = skip_handshake; }
949
-
950
935
  /**
951
936
  * Sets Nextion mode between sleep and awake
952
937
  * @param True or false. Sleep=true to enter sleep mode or sleep=false to exit sleep mode.
@@ -1179,22 +1164,43 @@ class Nextion : public NextionBase, public PollingComponent, public uart::UARTDe
1179
1164
  void update_components_by_prefix(const std::string &prefix);
1180
1165
 
1181
1166
  /**
1182
- * Set the touch sleep timeout of the display.
1183
- * @param timeout Timeout in seconds.
1167
+ * Set the touch sleep timeout of the display using the `thsp` command.
1168
+ *
1169
+ * Sets internal No-touch-then-sleep timer to specified value in seconds.
1170
+ * Nextion will auto-enter sleep mode if and when this timer expires.
1171
+ *
1172
+ * @param touch_sleep_timeout Timeout in seconds.
1173
+ * Range: 3 to 65535 seconds (minimum 3 seconds, maximum ~18 hours 12 minutes 15 seconds)
1174
+ * Use 0 to disable touch sleep timeout.
1175
+ *
1176
+ * @note Once `thsp` is set, it will persist until reboot or reset. The Nextion device
1177
+ * needs to exit sleep mode to issue `thsp=0` to disable sleep on no touch.
1178
+ *
1179
+ * @note The display will only wake up by a restart or by setting up `thup` (auto wake on touch).
1180
+ * See set_auto_wake_on_touch() to configure wake behavior.
1184
1181
  *
1185
1182
  * Example:
1186
1183
  * ```cpp
1184
+ * // Set 30 second touch timeout
1187
1185
  * it.set_touch_sleep_timeout(30);
1186
+ *
1187
+ * // Set maximum timeout (~18 hours)
1188
+ * it.set_touch_sleep_timeout(65535);
1189
+ *
1190
+ * // Disable touch sleep timeout
1191
+ * it.set_touch_sleep_timeout(0);
1188
1192
  * ```
1189
1193
  *
1190
- * After 30 seconds the display will go to sleep. Note: the display will only wakeup by a restart or by setting up
1191
- * `thup`.
1194
+ * Related Nextion instruction: `thsp=<value>`
1195
+ *
1196
+ * @see set_auto_wake_on_touch() Configure automatic wake on touch
1197
+ * @see sleep() Manually control sleep state
1192
1198
  */
1193
- void set_touch_sleep_timeout(uint32_t touch_sleep_timeout);
1199
+ void set_touch_sleep_timeout(uint16_t touch_sleep_timeout = 0);
1194
1200
 
1195
1201
  /**
1196
1202
  * Sets which page Nextion loads when exiting sleep mode. Note this can be set even when Nextion is in sleep mode.
1197
- * @param wake_up_page The page id, from 0 to the lage page in Nextion. Set 255 (not set to any existing page) to
1203
+ * @param wake_up_page The page id, from 0 to the last page in Nextion. Set 255 (not set to any existing page) to
1198
1204
  * wakes up to current page.
1199
1205
  *
1200
1206
  * Example:
@@ -1206,9 +1212,10 @@ class Nextion : public NextionBase, public PollingComponent, public uart::UARTDe
1206
1212
  */
1207
1213
  void set_wake_up_page(uint8_t wake_up_page = 255);
1208
1214
 
1215
+ #ifdef USE_NEXTION_CONF_START_UP_PAGE
1209
1216
  /**
1210
1217
  * Sets which page Nextion loads when connecting to ESPHome.
1211
- * @param start_up_page The page id, from 0 to the lage page in Nextion. Set 255 (not set to any existing page) to
1218
+ * @param start_up_page The page id, from 0 to the last page in Nextion. Set 255 (not set to any existing page) to
1212
1219
  * wakes up to current page.
1213
1220
  *
1214
1221
  * Example:
@@ -1219,6 +1226,7 @@ class Nextion : public NextionBase, public PollingComponent, public uart::UARTDe
1219
1226
  * The display will go to page 2 when it establishes a connection to ESPHome.
1220
1227
  */
1221
1228
  void set_start_up_page(uint8_t start_up_page = 255) { this->start_up_page_ = start_up_page; }
1229
+ #endif // USE_NEXTION_CONF_START_UP_PAGE
1222
1230
 
1223
1231
  /**
1224
1232
  * Sets if Nextion should auto-wake from sleep when touch press occurs.
@@ -1234,20 +1242,6 @@ class Nextion : public NextionBase, public PollingComponent, public uart::UARTDe
1234
1242
  */
1235
1243
  void set_auto_wake_on_touch(bool auto_wake_on_touch);
1236
1244
 
1237
- /**
1238
- * Sets if Nextion should exit the active reparse mode before the "connect" command is sent
1239
- * @param exit_reparse_on_start True or false. When exit_reparse_on_start is true, the exit reparse command
1240
- * will be sent before requesting the connection from Nextion.
1241
- *
1242
- * Example:
1243
- * ```cpp
1244
- * it.set_exit_reparse_on_start(true);
1245
- * ```
1246
- *
1247
- * The display will be requested to leave active reparse mode before setup.
1248
- */
1249
- void set_exit_reparse_on_start(bool exit_reparse_on_start) { this->exit_reparse_on_start_ = exit_reparse_on_start; }
1250
-
1251
1245
  /**
1252
1246
  * @brief Retrieves the number of commands pending in the Nextion command queue.
1253
1247
  *
@@ -1290,7 +1284,7 @@ class Nextion : public NextionBase, public PollingComponent, public uart::UARTDe
1290
1284
  * the Nextion display. A connection is considered established when:
1291
1285
  *
1292
1286
  * - The initial handshake with the display is completed successfully, or
1293
- * - The handshake is skipped via skip_connection_handshake_ flag
1287
+ * - The handshake is skipped via USE_NEXTION_CONFIG_SKIP_CONNECTION_HANDSHAKE flag
1294
1288
  *
1295
1289
  * The connection status is particularly useful when:
1296
1290
  * - Troubleshooting communication issues
@@ -1300,7 +1294,7 @@ class Nextion : public NextionBase, public PollingComponent, public uart::UARTDe
1300
1294
  * @return true if the Nextion display is connected and ready to receive commands
1301
1295
  * @return false if the display is not yet connected or connection was lost
1302
1296
  */
1303
- bool is_connected() { return this->is_connected_; }
1297
+ bool is_connected() { return this->connection_state_.is_connected_; }
1304
1298
 
1305
1299
  protected:
1306
1300
  #ifdef USE_NEXTION_MAX_COMMANDS_PER_LOOP
@@ -1309,34 +1303,54 @@ class Nextion : public NextionBase, public PollingComponent, public uart::UARTDe
1309
1303
  #ifdef USE_NEXTION_MAX_QUEUE_SIZE
1310
1304
  size_t max_queue_size_{0};
1311
1305
  #endif // USE_NEXTION_MAX_QUEUE_SIZE
1306
+
1312
1307
  #ifdef USE_NEXTION_COMMAND_SPACING
1313
1308
  NextionCommandPacer command_pacer_{0};
1309
+
1310
+ /**
1311
+ * @brief Process any commands in the queue that are pending due to command spacing
1312
+ *
1313
+ * This method checks if the first item in the nextion_queue_ has a pending command
1314
+ * that was previously blocked by command spacing. If spacing now allows and a
1315
+ * pending command exists, it attempts to send the command. Once successfully sent,
1316
+ * the pending command is cleared and the queue item continues normal processing.
1317
+ *
1318
+ * Called from loop() to retry sending commands that were delayed by spacing.
1319
+ */
1320
+ void process_pending_in_queue_();
1314
1321
  #endif // USE_NEXTION_COMMAND_SPACING
1322
+
1315
1323
  std::deque<NextionQueue *> nextion_queue_;
1316
1324
  std::deque<NextionQueue *> waveform_queue_;
1317
1325
  uint16_t recv_ret_string_(std::string &response, uint32_t timeout, bool recv_flag);
1318
1326
  void all_components_send_state_(bool force_update = false);
1319
- uint64_t comok_sent_ = 0;
1327
+ uint32_t comok_sent_ = 0;
1320
1328
  bool remove_from_q_(bool report_empty = true);
1321
1329
 
1322
1330
  /**
1323
- * @brief
1324
- * Sends commands ignoring of the Nextion has been setup.
1331
+ * @brief Status flags for Nextion display state management
1332
+ *
1333
+ * Uses bitfields to pack multiple boolean states into a single byte,
1334
+ * saving 5 bytes of RAM compared to individual bool variables.
1325
1335
  */
1326
- bool ignore_is_setup_ = false;
1327
-
1328
- bool nextion_reports_is_setup_ = false;
1329
- uint8_t nextion_event_;
1336
+ struct {
1337
+ uint8_t is_connected_ : 1; ///< Connection established with Nextion display
1338
+ uint8_t sent_setup_commands_ : 1; ///< Initial setup commands have been sent
1339
+ uint8_t ignore_is_setup_ : 1; ///< Temporarily ignore setup state for special operations
1340
+ uint8_t nextion_reports_is_setup_ : 1; ///< Nextion has reported successful initialization
1341
+ uint8_t is_updating_ : 1; ///< TFT firmware update is currently in progress
1342
+ uint8_t auto_wake_on_touch_ : 1; ///< Display should wake automatically on touch (default: true)
1343
+ uint8_t reserved_ : 2; ///< Reserved bits for future flag additions
1344
+ } connection_state_{}; ///< Zero-initialized status flags (all start as false)
1330
1345
 
1331
1346
  void process_nextion_commands_();
1332
1347
  void process_serial_();
1333
- bool is_updating_ = false;
1334
- uint32_t touch_sleep_timeout_ = 0;
1335
- int16_t wake_up_page_ = -1;
1336
- int16_t start_up_page_ = -1;
1348
+ uint16_t touch_sleep_timeout_ = 0;
1349
+ uint8_t wake_up_page_ = 255;
1350
+ #ifdef USE_NEXTION_CONF_START_UP_PAGE
1351
+ uint8_t start_up_page_ = 255;
1352
+ #endif // USE_NEXTION_CONF_START_UP_PAGE
1337
1353
  bool auto_wake_on_touch_ = true;
1338
- bool exit_reparse_on_start_ = false;
1339
- bool skip_connection_handshake_ = false;
1340
1354
 
1341
1355
  /**
1342
1356
  * Manually send a raw command to the display and don't wait for an acknowledgement packet.
@@ -1348,6 +1362,23 @@ class Nextion : public NextionBase, public PollingComponent, public uart::UARTDe
1348
1362
  __attribute__((format(printf, 3, 4)));
1349
1363
  void add_no_result_to_queue_with_command_(const std::string &variable_name, const std::string &command);
1350
1364
 
1365
+ #ifdef USE_NEXTION_COMMAND_SPACING
1366
+ /**
1367
+ * @brief Add a command to the Nextion queue with a pending command for retry
1368
+ *
1369
+ * This method creates a queue entry for a command that was blocked by command spacing.
1370
+ * The command string is stored in the queue item's pending_command field so it can
1371
+ * be retried later when spacing allows. This ensures commands are not lost when
1372
+ * sent too quickly.
1373
+ *
1374
+ * If the max_queue_size limit is configured and reached, the command will be dropped.
1375
+ *
1376
+ * @param variable_name Name of the variable or component associated with the command
1377
+ * @param command The actual command string to be sent when spacing allows
1378
+ */
1379
+ void add_no_result_to_queue_with_pending_command_(const std::string &variable_name, const std::string &command);
1380
+ #endif // USE_NEXTION_COMMAND_SPACING
1381
+
1351
1382
  bool add_no_result_to_queue_with_printf_(const std::string &variable_name, const char *format, ...)
1352
1383
  __attribute__((format(printf, 3, 4)));
1353
1384
 
@@ -1426,10 +1457,12 @@ class Nextion : public NextionBase, public PollingComponent, public uart::UARTDe
1426
1457
  optional<nextion_writer_t> writer_;
1427
1458
  optional<float> brightness_;
1428
1459
 
1460
+ #ifdef USE_NEXTION_CONFIG_DUMP_DEVICE_INFO
1429
1461
  std::string device_model_;
1430
1462
  std::string firmware_version_;
1431
1463
  std::string serial_number_;
1432
1464
  std::string flash_size_;
1465
+ #endif // USE_NEXTION_CONFIG_DUMP_DEVICE_INFO
1433
1466
 
1434
1467
  void remove_front_no_sensors_();
1435
1468
 
@@ -1439,11 +1472,9 @@ class Nextion : public NextionBase, public PollingComponent, public uart::UARTDe
1439
1472
  void reset_(bool reset_nextion = true);
1440
1473
 
1441
1474
  std::string command_data_;
1442
- bool is_connected_ = false;
1443
1475
  const uint16_t startup_override_ms_ = 8000;
1444
1476
  const uint16_t max_q_age_ms_ = 8000;
1445
1477
  uint32_t started_ms_ = 0;
1446
- bool sent_setup_commands_ = false;
1447
1478
  };
1448
1479
 
1449
1480
  } // namespace nextion
@@ -15,14 +15,15 @@ void Nextion::set_wake_up_page(uint8_t wake_up_page) {
15
15
  this->add_no_result_to_queue_with_set_internal_("wake_up_page", "wup", wake_up_page, true);
16
16
  }
17
17
 
18
- void Nextion::set_touch_sleep_timeout(uint32_t touch_sleep_timeout) {
19
- if (touch_sleep_timeout < 3) {
20
- ESP_LOGD(TAG, "Sleep timeout out of bounds (3-65535)");
21
- return;
18
+ void Nextion::set_touch_sleep_timeout(const uint16_t touch_sleep_timeout) {
19
+ // Validate range: Nextion thsp command requires min 3, max 65535 seconds (0 disables)
20
+ if (touch_sleep_timeout != 0 && touch_sleep_timeout < 3) {
21
+ this->touch_sleep_timeout_ = 3; // Auto-correct to minimum valid value
22
+ } else {
23
+ this->touch_sleep_timeout_ = touch_sleep_timeout;
22
24
  }
23
25
 
24
- this->touch_sleep_timeout_ = touch_sleep_timeout;
25
- this->add_no_result_to_queue_with_set_internal_("touch_sleep_timeout", "thsp", touch_sleep_timeout, true);
26
+ this->add_no_result_to_queue_with_set_internal_("touch_sleep_timeout", "thsp", this->touch_sleep_timeout_, true);
26
27
  }
27
28
 
28
29
  void Nextion::sleep(bool sleep) {
@@ -38,7 +39,7 @@ void Nextion::sleep(bool sleep) {
38
39
  // Protocol reparse mode
39
40
  bool Nextion::set_protocol_reparse_mode(bool active_mode) {
40
41
  ESP_LOGV(TAG, "Reparse mode: %s", YESNO(active_mode));
41
- this->ignore_is_setup_ = true; // if not in reparse mode setup will fail, so it should be ignored
42
+ this->connection_state_.ignore_is_setup_ = true; // if not in reparse mode setup will fail, so it should be ignored
42
43
  bool all_commands_sent = true;
43
44
  if (active_mode) { // Sets active protocol reparse mode
44
45
  all_commands_sent &= this->send_command_("recmod=1");
@@ -48,10 +49,10 @@ bool Nextion::set_protocol_reparse_mode(bool active_mode) {
48
49
  all_commands_sent &= this->send_command_("recmod=0"); // Sending recmode=0 twice is recommended
49
50
  all_commands_sent &= this->send_command_("recmod=0");
50
51
  }
51
- if (!this->nextion_reports_is_setup_) { // No need to connect if is already setup
52
+ if (!this->connection_state_.nextion_reports_is_setup_) { // No need to connect if is already setup
52
53
  all_commands_sent &= this->send_command_("connect");
53
54
  }
54
- this->ignore_is_setup_ = false;
55
+ this->connection_state_.ignore_is_setup_ = false;
55
56
  return all_commands_sent;
56
57
  }
57
58
 
@@ -191,7 +192,7 @@ void Nextion::set_backlight_brightness(float brightness) {
191
192
  }
192
193
 
193
194
  void Nextion::set_auto_wake_on_touch(bool auto_wake_on_touch) {
194
- this->auto_wake_on_touch_ = auto_wake_on_touch;
195
+ this->connection_state_.auto_wake_on_touch_ = auto_wake_on_touch;
195
196
  this->add_no_result_to_queue_with_set("auto_wake_on_touch", "thup", auto_wake_on_touch ? 1 : 0);
196
197
  }
197
198
 
@@ -8,8 +8,8 @@ void NextionComponent::set_background_color(Color bco) {
8
8
  return; // This is a variable. no need to set color
9
9
  }
10
10
  this->bco_ = bco;
11
- this->bco_needs_update_ = true;
12
- this->bco_is_set_ = true;
11
+ this->component_flags_.bco_needs_update = true;
12
+ this->component_flags_.bco_is_set = true;
13
13
  this->update_component_settings();
14
14
  }
15
15
 
@@ -19,8 +19,8 @@ void NextionComponent::set_background_pressed_color(Color bco2) {
19
19
  }
20
20
 
21
21
  this->bco2_ = bco2;
22
- this->bco2_needs_update_ = true;
23
- this->bco2_is_set_ = true;
22
+ this->component_flags_.bco2_needs_update = true;
23
+ this->component_flags_.bco2_is_set = true;
24
24
  this->update_component_settings();
25
25
  }
26
26
 
@@ -29,8 +29,8 @@ void NextionComponent::set_foreground_color(Color pco) {
29
29
  return; // This is a variable. no need to set color
30
30
  }
31
31
  this->pco_ = pco;
32
- this->pco_needs_update_ = true;
33
- this->pco_is_set_ = true;
32
+ this->component_flags_.pco_needs_update = true;
33
+ this->component_flags_.pco_is_set = true;
34
34
  this->update_component_settings();
35
35
  }
36
36
 
@@ -39,8 +39,8 @@ void NextionComponent::set_foreground_pressed_color(Color pco2) {
39
39
  return; // This is a variable. no need to set color
40
40
  }
41
41
  this->pco2_ = pco2;
42
- this->pco2_needs_update_ = true;
43
- this->pco2_is_set_ = true;
42
+ this->component_flags_.pco2_needs_update = true;
43
+ this->component_flags_.pco2_is_set = true;
44
44
  this->update_component_settings();
45
45
  }
46
46
 
@@ -49,8 +49,8 @@ void NextionComponent::set_font_id(uint8_t font_id) {
49
49
  return; // This is a variable. no need to set color
50
50
  }
51
51
  this->font_id_ = font_id;
52
- this->font_id_needs_update_ = true;
53
- this->font_id_is_set_ = true;
52
+ this->component_flags_.font_id_needs_update = true;
53
+ this->component_flags_.font_id_is_set = true;
54
54
  this->update_component_settings();
55
55
  }
56
56
 
@@ -58,20 +58,20 @@ void NextionComponent::set_visible(bool visible) {
58
58
  if (this->variable_name_ == this->variable_name_to_send_) {
59
59
  return; // This is a variable. no need to set color
60
60
  }
61
- this->visible_ = visible;
62
- this->visible_needs_update_ = true;
63
- this->visible_is_set_ = true;
61
+ this->component_flags_.visible = visible;
62
+ this->component_flags_.visible_needs_update = true;
63
+ this->component_flags_.visible_is_set = true;
64
64
  this->update_component_settings();
65
65
  }
66
66
 
67
67
  void NextionComponent::update_component_settings(bool force_update) {
68
- if (this->nextion_->is_sleeping() || !this->nextion_->is_setup() || !this->visible_is_set_ ||
69
- (!this->visible_needs_update_ && !this->visible_)) {
68
+ if (this->nextion_->is_sleeping() || !this->nextion_->is_setup() || !this->component_flags_.visible_is_set ||
69
+ (!this->component_flags_.visible_needs_update && !this->component_flags_.visible)) {
70
70
  this->needs_to_send_update_ = true;
71
71
  return;
72
72
  }
73
73
 
74
- if (this->visible_needs_update_ || (force_update && this->visible_is_set_)) {
74
+ if (this->component_flags_.visible_needs_update || (force_update && this->component_flags_.visible_is_set)) {
75
75
  std::string name_to_send = this->variable_name_;
76
76
 
77
77
  size_t pos = name_to_send.find_last_of('.');
@@ -79,9 +79,9 @@ void NextionComponent::update_component_settings(bool force_update) {
79
79
  name_to_send = name_to_send.substr(pos + 1);
80
80
  }
81
81
 
82
- this->visible_needs_update_ = false;
82
+ this->component_flags_.visible_needs_update = false;
83
83
 
84
- if (this->visible_) {
84
+ if (this->component_flags_.visible) {
85
85
  this->nextion_->show_component(name_to_send.c_str());
86
86
  this->send_state_to_nextion();
87
87
  } else {
@@ -90,26 +90,26 @@ void NextionComponent::update_component_settings(bool force_update) {
90
90
  }
91
91
  }
92
92
 
93
- if (this->bco_needs_update_ || (force_update && this->bco2_is_set_)) {
93
+ if (this->component_flags_.bco_needs_update || (force_update && this->component_flags_.bco2_is_set)) {
94
94
  this->nextion_->set_component_background_color(this->variable_name_.c_str(), this->bco_);
95
- this->bco_needs_update_ = false;
95
+ this->component_flags_.bco_needs_update = false;
96
96
  }
97
- if (this->bco2_needs_update_ || (force_update && this->bco2_is_set_)) {
97
+ if (this->component_flags_.bco2_needs_update || (force_update && this->component_flags_.bco2_is_set)) {
98
98
  this->nextion_->set_component_pressed_background_color(this->variable_name_.c_str(), this->bco2_);
99
- this->bco2_needs_update_ = false;
99
+ this->component_flags_.bco2_needs_update = false;
100
100
  }
101
- if (this->pco_needs_update_ || (force_update && this->pco_is_set_)) {
101
+ if (this->component_flags_.pco_needs_update || (force_update && this->component_flags_.pco_is_set)) {
102
102
  this->nextion_->set_component_foreground_color(this->variable_name_.c_str(), this->pco_);
103
- this->pco_needs_update_ = false;
103
+ this->component_flags_.pco_needs_update = false;
104
104
  }
105
- if (this->pco2_needs_update_ || (force_update && this->pco2_is_set_)) {
105
+ if (this->component_flags_.pco2_needs_update || (force_update && this->component_flags_.pco2_is_set)) {
106
106
  this->nextion_->set_component_pressed_foreground_color(this->variable_name_.c_str(), this->pco2_);
107
- this->pco2_needs_update_ = false;
107
+ this->component_flags_.pco2_needs_update = false;
108
108
  }
109
109
 
110
- if (this->font_id_needs_update_ || (force_update && this->font_id_is_set_)) {
110
+ if (this->component_flags_.font_id_needs_update || (force_update && this->component_flags_.font_id_is_set)) {
111
111
  this->nextion_->set_component_font(this->variable_name_.c_str(), this->font_id_);
112
- this->font_id_needs_update_ = false;
112
+ this->component_flags_.font_id_needs_update = false;
113
113
  }
114
114
  }
115
115
  } // namespace nextion
@@ -21,29 +21,64 @@ class NextionComponent : public NextionComponentBase {
21
21
  void set_visible(bool visible);
22
22
 
23
23
  protected:
24
+ /**
25
+ * @brief Constructor initializes component state with visible=true (default state)
26
+ */
27
+ NextionComponent() {
28
+ component_flags_ = {}; // Zero-initialize all state
29
+ component_flags_.visible = 1; // Set default visibility to true
30
+ }
31
+
24
32
  NextionBase *nextion_;
25
33
 
26
- bool bco_needs_update_ = false;
27
- bool bco_is_set_ = false;
28
- Color bco_;
29
- bool bco2_needs_update_ = false;
30
- bool bco2_is_set_ = false;
31
- Color bco2_;
32
- bool pco_needs_update_ = false;
33
- bool pco_is_set_ = false;
34
- Color pco_;
35
- bool pco2_needs_update_ = false;
36
- bool pco2_is_set_ = false;
37
- Color pco2_;
34
+ // Color and styling properties
35
+ Color bco_; // Background color
36
+ Color bco2_; // Pressed background color
37
+ Color pco_; // Foreground color
38
+ Color pco2_; // Pressed foreground color
38
39
  uint8_t font_id_ = 0;
39
- bool font_id_needs_update_ = false;
40
- bool font_id_is_set_ = false;
41
40
 
42
- bool visible_ = true;
43
- bool visible_needs_update_ = false;
44
- bool visible_is_set_ = false;
41
+ /**
42
+ * @brief Component state management using compact bitfield structure
43
+ *
44
+ * Stores all component state flags and properties in a single 16-bit bitfield
45
+ * for efficient memory usage and improved cache locality.
46
+ *
47
+ * Each component property maintains two state flags:
48
+ * - needs_update: Indicates the property requires synchronization with the display
49
+ * - is_set: Tracks whether the property has been explicitly configured
50
+ *
51
+ * The visible field stores both the update flags and the actual visibility state.
52
+ */
53
+ struct ComponentState {
54
+ // Background color flags
55
+ uint16_t bco_needs_update : 1;
56
+ uint16_t bco_is_set : 1;
57
+
58
+ // Pressed background color flags
59
+ uint16_t bco2_needs_update : 1;
60
+ uint16_t bco2_is_set : 1;
61
+
62
+ // Foreground color flags
63
+ uint16_t pco_needs_update : 1;
64
+ uint16_t pco_is_set : 1;
65
+
66
+ // Pressed foreground color flags
67
+ uint16_t pco2_needs_update : 1;
68
+ uint16_t pco2_is_set : 1;
69
+
70
+ // Font ID flags
71
+ uint16_t font_id_needs_update : 1;
72
+ uint16_t font_id_is_set : 1;
73
+
74
+ // Visibility flags
75
+ uint16_t visible_needs_update : 1;
76
+ uint16_t visible_is_set : 1;
77
+ uint16_t visible : 1; // Actual visibility state
45
78
 
46
- // void send_state_to_nextion() = 0;
79
+ // Reserved bits for future expansion
80
+ uint16_t reserved : 3;
81
+ } component_flags_;
47
82
  };
48
83
  } // namespace nextion
49
84
  } // namespace esphome
@@ -25,6 +25,9 @@ class NextionQueue {
25
25
  virtual ~NextionQueue() = default;
26
26
  NextionComponentBase *component;
27
27
  uint32_t queue_time = 0;
28
+
29
+ // Store command for retry if spacing blocked it
30
+ std::string pending_command; // Empty if command was sent successfully
28
31
  };
29
32
 
30
33
  class NextionComponentBase {
@@ -0,0 +1,36 @@
1
+ #include "nextion.h"
2
+
3
+ #ifdef USE_NEXTION_TFT_UPLOAD
4
+
5
+ #include "esphome/core/application.h"
6
+
7
+ namespace esphome {
8
+ namespace nextion {
9
+ static const char *const TAG = "nextion.upload";
10
+
11
+ bool Nextion::upload_end_(bool successful) {
12
+ if (successful) {
13
+ ESP_LOGD(TAG, "Upload successful");
14
+ delay(1500); // NOLINT
15
+ App.safe_reboot();
16
+ } else {
17
+ ESP_LOGE(TAG, "Upload failed");
18
+
19
+ this->connection_state_.is_updating_ = false;
20
+ this->connection_state_.ignore_is_setup_ = false;
21
+
22
+ uint32_t baud_rate = this->parent_->get_baud_rate();
23
+ if (baud_rate != this->original_baud_rate_) {
24
+ ESP_LOGD(TAG, "Baud: %" PRIu32 "->%" PRIu32, baud_rate, this->original_baud_rate_);
25
+ this->parent_->set_baud_rate(this->original_baud_rate_);
26
+ this->parent_->load_settings();
27
+ }
28
+ }
29
+
30
+ return successful;
31
+ }
32
+
33
+ } // namespace nextion
34
+ } // namespace esphome
35
+
36
+ #endif // USE_NEXTION_TFT_UPLOAD
@@ -3,12 +3,12 @@
3
3
  #ifdef USE_NEXTION_TFT_UPLOAD
4
4
  #ifdef USE_ARDUINO
5
5
 
6
+ #include <cinttypes>
7
+ #include "esphome/components/network/util.h"
6
8
  #include "esphome/core/application.h"
7
9
  #include "esphome/core/defines.h"
8
- #include "esphome/core/util.h"
9
10
  #include "esphome/core/log.h"
10
- #include "esphome/components/network/util.h"
11
- #include <cinttypes>
11
+ #include "esphome/core/util.h"
12
12
 
13
13
  #ifdef USE_ESP32
14
14
  #include <esp_heap_caps.h>
@@ -52,7 +52,7 @@ int Nextion::upload_by_chunks_(HTTPClient &http_client, uint32_t &range_start) {
52
52
  }
53
53
 
54
54
  // Allocate the buffer dynamically
55
- ExternalRAMAllocator<uint8_t> allocator(ExternalRAMAllocator<uint8_t>::ALLOW_FAILURE);
55
+ RAMAllocator<uint8_t> allocator;
56
56
  uint8_t *buffer = allocator.allocate(4096);
57
57
  if (!buffer) {
58
58
  ESP_LOGE(TAG, "Buffer alloc failed");
@@ -67,8 +67,8 @@ int Nextion::upload_by_chunks_(HTTPClient &http_client, uint32_t &range_start) {
67
67
  ESP_LOGV(TAG, "Fetch %" PRIu16 " bytes", buffer_size);
68
68
  uint16_t read_len = 0;
69
69
  int partial_read_len = 0;
70
- const uint32_t start_time = millis();
71
- while (read_len < buffer_size && millis() - start_time < 5000) {
70
+ const uint32_t start_time = App.get_loop_component_start_time();
71
+ while (read_len < buffer_size && App.get_loop_component_start_time() - start_time < 5000) {
72
72
  if (http_client.getStreamPtr()->available() > 0) {
73
73
  partial_read_len =
74
74
  http_client.getStreamPtr()->readBytes(reinterpret_cast<char *>(buffer) + read_len, buffer_size - read_len);
@@ -152,7 +152,7 @@ bool Nextion::upload_tft(uint32_t baud_rate, bool exit_reparse) {
152
152
  ESP_LOGD(TAG, "Exit reparse: %s", YESNO(exit_reparse));
153
153
  ESP_LOGD(TAG, "URL: %s", this->tft_url_.c_str());
154
154
 
155
- if (this->is_updating_) {
155
+ if (this->connection_state_.is_updating_) {
156
156
  ESP_LOGW(TAG, "Upload in progress");
157
157
  return false;
158
158
  }
@@ -162,7 +162,7 @@ bool Nextion::upload_tft(uint32_t baud_rate, bool exit_reparse) {
162
162
  return false;
163
163
  }
164
164
 
165
- this->is_updating_ = true;
165
+ this->connection_state_.is_updating_ = true;
166
166
 
167
167
  if (exit_reparse) {
168
168
  ESP_LOGD(TAG, "Exit reparse mode");
@@ -203,7 +203,7 @@ bool Nextion::upload_tft(uint32_t baud_rate, bool exit_reparse) {
203
203
  begin_status = http_client.begin(*this->get_wifi_client_(), this->tft_url_.c_str());
204
204
  #endif // USE_ESP8266
205
205
  if (!begin_status) {
206
- this->is_updating_ = false;
206
+ this->connection_state_.is_updating_ = false;
207
207
  ESP_LOGD(TAG, "Connection failed");
208
208
  return false;
209
209
  } else {
@@ -254,7 +254,7 @@ bool Nextion::upload_tft(uint32_t baud_rate, bool exit_reparse) {
254
254
 
255
255
  // The Nextion will ignore the upload command if it is sleeping
256
256
  ESP_LOGV(TAG, "Wake-up");
257
- this->ignore_is_setup_ = true;
257
+ this->connection_state_.ignore_is_setup_ = true;
258
258
  this->send_command_("sleep=0");
259
259
  this->send_command_("dim=100");
260
260
  delay(250); // NOLINT
@@ -335,31 +335,6 @@ bool Nextion::upload_tft(uint32_t baud_rate, bool exit_reparse) {
335
335
  return upload_end_(true);
336
336
  }
337
337
 
338
- bool Nextion::upload_end_(bool successful) {
339
- ESP_LOGD(TAG, "TFT upload done: %s", YESNO(successful));
340
-
341
- if (successful) {
342
- ESP_LOGD(TAG, "Restart");
343
- delay(1500); // NOLINT
344
- App.safe_reboot();
345
- delay(1500); // NOLINT
346
- } else {
347
- ESP_LOGE(TAG, "TFT upload failed");
348
-
349
- this->is_updating_ = false;
350
- this->ignore_is_setup_ = false;
351
-
352
- uint32_t baud_rate = this->parent_->get_baud_rate();
353
- if (baud_rate != this->original_baud_rate_) {
354
- ESP_LOGD(TAG, "Baud back: %" PRIu32 "->%" PRIu32, baud_rate, this->original_baud_rate_);
355
- this->parent_->set_baud_rate(this->original_baud_rate_);
356
- this->parent_->load_settings();
357
- }
358
- }
359
-
360
- return successful;
361
- }
362
-
363
338
  #ifdef USE_ESP8266
364
339
  WiFiClient *Nextion::get_wifi_client_() {
365
340
  if (this->tft_url_.compare(0, 6, "https:") == 0) {