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
@@ -2,8 +2,9 @@ import logging
2
2
 
3
3
  from esphome.automation import build_automation, register_action, validate_automation
4
4
  import esphome.codegen as cg
5
- from esphome.components.const import CONF_DRAW_ROUNDING
5
+ from esphome.components.const import CONF_COLOR_DEPTH, CONF_DRAW_ROUNDING
6
6
  from esphome.components.display import Display
7
+ from esphome.components.psram import DOMAIN as PSRAM_DOMAIN
7
8
  import esphome.config_validation as cv
8
9
  from esphome.const import (
9
10
  CONF_AUTO_CLEAR_ENABLED,
@@ -11,6 +12,7 @@ from esphome.const import (
11
12
  CONF_GROUP,
12
13
  CONF_ID,
13
14
  CONF_LAMBDA,
15
+ CONF_LOG_LEVEL,
14
16
  CONF_ON_BOOT,
15
17
  CONF_ON_IDLE,
16
18
  CONF_PAGES,
@@ -185,8 +187,8 @@ def multi_conf_validate(configs: list[dict]):
185
187
  base_config = configs[0]
186
188
  for config in configs[1:]:
187
189
  for item in (
188
- df.CONF_LOG_LEVEL,
189
- df.CONF_COLOR_DEPTH,
190
+ CONF_LOG_LEVEL,
191
+ CONF_COLOR_DEPTH,
190
192
  df.CONF_BYTE_ORDER,
191
193
  df.CONF_TRANSPARENCY_KEY,
192
194
  ):
@@ -201,9 +203,8 @@ def final_validation(configs):
201
203
  multi_conf_validate(configs)
202
204
  global_config = full_config.get()
203
205
  for config in configs:
204
- if pages := config.get(CONF_PAGES):
205
- if all(p[df.CONF_SKIP] for p in pages):
206
- raise cv.Invalid("At least one page must not be skipped")
206
+ if (pages := config.get(CONF_PAGES)) and all(p[df.CONF_SKIP] for p in pages):
207
+ raise cv.Invalid("At least one page must not be skipped")
207
208
  for display_id in config[df.CONF_DISPLAYS]:
208
209
  path = global_config.get_path_for_id(display_id)[:-1]
209
210
  display = global_config.get_config_for_path(path)
@@ -220,7 +221,7 @@ def final_validation(configs):
220
221
  draw_rounding, config[CONF_DRAW_ROUNDING]
221
222
  )
222
223
  buffer_frac = config[CONF_BUFFER_SIZE]
223
- if CORE.is_esp32 and buffer_frac > 0.5 and "psram" not in global_config:
224
+ if CORE.is_esp32 and buffer_frac > 0.5 and PSRAM_DOMAIN not in global_config:
224
225
  LOGGER.warning("buffer_size: may need to be reduced without PSRAM")
225
226
  for image_id in lv_images_used:
226
227
  path = global_config.get_path_for_id(image_id)[:-1]
@@ -269,17 +270,17 @@ async def to_code(configs):
269
270
 
270
271
  add_define(
271
272
  "LV_LOG_LEVEL",
272
- f"LV_LOG_LEVEL_{df.LV_LOG_LEVELS[config_0[df.CONF_LOG_LEVEL]]}",
273
+ f"LV_LOG_LEVEL_{df.LV_LOG_LEVELS[config_0[CONF_LOG_LEVEL]]}",
273
274
  )
274
275
  cg.add_define(
275
276
  "LVGL_LOG_LEVEL",
276
- cg.RawExpression(f"ESPHOME_LOG_LEVEL_{config_0[df.CONF_LOG_LEVEL]}"),
277
+ cg.RawExpression(f"ESPHOME_LOG_LEVEL_{config_0[CONF_LOG_LEVEL]}"),
277
278
  )
278
- add_define("LV_COLOR_DEPTH", config_0[df.CONF_COLOR_DEPTH])
279
+ add_define("LV_COLOR_DEPTH", config_0[CONF_COLOR_DEPTH])
279
280
  for font in helpers.lv_fonts_used:
280
281
  add_define(f"LV_FONT_{font.upper()}")
281
282
 
282
- if config_0[df.CONF_COLOR_DEPTH] == 16:
283
+ if config_0[CONF_COLOR_DEPTH] == 16:
283
284
  add_define(
284
285
  "LV_COLOR_16_SWAP",
285
286
  "1" if config_0[df.CONF_BYTE_ORDER] == "big_endian" else "0",
@@ -416,14 +417,14 @@ LVGL_SCHEMA = cv.All(
416
417
  {
417
418
  cv.GenerateID(CONF_ID): cv.declare_id(LvglComponent),
418
419
  cv.GenerateID(df.CONF_DISPLAYS): display_schema,
419
- cv.Optional(df.CONF_COLOR_DEPTH, default=16): cv.one_of(16),
420
+ cv.Optional(CONF_COLOR_DEPTH, default=16): cv.one_of(16),
420
421
  cv.Optional(
421
422
  df.CONF_DEFAULT_FONT, default="montserrat_14"
422
423
  ): lvalid.lv_font,
423
424
  cv.Optional(df.CONF_FULL_REFRESH, default=False): cv.boolean,
424
425
  cv.Optional(CONF_DRAW_ROUNDING, default=2): cv.positive_int,
425
426
  cv.Optional(CONF_BUFFER_SIZE, default=0): cv.percentage,
426
- cv.Optional(df.CONF_LOG_LEVEL, default="WARN"): cv.one_of(
427
+ cv.Optional(CONF_LOG_LEVEL, default="WARN"): cv.one_of(
427
428
  *df.LV_LOG_LEVELS, upper=True
428
429
  ),
429
430
  cv.Optional(df.CONF_BYTE_ORDER, default="big_endian"): cv.one_of(
@@ -85,8 +85,7 @@ async def action_to_code(
85
85
  async with LambdaContext(parameters=args, where=action_id) as context:
86
86
  for widget in widgets:
87
87
  await action(widget)
88
- var = cg.new_Pvariable(action_id, template_arg, await context.get_lambda())
89
- return var
88
+ return cg.new_Pvariable(action_id, template_arg, await context.get_lambda())
90
89
 
91
90
 
92
91
  async def update_to_code(config, action_id, template_arg, args):
@@ -354,8 +353,7 @@ async def widget_focus(config, action_id, template_arg, args):
354
353
 
355
354
  if config[CONF_FREEZE]:
356
355
  lv.group_focus_freeze(group, True)
357
- var = cg.new_Pvariable(action_id, template_arg, await context.get_lambda())
358
- return var
356
+ return cg.new_Pvariable(action_id, template_arg, await context.get_lambda())
359
357
 
360
358
 
361
359
  @automation.register_action(
@@ -418,7 +418,6 @@ CONF_BUTTONS = "buttons"
418
418
  CONF_BYTE_ORDER = "byte_order"
419
419
  CONF_CHANGE_RATE = "change_rate"
420
420
  CONF_CLOSE_BUTTON = "close_button"
421
- CONF_COLOR_DEPTH = "color_depth"
422
421
  CONF_CONTROL = "control"
423
422
  CONF_DEFAULT_FONT = "default_font"
424
423
  CONF_DEFAULT_GROUP = "default_group"
@@ -457,7 +456,6 @@ CONF_KEYPADS = "keypads"
457
456
  CONF_LAYOUT = "layout"
458
457
  CONF_LEFT_BUTTON = "left_button"
459
458
  CONF_LINE_WIDTH = "line_width"
460
- CONF_LOG_LEVEL = "log_level"
461
459
  CONF_LONG_PRESS_TIME = "long_press_time"
462
460
  CONF_LONG_PRESS_REPEAT_TIME = "long_press_repeat_time"
463
461
  CONF_LVGL_ID = "lvgl_id"
@@ -33,7 +33,7 @@ def validate_printf(value):
33
33
  [cCdiouxXeEfgGaAnpsSZ] # type
34
34
  )
35
35
  """ # noqa
36
- matches = re.findall(cfmt, value[CONF_FORMAT], flags=re.X)
36
+ matches = re.findall(cfmt, value[CONF_FORMAT], flags=re.VERBOSE)
37
37
  if len(matches) != len(value[CONF_ARGS]):
38
38
  raise cv.Invalid(
39
39
  f"Found {len(matches)} printf-patterns ({', '.join(matches)}), but {len(value[CONF_ARGS])} args were given!"
@@ -271,8 +271,7 @@ padding = LValidator(padding_validator, int32, retmapper=literal)
271
271
 
272
272
 
273
273
  def zoom_validator(value):
274
- value = cv.float_range(0.1, 10.0)(value)
275
- return value
274
+ return cv.float_range(0.1, 10.0)(value)
276
275
 
277
276
 
278
277
  def zoom_retmapper(value):
@@ -288,10 +287,14 @@ def angle(value):
288
287
  :param value: The input in the range 0..360
289
288
  :return: An angle in 1/10 degree units.
290
289
  """
291
- return int(cv.float_range(0.0, 360.0)(cv.angle(value)) * 10)
290
+ return cv.float_range(0.0, 360.0)(cv.angle(value))
291
+
292
292
 
293
+ # Validator for angles in LVGL expressed in 1/10 degree units.
294
+ lv_angle = LValidator(angle, uint32, retmapper=lambda x: int(x * 10))
293
295
 
294
- lv_angle = LValidator(angle, uint32)
296
+ # Validator for angles in LVGL expressed in whole degrees
297
+ lv_angle_degrees = LValidator(angle, uint32, retmapper=int)
295
298
 
296
299
 
297
300
  @schema_extractor("one_of")
@@ -434,7 +434,6 @@ LvglComponent::LvglComponent(std::vector<display::Display *> displays, float buf
434
434
  }
435
435
 
436
436
  void LvglComponent::setup() {
437
- ESP_LOGCONFIG(TAG, "LVGL Setup starts");
438
437
  auto *display = this->displays_[0];
439
438
  auto width = display->get_width();
440
439
  auto height = display->get_height();
@@ -452,7 +451,8 @@ void LvglComponent::setup() {
452
451
  if (buffer == nullptr && this->buffer_frac_ == 0) {
453
452
  frac = MIN_BUFFER_FRAC;
454
453
  buffer_pixels /= MIN_BUFFER_FRAC;
455
- buffer = lv_custom_mem_alloc(buf_bytes / MIN_BUFFER_FRAC); // NOLINT
454
+ buf_bytes /= MIN_BUFFER_FRAC;
455
+ buffer = lv_custom_mem_alloc(buf_bytes); // NOLINT
456
456
  }
457
457
  if (buffer == nullptr) {
458
458
  this->status_set_error("Memory allocation failure");
@@ -489,7 +489,6 @@ void LvglComponent::setup() {
489
489
  disp->set_rotation(display::DISPLAY_ROTATION_0_DEGREES);
490
490
  this->show_page(0, LV_SCR_LOAD_ANIM_NONE, 0);
491
491
  lv_disp_trig_activity(this->disp_);
492
- ESP_LOGCONFIG(TAG, "LVGL Setup complete");
493
492
  }
494
493
 
495
494
  void LvglComponent::update() {
@@ -66,8 +66,7 @@ async def style_update_to_code(config, action_id, template_arg, args):
66
66
  async with LambdaContext(parameters=args, where=action_id) as context:
67
67
  await style_set(style, config)
68
68
 
69
- var = cg.new_Pvariable(action_id, template_arg, await context.get_lambda())
70
- return var
69
+ return cg.new_Pvariable(action_id, template_arg, await context.get_lambda())
71
70
 
72
71
 
73
72
  async def theme_to_code(config):
@@ -76,6 +75,7 @@ async def theme_to_code(config):
76
75
  for w_name, style in theme.items():
77
76
  # Work around Python 3.10 bug with nested async comprehensions
78
77
  # With Python 3.11 this could be simplified
78
+ # TODO: Now that we require Python 3.11+, this can be updated to use nested comprehensions
79
79
  styles = {}
80
80
  for part, states in collect_parts(style).items():
81
81
  styles[part] = {
@@ -161,7 +161,7 @@ class WidgetType:
161
161
  """
162
162
  return []
163
163
 
164
- def obj_creator(self, parent: MockObjClass, config: dict):
164
+ async def obj_creator(self, parent: MockObjClass, config: dict):
165
165
  """
166
166
  Create an instance of the widget type
167
167
  :param parent: The parent to which it should be attached
@@ -189,7 +189,7 @@ class Widget:
189
189
  for matrix buttons
190
190
  :return:
191
191
  """
192
- return None
192
+ return
193
193
 
194
194
  def get_max(self):
195
195
  return self.type.get_max(self.config)
@@ -439,7 +439,7 @@ async def widget_to_code(w_cnfig, w_type: WidgetType, parent):
439
439
  :return:
440
440
  """
441
441
  spec: WidgetType = WIDGET_TYPES[w_type]
442
- creator = spec.obj_creator(parent, w_cnfig)
442
+ creator = await spec.obj_creator(parent, w_cnfig)
443
443
  add_lv_use(spec.name)
444
444
  add_lv_use(*spec.get_uses())
445
445
  wid = w_cnfig[CONF_ID]
@@ -20,7 +20,7 @@ from ..defines import (
20
20
  CONF_START_ANGLE,
21
21
  literal,
22
22
  )
23
- from ..lv_validation import angle, get_start_value, lv_float
23
+ from ..lv_validation import get_start_value, lv_angle_degrees, lv_float, lv_int
24
24
  from ..lvcode import lv, lv_expr, lv_obj
25
25
  from ..types import LvNumber, NumberType
26
26
  from . import Widget
@@ -29,11 +29,11 @@ CONF_ARC = "arc"
29
29
  ARC_SCHEMA = cv.Schema(
30
30
  {
31
31
  cv.Optional(CONF_VALUE): lv_float,
32
- cv.Optional(CONF_MIN_VALUE, default=0): cv.int_,
33
- cv.Optional(CONF_MAX_VALUE, default=100): cv.int_,
34
- cv.Optional(CONF_START_ANGLE, default=135): angle,
35
- cv.Optional(CONF_END_ANGLE, default=45): angle,
36
- cv.Optional(CONF_ROTATION, default=0.0): angle,
32
+ cv.Optional(CONF_MIN_VALUE, default=0): lv_int,
33
+ cv.Optional(CONF_MAX_VALUE, default=100): lv_int,
34
+ cv.Optional(CONF_START_ANGLE, default=135): lv_angle_degrees,
35
+ cv.Optional(CONF_END_ANGLE, default=45): lv_angle_degrees,
36
+ cv.Optional(CONF_ROTATION, default=0.0): lv_angle_degrees,
37
37
  cv.Optional(CONF_ADJUSTABLE, default=False): bool,
38
38
  cv.Optional(CONF_MODE, default="NORMAL"): ARC_MODES.one_of,
39
39
  cv.Optional(CONF_CHANGE_RATE, default=720): cv.uint16_t,
@@ -59,11 +59,14 @@ class ArcType(NumberType):
59
59
 
60
60
  async def to_code(self, w: Widget, config):
61
61
  if CONF_MIN_VALUE in config:
62
- lv.arc_set_range(w.obj, config[CONF_MIN_VALUE], config[CONF_MAX_VALUE])
63
- lv.arc_set_bg_angles(
64
- w.obj, config[CONF_START_ANGLE] // 10, config[CONF_END_ANGLE] // 10
65
- )
66
- lv.arc_set_rotation(w.obj, config[CONF_ROTATION] // 10)
62
+ max_value = await lv_int.process(config[CONF_MAX_VALUE])
63
+ min_value = await lv_int.process(config[CONF_MIN_VALUE])
64
+ lv.arc_set_range(w.obj, min_value, max_value)
65
+ start = await lv_angle_degrees.process(config[CONF_START_ANGLE])
66
+ end = await lv_angle_degrees.process(config[CONF_END_ANGLE])
67
+ rotation = await lv_angle_degrees.process(config[CONF_ROTATION])
68
+ lv.arc_set_bg_angles(w.obj, start, end)
69
+ lv.arc_set_rotation(w.obj, rotation)
67
70
  lv.arc_set_mode(w.obj, literal(config[CONF_MODE]))
68
71
  lv.arc_set_change_rate(w.obj, config[CONF_CHANGE_RATE])
69
72
 
@@ -193,7 +193,7 @@ class ButtonMatrixType(WidgetType):
193
193
  async def to_code(self, w: Widget, config):
194
194
  lvgl_components_required.add("BUTTONMATRIX")
195
195
  if CONF_ROWS not in config:
196
- return []
196
+ return
197
197
  text_list, ctrl_list, width_list, key_list = await get_button_data(
198
198
  config[CONF_ROWS], w
199
199
  )
@@ -4,7 +4,7 @@ from esphome.const import CONF_SIZE, CONF_TEXT
4
4
  from esphome.cpp_generator import MockObjClass
5
5
 
6
6
  from ..defines import CONF_MAIN
7
- from ..lv_validation import color, color_retmapper, lv_text
7
+ from ..lv_validation import lv_color, lv_text
8
8
  from ..lvcode import LocalVariable, lv, lv_expr
9
9
  from ..schemas import TEXT_SCHEMA
10
10
  from ..types import WidgetType, lv_obj_t
@@ -16,8 +16,8 @@ CONF_LIGHT_COLOR = "light_color"
16
16
 
17
17
  QRCODE_SCHEMA = TEXT_SCHEMA.extend(
18
18
  {
19
- cv.Optional(CONF_DARK_COLOR, default="black"): color,
20
- cv.Optional(CONF_LIGHT_COLOR, default="white"): color,
19
+ cv.Optional(CONF_DARK_COLOR, default="black"): lv_color,
20
+ cv.Optional(CONF_LIGHT_COLOR, default="white"): lv_color,
21
21
  cv.Required(CONF_SIZE): cv.int_,
22
22
  }
23
23
  )
@@ -34,11 +34,11 @@ class QrCodeType(WidgetType):
34
34
  )
35
35
 
36
36
  def get_uses(self):
37
- return ("canvas", "img", "label")
37
+ return "canvas", "img", "label"
38
38
 
39
- def obj_creator(self, parent: MockObjClass, config: dict):
40
- dark_color = color_retmapper(config[CONF_DARK_COLOR])
41
- light_color = color_retmapper(config[CONF_LIGHT_COLOR])
39
+ async def obj_creator(self, parent: MockObjClass, config: dict):
40
+ dark_color = await lv_color.process(config[CONF_DARK_COLOR])
41
+ light_color = await lv_color.process(config[CONF_LIGHT_COLOR])
42
42
  size = config[CONF_SIZE]
43
43
  return lv_expr.call("qrcode_create", parent, size, dark_color, light_color)
44
44
 
@@ -2,7 +2,7 @@ import esphome.config_validation as cv
2
2
  from esphome.cpp_generator import MockObjClass
3
3
 
4
4
  from ..defines import CONF_ARC_LENGTH, CONF_INDICATOR, CONF_MAIN, CONF_SPIN_TIME
5
- from ..lv_validation import angle
5
+ from ..lv_validation import lv_angle_degrees, lv_milliseconds
6
6
  from ..lvcode import lv_expr
7
7
  from ..types import LvType
8
8
  from . import Widget, WidgetType
@@ -12,8 +12,8 @@ CONF_SPINNER = "spinner"
12
12
 
13
13
  SPINNER_SCHEMA = cv.Schema(
14
14
  {
15
- cv.Required(CONF_ARC_LENGTH): angle,
16
- cv.Required(CONF_SPIN_TIME): cv.positive_time_period_milliseconds,
15
+ cv.Required(CONF_ARC_LENGTH): lv_angle_degrees,
16
+ cv.Required(CONF_SPIN_TIME): lv_milliseconds,
17
17
  }
18
18
  )
19
19
 
@@ -34,9 +34,9 @@ class SpinnerType(WidgetType):
34
34
  def get_uses(self):
35
35
  return (CONF_ARC,)
36
36
 
37
- def obj_creator(self, parent: MockObjClass, config: dict):
38
- spin_time = config[CONF_SPIN_TIME].total_milliseconds
39
- arc_length = config[CONF_ARC_LENGTH] // 10
37
+ async def obj_creator(self, parent: MockObjClass, config: dict):
38
+ spin_time = await lv_milliseconds.process(config[CONF_SPIN_TIME])
39
+ arc_length = await lv_angle_degrees.process(config[CONF_ARC_LENGTH])
40
40
  return lv_expr.call("spinner_create", parent, spin_time, arc_length)
41
41
 
42
42
 
@@ -1,9 +1,9 @@
1
+ from esphome.const import CONF_SWITCH
2
+
1
3
  from ..defines import CONF_INDICATOR, CONF_KNOB, CONF_MAIN
2
4
  from ..types import LvBoolean
3
5
  from . import WidgetType
4
6
 
5
- CONF_SWITCH = "switch"
6
-
7
7
 
8
8
  class SwitchType(WidgetType):
9
9
  def __init__(self):
@@ -87,12 +87,12 @@ class TabviewType(WidgetType):
87
87
  ) as content_obj:
88
88
  await set_obj_properties(Widget(content_obj, obj_spec), content_style)
89
89
 
90
- def obj_creator(self, parent: MockObjClass, config: dict):
90
+ async def obj_creator(self, parent: MockObjClass, config: dict):
91
91
  return lv_expr.call(
92
92
  "tabview_create",
93
93
  parent,
94
- literal(config[CONF_POSITION]),
95
- literal(config[CONF_SIZE]),
94
+ await DIRECTIONS.process(config[CONF_POSITION]),
95
+ await size.process(config[CONF_SIZE]),
96
96
  )
97
97
 
98
98
 
@@ -15,7 +15,7 @@ from ..defines import (
15
15
  TILE_DIRECTIONS,
16
16
  literal,
17
17
  )
18
- from ..lv_validation import animated, lv_int
18
+ from ..lv_validation import animated, lv_int, lv_pct
19
19
  from ..lvcode import lv, lv_assign, lv_expr, lv_obj, lv_Pvariable
20
20
  from ..schemas import container_schema
21
21
  from ..types import LV_EVENT, LvType, ObjUpdateAction, lv_obj_t, lv_obj_t_ptr
@@ -41,8 +41,8 @@ TILEVIEW_SCHEMA = cv.Schema(
41
41
  container_schema(
42
42
  obj_spec,
43
43
  {
44
- cv.Required(CONF_ROW): lv_int,
45
- cv.Required(CONF_COLUMN): lv_int,
44
+ cv.Required(CONF_ROW): cv.positive_int,
45
+ cv.Required(CONF_COLUMN): cv.positive_int,
46
46
  cv.GenerateID(): cv.declare_id(lv_tile_t),
47
47
  cv.Optional(CONF_DIR, default="ALL"): TILE_DIRECTIONS.several_of,
48
48
  },
@@ -63,21 +63,29 @@ class TileviewType(WidgetType):
63
63
  )
64
64
 
65
65
  async def to_code(self, w: Widget, config: dict):
66
- for tile_conf in config.get(CONF_TILES, ()):
66
+ tiles = config[CONF_TILES]
67
+ for tile_conf in tiles:
67
68
  w_id = tile_conf[CONF_ID]
68
69
  tile_obj = lv_Pvariable(lv_obj_t, w_id)
69
70
  tile = Widget.create(w_id, tile_obj, tile_spec, tile_conf)
70
71
  dirs = tile_conf[CONF_DIR]
71
72
  if isinstance(dirs, list):
72
73
  dirs = "|".join(dirs)
74
+ row_pos = tile_conf[CONF_ROW]
75
+ col_pos = tile_conf[CONF_COLUMN]
73
76
  lv_assign(
74
77
  tile_obj,
75
- lv_expr.tileview_add_tile(
76
- w.obj, tile_conf[CONF_COLUMN], tile_conf[CONF_ROW], literal(dirs)
77
- ),
78
+ lv_expr.tileview_add_tile(w.obj, col_pos, row_pos, literal(dirs)),
78
79
  )
80
+ # Bugfix for LVGL 8.x
81
+ lv_obj.set_pos(tile_obj, lv_pct(col_pos * 100), lv_pct(row_pos * 100))
79
82
  await set_obj_properties(tile, tile_conf)
80
83
  await add_widgets(tile, tile_conf)
84
+ if tiles:
85
+ # Set the first tile as active
86
+ lv_obj.set_tile_id(
87
+ w.obj, tiles[0][CONF_COLUMN], tiles[0][CONF_ROW], literal("LV_ANIM_OFF")
88
+ )
81
89
 
82
90
 
83
91
  tileview_spec = TileviewType()
@@ -8,7 +8,6 @@ namespace m5stack_8angle {
8
8
  static const char *const TAG = "m5stack_8angle";
9
9
 
10
10
  void M5Stack8AngleComponent::setup() {
11
- ESP_LOGCONFIG(TAG, "Running setup");
12
11
  i2c::ErrorCode err;
13
12
 
14
13
  err = this->read(nullptr, 0);
@@ -28,9 +28,10 @@ CONF_HAS_PULLDOWNS = "has_pulldowns"
28
28
 
29
29
 
30
30
  def check_keys(obj):
31
- if CONF_KEYS in obj:
32
- if len(obj[CONF_KEYS]) != len(obj[CONF_ROWS]) * len(obj[CONF_COLUMNS]):
33
- raise cv.Invalid("The number of key codes must equal the number of buttons")
31
+ if CONF_KEYS in obj and len(obj[CONF_KEYS]) != len(obj[CONF_ROWS]) * len(
32
+ obj[CONF_COLUMNS]
33
+ ):
34
+ raise cv.Invalid("The number of key codes must equal the number of buttons")
34
35
  return obj
35
36
 
36
37
 
@@ -41,8 +41,6 @@ void MAX17043Component::update() {
41
41
  }
42
42
 
43
43
  void MAX17043Component::setup() {
44
- ESP_LOGCONFIG(TAG, "Running setup");
45
-
46
44
  uint16_t config_reg;
47
45
  if (this->write(&MAX17043_CONFIG, 1) != i2c::ERROR_OK) {
48
46
  this->status_set_warning();
@@ -19,10 +19,7 @@ void MAX31855Sensor::update() {
19
19
  this->set_timeout("value", 220, f);
20
20
  }
21
21
 
22
- void MAX31855Sensor::setup() {
23
- ESP_LOGCONFIG(TAG, "Running setup for '%s'", this->name_.c_str());
24
- this->spi_setup();
25
- }
22
+ void MAX31855Sensor::setup() { this->spi_setup(); }
26
23
  void MAX31855Sensor::dump_config() {
27
24
  ESP_LOGCONFIG(TAG, "MAX31855:");
28
25
  LOG_PIN(" CS Pin: ", this->cs_);
@@ -11,14 +11,10 @@ static const char *const TAG = "max31856";
11
11
  // Based on Adafruit's library: https://github.com/adafruit/Adafruit_MAX31856
12
12
 
13
13
  void MAX31856Sensor::setup() {
14
- ESP_LOGCONFIG(TAG, "Running setup for '%s'", this->name_.c_str());
15
14
  this->spi_setup();
16
15
 
17
16
  // assert on any fault
18
- ESP_LOGCONFIG(TAG, "Setting up assertion on all faults");
19
17
  this->write_register_(MAX31856_MASK_REG, 0x0);
20
-
21
- ESP_LOGCONFIG(TAG, "Setting up open circuit fault detection");
22
18
  this->write_register_(MAX31856_CR0_REG, MAX31856_CR0_OCFAULT01);
23
19
 
24
20
  this->set_thermocouple_type_();
@@ -65,7 +65,6 @@ void MAX31865Sensor::update() {
65
65
  }
66
66
 
67
67
  void MAX31865Sensor::setup() {
68
- ESP_LOGCONFIG(TAG, "Running setup for '%s'", this->name_.c_str());
69
68
  this->spi_setup();
70
69
 
71
70
  // Build base configuration
@@ -21,7 +21,6 @@ static const uint8_t MAX44009_ERROR_HIGH_BYTE = -30;
21
21
  static const uint8_t MAX44009_ERROR_LOW_BYTE = -31;
22
22
 
23
23
  void MAX44009Sensor::setup() {
24
- ESP_LOGCONFIG(TAG, "Running setup");
25
24
  bool state_ok = false;
26
25
  if (this->mode_ == MAX44009Mode::MAX44009_MODE_LOW_POWER) {
27
26
  state_ok = this->set_low_power_mode();
@@ -17,10 +17,7 @@ void MAX6675Sensor::update() {
17
17
  this->set_timeout("value", 250, f);
18
18
  }
19
19
 
20
- void MAX6675Sensor::setup() {
21
- ESP_LOGCONFIG(TAG, "Running setup for '%s'", this->name_.c_str());
22
- this->spi_setup();
23
- }
20
+ void MAX6675Sensor::setup() { this->spi_setup(); }
24
21
  void MAX6675Sensor::dump_config() {
25
22
  LOG_SENSOR("", "MAX6675", this);
26
23
  LOG_PIN(" CS Pin: ", this->cs_);
@@ -20,7 +20,6 @@ const uint8_t MASK_CURRENT_PIN = 0x0F;
20
20
  * MAX6956 *
21
21
  **************************************/
22
22
  void MAX6956::setup() {
23
- ESP_LOGCONFIG(TAG, "Running setup");
24
23
  uint8_t configuration;
25
24
  if (!this->read_reg_(MAX6956_CONFIGURATION, &configuration)) {
26
25
  this->mark_failed();
@@ -116,7 +116,6 @@ const uint8_t MAX7219_ASCII_TO_RAW[95] PROGMEM = {
116
116
 
117
117
  float MAX7219Component::get_setup_priority() const { return setup_priority::PROCESSOR; }
118
118
  void MAX7219Component::setup() {
119
- ESP_LOGCONFIG(TAG, "Running setup");
120
119
  this->spi_setup();
121
120
  this->buffer_ = new uint8_t[this->num_chips_ * 8]; // NOLINT
122
121
  for (uint8_t i = 0; i < this->num_chips_ * 8; i++)
@@ -3,6 +3,7 @@ import esphome.codegen as cg
3
3
  from esphome.components import display, spi
4
4
  import esphome.config_validation as cv
5
5
  from esphome.const import (
6
+ CONF_FLIP_X,
6
7
  CONF_ID,
7
8
  CONF_INTENSITY,
8
9
  CONF_LAMBDA,
@@ -14,7 +15,6 @@ CODEOWNERS = ["@rspaargaren"]
14
15
  DEPENDENCIES = ["spi"]
15
16
 
16
17
  CONF_ROTATE_CHIP = "rotate_chip"
17
- CONF_FLIP_X = "flip_x"
18
18
  CONF_SCROLL_SPEED = "scroll_speed"
19
19
  CONF_SCROLL_DWELL = "scroll_dwell"
20
20
  CONF_SCROLL_DELAY = "scroll_delay"
@@ -26,7 +26,6 @@ constexpr uint8_t MAX7219_DISPLAY_TEST = 0x01;
26
26
  float MAX7219Component::get_setup_priority() const { return setup_priority::PROCESSOR; }
27
27
 
28
28
  void MAX7219Component::setup() {
29
- ESP_LOGCONFIG(TAG, "Running setup");
30
29
  this->spi_setup();
31
30
  this->stepsleft_ = 0;
32
31
  for (int chip_line = 0; chip_line < this->num_chip_lines_; chip_line++) {
@@ -31,7 +31,6 @@ static const float TEMP_LSB = 0.48; // 0.48C/LSB
31
31
  static const float MICRO_VOLTS_PER_VOLT = 1000000.0;
32
32
 
33
33
  void MAX9611Component::setup() {
34
- ESP_LOGCONFIG(TAG, "Running setup");
35
34
  // Perform dummy-read
36
35
  uint8_t value;
37
36
  this->read(&value, 1);
@@ -24,5 +24,5 @@ CONFIG_SCHEMA = (
24
24
 
25
25
 
26
26
  async def to_code(config):
27
- var = await mcp23xxx_base.register_mcp23xxx(config)
27
+ var = await mcp23xxx_base.register_mcp23xxx(config, mcp23x08_base.NUM_PINS)
28
28
  await i2c.register_i2c_device(var, config)
@@ -7,7 +7,6 @@ namespace mcp23008 {
7
7
  static const char *const TAG = "mcp23008";
8
8
 
9
9
  void MCP23008::setup() {
10
- ESP_LOGCONFIG(TAG, "Running setup");
11
10
  uint8_t iocon;
12
11
  if (!this->read_reg(mcp23x08_base::MCP23X08_IOCON, &iocon)) {
13
12
  this->mark_failed();
@@ -8,7 +8,6 @@ namespace mcp23016 {
8
8
  static const char *const TAG = "mcp23016";
9
9
 
10
10
  void MCP23016::setup() {
11
- ESP_LOGCONFIG(TAG, "Running setup");
12
11
  uint8_t iocon;
13
12
  if (!this->read_reg_(MCP23016_IOCON0, &iocon)) {
14
13
  this->mark_failed();
@@ -24,5 +24,5 @@ CONFIG_SCHEMA = (
24
24
 
25
25
 
26
26
  async def to_code(config):
27
- var = await mcp23xxx_base.register_mcp23xxx(config)
27
+ var = await mcp23xxx_base.register_mcp23xxx(config, mcp23x17_base.NUM_PINS)
28
28
  await i2c.register_i2c_device(var, config)
@@ -7,7 +7,6 @@ namespace mcp23017 {
7
7
  static const char *const TAG = "mcp23017";
8
8
 
9
9
  void MCP23017::setup() {
10
- ESP_LOGCONFIG(TAG, "Running setup");
11
10
  uint8_t iocon;
12
11
  if (!this->read_reg(mcp23x17_base::MCP23X17_IOCONA, &iocon)) {
13
12
  this->mark_failed();
@@ -27,6 +27,6 @@ CONFIG_SCHEMA = (
27
27
 
28
28
 
29
29
  async def to_code(config):
30
- var = await mcp23xxx_base.register_mcp23xxx(config)
30
+ var = await mcp23xxx_base.register_mcp23xxx(config, mcp23x08_base.NUM_PINS)
31
31
  cg.add(var.set_device_address(config[CONF_DEVICEADDRESS]))
32
32
  await spi.register_spi_device(var, config)