esphome 2025.6.3__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 (646) 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 +8 -2
  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.h +1 -0
  191. esphome/components/http_request/ota/ota_http_request.cpp +1 -1
  192. esphome/components/http_request/update/http_request_update.cpp +35 -16
  193. esphome/components/hydreon_rgxx/hydreon_rgxx.cpp +3 -9
  194. esphome/components/hydreon_rgxx/sensor.py +1 -1
  195. esphome/components/i2c/__init__.py +23 -11
  196. esphome/components/i2c/i2c_bus.h +8 -1
  197. esphome/components/i2c/i2c_bus_arduino.cpp +4 -3
  198. esphome/components/i2c/i2c_bus_arduino.h +6 -3
  199. esphome/components/i2c/i2c_bus_esp_idf.h +5 -3
  200. esphome/components/i2c_device/i2c_device.h +0 -1
  201. esphome/components/i2s_audio/__init__.py +2 -10
  202. esphome/components/i2s_audio/i2s_audio.cpp +1 -5
  203. esphome/components/i2s_audio/media_player/__init__.py +2 -2
  204. esphome/components/i2s_audio/speaker/__init__.py +1 -1
  205. esphome/components/i2s_audio/speaker/i2s_audio_speaker.cpp +2 -2
  206. esphome/components/iaqcore/iaqcore.h +0 -2
  207. esphome/components/image/__init__.py +123 -24
  208. esphome/components/improv_serial/improv_serial_component.cpp +0 -4
  209. esphome/components/ina219/ina219.cpp +7 -0
  210. esphome/components/ina219/ina219.h +1 -0
  211. esphome/components/ina260/ina260.h +0 -2
  212. esphome/components/inkbird_ibsth1_mini/inkbird_ibsth1_mini.h +0 -1
  213. esphome/components/inkplate6/display.py +15 -0
  214. esphome/components/inkplate6/inkplate.cpp +2 -2
  215. esphome/components/integration/integration_sensor.h +0 -1
  216. esphome/components/internal_temperature/internal_temperature.cpp +8 -27
  217. esphome/components/internal_temperature/sensor.py +0 -26
  218. esphome/components/interval/interval.h +0 -2
  219. esphome/components/json/__init__.py +1 -1
  220. esphome/components/json/json_util.cpp +56 -63
  221. esphome/components/ld2410/button/__init__.py +3 -3
  222. esphome/components/ld2410/button/factory_reset_button.cpp +9 -0
  223. esphome/components/ld2410/button/{reset_button.h → factory_reset_button.h} +2 -2
  224. esphome/components/ld2410/ld2410.cpp +421 -268
  225. esphome/components/ld2410/ld2410.h +44 -146
  226. esphome/components/ld2410/number/__init__.py +2 -2
  227. esphome/components/ld2410/sensor.py +1 -1
  228. esphome/components/ld2410/switch/__init__.py +1 -1
  229. esphome/components/ld2420/binary_sensor/ld2420_binary_sensor.cpp +2 -2
  230. esphome/components/ld2420/button/reconfig_buttons.cpp +1 -1
  231. esphome/components/ld2420/ld2420.cpp +252 -147
  232. esphome/components/ld2420/ld2420.h +52 -126
  233. esphome/components/ld2420/number/__init__.py +2 -2
  234. esphome/components/ld2420/number/gate_config_number.cpp +1 -1
  235. esphome/components/ld2420/select/operating_mode_select.cpp +1 -1
  236. esphome/components/ld2420/sensor/__init__.py +6 -2
  237. esphome/components/ld2420/sensor/ld2420_sensor.cpp +2 -2
  238. esphome/components/ld2420/sensor/ld2420_sensor.h +1 -1
  239. esphome/components/ld2420/text_sensor/text_sensor.cpp +2 -2
  240. esphome/components/ld2450/button/__init__.py +3 -3
  241. esphome/components/ld2450/button/factory_reset_button.cpp +9 -0
  242. esphome/components/ld2450/button/{reset_button.h → factory_reset_button.h} +2 -2
  243. esphome/components/ld2450/ld2450.cpp +384 -232
  244. esphome/components/ld2450/ld2450.h +60 -69
  245. esphome/components/ld2450/switch/__init__.py +1 -1
  246. esphome/components/ledc/ledc_output.cpp +1 -63
  247. esphome/components/libretiny/__init__.py +5 -3
  248. esphome/components/libretiny/const.py +5 -0
  249. esphome/components/libretiny/generate_components.py +1 -0
  250. esphome/components/libretiny/helpers.cpp +35 -0
  251. esphome/components/libretiny/lt_component.cpp +5 -3
  252. esphome/components/light/__init__.py +4 -2
  253. esphome/components/light/addressable_light.h +3 -3
  254. esphome/components/light/light_call.cpp +180 -243
  255. esphome/components/light/light_call.h +72 -20
  256. esphome/components/light/light_color_values.h +14 -14
  257. esphome/components/light/light_json_schema.cpp +17 -16
  258. esphome/components/light/light_state.h +15 -13
  259. esphome/components/light/transformers.h +2 -2
  260. esphome/components/ln882x/__init__.py +52 -0
  261. esphome/components/ln882x/boards.py +285 -0
  262. esphome/components/lock/__init__.py +5 -2
  263. esphome/components/logger/__init__.py +40 -3
  264. esphome/components/logger/logger.cpp +47 -12
  265. esphome/components/logger/logger.h +80 -49
  266. esphome/components/logger/logger_esp32.cpp +3 -3
  267. esphome/components/lps22/__init__.py +0 -0
  268. esphome/components/lps22/lps22.cpp +75 -0
  269. esphome/components/lps22/lps22.h +27 -0
  270. esphome/components/lps22/sensor.py +58 -0
  271. esphome/components/ltr390/ltr390.h +0 -1
  272. esphome/components/ltr501/ltr501.h +0 -1
  273. esphome/components/ltr_als_ps/ltr_als_ps.h +0 -1
  274. esphome/components/lvgl/__init__.py +1 -1
  275. esphome/components/lvgl/schemas.py +66 -6
  276. esphome/components/lvgl/styles.py +24 -16
  277. esphome/components/lvgl/widgets/__init__.py +12 -2
  278. esphome/components/lvgl/widgets/lv_bar.py +40 -19
  279. esphome/components/lvgl/widgets/meter.py +20 -13
  280. esphome/components/m5stack_8angle/light/m5stack_8angle_light.cpp +1 -1
  281. esphome/components/max9611/max9611.h +0 -1
  282. esphome/components/mcp23016/__init__.py +1 -1
  283. esphome/components/mcp23xxx_base/__init__.py +1 -1
  284. esphome/components/mcp4461/__init__.py +1 -1
  285. esphome/components/mcp4461/output/__init__.py +3 -2
  286. esphome/components/mcp9600/mcp9600.h +0 -2
  287. esphome/components/md5/md5.cpp +3 -3
  288. esphome/components/md5/md5.h +1 -6
  289. esphome/components/mdns/__init__.py +22 -11
  290. esphome/components/media_player/__init__.py +4 -3
  291. esphome/components/micro_wake_word/__init__.py +1 -5
  292. esphome/components/micro_wake_word/streaming_model.cpp +2 -2
  293. esphome/components/microphone/microphone.cpp +7 -9
  294. esphome/components/microphone/microphone.h +0 -2
  295. esphome/components/mipi_spi/display.py +1 -0
  296. esphome/components/mmc5603/mmc5603.cpp +1 -1
  297. esphome/components/modbus/modbus.cpp +33 -15
  298. esphome/components/modbus/modbus.h +9 -0
  299. esphome/components/modbus_controller/__init__.py +42 -10
  300. esphome/components/modbus_controller/modbus_controller.cpp +92 -11
  301. esphome/components/modbus_controller/modbus_controller.h +61 -7
  302. esphome/components/mopeka_pro_check/mopeka_pro_check.h +0 -1
  303. esphome/components/mopeka_std_check/mopeka_std_check.h +0 -1
  304. esphome/components/mpl3115a2/mpl3115a2.h +0 -2
  305. esphome/components/mqtt/__init__.py +16 -0
  306. esphome/components/mqtt/mqtt_alarm_control_panel.cpp +2 -1
  307. esphome/components/mqtt/mqtt_backend.h +2 -1
  308. esphome/components/mqtt/mqtt_backend_esp32.cpp +132 -47
  309. esphome/components/mqtt/mqtt_backend_esp32.h +106 -4
  310. esphome/components/mqtt/mqtt_binary_sensor.cpp +1 -0
  311. esphome/components/mqtt/mqtt_button.cpp +4 -1
  312. esphome/components/mqtt/mqtt_client.cpp +17 -9
  313. esphome/components/mqtt/mqtt_client.h +8 -3
  314. esphome/components/mqtt/mqtt_climate.cpp +6 -4
  315. esphome/components/mqtt/mqtt_component.cpp +3 -1
  316. esphome/components/mqtt/mqtt_cover.cpp +1 -0
  317. esphome/components/mqtt/mqtt_date.cpp +4 -3
  318. esphome/components/mqtt/mqtt_datetime.cpp +7 -6
  319. esphome/components/mqtt/mqtt_event.cpp +6 -3
  320. esphome/components/mqtt/mqtt_fan.cpp +1 -0
  321. esphome/components/mqtt/mqtt_light.cpp +8 -4
  322. esphome/components/mqtt/mqtt_lock.cpp +3 -1
  323. esphome/components/mqtt/mqtt_number.cpp +1 -0
  324. esphome/components/mqtt/mqtt_select.cpp +2 -1
  325. esphome/components/mqtt/mqtt_sensor.cpp +3 -1
  326. esphome/components/mqtt/mqtt_switch.cpp +3 -1
  327. esphome/components/mqtt/mqtt_text.cpp +1 -0
  328. esphome/components/mqtt/mqtt_text_sensor.cpp +3 -1
  329. esphome/components/mqtt/mqtt_time.cpp +4 -3
  330. esphome/components/mqtt/mqtt_update.cpp +1 -0
  331. esphome/components/mqtt/mqtt_valve.cpp +3 -1
  332. esphome/components/ms8607/ms8607.cpp +1 -1
  333. esphome/components/ms8607/ms8607.h +0 -1
  334. esphome/components/neopixelbus/light.py +4 -1
  335. esphome/components/neopixelbus/neopixelbus_light.h +1 -1
  336. esphome/components/network/__init__.py +4 -1
  337. esphome/components/network/ip_address.h +1 -0
  338. esphome/components/nextion/__init__.py +16 -0
  339. esphome/components/nextion/base_component.py +1 -0
  340. esphome/components/nextion/binary_sensor/nextion_binarysensor.cpp +1 -1
  341. esphome/components/nextion/display.py +14 -4
  342. esphome/components/nextion/nextion.cpp +166 -101
  343. esphome/components/nextion/nextion.h +84 -53
  344. esphome/components/nextion/nextion_commands.cpp +11 -10
  345. esphome/components/nextion/nextion_component.cpp +28 -28
  346. esphome/components/nextion/nextion_component.h +53 -18
  347. esphome/components/nextion/nextion_component_base.h +3 -0
  348. esphome/components/nextion/nextion_upload.cpp +36 -0
  349. esphome/components/nextion/nextion_upload_arduino.cpp +10 -35
  350. esphome/components/nextion/nextion_upload_idf.cpp +9 -33
  351. esphome/components/nextion/sensor/nextion_sensor.cpp +1 -1
  352. esphome/components/nextion/switch/nextion_switch.cpp +1 -1
  353. esphome/components/nextion/text_sensor/nextion_textsensor.cpp +1 -1
  354. esphome/components/nfc/nfc.cpp +3 -22
  355. esphome/components/nfc/nfc.h +3 -3
  356. esphome/components/number/__init__.py +5 -2
  357. esphome/components/online_image/__init__.py +9 -1
  358. esphome/components/online_image/online_image.cpp +17 -7
  359. esphome/components/online_image/online_image.h +10 -2
  360. esphome/components/opentherm/opentherm.cpp +7 -12
  361. esphome/components/opentherm/output/output.cpp +1 -1
  362. esphome/components/openthread/__init__.py +47 -40
  363. esphome/components/openthread/const.py +1 -0
  364. esphome/components/openthread/openthread_esp.cpp +27 -5
  365. esphome/components/opt3001/__init__.py +0 -0
  366. esphome/components/opt3001/opt3001.cpp +122 -0
  367. esphome/components/opt3001/opt3001.h +27 -0
  368. esphome/components/opt3001/sensor.py +35 -0
  369. esphome/components/ota/__init__.py +17 -0
  370. esphome/components/ota/ota_backend.h +27 -1
  371. esphome/components/ota/ota_backend_arduino_esp32.cpp +12 -2
  372. esphome/components/ota/ota_backend_arduino_esp32.h +3 -0
  373. esphome/components/ota/ota_backend_arduino_esp8266.cpp +18 -4
  374. esphome/components/ota/ota_backend_arduino_esp8266.h +3 -0
  375. esphome/components/ota/ota_backend_arduino_libretiny.cpp +12 -2
  376. esphome/components/ota/ota_backend_arduino_libretiny.h +3 -0
  377. esphome/components/ota/ota_backend_arduino_rp2040.cpp +9 -2
  378. esphome/components/ota/ota_backend_arduino_rp2040.h +3 -0
  379. esphome/components/ota/ota_backend_esp_idf.cpp +10 -16
  380. esphome/components/ota/ota_backend_esp_idf.h +1 -0
  381. esphome/components/packages/__init__.py +5 -2
  382. esphome/components/packet_transport/binary_sensor.py +61 -4
  383. esphome/components/packet_transport/packet_transport.cpp +34 -1
  384. esphome/components/packet_transport/packet_transport.h +11 -5
  385. esphome/components/pcf8574/__init__.py +1 -1
  386. esphome/components/pi4ioe5v6408/__init__.py +84 -0
  387. esphome/components/pi4ioe5v6408/pi4ioe5v6408.cpp +171 -0
  388. esphome/components/pi4ioe5v6408/pi4ioe5v6408.h +70 -0
  389. esphome/components/pmsa003i/pmsa003i.h +0 -1
  390. esphome/components/pmsx003/pmsx003.h +0 -1
  391. esphome/components/pn7150/pn7150.cpp +7 -7
  392. esphome/components/pn7150/pn7150.h +0 -1
  393. esphome/components/pn7160/pn7160.cpp +7 -7
  394. esphome/components/pn7160/pn7160.h +0 -1
  395. esphome/components/preferences/syncer.h +2 -0
  396. esphome/components/prometheus/prometheus_handler.h +1 -1
  397. esphome/components/psram/psram.cpp +0 -20
  398. esphome/components/pulse_counter/pulse_counter_sensor.h +0 -1
  399. esphome/components/pulse_meter/pulse_meter_sensor.cpp +8 -4
  400. esphome/components/pulse_width/pulse_width.h +0 -1
  401. esphome/components/pvvx_mithermometer/display/pvvx_display.cpp +0 -4
  402. esphome/components/pvvx_mithermometer/display/pvvx_display.h +0 -2
  403. esphome/components/pvvx_mithermometer/pvvx_mithermometer.h +0 -1
  404. esphome/components/qr_code/__init__.py +13 -10
  405. esphome/components/qwiic_pir/qwiic_pir.h +0 -1
  406. esphome/components/radon_eye_ble/radon_eye_listener.cpp +1 -1
  407. esphome/components/rc522/rc522.h +0 -1
  408. esphome/components/rdm6300/rdm6300.h +0 -2
  409. esphome/components/remote_base/__init__.py +7 -5
  410. esphome/components/remote_base/remote_base.cpp +24 -21
  411. esphome/components/remote_base/remote_base.h +3 -26
  412. esphome/components/remote_receiver/__init__.py +40 -46
  413. esphome/components/remote_receiver/remote_receiver.h +4 -18
  414. esphome/components/remote_receiver/remote_receiver_esp32.cpp +0 -87
  415. esphome/components/remote_receiver/remote_receiver_esp8266.cpp +1 -1
  416. esphome/components/remote_transmitter/__init__.py +42 -43
  417. esphome/components/remote_transmitter/remote_transmitter.h +2 -14
  418. esphome/components/remote_transmitter/remote_transmitter_esp32.cpp +0 -77
  419. esphome/components/resistance/resistance_sensor.h +0 -1
  420. esphome/components/rp2040/__init__.py +2 -0
  421. esphome/components/rp2040/helpers.cpp +55 -0
  422. esphome/components/rp2040_pio_led_strip/led_strip.cpp +2 -2
  423. esphome/components/rpi_dpi_rgb/rpi_dpi_rgb.cpp +0 -4
  424. esphome/components/rtttl/__init__.py +4 -4
  425. esphome/components/rtttl/rtttl.cpp +10 -1
  426. esphome/components/ruuvitag/ruuvitag.h +0 -1
  427. esphome/components/safe_mode/safe_mode.cpp +2 -0
  428. esphome/components/safe_mode/safe_mode.h +4 -1
  429. esphome/components/scd30/scd30.h +0 -1
  430. esphome/components/scd30/sensor.py +2 -2
  431. esphome/components/scd4x/scd4x.cpp +61 -54
  432. esphome/components/scd4x/scd4x.h +17 -15
  433. esphome/components/scd4x/sensor.py +4 -4
  434. esphome/components/script/script.h +0 -2
  435. esphome/components/sdp3x/sensor.py +1 -1
  436. esphome/components/select/__init__.py +5 -2
  437. esphome/components/sen5x/sen5x.h +0 -1
  438. esphome/components/senseair/senseair.h +0 -1
  439. esphome/components/sensor/__init__.py +4 -2
  440. esphome/components/sensor/filter.cpp +1 -1
  441. esphome/components/sensor/sensor.cpp +12 -6
  442. esphome/components/sensor/sensor.h +13 -5
  443. esphome/components/servo/servo.cpp +2 -2
  444. esphome/components/servo/servo.h +0 -1
  445. esphome/components/sfa30/sfa30.h +0 -1
  446. esphome/components/sgp30/sgp30.h +0 -1
  447. esphome/components/sgp4x/sgp4x.h +0 -1
  448. esphome/components/shelly_dimmer/stm32flash.cpp +1 -2
  449. esphome/components/sht4x/sht4x.h +0 -1
  450. esphome/components/sm300d2/sm300d2.h +0 -2
  451. esphome/components/smt100/sensor.py +8 -4
  452. esphome/components/smt100/smt100.cpp +5 -5
  453. esphome/components/smt100/smt100.h +3 -3
  454. esphome/components/sn74hc595/__init__.py +1 -1
  455. esphome/components/sn74hc595/sn74hc595.cpp +5 -4
  456. esphome/components/sntp/sntp_component.cpp +9 -3
  457. esphome/components/sntp/time.py +2 -0
  458. esphome/components/socket/__init__.py +17 -0
  459. esphome/components/spi/__init__.py +27 -6
  460. esphome/components/spi/spi.cpp +3 -2
  461. esphome/components/spi/spi.h +9 -3
  462. esphome/components/spi/spi_arduino.cpp +3 -5
  463. esphome/components/spi/spi_esp_idf.cpp +40 -21
  464. esphome/components/spi_led_strip/spi_led_strip.cpp +1 -1
  465. esphome/components/sps30/sps30.h +0 -1
  466. esphome/components/ssd1306_base/ssd1306_base.cpp +1 -1
  467. esphome/components/st7701s/st7701s.cpp +0 -4
  468. esphome/components/status/status_binary_sensor.h +0 -2
  469. esphome/components/substitutions/__init__.py +81 -21
  470. esphome/components/substitutions/jinja.py +99 -0
  471. esphome/components/sun/sun.cpp +3 -4
  472. esphome/components/switch/__init__.py +5 -2
  473. esphome/components/switch/binary_sensor/switch_binary_sensor.h +0 -1
  474. esphome/components/sx126x/__init__.py +317 -0
  475. esphome/components/sx126x/automation.h +62 -0
  476. esphome/components/sx126x/packet_transport/__init__.py +26 -0
  477. esphome/components/sx126x/packet_transport/sx126x_transport.cpp +26 -0
  478. esphome/components/sx126x/packet_transport/sx126x_transport.h +25 -0
  479. esphome/components/sx126x/sx126x.cpp +523 -0
  480. esphome/components/sx126x/sx126x.h +140 -0
  481. esphome/components/sx126x/sx126x_reg.h +163 -0
  482. esphome/components/sx127x/__init__.py +325 -0
  483. esphome/components/sx127x/automation.h +62 -0
  484. esphome/components/sx127x/packet_transport/__init__.py +26 -0
  485. esphome/components/sx127x/packet_transport/sx127x_transport.cpp +26 -0
  486. esphome/components/sx127x/packet_transport/sx127x_transport.h +25 -0
  487. esphome/components/sx127x/sx127x.cpp +498 -0
  488. esphome/components/sx127x/sx127x.h +128 -0
  489. esphome/components/sx127x/sx127x_reg.h +295 -0
  490. esphome/components/syslog/esphome_syslog.cpp +5 -3
  491. esphome/components/syslog/esphome_syslog.h +1 -1
  492. esphome/components/tca9555/__init__.py +1 -1
  493. esphome/components/template/binary_sensor/template_binary_sensor.cpp +1 -9
  494. esphome/components/text/__init__.py +5 -2
  495. esphome/components/text_sensor/__init__.py +5 -2
  496. esphome/components/thermostat/thermostat_climate.cpp +34 -31
  497. esphome/components/thermostat/thermostat_climate.h +43 -39
  498. esphome/components/time/__init__.py +16 -2
  499. esphome/components/time/real_time_clock.cpp +4 -0
  500. esphome/components/time/real_time_clock.h +5 -1
  501. esphome/components/tlc5971/tlc5971.cpp +4 -1
  502. esphome/components/tmp1075/tmp1075.h +0 -2
  503. esphome/components/tof10120/tof10120_sensor.h +0 -1
  504. esphome/components/tormatic/tormatic_cover.h +0 -1
  505. esphome/components/total_daily_energy/total_daily_energy.h +0 -1
  506. esphome/components/tsl2591/tsl2591.cpp +1 -1
  507. esphome/components/ttp229_bsf/ttp229_bsf.h +0 -1
  508. esphome/components/ttp229_lsf/ttp229_lsf.h +0 -1
  509. esphome/components/tx20/tx20.cpp +2 -2
  510. esphome/components/uart/__init__.py +18 -0
  511. esphome/components/uart/uart_component_esp_idf.cpp +0 -4
  512. esphome/components/update/__init__.py +5 -2
  513. esphome/components/update/update_entity.h +8 -0
  514. esphome/components/usb_host/__init__.py +5 -2
  515. esphome/components/usb_host/usb_host_client.cpp +10 -10
  516. esphome/components/usb_uart/cp210x.cpp +1 -1
  517. esphome/components/usb_uart/usb_uart.cpp +41 -44
  518. esphome/components/usb_uart/usb_uart.h +4 -3
  519. esphome/components/valve/__init__.py +5 -2
  520. esphome/components/vbus/vbus.h +0 -1
  521. esphome/components/veml3235/veml3235.h +0 -1
  522. esphome/components/veml7700/veml7700.h +0 -1
  523. esphome/components/vl53l0x/vl53l0x_sensor.h +0 -1
  524. esphome/components/voice_assistant/voice_assistant.cpp +4 -4
  525. esphome/components/watchdog/watchdog.cpp +0 -4
  526. esphome/components/waveshare_epaper/waveshare_epaper.cpp +6 -6
  527. esphome/components/web_server/__init__.py +34 -19
  528. esphome/components/web_server/ota/__init__.py +32 -0
  529. esphome/components/web_server/ota/ota_web_server.cpp +210 -0
  530. esphome/components/web_server/ota/ota_web_server.h +26 -0
  531. esphome/components/web_server/web_server.cpp +318 -436
  532. esphome/components/web_server/web_server.h +33 -23
  533. esphome/components/web_server/web_server_v1.cpp +4 -5
  534. esphome/components/web_server_base/__init__.py +5 -2
  535. esphome/components/web_server_base/web_server_base.cpp +2 -94
  536. esphome/components/web_server_base/web_server_base.h +5 -25
  537. esphome/components/web_server_idf/multipart.cpp +254 -0
  538. esphome/components/web_server_idf/multipart.h +86 -0
  539. esphome/components/web_server_idf/utils.cpp +32 -0
  540. esphome/components/web_server_idf/utils.h +10 -0
  541. esphome/components/web_server_idf/web_server_idf.cpp +164 -16
  542. esphome/components/web_server_idf/web_server_idf.h +11 -10
  543. esphome/components/wiegand/wiegand.cpp +2 -2
  544. esphome/components/wifi/__init__.py +18 -0
  545. esphome/components/wifi/wifi_component.cpp +17 -22
  546. esphome/components/wifi/wifi_component.h +27 -23
  547. esphome/components/wifi/wifi_component_esp32_arduino.cpp +52 -59
  548. esphome/components/wifi/wifi_component_esp8266.cpp +46 -46
  549. esphome/components/wifi/wifi_component_esp_idf.cpp +35 -36
  550. esphome/components/wifi/wifi_component_libretiny.cpp +26 -27
  551. esphome/components/wifi/wifi_component_pico_w.cpp +3 -3
  552. esphome/components/wifi_info/wifi_info_text_sensor.cpp +6 -6
  553. esphome/components/wireguard/__init__.py +2 -11
  554. esphome/components/xiaomi_ble/xiaomi_ble.cpp +13 -1
  555. esphome/components/xiaomi_ble/xiaomi_ble.h +1 -0
  556. esphome/components/xiaomi_cgd1/xiaomi_cgd1.h +0 -1
  557. esphome/components/xiaomi_cgdk2/xiaomi_cgdk2.h +0 -1
  558. esphome/components/xiaomi_cgg1/xiaomi_cgg1.h +0 -1
  559. esphome/components/xiaomi_cgpr1/xiaomi_cgpr1.h +0 -1
  560. esphome/components/xiaomi_gcls002/xiaomi_gcls002.h +0 -1
  561. esphome/components/xiaomi_hhccjcy01/xiaomi_hhccjcy01.h +0 -1
  562. esphome/components/xiaomi_hhccjcy10/xiaomi_hhccjcy10.h +0 -1
  563. esphome/components/xiaomi_hhccpot002/xiaomi_hhccpot002.h +0 -1
  564. esphome/components/xiaomi_jqjcy01ym/xiaomi_jqjcy01ym.h +0 -1
  565. esphome/components/xiaomi_lywsd02/xiaomi_lywsd02.h +0 -1
  566. esphome/components/xiaomi_lywsd02mmc/xiaomi_lywsd02mmc.h +0 -1
  567. esphome/components/xiaomi_lywsd03mmc/xiaomi_lywsd03mmc.h +0 -1
  568. esphome/components/xiaomi_lywsdcgq/xiaomi_lywsdcgq.h +0 -1
  569. esphome/components/xiaomi_mhoc303/xiaomi_mhoc303.h +0 -1
  570. esphome/components/xiaomi_mhoc401/xiaomi_mhoc401.h +0 -1
  571. esphome/components/xiaomi_miscale/xiaomi_miscale.h +0 -1
  572. esphome/components/xiaomi_mjyd02yla/xiaomi_mjyd02yla.h +0 -1
  573. esphome/components/xiaomi_mue4094rt/xiaomi_mue4094rt.h +0 -1
  574. esphome/components/xiaomi_rtcgq02lm/xiaomi_rtcgq02lm.h +0 -1
  575. esphome/components/xiaomi_wx08zm/xiaomi_wx08zm.h +0 -1
  576. esphome/components/xiaomi_xmwsdj04mmc/__init__.py +0 -0
  577. esphome/components/xiaomi_xmwsdj04mmc/sensor.py +77 -0
  578. esphome/components/xiaomi_xmwsdj04mmc/xiaomi_xmwsdj04mmc.cpp +77 -0
  579. esphome/components/xiaomi_xmwsdj04mmc/xiaomi_xmwsdj04mmc.h +36 -0
  580. esphome/components/zio_ultrasonic/zio_ultrasonic.h +0 -2
  581. esphome/components/zyaura/zyaura.h +0 -1
  582. esphome/config.py +88 -22
  583. esphome/config_helpers.py +74 -1
  584. esphome/config_validation.py +12 -1
  585. esphome/const.py +65 -10
  586. esphome/core/__init__.py +18 -2
  587. esphome/core/application.cpp +169 -10
  588. esphome/core/application.h +145 -165
  589. esphome/core/area.h +19 -0
  590. esphome/core/automation.h +58 -9
  591. esphome/core/color.cpp +3 -5
  592. esphome/core/color.h +16 -16
  593. esphome/core/component.cpp +156 -22
  594. esphome/core/component.h +98 -4
  595. esphome/core/component_iterator.cpp +11 -9
  596. esphome/core/component_iterator.h +12 -10
  597. esphome/core/config.py +155 -6
  598. esphome/core/controller.cpp +4 -2
  599. esphome/core/controller.h +1 -1
  600. esphome/core/datatypes.h +2 -2
  601. esphome/core/defines.h +17 -2
  602. esphome/core/device.h +20 -0
  603. esphome/core/entity_base.cpp +20 -15
  604. esphome/core/entity_base.h +76 -0
  605. esphome/core/entity_helpers.py +168 -1
  606. esphome/core/event_pool.h +81 -0
  607. esphome/core/helpers.cpp +75 -230
  608. esphome/core/helpers.h +165 -105
  609. esphome/core/lock_free_queue.h +151 -0
  610. esphome/core/log.cpp +2 -2
  611. esphome/core/log.h +2 -0
  612. esphome/core/optional.h +5 -0
  613. esphome/core/ring_buffer.cpp +2 -2
  614. esphome/core/scheduler.cpp +275 -103
  615. esphome/core/scheduler.h +154 -17
  616. esphome/core/time.cpp +5 -5
  617. esphome/core/time.h +5 -5
  618. esphome/cpp_generator.py +17 -0
  619. esphome/cpp_helpers.py +0 -22
  620. esphome/cpp_types.py +3 -1
  621. esphome/dashboard/entries.py +1 -1
  622. esphome/dashboard/util/text.py +5 -21
  623. esphome/dashboard/web_server.py +9 -1
  624. esphome/helpers.py +47 -0
  625. esphome/loader.py +15 -1
  626. esphome/pins.py +14 -8
  627. esphome/platformio_api.py +2 -0
  628. esphome/wizard.py +17 -4
  629. esphome/writer.py +44 -3
  630. esphome/yaml_util.py +0 -2
  631. {esphome-2025.6.3.dist-info → esphome-2025.7.0.dist-info}/METADATA +10 -9
  632. {esphome-2025.6.3.dist-info → esphome-2025.7.0.dist-info}/RECORD +637 -578
  633. esphome/components/api/api_pb2_size.h +0 -361
  634. esphome/components/esp32_ble/ble_event_pool.h +0 -72
  635. esphome/components/esp32_ble/queue.h +0 -85
  636. esphome/components/esp32_hall/esp32_hall.cpp +0 -25
  637. esphome/components/esp32_hall/esp32_hall.h +0 -23
  638. esphome/components/esp32_touch/esp32_touch.cpp +0 -355
  639. esphome/components/ld2410/button/reset_button.cpp +0 -9
  640. esphome/components/ld2450/button/reset_button.cpp +0 -9
  641. esphome/components/openthread/tlv.py +0 -65
  642. /esphome/{dashboard/enum.py → enum.py} +0 -0
  643. {esphome-2025.6.3.dist-info → esphome-2025.7.0.dist-info}/WHEEL +0 -0
  644. {esphome-2025.6.3.dist-info → esphome-2025.7.0.dist-info}/entry_points.txt +0 -0
  645. {esphome-2025.6.3.dist-info → esphome-2025.7.0.dist-info}/licenses/LICENSE +0 -0
  646. {esphome-2025.6.3.dist-info → esphome-2025.7.0.dist-info}/top_level.txt +0 -0
@@ -3,6 +3,8 @@ import esphome.codegen as cg
3
3
  from esphome.components import i2c, sensirion_common, sensor
4
4
  import esphome.config_validation as cv
5
5
  from esphome.const import (
6
+ CONF_AMBIENT_PRESSURE_COMPENSATION,
7
+ CONF_AUTOMATIC_SELF_CALIBRATION,
6
8
  CONF_CO2,
7
9
  CONF_HUMIDITY,
8
10
  CONF_ID,
@@ -18,8 +20,6 @@ from esphome.const import (
18
20
  UNIT_CELSIUS,
19
21
  UNIT_PARTS_PER_MILLION,
20
22
  UNIT_PERCENT,
21
- CONF_AUTOMATIC_SELF_CALIBRATION,
22
- CONF_AMBIENT_PRESSURE_COMPENSATION,
23
23
  )
24
24
 
25
25
  DEPENDENCIES = ["i2c"]
@@ -7,6 +7,8 @@ namespace scd4x {
7
7
 
8
8
  static const char *const TAG = "scd4x";
9
9
 
10
+ static const uint16_t SCD41_ID = 0x1408;
11
+ static const uint16_t SCD40_ID = 0x440;
10
12
  static const uint16_t SCD4X_CMD_GET_SERIAL_NUMBER = 0x3682;
11
13
  static const uint16_t SCD4X_CMD_TEMPERATURE_OFFSET = 0x241d;
12
14
  static const uint16_t SCD4X_CMD_ALTITUDE_COMPENSATION = 0x2427;
@@ -23,8 +25,6 @@ static const uint16_t SCD4X_CMD_STOP_MEASUREMENTS = 0x3f86;
23
25
  static const uint16_t SCD4X_CMD_FACTORY_RESET = 0x3632;
24
26
  static const uint16_t SCD4X_CMD_GET_FEATURESET = 0x202f;
25
27
  static const float SCD4X_TEMPERATURE_OFFSET_MULTIPLIER = (1 << 16) / 175.0f;
26
- static const uint16_t SCD41_ID = 0x1408;
27
- static const uint16_t SCD40_ID = 0x440;
28
28
 
29
29
  void SCD4XComponent::setup() {
30
30
  ESP_LOGCONFIG(TAG, "Running setup");
@@ -51,47 +51,66 @@ void SCD4XComponent::setup() {
51
51
 
52
52
  if (!this->write_command(SCD4X_CMD_TEMPERATURE_OFFSET,
53
53
  (uint16_t) (temperature_offset_ * SCD4X_TEMPERATURE_OFFSET_MULTIPLIER))) {
54
- ESP_LOGE(TAG, "Error setting temperature offset.");
54
+ ESP_LOGE(TAG, "Error setting temperature offset");
55
55
  this->error_code_ = MEASUREMENT_INIT_FAILED;
56
56
  this->mark_failed();
57
57
  return;
58
58
  }
59
59
 
60
- // If pressure compensation available use it
61
- // else use altitude
62
- if (ambient_pressure_compensation_) {
63
- if (!this->update_ambient_pressure_compensation_(ambient_pressure_)) {
64
- ESP_LOGE(TAG, "Error setting ambient pressure compensation.");
60
+ // If pressure compensation available use it, else use altitude
61
+ if (this->ambient_pressure_) {
62
+ if (!this->update_ambient_pressure_compensation_(this->ambient_pressure_)) {
63
+ ESP_LOGE(TAG, "Error setting ambient pressure compensation");
65
64
  this->error_code_ = MEASUREMENT_INIT_FAILED;
66
65
  this->mark_failed();
67
66
  return;
68
67
  }
69
68
  } else {
70
- if (!this->write_command(SCD4X_CMD_ALTITUDE_COMPENSATION, altitude_compensation_)) {
71
- ESP_LOGE(TAG, "Error setting altitude compensation.");
69
+ if (!this->write_command(SCD4X_CMD_ALTITUDE_COMPENSATION, this->altitude_compensation_)) {
70
+ ESP_LOGE(TAG, "Error setting altitude compensation");
72
71
  this->error_code_ = MEASUREMENT_INIT_FAILED;
73
72
  this->mark_failed();
74
73
  return;
75
74
  }
76
75
  }
77
76
 
78
- if (!this->write_command(SCD4X_CMD_AUTOMATIC_SELF_CALIBRATION, enable_asc_ ? 1 : 0)) {
79
- ESP_LOGE(TAG, "Error setting automatic self calibration.");
77
+ if (!this->write_command(SCD4X_CMD_AUTOMATIC_SELF_CALIBRATION, this->enable_asc_ ? 1 : 0)) {
78
+ ESP_LOGE(TAG, "Error setting automatic self calibration");
80
79
  this->error_code_ = MEASUREMENT_INIT_FAILED;
81
80
  this->mark_failed();
82
81
  return;
83
82
  }
84
83
 
85
- initialized_ = true;
84
+ this->initialized_ = true;
86
85
  // Finally start sensor measurements
87
86
  this->start_measurement_();
88
- ESP_LOGD(TAG, "Sensor initialized");
89
87
  });
90
88
  });
91
89
  }
92
90
 
93
91
  void SCD4XComponent::dump_config() {
94
- ESP_LOGCONFIG(TAG, "scd4x:");
92
+ static const char *const MM_PERIODIC_STR = "Periodic (5s)";
93
+ static const char *const MM_LOW_POWER_PERIODIC_STR = "Low power periodic (30s)";
94
+ static const char *const MM_SINGLE_SHOT_STR = "Single shot";
95
+ static const char *const MM_SINGLE_SHOT_RHT_ONLY_STR = "Single shot rht only";
96
+ const char *measurement_mode_str = MM_PERIODIC_STR;
97
+
98
+ switch (this->measurement_mode_) {
99
+ case PERIODIC:
100
+ // measurement_mode_str = MM_PERIODIC_STR;
101
+ break;
102
+ case LOW_POWER_PERIODIC:
103
+ measurement_mode_str = MM_LOW_POWER_PERIODIC_STR;
104
+ break;
105
+ case SINGLE_SHOT:
106
+ measurement_mode_str = MM_SINGLE_SHOT_STR;
107
+ break;
108
+ case SINGLE_SHOT_RHT_ONLY:
109
+ measurement_mode_str = MM_SINGLE_SHOT_RHT_ONLY_STR;
110
+ break;
111
+ }
112
+
113
+ ESP_LOGCONFIG(TAG, "SCD4X:");
95
114
  LOG_I2C_DEVICE(this);
96
115
  if (this->is_failed()) {
97
116
  switch (this->error_code_) {
@@ -102,19 +121,23 @@ void SCD4XComponent::dump_config() {
102
121
  ESP_LOGW(TAG, "Measurement Initialization failed");
103
122
  break;
104
123
  case SERIAL_NUMBER_IDENTIFICATION_FAILED:
105
- ESP_LOGW(TAG, "Unable to read sensor firmware version");
124
+ ESP_LOGW(TAG, "Unable to read firmware version");
106
125
  break;
107
126
  default:
108
127
  ESP_LOGW(TAG, "Unknown setup error");
109
128
  break;
110
129
  }
111
130
  }
112
- ESP_LOGCONFIG(TAG, " Automatic self calibration: %s", ONOFF(this->enable_asc_));
131
+ ESP_LOGCONFIG(TAG,
132
+ " Automatic self calibration: %s\n"
133
+ " Measurement mode: %s\n"
134
+ " Temperature offset: %.2f °C",
135
+ ONOFF(this->enable_asc_), measurement_mode_str, this->temperature_offset_);
113
136
  if (this->ambient_pressure_source_ != nullptr) {
114
- ESP_LOGCONFIG(TAG, " Dynamic ambient pressure compensation using sensor '%s'",
137
+ ESP_LOGCONFIG(TAG, " Dynamic ambient pressure compensation using '%s'",
115
138
  this->ambient_pressure_source_->get_name().c_str());
116
139
  } else {
117
- if (this->ambient_pressure_compensation_) {
140
+ if (this->ambient_pressure_) {
118
141
  ESP_LOGCONFIG(TAG,
119
142
  " Altitude compensation disabled\n"
120
143
  " Ambient pressure compensation: %dmBar",
@@ -126,21 +149,6 @@ void SCD4XComponent::dump_config() {
126
149
  this->altitude_compensation_);
127
150
  }
128
151
  }
129
- switch (this->measurement_mode_) {
130
- case PERIODIC:
131
- ESP_LOGCONFIG(TAG, " Measurement mode: periodic (5s)");
132
- break;
133
- case LOW_POWER_PERIODIC:
134
- ESP_LOGCONFIG(TAG, " Measurement mode: low power periodic (30s)");
135
- break;
136
- case SINGLE_SHOT:
137
- ESP_LOGCONFIG(TAG, " Measurement mode: single shot");
138
- break;
139
- case SINGLE_SHOT_RHT_ONLY:
140
- ESP_LOGCONFIG(TAG, " Measurement mode: single shot rht only");
141
- break;
142
- }
143
- ESP_LOGCONFIG(TAG, " Temperature offset: %.2f °C", this->temperature_offset_);
144
152
  LOG_UPDATE_INTERVAL(this);
145
153
  LOG_SENSOR(" ", "CO2", this->co2_sensor_);
146
154
  LOG_SENSOR(" ", "Temperature", this->temperature_sensor_);
@@ -148,20 +156,20 @@ void SCD4XComponent::dump_config() {
148
156
  }
149
157
 
150
158
  void SCD4XComponent::update() {
151
- if (!initialized_) {
159
+ if (!this->initialized_) {
152
160
  return;
153
161
  }
154
162
 
155
163
  if (this->ambient_pressure_source_ != nullptr) {
156
164
  float pressure = this->ambient_pressure_source_->state;
157
165
  if (!std::isnan(pressure)) {
158
- set_ambient_pressure_compensation(pressure);
166
+ this->set_ambient_pressure_compensation(pressure);
159
167
  }
160
168
  }
161
169
 
162
170
  uint32_t wait_time = 0;
163
171
  if (this->measurement_mode_ == SINGLE_SHOT || this->measurement_mode_ == SINGLE_SHOT_RHT_ONLY) {
164
- start_measurement_();
172
+ this->start_measurement_();
165
173
  wait_time =
166
174
  this->measurement_mode_ == SINGLE_SHOT ? 5000 : 50; // Single shot measurement takes 5 secs rht mode 50 ms
167
175
  }
@@ -176,12 +184,12 @@ void SCD4XComponent::update() {
176
184
 
177
185
  if (!this->read_data(raw_read_status) || raw_read_status == 0x00) {
178
186
  this->status_set_warning();
179
- ESP_LOGW(TAG, "Data not ready yet!");
187
+ ESP_LOGW(TAG, "Data not ready");
180
188
  return;
181
189
  }
182
190
 
183
191
  if (!this->write_command(SCD4X_CMD_READ_MEASUREMENT)) {
184
- ESP_LOGW(TAG, "Error reading measurement!");
192
+ ESP_LOGW(TAG, "Error reading measurement");
185
193
  this->status_set_warning();
186
194
  return; // NO RETRY
187
195
  }
@@ -218,19 +226,19 @@ bool SCD4XComponent::perform_forced_calibration(uint16_t current_co2_concentrati
218
226
  }
219
227
  this->set_timeout(500, [this, current_co2_concentration]() {
220
228
  if (this->write_command(SCD4X_CMD_PERFORM_FORCED_CALIBRATION, current_co2_concentration)) {
221
- ESP_LOGD(TAG, "setting forced calibration Co2 level %d ppm", current_co2_concentration);
229
+ ESP_LOGD(TAG, "Setting forced calibration Co2 level %d ppm", current_co2_concentration);
222
230
  // frc takes 400 ms
223
231
  // because this method will be used very rarly
224
232
  // the simple approach with delay is ok
225
- delay(400); // NOLINT'
233
+ delay(400); // NOLINT
226
234
  if (!this->start_measurement_()) {
227
235
  return false;
228
236
  } else {
229
- ESP_LOGD(TAG, "forced calibration complete");
237
+ ESP_LOGD(TAG, "Forced calibration complete");
230
238
  }
231
239
  return true;
232
240
  } else {
233
- ESP_LOGE(TAG, "force calibration failed");
241
+ ESP_LOGE(TAG, "Force calibration failed");
234
242
  this->error_code_ = FRC_FAILED;
235
243
  this->status_set_warning();
236
244
  return false;
@@ -259,27 +267,26 @@ bool SCD4XComponent::factory_reset() {
259
267
  }
260
268
 
261
269
  void SCD4XComponent::set_ambient_pressure_compensation(float pressure_in_hpa) {
262
- ambient_pressure_compensation_ = true;
263
- uint16_t new_ambient_pressure = (uint16_t) pressure_in_hpa;
264
- if (!initialized_) {
265
- ambient_pressure_ = new_ambient_pressure;
270
+ uint16_t new_ambient_pressure = static_cast<uint16_t>(pressure_in_hpa);
271
+ if (!this->initialized_) {
272
+ this->ambient_pressure_ = new_ambient_pressure;
266
273
  return;
267
274
  }
268
275
  // Only send pressure value if it has changed since last update
269
- if (new_ambient_pressure != ambient_pressure_) {
270
- update_ambient_pressure_compensation_(new_ambient_pressure);
271
- ambient_pressure_ = new_ambient_pressure;
276
+ if (new_ambient_pressure != this->ambient_pressure_) {
277
+ this->update_ambient_pressure_compensation_(new_ambient_pressure);
278
+ this->ambient_pressure_ = new_ambient_pressure;
272
279
  } else {
273
- ESP_LOGD(TAG, "ambient pressure compensation skipped - no change required");
280
+ ESP_LOGD(TAG, "Ambient pressure compensation skipped; no change required");
274
281
  }
275
282
  }
276
283
 
277
284
  bool SCD4XComponent::update_ambient_pressure_compensation_(uint16_t pressure_in_hpa) {
278
285
  if (this->write_command(SCD4X_CMD_AMBIENT_PRESSURE_COMPENSATION, pressure_in_hpa)) {
279
- ESP_LOGD(TAG, "setting ambient pressure compensation to %d hPa", pressure_in_hpa);
286
+ ESP_LOGD(TAG, "Setting ambient pressure compensation to %d hPa", pressure_in_hpa);
280
287
  return true;
281
288
  } else {
282
- ESP_LOGE(TAG, "Error setting ambient pressure compensation.");
289
+ ESP_LOGE(TAG, "Error setting ambient pressure compensation");
283
290
  return false;
284
291
  }
285
292
  }
@@ -304,7 +311,7 @@ bool SCD4XComponent::start_measurement_() {
304
311
  static uint8_t remaining_retries = 3;
305
312
  while (remaining_retries) {
306
313
  if (!this->write_command(measurement_command)) {
307
- ESP_LOGE(TAG, "Error starting measurements.");
314
+ ESP_LOGE(TAG, "Error starting measurements");
308
315
  this->error_code_ = MEASUREMENT_INIT_FAILED;
309
316
  this->status_set_warning();
310
317
  if (--remaining_retries == 0)
@@ -8,18 +8,23 @@
8
8
  namespace esphome {
9
9
  namespace scd4x {
10
10
 
11
- enum ERRORCODE {
11
+ enum ErrorCode : uint8_t {
12
12
  COMMUNICATION_FAILED,
13
13
  SERIAL_NUMBER_IDENTIFICATION_FAILED,
14
14
  MEASUREMENT_INIT_FAILED,
15
15
  FRC_FAILED,
16
- UNKNOWN
16
+ UNKNOWN,
17
+ };
18
+
19
+ enum MeasurementMode : uint8_t {
20
+ PERIODIC,
21
+ LOW_POWER_PERIODIC,
22
+ SINGLE_SHOT,
23
+ SINGLE_SHOT_RHT_ONLY,
17
24
  };
18
- enum MeasurementMode { PERIODIC, LOW_POWER_PERIODIC, SINGLE_SHOT, SINGLE_SHOT_RHT_ONLY };
19
25
 
20
26
  class SCD4XComponent : public PollingComponent, public sensirion_common::SensirionI2CDevice {
21
27
  public:
22
- float get_setup_priority() const override { return setup_priority::DATA; }
23
28
  void setup() override;
24
29
  void dump_config() override;
25
30
  void update() override;
@@ -40,21 +45,18 @@ class SCD4XComponent : public PollingComponent, public sensirion_common::Sensiri
40
45
  protected:
41
46
  bool update_ambient_pressure_compensation_(uint16_t pressure_in_hpa);
42
47
  bool start_measurement_();
43
- ERRORCODE error_code_;
44
48
 
45
- bool initialized_{false};
46
-
47
- float temperature_offset_;
48
- uint16_t altitude_compensation_;
49
- bool ambient_pressure_compensation_;
50
- uint16_t ambient_pressure_;
51
- bool enable_asc_;
52
- MeasurementMode measurement_mode_{PERIODIC};
53
49
  sensor::Sensor *co2_sensor_{nullptr};
54
50
  sensor::Sensor *temperature_sensor_{nullptr};
55
51
  sensor::Sensor *humidity_sensor_{nullptr};
56
- // used for compensation
57
- sensor::Sensor *ambient_pressure_source_{nullptr};
52
+ sensor::Sensor *ambient_pressure_source_{nullptr}; // used for compensation
53
+ float temperature_offset_;
54
+ uint16_t altitude_compensation_{0};
55
+ uint16_t ambient_pressure_{0}; // Per datasheet, valid values are 700 to 1200 hPa; 0 is a valid sentinel value
56
+ bool initialized_{false};
57
+ bool enable_asc_{false};
58
+ ErrorCode error_code_;
59
+ MeasurementMode measurement_mode_{PERIODIC};
58
60
  };
59
61
 
60
62
  } // namespace scd4x
@@ -4,9 +4,13 @@ import esphome.codegen as cg
4
4
  from esphome.components import i2c, sensirion_common, sensor
5
5
  import esphome.config_validation as cv
6
6
  from esphome.const import (
7
+ CONF_AMBIENT_PRESSURE_COMPENSATION,
8
+ CONF_AMBIENT_PRESSURE_COMPENSATION_SOURCE,
9
+ CONF_AUTOMATIC_SELF_CALIBRATION,
7
10
  CONF_CO2,
8
11
  CONF_HUMIDITY,
9
12
  CONF_ID,
13
+ CONF_MEASUREMENT_MODE,
10
14
  CONF_TEMPERATURE,
11
15
  CONF_TEMPERATURE_OFFSET,
12
16
  CONF_VALUE,
@@ -20,10 +24,6 @@ from esphome.const import (
20
24
  UNIT_CELSIUS,
21
25
  UNIT_PARTS_PER_MILLION,
22
26
  UNIT_PERCENT,
23
- CONF_AUTOMATIC_SELF_CALIBRATION,
24
- CONF_AMBIENT_PRESSURE_COMPENSATION,
25
- CONF_AMBIENT_PRESSURE_COMPENSATION_SOURCE,
26
- CONF_MEASUREMENT_MODE,
27
27
  )
28
28
 
29
29
  CODEOWNERS = ["@sjtrny", "@martgras"]
@@ -239,8 +239,6 @@ template<class C, typename... Ts> class ScriptWaitAction : public Action<Ts...>,
239
239
  this->play_next_tuple_(this->var_);
240
240
  }
241
241
 
242
- float get_setup_priority() const override { return setup_priority::DATA; }
243
-
244
242
  void play(Ts... x) override { /* ignore - see play_complex */
245
243
  }
246
244
 
@@ -2,10 +2,10 @@ import esphome.codegen as cg
2
2
  from esphome.components import i2c, sensirion_common, sensor
3
3
  import esphome.config_validation as cv
4
4
  from esphome.const import (
5
+ CONF_MEASUREMENT_MODE,
5
6
  DEVICE_CLASS_PRESSURE,
6
7
  STATE_CLASS_MEASUREMENT,
7
8
  UNIT_HECTOPASCAL,
8
- CONF_MEASUREMENT_MODE,
9
9
  )
10
10
 
11
11
  DEPENDENCIES = ["i2c"]
@@ -17,8 +17,8 @@ from esphome.const import (
17
17
  CONF_WEB_SERVER,
18
18
  )
19
19
  from esphome.core import CORE, coroutine_with_priority
20
+ from esphome.core.entity_helpers import entity_duplicate_validator, setup_entity
20
21
  from esphome.cpp_generator import MockObjClass
21
- from esphome.cpp_helpers import setup_entity
22
22
 
23
23
  CODEOWNERS = ["@esphome/core"]
24
24
  IS_PLATFORM_COMPONENT = True
@@ -65,6 +65,9 @@ _SELECT_SCHEMA = (
65
65
  )
66
66
 
67
67
 
68
+ _SELECT_SCHEMA.add_extra(entity_duplicate_validator("select"))
69
+
70
+
68
71
  def select_schema(
69
72
  class_: MockObjClass,
70
73
  *,
@@ -89,7 +92,7 @@ SELECT_SCHEMA.add_extra(cv.deprecated_schema_constant("select"))
89
92
 
90
93
 
91
94
  async def setup_select_core_(var, config, *, options: list[str]):
92
- await setup_entity(var, config)
95
+ await setup_entity(var, config, "select")
93
96
 
94
97
  cg.add(var.traits.set_options(options))
95
98
 
@@ -48,7 +48,6 @@ struct TemperatureCompensation {
48
48
 
49
49
  class SEN5XComponent : public PollingComponent, public sensirion_common::SensirionI2CDevice {
50
50
  public:
51
- float get_setup_priority() const override { return setup_priority::DATA; }
52
51
  void setup() override;
53
52
  void dump_config() override;
54
53
  void update() override;
@@ -10,7 +10,6 @@ namespace senseair {
10
10
 
11
11
  class SenseAirComponent : public PollingComponent, public uart::UARTDevice {
12
12
  public:
13
- float get_setup_priority() const override { return setup_priority::DATA; }
14
13
  void set_co2_sensor(sensor::Sensor *co2_sensor) { co2_sensor_ = co2_sensor; }
15
14
 
16
15
  void update() override;
@@ -101,8 +101,8 @@ from esphome.const import (
101
101
  ENTITY_CATEGORY_CONFIG,
102
102
  )
103
103
  from esphome.core import CORE, coroutine_with_priority
104
+ from esphome.core.entity_helpers import entity_duplicate_validator, setup_entity
104
105
  from esphome.cpp_generator import MockObjClass
105
- from esphome.cpp_helpers import setup_entity
106
106
  from esphome.util import Registry
107
107
 
108
108
  CODEOWNERS = ["@esphome/core"]
@@ -318,6 +318,8 @@ _SENSOR_SCHEMA = (
318
318
  )
319
319
  )
320
320
 
321
+ _SENSOR_SCHEMA.add_extra(entity_duplicate_validator("sensor"))
322
+
321
323
 
322
324
  def sensor_schema(
323
325
  class_: MockObjClass = cv.UNDEFINED,
@@ -787,7 +789,7 @@ async def build_filters(config):
787
789
 
788
790
 
789
791
  async def setup_sensor_core_(var, config):
790
- await setup_entity(var, config)
792
+ await setup_entity(var, config, "sensor")
791
793
 
792
794
  if (device_class := config.get(CONF_DEVICE_CLASS)) is not None:
793
795
  cg.add(var.set_device_class(device_class))
@@ -118,7 +118,7 @@ optional<float> QuantileFilter::new_value(float value) {
118
118
  size_t queue_size = quantile_queue.size();
119
119
  if (queue_size) {
120
120
  size_t position = ceilf(queue_size * this->quantile_) - 1;
121
- ESP_LOGVV(TAG, "QuantileFilter(%p)::position: %d/%d", this, position + 1, queue_size);
121
+ ESP_LOGVV(TAG, "QuantileFilter(%p)::position: %zu/%zu", this, position + 1, queue_size);
122
122
  result = quantile_queue[position];
123
123
  }
124
124
  }
@@ -23,16 +23,22 @@ std::string state_class_to_string(StateClass state_class) {
23
23
  Sensor::Sensor() : state(NAN), raw_state(NAN) {}
24
24
 
25
25
  int8_t Sensor::get_accuracy_decimals() {
26
- if (this->accuracy_decimals_.has_value())
27
- return *this->accuracy_decimals_;
26
+ if (this->sensor_flags_.has_accuracy_override)
27
+ return this->accuracy_decimals_;
28
28
  return 0;
29
29
  }
30
- void Sensor::set_accuracy_decimals(int8_t accuracy_decimals) { this->accuracy_decimals_ = accuracy_decimals; }
30
+ void Sensor::set_accuracy_decimals(int8_t accuracy_decimals) {
31
+ this->accuracy_decimals_ = accuracy_decimals;
32
+ this->sensor_flags_.has_accuracy_override = true;
33
+ }
31
34
 
32
- void Sensor::set_state_class(StateClass state_class) { this->state_class_ = state_class; }
35
+ void Sensor::set_state_class(StateClass state_class) {
36
+ this->state_class_ = state_class;
37
+ this->sensor_flags_.has_state_class_override = true;
38
+ }
33
39
  StateClass Sensor::get_state_class() {
34
- if (this->state_class_.has_value())
35
- return *this->state_class_;
40
+ if (this->sensor_flags_.has_state_class_override)
41
+ return this->state_class_;
36
42
  return StateClass::STATE_CLASS_NONE;
37
43
  }
38
44
 
@@ -80,9 +80,9 @@ class Sensor : public EntityBase, public EntityBase_DeviceClass, public EntityBa
80
80
  * state changes to the database when they are published, even if the state is the
81
81
  * same as before.
82
82
  */
83
- bool get_force_update() const { return force_update_; }
83
+ bool get_force_update() const { return sensor_flags_.force_update; }
84
84
  /// Set force update mode.
85
- void set_force_update(bool force_update) { force_update_ = force_update; }
85
+ void set_force_update(bool force_update) { sensor_flags_.force_update = force_update; }
86
86
 
87
87
  /// Add a filter to the filter chain. Will be appended to the back.
88
88
  void add_filter(Filter *filter);
@@ -155,9 +155,17 @@ class Sensor : public EntityBase, public EntityBase_DeviceClass, public EntityBa
155
155
 
156
156
  Filter *filter_list_{nullptr}; ///< Store all active filters.
157
157
 
158
- optional<int8_t> accuracy_decimals_; ///< Accuracy in decimals override
159
- optional<StateClass> state_class_{STATE_CLASS_NONE}; ///< State class override
160
- bool force_update_{false}; ///< Force update mode
158
+ // Group small members together to avoid padding
159
+ int8_t accuracy_decimals_{-1}; ///< Accuracy in decimals (-1 = not set)
160
+ StateClass state_class_{STATE_CLASS_NONE}; ///< State class (STATE_CLASS_NONE = not set)
161
+
162
+ // Bit-packed flags for sensor-specific settings
163
+ struct SensorFlags {
164
+ uint8_t has_accuracy_override : 1;
165
+ uint8_t has_state_class_override : 1;
166
+ uint8_t force_update : 1;
167
+ uint8_t reserved : 5; // Reserved for future use
168
+ } sensor_flags_{};
161
169
  };
162
170
 
163
171
  } // namespace sensor
@@ -88,9 +88,9 @@ void Servo::internal_write(float value) {
88
88
  value = clamp(value, -1.0f, 1.0f);
89
89
  float level;
90
90
  if (value < 0.0) {
91
- level = lerp(-value, this->idle_level_, this->min_level_);
91
+ level = std::lerp(this->idle_level_, this->min_level_, -value);
92
92
  } else {
93
- level = lerp(value, this->idle_level_, this->max_level_);
93
+ level = std::lerp(this->idle_level_, this->max_level_, value);
94
94
  }
95
95
  this->output_->set_level(level);
96
96
  this->current_value_ = value;
@@ -20,7 +20,6 @@ class Servo : public Component {
20
20
  void detach();
21
21
  void setup() override;
22
22
  void dump_config() override;
23
- float get_setup_priority() const override { return setup_priority::DATA; }
24
23
  void set_min_level(float min_level) { min_level_ = min_level; }
25
24
  void set_idle_level(float idle_level) { idle_level_ = idle_level; }
26
25
  void set_max_level(float max_level) { max_level_ = max_level; }
@@ -11,7 +11,6 @@ class SFA30Component : public PollingComponent, public sensirion_common::Sensiri
11
11
  enum ErrorCode { DEVICE_MARKING_READ_FAILED, MEASUREMENT_INIT_FAILED, UNKNOWN };
12
12
 
13
13
  public:
14
- float get_setup_priority() const override { return setup_priority::DATA; }
15
14
  void setup() override;
16
15
  void dump_config() override;
17
16
  void update() override;
@@ -32,7 +32,6 @@ class SGP30Component : public PollingComponent, public sensirion_common::Sensiri
32
32
  void setup() override;
33
33
  void update() override;
34
34
  void dump_config() override;
35
- float get_setup_priority() const override { return setup_priority::DATA; }
36
35
 
37
36
  protected:
38
37
  void send_env_data_();
@@ -75,7 +75,6 @@ class SGP4xComponent : public PollingComponent, public sensor::Sensor, public se
75
75
  void update() override;
76
76
  void take_sample();
77
77
  void dump_config() override;
78
- float get_setup_priority() const override { return setup_priority::DATA; }
79
78
  void set_store_baseline(bool store_baseline) { store_baseline_ = store_baseline; }
80
79
  void set_voc_sensor(sensor::Sensor *voc_sensor) { voc_sensor_ = voc_sensor; }
81
80
  void set_nox_sensor(sensor::Sensor *nox_sensor) { nox_sensor_ = nox_sensor; }
@@ -445,8 +445,7 @@ template<typename T> stm32_err_t stm32_check_ack_timeout(const stm32_err_t s_err
445
445
  return STM32_ERR_OK;
446
446
  case STM32_ERR_NACK:
447
447
  log();
448
- // TODO: c++17 [[fallthrough]]
449
- /* fallthrough */
448
+ [[fallthrough]];
450
449
  default:
451
450
  return STM32_ERR_UNKNOWN;
452
451
  }
@@ -17,7 +17,6 @@ enum SHT4XHEATERTIME : uint16_t { SHT4X_HEATERTIME_LONG = 1100, SHT4X_HEATERTIME
17
17
 
18
18
  class SHT4XComponent : public PollingComponent, public sensirion_common::SensirionI2CDevice {
19
19
  public:
20
- float get_setup_priority() const override { return setup_priority::DATA; }
21
20
  void setup() override;
22
21
  void dump_config() override;
23
22
  void update() override;
@@ -9,8 +9,6 @@ namespace sm300d2 {
9
9
 
10
10
  class SM300D2Sensor : public PollingComponent, public uart::UARTDevice {
11
11
  public:
12
- float get_setup_priority() const override { return setup_priority::DATA; }
13
-
14
12
  void set_co2_sensor(sensor::Sensor *co2_sensor) { co2_sensor_ = co2_sensor; }
15
13
  void set_formaldehyde_sensor(sensor::Sensor *formaldehyde_sensor) { formaldehyde_sensor_ = formaldehyde_sensor; }
16
14
  void set_tvoc_sensor(sensor::Sensor *tvoc_sensor) { tvoc_sensor_ = tvoc_sensor; }
@@ -6,6 +6,7 @@ from esphome.const import (
6
6
  CONF_DIELECTRIC_CONSTANT,
7
7
  CONF_ID,
8
8
  CONF_MOISTURE,
9
+ CONF_PERMITTIVITY,
9
10
  CONF_TEMPERATURE,
10
11
  CONF_VOLTAGE,
11
12
  DEVICE_CLASS_TEMPERATURE,
@@ -33,7 +34,10 @@ CONFIG_SCHEMA = (
33
34
  accuracy_decimals=0,
34
35
  state_class=STATE_CLASS_MEASUREMENT,
35
36
  ),
36
- cv.Optional(CONF_DIELECTRIC_CONSTANT): sensor.sensor_schema(
37
+ cv.Optional(CONF_DIELECTRIC_CONSTANT): cv.invalid(
38
+ "Use 'permittivity' instead"
39
+ ),
40
+ cv.Optional(CONF_PERMITTIVITY): sensor.sensor_schema(
37
41
  unit_of_measurement=UNIT_EMPTY,
38
42
  accuracy_decimals=2,
39
43
  state_class=STATE_CLASS_MEASUREMENT,
@@ -76,9 +80,9 @@ async def to_code(config):
76
80
  sens = await sensor.new_sensor(config[CONF_COUNTS])
77
81
  cg.add(var.set_counts_sensor(sens))
78
82
 
79
- if CONF_DIELECTRIC_CONSTANT in config:
80
- sens = await sensor.new_sensor(config[CONF_DIELECTRIC_CONSTANT])
81
- cg.add(var.set_dielectric_constant_sensor(sens))
83
+ if CONF_PERMITTIVITY in config:
84
+ sens = await sensor.new_sensor(config[CONF_PERMITTIVITY])
85
+ cg.add(var.set_permittivity_sensor(sens))
82
86
 
83
87
  if CONF_TEMPERATURE in config:
84
88
  sens = await sensor.new_sensor(config[CONF_TEMPERATURE])