esphome 2025.5.2__py3-none-any.whl → 2025.6.0b2__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 (746) 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 +3 -0
  33. esphome/components/api/api_pb2.h +702 -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 -1
  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/preferences.cpp +6 -6
  191. esphome/components/esp8266_pwm/esp8266_pwm.cpp +3 -3
  192. esphome/components/esp_ldo/__init__.py +91 -0
  193. esphome/components/esp_ldo/esp_ldo.cpp +43 -0
  194. esphome/components/esp_ldo/esp_ldo.h +43 -0
  195. esphome/components/esphome/ota/ota_esphome.cpp +15 -8
  196. esphome/components/ethernet/ethernet_component.cpp +38 -26
  197. esphome/components/ethernet/ethernet_component.h +1 -1
  198. esphome/components/event/__init__.py +1 -0
  199. esphome/components/exposure_notifications/exposure_notifications.cpp +1 -1
  200. esphome/components/ezo/ezo.cpp +1 -1
  201. esphome/components/ezo_pmp/ezo_pmp.cpp +1 -1
  202. esphome/components/factory_reset/button/factory_reset_button.cpp +1 -1
  203. esphome/components/factory_reset/switch/factory_reset_switch.cpp +1 -1
  204. esphome/components/fan/__init__.py +1 -0
  205. esphome/components/fan/fan.cpp +30 -19
  206. esphome/components/fastled_base/fastled_light.cpp +7 -5
  207. esphome/components/fingerprint_grow/fingerprint_grow.cpp +8 -6
  208. esphome/components/fs3000/fs3000.cpp +1 -1
  209. esphome/components/ft5x06/touchscreen/ft5x06_touchscreen.cpp +7 -4
  210. esphome/components/ft63x6/ft63x6.cpp +5 -3
  211. esphome/components/gcja5/gcja5.cpp +0 -12
  212. esphome/components/gcja5/gcja5.h +8 -3
  213. esphome/components/gdk101/gdk101.cpp +2 -2
  214. esphome/components/globals/globals_component.h +13 -10
  215. esphome/components/gp2y1010au0f/gp2y1010au0f.cpp +4 -2
  216. esphome/components/gp8403/gp8403.cpp +4 -2
  217. esphome/components/gp8403/output/gp8403_output.cpp +4 -2
  218. esphome/components/gpio/one_wire/gpio_one_wire.cpp +2 -2
  219. esphome/components/gpio/output/gpio_binary_output.cpp +1 -1
  220. esphome/components/gpio/switch/gpio_switch.cpp +1 -1
  221. esphome/components/graphical_display_menu/graphical_display_menu.cpp +12 -8
  222. esphome/components/grove_gas_mc_v2/grove_gas_mc_v2.cpp +5 -6
  223. esphome/components/grove_tb6612fng/grove_tb6612fng.cpp +1 -1
  224. esphome/components/grove_tb6612fng/grove_tb6612fng.h +1 -1
  225. esphome/components/growatt_solar/growatt_solar.cpp +6 -3
  226. esphome/components/gt911/touchscreen/gt911_touchscreen.cpp +1 -1
  227. esphome/components/haier/haier_base.cpp +2 -2
  228. esphome/components/haier/hon_climate.cpp +13 -6
  229. esphome/components/havells_solar/havells_solar.cpp +5 -2
  230. esphome/components/hbridge/switch/hbridge_switch.cpp +1 -1
  231. esphome/components/hdc1080/hdc1080.cpp +2 -2
  232. esphome/components/he60r/he60r.cpp +4 -2
  233. esphome/components/hlw8012/hlw8012.cpp +6 -4
  234. esphome/components/hm3301/hm3301.cpp +2 -2
  235. esphome/components/hmc5883l/hmc5883l.cpp +2 -2
  236. esphome/components/homeassistant/time/homeassistant_time.cpp +4 -2
  237. esphome/components/honeywell_hih_i2c/honeywell_hih.cpp +4 -4
  238. esphome/components/honeywellabp/honeywellabp.cpp +4 -2
  239. esphome/components/honeywellabp2_i2c/honeywellabp2.cpp +8 -6
  240. esphome/components/hte501/hte501.cpp +3 -2
  241. esphome/components/http_request/__init__.py +2 -2
  242. esphome/components/http_request/http_request.cpp +7 -5
  243. esphome/components/http_request/http_request_idf.cpp +4 -2
  244. esphome/components/http_request/ota/ota_http_request.cpp +1 -1
  245. esphome/components/htu21d/htu21d.cpp +2 -2
  246. esphome/components/htu31d/htu31d.cpp +2 -2
  247. esphome/components/hx711/hx711.cpp +2 -2
  248. esphome/components/hydreon_rgxx/hydreon_rgxx.cpp +5 -3
  249. esphome/components/hyt271/hyt271.cpp +2 -2
  250. esphome/components/i2c/i2c_bus_arduino.cpp +14 -11
  251. esphome/components/i2c/i2c_bus_esp_idf.cpp +13 -11
  252. esphome/components/i2s_audio/__init__.py +2 -0
  253. esphome/components/i2s_audio/i2s_audio.cpp +3 -4
  254. esphome/components/i2s_audio/i2s_audio.h +1 -1
  255. esphome/components/i2s_audio/media_player/__init__.py +1 -1
  256. esphome/components/i2s_audio/media_player/i2s_audio_media_player.cpp +5 -3
  257. esphome/components/i2s_audio/microphone/i2s_audio_microphone.cpp +13 -10
  258. esphome/components/i2s_audio/speaker/i2s_audio_speaker.cpp +1 -1
  259. esphome/components/iaqcore/iaqcore.cpp +3 -3
  260. esphome/components/ili9xxx/ili9xxx_display.cpp +12 -7
  261. esphome/components/ili9xxx/ili9xxx_display.h +1 -1
  262. esphome/components/image/image.cpp +1 -0
  263. esphome/components/ina219/ina219.cpp +2 -2
  264. esphome/components/ina226/ina226.cpp +8 -5
  265. esphome/components/ina260/ina260.cpp +1 -1
  266. esphome/components/ina2xx_base/ina2xx_base.cpp +13 -9
  267. esphome/components/ina3221/ina3221.cpp +2 -2
  268. esphome/components/inkplate6/display.py +12 -2
  269. esphome/components/inkplate6/inkplate.cpp +13 -9
  270. esphome/components/inkplate6/inkplate.h +7 -6
  271. esphome/components/integration/integration_sensor.cpp +1 -1
  272. esphome/components/internal_temperature/internal_temperature.cpp +4 -4
  273. esphome/components/json/json_util.cpp +4 -5
  274. esphome/components/kamstrup_kmp/kamstrup_kmp.cpp +1 -1
  275. esphome/components/key_collector/key_collector.cpp +4 -2
  276. esphome/components/kmeteriso/kmeteriso.cpp +4 -4
  277. esphome/components/kuntze/kuntze.cpp +4 -2
  278. esphome/components/lc709203f/__init__.py +1 -0
  279. esphome/components/lc709203f/lc709203f.cpp +299 -0
  280. esphome/components/lc709203f/lc709203f.h +55 -0
  281. esphome/components/lc709203f/sensor.py +93 -0
  282. esphome/components/lcd_base/lcd_display.cpp +2 -2
  283. esphome/components/lcd_gpio/gpio_lcd_display.cpp +5 -3
  284. esphome/components/lcd_menu/lcd_menu.cpp +6 -4
  285. esphome/components/lcd_pcf8574/pcf8574_display.cpp +6 -4
  286. esphome/components/ld2410/ld2410.cpp +6 -7
  287. esphome/components/ld2420/ld2420.cpp +9 -7
  288. esphome/components/ld2450/ld2450.cpp +6 -4
  289. esphome/components/ld2450/sensor.py +2 -2
  290. esphome/components/ledc/ledc_output.cpp +32 -28
  291. esphome/components/libretiny/const.py +1 -1
  292. esphome/components/libretiny/preferences.cpp +6 -7
  293. esphome/components/light/__init__.py +2 -1
  294. esphome/components/light/esp_hsv_color.h +1 -1
  295. esphome/components/light/light_state.cpp +9 -5
  296. esphome/components/light/light_transformer.h +1 -1
  297. esphome/components/lightwaverf/LwTx.cpp +1 -1
  298. esphome/components/lightwaverf/lightwaverf.cpp +1 -1
  299. esphome/components/lilygo_t5_47/touchscreen/lilygo_t5_47_touchscreen.cpp +1 -1
  300. esphome/components/lock/__init__.py +1 -0
  301. esphome/components/lock/lock.h +1 -1
  302. esphome/components/logger/__init__.py +6 -0
  303. esphome/components/logger/logger.cpp +11 -20
  304. esphome/components/logger/logger.h +1 -2
  305. esphome/components/logger/logger_esp32.cpp +5 -5
  306. esphome/components/ltr390/ltr390.cpp +8 -5
  307. esphome/components/ltr501/ltr501.cpp +19 -14
  308. esphome/components/ltr_als_ps/ltr_als_ps.cpp +20 -13
  309. esphome/components/lvgl/__init__.py +2 -2
  310. esphome/components/lvgl/automation.py +5 -4
  311. esphome/components/lvgl/defines.py +0 -2
  312. esphome/components/lvgl/lv_validation.py +1 -3
  313. esphome/components/lvgl/lvcode.py +7 -8
  314. esphome/components/lvgl/lvgl_esphome.cpp +26 -10
  315. esphome/components/lvgl/schemas.py +22 -23
  316. esphome/components/lvgl/trigger.py +8 -3
  317. esphome/components/lvgl/widgets/__init__.py +2 -2
  318. esphome/components/lvgl/widgets/canvas.py +9 -3
  319. esphome/components/lvgl/widgets/line.py +2 -1
  320. esphome/components/lvgl/widgets/tabview.py +7 -0
  321. esphome/components/m5stack_8angle/m5stack_8angle.cpp +3 -3
  322. esphome/components/matrix_keypad/matrix_keypad.cpp +2 -2
  323. esphome/components/max17043/max17043.cpp +2 -2
  324. esphome/components/max31855/max31855.cpp +2 -1
  325. esphome/components/max31856/max31856.cpp +9 -11
  326. esphome/components/max31865/max31865.cpp +6 -4
  327. esphome/components/max44009/max44009.cpp +2 -2
  328. esphome/components/max6675/max6675.cpp +1 -1
  329. esphome/components/max6956/max6956.cpp +5 -3
  330. esphome/components/max7219/max7219.cpp +8 -6
  331. esphome/components/max7219digit/automation.h +52 -0
  332. esphome/components/max7219digit/display.py +93 -1
  333. esphome/components/max7219digit/max7219digit.cpp +16 -13
  334. esphome/components/max9611/max9611.cpp +9 -6
  335. esphome/components/mcp23008/mcp23008.cpp +1 -1
  336. esphome/components/mcp23016/mcp23016.cpp +1 -1
  337. esphome/components/mcp23017/mcp23017.cpp +1 -1
  338. esphome/components/mcp23s08/mcp23s08.cpp +1 -1
  339. esphome/components/mcp23s17/mcp23s17.cpp +1 -1
  340. esphome/components/mcp3008/mcp3008.cpp +1 -1
  341. esphome/components/mcp3008/sensor/mcp3008_sensor.cpp +5 -3
  342. esphome/components/mcp3204/mcp3204.cpp +1 -1
  343. esphome/components/mcp4461/mcp4461.cpp +2 -2
  344. esphome/components/mcp4725/mcp4725.cpp +2 -2
  345. esphome/components/mcp4728/mcp4728.cpp +2 -2
  346. esphome/components/mcp9600/mcp9600.cpp +1 -1
  347. esphome/components/mcp9808/mcp9808.cpp +4 -4
  348. esphome/components/mdns/mdns_component.cpp +8 -2
  349. esphome/components/mdns/mdns_component.h +3 -1
  350. esphome/components/mdns/mdns_esp32.cpp +2 -2
  351. esphome/components/media_player/__init__.py +1 -0
  352. esphome/components/micro_wake_word/micro_wake_word.cpp +1 -1
  353. esphome/components/micro_wake_word/streaming_model.cpp +10 -6
  354. esphome/components/micronova/micronova.h +2 -2
  355. esphome/components/mics_4514/mics_4514.cpp +2 -2
  356. esphome/components/midea/air_conditioner.cpp +7 -5
  357. esphome/components/midea_ir/midea_ir.cpp +1 -1
  358. esphome/components/mipi_spi/mipi_spi.cpp +24 -15
  359. esphome/components/mixer/speaker/mixer_speaker.cpp +8 -4
  360. esphome/components/mlx90393/sensor_mlx90393.cpp +2 -2
  361. esphome/components/mlx90614/mlx90614.cpp +4 -3
  362. esphome/components/mmc5603/mmc5603.cpp +2 -2
  363. esphome/components/mmc5983/mmc5983.cpp +1 -1
  364. esphome/components/modbus/modbus.cpp +7 -5
  365. esphome/components/modbus_controller/modbus_controller.cpp +6 -4
  366. esphome/components/modbus_controller/output/modbus_output.cpp +10 -6
  367. esphome/components/modbus_controller/switch/__init__.py +6 -2
  368. esphome/components/modbus_controller/switch/modbus_switch.cpp +4 -0
  369. esphome/components/modbus_controller/switch/modbus_switch.h +3 -0
  370. esphome/components/mpl3115a2/mpl3115a2.cpp +3 -2
  371. esphome/components/mpr121/mpr121.cpp +2 -2
  372. esphome/components/mpu6050/mpu6050.cpp +6 -6
  373. esphome/components/mpu6886/mpu6886.cpp +6 -6
  374. esphome/components/mqtt/mqtt_alarm_control_panel.cpp +7 -3
  375. esphome/components/mqtt/mqtt_backend_esp32.cpp +1 -1
  376. esphome/components/mqtt/mqtt_client.cpp +31 -24
  377. esphome/components/mqtt/mqtt_component.cpp +3 -3
  378. esphome/components/mqtt/mqtt_cover.cpp +8 -4
  379. esphome/components/mqtt/mqtt_fan.cpp +12 -6
  380. esphome/components/mqtt/mqtt_valve.cpp +4 -2
  381. esphome/components/ms5611/ms5611.cpp +2 -2
  382. esphome/components/ms8607/ms8607.cpp +2 -2
  383. esphome/components/msa3xx/msa3xx.cpp +16 -12
  384. esphome/components/my9231/my9231.cpp +7 -5
  385. esphome/components/nau7802/nau7802.cpp +6 -4
  386. esphome/components/neopixelbus/neopixelbus_light.h +2 -2
  387. esphome/components/network/ip_address.h +1 -1
  388. esphome/components/network/util.cpp +13 -0
  389. esphome/components/nextion/base_component.py +2 -0
  390. esphome/components/nextion/binary_sensor/nextion_binarysensor.cpp +3 -4
  391. esphome/components/nextion/display.py +34 -22
  392. esphome/components/nextion/nextion.cpp +182 -143
  393. esphome/components/nextion/nextion.h +36 -0
  394. esphome/components/nextion/nextion_commands.cpp +3 -3
  395. esphome/components/nextion/nextion_upload_arduino.cpp +69 -69
  396. esphome/components/nextion/nextion_upload_idf.cpp +79 -80
  397. esphome/components/nextion/sensor/nextion_sensor.cpp +5 -5
  398. esphome/components/nextion/switch/nextion_switch.cpp +2 -2
  399. esphome/components/nextion/text_sensor/nextion_textsensor.cpp +3 -3
  400. esphome/components/nfc/nci_message.h +1 -1
  401. esphome/components/nfc/ndef_record.h +1 -1
  402. esphome/components/nfc/ndef_record_text.h +1 -1
  403. esphome/components/nfc/ndef_record_uri.h +1 -1
  404. esphome/components/nfc/nfc.h +1 -1
  405. esphome/components/nfc/nfc_tag.h +1 -1
  406. esphome/components/noblex/noblex.cpp +1 -1
  407. esphome/components/npi19/npi19.cpp +5 -7
  408. esphome/components/number/__init__.py +11 -0
  409. esphome/components/number/number.cpp +1 -1
  410. esphome/components/number/number.h +0 -4
  411. esphome/components/online_image/__init__.py +13 -1
  412. esphome/components/online_image/online_image.cpp +26 -4
  413. esphome/components/online_image/online_image.h +21 -4
  414. esphome/components/opentherm/generate.py +3 -3
  415. esphome/components/opentherm/hub.cpp +11 -7
  416. esphome/components/opentherm/number/number.cpp +5 -3
  417. esphome/components/opentherm/opentherm.h +1 -1
  418. esphome/components/opentherm/schema.py +13 -13
  419. esphome/components/opentherm/validate.py +1 -1
  420. esphome/components/openthread/__init__.py +146 -0
  421. esphome/components/openthread/const.py +10 -0
  422. esphome/components/openthread/openthread.cpp +206 -0
  423. esphome/components/openthread/openthread.h +68 -0
  424. esphome/components/openthread/openthread_esp.cpp +164 -0
  425. esphome/components/openthread/tlv.py +58 -0
  426. esphome/components/openthread_info/__init__.py +0 -0
  427. esphome/components/openthread_info/openthread_info_text_sensor.cpp +24 -0
  428. esphome/components/openthread_info/openthread_info_text_sensor.h +218 -0
  429. esphome/components/openthread_info/text_sensor.py +105 -0
  430. esphome/components/output/float_output.cpp +1 -1
  431. esphome/components/output/switch/output_switch.cpp +1 -1
  432. esphome/components/packet_transport/packet_transport.cpp +6 -4
  433. esphome/components/pca6416a/pca6416a.cpp +2 -2
  434. esphome/components/pca9554/pca9554.cpp +6 -4
  435. esphome/components/pca9685/pca9685_output.cpp +12 -8
  436. esphome/components/pcd8544/pcd_8544.cpp +1 -1
  437. esphome/components/pcf85063/pcf85063.cpp +2 -2
  438. esphome/components/pcf8563/pcf8563.cpp +2 -2
  439. esphome/components/pcf8574/pcf8574.cpp +2 -2
  440. esphome/components/pid/pid_climate.cpp +8 -5
  441. esphome/components/pid/pid_climate.h +1 -1
  442. esphome/components/pid/sensor/pid_climate_sensor.cpp +1 -1
  443. esphome/components/pipsolar/output/pipsolar_output.cpp +1 -1
  444. esphome/components/pipsolar/pipsolar.cpp +3 -3
  445. esphome/components/pm1006/pm1006.cpp +3 -7
  446. esphome/components/pm1006/pm1006.h +4 -1
  447. esphome/components/pm2005/pm2005.cpp +12 -13
  448. esphome/components/pm2005/sensor.py +1 -1
  449. esphome/components/pmsa003i/pmsa003i.cpp +2 -2
  450. esphome/components/pmsx003/pmsx003.cpp +0 -4
  451. esphome/components/pmsx003/pmsx003.h +5 -2
  452. esphome/components/pmwcs3/pmwcs3.cpp +9 -13
  453. esphome/components/pmwcs3/pmwcs3.h +0 -1
  454. esphome/components/pn532/pn532.cpp +7 -7
  455. esphome/components/pn532/pn532.h +1 -1
  456. esphome/components/pn532_spi/pn532_spi.cpp +1 -1
  457. esphome/components/pn7150/pn7150.cpp +4 -4
  458. esphome/components/pn7160/pn7160.cpp +4 -4
  459. esphome/components/power_supply/power_supply.cpp +6 -4
  460. esphome/components/power_supply/power_supply.h +1 -1
  461. esphome/components/prometheus/__init__.py +0 -1
  462. esphome/components/psram/__init__.py +59 -35
  463. esphome/components/pulse_counter/pulse_counter_sensor.cpp +7 -4
  464. esphome/components/pvvx_mithermometer/display/pvvx_display.cpp +8 -5
  465. esphome/components/pylontech/pylontech.cpp +2 -2
  466. esphome/components/pylontech/sensor/pylontech_sensor.cpp +4 -2
  467. esphome/components/pylontech/text_sensor/pylontech_text_sensor.cpp +4 -2
  468. esphome/components/pzemac/pzemac.cpp +4 -2
  469. esphome/components/pzemdc/pzemdc.cpp +4 -2
  470. esphome/components/qmc5883l/qmc5883l.cpp +2 -2
  471. esphome/components/qmp6988/qmp6988.cpp +2 -2
  472. esphome/components/qmp6988/qmp6988.h +1 -1
  473. esphome/components/qr_code/qr_code.cpp +5 -3
  474. esphome/components/qspi_dbi/qspi_dbi.cpp +1 -1
  475. esphome/components/qwiic_pir/qwiic_pir.cpp +26 -28
  476. esphome/components/rc522/rc522.cpp +5 -5
  477. esphome/components/rdm6300/rdm6300.cpp +1 -0
  478. esphome/components/remote_receiver/__init__.py +10 -2
  479. esphome/components/remote_receiver/remote_receiver_esp32.cpp +22 -12
  480. esphome/components/remote_receiver/remote_receiver_esp8266.cpp +10 -7
  481. esphome/components/remote_receiver/remote_receiver_libretiny.cpp +10 -7
  482. esphome/components/remote_transmitter/__init__.py +10 -2
  483. esphome/components/remote_transmitter/remote_transmitter_esp32.cpp +10 -6
  484. esphome/components/remote_transmitter/remote_transmitter_esp8266.cpp +5 -3
  485. esphome/components/remote_transmitter/remote_transmitter_libretiny.cpp +5 -3
  486. esphome/components/resistance/resistance_sensor.cpp +6 -3
  487. esphome/components/restart/button/restart_button.cpp +1 -1
  488. esphome/components/restart/switch/restart_switch.cpp +1 -1
  489. esphome/components/rotary_encoder/rotary_encoder.cpp +2 -2
  490. esphome/components/rp2040/__init__.py +7 -0
  491. esphome/components/rp2040/core.cpp +8 -1
  492. esphome/components/rp2040/preferences.cpp +3 -3
  493. esphome/components/rp2040_pio_led_strip/led_strip.cpp +11 -8
  494. esphome/components/rp2040_pio_led_strip/light.py +1 -1
  495. esphome/components/rp2040_pwm/rp2040_pwm.cpp +1 -1
  496. esphome/components/rpi_dpi_rgb/rpi_dpi_rgb.cpp +1 -1
  497. esphome/components/rtttl/rtttl.cpp +11 -9
  498. esphome/components/safe_mode/button/safe_mode_button.cpp +1 -1
  499. esphome/components/safe_mode/safe_mode.cpp +9 -8
  500. esphome/components/safe_mode/switch/safe_mode_switch.cpp +1 -1
  501. esphome/components/scd30/scd30.cpp +11 -8
  502. esphome/components/scd4x/scd4x.cpp +12 -8
  503. esphome/components/sdl/display.py +40 -0
  504. esphome/components/sdl/sdl_esphome.cpp +2 -2
  505. esphome/components/sdl/sdl_esphome.h +8 -0
  506. esphome/components/sdm_meter/sdm_meter.cpp +5 -2
  507. esphome/components/sdp3x/sdp3x.cpp +11 -11
  508. esphome/components/sds011/sds011.cpp +5 -6
  509. esphome/components/sds011/sds011.h +4 -1
  510. esphome/components/seeed_mr24hpc1/seeed_mr24hpc1.cpp +3 -2
  511. esphome/components/seeed_mr60bha2/seeed_mr60bha2.cpp +1 -0
  512. esphome/components/seeed_mr60fda2/seeed_mr60fda2.cpp +3 -2
  513. esphome/components/selec_meter/selec_meter.cpp +5 -2
  514. esphome/components/select/__init__.py +1 -0
  515. esphome/components/select/select.cpp +1 -1
  516. esphome/components/select/select.h +0 -4
  517. esphome/components/sen0321/sen0321.cpp +2 -2
  518. esphome/components/sen21231/sen21231.cpp +1 -1
  519. esphome/components/sen5x/sen5x.cpp +10 -7
  520. esphome/components/sensirion_common/i2c_sensirion.cpp +2 -1
  521. esphome/components/sensirion_common/i2c_sensirion.h +1 -0
  522. esphome/components/sensor/__init__.py +11 -1
  523. esphome/components/sensor/filter.h +1 -1
  524. esphome/components/sensor/sensor.cpp +8 -4
  525. esphome/components/sensor/sensor.h +12 -11
  526. esphome/components/servo/servo.cpp +12 -9
  527. esphome/components/servo/servo.h +1 -1
  528. esphome/components/sfa30/sfa30.cpp +1 -1
  529. esphome/components/sgp30/sgp30.cpp +10 -8
  530. esphome/components/sgp4x/sgp4x.cpp +49 -61
  531. esphome/components/sgp4x/sgp4x.h +0 -1
  532. esphome/components/shelly_dimmer/shelly_dimmer.cpp +11 -7
  533. esphome/components/sht3xd/sht3xd.cpp +1 -1
  534. esphome/components/sht4x/sht4x.cpp +2 -2
  535. esphome/components/shtcx/shtcx.cpp +13 -16
  536. esphome/components/shutdown/button/shutdown_button.cpp +1 -1
  537. esphome/components/shutdown/switch/shutdown_switch.cpp +1 -1
  538. esphome/components/sim800l/sim800l.cpp +2 -2
  539. esphome/components/slow_pwm/slow_pwm_output.cpp +4 -2
  540. esphome/components/sm16716/sm16716.cpp +1 -1
  541. esphome/components/sm2135/sm2135.cpp +1 -1
  542. esphome/components/sm2235/sm2235.cpp +5 -3
  543. esphome/components/sm2335/sm2335.cpp +5 -3
  544. esphome/components/sml/sml.cpp +1 -1
  545. esphome/components/sn74hc165/sn74hc165.cpp +1 -2
  546. esphome/components/sn74hc595/sn74hc595.cpp +1 -2
  547. esphome/components/sntp/sntp_component.cpp +1 -1
  548. esphome/components/socket/__init__.py +2 -0
  549. esphome/components/socket/bsd_sockets_impl.cpp +51 -7
  550. esphome/components/socket/lwip_raw_tcp_impl.cpp +5 -0
  551. esphome/components/socket/lwip_sockets_impl.cpp +51 -7
  552. esphome/components/socket/socket.cpp +31 -0
  553. esphome/components/socket/socket.h +27 -1
  554. esphome/components/sonoff_d1/sonoff_d1.cpp +7 -4
  555. esphome/components/sonoff_d1/sonoff_d1.h +2 -2
  556. esphome/components/sound_level/sound_level.cpp +4 -2
  557. esphome/components/speaker/media_player/__init__.py +3 -0
  558. esphome/components/speaker/media_player/speaker_media_player.cpp +1 -3
  559. esphome/components/speaker/media_player/speaker_media_player.h +6 -0
  560. esphome/components/spi/__init__.py +10 -2
  561. esphome/components/spi/spi.cpp +4 -4
  562. esphome/components/spi_device/spi_device.cpp +1 -2
  563. esphome/components/sprinkler/sprinkler.cpp +9 -6
  564. esphome/components/sps30/sps30.cpp +16 -15
  565. esphome/components/ssd1306_base/ssd1306_base.cpp +1 -1
  566. esphome/components/ssd1306_i2c/ssd1306_i2c.cpp +11 -8
  567. esphome/components/ssd1306_spi/ssd1306_spi.cpp +10 -7
  568. esphome/components/ssd1322_base/ssd1322_base.cpp +1 -1
  569. esphome/components/ssd1322_spi/ssd1322_spi.cpp +1 -1
  570. esphome/components/ssd1325_base/ssd1325_base.cpp +1 -1
  571. esphome/components/ssd1325_spi/ssd1325_spi.cpp +1 -1
  572. esphome/components/ssd1327_base/ssd1327_base.cpp +1 -1
  573. esphome/components/ssd1327_i2c/ssd1327_i2c.cpp +2 -2
  574. esphome/components/ssd1327_spi/ssd1327_spi.cpp +1 -1
  575. esphome/components/ssd1331_base/ssd1331_base.cpp +1 -1
  576. esphome/components/ssd1331_spi/ssd1331_spi.cpp +1 -1
  577. esphome/components/ssd1351_base/ssd1351_base.cpp +1 -1
  578. esphome/components/ssd1351_spi/ssd1351_spi.cpp +1 -1
  579. esphome/components/st7567_base/st7567_base.cpp +3 -3
  580. esphome/components/st7567_i2c/st7567_i2c.cpp +7 -5
  581. esphome/components/st7567_spi/st7567_spi.cpp +1 -1
  582. esphome/components/st7701s/st7701s.cpp +4 -2
  583. esphome/components/st7735/st7735.cpp +3 -3
  584. esphome/components/st7789v/st7789v.cpp +10 -7
  585. esphome/components/st7920/st7920.cpp +6 -4
  586. esphome/components/statsd/statsd.cpp +9 -5
  587. esphome/components/status_led/light/status_led_light.cpp +3 -3
  588. esphome/components/status_led/light/status_led_light.h +1 -1
  589. esphome/components/status_led/status_led.cpp +1 -1
  590. esphome/components/stepper/stepper.h +5 -3
  591. esphome/components/sts3x/sts3x.cpp +2 -2
  592. esphome/components/switch/__init__.py +1 -0
  593. esphome/components/switch/switch.cpp +18 -12
  594. esphome/components/switch/switch.h +1 -1
  595. esphome/components/sx1509/__init__.py +53 -20
  596. esphome/components/sx1509/sx1509.cpp +29 -5
  597. esphome/components/sx1509/sx1509.h +9 -1
  598. esphome/components/t6615/t6615.cpp +1 -0
  599. esphome/components/tc74/tc74.cpp +1 -1
  600. esphome/components/tca9548a/tca9548a.cpp +1 -1
  601. esphome/components/tca9555/tca9555.cpp +2 -2
  602. esphome/components/tcs34725/tcs34725.cpp +4 -4
  603. esphome/components/tee501/tee501.cpp +3 -2
  604. esphome/components/tem3200/tem3200.cpp +5 -6
  605. esphome/components/template/alarm_control_panel/__init__.py +6 -0
  606. esphome/components/template/alarm_control_panel/template_alarm_control_panel.cpp +43 -12
  607. esphome/components/template/alarm_control_panel/template_alarm_control_panel.h +4 -1
  608. esphome/components/template/cover/template_cover.cpp +1 -1
  609. esphome/components/template/select/template_select.cpp +6 -4
  610. esphome/components/template/text/template_text.cpp +2 -3
  611. esphome/components/template/valve/template_valve.cpp +5 -3
  612. esphome/components/text/__init__.py +10 -11
  613. esphome/components/text/text.cpp +1 -1
  614. esphome/components/text/text.h +0 -4
  615. esphome/components/text_sensor/__init__.py +1 -0
  616. esphome/components/text_sensor/text_sensor.cpp +8 -4
  617. esphome/components/text_sensor/text_sensor.h +6 -6
  618. esphome/components/thermostat/thermostat_climate.cpp +67 -43
  619. esphome/components/time/__init__.py +1 -2
  620. esphome/components/time_based/time_based_cover.cpp +4 -2
  621. esphome/components/tlc59208f/tlc59208f_output.cpp +8 -6
  622. esphome/components/tm1621/tm1621.cpp +3 -3
  623. esphome/components/tm1637/tm1637.cpp +9 -7
  624. esphome/components/tm1638/tm1638.cpp +7 -5
  625. esphome/components/tm1651/tm1651.cpp +2 -2
  626. esphome/components/tmp102/tmp102.cpp +1 -3
  627. esphome/components/tmp102/tmp102.h +0 -3
  628. esphome/components/tmp1075/tmp1075.cpp +12 -9
  629. esphome/components/tmp117/tmp117.cpp +2 -2
  630. esphome/components/tof10120/tof10120_sensor.cpp +2 -2
  631. esphome/components/tormatic/tormatic_cover.cpp +4 -2
  632. esphome/components/tsl2561/tsl2561.cpp +7 -5
  633. esphome/components/tsl2591/tsl2591.cpp +25 -27
  634. esphome/components/tt21100/touchscreen/tt21100.cpp +1 -1
  635. esphome/components/ttp229_bsf/ttp229_bsf.cpp +1 -1
  636. esphome/components/ttp229_lsf/ttp229_lsf.cpp +2 -2
  637. esphome/components/tuya/select/tuya_select.cpp +5 -3
  638. esphome/components/tx20/tx20.cpp +3 -3
  639. esphome/components/uart/__init__.py +4 -5
  640. esphome/components/uart/button/uart_button.cpp +1 -1
  641. esphome/components/uart/switch/uart_switch.cpp +2 -2
  642. esphome/components/uart/uart.cpp +2 -2
  643. esphome/components/uart/uart_component_esp32_arduino.cpp +8 -6
  644. esphome/components/uart/uart_component_esp8266.cpp +9 -7
  645. esphome/components/uart/uart_component_esp_idf.cpp +9 -7
  646. esphome/components/uart/uart_component_host.cpp +11 -8
  647. esphome/components/uart/uart_component_libretiny.cpp +8 -6
  648. esphome/components/uart/uart_component_rp2040.cpp +8 -6
  649. esphome/components/udp/udp_component.cpp +9 -5
  650. esphome/components/ufire_ec/ufire_ec.cpp +5 -3
  651. esphome/components/ufire_ise/ufire_ise.cpp +1 -1
  652. esphome/components/ultrasonic/ultrasonic_sensor.cpp +5 -3
  653. esphome/components/update/__init__.py +1 -0
  654. esphome/components/update/update_entity.cpp +1 -1
  655. esphome/components/update/update_entity.h +0 -3
  656. esphome/components/uponor_smatrix/climate/uponor_smatrix_climate.cpp +1 -1
  657. esphome/components/uponor_smatrix/sensor/uponor_smatrix_sensor.cpp +4 -2
  658. esphome/components/uponor_smatrix/uponor_smatrix.cpp +2 -1
  659. esphome/components/uptime/sensor/uptime_timestamp_sensor.cpp +1 -1
  660. esphome/components/usb_host/__init__.py +64 -0
  661. esphome/components/usb_host/usb_host.h +116 -0
  662. esphome/components/usb_host/usb_host_client.cpp +394 -0
  663. esphome/components/usb_host/usb_host_component.cpp +35 -0
  664. esphome/components/usb_uart/__init__.py +134 -0
  665. esphome/components/usb_uart/ch34x.cpp +80 -0
  666. esphome/components/usb_uart/cp210x.cpp +126 -0
  667. esphome/components/usb_uart/usb_uart.cpp +328 -0
  668. esphome/components/usb_uart/usb_uart.h +151 -0
  669. esphome/components/valve/__init__.py +1 -0
  670. esphome/components/veml3235/veml3235.cpp +13 -9
  671. esphome/components/veml7700/veml7700.cpp +10 -6
  672. esphome/components/voice_assistant/voice_assistant.cpp +7 -7
  673. esphome/components/wake_on_lan/wake_on_lan.cpp +1 -1
  674. esphome/components/waveshare_epaper/waveshare_epaper.cpp +1 -1
  675. esphome/components/web_server/server_index_v2.h +632 -630
  676. esphome/components/web_server/server_index_v3.h +411 -409
  677. esphome/components/web_server/web_server.cpp +5 -3
  678. esphome/components/web_server_base/web_server_base.cpp +1 -1
  679. esphome/components/web_server_idf/__init__.py +0 -2
  680. esphome/components/web_server_idf/utils.cpp +1 -1
  681. esphome/components/web_server_idf/web_server_idf.cpp +7 -3
  682. esphome/components/web_server_idf/web_server_idf.h +7 -0
  683. esphome/components/weikai/__init__.py +2 -0
  684. esphome/components/weikai/weikai.cpp +24 -22
  685. esphome/components/weikai_i2c/weikai_i2c.cpp +14 -9
  686. esphome/components/weikai_spi/weikai_spi.cpp +11 -6
  687. esphome/components/wiegand/wiegand.cpp +1 -1
  688. esphome/components/wifi/wifi_component.cpp +50 -37
  689. esphome/components/wifi/wifi_component.h +7 -4
  690. esphome/components/wifi/wifi_component_esp32_arduino.cpp +2 -2
  691. esphome/components/wifi/wifi_component_esp8266.cpp +3 -3
  692. esphome/components/wifi/wifi_component_libretiny.cpp +4 -4
  693. esphome/components/wireguard/wireguard.cpp +21 -21
  694. esphome/components/wl_134/text_sensor.py +1 -2
  695. esphome/components/wled/wled_light_effect.cpp +1 -1
  696. esphome/components/x9c/x9c.cpp +5 -3
  697. esphome/components/xgzp68xx/xgzp68xx.cpp +8 -6
  698. esphome/components/xiaomi_cgd1/xiaomi_cgd1.cpp +4 -2
  699. esphome/components/xiaomi_cgdk2/xiaomi_cgdk2.cpp +4 -2
  700. esphome/components/xiaomi_cgg1/xiaomi_cgg1.cpp +4 -2
  701. esphome/components/xiaomi_hhccjcy10/xiaomi_hhccjcy10.cpp +1 -1
  702. esphome/components/xiaomi_lywsd02mmc/xiaomi_lywsd02mmc.cpp +4 -2
  703. esphome/components/xiaomi_lywsd03mmc/xiaomi_lywsd03mmc.cpp +4 -2
  704. esphome/components/xiaomi_mhoc401/xiaomi_mhoc401.cpp +4 -2
  705. esphome/components/xl9535/xl9535.cpp +2 -2
  706. esphome/components/xpt2046/touchscreen/xpt2046.cpp +12 -11
  707. esphome/components/xpt2046/touchscreen/xpt2046.h +2 -2
  708. esphome/config.py +3 -2
  709. esphome/config_validation.py +46 -17
  710. esphome/const.py +10 -1
  711. esphome/core/__init__.py +37 -18
  712. esphome/core/application.cpp +197 -8
  713. esphome/core/application.h +116 -6
  714. esphome/core/component.cpp +36 -15
  715. esphome/core/component.h +43 -13
  716. esphome/core/config.py +12 -0
  717. esphome/core/defines.h +10 -2
  718. esphome/core/entity_base.cpp +4 -16
  719. esphome/core/entity_base.h +27 -13
  720. esphome/core/helpers.cpp +1 -1
  721. esphome/core/helpers.h +5 -5
  722. esphome/core/log.h +2 -0
  723. esphome/core/log_const_en.h +4 -0
  724. esphome/core/scheduler.cpp +2 -2
  725. esphome/coroutine.py +3 -4
  726. esphome/cpp_generator.py +32 -32
  727. esphome/dashboard/core.py +2 -2
  728. esphome/dashboard/web_server.py +2 -2
  729. esphome/git.py +4 -4
  730. esphome/helpers.py +5 -6
  731. esphome/loader.py +8 -7
  732. esphome/log.py +7 -1
  733. esphome/platformio_api.py +2 -3
  734. esphome/storage_json.py +13 -5
  735. esphome/types.py +12 -13
  736. esphome/util.py +1 -2
  737. esphome/wizard.py +0 -16
  738. esphome/writer.py +5 -3
  739. esphome/yaml_util.py +6 -1
  740. esphome/zeroconf.py +1 -1
  741. {esphome-2025.5.2.dist-info → esphome-2025.6.0b2.dist-info}/METADATA +12 -11
  742. {esphome-2025.5.2.dist-info → esphome-2025.6.0b2.dist-info}/RECORD +746 -692
  743. {esphome-2025.5.2.dist-info → esphome-2025.6.0b2.dist-info}/WHEEL +1 -1
  744. {esphome-2025.5.2.dist-info → esphome-2025.6.0b2.dist-info}/entry_points.txt +0 -0
  745. {esphome-2025.5.2.dist-info → esphome-2025.6.0b2.dist-info}/licenses/LICENSE +0 -0
  746. {esphome-2025.5.2.dist-info → esphome-2025.6.0b2.dist-info}/top_level.txt +0 -0
@@ -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,7 @@ void TemplateAlarmControlPanel::loop() {
101
110
  delay = this->arming_night_time_;
102
111
  }
103
112
  if ((millis() - this->last_update_) > delay) {
113
+ this->bypass_before_arming();
104
114
  this->publish_state(this->desired_state_);
105
115
  }
106
116
  return;
@@ -137,6 +147,11 @@ void TemplateAlarmControlPanel::loop() {
137
147
  }
138
148
  // Check for triggered sensors
139
149
  if (sensor_info.first->state) { // Sensor triggered?
150
+ // Skip if auto bypassed
151
+ if (std::count(this->bypassed_sensor_indicies_.begin(), this->bypassed_sensor_indicies_.end(),
152
+ sensor_info.second.store_index) == 1) {
153
+ continue;
154
+ }
140
155
  // Skip if bypass armed home
141
156
  if (this->current_state_ == ACP_STATE_ARMED_HOME &&
142
157
  (sensor_info.second.flags & BINARY_SENSOR_MODE_BYPASS_ARMED_HOME)) {
@@ -236,10 +251,23 @@ void TemplateAlarmControlPanel::arm_(optional<std::string> code, alarm_control_p
236
251
  if (delay > 0) {
237
252
  this->publish_state(ACP_STATE_ARMING);
238
253
  } else {
254
+ this->bypass_before_arming();
239
255
  this->publish_state(state);
240
256
  }
241
257
  }
242
258
 
259
+ void TemplateAlarmControlPanel::bypass_before_arming() {
260
+ #ifdef USE_BINARY_SENSOR
261
+ for (auto sensor_info : this->sensor_map_) {
262
+ // Check for sensors left on and set to bypass automatically and remove them from monitoring
263
+ if ((sensor_info.second.flags & BINARY_SENSOR_MODE_BYPASS_AUTO) && (sensor_info.first->state)) {
264
+ ESP_LOGW(TAG, "'%s' is left on and will be automatically bypassed", sensor_info.first->get_name().c_str());
265
+ this->bypassed_sensor_indicies_.push_back(sensor_info.second.store_index);
266
+ }
267
+ }
268
+ #endif
269
+ }
270
+
243
271
  void TemplateAlarmControlPanel::control(const AlarmControlPanelCall &call) {
244
272
  if (call.get_state()) {
245
273
  if (call.get_state() == ACP_STATE_ARMED_AWAY) {
@@ -255,6 +283,9 @@ void TemplateAlarmControlPanel::control(const AlarmControlPanelCall &call) {
255
283
  }
256
284
  this->desired_state_ = ACP_STATE_DISARMED;
257
285
  this->publish_state(ACP_STATE_DISARMED);
286
+ #ifdef USE_BINARY_SENSOR
287
+ this->bypassed_sensor_indicies_.clear();
288
+ #endif
258
289
  } else if (call.get_state() == ACP_STATE_TRIGGERED) {
259
290
  this->publish_state(ACP_STATE_TRIGGERED);
260
291
  } 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 {
@@ -59,6 +60,7 @@ class TemplateAlarmControlPanel : public alarm_control_panel::AlarmControlPanel,
59
60
  bool get_requires_code_to_arm() const override { return this->requires_code_to_arm_; }
60
61
  bool get_all_sensors_ready() { return this->sensors_ready_; };
61
62
  void set_restore_mode(TemplateAlarmControlPanelRestoreMode restore_mode) { this->restore_mode_ = restore_mode; }
63
+ void bypass_before_arming();
62
64
 
63
65
  #ifdef USE_BINARY_SENSOR
64
66
  /** Add a binary_sensor to the alarm_panel.
@@ -121,7 +123,8 @@ class TemplateAlarmControlPanel : public alarm_control_panel::AlarmControlPanel,
121
123
  #ifdef USE_BINARY_SENSOR
122
124
  // This maps a binary sensor to its type and attribute bits
123
125
  std::map<binary_sensor::BinarySensor *, SensorInfo> sensor_map_;
124
-
126
+ // a list of automatically bypassed sensors
127
+ std::vector<uint8_t> bypassed_sensor_indicies_;
125
128
  #endif
126
129
  TemplateAlarmControlPanelRestoreMode restore_mode_{};
127
130
 
@@ -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 {
@@ -16,7 +16,7 @@ TemplateValve::TemplateValve()
16
16
  position_trigger_(new Trigger<float>()) {}
17
17
 
18
18
  void TemplateValve::setup() {
19
- ESP_LOGCONFIG(TAG, "Setting up template valve '%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 VALVE_NO_RESTORE:
22
22
  break;
@@ -66,8 +66,10 @@ Trigger<> *TemplateValve::get_toggle_trigger() const { return this->toggle_trigg
66
66
 
67
67
  void TemplateValve::dump_config() {
68
68
  LOG_VALVE("", "Template Valve", this);
69
- ESP_LOGCONFIG(TAG, " Has position: %s", YESNO(this->has_position_));
70
- ESP_LOGCONFIG(TAG, " Optimistic: %s", YESNO(this->optimistic_));
69
+ ESP_LOGCONFIG(TAG,
70
+ " Has position: %s\n"
71
+ " Optimistic: %s",
72
+ YESNO(this->has_position_), YESNO(this->optimistic_));
71
73
  }
72
74
 
73
75
  void TemplateValve::control(const ValveCall &call) {
@@ -1,5 +1,3 @@
1
- from typing import Optional
2
-
3
1
  from esphome import automation
4
2
  import esphome.codegen as cg
5
3
  from esphome.components import mqtt, web_server
@@ -92,9 +90,9 @@ async def setup_text_core_(
92
90
  var,
93
91
  config,
94
92
  *,
95
- min_length: Optional[int],
96
- max_length: Optional[int],
97
- pattern: Optional[str],
93
+ min_length: int | None,
94
+ max_length: int | None,
95
+ pattern: str | None,
98
96
  ):
99
97
  await setup_entity(var, config)
100
98
 
@@ -121,13 +119,14 @@ async def register_text(
121
119
  var,
122
120
  config,
123
121
  *,
124
- min_length: Optional[int] = 0,
125
- max_length: Optional[int] = 255,
126
- pattern: Optional[str] = None,
122
+ min_length: int | None = 0,
123
+ max_length: int | None = 255,
124
+ pattern: str | None = None,
127
125
  ):
128
126
  if not CORE.has_id(config[CONF_ID]):
129
127
  var = cg.Pvariable(config[CONF_ID], var)
130
128
  cg.add(cg.App.register_text(var))
129
+ CORE.register_platform_component("text", var)
131
130
  await setup_text_core_(
132
131
  var, config, min_length=min_length, max_length=max_length, pattern=pattern
133
132
  )
@@ -136,9 +135,9 @@ async def register_text(
136
135
  async def new_text(
137
136
  config,
138
137
  *,
139
- min_length: Optional[int] = 0,
140
- max_length: Optional[int] = 255,
141
- pattern: Optional[str] = None,
138
+ min_length: int | None = 0,
139
+ max_length: int | None = 255,
140
+ pattern: str | None = None,
142
141
  ):
143
142
  var = cg.new_Pvariable(config[CONF_ID])
144
143
  await register_text(
@@ -7,7 +7,7 @@ namespace text {
7
7
  static const char *const TAG = "text";
8
8
 
9
9
  void Text::publish_state(const std::string &state) {
10
- this->has_state_ = true;
10
+ this->set_has_state(true);
11
11
  this->state = state;
12
12
  if (this->traits.get_mode() == TEXT_MODE_PASSWORD) {
13
13
  ESP_LOGD(TAG, "'%s': Sending state " LOG_SECRET("'%s'"), this->get_name().c_str(), state.c_str());
@@ -28,9 +28,6 @@ class Text : public EntityBase {
28
28
 
29
29
  void publish_state(const std::string &state);
30
30
 
31
- /// Return whether this text input has gotten a full state yet.
32
- bool has_state() const { return has_state_; }
33
-
34
31
  /// Instantiate a TextCall object to modify this text component's state.
35
32
  TextCall make_call() { return TextCall(this); }
36
33
 
@@ -48,7 +45,6 @@ class Text : public EntityBase {
48
45
  virtual void control(const std::string &value) = 0;
49
46
 
50
47
  CallbackManager<void(std::string)> state_callback_;
51
- bool has_state_{false};
52
48
  };
53
49
 
54
50
  } // namespace text
@@ -215,6 +215,7 @@ async def register_text_sensor(var, config):
215
215
  if not CORE.has_id(config[CONF_ID]):
216
216
  var = cg.Pvariable(config[CONF_ID], var)
217
217
  cg.add(cg.App.register_text_sensor(var))
218
+ CORE.register_platform_component("text_sensor", var)
218
219
  await setup_text_sensor_core_(var, config)
219
220
 
220
221
 
@@ -8,7 +8,9 @@ static const char *const TAG = "text_sensor";
8
8
 
9
9
  void TextSensor::publish_state(const std::string &state) {
10
10
  this->raw_state = state;
11
- this->raw_callback_.call(state);
11
+ if (this->raw_callback_) {
12
+ this->raw_callback_->call(state);
13
+ }
12
14
 
13
15
  ESP_LOGV(TAG, "'%s': Received new state %s", this->name_.c_str(), state.c_str());
14
16
 
@@ -53,20 +55,22 @@ void TextSensor::add_on_state_callback(std::function<void(std::string)> callback
53
55
  this->callback_.add(std::move(callback));
54
56
  }
55
57
  void TextSensor::add_on_raw_state_callback(std::function<void(std::string)> callback) {
56
- this->raw_callback_.add(std::move(callback));
58
+ if (!this->raw_callback_) {
59
+ this->raw_callback_ = make_unique<CallbackManager<void(std::string)>>();
60
+ }
61
+ this->raw_callback_->add(std::move(callback));
57
62
  }
58
63
 
59
64
  std::string TextSensor::get_state() const { return this->state; }
60
65
  std::string TextSensor::get_raw_state() const { return this->raw_state; }
61
66
  void TextSensor::internal_send_state_to_frontend(const std::string &state) {
62
67
  this->state = state;
63
- this->has_state_ = true;
68
+ this->set_has_state(true);
64
69
  ESP_LOGD(TAG, "'%s': Sending state '%s'", this->name_.c_str(), state.c_str());
65
70
  this->callback_.call(state);
66
71
  }
67
72
 
68
73
  std::string TextSensor::unique_id() { return ""; }
69
- bool TextSensor::has_state() { return this->has_state_; }
70
74
 
71
75
  } // namespace text_sensor
72
76
  } // namespace esphome
@@ -6,6 +6,7 @@
6
6
  #include "esphome/components/text_sensor/filter.h"
7
7
 
8
8
  #include <vector>
9
+ #include <memory>
9
10
 
10
11
  namespace esphome {
11
12
  namespace text_sensor {
@@ -33,6 +34,8 @@ namespace text_sensor {
33
34
 
34
35
  class TextSensor : public EntityBase, public EntityBase_DeviceClass {
35
36
  public:
37
+ TextSensor() = default;
38
+
36
39
  /// Getter-syntax for .state.
37
40
  std::string get_state() const;
38
41
  /// Getter-syntax for .raw_state
@@ -67,17 +70,14 @@ class TextSensor : public EntityBase, public EntityBase_DeviceClass {
67
70
  */
68
71
  virtual std::string unique_id();
69
72
 
70
- bool has_state();
71
-
72
73
  void internal_send_state_to_frontend(const std::string &state);
73
74
 
74
75
  protected:
75
- CallbackManager<void(std::string)> raw_callback_; ///< Storage for raw state callbacks.
76
- CallbackManager<void(std::string)> callback_; ///< Storage for filtered state callbacks.
76
+ std::unique_ptr<CallbackManager<void(std::string)>>
77
+ raw_callback_; ///< Storage for raw state callbacks (lazy allocated).
78
+ CallbackManager<void(std::string)> callback_; ///< Storage for filtered state callbacks.
77
79
 
78
80
  Filter *filter_list_{nullptr}; ///< Store all active filters.
79
-
80
- bool has_state_{false};
81
81
  };
82
82
 
83
83
  } // namespace text_sensor