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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (601) hide show
  1. esphome/__main__.py +1 -3
  2. esphome/codegen.py +2 -0
  3. esphome/components/ac_dimmer/ac_dimmer.cpp +6 -6
  4. esphome/components/adc/__init__.py +25 -1
  5. esphome/components/adc/adc_sensor.h +11 -11
  6. esphome/components/adc/adc_sensor_common.cpp +1 -1
  7. esphome/components/adc/adc_sensor_esp32.cpp +16 -8
  8. esphome/components/ade7880/ade7880.h +0 -2
  9. esphome/components/ads1115/ads1115.h +0 -1
  10. esphome/components/ads1118/ads1118.h +0 -1
  11. esphome/components/ags10/ags10.h +0 -2
  12. esphome/components/aic3204/aic3204.h +0 -1
  13. esphome/components/alarm_control_panel/__init__.py +5 -2
  14. esphome/components/alpha3/alpha3.h +0 -1
  15. esphome/components/am43/cover/am43_cover.h +0 -1
  16. esphome/components/am43/sensor/am43_sensor.h +0 -1
  17. esphome/components/analog_threshold/analog_threshold_binary_sensor.h +0 -2
  18. esphome/components/anova/anova.cpp +5 -1
  19. esphome/components/anova/anova.h +0 -1
  20. esphome/components/apds9960/apds9960.cpp +1 -1
  21. esphome/components/api/__init__.py +42 -20
  22. esphome/components/api/api_connection.cpp +318 -391
  23. esphome/components/api/api_connection.h +206 -126
  24. esphome/components/api/api_frame_helper.cpp +89 -124
  25. esphome/components/api/api_frame_helper.h +57 -45
  26. esphome/components/api/api_pb2.cpp +414 -4350
  27. esphome/components/api/api_pb2.h +287 -198
  28. esphome/components/api/api_pb2_dump.cpp +4333 -0
  29. esphome/components/api/api_pb2_service.cpp +180 -425
  30. esphome/components/api/api_pb2_service.h +7 -6
  31. esphome/components/api/api_pb2_size.h +2 -4
  32. esphome/components/api/api_server.cpp +138 -167
  33. esphome/components/api/api_server.h +66 -12
  34. esphome/components/api/client.py +10 -4
  35. esphome/components/api/list_entities.cpp +36 -105
  36. esphome/components/api/list_entities.h +31 -23
  37. esphome/components/api/proto.h +26 -3
  38. esphome/components/api/subscribe_state.cpp +23 -29
  39. esphome/components/api/subscribe_state.h +26 -19
  40. esphome/components/as5600/as5600.h +0 -1
  41. esphome/components/async_tcp/__init__.py +14 -5
  42. esphome/components/atc_mithermometer/atc_mithermometer.h +0 -1
  43. esphome/components/atm90e32/atm90e32.cpp +2 -1
  44. esphome/components/audio/audio_decoder.cpp +1 -1
  45. esphome/components/audio/audio_transfer_buffer.cpp +2 -2
  46. esphome/components/b_parasite/b_parasite.h +0 -1
  47. esphome/components/bedjet/bedjet_hub.cpp +5 -1
  48. esphome/components/bedjet/climate/bedjet_climate.cpp +5 -1
  49. esphome/components/beken_spi_led_strip/led_strip.cpp +4 -2
  50. esphome/components/bh1750/bh1750.cpp +5 -5
  51. esphome/components/binary_sensor/__init__.py +82 -5
  52. esphome/components/binary_sensor/automation.h +19 -1
  53. esphome/components/binary_sensor/binary_sensor.cpp +12 -30
  54. esphome/components/binary_sensor/binary_sensor.h +11 -25
  55. esphome/components/binary_sensor/filter.cpp +29 -24
  56. esphome/components/binary_sensor/filter.h +20 -10
  57. esphome/components/ble_client/output/ble_binary_output.h +0 -1
  58. esphome/components/ble_client/sensor/ble_rssi_sensor.cpp +5 -1
  59. esphome/components/ble_client/sensor/ble_rssi_sensor.h +0 -1
  60. esphome/components/ble_client/sensor/ble_sensor.cpp +5 -1
  61. esphome/components/ble_client/sensor/ble_sensor.h +0 -1
  62. esphome/components/ble_client/switch/ble_switch.h +0 -1
  63. esphome/components/ble_client/text_sensor/ble_text_sensor.cpp +5 -1
  64. esphome/components/ble_client/text_sensor/ble_text_sensor.h +0 -1
  65. esphome/components/ble_presence/ble_presence_device.h +0 -1
  66. esphome/components/ble_rssi/ble_rssi_sensor.h +0 -1
  67. esphome/components/ble_scanner/ble_scanner.h +0 -1
  68. esphome/components/bluetooth_proxy/bluetooth_connection.h +9 -2
  69. esphome/components/bluetooth_proxy/bluetooth_proxy.cpp +16 -6
  70. esphome/components/bluetooth_proxy/bluetooth_proxy.h +8 -2
  71. esphome/components/bme680/sensor.py +1 -1
  72. esphome/components/bmp581/bmp581.h +0 -2
  73. esphome/components/button/__init__.py +5 -2
  74. esphome/components/camera/__init__.py +1 -0
  75. esphome/components/camera/camera.cpp +22 -0
  76. esphome/components/camera/camera.h +80 -0
  77. esphome/components/canbus/__init__.py +1 -0
  78. esphome/components/cap1188/cap1188.h +0 -1
  79. esphome/components/captive_portal/__init__.py +12 -2
  80. esphome/components/captive_portal/captive_portal.cpp +12 -2
  81. esphome/components/captive_portal/captive_portal.h +5 -2
  82. esphome/components/ccs811/ccs811.h +0 -2
  83. esphome/components/climate/__init__.py +5 -2
  84. esphome/components/cm1106/sensor.py +2 -2
  85. esphome/components/const/__init__.py +2 -0
  86. esphome/components/copy/binary_sensor/copy_binary_sensor.h +0 -1
  87. esphome/components/copy/button/copy_button.h +0 -1
  88. esphome/components/copy/cover/copy_cover.h +0 -1
  89. esphome/components/copy/fan/copy_fan.h +0 -1
  90. esphome/components/copy/lock/copy_lock.h +0 -1
  91. esphome/components/copy/number/copy_number.h +0 -1
  92. esphome/components/copy/select/copy_select.h +0 -1
  93. esphome/components/copy/sensor/copy_sensor.h +0 -1
  94. esphome/components/copy/switch/copy_switch.h +0 -1
  95. esphome/components/copy/text/copy_text.h +0 -1
  96. esphome/components/copy/text_sensor/copy_text_sensor.h +0 -1
  97. esphome/components/cover/__init__.py +5 -2
  98. esphome/components/cs5460a/cs5460a.h +0 -1
  99. esphome/components/datetime/__init__.py +4 -2
  100. esphome/components/debug/__init__.py +20 -0
  101. esphome/components/deep_sleep/__init__.py +43 -9
  102. esphome/components/demo/__init__.py +2 -2
  103. esphome/components/display/display.cpp +4 -3
  104. esphome/components/display/display.h +0 -2
  105. esphome/components/display/display_buffer.cpp +1 -1
  106. esphome/components/ds2484/__init__.py +1 -0
  107. esphome/components/ds2484/ds2484.cpp +209 -0
  108. esphome/components/ds2484/ds2484.h +43 -0
  109. esphome/components/ds2484/one_wire.py +37 -0
  110. esphome/components/duty_time/duty_time_sensor.h +0 -1
  111. esphome/components/ens160_base/ens160_base.h +0 -1
  112. esphome/components/es7210/es7210.h +0 -1
  113. esphome/components/es7243e/es7243e.h +0 -1
  114. esphome/components/es8156/es8156.h +0 -1
  115. esphome/components/es8311/es8311.h +0 -1
  116. esphome/components/es8388/es8388.h +0 -1
  117. esphome/components/esp32/__init__.py +102 -135
  118. esphome/components/esp32/core.cpp +0 -4
  119. esphome/components/esp32/gpio.h +1 -1
  120. esphome/components/esp32/helpers.cpp +69 -0
  121. esphome/components/esp32_ble/ble.cpp +5 -6
  122. esphome/components/esp32_ble/ble.h +29 -14
  123. esphome/components/esp32_ble/ble_event.h +6 -6
  124. esphome/components/esp32_ble_client/ble_client_base.cpp +21 -6
  125. esphome/components/esp32_ble_client/ble_client_base.h +24 -9
  126. esphome/components/esp32_ble_tracker/__init__.py +2 -8
  127. esphome/components/esp32_ble_tracker/esp32_ble_tracker.cpp +5 -5
  128. esphome/components/esp32_ble_tracker/esp32_ble_tracker.h +11 -7
  129. esphome/components/esp32_camera/__init__.py +111 -97
  130. esphome/components/esp32_camera/esp32_camera.cpp +41 -31
  131. esphome/components/esp32_camera/esp32_camera.h +35 -30
  132. esphome/components/esp32_camera_web_server/__init__.py +2 -1
  133. esphome/components/esp32_camera_web_server/camera_web_server.cpp +8 -8
  134. esphome/components/esp32_camera_web_server/camera_web_server.h +3 -3
  135. esphome/components/esp32_hall/sensor.py +2 -21
  136. esphome/components/esp32_hosted/__init__.py +101 -0
  137. esphome/components/esp32_hosted/esp32_hosted.py.script +12 -0
  138. esphome/components/esp32_improv/esp32_improv_component.cpp +3 -0
  139. esphome/components/esp32_rmt/__init__.py +0 -58
  140. esphome/components/esp32_rmt_led_strip/led_strip.cpp +77 -63
  141. esphome/components/esp32_rmt_led_strip/led_strip.h +11 -17
  142. esphome/components/esp32_rmt_led_strip/light.py +14 -76
  143. esphome/components/esp32_touch/esp32_touch.h +174 -28
  144. esphome/components/esp32_touch/esp32_touch_common.cpp +162 -0
  145. esphome/components/esp32_touch/esp32_touch_v1.cpp +238 -0
  146. esphome/components/esp32_touch/esp32_touch_v2.cpp +397 -0
  147. esphome/components/esp8266/__init__.py +1 -0
  148. esphome/components/esp8266/gpio.cpp +10 -10
  149. esphome/components/esp8266/helpers.cpp +31 -0
  150. esphome/components/esphome/ota/__init__.py +1 -0
  151. esphome/components/esphome/ota/ota_esphome.cpp +24 -19
  152. esphome/components/ethernet/__init__.py +42 -23
  153. esphome/components/ethernet/esp_eth_phy_jl1101.c +0 -16
  154. esphome/components/ethernet/ethernet_component.cpp +69 -29
  155. esphome/components/ethernet/ethernet_component.h +18 -10
  156. esphome/components/event/__init__.py +5 -2
  157. esphome/components/ezo/ezo.h +0 -1
  158. esphome/components/ezo_pmp/ezo_pmp.h +0 -1
  159. esphome/components/fan/__init__.py +5 -2
  160. esphome/components/feedback/feedback_cover.h +0 -1
  161. esphome/components/font/__init__.py +92 -82
  162. esphome/components/font/font.cpp +9 -2
  163. esphome/components/font/font.h +20 -5
  164. esphome/components/fs3000/fs3000.h +0 -1
  165. esphome/components/gcja5/gcja5.h +0 -1
  166. esphome/components/gl_r01_i2c/__init__.py +0 -0
  167. esphome/components/gl_r01_i2c/gl_r01_i2c.cpp +68 -0
  168. esphome/components/gl_r01_i2c/gl_r01_i2c.h +22 -0
  169. esphome/components/gl_r01_i2c/sensor.py +36 -0
  170. esphome/components/gp8403/gp8403.h +0 -1
  171. esphome/components/gpio/binary_sensor/__init__.py +17 -0
  172. esphome/components/gpio/binary_sensor/gpio_binary_sensor.cpp +77 -3
  173. esphome/components/gpio/binary_sensor/gpio_binary_sensor.h +40 -0
  174. esphome/components/grove_gas_mc_v2/grove_gas_mc_v2.h +0 -2
  175. esphome/components/he60r/he60r.h +0 -1
  176. esphome/components/heatpumpir/climate.py +2 -1
  177. esphome/components/heatpumpir/heatpumpir.cpp +1 -0
  178. esphome/components/heatpumpir/heatpumpir.h +1 -0
  179. esphome/components/honeywellabp2_i2c/honeywellabp2.h +0 -1
  180. esphome/components/host/__init__.py +2 -1
  181. esphome/components/host/helpers.cpp +57 -0
  182. esphome/components/http_request/__init__.py +19 -1
  183. esphome/components/http_request/http_request.h +1 -1
  184. esphome/components/http_request/http_request_arduino.cpp +0 -1
  185. esphome/components/http_request/http_request_arduino.h +1 -0
  186. esphome/components/http_request/http_request_idf.cpp +0 -1
  187. esphome/components/http_request/ota/ota_http_request.cpp +1 -1
  188. esphome/components/http_request/update/http_request_update.cpp +28 -9
  189. esphome/components/hydreon_rgxx/hydreon_rgxx.cpp +3 -9
  190. esphome/components/hydreon_rgxx/sensor.py +1 -1
  191. esphome/components/i2c/__init__.py +23 -11
  192. esphome/components/i2c/i2c_bus.h +8 -1
  193. esphome/components/i2c/i2c_bus_arduino.cpp +4 -3
  194. esphome/components/i2c/i2c_bus_arduino.h +6 -3
  195. esphome/components/i2c/i2c_bus_esp_idf.h +5 -3
  196. esphome/components/i2c_device/i2c_device.h +0 -1
  197. esphome/components/i2s_audio/__init__.py +2 -10
  198. esphome/components/i2s_audio/i2s_audio.cpp +1 -5
  199. esphome/components/i2s_audio/media_player/__init__.py +2 -2
  200. esphome/components/i2s_audio/speaker/i2s_audio_speaker.cpp +2 -2
  201. esphome/components/iaqcore/iaqcore.h +0 -2
  202. esphome/components/image/__init__.py +123 -24
  203. esphome/components/improv_serial/improv_serial_component.cpp +0 -4
  204. esphome/components/ina219/ina219.cpp +7 -0
  205. esphome/components/ina219/ina219.h +1 -0
  206. esphome/components/ina260/ina260.h +0 -2
  207. esphome/components/inkbird_ibsth1_mini/inkbird_ibsth1_mini.h +0 -1
  208. esphome/components/inkplate6/display.py +15 -0
  209. esphome/components/inkplate6/inkplate.cpp +2 -2
  210. esphome/components/integration/integration_sensor.h +0 -1
  211. esphome/components/internal_temperature/internal_temperature.cpp +8 -27
  212. esphome/components/internal_temperature/sensor.py +0 -26
  213. esphome/components/interval/interval.h +0 -2
  214. esphome/components/ld2410/button/__init__.py +3 -3
  215. esphome/components/ld2410/button/factory_reset_button.cpp +9 -0
  216. esphome/components/ld2410/button/{reset_button.h → factory_reset_button.h} +2 -2
  217. esphome/components/ld2410/ld2410.cpp +430 -261
  218. esphome/components/ld2410/ld2410.h +44 -146
  219. esphome/components/ld2410/number/__init__.py +2 -2
  220. esphome/components/ld2410/sensor.py +1 -1
  221. esphome/components/ld2410/switch/__init__.py +1 -1
  222. esphome/components/ld2420/ld2420.cpp +196 -100
  223. esphome/components/ld2420/ld2420.h +46 -118
  224. esphome/components/ld2420/number/__init__.py +2 -2
  225. esphome/components/ld2420/sensor/__init__.py +6 -2
  226. esphome/components/ld2420/sensor/ld2420_sensor.h +1 -1
  227. esphome/components/ld2450/button/__init__.py +3 -3
  228. esphome/components/ld2450/button/factory_reset_button.cpp +9 -0
  229. esphome/components/ld2450/button/{reset_button.h → factory_reset_button.h} +2 -2
  230. esphome/components/ld2450/ld2450.cpp +384 -232
  231. esphome/components/ld2450/ld2450.h +60 -69
  232. esphome/components/ld2450/switch/__init__.py +1 -1
  233. esphome/components/ledc/ledc_output.cpp +1 -63
  234. esphome/components/libretiny/__init__.py +4 -3
  235. esphome/components/libretiny/const.py +5 -0
  236. esphome/components/libretiny/generate_components.py +1 -0
  237. esphome/components/libretiny/helpers.cpp +35 -0
  238. esphome/components/libretiny/lt_component.cpp +5 -3
  239. esphome/components/light/__init__.py +4 -2
  240. esphome/components/light/addressable_light.h +3 -3
  241. esphome/components/light/light_call.cpp +180 -243
  242. esphome/components/light/light_call.h +72 -20
  243. esphome/components/light/light_color_values.h +14 -14
  244. esphome/components/light/light_state.h +15 -13
  245. esphome/components/light/transformers.h +2 -2
  246. esphome/components/ln882x/__init__.py +52 -0
  247. esphome/components/ln882x/boards.py +285 -0
  248. esphome/components/lock/__init__.py +5 -2
  249. esphome/components/logger/__init__.py +40 -3
  250. esphome/components/logger/logger.cpp +47 -12
  251. esphome/components/logger/logger.h +80 -49
  252. esphome/components/logger/logger_esp32.cpp +3 -3
  253. esphome/components/lps22/__init__.py +0 -0
  254. esphome/components/lps22/lps22.cpp +75 -0
  255. esphome/components/lps22/lps22.h +27 -0
  256. esphome/components/lps22/sensor.py +58 -0
  257. esphome/components/ltr390/ltr390.h +0 -1
  258. esphome/components/ltr501/ltr501.h +0 -1
  259. esphome/components/ltr_als_ps/ltr_als_ps.h +0 -1
  260. esphome/components/lvgl/__init__.py +1 -1
  261. esphome/components/lvgl/schemas.py +66 -6
  262. esphome/components/lvgl/styles.py +24 -16
  263. esphome/components/lvgl/widgets/__init__.py +12 -2
  264. esphome/components/lvgl/widgets/lv_bar.py +40 -19
  265. esphome/components/m5stack_8angle/light/m5stack_8angle_light.cpp +1 -1
  266. esphome/components/max9611/max9611.h +0 -1
  267. esphome/components/mcp23016/__init__.py +1 -1
  268. esphome/components/mcp23xxx_base/__init__.py +1 -1
  269. esphome/components/mcp4461/__init__.py +1 -1
  270. esphome/components/mcp4461/output/__init__.py +3 -2
  271. esphome/components/mcp9600/mcp9600.h +0 -2
  272. esphome/components/md5/md5.cpp +3 -3
  273. esphome/components/md5/md5.h +1 -6
  274. esphome/components/mdns/__init__.py +22 -11
  275. esphome/components/media_player/__init__.py +4 -3
  276. esphome/components/micro_wake_word/__init__.py +1 -5
  277. esphome/components/micro_wake_word/streaming_model.cpp +2 -2
  278. esphome/components/microphone/microphone.cpp +7 -9
  279. esphome/components/microphone/microphone.h +0 -2
  280. esphome/components/mipi_spi/display.py +1 -0
  281. esphome/components/mmc5603/mmc5603.cpp +1 -1
  282. esphome/components/modbus/modbus.cpp +33 -15
  283. esphome/components/modbus/modbus.h +9 -0
  284. esphome/components/modbus_controller/__init__.py +42 -10
  285. esphome/components/modbus_controller/modbus_controller.cpp +92 -11
  286. esphome/components/modbus_controller/modbus_controller.h +61 -7
  287. esphome/components/mopeka_pro_check/mopeka_pro_check.h +0 -1
  288. esphome/components/mopeka_std_check/mopeka_std_check.h +0 -1
  289. esphome/components/mpl3115a2/mpl3115a2.h +0 -2
  290. esphome/components/mqtt/__init__.py +16 -0
  291. esphome/components/mqtt/mqtt_backend.h +2 -1
  292. esphome/components/mqtt/mqtt_backend_esp32.cpp +126 -45
  293. esphome/components/mqtt/mqtt_backend_esp32.h +106 -4
  294. esphome/components/mqtt/mqtt_client.cpp +15 -9
  295. esphome/components/mqtt/mqtt_client.h +8 -3
  296. esphome/components/ms8607/ms8607.h +0 -1
  297. esphome/components/neopixelbus/light.py +4 -1
  298. esphome/components/neopixelbus/neopixelbus_light.h +1 -1
  299. esphome/components/network/__init__.py +4 -1
  300. esphome/components/network/ip_address.h +1 -0
  301. esphome/components/nextion/__init__.py +16 -0
  302. esphome/components/nextion/base_component.py +1 -0
  303. esphome/components/nextion/binary_sensor/nextion_binarysensor.cpp +1 -1
  304. esphome/components/nextion/display.py +14 -4
  305. esphome/components/nextion/nextion.cpp +166 -101
  306. esphome/components/nextion/nextion.h +84 -53
  307. esphome/components/nextion/nextion_commands.cpp +11 -10
  308. esphome/components/nextion/nextion_component.cpp +28 -28
  309. esphome/components/nextion/nextion_component.h +53 -18
  310. esphome/components/nextion/nextion_component_base.h +3 -0
  311. esphome/components/nextion/nextion_upload.cpp +36 -0
  312. esphome/components/nextion/nextion_upload_arduino.cpp +10 -35
  313. esphome/components/nextion/nextion_upload_idf.cpp +9 -33
  314. esphome/components/nextion/sensor/nextion_sensor.cpp +1 -1
  315. esphome/components/nextion/switch/nextion_switch.cpp +1 -1
  316. esphome/components/nextion/text_sensor/nextion_textsensor.cpp +1 -1
  317. esphome/components/nfc/nfc.cpp +3 -22
  318. esphome/components/nfc/nfc.h +3 -3
  319. esphome/components/number/__init__.py +5 -2
  320. esphome/components/online_image/__init__.py +5 -0
  321. esphome/components/online_image/online_image.cpp +6 -2
  322. esphome/components/online_image/online_image.h +4 -1
  323. esphome/components/opentherm/opentherm.cpp +7 -12
  324. esphome/components/openthread/__init__.py +47 -40
  325. esphome/components/openthread/const.py +1 -0
  326. esphome/components/openthread/openthread_esp.cpp +27 -5
  327. esphome/components/opt3001/__init__.py +0 -0
  328. esphome/components/opt3001/opt3001.cpp +122 -0
  329. esphome/components/opt3001/opt3001.h +27 -0
  330. esphome/components/opt3001/sensor.py +35 -0
  331. esphome/components/ota/__init__.py +17 -0
  332. esphome/components/ota/ota_backend.h +27 -1
  333. esphome/components/ota/ota_backend_arduino_esp32.cpp +12 -2
  334. esphome/components/ota/ota_backend_arduino_esp32.h +3 -0
  335. esphome/components/ota/ota_backend_arduino_esp8266.cpp +18 -4
  336. esphome/components/ota/ota_backend_arduino_esp8266.h +3 -0
  337. esphome/components/ota/ota_backend_arduino_libretiny.cpp +12 -2
  338. esphome/components/ota/ota_backend_arduino_libretiny.h +3 -0
  339. esphome/components/ota/ota_backend_arduino_rp2040.cpp +9 -2
  340. esphome/components/ota/ota_backend_arduino_rp2040.h +3 -0
  341. esphome/components/ota/ota_backend_esp_idf.cpp +10 -16
  342. esphome/components/ota/ota_backend_esp_idf.h +1 -0
  343. esphome/components/packages/__init__.py +5 -2
  344. esphome/components/packet_transport/binary_sensor.py +61 -4
  345. esphome/components/packet_transport/packet_transport.cpp +31 -1
  346. esphome/components/packet_transport/packet_transport.h +11 -5
  347. esphome/components/pcf8574/__init__.py +1 -1
  348. esphome/components/pi4ioe5v6408/__init__.py +84 -0
  349. esphome/components/pi4ioe5v6408/pi4ioe5v6408.cpp +171 -0
  350. esphome/components/pi4ioe5v6408/pi4ioe5v6408.h +70 -0
  351. esphome/components/pmsa003i/pmsa003i.h +0 -1
  352. esphome/components/pmsx003/pmsx003.h +0 -1
  353. esphome/components/pn7150/pn7150.cpp +7 -7
  354. esphome/components/pn7150/pn7150.h +0 -1
  355. esphome/components/pn7160/pn7160.cpp +7 -7
  356. esphome/components/pn7160/pn7160.h +0 -1
  357. esphome/components/preferences/syncer.h +2 -0
  358. esphome/components/prometheus/prometheus_handler.h +1 -1
  359. esphome/components/psram/psram.cpp +0 -20
  360. esphome/components/pulse_counter/pulse_counter_sensor.h +0 -1
  361. esphome/components/pulse_meter/pulse_meter_sensor.cpp +8 -4
  362. esphome/components/pulse_width/pulse_width.h +0 -1
  363. esphome/components/pvvx_mithermometer/display/pvvx_display.cpp +0 -4
  364. esphome/components/pvvx_mithermometer/display/pvvx_display.h +0 -2
  365. esphome/components/pvvx_mithermometer/pvvx_mithermometer.h +0 -1
  366. esphome/components/qr_code/__init__.py +13 -10
  367. esphome/components/qwiic_pir/qwiic_pir.h +0 -1
  368. esphome/components/radon_eye_ble/radon_eye_listener.cpp +1 -1
  369. esphome/components/rc522/rc522.h +0 -1
  370. esphome/components/rdm6300/rdm6300.h +0 -2
  371. esphome/components/remote_base/__init__.py +7 -5
  372. esphome/components/remote_base/remote_base.cpp +24 -21
  373. esphome/components/remote_base/remote_base.h +3 -26
  374. esphome/components/remote_receiver/__init__.py +40 -46
  375. esphome/components/remote_receiver/remote_receiver.h +4 -18
  376. esphome/components/remote_receiver/remote_receiver_esp32.cpp +0 -87
  377. esphome/components/remote_receiver/remote_receiver_esp8266.cpp +1 -1
  378. esphome/components/remote_transmitter/__init__.py +42 -43
  379. esphome/components/remote_transmitter/remote_transmitter.h +2 -14
  380. esphome/components/remote_transmitter/remote_transmitter_esp32.cpp +0 -77
  381. esphome/components/resistance/resistance_sensor.h +0 -1
  382. esphome/components/rp2040/__init__.py +1 -0
  383. esphome/components/rp2040/helpers.cpp +55 -0
  384. esphome/components/rp2040_pio_led_strip/led_strip.cpp +2 -2
  385. esphome/components/rpi_dpi_rgb/rpi_dpi_rgb.cpp +0 -4
  386. esphome/components/rtttl/__init__.py +4 -4
  387. esphome/components/rtttl/rtttl.cpp +10 -1
  388. esphome/components/ruuvitag/ruuvitag.h +0 -1
  389. esphome/components/safe_mode/safe_mode.cpp +2 -0
  390. esphome/components/safe_mode/safe_mode.h +4 -1
  391. esphome/components/scd30/scd30.h +0 -1
  392. esphome/components/scd30/sensor.py +2 -2
  393. esphome/components/scd4x/scd4x.cpp +61 -54
  394. esphome/components/scd4x/scd4x.h +17 -15
  395. esphome/components/scd4x/sensor.py +4 -4
  396. esphome/components/script/script.h +0 -2
  397. esphome/components/sdp3x/sensor.py +1 -1
  398. esphome/components/select/__init__.py +5 -2
  399. esphome/components/sen5x/sen5x.h +0 -1
  400. esphome/components/senseair/senseair.h +0 -1
  401. esphome/components/sensor/__init__.py +4 -2
  402. esphome/components/sensor/filter.cpp +1 -1
  403. esphome/components/sensor/sensor.cpp +12 -6
  404. esphome/components/sensor/sensor.h +13 -5
  405. esphome/components/servo/servo.h +0 -1
  406. esphome/components/sfa30/sfa30.h +0 -1
  407. esphome/components/sgp30/sgp30.h +0 -1
  408. esphome/components/sgp4x/sgp4x.h +0 -1
  409. esphome/components/shelly_dimmer/stm32flash.cpp +1 -2
  410. esphome/components/sht4x/sht4x.h +0 -1
  411. esphome/components/sm300d2/sm300d2.h +0 -2
  412. esphome/components/smt100/sensor.py +8 -4
  413. esphome/components/smt100/smt100.cpp +5 -5
  414. esphome/components/smt100/smt100.h +3 -3
  415. esphome/components/sn74hc595/__init__.py +1 -1
  416. esphome/components/sn74hc595/sn74hc595.cpp +5 -4
  417. esphome/components/sntp/sntp_component.cpp +9 -3
  418. esphome/components/sntp/time.py +2 -0
  419. esphome/components/socket/__init__.py +17 -0
  420. esphome/components/spi/__init__.py +27 -6
  421. esphome/components/spi/spi.cpp +3 -2
  422. esphome/components/spi/spi.h +9 -3
  423. esphome/components/spi/spi_arduino.cpp +3 -5
  424. esphome/components/spi/spi_esp_idf.cpp +40 -21
  425. esphome/components/spi_led_strip/spi_led_strip.cpp +1 -1
  426. esphome/components/sps30/sps30.h +0 -1
  427. esphome/components/ssd1306_base/ssd1306_base.cpp +1 -1
  428. esphome/components/st7701s/st7701s.cpp +0 -4
  429. esphome/components/status/status_binary_sensor.h +0 -2
  430. esphome/components/substitutions/__init__.py +76 -19
  431. esphome/components/substitutions/jinja.py +99 -0
  432. esphome/components/sun/sun.cpp +3 -4
  433. esphome/components/switch/__init__.py +5 -2
  434. esphome/components/switch/binary_sensor/switch_binary_sensor.h +0 -1
  435. esphome/components/sx126x/__init__.py +317 -0
  436. esphome/components/sx126x/automation.h +62 -0
  437. esphome/components/sx126x/packet_transport/__init__.py +26 -0
  438. esphome/components/sx126x/packet_transport/sx126x_transport.cpp +26 -0
  439. esphome/components/sx126x/packet_transport/sx126x_transport.h +25 -0
  440. esphome/components/sx126x/sx126x.cpp +523 -0
  441. esphome/components/sx126x/sx126x.h +140 -0
  442. esphome/components/sx126x/sx126x_reg.h +163 -0
  443. esphome/components/sx127x/__init__.py +325 -0
  444. esphome/components/sx127x/automation.h +62 -0
  445. esphome/components/sx127x/packet_transport/__init__.py +26 -0
  446. esphome/components/sx127x/packet_transport/sx127x_transport.cpp +26 -0
  447. esphome/components/sx127x/packet_transport/sx127x_transport.h +25 -0
  448. esphome/components/sx127x/sx127x.cpp +498 -0
  449. esphome/components/sx127x/sx127x.h +128 -0
  450. esphome/components/sx127x/sx127x_reg.h +295 -0
  451. esphome/components/syslog/esphome_syslog.cpp +5 -3
  452. esphome/components/syslog/esphome_syslog.h +1 -1
  453. esphome/components/tca9555/__init__.py +1 -1
  454. esphome/components/template/binary_sensor/template_binary_sensor.cpp +1 -9
  455. esphome/components/text/__init__.py +5 -2
  456. esphome/components/text_sensor/__init__.py +5 -2
  457. esphome/components/thermostat/thermostat_climate.cpp +34 -31
  458. esphome/components/thermostat/thermostat_climate.h +43 -39
  459. esphome/components/time/__init__.py +16 -2
  460. esphome/components/time/real_time_clock.cpp +4 -0
  461. esphome/components/time/real_time_clock.h +5 -1
  462. esphome/components/tlc5971/tlc5971.cpp +4 -1
  463. esphome/components/tmp1075/tmp1075.h +0 -2
  464. esphome/components/tof10120/tof10120_sensor.h +0 -1
  465. esphome/components/tormatic/tormatic_cover.h +0 -1
  466. esphome/components/total_daily_energy/total_daily_energy.h +0 -1
  467. esphome/components/tsl2591/tsl2591.cpp +1 -1
  468. esphome/components/ttp229_bsf/ttp229_bsf.h +0 -1
  469. esphome/components/ttp229_lsf/ttp229_lsf.h +0 -1
  470. esphome/components/tx20/tx20.cpp +2 -2
  471. esphome/components/uart/__init__.py +18 -0
  472. esphome/components/uart/uart_component_esp_idf.cpp +1 -5
  473. esphome/components/update/__init__.py +5 -2
  474. esphome/components/update/update_entity.h +8 -0
  475. esphome/components/usb_host/__init__.py +5 -2
  476. esphome/components/valve/__init__.py +5 -2
  477. esphome/components/vbus/vbus.h +0 -1
  478. esphome/components/veml3235/veml3235.h +0 -1
  479. esphome/components/veml7700/veml7700.h +0 -1
  480. esphome/components/vl53l0x/vl53l0x_sensor.h +0 -1
  481. esphome/components/voice_assistant/voice_assistant.cpp +4 -4
  482. esphome/components/watchdog/watchdog.cpp +0 -4
  483. esphome/components/waveshare_epaper/waveshare_epaper.cpp +6 -6
  484. esphome/components/web_server/__init__.py +34 -19
  485. esphome/components/web_server/ota/__init__.py +32 -0
  486. esphome/components/web_server/ota/ota_web_server.cpp +210 -0
  487. esphome/components/web_server/ota/ota_web_server.h +26 -0
  488. esphome/components/web_server/web_server.cpp +311 -430
  489. esphome/components/web_server/web_server.h +33 -23
  490. esphome/components/web_server/web_server_v1.cpp +4 -5
  491. esphome/components/web_server_base/__init__.py +5 -2
  492. esphome/components/web_server_base/web_server_base.cpp +2 -94
  493. esphome/components/web_server_base/web_server_base.h +5 -25
  494. esphome/components/web_server_idf/multipart.cpp +254 -0
  495. esphome/components/web_server_idf/multipart.h +86 -0
  496. esphome/components/web_server_idf/utils.cpp +32 -0
  497. esphome/components/web_server_idf/utils.h +10 -0
  498. esphome/components/web_server_idf/web_server_idf.cpp +162 -16
  499. esphome/components/web_server_idf/web_server_idf.h +11 -10
  500. esphome/components/wiegand/wiegand.cpp +2 -2
  501. esphome/components/wifi/__init__.py +18 -0
  502. esphome/components/wifi/wifi_component.cpp +17 -22
  503. esphome/components/wifi/wifi_component.h +27 -23
  504. esphome/components/wifi/wifi_component_esp32_arduino.cpp +52 -59
  505. esphome/components/wifi/wifi_component_esp8266.cpp +46 -46
  506. esphome/components/wifi/wifi_component_esp_idf.cpp +35 -36
  507. esphome/components/wifi/wifi_component_libretiny.cpp +26 -27
  508. esphome/components/wifi/wifi_component_pico_w.cpp +3 -3
  509. esphome/components/wifi_info/wifi_info_text_sensor.cpp +6 -6
  510. esphome/components/wireguard/__init__.py +2 -11
  511. esphome/components/xiaomi_ble/xiaomi_ble.cpp +13 -1
  512. esphome/components/xiaomi_ble/xiaomi_ble.h +1 -0
  513. esphome/components/xiaomi_cgd1/xiaomi_cgd1.h +0 -1
  514. esphome/components/xiaomi_cgdk2/xiaomi_cgdk2.h +0 -1
  515. esphome/components/xiaomi_cgg1/xiaomi_cgg1.h +0 -1
  516. esphome/components/xiaomi_cgpr1/xiaomi_cgpr1.h +0 -1
  517. esphome/components/xiaomi_gcls002/xiaomi_gcls002.h +0 -1
  518. esphome/components/xiaomi_hhccjcy01/xiaomi_hhccjcy01.h +0 -1
  519. esphome/components/xiaomi_hhccjcy10/xiaomi_hhccjcy10.h +0 -1
  520. esphome/components/xiaomi_hhccpot002/xiaomi_hhccpot002.h +0 -1
  521. esphome/components/xiaomi_jqjcy01ym/xiaomi_jqjcy01ym.h +0 -1
  522. esphome/components/xiaomi_lywsd02/xiaomi_lywsd02.h +0 -1
  523. esphome/components/xiaomi_lywsd02mmc/xiaomi_lywsd02mmc.h +0 -1
  524. esphome/components/xiaomi_lywsd03mmc/xiaomi_lywsd03mmc.h +0 -1
  525. esphome/components/xiaomi_lywsdcgq/xiaomi_lywsdcgq.h +0 -1
  526. esphome/components/xiaomi_mhoc303/xiaomi_mhoc303.h +0 -1
  527. esphome/components/xiaomi_mhoc401/xiaomi_mhoc401.h +0 -1
  528. esphome/components/xiaomi_miscale/xiaomi_miscale.h +0 -1
  529. esphome/components/xiaomi_mjyd02yla/xiaomi_mjyd02yla.h +0 -1
  530. esphome/components/xiaomi_mue4094rt/xiaomi_mue4094rt.h +0 -1
  531. esphome/components/xiaomi_rtcgq02lm/xiaomi_rtcgq02lm.h +0 -1
  532. esphome/components/xiaomi_wx08zm/xiaomi_wx08zm.h +0 -1
  533. esphome/components/xiaomi_xmwsdj04mmc/__init__.py +0 -0
  534. esphome/components/xiaomi_xmwsdj04mmc/sensor.py +77 -0
  535. esphome/components/xiaomi_xmwsdj04mmc/xiaomi_xmwsdj04mmc.cpp +77 -0
  536. esphome/components/xiaomi_xmwsdj04mmc/xiaomi_xmwsdj04mmc.h +36 -0
  537. esphome/components/zio_ultrasonic/zio_ultrasonic.h +0 -2
  538. esphome/components/zyaura/zyaura.h +0 -1
  539. esphome/config.py +88 -22
  540. esphome/config_helpers.py +74 -1
  541. esphome/config_validation.py +12 -1
  542. esphome/const.py +65 -10
  543. esphome/core/__init__.py +18 -2
  544. esphome/core/application.cpp +163 -10
  545. esphome/core/application.h +145 -165
  546. esphome/core/area.h +19 -0
  547. esphome/core/automation.h +58 -9
  548. esphome/core/color.cpp +3 -5
  549. esphome/core/color.h +16 -16
  550. esphome/core/component.cpp +151 -18
  551. esphome/core/component.h +98 -4
  552. esphome/core/component_iterator.cpp +7 -7
  553. esphome/core/component_iterator.h +9 -7
  554. esphome/core/config.py +155 -6
  555. esphome/core/controller.cpp +4 -2
  556. esphome/core/controller.h +1 -1
  557. esphome/core/datatypes.h +2 -2
  558. esphome/core/defines.h +17 -2
  559. esphome/core/device.h +20 -0
  560. esphome/core/entity_base.cpp +20 -15
  561. esphome/core/entity_base.h +76 -0
  562. esphome/core/entity_helpers.py +162 -1
  563. esphome/core/event_pool.h +81 -0
  564. esphome/core/helpers.cpp +75 -230
  565. esphome/core/helpers.h +164 -104
  566. esphome/core/lock_free_queue.h +151 -0
  567. esphome/core/log.cpp +2 -2
  568. esphome/core/log.h +2 -0
  569. esphome/core/optional.h +5 -0
  570. esphome/core/ring_buffer.cpp +2 -2
  571. esphome/core/scheduler.cpp +278 -103
  572. esphome/core/scheduler.h +157 -17
  573. esphome/core/time.cpp +5 -5
  574. esphome/core/time.h +5 -5
  575. esphome/cpp_generator.py +17 -0
  576. esphome/cpp_helpers.py +0 -22
  577. esphome/cpp_types.py +3 -1
  578. esphome/dashboard/entries.py +1 -1
  579. esphome/dashboard/util/text.py +5 -21
  580. esphome/dashboard/web_server.py +9 -1
  581. esphome/helpers.py +47 -0
  582. esphome/loader.py +15 -1
  583. esphome/pins.py +14 -8
  584. esphome/wizard.py +16 -3
  585. esphome/writer.py +21 -3
  586. esphome/yaml_util.py +0 -2
  587. {esphome-2025.6.2.dist-info → esphome-2025.7.0b1.dist-info}/METADATA +10 -9
  588. {esphome-2025.6.2.dist-info → esphome-2025.7.0b1.dist-info}/RECORD +593 -533
  589. esphome/components/esp32_ble/ble_event_pool.h +0 -72
  590. esphome/components/esp32_ble/queue.h +0 -85
  591. esphome/components/esp32_hall/esp32_hall.cpp +0 -25
  592. esphome/components/esp32_hall/esp32_hall.h +0 -23
  593. esphome/components/esp32_touch/esp32_touch.cpp +0 -355
  594. esphome/components/ld2410/button/reset_button.cpp +0 -9
  595. esphome/components/ld2450/button/reset_button.cpp +0 -9
  596. esphome/components/openthread/tlv.py +0 -65
  597. /esphome/{dashboard/enum.py → enum.py} +0 -0
  598. {esphome-2025.6.2.dist-info → esphome-2025.7.0b1.dist-info}/WHEEL +0 -0
  599. {esphome-2025.6.2.dist-info → esphome-2025.7.0b1.dist-info}/entry_points.txt +0 -0
  600. {esphome-2025.6.2.dist-info → esphome-2025.7.0b1.dist-info}/licenses/LICENSE +0 -0
  601. {esphome-2025.6.2.dist-info → esphome-2025.7.0b1.dist-info}/top_level.txt +0 -0
@@ -16,7 +16,12 @@ from esphome.components.esp32.const import (
16
16
  VARIANT_ESP32S3,
17
17
  )
18
18
  from esphome.components.libretiny import get_libretiny_component, get_libretiny_family
19
- from esphome.components.libretiny.const import COMPONENT_BK72XX, COMPONENT_RTL87XX
19
+ from esphome.components.libretiny.const import (
20
+ COMPONENT_BK72XX,
21
+ COMPONENT_LN882X,
22
+ COMPONENT_RTL87XX,
23
+ )
24
+ from esphome.config_helpers import filter_source_files_from_platform
20
25
  import esphome.config_validation as cv
21
26
  from esphome.const import (
22
27
  CONF_ARGS,
@@ -35,8 +40,10 @@ from esphome.const import (
35
40
  PLATFORM_BK72XX,
36
41
  PLATFORM_ESP32,
37
42
  PLATFORM_ESP8266,
43
+ PLATFORM_LN882X,
38
44
  PLATFORM_RP2040,
39
45
  PLATFORM_RTL87XX,
46
+ PlatformFramework,
40
47
  )
41
48
  from esphome.core import CORE, Lambda, coroutine_with_priority
42
49
 
@@ -100,6 +107,7 @@ UART_SELECTION_ESP8266 = [UART0, UART0_SWAP, UART1]
100
107
 
101
108
  UART_SELECTION_LIBRETINY = {
102
109
  COMPONENT_BK72XX: [DEFAULT, UART1, UART2],
110
+ COMPONENT_LN882X: [DEFAULT, UART0, UART1, UART2],
103
111
  COMPONENT_RTL87XX: [DEFAULT, UART0, UART1, UART2],
104
112
  }
105
113
 
@@ -184,7 +192,9 @@ CONFIG_SCHEMA = cv.All(
184
192
  {
185
193
  cv.GenerateID(): cv.declare_id(Logger),
186
194
  cv.Optional(CONF_BAUD_RATE, default=115200): cv.positive_int,
187
- cv.Optional(CONF_TX_BUFFER_SIZE, default=512): cv.validate_bytes,
195
+ cv.Optional(CONF_TX_BUFFER_SIZE, default=512): cv.All(
196
+ cv.validate_bytes, cv.int_range(min=160, max=65535)
197
+ ),
188
198
  cv.Optional(CONF_DEASSERT_RTS_DTR, default=False): cv.boolean,
189
199
  cv.SplitDefault(
190
200
  CONF_TASK_LOG_BUFFER_SIZE,
@@ -215,6 +225,7 @@ CONFIG_SCHEMA = cv.All(
215
225
  esp32_p4_idf=USB_SERIAL_JTAG,
216
226
  rp2040=USB_CDC,
217
227
  bk72xx=DEFAULT,
228
+ ln882x=DEFAULT,
218
229
  rtl87xx=DEFAULT,
219
230
  ): cv.All(
220
231
  cv.only_on(
@@ -223,6 +234,7 @@ CONFIG_SCHEMA = cv.All(
223
234
  PLATFORM_ESP32,
224
235
  PLATFORM_RP2040,
225
236
  PLATFORM_BK72XX,
237
+ PLATFORM_LN882X,
226
238
  PLATFORM_RTL87XX,
227
239
  ]
228
240
  ),
@@ -324,7 +336,10 @@ async def to_code(config):
324
336
  if CORE.using_arduino:
325
337
  if config[CONF_HARDWARE_UART] == USB_CDC:
326
338
  cg.add_build_flag("-DARDUINO_USB_CDC_ON_BOOT=1")
327
- if CORE.is_esp32 and get_esp32_variant() == VARIANT_ESP32C3:
339
+ if CORE.is_esp32 and get_esp32_variant() in (
340
+ VARIANT_ESP32C3,
341
+ VARIANT_ESP32C6,
342
+ ):
328
343
  cg.add_build_flag("-DARDUINO_USB_MODE=1")
329
344
 
330
345
  if CORE.using_esp_idf:
@@ -431,3 +446,25 @@ async def logger_set_level_to_code(config, action_id, template_arg, args):
431
446
 
432
447
  lambda_ = await cg.process_lambda(Lambda(text), args, return_type=cg.void)
433
448
  return cg.new_Pvariable(action_id, template_arg, lambda_)
449
+
450
+
451
+ FILTER_SOURCE_FILES = filter_source_files_from_platform(
452
+ {
453
+ "logger_esp32.cpp": {
454
+ PlatformFramework.ESP32_ARDUINO,
455
+ PlatformFramework.ESP32_IDF,
456
+ },
457
+ "logger_esp8266.cpp": {PlatformFramework.ESP8266_ARDUINO},
458
+ "logger_host.cpp": {PlatformFramework.HOST_NATIVE},
459
+ "logger_rp2040.cpp": {PlatformFramework.RP2040_ARDUINO},
460
+ "logger_libretiny.cpp": {
461
+ PlatformFramework.BK72XX_ARDUINO,
462
+ PlatformFramework.RTL87XX_ARDUINO,
463
+ PlatformFramework.LN882X_ARDUINO,
464
+ },
465
+ "task_log_buffer.cpp": {
466
+ PlatformFramework.ESP32_ARDUINO,
467
+ PlatformFramework.ESP32_IDF,
468
+ },
469
+ }
470
+ )
@@ -24,7 +24,7 @@ static const char *const TAG = "logger";
24
24
  // - Messages are serialized through main loop for proper console output
25
25
  // - Fallback to emergency console logging only if ring buffer is full
26
26
  // - WITHOUT task log buffer: Only emergency console output, no callbacks
27
- void HOT Logger::log_vprintf_(int level, const char *tag, int line, const char *format, va_list args) { // NOLINT
27
+ void HOT Logger::log_vprintf_(uint8_t level, const char *tag, int line, const char *format, va_list args) { // NOLINT
28
28
  if (level > this->level_for(tag))
29
29
  return;
30
30
 
@@ -46,8 +46,13 @@ void HOT Logger::log_vprintf_(int level, const char *tag, int line, const char *
46
46
  bool message_sent = false;
47
47
  #ifdef USE_ESPHOME_TASK_LOG_BUFFER
48
48
  // For non-main tasks, queue the message for callbacks - but only if we have any callbacks registered
49
- message_sent = this->log_buffer_->send_message_thread_safe(static_cast<uint8_t>(level), tag,
50
- static_cast<uint16_t>(line), current_task, format, args);
49
+ message_sent =
50
+ this->log_buffer_->send_message_thread_safe(level, tag, static_cast<uint16_t>(line), current_task, format, args);
51
+ if (message_sent) {
52
+ // Enable logger loop to process the buffered message
53
+ // This is safe to call from any context including ISRs
54
+ this->enable_loop_soon_any_context();
55
+ }
51
56
  #endif // USE_ESPHOME_TASK_LOG_BUFFER
52
57
 
53
58
  // Emergency console logging for non-main tasks when ring buffer is full or disabled
@@ -58,7 +63,7 @@ void HOT Logger::log_vprintf_(int level, const char *tag, int line, const char *
58
63
  // Maximum size for console log messages (includes null terminator)
59
64
  static const size_t MAX_CONSOLE_LOG_MSG_SIZE = 144;
60
65
  char console_buffer[MAX_CONSOLE_LOG_MSG_SIZE]; // MUST be stack allocated for thread safety
61
- int buffer_at = 0; // Initialize buffer position
66
+ uint16_t buffer_at = 0; // Initialize buffer position
62
67
  this->format_log_to_buffer_with_terminator_(level, tag, line, format, args, console_buffer, &buffer_at,
63
68
  MAX_CONSOLE_LOG_MSG_SIZE);
64
69
  this->write_msg_(console_buffer);
@@ -69,7 +74,7 @@ void HOT Logger::log_vprintf_(int level, const char *tag, int line, const char *
69
74
  }
70
75
  #else
71
76
  // Implementation for all other platforms
72
- void HOT Logger::log_vprintf_(int level, const char *tag, int line, const char *format, va_list args) { // NOLINT
77
+ void HOT Logger::log_vprintf_(uint8_t level, const char *tag, int line, const char *format, va_list args) { // NOLINT
73
78
  if (level > this->level_for(tag) || global_recursion_guard_)
74
79
  return;
75
80
 
@@ -85,7 +90,26 @@ void HOT Logger::log_vprintf_(int level, const char *tag, int line, const char *
85
90
  #ifdef USE_STORE_LOG_STR_IN_FLASH
86
91
  // Implementation for ESP8266 with flash string support.
87
92
  // Note: USE_STORE_LOG_STR_IN_FLASH is only defined for ESP8266.
88
- void Logger::log_vprintf_(int level, const char *tag, int line, const __FlashStringHelper *format,
93
+ //
94
+ // This function handles format strings stored in flash memory (PROGMEM) to save RAM.
95
+ // The buffer is used in a special way to avoid allocating extra memory:
96
+ //
97
+ // Memory layout during execution:
98
+ // Step 1: Copy format string from flash to buffer
99
+ // tx_buffer_: [format_string][null][.....................]
100
+ // tx_buffer_at_: ------------------^
101
+ // msg_start: saved here -----------^
102
+ //
103
+ // Step 2: format_log_to_buffer_with_terminator_ reads format string from beginning
104
+ // and writes formatted output starting at msg_start position
105
+ // tx_buffer_: [format_string][null][formatted_message][null]
106
+ // tx_buffer_at_: -------------------------------------^
107
+ //
108
+ // Step 3: Output the formatted message (starting at msg_start)
109
+ // write_msg_ and callbacks receive: this->tx_buffer_ + msg_start
110
+ // which points to: [formatted_message][null]
111
+ //
112
+ void Logger::log_vprintf_(uint8_t level, const char *tag, int line, const __FlashStringHelper *format,
89
113
  va_list args) { // NOLINT
90
114
  if (level > this->level_for(tag) || global_recursion_guard_)
91
115
  return;
@@ -116,13 +140,15 @@ void Logger::log_vprintf_(int level, const char *tag, int line, const __FlashStr
116
140
  if (this->baud_rate_ > 0) {
117
141
  this->write_msg_(this->tx_buffer_ + msg_start);
118
142
  }
119
- this->log_callback_.call(level, tag, this->tx_buffer_ + msg_start);
143
+ size_t msg_length =
144
+ this->tx_buffer_at_ - msg_start; // Don't subtract 1 - tx_buffer_at_ is already at the null terminator position
145
+ this->log_callback_.call(level, tag, this->tx_buffer_ + msg_start, msg_length);
120
146
 
121
147
  global_recursion_guard_ = false;
122
148
  }
123
149
  #endif // USE_STORE_LOG_STR_IN_FLASH
124
150
 
125
- inline int Logger::level_for(const char *tag) {
151
+ inline uint8_t Logger::level_for(const char *tag) {
126
152
  auto it = this->log_levels_.find(tag);
127
153
  if (it != this->log_levels_.end())
128
154
  return it->second;
@@ -139,6 +165,10 @@ Logger::Logger(uint32_t baud_rate, size_t tx_buffer_size) : baud_rate_(baud_rate
139
165
  #ifdef USE_ESPHOME_TASK_LOG_BUFFER
140
166
  void Logger::init_log_buffer(size_t total_buffer_size) {
141
167
  this->log_buffer_ = esphome::make_unique<logger::TaskLogBuffer>(total_buffer_size);
168
+
169
+ // Start with loop disabled when using task buffer (unless using USB CDC)
170
+ // The loop will be enabled automatically when messages arrive
171
+ this->disable_loop_when_buffer_empty_();
142
172
  }
143
173
  #endif
144
174
 
@@ -176,7 +206,8 @@ void Logger::loop() {
176
206
  this->tx_buffer_size_);
177
207
  this->write_footer_to_buffer_(this->tx_buffer_, &this->tx_buffer_at_, this->tx_buffer_size_);
178
208
  this->tx_buffer_[this->tx_buffer_at_] = '\0';
179
- this->log_callback_.call(message->level, message->tag, this->tx_buffer_);
209
+ size_t msg_len = this->tx_buffer_at_; // We already know the length from tx_buffer_at_
210
+ this->log_callback_.call(message->level, message->tag, this->tx_buffer_, msg_len);
180
211
  // At this point all the data we need from message has been transferred to the tx_buffer
181
212
  // so we can release the message to allow other tasks to use it as soon as possible.
182
213
  this->log_buffer_->release_message_main_loop(received_token);
@@ -189,19 +220,23 @@ void Logger::loop() {
189
220
  this->write_msg_(this->tx_buffer_);
190
221
  }
191
222
  }
223
+ } else {
224
+ // No messages to process, disable loop if appropriate
225
+ // This reduces overhead when there's no async logging activity
226
+ this->disable_loop_when_buffer_empty_();
192
227
  }
193
228
  #endif
194
229
  }
195
230
  #endif
196
231
 
197
232
  void Logger::set_baud_rate(uint32_t baud_rate) { this->baud_rate_ = baud_rate; }
198
- void Logger::set_log_level(const std::string &tag, int log_level) { this->log_levels_[tag] = log_level; }
233
+ void Logger::set_log_level(const std::string &tag, uint8_t log_level) { this->log_levels_[tag] = log_level; }
199
234
 
200
235
  #if defined(USE_ESP32) || defined(USE_ESP8266) || defined(USE_RP2040) || defined(USE_LIBRETINY)
201
236
  UARTSelection Logger::get_uart() const { return this->uart_; }
202
237
  #endif
203
238
 
204
- void Logger::add_on_log_callback(std::function<void(int, const char *, const char *)> &&callback) {
239
+ void Logger::add_on_log_callback(std::function<void(uint8_t, const char *, const char *, size_t)> &&callback) {
205
240
  this->log_callback_.add(std::move(callback));
206
241
  }
207
242
  float Logger::get_setup_priority() const { return setup_priority::BUS + 500.0f; }
@@ -230,7 +265,7 @@ void Logger::dump_config() {
230
265
  }
231
266
  }
232
267
 
233
- void Logger::set_log_level(int level) {
268
+ void Logger::set_log_level(uint8_t level) {
234
269
  if (level > ESPHOME_LOG_LEVEL) {
235
270
  level = ESPHOME_LOG_LEVEL;
236
271
  ESP_LOGW(TAG, "Cannot set log level higher than pre-compiled %s", LOG_LEVELS[ESPHOME_LOG_LEVEL]);
@@ -61,7 +61,7 @@ static const char *const LOG_LEVEL_LETTERS[] = {
61
61
  *
62
62
  * Advanced configuration (pin selection, etc) is not supported.
63
63
  */
64
- enum UARTSelection {
64
+ enum UARTSelection : uint8_t {
65
65
  #ifdef USE_LIBRETINY
66
66
  UART_SELECTION_DEFAULT = 0,
67
67
  UART_SELECTION_UART0,
@@ -129,10 +129,10 @@ class Logger : public Component {
129
129
  #endif
130
130
 
131
131
  /// Set the default log level for this logger.
132
- void set_log_level(int level);
132
+ void set_log_level(uint8_t level);
133
133
  /// Set the log level of the specified tag.
134
- void set_log_level(const std::string &tag, int log_level);
135
- int get_log_level() { return this->current_level_; }
134
+ void set_log_level(const std::string &tag, uint8_t log_level);
135
+ uint8_t get_log_level() { return this->current_level_; }
136
136
 
137
137
  // ========== INTERNAL METHODS ==========
138
138
  // (In most use cases you won't need these)
@@ -140,19 +140,20 @@ class Logger : public Component {
140
140
  void pre_setup();
141
141
  void dump_config() override;
142
142
 
143
- inline int level_for(const char *tag);
143
+ inline uint8_t level_for(const char *tag);
144
144
 
145
145
  /// Register a callback that will be called for every log message sent
146
- void add_on_log_callback(std::function<void(int, const char *, const char *)> &&callback);
146
+ void add_on_log_callback(std::function<void(uint8_t, const char *, const char *, size_t)> &&callback);
147
147
 
148
148
  // add a listener for log level changes
149
- void add_listener(std::function<void(int)> &&callback) { this->level_callback_.add(std::move(callback)); }
149
+ void add_listener(std::function<void(uint8_t)> &&callback) { this->level_callback_.add(std::move(callback)); }
150
150
 
151
151
  float get_setup_priority() const override;
152
152
 
153
- void log_vprintf_(int level, const char *tag, int line, const char *format, va_list args); // NOLINT
153
+ void log_vprintf_(uint8_t level, const char *tag, int line, const char *format, va_list args); // NOLINT
154
154
  #ifdef USE_STORE_LOG_STR_IN_FLASH
155
- void log_vprintf_(int level, const char *tag, int line, const __FlashStringHelper *format, va_list args); // NOLINT
155
+ void log_vprintf_(uint8_t level, const char *tag, int line, const __FlashStringHelper *format,
156
+ va_list args); // NOLINT
156
157
  #endif
157
158
 
158
159
  protected:
@@ -160,8 +161,9 @@ class Logger : public Component {
160
161
 
161
162
  // Format a log message with printf-style arguments and write it to a buffer with header, footer, and null terminator
162
163
  // It's the caller's responsibility to initialize buffer_at (typically to 0)
163
- inline void HOT format_log_to_buffer_with_terminator_(int level, const char *tag, int line, const char *format,
164
- va_list args, char *buffer, int *buffer_at, int buffer_size) {
164
+ inline void HOT format_log_to_buffer_with_terminator_(uint8_t level, const char *tag, int line, const char *format,
165
+ va_list args, char *buffer, uint16_t *buffer_at,
166
+ uint16_t buffer_size) {
165
167
  #if defined(USE_ESP32) || defined(USE_LIBRETINY)
166
168
  this->write_header_to_buffer_(level, tag, line, this->get_thread_name_(), buffer, buffer_at, buffer_size);
167
169
  #else
@@ -180,7 +182,7 @@ class Logger : public Component {
180
182
  }
181
183
 
182
184
  // Helper to format and send a log message to both console and callbacks
183
- inline void HOT log_message_to_buffer_and_send_(int level, const char *tag, int line, const char *format,
185
+ inline void HOT log_message_to_buffer_and_send_(uint8_t level, const char *tag, int line, const char *format,
184
186
  va_list args) {
185
187
  // Format to tx_buffer and prepare for output
186
188
  this->tx_buffer_at_ = 0; // Initialize buffer position
@@ -190,15 +192,16 @@ class Logger : public Component {
190
192
  if (this->baud_rate_ > 0) {
191
193
  this->write_msg_(this->tx_buffer_); // If logging is enabled, write to console
192
194
  }
193
- this->log_callback_.call(level, tag, this->tx_buffer_);
195
+ this->log_callback_.call(level, tag, this->tx_buffer_, this->tx_buffer_at_);
194
196
  }
195
197
 
196
198
  // Write the body of the log message to the buffer
197
- inline void write_body_to_buffer_(const char *value, size_t length, char *buffer, int *buffer_at, int buffer_size) {
199
+ inline void write_body_to_buffer_(const char *value, size_t length, char *buffer, uint16_t *buffer_at,
200
+ uint16_t buffer_size) {
198
201
  // Calculate available space
199
- const int available = buffer_size - *buffer_at;
200
- if (available <= 0)
202
+ if (*buffer_at >= buffer_size)
201
203
  return;
204
+ const uint16_t available = buffer_size - *buffer_at;
202
205
 
203
206
  // Determine copy length (minimum of remaining capacity and string length)
204
207
  const size_t copy_len = (length < static_cast<size_t>(available)) ? length : available;
@@ -211,7 +214,7 @@ class Logger : public Component {
211
214
  }
212
215
 
213
216
  // Format string to explicit buffer with varargs
214
- inline void printf_to_buffer_(char *buffer, int *buffer_at, int buffer_size, const char *format, ...) {
217
+ inline void printf_to_buffer_(char *buffer, uint16_t *buffer_at, uint16_t buffer_size, const char *format, ...) {
215
218
  va_list arg;
216
219
  va_start(arg, format);
217
220
  this->format_body_to_buffer_(buffer, buffer_at, buffer_size, format, arg);
@@ -222,41 +225,50 @@ class Logger : public Component {
222
225
  const char *get_uart_selection_();
223
226
  #endif
224
227
 
228
+ // Group 4-byte aligned members first
225
229
  uint32_t baud_rate_;
226
230
  char *tx_buffer_{nullptr};
227
- int tx_buffer_at_{0};
228
- int tx_buffer_size_{0};
229
- #if defined(USE_ESP32) || defined(USE_ESP8266) || defined(USE_RP2040)
230
- UARTSelection uart_{UART_SELECTION_UART0};
231
- #endif
232
- #ifdef USE_LIBRETINY
233
- UARTSelection uart_{UART_SELECTION_DEFAULT};
234
- #endif
235
231
  #ifdef USE_ARDUINO
236
232
  Stream *hw_serial_{nullptr};
237
233
  #endif
234
+ #if defined(USE_ESP32) || defined(USE_LIBRETINY)
235
+ void *main_task_ = nullptr; // Only used for thread name identification
236
+ #endif
237
+ #ifdef USE_ESP32
238
+ // Task-specific recursion guards:
239
+ // - Main task uses a dedicated member variable for efficiency
240
+ // - Other tasks use pthread TLS with a dynamically created key via pthread_key_create
241
+ pthread_key_t log_recursion_key_; // 4 bytes
242
+ #endif
238
243
  #ifdef USE_ESP_IDF
239
- uart_port_t uart_num_;
244
+ uart_port_t uart_num_; // 4 bytes (enum defaults to int size)
240
245
  #endif
241
- std::map<std::string, int> log_levels_{};
242
- CallbackManager<void(int, const char *, const char *)> log_callback_{};
243
- int current_level_{ESPHOME_LOG_LEVEL_VERY_VERBOSE};
246
+
247
+ // Large objects (internally aligned)
248
+ std::map<std::string, uint8_t> log_levels_{};
249
+ CallbackManager<void(uint8_t, const char *, const char *, size_t)> log_callback_{};
250
+ CallbackManager<void(uint8_t)> level_callback_{};
244
251
  #ifdef USE_ESPHOME_TASK_LOG_BUFFER
245
252
  std::unique_ptr<logger::TaskLogBuffer> log_buffer_; // Will be initialized with init_log_buffer
246
253
  #endif
254
+
255
+ // Group smaller types together at the end
256
+ uint16_t tx_buffer_at_{0};
257
+ uint16_t tx_buffer_size_{0};
258
+ uint8_t current_level_{ESPHOME_LOG_LEVEL_VERY_VERBOSE};
259
+ #if defined(USE_ESP32) || defined(USE_ESP8266) || defined(USE_RP2040)
260
+ UARTSelection uart_{UART_SELECTION_UART0};
261
+ #endif
262
+ #ifdef USE_LIBRETINY
263
+ UARTSelection uart_{UART_SELECTION_DEFAULT};
264
+ #endif
247
265
  #ifdef USE_ESP32
248
- // Task-specific recursion guards:
249
- // - Main task uses a dedicated member variable for efficiency
250
- // - Other tasks use pthread TLS with a dynamically created key via pthread_key_create
251
266
  bool main_task_recursion_guard_{false};
252
- pthread_key_t log_recursion_key_;
253
267
  #else
254
268
  bool global_recursion_guard_{false}; // Simple global recursion guard for single-task platforms
255
269
  #endif
256
- CallbackManager<void(int)> level_callback_{};
257
270
 
258
271
  #if defined(USE_ESP32) || defined(USE_LIBRETINY)
259
- void *main_task_ = nullptr; // Only used for thread name identification
260
272
  const char *HOT get_thread_name_() {
261
273
  TaskHandle_t current_task = xTaskGetCurrentTaskHandle();
262
274
  if (current_task == main_task_) {
@@ -297,11 +309,10 @@ class Logger : public Component {
297
309
  }
298
310
  #endif
299
311
 
300
- inline void HOT write_header_to_buffer_(int level, const char *tag, int line, const char *thread_name, char *buffer,
301
- int *buffer_at, int buffer_size) {
312
+ inline void HOT write_header_to_buffer_(uint8_t level, const char *tag, int line, const char *thread_name,
313
+ char *buffer, uint16_t *buffer_at, uint16_t buffer_size) {
302
314
  // Format header
303
- if (level < 0)
304
- level = 0;
315
+ // uint8_t level is already bounded 0-255, just ensure it's <= 7
305
316
  if (level > 7)
306
317
  level = 7;
307
318
 
@@ -320,12 +331,12 @@ class Logger : public Component {
320
331
  this->printf_to_buffer_(buffer, buffer_at, buffer_size, "%s[%s][%s:%03u]: ", color, letter, tag, line);
321
332
  }
322
333
 
323
- inline void HOT format_body_to_buffer_(char *buffer, int *buffer_at, int buffer_size, const char *format,
334
+ inline void HOT format_body_to_buffer_(char *buffer, uint16_t *buffer_at, uint16_t buffer_size, const char *format,
324
335
  va_list args) {
325
336
  // Get remaining capacity in the buffer
326
- const int remaining = buffer_size - *buffer_at;
327
- if (remaining <= 0)
337
+ if (*buffer_at >= buffer_size)
328
338
  return;
339
+ const uint16_t remaining = buffer_size - *buffer_at;
329
340
 
330
341
  const int ret = vsnprintf(buffer + *buffer_at, remaining, format, args);
331
342
 
@@ -334,7 +345,7 @@ class Logger : public Component {
334
345
  }
335
346
 
336
347
  // Update buffer_at with the formatted length (handle truncation)
337
- int formatted_len = (ret >= remaining) ? remaining : ret;
348
+ uint16_t formatted_len = (ret >= remaining) ? remaining : ret;
338
349
  *buffer_at += formatted_len;
339
350
 
340
351
  // Remove all trailing newlines right after formatting
@@ -343,18 +354,38 @@ class Logger : public Component {
343
354
  }
344
355
  }
345
356
 
346
- inline void HOT write_footer_to_buffer_(char *buffer, int *buffer_at, int buffer_size) {
347
- static const int RESET_COLOR_LEN = strlen(ESPHOME_LOG_RESET_COLOR);
357
+ inline void HOT write_footer_to_buffer_(char *buffer, uint16_t *buffer_at, uint16_t buffer_size) {
358
+ static constexpr uint16_t RESET_COLOR_LEN = sizeof(ESPHOME_LOG_RESET_COLOR) - 1;
348
359
  this->write_body_to_buffer_(ESPHOME_LOG_RESET_COLOR, RESET_COLOR_LEN, buffer, buffer_at, buffer_size);
349
360
  }
361
+
362
+ #ifdef USE_ESP32
363
+ // Disable loop when task buffer is empty (with USB CDC check)
364
+ inline void disable_loop_when_buffer_empty_() {
365
+ // Thread safety note: This is safe even if another task calls enable_loop_soon_any_context()
366
+ // concurrently. If that happens between our check and disable_loop(), the enable request
367
+ // will be processed on the next main loop iteration since:
368
+ // - disable_loop() takes effect immediately
369
+ // - enable_loop_soon_any_context() sets a pending flag that's checked at loop start
370
+ #if defined(USE_LOGGER_USB_CDC) && defined(USE_ARDUINO)
371
+ // Only disable if not using USB CDC (which needs loop for connection detection)
372
+ if (this->uart_ != UART_SELECTION_USB_CDC) {
373
+ this->disable_loop();
374
+ }
375
+ #else
376
+ // No USB CDC support, always safe to disable
377
+ this->disable_loop();
378
+ #endif
379
+ }
380
+ #endif
350
381
  };
351
382
  extern Logger *global_logger; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables)
352
383
 
353
- class LoggerMessageTrigger : public Trigger<int, const char *, const char *> {
384
+ class LoggerMessageTrigger : public Trigger<uint8_t, const char *, const char *> {
354
385
  public:
355
- explicit LoggerMessageTrigger(Logger *parent, int level) {
386
+ explicit LoggerMessageTrigger(Logger *parent, uint8_t level) {
356
387
  this->level_ = level;
357
- parent->add_on_log_callback([this](int level, const char *tag, const char *message) {
388
+ parent->add_on_log_callback([this](uint8_t level, const char *tag, const char *message, size_t message_len) {
358
389
  if (level <= this->level_) {
359
390
  this->trigger(level, tag, message);
360
391
  }
@@ -362,7 +393,7 @@ class LoggerMessageTrigger : public Trigger<int, const char *, const char *> {
362
393
  }
363
394
 
364
395
  protected:
365
- int level_;
396
+ uint8_t level_;
366
397
  };
367
398
 
368
399
  } // namespace logger
@@ -83,9 +83,7 @@ void init_uart(uart_port_t uart_num, uint32_t baud_rate, int tx_buffer_size) {
83
83
  uart_config.parity = UART_PARITY_DISABLE;
84
84
  uart_config.stop_bits = UART_STOP_BITS_1;
85
85
  uart_config.flow_ctrl = UART_HW_FLOWCTRL_DISABLE;
86
- #if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 0, 0)
87
86
  uart_config.source_clk = UART_SCLK_DEFAULT;
88
- #endif
89
87
  uart_param_config(uart_num, &uart_config);
90
88
  const int uart_buffer_size = tx_buffer_size;
91
89
  // Install UART driver using an event queue here
@@ -186,7 +184,9 @@ void HOT Logger::write_msg_(const char *msg) {
186
184
  ) {
187
185
  puts(msg);
188
186
  } else {
189
- uart_write_bytes(this->uart_num_, msg, strlen(msg));
187
+ // Use tx_buffer_at_ if msg points to tx_buffer_, otherwise fall back to strlen
188
+ size_t len = (msg == this->tx_buffer_) ? this->tx_buffer_at_ : strlen(msg);
189
+ uart_write_bytes(this->uart_num_, msg, len);
190
190
  uart_write_bytes(this->uart_num_, "\n", 1);
191
191
  }
192
192
  }
File without changes
@@ -0,0 +1,75 @@
1
+ #include "lps22.h"
2
+
3
+ namespace esphome {
4
+ namespace lps22 {
5
+
6
+ static constexpr const char *const TAG = "lps22";
7
+
8
+ static constexpr uint8_t WHO_AM_I = 0x0F;
9
+ static constexpr uint8_t LPS22HB_ID = 0xB1;
10
+ static constexpr uint8_t LPS22HH_ID = 0xB3;
11
+ static constexpr uint8_t CTRL_REG2 = 0x11;
12
+ static constexpr uint8_t CTRL_REG2_ONE_SHOT_MASK = 0b1;
13
+ static constexpr uint8_t STATUS = 0x27;
14
+ static constexpr uint8_t STATUS_T_DA_MASK = 0b10;
15
+ static constexpr uint8_t STATUS_P_DA_MASK = 0b01;
16
+ static constexpr uint8_t TEMP_L = 0x2b;
17
+ static constexpr uint8_t PRES_OUT_XL = 0x28;
18
+ static constexpr uint8_t REF_P_XL = 0x28;
19
+ static constexpr uint8_t READ_ATTEMPTS = 10;
20
+ static constexpr uint8_t READ_INTERVAL = 5;
21
+ static constexpr float PRESSURE_SCALE = 1.0f / 4096.0f;
22
+ static constexpr float TEMPERATURE_SCALE = 0.01f;
23
+
24
+ void LPS22Component::setup() {
25
+ uint8_t value = 0x00;
26
+ this->read_register(WHO_AM_I, &value, 1);
27
+ if (value != LPS22HB_ID && value != LPS22HH_ID) {
28
+ ESP_LOGW(TAG, "device IDs as %02x, which isn't a known LPS22HB or LPS22HH ID", value);
29
+ this->mark_failed();
30
+ }
31
+ }
32
+
33
+ void LPS22Component::dump_config() {
34
+ ESP_LOGCONFIG(TAG, "LPS22:");
35
+ LOG_SENSOR(" ", "Temperature", this->temperature_sensor_);
36
+ LOG_SENSOR(" ", "Pressure", this->pressure_sensor_);
37
+ LOG_I2C_DEVICE(this);
38
+ LOG_UPDATE_INTERVAL(this);
39
+ }
40
+
41
+ void LPS22Component::update() {
42
+ uint8_t value = 0x00;
43
+ this->read_register(CTRL_REG2, &value, 1);
44
+ value |= CTRL_REG2_ONE_SHOT_MASK;
45
+ this->write_register(CTRL_REG2, &value, 1);
46
+ this->set_retry(READ_INTERVAL, READ_ATTEMPTS, [this](uint8_t _) { return this->try_read_(); });
47
+ }
48
+
49
+ RetryResult LPS22Component::try_read_() {
50
+ uint8_t value = 0x00;
51
+ this->read_register(STATUS, &value, 1);
52
+ const uint8_t expected_status_mask = STATUS_T_DA_MASK | STATUS_P_DA_MASK;
53
+ if ((value & expected_status_mask) != expected_status_mask) {
54
+ ESP_LOGD(TAG, "STATUS not ready: %x", value);
55
+ return RetryResult::RETRY;
56
+ }
57
+
58
+ if (this->temperature_sensor_ != nullptr) {
59
+ uint8_t t_buf[2]{0};
60
+ this->read_register(TEMP_L, t_buf, 2);
61
+ int16_t encoded = static_cast<int16_t>(encode_uint16(t_buf[1], t_buf[0]));
62
+ float temp = TEMPERATURE_SCALE * static_cast<float>(encoded);
63
+ this->temperature_sensor_->publish_state(temp);
64
+ }
65
+ if (this->pressure_sensor_ != nullptr) {
66
+ uint8_t p_buf[3]{0};
67
+ this->read_register(PRES_OUT_XL, p_buf, 3);
68
+ uint32_t p_lsb = encode_uint24(p_buf[2], p_buf[1], p_buf[0]);
69
+ this->pressure_sensor_->publish_state(PRESSURE_SCALE * static_cast<float>(p_lsb));
70
+ }
71
+ return RetryResult::DONE;
72
+ }
73
+
74
+ } // namespace lps22
75
+ } // namespace esphome
@@ -0,0 +1,27 @@
1
+ #pragma once
2
+
3
+ #include "esphome/core/component.h"
4
+ #include "esphome/components/sensor/sensor.h"
5
+ #include "esphome/components/i2c/i2c.h"
6
+
7
+ namespace esphome {
8
+ namespace lps22 {
9
+
10
+ class LPS22Component : public sensor::Sensor, public PollingComponent, public i2c::I2CDevice {
11
+ public:
12
+ void set_temperature_sensor(sensor::Sensor *temperature_sensor) { this->temperature_sensor_ = temperature_sensor; }
13
+ void set_pressure_sensor(sensor::Sensor *pressure_sensor) { this->pressure_sensor_ = pressure_sensor; }
14
+
15
+ void setup() override;
16
+ void update() override;
17
+ void dump_config() override;
18
+
19
+ protected:
20
+ sensor::Sensor *temperature_sensor_{nullptr};
21
+ sensor::Sensor *pressure_sensor_{nullptr};
22
+
23
+ RetryResult try_read_();
24
+ };
25
+
26
+ } // namespace lps22
27
+ } // namespace esphome