esphome 2025.7.4__py3-none-any.whl → 2025.8.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 (758) hide show
  1. esphome/__main__.py +190 -83
  2. esphome/automation.py +2 -4
  3. esphome/build_gen/__init__.py +0 -0
  4. esphome/build_gen/platformio.py +102 -0
  5. esphome/components/a4988/a4988.cpp +0 -1
  6. esphome/components/absolute_humidity/absolute_humidity.cpp +0 -2
  7. esphome/components/absolute_humidity/sensor.py +2 -2
  8. esphome/components/adc/__init__.py +123 -85
  9. esphome/components/adc/adc_sensor.h +98 -35
  10. esphome/components/adc/adc_sensor_common.cpp +10 -4
  11. esphome/components/adc/adc_sensor_esp32.cpp +291 -123
  12. esphome/components/adc/adc_sensor_esp8266.cpp +1 -4
  13. esphome/components/adc/adc_sensor_libretiny.cpp +1 -2
  14. esphome/components/adc/adc_sensor_rp2040.cpp +1 -2
  15. esphome/components/adc/adc_sensor_zephyr.cpp +207 -0
  16. esphome/components/adc/sensor.py +61 -27
  17. esphome/components/adc128s102/adc128s102.cpp +1 -4
  18. esphome/components/ade7880/sensor.py +75 -49
  19. esphome/components/ads1115/ads1115.cpp +0 -1
  20. esphome/components/ads1118/ads1118.cpp +0 -1
  21. esphome/components/ags10/ags10.cpp +0 -4
  22. esphome/components/aht10/aht10.cpp +0 -4
  23. esphome/components/aic3204/aic3204.cpp +0 -2
  24. esphome/components/airthings_wave_plus/__init__.py +1 -1
  25. esphome/components/airthings_wave_plus/airthings_wave_plus.cpp +22 -4
  26. esphome/components/airthings_wave_plus/airthings_wave_plus.h +10 -1
  27. esphome/components/airthings_wave_plus/sensor.py +55 -28
  28. esphome/components/alarm_control_panel/__init__.py +4 -9
  29. esphome/components/am2315c/am2315c.cpp +0 -2
  30. esphome/components/am2320/am2320.cpp +0 -1
  31. esphome/components/animation/__init__.py +14 -11
  32. esphome/components/apds9306/apds9306.cpp +0 -4
  33. esphome/components/apds9960/apds9960.cpp +0 -1
  34. esphome/components/api/__init__.py +29 -4
  35. esphome/components/api/api_connection.cpp +378 -401
  36. esphome/components/api/api_connection.h +112 -56
  37. esphome/components/api/api_frame_helper.cpp +69 -896
  38. esphome/components/api/api_frame_helper.h +31 -126
  39. esphome/components/api/api_frame_helper_noise.cpp +583 -0
  40. esphome/components/api/api_frame_helper_noise.h +68 -0
  41. esphome/components/api/api_frame_helper_plaintext.cpp +290 -0
  42. esphome/components/api/api_frame_helper_plaintext.h +53 -0
  43. esphome/components/api/api_noise_context.h +2 -4
  44. esphome/components/api/api_pb2.cpp +1601 -1808
  45. esphome/components/api/api_pb2.h +367 -323
  46. esphome/components/api/api_pb2_dump.cpp +1137 -3466
  47. esphome/components/api/api_pb2_includes.h +34 -0
  48. esphome/components/api/api_pb2_service.cpp +94 -105
  49. esphome/components/api/api_pb2_service.h +27 -16
  50. esphome/components/api/api_server.cpp +18 -17
  51. esphome/components/api/api_server.h +8 -5
  52. esphome/components/api/client.py +16 -8
  53. esphome/components/api/custom_api_device.h +68 -14
  54. esphome/components/api/homeassistant_service.h +24 -19
  55. esphome/components/api/list_entities.cpp +3 -5
  56. esphome/components/api/list_entities.h +2 -4
  57. esphome/components/api/proto.cpp +3 -5
  58. esphome/components/api/proto.h +239 -274
  59. esphome/components/api/subscribe_state.cpp +2 -4
  60. esphome/components/api/subscribe_state.h +2 -4
  61. esphome/components/api/user_services.cpp +2 -4
  62. esphome/components/api/user_services.h +8 -8
  63. esphome/components/as3935/as3935.cpp +0 -2
  64. esphome/components/as3935_spi/as3935_spi.cpp +0 -2
  65. esphome/components/as5600/__init__.py +1 -1
  66. esphome/components/as5600/as5600.cpp +0 -2
  67. esphome/components/as5600/sensor/__init__.py +0 -1
  68. esphome/components/as7341/as7341.cpp +0 -1
  69. esphome/components/async_tcp/__init__.py +1 -1
  70. esphome/components/at581x/at581x.cpp +1 -1
  71. esphome/components/atm90e26/atm90e26.cpp +0 -1
  72. esphome/components/atm90e32/atm90e32.cpp +475 -116
  73. esphome/components/atm90e32/atm90e32.h +43 -5
  74. esphome/components/audio/audio.h +2 -2
  75. esphome/components/axs15231/touchscreen/axs15231_touchscreen.cpp +0 -2
  76. esphome/components/beken_spi_led_strip/led_strip.cpp +0 -2
  77. esphome/components/bh1750/bh1750.cpp +0 -1
  78. esphome/components/binary_sensor/__init__.py +14 -12
  79. esphome/components/ble_client/__init__.py +4 -7
  80. esphome/components/bluetooth_proxy/__init__.py +40 -3
  81. esphome/components/bluetooth_proxy/bluetooth_connection.cpp +392 -81
  82. esphome/components/bluetooth_proxy/bluetooth_connection.h +16 -5
  83. esphome/components/bluetooth_proxy/bluetooth_proxy.cpp +102 -311
  84. esphome/components/bluetooth_proxy/bluetooth_proxy.h +30 -14
  85. esphome/components/bme280_base/bme280_base.cpp +15 -16
  86. esphome/components/bme680/bme680.cpp +2 -3
  87. esphome/components/bme680_bsec/bme680_bsec.cpp +0 -2
  88. esphome/components/bme68x_bsec2/bme68x_bsec2.cpp +0 -2
  89. esphome/components/bmi160/bmi160.cpp +0 -1
  90. esphome/components/bmp085/bmp085.cpp +0 -1
  91. esphome/components/bmp280_base/bmp280_base.cpp +13 -14
  92. esphome/components/bmp3xx_base/bmp3xx_base.cpp +0 -1
  93. esphome/components/bmp581/bmp581.cpp +0 -2
  94. esphome/components/bp1658cj/bp1658cj.cpp +0 -1
  95. esphome/components/bp5758d/bp5758d.cpp +0 -1
  96. esphome/components/button/__init__.py +0 -1
  97. esphome/components/canbus/__init__.py +2 -3
  98. esphome/components/canbus/canbus.cpp +0 -1
  99. esphome/components/cap1188/cap1188.cpp +0 -2
  100. esphome/components/captive_portal/__init__.py +1 -1
  101. esphome/components/cd74hc4067/cd74hc4067.cpp +0 -2
  102. esphome/components/ch422g/ch422g.cpp +0 -1
  103. esphome/components/chsc6x/chsc6x_touchscreen.cpp +0 -3
  104. esphome/components/climate/__init__.py +0 -1
  105. esphome/components/climate/climate_traits.h +24 -0
  106. esphome/components/cm1106/cm1106.cpp +0 -1
  107. esphome/components/const/__init__.py +6 -0
  108. esphome/components/cover/__init__.py +0 -1
  109. esphome/components/cover/cover.cpp +9 -13
  110. esphome/components/cs5460a/cs5460a.cpp +0 -2
  111. esphome/components/cse7761/cse7761.cpp +0 -1
  112. esphome/components/cst226/touchscreen/cst226_touchscreen.cpp +0 -2
  113. esphome/components/cst816/touchscreen/cst816_touchscreen.cpp +0 -2
  114. esphome/components/dac7678/dac7678_output.cpp +0 -2
  115. esphome/components/dallas_temp/dallas_temp.cpp +0 -1
  116. esphome/components/datetime/__init__.py +0 -2
  117. esphome/components/debug/__init__.py +15 -1
  118. esphome/components/debug/debug_zephyr.cpp +281 -0
  119. esphome/components/debug/sensor.py +2 -1
  120. esphome/components/deep_sleep/deep_sleep_component.cpp +0 -1
  121. esphome/components/deep_sleep/deep_sleep_esp32.cpp +20 -1
  122. esphome/components/dfrobot_sen0395/__init__.py +1 -2
  123. esphome/components/dht/dht.cpp +0 -1
  124. esphome/components/dht12/dht12.cpp +0 -1
  125. esphome/components/display/__init__.py +16 -3
  126. esphome/components/display_menu_base/__init__.py +1 -1
  127. esphome/components/dps310/dps310.cpp +0 -2
  128. esphome/components/ds1307/ds1307.cpp +0 -1
  129. esphome/components/ds2484/ds2484.cpp +0 -1
  130. esphome/components/duty_cycle/duty_cycle_sensor.cpp +0 -1
  131. esphome/components/ee895/ee895.cpp +0 -1
  132. esphome/components/ektf2232/touchscreen/ektf2232.cpp +0 -1
  133. esphome/components/emc2101/emc2101.cpp +0 -2
  134. esphome/components/ens160_base/ens160_base.cpp +0 -2
  135. esphome/components/ens210/ens210.cpp +0 -1
  136. esphome/components/es7210/es7210.cpp +0 -2
  137. esphome/components/es7243e/es7243e.cpp +0 -2
  138. esphome/components/es8156/es8156.cpp +0 -2
  139. esphome/components/es8311/es8311.cpp +0 -2
  140. esphome/components/es8388/es8388.cpp +0 -2
  141. esphome/components/esp32/__init__.py +203 -60
  142. esphome/components/esp32/boards.py +17 -0
  143. esphome/components/esp32/gpio.cpp +0 -1
  144. esphome/components/esp32/gpio.py +1 -2
  145. esphome/components/esp32/gpio_esp32_h2.py +2 -7
  146. esphome/components/esp32/gpio_esp32_p4.py +2 -7
  147. esphome/components/esp32/post_build.py.script +112 -61
  148. esphome/components/esp32_ble/__init__.py +41 -2
  149. esphome/components/esp32_ble/ble.cpp +14 -10
  150. esphome/components/esp32_ble/ble.h +18 -18
  151. esphome/components/esp32_ble/ble_advertising.cpp +5 -5
  152. esphome/components/esp32_ble/ble_advertising.h +7 -5
  153. esphome/components/esp32_ble/ble_event.h +139 -73
  154. esphome/components/esp32_ble/ble_scan_result.h +2 -4
  155. esphome/components/esp32_ble/ble_uuid.cpp +5 -5
  156. esphome/components/esp32_ble/ble_uuid.h +6 -5
  157. esphome/components/esp32_ble_beacon/__init__.py +4 -0
  158. esphome/components/esp32_ble_client/__init__.py +1 -1
  159. esphome/components/esp32_ble_client/ble_characteristic.cpp +4 -4
  160. esphome/components/esp32_ble_client/ble_characteristic.h +6 -4
  161. esphome/components/esp32_ble_client/ble_client_base.cpp +155 -104
  162. esphome/components/esp32_ble_client/ble_client_base.h +17 -6
  163. esphome/components/esp32_ble_client/ble_descriptor.h +6 -4
  164. esphome/components/esp32_ble_client/ble_service.cpp +4 -4
  165. esphome/components/esp32_ble_client/ble_service.h +6 -4
  166. esphome/components/esp32_ble_server/__init__.py +15 -12
  167. esphome/components/esp32_ble_tracker/__init__.py +79 -11
  168. esphome/components/esp32_ble_tracker/automation.h +4 -4
  169. esphome/components/esp32_ble_tracker/esp32_ble_tracker.cpp +264 -261
  170. esphome/components/esp32_ble_tracker/esp32_ble_tracker.h +103 -37
  171. esphome/components/esp32_camera/__init__.py +13 -1
  172. esphome/components/esp32_camera/esp32_camera.cpp +7 -2
  173. esphome/components/esp32_camera/esp32_camera.h +1 -0
  174. esphome/components/esp32_dac/esp32_dac.cpp +3 -19
  175. esphome/components/esp32_dac/esp32_dac.h +4 -8
  176. esphome/components/esp32_rmt_led_strip/led_strip.cpp +1 -6
  177. esphome/components/esp32_rmt_led_strip/light.py +1 -1
  178. esphome/components/esp32_touch/__init__.py +2 -3
  179. esphome/components/esp32_touch/esp32_touch.h +9 -6
  180. esphome/components/esp32_touch/esp32_touch_common.cpp +2 -0
  181. esphome/components/esp32_touch/esp32_touch_v1.cpp +7 -9
  182. esphome/components/esp32_touch/esp32_touch_v2.cpp +10 -6
  183. esphome/components/esp8266/__init__.py +3 -1
  184. esphome/components/esp8266_pwm/esp8266_pwm.cpp +0 -1
  185. esphome/components/esphome/ota/__init__.py +1 -2
  186. esphome/components/esphome/ota/ota_esphome.cpp +150 -77
  187. esphome/components/esphome/ota/ota_esphome.h +8 -1
  188. esphome/components/espnow/__init__.py +309 -0
  189. esphome/components/espnow/automation.h +175 -0
  190. esphome/components/espnow/espnow_component.cpp +468 -0
  191. esphome/components/espnow/espnow_component.h +183 -0
  192. esphome/components/espnow/espnow_err.h +19 -0
  193. esphome/components/espnow/espnow_packet.h +166 -0
  194. esphome/components/ethernet/__init__.py +7 -1
  195. esphome/components/ethernet/esp_eth_phy_jl1101.c +5 -0
  196. esphome/components/ethernet/ethernet_component.cpp +0 -1
  197. esphome/components/ethernet/ethernet_component.h +4 -0
  198. esphome/components/ethernet_info/ethernet_info_text_sensor.h +0 -3
  199. esphome/components/event/__init__.py +0 -1
  200. esphome/components/factory_reset/__init__.py +92 -0
  201. esphome/components/factory_reset/factory_reset.cpp +76 -0
  202. esphome/components/factory_reset/factory_reset.h +43 -0
  203. esphome/components/fan/__init__.py +0 -1
  204. esphome/components/fan/fan_traits.h +16 -0
  205. esphome/components/fastled_base/fastled_light.cpp +0 -1
  206. esphome/components/fastled_spi/light.py +1 -3
  207. esphome/components/fingerprint_grow/fingerprint_grow.cpp +0 -2
  208. esphome/components/font/__init__.py +9 -1
  209. esphome/components/fs3000/fs3000.cpp +0 -2
  210. esphome/components/ft5x06/touchscreen/ft5x06_touchscreen.cpp +0 -2
  211. esphome/components/ft63x6/ft63x6.cpp +0 -1
  212. esphome/components/gdk101/gdk101.cpp +0 -1
  213. esphome/components/gl_r01_i2c/gl_r01_i2c.cpp +0 -1
  214. esphome/components/gl_r01_i2c/sensor.py +1 -1
  215. esphome/components/gpio/one_wire/gpio_one_wire.cpp +0 -1
  216. esphome/components/gpio/switch/gpio_switch.cpp +0 -2
  217. esphome/components/gpio_expander/cached_gpio.h +24 -15
  218. esphome/components/gps/__init__.py +6 -2
  219. esphome/components/gps/gps.cpp +50 -49
  220. esphome/components/gps/gps.h +4 -8
  221. esphome/components/gps/time/gps_time.cpp +3 -9
  222. esphome/components/gps/time/gps_time.h +4 -7
  223. esphome/components/graph/__init__.py +1 -1
  224. esphome/components/grove_gas_mc_v2/grove_gas_mc_v2.cpp +0 -1
  225. esphome/components/grove_tb6612fng/grove_tb6612fng.cpp +0 -1
  226. esphome/components/gt911/touchscreen/gt911_touchscreen.cpp +21 -12
  227. esphome/components/gt911/touchscreen/gt911_touchscreen.h +26 -2
  228. esphome/components/haier/climate.py +5 -10
  229. esphome/components/haier/haier_base.cpp +0 -1
  230. esphome/components/hbridge/switch/hbridge_switch.cpp +0 -2
  231. esphome/components/hdc1080/hdc1080.cpp +0 -2
  232. esphome/components/heatpumpir/climate.py +2 -2
  233. esphome/components/hlw8012/hlw8012.cpp +0 -1
  234. esphome/components/hm3301/hm3301.cpp +0 -1
  235. esphome/components/hmc5883l/hmc5883l.cpp +0 -1
  236. esphome/components/homeassistant/__init__.py +1 -0
  237. esphome/components/homeassistant/number/__init__.py +1 -0
  238. esphome/components/homeassistant/number/homeassistant_number.cpp +11 -7
  239. esphome/components/homeassistant/switch/__init__.py +1 -0
  240. esphome/components/homeassistant/switch/homeassistant_switch.cpp +9 -5
  241. esphome/components/honeywellabp/honeywellabp.cpp +1 -4
  242. esphome/components/host/__init__.py +2 -0
  243. esphome/components/hte501/hte501.cpp +0 -1
  244. esphome/components/http_request/__init__.py +2 -3
  245. esphome/components/http_request/http_request_idf.cpp +2 -2
  246. esphome/components/htu21d/htu21d.cpp +0 -2
  247. esphome/components/htu31d/htu31d.cpp +0 -2
  248. esphome/components/hx711/hx711.cpp +0 -1
  249. esphome/components/hydreon_rgxx/hydreon_rgxx.cpp +0 -1
  250. esphome/components/hydreon_rgxx/sensor.py +4 -5
  251. esphome/components/i2c/i2c_bus.h +1 -1
  252. esphome/components/i2c/i2c_bus_arduino.cpp +1 -2
  253. esphome/components/i2c/i2c_bus_esp_idf.cpp +192 -17
  254. esphome/components/i2c/i2c_bus_esp_idf.h +11 -1
  255. esphome/components/i2s_audio/__init__.py +6 -5
  256. esphome/components/i2s_audio/i2s_audio.cpp +0 -2
  257. esphome/components/i2s_audio/media_player/i2s_audio_media_player.cpp +1 -4
  258. esphome/components/i2s_audio/microphone/__init__.py +4 -6
  259. esphome/components/i2s_audio/microphone/i2s_audio_microphone.cpp +46 -19
  260. esphome/components/i2s_audio/microphone/i2s_audio_microphone.h +4 -3
  261. esphome/components/i2s_audio/speaker/i2s_audio_speaker.cpp +273 -269
  262. esphome/components/i2s_audio/speaker/i2s_audio_speaker.h +19 -34
  263. esphome/components/ili9xxx/display.py +4 -3
  264. esphome/components/ili9xxx/ili9xxx_display.cpp +0 -2
  265. esphome/components/image/__init__.py +123 -92
  266. esphome/components/improv_serial/__init__.py +7 -8
  267. esphome/components/ina219/ina219.cpp +0 -1
  268. esphome/components/ina226/ina226.cpp +0 -2
  269. esphome/components/ina260/ina260.cpp +0 -2
  270. esphome/components/ina2xx_base/__init__.py +2 -5
  271. esphome/components/ina2xx_base/ina2xx_base.cpp +0 -2
  272. esphome/components/ina3221/ina3221.cpp +0 -1
  273. esphome/components/internal_temperature/internal_temperature.cpp +0 -2
  274. esphome/components/interval/interval.h +5 -9
  275. esphome/components/json/__init__.py +1 -1
  276. esphome/components/kmeteriso/kmeteriso.cpp +0 -2
  277. esphome/components/lc709203f/lc709203f.cpp +0 -2
  278. esphome/components/lcd_gpio/display.py +1 -3
  279. esphome/components/lcd_gpio/gpio_lcd_display.cpp +0 -1
  280. esphome/components/lcd_pcf8574/pcf8574_display.cpp +0 -1
  281. esphome/components/ld2410/__init__.py +4 -6
  282. esphome/components/ld2410/binary_sensor.py +4 -0
  283. esphome/components/ld2410/ld2410.cpp +56 -100
  284. esphome/components/ld2410/ld2410.h +17 -15
  285. esphome/components/ld2410/sensor.py +24 -10
  286. esphome/components/ld2412/__init__.py +46 -0
  287. esphome/components/ld2412/binary_sensor.py +70 -0
  288. esphome/components/ld2412/button/__init__.py +74 -0
  289. esphome/components/ld2412/button/factory_reset_button.cpp +9 -0
  290. esphome/components/ld2412/button/factory_reset_button.h +18 -0
  291. esphome/components/ld2412/button/query_button.cpp +9 -0
  292. esphome/components/ld2412/button/query_button.h +18 -0
  293. esphome/components/ld2412/button/restart_button.cpp +9 -0
  294. esphome/components/ld2412/button/restart_button.h +18 -0
  295. esphome/components/ld2412/button/start_dynamic_background_correction_button.cpp +11 -0
  296. esphome/components/ld2412/button/start_dynamic_background_correction_button.h +18 -0
  297. esphome/components/ld2412/ld2412.cpp +861 -0
  298. esphome/components/ld2412/ld2412.h +141 -0
  299. esphome/components/ld2412/number/__init__.py +126 -0
  300. esphome/components/ld2412/number/gate_threshold_number.cpp +14 -0
  301. esphome/components/ld2412/number/gate_threshold_number.h +19 -0
  302. esphome/components/ld2412/number/light_threshold_number.cpp +12 -0
  303. esphome/components/ld2412/number/light_threshold_number.h +18 -0
  304. esphome/components/ld2412/number/max_distance_timeout_number.cpp +12 -0
  305. esphome/components/ld2412/number/max_distance_timeout_number.h +18 -0
  306. esphome/components/ld2412/select/__init__.py +82 -0
  307. esphome/components/ld2412/select/baud_rate_select.cpp +12 -0
  308. esphome/components/ld2412/select/baud_rate_select.h +18 -0
  309. esphome/components/ld2412/select/distance_resolution_select.cpp +12 -0
  310. esphome/components/ld2412/select/distance_resolution_select.h +18 -0
  311. esphome/components/ld2412/select/light_out_control_select.cpp +12 -0
  312. esphome/components/ld2412/select/light_out_control_select.h +18 -0
  313. esphome/components/ld2412/sensor.py +124 -0
  314. esphome/components/ld2412/switch/__init__.py +45 -0
  315. esphome/components/ld2412/switch/bluetooth_switch.cpp +12 -0
  316. esphome/components/ld2412/switch/bluetooth_switch.h +18 -0
  317. esphome/components/ld2412/switch/engineering_mode_switch.cpp +12 -0
  318. esphome/components/ld2412/switch/engineering_mode_switch.h +18 -0
  319. esphome/components/ld2412/text_sensor.py +34 -0
  320. esphome/components/ld2420/ld2420.cpp +0 -1
  321. esphome/components/ld2450/__init__.py +3 -4
  322. esphome/components/ld2450/binary_sensor.py +3 -0
  323. esphome/components/ld2450/ld2450.cpp +77 -165
  324. esphome/components/ld2450/ld2450.h +26 -54
  325. esphome/components/ld2450/sensor.py +120 -6
  326. esphome/components/ld2450/text_sensor.py +5 -4
  327. esphome/components/ld24xx/__init__.py +1 -0
  328. esphome/components/ld24xx/ld24xx.h +65 -0
  329. esphome/components/ledc/ledc_output.cpp +0 -1
  330. esphome/components/libretiny/__init__.py +2 -0
  331. esphome/components/light/__init__.py +0 -1
  332. esphome/components/light/effects.py +70 -45
  333. esphome/components/light/light_call.cpp +101 -66
  334. esphome/components/light/light_color_values.h +16 -11
  335. esphome/components/light/light_json_schema.cpp +46 -44
  336. esphome/components/light/light_state.cpp +8 -11
  337. esphome/components/light/light_traits.h +17 -0
  338. esphome/components/lightwaverf/lightwaverf.cpp +0 -2
  339. esphome/components/lilygo_t5_47/touchscreen/lilygo_t5_47_touchscreen.cpp +0 -1
  340. esphome/components/lock/__init__.py +0 -1
  341. esphome/components/logger/__init__.py +31 -9
  342. esphome/components/logger/logger.cpp +12 -7
  343. esphome/components/logger/logger.h +25 -14
  344. esphome/components/logger/logger_esp32.cpp +2 -7
  345. esphome/components/logger/logger_esp8266.cpp +2 -4
  346. esphome/components/logger/logger_host.cpp +2 -4
  347. esphome/components/logger/logger_libretiny.cpp +2 -4
  348. esphome/components/logger/logger_rp2040.cpp +2 -4
  349. esphome/components/logger/logger_zephyr.cpp +86 -0
  350. esphome/components/logger/select/logger_level_select.cpp +2 -4
  351. esphome/components/logger/select/logger_level_select.h +2 -4
  352. esphome/components/logger/task_log_buffer.cpp +2 -4
  353. esphome/components/logger/task_log_buffer.h +2 -4
  354. esphome/components/lps22/sensor.py +5 -5
  355. esphome/components/ltr390/ltr390.cpp +0 -2
  356. esphome/components/ltr501/ltr501.cpp +0 -1
  357. esphome/components/ltr_als_ps/ltr_als_ps.cpp +0 -1
  358. esphome/components/lvgl/__init__.py +14 -13
  359. esphome/components/lvgl/automation.py +2 -4
  360. esphome/components/lvgl/defines.py +0 -2
  361. esphome/components/lvgl/helpers.py +1 -1
  362. esphome/components/lvgl/lv_validation.py +7 -4
  363. esphome/components/lvgl/lvgl_esphome.cpp +2 -3
  364. esphome/components/lvgl/styles.py +2 -2
  365. esphome/components/lvgl/types.py +1 -1
  366. esphome/components/lvgl/widgets/__init__.py +2 -2
  367. esphome/components/lvgl/widgets/arc.py +14 -11
  368. esphome/components/lvgl/widgets/buttonmatrix.py +1 -1
  369. esphome/components/lvgl/widgets/qrcode.py +7 -7
  370. esphome/components/lvgl/widgets/spinner.py +6 -6
  371. esphome/components/lvgl/widgets/switch.py +2 -2
  372. esphome/components/lvgl/widgets/tabview.py +3 -3
  373. esphome/components/lvgl/widgets/tileview.py +15 -7
  374. esphome/components/m5stack_8angle/m5stack_8angle.cpp +0 -1
  375. esphome/components/matrix_keypad/__init__.py +4 -3
  376. esphome/components/max17043/max17043.cpp +0 -2
  377. esphome/components/max31855/max31855.cpp +1 -4
  378. esphome/components/max31856/max31856.cpp +0 -4
  379. esphome/components/max31865/max31865.cpp +0 -1
  380. esphome/components/max44009/max44009.cpp +0 -1
  381. esphome/components/max6675/max6675.cpp +1 -4
  382. esphome/components/max6956/max6956.cpp +0 -1
  383. esphome/components/max7219/max7219.cpp +0 -1
  384. esphome/components/max7219digit/display.py +1 -1
  385. esphome/components/max7219digit/max7219digit.cpp +0 -1
  386. esphome/components/max9611/max9611.cpp +0 -1
  387. esphome/components/mcp23008/__init__.py +1 -1
  388. esphome/components/mcp23008/mcp23008.cpp +0 -1
  389. esphome/components/mcp23016/mcp23016.cpp +0 -1
  390. esphome/components/mcp23017/__init__.py +1 -1
  391. esphome/components/mcp23017/mcp23017.cpp +0 -1
  392. esphome/components/mcp23s08/__init__.py +1 -1
  393. esphome/components/mcp23s08/mcp23s08.cpp +0 -1
  394. esphome/components/mcp23s17/__init__.py +1 -1
  395. esphome/components/mcp23s17/mcp23s17.cpp +0 -1
  396. esphome/components/mcp23x08_base/__init__.py +2 -0
  397. esphome/components/mcp23x08_base/mcp23x08_base.cpp +9 -7
  398. esphome/components/mcp23x08_base/mcp23x08_base.h +9 -4
  399. esphome/components/mcp23x17_base/__init__.py +2 -0
  400. esphome/components/mcp23x17_base/mcp23x17_base.cpp +20 -7
  401. esphome/components/mcp23x17_base/mcp23x17_base.h +9 -4
  402. esphome/components/mcp23xxx_base/__init__.py +11 -5
  403. esphome/components/mcp23xxx_base/mcp23xxx_base.cpp +15 -12
  404. esphome/components/mcp23xxx_base/mcp23xxx_base.h +8 -7
  405. esphome/components/mcp3008/mcp3008.cpp +1 -4
  406. esphome/components/mcp3204/mcp3204.cpp +1 -4
  407. esphome/components/mcp4461/mcp4461.cpp +0 -1
  408. esphome/components/mcp4725/mcp4725.cpp +0 -1
  409. esphome/components/mcp4728/mcp4728.cpp +0 -1
  410. esphome/components/mcp9600/mcp9600.cpp +0 -2
  411. esphome/components/mcp9808/mcp9808.cpp +0 -2
  412. esphome/components/mdns/__init__.py +3 -0
  413. esphome/components/mdns/mdns_component.cpp +2 -0
  414. esphome/components/mdns/mdns_component.h +4 -0
  415. esphome/components/media_player/__init__.py +40 -0
  416. esphome/components/media_player/automation.h +16 -0
  417. esphome/components/media_player/media_player.cpp +13 -0
  418. esphome/components/media_player/media_player.h +50 -3
  419. esphome/components/micro_wake_word/micro_wake_word.cpp +0 -3
  420. esphome/components/mics_4514/mics_4514.cpp +1 -6
  421. esphome/components/midea/ir_transmitter.h +4 -4
  422. esphome/components/mipi/__init__.py +416 -0
  423. esphome/components/mipi_dsi/__init__.py +5 -0
  424. esphome/components/mipi_dsi/display.py +233 -0
  425. esphome/components/mipi_dsi/mipi_dsi.cpp +379 -0
  426. esphome/components/mipi_dsi/mipi_dsi.h +123 -0
  427. esphome/components/mipi_dsi/models/__init__.py +0 -0
  428. esphome/components/mipi_dsi/models/guition.py +38 -0
  429. esphome/components/mipi_dsi/models/m5stack.py +57 -0
  430. esphome/components/mipi_dsi/models/waveshare.py +105 -0
  431. esphome/components/mipi_rgb/models/lilygo.py +0 -0
  432. esphome/components/mipi_spi/__init__.py +0 -9
  433. esphome/components/mipi_spi/display.py +220 -256
  434. esphome/components/mipi_spi/mipi_spi.cpp +1 -485
  435. esphome/components/mipi_spi/mipi_spi.h +556 -108
  436. esphome/components/mipi_spi/models/__init__.py +0 -65
  437. esphome/components/mipi_spi/models/adafruit.py +30 -0
  438. esphome/components/mipi_spi/models/amoled.py +41 -5
  439. esphome/components/mipi_spi/models/ili.py +5 -5
  440. esphome/components/mipi_spi/models/jc.py +1 -3
  441. esphome/components/mipi_spi/models/lilygo.py +1 -1
  442. esphome/components/mipi_spi/models/waveshare.py +16 -1
  443. esphome/components/mixer/speaker/__init__.py +4 -5
  444. esphome/components/mlx90393/sensor.py +7 -5
  445. esphome/components/mlx90393/sensor_mlx90393.cpp +0 -1
  446. esphome/components/mlx90614/mlx90614.cpp +0 -1
  447. esphome/components/mmc5603/mmc5603.cpp +0 -1
  448. esphome/components/mmc5983/mmc5983.cpp +0 -2
  449. esphome/components/mpl3115a2/mpl3115a2.cpp +0 -2
  450. esphome/components/mpr121/__init__.py +7 -6
  451. esphome/components/mpr121/mpr121.cpp +0 -1
  452. esphome/components/mpu6050/mpu6050.cpp +0 -1
  453. esphome/components/mpu6886/mpu6886.cpp +0 -1
  454. esphome/components/mqtt/__init__.py +1 -2
  455. esphome/components/mqtt/mqtt_button.cpp +1 -1
  456. esphome/components/mqtt/mqtt_client.cpp +0 -1
  457. esphome/components/mqtt/mqtt_component.cpp +8 -14
  458. esphome/components/mqtt/mqtt_component.h +0 -7
  459. esphome/components/mqtt/mqtt_sensor.cpp +0 -1
  460. esphome/components/mqtt/mqtt_sensor.h +0 -1
  461. esphome/components/mqtt/mqtt_text_sensor.cpp +0 -1
  462. esphome/components/mqtt/mqtt_text_sensor.h +0 -1
  463. esphome/components/ms5611/ms5611.cpp +0 -1
  464. esphome/components/ms8607/ms8607.cpp +0 -1
  465. esphome/components/msa3xx/msa3xx.cpp +0 -2
  466. esphome/components/my9231/my9231.cpp +0 -2
  467. esphome/components/nau7802/nau7802.cpp +0 -1
  468. esphome/components/neopixelbus/light.py +3 -0
  469. esphome/components/network/util.cpp +29 -0
  470. esphome/components/nextion/nextion.cpp +2 -2
  471. esphome/components/nfc/binary_sensor/{binary_sensor.cpp → nfc_binary_sensor.cpp} +1 -1
  472. esphome/components/npi19/npi19.cpp +0 -2
  473. esphome/components/nrf52/__init__.py +223 -0
  474. esphome/components/nrf52/boards.py +34 -0
  475. esphome/components/nrf52/const.py +18 -0
  476. esphome/components/nrf52/gpio.py +79 -0
  477. esphome/components/number/__init__.py +2 -1
  478. esphome/components/one_wire/__init__.py +1 -2
  479. esphome/components/one_wire/one_wire.cpp +0 -2
  480. esphome/components/one_wire/one_wire.h +0 -2
  481. esphome/components/opentherm/hub.cpp +0 -1
  482. esphome/components/opentherm/number/__init__.py +2 -2
  483. esphome/components/openthread/__init__.py +2 -3
  484. esphome/components/openthread/openthread.cpp +30 -13
  485. esphome/components/openthread/openthread.h +3 -0
  486. esphome/components/openthread/openthread_esp.cpp +3 -1
  487. esphome/components/opt3001/sensor.py +2 -6
  488. esphome/components/output/__init__.py +38 -0
  489. esphome/components/output/automation.h +24 -0
  490. esphome/components/output/switch/output_switch.cpp +0 -2
  491. esphome/components/packages/__init__.py +1 -2
  492. esphome/components/packet_transport/__init__.py +4 -3
  493. esphome/components/pca6416a/pca6416a.cpp +0 -1
  494. esphome/components/pca9554/pca9554.cpp +0 -1
  495. esphome/components/pca9685/pca9685_output.cpp +0 -2
  496. esphome/components/pcf85063/pcf85063.cpp +0 -1
  497. esphome/components/pcf8563/pcf8563.cpp +0 -1
  498. esphome/components/pcf8574/pcf8574.cpp +0 -1
  499. esphome/components/pi4ioe5v6408/pi4ioe5v6408.cpp +0 -1
  500. esphome/components/pipsolar/pipsolar.cpp +54 -42
  501. esphome/components/pipsolar/pipsolar.h +5 -4
  502. esphome/components/pipsolar/sensor/__init__.py +1 -1
  503. esphome/components/pm2005/pm2005.cpp +0 -1
  504. esphome/components/pmsa003i/pmsa003i.cpp +0 -2
  505. esphome/components/pmwcs3/sensor.py +1 -2
  506. esphome/components/pn532/pn532.cpp +0 -2
  507. esphome/components/pn532_spi/pn532_spi.cpp +0 -2
  508. esphome/components/power_supply/power_supply.cpp +7 -10
  509. esphome/components/power_supply/power_supply.h +1 -1
  510. esphome/components/psram/__init__.py +6 -1
  511. esphome/components/pulse_counter/pulse_counter_sensor.cpp +0 -1
  512. esphome/components/pulse_counter/sensor.py +9 -6
  513. esphome/components/pylontech/pylontech.cpp +0 -1
  514. esphome/components/qmc5883l/qmc5883l.cpp +0 -1
  515. esphome/components/qmp6988/qmp6988.cpp +0 -2
  516. esphome/components/qspi_dbi/display.py +2 -3
  517. esphome/components/qspi_dbi/qspi_dbi.cpp +0 -2
  518. esphome/components/qwiic_pir/binary_sensor.py +2 -3
  519. esphome/components/qwiic_pir/qwiic_pir.cpp +0 -2
  520. esphome/components/rc522/rc522.cpp +9 -31
  521. esphome/components/rc522_spi/rc522_spi.cpp +0 -1
  522. esphome/components/remote_base/__init__.py +5 -6
  523. esphome/components/remote_receiver/remote_receiver_esp32.cpp +0 -1
  524. esphome/components/remote_receiver/remote_receiver_esp8266.cpp +0 -1
  525. esphome/components/remote_receiver/remote_receiver_libretiny.cpp +0 -1
  526. esphome/components/remote_transmitter/__init__.py +26 -0
  527. esphome/components/remote_transmitter/automation.h +18 -0
  528. esphome/components/remote_transmitter/remote_transmitter.h +2 -1
  529. esphome/components/remote_transmitter/remote_transmitter_esp32.cpp +0 -1
  530. esphome/components/remote_transmitter/remote_transmitter_esp8266.cpp +2 -0
  531. esphome/components/remote_transmitter/remote_transmitter_libretiny.cpp +2 -0
  532. esphome/components/resampler/speaker/__init__.py +4 -5
  533. esphome/components/rf_bridge/__init__.py +4 -8
  534. esphome/components/rotary_encoder/rotary_encoder.cpp +0 -2
  535. esphome/components/rp2040/__init__.py +3 -1
  536. esphome/components/rp2040_pio_led_strip/led_strip.cpp +0 -2
  537. esphome/components/rp2040_pio_led_strip/light.py +1 -2
  538. esphome/components/rp2040_pwm/rp2040_pwm.cpp +1 -5
  539. esphome/components/rpi_dpi_rgb/display.py +13 -15
  540. esphome/components/rpi_dpi_rgb/rpi_dpi_rgb.cpp +0 -3
  541. esphome/components/runtime_stats/__init__.py +34 -0
  542. esphome/components/runtime_stats/runtime_stats.cpp +102 -0
  543. esphome/components/runtime_stats/runtime_stats.h +132 -0
  544. esphome/components/scd30/scd30.cpp +0 -2
  545. esphome/components/scd30/sensor.py +1 -2
  546. esphome/components/scd4x/scd4x.cpp +0 -1
  547. esphome/components/scd4x/sensor.py +1 -3
  548. esphome/components/sdl/display.py +3 -1
  549. esphome/components/sdl/sdl_esphome.cpp +0 -2
  550. esphome/components/sdp3x/sdp3x.cpp +0 -2
  551. esphome/components/seeed_mr24hpc1/seeed_mr24hpc1.cpp +0 -2
  552. esphome/components/seeed_mr60fda2/seeed_mr60fda2.cpp +0 -3
  553. esphome/components/select/__init__.py +2 -3
  554. esphome/components/select/select_traits.cpp +1 -1
  555. esphome/components/select/select_traits.h +1 -1
  556. esphome/components/sen0321/sen0321.cpp +0 -1
  557. esphome/components/sen5x/sen5x.cpp +0 -2
  558. esphome/components/senseair/senseair.cpp +7 -3
  559. esphome/components/senseair/senseair.h +11 -0
  560. esphome/components/sensor/__init__.py +36 -4
  561. esphome/components/sensor/filter.cpp +49 -10
  562. esphome/components/sensor/filter.h +22 -7
  563. esphome/components/sensor/sensor.cpp +0 -1
  564. esphome/components/sensor/sensor.h +0 -9
  565. esphome/components/sfa30/sfa30.cpp +0 -4
  566. esphome/components/sgp30/sgp30.cpp +0 -2
  567. esphome/components/sgp4x/sensor.py +1 -1
  568. esphome/components/sgp4x/sgp4x.cpp +0 -2
  569. esphome/components/shelly_dimmer/shelly_dimmer.cpp +0 -2
  570. esphome/components/sht3xd/sht3xd.cpp +0 -2
  571. esphome/components/sht4x/sht4x.cpp +0 -2
  572. esphome/components/shtcx/shtcx.cpp +0 -1
  573. esphome/components/sim800l/__init__.py +2 -4
  574. esphome/components/sm16716/sm16716.cpp +0 -1
  575. esphome/components/sm2135/sm2135.cpp +0 -1
  576. esphome/components/sm2235/sm2235.cpp +0 -1
  577. esphome/components/sm2335/sm2335.cpp +0 -1
  578. esphome/components/sn74hc165/sn74hc165.cpp +0 -1
  579. esphome/components/sn74hc595/sn74hc595.cpp +0 -1
  580. esphome/components/sntp/sntp_component.cpp +0 -1
  581. esphome/components/sound_level/sensor.py +1 -1
  582. esphome/components/speaker/media_player/__init__.py +21 -33
  583. esphome/components/speaker/media_player/audio_pipeline.cpp +4 -7
  584. esphome/components/spi/__init__.py +29 -13
  585. esphome/components/spi/spi.cpp +0 -2
  586. esphome/components/spi_device/spi_device.cpp +1 -4
  587. esphome/components/sprinkler/__init__.py +4 -4
  588. esphome/components/sps30/sps30.cpp +0 -1
  589. esphome/components/ssd1306_base/__init__.py +11 -11
  590. esphome/components/ssd1306_base/ssd1306_base.cpp +1 -1
  591. esphome/components/ssd1306_i2c/ssd1306_i2c.cpp +0 -1
  592. esphome/components/ssd1306_spi/ssd1306_spi.cpp +0 -1
  593. esphome/components/ssd1322_spi/ssd1322_spi.cpp +0 -1
  594. esphome/components/ssd1325_spi/ssd1325_spi.cpp +0 -1
  595. esphome/components/ssd1327_i2c/ssd1327_i2c.cpp +0 -1
  596. esphome/components/ssd1327_spi/ssd1327_spi.cpp +0 -1
  597. esphome/components/ssd1331_spi/ssd1331_spi.cpp +0 -1
  598. esphome/components/ssd1351_spi/ssd1351_spi.cpp +0 -1
  599. esphome/components/st7567_i2c/st7567_i2c.cpp +0 -1
  600. esphome/components/st7567_spi/st7567_spi.cpp +0 -1
  601. esphome/components/st7701s/display.py +10 -14
  602. esphome/components/st7701s/st7701s.cpp +0 -3
  603. esphome/components/st7735/st7735.cpp +0 -1
  604. esphome/components/st7789v/st7789v.cpp +0 -1
  605. esphome/components/st7920/st7920.cpp +0 -1
  606. esphome/components/status_led/light/status_led_light.cpp +0 -2
  607. esphome/components/status_led/status_led.cpp +0 -1
  608. esphome/components/stepper/__init__.py +2 -4
  609. esphome/components/sts3x/sts3x.cpp +0 -1
  610. esphome/components/substitutions/__init__.py +10 -16
  611. esphome/components/substitutions/jinja.py +24 -1
  612. esphome/components/sun/__init__.py +2 -3
  613. esphome/components/switch/__init__.py +31 -1
  614. esphome/components/switch/automation.h +24 -0
  615. esphome/components/switch/switch.cpp +8 -0
  616. esphome/components/switch/switch.h +8 -0
  617. esphome/components/sx126x/sx126x.cpp +0 -2
  618. esphome/components/sx127x/sx127x.cpp +0 -2
  619. esphome/components/sx1509/__init__.py +7 -5
  620. esphome/components/sx1509/output/sx1509_float_output.cpp +1 -1
  621. esphome/components/sx1509/sx1509.cpp +0 -2
  622. esphome/components/syslog/esphome_syslog.cpp +1 -1
  623. esphome/components/tc74/tc74.cpp +0 -1
  624. esphome/components/tca9548a/tca9548a.cpp +0 -1
  625. esphome/components/tca9555/tca9555.cpp +0 -1
  626. esphome/components/tcs34725/tcs34725.cpp +0 -1
  627. esphome/components/tee501/tee501.cpp +0 -1
  628. esphome/components/tem3200/tem3200.cpp +0 -2
  629. esphome/components/template/alarm_control_panel/template_alarm_control_panel.cpp +0 -1
  630. esphome/components/template/cover/template_cover.cpp +0 -1
  631. esphome/components/template/select/template_select.cpp +0 -1
  632. esphome/components/template/text/template_text.cpp +0 -2
  633. esphome/components/template/valve/template_valve.cpp +0 -1
  634. esphome/components/text/__init__.py +0 -1
  635. esphome/components/text/text_traits.h +2 -0
  636. esphome/components/text_sensor/__init__.py +2 -1
  637. esphome/components/text_sensor/text_sensor.cpp +0 -2
  638. esphome/components/text_sensor/text_sensor.h +0 -8
  639. esphome/components/thermostat/climate.py +4 -4
  640. esphome/components/time/__init__.py +7 -4
  641. esphome/components/time/real_time_clock.cpp +16 -3
  642. esphome/components/tlc59208f/tlc59208f_output.cpp +0 -2
  643. esphome/components/tlc5947/tlc5947.cpp +0 -2
  644. esphome/components/tlc5971/tlc5971.cpp +0 -2
  645. esphome/components/tm1621/tm1621.cpp +0 -2
  646. esphome/components/tm1637/tm1637.cpp +0 -2
  647. esphome/components/tm1638/tm1638.cpp +0 -2
  648. esphome/components/tm1651/__init__.py +45 -48
  649. esphome/components/tm1651/tm1651.cpp +213 -47
  650. esphome/components/tm1651/tm1651.h +37 -32
  651. esphome/components/tmp117/tmp117.cpp +0 -2
  652. esphome/components/tsl2561/tsl2561.cpp +0 -1
  653. esphome/components/tsl2591/tsl2591.cpp +0 -1
  654. esphome/components/tt21100/touchscreen/tt21100.cpp +0 -2
  655. esphome/components/ttp229_bsf/ttp229_bsf.cpp +0 -1
  656. esphome/components/ttp229_lsf/ttp229_lsf.cpp +0 -1
  657. esphome/components/tuya/climate/__init__.py +9 -10
  658. esphome/components/tuya/number/__init__.py +8 -6
  659. esphome/components/tx20/tx20.cpp +0 -1
  660. esphome/components/uart/uart_component_esp32_arduino.cpp +0 -1
  661. esphome/components/uart/uart_component_esp8266.cpp +0 -1
  662. esphome/components/uart/uart_component_esp_idf.cpp +0 -2
  663. esphome/components/uart/uart_component_libretiny.cpp +0 -2
  664. esphome/components/uart/uart_component_rp2040.cpp +0 -2
  665. esphome/components/udp/__init__.py +1 -1
  666. esphome/components/ufire_ec/sensor.py +1 -2
  667. esphome/components/ufire_ec/ufire_ec.cpp +0 -2
  668. esphome/components/ufire_ise/sensor.py +1 -2
  669. esphome/components/ufire_ise/ufire_ise.cpp +0 -2
  670. esphome/components/ultrasonic/ultrasonic_sensor.cpp +0 -1
  671. esphome/components/update/__init__.py +0 -1
  672. esphome/components/uptime/sensor/uptime_seconds_sensor.cpp +0 -1
  673. esphome/components/uptime/sensor/uptime_seconds_sensor.h +0 -2
  674. esphome/components/usb_host/usb_host_client.cpp +0 -1
  675. esphome/components/usb_host/usb_host_component.cpp +0 -1
  676. esphome/components/valve/__init__.py +0 -1
  677. esphome/components/veml3235/veml3235.cpp +0 -3
  678. esphome/components/veml7700/veml7700.cpp +0 -2
  679. esphome/components/version/version_text_sensor.cpp +0 -1
  680. esphome/components/version/version_text_sensor.h +0 -1
  681. esphome/components/vl53l0x/vl53l0x_sensor.cpp +0 -4
  682. esphome/components/voice_assistant/voice_assistant.cpp +9 -8
  683. esphome/components/web_server/__init__.py +13 -0
  684. esphome/components/web_server/web_server.cpp +188 -353
  685. esphome/components/web_server/web_server.h +61 -1
  686. esphome/components/web_server_base/__init__.py +1 -1
  687. esphome/components/web_server_base/web_server_base.cpp +2 -0
  688. esphome/components/web_server_base/web_server_base.h +6 -0
  689. esphome/components/web_server_idf/web_server_idf.cpp +10 -8
  690. esphome/components/web_server_idf/web_server_idf.h +2 -0
  691. esphome/components/weikai_i2c/weikai_i2c.cpp +1 -2
  692. esphome/components/weikai_spi/weikai_spi.cpp +1 -1
  693. esphome/components/wifi/__init__.py +17 -43
  694. esphome/components/wifi/wifi_component.cpp +100 -36
  695. esphome/components/wifi/wifi_component.h +5 -1
  696. esphome/components/wifi/wifi_component_esp32_arduino.cpp +30 -0
  697. esphome/components/wifi/wifi_component_esp_idf.cpp +30 -0
  698. esphome/components/wifi_info/wifi_info_text_sensor.h +0 -6
  699. esphome/components/wifi_signal/wifi_signal_sensor.h +0 -1
  700. esphome/components/wireguard/wireguard.cpp +0 -2
  701. esphome/components/x9c/x9c.cpp +0 -2
  702. esphome/components/xgzp68xx/xgzp68xx.cpp +0 -1
  703. esphome/components/xl9535/xl9535.cpp +0 -2
  704. esphome/components/zephyr/__init__.py +252 -0
  705. esphome/components/zephyr/const.py +16 -0
  706. esphome/components/zephyr/core.cpp +90 -0
  707. esphome/components/zephyr/gpio.cpp +120 -0
  708. esphome/components/zephyr/gpio.h +38 -0
  709. esphome/components/zephyr/pre_build.py.script +4 -0
  710. esphome/components/zephyr/preferences.cpp +156 -0
  711. esphome/components/zephyr/preferences.h +13 -0
  712. esphome/config.py +38 -16
  713. esphome/config_helpers.py +1 -2
  714. esphome/config_validation.py +12 -16
  715. esphome/const.py +26 -1
  716. esphome/core/__init__.py +92 -51
  717. esphome/core/application.cpp +75 -21
  718. esphome/core/application.h +106 -171
  719. esphome/core/color.h +10 -0
  720. esphome/core/component.cpp +41 -25
  721. esphome/core/component.h +9 -6
  722. esphome/core/component_iterator.cpp +61 -261
  723. esphome/core/component_iterator.h +15 -0
  724. esphome/core/config.py +26 -11
  725. esphome/core/defines.h +40 -2
  726. esphome/core/entity_base.h +18 -0
  727. esphome/core/entity_helpers.py +45 -10
  728. esphome/core/helpers.cpp +8 -15
  729. esphome/core/helpers.h +60 -6
  730. esphome/core/lock_free_queue.h +1 -1
  731. esphome/core/scheduler.cpp +311 -77
  732. esphome/core/scheduler.h +141 -28
  733. esphome/cpp_generator.py +2 -6
  734. esphome/cpp_helpers.py +1 -1
  735. esphome/dashboard/dashboard.py +2 -3
  736. esphome/dashboard/dns.py +2 -8
  737. esphome/dashboard/web_server.py +34 -19
  738. esphome/espota2.py +1 -4
  739. esphome/git.py +3 -1
  740. esphome/helpers.py +23 -4
  741. esphome/log.py +3 -1
  742. esphome/mqtt.py +3 -5
  743. esphome/platformio_api.py +7 -4
  744. esphome/types.py +12 -0
  745. esphome/util.py +20 -8
  746. esphome/voluptuous_schema.py +4 -3
  747. esphome/vscode.py +1 -2
  748. esphome/wizard.py +1 -4
  749. esphome/writer.py +16 -108
  750. esphome/yaml_util.py +7 -5
  751. {esphome-2025.7.4.dist-info → esphome-2025.8.0.dist-info}/METADATA +13 -14
  752. {esphome-2025.7.4.dist-info → esphome-2025.8.0.dist-info}/RECORD +757 -677
  753. esphome/components/mipi_spi/models/commands.py +0 -82
  754. /esphome/components/nfc/binary_sensor/{binary_sensor.h → nfc_binary_sensor.h} +0 -0
  755. {esphome-2025.7.4.dist-info → esphome-2025.8.0.dist-info}/WHEEL +0 -0
  756. {esphome-2025.7.4.dist-info → esphome-2025.8.0.dist-info}/entry_points.txt +0 -0
  757. {esphome-2025.7.4.dist-info → esphome-2025.8.0.dist-info}/licenses/LICENSE +0 -0
  758. {esphome-2025.7.4.dist-info → esphome-2025.8.0.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,207 @@
1
+
2
+ #include "adc_sensor.h"
3
+ #ifdef USE_ZEPHYR
4
+ #include "esphome/core/log.h"
5
+
6
+ #include "hal/nrf_saadc.h"
7
+
8
+ namespace esphome {
9
+ namespace adc {
10
+
11
+ static const char *const TAG = "adc.zephyr";
12
+
13
+ void ADCSensor::setup() {
14
+ if (!adc_is_ready_dt(this->channel_)) {
15
+ ESP_LOGE(TAG, "ADC controller device %s not ready", this->channel_->dev->name);
16
+ return;
17
+ }
18
+
19
+ auto err = adc_channel_setup_dt(this->channel_);
20
+ if (err < 0) {
21
+ ESP_LOGE(TAG, "Could not setup channel %s (%d)", this->channel_->dev->name, err);
22
+ return;
23
+ }
24
+ }
25
+
26
+ #if ESPHOME_LOG_LEVEL >= ESPHOME_LOG_LEVEL_VERBOSE
27
+ static const LogString *gain_to_str(enum adc_gain gain) {
28
+ switch (gain) {
29
+ case ADC_GAIN_1_6:
30
+ return LOG_STR("1/6");
31
+ case ADC_GAIN_1_5:
32
+ return LOG_STR("1/5");
33
+ case ADC_GAIN_1_4:
34
+ return LOG_STR("1/4");
35
+ case ADC_GAIN_1_3:
36
+ return LOG_STR("1/3");
37
+ case ADC_GAIN_2_5:
38
+ return LOG_STR("2/5");
39
+ case ADC_GAIN_1_2:
40
+ return LOG_STR("1/2");
41
+ case ADC_GAIN_2_3:
42
+ return LOG_STR("2/3");
43
+ case ADC_GAIN_4_5:
44
+ return LOG_STR("4/5");
45
+ case ADC_GAIN_1:
46
+ return LOG_STR("1");
47
+ case ADC_GAIN_2:
48
+ return LOG_STR("2");
49
+ case ADC_GAIN_3:
50
+ return LOG_STR("3");
51
+ case ADC_GAIN_4:
52
+ return LOG_STR("4");
53
+ case ADC_GAIN_6:
54
+ return LOG_STR("6");
55
+ case ADC_GAIN_8:
56
+ return LOG_STR("8");
57
+ case ADC_GAIN_12:
58
+ return LOG_STR("12");
59
+ case ADC_GAIN_16:
60
+ return LOG_STR("16");
61
+ case ADC_GAIN_24:
62
+ return LOG_STR("24");
63
+ case ADC_GAIN_32:
64
+ return LOG_STR("32");
65
+ case ADC_GAIN_64:
66
+ return LOG_STR("64");
67
+ case ADC_GAIN_128:
68
+ return LOG_STR("128");
69
+ }
70
+ return LOG_STR("undefined gain");
71
+ }
72
+
73
+ static const LogString *reference_to_str(enum adc_reference reference) {
74
+ switch (reference) {
75
+ case ADC_REF_VDD_1:
76
+ return LOG_STR("VDD");
77
+ case ADC_REF_VDD_1_2:
78
+ return LOG_STR("VDD/2");
79
+ case ADC_REF_VDD_1_3:
80
+ return LOG_STR("VDD/3");
81
+ case ADC_REF_VDD_1_4:
82
+ return LOG_STR("VDD/4");
83
+ case ADC_REF_INTERNAL:
84
+ return LOG_STR("INTERNAL");
85
+ case ADC_REF_EXTERNAL0:
86
+ return LOG_STR("External, input 0");
87
+ case ADC_REF_EXTERNAL1:
88
+ return LOG_STR("External, input 1");
89
+ }
90
+ return LOG_STR("undefined reference");
91
+ }
92
+
93
+ static const LogString *input_to_str(uint8_t input) {
94
+ switch (input) {
95
+ case NRF_SAADC_INPUT_AIN0:
96
+ return LOG_STR("AIN0");
97
+ case NRF_SAADC_INPUT_AIN1:
98
+ return LOG_STR("AIN1");
99
+ case NRF_SAADC_INPUT_AIN2:
100
+ return LOG_STR("AIN2");
101
+ case NRF_SAADC_INPUT_AIN3:
102
+ return LOG_STR("AIN3");
103
+ case NRF_SAADC_INPUT_AIN4:
104
+ return LOG_STR("AIN4");
105
+ case NRF_SAADC_INPUT_AIN5:
106
+ return LOG_STR("AIN5");
107
+ case NRF_SAADC_INPUT_AIN6:
108
+ return LOG_STR("AIN6");
109
+ case NRF_SAADC_INPUT_AIN7:
110
+ return LOG_STR("AIN7");
111
+ case NRF_SAADC_INPUT_VDD:
112
+ return LOG_STR("VDD");
113
+ case NRF_SAADC_INPUT_VDDHDIV5:
114
+ return LOG_STR("VDDHDIV5");
115
+ }
116
+ return LOG_STR("undefined input");
117
+ }
118
+ #endif // ESPHOME_LOG_LEVEL >= ESPHOME_LOG_LEVEL_VERBOSE
119
+
120
+ void ADCSensor::dump_config() {
121
+ LOG_SENSOR("", "ADC Sensor", this);
122
+ LOG_PIN(" Pin: ", this->pin_);
123
+ #if ESPHOME_LOG_LEVEL >= ESPHOME_LOG_LEVEL_VERBOSE
124
+ ESP_LOGV(TAG,
125
+ " Name: %s\n"
126
+ " Channel: %d\n"
127
+ " vref_mv: %d\n"
128
+ " Resolution %d\n"
129
+ " Oversampling %d",
130
+ this->channel_->dev->name, this->channel_->channel_id, this->channel_->vref_mv, this->channel_->resolution,
131
+ this->channel_->oversampling);
132
+
133
+ ESP_LOGV(TAG,
134
+ " Gain: %s\n"
135
+ " reference: %s\n"
136
+ " acquisition_time: %d\n"
137
+ " differential %s",
138
+ LOG_STR_ARG(gain_to_str(this->channel_->channel_cfg.gain)),
139
+ LOG_STR_ARG(reference_to_str(this->channel_->channel_cfg.reference)),
140
+ this->channel_->channel_cfg.acquisition_time, YESNO(this->channel_->channel_cfg.differential));
141
+ if (this->channel_->channel_cfg.differential) {
142
+ ESP_LOGV(TAG,
143
+ " Positive: %s\n"
144
+ " Negative: %s",
145
+ LOG_STR_ARG(input_to_str(this->channel_->channel_cfg.input_positive)),
146
+ LOG_STR_ARG(input_to_str(this->channel_->channel_cfg.input_negative)));
147
+ } else {
148
+ ESP_LOGV(TAG, " Positive: %s", LOG_STR_ARG(input_to_str(this->channel_->channel_cfg.input_positive)));
149
+ }
150
+ #endif
151
+
152
+ LOG_UPDATE_INTERVAL(this);
153
+ }
154
+
155
+ float ADCSensor::sample() {
156
+ auto aggr = Aggregator<int32_t>(this->sampling_mode_);
157
+ int err;
158
+ for (uint8_t sample = 0; sample < this->sample_count_; sample++) {
159
+ int16_t buf = 0;
160
+ struct adc_sequence sequence = {
161
+ .buffer = &buf,
162
+ /* buffer size in bytes, not number of samples */
163
+ .buffer_size = sizeof(buf),
164
+ };
165
+ int32_t val_raw;
166
+
167
+ err = adc_sequence_init_dt(this->channel_, &sequence);
168
+ if (err < 0) {
169
+ ESP_LOGE(TAG, "Could sequence init %s (%d)", this->channel_->dev->name, err);
170
+ return 0.0;
171
+ }
172
+
173
+ err = adc_read(this->channel_->dev, &sequence);
174
+ if (err < 0) {
175
+ ESP_LOGE(TAG, "Could not read %s (%d)", this->channel_->dev->name, err);
176
+ return 0.0;
177
+ }
178
+
179
+ val_raw = (int32_t) buf;
180
+ if (!this->channel_->channel_cfg.differential) {
181
+ // https://github.com/adafruit/Adafruit_nRF52_Arduino/blob/0ed4d9ffc674ae407be7cacf5696a02f5e789861/cores/nRF5/wiring_analog_nRF52.c#L222
182
+ if (val_raw < 0) {
183
+ val_raw = 0;
184
+ }
185
+ }
186
+ aggr.add_sample(val_raw);
187
+ }
188
+
189
+ int32_t val_mv = aggr.aggregate();
190
+
191
+ if (this->output_raw_) {
192
+ return val_mv;
193
+ }
194
+
195
+ err = adc_raw_to_millivolts_dt(this->channel_, &val_mv);
196
+ /* conversion to mV may not be supported, skip if not */
197
+ if (err < 0) {
198
+ ESP_LOGE(TAG, "Value in mV not available %s (%d)", this->channel_->dev->name, err);
199
+ return 0.0;
200
+ }
201
+
202
+ return val_mv / 1000.0f;
203
+ }
204
+
205
+ } // namespace adc
206
+ } // namespace esphome
207
+ #endif
@@ -3,6 +3,12 @@ import logging
3
3
  import esphome.codegen as cg
4
4
  from esphome.components import sensor, voltage_sampler
5
5
  from esphome.components.esp32 import get_esp32_variant
6
+ from esphome.components.nrf52.const import AIN_TO_GPIO, EXTRA_ADC
7
+ from esphome.components.zephyr import (
8
+ zephyr_add_overlay,
9
+ zephyr_add_prj_conf,
10
+ zephyr_add_user,
11
+ )
6
12
  import esphome.config_validation as cv
7
13
  from esphome.const import (
8
14
  CONF_ATTENUATION,
@@ -10,13 +16,12 @@ from esphome.const import (
10
16
  CONF_NUMBER,
11
17
  CONF_PIN,
12
18
  CONF_RAW,
13
- CONF_WIFI,
14
19
  DEVICE_CLASS_VOLTAGE,
20
+ PLATFORM_NRF52,
15
21
  STATE_CLASS_MEASUREMENT,
16
22
  UNIT_VOLT,
17
23
  )
18
24
  from esphome.core import CORE
19
- import esphome.final_validate as fv
20
25
 
21
26
  from . import (
22
27
  ATTENUATION_MODES,
@@ -24,6 +29,7 @@ from . import (
24
29
  ESP32_VARIANT_ADC2_PIN_TO_CHANNEL,
25
30
  SAMPLING_MODES,
26
31
  adc_ns,
32
+ adc_unit_t,
27
33
  validate_adc_pin,
28
34
  )
29
35
 
@@ -57,25 +63,14 @@ def validate_config(config):
57
63
  return config
58
64
 
59
65
 
60
- def final_validate_config(config):
61
- if CORE.is_esp32:
62
- variant = get_esp32_variant()
63
- if (
64
- CONF_WIFI in fv.full_config.get()
65
- and config[CONF_PIN][CONF_NUMBER]
66
- in ESP32_VARIANT_ADC2_PIN_TO_CHANNEL[variant]
67
- ):
68
- raise cv.Invalid(
69
- f"{variant} doesn't support ADC on this pin when Wi-Fi is configured"
70
- )
71
-
72
- return config
73
-
74
-
75
66
  ADCSensor = adc_ns.class_(
76
67
  "ADCSensor", sensor.Sensor, cg.PollingComponent, voltage_sampler.VoltageSampler
77
68
  )
78
69
 
70
+ CONF_NRF_SAADC = "nrf_saadc"
71
+
72
+ adc_dt_spec = cg.global_ns.class_("adc_dt_spec")
73
+
79
74
  CONFIG_SCHEMA = cv.All(
80
75
  sensor.sensor_schema(
81
76
  ADCSensor,
@@ -91,6 +86,7 @@ CONFIG_SCHEMA = cv.All(
91
86
  cv.SplitDefault(CONF_ATTENUATION, esp32="0db"): cv.All(
92
87
  cv.only_on_esp32, _attenuation
93
88
  ),
89
+ cv.OnlyWith(CONF_NRF_SAADC, PLATFORM_NRF52): cv.declare_id(adc_dt_spec),
94
90
  cv.Optional(CONF_SAMPLES, default=1): cv.int_range(min=1, max=255),
95
91
  cv.Optional(CONF_SAMPLING_MODE, default="avg"): _sampling_mode,
96
92
  }
@@ -99,7 +95,7 @@ CONFIG_SCHEMA = cv.All(
99
95
  validate_config,
100
96
  )
101
97
 
102
- FINAL_VALIDATE_SCHEMA = final_validate_config
98
+ CONF_ADC_CHANNEL_ID = "adc_channel_id"
103
99
 
104
100
 
105
101
  async def to_code(config):
@@ -111,7 +107,7 @@ async def to_code(config):
111
107
  cg.add_define("USE_ADC_SENSOR_VCC")
112
108
  elif config[CONF_PIN] == "TEMPERATURE":
113
109
  cg.add(var.set_is_temperature())
114
- else:
110
+ elif not CORE.is_nrf52 or config[CONF_PIN][CONF_NUMBER] not in EXTRA_ADC:
115
111
  pin = await cg.gpio_pin_expression(config[CONF_PIN])
116
112
  cg.add(var.set_pin(pin))
117
113
 
@@ -119,13 +115,13 @@ async def to_code(config):
119
115
  cg.add(var.set_sample_count(config[CONF_SAMPLES]))
120
116
  cg.add(var.set_sampling_mode(config[CONF_SAMPLING_MODE]))
121
117
 
122
- if attenuation := config.get(CONF_ATTENUATION):
123
- if attenuation == "auto":
124
- cg.add(var.set_autorange(cg.global_ns.true))
125
- else:
126
- cg.add(var.set_attenuation(attenuation))
127
-
128
118
  if CORE.is_esp32:
119
+ if attenuation := config.get(CONF_ATTENUATION):
120
+ if attenuation == "auto":
121
+ cg.add(var.set_autorange(cg.global_ns.true))
122
+ else:
123
+ cg.add(var.set_attenuation(attenuation))
124
+
129
125
  variant = get_esp32_variant()
130
126
  pin_num = config[CONF_PIN][CONF_NUMBER]
131
127
  if (
@@ -133,10 +129,48 @@ async def to_code(config):
133
129
  and pin_num in ESP32_VARIANT_ADC1_PIN_TO_CHANNEL[variant]
134
130
  ):
135
131
  chan = ESP32_VARIANT_ADC1_PIN_TO_CHANNEL[variant][pin_num]
136
- cg.add(var.set_channel1(chan))
132
+ cg.add(var.set_channel(adc_unit_t.ADC_UNIT_1, chan))
137
133
  elif (
138
134
  variant in ESP32_VARIANT_ADC2_PIN_TO_CHANNEL
139
135
  and pin_num in ESP32_VARIANT_ADC2_PIN_TO_CHANNEL[variant]
140
136
  ):
141
137
  chan = ESP32_VARIANT_ADC2_PIN_TO_CHANNEL[variant][pin_num]
142
- cg.add(var.set_channel2(chan))
138
+ cg.add(var.set_channel(adc_unit_t.ADC_UNIT_2, chan))
139
+
140
+ elif CORE.is_nrf52:
141
+ CORE.data.setdefault(CONF_ADC_CHANNEL_ID, 0)
142
+ channel_id = CORE.data[CONF_ADC_CHANNEL_ID]
143
+ CORE.data[CONF_ADC_CHANNEL_ID] = channel_id + 1
144
+ zephyr_add_prj_conf("ADC", True)
145
+ nrf_saadc = config[CONF_NRF_SAADC]
146
+ rhs = cg.RawExpression(
147
+ f"ADC_DT_SPEC_GET_BY_IDX(DT_PATH(zephyr_user), {channel_id})"
148
+ )
149
+ adc = cg.new_Pvariable(nrf_saadc, rhs)
150
+ cg.add(var.set_adc_channel(adc))
151
+ gain = "ADC_GAIN_1_6"
152
+ pin_number = config[CONF_PIN][CONF_NUMBER]
153
+ if pin_number == "VDDHDIV5":
154
+ gain = "ADC_GAIN_1_2"
155
+ if isinstance(pin_number, int):
156
+ GPIO_TO_AIN = {v: k for k, v in AIN_TO_GPIO.items()}
157
+ pin_number = GPIO_TO_AIN[pin_number]
158
+ zephyr_add_user("io-channels", f"<&adc {channel_id}>")
159
+ zephyr_add_overlay(
160
+ f"""
161
+ &adc {{
162
+ #address-cells = <1>;
163
+ #size-cells = <0>;
164
+
165
+ channel@{channel_id} {{
166
+ reg = <{channel_id}>;
167
+ zephyr,gain = "{gain}";
168
+ zephyr,reference = "ADC_REF_INTERNAL";
169
+ zephyr,acquisition-time = <ADC_ACQ_TIME_DEFAULT>;
170
+ zephyr,input-positive = <NRF_SAADC_{pin_number}>;
171
+ zephyr,resolution = <14>;
172
+ zephyr,oversampling = <8>;
173
+ }};
174
+ }};
175
+ """
176
+ )
@@ -8,10 +8,7 @@ static const char *const TAG = "adc128s102";
8
8
 
9
9
  float ADC128S102::get_setup_priority() const { return setup_priority::HARDWARE; }
10
10
 
11
- void ADC128S102::setup() {
12
- ESP_LOGCONFIG(TAG, "Running setup");
13
- this->spi_setup();
14
- }
11
+ void ADC128S102::setup() { this->spi_setup(); }
15
12
 
16
13
  void ADC128S102::dump_config() {
17
14
  ESP_LOGCONFIG(TAG, "ADC128S102:");
@@ -36,6 +36,7 @@ from esphome.const import (
36
36
  UNIT_WATT,
37
37
  UNIT_WATT_HOURS,
38
38
  )
39
+ from esphome.types import ConfigType
39
40
 
40
41
  DEPENDENCIES = ["i2c"]
41
42
 
@@ -51,6 +52,20 @@ CONF_POWER_GAIN = "power_gain"
51
52
 
52
53
  CONF_NEUTRAL = "neutral"
53
54
 
55
+ # Tuple of power channel phases
56
+ POWER_PHASES = (CONF_PHASE_A, CONF_PHASE_B, CONF_PHASE_C)
57
+
58
+ # Tuple of sensor types that can be configured for power channels
59
+ POWER_SENSOR_TYPES = (
60
+ CONF_CURRENT,
61
+ CONF_VOLTAGE,
62
+ CONF_ACTIVE_POWER,
63
+ CONF_APPARENT_POWER,
64
+ CONF_POWER_FACTOR,
65
+ CONF_FORWARD_ACTIVE_ENERGY,
66
+ CONF_REVERSE_ACTIVE_ENERGY,
67
+ )
68
+
54
69
  NEUTRAL_CHANNEL_SCHEMA = cv.Schema(
55
70
  {
56
71
  cv.GenerateID(): cv.declare_id(NeutralChannel),
@@ -150,7 +165,64 @@ POWER_CHANNEL_SCHEMA = cv.Schema(
150
165
  }
151
166
  )
152
167
 
153
- CONFIG_SCHEMA = (
168
+
169
+ def prefix_sensor_name(
170
+ sensor_conf: ConfigType,
171
+ channel_name: str,
172
+ channel_config: ConfigType,
173
+ sensor_type: str,
174
+ ) -> None:
175
+ """Helper to prefix sensor name with channel name.
176
+
177
+ Args:
178
+ sensor_conf: The sensor configuration (dict or string)
179
+ channel_name: The channel name to prefix with
180
+ channel_config: The channel configuration to update
181
+ sensor_type: The sensor type key in the channel config
182
+ """
183
+ if isinstance(sensor_conf, dict) and CONF_NAME in sensor_conf:
184
+ sensor_name = sensor_conf[CONF_NAME]
185
+ if sensor_name and not sensor_name.startswith(channel_name):
186
+ sensor_conf[CONF_NAME] = f"{channel_name} {sensor_name}"
187
+ elif isinstance(sensor_conf, str):
188
+ # Simple value case - convert to dict with prefixed name
189
+ channel_config[sensor_type] = {CONF_NAME: f"{channel_name} {sensor_conf}"}
190
+
191
+
192
+ def process_channel_sensors(
193
+ config: ConfigType, channel_key: str, sensor_types: tuple
194
+ ) -> None:
195
+ """Process sensors for a channel and prefix their names.
196
+
197
+ Args:
198
+ config: The main configuration
199
+ channel_key: The channel key (e.g., CONF_PHASE_A, CONF_NEUTRAL)
200
+ sensor_types: Tuple of sensor types to process for this channel
201
+ """
202
+ if not (channel_config := config.get(channel_key)) or not (
203
+ channel_name := channel_config.get(CONF_NAME)
204
+ ):
205
+ return
206
+
207
+ for sensor_type in sensor_types:
208
+ if sensor_conf := channel_config.get(sensor_type):
209
+ prefix_sensor_name(sensor_conf, channel_name, channel_config, sensor_type)
210
+
211
+
212
+ def preprocess_channels(config: ConfigType) -> ConfigType:
213
+ """Preprocess channel configurations to add channel name prefix to sensor names."""
214
+ # Process power channels
215
+ for channel in POWER_PHASES:
216
+ process_channel_sensors(config, channel, POWER_SENSOR_TYPES)
217
+
218
+ # Process neutral channel
219
+ process_channel_sensors(config, CONF_NEUTRAL, (CONF_CURRENT,))
220
+
221
+ return config
222
+
223
+
224
+ CONFIG_SCHEMA = cv.All(
225
+ preprocess_channels,
154
226
  cv.Schema(
155
227
  {
156
228
  cv.GenerateID(): cv.declare_id(ADE7880),
@@ -167,7 +239,7 @@ CONFIG_SCHEMA = (
167
239
  }
168
240
  )
169
241
  .extend(cv.polling_component_schema("60s"))
170
- .extend(i2c.i2c_device_schema(0x38))
242
+ .extend(i2c.i2c_device_schema(0x38)),
171
243
  )
172
244
 
173
245
 
@@ -188,15 +260,7 @@ async def neutral_channel(config):
188
260
  async def power_channel(config):
189
261
  var = cg.new_Pvariable(config[CONF_ID])
190
262
 
191
- for sensor_type in [
192
- CONF_CURRENT,
193
- CONF_VOLTAGE,
194
- CONF_ACTIVE_POWER,
195
- CONF_APPARENT_POWER,
196
- CONF_POWER_FACTOR,
197
- CONF_FORWARD_ACTIVE_ENERGY,
198
- CONF_REVERSE_ACTIVE_ENERGY,
199
- ]:
263
+ for sensor_type in POWER_SENSOR_TYPES:
200
264
  if conf := config.get(sensor_type):
201
265
  sens = await sensor.new_sensor(conf)
202
266
  cg.add(getattr(var, f"set_{sensor_type}")(sens))
@@ -216,44 +280,6 @@ async def power_channel(config):
216
280
  return var
217
281
 
218
282
 
219
- def final_validate(config):
220
- for channel in [CONF_PHASE_A, CONF_PHASE_B, CONF_PHASE_C]:
221
- if channel := config.get(channel):
222
- channel_name = channel.get(CONF_NAME)
223
-
224
- for sensor_type in [
225
- CONF_CURRENT,
226
- CONF_VOLTAGE,
227
- CONF_ACTIVE_POWER,
228
- CONF_APPARENT_POWER,
229
- CONF_POWER_FACTOR,
230
- CONF_FORWARD_ACTIVE_ENERGY,
231
- CONF_REVERSE_ACTIVE_ENERGY,
232
- ]:
233
- if conf := channel.get(sensor_type):
234
- sensor_name = conf.get(CONF_NAME)
235
- if (
236
- sensor_name
237
- and channel_name
238
- and not sensor_name.startswith(channel_name)
239
- ):
240
- conf[CONF_NAME] = f"{channel_name} {sensor_name}"
241
-
242
- if channel := config.get(CONF_NEUTRAL):
243
- channel_name = channel.get(CONF_NAME)
244
- if conf := channel.get(CONF_CURRENT):
245
- sensor_name = conf.get(CONF_NAME)
246
- if (
247
- sensor_name
248
- and channel_name
249
- and not sensor_name.startswith(channel_name)
250
- ):
251
- conf[CONF_NAME] = f"{channel_name} {sensor_name}"
252
-
253
-
254
- FINAL_VALIDATE_SCHEMA = final_validate
255
-
256
-
257
283
  async def to_code(config):
258
284
  var = cg.new_Pvariable(config[CONF_ID])
259
285
  await cg.register_component(var, config)
@@ -10,7 +10,6 @@ static const uint8_t ADS1115_REGISTER_CONVERSION = 0x00;
10
10
  static const uint8_t ADS1115_REGISTER_CONFIG = 0x01;
11
11
 
12
12
  void ADS1115Component::setup() {
13
- ESP_LOGCONFIG(TAG, "Running setup");
14
13
  uint16_t value;
15
14
  if (!this->read_byte_16(ADS1115_REGISTER_CONVERSION, &value)) {
16
15
  this->mark_failed();
@@ -9,7 +9,6 @@ static const char *const TAG = "ads1118";
9
9
  static const uint8_t ADS1118_DATA_RATE_860_SPS = 0b111;
10
10
 
11
11
  void ADS1118::setup() {
12
- ESP_LOGCONFIG(TAG, "Running setup");
13
12
  this->spi_setup();
14
13
 
15
14
  this->config_ = 0;
@@ -24,8 +24,6 @@ static const uint16_t ZP_CURRENT = 0x0000;
24
24
  static const uint16_t ZP_DEFAULT = 0xFFFF;
25
25
 
26
26
  void AGS10Component::setup() {
27
- ESP_LOGCONFIG(TAG, "Running setup");
28
-
29
27
  auto version = this->read_version_();
30
28
  if (version) {
31
29
  ESP_LOGD(TAG, "AGS10 Sensor Version: 0x%02X", *version);
@@ -45,8 +43,6 @@ void AGS10Component::setup() {
45
43
  } else {
46
44
  ESP_LOGE(TAG, "AGS10 Sensor Resistance: unknown");
47
45
  }
48
-
49
- ESP_LOGD(TAG, "Sensor initialized");
50
46
  }
51
47
 
52
48
  void AGS10Component::update() {
@@ -38,8 +38,6 @@ static const uint8_t AHT10_STATUS_BUSY = 0x80;
38
38
  static const float AHT10_DIVISOR = 1048576.0f; // 2^20, used for temperature and humidity calculations
39
39
 
40
40
  void AHT10Component::setup() {
41
- ESP_LOGCONFIG(TAG, "Running setup");
42
-
43
41
  if (this->write(AHT10_SOFTRESET_CMD, sizeof(AHT10_SOFTRESET_CMD)) != i2c::ERROR_OK) {
44
42
  ESP_LOGE(TAG, "Reset failed");
45
43
  }
@@ -80,8 +78,6 @@ void AHT10Component::setup() {
80
78
  this->mark_failed();
81
79
  return;
82
80
  }
83
-
84
- ESP_LOGV(TAG, "Initialization complete");
85
81
  }
86
82
 
87
83
  void AHT10Component::restart_read_() {
@@ -17,8 +17,6 @@ static const char *const TAG = "aic3204";
17
17
  }
18
18
 
19
19
  void AIC3204::setup() {
20
- ESP_LOGCONFIG(TAG, "Running setup");
21
-
22
20
  // Set register page to 0
23
21
  ERROR_CHECK(this->write_byte(AIC3204_PAGE_CTRL, 0x00), "Set page 0 failed");
24
22
  // Initiate SW reset (PLL is powered off as part of reset)
@@ -1 +1 @@
1
- CODEOWNERS = ["@jeromelaban"]
1
+ CODEOWNERS = ["@jeromelaban", "@precurse"]
@@ -73,11 +73,29 @@ void AirthingsWavePlus::dump_config() {
73
73
  LOG_SENSOR(" ", "Illuminance", this->illuminance_sensor_);
74
74
  }
75
75
 
76
- AirthingsWavePlus::AirthingsWavePlus() {
77
- this->service_uuid_ = espbt::ESPBTUUID::from_raw(SERVICE_UUID);
78
- this->sensors_data_characteristic_uuid_ = espbt::ESPBTUUID::from_raw(CHARACTERISTIC_UUID);
76
+ void AirthingsWavePlus::setup() {
77
+ const char *service_uuid;
78
+ const char *characteristic_uuid;
79
+ const char *access_control_point_characteristic_uuid;
80
+
81
+ // Change UUIDs for Wave Radon Gen2
82
+ switch (this->wave_device_type_) {
83
+ case WaveDeviceType::WAVE_GEN2:
84
+ service_uuid = SERVICE_UUID_WAVE_RADON_GEN2;
85
+ characteristic_uuid = CHARACTERISTIC_UUID_WAVE_RADON_GEN2;
86
+ access_control_point_characteristic_uuid = ACCESS_CONTROL_POINT_CHARACTERISTIC_UUID_WAVE_RADON_GEN2;
87
+ break;
88
+ default:
89
+ // Wave Plus
90
+ service_uuid = SERVICE_UUID;
91
+ characteristic_uuid = CHARACTERISTIC_UUID;
92
+ access_control_point_characteristic_uuid = ACCESS_CONTROL_POINT_CHARACTERISTIC_UUID;
93
+ }
94
+
95
+ this->service_uuid_ = espbt::ESPBTUUID::from_raw(service_uuid);
96
+ this->sensors_data_characteristic_uuid_ = espbt::ESPBTUUID::from_raw(characteristic_uuid);
79
97
  this->access_control_point_characteristic_uuid_ =
80
- espbt::ESPBTUUID::from_raw(ACCESS_CONTROL_POINT_CHARACTERISTIC_UUID);
98
+ espbt::ESPBTUUID::from_raw(access_control_point_characteristic_uuid);
81
99
  }
82
100
 
83
101
  } // namespace airthings_wave_plus
@@ -9,13 +9,20 @@ namespace airthings_wave_plus {
9
9
 
10
10
  namespace espbt = esphome::esp32_ble_tracker;
11
11
 
12
+ enum WaveDeviceType : uint8_t { WAVE_PLUS = 0, WAVE_GEN2 = 1 };
13
+
12
14
  static const char *const SERVICE_UUID = "b42e1c08-ade7-11e4-89d3-123b93f75cba";
13
15
  static const char *const CHARACTERISTIC_UUID = "b42e2a68-ade7-11e4-89d3-123b93f75cba";
14
16
  static const char *const ACCESS_CONTROL_POINT_CHARACTERISTIC_UUID = "b42e2d06-ade7-11e4-89d3-123b93f75cba";
15
17
 
18
+ static const char *const SERVICE_UUID_WAVE_RADON_GEN2 = "b42e4a8e-ade7-11e4-89d3-123b93f75cba";
19
+ static const char *const CHARACTERISTIC_UUID_WAVE_RADON_GEN2 = "b42e4dcc-ade7-11e4-89d3-123b93f75cba";
20
+ static const char *const ACCESS_CONTROL_POINT_CHARACTERISTIC_UUID_WAVE_RADON_GEN2 =
21
+ "b42e50d8-ade7-11e4-89d3-123b93f75cba";
22
+
16
23
  class AirthingsWavePlus : public airthings_wave_base::AirthingsWaveBase {
17
24
  public:
18
- AirthingsWavePlus();
25
+ void setup() override;
19
26
 
20
27
  void dump_config() override;
21
28
 
@@ -23,12 +30,14 @@ class AirthingsWavePlus : public airthings_wave_base::AirthingsWaveBase {
23
30
  void set_radon_long_term(sensor::Sensor *radon_long_term) { radon_long_term_sensor_ = radon_long_term; }
24
31
  void set_co2(sensor::Sensor *co2) { co2_sensor_ = co2; }
25
32
  void set_illuminance(sensor::Sensor *illuminance) { illuminance_sensor_ = illuminance; }
33
+ void set_device_type(WaveDeviceType wave_device_type) { wave_device_type_ = wave_device_type; }
26
34
 
27
35
  protected:
28
36
  bool is_valid_radon_value_(uint16_t radon);
29
37
  bool is_valid_co2_value_(uint16_t co2);
30
38
 
31
39
  void read_sensors(uint8_t *raw_value, uint16_t value_len) override;
40
+ WaveDeviceType wave_device_type_{WaveDeviceType::WAVE_PLUS};
32
41
 
33
42
  sensor::Sensor *radon_sensor_{nullptr};
34
43
  sensor::Sensor *radon_long_term_sensor_{nullptr};