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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (753) 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 +753 -379
  29. esphome/components/api/api_connection.h +341 -283
  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 +5 -0
  33. esphome/components/api/api_pb2.h +703 -227
  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 -4
  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 +5 -4
  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 +18 -16
  67. esphome/components/bluetooth_proxy/bluetooth_proxy.h +1 -1
  68. esphome/components/bme280_base/bme280_base.cpp +5 -6
  69. esphome/components/bme680/bme680.cpp +3 -3
  70. esphome/components/bme680/sensor.py +2 -2
  71. esphome/components/bme680_bsec/bme680_bsec.cpp +11 -7
  72. esphome/components/bme680_bsec/sensor.py +7 -3
  73. esphome/components/bme68x_bsec2/__init__.py +6 -5
  74. esphome/components/bme68x_bsec2/bme68x_bsec2.cpp +17 -13
  75. esphome/components/bme68x_bsec2/sensor.py +4 -4
  76. esphome/components/bme68x_bsec2_i2c/bme68x_bsec2_i2c.cpp +1 -0
  77. esphome/components/bmi160/bmi160.cpp +11 -11
  78. esphome/components/bmp085/bmp085.cpp +2 -2
  79. esphome/components/bmp280_base/bmp280_base.cpp +3 -3
  80. esphome/components/bmp3xx_base/bmp3xx_base.cpp +13 -13
  81. esphome/components/bmp581/bmp581.cpp +33 -27
  82. esphome/components/bp1658cj/bp1658cj.cpp +5 -3
  83. esphome/components/bp5758d/bp5758d.cpp +1 -1
  84. esphome/components/button/__init__.py +1 -0
  85. esphome/components/canbus/canbus.cpp +1 -1
  86. esphome/components/cap1188/cap1188.cpp +6 -4
  87. esphome/components/captive_portal/captive_portal.cpp +1 -1
  88. esphome/components/ccs811/ccs811.cpp +3 -2
  89. esphome/components/cd74hc4067/cd74hc4067.cpp +1 -1
  90. esphome/components/ch422g/ch422g.cpp +2 -2
  91. esphome/components/chsc6x/chsc6x_touchscreen.cpp +6 -4
  92. esphome/components/climate/__init__.py +1 -0
  93. esphome/components/climate/climate.cpp +12 -7
  94. esphome/components/climate/climate.h +1 -1
  95. esphome/components/climate_ir/climate_ir.cpp +7 -4
  96. esphome/components/cm1106/__init__.py +1 -0
  97. esphome/components/cm1106/cm1106.cpp +112 -0
  98. esphome/components/cm1106/cm1106.h +40 -0
  99. esphome/components/cm1106/sensor.py +72 -0
  100. esphome/components/const/__init__.py +1 -0
  101. esphome/components/cover/__init__.py +1 -0
  102. esphome/components/cs5460a/cs5460a.cpp +16 -11
  103. esphome/components/cse7761/cse7761.cpp +2 -2
  104. esphome/components/cse7766/cse7766.cpp +0 -5
  105. esphome/components/cse7766/cse7766.h +5 -1
  106. esphome/components/cst226/touchscreen/cst226_touchscreen.cpp +1 -1
  107. esphome/components/cst816/touchscreen/cst816_touchscreen.cpp +6 -3
  108. esphome/components/current_based/current_based_cover.cpp +4 -2
  109. esphome/components/dac7678/dac7678_output.cpp +4 -4
  110. esphome/components/dallas_temp/dallas_temp.cpp +2 -3
  111. esphome/components/daly_bms/daly_bms.cpp +2 -1
  112. esphome/components/dashboard_import/__init__.py +1 -2
  113. esphome/components/datetime/__init__.py +3 -1
  114. esphome/components/datetime/date_entity.cpp +5 -5
  115. esphome/components/datetime/datetime_base.h +0 -5
  116. esphome/components/datetime/datetime_entity.cpp +8 -8
  117. esphome/components/datetime/time_entity.cpp +4 -4
  118. esphome/components/debug/debug_component.cpp +1 -5
  119. esphome/components/debug/debug_component.h +1 -1
  120. esphome/components/debug/debug_esp32.cpp +4 -2
  121. esphome/components/deep_sleep/deep_sleep_component.cpp +11 -5
  122. esphome/components/deep_sleep/deep_sleep_esp32.cpp +7 -5
  123. esphome/components/demo/__init__.py +206 -0
  124. esphome/components/demo/demo_alarm_control_panel.h +65 -0
  125. esphome/components/demo/demo_button.h +15 -0
  126. esphome/components/demo/demo_date.h +34 -0
  127. esphome/components/demo/demo_datetime.h +40 -0
  128. esphome/components/demo/demo_lock.h +17 -0
  129. esphome/components/demo/demo_select.h +15 -0
  130. esphome/components/demo/demo_text.h +18 -0
  131. esphome/components/demo/demo_time.h +34 -0
  132. esphome/components/demo/demo_valve.h +54 -0
  133. esphome/components/dfrobot_sen0395/commands.cpp +3 -3
  134. esphome/components/dht/dht.cpp +29 -50
  135. esphome/components/dht12/dht12.cpp +2 -2
  136. esphome/components/display/display.h +5 -3
  137. esphome/components/dps310/dps310.cpp +7 -5
  138. esphome/components/ds1307/ds1307.cpp +2 -2
  139. esphome/components/dsmr/dsmr.cpp +5 -3
  140. esphome/components/duty_cycle/duty_cycle_sensor.cpp +2 -2
  141. esphome/components/duty_time/duty_time_sensor.cpp +5 -3
  142. esphome/components/ee895/ee895.cpp +3 -3
  143. esphome/components/ektf2232/touchscreen/ektf2232.cpp +1 -1
  144. esphome/components/emc2101/emc2101.cpp +11 -9
  145. esphome/components/ens160_base/ens160_base.cpp +2 -2
  146. esphome/components/ens210/ens210.cpp +2 -2
  147. esphome/components/es7210/es7210.cpp +6 -4
  148. esphome/components/es7243e/es7243e.cpp +1 -1
  149. esphome/components/es8156/es8156.cpp +1 -1
  150. esphome/components/es8311/es8311.cpp +8 -6
  151. esphome/components/es8388/__init__.py +0 -0
  152. esphome/components/es8388/audio_dac.py +26 -0
  153. esphome/components/es8388/es8388.cpp +289 -0
  154. esphome/components/es8388/es8388.h +81 -0
  155. esphome/components/es8388/es8388_const.h +83 -0
  156. esphome/components/es8388/select/__init__.py +47 -0
  157. esphome/components/es8388/select/adc_input_mic_select.cpp +12 -0
  158. esphome/components/es8388/select/adc_input_mic_select.h +15 -0
  159. esphome/components/es8388/select/dac_output_select.cpp +12 -0
  160. esphome/components/es8388/select/dac_output_select.h +15 -0
  161. esphome/components/esp32/__init__.py +118 -23
  162. esphome/components/esp32/boards.py +208 -125
  163. esphome/components/esp32/const.py +6 -0
  164. esphome/components/esp32/gpio.py +14 -1
  165. esphome/components/esp32/gpio_esp32_c5.py +45 -0
  166. esphome/components/esp32/gpio_esp32_p4.py +43 -0
  167. esphome/components/esp32/preferences.cpp +7 -7
  168. esphome/components/esp32_ble/__init__.py +115 -0
  169. esphome/components/esp32_ble/ble.cpp +101 -54
  170. esphome/components/esp32_ble/ble.h +24 -5
  171. esphome/components/esp32_ble/ble_event.h +172 -32
  172. esphome/components/esp32_ble/ble_scan_result.h +24 -0
  173. esphome/components/esp32_ble/ble_uuid.h +1 -1
  174. esphome/components/esp32_ble/queue.h +53 -27
  175. esphome/components/esp32_ble_client/ble_client_base.cpp +4 -2
  176. esphome/components/esp32_ble_server/__init__.py +4 -1
  177. esphome/components/esp32_ble_server/ble_characteristic.cpp +1 -0
  178. esphome/components/esp32_ble_server/ble_server.h +0 -1
  179. esphome/components/esp32_ble_tracker/__init__.py +7 -2
  180. esphome/components/esp32_ble_tracker/esp32_ble_tracker.cpp +107 -75
  181. esphome/components/esp32_ble_tracker/esp32_ble_tracker.h +16 -16
  182. esphome/components/esp32_camera/esp32_camera.cpp +35 -27
  183. esphome/components/esp32_camera_web_server/camera_web_server.cpp +4 -2
  184. esphome/components/esp32_dac/esp32_dac.cpp +2 -2
  185. esphome/components/esp32_improv/__init__.py +5 -1
  186. esphome/components/esp32_improv/esp32_improv_component.cpp +2 -2
  187. esphome/components/esp32_rmt_led_strip/led_strip.cpp +11 -7
  188. esphome/components/esp32_rmt_led_strip/light.py +5 -1
  189. esphome/components/esp32_touch/esp32_touch.cpp +12 -8
  190. esphome/components/esp8266/gpio.cpp +10 -1
  191. esphome/components/esp8266/preferences.cpp +6 -6
  192. esphome/components/esp8266_pwm/esp8266_pwm.cpp +3 -3
  193. esphome/components/esp_ldo/__init__.py +91 -0
  194. esphome/components/esp_ldo/esp_ldo.cpp +43 -0
  195. esphome/components/esp_ldo/esp_ldo.h +43 -0
  196. esphome/components/esphome/ota/ota_esphome.cpp +15 -8
  197. esphome/components/ethernet/ethernet_component.cpp +38 -26
  198. esphome/components/ethernet/ethernet_component.h +1 -1
  199. esphome/components/event/__init__.py +1 -0
  200. esphome/components/exposure_notifications/exposure_notifications.cpp +1 -1
  201. esphome/components/ezo/ezo.cpp +1 -1
  202. esphome/components/ezo_pmp/ezo_pmp.cpp +1 -1
  203. esphome/components/factory_reset/button/factory_reset_button.cpp +1 -1
  204. esphome/components/factory_reset/switch/factory_reset_switch.cpp +1 -1
  205. esphome/components/fan/__init__.py +1 -0
  206. esphome/components/fan/fan.cpp +30 -19
  207. esphome/components/fastled_base/fastled_light.cpp +7 -5
  208. esphome/components/fingerprint_grow/fingerprint_grow.cpp +8 -6
  209. esphome/components/fs3000/fs3000.cpp +1 -1
  210. esphome/components/ft5x06/touchscreen/ft5x06_touchscreen.cpp +7 -4
  211. esphome/components/ft63x6/ft63x6.cpp +5 -3
  212. esphome/components/gcja5/gcja5.cpp +0 -12
  213. esphome/components/gcja5/gcja5.h +8 -3
  214. esphome/components/gdk101/gdk101.cpp +2 -2
  215. esphome/components/globals/globals_component.h +13 -10
  216. esphome/components/gp2y1010au0f/gp2y1010au0f.cpp +4 -2
  217. esphome/components/gp8403/gp8403.cpp +4 -2
  218. esphome/components/gp8403/output/gp8403_output.cpp +4 -2
  219. esphome/components/gpio/one_wire/gpio_one_wire.cpp +2 -2
  220. esphome/components/gpio/output/gpio_binary_output.cpp +1 -1
  221. esphome/components/gpio/switch/gpio_switch.cpp +1 -1
  222. esphome/components/graphical_display_menu/graphical_display_menu.cpp +12 -8
  223. esphome/components/grove_gas_mc_v2/grove_gas_mc_v2.cpp +5 -6
  224. esphome/components/grove_tb6612fng/grove_tb6612fng.cpp +1 -1
  225. esphome/components/grove_tb6612fng/grove_tb6612fng.h +1 -1
  226. esphome/components/growatt_solar/growatt_solar.cpp +6 -3
  227. esphome/components/gt911/touchscreen/gt911_touchscreen.cpp +1 -1
  228. esphome/components/haier/haier_base.cpp +2 -2
  229. esphome/components/haier/hon_climate.cpp +13 -6
  230. esphome/components/havells_solar/havells_solar.cpp +5 -2
  231. esphome/components/hbridge/switch/hbridge_switch.cpp +1 -1
  232. esphome/components/hdc1080/hdc1080.cpp +2 -2
  233. esphome/components/he60r/he60r.cpp +4 -2
  234. esphome/components/hlw8012/hlw8012.cpp +6 -4
  235. esphome/components/hm3301/hm3301.cpp +2 -2
  236. esphome/components/hmc5883l/hmc5883l.cpp +2 -2
  237. esphome/components/homeassistant/time/homeassistant_time.cpp +4 -2
  238. esphome/components/honeywell_hih_i2c/honeywell_hih.cpp +4 -4
  239. esphome/components/honeywellabp/honeywellabp.cpp +4 -2
  240. esphome/components/honeywellabp2_i2c/honeywellabp2.cpp +8 -6
  241. esphome/components/hte501/hte501.cpp +3 -2
  242. esphome/components/http_request/__init__.py +2 -2
  243. esphome/components/http_request/http_request.cpp +7 -5
  244. esphome/components/http_request/http_request_idf.cpp +4 -2
  245. esphome/components/http_request/ota/ota_http_request.cpp +1 -1
  246. esphome/components/htu21d/htu21d.cpp +2 -2
  247. esphome/components/htu31d/htu31d.cpp +2 -2
  248. esphome/components/hx711/hx711.cpp +2 -2
  249. esphome/components/hydreon_rgxx/hydreon_rgxx.cpp +5 -3
  250. esphome/components/hyt271/hyt271.cpp +2 -2
  251. esphome/components/i2c/i2c_bus_arduino.cpp +14 -11
  252. esphome/components/i2c/i2c_bus_esp_idf.cpp +13 -11
  253. esphome/components/i2s_audio/__init__.py +2 -0
  254. esphome/components/i2s_audio/i2s_audio.cpp +3 -4
  255. esphome/components/i2s_audio/i2s_audio.h +1 -1
  256. esphome/components/i2s_audio/media_player/__init__.py +1 -1
  257. esphome/components/i2s_audio/media_player/i2s_audio_media_player.cpp +5 -3
  258. esphome/components/i2s_audio/microphone/i2s_audio_microphone.cpp +85 -77
  259. esphome/components/i2s_audio/microphone/i2s_audio_microphone.h +6 -0
  260. esphome/components/i2s_audio/speaker/i2s_audio_speaker.cpp +29 -11
  261. esphome/components/i2s_audio/speaker/i2s_audio_speaker.h +1 -0
  262. esphome/components/iaqcore/iaqcore.cpp +3 -3
  263. esphome/components/ili9xxx/ili9xxx_display.cpp +12 -7
  264. esphome/components/ili9xxx/ili9xxx_display.h +1 -1
  265. esphome/components/image/image.cpp +1 -0
  266. esphome/components/ina219/ina219.cpp +2 -2
  267. esphome/components/ina226/ina226.cpp +8 -5
  268. esphome/components/ina260/ina260.cpp +1 -1
  269. esphome/components/ina2xx_base/ina2xx_base.cpp +13 -9
  270. esphome/components/ina3221/ina3221.cpp +2 -2
  271. esphome/components/inkplate6/display.py +12 -2
  272. esphome/components/inkplate6/inkplate.cpp +13 -9
  273. esphome/components/inkplate6/inkplate.h +7 -6
  274. esphome/components/integration/integration_sensor.cpp +1 -1
  275. esphome/components/internal_temperature/internal_temperature.cpp +4 -4
  276. esphome/components/json/json_util.cpp +4 -5
  277. esphome/components/kamstrup_kmp/kamstrup_kmp.cpp +1 -1
  278. esphome/components/key_collector/key_collector.cpp +4 -2
  279. esphome/components/kmeteriso/kmeteriso.cpp +4 -4
  280. esphome/components/kuntze/kuntze.cpp +4 -2
  281. esphome/components/lc709203f/__init__.py +1 -0
  282. esphome/components/lc709203f/lc709203f.cpp +299 -0
  283. esphome/components/lc709203f/lc709203f.h +55 -0
  284. esphome/components/lc709203f/sensor.py +93 -0
  285. esphome/components/lcd_base/lcd_display.cpp +2 -2
  286. esphome/components/lcd_gpio/gpio_lcd_display.cpp +5 -3
  287. esphome/components/lcd_menu/lcd_menu.cpp +6 -4
  288. esphome/components/lcd_pcf8574/pcf8574_display.cpp +6 -4
  289. esphome/components/ld2410/ld2410.cpp +6 -7
  290. esphome/components/ld2420/ld2420.cpp +9 -7
  291. esphome/components/ld2450/ld2450.cpp +6 -4
  292. esphome/components/ld2450/sensor.py +2 -2
  293. esphome/components/ledc/ledc_output.cpp +32 -28
  294. esphome/components/libretiny/const.py +1 -1
  295. esphome/components/libretiny/preferences.cpp +6 -7
  296. esphome/components/light/__init__.py +2 -1
  297. esphome/components/light/esp_hsv_color.h +1 -1
  298. esphome/components/light/light_state.cpp +9 -5
  299. esphome/components/light/light_state.h +15 -15
  300. esphome/components/light/light_transformer.h +1 -1
  301. esphome/components/lightwaverf/LwTx.cpp +1 -1
  302. esphome/components/lightwaverf/lightwaverf.cpp +1 -1
  303. esphome/components/lilygo_t5_47/touchscreen/lilygo_t5_47_touchscreen.cpp +1 -1
  304. esphome/components/lock/__init__.py +1 -0
  305. esphome/components/lock/lock.h +1 -1
  306. esphome/components/logger/__init__.py +6 -0
  307. esphome/components/logger/logger.cpp +11 -20
  308. esphome/components/logger/logger.h +5 -6
  309. esphome/components/logger/logger_esp32.cpp +5 -5
  310. esphome/components/ltr390/ltr390.cpp +8 -5
  311. esphome/components/ltr501/ltr501.cpp +19 -14
  312. esphome/components/ltr_als_ps/ltr_als_ps.cpp +20 -13
  313. esphome/components/lvgl/__init__.py +2 -2
  314. esphome/components/lvgl/automation.py +5 -4
  315. esphome/components/lvgl/defines.py +0 -2
  316. esphome/components/lvgl/lv_validation.py +1 -3
  317. esphome/components/lvgl/lvcode.py +7 -8
  318. esphome/components/lvgl/lvgl_esphome.cpp +26 -10
  319. esphome/components/lvgl/schemas.py +22 -23
  320. esphome/components/lvgl/trigger.py +8 -3
  321. esphome/components/lvgl/widgets/__init__.py +2 -2
  322. esphome/components/lvgl/widgets/canvas.py +9 -3
  323. esphome/components/lvgl/widgets/line.py +2 -1
  324. esphome/components/lvgl/widgets/tabview.py +7 -0
  325. esphome/components/m5stack_8angle/m5stack_8angle.cpp +3 -3
  326. esphome/components/matrix_keypad/matrix_keypad.cpp +2 -2
  327. esphome/components/max17043/max17043.cpp +2 -2
  328. esphome/components/max31855/max31855.cpp +2 -1
  329. esphome/components/max31856/max31856.cpp +9 -11
  330. esphome/components/max31865/max31865.cpp +6 -4
  331. esphome/components/max44009/max44009.cpp +2 -2
  332. esphome/components/max6675/max6675.cpp +1 -1
  333. esphome/components/max6956/max6956.cpp +5 -3
  334. esphome/components/max7219/max7219.cpp +8 -6
  335. esphome/components/max7219digit/automation.h +52 -0
  336. esphome/components/max7219digit/display.py +93 -1
  337. esphome/components/max7219digit/max7219digit.cpp +16 -13
  338. esphome/components/max9611/max9611.cpp +9 -6
  339. esphome/components/mcp23008/mcp23008.cpp +1 -1
  340. esphome/components/mcp23016/mcp23016.cpp +1 -1
  341. esphome/components/mcp23017/mcp23017.cpp +1 -1
  342. esphome/components/mcp23s08/mcp23s08.cpp +1 -1
  343. esphome/components/mcp23s17/mcp23s17.cpp +1 -1
  344. esphome/components/mcp3008/mcp3008.cpp +1 -1
  345. esphome/components/mcp3008/sensor/mcp3008_sensor.cpp +5 -3
  346. esphome/components/mcp3204/mcp3204.cpp +1 -1
  347. esphome/components/mcp4461/mcp4461.cpp +2 -2
  348. esphome/components/mcp4725/mcp4725.cpp +2 -2
  349. esphome/components/mcp4728/mcp4728.cpp +2 -2
  350. esphome/components/mcp9600/mcp9600.cpp +1 -1
  351. esphome/components/mcp9808/mcp9808.cpp +4 -4
  352. esphome/components/mdns/mdns_component.cpp +8 -2
  353. esphome/components/mdns/mdns_component.h +3 -1
  354. esphome/components/mdns/mdns_esp32.cpp +2 -2
  355. esphome/components/media_player/__init__.py +1 -0
  356. esphome/components/micro_wake_word/micro_wake_word.cpp +1 -1
  357. esphome/components/micro_wake_word/streaming_model.cpp +10 -6
  358. esphome/components/micronova/micronova.h +2 -2
  359. esphome/components/mics_4514/mics_4514.cpp +2 -2
  360. esphome/components/midea/air_conditioner.cpp +7 -5
  361. esphome/components/midea_ir/midea_ir.cpp +1 -1
  362. esphome/components/mipi_spi/mipi_spi.cpp +24 -15
  363. esphome/components/mixer/speaker/mixer_speaker.cpp +8 -4
  364. esphome/components/mlx90393/sensor_mlx90393.cpp +2 -2
  365. esphome/components/mlx90614/mlx90614.cpp +4 -3
  366. esphome/components/mmc5603/mmc5603.cpp +2 -2
  367. esphome/components/mmc5983/mmc5983.cpp +1 -1
  368. esphome/components/modbus/modbus.cpp +7 -5
  369. esphome/components/modbus_controller/modbus_controller.cpp +6 -4
  370. esphome/components/modbus_controller/output/modbus_output.cpp +10 -6
  371. esphome/components/modbus_controller/switch/__init__.py +6 -2
  372. esphome/components/modbus_controller/switch/modbus_switch.cpp +4 -0
  373. esphome/components/modbus_controller/switch/modbus_switch.h +3 -0
  374. esphome/components/mpl3115a2/mpl3115a2.cpp +3 -2
  375. esphome/components/mpr121/mpr121.cpp +2 -2
  376. esphome/components/mpu6050/mpu6050.cpp +6 -6
  377. esphome/components/mpu6886/mpu6886.cpp +6 -6
  378. esphome/components/mqtt/mqtt_alarm_control_panel.cpp +7 -3
  379. esphome/components/mqtt/mqtt_backend_esp32.cpp +1 -1
  380. esphome/components/mqtt/mqtt_client.cpp +31 -24
  381. esphome/components/mqtt/mqtt_component.cpp +3 -3
  382. esphome/components/mqtt/mqtt_cover.cpp +8 -4
  383. esphome/components/mqtt/mqtt_fan.cpp +12 -6
  384. esphome/components/mqtt/mqtt_valve.cpp +4 -2
  385. esphome/components/ms5611/ms5611.cpp +2 -2
  386. esphome/components/ms8607/ms8607.cpp +2 -2
  387. esphome/components/msa3xx/msa3xx.cpp +16 -12
  388. esphome/components/my9231/my9231.cpp +7 -5
  389. esphome/components/nau7802/nau7802.cpp +6 -4
  390. esphome/components/neopixelbus/neopixelbus_light.h +2 -2
  391. esphome/components/network/ip_address.h +1 -1
  392. esphome/components/network/util.cpp +13 -0
  393. esphome/components/nextion/base_component.py +2 -0
  394. esphome/components/nextion/binary_sensor/nextion_binarysensor.cpp +3 -4
  395. esphome/components/nextion/display.py +34 -22
  396. esphome/components/nextion/nextion.cpp +182 -143
  397. esphome/components/nextion/nextion.h +36 -0
  398. esphome/components/nextion/nextion_commands.cpp +3 -3
  399. esphome/components/nextion/nextion_upload_arduino.cpp +69 -69
  400. esphome/components/nextion/nextion_upload_idf.cpp +79 -80
  401. esphome/components/nextion/sensor/nextion_sensor.cpp +5 -5
  402. esphome/components/nextion/switch/nextion_switch.cpp +2 -2
  403. esphome/components/nextion/text_sensor/nextion_textsensor.cpp +3 -3
  404. esphome/components/nfc/nci_message.h +1 -1
  405. esphome/components/nfc/ndef_record.h +1 -1
  406. esphome/components/nfc/ndef_record_text.h +1 -1
  407. esphome/components/nfc/ndef_record_uri.h +1 -1
  408. esphome/components/nfc/nfc.h +1 -1
  409. esphome/components/nfc/nfc_tag.h +1 -1
  410. esphome/components/noblex/noblex.cpp +1 -1
  411. esphome/components/npi19/npi19.cpp +5 -7
  412. esphome/components/number/__init__.py +11 -0
  413. esphome/components/number/number.cpp +1 -1
  414. esphome/components/number/number.h +0 -4
  415. esphome/components/online_image/__init__.py +13 -1
  416. esphome/components/online_image/online_image.cpp +26 -4
  417. esphome/components/online_image/online_image.h +21 -4
  418. esphome/components/opentherm/generate.py +3 -3
  419. esphome/components/opentherm/hub.cpp +11 -7
  420. esphome/components/opentherm/number/number.cpp +5 -3
  421. esphome/components/opentherm/opentherm.h +1 -1
  422. esphome/components/opentherm/schema.py +13 -13
  423. esphome/components/opentherm/validate.py +1 -1
  424. esphome/components/openthread/__init__.py +146 -0
  425. esphome/components/openthread/const.py +10 -0
  426. esphome/components/openthread/openthread.cpp +206 -0
  427. esphome/components/openthread/openthread.h +68 -0
  428. esphome/components/openthread/openthread_esp.cpp +164 -0
  429. esphome/components/openthread/tlv.py +58 -0
  430. esphome/components/openthread_info/__init__.py +0 -0
  431. esphome/components/openthread_info/openthread_info_text_sensor.cpp +24 -0
  432. esphome/components/openthread_info/openthread_info_text_sensor.h +218 -0
  433. esphome/components/openthread_info/text_sensor.py +105 -0
  434. esphome/components/output/float_output.cpp +1 -1
  435. esphome/components/output/switch/output_switch.cpp +1 -1
  436. esphome/components/packet_transport/packet_transport.cpp +6 -4
  437. esphome/components/pca6416a/pca6416a.cpp +2 -2
  438. esphome/components/pca9554/pca9554.cpp +6 -4
  439. esphome/components/pca9685/pca9685_output.cpp +12 -8
  440. esphome/components/pcd8544/pcd_8544.cpp +1 -1
  441. esphome/components/pcf85063/pcf85063.cpp +2 -2
  442. esphome/components/pcf8563/pcf8563.cpp +2 -2
  443. esphome/components/pcf8574/pcf8574.cpp +2 -2
  444. esphome/components/pid/pid_climate.cpp +8 -5
  445. esphome/components/pid/pid_climate.h +1 -1
  446. esphome/components/pid/sensor/pid_climate_sensor.cpp +1 -1
  447. esphome/components/pipsolar/output/pipsolar_output.cpp +1 -1
  448. esphome/components/pipsolar/pipsolar.cpp +3 -3
  449. esphome/components/pm1006/pm1006.cpp +3 -7
  450. esphome/components/pm1006/pm1006.h +4 -1
  451. esphome/components/pm2005/pm2005.cpp +12 -13
  452. esphome/components/pm2005/sensor.py +1 -1
  453. esphome/components/pmsa003i/pmsa003i.cpp +2 -2
  454. esphome/components/pmsx003/pmsx003.cpp +0 -4
  455. esphome/components/pmsx003/pmsx003.h +5 -2
  456. esphome/components/pmwcs3/pmwcs3.cpp +9 -13
  457. esphome/components/pmwcs3/pmwcs3.h +0 -1
  458. esphome/components/pn532/pn532.cpp +7 -7
  459. esphome/components/pn532/pn532.h +1 -1
  460. esphome/components/pn532_spi/pn532_spi.cpp +1 -1
  461. esphome/components/pn7150/pn7150.cpp +4 -4
  462. esphome/components/pn7160/pn7160.cpp +4 -4
  463. esphome/components/power_supply/power_supply.cpp +6 -4
  464. esphome/components/power_supply/power_supply.h +1 -1
  465. esphome/components/prometheus/__init__.py +0 -1
  466. esphome/components/psram/__init__.py +59 -35
  467. esphome/components/pulse_counter/pulse_counter_sensor.cpp +7 -4
  468. esphome/components/pvvx_mithermometer/display/pvvx_display.cpp +8 -5
  469. esphome/components/pylontech/pylontech.cpp +2 -2
  470. esphome/components/pylontech/sensor/pylontech_sensor.cpp +4 -2
  471. esphome/components/pylontech/text_sensor/pylontech_text_sensor.cpp +4 -2
  472. esphome/components/pzemac/pzemac.cpp +4 -2
  473. esphome/components/pzemdc/pzemdc.cpp +4 -2
  474. esphome/components/qmc5883l/qmc5883l.cpp +2 -2
  475. esphome/components/qmp6988/qmp6988.cpp +2 -2
  476. esphome/components/qmp6988/qmp6988.h +1 -1
  477. esphome/components/qr_code/qr_code.cpp +5 -3
  478. esphome/components/qspi_dbi/qspi_dbi.cpp +1 -1
  479. esphome/components/qwiic_pir/qwiic_pir.cpp +26 -28
  480. esphome/components/rc522/rc522.cpp +5 -5
  481. esphome/components/rdm6300/rdm6300.cpp +1 -0
  482. esphome/components/remote_receiver/__init__.py +10 -2
  483. esphome/components/remote_receiver/remote_receiver_esp32.cpp +22 -12
  484. esphome/components/remote_receiver/remote_receiver_esp8266.cpp +10 -7
  485. esphome/components/remote_receiver/remote_receiver_libretiny.cpp +10 -7
  486. esphome/components/remote_transmitter/__init__.py +10 -2
  487. esphome/components/remote_transmitter/remote_transmitter_esp32.cpp +10 -6
  488. esphome/components/remote_transmitter/remote_transmitter_esp8266.cpp +5 -3
  489. esphome/components/remote_transmitter/remote_transmitter_libretiny.cpp +5 -3
  490. esphome/components/resistance/resistance_sensor.cpp +6 -3
  491. esphome/components/restart/button/restart_button.cpp +1 -1
  492. esphome/components/restart/switch/restart_switch.cpp +1 -1
  493. esphome/components/rotary_encoder/rotary_encoder.cpp +2 -2
  494. esphome/components/rp2040/__init__.py +7 -0
  495. esphome/components/rp2040/core.cpp +8 -1
  496. esphome/components/rp2040/gpio.cpp +26 -9
  497. esphome/components/rp2040/preferences.cpp +3 -3
  498. esphome/components/rp2040_pio_led_strip/led_strip.cpp +11 -8
  499. esphome/components/rp2040_pio_led_strip/light.py +1 -1
  500. esphome/components/rp2040_pwm/rp2040_pwm.cpp +1 -1
  501. esphome/components/rpi_dpi_rgb/rpi_dpi_rgb.cpp +1 -1
  502. esphome/components/rtttl/rtttl.cpp +11 -9
  503. esphome/components/safe_mode/button/safe_mode_button.cpp +1 -1
  504. esphome/components/safe_mode/safe_mode.cpp +9 -8
  505. esphome/components/safe_mode/switch/safe_mode_switch.cpp +1 -1
  506. esphome/components/scd30/scd30.cpp +11 -8
  507. esphome/components/scd4x/scd4x.cpp +12 -8
  508. esphome/components/sdl/display.py +40 -0
  509. esphome/components/sdl/sdl_esphome.cpp +2 -2
  510. esphome/components/sdl/sdl_esphome.h +8 -0
  511. esphome/components/sdm_meter/sdm_meter.cpp +5 -2
  512. esphome/components/sdp3x/sdp3x.cpp +11 -11
  513. esphome/components/sds011/sds011.cpp +5 -6
  514. esphome/components/sds011/sds011.h +4 -1
  515. esphome/components/seeed_mr24hpc1/seeed_mr24hpc1.cpp +3 -2
  516. esphome/components/seeed_mr60bha2/seeed_mr60bha2.cpp +1 -0
  517. esphome/components/seeed_mr60fda2/seeed_mr60fda2.cpp +3 -2
  518. esphome/components/selec_meter/selec_meter.cpp +5 -2
  519. esphome/components/select/__init__.py +1 -0
  520. esphome/components/select/select.cpp +1 -1
  521. esphome/components/select/select.h +0 -4
  522. esphome/components/sen0321/sen0321.cpp +2 -2
  523. esphome/components/sen21231/sen21231.cpp +1 -1
  524. esphome/components/sen5x/sen5x.cpp +10 -7
  525. esphome/components/sensirion_common/i2c_sensirion.cpp +2 -1
  526. esphome/components/sensirion_common/i2c_sensirion.h +1 -0
  527. esphome/components/sensor/__init__.py +11 -1
  528. esphome/components/sensor/filter.h +1 -1
  529. esphome/components/sensor/sensor.cpp +8 -4
  530. esphome/components/sensor/sensor.h +12 -11
  531. esphome/components/servo/servo.cpp +12 -9
  532. esphome/components/servo/servo.h +1 -1
  533. esphome/components/sfa30/sfa30.cpp +1 -1
  534. esphome/components/sgp30/sgp30.cpp +10 -8
  535. esphome/components/sgp4x/sgp4x.cpp +49 -61
  536. esphome/components/sgp4x/sgp4x.h +0 -1
  537. esphome/components/shelly_dimmer/shelly_dimmer.cpp +11 -7
  538. esphome/components/sht3xd/sht3xd.cpp +1 -1
  539. esphome/components/sht4x/sht4x.cpp +2 -2
  540. esphome/components/shtcx/shtcx.cpp +13 -16
  541. esphome/components/shutdown/button/shutdown_button.cpp +1 -1
  542. esphome/components/shutdown/switch/shutdown_switch.cpp +1 -1
  543. esphome/components/sim800l/sim800l.cpp +2 -2
  544. esphome/components/slow_pwm/slow_pwm_output.cpp +4 -2
  545. esphome/components/sm16716/sm16716.cpp +1 -1
  546. esphome/components/sm2135/sm2135.cpp +1 -1
  547. esphome/components/sm2235/sm2235.cpp +5 -3
  548. esphome/components/sm2335/sm2335.cpp +5 -3
  549. esphome/components/sml/sml.cpp +1 -1
  550. esphome/components/sn74hc165/sn74hc165.cpp +1 -2
  551. esphome/components/sn74hc595/sn74hc595.cpp +1 -2
  552. esphome/components/sntp/sntp_component.cpp +1 -1
  553. esphome/components/socket/__init__.py +2 -0
  554. esphome/components/socket/bsd_sockets_impl.cpp +51 -7
  555. esphome/components/socket/lwip_raw_tcp_impl.cpp +5 -0
  556. esphome/components/socket/lwip_sockets_impl.cpp +51 -7
  557. esphome/components/socket/socket.cpp +31 -0
  558. esphome/components/socket/socket.h +27 -1
  559. esphome/components/sonoff_d1/sonoff_d1.cpp +7 -4
  560. esphome/components/sonoff_d1/sonoff_d1.h +2 -2
  561. esphome/components/sound_level/sound_level.cpp +4 -2
  562. esphome/components/speaker/media_player/__init__.py +3 -0
  563. esphome/components/speaker/media_player/speaker_media_player.cpp +1 -3
  564. esphome/components/speaker/media_player/speaker_media_player.h +6 -0
  565. esphome/components/spi/__init__.py +10 -2
  566. esphome/components/spi/spi.cpp +4 -4
  567. esphome/components/spi/spi_arduino.cpp +22 -9
  568. esphome/components/spi_device/spi_device.cpp +1 -2
  569. esphome/components/sprinkler/sprinkler.cpp +9 -6
  570. esphome/components/sps30/sps30.cpp +16 -15
  571. esphome/components/ssd1306_base/ssd1306_base.cpp +1 -1
  572. esphome/components/ssd1306_i2c/ssd1306_i2c.cpp +11 -8
  573. esphome/components/ssd1306_spi/ssd1306_spi.cpp +10 -7
  574. esphome/components/ssd1322_base/ssd1322_base.cpp +1 -1
  575. esphome/components/ssd1322_spi/ssd1322_spi.cpp +1 -1
  576. esphome/components/ssd1325_base/ssd1325_base.cpp +1 -1
  577. esphome/components/ssd1325_spi/ssd1325_spi.cpp +1 -1
  578. esphome/components/ssd1327_base/ssd1327_base.cpp +1 -1
  579. esphome/components/ssd1327_i2c/ssd1327_i2c.cpp +2 -2
  580. esphome/components/ssd1327_spi/ssd1327_spi.cpp +1 -1
  581. esphome/components/ssd1331_base/ssd1331_base.cpp +1 -1
  582. esphome/components/ssd1331_spi/ssd1331_spi.cpp +1 -1
  583. esphome/components/ssd1351_base/ssd1351_base.cpp +1 -1
  584. esphome/components/ssd1351_spi/ssd1351_spi.cpp +1 -1
  585. esphome/components/st7567_base/st7567_base.cpp +3 -3
  586. esphome/components/st7567_i2c/st7567_i2c.cpp +7 -5
  587. esphome/components/st7567_spi/st7567_spi.cpp +1 -1
  588. esphome/components/st7701s/st7701s.cpp +4 -2
  589. esphome/components/st7735/st7735.cpp +3 -3
  590. esphome/components/st7789v/st7789v.cpp +10 -7
  591. esphome/components/st7920/st7920.cpp +6 -4
  592. esphome/components/statsd/statsd.cpp +9 -5
  593. esphome/components/status_led/light/status_led_light.cpp +3 -3
  594. esphome/components/status_led/light/status_led_light.h +1 -1
  595. esphome/components/status_led/status_led.cpp +1 -1
  596. esphome/components/stepper/stepper.h +5 -3
  597. esphome/components/sts3x/sts3x.cpp +2 -2
  598. esphome/components/switch/__init__.py +1 -0
  599. esphome/components/switch/switch.cpp +18 -12
  600. esphome/components/switch/switch.h +14 -8
  601. esphome/components/sx1509/__init__.py +53 -20
  602. esphome/components/sx1509/sx1509.cpp +29 -5
  603. esphome/components/sx1509/sx1509.h +9 -1
  604. esphome/components/t6615/t6615.cpp +1 -0
  605. esphome/components/tc74/tc74.cpp +1 -1
  606. esphome/components/tca9548a/tca9548a.cpp +1 -1
  607. esphome/components/tca9555/tca9555.cpp +2 -2
  608. esphome/components/tcs34725/tcs34725.cpp +4 -4
  609. esphome/components/tee501/tee501.cpp +3 -2
  610. esphome/components/tem3200/tem3200.cpp +5 -6
  611. esphome/components/template/alarm_control_panel/__init__.py +6 -0
  612. esphome/components/template/alarm_control_panel/template_alarm_control_panel.cpp +43 -12
  613. esphome/components/template/alarm_control_panel/template_alarm_control_panel.h +4 -1
  614. esphome/components/template/cover/template_cover.cpp +1 -1
  615. esphome/components/template/select/template_select.cpp +6 -4
  616. esphome/components/template/text/template_text.cpp +2 -3
  617. esphome/components/template/valve/template_valve.cpp +5 -3
  618. esphome/components/text/__init__.py +10 -11
  619. esphome/components/text/text.cpp +1 -1
  620. esphome/components/text/text.h +0 -4
  621. esphome/components/text_sensor/__init__.py +1 -0
  622. esphome/components/text_sensor/text_sensor.cpp +8 -4
  623. esphome/components/text_sensor/text_sensor.h +6 -6
  624. esphome/components/thermostat/thermostat_climate.cpp +67 -43
  625. esphome/components/time/__init__.py +1 -2
  626. esphome/components/time_based/time_based_cover.cpp +4 -2
  627. esphome/components/tlc59208f/tlc59208f_output.cpp +8 -6
  628. esphome/components/tm1621/tm1621.cpp +3 -3
  629. esphome/components/tm1637/tm1637.cpp +9 -7
  630. esphome/components/tm1638/tm1638.cpp +7 -5
  631. esphome/components/tm1651/tm1651.cpp +2 -2
  632. esphome/components/tmp102/tmp102.cpp +1 -3
  633. esphome/components/tmp102/tmp102.h +0 -3
  634. esphome/components/tmp1075/tmp1075.cpp +12 -9
  635. esphome/components/tmp117/tmp117.cpp +2 -2
  636. esphome/components/tof10120/tof10120_sensor.cpp +2 -2
  637. esphome/components/tormatic/tormatic_cover.cpp +4 -2
  638. esphome/components/tsl2561/tsl2561.cpp +7 -5
  639. esphome/components/tsl2591/tsl2591.cpp +25 -27
  640. esphome/components/tt21100/touchscreen/tt21100.cpp +1 -1
  641. esphome/components/ttp229_bsf/ttp229_bsf.cpp +1 -1
  642. esphome/components/ttp229_lsf/ttp229_lsf.cpp +2 -2
  643. esphome/components/tuya/select/tuya_select.cpp +5 -3
  644. esphome/components/tx20/tx20.cpp +3 -3
  645. esphome/components/uart/__init__.py +4 -5
  646. esphome/components/uart/button/uart_button.cpp +1 -1
  647. esphome/components/uart/switch/uart_switch.cpp +2 -2
  648. esphome/components/uart/uart.cpp +2 -2
  649. esphome/components/uart/uart_component_esp32_arduino.cpp +8 -6
  650. esphome/components/uart/uart_component_esp8266.cpp +9 -7
  651. esphome/components/uart/uart_component_esp_idf.cpp +9 -7
  652. esphome/components/uart/uart_component_host.cpp +11 -8
  653. esphome/components/uart/uart_component_libretiny.cpp +8 -6
  654. esphome/components/uart/uart_component_rp2040.cpp +8 -6
  655. esphome/components/udp/udp_component.cpp +9 -5
  656. esphome/components/ufire_ec/ufire_ec.cpp +5 -3
  657. esphome/components/ufire_ise/ufire_ise.cpp +1 -1
  658. esphome/components/ultrasonic/ultrasonic_sensor.cpp +5 -3
  659. esphome/components/update/__init__.py +1 -0
  660. esphome/components/update/update_entity.cpp +1 -1
  661. esphome/components/update/update_entity.h +0 -3
  662. esphome/components/uponor_smatrix/climate/uponor_smatrix_climate.cpp +1 -1
  663. esphome/components/uponor_smatrix/sensor/uponor_smatrix_sensor.cpp +4 -2
  664. esphome/components/uponor_smatrix/uponor_smatrix.cpp +2 -1
  665. esphome/components/uptime/sensor/uptime_timestamp_sensor.cpp +1 -1
  666. esphome/components/usb_host/__init__.py +64 -0
  667. esphome/components/usb_host/usb_host.h +116 -0
  668. esphome/components/usb_host/usb_host_client.cpp +394 -0
  669. esphome/components/usb_host/usb_host_component.cpp +35 -0
  670. esphome/components/usb_uart/__init__.py +134 -0
  671. esphome/components/usb_uart/ch34x.cpp +80 -0
  672. esphome/components/usb_uart/cp210x.cpp +126 -0
  673. esphome/components/usb_uart/usb_uart.cpp +328 -0
  674. esphome/components/usb_uart/usb_uart.h +151 -0
  675. esphome/components/valve/__init__.py +1 -0
  676. esphome/components/veml3235/veml3235.cpp +13 -9
  677. esphome/components/veml7700/veml7700.cpp +10 -6
  678. esphome/components/voice_assistant/voice_assistant.cpp +7 -7
  679. esphome/components/wake_on_lan/wake_on_lan.cpp +1 -1
  680. esphome/components/waveshare_epaper/waveshare_epaper.cpp +1 -1
  681. esphome/components/web_server/server_index_v2.h +632 -630
  682. esphome/components/web_server/server_index_v3.h +411 -409
  683. esphome/components/web_server/web_server.cpp +5 -3
  684. esphome/components/web_server_base/web_server_base.cpp +1 -1
  685. esphome/components/web_server_idf/__init__.py +0 -2
  686. esphome/components/web_server_idf/utils.cpp +1 -1
  687. esphome/components/web_server_idf/web_server_idf.cpp +7 -3
  688. esphome/components/web_server_idf/web_server_idf.h +7 -0
  689. esphome/components/weikai/__init__.py +2 -0
  690. esphome/components/weikai/weikai.cpp +24 -22
  691. esphome/components/weikai_i2c/weikai_i2c.cpp +14 -9
  692. esphome/components/weikai_spi/weikai_spi.cpp +11 -6
  693. esphome/components/wiegand/wiegand.cpp +1 -1
  694. esphome/components/wifi/wifi_component.cpp +50 -37
  695. esphome/components/wifi/wifi_component.h +7 -4
  696. esphome/components/wifi/wifi_component_esp32_arduino.cpp +2 -2
  697. esphome/components/wifi/wifi_component_esp8266.cpp +3 -3
  698. esphome/components/wifi/wifi_component_libretiny.cpp +4 -4
  699. esphome/components/wireguard/wireguard.cpp +21 -21
  700. esphome/components/wl_134/text_sensor.py +1 -2
  701. esphome/components/wled/wled_light_effect.cpp +1 -1
  702. esphome/components/x9c/x9c.cpp +5 -3
  703. esphome/components/xgzp68xx/xgzp68xx.cpp +8 -6
  704. esphome/components/xiaomi_cgd1/xiaomi_cgd1.cpp +4 -2
  705. esphome/components/xiaomi_cgdk2/xiaomi_cgdk2.cpp +4 -2
  706. esphome/components/xiaomi_cgg1/xiaomi_cgg1.cpp +4 -2
  707. esphome/components/xiaomi_hhccjcy10/xiaomi_hhccjcy10.cpp +1 -1
  708. esphome/components/xiaomi_lywsd02mmc/xiaomi_lywsd02mmc.cpp +4 -2
  709. esphome/components/xiaomi_lywsd03mmc/xiaomi_lywsd03mmc.cpp +4 -2
  710. esphome/components/xiaomi_mhoc401/xiaomi_mhoc401.cpp +4 -2
  711. esphome/components/xl9535/xl9535.cpp +2 -2
  712. esphome/components/xpt2046/touchscreen/xpt2046.cpp +12 -11
  713. esphome/components/xpt2046/touchscreen/xpt2046.h +2 -2
  714. esphome/config.py +3 -2
  715. esphome/config_validation.py +46 -17
  716. esphome/const.py +10 -1
  717. esphome/core/__init__.py +37 -18
  718. esphome/core/application.cpp +197 -8
  719. esphome/core/application.h +116 -6
  720. esphome/core/component.cpp +36 -15
  721. esphome/core/component.h +43 -13
  722. esphome/core/config.py +12 -0
  723. esphome/core/defines.h +10 -2
  724. esphome/core/entity_base.cpp +4 -16
  725. esphome/core/entity_base.h +27 -13
  726. esphome/core/hal.h +5 -0
  727. esphome/core/helpers.cpp +1 -1
  728. esphome/core/helpers.h +5 -5
  729. esphome/core/log.h +2 -0
  730. esphome/core/log_const_en.h +4 -0
  731. esphome/core/scheduler.cpp +2 -2
  732. esphome/coroutine.py +3 -4
  733. esphome/cpp_generator.py +32 -32
  734. esphome/dashboard/core.py +2 -2
  735. esphome/dashboard/web_server.py +2 -2
  736. esphome/git.py +4 -4
  737. esphome/helpers.py +5 -6
  738. esphome/loader.py +8 -7
  739. esphome/log.py +7 -1
  740. esphome/platformio_api.py +2 -3
  741. esphome/storage_json.py +13 -5
  742. esphome/types.py +12 -13
  743. esphome/util.py +1 -2
  744. esphome/wizard.py +0 -16
  745. esphome/writer.py +5 -3
  746. esphome/yaml_util.py +6 -1
  747. esphome/zeroconf.py +1 -1
  748. {esphome-2025.5.1.dist-info → esphome-2025.6.0.dist-info}/METADATA +12 -11
  749. {esphome-2025.5.1.dist-info → esphome-2025.6.0.dist-info}/RECORD +753 -699
  750. {esphome-2025.5.1.dist-info → esphome-2025.6.0.dist-info}/WHEEL +1 -1
  751. {esphome-2025.5.1.dist-info → esphome-2025.6.0.dist-info}/entry_points.txt +0 -0
  752. {esphome-2025.5.1.dist-info → esphome-2025.6.0.dist-info}/licenses/LICENSE +0 -0
  753. {esphome-2025.5.1.dist-info → esphome-2025.6.0.dist-info}/top_level.txt +0 -0
@@ -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 {
@@ -66,7 +66,7 @@ void InternalTemperatureSensor::update() {
66
66
  esp_err_t result = temperature_sensor_get_celsius(tsensNew, &temperature);
67
67
  success = (result == ESP_OK);
68
68
  if (!success) {
69
- ESP_LOGE(TAG, "Failed to get temperature: %d", result);
69
+ ESP_LOGE(TAG, "Reading failed (%d)", result);
70
70
  }
71
71
  #endif // ESP_IDF_VERSION < ESP_IDF_VERSION_VAL(5, 0, 0)
72
72
  #endif // USE_ESP32_VARIANT
@@ -103,20 +103,20 @@ void InternalTemperatureSensor::setup() {
103
103
  (defined(USE_ESP32_VARIANT_ESP32C3) || defined(USE_ESP32_VARIANT_ESP32C6) || defined(USE_ESP32_VARIANT_ESP32S2) || \
104
104
  defined(USE_ESP32_VARIANT_ESP32S3) || defined(USE_ESP32_VARIANT_ESP32H2) || defined(USE_ESP32_VARIANT_ESP32C2) || \
105
105
  defined(USE_ESP32_VARIANT_ESP32P4))
106
- ESP_LOGCONFIG(TAG, "Setting up temperature sensor...");
106
+ ESP_LOGCONFIG(TAG, "Running setup");
107
107
 
108
108
  temperature_sensor_config_t tsens_config = TEMPERATURE_SENSOR_CONFIG_DEFAULT(-10, 80);
109
109
 
110
110
  esp_err_t result = temperature_sensor_install(&tsens_config, &tsensNew);
111
111
  if (result != ESP_OK) {
112
- ESP_LOGE(TAG, "Failed to install temperature sensor: %d", result);
112
+ ESP_LOGE(TAG, "Install failed (%d)", result);
113
113
  this->mark_failed();
114
114
  return;
115
115
  }
116
116
 
117
117
  result = temperature_sensor_enable(tsensNew);
118
118
  if (result != ESP_OK) {
119
- ESP_LOGE(TAG, "Failed to enable temperature sensor: %d", result);
119
+ ESP_LOGE(TAG, "Enabling failed (%d)", result);
120
120
  this->mark_failed();
121
121
  return;
122
122
  }
@@ -20,8 +20,7 @@ std::string build_json(const json_build_t &f) {
20
20
  ESP_LOGV(TAG, "Attempting to allocate %zu bytes for JSON serialization", request_size);
21
21
  DynamicJsonDocument json_document(request_size);
22
22
  if (json_document.capacity() == 0) {
23
- ESP_LOGE(TAG,
24
- "Could not allocate memory for JSON document! Requested %zu bytes, largest free heap block: %zu bytes",
23
+ ESP_LOGE(TAG, "Could not allocate memory for document! Requested %zu bytes, largest free heap block: %zu bytes",
25
24
  request_size, free_heap);
26
25
  return "{}";
27
26
  }
@@ -29,7 +28,7 @@ std::string build_json(const json_build_t &f) {
29
28
  f(root);
30
29
  if (json_document.overflowed()) {
31
30
  if (request_size == free_heap) {
32
- ESP_LOGE(TAG, "Could not allocate memory for JSON document! Overflowed largest free heap block: %zu bytes",
31
+ ESP_LOGE(TAG, "Could not allocate memory for document! Overflowed largest free heap block: %zu bytes",
33
32
  free_heap);
34
33
  return "{}";
35
34
  }
@@ -54,7 +53,7 @@ bool parse_json(const std::string &data, const json_parse_t &f) {
54
53
  while (true) {
55
54
  DynamicJsonDocument json_document(request_size);
56
55
  if (json_document.capacity() == 0) {
57
- ESP_LOGE(TAG, "Could not allocate memory for JSON document! Requested %zu bytes, free heap: %zu", request_size,
56
+ ESP_LOGE(TAG, "Could not allocate memory for document! Requested %zu bytes, free heap: %zu", request_size,
58
57
  free_heap);
59
58
  return false;
60
59
  }
@@ -74,7 +73,7 @@ bool parse_json(const std::string &data, const json_parse_t &f) {
74
73
  request_size *= 2;
75
74
  continue;
76
75
  } else {
77
- ESP_LOGE(TAG, "JSON parse error: %s", err.c_str());
76
+ ESP_LOGE(TAG, "Parse error: %s", err.c_str());
78
77
  return false;
79
78
  }
80
79
  };
@@ -10,7 +10,7 @@ static const char *const TAG = "kamstrup_kmp";
10
10
  void KamstrupKMPComponent::dump_config() {
11
11
  ESP_LOGCONFIG(TAG, "kamstrup_kmp:");
12
12
  if (this->is_failed()) {
13
- ESP_LOGE(TAG, "Communication with Kamstrup meter failed!");
13
+ ESP_LOGE(TAG, ESP_LOG_MSG_COMM_FAIL);
14
14
  }
15
15
  LOG_UPDATE_INTERVAL(this);
16
16
 
@@ -32,8 +32,10 @@ void KeyCollector::dump_config() {
32
32
  if (!this->start_keys_.empty())
33
33
  ESP_LOGCONFIG(TAG, " start keys '%s'", this->start_keys_.c_str());
34
34
  if (!this->end_keys_.empty()) {
35
- ESP_LOGCONFIG(TAG, " end keys '%s'", this->end_keys_.c_str());
36
- ESP_LOGCONFIG(TAG, " end key is required: %s", ONOFF(this->end_key_required_));
35
+ ESP_LOGCONFIG(TAG,
36
+ " end keys '%s'\n"
37
+ " end key is required: %s",
38
+ this->end_keys_.c_str(), ONOFF(this->end_key_required_));
37
39
  }
38
40
  if (!this->allowed_keys_.empty())
39
41
  ESP_LOGCONFIG(TAG, " allowed keys '%s'", this->allowed_keys_.c_str());
@@ -1,5 +1,6 @@
1
1
  #include "kmeteriso.h"
2
2
  #include "esphome/core/hal.h"
3
+ #include "esphome/core/helpers.h"
3
4
  #include "esphome/core/log.h"
4
5
 
5
6
  namespace esphome {
@@ -13,14 +14,13 @@ static const uint8_t KMETER_INTERNAL_TEMP_VAL_REG = 0x10;
13
14
  static const uint8_t KMETER_FIRMWARE_VERSION_REG = 0xFE;
14
15
 
15
16
  void KMeterISOComponent::setup() {
16
- ESP_LOGCONFIG(TAG, "Setting up KMeterISO...");
17
+ ESP_LOGCONFIG(TAG, "Running setup");
17
18
  this->error_code_ = NONE;
18
19
 
19
20
  // Mark as not failed before initializing. Some devices will turn off sensors to save on batteries
20
21
  // and when they come back on, the COMPONENT_STATE_FAILED bit must be unset on the component.
21
- if ((this->component_state_ & COMPONENT_STATE_MASK) == COMPONENT_STATE_FAILED) {
22
- this->component_state_ &= ~COMPONENT_STATE_MASK;
23
- this->component_state_ |= COMPONENT_STATE_CONSTRUCTION;
22
+ if (this->is_failed()) {
23
+ this->reset_to_construction_state();
24
24
  }
25
25
 
26
26
  auto err = this->bus_->writev(this->address_, nullptr, 0);
@@ -77,8 +77,10 @@ void Kuntze::loop() {
77
77
  void Kuntze::update() { this->state_ = 1; }
78
78
 
79
79
  void Kuntze::dump_config() {
80
- ESP_LOGCONFIG(TAG, "Kuntze:");
81
- ESP_LOGCONFIG(TAG, " Address: 0x%02X", this->address_);
80
+ ESP_LOGCONFIG(TAG,
81
+ "Kuntze:\n"
82
+ " Address: 0x%02X",
83
+ this->address_);
82
84
  LOG_SENSOR("", "pH", this->ph_sensor_);
83
85
  LOG_SENSOR("", "temperature", this->temperature_sensor_);
84
86
  LOG_SENSOR("", "DIS1", this->dis1_sensor_);
@@ -0,0 +1 @@
1
+ CODEOWNERS = ["@ilikecake"]
@@ -0,0 +1,299 @@
1
+ #include "esphome/core/log.h"
2
+ #include "lc709203f.h"
3
+
4
+ namespace esphome {
5
+ namespace lc709203f {
6
+
7
+ static const char *const TAG = "lc709203f.sensor";
8
+
9
+ // Device I2C address. This address is fixed.
10
+ static const uint8_t LC709203F_I2C_ADDR_DEFAULT = 0x0B;
11
+
12
+ // Device registers
13
+ static const uint8_t LC709203F_BEFORE_RSOC = 0x04;
14
+ static const uint8_t LC709203F_THERMISTOR_B = 0x06;
15
+ static const uint8_t LC709203F_INITIAL_RSOC = 0x07;
16
+ static const uint8_t LC709203F_CELL_TEMPERATURE = 0x08;
17
+ static const uint8_t LC709203F_CELL_VOLTAGE = 0x09;
18
+ static const uint8_t LC709203F_CURRENT_DIRECTION = 0x0A;
19
+ static const uint8_t LC709203F_APA = 0x0B;
20
+ static const uint8_t LC709203F_APT = 0x0C;
21
+ static const uint8_t LC709203F_RSOC = 0x0D;
22
+ static const uint8_t LC709203F_ITE = 0x0F;
23
+ static const uint8_t LC709203F_IC_VERSION = 0x11;
24
+ static const uint8_t LC709203F_CHANGE_OF_THE_PARAMETER = 0x12;
25
+ static const uint8_t LC709203F_ALARM_LOW_RSOC = 0x13;
26
+ static const uint8_t LC709203F_ALARM_LOW_CELL_VOLTAGE = 0x14;
27
+ static const uint8_t LC709203F_IC_POWER_MODE = 0x15;
28
+ static const uint8_t LC709203F_STATUS_BIT = 0x16;
29
+ static const uint8_t LC709203F_NUMBER_OF_THE_PARAMETER = 0x1A;
30
+
31
+ static const uint8_t LC709203F_POWER_MODE_ON = 0x0001;
32
+ static const uint8_t LC709203F_POWER_MODE_SLEEP = 0x0002;
33
+
34
+ // The number of times to retry an I2C transaction before giving up. In my experience,
35
+ // 10 is a good number here that will take care of most bus issues that require retry.
36
+ static const uint8_t LC709203F_I2C_RETRY_COUNT = 10;
37
+
38
+ void Lc709203f::setup() {
39
+ // Note: The setup implements a small state machine. This is because we want to have
40
+ // delays before and after sending the RSOC command. The full init process should be:
41
+ // INIT->RSOC->TEMP_SETUP->NORMAL
42
+ // The setup() function will only perform the first part of the initialization process.
43
+ // Assuming no errors, the whole process should occur during the setup() function and
44
+ // the first two calls to update(). After that, the part should remain in normal mode
45
+ // until a device reset.
46
+ //
47
+ // This device can be picky about I2C communication and can error out occasionally. The
48
+ // get/set register functions impelment retry logic to retry the I2C transactions. The
49
+ // initialization code checks the return code from those functions. If they don't return
50
+ // NO_ERROR (0x00), that part of the initialization aborts and will be retried on the next
51
+ // call to update().
52
+ ESP_LOGCONFIG(TAG, "Running setup");
53
+
54
+ // Set power mode to on. Note that, unlike some other similar devices, in sleep mode the IC
55
+ // does not record power usage. If there is significant power consumption during sleep mode,
56
+ // the pack RSOC will likely no longer be correct. Because of that, I do not implement
57
+ // sleep mode on this device.
58
+
59
+ // Initialize device registers. If any of these fail, retry during the update() function.
60
+ if (this->set_register_(LC709203F_IC_POWER_MODE, LC709203F_POWER_MODE_ON) != i2c::NO_ERROR) {
61
+ return;
62
+ }
63
+
64
+ if (this->set_register_(LC709203F_APA, this->apa_) != i2c::NO_ERROR) {
65
+ return;
66
+ }
67
+
68
+ if (this->set_register_(LC709203F_CHANGE_OF_THE_PARAMETER, this->pack_voltage_) != i2c::NO_ERROR) {
69
+ return;
70
+ }
71
+
72
+ this->state_ = STATE_RSOC;
73
+ // Note: Initialization continues in the update() function.
74
+ }
75
+
76
+ void Lc709203f::update() {
77
+ uint16_t buffer;
78
+
79
+ if (this->state_ == STATE_NORMAL) {
80
+ // Note: If we fail to read from the data registers, we do not report any sensor reading.
81
+ if (this->voltage_sensor_ != nullptr) {
82
+ if (this->get_register_(LC709203F_CELL_VOLTAGE, &buffer) == i2c::NO_ERROR) {
83
+ // Raw units are mV
84
+ this->voltage_sensor_->publish_state(static_cast<float>(buffer) / 1000.0f);
85
+ this->status_clear_warning();
86
+ }
87
+ }
88
+ if (this->battery_remaining_sensor_ != nullptr) {
89
+ if (this->get_register_(LC709203F_ITE, &buffer) == i2c::NO_ERROR) {
90
+ // Raw units are .1%
91
+ this->battery_remaining_sensor_->publish_state(static_cast<float>(buffer) / 10.0f);
92
+ this->status_clear_warning();
93
+ }
94
+ }
95
+ if (this->temperature_sensor_ != nullptr) {
96
+ // I can't test this with a real thermistor because I don't have a device with
97
+ // an attached thermistor. I have turned on the sensor and made sure that it
98
+ // sets up the registers properly.
99
+ if (this->get_register_(LC709203F_CELL_TEMPERATURE, &buffer) == i2c::NO_ERROR) {
100
+ // Raw units are .1 K
101
+ this->temperature_sensor_->publish_state((static_cast<float>(buffer) / 10.0f) - 273.15f);
102
+ this->status_clear_warning();
103
+ }
104
+ }
105
+ } else if (this->state_ == STATE_INIT) {
106
+ // Retry initializing the device registers. We should only get here if the init sequence
107
+ // failed during the setup() function. This would likely occur because of a repeated failures
108
+ // on the I2C bus. If any of these fail, retry the next time the update() function is called.
109
+ if (this->set_register_(LC709203F_IC_POWER_MODE, LC709203F_POWER_MODE_ON) != i2c::NO_ERROR) {
110
+ return;
111
+ }
112
+
113
+ if (this->set_register_(LC709203F_APA, this->apa_) != i2c::NO_ERROR) {
114
+ return;
115
+ }
116
+
117
+ if (this->set_register_(LC709203F_CHANGE_OF_THE_PARAMETER, this->pack_voltage_) != i2c::NO_ERROR) {
118
+ return;
119
+ }
120
+
121
+ this->state_ = STATE_RSOC;
122
+
123
+ } else if (this->state_ == STATE_RSOC) {
124
+ // We implement a delay here to send the initial RSOC command.
125
+ // This should run once on the first update() after initialization.
126
+ if (this->set_register_(LC709203F_INITIAL_RSOC, 0xAA55) == i2c::NO_ERROR) {
127
+ this->state_ = STATE_TEMP_SETUP;
128
+ }
129
+ } else if (this->state_ == STATE_TEMP_SETUP) {
130
+ // This should run once on the second update() after initialization.
131
+ if (this->temperature_sensor_ != nullptr) {
132
+ // This assumes that a thermistor is attached to the device as shown in the datahseet.
133
+ if (this->set_register_(LC709203F_STATUS_BIT, 0x0001) == i2c::NO_ERROR) {
134
+ if (this->set_register_(LC709203F_THERMISTOR_B, this->b_constant_) == i2c::NO_ERROR) {
135
+ this->state_ = STATE_NORMAL;
136
+ }
137
+ }
138
+ } else if (this->set_register_(LC709203F_STATUS_BIT, 0x0000) == i2c::NO_ERROR) {
139
+ // The device expects to get updates to the temperature in this mode.
140
+ // I am not doing that now. The temperature register defaults to 25C.
141
+ // In theory, we could have another temperature sensor and have ESPHome
142
+ // send updated temperature to the device occasionally, but I have no idea
143
+ // how to make that happen.
144
+ this->state_ = STATE_NORMAL;
145
+ }
146
+ }
147
+ }
148
+
149
+ void Lc709203f::dump_config() {
150
+ ESP_LOGCONFIG(TAG, "LC709203F:");
151
+ LOG_I2C_DEVICE(this);
152
+
153
+ LOG_UPDATE_INTERVAL(this);
154
+ ESP_LOGCONFIG(TAG,
155
+ " Pack Size: %d mAH\n"
156
+ " Pack APA: 0x%02X",
157
+ this->pack_size_, this->apa_);
158
+
159
+ // This is only true if the pack_voltage_ is either 0x0000 or 0x0001. The config validator
160
+ // should have already verified this.
161
+ ESP_LOGCONFIG(TAG, " Pack Rated Voltage: 3.%sV", this->pack_voltage_ == 0x0000 ? "8" : "7");
162
+
163
+ LOG_SENSOR(" ", "Voltage", this->voltage_sensor_);
164
+ LOG_SENSOR(" ", "Battery Remaining", this->battery_remaining_sensor_);
165
+
166
+ if (this->temperature_sensor_ != nullptr) {
167
+ LOG_SENSOR(" ", "Temperature", this->temperature_sensor_);
168
+ ESP_LOGCONFIG(TAG, " B_Constant: %d", this->b_constant_);
169
+ } else {
170
+ ESP_LOGCONFIG(TAG, " No Temperature Sensor");
171
+ }
172
+ }
173
+
174
+ uint8_t Lc709203f::get_register_(uint8_t register_to_read, uint16_t *register_value) {
175
+ i2c::ErrorCode return_code;
176
+ uint8_t read_buffer[6];
177
+
178
+ read_buffer[0] = (this->address_) << 1;
179
+ read_buffer[1] = register_to_read;
180
+ read_buffer[2] = ((this->address_) << 1) | 0x01;
181
+
182
+ for (uint8_t i = 0; i <= LC709203F_I2C_RETRY_COUNT; i++) {
183
+ // Note: the read_register() function does not send a stop between the write and
184
+ // the read portions of the I2C transation when you set the last variable to 'false'
185
+ // as we do below. Some of the other I2C read functions such as the generic read()
186
+ // function will send a stop between the read and the write portion of the I2C
187
+ // transaction. This is bad in this case and will result in reading nothing but 0xFFFF
188
+ // from the registers.
189
+ return_code = this->read_register(register_to_read, &read_buffer[3], 3, false);
190
+ if (return_code != i2c::NO_ERROR) {
191
+ // Error on the i2c bus
192
+ this->status_set_warning(
193
+ str_sprintf("Error code %d when reading from register 0x%02X", return_code, register_to_read).c_str());
194
+ } else if (this->crc8_(read_buffer, 5) != read_buffer[5]) {
195
+ // I2C indicated OK, but the CRC of the data does not matcth.
196
+ this->status_set_warning(str_sprintf("CRC error reading from register 0x%02X", register_to_read).c_str());
197
+ } else {
198
+ *register_value = ((uint16_t) read_buffer[4] << 8) | (uint16_t) read_buffer[3];
199
+ return i2c::NO_ERROR;
200
+ }
201
+ }
202
+
203
+ // If we get here, we tried LC709203F_I2C_RETRY_COUNT times to read the register and
204
+ // failed each time. Set the register value to 0 and return the I2C error code or 0xFF
205
+ // to indicate a CRC failure. It will be up to the higher level code what to do when
206
+ // this happens.
207
+ *register_value = 0x0000;
208
+ if (return_code != i2c::NO_ERROR) {
209
+ return return_code;
210
+ } else {
211
+ return 0xFF;
212
+ }
213
+ }
214
+
215
+ uint8_t Lc709203f::set_register_(uint8_t register_to_set, uint16_t value_to_set) {
216
+ i2c::ErrorCode return_code;
217
+ uint8_t write_buffer[5];
218
+
219
+ // Note: We don't actually send byte[0] of the buffer. We include it because it is
220
+ // part of the CRC calculation.
221
+ write_buffer[0] = (this->address_) << 1;
222
+ write_buffer[1] = register_to_set;
223
+ write_buffer[2] = value_to_set & 0xFF; // Low byte
224
+ write_buffer[3] = (value_to_set >> 8) & 0xFF; // High byte
225
+ write_buffer[4] = this->crc8_(write_buffer, 4);
226
+
227
+ for (uint8_t i = 0; i <= LC709203F_I2C_RETRY_COUNT; i++) {
228
+ // Note: we don't write the first byte of the write buffer to the device.
229
+ // This is done automatically by the write() function.
230
+ return_code = this->write(&write_buffer[1], 4, true);
231
+ if (return_code == i2c::NO_ERROR) {
232
+ return return_code;
233
+ } else {
234
+ this->status_set_warning(
235
+ str_sprintf("Error code %d when writing to register 0x%02X", return_code, register_to_set).c_str());
236
+ }
237
+ }
238
+
239
+ // If we get here, we tried to send the data LC709203F_I2C_RETRY_COUNT times and failed.
240
+ // We return the I2C error code, it is up to the higher level code what to do about it.
241
+ return return_code;
242
+ }
243
+
244
+ uint8_t Lc709203f::crc8_(uint8_t *byte_buffer, uint8_t length_of_crc) {
245
+ uint8_t crc = 0x00;
246
+ const uint8_t polynomial(0x07);
247
+
248
+ for (uint8_t j = length_of_crc; j; --j) {
249
+ crc ^= *byte_buffer++;
250
+
251
+ for (uint8_t i = 8; i; --i) {
252
+ crc = (crc & 0x80) ? (crc << 1) ^ polynomial : (crc << 1);
253
+ }
254
+ }
255
+ return crc;
256
+ }
257
+
258
+ void Lc709203f::set_pack_size(uint16_t pack_size) {
259
+ static const uint16_t PACK_SIZE_ARRAY[6] = {100, 200, 500, 1000, 2000, 3000};
260
+ static const uint16_t APA_ARRAY[6] = {0x08, 0x0B, 0x10, 0x19, 0x2D, 0x36};
261
+ float slope;
262
+ float intercept;
263
+
264
+ this->pack_size_ = pack_size; // Pack size in mAH
265
+
266
+ // The size is used to calculate the 'Adjustment Pack Application' number.
267
+ // Here we assume a type 01 or type 03 battery and do a linear curve fit to find the APA.
268
+ for (uint8_t i = 0; i < 6; i++) {
269
+ if (PACK_SIZE_ARRAY[i] == pack_size) {
270
+ // If the pack size is exactly one of the values in the array.
271
+ this->apa_ = APA_ARRAY[i];
272
+ return;
273
+ } else if ((i > 0) && (PACK_SIZE_ARRAY[i] > pack_size) && (PACK_SIZE_ARRAY[i - 1] < pack_size)) {
274
+ // If the pack size is between the current array element and the previous. Do a linear
275
+ // Curve fit to determine the APA value.
276
+
277
+ // Type casting is required here to avoid interger division
278
+ slope = static_cast<float>(APA_ARRAY[i] - APA_ARRAY[i - 1]) /
279
+ static_cast<float>(PACK_SIZE_ARRAY[i] - PACK_SIZE_ARRAY[i - 1]);
280
+
281
+ // Type casting might not be needed here.
282
+ intercept = static_cast<float>(APA_ARRAY[i]) - slope * static_cast<float>(PACK_SIZE_ARRAY[i]);
283
+
284
+ this->apa_ = static_cast<uint8_t>(slope * pack_size + intercept);
285
+ return;
286
+ }
287
+ }
288
+ // We should never get here. If we do, it means we never set the pack APA. This should
289
+ // not be possible because of the config validation. However, if it does happen, the
290
+ // consequence is that the RSOC values will likley not be as accurate. However, it should
291
+ // not cause an error or crash, so I am not doing any additional checking here.
292
+ }
293
+
294
+ void Lc709203f::set_thermistor_b_constant(uint16_t b_constant) { this->b_constant_ = b_constant; }
295
+
296
+ void Lc709203f::set_pack_voltage(LC709203FBatteryVoltage pack_voltage) { this->pack_voltage_ = pack_voltage; }
297
+
298
+ } // namespace lc709203f
299
+ } // namespace esphome