esphome 2025.7.4__py3-none-any.whl → 2025.8.0b1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of esphome might be problematic. Click here for more details.

Files changed (754) hide show
  1. esphome/__main__.py +189 -82
  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 +488 -118
  73. esphome/components/atm90e32/atm90e32.h +44 -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 +387 -82
  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 +199 -58
  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 +40 -2
  149. esphome/components/esp32_ble/ble.cpp +12 -8
  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 +2 -4
  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 +0 -1
  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/sensor/__init__.py +1 -1
  501. esphome/components/pm2005/pm2005.cpp +0 -1
  502. esphome/components/pmsa003i/pmsa003i.cpp +0 -2
  503. esphome/components/pmwcs3/sensor.py +1 -2
  504. esphome/components/pn532/pn532.cpp +0 -2
  505. esphome/components/pn532_spi/pn532_spi.cpp +0 -2
  506. esphome/components/power_supply/power_supply.cpp +7 -10
  507. esphome/components/power_supply/power_supply.h +1 -1
  508. esphome/components/psram/__init__.py +2 -1
  509. esphome/components/pulse_counter/pulse_counter_sensor.cpp +0 -1
  510. esphome/components/pulse_counter/sensor.py +9 -6
  511. esphome/components/pylontech/pylontech.cpp +0 -1
  512. esphome/components/qmc5883l/qmc5883l.cpp +0 -1
  513. esphome/components/qmp6988/qmp6988.cpp +0 -2
  514. esphome/components/qspi_dbi/display.py +2 -3
  515. esphome/components/qspi_dbi/qspi_dbi.cpp +0 -2
  516. esphome/components/qwiic_pir/binary_sensor.py +2 -3
  517. esphome/components/qwiic_pir/qwiic_pir.cpp +0 -2
  518. esphome/components/rc522/rc522.cpp +9 -31
  519. esphome/components/rc522_spi/rc522_spi.cpp +0 -1
  520. esphome/components/remote_base/__init__.py +5 -6
  521. esphome/components/remote_receiver/remote_receiver_esp32.cpp +0 -1
  522. esphome/components/remote_receiver/remote_receiver_esp8266.cpp +0 -1
  523. esphome/components/remote_receiver/remote_receiver_libretiny.cpp +0 -1
  524. esphome/components/remote_transmitter/__init__.py +26 -0
  525. esphome/components/remote_transmitter/automation.h +18 -0
  526. esphome/components/remote_transmitter/remote_transmitter.h +2 -1
  527. esphome/components/remote_transmitter/remote_transmitter_esp32.cpp +0 -1
  528. esphome/components/remote_transmitter/remote_transmitter_esp8266.cpp +2 -0
  529. esphome/components/remote_transmitter/remote_transmitter_libretiny.cpp +2 -0
  530. esphome/components/resampler/speaker/__init__.py +4 -5
  531. esphome/components/rf_bridge/__init__.py +4 -8
  532. esphome/components/rotary_encoder/rotary_encoder.cpp +0 -2
  533. esphome/components/rp2040/__init__.py +3 -1
  534. esphome/components/rp2040_pio_led_strip/led_strip.cpp +0 -2
  535. esphome/components/rp2040_pio_led_strip/light.py +1 -2
  536. esphome/components/rp2040_pwm/rp2040_pwm.cpp +1 -5
  537. esphome/components/rpi_dpi_rgb/display.py +13 -15
  538. esphome/components/rpi_dpi_rgb/rpi_dpi_rgb.cpp +0 -3
  539. esphome/components/runtime_stats/__init__.py +34 -0
  540. esphome/components/runtime_stats/runtime_stats.cpp +102 -0
  541. esphome/components/runtime_stats/runtime_stats.h +132 -0
  542. esphome/components/scd30/scd30.cpp +0 -2
  543. esphome/components/scd30/sensor.py +1 -2
  544. esphome/components/scd4x/scd4x.cpp +0 -1
  545. esphome/components/scd4x/sensor.py +1 -3
  546. esphome/components/sdl/display.py +3 -1
  547. esphome/components/sdl/sdl_esphome.cpp +0 -2
  548. esphome/components/sdp3x/sdp3x.cpp +0 -2
  549. esphome/components/seeed_mr24hpc1/seeed_mr24hpc1.cpp +0 -2
  550. esphome/components/seeed_mr60fda2/seeed_mr60fda2.cpp +0 -3
  551. esphome/components/select/__init__.py +2 -3
  552. esphome/components/select/select_traits.cpp +1 -1
  553. esphome/components/select/select_traits.h +1 -1
  554. esphome/components/sen0321/sen0321.cpp +0 -1
  555. esphome/components/sen5x/sen5x.cpp +0 -2
  556. esphome/components/sensor/__init__.py +36 -4
  557. esphome/components/sensor/filter.cpp +49 -10
  558. esphome/components/sensor/filter.h +22 -7
  559. esphome/components/sensor/sensor.cpp +0 -1
  560. esphome/components/sensor/sensor.h +0 -9
  561. esphome/components/sfa30/sfa30.cpp +0 -4
  562. esphome/components/sgp30/sgp30.cpp +0 -2
  563. esphome/components/sgp4x/sensor.py +1 -1
  564. esphome/components/sgp4x/sgp4x.cpp +0 -2
  565. esphome/components/shelly_dimmer/shelly_dimmer.cpp +0 -2
  566. esphome/components/sht3xd/sht3xd.cpp +0 -2
  567. esphome/components/sht4x/sht4x.cpp +0 -2
  568. esphome/components/shtcx/shtcx.cpp +0 -1
  569. esphome/components/sim800l/__init__.py +2 -4
  570. esphome/components/sm16716/sm16716.cpp +0 -1
  571. esphome/components/sm2135/sm2135.cpp +0 -1
  572. esphome/components/sm2235/sm2235.cpp +0 -1
  573. esphome/components/sm2335/sm2335.cpp +0 -1
  574. esphome/components/sn74hc165/sn74hc165.cpp +0 -1
  575. esphome/components/sn74hc595/sn74hc595.cpp +0 -1
  576. esphome/components/sntp/sntp_component.cpp +0 -1
  577. esphome/components/sound_level/sensor.py +1 -1
  578. esphome/components/speaker/media_player/__init__.py +21 -33
  579. esphome/components/speaker/media_player/audio_pipeline.cpp +4 -7
  580. esphome/components/spi/__init__.py +29 -13
  581. esphome/components/spi/spi.cpp +0 -2
  582. esphome/components/spi_device/spi_device.cpp +1 -4
  583. esphome/components/sprinkler/__init__.py +4 -4
  584. esphome/components/sps30/sps30.cpp +0 -1
  585. esphome/components/ssd1306_base/__init__.py +11 -11
  586. esphome/components/ssd1306_base/ssd1306_base.cpp +1 -1
  587. esphome/components/ssd1306_i2c/ssd1306_i2c.cpp +0 -1
  588. esphome/components/ssd1306_spi/ssd1306_spi.cpp +0 -1
  589. esphome/components/ssd1322_spi/ssd1322_spi.cpp +0 -1
  590. esphome/components/ssd1325_spi/ssd1325_spi.cpp +0 -1
  591. esphome/components/ssd1327_i2c/ssd1327_i2c.cpp +0 -1
  592. esphome/components/ssd1327_spi/ssd1327_spi.cpp +0 -1
  593. esphome/components/ssd1331_spi/ssd1331_spi.cpp +0 -1
  594. esphome/components/ssd1351_spi/ssd1351_spi.cpp +0 -1
  595. esphome/components/st7567_i2c/st7567_i2c.cpp +0 -1
  596. esphome/components/st7567_spi/st7567_spi.cpp +0 -1
  597. esphome/components/st7701s/display.py +10 -14
  598. esphome/components/st7701s/st7701s.cpp +0 -3
  599. esphome/components/st7735/st7735.cpp +0 -1
  600. esphome/components/st7789v/st7789v.cpp +0 -1
  601. esphome/components/st7920/st7920.cpp +0 -1
  602. esphome/components/status_led/light/status_led_light.cpp +0 -2
  603. esphome/components/status_led/status_led.cpp +0 -1
  604. esphome/components/stepper/__init__.py +2 -4
  605. esphome/components/sts3x/sts3x.cpp +0 -1
  606. esphome/components/substitutions/__init__.py +10 -16
  607. esphome/components/substitutions/jinja.py +24 -1
  608. esphome/components/sun/__init__.py +2 -3
  609. esphome/components/switch/__init__.py +31 -1
  610. esphome/components/switch/automation.h +24 -0
  611. esphome/components/switch/switch.cpp +8 -0
  612. esphome/components/switch/switch.h +8 -0
  613. esphome/components/sx126x/sx126x.cpp +0 -2
  614. esphome/components/sx127x/sx127x.cpp +0 -2
  615. esphome/components/sx1509/__init__.py +7 -5
  616. esphome/components/sx1509/output/sx1509_float_output.cpp +1 -1
  617. esphome/components/sx1509/sx1509.cpp +0 -2
  618. esphome/components/syslog/esphome_syslog.cpp +1 -1
  619. esphome/components/tc74/tc74.cpp +0 -1
  620. esphome/components/tca9548a/tca9548a.cpp +0 -1
  621. esphome/components/tca9555/tca9555.cpp +0 -1
  622. esphome/components/tcs34725/tcs34725.cpp +0 -1
  623. esphome/components/tee501/tee501.cpp +0 -1
  624. esphome/components/tem3200/tem3200.cpp +0 -2
  625. esphome/components/template/alarm_control_panel/template_alarm_control_panel.cpp +0 -1
  626. esphome/components/template/cover/template_cover.cpp +0 -1
  627. esphome/components/template/select/template_select.cpp +0 -1
  628. esphome/components/template/text/template_text.cpp +0 -2
  629. esphome/components/template/valve/template_valve.cpp +0 -1
  630. esphome/components/text/__init__.py +0 -1
  631. esphome/components/text/text_traits.h +2 -0
  632. esphome/components/text_sensor/__init__.py +2 -1
  633. esphome/components/text_sensor/text_sensor.cpp +0 -2
  634. esphome/components/text_sensor/text_sensor.h +0 -8
  635. esphome/components/thermostat/climate.py +4 -4
  636. esphome/components/time/__init__.py +7 -4
  637. esphome/components/time/real_time_clock.cpp +16 -3
  638. esphome/components/tlc59208f/tlc59208f_output.cpp +0 -2
  639. esphome/components/tlc5947/tlc5947.cpp +0 -2
  640. esphome/components/tlc5971/tlc5971.cpp +0 -2
  641. esphome/components/tm1621/tm1621.cpp +0 -2
  642. esphome/components/tm1637/tm1637.cpp +0 -2
  643. esphome/components/tm1638/tm1638.cpp +0 -2
  644. esphome/components/tm1651/__init__.py +45 -48
  645. esphome/components/tm1651/tm1651.cpp +213 -47
  646. esphome/components/tm1651/tm1651.h +37 -32
  647. esphome/components/tmp117/tmp117.cpp +0 -2
  648. esphome/components/tsl2561/tsl2561.cpp +0 -1
  649. esphome/components/tsl2591/tsl2591.cpp +0 -1
  650. esphome/components/tt21100/touchscreen/tt21100.cpp +0 -2
  651. esphome/components/ttp229_bsf/ttp229_bsf.cpp +0 -1
  652. esphome/components/ttp229_lsf/ttp229_lsf.cpp +0 -1
  653. esphome/components/tuya/climate/__init__.py +9 -10
  654. esphome/components/tuya/number/__init__.py +8 -6
  655. esphome/components/tx20/tx20.cpp +0 -1
  656. esphome/components/uart/uart_component_esp32_arduino.cpp +0 -1
  657. esphome/components/uart/uart_component_esp8266.cpp +0 -1
  658. esphome/components/uart/uart_component_esp_idf.cpp +0 -2
  659. esphome/components/uart/uart_component_libretiny.cpp +0 -2
  660. esphome/components/uart/uart_component_rp2040.cpp +0 -2
  661. esphome/components/udp/__init__.py +1 -1
  662. esphome/components/ufire_ec/sensor.py +1 -2
  663. esphome/components/ufire_ec/ufire_ec.cpp +0 -2
  664. esphome/components/ufire_ise/sensor.py +1 -2
  665. esphome/components/ufire_ise/ufire_ise.cpp +0 -2
  666. esphome/components/ultrasonic/ultrasonic_sensor.cpp +0 -1
  667. esphome/components/update/__init__.py +0 -1
  668. esphome/components/uptime/sensor/uptime_seconds_sensor.cpp +0 -1
  669. esphome/components/uptime/sensor/uptime_seconds_sensor.h +0 -2
  670. esphome/components/usb_host/usb_host_client.cpp +0 -1
  671. esphome/components/usb_host/usb_host_component.cpp +0 -1
  672. esphome/components/valve/__init__.py +0 -1
  673. esphome/components/veml3235/veml3235.cpp +0 -3
  674. esphome/components/veml7700/veml7700.cpp +0 -2
  675. esphome/components/version/version_text_sensor.cpp +0 -1
  676. esphome/components/version/version_text_sensor.h +0 -1
  677. esphome/components/vl53l0x/vl53l0x_sensor.cpp +0 -4
  678. esphome/components/voice_assistant/voice_assistant.cpp +9 -8
  679. esphome/components/web_server/__init__.py +13 -0
  680. esphome/components/web_server/web_server.cpp +187 -352
  681. esphome/components/web_server/web_server.h +61 -1
  682. esphome/components/web_server_base/__init__.py +1 -1
  683. esphome/components/web_server_base/web_server_base.cpp +2 -0
  684. esphome/components/web_server_base/web_server_base.h +6 -0
  685. esphome/components/web_server_idf/web_server_idf.cpp +10 -8
  686. esphome/components/web_server_idf/web_server_idf.h +2 -0
  687. esphome/components/weikai_i2c/weikai_i2c.cpp +1 -2
  688. esphome/components/weikai_spi/weikai_spi.cpp +1 -1
  689. esphome/components/wifi/__init__.py +8 -43
  690. esphome/components/wifi/wifi_component.cpp +100 -36
  691. esphome/components/wifi/wifi_component.h +5 -1
  692. esphome/components/wifi/wifi_component_esp32_arduino.cpp +30 -0
  693. esphome/components/wifi/wifi_component_esp_idf.cpp +30 -0
  694. esphome/components/wifi_info/wifi_info_text_sensor.h +0 -6
  695. esphome/components/wifi_signal/wifi_signal_sensor.h +0 -1
  696. esphome/components/wireguard/wireguard.cpp +0 -2
  697. esphome/components/x9c/x9c.cpp +0 -2
  698. esphome/components/xgzp68xx/xgzp68xx.cpp +0 -1
  699. esphome/components/xl9535/xl9535.cpp +0 -2
  700. esphome/components/zephyr/__init__.py +252 -0
  701. esphome/components/zephyr/const.py +16 -0
  702. esphome/components/zephyr/core.cpp +90 -0
  703. esphome/components/zephyr/gpio.cpp +120 -0
  704. esphome/components/zephyr/gpio.h +38 -0
  705. esphome/components/zephyr/pre_build.py.script +4 -0
  706. esphome/components/zephyr/preferences.cpp +156 -0
  707. esphome/components/zephyr/preferences.h +13 -0
  708. esphome/config.py +38 -16
  709. esphome/config_helpers.py +1 -2
  710. esphome/config_validation.py +8 -15
  711. esphome/const.py +26 -1
  712. esphome/core/__init__.py +88 -51
  713. esphome/core/application.cpp +75 -21
  714. esphome/core/application.h +106 -171
  715. esphome/core/color.h +10 -0
  716. esphome/core/component.cpp +41 -25
  717. esphome/core/component.h +9 -6
  718. esphome/core/component_iterator.cpp +61 -261
  719. esphome/core/component_iterator.h +15 -0
  720. esphome/core/config.py +26 -11
  721. esphome/core/defines.h +40 -2
  722. esphome/core/entity_base.h +18 -0
  723. esphome/core/entity_helpers.py +41 -6
  724. esphome/core/helpers.cpp +8 -15
  725. esphome/core/helpers.h +60 -6
  726. esphome/core/lock_free_queue.h +1 -1
  727. esphome/core/scheduler.cpp +277 -74
  728. esphome/core/scheduler.h +89 -27
  729. esphome/cpp_generator.py +2 -6
  730. esphome/cpp_helpers.py +1 -1
  731. esphome/dashboard/dashboard.py +2 -3
  732. esphome/dashboard/dns.py +2 -8
  733. esphome/dashboard/web_server.py +34 -19
  734. esphome/espota2.py +1 -4
  735. esphome/git.py +3 -1
  736. esphome/helpers.py +23 -4
  737. esphome/log.py +3 -1
  738. esphome/mqtt.py +3 -5
  739. esphome/platformio_api.py +7 -4
  740. esphome/types.py +12 -0
  741. esphome/util.py +20 -8
  742. esphome/voluptuous_schema.py +4 -3
  743. esphome/vscode.py +1 -2
  744. esphome/wizard.py +1 -4
  745. esphome/writer.py +5 -107
  746. esphome/yaml_util.py +7 -5
  747. {esphome-2025.7.4.dist-info → esphome-2025.8.0b1.dist-info}/METADATA +12 -13
  748. {esphome-2025.7.4.dist-info → esphome-2025.8.0b1.dist-info}/RECORD +753 -673
  749. esphome/components/mipi_spi/models/commands.py +0 -82
  750. /esphome/components/nfc/binary_sensor/{binary_sensor.h → nfc_binary_sensor.h} +0 -0
  751. {esphome-2025.7.4.dist-info → esphome-2025.8.0b1.dist-info}/WHEEL +0 -0
  752. {esphome-2025.7.4.dist-info → esphome-2025.8.0b1.dist-info}/entry_points.txt +0 -0
  753. {esphome-2025.7.4.dist-info → esphome-2025.8.0b1.dist-info}/licenses/LICENSE +0 -0
  754. {esphome-2025.7.4.dist-info → esphome-2025.8.0b1.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,233 @@
1
+ import importlib
2
+ import logging
3
+ import pkgutil
4
+
5
+ from esphome import pins
6
+ import esphome.codegen as cg
7
+ from esphome.components import display
8
+ from esphome.components.const import (
9
+ BYTE_ORDER_BIG,
10
+ BYTE_ORDER_LITTLE,
11
+ CONF_BYTE_ORDER,
12
+ CONF_DRAW_ROUNDING,
13
+ )
14
+ from esphome.components.display import CONF_SHOW_TEST_CARD
15
+ from esphome.components.esp32 import const, only_on_variant
16
+ from esphome.components.mipi import (
17
+ COLOR_ORDERS,
18
+ CONF_COLOR_DEPTH,
19
+ CONF_HSYNC_BACK_PORCH,
20
+ CONF_HSYNC_FRONT_PORCH,
21
+ CONF_HSYNC_PULSE_WIDTH,
22
+ CONF_PCLK_FREQUENCY,
23
+ CONF_PIXEL_MODE,
24
+ CONF_USE_AXIS_FLIPS,
25
+ CONF_VSYNC_BACK_PORCH,
26
+ CONF_VSYNC_FRONT_PORCH,
27
+ CONF_VSYNC_PULSE_WIDTH,
28
+ MODE_BGR,
29
+ PIXEL_MODE_16BIT,
30
+ PIXEL_MODE_24BIT,
31
+ DriverChip,
32
+ dimension_schema,
33
+ get_color_depth,
34
+ map_sequence,
35
+ power_of_two,
36
+ requires_buffer,
37
+ )
38
+ import esphome.config_validation as cv
39
+ from esphome.const import (
40
+ CONF_COLOR_ORDER,
41
+ CONF_DIMENSIONS,
42
+ CONF_ENABLE_PIN,
43
+ CONF_ID,
44
+ CONF_INIT_SEQUENCE,
45
+ CONF_INVERT_COLORS,
46
+ CONF_LAMBDA,
47
+ CONF_MIRROR_X,
48
+ CONF_MIRROR_Y,
49
+ CONF_MODEL,
50
+ CONF_RESET_PIN,
51
+ CONF_ROTATION,
52
+ CONF_SWAP_XY,
53
+ CONF_TRANSFORM,
54
+ CONF_WIDTH,
55
+ )
56
+ from esphome.final_validate import full_config
57
+
58
+ from . import mipi_dsi_ns, models
59
+
60
+ # Currently only ESP32-P4 is supported, so esp_ldo and psram are required
61
+ DEPENDENCIES = ["esp32", "esp_ldo", "psram"]
62
+ DOMAIN = "mipi_dsi"
63
+
64
+ LOGGER = logging.getLogger(DOMAIN)
65
+
66
+ MIPI_DSI = mipi_dsi_ns.class_("MIPI_DSI", display.Display, cg.Component)
67
+ ColorOrder = display.display_ns.enum("ColorMode")
68
+ ColorBitness = display.display_ns.enum("ColorBitness")
69
+
70
+ CONF_LANE_BIT_RATE = "lane_bit_rate"
71
+ CONF_LANES = "lanes"
72
+
73
+ DriverChip("CUSTOM")
74
+
75
+ # Import all models dynamically from the models package
76
+
77
+ for module_info in pkgutil.iter_modules(models.__path__):
78
+ importlib.import_module(f".models.{module_info.name}", package=__package__)
79
+
80
+ MODELS = DriverChip.get_models()
81
+
82
+ COLOR_DEPTHS = {
83
+ 16: ColorBitness.COLOR_BITNESS_565,
84
+ 24: ColorBitness.COLOR_BITNESS_888,
85
+ }
86
+
87
+
88
+ def model_schema(config):
89
+ model = MODELS[config[CONF_MODEL].upper()]
90
+ transform = cv.Schema(
91
+ {
92
+ cv.Required(CONF_MIRROR_X): cv.boolean,
93
+ cv.Required(CONF_MIRROR_Y): cv.boolean,
94
+ }
95
+ )
96
+ if model.get_default(CONF_SWAP_XY) != cv.UNDEFINED:
97
+ transform = transform.extend(
98
+ {
99
+ cv.Optional(CONF_SWAP_XY): cv.invalid(
100
+ "Axis swapping not supported by this model"
101
+ )
102
+ }
103
+ )
104
+ else:
105
+ transform = transform.extend(
106
+ {
107
+ cv.Required(CONF_SWAP_XY): cv.boolean,
108
+ }
109
+ )
110
+ # CUSTOM model will need to provide a custom init sequence
111
+ iseqconf = (
112
+ cv.Required(CONF_INIT_SEQUENCE)
113
+ if model.initsequence is None
114
+ else cv.Optional(CONF_INIT_SEQUENCE)
115
+ )
116
+ swap_xy = config.get(CONF_TRANSFORM, {}).get(CONF_SWAP_XY, False)
117
+
118
+ # Dimensions are optional if the model has a default width and the swap_xy transform is not overridden
119
+ cv_dimensions = (
120
+ cv.Optional if model.get_default(CONF_WIDTH) and not swap_xy else cv.Required
121
+ )
122
+ pixel_modes = (PIXEL_MODE_16BIT, PIXEL_MODE_24BIT, "16", "24")
123
+ schema = display.FULL_DISPLAY_SCHEMA.extend(
124
+ {
125
+ model.option(CONF_RESET_PIN, cv.UNDEFINED): pins.gpio_output_pin_schema,
126
+ cv.GenerateID(): cv.declare_id(MIPI_DSI),
127
+ cv_dimensions(CONF_DIMENSIONS): dimension_schema(
128
+ model.get_default(CONF_DRAW_ROUNDING, 1)
129
+ ),
130
+ model.option(CONF_ENABLE_PIN, cv.UNDEFINED): cv.ensure_list(
131
+ pins.gpio_output_pin_schema
132
+ ),
133
+ model.option(CONF_COLOR_ORDER, MODE_BGR): cv.enum(COLOR_ORDERS, upper=True),
134
+ model.option(CONF_DRAW_ROUNDING, 2): power_of_two,
135
+ model.option(CONF_PIXEL_MODE, PIXEL_MODE_16BIT): cv.one_of(
136
+ *pixel_modes, lower=True
137
+ ),
138
+ model.option(CONF_TRANSFORM, cv.UNDEFINED): transform,
139
+ cv.Required(CONF_MODEL): cv.one_of(model.name, upper=True),
140
+ model.option(CONF_INVERT_COLORS, False): cv.boolean,
141
+ model.option(CONF_COLOR_DEPTH, "16"): cv.one_of(
142
+ *[str(d) for d in COLOR_DEPTHS],
143
+ *[f"{d}bit" for d in COLOR_DEPTHS],
144
+ lower=True,
145
+ ),
146
+ model.option(CONF_USE_AXIS_FLIPS, True): cv.boolean,
147
+ model.option(CONF_PCLK_FREQUENCY, "40MHz"): cv.All(
148
+ cv.frequency, cv.Range(min=4e6, max=100e6)
149
+ ),
150
+ model.option(CONF_LANES, 2): cv.int_range(1, 2),
151
+ model.option(CONF_LANE_BIT_RATE, None): cv.All(
152
+ cv.bps, cv.Range(min=100e6, max=3200e6)
153
+ ),
154
+ iseqconf: cv.ensure_list(map_sequence),
155
+ model.option(CONF_BYTE_ORDER, BYTE_ORDER_LITTLE): cv.one_of(
156
+ BYTE_ORDER_LITTLE, BYTE_ORDER_BIG, lower=True
157
+ ),
158
+ model.option(CONF_HSYNC_PULSE_WIDTH): cv.int_,
159
+ model.option(CONF_HSYNC_BACK_PORCH): cv.int_,
160
+ model.option(CONF_HSYNC_FRONT_PORCH): cv.int_,
161
+ model.option(CONF_VSYNC_PULSE_WIDTH): cv.int_,
162
+ model.option(CONF_VSYNC_BACK_PORCH): cv.int_,
163
+ model.option(CONF_VSYNC_FRONT_PORCH): cv.int_,
164
+ }
165
+ )
166
+ return cv.All(
167
+ schema,
168
+ only_on_variant(supported=[const.VARIANT_ESP32P4]),
169
+ cv.only_with_esp_idf,
170
+ )
171
+
172
+
173
+ def _config_schema(config):
174
+ config = cv.Schema(
175
+ {
176
+ cv.Required(CONF_MODEL): cv.one_of(*MODELS, upper=True),
177
+ },
178
+ extra=cv.ALLOW_EXTRA,
179
+ )(config)
180
+ return model_schema(config)(config)
181
+
182
+
183
+ def _final_validate(config):
184
+ global_config = full_config.get()
185
+
186
+ from esphome.components.lvgl import DOMAIN as LVGL_DOMAIN
187
+
188
+ if not requires_buffer(config) and LVGL_DOMAIN not in global_config:
189
+ # If no drawing methods are configured, and LVGL is not enabled, show a test card
190
+ config[CONF_SHOW_TEST_CARD] = True
191
+ return config
192
+
193
+
194
+ CONFIG_SCHEMA = _config_schema
195
+ FINAL_VALIDATE_SCHEMA = _final_validate
196
+
197
+
198
+ async def to_code(config):
199
+ model = MODELS[config[CONF_MODEL].upper()]
200
+ color_depth = COLOR_DEPTHS[get_color_depth(config)]
201
+ pixel_mode = int(config[CONF_PIXEL_MODE].removesuffix("bit"))
202
+ width, height, _offset_width, _offset_height = model.get_dimensions(config)
203
+ var = cg.new_Pvariable(config[CONF_ID], width, height, color_depth, pixel_mode)
204
+
205
+ sequence, madctl = model.get_sequence(config)
206
+ cg.add(var.set_model(config[CONF_MODEL]))
207
+ cg.add(var.set_init_sequence(sequence))
208
+ cg.add(var.set_madctl(madctl))
209
+ cg.add(var.set_invert_colors(config[CONF_INVERT_COLORS]))
210
+ cg.add(var.set_hsync_pulse_width(config[CONF_HSYNC_PULSE_WIDTH]))
211
+ cg.add(var.set_hsync_back_porch(config[CONF_HSYNC_BACK_PORCH]))
212
+ cg.add(var.set_hsync_front_porch(config[CONF_HSYNC_FRONT_PORCH]))
213
+ cg.add(var.set_vsync_pulse_width(config[CONF_VSYNC_PULSE_WIDTH]))
214
+ cg.add(var.set_vsync_back_porch(config[CONF_VSYNC_BACK_PORCH]))
215
+ cg.add(var.set_vsync_front_porch(config[CONF_VSYNC_FRONT_PORCH]))
216
+ cg.add(var.set_pclk_frequency(int(config[CONF_PCLK_FREQUENCY] / 1e6)))
217
+ cg.add(var.set_lanes(int(config[CONF_LANES])))
218
+ cg.add(var.set_lane_bit_rate(int(config[CONF_LANE_BIT_RATE] / 1e6)))
219
+ if reset_pin := config.get(CONF_RESET_PIN):
220
+ reset = await cg.gpio_pin_expression(reset_pin)
221
+ cg.add(var.set_reset_pin(reset))
222
+ if enable_pin := config.get(CONF_ENABLE_PIN):
223
+ enable = [await cg.gpio_pin_expression(pin) for pin in enable_pin]
224
+ cg.add(var.set_enable_pins(enable))
225
+
226
+ if model.rotation_as_transform(config):
227
+ config[CONF_ROTATION] = 0
228
+ await display.register_display(var, config)
229
+ if lamb := config.get(CONF_LAMBDA):
230
+ lambda_ = await cg.process_lambda(
231
+ lamb, [(display.DisplayRef, "it")], return_type=cg.void
232
+ )
233
+ cg.add(var.set_writer(lambda_))
@@ -0,0 +1,379 @@
1
+ #ifdef USE_ESP32_VARIANT_ESP32P4
2
+ #include <utility>
3
+ #include "mipi_dsi.h"
4
+
5
+ namespace esphome {
6
+ namespace mipi_dsi {
7
+
8
+ static bool notify_refresh_ready(esp_lcd_panel_handle_t panel, esp_lcd_dpi_panel_event_data_t *edata, void *user_ctx) {
9
+ auto *sem = static_cast<SemaphoreHandle_t *>(user_ctx);
10
+ BaseType_t need_yield = pdFALSE;
11
+ xSemaphoreGiveFromISR(sem, &need_yield);
12
+ return (need_yield == pdTRUE);
13
+ }
14
+ void MIPI_DSI::setup() {
15
+ ESP_LOGCONFIG(TAG, "Running Setup");
16
+
17
+ if (!this->enable_pins_.empty()) {
18
+ for (auto *pin : this->enable_pins_) {
19
+ pin->setup();
20
+ pin->digital_write(true);
21
+ }
22
+ delay(10);
23
+ }
24
+
25
+ esp_lcd_dsi_bus_config_t bus_config = {
26
+ .bus_id = 0, // index from 0, specify the DSI host to use
27
+ .num_data_lanes =
28
+ this->lanes_, // Number of data lanes to use, can't set a value that exceeds the chip's capability
29
+ .phy_clk_src = MIPI_DSI_PHY_CLK_SRC_DEFAULT, // Clock source for the DPHY
30
+ .lane_bit_rate_mbps = this->lane_bit_rate_, // Bit rate of the data lanes, in Mbps
31
+ };
32
+ auto err = esp_lcd_new_dsi_bus(&bus_config, &this->bus_handle_);
33
+ if (err != ESP_OK) {
34
+ this->smark_failed("lcd_new_dsi_bus failed", err);
35
+ return;
36
+ }
37
+ esp_lcd_dbi_io_config_t dbi_config = {
38
+ .virtual_channel = 0,
39
+ .lcd_cmd_bits = 8, // according to the LCD spec
40
+ .lcd_param_bits = 8, // according to the LCD spec
41
+ };
42
+ err = esp_lcd_new_panel_io_dbi(this->bus_handle_, &dbi_config, &this->io_handle_);
43
+ if (err != ESP_OK) {
44
+ this->smark_failed("new_panel_io_dbi failed", err);
45
+ return;
46
+ }
47
+ auto pixel_format = LCD_COLOR_PIXEL_FORMAT_RGB565;
48
+ if (this->color_depth_ == display::COLOR_BITNESS_888) {
49
+ pixel_format = LCD_COLOR_PIXEL_FORMAT_RGB888;
50
+ }
51
+ esp_lcd_dpi_panel_config_t dpi_config = {.virtual_channel = 0,
52
+ .dpi_clk_src = MIPI_DSI_DPI_CLK_SRC_DEFAULT,
53
+ .dpi_clock_freq_mhz = this->pclk_frequency_,
54
+ .pixel_format = pixel_format,
55
+ .num_fbs = 1, // number of frame buffers to allocate
56
+ .video_timing =
57
+ {
58
+ .h_size = this->width_,
59
+ .v_size = this->height_,
60
+ .hsync_pulse_width = this->hsync_pulse_width_,
61
+ .hsync_back_porch = this->hsync_back_porch_,
62
+ .hsync_front_porch = this->hsync_front_porch_,
63
+ .vsync_pulse_width = this->vsync_pulse_width_,
64
+ .vsync_back_porch = this->vsync_back_porch_,
65
+ .vsync_front_porch = this->vsync_front_porch_,
66
+ },
67
+ .flags = {
68
+ .use_dma2d = true,
69
+ }};
70
+ err = esp_lcd_new_panel_dpi(this->bus_handle_, &dpi_config, &this->handle_);
71
+ if (err != ESP_OK) {
72
+ this->smark_failed("esp_lcd_new_panel_dpi failed", err);
73
+ return;
74
+ }
75
+ if (this->reset_pin_ != nullptr) {
76
+ this->reset_pin_->setup();
77
+ this->reset_pin_->digital_write(true);
78
+ delay(5);
79
+ this->reset_pin_->digital_write(false);
80
+ delay(5);
81
+ this->reset_pin_->digital_write(true);
82
+ } else {
83
+ esp_lcd_panel_io_tx_param(this->io_handle_, SW_RESET_CMD, nullptr, 0);
84
+ }
85
+ // need to know when the display is ready for SLPOUT command - will be 120ms after reset
86
+ auto when = millis() + 120;
87
+ err = esp_lcd_panel_init(this->handle_);
88
+ if (err != ESP_OK) {
89
+ this->smark_failed("esp_lcd_init failed", err);
90
+ return;
91
+ }
92
+ size_t index = 0;
93
+ auto &vec = this->init_sequence_;
94
+ while (index != vec.size()) {
95
+ if (vec.size() - index < 2) {
96
+ this->mark_failed("Malformed init sequence");
97
+ return;
98
+ }
99
+ uint8_t cmd = vec[index++];
100
+ uint8_t x = vec[index++];
101
+ if (x == DELAY_FLAG) {
102
+ ESP_LOGD(TAG, "Delay %dms", cmd);
103
+ delay(cmd);
104
+ } else {
105
+ uint8_t num_args = x & 0x7F;
106
+ if (vec.size() - index < num_args) {
107
+ this->mark_failed("Malformed init sequence");
108
+ return;
109
+ }
110
+ if (cmd == SLEEP_OUT) {
111
+ // are we ready, boots?
112
+ int duration = when - millis();
113
+ if (duration > 0) {
114
+ delay(duration);
115
+ }
116
+ }
117
+ const auto *ptr = vec.data() + index;
118
+ ESP_LOGVV(TAG, "Command %02X, length %d, byte(s) %s", cmd, num_args,
119
+ format_hex_pretty(ptr, num_args, '.', false).c_str());
120
+ err = esp_lcd_panel_io_tx_param(this->io_handle_, cmd, ptr, num_args);
121
+ if (err != ESP_OK) {
122
+ this->smark_failed("lcd_panel_io_tx_param failed", err);
123
+ return;
124
+ }
125
+ index += num_args;
126
+ if (cmd == SLEEP_OUT)
127
+ delay(10);
128
+ }
129
+ }
130
+ this->io_lock_ = xSemaphoreCreateBinary();
131
+ esp_lcd_dpi_panel_event_callbacks_t cbs = {
132
+ .on_color_trans_done = notify_refresh_ready,
133
+ };
134
+
135
+ err = (esp_lcd_dpi_panel_register_event_callbacks(this->handle_, &cbs, this->io_lock_));
136
+ if (err != ESP_OK) {
137
+ this->smark_failed("Failed to register callbacks", err);
138
+ return;
139
+ }
140
+
141
+ ESP_LOGCONFIG(TAG, "MIPI DSI setup complete");
142
+ }
143
+
144
+ void MIPI_DSI::update() {
145
+ if (this->auto_clear_enabled_) {
146
+ this->clear();
147
+ }
148
+ if (this->show_test_card_) {
149
+ this->test_card();
150
+ } else if (this->page_ != nullptr) {
151
+ this->page_->get_writer()(*this);
152
+ } else if (this->writer_.has_value()) {
153
+ (*this->writer_)(*this);
154
+ } else {
155
+ this->stop_poller();
156
+ }
157
+ if (this->buffer_ == nullptr || this->x_low_ > this->x_high_ || this->y_low_ > this->y_high_)
158
+ return;
159
+ ESP_LOGV(TAG, "x_low %d, y_low %d, x_high %d, y_high %d", this->x_low_, this->y_low_, this->x_high_, this->y_high_);
160
+ int w = this->x_high_ - this->x_low_ + 1;
161
+ int h = this->y_high_ - this->y_low_ + 1;
162
+ this->write_to_display_(this->x_low_, this->y_low_, w, h, this->buffer_, this->x_low_, this->y_low_,
163
+ this->width_ - w - this->x_low_);
164
+ // invalidate watermarks
165
+ this->x_low_ = this->width_;
166
+ this->y_low_ = this->height_;
167
+ this->x_high_ = 0;
168
+ this->y_high_ = 0;
169
+ }
170
+
171
+ void MIPI_DSI::draw_pixels_at(int x_start, int y_start, int w, int h, const uint8_t *ptr, display::ColorOrder order,
172
+ display::ColorBitness bitness, bool big_endian, int x_offset, int y_offset, int x_pad) {
173
+ if (w <= 0 || h <= 0)
174
+ return;
175
+ // if color mapping is required, pass the buck.
176
+ // note that endianness is not considered here - it is assumed to match!
177
+ if (bitness != this->color_depth_) {
178
+ display::Display::draw_pixels_at(x_start, y_start, w, h, ptr, order, bitness, big_endian, x_offset, y_offset,
179
+ x_pad);
180
+ }
181
+ this->write_to_display_(x_start, y_start, w, h, ptr, x_offset, y_offset, x_pad);
182
+ }
183
+
184
+ void MIPI_DSI::write_to_display_(int x_start, int y_start, int w, int h, const uint8_t *ptr, int x_offset, int y_offset,
185
+ int x_pad) {
186
+ esp_err_t err = ESP_OK;
187
+ auto bytes_per_pixel = 3 - this->color_depth_;
188
+ auto stride = (x_offset + w + x_pad) * bytes_per_pixel;
189
+ ptr += y_offset * stride + x_offset * bytes_per_pixel; // skip to the first pixel
190
+ // x_ and y_offset are offsets into the source buffer, unrelated to our own offsets into the display.
191
+ if (x_offset == 0 && x_pad == 0) {
192
+ err = esp_lcd_panel_draw_bitmap(this->handle_, x_start, y_start, x_start + w, y_start + h, ptr);
193
+ xSemaphoreTake(this->io_lock_, portMAX_DELAY);
194
+
195
+ } else {
196
+ // draw line by line
197
+ for (int y = 0; y != h; y++) {
198
+ err = esp_lcd_panel_draw_bitmap(this->handle_, x_start, y + y_start, x_start + w, y + y_start + 1, ptr);
199
+ if (err != ESP_OK)
200
+ break;
201
+ ptr += stride; // next line
202
+ xSemaphoreTake(this->io_lock_, portMAX_DELAY);
203
+ }
204
+ }
205
+ if (err != ESP_OK)
206
+ ESP_LOGE(TAG, "lcd_lcd_panel_draw_bitmap failed: %s", esp_err_to_name(err));
207
+ }
208
+
209
+ bool MIPI_DSI::check_buffer_() {
210
+ if (this->is_failed())
211
+ return false;
212
+ if (this->buffer_ != nullptr)
213
+ return true;
214
+ // this is dependent on the enum values.
215
+ auto bytes_per_pixel = 3 - this->color_depth_;
216
+ RAMAllocator<uint8_t> allocator;
217
+ this->buffer_ = allocator.allocate(this->height_ * this->width_ * bytes_per_pixel);
218
+ if (this->buffer_ == nullptr) {
219
+ this->mark_failed("Could not allocate buffer for display!");
220
+ return false;
221
+ }
222
+ return true;
223
+ }
224
+
225
+ void MIPI_DSI::draw_pixel_at(int x, int y, Color color) {
226
+ if (!this->get_clipping().inside(x, y))
227
+ return;
228
+
229
+ switch (this->rotation_) {
230
+ case display::DISPLAY_ROTATION_0_DEGREES:
231
+ break;
232
+ case display::DISPLAY_ROTATION_90_DEGREES:
233
+ std::swap(x, y);
234
+ x = this->width_ - x - 1;
235
+ break;
236
+ case display::DISPLAY_ROTATION_180_DEGREES:
237
+ x = this->width_ - x - 1;
238
+ y = this->height_ - y - 1;
239
+ break;
240
+ case display::DISPLAY_ROTATION_270_DEGREES:
241
+ std::swap(x, y);
242
+ y = this->height_ - y - 1;
243
+ break;
244
+ }
245
+ if (x >= this->get_width_internal() || x < 0 || y >= this->get_height_internal() || y < 0) {
246
+ return;
247
+ }
248
+ auto pixel = convert_big_endian(display::ColorUtil::color_to_565(color));
249
+ if (!this->check_buffer_())
250
+ return;
251
+ size_t pos = (y * this->width_) + x;
252
+ switch (this->color_depth_) {
253
+ case display::COLOR_BITNESS_565: {
254
+ auto *ptr_16 = reinterpret_cast<uint16_t *>(this->buffer_);
255
+ uint8_t hi_byte = static_cast<uint8_t>(color.r & 0xF8) | (color.g >> 5);
256
+ uint8_t lo_byte = static_cast<uint8_t>((color.g & 0x1C) << 3) | (color.b >> 3);
257
+ uint16_t new_color = lo_byte | (hi_byte << 8); // little endian
258
+ if (ptr_16[pos] == new_color)
259
+ return;
260
+ ptr_16[pos] = new_color;
261
+ break;
262
+ }
263
+ case display::COLOR_BITNESS_888:
264
+ if (this->color_mode_ == display::COLOR_ORDER_BGR) {
265
+ this->buffer_[pos * 3] = color.b;
266
+ this->buffer_[pos * 3 + 1] = color.g;
267
+ this->buffer_[pos * 3 + 2] = color.r;
268
+ } else {
269
+ this->buffer_[pos * 3] = color.r;
270
+ this->buffer_[pos * 3 + 1] = color.g;
271
+ this->buffer_[pos * 3 + 2] = color.b;
272
+ }
273
+ break;
274
+ case display::COLOR_BITNESS_332:
275
+ break;
276
+ }
277
+ // low and high watermark may speed up drawing from buffer
278
+ if (x < this->x_low_)
279
+ this->x_low_ = x;
280
+ if (y < this->y_low_)
281
+ this->y_low_ = y;
282
+ if (x > this->x_high_)
283
+ this->x_high_ = x;
284
+ if (y > this->y_high_)
285
+ this->y_high_ = y;
286
+ }
287
+ void MIPI_DSI::fill(Color color) {
288
+ if (!this->check_buffer_())
289
+ return;
290
+ switch (this->color_depth_) {
291
+ case display::COLOR_BITNESS_565: {
292
+ auto *ptr_16 = reinterpret_cast<uint16_t *>(this->buffer_);
293
+ uint8_t hi_byte = static_cast<uint8_t>(color.r & 0xF8) | (color.g >> 5);
294
+ uint8_t lo_byte = static_cast<uint8_t>((color.g & 0x1C) << 3) | (color.b >> 3);
295
+ uint16_t new_color = lo_byte | (hi_byte << 8); // little endian
296
+ std::fill_n(ptr_16, this->width_ * this->height_, new_color);
297
+ break;
298
+ }
299
+
300
+ case display::COLOR_BITNESS_888:
301
+ if (this->color_mode_ == display::COLOR_ORDER_BGR) {
302
+ for (size_t i = 0; i != this->width_ * this->height_; i++) {
303
+ this->buffer_[i * 3 + 0] = color.b;
304
+ this->buffer_[i * 3 + 1] = color.g;
305
+ this->buffer_[i * 3 + 2] = color.r;
306
+ }
307
+ } else {
308
+ for (size_t i = 0; i != this->width_ * this->height_; i++) {
309
+ this->buffer_[i * 3 + 0] = color.r;
310
+ this->buffer_[i * 3 + 1] = color.g;
311
+ this->buffer_[i * 3 + 2] = color.b;
312
+ }
313
+ }
314
+
315
+ default:
316
+ break;
317
+ }
318
+ }
319
+
320
+ int MIPI_DSI::get_width() {
321
+ switch (this->rotation_) {
322
+ case display::DISPLAY_ROTATION_90_DEGREES:
323
+ case display::DISPLAY_ROTATION_270_DEGREES:
324
+ return this->get_height_internal();
325
+ case display::DISPLAY_ROTATION_0_DEGREES:
326
+ case display::DISPLAY_ROTATION_180_DEGREES:
327
+ default:
328
+ return this->get_width_internal();
329
+ }
330
+ }
331
+
332
+ int MIPI_DSI::get_height() {
333
+ switch (this->rotation_) {
334
+ case display::DISPLAY_ROTATION_0_DEGREES:
335
+ case display::DISPLAY_ROTATION_180_DEGREES:
336
+ return this->get_height_internal();
337
+ case display::DISPLAY_ROTATION_90_DEGREES:
338
+ case display::DISPLAY_ROTATION_270_DEGREES:
339
+ default:
340
+ return this->get_width_internal();
341
+ }
342
+ }
343
+
344
+ static const uint8_t PIXEL_MODES[] = {0, 16, 18, 24};
345
+
346
+ void MIPI_DSI::dump_config() {
347
+ ESP_LOGCONFIG(TAG,
348
+ "MIPI_DSI RGB LCD"
349
+ "\n Model: %s"
350
+ "\n Width: %u"
351
+ "\n Height: %u"
352
+ "\n Mirror X: %s"
353
+ "\n Mirror Y: %s"
354
+ "\n Swap X/Y: %s"
355
+ "\n Rotation: %d degrees"
356
+ "\n DSI Lanes: %u"
357
+ "\n Lane Bit Rate: %uMbps"
358
+ "\n HSync Pulse Width: %u"
359
+ "\n HSync Back Porch: %u"
360
+ "\n HSync Front Porch: %u"
361
+ "\n VSync Pulse Width: %u"
362
+ "\n VSync Back Porch: %u"
363
+ "\n VSync Front Porch: %u"
364
+ "\n Buffer Color Depth: %d bit"
365
+ "\n Display Pixel Mode: %d bit"
366
+ "\n Color Order: %s"
367
+ "\n Invert Colors: %s"
368
+ "\n Pixel Clock: %dMHz",
369
+ this->model_, this->width_, this->height_, YESNO(this->madctl_ & (MADCTL_XFLIP | MADCTL_MX)),
370
+ YESNO(this->madctl_ & (MADCTL_YFLIP | MADCTL_MY)), YESNO(this->madctl_ & MADCTL_MV), this->rotation_,
371
+ this->lanes_, this->lane_bit_rate_, this->hsync_pulse_width_, this->hsync_back_porch_,
372
+ this->hsync_front_porch_, this->vsync_pulse_width_, this->vsync_back_porch_, this->vsync_front_porch_,
373
+ (3 - this->color_depth_) * 8, this->pixel_mode_, this->madctl_ & MADCTL_BGR ? "BGR" : "RGB",
374
+ YESNO(this->invert_colors_), this->pclk_frequency_);
375
+ LOG_PIN(" Reset Pin ", this->reset_pin_);
376
+ }
377
+ } // namespace mipi_dsi
378
+ } // namespace esphome
379
+ #endif // USE_ESP32_VARIANT_ESP32P4