esphome 2025.5.2__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 (715) 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 -1
  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/preferences.cpp +6 -6
  181. esphome/components/esp8266_pwm/esp8266_pwm.cpp +3 -3
  182. esphome/components/esp_ldo/__init__.py +91 -0
  183. esphome/components/esp_ldo/esp_ldo.cpp +43 -0
  184. esphome/components/esp_ldo/esp_ldo.h +43 -0
  185. esphome/components/esphome/ota/ota_esphome.cpp +15 -8
  186. esphome/components/ethernet/ethernet_component.cpp +38 -26
  187. esphome/components/ethernet/ethernet_component.h +1 -1
  188. esphome/components/event/__init__.py +1 -0
  189. esphome/components/exposure_notifications/exposure_notifications.cpp +1 -1
  190. esphome/components/ezo/ezo.cpp +1 -1
  191. esphome/components/ezo_pmp/ezo_pmp.cpp +1 -1
  192. esphome/components/factory_reset/button/factory_reset_button.cpp +1 -1
  193. esphome/components/factory_reset/switch/factory_reset_switch.cpp +1 -1
  194. esphome/components/fan/__init__.py +1 -0
  195. esphome/components/fan/fan.cpp +4 -2
  196. esphome/components/fastled_base/fastled_light.cpp +7 -5
  197. esphome/components/fingerprint_grow/fingerprint_grow.cpp +8 -6
  198. esphome/components/fs3000/fs3000.cpp +1 -1
  199. esphome/components/ft5x06/touchscreen/ft5x06_touchscreen.cpp +7 -4
  200. esphome/components/ft63x6/ft63x6.cpp +5 -3
  201. esphome/components/gcja5/gcja5.cpp +0 -12
  202. esphome/components/gcja5/gcja5.h +8 -3
  203. esphome/components/gdk101/gdk101.cpp +2 -2
  204. esphome/components/globals/globals_component.h +13 -10
  205. esphome/components/gp2y1010au0f/gp2y1010au0f.cpp +4 -2
  206. esphome/components/gp8403/gp8403.cpp +4 -2
  207. esphome/components/gp8403/output/gp8403_output.cpp +4 -2
  208. esphome/components/gpio/one_wire/gpio_one_wire.cpp +2 -2
  209. esphome/components/gpio/output/gpio_binary_output.cpp +1 -1
  210. esphome/components/gpio/switch/gpio_switch.cpp +1 -1
  211. esphome/components/graphical_display_menu/graphical_display_menu.cpp +12 -8
  212. esphome/components/grove_gas_mc_v2/grove_gas_mc_v2.cpp +5 -6
  213. esphome/components/grove_tb6612fng/grove_tb6612fng.cpp +1 -1
  214. esphome/components/grove_tb6612fng/grove_tb6612fng.h +1 -1
  215. esphome/components/growatt_solar/growatt_solar.cpp +6 -3
  216. esphome/components/gt911/touchscreen/gt911_touchscreen.cpp +1 -1
  217. esphome/components/haier/haier_base.cpp +2 -2
  218. esphome/components/haier/hon_climate.cpp +13 -6
  219. esphome/components/havells_solar/havells_solar.cpp +5 -2
  220. esphome/components/hbridge/switch/hbridge_switch.cpp +1 -1
  221. esphome/components/hdc1080/hdc1080.cpp +2 -2
  222. esphome/components/he60r/he60r.cpp +4 -2
  223. esphome/components/hlw8012/hlw8012.cpp +6 -4
  224. esphome/components/hm3301/hm3301.cpp +2 -2
  225. esphome/components/hmc5883l/hmc5883l.cpp +2 -2
  226. esphome/components/homeassistant/time/homeassistant_time.cpp +4 -2
  227. esphome/components/honeywell_hih_i2c/honeywell_hih.cpp +4 -4
  228. esphome/components/honeywellabp/honeywellabp.cpp +4 -2
  229. esphome/components/honeywellabp2_i2c/honeywellabp2.cpp +8 -6
  230. esphome/components/hte501/hte501.cpp +3 -2
  231. esphome/components/http_request/__init__.py +2 -2
  232. esphome/components/http_request/http_request.cpp +7 -5
  233. esphome/components/http_request/http_request_idf.cpp +4 -2
  234. esphome/components/http_request/ota/ota_http_request.cpp +1 -1
  235. esphome/components/htu21d/htu21d.cpp +2 -2
  236. esphome/components/htu31d/htu31d.cpp +2 -2
  237. esphome/components/hx711/hx711.cpp +2 -2
  238. esphome/components/hydreon_rgxx/hydreon_rgxx.cpp +5 -3
  239. esphome/components/hyt271/hyt271.cpp +2 -2
  240. esphome/components/i2c/i2c_bus_arduino.cpp +14 -11
  241. esphome/components/i2c/i2c_bus_esp_idf.cpp +13 -11
  242. esphome/components/i2s_audio/__init__.py +2 -0
  243. esphome/components/i2s_audio/i2s_audio.cpp +3 -4
  244. esphome/components/i2s_audio/i2s_audio.h +1 -1
  245. esphome/components/i2s_audio/media_player/__init__.py +1 -1
  246. esphome/components/i2s_audio/media_player/i2s_audio_media_player.cpp +5 -3
  247. esphome/components/i2s_audio/microphone/i2s_audio_microphone.cpp +1 -1
  248. esphome/components/i2s_audio/speaker/i2s_audio_speaker.cpp +1 -1
  249. esphome/components/iaqcore/iaqcore.cpp +3 -3
  250. esphome/components/ili9xxx/ili9xxx_display.cpp +12 -7
  251. esphome/components/ili9xxx/ili9xxx_display.h +1 -1
  252. esphome/components/image/image.cpp +1 -0
  253. esphome/components/ina219/ina219.cpp +2 -2
  254. esphome/components/ina226/ina226.cpp +8 -5
  255. esphome/components/ina260/ina260.cpp +1 -1
  256. esphome/components/ina2xx_base/ina2xx_base.cpp +13 -9
  257. esphome/components/ina3221/ina3221.cpp +2 -2
  258. esphome/components/inkplate6/display.py +12 -2
  259. esphome/components/inkplate6/inkplate.cpp +13 -9
  260. esphome/components/inkplate6/inkplate.h +7 -6
  261. esphome/components/integration/integration_sensor.cpp +1 -1
  262. esphome/components/internal_temperature/internal_temperature.cpp +4 -4
  263. esphome/components/json/json_util.cpp +4 -5
  264. esphome/components/kamstrup_kmp/kamstrup_kmp.cpp +1 -1
  265. esphome/components/key_collector/key_collector.cpp +4 -2
  266. esphome/components/kmeteriso/kmeteriso.cpp +2 -1
  267. esphome/components/kuntze/kuntze.cpp +4 -2
  268. esphome/components/lc709203f/__init__.py +1 -0
  269. esphome/components/lc709203f/lc709203f.cpp +299 -0
  270. esphome/components/lc709203f/lc709203f.h +55 -0
  271. esphome/components/lc709203f/sensor.py +93 -0
  272. esphome/components/lcd_base/lcd_display.cpp +2 -2
  273. esphome/components/lcd_gpio/gpio_lcd_display.cpp +5 -3
  274. esphome/components/lcd_menu/lcd_menu.cpp +6 -4
  275. esphome/components/lcd_pcf8574/pcf8574_display.cpp +6 -4
  276. esphome/components/ld2410/ld2410.cpp +6 -7
  277. esphome/components/ld2420/ld2420.cpp +9 -7
  278. esphome/components/ld2450/ld2450.cpp +6 -4
  279. esphome/components/ld2450/sensor.py +2 -2
  280. esphome/components/ledc/ledc_output.cpp +32 -28
  281. esphome/components/libretiny/const.py +1 -1
  282. esphome/components/libretiny/preferences.cpp +6 -7
  283. esphome/components/light/__init__.py +2 -1
  284. esphome/components/light/esp_hsv_color.h +1 -1
  285. esphome/components/light/light_state.cpp +9 -5
  286. esphome/components/light/light_transformer.h +1 -1
  287. esphome/components/lightwaverf/LwTx.cpp +1 -1
  288. esphome/components/lightwaverf/lightwaverf.cpp +1 -1
  289. esphome/components/lilygo_t5_47/touchscreen/lilygo_t5_47_touchscreen.cpp +1 -1
  290. esphome/components/lock/__init__.py +1 -0
  291. esphome/components/lock/lock.h +1 -1
  292. esphome/components/logger/__init__.py +6 -0
  293. esphome/components/logger/logger.cpp +9 -5
  294. esphome/components/logger/logger_esp32.cpp +5 -5
  295. esphome/components/ltr390/ltr390.cpp +8 -5
  296. esphome/components/ltr501/ltr501.cpp +19 -14
  297. esphome/components/ltr_als_ps/ltr_als_ps.cpp +20 -13
  298. esphome/components/lvgl/__init__.py +2 -2
  299. esphome/components/lvgl/automation.py +5 -4
  300. esphome/components/lvgl/defines.py +0 -2
  301. esphome/components/lvgl/lv_validation.py +1 -3
  302. esphome/components/lvgl/lvcode.py +7 -8
  303. esphome/components/lvgl/lvgl_esphome.cpp +26 -10
  304. esphome/components/lvgl/schemas.py +22 -23
  305. esphome/components/lvgl/trigger.py +8 -3
  306. esphome/components/lvgl/widgets/__init__.py +2 -2
  307. esphome/components/lvgl/widgets/canvas.py +9 -3
  308. esphome/components/lvgl/widgets/line.py +2 -1
  309. esphome/components/lvgl/widgets/tabview.py +7 -0
  310. esphome/components/m5stack_8angle/m5stack_8angle.cpp +3 -3
  311. esphome/components/matrix_keypad/matrix_keypad.cpp +2 -2
  312. esphome/components/max17043/max17043.cpp +2 -2
  313. esphome/components/max31855/max31855.cpp +2 -1
  314. esphome/components/max31856/max31856.cpp +9 -11
  315. esphome/components/max31865/max31865.cpp +6 -4
  316. esphome/components/max44009/max44009.cpp +2 -2
  317. esphome/components/max6675/max6675.cpp +1 -1
  318. esphome/components/max6956/max6956.cpp +5 -3
  319. esphome/components/max7219/max7219.cpp +8 -6
  320. esphome/components/max7219digit/automation.h +52 -0
  321. esphome/components/max7219digit/display.py +93 -1
  322. esphome/components/max7219digit/max7219digit.cpp +16 -13
  323. esphome/components/max9611/max9611.cpp +9 -6
  324. esphome/components/mcp23008/mcp23008.cpp +1 -1
  325. esphome/components/mcp23016/mcp23016.cpp +1 -1
  326. esphome/components/mcp23017/mcp23017.cpp +1 -1
  327. esphome/components/mcp23s08/mcp23s08.cpp +1 -1
  328. esphome/components/mcp23s17/mcp23s17.cpp +1 -1
  329. esphome/components/mcp3008/mcp3008.cpp +1 -1
  330. esphome/components/mcp3008/sensor/mcp3008_sensor.cpp +5 -3
  331. esphome/components/mcp3204/mcp3204.cpp +1 -1
  332. esphome/components/mcp4461/mcp4461.cpp +2 -2
  333. esphome/components/mcp4725/mcp4725.cpp +2 -2
  334. esphome/components/mcp4728/mcp4728.cpp +2 -2
  335. esphome/components/mcp9600/mcp9600.cpp +1 -1
  336. esphome/components/mcp9808/mcp9808.cpp +4 -4
  337. esphome/components/mdns/mdns_component.cpp +8 -2
  338. esphome/components/mdns/mdns_component.h +3 -1
  339. esphome/components/mdns/mdns_esp32.cpp +2 -2
  340. esphome/components/media_player/__init__.py +1 -0
  341. esphome/components/micro_wake_word/micro_wake_word.cpp +1 -1
  342. esphome/components/micro_wake_word/streaming_model.cpp +10 -6
  343. esphome/components/micronova/micronova.h +2 -2
  344. esphome/components/mics_4514/mics_4514.cpp +2 -2
  345. esphome/components/midea/air_conditioner.cpp +7 -5
  346. esphome/components/midea_ir/midea_ir.cpp +1 -1
  347. esphome/components/mipi_spi/mipi_spi.cpp +24 -15
  348. esphome/components/mixer/speaker/mixer_speaker.cpp +8 -4
  349. esphome/components/mlx90393/sensor_mlx90393.cpp +2 -2
  350. esphome/components/mlx90614/mlx90614.cpp +4 -3
  351. esphome/components/mmc5603/mmc5603.cpp +2 -2
  352. esphome/components/mmc5983/mmc5983.cpp +1 -1
  353. esphome/components/modbus/modbus.cpp +7 -5
  354. esphome/components/modbus_controller/modbus_controller.cpp +6 -4
  355. esphome/components/modbus_controller/output/modbus_output.cpp +10 -6
  356. esphome/components/modbus_controller/switch/__init__.py +6 -2
  357. esphome/components/modbus_controller/switch/modbus_switch.cpp +4 -0
  358. esphome/components/modbus_controller/switch/modbus_switch.h +3 -0
  359. esphome/components/mpl3115a2/mpl3115a2.cpp +3 -2
  360. esphome/components/mpr121/mpr121.cpp +2 -2
  361. esphome/components/mpu6050/mpu6050.cpp +6 -6
  362. esphome/components/mpu6886/mpu6886.cpp +6 -6
  363. esphome/components/mqtt/mqtt_alarm_control_panel.cpp +7 -3
  364. esphome/components/mqtt/mqtt_backend_esp32.cpp +1 -1
  365. esphome/components/mqtt/mqtt_client.cpp +31 -24
  366. esphome/components/mqtt/mqtt_component.cpp +2 -2
  367. esphome/components/mqtt/mqtt_cover.cpp +8 -4
  368. esphome/components/mqtt/mqtt_fan.cpp +12 -6
  369. esphome/components/mqtt/mqtt_valve.cpp +4 -2
  370. esphome/components/ms5611/ms5611.cpp +2 -2
  371. esphome/components/ms8607/ms8607.cpp +2 -2
  372. esphome/components/msa3xx/msa3xx.cpp +16 -12
  373. esphome/components/my9231/my9231.cpp +7 -5
  374. esphome/components/nau7802/nau7802.cpp +6 -4
  375. esphome/components/neopixelbus/neopixelbus_light.h +2 -2
  376. esphome/components/network/ip_address.h +1 -1
  377. esphome/components/network/util.cpp +13 -0
  378. esphome/components/nextion/base_component.py +2 -0
  379. esphome/components/nextion/binary_sensor/nextion_binarysensor.cpp +2 -3
  380. esphome/components/nextion/display.py +34 -22
  381. esphome/components/nextion/nextion.cpp +182 -143
  382. esphome/components/nextion/nextion.h +36 -0
  383. esphome/components/nextion/nextion_commands.cpp +3 -3
  384. esphome/components/nextion/nextion_upload_arduino.cpp +58 -61
  385. esphome/components/nextion/nextion_upload_idf.cpp +69 -72
  386. esphome/components/nextion/sensor/nextion_sensor.cpp +4 -4
  387. esphome/components/nextion/switch/nextion_switch.cpp +2 -2
  388. esphome/components/nextion/text_sensor/nextion_textsensor.cpp +2 -2
  389. esphome/components/nfc/nci_message.h +1 -1
  390. esphome/components/nfc/ndef_record.h +1 -1
  391. esphome/components/nfc/ndef_record_text.h +1 -1
  392. esphome/components/nfc/ndef_record_uri.h +1 -1
  393. esphome/components/nfc/nfc.h +1 -1
  394. esphome/components/nfc/nfc_tag.h +1 -1
  395. esphome/components/noblex/noblex.cpp +1 -1
  396. esphome/components/npi19/npi19.cpp +5 -7
  397. esphome/components/number/__init__.py +11 -0
  398. esphome/components/online_image/__init__.py +13 -1
  399. esphome/components/online_image/online_image.cpp +26 -4
  400. esphome/components/online_image/online_image.h +21 -4
  401. esphome/components/opentherm/generate.py +3 -3
  402. esphome/components/opentherm/hub.cpp +11 -7
  403. esphome/components/opentherm/number/number.cpp +5 -3
  404. esphome/components/opentherm/opentherm.h +1 -1
  405. esphome/components/opentherm/schema.py +13 -13
  406. esphome/components/opentherm/validate.py +1 -1
  407. esphome/components/openthread/__init__.py +146 -0
  408. esphome/components/openthread/const.py +10 -0
  409. esphome/components/openthread/openthread.cpp +206 -0
  410. esphome/components/openthread/openthread.h +68 -0
  411. esphome/components/openthread/openthread_esp.cpp +164 -0
  412. esphome/components/openthread/tlv.py +58 -0
  413. esphome/components/openthread_info/__init__.py +0 -0
  414. esphome/components/openthread_info/openthread_info_text_sensor.cpp +24 -0
  415. esphome/components/openthread_info/openthread_info_text_sensor.h +218 -0
  416. esphome/components/openthread_info/text_sensor.py +105 -0
  417. esphome/components/output/float_output.cpp +1 -1
  418. esphome/components/output/switch/output_switch.cpp +1 -1
  419. esphome/components/packet_transport/packet_transport.cpp +6 -4
  420. esphome/components/pca6416a/pca6416a.cpp +2 -2
  421. esphome/components/pca9554/pca9554.cpp +6 -4
  422. esphome/components/pca9685/pca9685_output.cpp +12 -8
  423. esphome/components/pcd8544/pcd_8544.cpp +1 -1
  424. esphome/components/pcf85063/pcf85063.cpp +2 -2
  425. esphome/components/pcf8563/pcf8563.cpp +2 -2
  426. esphome/components/pcf8574/pcf8574.cpp +2 -2
  427. esphome/components/pid/pid_climate.cpp +8 -5
  428. esphome/components/pid/pid_climate.h +1 -1
  429. esphome/components/pid/sensor/pid_climate_sensor.cpp +1 -1
  430. esphome/components/pipsolar/output/pipsolar_output.cpp +1 -1
  431. esphome/components/pipsolar/pipsolar.cpp +3 -3
  432. esphome/components/pm1006/pm1006.cpp +3 -7
  433. esphome/components/pm1006/pm1006.h +4 -1
  434. esphome/components/pm2005/pm2005.cpp +12 -13
  435. esphome/components/pm2005/sensor.py +1 -1
  436. esphome/components/pmsa003i/pmsa003i.cpp +2 -2
  437. esphome/components/pmsx003/pmsx003.cpp +0 -4
  438. esphome/components/pmsx003/pmsx003.h +5 -2
  439. esphome/components/pmwcs3/pmwcs3.cpp +9 -13
  440. esphome/components/pmwcs3/pmwcs3.h +0 -1
  441. esphome/components/pn532/pn532.cpp +7 -7
  442. esphome/components/pn532/pn532.h +1 -1
  443. esphome/components/pn532_spi/pn532_spi.cpp +1 -1
  444. esphome/components/pn7150/pn7150.cpp +4 -4
  445. esphome/components/pn7160/pn7160.cpp +4 -4
  446. esphome/components/power_supply/power_supply.cpp +6 -4
  447. esphome/components/power_supply/power_supply.h +1 -1
  448. esphome/components/psram/__init__.py +59 -35
  449. esphome/components/pulse_counter/pulse_counter_sensor.cpp +7 -4
  450. esphome/components/pvvx_mithermometer/display/pvvx_display.cpp +8 -5
  451. esphome/components/pylontech/pylontech.cpp +2 -2
  452. esphome/components/pylontech/sensor/pylontech_sensor.cpp +4 -2
  453. esphome/components/pylontech/text_sensor/pylontech_text_sensor.cpp +4 -2
  454. esphome/components/pzemac/pzemac.cpp +4 -2
  455. esphome/components/pzemdc/pzemdc.cpp +4 -2
  456. esphome/components/qmc5883l/qmc5883l.cpp +2 -2
  457. esphome/components/qmp6988/qmp6988.cpp +2 -2
  458. esphome/components/qmp6988/qmp6988.h +1 -1
  459. esphome/components/qr_code/qr_code.cpp +5 -3
  460. esphome/components/qspi_dbi/qspi_dbi.cpp +1 -1
  461. esphome/components/qwiic_pir/qwiic_pir.cpp +26 -28
  462. esphome/components/rc522/rc522.cpp +5 -5
  463. esphome/components/rdm6300/rdm6300.cpp +1 -0
  464. esphome/components/remote_receiver/__init__.py +10 -2
  465. esphome/components/remote_receiver/remote_receiver_esp32.cpp +22 -12
  466. esphome/components/remote_receiver/remote_receiver_esp8266.cpp +10 -7
  467. esphome/components/remote_receiver/remote_receiver_libretiny.cpp +10 -7
  468. esphome/components/remote_transmitter/__init__.py +10 -2
  469. esphome/components/remote_transmitter/remote_transmitter_esp32.cpp +10 -6
  470. esphome/components/remote_transmitter/remote_transmitter_esp8266.cpp +5 -3
  471. esphome/components/remote_transmitter/remote_transmitter_libretiny.cpp +5 -3
  472. esphome/components/resistance/resistance_sensor.cpp +6 -3
  473. esphome/components/restart/button/restart_button.cpp +1 -1
  474. esphome/components/restart/switch/restart_switch.cpp +1 -1
  475. esphome/components/rotary_encoder/rotary_encoder.cpp +2 -2
  476. esphome/components/rp2040/__init__.py +7 -0
  477. esphome/components/rp2040/core.cpp +8 -1
  478. esphome/components/rp2040/preferences.cpp +3 -3
  479. esphome/components/rp2040_pio_led_strip/led_strip.cpp +11 -8
  480. esphome/components/rp2040_pio_led_strip/light.py +1 -1
  481. esphome/components/rp2040_pwm/rp2040_pwm.cpp +1 -1
  482. esphome/components/rpi_dpi_rgb/rpi_dpi_rgb.cpp +1 -1
  483. esphome/components/rtttl/rtttl.cpp +11 -9
  484. esphome/components/safe_mode/button/safe_mode_button.cpp +1 -1
  485. esphome/components/safe_mode/safe_mode.cpp +9 -8
  486. esphome/components/safe_mode/switch/safe_mode_switch.cpp +1 -1
  487. esphome/components/scd30/scd30.cpp +11 -8
  488. esphome/components/scd4x/scd4x.cpp +12 -8
  489. esphome/components/sdl/display.py +40 -0
  490. esphome/components/sdl/sdl_esphome.cpp +2 -2
  491. esphome/components/sdl/sdl_esphome.h +8 -0
  492. esphome/components/sdm_meter/sdm_meter.cpp +5 -2
  493. esphome/components/sdp3x/sdp3x.cpp +11 -11
  494. esphome/components/sds011/sds011.cpp +5 -6
  495. esphome/components/sds011/sds011.h +4 -1
  496. esphome/components/seeed_mr24hpc1/seeed_mr24hpc1.cpp +3 -2
  497. esphome/components/seeed_mr60bha2/seeed_mr60bha2.cpp +1 -0
  498. esphome/components/seeed_mr60fda2/seeed_mr60fda2.cpp +3 -2
  499. esphome/components/selec_meter/selec_meter.cpp +5 -2
  500. esphome/components/select/__init__.py +1 -0
  501. esphome/components/sen0321/sen0321.cpp +2 -2
  502. esphome/components/sen21231/sen21231.cpp +1 -1
  503. esphome/components/sen5x/sen5x.cpp +10 -7
  504. esphome/components/sensirion_common/i2c_sensirion.cpp +2 -1
  505. esphome/components/sensirion_common/i2c_sensirion.h +1 -0
  506. esphome/components/sensor/__init__.py +11 -1
  507. esphome/components/sensor/filter.h +1 -1
  508. esphome/components/sensor/sensor.h +9 -5
  509. esphome/components/servo/servo.cpp +12 -9
  510. esphome/components/servo/servo.h +1 -1
  511. esphome/components/sfa30/sfa30.cpp +1 -1
  512. esphome/components/sgp30/sgp30.cpp +10 -8
  513. esphome/components/sgp4x/sgp4x.cpp +49 -61
  514. esphome/components/sgp4x/sgp4x.h +0 -1
  515. esphome/components/shelly_dimmer/shelly_dimmer.cpp +11 -7
  516. esphome/components/sht3xd/sht3xd.cpp +1 -1
  517. esphome/components/sht4x/sht4x.cpp +2 -2
  518. esphome/components/shtcx/shtcx.cpp +13 -16
  519. esphome/components/shutdown/button/shutdown_button.cpp +1 -1
  520. esphome/components/shutdown/switch/shutdown_switch.cpp +1 -1
  521. esphome/components/sim800l/sim800l.cpp +2 -2
  522. esphome/components/slow_pwm/slow_pwm_output.cpp +4 -2
  523. esphome/components/sm16716/sm16716.cpp +1 -1
  524. esphome/components/sm2135/sm2135.cpp +1 -1
  525. esphome/components/sm2235/sm2235.cpp +5 -3
  526. esphome/components/sm2335/sm2335.cpp +5 -3
  527. esphome/components/sml/sml.cpp +1 -1
  528. esphome/components/sn74hc165/sn74hc165.cpp +1 -2
  529. esphome/components/sn74hc595/sn74hc595.cpp +1 -2
  530. esphome/components/sntp/sntp_component.cpp +1 -1
  531. esphome/components/socket/__init__.py +2 -0
  532. esphome/components/socket/bsd_sockets_impl.cpp +51 -7
  533. esphome/components/socket/lwip_raw_tcp_impl.cpp +5 -0
  534. esphome/components/socket/lwip_sockets_impl.cpp +51 -7
  535. esphome/components/socket/socket.cpp +31 -0
  536. esphome/components/socket/socket.h +27 -1
  537. esphome/components/sonoff_d1/sonoff_d1.cpp +7 -4
  538. esphome/components/sonoff_d1/sonoff_d1.h +2 -2
  539. esphome/components/sound_level/sound_level.cpp +4 -2
  540. esphome/components/speaker/media_player/__init__.py +3 -0
  541. esphome/components/speaker/media_player/speaker_media_player.cpp +1 -3
  542. esphome/components/speaker/media_player/speaker_media_player.h +6 -0
  543. esphome/components/spi/__init__.py +10 -2
  544. esphome/components/spi/spi.cpp +4 -4
  545. esphome/components/spi_device/spi_device.cpp +1 -2
  546. esphome/components/sprinkler/sprinkler.cpp +9 -6
  547. esphome/components/sps30/sps30.cpp +16 -15
  548. esphome/components/ssd1306_base/ssd1306_base.cpp +1 -1
  549. esphome/components/ssd1306_i2c/ssd1306_i2c.cpp +11 -8
  550. esphome/components/ssd1306_spi/ssd1306_spi.cpp +10 -7
  551. esphome/components/ssd1322_base/ssd1322_base.cpp +1 -1
  552. esphome/components/ssd1322_spi/ssd1322_spi.cpp +1 -1
  553. esphome/components/ssd1325_base/ssd1325_base.cpp +1 -1
  554. esphome/components/ssd1325_spi/ssd1325_spi.cpp +1 -1
  555. esphome/components/ssd1327_base/ssd1327_base.cpp +1 -1
  556. esphome/components/ssd1327_i2c/ssd1327_i2c.cpp +2 -2
  557. esphome/components/ssd1327_spi/ssd1327_spi.cpp +1 -1
  558. esphome/components/ssd1331_base/ssd1331_base.cpp +1 -1
  559. esphome/components/ssd1331_spi/ssd1331_spi.cpp +1 -1
  560. esphome/components/ssd1351_base/ssd1351_base.cpp +1 -1
  561. esphome/components/ssd1351_spi/ssd1351_spi.cpp +1 -1
  562. esphome/components/st7567_base/st7567_base.cpp +3 -3
  563. esphome/components/st7567_i2c/st7567_i2c.cpp +7 -5
  564. esphome/components/st7567_spi/st7567_spi.cpp +1 -1
  565. esphome/components/st7701s/st7701s.cpp +4 -2
  566. esphome/components/st7735/st7735.cpp +3 -3
  567. esphome/components/st7789v/st7789v.cpp +10 -7
  568. esphome/components/st7920/st7920.cpp +6 -4
  569. esphome/components/statsd/statsd.cpp +9 -5
  570. esphome/components/status_led/light/status_led_light.cpp +1 -1
  571. esphome/components/status_led/status_led.cpp +1 -1
  572. esphome/components/stepper/stepper.h +5 -3
  573. esphome/components/sts3x/sts3x.cpp +2 -2
  574. esphome/components/switch/__init__.py +1 -0
  575. esphome/components/switch/switch.cpp +18 -12
  576. esphome/components/switch/switch.h +1 -1
  577. esphome/components/sx1509/__init__.py +53 -20
  578. esphome/components/sx1509/sx1509.cpp +29 -5
  579. esphome/components/sx1509/sx1509.h +9 -1
  580. esphome/components/t6615/t6615.cpp +1 -0
  581. esphome/components/tc74/tc74.cpp +1 -1
  582. esphome/components/tca9548a/tca9548a.cpp +1 -1
  583. esphome/components/tca9555/tca9555.cpp +2 -2
  584. esphome/components/tcs34725/tcs34725.cpp +4 -4
  585. esphome/components/tee501/tee501.cpp +3 -2
  586. esphome/components/tem3200/tem3200.cpp +5 -6
  587. esphome/components/template/alarm_control_panel/__init__.py +6 -0
  588. esphome/components/template/alarm_control_panel/template_alarm_control_panel.cpp +38 -12
  589. esphome/components/template/alarm_control_panel/template_alarm_control_panel.h +3 -1
  590. esphome/components/template/cover/template_cover.cpp +1 -1
  591. esphome/components/template/select/template_select.cpp +6 -4
  592. esphome/components/template/text/template_text.cpp +2 -3
  593. esphome/components/template/valve/template_valve.cpp +5 -3
  594. esphome/components/text/__init__.py +10 -11
  595. esphome/components/text_sensor/__init__.py +1 -0
  596. esphome/components/thermostat/thermostat_climate.cpp +67 -43
  597. esphome/components/time/__init__.py +1 -2
  598. esphome/components/time_based/time_based_cover.cpp +4 -2
  599. esphome/components/tlc59208f/tlc59208f_output.cpp +8 -6
  600. esphome/components/tm1621/tm1621.cpp +3 -3
  601. esphome/components/tm1637/tm1637.cpp +9 -7
  602. esphome/components/tm1638/tm1638.cpp +7 -5
  603. esphome/components/tm1651/tm1651.cpp +2 -2
  604. esphome/components/tmp102/tmp102.cpp +1 -3
  605. esphome/components/tmp102/tmp102.h +0 -3
  606. esphome/components/tmp1075/tmp1075.cpp +12 -9
  607. esphome/components/tmp117/tmp117.cpp +2 -2
  608. esphome/components/tof10120/tof10120_sensor.cpp +2 -2
  609. esphome/components/tormatic/tormatic_cover.cpp +4 -2
  610. esphome/components/tsl2561/tsl2561.cpp +7 -5
  611. esphome/components/tsl2591/tsl2591.cpp +25 -27
  612. esphome/components/tt21100/touchscreen/tt21100.cpp +1 -1
  613. esphome/components/ttp229_bsf/ttp229_bsf.cpp +1 -1
  614. esphome/components/ttp229_lsf/ttp229_lsf.cpp +2 -2
  615. esphome/components/tuya/select/tuya_select.cpp +5 -3
  616. esphome/components/tx20/tx20.cpp +3 -3
  617. esphome/components/uart/__init__.py +4 -5
  618. esphome/components/uart/button/uart_button.cpp +1 -1
  619. esphome/components/uart/switch/uart_switch.cpp +2 -2
  620. esphome/components/uart/uart.cpp +2 -2
  621. esphome/components/uart/uart_component_esp32_arduino.cpp +8 -6
  622. esphome/components/uart/uart_component_esp8266.cpp +9 -7
  623. esphome/components/uart/uart_component_esp_idf.cpp +9 -7
  624. esphome/components/uart/uart_component_host.cpp +11 -8
  625. esphome/components/uart/uart_component_libretiny.cpp +8 -6
  626. esphome/components/uart/uart_component_rp2040.cpp +8 -6
  627. esphome/components/udp/udp_component.cpp +9 -5
  628. esphome/components/ufire_ec/ufire_ec.cpp +5 -3
  629. esphome/components/ufire_ise/ufire_ise.cpp +1 -1
  630. esphome/components/ultrasonic/ultrasonic_sensor.cpp +5 -3
  631. esphome/components/update/__init__.py +1 -0
  632. esphome/components/uponor_smatrix/climate/uponor_smatrix_climate.cpp +1 -1
  633. esphome/components/uponor_smatrix/sensor/uponor_smatrix_sensor.cpp +4 -2
  634. esphome/components/uponor_smatrix/uponor_smatrix.cpp +2 -1
  635. esphome/components/usb_host/__init__.py +64 -0
  636. esphome/components/usb_host/usb_host.h +116 -0
  637. esphome/components/usb_host/usb_host_client.cpp +394 -0
  638. esphome/components/usb_host/usb_host_component.cpp +35 -0
  639. esphome/components/usb_uart/__init__.py +134 -0
  640. esphome/components/usb_uart/ch34x.cpp +80 -0
  641. esphome/components/usb_uart/cp210x.cpp +126 -0
  642. esphome/components/usb_uart/usb_uart.cpp +328 -0
  643. esphome/components/usb_uart/usb_uart.h +151 -0
  644. esphome/components/valve/__init__.py +1 -0
  645. esphome/components/veml3235/veml3235.cpp +13 -9
  646. esphome/components/veml7700/veml7700.cpp +10 -6
  647. esphome/components/voice_assistant/voice_assistant.cpp +7 -7
  648. esphome/components/wake_on_lan/wake_on_lan.cpp +1 -1
  649. esphome/components/waveshare_epaper/waveshare_epaper.cpp +1 -1
  650. esphome/components/web_server/server_index_v2.h +632 -630
  651. esphome/components/web_server/server_index_v3.h +411 -409
  652. esphome/components/web_server/web_server.cpp +5 -3
  653. esphome/components/web_server_base/web_server_base.cpp +1 -1
  654. esphome/components/web_server_idf/utils.cpp +1 -1
  655. esphome/components/web_server_idf/web_server_idf.cpp +1 -1
  656. esphome/components/weikai/__init__.py +2 -0
  657. esphome/components/weikai/weikai.cpp +23 -21
  658. esphome/components/weikai_i2c/weikai_i2c.cpp +14 -9
  659. esphome/components/weikai_spi/weikai_spi.cpp +11 -6
  660. esphome/components/wiegand/wiegand.cpp +1 -1
  661. esphome/components/wifi/wifi_component.cpp +50 -37
  662. esphome/components/wifi/wifi_component.h +7 -4
  663. esphome/components/wifi/wifi_component_esp32_arduino.cpp +2 -2
  664. esphome/components/wifi/wifi_component_esp8266.cpp +3 -3
  665. esphome/components/wifi/wifi_component_libretiny.cpp +4 -4
  666. esphome/components/wireguard/wireguard.cpp +21 -21
  667. esphome/components/wl_134/text_sensor.py +1 -2
  668. esphome/components/wled/wled_light_effect.cpp +1 -1
  669. esphome/components/x9c/x9c.cpp +5 -3
  670. esphome/components/xgzp68xx/xgzp68xx.cpp +8 -6
  671. esphome/components/xiaomi_cgd1/xiaomi_cgd1.cpp +4 -2
  672. esphome/components/xiaomi_cgdk2/xiaomi_cgdk2.cpp +4 -2
  673. esphome/components/xiaomi_cgg1/xiaomi_cgg1.cpp +4 -2
  674. esphome/components/xiaomi_hhccjcy10/xiaomi_hhccjcy10.cpp +1 -1
  675. esphome/components/xiaomi_lywsd02mmc/xiaomi_lywsd02mmc.cpp +4 -2
  676. esphome/components/xiaomi_lywsd03mmc/xiaomi_lywsd03mmc.cpp +4 -2
  677. esphome/components/xiaomi_mhoc401/xiaomi_mhoc401.cpp +4 -2
  678. esphome/components/xl9535/xl9535.cpp +2 -2
  679. esphome/components/xpt2046/touchscreen/xpt2046.cpp +12 -11
  680. esphome/components/xpt2046/touchscreen/xpt2046.h +2 -2
  681. esphome/config.py +3 -2
  682. esphome/config_validation.py +46 -17
  683. esphome/const.py +10 -1
  684. esphome/core/__init__.py +37 -18
  685. esphome/core/application.cpp +188 -5
  686. esphome/core/application.h +110 -0
  687. esphome/core/component.h +13 -0
  688. esphome/core/config.py +12 -0
  689. esphome/core/defines.h +10 -2
  690. esphome/core/helpers.cpp +1 -1
  691. esphome/core/helpers.h +4 -4
  692. esphome/core/log.h +2 -0
  693. esphome/core/log_const_en.h +4 -0
  694. esphome/core/scheduler.cpp +2 -2
  695. esphome/coroutine.py +3 -4
  696. esphome/cpp_generator.py +32 -32
  697. esphome/dashboard/core.py +2 -2
  698. esphome/dashboard/web_server.py +2 -2
  699. esphome/git.py +4 -4
  700. esphome/helpers.py +5 -6
  701. esphome/loader.py +8 -7
  702. esphome/log.py +7 -1
  703. esphome/platformio_api.py +2 -3
  704. esphome/storage_json.py +13 -5
  705. esphome/types.py +12 -13
  706. esphome/util.py +1 -2
  707. esphome/writer.py +5 -3
  708. esphome/yaml_util.py +6 -1
  709. esphome/zeroconf.py +1 -1
  710. {esphome-2025.5.2.dist-info → esphome-2025.6.0b1.dist-info}/METADATA +12 -11
  711. {esphome-2025.5.2.dist-info → esphome-2025.6.0b1.dist-info}/RECORD +715 -662
  712. {esphome-2025.5.2.dist-info → esphome-2025.6.0b1.dist-info}/WHEEL +1 -1
  713. {esphome-2025.5.2.dist-info → esphome-2025.6.0b1.dist-info}/entry_points.txt +0 -0
  714. {esphome-2025.5.2.dist-info → esphome-2025.6.0b1.dist-info}/licenses/LICENSE +0 -0
  715. {esphome-2025.5.2.dist-info → esphome-2025.6.0b1.dist-info}/top_level.txt +0 -0
@@ -7,9 +7,11 @@ namespace esphome {
7
7
  namespace stepper {
8
8
 
9
9
  #define LOG_STEPPER(this) \
10
- ESP_LOGCONFIG(TAG, " Acceleration: %.0f steps/s^2", this->acceleration_); \
11
- ESP_LOGCONFIG(TAG, " Deceleration: %.0f steps/s^2", this->deceleration_); \
12
- ESP_LOGCONFIG(TAG, " Max Speed: %.0f steps/s", this->max_speed_);
10
+ ESP_LOGCONFIG(TAG, \
11
+ " Acceleration: %.0f steps/s^2\n" \
12
+ " Deceleration: %.0f steps/s^2\n" \
13
+ " Max Speed: %.0f steps/s", \
14
+ this->acceleration_, this->deceleration_, this->max_speed_);
13
15
 
14
16
  class Stepper {
15
17
  public:
@@ -18,7 +18,7 @@ static const uint16_t STS3X_COMMAND_HEATER_DISABLE = 0x3066;
18
18
  static const uint16_t STS3X_COMMAND_FETCH_DATA = 0xE000;
19
19
 
20
20
  void STS3XComponent::setup() {
21
- ESP_LOGCONFIG(TAG, "Setting up STS3x...");
21
+ ESP_LOGCONFIG(TAG, "Running setup");
22
22
  if (!this->write_command(STS3X_COMMAND_READ_SERIAL_NUMBER)) {
23
23
  this->mark_failed();
24
24
  return;
@@ -36,7 +36,7 @@ void STS3XComponent::dump_config() {
36
36
  ESP_LOGCONFIG(TAG, "STS3x:");
37
37
  LOG_I2C_DEVICE(this);
38
38
  if (this->is_failed()) {
39
- ESP_LOGE(TAG, "Communication with ST3x failed!");
39
+ ESP_LOGE(TAG, ESP_LOG_MSG_COMM_FAIL);
40
40
  }
41
41
  LOG_UPDATE_INTERVAL(this);
42
42
 
@@ -159,6 +159,7 @@ async def register_switch(var, config):
159
159
  if not CORE.has_id(config[CONF_ID]):
160
160
  var = cg.Pvariable(config[CONF_ID], var)
161
161
  cg.add(cg.App.register_switch(var))
162
+ CORE.register_platform_component("switch", var)
162
163
  await setup_switch_core_(var, config)
163
164
 
164
165
 
@@ -65,7 +65,24 @@ bool Switch::is_inverted() const { return this->inverted_; }
65
65
 
66
66
  void log_switch(const char *tag, const char *prefix, const char *type, Switch *obj) {
67
67
  if (obj != nullptr) {
68
- ESP_LOGCONFIG(tag, "%s%s '%s'", prefix, type, obj->get_name().c_str());
68
+ // Prepare restore mode string
69
+ const LogString *onoff = LOG_STR(""), *inverted = onoff, *restore;
70
+ if (obj->restore_mode & RESTORE_MODE_DISABLED_MASK) {
71
+ restore = LOG_STR("disabled");
72
+ } else {
73
+ onoff = obj->restore_mode & RESTORE_MODE_ON_MASK ? LOG_STR("ON") : LOG_STR("OFF");
74
+ inverted = obj->restore_mode & RESTORE_MODE_INVERTED_MASK ? LOG_STR("inverted ") : LOG_STR("");
75
+ restore = obj->restore_mode & RESTORE_MODE_PERSISTENT_MASK ? LOG_STR("restore defaults to") : LOG_STR("always");
76
+ }
77
+
78
+ // Build the base message with mandatory fields
79
+ ESP_LOGCONFIG(tag,
80
+ "%s%s '%s'\n"
81
+ "%s Restore Mode: %s%s %s",
82
+ prefix, type, obj->get_name().c_str(), prefix, LOG_STR_ARG(inverted), LOG_STR_ARG(restore),
83
+ LOG_STR_ARG(onoff));
84
+
85
+ // Add optional fields separately
69
86
  if (!obj->get_icon().empty()) {
70
87
  ESP_LOGCONFIG(tag, "%s Icon: '%s'", prefix, obj->get_icon().c_str());
71
88
  }
@@ -78,17 +95,6 @@ void log_switch(const char *tag, const char *prefix, const char *type, Switch *o
78
95
  if (!obj->get_device_class().empty()) {
79
96
  ESP_LOGCONFIG(tag, "%s Device Class: '%s'", prefix, obj->get_device_class().c_str());
80
97
  }
81
- const LogString *onoff = LOG_STR(""), *inverted = onoff, *restore;
82
- if (obj->restore_mode & RESTORE_MODE_DISABLED_MASK) {
83
- restore = LOG_STR("disabled");
84
- } else {
85
- onoff = obj->restore_mode & RESTORE_MODE_ON_MASK ? LOG_STR("ON") : LOG_STR("OFF");
86
- inverted = obj->restore_mode & RESTORE_MODE_INVERTED_MASK ? LOG_STR("inverted ") : LOG_STR("");
87
- restore = obj->restore_mode & RESTORE_MODE_PERSISTENT_MASK ? LOG_STR("restore defaults to") : LOG_STR("always");
88
- }
89
-
90
- ESP_LOGCONFIG(tag, "%s Restore Mode: %s%s %s", prefix, LOG_STR_ARG(inverted), LOG_STR_ARG(restore),
91
- LOG_STR_ARG(onoff));
92
98
  }
93
99
  }
94
100
 
@@ -2,8 +2,8 @@
2
2
 
3
3
  #include "esphome/core/component.h"
4
4
  #include "esphome/core/entity_base.h"
5
- #include "esphome/core/preferences.h"
6
5
  #include "esphome/core/helpers.h"
6
+ #include "esphome/core/preferences.h"
7
7
 
8
8
  namespace esphome {
9
9
  namespace switch_ {
@@ -1,6 +1,6 @@
1
- from esphome import pins
1
+ from esphome import automation, pins
2
2
  import esphome.codegen as cg
3
- from esphome.components import i2c
3
+ from esphome.components import i2c, key_provider
4
4
  import esphome.config_validation as cv
5
5
  from esphome.const import (
6
6
  CONF_ID,
@@ -8,13 +8,16 @@ from esphome.const import (
8
8
  CONF_INVERTED,
9
9
  CONF_MODE,
10
10
  CONF_NUMBER,
11
+ CONF_ON_KEY,
11
12
  CONF_OPEN_DRAIN,
12
13
  CONF_OUTPUT,
13
14
  CONF_PULLDOWN,
14
15
  CONF_PULLUP,
16
+ CONF_TRIGGER_ID,
15
17
  )
16
18
 
17
19
  CONF_KEYPAD = "keypad"
20
+ CONF_KEYS = "keys"
18
21
  CONF_KEY_ROWS = "key_rows"
19
22
  CONF_KEY_COLUMNS = "key_columns"
20
23
  CONF_SLEEP_TIME = "sleep_time"
@@ -22,22 +25,47 @@ CONF_SCAN_TIME = "scan_time"
22
25
  CONF_DEBOUNCE_TIME = "debounce_time"
23
26
  CONF_SX1509_ID = "sx1509_id"
24
27
 
28
+ AUTO_LOAD = ["key_provider"]
25
29
  DEPENDENCIES = ["i2c"]
26
30
  MULTI_CONF = True
27
31
 
28
32
  sx1509_ns = cg.esphome_ns.namespace("sx1509")
29
33
 
30
- SX1509Component = sx1509_ns.class_("SX1509Component", cg.Component, i2c.I2CDevice)
34
+ SX1509Component = sx1509_ns.class_(
35
+ "SX1509Component", cg.Component, i2c.I2CDevice, key_provider.KeyProvider
36
+ )
31
37
  SX1509GPIOPin = sx1509_ns.class_("SX1509GPIOPin", cg.GPIOPin)
38
+ SX1509KeyTrigger = sx1509_ns.class_(
39
+ "SX1509KeyTrigger", automation.Trigger.template(cg.uint8)
40
+ )
32
41
 
33
- KEYPAD_SCHEMA = cv.Schema(
34
- {
35
- cv.Required(CONF_KEY_ROWS): cv.int_range(min=1, max=8),
36
- cv.Required(CONF_KEY_COLUMNS): cv.int_range(min=1, max=8),
37
- cv.Optional(CONF_SLEEP_TIME): cv.int_range(min=128, max=8192),
38
- cv.Optional(CONF_SCAN_TIME): cv.int_range(min=1, max=128),
39
- cv.Optional(CONF_DEBOUNCE_TIME): cv.int_range(min=1, max=64),
40
- }
42
+
43
+ def check_keys(config):
44
+ if CONF_KEYS in config:
45
+ if len(config[CONF_KEYS]) != config[CONF_KEY_ROWS] * config[CONF_KEY_COLUMNS]:
46
+ raise cv.Invalid(
47
+ "The number of key codes must equal the number of rows * columns"
48
+ )
49
+ return config
50
+
51
+
52
+ KEYPAD_SCHEMA = cv.All(
53
+ cv.Schema(
54
+ {
55
+ cv.Required(CONF_KEY_ROWS): cv.int_range(min=2, max=8),
56
+ cv.Required(CONF_KEY_COLUMNS): cv.int_range(min=1, max=8),
57
+ cv.Optional(CONF_SLEEP_TIME): cv.int_range(min=128, max=8192),
58
+ cv.Optional(CONF_SCAN_TIME): cv.int_range(min=1, max=128),
59
+ cv.Optional(CONF_DEBOUNCE_TIME): cv.int_range(min=1, max=64),
60
+ cv.Optional(CONF_KEYS): cv.string,
61
+ cv.Optional(CONF_ON_KEY): automation.validate_automation(
62
+ {
63
+ cv.GenerateID(CONF_TRIGGER_ID): cv.declare_id(SX1509KeyTrigger),
64
+ }
65
+ ),
66
+ }
67
+ ),
68
+ check_keys,
41
69
  )
42
70
 
43
71
  CONFIG_SCHEMA = (
@@ -56,17 +84,22 @@ async def to_code(config):
56
84
  var = cg.new_Pvariable(config[CONF_ID])
57
85
  await cg.register_component(var, config)
58
86
  await i2c.register_i2c_device(var, config)
59
- if CONF_KEYPAD in config:
60
- keypad = config[CONF_KEYPAD]
61
- cg.add(var.set_rows_cols(keypad[CONF_KEY_ROWS], keypad[CONF_KEY_COLUMNS]))
87
+ if conf := config.get(CONF_KEYPAD):
88
+ cg.add(var.set_rows_cols(conf[CONF_KEY_ROWS], conf[CONF_KEY_COLUMNS]))
62
89
  if (
63
- CONF_SLEEP_TIME in keypad
64
- and CONF_SCAN_TIME in keypad
65
- and CONF_DEBOUNCE_TIME in keypad
90
+ CONF_SLEEP_TIME in conf
91
+ and CONF_SCAN_TIME in conf
92
+ and CONF_DEBOUNCE_TIME in conf
66
93
  ):
67
- cg.add(var.set_sleep_time(keypad[CONF_SLEEP_TIME]))
68
- cg.add(var.set_scan_time(keypad[CONF_SCAN_TIME]))
69
- cg.add(var.set_debounce_time(keypad[CONF_DEBOUNCE_TIME]))
94
+ cg.add(var.set_sleep_time(conf[CONF_SLEEP_TIME]))
95
+ cg.add(var.set_scan_time(conf[CONF_SCAN_TIME]))
96
+ cg.add(var.set_debounce_time(conf[CONF_DEBOUNCE_TIME]))
97
+ if keys := conf.get(CONF_KEYS):
98
+ cg.add(var.set_keys(keys))
99
+ for tconf in conf.get(CONF_ON_KEY, []):
100
+ trigger = cg.new_Pvariable(tconf[CONF_TRIGGER_ID])
101
+ cg.add(var.register_key_trigger(trigger))
102
+ await automation.build_automation(trigger, [(cg.uint8, "x")], tconf)
70
103
 
71
104
 
72
105
  def validate_mode(value):
@@ -8,9 +8,9 @@ namespace sx1509 {
8
8
  static const char *const TAG = "sx1509";
9
9
 
10
10
  void SX1509Component::setup() {
11
- ESP_LOGCONFIG(TAG, "Setting up SX1509Component...");
11
+ ESP_LOGCONFIG(TAG, "Running setup");
12
12
 
13
- ESP_LOGV(TAG, " Resetting devices...");
13
+ ESP_LOGV(TAG, " Resetting devices");
14
14
  if (!this->write_byte(REG_RESET, 0x12)) {
15
15
  this->mark_failed();
16
16
  return;
@@ -48,6 +48,30 @@ void SX1509Component::loop() {
48
48
  uint16_t key_data = this->read_key_data();
49
49
  for (auto *binary_sensor : this->keypad_binary_sensors_)
50
50
  binary_sensor->process(key_data);
51
+ if (this->keys_.empty())
52
+ return;
53
+ if (key_data == 0) {
54
+ this->last_key_ = 0;
55
+ return;
56
+ }
57
+ int row, col;
58
+ for (row = 0; row < 7; row++) {
59
+ if (key_data & (1 << row))
60
+ break;
61
+ }
62
+ for (col = 8; col < 15; col++) {
63
+ if (key_data & (1 << col))
64
+ break;
65
+ }
66
+ col -= 8;
67
+ uint8_t key = this->keys_[row * this->cols_ + col];
68
+ if (key == this->last_key_)
69
+ return;
70
+ this->last_key_ = key;
71
+ ESP_LOGV(TAG, "row %d, col %d, key '%c'", row, col, key);
72
+ for (auto &trigger : this->key_triggers_)
73
+ trigger->trigger(key);
74
+ this->send_key_(key);
51
75
  }
52
76
  }
53
77
 
@@ -230,9 +254,9 @@ void SX1509Component::setup_keypad_() {
230
254
  scan_time_bits &= 0b111; // Scan time is bits 2:0
231
255
  temp_byte = sleep_time_ | scan_time_bits;
232
256
  this->write_byte(REG_KEY_CONFIG_1, temp_byte);
233
- rows_ = (rows_ - 1) & 0b111; // 0 = off, 0b001 = 2 rows, 0b111 = 8 rows, etc.
234
- cols_ = (cols_ - 1) & 0b111; // 0b000 = 1 column, ob111 = 8 columns, etc.
235
- this->write_byte(REG_KEY_CONFIG_2, (rows_ << 3) | cols_);
257
+ temp_byte = ((this->rows_ - 1) & 0b111) << 3; // 0 = off, 0b001 = 2 rows, 0b111 = 8 rows, etc.
258
+ temp_byte |= (this->cols_ - 1) & 0b111; // 0b000 = 1 column, ob111 = 8 columns, etc.
259
+ this->write_byte(REG_KEY_CONFIG_2, temp_byte);
236
260
  }
237
261
 
238
262
  uint16_t SX1509Component::read_key_data() {
@@ -1,6 +1,7 @@
1
1
  #pragma once
2
2
 
3
3
  #include "esphome/components/i2c/i2c.h"
4
+ #include "esphome/components/key_provider/key_provider.h"
4
5
  #include "esphome/core/component.h"
5
6
  #include "esphome/core/hal.h"
6
7
  #include "sx1509_gpio_pin.h"
@@ -27,7 +28,9 @@ class SX1509Processor {
27
28
  virtual void process(uint16_t data){};
28
29
  };
29
30
 
30
- class SX1509Component : public Component, public i2c::I2CDevice {
31
+ class SX1509KeyTrigger : public Trigger<uint8_t> {};
32
+
33
+ class SX1509Component : public Component, public i2c::I2CDevice, public key_provider::KeyProvider {
31
34
  public:
32
35
  SX1509Component() = default;
33
36
 
@@ -47,12 +50,14 @@ class SX1509Component : public Component, public i2c::I2CDevice {
47
50
  this->cols_ = cols;
48
51
  this->has_keypad_ = true;
49
52
  };
53
+ void set_keys(std::string keys) { this->keys_ = std::move(keys); };
50
54
  void set_sleep_time(uint16_t sleep_time) { this->sleep_time_ = sleep_time; };
51
55
  void set_scan_time(uint8_t scan_time) { this->scan_time_ = scan_time; };
52
56
  void set_debounce_time(uint8_t debounce_time = 1) { this->debounce_time_ = debounce_time; };
53
57
  void register_keypad_binary_sensor(SX1509Processor *binary_sensor) {
54
58
  this->keypad_binary_sensors_.push_back(binary_sensor);
55
59
  }
60
+ void register_key_trigger(SX1509KeyTrigger *trig) { this->key_triggers_.push_back(trig); };
56
61
  void setup_led_driver(uint8_t pin);
57
62
 
58
63
  protected:
@@ -65,10 +70,13 @@ class SX1509Component : public Component, public i2c::I2CDevice {
65
70
  bool has_keypad_ = false;
66
71
  uint8_t rows_ = 0;
67
72
  uint8_t cols_ = 0;
73
+ std::string keys_;
68
74
  uint16_t sleep_time_ = 128;
69
75
  uint8_t scan_time_ = 1;
70
76
  uint8_t debounce_time_ = 1;
77
+ uint8_t last_key_ = 0;
71
78
  std::vector<SX1509Processor *> keypad_binary_sensors_;
79
+ std::vector<SX1509KeyTrigger *> key_triggers_;
72
80
 
73
81
  uint32_t last_loop_timestamp_ = 0;
74
82
  const uint32_t min_loop_period_ = 15; // ms
@@ -1,4 +1,5 @@
1
1
  #include "t6615.h"
2
+ #include "esphome/core/helpers.h"
2
3
  #include "esphome/core/log.h"
3
4
 
4
5
  namespace esphome {
@@ -15,7 +15,7 @@ static const uint8_t TC74_DATA_READY_MASK = 0x40;
15
15
  // It is possible the "Data Ready" bit will not be set if the TC74 has not been powered on for at least 250ms, so it not
16
16
  // being set does not constitute a failure.
17
17
  void TC74Component::setup() {
18
- ESP_LOGCONFIG(TAG, "Setting up TC74...");
18
+ ESP_LOGCONFIG(TAG, "Running setup");
19
19
  uint8_t config_reg;
20
20
  if (this->read_register(TC74_REGISTER_CONFIGURATION, &config_reg, 1) != i2c::ERROR_OK) {
21
21
  this->mark_failed();
@@ -24,7 +24,7 @@ i2c::ErrorCode TCA9548AChannel::writev(uint8_t address, i2c::WriteBuffer *buffer
24
24
  }
25
25
 
26
26
  void TCA9548AComponent::setup() {
27
- ESP_LOGCONFIG(TAG, "Setting up TCA9548A...");
27
+ ESP_LOGCONFIG(TAG, "Running setup");
28
28
  uint8_t status = 0;
29
29
  if (this->read(&status, 1) != i2c::ERROR_OK) {
30
30
  ESP_LOGE(TAG, "TCA9548A failed");
@@ -16,7 +16,7 @@ namespace tca9555 {
16
16
  static const char *const TAG = "tca9555";
17
17
 
18
18
  void TCA9555Component::setup() {
19
- ESP_LOGCONFIG(TAG, "Setting up TCA9555...");
19
+ ESP_LOGCONFIG(TAG, "Running setup");
20
20
  if (!this->read_gpio_modes_()) {
21
21
  this->mark_failed();
22
22
  return;
@@ -30,7 +30,7 @@ void TCA9555Component::dump_config() {
30
30
  ESP_LOGCONFIG(TAG, "TCA9555:");
31
31
  LOG_I2C_DEVICE(this)
32
32
  if (this->is_failed()) {
33
- ESP_LOGE(TAG, "Communication with TCA9555 failed!");
33
+ ESP_LOGE(TAG, ESP_LOG_MSG_COMM_FAIL);
34
34
  }
35
35
  }
36
36
  void TCA9555Component::pin_mode(uint8_t pin, gpio::Flags flags) {
@@ -1,8 +1,8 @@
1
1
  #include "tcs34725.h"
2
- #include "esphome/core/log.h"
3
2
  #include "esphome/core/hal.h"
4
- #include <algorithm>
5
3
  #include "esphome/core/helpers.h"
4
+ #include "esphome/core/log.h"
5
+ #include <algorithm>
6
6
 
7
7
  namespace esphome {
8
8
  namespace tcs34725 {
@@ -18,7 +18,7 @@ static const uint8_t TCS34725_REGISTER_ENABLE = TCS34725_COMMAND_BIT | 0x00;
18
18
  static const uint8_t TCS34725_REGISTER_CRGBDATAL = TCS34725_COMMAND_BIT | 0x14;
19
19
 
20
20
  void TCS34725Component::setup() {
21
- ESP_LOGCONFIG(TAG, "Setting up TCS34725...");
21
+ ESP_LOGCONFIG(TAG, "Running setup");
22
22
  uint8_t id;
23
23
  if (this->read_register(TCS34725_REGISTER_ID, &id, 1) != i2c::ERROR_OK) {
24
24
  this->mark_failed();
@@ -46,7 +46,7 @@ void TCS34725Component::dump_config() {
46
46
  ESP_LOGCONFIG(TAG, "TCS34725:");
47
47
  LOG_I2C_DEVICE(this);
48
48
  if (this->is_failed()) {
49
- ESP_LOGE(TAG, "Communication with TCS34725 failed!");
49
+ ESP_LOGE(TAG, ESP_LOG_MSG_COMM_FAIL);
50
50
  }
51
51
  LOG_UPDATE_INTERVAL(this);
52
52
 
@@ -1,4 +1,5 @@
1
1
  #include "tee501.h"
2
+ #include "esphome/core/helpers.h"
2
3
  #include "esphome/core/log.h"
3
4
 
4
5
  namespace esphome {
@@ -7,7 +8,7 @@ namespace tee501 {
7
8
  static const char *const TAG = "tee501";
8
9
 
9
10
  void TEE501Component::setup() {
10
- ESP_LOGCONFIG(TAG, "Setting up TEE501...");
11
+ ESP_LOGCONFIG(TAG, "Running setup");
11
12
  uint8_t address[] = {0x70, 0x29};
12
13
  this->write(address, 2, false);
13
14
  uint8_t identification[9];
@@ -25,7 +26,7 @@ void TEE501Component::dump_config() {
25
26
  LOG_I2C_DEVICE(this);
26
27
  switch (this->error_code_) {
27
28
  case COMMUNICATION_FAILED:
28
- ESP_LOGE(TAG, "Communication with TEE501 failed!");
29
+ ESP_LOGE(TAG, ESP_LOG_MSG_COMM_FAIL);
29
30
  break;
30
31
  case CRC_CHECK_FAILED:
31
32
  ESP_LOGE(TAG, "The crc check failed");
@@ -1,7 +1,7 @@
1
1
  #include "tem3200.h"
2
- #include "esphome/core/log.h"
3
- #include "esphome/core/helpers.h"
4
2
  #include "esphome/core/hal.h"
3
+ #include "esphome/core/helpers.h"
4
+ #include "esphome/core/log.h"
5
5
 
6
6
  namespace esphome {
7
7
  namespace tem3200 {
@@ -16,7 +16,7 @@ enum ErrorCode {
16
16
  };
17
17
 
18
18
  void TEM3200Component::setup() {
19
- ESP_LOGCONFIG(TAG, "Setting up TEM3200...");
19
+ ESP_LOGCONFIG(TAG, "Running setup");
20
20
 
21
21
  uint8_t status(NONE);
22
22
  uint16_t raw_temperature(0);
@@ -24,7 +24,7 @@ void TEM3200Component::setup() {
24
24
 
25
25
  i2c::ErrorCode err = this->read_(status, raw_temperature, raw_pressure);
26
26
  if (err != i2c::ERROR_OK) {
27
- ESP_LOGCONFIG(TAG, " I2C Communication Failed...");
27
+ ESP_LOGCONFIG(TAG, ESP_LOG_MSG_COMM_FAIL);
28
28
  this->mark_failed();
29
29
  return;
30
30
  }
@@ -43,7 +43,6 @@ void TEM3200Component::setup() {
43
43
  this->status_set_warning();
44
44
  break;
45
45
  }
46
- ESP_LOGCONFIG(TAG, " Success...");
47
46
  }
48
47
 
49
48
  void TEM3200Component::dump_config() {
@@ -115,7 +114,7 @@ void TEM3200Component::update() {
115
114
  i2c::ErrorCode err = this->read_(status, raw_temperature, raw_pressure);
116
115
 
117
116
  if (err != i2c::ERROR_OK) {
118
- ESP_LOGW(TAG, "I2C Communication Failed");
117
+ ESP_LOGW(TAG, ESP_LOG_MSG_COMM_FAIL);
119
118
  this->status_set_warning();
120
119
  return;
121
120
  }
@@ -10,6 +10,7 @@ CODEOWNERS = ["@grahambrown11", "@hwstar"]
10
10
  CONF_CODES = "codes"
11
11
  CONF_BYPASS_ARMED_HOME = "bypass_armed_home"
12
12
  CONF_BYPASS_ARMED_NIGHT = "bypass_armed_night"
13
+ CONF_BYPASS_AUTO = "bypass_auto"
13
14
  CONF_CHIME = "chime"
14
15
  CONF_TRIGGER_MODE = "trigger_mode"
15
16
  CONF_REQUIRES_CODE_TO_ARM = "requires_code_to_arm"
@@ -23,6 +24,7 @@ CONF_TRIGGER_TIME = "trigger_time"
23
24
  FLAG_NORMAL = "normal"
24
25
  FLAG_BYPASS_ARMED_HOME = "bypass_armed_home"
25
26
  FLAG_BYPASS_ARMED_NIGHT = "bypass_armed_night"
27
+ FLAG_BYPASS_AUTO = "bypass_auto"
26
28
  FLAG_CHIME = "chime"
27
29
 
28
30
  BinarySensorFlags = {
@@ -30,6 +32,7 @@ BinarySensorFlags = {
30
32
  FLAG_BYPASS_ARMED_HOME: 1 << 1,
31
33
  FLAG_BYPASS_ARMED_NIGHT: 1 << 2,
32
34
  FLAG_CHIME: 1 << 3,
35
+ FLAG_BYPASS_AUTO: 1 << 4,
33
36
  }
34
37
 
35
38
 
@@ -68,6 +71,7 @@ TEMPLATE_ALARM_CONTROL_PANEL_BINARY_SENSOR_SCHEMA = cv.maybe_simple_value(
68
71
  cv.Required(CONF_INPUT): cv.use_id(binary_sensor.BinarySensor),
69
72
  cv.Optional(CONF_BYPASS_ARMED_HOME, default=False): cv.boolean,
70
73
  cv.Optional(CONF_BYPASS_ARMED_NIGHT, default=False): cv.boolean,
74
+ cv.Optional(CONF_BYPASS_AUTO, default=False): cv.boolean,
71
75
  cv.Optional(CONF_CHIME, default=False): cv.boolean,
72
76
  cv.Optional(CONF_TRIGGER_MODE, default="DELAYED"): cv.enum(
73
77
  ALARM_SENSOR_TYPES, upper=True, space="_"
@@ -143,6 +147,8 @@ async def to_code(config):
143
147
  if sensor[CONF_BYPASS_ARMED_NIGHT]:
144
148
  flags |= BinarySensorFlags[FLAG_BYPASS_ARMED_NIGHT]
145
149
  supports_arm_night = True
150
+ if sensor[CONF_BYPASS_AUTO]:
151
+ flags |= BinarySensorFlags[FLAG_BYPASS_AUTO]
146
152
  if sensor[CONF_CHIME]:
147
153
  flags |= BinarySensorFlags[FLAG_CHIME]
148
154
  cg.add(var.add_sensor(bs, flags, sensor[CONF_TRIGGER_MODE]))
@@ -29,8 +29,10 @@ void TemplateAlarmControlPanel::add_sensor(binary_sensor::BinarySensor *sensor,
29
29
 
30
30
  void TemplateAlarmControlPanel::dump_config() {
31
31
  ESP_LOGCONFIG(TAG, "TemplateAlarmControlPanel:");
32
- ESP_LOGCONFIG(TAG, " Current State: %s", LOG_STR_ARG(alarm_control_panel_state_to_string(this->current_state_)));
33
- ESP_LOGCONFIG(TAG, " Number of Codes: %u", this->codes_.size());
32
+ ESP_LOGCONFIG(TAG,
33
+ " Current State: %s\n"
34
+ " Number of Codes: %u",
35
+ LOG_STR_ARG(alarm_control_panel_state_to_string(this->current_state_)), this->codes_.size());
34
36
  if (!this->codes_.empty())
35
37
  ESP_LOGCONFIG(TAG, " Requires Code To Arm: %s", YESNO(this->requires_code_to_arm_));
36
38
  ESP_LOGCONFIG(TAG, " Arming Away Time: %" PRIu32 "s", (this->arming_away_time_ / 1000));
@@ -38,18 +40,25 @@ void TemplateAlarmControlPanel::dump_config() {
38
40
  ESP_LOGCONFIG(TAG, " Arming Home Time: %" PRIu32 "s", (this->arming_home_time_ / 1000));
39
41
  if (this->arming_night_time_ != 0)
40
42
  ESP_LOGCONFIG(TAG, " Arming Night Time: %" PRIu32 "s", (this->arming_night_time_ / 1000));
41
- ESP_LOGCONFIG(TAG, " Pending Time: %" PRIu32 "s", (this->pending_time_ / 1000));
42
- ESP_LOGCONFIG(TAG, " Trigger Time: %" PRIu32 "s", (this->trigger_time_ / 1000));
43
- ESP_LOGCONFIG(TAG, " Supported Features: %" PRIu32, this->get_supported_features());
43
+ ESP_LOGCONFIG(TAG,
44
+ " Pending Time: %" PRIu32 "s\n"
45
+ " Trigger Time: %" PRIu32 "s\n"
46
+ " Supported Features: %" PRIu32,
47
+ (this->pending_time_ / 1000), (this->trigger_time_ / 1000), this->get_supported_features());
44
48
  #ifdef USE_BINARY_SENSOR
45
49
  for (auto sensor_info : this->sensor_map_) {
46
50
  ESP_LOGCONFIG(TAG, " Binary Sensor:");
47
- ESP_LOGCONFIG(TAG, " Name: %s", sensor_info.first->get_name().c_str());
48
- ESP_LOGCONFIG(TAG, " Armed home bypass: %s",
49
- TRUEFALSE(sensor_info.second.flags & BINARY_SENSOR_MODE_BYPASS_ARMED_HOME));
50
- ESP_LOGCONFIG(TAG, " Armed night bypass: %s",
51
- TRUEFALSE(sensor_info.second.flags & BINARY_SENSOR_MODE_BYPASS_ARMED_NIGHT));
52
- ESP_LOGCONFIG(TAG, " Chime mode: %s", TRUEFALSE(sensor_info.second.flags & BINARY_SENSOR_MODE_CHIME));
51
+ ESP_LOGCONFIG(TAG,
52
+ " Name: %s\n"
53
+ " Armed home bypass: %s\n"
54
+ " Armed night bypass: %s\n"
55
+ " Auto bypass: %s\n"
56
+ " Chime mode: %s",
57
+ sensor_info.first->get_name().c_str(),
58
+ TRUEFALSE(sensor_info.second.flags & BINARY_SENSOR_MODE_BYPASS_ARMED_HOME),
59
+ TRUEFALSE(sensor_info.second.flags & BINARY_SENSOR_MODE_BYPASS_ARMED_NIGHT),
60
+ TRUEFALSE(sensor_info.second.flags & BINARY_SENSOR_MODE_BYPASS_AUTO),
61
+ TRUEFALSE(sensor_info.second.flags & BINARY_SENSOR_MODE_CHIME));
53
62
  const char *sensor_type;
54
63
  switch (sensor_info.second.type) {
55
64
  case ALARM_SENSOR_TYPE_INSTANT:
@@ -71,7 +80,7 @@ void TemplateAlarmControlPanel::dump_config() {
71
80
  }
72
81
 
73
82
  void TemplateAlarmControlPanel::setup() {
74
- ESP_LOGCONFIG(TAG, "Setting up Template AlarmControlPanel '%s'...", this->name_.c_str());
83
+ ESP_LOGCONFIG(TAG, "Running setup for '%s'", this->name_.c_str());
75
84
  switch (this->restore_mode_) {
76
85
  case ALARM_CONTROL_PANEL_ALWAYS_DISARMED:
77
86
  this->current_state_ = ACP_STATE_DISARMED;
@@ -101,6 +110,15 @@ void TemplateAlarmControlPanel::loop() {
101
110
  delay = this->arming_night_time_;
102
111
  }
103
112
  if ((millis() - this->last_update_) > delay) {
113
+ #ifdef USE_BINARY_SENSOR
114
+ for (auto sensor_info : this->sensor_map_) {
115
+ // Check for sensors left on and set to bypass automatically and remove them from monitoring
116
+ if ((sensor_info.second.flags & BINARY_SENSOR_MODE_BYPASS_AUTO) && (sensor_info.first->state)) {
117
+ ESP_LOGW(TAG, "%s is left on and will be automatically bypassed", sensor_info.first->get_name().c_str());
118
+ this->bypassed_sensor_indicies_.push_back(sensor_info.second.store_index);
119
+ }
120
+ }
121
+ #endif
104
122
  this->publish_state(this->desired_state_);
105
123
  }
106
124
  return;
@@ -137,6 +155,11 @@ void TemplateAlarmControlPanel::loop() {
137
155
  }
138
156
  // Check for triggered sensors
139
157
  if (sensor_info.first->state) { // Sensor triggered?
158
+ // Skip if auto bypassed
159
+ if (std::count(this->bypassed_sensor_indicies_.begin(), this->bypassed_sensor_indicies_.end(),
160
+ sensor_info.second.store_index) == 1) {
161
+ continue;
162
+ }
140
163
  // Skip if bypass armed home
141
164
  if (this->current_state_ == ACP_STATE_ARMED_HOME &&
142
165
  (sensor_info.second.flags & BINARY_SENSOR_MODE_BYPASS_ARMED_HOME)) {
@@ -255,6 +278,9 @@ void TemplateAlarmControlPanel::control(const AlarmControlPanelCall &call) {
255
278
  }
256
279
  this->desired_state_ = ACP_STATE_DISARMED;
257
280
  this->publish_state(ACP_STATE_DISARMED);
281
+ #ifdef USE_BINARY_SENSOR
282
+ this->bypassed_sensor_indicies_.clear();
283
+ #endif
258
284
  } else if (call.get_state() == ACP_STATE_TRIGGERED) {
259
285
  this->publish_state(ACP_STATE_TRIGGERED);
260
286
  } else if (call.get_state() == ACP_STATE_PENDING) {
@@ -22,6 +22,7 @@ enum BinarySensorFlags : uint16_t {
22
22
  BINARY_SENSOR_MODE_BYPASS_ARMED_HOME = 1 << 1,
23
23
  BINARY_SENSOR_MODE_BYPASS_ARMED_NIGHT = 1 << 2,
24
24
  BINARY_SENSOR_MODE_CHIME = 1 << 3,
25
+ BINARY_SENSOR_MODE_BYPASS_AUTO = 1 << 4,
25
26
  };
26
27
 
27
28
  enum AlarmSensorType : uint16_t {
@@ -121,7 +122,8 @@ class TemplateAlarmControlPanel : public alarm_control_panel::AlarmControlPanel,
121
122
  #ifdef USE_BINARY_SENSOR
122
123
  // This maps a binary sensor to its type and attribute bits
123
124
  std::map<binary_sensor::BinarySensor *, SensorInfo> sensor_map_;
124
-
125
+ // a list of automatically bypassed sensors
126
+ std::vector<uint8_t> bypassed_sensor_indicies_;
125
127
  #endif
126
128
  TemplateAlarmControlPanelRestoreMode restore_mode_{};
127
129
 
@@ -16,7 +16,7 @@ TemplateCover::TemplateCover()
16
16
  position_trigger_(new Trigger<float>()),
17
17
  tilt_trigger_(new Trigger<float>()) {}
18
18
  void TemplateCover::setup() {
19
- ESP_LOGCONFIG(TAG, "Setting up template cover '%s'...", this->name_.c_str());
19
+ ESP_LOGCONFIG(TAG, "Running setup for '%s'", this->name_.c_str());
20
20
  switch (this->restore_mode_) {
21
21
  case COVER_NO_RESTORE:
22
22
  break;
@@ -11,7 +11,7 @@ void TemplateSelect::setup() {
11
11
  return;
12
12
 
13
13
  std::string value;
14
- ESP_LOGD(TAG, "Setting up Template Select");
14
+ ESP_LOGD(TAG, "Setting up");
15
15
  if (!this->restore_value_) {
16
16
  value = this->initial_option_;
17
17
  ESP_LOGD(TAG, "State from initial: %s", value.c_str());
@@ -66,9 +66,11 @@ void TemplateSelect::dump_config() {
66
66
  LOG_UPDATE_INTERVAL(this);
67
67
  if (this->f_.has_value())
68
68
  return;
69
- ESP_LOGCONFIG(TAG, " Optimistic: %s", YESNO(this->optimistic_));
70
- ESP_LOGCONFIG(TAG, " Initial Option: %s", this->initial_option_.c_str());
71
- ESP_LOGCONFIG(TAG, " Restore Value: %s", YESNO(this->restore_value_));
69
+ ESP_LOGCONFIG(TAG,
70
+ " Optimistic: %s\n"
71
+ " Initial Option: %s\n"
72
+ " Restore Value: %s",
73
+ YESNO(this->optimistic_), this->initial_option_.c_str(), YESNO(this->restore_value_));
72
74
  }
73
75
 
74
76
  } // namespace template_
@@ -12,9 +12,8 @@ void TemplateText::setup() {
12
12
  return;
13
13
  }
14
14
 
15
- std::string value;
16
- ESP_LOGD(TAG, "Setting up Template Text Input");
17
- value = this->initial_value_;
15
+ ESP_LOGCONFIG(TAG, "Running setup for '%s'", this->name_.c_str());
16
+ std::string value = this->initial_value_;
18
17
  if (!this->pref_) {
19
18
  ESP_LOGD(TAG, "State from initial: %s", value.c_str());
20
19
  } else {