esphome 2025.5.1__py3-none-any.whl → 2025.6.0b1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (720) hide show
  1. esphome/__main__.py +20 -14
  2. esphome/components/a4988/a4988.cpp +1 -1
  3. esphome/components/absolute_humidity/absolute_humidity.cpp +6 -4
  4. esphome/components/ac_dimmer/ac_dimmer.cpp +4 -2
  5. esphome/components/adc/adc_sensor_esp32.cpp +5 -3
  6. esphome/components/adc/adc_sensor_esp8266.cpp +5 -3
  7. esphome/components/adc/adc_sensor_libretiny.cpp +5 -3
  8. esphome/components/adc/adc_sensor_rp2040.cpp +5 -3
  9. esphome/components/adc128s102/adc128s102.cpp +1 -1
  10. esphome/components/ade7880/ade7880.cpp +28 -17
  11. esphome/components/ade7953_base/ade7953_base.cpp +12 -9
  12. esphome/components/ade7953_i2c/ade7953_i2c.cpp +1 -1
  13. esphome/components/ade7953_spi/ade7953_spi.cpp +1 -1
  14. esphome/components/ads1115/ads1115.cpp +3 -5
  15. esphome/components/ads1118/ads1118.cpp +2 -1
  16. esphome/components/ags10/ags10.cpp +3 -2
  17. esphome/components/aht10/aht10.cpp +27 -29
  18. esphome/components/aic3204/aic3204.cpp +2 -2
  19. esphome/components/alarm_control_panel/__init__.py +1 -0
  20. esphome/components/am2315c/am2315c.cpp +2 -2
  21. esphome/components/am2320/am2320.cpp +2 -2
  22. esphome/components/am43/am43_base.h +1 -1
  23. esphome/components/am43/cover/am43_cover.cpp +4 -2
  24. esphome/components/analog_threshold/analog_threshold_binary_sensor.cpp +4 -2
  25. esphome/components/apds9306/apds9306.cpp +8 -5
  26. esphome/components/apds9960/apds9960.cpp +2 -2
  27. esphome/components/api/__init__.py +5 -0
  28. esphome/components/api/api_connection.cpp +712 -358
  29. esphome/components/api/api_connection.h +343 -284
  30. esphome/components/api/api_frame_helper.cpp +349 -344
  31. esphome/components/api/api_frame_helper.h +121 -94
  32. esphome/components/api/api_pb2.cpp +2 -0
  33. esphome/components/api/api_pb2.h +637 -1
  34. esphome/components/api/api_pb2_service.cpp +12 -688
  35. esphome/components/api/api_pb2_service.h +53 -207
  36. esphome/components/api/api_server.cpp +71 -29
  37. esphome/components/api/api_server.h +9 -0
  38. esphome/components/api/client.py +5 -2
  39. esphome/components/api/homeassistant_service.h +1 -1
  40. esphome/components/api/list_entities.cpp +1 -1
  41. esphome/components/api/proto.cpp +1 -0
  42. esphome/components/api/proto.h +4 -3
  43. esphome/components/api/subscribe_state.cpp +8 -16
  44. esphome/components/as3935/as3935.cpp +3 -3
  45. esphome/components/as5600/as5600.cpp +9 -7
  46. esphome/components/as7341/as7341.cpp +7 -5
  47. esphome/components/at581x/at581x.cpp +13 -10
  48. esphome/components/atm90e26/atm90e26.cpp +2 -2
  49. esphome/components/atm90e32/atm90e32.cpp +3 -3
  50. esphome/components/axs15231/touchscreen/axs15231_touchscreen.cpp +5 -3
  51. esphome/components/bang_bang/bang_bang_climate.cpp +8 -5
  52. esphome/components/bedjet/bedjet_hub.cpp +6 -4
  53. esphome/components/beken_spi_led_strip/led_strip.cpp +11 -7
  54. esphome/components/bh1750/bh1750.cpp +2 -2
  55. esphome/components/binary_sensor/__init__.py +1 -0
  56. esphome/components/binary_sensor/automation.cpp +1 -2
  57. esphome/components/bl0906/bl0906.cpp +1 -1
  58. esphome/components/bl0942/bl0942.cpp +11 -8
  59. esphome/components/bl0942/sensor.py +1 -1
  60. esphome/components/ble_client/__init__.py +5 -1
  61. esphome/components/ble_client/output/ble_binary_output.cpp +6 -3
  62. esphome/components/ble_client/sensor/ble_sensor.cpp +9 -6
  63. esphome/components/ble_client/text_sensor/ble_text_sensor.cpp +8 -5
  64. esphome/components/bluetooth_proxy/__init__.py +5 -1
  65. esphome/components/bluetooth_proxy/bluetooth_connection.cpp +5 -5
  66. esphome/components/bluetooth_proxy/bluetooth_proxy.cpp +16 -14
  67. esphome/components/bme280_base/bme280_base.cpp +3 -3
  68. esphome/components/bme680/bme680.cpp +3 -3
  69. esphome/components/bme680/sensor.py +2 -2
  70. esphome/components/bme680_bsec/bme680_bsec.cpp +11 -7
  71. esphome/components/bme680_bsec/sensor.py +7 -3
  72. esphome/components/bme68x_bsec2/__init__.py +6 -5
  73. esphome/components/bme68x_bsec2/bme68x_bsec2.cpp +17 -13
  74. esphome/components/bme68x_bsec2/sensor.py +4 -4
  75. esphome/components/bme68x_bsec2_i2c/bme68x_bsec2_i2c.cpp +1 -0
  76. esphome/components/bmi160/bmi160.cpp +11 -11
  77. esphome/components/bmp085/bmp085.cpp +2 -2
  78. esphome/components/bmp280_base/bmp280_base.cpp +3 -3
  79. esphome/components/bmp3xx_base/bmp3xx_base.cpp +13 -13
  80. esphome/components/bmp581/bmp581.cpp +33 -27
  81. esphome/components/bp1658cj/bp1658cj.cpp +5 -3
  82. esphome/components/bp5758d/bp5758d.cpp +1 -1
  83. esphome/components/button/__init__.py +1 -0
  84. esphome/components/canbus/canbus.cpp +1 -1
  85. esphome/components/cap1188/cap1188.cpp +6 -4
  86. esphome/components/captive_portal/captive_portal.cpp +1 -1
  87. esphome/components/ccs811/ccs811.cpp +3 -2
  88. esphome/components/cd74hc4067/cd74hc4067.cpp +1 -1
  89. esphome/components/ch422g/ch422g.cpp +2 -2
  90. esphome/components/chsc6x/chsc6x_touchscreen.cpp +6 -4
  91. esphome/components/climate/__init__.py +1 -0
  92. esphome/components/climate/climate.cpp +12 -7
  93. esphome/components/climate/climate.h +1 -1
  94. esphome/components/climate_ir/climate_ir.cpp +7 -4
  95. esphome/components/cm1106/__init__.py +1 -0
  96. esphome/components/cm1106/cm1106.cpp +112 -0
  97. esphome/components/cm1106/cm1106.h +40 -0
  98. esphome/components/cm1106/sensor.py +72 -0
  99. esphome/components/const/__init__.py +1 -0
  100. esphome/components/cover/__init__.py +1 -0
  101. esphome/components/cs5460a/cs5460a.cpp +16 -11
  102. esphome/components/cse7761/cse7761.cpp +2 -2
  103. esphome/components/cse7766/cse7766.cpp +0 -5
  104. esphome/components/cse7766/cse7766.h +5 -1
  105. esphome/components/cst226/touchscreen/cst226_touchscreen.cpp +1 -1
  106. esphome/components/cst816/touchscreen/cst816_touchscreen.cpp +6 -3
  107. esphome/components/current_based/current_based_cover.cpp +4 -2
  108. esphome/components/dac7678/dac7678_output.cpp +4 -4
  109. esphome/components/dallas_temp/dallas_temp.cpp +2 -3
  110. esphome/components/daly_bms/daly_bms.cpp +2 -1
  111. esphome/components/dashboard_import/__init__.py +1 -2
  112. esphome/components/datetime/__init__.py +3 -1
  113. esphome/components/debug/debug_component.cpp +1 -5
  114. esphome/components/debug/debug_component.h +1 -1
  115. esphome/components/debug/debug_esp32.cpp +4 -2
  116. esphome/components/deep_sleep/deep_sleep_component.cpp +11 -5
  117. esphome/components/deep_sleep/deep_sleep_esp32.cpp +7 -5
  118. esphome/components/demo/__init__.py +206 -0
  119. esphome/components/demo/demo_alarm_control_panel.h +65 -0
  120. esphome/components/demo/demo_button.h +15 -0
  121. esphome/components/demo/demo_date.h +34 -0
  122. esphome/components/demo/demo_datetime.h +40 -0
  123. esphome/components/demo/demo_lock.h +17 -0
  124. esphome/components/demo/demo_select.h +15 -0
  125. esphome/components/demo/demo_text.h +18 -0
  126. esphome/components/demo/demo_time.h +34 -0
  127. esphome/components/demo/demo_valve.h +54 -0
  128. esphome/components/dfrobot_sen0395/commands.cpp +3 -3
  129. esphome/components/dht/dht.cpp +29 -50
  130. esphome/components/dht12/dht12.cpp +2 -2
  131. esphome/components/display/display.h +5 -3
  132. esphome/components/dps310/dps310.cpp +7 -5
  133. esphome/components/ds1307/ds1307.cpp +2 -2
  134. esphome/components/dsmr/dsmr.cpp +5 -3
  135. esphome/components/duty_cycle/duty_cycle_sensor.cpp +2 -2
  136. esphome/components/duty_time/duty_time_sensor.cpp +5 -3
  137. esphome/components/ee895/ee895.cpp +3 -3
  138. esphome/components/ektf2232/touchscreen/ektf2232.cpp +1 -1
  139. esphome/components/emc2101/emc2101.cpp +11 -9
  140. esphome/components/ens160_base/ens160_base.cpp +2 -2
  141. esphome/components/ens210/ens210.cpp +2 -2
  142. esphome/components/es7210/es7210.cpp +6 -4
  143. esphome/components/es7243e/es7243e.cpp +1 -1
  144. esphome/components/es8156/es8156.cpp +1 -1
  145. esphome/components/es8311/es8311.cpp +8 -6
  146. esphome/components/es8388/__init__.py +0 -0
  147. esphome/components/es8388/audio_dac.py +26 -0
  148. esphome/components/es8388/es8388.cpp +289 -0
  149. esphome/components/es8388/es8388.h +81 -0
  150. esphome/components/es8388/es8388_const.h +83 -0
  151. esphome/components/es8388/select/__init__.py +47 -0
  152. esphome/components/es8388/select/adc_input_mic_select.cpp +12 -0
  153. esphome/components/es8388/select/adc_input_mic_select.h +15 -0
  154. esphome/components/es8388/select/dac_output_select.cpp +12 -0
  155. esphome/components/es8388/select/dac_output_select.h +15 -0
  156. esphome/components/esp32/__init__.py +88 -20
  157. esphome/components/esp32/boards.py +208 -125
  158. esphome/components/esp32/const.py +6 -0
  159. esphome/components/esp32/gpio.py +14 -1
  160. esphome/components/esp32/gpio_esp32_c5.py +45 -0
  161. esphome/components/esp32/gpio_esp32_p4.py +43 -0
  162. esphome/components/esp32/preferences.cpp +7 -7
  163. esphome/components/esp32_ble/__init__.py +115 -0
  164. esphome/components/esp32_ble/ble.cpp +11 -9
  165. esphome/components/esp32_ble/ble_uuid.h +1 -1
  166. esphome/components/esp32_ble_client/ble_client_base.cpp +4 -2
  167. esphome/components/esp32_ble_server/__init__.py +4 -1
  168. esphome/components/esp32_ble_server/ble_characteristic.cpp +1 -0
  169. esphome/components/esp32_ble_server/ble_server.h +0 -1
  170. esphome/components/esp32_ble_tracker/__init__.py +6 -2
  171. esphome/components/esp32_ble_tracker/esp32_ble_tracker.cpp +12 -9
  172. esphome/components/esp32_camera/esp32_camera.cpp +35 -27
  173. esphome/components/esp32_camera_web_server/camera_web_server.cpp +4 -2
  174. esphome/components/esp32_dac/esp32_dac.cpp +2 -2
  175. esphome/components/esp32_improv/__init__.py +5 -1
  176. esphome/components/esp32_improv/esp32_improv_component.cpp +2 -2
  177. esphome/components/esp32_rmt_led_strip/led_strip.cpp +11 -7
  178. esphome/components/esp32_rmt_led_strip/light.py +5 -1
  179. esphome/components/esp32_touch/esp32_touch.cpp +12 -8
  180. esphome/components/esp8266/gpio.cpp +10 -1
  181. esphome/components/esp8266/preferences.cpp +6 -6
  182. esphome/components/esp8266_pwm/esp8266_pwm.cpp +3 -3
  183. esphome/components/esp_ldo/__init__.py +91 -0
  184. esphome/components/esp_ldo/esp_ldo.cpp +43 -0
  185. esphome/components/esp_ldo/esp_ldo.h +43 -0
  186. esphome/components/esphome/ota/ota_esphome.cpp +15 -8
  187. esphome/components/ethernet/ethernet_component.cpp +38 -26
  188. esphome/components/ethernet/ethernet_component.h +1 -1
  189. esphome/components/event/__init__.py +1 -0
  190. esphome/components/exposure_notifications/exposure_notifications.cpp +1 -1
  191. esphome/components/ezo/ezo.cpp +1 -1
  192. esphome/components/ezo_pmp/ezo_pmp.cpp +1 -1
  193. esphome/components/factory_reset/button/factory_reset_button.cpp +1 -1
  194. esphome/components/factory_reset/switch/factory_reset_switch.cpp +1 -1
  195. esphome/components/fan/__init__.py +1 -0
  196. esphome/components/fan/fan.cpp +4 -2
  197. esphome/components/fastled_base/fastled_light.cpp +7 -5
  198. esphome/components/fingerprint_grow/fingerprint_grow.cpp +8 -6
  199. esphome/components/fs3000/fs3000.cpp +1 -1
  200. esphome/components/ft5x06/touchscreen/ft5x06_touchscreen.cpp +7 -4
  201. esphome/components/ft63x6/ft63x6.cpp +5 -3
  202. esphome/components/gcja5/gcja5.cpp +0 -12
  203. esphome/components/gcja5/gcja5.h +8 -3
  204. esphome/components/gdk101/gdk101.cpp +2 -2
  205. esphome/components/globals/globals_component.h +13 -10
  206. esphome/components/gp2y1010au0f/gp2y1010au0f.cpp +4 -2
  207. esphome/components/gp8403/gp8403.cpp +4 -2
  208. esphome/components/gp8403/output/gp8403_output.cpp +4 -2
  209. esphome/components/gpio/one_wire/gpio_one_wire.cpp +2 -2
  210. esphome/components/gpio/output/gpio_binary_output.cpp +1 -1
  211. esphome/components/gpio/switch/gpio_switch.cpp +1 -1
  212. esphome/components/graphical_display_menu/graphical_display_menu.cpp +12 -8
  213. esphome/components/grove_gas_mc_v2/grove_gas_mc_v2.cpp +5 -6
  214. esphome/components/grove_tb6612fng/grove_tb6612fng.cpp +1 -1
  215. esphome/components/grove_tb6612fng/grove_tb6612fng.h +1 -1
  216. esphome/components/growatt_solar/growatt_solar.cpp +6 -3
  217. esphome/components/gt911/touchscreen/gt911_touchscreen.cpp +1 -1
  218. esphome/components/haier/haier_base.cpp +2 -2
  219. esphome/components/haier/hon_climate.cpp +13 -6
  220. esphome/components/havells_solar/havells_solar.cpp +5 -2
  221. esphome/components/hbridge/switch/hbridge_switch.cpp +1 -1
  222. esphome/components/hdc1080/hdc1080.cpp +2 -2
  223. esphome/components/he60r/he60r.cpp +4 -2
  224. esphome/components/hlw8012/hlw8012.cpp +6 -4
  225. esphome/components/hm3301/hm3301.cpp +2 -2
  226. esphome/components/hmc5883l/hmc5883l.cpp +2 -2
  227. esphome/components/homeassistant/time/homeassistant_time.cpp +4 -2
  228. esphome/components/honeywell_hih_i2c/honeywell_hih.cpp +4 -4
  229. esphome/components/honeywellabp/honeywellabp.cpp +4 -2
  230. esphome/components/honeywellabp2_i2c/honeywellabp2.cpp +8 -6
  231. esphome/components/hte501/hte501.cpp +3 -2
  232. esphome/components/http_request/__init__.py +2 -2
  233. esphome/components/http_request/http_request.cpp +7 -5
  234. esphome/components/http_request/http_request_idf.cpp +4 -2
  235. esphome/components/http_request/ota/ota_http_request.cpp +1 -1
  236. esphome/components/htu21d/htu21d.cpp +2 -2
  237. esphome/components/htu31d/htu31d.cpp +2 -2
  238. esphome/components/hx711/hx711.cpp +2 -2
  239. esphome/components/hydreon_rgxx/hydreon_rgxx.cpp +5 -3
  240. esphome/components/hyt271/hyt271.cpp +2 -2
  241. esphome/components/i2c/i2c_bus_arduino.cpp +14 -11
  242. esphome/components/i2c/i2c_bus_esp_idf.cpp +13 -11
  243. esphome/components/i2s_audio/__init__.py +2 -0
  244. esphome/components/i2s_audio/i2s_audio.cpp +3 -4
  245. esphome/components/i2s_audio/i2s_audio.h +1 -1
  246. esphome/components/i2s_audio/media_player/__init__.py +1 -1
  247. esphome/components/i2s_audio/media_player/i2s_audio_media_player.cpp +5 -3
  248. esphome/components/i2s_audio/microphone/i2s_audio_microphone.cpp +54 -64
  249. esphome/components/i2s_audio/microphone/i2s_audio_microphone.h +4 -0
  250. esphome/components/i2s_audio/speaker/i2s_audio_speaker.cpp +1 -1
  251. esphome/components/iaqcore/iaqcore.cpp +3 -3
  252. esphome/components/ili9xxx/ili9xxx_display.cpp +12 -7
  253. esphome/components/ili9xxx/ili9xxx_display.h +1 -1
  254. esphome/components/image/image.cpp +1 -0
  255. esphome/components/ina219/ina219.cpp +2 -2
  256. esphome/components/ina226/ina226.cpp +8 -5
  257. esphome/components/ina260/ina260.cpp +1 -1
  258. esphome/components/ina2xx_base/ina2xx_base.cpp +13 -9
  259. esphome/components/ina3221/ina3221.cpp +2 -2
  260. esphome/components/inkplate6/display.py +12 -2
  261. esphome/components/inkplate6/inkplate.cpp +13 -9
  262. esphome/components/inkplate6/inkplate.h +7 -6
  263. esphome/components/integration/integration_sensor.cpp +1 -1
  264. esphome/components/internal_temperature/internal_temperature.cpp +4 -4
  265. esphome/components/json/json_util.cpp +4 -5
  266. esphome/components/kamstrup_kmp/kamstrup_kmp.cpp +1 -1
  267. esphome/components/key_collector/key_collector.cpp +4 -2
  268. esphome/components/kmeteriso/kmeteriso.cpp +2 -1
  269. esphome/components/kuntze/kuntze.cpp +4 -2
  270. esphome/components/lc709203f/__init__.py +1 -0
  271. esphome/components/lc709203f/lc709203f.cpp +299 -0
  272. esphome/components/lc709203f/lc709203f.h +55 -0
  273. esphome/components/lc709203f/sensor.py +93 -0
  274. esphome/components/lcd_base/lcd_display.cpp +2 -2
  275. esphome/components/lcd_gpio/gpio_lcd_display.cpp +5 -3
  276. esphome/components/lcd_menu/lcd_menu.cpp +6 -4
  277. esphome/components/lcd_pcf8574/pcf8574_display.cpp +6 -4
  278. esphome/components/ld2410/ld2410.cpp +6 -7
  279. esphome/components/ld2420/ld2420.cpp +9 -7
  280. esphome/components/ld2450/ld2450.cpp +6 -4
  281. esphome/components/ld2450/sensor.py +2 -2
  282. esphome/components/ledc/ledc_output.cpp +32 -28
  283. esphome/components/libretiny/const.py +1 -1
  284. esphome/components/libretiny/preferences.cpp +6 -7
  285. esphome/components/light/__init__.py +2 -1
  286. esphome/components/light/esp_hsv_color.h +1 -1
  287. esphome/components/light/light_state.cpp +9 -5
  288. esphome/components/light/light_transformer.h +1 -1
  289. esphome/components/lightwaverf/LwTx.cpp +1 -1
  290. esphome/components/lightwaverf/lightwaverf.cpp +1 -1
  291. esphome/components/lilygo_t5_47/touchscreen/lilygo_t5_47_touchscreen.cpp +1 -1
  292. esphome/components/lock/__init__.py +1 -0
  293. esphome/components/lock/lock.h +1 -1
  294. esphome/components/logger/__init__.py +6 -0
  295. esphome/components/logger/logger.cpp +9 -5
  296. esphome/components/logger/logger.h +4 -4
  297. esphome/components/logger/logger_esp32.cpp +5 -5
  298. esphome/components/ltr390/ltr390.cpp +8 -5
  299. esphome/components/ltr501/ltr501.cpp +19 -14
  300. esphome/components/ltr_als_ps/ltr_als_ps.cpp +20 -13
  301. esphome/components/lvgl/__init__.py +2 -2
  302. esphome/components/lvgl/automation.py +5 -4
  303. esphome/components/lvgl/defines.py +0 -2
  304. esphome/components/lvgl/lv_validation.py +1 -3
  305. esphome/components/lvgl/lvcode.py +7 -8
  306. esphome/components/lvgl/lvgl_esphome.cpp +26 -10
  307. esphome/components/lvgl/schemas.py +22 -23
  308. esphome/components/lvgl/trigger.py +8 -3
  309. esphome/components/lvgl/widgets/__init__.py +2 -2
  310. esphome/components/lvgl/widgets/canvas.py +9 -3
  311. esphome/components/lvgl/widgets/line.py +2 -1
  312. esphome/components/lvgl/widgets/tabview.py +7 -0
  313. esphome/components/m5stack_8angle/m5stack_8angle.cpp +3 -3
  314. esphome/components/matrix_keypad/matrix_keypad.cpp +2 -2
  315. esphome/components/max17043/max17043.cpp +2 -2
  316. esphome/components/max31855/max31855.cpp +2 -1
  317. esphome/components/max31856/max31856.cpp +9 -11
  318. esphome/components/max31865/max31865.cpp +6 -4
  319. esphome/components/max44009/max44009.cpp +2 -2
  320. esphome/components/max6675/max6675.cpp +1 -1
  321. esphome/components/max6956/max6956.cpp +5 -3
  322. esphome/components/max7219/max7219.cpp +8 -6
  323. esphome/components/max7219digit/automation.h +52 -0
  324. esphome/components/max7219digit/display.py +93 -1
  325. esphome/components/max7219digit/max7219digit.cpp +16 -13
  326. esphome/components/max9611/max9611.cpp +9 -6
  327. esphome/components/mcp23008/mcp23008.cpp +1 -1
  328. esphome/components/mcp23016/mcp23016.cpp +1 -1
  329. esphome/components/mcp23017/mcp23017.cpp +1 -1
  330. esphome/components/mcp23s08/mcp23s08.cpp +1 -1
  331. esphome/components/mcp23s17/mcp23s17.cpp +1 -1
  332. esphome/components/mcp3008/mcp3008.cpp +1 -1
  333. esphome/components/mcp3008/sensor/mcp3008_sensor.cpp +5 -3
  334. esphome/components/mcp3204/mcp3204.cpp +1 -1
  335. esphome/components/mcp4461/mcp4461.cpp +2 -2
  336. esphome/components/mcp4725/mcp4725.cpp +2 -2
  337. esphome/components/mcp4728/mcp4728.cpp +2 -2
  338. esphome/components/mcp9600/mcp9600.cpp +1 -1
  339. esphome/components/mcp9808/mcp9808.cpp +4 -4
  340. esphome/components/mdns/mdns_component.cpp +8 -2
  341. esphome/components/mdns/mdns_component.h +3 -1
  342. esphome/components/mdns/mdns_esp32.cpp +2 -2
  343. esphome/components/media_player/__init__.py +1 -0
  344. esphome/components/micro_wake_word/micro_wake_word.cpp +1 -1
  345. esphome/components/micro_wake_word/streaming_model.cpp +10 -6
  346. esphome/components/micronova/micronova.h +2 -2
  347. esphome/components/mics_4514/mics_4514.cpp +2 -2
  348. esphome/components/midea/air_conditioner.cpp +7 -5
  349. esphome/components/midea_ir/midea_ir.cpp +1 -1
  350. esphome/components/mipi_spi/mipi_spi.cpp +24 -15
  351. esphome/components/mixer/speaker/mixer_speaker.cpp +8 -4
  352. esphome/components/mlx90393/sensor_mlx90393.cpp +2 -2
  353. esphome/components/mlx90614/mlx90614.cpp +4 -3
  354. esphome/components/mmc5603/mmc5603.cpp +2 -2
  355. esphome/components/mmc5983/mmc5983.cpp +1 -1
  356. esphome/components/modbus/modbus.cpp +7 -5
  357. esphome/components/modbus_controller/modbus_controller.cpp +6 -4
  358. esphome/components/modbus_controller/output/modbus_output.cpp +10 -6
  359. esphome/components/modbus_controller/switch/__init__.py +6 -2
  360. esphome/components/modbus_controller/switch/modbus_switch.cpp +4 -0
  361. esphome/components/modbus_controller/switch/modbus_switch.h +3 -0
  362. esphome/components/mpl3115a2/mpl3115a2.cpp +3 -2
  363. esphome/components/mpr121/mpr121.cpp +2 -2
  364. esphome/components/mpu6050/mpu6050.cpp +6 -6
  365. esphome/components/mpu6886/mpu6886.cpp +6 -6
  366. esphome/components/mqtt/mqtt_alarm_control_panel.cpp +7 -3
  367. esphome/components/mqtt/mqtt_backend_esp32.cpp +1 -1
  368. esphome/components/mqtt/mqtt_client.cpp +31 -24
  369. esphome/components/mqtt/mqtt_component.cpp +2 -2
  370. esphome/components/mqtt/mqtt_cover.cpp +8 -4
  371. esphome/components/mqtt/mqtt_fan.cpp +12 -6
  372. esphome/components/mqtt/mqtt_valve.cpp +4 -2
  373. esphome/components/ms5611/ms5611.cpp +2 -2
  374. esphome/components/ms8607/ms8607.cpp +2 -2
  375. esphome/components/msa3xx/msa3xx.cpp +16 -12
  376. esphome/components/my9231/my9231.cpp +7 -5
  377. esphome/components/nau7802/nau7802.cpp +6 -4
  378. esphome/components/neopixelbus/neopixelbus_light.h +2 -2
  379. esphome/components/network/ip_address.h +1 -1
  380. esphome/components/network/util.cpp +13 -0
  381. esphome/components/nextion/base_component.py +2 -0
  382. esphome/components/nextion/binary_sensor/nextion_binarysensor.cpp +2 -3
  383. esphome/components/nextion/display.py +34 -22
  384. esphome/components/nextion/nextion.cpp +182 -143
  385. esphome/components/nextion/nextion.h +36 -0
  386. esphome/components/nextion/nextion_commands.cpp +3 -3
  387. esphome/components/nextion/nextion_upload_arduino.cpp +58 -61
  388. esphome/components/nextion/nextion_upload_idf.cpp +69 -72
  389. esphome/components/nextion/sensor/nextion_sensor.cpp +4 -4
  390. esphome/components/nextion/switch/nextion_switch.cpp +2 -2
  391. esphome/components/nextion/text_sensor/nextion_textsensor.cpp +2 -2
  392. esphome/components/nfc/nci_message.h +1 -1
  393. esphome/components/nfc/ndef_record.h +1 -1
  394. esphome/components/nfc/ndef_record_text.h +1 -1
  395. esphome/components/nfc/ndef_record_uri.h +1 -1
  396. esphome/components/nfc/nfc.h +1 -1
  397. esphome/components/nfc/nfc_tag.h +1 -1
  398. esphome/components/noblex/noblex.cpp +1 -1
  399. esphome/components/npi19/npi19.cpp +5 -7
  400. esphome/components/number/__init__.py +11 -0
  401. esphome/components/online_image/__init__.py +13 -1
  402. esphome/components/online_image/online_image.cpp +26 -4
  403. esphome/components/online_image/online_image.h +21 -4
  404. esphome/components/opentherm/generate.py +3 -3
  405. esphome/components/opentherm/hub.cpp +11 -7
  406. esphome/components/opentherm/number/number.cpp +5 -3
  407. esphome/components/opentherm/opentherm.h +1 -1
  408. esphome/components/opentherm/schema.py +13 -13
  409. esphome/components/opentherm/validate.py +1 -1
  410. esphome/components/openthread/__init__.py +146 -0
  411. esphome/components/openthread/const.py +10 -0
  412. esphome/components/openthread/openthread.cpp +206 -0
  413. esphome/components/openthread/openthread.h +68 -0
  414. esphome/components/openthread/openthread_esp.cpp +164 -0
  415. esphome/components/openthread/tlv.py +58 -0
  416. esphome/components/openthread_info/__init__.py +0 -0
  417. esphome/components/openthread_info/openthread_info_text_sensor.cpp +24 -0
  418. esphome/components/openthread_info/openthread_info_text_sensor.h +218 -0
  419. esphome/components/openthread_info/text_sensor.py +105 -0
  420. esphome/components/output/float_output.cpp +1 -1
  421. esphome/components/output/switch/output_switch.cpp +1 -1
  422. esphome/components/packet_transport/packet_transport.cpp +6 -4
  423. esphome/components/pca6416a/pca6416a.cpp +2 -2
  424. esphome/components/pca9554/pca9554.cpp +6 -4
  425. esphome/components/pca9685/pca9685_output.cpp +12 -8
  426. esphome/components/pcd8544/pcd_8544.cpp +1 -1
  427. esphome/components/pcf85063/pcf85063.cpp +2 -2
  428. esphome/components/pcf8563/pcf8563.cpp +2 -2
  429. esphome/components/pcf8574/pcf8574.cpp +2 -2
  430. esphome/components/pid/pid_climate.cpp +8 -5
  431. esphome/components/pid/pid_climate.h +1 -1
  432. esphome/components/pid/sensor/pid_climate_sensor.cpp +1 -1
  433. esphome/components/pipsolar/output/pipsolar_output.cpp +1 -1
  434. esphome/components/pipsolar/pipsolar.cpp +3 -3
  435. esphome/components/pm1006/pm1006.cpp +3 -7
  436. esphome/components/pm1006/pm1006.h +4 -1
  437. esphome/components/pm2005/pm2005.cpp +12 -13
  438. esphome/components/pm2005/sensor.py +1 -1
  439. esphome/components/pmsa003i/pmsa003i.cpp +2 -2
  440. esphome/components/pmsx003/pmsx003.cpp +0 -4
  441. esphome/components/pmsx003/pmsx003.h +5 -2
  442. esphome/components/pmwcs3/pmwcs3.cpp +9 -13
  443. esphome/components/pmwcs3/pmwcs3.h +0 -1
  444. esphome/components/pn532/pn532.cpp +7 -7
  445. esphome/components/pn532/pn532.h +1 -1
  446. esphome/components/pn532_spi/pn532_spi.cpp +1 -1
  447. esphome/components/pn7150/pn7150.cpp +4 -4
  448. esphome/components/pn7160/pn7160.cpp +4 -4
  449. esphome/components/power_supply/power_supply.cpp +6 -4
  450. esphome/components/power_supply/power_supply.h +1 -1
  451. esphome/components/psram/__init__.py +59 -35
  452. esphome/components/pulse_counter/pulse_counter_sensor.cpp +7 -4
  453. esphome/components/pvvx_mithermometer/display/pvvx_display.cpp +8 -5
  454. esphome/components/pylontech/pylontech.cpp +2 -2
  455. esphome/components/pylontech/sensor/pylontech_sensor.cpp +4 -2
  456. esphome/components/pylontech/text_sensor/pylontech_text_sensor.cpp +4 -2
  457. esphome/components/pzemac/pzemac.cpp +4 -2
  458. esphome/components/pzemdc/pzemdc.cpp +4 -2
  459. esphome/components/qmc5883l/qmc5883l.cpp +2 -2
  460. esphome/components/qmp6988/qmp6988.cpp +2 -2
  461. esphome/components/qmp6988/qmp6988.h +1 -1
  462. esphome/components/qr_code/qr_code.cpp +5 -3
  463. esphome/components/qspi_dbi/qspi_dbi.cpp +1 -1
  464. esphome/components/qwiic_pir/qwiic_pir.cpp +26 -28
  465. esphome/components/rc522/rc522.cpp +5 -5
  466. esphome/components/rdm6300/rdm6300.cpp +1 -0
  467. esphome/components/remote_receiver/__init__.py +10 -2
  468. esphome/components/remote_receiver/remote_receiver_esp32.cpp +22 -12
  469. esphome/components/remote_receiver/remote_receiver_esp8266.cpp +10 -7
  470. esphome/components/remote_receiver/remote_receiver_libretiny.cpp +10 -7
  471. esphome/components/remote_transmitter/__init__.py +10 -2
  472. esphome/components/remote_transmitter/remote_transmitter_esp32.cpp +10 -6
  473. esphome/components/remote_transmitter/remote_transmitter_esp8266.cpp +5 -3
  474. esphome/components/remote_transmitter/remote_transmitter_libretiny.cpp +5 -3
  475. esphome/components/resistance/resistance_sensor.cpp +6 -3
  476. esphome/components/restart/button/restart_button.cpp +1 -1
  477. esphome/components/restart/switch/restart_switch.cpp +1 -1
  478. esphome/components/rotary_encoder/rotary_encoder.cpp +2 -2
  479. esphome/components/rp2040/__init__.py +7 -0
  480. esphome/components/rp2040/core.cpp +8 -1
  481. esphome/components/rp2040/gpio.cpp +26 -9
  482. esphome/components/rp2040/preferences.cpp +3 -3
  483. esphome/components/rp2040_pio_led_strip/led_strip.cpp +11 -8
  484. esphome/components/rp2040_pio_led_strip/light.py +1 -1
  485. esphome/components/rp2040_pwm/rp2040_pwm.cpp +1 -1
  486. esphome/components/rpi_dpi_rgb/rpi_dpi_rgb.cpp +1 -1
  487. esphome/components/rtttl/rtttl.cpp +11 -9
  488. esphome/components/safe_mode/button/safe_mode_button.cpp +1 -1
  489. esphome/components/safe_mode/safe_mode.cpp +9 -8
  490. esphome/components/safe_mode/switch/safe_mode_switch.cpp +1 -1
  491. esphome/components/scd30/scd30.cpp +11 -8
  492. esphome/components/scd4x/scd4x.cpp +12 -8
  493. esphome/components/sdl/display.py +40 -0
  494. esphome/components/sdl/sdl_esphome.cpp +2 -2
  495. esphome/components/sdl/sdl_esphome.h +8 -0
  496. esphome/components/sdm_meter/sdm_meter.cpp +5 -2
  497. esphome/components/sdp3x/sdp3x.cpp +11 -11
  498. esphome/components/sds011/sds011.cpp +5 -6
  499. esphome/components/sds011/sds011.h +4 -1
  500. esphome/components/seeed_mr24hpc1/seeed_mr24hpc1.cpp +3 -2
  501. esphome/components/seeed_mr60bha2/seeed_mr60bha2.cpp +1 -0
  502. esphome/components/seeed_mr60fda2/seeed_mr60fda2.cpp +3 -2
  503. esphome/components/selec_meter/selec_meter.cpp +5 -2
  504. esphome/components/select/__init__.py +1 -0
  505. esphome/components/sen0321/sen0321.cpp +2 -2
  506. esphome/components/sen21231/sen21231.cpp +1 -1
  507. esphome/components/sen5x/sen5x.cpp +10 -7
  508. esphome/components/sensirion_common/i2c_sensirion.cpp +2 -1
  509. esphome/components/sensirion_common/i2c_sensirion.h +1 -0
  510. esphome/components/sensor/__init__.py +11 -1
  511. esphome/components/sensor/filter.h +1 -1
  512. esphome/components/sensor/sensor.h +9 -5
  513. esphome/components/servo/servo.cpp +12 -9
  514. esphome/components/servo/servo.h +1 -1
  515. esphome/components/sfa30/sfa30.cpp +1 -1
  516. esphome/components/sgp30/sgp30.cpp +10 -8
  517. esphome/components/sgp4x/sgp4x.cpp +49 -61
  518. esphome/components/sgp4x/sgp4x.h +0 -1
  519. esphome/components/shelly_dimmer/shelly_dimmer.cpp +11 -7
  520. esphome/components/sht3xd/sht3xd.cpp +1 -1
  521. esphome/components/sht4x/sht4x.cpp +2 -2
  522. esphome/components/shtcx/shtcx.cpp +13 -16
  523. esphome/components/shutdown/button/shutdown_button.cpp +1 -1
  524. esphome/components/shutdown/switch/shutdown_switch.cpp +1 -1
  525. esphome/components/sim800l/sim800l.cpp +2 -2
  526. esphome/components/slow_pwm/slow_pwm_output.cpp +4 -2
  527. esphome/components/sm16716/sm16716.cpp +1 -1
  528. esphome/components/sm2135/sm2135.cpp +1 -1
  529. esphome/components/sm2235/sm2235.cpp +5 -3
  530. esphome/components/sm2335/sm2335.cpp +5 -3
  531. esphome/components/sml/sml.cpp +1 -1
  532. esphome/components/sn74hc165/sn74hc165.cpp +1 -2
  533. esphome/components/sn74hc595/sn74hc595.cpp +1 -2
  534. esphome/components/sntp/sntp_component.cpp +1 -1
  535. esphome/components/socket/__init__.py +2 -0
  536. esphome/components/socket/bsd_sockets_impl.cpp +51 -7
  537. esphome/components/socket/lwip_raw_tcp_impl.cpp +5 -0
  538. esphome/components/socket/lwip_sockets_impl.cpp +51 -7
  539. esphome/components/socket/socket.cpp +31 -0
  540. esphome/components/socket/socket.h +27 -1
  541. esphome/components/sonoff_d1/sonoff_d1.cpp +7 -4
  542. esphome/components/sonoff_d1/sonoff_d1.h +2 -2
  543. esphome/components/sound_level/sound_level.cpp +4 -2
  544. esphome/components/speaker/media_player/__init__.py +3 -0
  545. esphome/components/speaker/media_player/speaker_media_player.cpp +1 -3
  546. esphome/components/speaker/media_player/speaker_media_player.h +6 -0
  547. esphome/components/spi/__init__.py +10 -2
  548. esphome/components/spi/spi.cpp +4 -4
  549. esphome/components/spi_device/spi_device.cpp +1 -2
  550. esphome/components/sprinkler/sprinkler.cpp +9 -6
  551. esphome/components/sps30/sps30.cpp +16 -15
  552. esphome/components/ssd1306_base/ssd1306_base.cpp +1 -1
  553. esphome/components/ssd1306_i2c/ssd1306_i2c.cpp +11 -8
  554. esphome/components/ssd1306_spi/ssd1306_spi.cpp +10 -7
  555. esphome/components/ssd1322_base/ssd1322_base.cpp +1 -1
  556. esphome/components/ssd1322_spi/ssd1322_spi.cpp +1 -1
  557. esphome/components/ssd1325_base/ssd1325_base.cpp +1 -1
  558. esphome/components/ssd1325_spi/ssd1325_spi.cpp +1 -1
  559. esphome/components/ssd1327_base/ssd1327_base.cpp +1 -1
  560. esphome/components/ssd1327_i2c/ssd1327_i2c.cpp +2 -2
  561. esphome/components/ssd1327_spi/ssd1327_spi.cpp +1 -1
  562. esphome/components/ssd1331_base/ssd1331_base.cpp +1 -1
  563. esphome/components/ssd1331_spi/ssd1331_spi.cpp +1 -1
  564. esphome/components/ssd1351_base/ssd1351_base.cpp +1 -1
  565. esphome/components/ssd1351_spi/ssd1351_spi.cpp +1 -1
  566. esphome/components/st7567_base/st7567_base.cpp +3 -3
  567. esphome/components/st7567_i2c/st7567_i2c.cpp +7 -5
  568. esphome/components/st7567_spi/st7567_spi.cpp +1 -1
  569. esphome/components/st7701s/st7701s.cpp +4 -2
  570. esphome/components/st7735/st7735.cpp +3 -3
  571. esphome/components/st7789v/st7789v.cpp +10 -7
  572. esphome/components/st7920/st7920.cpp +6 -4
  573. esphome/components/statsd/statsd.cpp +9 -5
  574. esphome/components/status_led/light/status_led_light.cpp +1 -1
  575. esphome/components/status_led/status_led.cpp +1 -1
  576. esphome/components/stepper/stepper.h +5 -3
  577. esphome/components/sts3x/sts3x.cpp +2 -2
  578. esphome/components/switch/__init__.py +1 -0
  579. esphome/components/switch/switch.cpp +18 -12
  580. esphome/components/switch/switch.h +1 -1
  581. esphome/components/sx1509/__init__.py +53 -20
  582. esphome/components/sx1509/sx1509.cpp +29 -5
  583. esphome/components/sx1509/sx1509.h +9 -1
  584. esphome/components/t6615/t6615.cpp +1 -0
  585. esphome/components/tc74/tc74.cpp +1 -1
  586. esphome/components/tca9548a/tca9548a.cpp +1 -1
  587. esphome/components/tca9555/tca9555.cpp +2 -2
  588. esphome/components/tcs34725/tcs34725.cpp +4 -4
  589. esphome/components/tee501/tee501.cpp +3 -2
  590. esphome/components/tem3200/tem3200.cpp +5 -6
  591. esphome/components/template/alarm_control_panel/__init__.py +6 -0
  592. esphome/components/template/alarm_control_panel/template_alarm_control_panel.cpp +38 -12
  593. esphome/components/template/alarm_control_panel/template_alarm_control_panel.h +3 -1
  594. esphome/components/template/cover/template_cover.cpp +1 -1
  595. esphome/components/template/select/template_select.cpp +6 -4
  596. esphome/components/template/text/template_text.cpp +2 -3
  597. esphome/components/template/valve/template_valve.cpp +5 -3
  598. esphome/components/text/__init__.py +10 -11
  599. esphome/components/text_sensor/__init__.py +1 -0
  600. esphome/components/thermostat/thermostat_climate.cpp +67 -43
  601. esphome/components/time/__init__.py +1 -2
  602. esphome/components/time_based/time_based_cover.cpp +4 -2
  603. esphome/components/tlc59208f/tlc59208f_output.cpp +8 -6
  604. esphome/components/tm1621/tm1621.cpp +3 -3
  605. esphome/components/tm1637/tm1637.cpp +9 -7
  606. esphome/components/tm1638/tm1638.cpp +7 -5
  607. esphome/components/tm1651/tm1651.cpp +2 -2
  608. esphome/components/tmp102/tmp102.cpp +1 -3
  609. esphome/components/tmp102/tmp102.h +0 -3
  610. esphome/components/tmp1075/tmp1075.cpp +12 -9
  611. esphome/components/tmp117/tmp117.cpp +2 -2
  612. esphome/components/tof10120/tof10120_sensor.cpp +2 -2
  613. esphome/components/tormatic/tormatic_cover.cpp +4 -2
  614. esphome/components/tsl2561/tsl2561.cpp +7 -5
  615. esphome/components/tsl2591/tsl2591.cpp +25 -27
  616. esphome/components/tt21100/touchscreen/tt21100.cpp +1 -1
  617. esphome/components/ttp229_bsf/ttp229_bsf.cpp +1 -1
  618. esphome/components/ttp229_lsf/ttp229_lsf.cpp +2 -2
  619. esphome/components/tuya/select/tuya_select.cpp +5 -3
  620. esphome/components/tx20/tx20.cpp +3 -3
  621. esphome/components/uart/__init__.py +4 -5
  622. esphome/components/uart/button/uart_button.cpp +1 -1
  623. esphome/components/uart/switch/uart_switch.cpp +2 -2
  624. esphome/components/uart/uart.cpp +2 -2
  625. esphome/components/uart/uart_component_esp32_arduino.cpp +8 -6
  626. esphome/components/uart/uart_component_esp8266.cpp +9 -7
  627. esphome/components/uart/uart_component_esp_idf.cpp +9 -7
  628. esphome/components/uart/uart_component_host.cpp +11 -8
  629. esphome/components/uart/uart_component_libretiny.cpp +8 -6
  630. esphome/components/uart/uart_component_rp2040.cpp +8 -6
  631. esphome/components/udp/udp_component.cpp +9 -5
  632. esphome/components/ufire_ec/ufire_ec.cpp +5 -3
  633. esphome/components/ufire_ise/ufire_ise.cpp +1 -1
  634. esphome/components/ultrasonic/ultrasonic_sensor.cpp +5 -3
  635. esphome/components/update/__init__.py +1 -0
  636. esphome/components/uponor_smatrix/climate/uponor_smatrix_climate.cpp +1 -1
  637. esphome/components/uponor_smatrix/sensor/uponor_smatrix_sensor.cpp +4 -2
  638. esphome/components/uponor_smatrix/uponor_smatrix.cpp +2 -1
  639. esphome/components/usb_host/__init__.py +64 -0
  640. esphome/components/usb_host/usb_host.h +116 -0
  641. esphome/components/usb_host/usb_host_client.cpp +394 -0
  642. esphome/components/usb_host/usb_host_component.cpp +35 -0
  643. esphome/components/usb_uart/__init__.py +134 -0
  644. esphome/components/usb_uart/ch34x.cpp +80 -0
  645. esphome/components/usb_uart/cp210x.cpp +126 -0
  646. esphome/components/usb_uart/usb_uart.cpp +328 -0
  647. esphome/components/usb_uart/usb_uart.h +151 -0
  648. esphome/components/valve/__init__.py +1 -0
  649. esphome/components/veml3235/veml3235.cpp +13 -9
  650. esphome/components/veml7700/veml7700.cpp +10 -6
  651. esphome/components/voice_assistant/voice_assistant.cpp +7 -7
  652. esphome/components/wake_on_lan/wake_on_lan.cpp +1 -1
  653. esphome/components/waveshare_epaper/waveshare_epaper.cpp +1 -1
  654. esphome/components/web_server/server_index_v2.h +632 -630
  655. esphome/components/web_server/server_index_v3.h +411 -409
  656. esphome/components/web_server/web_server.cpp +5 -3
  657. esphome/components/web_server_base/web_server_base.cpp +1 -1
  658. esphome/components/web_server_idf/utils.cpp +1 -1
  659. esphome/components/web_server_idf/web_server_idf.cpp +1 -1
  660. esphome/components/weikai/__init__.py +2 -0
  661. esphome/components/weikai/weikai.cpp +23 -21
  662. esphome/components/weikai_i2c/weikai_i2c.cpp +14 -9
  663. esphome/components/weikai_spi/weikai_spi.cpp +11 -6
  664. esphome/components/wiegand/wiegand.cpp +1 -1
  665. esphome/components/wifi/wifi_component.cpp +50 -37
  666. esphome/components/wifi/wifi_component.h +7 -4
  667. esphome/components/wifi/wifi_component_esp32_arduino.cpp +2 -2
  668. esphome/components/wifi/wifi_component_esp8266.cpp +3 -3
  669. esphome/components/wifi/wifi_component_libretiny.cpp +4 -4
  670. esphome/components/wireguard/wireguard.cpp +21 -21
  671. esphome/components/wl_134/text_sensor.py +1 -2
  672. esphome/components/wled/wled_light_effect.cpp +1 -1
  673. esphome/components/x9c/x9c.cpp +5 -3
  674. esphome/components/xgzp68xx/xgzp68xx.cpp +8 -6
  675. esphome/components/xiaomi_cgd1/xiaomi_cgd1.cpp +4 -2
  676. esphome/components/xiaomi_cgdk2/xiaomi_cgdk2.cpp +4 -2
  677. esphome/components/xiaomi_cgg1/xiaomi_cgg1.cpp +4 -2
  678. esphome/components/xiaomi_hhccjcy10/xiaomi_hhccjcy10.cpp +1 -1
  679. esphome/components/xiaomi_lywsd02mmc/xiaomi_lywsd02mmc.cpp +4 -2
  680. esphome/components/xiaomi_lywsd03mmc/xiaomi_lywsd03mmc.cpp +4 -2
  681. esphome/components/xiaomi_mhoc401/xiaomi_mhoc401.cpp +4 -2
  682. esphome/components/xl9535/xl9535.cpp +2 -2
  683. esphome/components/xpt2046/touchscreen/xpt2046.cpp +12 -11
  684. esphome/components/xpt2046/touchscreen/xpt2046.h +2 -2
  685. esphome/config.py +3 -2
  686. esphome/config_validation.py +46 -17
  687. esphome/const.py +10 -1
  688. esphome/core/__init__.py +37 -18
  689. esphome/core/application.cpp +188 -5
  690. esphome/core/application.h +110 -0
  691. esphome/core/component.h +13 -0
  692. esphome/core/config.py +12 -0
  693. esphome/core/defines.h +10 -2
  694. esphome/core/hal.h +5 -0
  695. esphome/core/helpers.cpp +1 -1
  696. esphome/core/helpers.h +4 -4
  697. esphome/core/log.h +2 -0
  698. esphome/core/log_const_en.h +4 -0
  699. esphome/core/scheduler.cpp +2 -2
  700. esphome/coroutine.py +3 -4
  701. esphome/cpp_generator.py +32 -32
  702. esphome/dashboard/core.py +2 -2
  703. esphome/dashboard/web_server.py +2 -2
  704. esphome/git.py +4 -4
  705. esphome/helpers.py +5 -6
  706. esphome/loader.py +8 -7
  707. esphome/log.py +7 -1
  708. esphome/platformio_api.py +2 -3
  709. esphome/storage_json.py +13 -5
  710. esphome/types.py +12 -13
  711. esphome/util.py +1 -2
  712. esphome/writer.py +5 -3
  713. esphome/yaml_util.py +6 -1
  714. esphome/zeroconf.py +1 -1
  715. {esphome-2025.5.1.dist-info → esphome-2025.6.0b1.dist-info}/METADATA +12 -11
  716. {esphome-2025.5.1.dist-info → esphome-2025.6.0b1.dist-info}/RECORD +720 -667
  717. {esphome-2025.5.1.dist-info → esphome-2025.6.0b1.dist-info}/WHEEL +1 -1
  718. {esphome-2025.5.1.dist-info → esphome-2025.6.0b1.dist-info}/entry_points.txt +0 -0
  719. {esphome-2025.5.1.dist-info → esphome-2025.6.0b1.dist-info}/licenses/LICENSE +0 -0
  720. {esphome-2025.5.1.dist-info → esphome-2025.6.0b1.dist-info}/top_level.txt +0 -0
@@ -30,17 +30,17 @@ static const int32_t DC_OFFSET_MOVING_AVERAGE_COEFFICIENT_DENOMINATOR = 1000;
30
30
  static const char *const TAG = "i2s_audio.microphone";
31
31
 
32
32
  enum MicrophoneEventGroupBits : uint32_t {
33
- COMMAND_STOP = (1 << 0), // stops the microphone task
34
- TASK_STARTING = (1 << 10),
35
- TASK_RUNNING = (1 << 11),
36
- TASK_STOPPING = (1 << 12),
37
- TASK_STOPPED = (1 << 13),
33
+ COMMAND_STOP = (1 << 0), // stops the microphone task, set and cleared by ``loop``
34
+
35
+ TASK_STARTING = (1 << 10), // set by mic task, cleared by ``loop``
36
+ TASK_RUNNING = (1 << 11), // set by mic task, cleared by ``loop``
37
+ TASK_STOPPED = (1 << 13), // set by mic task, cleared by ``loop``
38
38
 
39
39
  ALL_BITS = 0x00FFFFFF, // All valid FreeRTOS event group bits
40
40
  };
41
41
 
42
42
  void I2SAudioMicrophone::setup() {
43
- ESP_LOGCONFIG(TAG, "Setting up I2S Audio Microphone...");
43
+ ESP_LOGCONFIG(TAG, "Running setup");
44
44
  #ifdef USE_I2S_LEGACY
45
45
  #if SOC_I2S_SUPPORTS_ADC
46
46
  if (this->adc_) {
@@ -151,24 +151,21 @@ bool I2SAudioMicrophone::start_driver_() {
151
151
  config.mode = (i2s_mode_t) (config.mode | I2S_MODE_ADC_BUILT_IN);
152
152
  err = i2s_driver_install(this->parent_->get_port(), &config, 0, nullptr);
153
153
  if (err != ESP_OK) {
154
- ESP_LOGW(TAG, "Error installing I2S driver: %s", esp_err_to_name(err));
155
- this->status_set_error();
154
+ ESP_LOGE(TAG, "Error installing I2S driver: %s", esp_err_to_name(err));
156
155
  return false;
157
156
  }
158
157
 
159
158
  err = i2s_set_adc_mode(ADC_UNIT_1, this->adc_channel_);
160
159
  if (err != ESP_OK) {
161
- ESP_LOGW(TAG, "Error setting ADC mode: %s", esp_err_to_name(err));
162
- this->status_set_error();
160
+ ESP_LOGE(TAG, "Error setting ADC mode: %s", esp_err_to_name(err));
163
161
  return false;
164
162
  }
163
+
165
164
  err = i2s_adc_enable(this->parent_->get_port());
166
165
  if (err != ESP_OK) {
167
- ESP_LOGW(TAG, "Error enabling ADC: %s", esp_err_to_name(err));
168
- this->status_set_error();
166
+ ESP_LOGE(TAG, "Error enabling ADC: %s", esp_err_to_name(err));
169
167
  return false;
170
168
  }
171
-
172
169
  } else
173
170
  #endif
174
171
  {
@@ -177,8 +174,7 @@ bool I2SAudioMicrophone::start_driver_() {
177
174
 
178
175
  err = i2s_driver_install(this->parent_->get_port(), &config, 0, nullptr);
179
176
  if (err != ESP_OK) {
180
- ESP_LOGW(TAG, "Error installing I2S driver: %s", esp_err_to_name(err));
181
- this->status_set_error();
177
+ ESP_LOGE(TAG, "Error installing I2S driver: %s", esp_err_to_name(err));
182
178
  return false;
183
179
  }
184
180
 
@@ -187,8 +183,7 @@ bool I2SAudioMicrophone::start_driver_() {
187
183
 
188
184
  err = i2s_set_pin(this->parent_->get_port(), &pin_config);
189
185
  if (err != ESP_OK) {
190
- ESP_LOGW(TAG, "Error setting I2S pin: %s", esp_err_to_name(err));
191
- this->status_set_error();
186
+ ESP_LOGE(TAG, "Error setting I2S pin: %s", esp_err_to_name(err));
192
187
  return false;
193
188
  }
194
189
  }
@@ -203,8 +198,7 @@ bool I2SAudioMicrophone::start_driver_() {
203
198
  /* Allocate a new RX channel and get the handle of this channel */
204
199
  err = i2s_new_channel(&chan_cfg, NULL, &this->rx_handle_);
205
200
  if (err != ESP_OK) {
206
- ESP_LOGW(TAG, "Error creating new I2S channel: %s", esp_err_to_name(err));
207
- this->status_set_error();
201
+ ESP_LOGE(TAG, "Error creating new I2S channel: %s", esp_err_to_name(err));
208
202
  return false;
209
203
  }
210
204
 
@@ -276,22 +270,20 @@ bool I2SAudioMicrophone::start_driver_() {
276
270
  err = i2s_channel_init_std_mode(this->rx_handle_, &std_cfg);
277
271
  }
278
272
  if (err != ESP_OK) {
279
- ESP_LOGW(TAG, "Error initializing I2S channel: %s", esp_err_to_name(err));
280
- this->status_set_error();
273
+ ESP_LOGE(TAG, "Error initializing I2S channel: %s", esp_err_to_name(err));
281
274
  return false;
282
275
  }
283
276
 
284
277
  /* Before reading data, start the RX channel first */
285
278
  i2s_channel_enable(this->rx_handle_);
286
279
  if (err != ESP_OK) {
287
- ESP_LOGW(TAG, "Error enabling I2S Microphone: %s", esp_err_to_name(err));
288
- this->status_set_error();
280
+ ESP_LOGE(TAG, "Error enabling I2S Microphone: %s", esp_err_to_name(err));
289
281
  return false;
290
282
  }
291
283
  #endif
292
284
 
293
- this->status_clear_error();
294
285
  this->configure_stream_settings_(); // redetermine the settings in case some settings were changed after compilation
286
+
295
287
  return true;
296
288
  }
297
289
 
@@ -303,71 +295,55 @@ void I2SAudioMicrophone::stop() {
303
295
  }
304
296
 
305
297
  void I2SAudioMicrophone::stop_driver_() {
298
+ // There is no harm continuing to unload the driver if an error is ever returned by the various functions. This
299
+ // ensures that we stop/unload the driver when it only partially starts.
300
+
306
301
  esp_err_t err;
307
302
  #ifdef USE_I2S_LEGACY
308
303
  #if SOC_I2S_SUPPORTS_ADC
309
304
  if (this->adc_) {
310
305
  err = i2s_adc_disable(this->parent_->get_port());
311
306
  if (err != ESP_OK) {
312
- ESP_LOGW(TAG, "Error disabling ADC: %s", esp_err_to_name(err));
313
- this->status_set_error();
314
- return;
307
+ ESP_LOGW(TAG, "Error disabling ADC - it may not have started: %s", esp_err_to_name(err));
315
308
  }
316
309
  }
317
310
  #endif
318
311
  err = i2s_stop(this->parent_->get_port());
319
312
  if (err != ESP_OK) {
320
- ESP_LOGW(TAG, "Error stopping I2S microphone: %s", esp_err_to_name(err));
321
- this->status_set_error();
322
- return;
313
+ ESP_LOGW(TAG, "Error stopping I2S microphone - it may not have started: %s", esp_err_to_name(err));
323
314
  }
324
315
  err = i2s_driver_uninstall(this->parent_->get_port());
325
316
  if (err != ESP_OK) {
326
- ESP_LOGW(TAG, "Error uninstalling I2S driver: %s", esp_err_to_name(err));
327
- this->status_set_error();
328
- return;
317
+ ESP_LOGW(TAG, "Error uninstalling I2S driver - it may not have started: %s", esp_err_to_name(err));
329
318
  }
330
319
  #else
331
320
  /* Have to stop the channel before deleting it */
332
321
  err = i2s_channel_disable(this->rx_handle_);
333
322
  if (err != ESP_OK) {
334
- ESP_LOGW(TAG, "Error stopping I2S microphone: %s", esp_err_to_name(err));
335
- this->status_set_error();
336
- return;
323
+ ESP_LOGW(TAG, "Error stopping I2S microphone - it may not have started: %s", esp_err_to_name(err));
337
324
  }
338
325
  /* If the handle is not needed any more, delete it to release the channel resources */
339
326
  err = i2s_del_channel(this->rx_handle_);
340
327
  if (err != ESP_OK) {
341
- ESP_LOGW(TAG, "Error deleting I2S channel: %s", esp_err_to_name(err));
342
- this->status_set_error();
343
- return;
328
+ ESP_LOGW(TAG, "Error deleting I2S channel - it may not have started: %s", esp_err_to_name(err));
344
329
  }
345
330
  #endif
346
331
  this->parent_->unlock();
347
- this->status_clear_error();
348
332
  }
349
333
 
350
334
  void I2SAudioMicrophone::mic_task(void *params) {
351
335
  I2SAudioMicrophone *this_microphone = (I2SAudioMicrophone *) params;
352
-
353
336
  xEventGroupSetBits(this_microphone->event_group_, MicrophoneEventGroupBits::TASK_STARTING);
354
337
 
355
- uint8_t start_counter = 0;
356
- bool started = this_microphone->start_driver_();
357
- while (!started && start_counter < 10) {
358
- // Attempt to load the driver again in 100 ms. Doesn't slow down main loop since its in a task.
359
- vTaskDelay(pdMS_TO_TICKS(100));
360
- ++start_counter;
361
- started = this_microphone->start_driver_();
362
- }
338
+ { // Ensures the samples vector is freed when the task stops
363
339
 
364
- if (started) {
365
- xEventGroupSetBits(this_microphone->event_group_, MicrophoneEventGroupBits::TASK_RUNNING);
366
340
  const size_t bytes_to_read = this_microphone->audio_stream_info_.ms_to_bytes(READ_DURATION_MS);
367
341
  std::vector<uint8_t> samples;
368
342
  samples.reserve(bytes_to_read);
369
343
 
370
- while (!(xEventGroupGetBits(this_microphone->event_group_) & COMMAND_STOP)) {
344
+ xEventGroupSetBits(this_microphone->event_group_, MicrophoneEventGroupBits::TASK_RUNNING);
345
+
346
+ while (!(xEventGroupGetBits(this_microphone->event_group_) & MicrophoneEventGroupBits::COMMAND_STOP)) {
371
347
  if (this_microphone->data_callbacks_.size() > 0) {
372
348
  samples.resize(bytes_to_read);
373
349
  size_t bytes_read = this_microphone->read_(samples.data(), bytes_to_read, 2 * pdMS_TO_TICKS(READ_DURATION_MS));
@@ -382,9 +358,6 @@ void I2SAudioMicrophone::mic_task(void *params) {
382
358
  }
383
359
  }
384
360
 
385
- xEventGroupSetBits(this_microphone->event_group_, MicrophoneEventGroupBits::TASK_STOPPING);
386
- this_microphone->stop_driver_();
387
-
388
361
  xEventGroupSetBits(this_microphone->event_group_, MicrophoneEventGroupBits::TASK_STOPPED);
389
362
  while (true) {
390
363
  // Continuously delay until the loop method deletes the task
@@ -425,7 +398,10 @@ size_t I2SAudioMicrophone::read_(uint8_t *buf, size_t len, TickType_t ticks_to_w
425
398
  #endif
426
399
  if ((err != ESP_OK) && ((err != ESP_ERR_TIMEOUT) || (ticks_to_wait != 0))) {
427
400
  // Ignore ESP_ERR_TIMEOUT if ticks_to_wait = 0, as it will read the data on the next call
428
- ESP_LOGW(TAG, "Error reading from I2S microphone: %s", esp_err_to_name(err));
401
+ if (!this->status_has_warning()) {
402
+ // Avoid spamming the logs with the error message if its repeated
403
+ ESP_LOGW(TAG, "Error reading from I2S microphone: %s", esp_err_to_name(err));
404
+ }
429
405
  this->status_set_warning();
430
406
  return 0;
431
407
  }
@@ -452,7 +428,7 @@ void I2SAudioMicrophone::loop() {
452
428
  uint32_t event_group_bits = xEventGroupGetBits(this->event_group_);
453
429
 
454
430
  if (event_group_bits & MicrophoneEventGroupBits::TASK_STARTING) {
455
- ESP_LOGD(TAG, "Task has started, attempting to setup I2S audio driver");
431
+ ESP_LOGD(TAG, "Task started, attempting to allocate buffer");
456
432
  xEventGroupClearBits(this->event_group_, MicrophoneEventGroupBits::TASK_STARTING);
457
433
  }
458
434
 
@@ -463,23 +439,25 @@ void I2SAudioMicrophone::loop() {
463
439
  this->state_ = microphone::STATE_RUNNING;
464
440
  }
465
441
 
466
- if (event_group_bits & MicrophoneEventGroupBits::TASK_STOPPING) {
467
- ESP_LOGD(TAG, "Task is stopping, attempting to unload the I2S audio driver");
468
- xEventGroupClearBits(this->event_group_, MicrophoneEventGroupBits::TASK_STOPPING);
469
- }
470
-
471
442
  if ((event_group_bits & MicrophoneEventGroupBits::TASK_STOPPED)) {
472
- ESP_LOGD(TAG, "Task is finished, freeing resources");
443
+ ESP_LOGD(TAG, "Task finished, freeing resources and uninstalling I2S driver");
444
+
473
445
  vTaskDelete(this->task_handle_);
474
446
  this->task_handle_ = nullptr;
447
+ this->stop_driver_();
475
448
  xEventGroupClearBits(this->event_group_, ALL_BITS);
449
+ this->status_clear_error();
450
+
476
451
  this->state_ = microphone::STATE_STOPPED;
477
452
  }
478
453
 
454
+ // Start the microphone if any semaphores are taken
479
455
  if ((uxSemaphoreGetCount(this->active_listeners_semaphore_) < MAX_LISTENERS) &&
480
456
  (this->state_ == microphone::STATE_STOPPED)) {
481
457
  this->state_ = microphone::STATE_STARTING;
482
458
  }
459
+
460
+ // Stop the microphone if all semaphores are returned
483
461
  if ((uxSemaphoreGetCount(this->active_listeners_semaphore_) == MAX_LISTENERS) &&
484
462
  (this->state_ == microphone::STATE_RUNNING)) {
485
463
  this->state_ = microphone::STATE_STOPPING;
@@ -487,14 +465,26 @@ void I2SAudioMicrophone::loop() {
487
465
 
488
466
  switch (this->state_) {
489
467
  case microphone::STATE_STARTING:
490
- if ((this->task_handle_ == nullptr) && !this->status_has_error()) {
468
+ if (this->status_has_error()) {
469
+ break;
470
+ }
471
+
472
+ if (!this->start_driver_()) {
473
+ this->status_momentary_error("I2S driver failed to start, unloading it and attempting again in 1 second", 1000);
474
+ this->stop_driver_(); // Stop/frees whatever possibly started
475
+ break;
476
+ }
477
+
478
+ if (this->task_handle_ == nullptr) {
491
479
  xTaskCreate(I2SAudioMicrophone::mic_task, "mic_task", TASK_STACK_SIZE, (void *) this, TASK_PRIORITY,
492
480
  &this->task_handle_);
493
481
 
494
482
  if (this->task_handle_ == nullptr) {
495
483
  this->status_momentary_error("Task failed to start, attempting again in 1 second", 1000);
484
+ this->stop_driver_(); // Stops the driver to return the lock; will be reloaded in next attempt
496
485
  }
497
486
  }
487
+
498
488
  break;
499
489
  case microphone::STATE_RUNNING:
500
490
  break;
@@ -43,7 +43,11 @@ class I2SAudioMicrophone : public I2SAudioIn, public microphone::Microphone, pub
43
43
  #endif
44
44
 
45
45
  protected:
46
+ /// @brief Starts the I2S driver. Updates the ``audio_stream_info_`` member variable with the current setttings.
47
+ /// @return True if succesful, false otherwise
46
48
  bool start_driver_();
49
+
50
+ /// @brief Stops the I2S driver.
47
51
  void stop_driver_();
48
52
 
49
53
  /// @brief Attempts to correct a microphone DC offset; e.g., a microphones silent level is offset from 0. Applies a
@@ -99,7 +99,7 @@ static const std::vector<int16_t> Q15_VOLUME_SCALING_FACTORS = {
99
99
  19508, 20665, 21891, 23189, 24565, 26022, 27566, 29201, 30933, 32767};
100
100
 
101
101
  void I2SAudioSpeaker::setup() {
102
- ESP_LOGCONFIG(TAG, "Setting up I2S Audio Speaker...");
102
+ ESP_LOGCONFIG(TAG, "Running setup");
103
103
 
104
104
  this->event_group_ = xEventGroupCreate();
105
105
 
@@ -1,7 +1,7 @@
1
1
  #include "iaqcore.h"
2
- #include "esphome/core/log.h"
3
2
  #include "esphome/core/hal.h"
4
3
  #include "esphome/core/helpers.h"
4
+ #include "esphome/core/log.h"
5
5
 
6
6
  namespace esphome {
7
7
  namespace iaqcore {
@@ -26,7 +26,7 @@ struct SensorData {
26
26
 
27
27
  void IAQCore::setup() {
28
28
  if (this->write(nullptr, 0) != i2c::ERROR_OK) {
29
- ESP_LOGD(TAG, "Communication failed!");
29
+ ESP_LOGD(TAG, ESP_LOG_MSG_COMM_FAIL);
30
30
  this->mark_failed();
31
31
  return;
32
32
  }
@@ -89,7 +89,7 @@ void IAQCore::dump_config() {
89
89
  LOG_I2C_DEVICE(this);
90
90
  LOG_UPDATE_INTERVAL(this);
91
91
  if (this->is_failed()) {
92
- ESP_LOGE(TAG, "Communication with AMS iAQ Core failed!");
92
+ ESP_LOGE(TAG, ESP_LOG_MSG_COMM_FAIL);
93
93
  }
94
94
  LOG_SENSOR(" ", "CO2", this->co2_);
95
95
  LOG_SENSOR(" ", "TVOC", this->tvoc_);
@@ -89,8 +89,10 @@ void ILI9XXXDisplay::setup_pins_() {
89
89
 
90
90
  void ILI9XXXDisplay::dump_config() {
91
91
  LOG_DISPLAY("", "ili9xxx", this);
92
- ESP_LOGCONFIG(TAG, " Width Offset: %u", this->offset_x_);
93
- ESP_LOGCONFIG(TAG, " Height Offset: %u", this->offset_y_);
92
+ ESP_LOGCONFIG(TAG,
93
+ " Width Offset: %u\n"
94
+ " Height Offset: %u",
95
+ this->offset_x_, this->offset_y_);
94
96
  switch (this->buffer_color_mode_) {
95
97
  case BITS_8_INDEXED:
96
98
  ESP_LOGCONFIG(TAG, " Color mode: 8bit Indexed");
@@ -111,11 +113,14 @@ void ILI9XXXDisplay::dump_config() {
111
113
  LOG_PIN(" CS Pin: ", this->cs_);
112
114
  LOG_PIN(" DC Pin: ", this->dc_pin_);
113
115
  LOG_PIN(" Busy Pin: ", this->busy_pin_);
114
- ESP_LOGCONFIG(TAG, " Color order: %s", this->color_order_ == display::COLOR_ORDER_BGR ? "BGR" : "RGB");
115
- ESP_LOGCONFIG(TAG, " Swap_xy: %s", YESNO(this->swap_xy_));
116
- ESP_LOGCONFIG(TAG, " Mirror_x: %s", YESNO(this->mirror_x_));
117
- ESP_LOGCONFIG(TAG, " Mirror_y: %s", YESNO(this->mirror_y_));
118
- ESP_LOGCONFIG(TAG, " Invert colors: %s", YESNO(this->pre_invertcolors_));
116
+ ESP_LOGCONFIG(TAG,
117
+ " Color order: %s\n"
118
+ " Swap_xy: %s\n"
119
+ " Mirror_x: %s\n"
120
+ " Mirror_y: %s\n"
121
+ " Invert colors: %s",
122
+ this->color_order_ == display::COLOR_ORDER_BGR ? "BGR" : "RGB", YESNO(this->swap_xy_),
123
+ YESNO(this->mirror_x_), YESNO(this->mirror_y_), YESNO(this->pre_invertcolors_));
119
124
 
120
125
  if (this->is_failed()) {
121
126
  ESP_LOGCONFIG(TAG, " => Failed to init Memory: YES!");
@@ -89,7 +89,7 @@ class ILI9XXXDisplay : public display::DisplayBuffer,
89
89
 
90
90
  void dump_config() override;
91
91
  void setup() override;
92
- void on_shutdown() override { this->command(ILI9XXX_SLPIN); }
92
+ void on_powerdown() override { this->command(ILI9XXX_SLPIN); }
93
93
 
94
94
  display::DisplayType get_display_type() override { return display::DisplayType::DISPLAY_TYPE_COLOR; }
95
95
  void draw_pixels_at(int x_start, int y_start, int w, int h, const uint8_t *ptr, display::ColorOrder order,
@@ -1,6 +1,7 @@
1
1
  #include "image.h"
2
2
 
3
3
  #include "esphome/core/hal.h"
4
+ #include "esphome/core/helpers.h"
4
5
 
5
6
  namespace esphome {
6
7
  namespace image {
@@ -34,7 +34,7 @@ static const uint8_t INA219_REGISTER_CURRENT = 0x04;
34
34
  static const uint8_t INA219_REGISTER_CALIBRATION = 0x05;
35
35
 
36
36
  void INA219Component::setup() {
37
- ESP_LOGCONFIG(TAG, "Setting up INA219...");
37
+ ESP_LOGCONFIG(TAG, "Running setup");
38
38
  // Config Register
39
39
  // 0bx000000000000000 << 15 RESET Bit (1 -> trigger reset)
40
40
  if (!this->write_byte_16(INA219_REGISTER_CONFIG, 0x8000)) {
@@ -134,7 +134,7 @@ void INA219Component::dump_config() {
134
134
  LOG_I2C_DEVICE(this);
135
135
 
136
136
  if (this->is_failed()) {
137
- ESP_LOGE(TAG, "Communication with INA219 failed!");
137
+ ESP_LOGE(TAG, ESP_LOG_MSG_COMM_FAIL);
138
138
  return;
139
139
  }
140
140
  LOG_UPDATE_INTERVAL(this);
@@ -37,7 +37,7 @@ static const uint16_t INA226_ADC_TIMES[] = {140, 204, 332, 588, 1100, 2116, 4156
37
37
  static const uint16_t INA226_ADC_AVG_SAMPLES[] = {1, 4, 16, 64, 128, 256, 512, 1024};
38
38
 
39
39
  void INA226Component::setup() {
40
- ESP_LOGCONFIG(TAG, "Setting up INA226...");
40
+ ESP_LOGCONFIG(TAG, "Running setup");
41
41
 
42
42
  ConfigurationRegister config;
43
43
 
@@ -88,14 +88,17 @@ void INA226Component::dump_config() {
88
88
  LOG_I2C_DEVICE(this);
89
89
 
90
90
  if (this->is_failed()) {
91
- ESP_LOGE(TAG, "Communication with INA226 failed!");
91
+ ESP_LOGE(TAG, ESP_LOG_MSG_COMM_FAIL);
92
92
  return;
93
93
  }
94
94
  LOG_UPDATE_INTERVAL(this);
95
95
 
96
- ESP_LOGCONFIG(TAG, " ADC Conversion Time Bus Voltage: %d", INA226_ADC_TIMES[this->adc_time_voltage_ & 0b111]);
97
- ESP_LOGCONFIG(TAG, " ADC Conversion Time Shunt Voltage: %d", INA226_ADC_TIMES[this->adc_time_current_ & 0b111]);
98
- ESP_LOGCONFIG(TAG, " ADC Averaging Samples: %d", INA226_ADC_AVG_SAMPLES[this->adc_avg_samples_ & 0b111]);
96
+ ESP_LOGCONFIG(TAG,
97
+ " ADC Conversion Time Bus Voltage: %d\n"
98
+ " ADC Conversion Time Shunt Voltage: %d\n"
99
+ " ADC Averaging Samples: %d",
100
+ INA226_ADC_TIMES[this->adc_time_voltage_ & 0b111], INA226_ADC_TIMES[this->adc_time_current_ & 0b111],
101
+ INA226_ADC_AVG_SAMPLES[this->adc_avg_samples_ & 0b111]);
99
102
 
100
103
  LOG_SENSOR(" ", "Bus Voltage", this->bus_voltage_sensor_);
101
104
  LOG_SENSOR(" ", "Shunt Voltage", this->shunt_voltage_sensor_);
@@ -35,7 +35,7 @@ static const uint8_t INA260_REGISTER_MANUFACTURE_ID = 0xFE;
35
35
  static const uint8_t INA260_REGISTER_DEVICE_ID = 0xFF;
36
36
 
37
37
  void INA260Component::setup() {
38
- ESP_LOGCONFIG(TAG, "Setting up INA260...");
38
+ ESP_LOGCONFIG(TAG, "Running setup");
39
39
 
40
40
  // Reset device on setup
41
41
  if (!this->write_byte_16(INA260_REGISTER_CONFIG, 0x8000)) {
@@ -1,7 +1,7 @@
1
1
  #include "ina2xx_base.h"
2
- #include "esphome/core/log.h"
3
2
  #include "esphome/core/hal.h"
4
3
  #include "esphome/core/helpers.h"
4
+ #include "esphome/core/log.h"
5
5
  #include <cinttypes>
6
6
  #include <cmath>
7
7
 
@@ -50,7 +50,7 @@ static bool check_model_and_device_match(INAModel model, uint16_t dev_id) {
50
50
  }
51
51
 
52
52
  void INA2XX::setup() {
53
- ESP_LOGCONFIG(TAG, "Setting up INA2xx...");
53
+ ESP_LOGCONFIG(TAG, "Running setup");
54
54
 
55
55
  if (!this->reset_config_()) {
56
56
  ESP_LOGE(TAG, "Reset failed, check connection");
@@ -203,15 +203,19 @@ void INA2XX::dump_config() {
203
203
  this->dev_id_);
204
204
  }
205
205
  if (this->is_failed()) {
206
- ESP_LOGE(TAG, "Communication with INA2xx failed!");
206
+ ESP_LOGE(TAG, ESP_LOG_MSG_COMM_FAIL);
207
207
  }
208
208
  LOG_UPDATE_INTERVAL(this);
209
- ESP_LOGCONFIG(TAG, " Shunt resistance = %f Ohm", this->shunt_resistance_ohm_);
210
- ESP_LOGCONFIG(TAG, " Max current = %f A", this->max_current_a_);
211
- ESP_LOGCONFIG(TAG, " Shunt temp coeff = %d ppm/°C", this->shunt_tempco_ppm_c_);
212
- ESP_LOGCONFIG(TAG, " ADCRANGE = %d (%s)", (uint8_t) this->adc_range_, this->adc_range_ ? "±40.96 mV" : "±163.84 mV");
213
- ESP_LOGCONFIG(TAG, " CURRENT_LSB = %f", this->current_lsb_);
214
- ESP_LOGCONFIG(TAG, " SHUNT_CAL = %d", this->shunt_cal_);
209
+ ESP_LOGCONFIG(TAG,
210
+ " Shunt resistance = %f Ohm\n"
211
+ " Max current = %f A\n"
212
+ " Shunt temp coeff = %d ppm/°C\n"
213
+ " ADCRANGE = %d (%s)\n"
214
+ " CURRENT_LSB = %f\n"
215
+ " SHUNT_CAL = %d",
216
+ this->shunt_resistance_ohm_, this->max_current_a_, this->shunt_tempco_ppm_c_,
217
+ (uint8_t) this->adc_range_, this->adc_range_ ? "±40.96 mV" : "±163.84 mV", this->current_lsb_,
218
+ this->shunt_cal_);
215
219
 
216
220
  ESP_LOGCONFIG(TAG, " ADC Samples = %d; ADC times: Bus = %d μs, Shunt = %d μs, Temp = %d μs",
217
221
  ADC_SAMPLES[0b111 & (uint8_t) this->adc_avg_samples_],
@@ -22,7 +22,7 @@ static const uint8_t INA3221_REGISTER_CHANNEL3_BUS_VOLTAGE = 0x06;
22
22
  // A0 = SCL -> 0x43
23
23
 
24
24
  void INA3221Component::setup() {
25
- ESP_LOGCONFIG(TAG, "Setting up INA3221...");
25
+ ESP_LOGCONFIG(TAG, "Running setup");
26
26
  // Config Register
27
27
  // 0bx000000000000000 << 15 RESET Bit (1 -> trigger reset)
28
28
  if (!this->write_byte_16(INA3221_REGISTER_CONFIG, 0x8000)) {
@@ -60,7 +60,7 @@ void INA3221Component::dump_config() {
60
60
  ESP_LOGCONFIG(TAG, "INA3221:");
61
61
  LOG_I2C_DEVICE(this);
62
62
  if (this->is_failed()) {
63
- ESP_LOGE(TAG, "Communication with INA3221 failed!");
63
+ ESP_LOGE(TAG, ESP_LOG_MSG_COMM_FAIL);
64
64
  }
65
65
  LOG_UPDATE_INTERVAL(this);
66
66
 
@@ -6,9 +6,12 @@ from esphome.const import (
6
6
  CONF_FULL_UPDATE_EVERY,
7
7
  CONF_ID,
8
8
  CONF_LAMBDA,
9
+ CONF_MIRROR_X,
10
+ CONF_MIRROR_Y,
9
11
  CONF_MODEL,
10
12
  CONF_OE_PIN,
11
13
  CONF_PAGES,
14
+ CONF_TRANSFORM,
12
15
  CONF_WAKEUP_PIN,
13
16
  )
14
17
 
@@ -36,7 +39,6 @@ CONF_SPH_PIN = "sph_pin"
36
39
  CONF_SPV_PIN = "spv_pin"
37
40
  CONF_VCOM_PIN = "vcom_pin"
38
41
 
39
-
40
42
  inkplate6_ns = cg.esphome_ns.namespace("inkplate6")
41
43
  Inkplate6 = inkplate6_ns.class_(
42
44
  "Inkplate6",
@@ -62,6 +64,12 @@ CONFIG_SCHEMA = cv.All(
62
64
  {
63
65
  cv.GenerateID(): cv.declare_id(Inkplate6),
64
66
  cv.Optional(CONF_GREYSCALE, default=False): cv.boolean,
67
+ cv.Optional(CONF_TRANSFORM): cv.Schema(
68
+ {
69
+ cv.Optional(CONF_MIRROR_X, default=False): cv.boolean,
70
+ cv.Optional(CONF_MIRROR_Y, default=False): cv.boolean,
71
+ }
72
+ ),
65
73
  cv.Optional(CONF_PARTIAL_UPDATING, default=True): cv.boolean,
66
74
  cv.Optional(CONF_FULL_UPDATE_EVERY, default=10): cv.uint32_t,
67
75
  cv.Optional(CONF_MODEL, default="inkplate_6"): cv.enum(
@@ -109,7 +117,6 @@ CONFIG_SCHEMA = cv.All(
109
117
  .extend(cv.polling_component_schema("5s"))
110
118
  .extend(i2c.i2c_device_schema(0x48)),
111
119
  cv.has_at_most_one_key(CONF_PAGES, CONF_LAMBDA),
112
- cv.only_with_arduino,
113
120
  )
114
121
 
115
122
 
@@ -126,6 +133,9 @@ async def to_code(config):
126
133
  cg.add(var.set_writer(lambda_))
127
134
 
128
135
  cg.add(var.set_greyscale(config[CONF_GREYSCALE]))
136
+ if transform := config.get(CONF_TRANSFORM):
137
+ cg.add(var.set_mirror_x(transform[CONF_MIRROR_X]))
138
+ cg.add(var.set_mirror_y(transform[CONF_MIRROR_Y]))
129
139
  cg.add(var.set_partial_updating(config[CONF_PARTIAL_UPDATING]))
130
140
  cg.add(var.set_full_update_every(config[CONF_FULL_UPDATE_EVERY]))
131
141
 
@@ -1,11 +1,9 @@
1
1
  #include "inkplate.h"
2
- #include "esphome/core/log.h"
3
2
  #include "esphome/core/application.h"
4
3
  #include "esphome/core/helpers.h"
4
+ #include "esphome/core/log.h"
5
5
 
6
- #ifdef USE_ESP32_FRAMEWORK_ARDUINO
7
-
8
- #include <esp32-hal-gpio.h>
6
+ #include <hal/gpio_hal.h>
9
7
 
10
8
  namespace esphome {
11
9
  namespace inkplate6 {
@@ -156,6 +154,12 @@ void HOT Inkplate6::draw_absolute_pixel_internal(int x, int y, Color color) {
156
154
  if (x >= this->get_width_internal() || y >= this->get_height_internal() || x < 0 || y < 0)
157
155
  return;
158
156
 
157
+ if (this->mirror_y_)
158
+ y = this->get_height_internal() - y - 1;
159
+
160
+ if (this->mirror_x_)
161
+ x = this->get_width_internal() - x - 1;
162
+
159
163
  if (this->greyscale_) {
160
164
  int x1 = x / 2;
161
165
  int x_sub = x % 2;
@@ -180,9 +184,11 @@ void HOT Inkplate6::draw_absolute_pixel_internal(int x, int y, Color color) {
180
184
 
181
185
  void Inkplate6::dump_config() {
182
186
  LOG_DISPLAY("", "Inkplate", this);
183
- ESP_LOGCONFIG(TAG, " Greyscale: %s", YESNO(this->greyscale_));
184
- ESP_LOGCONFIG(TAG, " Partial Updating: %s", YESNO(this->partial_updating_));
185
- ESP_LOGCONFIG(TAG, " Full Update Every: %d", this->full_update_every_);
187
+ ESP_LOGCONFIG(TAG,
188
+ " Greyscale: %s\n"
189
+ " Partial Updating: %s\n"
190
+ " Full Update Every: %d",
191
+ YESNO(this->greyscale_), YESNO(this->partial_updating_), this->full_update_every_);
186
192
  // Log pins
187
193
  LOG_PIN(" CKV Pin: ", this->ckv_pin_);
188
194
  LOG_PIN(" CL Pin: ", this->cl_pin_);
@@ -715,5 +721,3 @@ void Inkplate6::pins_as_outputs_() {
715
721
 
716
722
  } // namespace inkplate6
717
723
  } // namespace esphome
718
-
719
- #endif // USE_ESP32_FRAMEWORK_ARDUINO
@@ -1,11 +1,9 @@
1
1
  #pragma once
2
2
 
3
+ #include "esphome/components/display/display_buffer.h"
4
+ #include "esphome/components/i2c/i2c.h"
3
5
  #include "esphome/core/component.h"
4
6
  #include "esphome/core/hal.h"
5
- #include "esphome/components/i2c/i2c.h"
6
- #include "esphome/components/display/display_buffer.h"
7
-
8
- #ifdef USE_ESP32_FRAMEWORK_ARDUINO
9
7
 
10
8
  namespace esphome {
11
9
  namespace inkplate6 {
@@ -92,6 +90,9 @@ class Inkplate6 : public display::DisplayBuffer, public i2c::I2CDevice {
92
90
  if (this->is_ready())
93
91
  this->initialize_();
94
92
  }
93
+ void set_mirror_y(bool mirror_y) { this->mirror_y_ = mirror_y; }
94
+ void set_mirror_x(bool mirror_x) { this->mirror_x_ = mirror_x; }
95
+
95
96
  void set_partial_updating(bool partial_updating) { this->partial_updating_ = partial_updating; }
96
97
  void set_full_update_every(uint32_t full_update_every) { this->full_update_every_ = full_update_every; }
97
98
 
@@ -221,6 +222,8 @@ class Inkplate6 : public display::DisplayBuffer, public i2c::I2CDevice {
221
222
 
222
223
  bool block_partial_{true};
223
224
  bool greyscale_;
225
+ bool mirror_y_{false};
226
+ bool mirror_x_{false};
224
227
  bool partial_updating_;
225
228
 
226
229
  InkplateModel model_;
@@ -249,5 +252,3 @@ class Inkplate6 : public display::DisplayBuffer, public i2c::I2CDevice {
249
252
 
250
253
  } // namespace inkplate6
251
254
  } // namespace esphome
252
-
253
- #endif // USE_ESP32_FRAMEWORK_ARDUINO
@@ -1,7 +1,7 @@
1
1
  #include "integration_sensor.h"
2
+ #include "esphome/core/hal.h"
2
3
  #include "esphome/core/helpers.h"
3
4
  #include "esphome/core/log.h"
4
- #include "esphome/core/hal.h"
5
5
 
6
6
  namespace esphome {
7
7
  namespace integration {