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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (648) hide show
  1. esphome/__main__.py +1 -3
  2. esphome/codegen.py +2 -0
  3. esphome/components/ac_dimmer/ac_dimmer.cpp +6 -6
  4. esphome/components/adc/__init__.py +25 -1
  5. esphome/components/adc/adc_sensor.h +11 -11
  6. esphome/components/adc/adc_sensor_common.cpp +1 -1
  7. esphome/components/adc/adc_sensor_esp32.cpp +16 -8
  8. esphome/components/ade7880/ade7880.h +0 -2
  9. esphome/components/ads1115/ads1115.h +0 -1
  10. esphome/components/ads1118/ads1118.h +0 -1
  11. esphome/components/ags10/ags10.h +0 -2
  12. esphome/components/aic3204/aic3204.h +0 -1
  13. esphome/components/alarm_control_panel/__init__.py +5 -2
  14. esphome/components/alpha3/alpha3.h +0 -1
  15. esphome/components/am43/cover/am43_cover.h +0 -1
  16. esphome/components/am43/sensor/am43_sensor.h +0 -1
  17. esphome/components/analog_threshold/analog_threshold_binary_sensor.h +0 -2
  18. esphome/components/anova/anova.cpp +5 -1
  19. esphome/components/anova/anova.h +0 -1
  20. esphome/components/apds9960/apds9960.cpp +1 -1
  21. esphome/components/api/__init__.py +57 -21
  22. esphome/components/api/api_connection.cpp +344 -539
  23. esphome/components/api/api_connection.h +224 -141
  24. esphome/components/api/api_frame_helper.cpp +91 -127
  25. esphome/components/api/api_frame_helper.h +64 -54
  26. esphome/components/api/api_pb2.cpp +1837 -9044
  27. esphome/components/api/api_pb2.h +532 -685
  28. esphome/components/api/api_pb2_dump.cpp +4432 -0
  29. esphome/components/api/api_pb2_service.cpp +184 -425
  30. esphome/components/api/api_pb2_service.h +13 -6
  31. esphome/components/api/api_server.cpp +131 -167
  32. esphome/components/api/api_server.h +38 -10
  33. esphome/components/api/client.py +10 -4
  34. esphome/components/api/custom_api_device.h +8 -0
  35. esphome/components/api/list_entities.cpp +37 -104
  36. esphome/components/api/list_entities.h +33 -23
  37. esphome/components/api/proto.h +532 -26
  38. esphome/components/api/subscribe_state.cpp +23 -29
  39. esphome/components/api/subscribe_state.h +26 -19
  40. esphome/components/api/user_services.h +2 -0
  41. esphome/components/as3935_spi/as3935_spi.h +0 -2
  42. esphome/components/as5600/as5600.h +0 -1
  43. esphome/components/async_tcp/__init__.py +14 -5
  44. esphome/components/atc_mithermometer/atc_mithermometer.h +0 -1
  45. esphome/components/atm90e32/atm90e32.cpp +2 -1
  46. esphome/components/audio/audio_decoder.cpp +1 -1
  47. esphome/components/audio/audio_transfer_buffer.cpp +2 -2
  48. esphome/components/b_parasite/b_parasite.h +0 -1
  49. esphome/components/bedjet/bedjet_hub.cpp +5 -1
  50. esphome/components/bedjet/climate/bedjet_climate.cpp +5 -1
  51. esphome/components/beken_spi_led_strip/led_strip.cpp +4 -2
  52. esphome/components/bh1750/bh1750.cpp +5 -5
  53. esphome/components/binary_sensor/__init__.py +82 -5
  54. esphome/components/binary_sensor/automation.h +19 -1
  55. esphome/components/binary_sensor/binary_sensor.cpp +12 -30
  56. esphome/components/binary_sensor/binary_sensor.h +11 -25
  57. esphome/components/binary_sensor/filter.cpp +29 -24
  58. esphome/components/binary_sensor/filter.h +20 -10
  59. esphome/components/ble_client/output/ble_binary_output.h +0 -1
  60. esphome/components/ble_client/sensor/ble_rssi_sensor.cpp +5 -1
  61. esphome/components/ble_client/sensor/ble_rssi_sensor.h +0 -1
  62. esphome/components/ble_client/sensor/ble_sensor.cpp +5 -1
  63. esphome/components/ble_client/sensor/ble_sensor.h +0 -1
  64. esphome/components/ble_client/switch/ble_switch.h +0 -1
  65. esphome/components/ble_client/text_sensor/ble_text_sensor.cpp +5 -1
  66. esphome/components/ble_client/text_sensor/ble_text_sensor.h +0 -1
  67. esphome/components/ble_presence/ble_presence_device.h +0 -1
  68. esphome/components/ble_rssi/ble_rssi_sensor.h +0 -1
  69. esphome/components/ble_scanner/ble_scanner.h +0 -1
  70. esphome/components/bluetooth_proxy/bluetooth_connection.h +9 -2
  71. esphome/components/bluetooth_proxy/bluetooth_proxy.cpp +16 -6
  72. esphome/components/bluetooth_proxy/bluetooth_proxy.h +8 -2
  73. esphome/components/bme680/sensor.py +1 -1
  74. esphome/components/bmp581/bmp581.h +0 -2
  75. esphome/components/button/__init__.py +5 -2
  76. esphome/components/camera/__init__.py +1 -0
  77. esphome/components/camera/camera.cpp +22 -0
  78. esphome/components/camera/camera.h +80 -0
  79. esphome/components/canbus/__init__.py +1 -0
  80. esphome/components/cap1188/cap1188.h +0 -1
  81. esphome/components/captive_portal/__init__.py +12 -2
  82. esphome/components/captive_portal/captive_portal.cpp +12 -2
  83. esphome/components/captive_portal/captive_portal.h +5 -2
  84. esphome/components/ccs811/ccs811.h +0 -2
  85. esphome/components/climate/__init__.py +5 -2
  86. esphome/components/cm1106/sensor.py +2 -2
  87. esphome/components/const/__init__.py +2 -0
  88. esphome/components/copy/binary_sensor/copy_binary_sensor.h +0 -1
  89. esphome/components/copy/button/copy_button.h +0 -1
  90. esphome/components/copy/cover/copy_cover.h +0 -1
  91. esphome/components/copy/fan/copy_fan.h +0 -1
  92. esphome/components/copy/lock/copy_lock.h +0 -1
  93. esphome/components/copy/number/copy_number.h +0 -1
  94. esphome/components/copy/select/copy_select.h +0 -1
  95. esphome/components/copy/sensor/copy_sensor.h +0 -1
  96. esphome/components/copy/switch/copy_switch.h +0 -1
  97. esphome/components/copy/text/copy_text.h +0 -1
  98. esphome/components/copy/text_sensor/copy_text_sensor.h +0 -1
  99. esphome/components/cover/__init__.py +5 -2
  100. esphome/components/cs5460a/cs5460a.h +0 -1
  101. esphome/components/datetime/__init__.py +4 -2
  102. esphome/components/debug/__init__.py +20 -0
  103. esphome/components/debug/debug_esp32.cpp +2 -0
  104. esphome/components/deep_sleep/__init__.py +43 -9
  105. esphome/components/demo/__init__.py +2 -2
  106. esphome/components/display/display.cpp +4 -3
  107. esphome/components/display/display.h +0 -2
  108. esphome/components/display/display_buffer.cpp +1 -1
  109. esphome/components/ds2484/__init__.py +1 -0
  110. esphome/components/ds2484/ds2484.cpp +209 -0
  111. esphome/components/ds2484/ds2484.h +43 -0
  112. esphome/components/ds2484/one_wire.py +37 -0
  113. esphome/components/duty_time/duty_time_sensor.h +0 -1
  114. esphome/components/ens160_base/ens160_base.h +0 -1
  115. esphome/components/es7210/es7210.h +0 -1
  116. esphome/components/es7243e/es7243e.h +0 -1
  117. esphome/components/es8156/es8156.h +0 -1
  118. esphome/components/es8311/es8311.h +0 -1
  119. esphome/components/es8388/es8388.h +0 -1
  120. esphome/components/esp32/__init__.py +103 -135
  121. esphome/components/esp32/core.cpp +0 -4
  122. esphome/components/esp32/gpio.h +1 -1
  123. esphome/components/esp32/helpers.cpp +69 -0
  124. esphome/components/esp32_ble/ble.cpp +5 -6
  125. esphome/components/esp32_ble/ble.h +29 -14
  126. esphome/components/esp32_ble/ble_event.h +6 -6
  127. esphome/components/esp32_ble_client/ble_client_base.cpp +21 -6
  128. esphome/components/esp32_ble_client/ble_client_base.h +24 -9
  129. esphome/components/esp32_ble_tracker/__init__.py +2 -8
  130. esphome/components/esp32_ble_tracker/esp32_ble_tracker.cpp +5 -5
  131. esphome/components/esp32_ble_tracker/esp32_ble_tracker.h +11 -7
  132. esphome/components/esp32_camera/__init__.py +112 -98
  133. esphome/components/esp32_camera/esp32_camera.cpp +41 -31
  134. esphome/components/esp32_camera/esp32_camera.h +35 -30
  135. esphome/components/esp32_camera_web_server/__init__.py +2 -1
  136. esphome/components/esp32_camera_web_server/camera_web_server.cpp +8 -8
  137. esphome/components/esp32_camera_web_server/camera_web_server.h +3 -3
  138. esphome/components/esp32_hall/sensor.py +2 -21
  139. esphome/components/esp32_hosted/__init__.py +101 -0
  140. esphome/components/esp32_hosted/esp32_hosted.py.script +12 -0
  141. esphome/components/esp32_improv/esp32_improv_component.cpp +3 -0
  142. esphome/components/esp32_rmt/__init__.py +0 -58
  143. esphome/components/esp32_rmt_led_strip/led_strip.cpp +77 -63
  144. esphome/components/esp32_rmt_led_strip/led_strip.h +11 -17
  145. esphome/components/esp32_rmt_led_strip/light.py +14 -76
  146. esphome/components/esp32_touch/esp32_touch.h +174 -28
  147. esphome/components/esp32_touch/esp32_touch_common.cpp +162 -0
  148. esphome/components/esp32_touch/esp32_touch_v1.cpp +240 -0
  149. esphome/components/esp32_touch/esp32_touch_v2.cpp +397 -0
  150. esphome/components/esp8266/__init__.py +2 -0
  151. esphome/components/esp8266/gpio.cpp +10 -10
  152. esphome/components/esp8266/helpers.cpp +31 -0
  153. esphome/components/esp_ldo/__init__.py +10 -8
  154. esphome/components/esp_ldo/esp_ldo.h +3 -0
  155. esphome/components/esphome/ota/__init__.py +1 -0
  156. esphome/components/esphome/ota/ota_esphome.cpp +24 -19
  157. esphome/components/ethernet/__init__.py +42 -23
  158. esphome/components/ethernet/esp_eth_phy_jl1101.c +0 -16
  159. esphome/components/ethernet/ethernet_component.cpp +69 -29
  160. esphome/components/ethernet/ethernet_component.h +18 -10
  161. esphome/components/event/__init__.py +5 -2
  162. esphome/components/ezo/ezo.h +0 -1
  163. esphome/components/ezo_pmp/ezo_pmp.h +0 -1
  164. esphome/components/fan/__init__.py +5 -2
  165. esphome/components/fan/fan.cpp +4 -0
  166. esphome/components/feedback/feedback_cover.h +0 -1
  167. esphome/components/font/__init__.py +92 -82
  168. esphome/components/font/font.cpp +9 -2
  169. esphome/components/font/font.h +20 -5
  170. esphome/components/fs3000/fs3000.h +0 -1
  171. esphome/components/gcja5/gcja5.h +0 -1
  172. esphome/components/gl_r01_i2c/__init__.py +0 -0
  173. esphome/components/gl_r01_i2c/gl_r01_i2c.cpp +68 -0
  174. esphome/components/gl_r01_i2c/gl_r01_i2c.h +22 -0
  175. esphome/components/gl_r01_i2c/sensor.py +36 -0
  176. esphome/components/gp8403/gp8403.h +0 -1
  177. esphome/components/gpio/binary_sensor/__init__.py +39 -1
  178. esphome/components/gpio/binary_sensor/gpio_binary_sensor.cpp +77 -3
  179. esphome/components/gpio/binary_sensor/gpio_binary_sensor.h +40 -0
  180. esphome/components/grove_gas_mc_v2/grove_gas_mc_v2.h +0 -2
  181. esphome/components/he60r/he60r.h +0 -1
  182. esphome/components/heatpumpir/climate.py +2 -1
  183. esphome/components/heatpumpir/heatpumpir.cpp +1 -0
  184. esphome/components/heatpumpir/heatpumpir.h +1 -0
  185. esphome/components/honeywellabp2_i2c/honeywellabp2.h +0 -1
  186. esphome/components/host/__init__.py +3 -1
  187. esphome/components/host/helpers.cpp +57 -0
  188. esphome/components/http_request/__init__.py +19 -1
  189. esphome/components/http_request/http_request.h +1 -1
  190. esphome/components/http_request/http_request_arduino.cpp +0 -1
  191. esphome/components/http_request/http_request_arduino.h +1 -0
  192. esphome/components/http_request/http_request_idf.cpp +0 -1
  193. esphome/components/http_request/ota/ota_http_request.cpp +1 -1
  194. esphome/components/http_request/update/http_request_update.cpp +35 -16
  195. esphome/components/hydreon_rgxx/hydreon_rgxx.cpp +3 -9
  196. esphome/components/hydreon_rgxx/sensor.py +1 -1
  197. esphome/components/i2c/__init__.py +23 -11
  198. esphome/components/i2c/i2c_bus.h +8 -1
  199. esphome/components/i2c/i2c_bus_arduino.cpp +4 -3
  200. esphome/components/i2c/i2c_bus_arduino.h +6 -3
  201. esphome/components/i2c/i2c_bus_esp_idf.h +5 -3
  202. esphome/components/i2c_device/i2c_device.h +0 -1
  203. esphome/components/i2s_audio/__init__.py +2 -10
  204. esphome/components/i2s_audio/i2s_audio.cpp +1 -5
  205. esphome/components/i2s_audio/media_player/__init__.py +2 -2
  206. esphome/components/i2s_audio/speaker/__init__.py +1 -1
  207. esphome/components/i2s_audio/speaker/i2s_audio_speaker.cpp +2 -2
  208. esphome/components/iaqcore/iaqcore.h +0 -2
  209. esphome/components/image/__init__.py +123 -24
  210. esphome/components/improv_serial/improv_serial_component.cpp +0 -4
  211. esphome/components/ina219/ina219.cpp +7 -0
  212. esphome/components/ina219/ina219.h +1 -0
  213. esphome/components/ina260/ina260.h +0 -2
  214. esphome/components/inkbird_ibsth1_mini/inkbird_ibsth1_mini.h +0 -1
  215. esphome/components/inkplate6/display.py +15 -0
  216. esphome/components/inkplate6/inkplate.cpp +2 -2
  217. esphome/components/integration/integration_sensor.h +0 -1
  218. esphome/components/internal_temperature/internal_temperature.cpp +8 -27
  219. esphome/components/internal_temperature/sensor.py +0 -26
  220. esphome/components/interval/interval.h +0 -2
  221. esphome/components/json/__init__.py +1 -1
  222. esphome/components/json/json_util.cpp +56 -63
  223. esphome/components/ld2410/button/__init__.py +3 -3
  224. esphome/components/ld2410/button/factory_reset_button.cpp +9 -0
  225. esphome/components/ld2410/button/{reset_button.h → factory_reset_button.h} +2 -2
  226. esphome/components/ld2410/ld2410.cpp +421 -268
  227. esphome/components/ld2410/ld2410.h +44 -146
  228. esphome/components/ld2410/number/__init__.py +2 -2
  229. esphome/components/ld2410/sensor.py +1 -1
  230. esphome/components/ld2410/switch/__init__.py +1 -1
  231. esphome/components/ld2420/binary_sensor/ld2420_binary_sensor.cpp +2 -2
  232. esphome/components/ld2420/button/reconfig_buttons.cpp +1 -1
  233. esphome/components/ld2420/ld2420.cpp +252 -147
  234. esphome/components/ld2420/ld2420.h +52 -126
  235. esphome/components/ld2420/number/__init__.py +2 -2
  236. esphome/components/ld2420/number/gate_config_number.cpp +1 -1
  237. esphome/components/ld2420/select/operating_mode_select.cpp +1 -1
  238. esphome/components/ld2420/sensor/__init__.py +6 -2
  239. esphome/components/ld2420/sensor/ld2420_sensor.cpp +2 -2
  240. esphome/components/ld2420/sensor/ld2420_sensor.h +1 -1
  241. esphome/components/ld2420/text_sensor/text_sensor.cpp +2 -2
  242. esphome/components/ld2450/button/__init__.py +3 -3
  243. esphome/components/ld2450/button/factory_reset_button.cpp +9 -0
  244. esphome/components/ld2450/button/{reset_button.h → factory_reset_button.h} +2 -2
  245. esphome/components/ld2450/ld2450.cpp +384 -232
  246. esphome/components/ld2450/ld2450.h +60 -69
  247. esphome/components/ld2450/switch/__init__.py +1 -1
  248. esphome/components/ledc/ledc_output.cpp +1 -63
  249. esphome/components/libretiny/__init__.py +5 -3
  250. esphome/components/libretiny/const.py +5 -0
  251. esphome/components/libretiny/generate_components.py +1 -0
  252. esphome/components/libretiny/helpers.cpp +35 -0
  253. esphome/components/libretiny/lt_component.cpp +5 -3
  254. esphome/components/light/__init__.py +4 -2
  255. esphome/components/light/addressable_light.h +3 -3
  256. esphome/components/light/light_call.cpp +180 -243
  257. esphome/components/light/light_call.h +72 -20
  258. esphome/components/light/light_color_values.h +14 -14
  259. esphome/components/light/light_json_schema.cpp +17 -16
  260. esphome/components/light/light_state.h +15 -13
  261. esphome/components/light/transformers.h +2 -2
  262. esphome/components/ln882x/__init__.py +52 -0
  263. esphome/components/ln882x/boards.py +285 -0
  264. esphome/components/lock/__init__.py +5 -2
  265. esphome/components/logger/__init__.py +40 -3
  266. esphome/components/logger/logger.cpp +47 -12
  267. esphome/components/logger/logger.h +80 -49
  268. esphome/components/logger/logger_esp32.cpp +3 -3
  269. esphome/components/lps22/__init__.py +0 -0
  270. esphome/components/lps22/lps22.cpp +75 -0
  271. esphome/components/lps22/lps22.h +27 -0
  272. esphome/components/lps22/sensor.py +58 -0
  273. esphome/components/ltr390/ltr390.h +0 -1
  274. esphome/components/ltr501/ltr501.h +0 -1
  275. esphome/components/ltr_als_ps/ltr_als_ps.h +0 -1
  276. esphome/components/lvgl/__init__.py +1 -1
  277. esphome/components/lvgl/schemas.py +66 -6
  278. esphome/components/lvgl/styles.py +24 -16
  279. esphome/components/lvgl/widgets/__init__.py +12 -2
  280. esphome/components/lvgl/widgets/lv_bar.py +40 -19
  281. esphome/components/lvgl/widgets/meter.py +20 -13
  282. esphome/components/m5stack_8angle/light/m5stack_8angle_light.cpp +1 -1
  283. esphome/components/max9611/max9611.h +0 -1
  284. esphome/components/mcp23016/__init__.py +1 -1
  285. esphome/components/mcp23xxx_base/__init__.py +1 -1
  286. esphome/components/mcp4461/__init__.py +1 -1
  287. esphome/components/mcp4461/output/__init__.py +3 -2
  288. esphome/components/mcp9600/mcp9600.h +0 -2
  289. esphome/components/md5/md5.cpp +3 -3
  290. esphome/components/md5/md5.h +1 -6
  291. esphome/components/mdns/__init__.py +22 -11
  292. esphome/components/media_player/__init__.py +4 -3
  293. esphome/components/micro_wake_word/__init__.py +1 -5
  294. esphome/components/micro_wake_word/streaming_model.cpp +2 -2
  295. esphome/components/microphone/microphone.cpp +7 -9
  296. esphome/components/microphone/microphone.h +0 -2
  297. esphome/components/mipi_spi/display.py +1 -0
  298. esphome/components/mmc5603/mmc5603.cpp +1 -1
  299. esphome/components/modbus/modbus.cpp +33 -15
  300. esphome/components/modbus/modbus.h +9 -0
  301. esphome/components/modbus_controller/__init__.py +42 -10
  302. esphome/components/modbus_controller/modbus_controller.cpp +92 -11
  303. esphome/components/modbus_controller/modbus_controller.h +61 -7
  304. esphome/components/mopeka_pro_check/mopeka_pro_check.h +0 -1
  305. esphome/components/mopeka_std_check/mopeka_std_check.h +0 -1
  306. esphome/components/mpl3115a2/mpl3115a2.h +0 -2
  307. esphome/components/mqtt/__init__.py +16 -0
  308. esphome/components/mqtt/mqtt_alarm_control_panel.cpp +2 -1
  309. esphome/components/mqtt/mqtt_backend.h +2 -1
  310. esphome/components/mqtt/mqtt_backend_esp32.cpp +132 -47
  311. esphome/components/mqtt/mqtt_backend_esp32.h +106 -4
  312. esphome/components/mqtt/mqtt_binary_sensor.cpp +1 -0
  313. esphome/components/mqtt/mqtt_button.cpp +4 -1
  314. esphome/components/mqtt/mqtt_client.cpp +17 -9
  315. esphome/components/mqtt/mqtt_client.h +8 -3
  316. esphome/components/mqtt/mqtt_climate.cpp +6 -4
  317. esphome/components/mqtt/mqtt_component.cpp +3 -1
  318. esphome/components/mqtt/mqtt_cover.cpp +1 -0
  319. esphome/components/mqtt/mqtt_date.cpp +4 -3
  320. esphome/components/mqtt/mqtt_datetime.cpp +7 -6
  321. esphome/components/mqtt/mqtt_event.cpp +6 -3
  322. esphome/components/mqtt/mqtt_fan.cpp +1 -0
  323. esphome/components/mqtt/mqtt_light.cpp +8 -4
  324. esphome/components/mqtt/mqtt_lock.cpp +3 -1
  325. esphome/components/mqtt/mqtt_number.cpp +1 -0
  326. esphome/components/mqtt/mqtt_select.cpp +2 -1
  327. esphome/components/mqtt/mqtt_sensor.cpp +3 -1
  328. esphome/components/mqtt/mqtt_switch.cpp +3 -1
  329. esphome/components/mqtt/mqtt_text.cpp +1 -0
  330. esphome/components/mqtt/mqtt_text_sensor.cpp +3 -1
  331. esphome/components/mqtt/mqtt_time.cpp +4 -3
  332. esphome/components/mqtt/mqtt_update.cpp +1 -0
  333. esphome/components/mqtt/mqtt_valve.cpp +3 -1
  334. esphome/components/ms8607/ms8607.cpp +1 -1
  335. esphome/components/ms8607/ms8607.h +0 -1
  336. esphome/components/neopixelbus/light.py +4 -1
  337. esphome/components/neopixelbus/neopixelbus_light.h +1 -1
  338. esphome/components/network/__init__.py +4 -1
  339. esphome/components/network/ip_address.h +1 -0
  340. esphome/components/nextion/__init__.py +16 -0
  341. esphome/components/nextion/base_component.py +1 -0
  342. esphome/components/nextion/binary_sensor/nextion_binarysensor.cpp +1 -1
  343. esphome/components/nextion/display.py +14 -4
  344. esphome/components/nextion/nextion.cpp +166 -101
  345. esphome/components/nextion/nextion.h +84 -53
  346. esphome/components/nextion/nextion_commands.cpp +11 -10
  347. esphome/components/nextion/nextion_component.cpp +28 -28
  348. esphome/components/nextion/nextion_component.h +53 -18
  349. esphome/components/nextion/nextion_component_base.h +3 -0
  350. esphome/components/nextion/nextion_upload.cpp +36 -0
  351. esphome/components/nextion/nextion_upload_arduino.cpp +10 -35
  352. esphome/components/nextion/nextion_upload_idf.cpp +9 -33
  353. esphome/components/nextion/sensor/nextion_sensor.cpp +1 -1
  354. esphome/components/nextion/switch/nextion_switch.cpp +1 -1
  355. esphome/components/nextion/text_sensor/nextion_textsensor.cpp +1 -1
  356. esphome/components/nfc/nfc.cpp +3 -22
  357. esphome/components/nfc/nfc.h +3 -3
  358. esphome/components/number/__init__.py +5 -2
  359. esphome/components/online_image/__init__.py +9 -1
  360. esphome/components/online_image/online_image.cpp +17 -7
  361. esphome/components/online_image/online_image.h +10 -2
  362. esphome/components/opentherm/opentherm.cpp +7 -12
  363. esphome/components/opentherm/output/output.cpp +1 -1
  364. esphome/components/openthread/__init__.py +47 -40
  365. esphome/components/openthread/const.py +1 -0
  366. esphome/components/openthread/openthread_esp.cpp +27 -5
  367. esphome/components/opt3001/__init__.py +0 -0
  368. esphome/components/opt3001/opt3001.cpp +122 -0
  369. esphome/components/opt3001/opt3001.h +27 -0
  370. esphome/components/opt3001/sensor.py +35 -0
  371. esphome/components/ota/__init__.py +17 -0
  372. esphome/components/ota/ota_backend.h +27 -1
  373. esphome/components/ota/ota_backend_arduino_esp32.cpp +12 -2
  374. esphome/components/ota/ota_backend_arduino_esp32.h +3 -0
  375. esphome/components/ota/ota_backend_arduino_esp8266.cpp +18 -4
  376. esphome/components/ota/ota_backend_arduino_esp8266.h +3 -0
  377. esphome/components/ota/ota_backend_arduino_libretiny.cpp +12 -2
  378. esphome/components/ota/ota_backend_arduino_libretiny.h +3 -0
  379. esphome/components/ota/ota_backend_arduino_rp2040.cpp +9 -2
  380. esphome/components/ota/ota_backend_arduino_rp2040.h +3 -0
  381. esphome/components/ota/ota_backend_esp_idf.cpp +10 -16
  382. esphome/components/ota/ota_backend_esp_idf.h +1 -0
  383. esphome/components/packages/__init__.py +5 -2
  384. esphome/components/packet_transport/binary_sensor.py +61 -4
  385. esphome/components/packet_transport/packet_transport.cpp +34 -1
  386. esphome/components/packet_transport/packet_transport.h +11 -5
  387. esphome/components/pcf8574/__init__.py +1 -1
  388. esphome/components/pi4ioe5v6408/__init__.py +84 -0
  389. esphome/components/pi4ioe5v6408/pi4ioe5v6408.cpp +171 -0
  390. esphome/components/pi4ioe5v6408/pi4ioe5v6408.h +70 -0
  391. esphome/components/pmsa003i/pmsa003i.h +0 -1
  392. esphome/components/pmsx003/pmsx003.h +0 -1
  393. esphome/components/pn7150/pn7150.cpp +7 -7
  394. esphome/components/pn7150/pn7150.h +0 -1
  395. esphome/components/pn7160/pn7160.cpp +7 -7
  396. esphome/components/pn7160/pn7160.h +0 -1
  397. esphome/components/preferences/syncer.h +2 -0
  398. esphome/components/prometheus/prometheus_handler.h +1 -1
  399. esphome/components/psram/psram.cpp +0 -20
  400. esphome/components/pulse_counter/pulse_counter_sensor.h +0 -1
  401. esphome/components/pulse_meter/pulse_meter_sensor.cpp +8 -4
  402. esphome/components/pulse_width/pulse_width.h +0 -1
  403. esphome/components/pvvx_mithermometer/display/pvvx_display.cpp +0 -4
  404. esphome/components/pvvx_mithermometer/display/pvvx_display.h +0 -2
  405. esphome/components/pvvx_mithermometer/pvvx_mithermometer.h +0 -1
  406. esphome/components/qr_code/__init__.py +13 -10
  407. esphome/components/qwiic_pir/qwiic_pir.h +0 -1
  408. esphome/components/radon_eye_ble/radon_eye_listener.cpp +1 -1
  409. esphome/components/rc522/rc522.h +0 -1
  410. esphome/components/rdm6300/rdm6300.h +0 -2
  411. esphome/components/remote_base/__init__.py +7 -5
  412. esphome/components/remote_base/remote_base.cpp +24 -21
  413. esphome/components/remote_base/remote_base.h +3 -26
  414. esphome/components/remote_receiver/__init__.py +40 -46
  415. esphome/components/remote_receiver/remote_receiver.h +4 -18
  416. esphome/components/remote_receiver/remote_receiver_esp32.cpp +0 -87
  417. esphome/components/remote_receiver/remote_receiver_esp8266.cpp +1 -1
  418. esphome/components/remote_transmitter/__init__.py +42 -43
  419. esphome/components/remote_transmitter/remote_transmitter.h +2 -14
  420. esphome/components/remote_transmitter/remote_transmitter_esp32.cpp +0 -77
  421. esphome/components/resistance/resistance_sensor.h +0 -1
  422. esphome/components/rp2040/__init__.py +2 -0
  423. esphome/components/rp2040/helpers.cpp +55 -0
  424. esphome/components/rp2040_pio_led_strip/led_strip.cpp +2 -2
  425. esphome/components/rpi_dpi_rgb/rpi_dpi_rgb.cpp +0 -4
  426. esphome/components/rtttl/__init__.py +4 -4
  427. esphome/components/rtttl/rtttl.cpp +10 -1
  428. esphome/components/ruuvitag/ruuvitag.h +0 -1
  429. esphome/components/safe_mode/safe_mode.cpp +2 -0
  430. esphome/components/safe_mode/safe_mode.h +4 -1
  431. esphome/components/scd30/scd30.h +0 -1
  432. esphome/components/scd30/sensor.py +2 -2
  433. esphome/components/scd4x/scd4x.cpp +61 -54
  434. esphome/components/scd4x/scd4x.h +17 -15
  435. esphome/components/scd4x/sensor.py +4 -4
  436. esphome/components/script/script.h +0 -2
  437. esphome/components/sdp3x/sensor.py +1 -1
  438. esphome/components/select/__init__.py +5 -2
  439. esphome/components/sen5x/sen5x.h +0 -1
  440. esphome/components/senseair/senseair.h +0 -1
  441. esphome/components/sensor/__init__.py +4 -2
  442. esphome/components/sensor/filter.cpp +1 -1
  443. esphome/components/sensor/sensor.cpp +12 -6
  444. esphome/components/sensor/sensor.h +13 -5
  445. esphome/components/servo/servo.cpp +2 -2
  446. esphome/components/servo/servo.h +0 -1
  447. esphome/components/sfa30/sfa30.h +0 -1
  448. esphome/components/sgp30/sgp30.h +0 -1
  449. esphome/components/sgp4x/sgp4x.h +0 -1
  450. esphome/components/shelly_dimmer/stm32flash.cpp +1 -2
  451. esphome/components/sht4x/sht4x.h +0 -1
  452. esphome/components/sm300d2/sm300d2.h +0 -2
  453. esphome/components/smt100/sensor.py +8 -4
  454. esphome/components/smt100/smt100.cpp +5 -5
  455. esphome/components/smt100/smt100.h +3 -3
  456. esphome/components/sn74hc595/__init__.py +1 -1
  457. esphome/components/sn74hc595/sn74hc595.cpp +5 -4
  458. esphome/components/sntp/sntp_component.cpp +9 -3
  459. esphome/components/sntp/time.py +2 -0
  460. esphome/components/socket/__init__.py +17 -0
  461. esphome/components/spi/__init__.py +27 -6
  462. esphome/components/spi/spi.cpp +3 -2
  463. esphome/components/spi/spi.h +9 -3
  464. esphome/components/spi/spi_arduino.cpp +3 -5
  465. esphome/components/spi/spi_esp_idf.cpp +40 -21
  466. esphome/components/spi_led_strip/spi_led_strip.cpp +1 -1
  467. esphome/components/sps30/sps30.h +0 -1
  468. esphome/components/ssd1306_base/ssd1306_base.cpp +1 -1
  469. esphome/components/st7701s/st7701s.cpp +0 -4
  470. esphome/components/status/status_binary_sensor.h +0 -2
  471. esphome/components/substitutions/__init__.py +81 -21
  472. esphome/components/substitutions/jinja.py +99 -0
  473. esphome/components/sun/sun.cpp +3 -4
  474. esphome/components/switch/__init__.py +5 -2
  475. esphome/components/switch/binary_sensor/switch_binary_sensor.h +0 -1
  476. esphome/components/sx126x/__init__.py +317 -0
  477. esphome/components/sx126x/automation.h +62 -0
  478. esphome/components/sx126x/packet_transport/__init__.py +26 -0
  479. esphome/components/sx126x/packet_transport/sx126x_transport.cpp +26 -0
  480. esphome/components/sx126x/packet_transport/sx126x_transport.h +25 -0
  481. esphome/components/sx126x/sx126x.cpp +523 -0
  482. esphome/components/sx126x/sx126x.h +140 -0
  483. esphome/components/sx126x/sx126x_reg.h +163 -0
  484. esphome/components/sx127x/__init__.py +325 -0
  485. esphome/components/sx127x/automation.h +62 -0
  486. esphome/components/sx127x/packet_transport/__init__.py +26 -0
  487. esphome/components/sx127x/packet_transport/sx127x_transport.cpp +26 -0
  488. esphome/components/sx127x/packet_transport/sx127x_transport.h +25 -0
  489. esphome/components/sx127x/sx127x.cpp +498 -0
  490. esphome/components/sx127x/sx127x.h +128 -0
  491. esphome/components/sx127x/sx127x_reg.h +295 -0
  492. esphome/components/syslog/esphome_syslog.cpp +5 -3
  493. esphome/components/syslog/esphome_syslog.h +1 -1
  494. esphome/components/tca9555/__init__.py +1 -1
  495. esphome/components/template/binary_sensor/template_binary_sensor.cpp +1 -9
  496. esphome/components/text/__init__.py +5 -2
  497. esphome/components/text_sensor/__init__.py +5 -2
  498. esphome/components/thermostat/thermostat_climate.cpp +34 -31
  499. esphome/components/thermostat/thermostat_climate.h +43 -39
  500. esphome/components/time/__init__.py +16 -2
  501. esphome/components/time/real_time_clock.cpp +4 -0
  502. esphome/components/time/real_time_clock.h +5 -1
  503. esphome/components/tlc5971/tlc5971.cpp +4 -1
  504. esphome/components/tmp1075/tmp1075.h +0 -2
  505. esphome/components/tof10120/tof10120_sensor.h +0 -1
  506. esphome/components/tormatic/tormatic_cover.h +0 -1
  507. esphome/components/total_daily_energy/total_daily_energy.h +0 -1
  508. esphome/components/tsl2591/tsl2591.cpp +1 -1
  509. esphome/components/ttp229_bsf/ttp229_bsf.h +0 -1
  510. esphome/components/ttp229_lsf/ttp229_lsf.h +0 -1
  511. esphome/components/tx20/tx20.cpp +2 -2
  512. esphome/components/uart/__init__.py +18 -0
  513. esphome/components/uart/uart_component_esp_idf.cpp +1 -5
  514. esphome/components/update/__init__.py +5 -2
  515. esphome/components/update/update_entity.h +8 -0
  516. esphome/components/usb_host/__init__.py +5 -2
  517. esphome/components/usb_host/usb_host_client.cpp +10 -10
  518. esphome/components/usb_uart/cp210x.cpp +1 -1
  519. esphome/components/usb_uart/usb_uart.cpp +41 -44
  520. esphome/components/usb_uart/usb_uart.h +4 -3
  521. esphome/components/valve/__init__.py +5 -2
  522. esphome/components/vbus/vbus.h +0 -1
  523. esphome/components/veml3235/veml3235.h +0 -1
  524. esphome/components/veml7700/veml7700.h +0 -1
  525. esphome/components/vl53l0x/vl53l0x_sensor.h +0 -1
  526. esphome/components/voice_assistant/voice_assistant.cpp +4 -4
  527. esphome/components/watchdog/watchdog.cpp +0 -4
  528. esphome/components/waveshare_epaper/waveshare_epaper.cpp +6 -6
  529. esphome/components/web_server/__init__.py +34 -19
  530. esphome/components/web_server/ota/__init__.py +32 -0
  531. esphome/components/web_server/ota/ota_web_server.cpp +210 -0
  532. esphome/components/web_server/ota/ota_web_server.h +26 -0
  533. esphome/components/web_server/web_server.cpp +324 -439
  534. esphome/components/web_server/web_server.h +33 -23
  535. esphome/components/web_server/web_server_v1.cpp +4 -5
  536. esphome/components/web_server_base/__init__.py +5 -2
  537. esphome/components/web_server_base/web_server_base.cpp +2 -94
  538. esphome/components/web_server_base/web_server_base.h +5 -25
  539. esphome/components/web_server_idf/multipart.cpp +254 -0
  540. esphome/components/web_server_idf/multipart.h +86 -0
  541. esphome/components/web_server_idf/utils.cpp +32 -0
  542. esphome/components/web_server_idf/utils.h +10 -0
  543. esphome/components/web_server_idf/web_server_idf.cpp +164 -16
  544. esphome/components/web_server_idf/web_server_idf.h +11 -10
  545. esphome/components/wiegand/wiegand.cpp +2 -2
  546. esphome/components/wifi/__init__.py +18 -0
  547. esphome/components/wifi/wifi_component.cpp +17 -22
  548. esphome/components/wifi/wifi_component.h +27 -23
  549. esphome/components/wifi/wifi_component_esp32_arduino.cpp +52 -59
  550. esphome/components/wifi/wifi_component_esp8266.cpp +46 -46
  551. esphome/components/wifi/wifi_component_esp_idf.cpp +35 -36
  552. esphome/components/wifi/wifi_component_libretiny.cpp +26 -27
  553. esphome/components/wifi/wifi_component_pico_w.cpp +3 -3
  554. esphome/components/wifi_info/wifi_info_text_sensor.cpp +6 -6
  555. esphome/components/wireguard/__init__.py +2 -11
  556. esphome/components/xiaomi_ble/xiaomi_ble.cpp +13 -1
  557. esphome/components/xiaomi_ble/xiaomi_ble.h +1 -0
  558. esphome/components/xiaomi_cgd1/xiaomi_cgd1.h +0 -1
  559. esphome/components/xiaomi_cgdk2/xiaomi_cgdk2.h +0 -1
  560. esphome/components/xiaomi_cgg1/xiaomi_cgg1.h +0 -1
  561. esphome/components/xiaomi_cgpr1/xiaomi_cgpr1.h +0 -1
  562. esphome/components/xiaomi_gcls002/xiaomi_gcls002.h +0 -1
  563. esphome/components/xiaomi_hhccjcy01/xiaomi_hhccjcy01.h +0 -1
  564. esphome/components/xiaomi_hhccjcy10/xiaomi_hhccjcy10.h +0 -1
  565. esphome/components/xiaomi_hhccpot002/xiaomi_hhccpot002.h +0 -1
  566. esphome/components/xiaomi_jqjcy01ym/xiaomi_jqjcy01ym.h +0 -1
  567. esphome/components/xiaomi_lywsd02/xiaomi_lywsd02.h +0 -1
  568. esphome/components/xiaomi_lywsd02mmc/xiaomi_lywsd02mmc.h +0 -1
  569. esphome/components/xiaomi_lywsd03mmc/xiaomi_lywsd03mmc.h +0 -1
  570. esphome/components/xiaomi_lywsdcgq/xiaomi_lywsdcgq.h +0 -1
  571. esphome/components/xiaomi_mhoc303/xiaomi_mhoc303.h +0 -1
  572. esphome/components/xiaomi_mhoc401/xiaomi_mhoc401.h +0 -1
  573. esphome/components/xiaomi_miscale/xiaomi_miscale.h +0 -1
  574. esphome/components/xiaomi_mjyd02yla/xiaomi_mjyd02yla.h +0 -1
  575. esphome/components/xiaomi_mue4094rt/xiaomi_mue4094rt.h +0 -1
  576. esphome/components/xiaomi_rtcgq02lm/xiaomi_rtcgq02lm.h +0 -1
  577. esphome/components/xiaomi_wx08zm/xiaomi_wx08zm.h +0 -1
  578. esphome/components/xiaomi_xmwsdj04mmc/__init__.py +0 -0
  579. esphome/components/xiaomi_xmwsdj04mmc/sensor.py +77 -0
  580. esphome/components/xiaomi_xmwsdj04mmc/xiaomi_xmwsdj04mmc.cpp +77 -0
  581. esphome/components/xiaomi_xmwsdj04mmc/xiaomi_xmwsdj04mmc.h +36 -0
  582. esphome/components/zio_ultrasonic/zio_ultrasonic.h +0 -2
  583. esphome/components/zyaura/zyaura.h +0 -1
  584. esphome/config.py +88 -22
  585. esphome/config_helpers.py +74 -1
  586. esphome/config_validation.py +12 -1
  587. esphome/const.py +65 -10
  588. esphome/core/__init__.py +18 -2
  589. esphome/core/application.cpp +169 -10
  590. esphome/core/application.h +145 -165
  591. esphome/core/area.h +19 -0
  592. esphome/core/automation.h +58 -9
  593. esphome/core/color.cpp +3 -5
  594. esphome/core/color.h +16 -16
  595. esphome/core/component.cpp +156 -22
  596. esphome/core/component.h +98 -4
  597. esphome/core/component_iterator.cpp +11 -9
  598. esphome/core/component_iterator.h +12 -10
  599. esphome/core/config.py +155 -6
  600. esphome/core/controller.cpp +4 -2
  601. esphome/core/controller.h +1 -1
  602. esphome/core/datatypes.h +2 -2
  603. esphome/core/defines.h +17 -2
  604. esphome/core/device.h +20 -0
  605. esphome/core/entity_base.cpp +20 -15
  606. esphome/core/entity_base.h +76 -0
  607. esphome/core/entity_helpers.py +168 -1
  608. esphome/core/event_pool.h +81 -0
  609. esphome/core/helpers.cpp +75 -230
  610. esphome/core/helpers.h +165 -105
  611. esphome/core/lock_free_queue.h +151 -0
  612. esphome/core/log.cpp +2 -2
  613. esphome/core/log.h +2 -0
  614. esphome/core/optional.h +5 -0
  615. esphome/core/ring_buffer.cpp +2 -2
  616. esphome/core/scheduler.cpp +275 -103
  617. esphome/core/scheduler.h +154 -17
  618. esphome/core/time.cpp +5 -5
  619. esphome/core/time.h +5 -5
  620. esphome/cpp_generator.py +17 -0
  621. esphome/cpp_helpers.py +0 -22
  622. esphome/cpp_types.py +3 -1
  623. esphome/dashboard/entries.py +1 -1
  624. esphome/dashboard/util/text.py +5 -21
  625. esphome/dashboard/web_server.py +9 -1
  626. esphome/helpers.py +47 -0
  627. esphome/loader.py +15 -1
  628. esphome/pins.py +14 -8
  629. esphome/platformio_api.py +2 -0
  630. esphome/wizard.py +17 -4
  631. esphome/writer.py +44 -3
  632. esphome/yaml_util.py +0 -2
  633. {esphome-2025.6.2.dist-info → esphome-2025.7.0.dist-info}/METADATA +10 -9
  634. {esphome-2025.6.2.dist-info → esphome-2025.7.0.dist-info}/RECORD +639 -580
  635. esphome/components/api/api_pb2_size.h +0 -361
  636. esphome/components/esp32_ble/ble_event_pool.h +0 -72
  637. esphome/components/esp32_ble/queue.h +0 -85
  638. esphome/components/esp32_hall/esp32_hall.cpp +0 -25
  639. esphome/components/esp32_hall/esp32_hall.h +0 -23
  640. esphome/components/esp32_touch/esp32_touch.cpp +0 -355
  641. esphome/components/ld2410/button/reset_button.cpp +0 -9
  642. esphome/components/ld2450/button/reset_button.cpp +0 -9
  643. esphome/components/openthread/tlv.py +0 -65
  644. /esphome/{dashboard/enum.py → enum.py} +0 -0
  645. {esphome-2025.6.2.dist-info → esphome-2025.7.0.dist-info}/WHEEL +0 -0
  646. {esphome-2025.6.2.dist-info → esphome-2025.7.0.dist-info}/entry_points.txt +0 -0
  647. {esphome-2025.6.2.dist-info → esphome-2025.7.0.dist-info}/licenses/LICENSE +0 -0
  648. {esphome-2025.6.2.dist-info → esphome-2025.7.0.dist-info}/top_level.txt +0 -0
@@ -14,7 +14,6 @@ static const uint32_t RMT_CLK_FREQ = 32000000;
14
14
  static const uint32_t RMT_CLK_FREQ = 80000000;
15
15
  #endif
16
16
 
17
- #if ESP_IDF_VERSION_MAJOR >= 5
18
17
  static bool IRAM_ATTR HOT rmt_callback(rmt_channel_handle_t channel, const rmt_rx_done_event_data_t *event, void *arg) {
19
18
  RemoteReceiverComponentStore *store = (RemoteReceiverComponentStore *) arg;
20
19
  rmt_rx_done_event_data_t *event_buffer = (rmt_rx_done_event_data_t *) (store->buffer + store->buffer_write);
@@ -37,11 +36,9 @@ static bool IRAM_ATTR HOT rmt_callback(rmt_channel_handle_t channel, const rmt_r
37
36
  store->buffer_write = next_write;
38
37
  return false;
39
38
  }
40
- #endif
41
39
 
42
40
  void RemoteReceiverComponent::setup() {
43
41
  ESP_LOGCONFIG(TAG, "Running setup");
44
- #if ESP_IDF_VERSION_MAJOR >= 5
45
42
  rmt_rx_channel_config_t channel;
46
43
  memset(&channel, 0, sizeof(channel));
47
44
  channel.clk_src = RMT_CLK_SRC_DEFAULT;
@@ -105,62 +102,11 @@ void RemoteReceiverComponent::setup() {
105
102
  this->mark_failed();
106
103
  return;
107
104
  }
108
- #else
109
- this->pin_->setup();
110
- rmt_config_t rmt{};
111
- this->config_rmt(rmt);
112
- rmt.gpio_num = gpio_num_t(this->pin_->get_pin());
113
- rmt.rmt_mode = RMT_MODE_RX;
114
- if (this->filter_us_ == 0) {
115
- rmt.rx_config.filter_en = false;
116
- } else {
117
- rmt.rx_config.filter_en = true;
118
- rmt.rx_config.filter_ticks_thresh = static_cast<uint8_t>(
119
- std::min(this->from_microseconds_(this->filter_us_) * this->clock_divider_, (uint32_t) 255));
120
- }
121
- rmt.rx_config.idle_threshold =
122
- static_cast<uint16_t>(std::min(this->from_microseconds_(this->idle_us_), (uint32_t) 65535));
123
-
124
- esp_err_t error = rmt_config(&rmt);
125
- if (error != ESP_OK) {
126
- this->error_code_ = error;
127
- this->error_string_ = "in rmt_config";
128
- this->mark_failed();
129
- return;
130
- }
131
-
132
- error = rmt_driver_install(this->channel_, this->buffer_size_, 0);
133
- if (error != ESP_OK) {
134
- this->error_code_ = error;
135
- if (error == ESP_ERR_INVALID_STATE) {
136
- this->error_string_ = str_sprintf("RMT channel %i is already in use by another component", this->channel_);
137
- } else {
138
- this->error_string_ = "in rmt_driver_install";
139
- }
140
- this->mark_failed();
141
- return;
142
- }
143
- error = rmt_get_ringbuf_handle(this->channel_, &this->ringbuf_);
144
- if (error != ESP_OK) {
145
- this->error_code_ = error;
146
- this->error_string_ = "in rmt_get_ringbuf_handle";
147
- this->mark_failed();
148
- return;
149
- }
150
- error = rmt_rx_start(this->channel_, true);
151
- if (error != ESP_OK) {
152
- this->error_code_ = error;
153
- this->error_string_ = "in rmt_rx_start";
154
- this->mark_failed();
155
- return;
156
- }
157
- #endif
158
105
  }
159
106
 
160
107
  void RemoteReceiverComponent::dump_config() {
161
108
  ESP_LOGCONFIG(TAG, "Remote Receiver:");
162
109
  LOG_PIN(" Pin: ", this->pin_);
163
- #if ESP_IDF_VERSION_MAJOR >= 5
164
110
  ESP_LOGCONFIG(TAG,
165
111
  " Clock resolution: %" PRIu32 " hz\n"
166
112
  " RMT symbols: %" PRIu32 "\n"
@@ -172,22 +118,6 @@ void RemoteReceiverComponent::dump_config() {
172
118
  this->clock_resolution_, this->rmt_symbols_, this->filter_symbols_, this->receive_symbols_,
173
119
  this->tolerance_, (this->tolerance_mode_ == remote_base::TOLERANCE_MODE_TIME) ? " us" : "%",
174
120
  this->filter_us_, this->idle_us_);
175
- #else
176
- if (this->pin_->digital_read()) {
177
- ESP_LOGW(TAG, "Remote Receiver Signal starts with a HIGH value. Usually this means you have to "
178
- "invert the signal using 'inverted: True' in the pin schema!");
179
- }
180
- ESP_LOGCONFIG(TAG,
181
- " Channel: %d\n"
182
- " RMT memory blocks: %d\n"
183
- " Clock divider: %u\n"
184
- " Tolerance: %" PRIu32 "%s\n"
185
- " Filter out pulses shorter than: %" PRIu32 " us\n"
186
- " Signal is done after %" PRIu32 " us of no changes",
187
- this->channel_, this->mem_block_num_, this->clock_divider_, this->tolerance_,
188
- (this->tolerance_mode_ == remote_base::TOLERANCE_MODE_TIME) ? " us" : "%", this->filter_us_,
189
- this->idle_us_);
190
- #endif
191
121
  if (this->is_failed()) {
192
122
  ESP_LOGE(TAG, "Configuring RMT driver failed: %s (%s)", esp_err_to_name(this->error_code_),
193
123
  this->error_string_.c_str());
@@ -195,7 +125,6 @@ void RemoteReceiverComponent::dump_config() {
195
125
  }
196
126
 
197
127
  void RemoteReceiverComponent::loop() {
198
- #if ESP_IDF_VERSION_MAJOR >= 5
199
128
  if (this->store_.error != ESP_OK) {
200
129
  ESP_LOGE(TAG, "Receive error");
201
130
  this->error_code_ = this->store_.error;
@@ -221,25 +150,9 @@ void RemoteReceiverComponent::loop() {
221
150
  this->call_listeners_dumpers_();
222
151
  }
223
152
  }
224
- #else
225
- size_t len = 0;
226
- auto *item = (rmt_item32_t *) xRingbufferReceive(this->ringbuf_, &len, 0);
227
- if (item != nullptr) {
228
- this->decode_rmt_(item, len / sizeof(rmt_item32_t));
229
- vRingbufferReturnItem(this->ringbuf_, item);
230
-
231
- if (!this->temp_.empty()) {
232
- this->call_listeners_dumpers_();
233
- }
234
- }
235
- #endif
236
153
  }
237
154
 
238
- #if ESP_IDF_VERSION_MAJOR >= 5
239
155
  void RemoteReceiverComponent::decode_rmt_(rmt_symbol_word_t *item, size_t item_count) {
240
- #else
241
- void RemoteReceiverComponent::decode_rmt_(rmt_item32_t *item, size_t item_count) {
242
- #endif
243
156
  bool prev_level = false;
244
157
  bool idle_level = false;
245
158
  uint32_t prev_length = 0;
@@ -27,7 +27,7 @@ void IRAM_ATTR HOT RemoteReceiverComponentStore::gpio_intr(RemoteReceiverCompone
27
27
  if (time_since_change <= arg->filter_us)
28
28
  return;
29
29
 
30
- arg->buffer[arg->buffer_write_at = next] = now;
30
+ arg->buffer[arg->buffer_write_at = next] = now; // NOLINT(clang-diagnostic-deprecated-volatile)
31
31
  }
32
32
 
33
33
  void RemoteReceiverComponent::setup() {
@@ -1,19 +1,19 @@
1
1
  from esphome import automation, pins
2
2
  import esphome.codegen as cg
3
3
  from esphome.components import esp32, esp32_rmt, remote_base
4
+ from esphome.config_helpers import filter_source_files_from_platform
4
5
  import esphome.config_validation as cv
5
6
  from esphome.const import (
6
7
  CONF_CARRIER_DUTY_PERCENT,
7
- CONF_CLOCK_DIVIDER,
8
8
  CONF_CLOCK_RESOLUTION,
9
9
  CONF_ID,
10
10
  CONF_INVERTED,
11
11
  CONF_MODE,
12
12
  CONF_OPEN_DRAIN,
13
13
  CONF_PIN,
14
- CONF_RMT_CHANNEL,
15
14
  CONF_RMT_SYMBOLS,
16
15
  CONF_USE_DMA,
16
+ PlatformFramework,
17
17
  )
18
18
  from esphome.core import CORE
19
19
 
@@ -38,34 +38,26 @@ CONFIG_SCHEMA = cv.Schema(
38
38
  ),
39
39
  cv.Optional(CONF_CLOCK_RESOLUTION): cv.All(
40
40
  cv.only_on_esp32,
41
- cv.only_with_esp_idf,
42
41
  esp32_rmt.validate_clock_resolution(),
43
42
  ),
44
- cv.Optional(CONF_CLOCK_DIVIDER): cv.All(
45
- cv.only_on_esp32, cv.only_with_arduino, cv.int_range(min=1, max=255)
46
- ),
47
- cv.Optional(CONF_EOT_LEVEL): cv.All(cv.only_with_esp_idf, cv.boolean),
43
+ cv.Optional(CONF_EOT_LEVEL): cv.All(cv.only_on_esp32, cv.boolean),
48
44
  cv.Optional(CONF_USE_DMA): cv.All(
49
45
  esp32.only_on_variant(
50
46
  supported=[esp32.const.VARIANT_ESP32S3, esp32.const.VARIANT_ESP32P4]
51
47
  ),
52
- cv.only_with_esp_idf,
53
48
  cv.boolean,
54
49
  ),
55
50
  cv.SplitDefault(
56
51
  CONF_RMT_SYMBOLS,
57
- esp32_idf=64,
58
- esp32_s2_idf=64,
59
- esp32_s3_idf=48,
60
- esp32_p4_idf=48,
61
- esp32_c3_idf=48,
62
- esp32_c5_idf=48,
63
- esp32_c6_idf=48,
64
- esp32_h2_idf=48,
65
- ): cv.All(cv.only_with_esp_idf, cv.int_range(min=2)),
66
- cv.Optional(CONF_RMT_CHANNEL): cv.All(
67
- cv.only_with_arduino, esp32_rmt.validate_rmt_channel(tx=True)
68
- ),
52
+ esp32=64,
53
+ esp32_s2=64,
54
+ esp32_s3=48,
55
+ esp32_p4=48,
56
+ esp32_c3=48,
57
+ esp32_c5=48,
58
+ esp32_c6=48,
59
+ esp32_h2=48,
60
+ ): cv.All(cv.only_on_esp32, cv.int_range(min=2)),
69
61
  cv.Optional(CONF_ON_TRANSMIT): automation.validate_automation(single=True),
70
62
  cv.Optional(CONF_ON_COMPLETE): automation.validate_automation(single=True),
71
63
  }
@@ -75,30 +67,21 @@ CONFIG_SCHEMA = cv.Schema(
75
67
  async def to_code(config):
76
68
  pin = await cg.gpio_pin_expression(config[CONF_PIN])
77
69
  if CORE.is_esp32:
78
- if esp32_rmt.use_new_rmt_driver():
79
- var = cg.new_Pvariable(config[CONF_ID], pin)
80
- cg.add(var.set_rmt_symbols(config[CONF_RMT_SYMBOLS]))
81
- if CONF_CLOCK_RESOLUTION in config:
82
- cg.add(var.set_clock_resolution(config[CONF_CLOCK_RESOLUTION]))
83
- if CONF_USE_DMA in config:
84
- cg.add(var.set_with_dma(config[CONF_USE_DMA]))
85
- if CONF_EOT_LEVEL in config:
86
- cg.add(var.set_eot_level(config[CONF_EOT_LEVEL]))
87
- else:
88
- cg.add(
89
- var.set_eot_level(
90
- config[CONF_PIN][CONF_MODE][CONF_OPEN_DRAIN]
91
- or config[CONF_PIN][CONF_INVERTED]
92
- )
93
- )
70
+ var = cg.new_Pvariable(config[CONF_ID], pin)
71
+ cg.add(var.set_rmt_symbols(config[CONF_RMT_SYMBOLS]))
72
+ if CONF_CLOCK_RESOLUTION in config:
73
+ cg.add(var.set_clock_resolution(config[CONF_CLOCK_RESOLUTION]))
74
+ if CONF_USE_DMA in config:
75
+ cg.add(var.set_with_dma(config[CONF_USE_DMA]))
76
+ if CONF_EOT_LEVEL in config:
77
+ cg.add(var.set_eot_level(config[CONF_EOT_LEVEL]))
94
78
  else:
95
- if (rmt_channel := config.get(CONF_RMT_CHANNEL, None)) is not None:
96
- var = cg.new_Pvariable(config[CONF_ID], pin, rmt_channel)
97
- else:
98
- var = cg.new_Pvariable(config[CONF_ID], pin)
99
- if CONF_CLOCK_DIVIDER in config:
100
- cg.add(var.set_clock_divider(config[CONF_CLOCK_DIVIDER]))
101
-
79
+ cg.add(
80
+ var.set_eot_level(
81
+ config[CONF_PIN][CONF_MODE][CONF_OPEN_DRAIN]
82
+ or config[CONF_PIN][CONF_INVERTED]
83
+ )
84
+ )
102
85
  else:
103
86
  var = cg.new_Pvariable(config[CONF_ID], pin)
104
87
  await cg.register_component(var, config)
@@ -114,3 +97,19 @@ async def to_code(config):
114
97
  await automation.build_automation(
115
98
  var.get_complete_trigger(), [], on_complete_config
116
99
  )
100
+
101
+
102
+ FILTER_SOURCE_FILES = filter_source_files_from_platform(
103
+ {
104
+ "remote_transmitter_esp32.cpp": {
105
+ PlatformFramework.ESP32_ARDUINO,
106
+ PlatformFramework.ESP32_IDF,
107
+ },
108
+ "remote_transmitter_esp8266.cpp": {PlatformFramework.ESP8266_ARDUINO},
109
+ "remote_transmitter_libretiny.cpp": {
110
+ PlatformFramework.BK72XX_ARDUINO,
111
+ PlatformFramework.RTL87XX_ARDUINO,
112
+ PlatformFramework.LN882X_ARDUINO,
113
+ },
114
+ }
115
+ )
@@ -5,7 +5,7 @@
5
5
 
6
6
  #include <vector>
7
7
 
8
- #if defined(USE_ESP32) && ESP_IDF_VERSION_MAJOR >= 5
8
+ #if defined(USE_ESP32)
9
9
  #include <driver/rmt_tx.h>
10
10
  #endif
11
11
 
@@ -20,15 +20,7 @@ class RemoteTransmitterComponent : public remote_base::RemoteTransmitterBase,
20
20
  #endif
21
21
  {
22
22
  public:
23
- #if defined(USE_ESP32) && ESP_IDF_VERSION_MAJOR < 5
24
- RemoteTransmitterComponent(InternalGPIOPin *pin, uint8_t mem_block_num = 1)
25
- : remote_base::RemoteTransmitterBase(pin), remote_base::RemoteRMTChannel(mem_block_num) {}
26
-
27
- RemoteTransmitterComponent(InternalGPIOPin *pin, rmt_channel_t channel, uint8_t mem_block_num = 1)
28
- : remote_base::RemoteTransmitterBase(pin), remote_base::RemoteRMTChannel(channel, mem_block_num) {}
29
- #else
30
23
  explicit RemoteTransmitterComponent(InternalGPIOPin *pin) : remote_base::RemoteTransmitterBase(pin) {}
31
- #endif
32
24
  void setup() override;
33
25
 
34
26
  void dump_config() override;
@@ -38,7 +30,7 @@ class RemoteTransmitterComponent : public remote_base::RemoteTransmitterBase,
38
30
 
39
31
  void set_carrier_duty_percent(uint8_t carrier_duty_percent) { this->carrier_duty_percent_ = carrier_duty_percent; }
40
32
 
41
- #if defined(USE_ESP32) && ESP_IDF_VERSION_MAJOR >= 5
33
+ #if defined(USE_ESP32)
42
34
  void set_with_dma(bool with_dma) { this->with_dma_ = with_dma; }
43
35
  void set_eot_level(bool eot_level) { this->eot_level_ = eot_level; }
44
36
  void digital_write(bool value);
@@ -65,15 +57,11 @@ class RemoteTransmitterComponent : public remote_base::RemoteTransmitterBase,
65
57
 
66
58
  uint32_t current_carrier_frequency_{38000};
67
59
  bool initialized_{false};
68
- #if ESP_IDF_VERSION_MAJOR >= 5
69
60
  std::vector<rmt_symbol_word_t> rmt_temp_;
70
61
  bool with_dma_{false};
71
62
  bool eot_level_{false};
72
63
  rmt_channel_handle_t channel_{NULL};
73
64
  rmt_encoder_handle_t encoder_{NULL};
74
- #else
75
- std::vector<rmt_item32_t> rmt_temp_;
76
- #endif
77
65
  esp_err_t error_code_{ESP_OK};
78
66
  std::string error_string_{""};
79
67
  bool inverted_{false};
@@ -18,18 +18,10 @@ void RemoteTransmitterComponent::setup() {
18
18
 
19
19
  void RemoteTransmitterComponent::dump_config() {
20
20
  ESP_LOGCONFIG(TAG, "Remote Transmitter:");
21
- #if ESP_IDF_VERSION_MAJOR >= 5
22
21
  ESP_LOGCONFIG(TAG,
23
22
  " Clock resolution: %" PRIu32 " hz\n"
24
23
  " RMT symbols: %" PRIu32,
25
24
  this->clock_resolution_, this->rmt_symbols_);
26
- #else
27
- ESP_LOGCONFIG(TAG,
28
- " Channel: %d\n"
29
- " RMT memory blocks: %d\n"
30
- " Clock divider: %u",
31
- this->channel_, this->mem_block_num_, this->clock_divider_);
32
- #endif
33
25
  LOG_PIN(" Pin: ", this->pin_);
34
26
 
35
27
  if (this->current_carrier_frequency_ != 0 && this->carrier_duty_percent_ != 100) {
@@ -42,7 +34,6 @@ void RemoteTransmitterComponent::dump_config() {
42
34
  }
43
35
  }
44
36
 
45
- #if ESP_IDF_VERSION_MAJOR >= 5
46
37
  void RemoteTransmitterComponent::digital_write(bool value) {
47
38
  rmt_symbol_word_t symbol = {
48
39
  .duration0 = 1,
@@ -65,10 +56,8 @@ void RemoteTransmitterComponent::digital_write(bool value) {
65
56
  this->status_set_warning();
66
57
  }
67
58
  }
68
- #endif
69
59
 
70
60
  void RemoteTransmitterComponent::configure_rmt_() {
71
- #if ESP_IDF_VERSION_MAJOR >= 5
72
61
  esp_err_t error;
73
62
 
74
63
  if (!this->initialized_) {
@@ -140,54 +129,6 @@ void RemoteTransmitterComponent::configure_rmt_() {
140
129
  this->mark_failed();
141
130
  return;
142
131
  }
143
- #else
144
- rmt_config_t c{};
145
-
146
- this->config_rmt(c);
147
- c.rmt_mode = RMT_MODE_TX;
148
- c.gpio_num = gpio_num_t(this->pin_->get_pin());
149
- c.tx_config.loop_en = false;
150
-
151
- if (this->current_carrier_frequency_ == 0 || this->carrier_duty_percent_ == 100) {
152
- c.tx_config.carrier_en = false;
153
- } else {
154
- c.tx_config.carrier_en = true;
155
- c.tx_config.carrier_freq_hz = this->current_carrier_frequency_;
156
- c.tx_config.carrier_duty_percent = this->carrier_duty_percent_;
157
- }
158
-
159
- c.tx_config.idle_output_en = true;
160
- if (!this->inverted_) {
161
- c.tx_config.carrier_level = RMT_CARRIER_LEVEL_HIGH;
162
- c.tx_config.idle_level = RMT_IDLE_LEVEL_LOW;
163
- } else {
164
- c.tx_config.carrier_level = RMT_CARRIER_LEVEL_LOW;
165
- c.tx_config.idle_level = RMT_IDLE_LEVEL_HIGH;
166
- }
167
-
168
- esp_err_t error = rmt_config(&c);
169
- if (error != ESP_OK) {
170
- this->error_code_ = error;
171
- this->error_string_ = "in rmt_config";
172
- this->mark_failed();
173
- return;
174
- }
175
-
176
- if (!this->initialized_) {
177
- error = rmt_driver_install(this->channel_, 0, 0);
178
- if (error != ESP_OK) {
179
- this->error_code_ = error;
180
- if (error == ESP_ERR_INVALID_STATE) {
181
- this->error_string_ = str_sprintf("RMT channel %i is already in use by another component", this->channel_);
182
- } else {
183
- this->error_string_ = "in rmt_driver_install";
184
- }
185
- this->mark_failed();
186
- return;
187
- }
188
- this->initialized_ = true;
189
- }
190
- #endif
191
132
  }
192
133
 
193
134
  void RemoteTransmitterComponent::send_internal(uint32_t send_times, uint32_t send_wait) {
@@ -202,11 +143,7 @@ void RemoteTransmitterComponent::send_internal(uint32_t send_times, uint32_t sen
202
143
  this->rmt_temp_.clear();
203
144
  this->rmt_temp_.reserve((this->temp_.get_data().size() + 1) / 2);
204
145
  uint32_t rmt_i = 0;
205
- #if ESP_IDF_VERSION_MAJOR >= 5
206
146
  rmt_symbol_word_t rmt_item;
207
- #else
208
- rmt_item32_t rmt_item;
209
- #endif
210
147
 
211
148
  for (int32_t val : this->temp_.get_data()) {
212
149
  bool level = val >= 0;
@@ -241,7 +178,6 @@ void RemoteTransmitterComponent::send_internal(uint32_t send_times, uint32_t sen
241
178
  return;
242
179
  }
243
180
  this->transmit_trigger_->trigger();
244
- #if ESP_IDF_VERSION_MAJOR >= 5
245
181
  for (uint32_t i = 0; i < send_times; i++) {
246
182
  rmt_transmit_config_t config;
247
183
  memset(&config, 0, sizeof(config));
@@ -263,19 +199,6 @@ void RemoteTransmitterComponent::send_internal(uint32_t send_times, uint32_t sen
263
199
  if (i + 1 < send_times)
264
200
  delayMicroseconds(send_wait);
265
201
  }
266
- #else
267
- for (uint32_t i = 0; i < send_times; i++) {
268
- esp_err_t error = rmt_write_items(this->channel_, this->rmt_temp_.data(), this->rmt_temp_.size(), true);
269
- if (error != ESP_OK) {
270
- ESP_LOGW(TAG, "rmt_write_items failed: %s", esp_err_to_name(error));
271
- this->status_set_warning();
272
- } else {
273
- this->status_clear_warning();
274
- }
275
- if (i + 1 < send_times)
276
- delayMicroseconds(send_wait);
277
- }
278
- #endif
279
202
  this->complete_trigger_->trigger();
280
203
  }
281
204
 
@@ -24,7 +24,6 @@ class ResistanceSensor : public Component, public sensor::Sensor {
24
24
  this->process_(this->sensor_->state);
25
25
  }
26
26
  void dump_config() override;
27
- float get_setup_priority() const override { return setup_priority::DATA; }
28
27
 
29
28
  protected:
30
29
  void process_(float value);
@@ -165,8 +165,10 @@ async def to_code(config):
165
165
  # Allow LDF to properly discover dependency including those in preprocessor
166
166
  # conditionals
167
167
  cg.add_platformio_option("lib_ldf_mode", "chain+")
168
+ cg.add_platformio_option("lib_compat_mode", "strict")
168
169
  cg.add_platformio_option("board", config[CONF_BOARD])
169
170
  cg.add_build_flag("-DUSE_RP2040")
171
+ cg.set_cpp_standard("gnu++20")
170
172
  cg.add_define("ESPHOME_BOARD", config[CONF_BOARD])
171
173
  cg.add_define("ESPHOME_VARIANT", "RP2040")
172
174
 
@@ -0,0 +1,55 @@
1
+ #include "esphome/core/helpers.h"
2
+ #include "esphome/core/defines.h"
3
+
4
+ #ifdef USE_RP2040
5
+
6
+ #include "esphome/core/hal.h"
7
+
8
+ #if defined(USE_WIFI)
9
+ #include <WiFi.h>
10
+ #endif
11
+ #include <hardware/structs/rosc.h>
12
+ #include <hardware/sync.h>
13
+
14
+ namespace esphome {
15
+
16
+ uint32_t random_uint32() {
17
+ uint32_t result = 0;
18
+ for (uint8_t i = 0; i < 32; i++) {
19
+ result <<= 1;
20
+ result |= rosc_hw->randombit;
21
+ }
22
+ return result;
23
+ }
24
+
25
+ bool random_bytes(uint8_t *data, size_t len) {
26
+ while (len-- != 0) {
27
+ uint8_t result = 0;
28
+ for (uint8_t i = 0; i < 8; i++) {
29
+ result <<= 1;
30
+ result |= rosc_hw->randombit;
31
+ }
32
+ *data++ = result;
33
+ }
34
+ return true;
35
+ }
36
+
37
+ // RP2040 doesn't have mutexes, but that shouldn't be an issue as it's single-core and non-preemptive OS.
38
+ Mutex::Mutex() {}
39
+ Mutex::~Mutex() {}
40
+ void Mutex::lock() {}
41
+ bool Mutex::try_lock() { return true; }
42
+ void Mutex::unlock() {}
43
+
44
+ IRAM_ATTR InterruptLock::InterruptLock() { state_ = save_and_disable_interrupts(); }
45
+ IRAM_ATTR InterruptLock::~InterruptLock() { restore_interrupts(state_); }
46
+
47
+ void get_mac_address_raw(uint8_t *mac) { // NOLINT(readability-non-const-parameter)
48
+ #ifdef USE_WIFI
49
+ WiFi.macAddress(mac);
50
+ #endif
51
+ }
52
+
53
+ } // namespace esphome
54
+
55
+ #endif // USE_RP2040
@@ -9,8 +9,8 @@
9
9
  #include <hardware/dma.h>
10
10
  #include <hardware/irq.h>
11
11
  #include <hardware/pio.h>
12
- #include <pico/stdlib.h>
13
12
  #include <pico/sem.h>
13
+ #include <pico/stdlib.h>
14
14
 
15
15
  namespace esphome {
16
16
  namespace rp2040_pio_led_strip {
@@ -44,7 +44,7 @@ void RP2040PIOLEDStripLightOutput::setup() {
44
44
 
45
45
  size_t buffer_size = this->get_buffer_size_();
46
46
 
47
- ExternalRAMAllocator<uint8_t> allocator(ExternalRAMAllocator<uint8_t>::ALLOW_FAILURE);
47
+ RAMAllocator<uint8_t> allocator;
48
48
  this->buf_ = allocator.allocate(buffer_size);
49
49
  if (this->buf_ == nullptr) {
50
50
  ESP_LOGE(TAG, "Failed to allocate buffer of size %u", buffer_size);
@@ -10,10 +10,8 @@ void RpiDpiRgb::setup() {
10
10
  this->reset_display_();
11
11
  esp_lcd_rgb_panel_config_t config{};
12
12
  config.flags.fb_in_psram = 1;
13
- #if ESP_IDF_VERSION_MAJOR >= 5
14
13
  config.bounce_buffer_size_px = this->width_ * 10;
15
14
  config.num_fbs = 1;
16
- #endif // ESP_IDF_VERSION_MAJOR
17
15
  config.timings.h_res = this->width_;
18
16
  config.timings.v_res = this->height_;
19
17
  config.timings.hsync_pulse_width = this->hsync_pulse_width_;
@@ -47,10 +45,8 @@ void RpiDpiRgb::setup() {
47
45
  ESP_LOGCONFIG(TAG, "RPI_DPI_RGB setup complete");
48
46
  }
49
47
  void RpiDpiRgb::loop() {
50
- #if ESP_IDF_VERSION_MAJOR >= 5
51
48
  if (this->handle_ != nullptr)
52
49
  esp_lcd_rgb_panel_restart(this->handle_);
53
- #endif // ESP_IDF_VERSION_MAJOR
54
50
  }
55
51
 
56
52
  void RpiDpiRgb::draw_pixels_at(int x_start, int y_start, int w, int h, const uint8_t *ptr, display::ColorOrder order,
@@ -57,14 +57,14 @@ def validate_parent_output_config(value):
57
57
  platform = value.get(CONF_PLATFORM)
58
58
  PWM_GOOD = ["esp8266_pwm", "ledc"]
59
59
  PWM_BAD = [
60
- "ac_dimmer ",
60
+ "ac_dimmer",
61
61
  "esp32_dac",
62
- "slow_pwm",
63
62
  "mcp4725",
64
- "pca9685",
65
- "tlc59208f",
66
63
  "my9231",
64
+ "pca9685",
65
+ "slow_pwm",
67
66
  "sm16716",
67
+ "tlc59208f",
68
68
  ]
69
69
 
70
70
  if platform in PWM_BAD:
@@ -142,8 +142,10 @@ void Rtttl::stop() {
142
142
  }
143
143
 
144
144
  void Rtttl::loop() {
145
- if (this->note_duration_ == 0 || this->state_ == State::STATE_STOPPED)
145
+ if (this->note_duration_ == 0 || this->state_ == State::STATE_STOPPED) {
146
+ this->disable_loop();
146
147
  return;
148
+ }
147
149
 
148
150
  #ifdef USE_SPEAKER
149
151
  if (this->speaker_ != nullptr) {
@@ -369,6 +371,7 @@ void Rtttl::finish_() {
369
371
  ESP_LOGD(TAG, "Playback finished");
370
372
  }
371
373
 
374
+ #if ESPHOME_LOG_LEVEL >= ESPHOME_LOG_LEVEL_DEBUG
372
375
  static const LogString *state_to_string(State state) {
373
376
  switch (state) {
374
377
  case STATE_STOPPED:
@@ -385,12 +388,18 @@ static const LogString *state_to_string(State state) {
385
388
  return LOG_STR("UNKNOWN");
386
389
  }
387
390
  };
391
+ #endif
388
392
 
389
393
  void Rtttl::set_state_(State state) {
390
394
  State old_state = this->state_;
391
395
  this->state_ = state;
392
396
  ESP_LOGV(TAG, "State changed from %s to %s", LOG_STR_ARG(state_to_string(old_state)),
393
397
  LOG_STR_ARG(state_to_string(state)));
398
+
399
+ // Clear loop_done when transitioning from STOPPED to any other state
400
+ if (old_state == State::STATE_STOPPED && state != State::STATE_STOPPED) {
401
+ this->enable_loop();
402
+ }
394
403
  }
395
404
 
396
405
  } // namespace rtttl
@@ -48,7 +48,6 @@ class RuuviTag : public Component, public esp32_ble_tracker::ESPBTDeviceListener
48
48
  }
49
49
 
50
50
  void dump_config() override;
51
- float get_setup_priority() const override { return setup_priority::DATA; }
52
51
  void set_humidity(sensor::Sensor *humidity) { humidity_ = humidity; }
53
52
  void set_temperature(sensor::Sensor *temperature) { temperature_ = temperature; }
54
53
  void set_pressure(sensor::Sensor *pressure) { pressure_ = pressure; }
@@ -42,6 +42,8 @@ void SafeModeComponent::loop() {
42
42
  ESP_LOGI(TAG, "Boot seems successful; resetting boot loop counter");
43
43
  this->clean_rtc();
44
44
  this->boot_successful_ = true;
45
+ // Disable loop since we no longer need to check
46
+ this->disable_loop();
45
47
  }
46
48
  }
47
49
 
@@ -33,12 +33,15 @@ class SafeModeComponent : public Component {
33
33
  void write_rtc_(uint32_t val);
34
34
  uint32_t read_rtc_();
35
35
 
36
- bool boot_successful_{false}; ///< set to true after boot is considered successful
36
+ // Group all 4-byte aligned members together to avoid padding
37
37
  uint32_t safe_mode_boot_is_good_after_{60000}; ///< The amount of time after which the boot is considered successful
38
38
  uint32_t safe_mode_enable_time_{60000}; ///< The time safe mode should remain active for
39
39
  uint32_t safe_mode_rtc_value_{0};
40
40
  uint32_t safe_mode_start_time_{0}; ///< stores when safe mode was enabled
41
+ // Group 1-byte members together to minimize padding
42
+ bool boot_successful_{false}; ///< set to true after boot is considered successful
41
43
  uint8_t safe_mode_num_attempts_{0};
44
+ // Larger objects at the end
42
45
  ESPPreferenceObject rtc_;
43
46
  CallbackManager<void()> safe_mode_callback_{};
44
47
 
@@ -26,7 +26,6 @@ class SCD30Component : public Component, public sensirion_common::SensirionI2CDe
26
26
  void setup() override;
27
27
  void update();
28
28
  void dump_config() override;
29
- float get_setup_priority() const override { return setup_priority::DATA; }
30
29
 
31
30
  protected:
32
31
  bool is_data_ready_();