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
@@ -1,8 +1,8 @@
1
1
  #include "nextion.h"
2
- #include "esphome/core/util.h"
3
- #include "esphome/core/log.h"
4
- #include "esphome/core/application.h"
5
2
  #include <cinttypes>
3
+ #include "esphome/core/application.h"
4
+ #include "esphome/core/log.h"
5
+ #include "esphome/core/util.h"
6
6
 
7
7
  namespace esphome {
8
8
  namespace nextion {
@@ -11,28 +11,25 @@ static const char *const TAG = "nextion";
11
11
 
12
12
  void Nextion::setup() {
13
13
  this->is_setup_ = false;
14
- this->ignore_is_setup_ = true;
14
+ this->connection_state_.ignore_is_setup_ = true;
15
15
 
16
- // Wake up the nextion
17
- this->send_command_("bkcmd=0");
18
- this->send_command_("sleep=0");
16
+ // Wake up the nextion and ensure clean communication state
17
+ this->send_command_("sleep=0"); // Exit sleep mode if sleeping
18
+ this->send_command_("bkcmd=0"); // Disable return data during init sequence
19
19
 
20
- this->send_command_("bkcmd=0");
21
- this->send_command_("sleep=0");
22
-
23
- // Reboot it
20
+ // Reset device for clean state - critical for reliable communication
24
21
  this->send_command_("rest");
25
22
 
26
- this->ignore_is_setup_ = false;
23
+ this->connection_state_.ignore_is_setup_ = false;
27
24
  }
28
25
 
29
26
  bool Nextion::send_command_(const std::string &command) {
30
- if (!this->ignore_is_setup_ && !this->is_setup()) {
27
+ if (!this->connection_state_.ignore_is_setup_ && !this->is_setup()) {
31
28
  return false;
32
29
  }
33
30
 
34
31
  #ifdef USE_NEXTION_COMMAND_SPACING
35
- if (!this->ignore_is_setup_ && !this->command_pacer_.can_send()) {
32
+ if (!this->connection_state_.ignore_is_setup_ && !this->command_pacer_.can_send()) {
36
33
  ESP_LOGN(TAG, "Command spacing: delaying command '%s'", command.c_str());
37
34
  return false;
38
35
  }
@@ -48,36 +45,31 @@ bool Nextion::send_command_(const std::string &command) {
48
45
  }
49
46
 
50
47
  bool Nextion::check_connect_() {
51
- if (this->is_connected_)
48
+ if (this->connection_state_.is_connected_)
52
49
  return true;
53
50
 
54
- // Check if the handshake should be skipped for the Nextion connection
55
- if (this->skip_connection_handshake_) {
56
- // Log the connection status without handshake
57
- ESP_LOGW(TAG, "Connected (no handshake)");
58
- // Set the connection status to true
59
- this->is_connected_ = true;
60
- // Return true indicating the connection is set
61
- return true;
62
- }
63
-
51
+ #ifdef USE_NEXTION_CONFIG_SKIP_CONNECTION_HANDSHAKE
52
+ ESP_LOGW(TAG, "Connected (no handshake)"); // Log the connection status without handshake
53
+ this->is_connected_ = true; // Set the connection status to true
54
+ return true; // Return true indicating the connection is set
55
+ #else // USE_NEXTION_CONFIG_SKIP_CONNECTION_HANDSHAKE
64
56
  if (this->comok_sent_ == 0) {
65
57
  this->reset_(false);
66
58
 
67
- this->ignore_is_setup_ = true;
59
+ this->connection_state_.ignore_is_setup_ = true;
68
60
  this->send_command_("boguscommand=0"); // bogus command. needed sometimes after updating
69
- if (this->exit_reparse_on_start_) {
70
- this->send_command_("DRAKJHSUYDGBNCJHGJKSHBDN");
71
- }
61
+ #ifdef USE_NEXTION_CONFIG_EXIT_REPARSE_ON_START
62
+ this->send_command_("DRAKJHSUYDGBNCJHGJKSHBDN");
63
+ #endif // USE_NEXTION_CONFIG_EXIT_REPARSE_ON_START
72
64
  this->send_command_("connect");
73
65
 
74
- this->comok_sent_ = millis();
75
- this->ignore_is_setup_ = false;
66
+ this->comok_sent_ = App.get_loop_component_start_time();
67
+ this->connection_state_.ignore_is_setup_ = false;
76
68
 
77
69
  return false;
78
70
  }
79
71
 
80
- if (millis() - this->comok_sent_ <= 500) // Wait 500 ms
72
+ if (App.get_loop_component_start_time() - this->comok_sent_ <= 500) // Wait 500 ms
81
73
  return false;
82
74
 
83
75
  std::string response;
@@ -94,16 +86,16 @@ bool Nextion::check_connect_() {
94
86
  for (size_t i = 0; i < response.length(); i++) {
95
87
  ESP_LOGN(TAG, "resp: %s %d %d %c", response.c_str(), i, response[i], response[i]);
96
88
  }
97
- #endif
89
+ #endif // NEXTION_PROTOCOL_LOG
98
90
 
99
91
  ESP_LOGW(TAG, "Not connected");
100
92
  comok_sent_ = 0;
101
93
  return false;
102
94
  }
103
95
 
104
- this->ignore_is_setup_ = true;
96
+ this->connection_state_.ignore_is_setup_ = true;
105
97
  ESP_LOGI(TAG, "Connected");
106
- this->is_connected_ = true;
98
+ this->connection_state_.is_connected_ = true;
107
99
 
108
100
  ESP_LOGN(TAG, "connect: %s", response.c_str());
109
101
 
@@ -118,18 +110,27 @@ bool Nextion::check_connect_() {
118
110
  this->is_detected_ = (connect_info.size() == 7);
119
111
  if (this->is_detected_) {
120
112
  ESP_LOGN(TAG, "Connect info: %zu", connect_info.size());
121
-
113
+ #ifdef USE_NEXTION_CONFIG_DUMP_DEVICE_INFO
122
114
  this->device_model_ = connect_info[2];
123
115
  this->firmware_version_ = connect_info[3];
124
116
  this->serial_number_ = connect_info[5];
125
117
  this->flash_size_ = connect_info[6];
118
+ #else // USE_NEXTION_CONFIG_DUMP_DEVICE_INFO
119
+ ESP_LOGI(TAG,
120
+ " Device Model: %s\n"
121
+ " FW Version: %s\n"
122
+ " Serial Number: %s\n"
123
+ " Flash Size: %s\n",
124
+ connect_info[2].c_str(), connect_info[3].c_str(), connect_info[5].c_str(), connect_info[6].c_str());
125
+ #endif // USE_NEXTION_CONFIG_DUMP_DEVICE_INFO
126
126
  } else {
127
127
  ESP_LOGE(TAG, "Bad connect value: '%s'", response.c_str());
128
128
  }
129
129
 
130
- this->ignore_is_setup_ = false;
130
+ this->connection_state_.ignore_is_setup_ = false;
131
131
  this->dump_config();
132
132
  return true;
133
+ #endif // USE_NEXTION_CONFIG_SKIP_CONNECTION_HANDSHAKE
133
134
  }
134
135
 
135
136
  void Nextion::reset_(bool reset_nextion) {
@@ -144,36 +145,42 @@ void Nextion::reset_(bool reset_nextion) {
144
145
 
145
146
  void Nextion::dump_config() {
146
147
  ESP_LOGCONFIG(TAG, "Nextion:");
147
- if (this->skip_connection_handshake_) {
148
- ESP_LOGCONFIG(TAG, " Skip handshake: %s", YESNO(this->skip_connection_handshake_));
149
- } else {
150
- ESP_LOGCONFIG(TAG,
151
- " Device Model: %s\n"
152
- " FW Version: %s\n"
153
- " Serial Number: %s\n"
154
- " Flash Size: %s",
155
- this->device_model_.c_str(), this->firmware_version_.c_str(), this->serial_number_.c_str(),
156
- this->flash_size_.c_str());
157
- }
148
+
149
+ #ifdef USE_NEXTION_CONFIG_SKIP_CONNECTION_HANDSHAKE
150
+ ESP_LOGCONFIG(TAG, " Skip handshake: YES");
151
+ #else // USE_NEXTION_CONFIG_SKIP_CONNECTION_HANDSHAKE
158
152
  ESP_LOGCONFIG(TAG,
153
+ #ifdef USE_NEXTION_CONFIG_DUMP_DEVICE_INFO
154
+ " Device Model: %s\n"
155
+ " FW Version: %s\n"
156
+ " Serial Number: %s\n"
157
+ " Flash Size: %s\n"
158
+ #endif // USE_NEXTION_CONFIG_DUMP_DEVICE_INFO
159
+ #ifdef USE_NEXTION_CONFIG_EXIT_REPARSE_ON_START
160
+ " Exit reparse: YES\n"
161
+ #endif // USE_NEXTION_CONFIG_EXIT_REPARSE_ON_START
159
162
  " Wake On Touch: %s\n"
160
- " Exit reparse: %s",
161
- YESNO(this->auto_wake_on_touch_), YESNO(this->exit_reparse_on_start_));
163
+ " Touch Timeout: %" PRIu16,
164
+ #ifdef USE_NEXTION_CONFIG_DUMP_DEVICE_INFO
165
+ this->device_model_.c_str(), this->firmware_version_.c_str(), this->serial_number_.c_str(),
166
+ this->flash_size_.c_str(),
167
+ #endif // USE_NEXTION_CONFIG_DUMP_DEVICE_INFO
168
+ YESNO(this->connection_state_.auto_wake_on_touch_), this->touch_sleep_timeout_);
169
+ #endif // USE_NEXTION_CONFIG_SKIP_CONNECTION_HANDSHAKE
170
+
162
171
  #ifdef USE_NEXTION_MAX_COMMANDS_PER_LOOP
163
172
  ESP_LOGCONFIG(TAG, " Max commands per loop: %u", this->max_commands_per_loop_);
164
173
  #endif // USE_NEXTION_MAX_COMMANDS_PER_LOOP
165
174
 
166
- if (this->touch_sleep_timeout_ != 0) {
167
- ESP_LOGCONFIG(TAG, " Touch Timeout: %" PRIu32, this->touch_sleep_timeout_);
168
- }
169
-
170
- if (this->wake_up_page_ != -1) {
171
- ESP_LOGCONFIG(TAG, " Wake Up Page: %d", this->wake_up_page_);
175
+ if (this->wake_up_page_ != 255) {
176
+ ESP_LOGCONFIG(TAG, " Wake Up Page: %u", this->wake_up_page_);
172
177
  }
173
178
 
174
- if (this->start_up_page_ != -1) {
175
- ESP_LOGCONFIG(TAG, " Start Up Page: %d", this->start_up_page_);
179
+ #ifdef USE_NEXTION_CONF_START_UP_PAGE
180
+ if (this->start_up_page_ != 255) {
181
+ ESP_LOGCONFIG(TAG, " Start Up Page: %u", this->start_up_page_);
176
182
  }
183
+ #endif // USE_NEXTION_CONF_START_UP_PAGE
177
184
 
178
185
  #ifdef USE_NEXTION_COMMAND_SPACING
179
186
  ESP_LOGCONFIG(TAG, " Cmd spacing: %u ms", this->command_pacer_.get_spacing());
@@ -219,7 +226,7 @@ void Nextion::add_buffer_overflow_event_callback(std::function<void()> &&callbac
219
226
  }
220
227
 
221
228
  void Nextion::update_all_components() {
222
- if ((!this->is_setup() && !this->ignore_is_setup_) || this->is_sleeping())
229
+ if ((!this->is_setup() && !this->connection_state_.ignore_is_setup_) || this->is_sleeping())
223
230
  return;
224
231
 
225
232
  for (auto *binarysensortype : this->binarysensortype_) {
@@ -237,7 +244,7 @@ void Nextion::update_all_components() {
237
244
  }
238
245
 
239
246
  bool Nextion::send_command(const char *command) {
240
- if ((!this->is_setup() && !this->ignore_is_setup_) || this->is_sleeping())
247
+ if ((!this->is_setup() && !this->connection_state_.ignore_is_setup_) || this->is_sleeping())
241
248
  return false;
242
249
 
243
250
  if (this->send_command_(command)) {
@@ -248,7 +255,7 @@ bool Nextion::send_command(const char *command) {
248
255
  }
249
256
 
250
257
  bool Nextion::send_command_printf(const char *format, ...) {
251
- if ((!this->is_setup() && !this->ignore_is_setup_) || this->is_sleeping())
258
+ if ((!this->is_setup() && !this->connection_state_.ignore_is_setup_) || this->is_sleeping())
252
259
  return false;
253
260
 
254
261
  char buffer[256];
@@ -289,43 +296,72 @@ void Nextion::print_queue_members_() {
289
296
  #endif
290
297
 
291
298
  void Nextion::loop() {
292
- if (!this->check_connect_() || this->is_updating_)
299
+ if (!this->check_connect_() || this->connection_state_.is_updating_)
293
300
  return;
294
301
 
295
- if (this->nextion_reports_is_setup_ && !this->sent_setup_commands_) {
296
- this->ignore_is_setup_ = true;
297
- this->sent_setup_commands_ = true;
302
+ if (this->connection_state_.nextion_reports_is_setup_ && !this->connection_state_.sent_setup_commands_) {
303
+ this->connection_state_.ignore_is_setup_ = true;
304
+ this->connection_state_.sent_setup_commands_ = true;
298
305
  this->send_command_("bkcmd=3"); // Always, returns 0x00 to 0x23 result of serial command.
299
306
 
300
307
  if (this->brightness_.has_value()) {
301
308
  this->set_backlight_brightness(this->brightness_.value());
302
309
  }
303
310
 
311
+ #ifdef USE_NEXTION_CONF_START_UP_PAGE
304
312
  // Check if a startup page has been set and send the command
305
- if (this->start_up_page_ != -1) {
313
+ if (this->start_up_page_ != 255) {
306
314
  this->goto_page(this->start_up_page_);
307
315
  }
316
+ #endif // USE_NEXTION_CONF_START_UP_PAGE
308
317
 
309
- if (this->wake_up_page_ != -1) {
318
+ if (this->wake_up_page_ != 255) {
310
319
  this->set_wake_up_page(this->wake_up_page_);
311
320
  }
312
321
 
313
- this->ignore_is_setup_ = false;
322
+ if (this->touch_sleep_timeout_ != 0) {
323
+ this->set_touch_sleep_timeout(this->touch_sleep_timeout_);
324
+ }
325
+
326
+ this->connection_state_.ignore_is_setup_ = false;
314
327
  }
315
328
 
316
329
  this->process_serial_(); // Receive serial data
317
330
  this->process_nextion_commands_(); // Process nextion return commands
318
331
 
319
- if (!this->nextion_reports_is_setup_) {
332
+ if (!this->connection_state_.nextion_reports_is_setup_) {
320
333
  if (this->started_ms_ == 0)
321
- this->started_ms_ = millis();
334
+ this->started_ms_ = App.get_loop_component_start_time();
322
335
 
323
- if (this->started_ms_ + this->startup_override_ms_ < millis()) {
336
+ if (this->started_ms_ + this->startup_override_ms_ < App.get_loop_component_start_time()) {
324
337
  ESP_LOGD(TAG, "Manual ready set");
325
- this->nextion_reports_is_setup_ = true;
338
+ this->connection_state_.nextion_reports_is_setup_ = true;
339
+ }
340
+ }
341
+
342
+ #ifdef USE_NEXTION_COMMAND_SPACING
343
+ // Try to send any pending commands if spacing allows
344
+ this->process_pending_in_queue_();
345
+ #endif // USE_NEXTION_COMMAND_SPACING
346
+ }
347
+
348
+ #ifdef USE_NEXTION_COMMAND_SPACING
349
+ void Nextion::process_pending_in_queue_() {
350
+ if (this->nextion_queue_.empty() || !this->command_pacer_.can_send()) {
351
+ return;
352
+ }
353
+
354
+ // Check if first item in queue has a pending command
355
+ auto *front_item = this->nextion_queue_.front();
356
+ if (front_item && !front_item->pending_command.empty()) {
357
+ if (this->send_command_(front_item->pending_command)) {
358
+ // Command sent successfully, clear the pending command
359
+ front_item->pending_command.clear();
360
+ ESP_LOGVV(TAG, "Pending command sent: %s", front_item->component->get_variable_name().c_str());
326
361
  }
327
362
  }
328
363
  }
364
+ #endif // USE_NEXTION_COMMAND_SPACING
329
365
 
330
366
  bool Nextion::remove_from_q_(bool report_empty) {
331
367
  if (this->nextion_queue_.empty()) {
@@ -395,12 +431,12 @@ void Nextion::process_nextion_commands_() {
395
431
  ESP_LOGN(TAG, "Add 0xFF");
396
432
  }
397
433
 
398
- this->nextion_event_ = this->command_data_[0];
434
+ const uint8_t nextion_event = this->command_data_[0];
399
435
 
400
436
  to_process_length -= 1;
401
437
  to_process = this->command_data_.substr(1, to_process_length);
402
438
 
403
- switch (this->nextion_event_) {
439
+ switch (nextion_event) {
404
440
  case 0x00: // instruction sent by user has failed
405
441
  ESP_LOGW(TAG, "Invalid instruction");
406
442
  this->remove_from_q_();
@@ -409,7 +445,7 @@ void Nextion::process_nextion_commands_() {
409
445
  case 0x01: // instruction sent by user was successful
410
446
 
411
447
  ESP_LOGVV(TAG, "Cmd OK");
412
- ESP_LOGN(TAG, "this->nextion_queue_.empty() %s", this->nextion_queue_.empty() ? "True" : "False");
448
+ ESP_LOGN(TAG, "this->nextion_queue_.empty() %s", YESNO(this->nextion_queue_.empty()));
413
449
 
414
450
  this->remove_from_q_();
415
451
  if (!this->is_setup_) {
@@ -421,7 +457,7 @@ void Nextion::process_nextion_commands_() {
421
457
  }
422
458
  #ifdef USE_NEXTION_COMMAND_SPACING
423
459
  this->command_pacer_.mark_sent(); // Here is where we should mark the command as sent
424
- ESP_LOGN(TAG, "Command spacing: marked command sent at %u ms", millis());
460
+ ESP_LOGN(TAG, "Command spacing: marked command sent");
425
461
  #endif
426
462
  break;
427
463
  case 0x02: // invalid Component ID or name was used
@@ -539,9 +575,9 @@ void Nextion::process_nextion_commands_() {
539
575
  break;
540
576
  }
541
577
 
542
- uint16_t x = (uint16_t(to_process[0]) << 8) | to_process[1];
543
- uint16_t y = (uint16_t(to_process[2]) << 8) | to_process[3];
544
- uint8_t touch_event = to_process[4]; // 0 -> release, 1 -> press
578
+ const uint16_t x = (uint16_t(to_process[0]) << 8) | to_process[1];
579
+ const uint16_t y = (uint16_t(to_process[2]) << 8) | to_process[3];
580
+ const uint8_t touch_event = to_process[4]; // 0 -> release, 1 -> press
545
581
  ESP_LOGD(TAG, "Touch %s at %u,%u", touch_event ? "PRESS" : "RELEASE", x, y);
546
582
  break;
547
583
  }
@@ -642,7 +678,7 @@ void Nextion::process_nextion_commands_() {
642
678
  case 0x88: // system successful start up
643
679
  {
644
680
  ESP_LOGD(TAG, "System start: %zu", to_process_length);
645
- this->nextion_reports_is_setup_ = true;
681
+ this->connection_state_.nextion_reports_is_setup_ = true;
646
682
  break;
647
683
  }
648
684
  case 0x89: { // start SD card upgrade
@@ -797,15 +833,14 @@ void Nextion::process_nextion_commands_() {
797
833
  break;
798
834
  }
799
835
  default:
800
- ESP_LOGW(TAG, "Unknown event: 0x%02X", this->nextion_event_);
836
+ ESP_LOGW(TAG, "Unknown event: 0x%02X", nextion_event);
801
837
  break;
802
838
  }
803
839
 
804
- // ESP_LOGN(TAG, "nextion_event_ deleting from 0 to %d", to_process_length + COMMAND_DELIMITER.length() + 1);
805
840
  this->command_data_.erase(0, to_process_length + COMMAND_DELIMITER.length() + 1);
806
841
  }
807
842
 
808
- uint32_t ms = millis();
843
+ const uint32_t ms = App.get_loop_component_start_time();
809
844
 
810
845
  if (!this->nextion_queue_.empty() && this->nextion_queue_.front()->queue_time + this->max_q_age_ms_ < ms) {
811
846
  for (size_t i = 0; i < this->nextion_queue_.size(); i++) {
@@ -937,14 +972,12 @@ void Nextion::update_components_by_prefix(const std::string &prefix) {
937
972
  }
938
973
 
939
974
  uint16_t Nextion::recv_ret_string_(std::string &response, uint32_t timeout, bool recv_flag) {
940
- uint16_t ret = 0;
941
975
  uint8_t c = 0;
942
976
  uint8_t nr_of_ff_bytes = 0;
943
- uint64_t start;
944
977
  bool exit_flag = false;
945
978
  bool ff_flag = false;
946
979
 
947
- start = millis();
980
+ const uint32_t start = millis();
948
981
 
949
982
  while ((timeout == 0 && this->available()) || millis() - start <= timeout) {
950
983
  if (!this->available()) {
@@ -981,8 +1014,7 @@ uint16_t Nextion::recv_ret_string_(std::string &response, uint32_t timeout, bool
981
1014
  if (ff_flag)
982
1015
  response = response.substr(0, response.length() - 3); // Remove last 3 0xFF
983
1016
 
984
- ret = response.length();
985
- return ret;
1017
+ return response.length();
986
1018
  }
987
1019
 
988
1020
  /**
@@ -1003,7 +1035,7 @@ void Nextion::add_no_result_to_queue_(const std::string &variable_name) {
1003
1035
  }
1004
1036
  #endif
1005
1037
 
1006
- ExternalRAMAllocator<nextion::NextionQueue> allocator(ExternalRAMAllocator<nextion::NextionQueue>::ALLOW_FAILURE);
1038
+ RAMAllocator<nextion::NextionQueue> allocator;
1007
1039
  nextion::NextionQueue *nextion_queue = allocator.allocate(1);
1008
1040
  if (nextion_queue == nullptr) {
1009
1041
  ESP_LOGW(TAG, "Queue alloc failed");
@@ -1029,17 +1061,50 @@ void Nextion::add_no_result_to_queue_(const std::string &variable_name) {
1029
1061
  * @param command
1030
1062
  */
1031
1063
  void Nextion::add_no_result_to_queue_with_command_(const std::string &variable_name, const std::string &command) {
1032
- if ((!this->is_setup() && !this->ignore_is_setup_) || command.empty())
1064
+ if ((!this->is_setup() && !this->connection_state_.ignore_is_setup_) || command.empty())
1033
1065
  return;
1034
1066
 
1035
1067
  if (this->send_command_(command)) {
1036
1068
  this->add_no_result_to_queue_(variable_name);
1069
+ #ifdef USE_NEXTION_COMMAND_SPACING
1070
+ } else {
1071
+ // Command blocked by spacing, add to queue WITH the command for retry
1072
+ this->add_no_result_to_queue_with_pending_command_(variable_name, command);
1073
+ #endif // USE_NEXTION_COMMAND_SPACING
1074
+ }
1075
+ }
1076
+
1077
+ #ifdef USE_NEXTION_COMMAND_SPACING
1078
+ void Nextion::add_no_result_to_queue_with_pending_command_(const std::string &variable_name,
1079
+ const std::string &command) {
1080
+ #ifdef USE_NEXTION_MAX_QUEUE_SIZE
1081
+ if (this->max_queue_size_ > 0 && this->nextion_queue_.size() >= this->max_queue_size_) {
1082
+ ESP_LOGW(TAG, "Queue full (%zu), drop: %s", this->nextion_queue_.size(), variable_name.c_str());
1083
+ return;
1084
+ }
1085
+ #endif
1086
+
1087
+ RAMAllocator<nextion::NextionQueue> allocator;
1088
+ nextion::NextionQueue *nextion_queue = allocator.allocate(1);
1089
+ if (nextion_queue == nullptr) {
1090
+ ESP_LOGW(TAG, "Queue alloc failed");
1091
+ return;
1037
1092
  }
1093
+ new (nextion_queue) nextion::NextionQueue();
1094
+
1095
+ nextion_queue->component = new nextion::NextionComponentBase;
1096
+ nextion_queue->component->set_variable_name(variable_name);
1097
+ nextion_queue->queue_time = App.get_loop_component_start_time();
1098
+ nextion_queue->pending_command = command; // Store command for retry
1099
+
1100
+ this->nextion_queue_.push_back(nextion_queue);
1101
+ ESP_LOGVV(TAG, "Queue with pending command: %s", variable_name.c_str());
1038
1102
  }
1103
+ #endif // USE_NEXTION_COMMAND_SPACING
1039
1104
 
1040
1105
  bool Nextion::add_no_result_to_queue_with_ignore_sleep_printf_(const std::string &variable_name, const char *format,
1041
1106
  ...) {
1042
- if ((!this->is_setup() && !this->ignore_is_setup_))
1107
+ if ((!this->is_setup() && !this->connection_state_.ignore_is_setup_))
1043
1108
  return false;
1044
1109
 
1045
1110
  char buffer[256];
@@ -1064,7 +1129,7 @@ bool Nextion::add_no_result_to_queue_with_ignore_sleep_printf_(const std::string
1064
1129
  * @param ... The format arguments
1065
1130
  */
1066
1131
  bool Nextion::add_no_result_to_queue_with_printf_(const std::string &variable_name, const char *format, ...) {
1067
- if ((!this->is_setup() && !this->ignore_is_setup_) || this->is_sleeping())
1132
+ if ((!this->is_setup() && !this->connection_state_.ignore_is_setup_) || this->is_sleeping())
1068
1133
  return false;
1069
1134
 
1070
1135
  char buffer[256];
@@ -1103,7 +1168,7 @@ void Nextion::add_no_result_to_queue_with_set(const std::string &variable_name,
1103
1168
  void Nextion::add_no_result_to_queue_with_set_internal_(const std::string &variable_name,
1104
1169
  const std::string &variable_name_to_send, int32_t state_value,
1105
1170
  bool is_sleep_safe) {
1106
- if ((!this->is_setup() && !this->ignore_is_setup_) || (!is_sleep_safe && this->is_sleeping()))
1171
+ if ((!this->is_setup() && !this->connection_state_.ignore_is_setup_) || (!is_sleep_safe && this->is_sleeping()))
1107
1172
  return;
1108
1173
 
1109
1174
  this->add_no_result_to_queue_with_ignore_sleep_printf_(variable_name, "%s=%" PRId32, variable_name_to_send.c_str(),
@@ -1131,7 +1196,7 @@ void Nextion::add_no_result_to_queue_with_set(const std::string &variable_name,
1131
1196
  void Nextion::add_no_result_to_queue_with_set_internal_(const std::string &variable_name,
1132
1197
  const std::string &variable_name_to_send,
1133
1198
  const std::string &state_value, bool is_sleep_safe) {
1134
- if ((!this->is_setup() && !this->ignore_is_setup_) || (!is_sleep_safe && this->is_sleeping()))
1199
+ if ((!this->is_setup() && !this->connection_state_.ignore_is_setup_) || (!is_sleep_safe && this->is_sleeping()))
1135
1200
  return;
1136
1201
 
1137
1202
  this->add_no_result_to_queue_with_printf_(variable_name, "%s=\"%s\"", variable_name_to_send.c_str(),
@@ -1148,7 +1213,7 @@ void Nextion::add_no_result_to_queue_with_set_internal_(const std::string &varia
1148
1213
  * @param component Pointer to the Nextion component that will handle the response.
1149
1214
  */
1150
1215
  void Nextion::add_to_get_queue(NextionComponentBase *component) {
1151
- if ((!this->is_setup() && !this->ignore_is_setup_))
1216
+ if ((!this->is_setup() && !this->connection_state_.ignore_is_setup_))
1152
1217
  return;
1153
1218
 
1154
1219
  #ifdef USE_NEXTION_MAX_QUEUE_SIZE
@@ -1159,7 +1224,7 @@ void Nextion::add_to_get_queue(NextionComponentBase *component) {
1159
1224
  }
1160
1225
  #endif
1161
1226
 
1162
- ExternalRAMAllocator<nextion::NextionQueue> allocator(ExternalRAMAllocator<nextion::NextionQueue>::ALLOW_FAILURE);
1227
+ RAMAllocator<nextion::NextionQueue> allocator;
1163
1228
  nextion::NextionQueue *nextion_queue = allocator.allocate(1);
1164
1229
  if (nextion_queue == nullptr) {
1165
1230
  ESP_LOGW(TAG, "Queue alloc failed");
@@ -1168,7 +1233,7 @@ void Nextion::add_to_get_queue(NextionComponentBase *component) {
1168
1233
  new (nextion_queue) nextion::NextionQueue();
1169
1234
 
1170
1235
  nextion_queue->component = component;
1171
- nextion_queue->queue_time = millis();
1236
+ nextion_queue->queue_time = App.get_loop_component_start_time();
1172
1237
 
1173
1238
  ESP_LOGN(TAG, "Queue %s: %s", component->get_queue_type_string().c_str(), component->get_variable_name().c_str());
1174
1239
 
@@ -1188,10 +1253,10 @@ void Nextion::add_to_get_queue(NextionComponentBase *component) {
1188
1253
  * @param buffer_size The buffer data
1189
1254
  */
1190
1255
  void Nextion::add_addt_command_to_queue(NextionComponentBase *component) {
1191
- if ((!this->is_setup() && !this->ignore_is_setup_) || this->is_sleeping())
1256
+ if ((!this->is_setup() && !this->connection_state_.ignore_is_setup_) || this->is_sleeping())
1192
1257
  return;
1193
1258
 
1194
- ExternalRAMAllocator<nextion::NextionQueue> allocator(ExternalRAMAllocator<nextion::NextionQueue>::ALLOW_FAILURE);
1259
+ RAMAllocator<nextion::NextionQueue> allocator;
1195
1260
  nextion::NextionQueue *nextion_queue = allocator.allocate(1);
1196
1261
  if (nextion_queue == nullptr) {
1197
1262
  ESP_LOGW(TAG, "Queue alloc failed");
@@ -1200,7 +1265,7 @@ void Nextion::add_addt_command_to_queue(NextionComponentBase *component) {
1200
1265
  new (nextion_queue) nextion::NextionQueue();
1201
1266
 
1202
1267
  nextion_queue->component = component;
1203
- nextion_queue->queue_time = millis();
1268
+ nextion_queue->queue_time = App.get_loop_component_start_time();
1204
1269
 
1205
1270
  this->waveform_queue_.push_back(nextion_queue);
1206
1271
  if (this->waveform_queue_.size() == 1)
@@ -1229,7 +1294,7 @@ void Nextion::set_writer(const nextion_writer_t &writer) { this->writer_ = write
1229
1294
  ESPDEPRECATED("set_wait_for_ack(bool) deprecated, no effect", "v1.20")
1230
1295
  void Nextion::set_wait_for_ack(bool wait_for_ack) { ESP_LOGE(TAG, "Deprecated"); }
1231
1296
 
1232
- bool Nextion::is_updating() { return this->is_updating_; }
1297
+ bool Nextion::is_updating() { return this->connection_state_.is_updating_; }
1233
1298
 
1234
1299
  } // namespace nextion
1235
1300
  } // namespace esphome