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
esphome/core/helpers.h CHANGED
@@ -32,94 +32,27 @@
32
32
  #include <semphr.h>
33
33
  #endif
34
34
 
35
+ #ifdef USE_HOST
36
+ #include <mutex>
37
+ #endif
38
+
35
39
  #define HOT __attribute__((hot))
36
40
  #define ESPDEPRECATED(msg, when) __attribute__((deprecated(msg)))
37
41
  #define ESPHOME_ALWAYS_INLINE __attribute__((always_inline))
38
42
  #define PACKED __attribute__((packed))
39
43
 
40
- // Various functions can be constexpr in C++14, but not in C++11 (because their body isn't just a return statement).
41
- // Define a substitute constexpr keyword for those functions, until we can drop C++11 support.
42
- #if __cplusplus >= 201402L
43
- #define constexpr14 constexpr
44
- #else
45
- #define constexpr14 inline // constexpr implies inline
46
- #endif
47
-
48
44
  namespace esphome {
49
45
 
50
46
  /// @name STL backports
51
47
  ///@{
52
48
 
53
- // Backports for various STL features we like to use. Pull in the STL implementation wherever available, to avoid
54
- // ambiguity and to provide a uniform API.
55
-
56
- // std::to_string() from C++11, available from libstdc++/g++ 8
57
- // See https://github.com/espressif/esp-idf/issues/1445
58
- #if _GLIBCXX_RELEASE >= 8
49
+ // Keep "using" even after the removal of our backports, to avoid breaking existing code.
59
50
  using std::to_string;
60
- #else
61
- std::string to_string(int value); // NOLINT
62
- std::string to_string(long value); // NOLINT
63
- std::string to_string(long long value); // NOLINT
64
- std::string to_string(unsigned value); // NOLINT
65
- std::string to_string(unsigned long value); // NOLINT
66
- std::string to_string(unsigned long long value); // NOLINT
67
- std::string to_string(float value);
68
- std::string to_string(double value);
69
- std::string to_string(long double value);
70
- #endif
71
-
72
- // std::is_trivially_copyable from C++11, implemented in libstdc++/g++ 5.1 (but minor releases can't be detected)
73
- #if _GLIBCXX_RELEASE >= 6
74
51
  using std::is_trivially_copyable;
75
- #else
76
- // Implementing this is impossible without compiler intrinsics, so don't bother. Invalid usage will be detected on
77
- // other variants that use a newer compiler anyway.
78
- // NOLINTNEXTLINE(readability-identifier-naming)
79
- template<typename T> struct is_trivially_copyable : public std::integral_constant<bool, true> {};
80
- #endif
81
-
82
- // std::make_unique() from C++14
83
- #if __cpp_lib_make_unique >= 201304
84
52
  using std::make_unique;
85
- #else
86
- template<typename T, typename... Args> std::unique_ptr<T> make_unique(Args &&...args) {
87
- return std::unique_ptr<T>(new T(std::forward<Args>(args)...));
88
- }
89
- #endif
90
-
91
- // std::enable_if_t from C++14
92
- #if __cplusplus >= 201402L
93
53
  using std::enable_if_t;
94
- #else
95
- template<bool B, class T = void> using enable_if_t = typename std::enable_if<B, T>::type;
96
- #endif
97
-
98
- // std::clamp from C++17
99
- #if __cpp_lib_clamp >= 201603
100
54
  using std::clamp;
101
- #else
102
- template<typename T, typename Compare> constexpr const T &clamp(const T &v, const T &lo, const T &hi, Compare comp) {
103
- return comp(v, lo) ? lo : comp(hi, v) ? hi : v;
104
- }
105
- template<typename T> constexpr const T &clamp(const T &v, const T &lo, const T &hi) {
106
- return clamp(v, lo, hi, std::less<T>{});
107
- }
108
- #endif
109
-
110
- // std::is_invocable from C++17
111
- #if __cpp_lib_is_invocable >= 201703
112
55
  using std::is_invocable;
113
- #else
114
- // https://stackoverflow.com/a/37161919/8924614
115
- template<class T, class... Args> struct is_invocable { // NOLINT(readability-identifier-naming)
116
- template<class U> static auto test(U *p) -> decltype((*p)(std::declval<Args>()...), void(), std::true_type());
117
- template<class U> static auto test(...) -> decltype(std::false_type());
118
- static constexpr auto value = decltype(test<T>(nullptr))::value; // NOLINT
119
- };
120
- #endif
121
-
122
- // std::bit_cast from C++20
123
56
  #if __cpp_lib_bit_cast >= 201806
124
57
  using std::bit_cast;
125
58
  #else
@@ -134,31 +67,29 @@ To bit_cast(const From &src) {
134
67
  return dst;
135
68
  }
136
69
  #endif
70
+ using std::lerp;
137
71
 
138
72
  // std::byteswap from C++23
139
- template<typename T> constexpr14 T byteswap(T n) {
73
+ template<typename T> constexpr T byteswap(T n) {
140
74
  T m;
141
75
  for (size_t i = 0; i < sizeof(T); i++)
142
76
  reinterpret_cast<uint8_t *>(&m)[i] = reinterpret_cast<uint8_t *>(&n)[sizeof(T) - 1 - i];
143
77
  return m;
144
78
  }
145
- template<> constexpr14 uint8_t byteswap(uint8_t n) { return n; }
146
- template<> constexpr14 uint16_t byteswap(uint16_t n) { return __builtin_bswap16(n); }
147
- template<> constexpr14 uint32_t byteswap(uint32_t n) { return __builtin_bswap32(n); }
148
- template<> constexpr14 uint64_t byteswap(uint64_t n) { return __builtin_bswap64(n); }
149
- template<> constexpr14 int8_t byteswap(int8_t n) { return n; }
150
- template<> constexpr14 int16_t byteswap(int16_t n) { return __builtin_bswap16(n); }
151
- template<> constexpr14 int32_t byteswap(int32_t n) { return __builtin_bswap32(n); }
152
- template<> constexpr14 int64_t byteswap(int64_t n) { return __builtin_bswap64(n); }
79
+ template<> constexpr uint8_t byteswap(uint8_t n) { return n; }
80
+ template<> constexpr uint16_t byteswap(uint16_t n) { return __builtin_bswap16(n); }
81
+ template<> constexpr uint32_t byteswap(uint32_t n) { return __builtin_bswap32(n); }
82
+ template<> constexpr uint64_t byteswap(uint64_t n) { return __builtin_bswap64(n); }
83
+ template<> constexpr int8_t byteswap(int8_t n) { return n; }
84
+ template<> constexpr int16_t byteswap(int16_t n) { return __builtin_bswap16(n); }
85
+ template<> constexpr int32_t byteswap(int32_t n) { return __builtin_bswap32(n); }
86
+ template<> constexpr int64_t byteswap(int64_t n) { return __builtin_bswap64(n); }
153
87
 
154
88
  ///@}
155
89
 
156
90
  /// @name Mathematics
157
91
  ///@{
158
92
 
159
- /// Linearly interpolate between \p start and \p end by \p completion (between 0 and 1).
160
- float lerp(float completion, float start, float end);
161
-
162
93
  /// Remap \p value from the range (\p min, \p max) to (\p min_out, \p max_out).
163
94
  template<typename T, typename U> T remap(U value, U min, U max, T min_out, T max_out) {
164
95
  return (value - min) * (max_out - min_out) / (max - min) + min_out;
@@ -203,8 +134,7 @@ constexpr uint32_t encode_uint32(uint8_t byte1, uint8_t byte2, uint8_t byte3, ui
203
134
  }
204
135
 
205
136
  /// Encode a value from its constituent bytes (from most to least significant) in an array with length sizeof(T).
206
- template<typename T, enable_if_t<std::is_unsigned<T>::value, int> = 0>
207
- constexpr14 T encode_value(const uint8_t *bytes) {
137
+ template<typename T, enable_if_t<std::is_unsigned<T>::value, int> = 0> constexpr T encode_value(const uint8_t *bytes) {
208
138
  T val = 0;
209
139
  for (size_t i = 0; i < sizeof(T); i++) {
210
140
  val <<= 8;
@@ -214,12 +144,12 @@ constexpr14 T encode_value(const uint8_t *bytes) {
214
144
  }
215
145
  /// Encode a value from its constituent bytes (from most to least significant) in an std::array with length sizeof(T).
216
146
  template<typename T, enable_if_t<std::is_unsigned<T>::value, int> = 0>
217
- constexpr14 T encode_value(const std::array<uint8_t, sizeof(T)> bytes) {
147
+ constexpr T encode_value(const std::array<uint8_t, sizeof(T)> bytes) {
218
148
  return encode_value<T>(bytes.data());
219
149
  }
220
150
  /// Decode a value into its constituent bytes (from most to least significant).
221
151
  template<typename T, enable_if_t<std::is_unsigned<T>::value, int> = 0>
222
- constexpr14 std::array<uint8_t, sizeof(T)> decode_value(T val) {
152
+ constexpr std::array<uint8_t, sizeof(T)> decode_value(T val) {
223
153
  std::array<uint8_t, sizeof(T)> ret{};
224
154
  for (size_t i = sizeof(T); i > 0; i--) {
225
155
  ret[i - 1] = val & 0xFF;
@@ -246,7 +176,7 @@ inline uint32_t reverse_bits(uint32_t x) {
246
176
  }
247
177
 
248
178
  /// Convert a value between host byte order and big endian (most significant byte first) order.
249
- template<typename T> constexpr14 T convert_big_endian(T val) {
179
+ template<typename T> constexpr T convert_big_endian(T val) {
250
180
  #if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
251
181
  return byteswap(val);
252
182
  #else
@@ -255,7 +185,7 @@ template<typename T> constexpr14 T convert_big_endian(T val) {
255
185
  }
256
186
 
257
187
  /// Convert a value between host byte order and little endian (least significant byte first) order.
258
- template<typename T> constexpr14 T convert_little_endian(T val) {
188
+ template<typename T> constexpr T convert_little_endian(T val) {
259
189
  #if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
260
190
  return val;
261
191
  #else
@@ -276,9 +206,6 @@ bool str_startswith(const std::string &str, const std::string &start);
276
206
  /// Check whether a string ends with a value.
277
207
  bool str_endswith(const std::string &str, const std::string &end);
278
208
 
279
- /// Convert the value to a string (added as extra overload so that to_string() can be used on all stringifiable types).
280
- inline std::string to_string(const std::string &val) { return val; }
281
-
282
209
  /// Truncate a string to a specific length.
283
210
  std::string str_truncate(const std::string &str, size_t length);
284
211
 
@@ -402,6 +329,8 @@ template<typename T, enable_if_t<std::is_unsigned<T>::value, int> = 0> optional<
402
329
  return parse_hex<T>(str.c_str(), str.length());
403
330
  }
404
331
 
332
+ /// Format the six-byte array \p mac into a MAC address.
333
+ std::string format_mac_address_pretty(const uint8_t mac[6]);
405
334
  /// Format the byte array \p data of length \p len in lowercased hex.
406
335
  std::string format_hex(const uint8_t *data, size_t length);
407
336
  /// Format the vector \p data in lowercased hex.
@@ -415,18 +344,149 @@ template<std::size_t N> std::string format_hex(const std::array<uint8_t, N> &dat
415
344
  return format_hex(data.data(), data.size());
416
345
  }
417
346
 
418
- /// Format the byte array \p data of length \p len in pretty-printed, human-readable hex.
419
- std::string format_hex_pretty(const uint8_t *data, size_t length);
420
- /// Format the word array \p data of length \p len in pretty-printed, human-readable hex.
421
- std::string format_hex_pretty(const uint16_t *data, size_t length);
422
- /// Format the vector \p data in pretty-printed, human-readable hex.
423
- std::string format_hex_pretty(const std::vector<uint8_t> &data);
424
- /// Format the vector \p data in pretty-printed, human-readable hex.
425
- std::string format_hex_pretty(const std::vector<uint16_t> &data);
426
- /// Format an unsigned integer in pretty-printed, human-readable hex, starting with the most significant byte.
427
- template<typename T, enable_if_t<std::is_unsigned<T>::value, int> = 0> std::string format_hex_pretty(T val) {
347
+ /** Format a byte array in pretty-printed, human-readable hex format.
348
+ *
349
+ * Converts binary data to a hexadecimal string representation with customizable formatting.
350
+ * Each byte is displayed as a two-digit uppercase hex value, separated by the specified separator.
351
+ * Optionally includes the total byte count in parentheses at the end.
352
+ *
353
+ * @param data Pointer to the byte array to format.
354
+ * @param length Number of bytes in the array.
355
+ * @param separator Character to use between hex bytes (default: '.').
356
+ * @param show_length Whether to append the byte count in parentheses (default: true).
357
+ * @return Formatted hex string, e.g., "A1.B2.C3.D4.E5 (5)" or "A1:B2:C3" depending on parameters.
358
+ *
359
+ * @note Returns empty string if data is nullptr or length is 0.
360
+ * @note The length will only be appended if show_length is true AND the length is greater than 4.
361
+ *
362
+ * Example:
363
+ * @code
364
+ * uint8_t data[] = {0xA1, 0xB2, 0xC3};
365
+ * format_hex_pretty(data, 3); // Returns "A1.B2.C3" (no length shown for <= 4 parts)
366
+ * uint8_t data2[] = {0xA1, 0xB2, 0xC3, 0xD4, 0xE5};
367
+ * format_hex_pretty(data2, 5); // Returns "A1.B2.C3.D4.E5 (5)"
368
+ * format_hex_pretty(data2, 5, ':'); // Returns "A1:B2:C3:D4:E5 (5)"
369
+ * format_hex_pretty(data2, 5, '.', false); // Returns "A1.B2.C3.D4.E5"
370
+ * @endcode
371
+ */
372
+ std::string format_hex_pretty(const uint8_t *data, size_t length, char separator = '.', bool show_length = true);
373
+
374
+ /** Format a 16-bit word array in pretty-printed, human-readable hex format.
375
+ *
376
+ * Similar to the byte array version, but formats 16-bit words as 4-digit hex values.
377
+ *
378
+ * @param data Pointer to the 16-bit word array to format.
379
+ * @param length Number of 16-bit words in the array.
380
+ * @param separator Character to use between hex words (default: '.').
381
+ * @param show_length Whether to append the word count in parentheses (default: true).
382
+ * @return Formatted hex string with 4-digit hex values per word.
383
+ *
384
+ * @note The length will only be appended if show_length is true AND the length is greater than 4.
385
+ *
386
+ * Example:
387
+ * @code
388
+ * uint16_t data[] = {0xA1B2, 0xC3D4};
389
+ * format_hex_pretty(data, 2); // Returns "A1B2.C3D4" (no length shown for <= 4 parts)
390
+ * uint16_t data2[] = {0xA1B2, 0xC3D4, 0xE5F6};
391
+ * format_hex_pretty(data2, 3); // Returns "A1B2.C3D4.E5F6 (3)"
392
+ * @endcode
393
+ */
394
+ std::string format_hex_pretty(const uint16_t *data, size_t length, char separator = '.', bool show_length = true);
395
+
396
+ /** Format a byte vector in pretty-printed, human-readable hex format.
397
+ *
398
+ * Convenience overload for std::vector<uint8_t>. Formats each byte as a two-digit
399
+ * uppercase hex value with customizable separator.
400
+ *
401
+ * @param data Vector of bytes to format.
402
+ * @param separator Character to use between hex bytes (default: '.').
403
+ * @param show_length Whether to append the byte count in parentheses (default: true).
404
+ * @return Formatted hex string representation of the vector contents.
405
+ *
406
+ * @note The length will only be appended if show_length is true AND the vector size is greater than 4.
407
+ *
408
+ * Example:
409
+ * @code
410
+ * std::vector<uint8_t> data = {0xDE, 0xAD, 0xBE, 0xEF};
411
+ * format_hex_pretty(data); // Returns "DE.AD.BE.EF" (no length shown for <= 4 parts)
412
+ * std::vector<uint8_t> data2 = {0xDE, 0xAD, 0xBE, 0xEF, 0xCA};
413
+ * format_hex_pretty(data2); // Returns "DE.AD.BE.EF.CA (5)"
414
+ * format_hex_pretty(data2, '-'); // Returns "DE-AD-BE-EF-CA (5)"
415
+ * @endcode
416
+ */
417
+ std::string format_hex_pretty(const std::vector<uint8_t> &data, char separator = '.', bool show_length = true);
418
+
419
+ /** Format a 16-bit word vector in pretty-printed, human-readable hex format.
420
+ *
421
+ * Convenience overload for std::vector<uint16_t>. Each 16-bit word is formatted
422
+ * as a 4-digit uppercase hex value in big-endian order.
423
+ *
424
+ * @param data Vector of 16-bit words to format.
425
+ * @param separator Character to use between hex words (default: '.').
426
+ * @param show_length Whether to append the word count in parentheses (default: true).
427
+ * @return Formatted hex string representation of the vector contents.
428
+ *
429
+ * @note The length will only be appended if show_length is true AND the vector size is greater than 4.
430
+ *
431
+ * Example:
432
+ * @code
433
+ * std::vector<uint16_t> data = {0x1234, 0x5678};
434
+ * format_hex_pretty(data); // Returns "1234.5678" (no length shown for <= 4 parts)
435
+ * std::vector<uint16_t> data2 = {0x1234, 0x5678, 0x9ABC};
436
+ * format_hex_pretty(data2); // Returns "1234.5678.9ABC (3)"
437
+ * @endcode
438
+ */
439
+ std::string format_hex_pretty(const std::vector<uint16_t> &data, char separator = '.', bool show_length = true);
440
+
441
+ /** Format a string's bytes in pretty-printed, human-readable hex format.
442
+ *
443
+ * Treats each character in the string as a byte and formats it in hex.
444
+ * Useful for debugging binary data stored in std::string containers.
445
+ *
446
+ * @param data String whose bytes should be formatted as hex.
447
+ * @param separator Character to use between hex bytes (default: '.').
448
+ * @param show_length Whether to append the byte count in parentheses (default: true).
449
+ * @return Formatted hex string representation of the string's byte contents.
450
+ *
451
+ * @note The length will only be appended if show_length is true AND the string length is greater than 4.
452
+ *
453
+ * Example:
454
+ * @code
455
+ * std::string data = "ABC"; // ASCII: 0x41, 0x42, 0x43
456
+ * format_hex_pretty(data); // Returns "41.42.43" (no length shown for <= 4 parts)
457
+ * std::string data2 = "ABCDE";
458
+ * format_hex_pretty(data2); // Returns "41.42.43.44.45 (5)"
459
+ * @endcode
460
+ */
461
+ std::string format_hex_pretty(const std::string &data, char separator = '.', bool show_length = true);
462
+
463
+ /** Format an unsigned integer in pretty-printed, human-readable hex format.
464
+ *
465
+ * Converts the integer to big-endian byte order and formats each byte as hex.
466
+ * The most significant byte appears first in the output string.
467
+ *
468
+ * @tparam T Unsigned integer type (uint8_t, uint16_t, uint32_t, uint64_t, etc.).
469
+ * @param val The unsigned integer value to format.
470
+ * @param separator Character to use between hex bytes (default: '.').
471
+ * @param show_length Whether to append the byte count in parentheses (default: true).
472
+ * @return Formatted hex string with most significant byte first.
473
+ *
474
+ * @note The length will only be appended if show_length is true AND sizeof(T) is greater than 4.
475
+ *
476
+ * Example:
477
+ * @code
478
+ * uint32_t value = 0x12345678;
479
+ * format_hex_pretty(value); // Returns "12.34.56.78" (no length shown for <= 4 parts)
480
+ * uint64_t value2 = 0x123456789ABCDEF0;
481
+ * format_hex_pretty(value2); // Returns "12.34.56.78.9A.BC.DE.F0 (8)"
482
+ * format_hex_pretty(value2, ':'); // Returns "12:34:56:78:9A:BC:DE:F0 (8)"
483
+ * format_hex_pretty<uint16_t>(0x1234); // Returns "12.34"
484
+ * @endcode
485
+ */
486
+ template<typename T, enable_if_t<std::is_unsigned<T>::value, int> = 0>
487
+ std::string format_hex_pretty(T val, char separator = '.', bool show_length = true) {
428
488
  val = convert_big_endian(val);
429
- return format_hex_pretty(reinterpret_cast<uint8_t *>(&val), sizeof(T));
489
+ return format_hex_pretty(reinterpret_cast<uint8_t *>(&val), sizeof(T), separator, show_length);
430
490
  }
431
491
 
432
492
  /// Format the byte array \p data of length \p len in binary.
@@ -723,7 +783,7 @@ template<class T> class RAMAllocator {
723
783
  T *reallocate(T *p, size_t n) { return this->reallocate(p, n, sizeof(T)); }
724
784
 
725
785
  T *reallocate(T *p, size_t n, size_t manual_size) {
726
- size_t size = n * sizeof(T);
786
+ size_t size = n * manual_size;
727
787
  T *ptr = nullptr;
728
788
  #ifdef USE_ESP32
729
789
  if (this->flags_ & Flags::ALLOC_EXTERNAL) {
@@ -0,0 +1,151 @@
1
+ #pragma once
2
+
3
+ #if defined(USE_ESP32) || defined(USE_LIBRETINY)
4
+
5
+ #include <atomic>
6
+ #include <cstddef>
7
+
8
+ #if defined(USE_ESP32)
9
+ #include <freertos/FreeRTOS.h>
10
+ #include <freertos/task.h>
11
+ #elif defined(USE_LIBRETINY)
12
+ #include <FreeRTOS.h>
13
+ #include <task.h>
14
+ #endif
15
+
16
+ /*
17
+ * Lock-free queue for single-producer single-consumer scenarios.
18
+ * This allows one thread to push items and another to pop them without
19
+ * blocking each other.
20
+ *
21
+ * This is a Single-Producer Single-Consumer (SPSC) lock-free ring buffer.
22
+ * Available on platforms with FreeRTOS support (ESP32, LibreTiny).
23
+ *
24
+ * Common use cases:
25
+ * - BLE events: BLE task produces, main loop consumes
26
+ * - MQTT messages: main task produces, MQTT thread consumes
27
+ *
28
+ * @tparam T The type of elements stored in the queue (must be a pointer type)
29
+ * @tparam SIZE The maximum number of elements (1-255, limited by uint8_t indices)
30
+ */
31
+
32
+ namespace esphome {
33
+
34
+ // Base lock-free queue without task notification
35
+ template<class T, uint8_t SIZE> class LockFreeQueue {
36
+ public:
37
+ LockFreeQueue() : head_(0), tail_(0), dropped_count_(0) {}
38
+
39
+ bool push(T *element) {
40
+ bool was_empty;
41
+ uint8_t old_tail;
42
+ return push_internal_(element, was_empty, old_tail);
43
+ }
44
+
45
+ protected:
46
+ // Internal push that reports queue state - for use by derived classes
47
+ bool push_internal_(T *element, bool &was_empty, uint8_t &old_tail) {
48
+ if (element == nullptr)
49
+ return false;
50
+
51
+ uint8_t current_tail = tail_.load(std::memory_order_relaxed);
52
+ uint8_t next_tail = (current_tail + 1) % SIZE;
53
+
54
+ // Read head before incrementing tail
55
+ uint8_t head_before = head_.load(std::memory_order_acquire);
56
+
57
+ if (next_tail == head_before) {
58
+ // Buffer full
59
+ dropped_count_.fetch_add(1, std::memory_order_relaxed);
60
+ return false;
61
+ }
62
+
63
+ was_empty = (current_tail == head_before);
64
+ old_tail = current_tail;
65
+
66
+ buffer_[current_tail] = element;
67
+ tail_.store(next_tail, std::memory_order_release);
68
+
69
+ return true;
70
+ }
71
+
72
+ public:
73
+ T *pop() {
74
+ uint8_t current_head = head_.load(std::memory_order_relaxed);
75
+
76
+ if (current_head == tail_.load(std::memory_order_acquire)) {
77
+ return nullptr; // Empty
78
+ }
79
+
80
+ T *element = buffer_[current_head];
81
+ head_.store((current_head + 1) % SIZE, std::memory_order_release);
82
+ return element;
83
+ }
84
+
85
+ size_t size() const {
86
+ uint8_t tail = tail_.load(std::memory_order_acquire);
87
+ uint8_t head = head_.load(std::memory_order_acquire);
88
+ return (tail - head + SIZE) % SIZE;
89
+ }
90
+
91
+ uint16_t get_and_reset_dropped_count() { return dropped_count_.exchange(0, std::memory_order_relaxed); }
92
+
93
+ void increment_dropped_count() { dropped_count_.fetch_add(1, std::memory_order_relaxed); }
94
+
95
+ bool empty() const { return head_.load(std::memory_order_acquire) == tail_.load(std::memory_order_acquire); }
96
+
97
+ bool full() const {
98
+ uint8_t next_tail = (tail_.load(std::memory_order_relaxed) + 1) % SIZE;
99
+ return next_tail == head_.load(std::memory_order_acquire);
100
+ }
101
+
102
+ protected:
103
+ T *buffer_[SIZE];
104
+ // Atomic: written by producer (push/increment), read+reset by consumer (get_and_reset)
105
+ std::atomic<uint16_t> dropped_count_; // 65535 max - more than enough for drop tracking
106
+ // Atomic: written by consumer (pop), read by producer (push) to check if full
107
+ // Using uint8_t limits queue size to 255 elements but saves memory and ensures
108
+ // atomic operations are efficient on all platforms
109
+ std::atomic<uint8_t> head_;
110
+ // Atomic: written by producer (push), read by consumer (pop) to check if empty
111
+ std::atomic<uint8_t> tail_;
112
+ };
113
+
114
+ // Extended queue with task notification support
115
+ template<class T, uint8_t SIZE> class NotifyingLockFreeQueue : public LockFreeQueue<T, SIZE> {
116
+ public:
117
+ NotifyingLockFreeQueue() : LockFreeQueue<T, SIZE>(), task_to_notify_(nullptr) {}
118
+
119
+ bool push(T *element) {
120
+ bool was_empty;
121
+ uint8_t old_tail;
122
+ bool result = this->push_internal_(element, was_empty, old_tail);
123
+
124
+ // Notify optimization: only notify if we need to
125
+ if (result && task_to_notify_ != nullptr &&
126
+ (was_empty || this->head_.load(std::memory_order_acquire) == old_tail)) {
127
+ // Notify in two cases:
128
+ // 1. Queue was empty - consumer might be going to sleep
129
+ // 2. Consumer just caught up to where tail was - might go to sleep
130
+ // Note: There's a benign race in case 2 - between reading head and calling
131
+ // xTaskNotifyGive(), the consumer could advance further. This would result
132
+ // in an unnecessary wake-up, but is harmless and extremely rare in practice.
133
+ xTaskNotifyGive(task_to_notify_);
134
+ }
135
+ // Otherwise: consumer is still behind, no need to notify
136
+
137
+ return result;
138
+ }
139
+
140
+ // Set the FreeRTOS task handle to notify when items are pushed to the queue
141
+ // This enables efficient wake-up of a consumer task that's waiting for data
142
+ // @param task The FreeRTOS task handle to notify, or nullptr to disable notifications
143
+ void set_task_to_notify(TaskHandle_t task) { task_to_notify_ = task; }
144
+
145
+ private:
146
+ TaskHandle_t task_to_notify_;
147
+ };
148
+
149
+ } // namespace esphome
150
+
151
+ #endif // defined(USE_ESP32) || defined(USE_LIBRETINY)
esphome/core/log.cpp CHANGED
@@ -29,7 +29,7 @@ void HOT esp_log_vprintf_(int level, const char *tag, int line, const char *form
29
29
  if (log == nullptr)
30
30
  return;
31
31
 
32
- log->log_vprintf_(level, tag, line, format, args);
32
+ log->log_vprintf_(static_cast<uint8_t>(level), tag, line, format, args);
33
33
  #endif
34
34
  }
35
35
 
@@ -41,7 +41,7 @@ void HOT esp_log_vprintf_(int level, const char *tag, int line, const __FlashStr
41
41
  if (log == nullptr)
42
42
  return;
43
43
 
44
- log->log_vprintf_(level, tag, line, format, args);
44
+ log->log_vprintf_(static_cast<uint8_t>(level), tag, line, format, args);
45
45
  #endif
46
46
  }
47
47
  #endif
esphome/core/log.h CHANGED
@@ -165,6 +165,8 @@ int esp_idf_log_vprintf_(const char *format, va_list args); // NOLINT
165
165
  #define YESNO(b) ((b) ? "YES" : "NO")
166
166
  #define ONOFF(b) ((b) ? "ON" : "OFF")
167
167
  #define TRUEFALSE(b) ((b) ? "TRUE" : "FALSE")
168
+ // for use with optional values
169
+ #define ONOFFMAYBE(b) (((b).has_value()) ? ONOFF((b).value()) : "UNKNOWN")
168
170
 
169
171
  // Helper class that identifies strings that may be stored in flash storage (similar to Arduino's __FlashStringHelper)
170
172
  struct LogString;
esphome/core/optional.h CHANGED
@@ -52,6 +52,11 @@ template<typename T> class optional { // NOLINT
52
52
  reset();
53
53
  return *this;
54
54
  }
55
+ bool operator==(optional<T> const &rhs) const {
56
+ if (has_value() && rhs.has_value())
57
+ return value() == rhs.value();
58
+ return !has_value() && !rhs.has_value();
59
+ }
55
60
 
56
61
  template<class U> optional &operator=(optional<U> const &other) {
57
62
  has_value_ = other.has_value();
@@ -14,7 +14,7 @@ static const char *const TAG = "ring_buffer";
14
14
  RingBuffer::~RingBuffer() {
15
15
  if (this->handle_ != nullptr) {
16
16
  vRingbufferDelete(this->handle_);
17
- RAMAllocator<uint8_t> allocator(RAMAllocator<uint8_t>::ALLOW_FAILURE);
17
+ RAMAllocator<uint8_t> allocator;
18
18
  allocator.deallocate(this->storage_, this->size_);
19
19
  }
20
20
  }
@@ -24,7 +24,7 @@ std::unique_ptr<RingBuffer> RingBuffer::create(size_t len) {
24
24
 
25
25
  rb->size_ = len;
26
26
 
27
- RAMAllocator<uint8_t> allocator(RAMAllocator<uint8_t>::ALLOW_FAILURE);
27
+ RAMAllocator<uint8_t> allocator;
28
28
  rb->storage_ = allocator.allocate(rb->size_);
29
29
  if (rb->storage_ == nullptr) {
30
30
  return nullptr;