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.
- esphome/__main__.py +20 -14
- esphome/components/a4988/a4988.cpp +1 -1
- esphome/components/absolute_humidity/absolute_humidity.cpp +6 -4
- esphome/components/ac_dimmer/ac_dimmer.cpp +4 -2
- esphome/components/adc/adc_sensor_esp32.cpp +5 -3
- esphome/components/adc/adc_sensor_esp8266.cpp +5 -3
- esphome/components/adc/adc_sensor_libretiny.cpp +5 -3
- esphome/components/adc/adc_sensor_rp2040.cpp +5 -3
- esphome/components/adc128s102/adc128s102.cpp +1 -1
- esphome/components/ade7880/ade7880.cpp +28 -17
- esphome/components/ade7953_base/ade7953_base.cpp +12 -9
- esphome/components/ade7953_i2c/ade7953_i2c.cpp +1 -1
- esphome/components/ade7953_spi/ade7953_spi.cpp +1 -1
- esphome/components/ads1115/ads1115.cpp +3 -5
- esphome/components/ads1118/ads1118.cpp +2 -1
- esphome/components/ags10/ags10.cpp +3 -2
- esphome/components/aht10/aht10.cpp +27 -29
- esphome/components/aic3204/aic3204.cpp +2 -2
- esphome/components/alarm_control_panel/__init__.py +1 -0
- esphome/components/am2315c/am2315c.cpp +2 -2
- esphome/components/am2320/am2320.cpp +2 -2
- esphome/components/am43/am43_base.h +1 -1
- esphome/components/am43/cover/am43_cover.cpp +4 -2
- esphome/components/analog_threshold/analog_threshold_binary_sensor.cpp +4 -2
- esphome/components/apds9306/apds9306.cpp +8 -5
- esphome/components/apds9960/apds9960.cpp +2 -2
- esphome/components/api/__init__.py +5 -0
- esphome/components/api/api_connection.cpp +753 -379
- esphome/components/api/api_connection.h +341 -283
- esphome/components/api/api_frame_helper.cpp +349 -344
- esphome/components/api/api_frame_helper.h +121 -94
- esphome/components/api/api_pb2.cpp +3 -0
- esphome/components/api/api_pb2.h +702 -227
- esphome/components/api/api_pb2_service.cpp +12 -688
- esphome/components/api/api_pb2_service.h +53 -207
- esphome/components/api/api_server.cpp +71 -29
- esphome/components/api/api_server.h +9 -0
- esphome/components/api/client.py +5 -4
- esphome/components/api/homeassistant_service.h +1 -1
- esphome/components/api/list_entities.cpp +1 -1
- esphome/components/api/proto.cpp +1 -0
- esphome/components/api/proto.h +5 -4
- esphome/components/api/subscribe_state.cpp +8 -16
- esphome/components/as3935/as3935.cpp +3 -3
- esphome/components/as5600/as5600.cpp +9 -7
- esphome/components/as7341/as7341.cpp +7 -5
- esphome/components/at581x/at581x.cpp +13 -10
- esphome/components/atm90e26/atm90e26.cpp +2 -2
- esphome/components/atm90e32/atm90e32.cpp +3 -3
- esphome/components/axs15231/touchscreen/axs15231_touchscreen.cpp +5 -3
- esphome/components/bang_bang/bang_bang_climate.cpp +8 -5
- esphome/components/bedjet/bedjet_hub.cpp +6 -4
- esphome/components/beken_spi_led_strip/led_strip.cpp +11 -7
- esphome/components/bh1750/bh1750.cpp +2 -2
- esphome/components/binary_sensor/__init__.py +1 -0
- esphome/components/binary_sensor/automation.cpp +1 -2
- esphome/components/bl0906/bl0906.cpp +1 -1
- esphome/components/bl0942/bl0942.cpp +11 -8
- esphome/components/bl0942/sensor.py +1 -1
- esphome/components/ble_client/__init__.py +5 -1
- esphome/components/ble_client/output/ble_binary_output.cpp +6 -3
- esphome/components/ble_client/sensor/ble_sensor.cpp +9 -6
- esphome/components/ble_client/text_sensor/ble_text_sensor.cpp +8 -5
- esphome/components/bluetooth_proxy/__init__.py +5 -1
- esphome/components/bluetooth_proxy/bluetooth_connection.cpp +5 -5
- esphome/components/bluetooth_proxy/bluetooth_proxy.cpp +18 -16
- esphome/components/bluetooth_proxy/bluetooth_proxy.h +1 -1
- esphome/components/bme280_base/bme280_base.cpp +5 -6
- esphome/components/bme680/bme680.cpp +3 -3
- esphome/components/bme680/sensor.py +2 -2
- esphome/components/bme680_bsec/bme680_bsec.cpp +11 -7
- esphome/components/bme680_bsec/sensor.py +7 -3
- esphome/components/bme68x_bsec2/__init__.py +6 -5
- esphome/components/bme68x_bsec2/bme68x_bsec2.cpp +17 -13
- esphome/components/bme68x_bsec2/sensor.py +4 -4
- esphome/components/bme68x_bsec2_i2c/bme68x_bsec2_i2c.cpp +1 -0
- esphome/components/bmi160/bmi160.cpp +11 -11
- esphome/components/bmp085/bmp085.cpp +2 -2
- esphome/components/bmp280_base/bmp280_base.cpp +3 -3
- esphome/components/bmp3xx_base/bmp3xx_base.cpp +13 -13
- esphome/components/bmp581/bmp581.cpp +33 -27
- esphome/components/bp1658cj/bp1658cj.cpp +5 -3
- esphome/components/bp5758d/bp5758d.cpp +1 -1
- esphome/components/button/__init__.py +1 -0
- esphome/components/canbus/canbus.cpp +1 -1
- esphome/components/cap1188/cap1188.cpp +6 -4
- esphome/components/captive_portal/captive_portal.cpp +1 -1
- esphome/components/ccs811/ccs811.cpp +3 -2
- esphome/components/cd74hc4067/cd74hc4067.cpp +1 -1
- esphome/components/ch422g/ch422g.cpp +2 -2
- esphome/components/chsc6x/chsc6x_touchscreen.cpp +6 -4
- esphome/components/climate/__init__.py +1 -0
- esphome/components/climate/climate.cpp +12 -7
- esphome/components/climate/climate.h +1 -1
- esphome/components/climate_ir/climate_ir.cpp +7 -4
- esphome/components/cm1106/__init__.py +1 -0
- esphome/components/cm1106/cm1106.cpp +112 -0
- esphome/components/cm1106/cm1106.h +40 -0
- esphome/components/cm1106/sensor.py +72 -0
- esphome/components/const/__init__.py +1 -0
- esphome/components/cover/__init__.py +1 -0
- esphome/components/cs5460a/cs5460a.cpp +16 -11
- esphome/components/cse7761/cse7761.cpp +2 -2
- esphome/components/cse7766/cse7766.cpp +0 -5
- esphome/components/cse7766/cse7766.h +5 -1
- esphome/components/cst226/touchscreen/cst226_touchscreen.cpp +1 -1
- esphome/components/cst816/touchscreen/cst816_touchscreen.cpp +6 -3
- esphome/components/current_based/current_based_cover.cpp +4 -2
- esphome/components/dac7678/dac7678_output.cpp +4 -4
- esphome/components/dallas_temp/dallas_temp.cpp +2 -3
- esphome/components/daly_bms/daly_bms.cpp +2 -1
- esphome/components/dashboard_import/__init__.py +1 -2
- esphome/components/datetime/__init__.py +3 -1
- esphome/components/datetime/date_entity.cpp +5 -5
- esphome/components/datetime/datetime_base.h +0 -5
- esphome/components/datetime/datetime_entity.cpp +8 -8
- esphome/components/datetime/time_entity.cpp +4 -4
- esphome/components/debug/debug_component.cpp +1 -1
- esphome/components/debug/debug_component.h +1 -1
- esphome/components/debug/debug_esp32.cpp +4 -2
- esphome/components/deep_sleep/deep_sleep_component.cpp +11 -5
- esphome/components/deep_sleep/deep_sleep_esp32.cpp +7 -5
- esphome/components/demo/__init__.py +206 -0
- esphome/components/demo/demo_alarm_control_panel.h +65 -0
- esphome/components/demo/demo_button.h +15 -0
- esphome/components/demo/demo_date.h +34 -0
- esphome/components/demo/demo_datetime.h +40 -0
- esphome/components/demo/demo_lock.h +17 -0
- esphome/components/demo/demo_select.h +15 -0
- esphome/components/demo/demo_text.h +18 -0
- esphome/components/demo/demo_time.h +34 -0
- esphome/components/demo/demo_valve.h +54 -0
- esphome/components/dfrobot_sen0395/commands.cpp +3 -3
- esphome/components/dht/dht.cpp +29 -50
- esphome/components/dht12/dht12.cpp +2 -2
- esphome/components/display/display.h +5 -3
- esphome/components/dps310/dps310.cpp +7 -5
- esphome/components/ds1307/ds1307.cpp +2 -2
- esphome/components/dsmr/dsmr.cpp +5 -3
- esphome/components/duty_cycle/duty_cycle_sensor.cpp +2 -2
- esphome/components/duty_time/duty_time_sensor.cpp +5 -3
- esphome/components/ee895/ee895.cpp +3 -3
- esphome/components/ektf2232/touchscreen/ektf2232.cpp +1 -1
- esphome/components/emc2101/emc2101.cpp +11 -9
- esphome/components/ens160_base/ens160_base.cpp +2 -2
- esphome/components/ens210/ens210.cpp +2 -2
- esphome/components/es7210/es7210.cpp +6 -4
- esphome/components/es7243e/es7243e.cpp +1 -1
- esphome/components/es8156/es8156.cpp +1 -1
- esphome/components/es8311/es8311.cpp +8 -6
- esphome/components/es8388/__init__.py +0 -0
- esphome/components/es8388/audio_dac.py +26 -0
- esphome/components/es8388/es8388.cpp +289 -0
- esphome/components/es8388/es8388.h +81 -0
- esphome/components/es8388/es8388_const.h +83 -0
- esphome/components/es8388/select/__init__.py +47 -0
- esphome/components/es8388/select/adc_input_mic_select.cpp +12 -0
- esphome/components/es8388/select/adc_input_mic_select.h +15 -0
- esphome/components/es8388/select/dac_output_select.cpp +12 -0
- esphome/components/es8388/select/dac_output_select.h +15 -0
- esphome/components/esp32/__init__.py +118 -23
- esphome/components/esp32/boards.py +208 -125
- esphome/components/esp32/const.py +6 -0
- esphome/components/esp32/gpio.py +14 -1
- esphome/components/esp32/gpio_esp32_c5.py +45 -0
- esphome/components/esp32/gpio_esp32_p4.py +43 -0
- esphome/components/esp32/preferences.cpp +7 -7
- esphome/components/esp32_ble/__init__.py +115 -0
- esphome/components/esp32_ble/ble.cpp +101 -54
- esphome/components/esp32_ble/ble.h +24 -5
- esphome/components/esp32_ble/ble_event.h +172 -32
- esphome/components/esp32_ble/ble_scan_result.h +24 -0
- esphome/components/esp32_ble/ble_uuid.h +1 -1
- esphome/components/esp32_ble/queue.h +53 -27
- esphome/components/esp32_ble_client/ble_client_base.cpp +4 -2
- esphome/components/esp32_ble_server/__init__.py +4 -1
- esphome/components/esp32_ble_server/ble_characteristic.cpp +1 -0
- esphome/components/esp32_ble_server/ble_server.h +0 -1
- esphome/components/esp32_ble_tracker/__init__.py +7 -2
- esphome/components/esp32_ble_tracker/esp32_ble_tracker.cpp +107 -75
- esphome/components/esp32_ble_tracker/esp32_ble_tracker.h +16 -16
- esphome/components/esp32_camera/esp32_camera.cpp +35 -27
- esphome/components/esp32_camera_web_server/camera_web_server.cpp +4 -2
- esphome/components/esp32_dac/esp32_dac.cpp +2 -2
- esphome/components/esp32_improv/__init__.py +5 -1
- esphome/components/esp32_improv/esp32_improv_component.cpp +2 -2
- esphome/components/esp32_rmt_led_strip/led_strip.cpp +11 -7
- esphome/components/esp32_rmt_led_strip/light.py +5 -1
- esphome/components/esp32_touch/esp32_touch.cpp +12 -8
- esphome/components/esp8266/preferences.cpp +6 -6
- esphome/components/esp8266_pwm/esp8266_pwm.cpp +3 -3
- esphome/components/esp_ldo/__init__.py +91 -0
- esphome/components/esp_ldo/esp_ldo.cpp +43 -0
- esphome/components/esp_ldo/esp_ldo.h +43 -0
- esphome/components/esphome/ota/ota_esphome.cpp +15 -8
- esphome/components/ethernet/ethernet_component.cpp +38 -26
- esphome/components/ethernet/ethernet_component.h +1 -1
- esphome/components/event/__init__.py +1 -0
- esphome/components/exposure_notifications/exposure_notifications.cpp +1 -1
- esphome/components/ezo/ezo.cpp +1 -1
- esphome/components/ezo_pmp/ezo_pmp.cpp +1 -1
- esphome/components/factory_reset/button/factory_reset_button.cpp +1 -1
- esphome/components/factory_reset/switch/factory_reset_switch.cpp +1 -1
- esphome/components/fan/__init__.py +1 -0
- esphome/components/fan/fan.cpp +30 -19
- esphome/components/fastled_base/fastled_light.cpp +7 -5
- esphome/components/fingerprint_grow/fingerprint_grow.cpp +8 -6
- esphome/components/fs3000/fs3000.cpp +1 -1
- esphome/components/ft5x06/touchscreen/ft5x06_touchscreen.cpp +7 -4
- esphome/components/ft63x6/ft63x6.cpp +5 -3
- esphome/components/gcja5/gcja5.cpp +0 -12
- esphome/components/gcja5/gcja5.h +8 -3
- esphome/components/gdk101/gdk101.cpp +2 -2
- esphome/components/globals/globals_component.h +13 -10
- esphome/components/gp2y1010au0f/gp2y1010au0f.cpp +4 -2
- esphome/components/gp8403/gp8403.cpp +4 -2
- esphome/components/gp8403/output/gp8403_output.cpp +4 -2
- esphome/components/gpio/one_wire/gpio_one_wire.cpp +2 -2
- esphome/components/gpio/output/gpio_binary_output.cpp +1 -1
- esphome/components/gpio/switch/gpio_switch.cpp +1 -1
- esphome/components/graphical_display_menu/graphical_display_menu.cpp +12 -8
- esphome/components/grove_gas_mc_v2/grove_gas_mc_v2.cpp +5 -6
- esphome/components/grove_tb6612fng/grove_tb6612fng.cpp +1 -1
- esphome/components/grove_tb6612fng/grove_tb6612fng.h +1 -1
- esphome/components/growatt_solar/growatt_solar.cpp +6 -3
- esphome/components/gt911/touchscreen/gt911_touchscreen.cpp +1 -1
- esphome/components/haier/haier_base.cpp +2 -2
- esphome/components/haier/hon_climate.cpp +13 -6
- esphome/components/havells_solar/havells_solar.cpp +5 -2
- esphome/components/hbridge/switch/hbridge_switch.cpp +1 -1
- esphome/components/hdc1080/hdc1080.cpp +2 -2
- esphome/components/he60r/he60r.cpp +4 -2
- esphome/components/hlw8012/hlw8012.cpp +6 -4
- esphome/components/hm3301/hm3301.cpp +2 -2
- esphome/components/hmc5883l/hmc5883l.cpp +2 -2
- esphome/components/homeassistant/time/homeassistant_time.cpp +4 -2
- esphome/components/honeywell_hih_i2c/honeywell_hih.cpp +4 -4
- esphome/components/honeywellabp/honeywellabp.cpp +4 -2
- esphome/components/honeywellabp2_i2c/honeywellabp2.cpp +8 -6
- esphome/components/hte501/hte501.cpp +3 -2
- esphome/components/http_request/__init__.py +2 -2
- esphome/components/http_request/http_request.cpp +7 -5
- esphome/components/http_request/http_request_idf.cpp +4 -2
- esphome/components/http_request/ota/ota_http_request.cpp +1 -1
- esphome/components/htu21d/htu21d.cpp +2 -2
- esphome/components/htu31d/htu31d.cpp +2 -2
- esphome/components/hx711/hx711.cpp +2 -2
- esphome/components/hydreon_rgxx/hydreon_rgxx.cpp +5 -3
- esphome/components/hyt271/hyt271.cpp +2 -2
- esphome/components/i2c/i2c_bus_arduino.cpp +14 -11
- esphome/components/i2c/i2c_bus_esp_idf.cpp +13 -11
- esphome/components/i2s_audio/__init__.py +2 -0
- esphome/components/i2s_audio/i2s_audio.cpp +3 -4
- esphome/components/i2s_audio/i2s_audio.h +1 -1
- esphome/components/i2s_audio/media_player/__init__.py +1 -1
- esphome/components/i2s_audio/media_player/i2s_audio_media_player.cpp +5 -3
- esphome/components/i2s_audio/microphone/i2s_audio_microphone.cpp +13 -10
- esphome/components/i2s_audio/speaker/i2s_audio_speaker.cpp +1 -1
- esphome/components/iaqcore/iaqcore.cpp +3 -3
- esphome/components/ili9xxx/ili9xxx_display.cpp +12 -7
- esphome/components/ili9xxx/ili9xxx_display.h +1 -1
- esphome/components/image/image.cpp +1 -0
- esphome/components/ina219/ina219.cpp +2 -2
- esphome/components/ina226/ina226.cpp +8 -5
- esphome/components/ina260/ina260.cpp +1 -1
- esphome/components/ina2xx_base/ina2xx_base.cpp +13 -9
- esphome/components/ina3221/ina3221.cpp +2 -2
- esphome/components/inkplate6/display.py +12 -2
- esphome/components/inkplate6/inkplate.cpp +13 -9
- esphome/components/inkplate6/inkplate.h +7 -6
- esphome/components/integration/integration_sensor.cpp +1 -1
- esphome/components/internal_temperature/internal_temperature.cpp +4 -4
- esphome/components/json/json_util.cpp +4 -5
- esphome/components/kamstrup_kmp/kamstrup_kmp.cpp +1 -1
- esphome/components/key_collector/key_collector.cpp +4 -2
- esphome/components/kmeteriso/kmeteriso.cpp +4 -4
- esphome/components/kuntze/kuntze.cpp +4 -2
- esphome/components/lc709203f/__init__.py +1 -0
- esphome/components/lc709203f/lc709203f.cpp +299 -0
- esphome/components/lc709203f/lc709203f.h +55 -0
- esphome/components/lc709203f/sensor.py +93 -0
- esphome/components/lcd_base/lcd_display.cpp +2 -2
- esphome/components/lcd_gpio/gpio_lcd_display.cpp +5 -3
- esphome/components/lcd_menu/lcd_menu.cpp +6 -4
- esphome/components/lcd_pcf8574/pcf8574_display.cpp +6 -4
- esphome/components/ld2410/ld2410.cpp +6 -7
- esphome/components/ld2420/ld2420.cpp +9 -7
- esphome/components/ld2450/ld2450.cpp +6 -4
- esphome/components/ld2450/sensor.py +2 -2
- esphome/components/ledc/ledc_output.cpp +32 -28
- esphome/components/libretiny/const.py +1 -1
- esphome/components/libretiny/preferences.cpp +6 -7
- esphome/components/light/__init__.py +2 -1
- esphome/components/light/esp_hsv_color.h +1 -1
- esphome/components/light/light_state.cpp +9 -5
- esphome/components/light/light_transformer.h +1 -1
- esphome/components/lightwaverf/LwTx.cpp +1 -1
- esphome/components/lightwaverf/lightwaverf.cpp +1 -1
- esphome/components/lilygo_t5_47/touchscreen/lilygo_t5_47_touchscreen.cpp +1 -1
- esphome/components/lock/__init__.py +1 -0
- esphome/components/lock/lock.h +1 -1
- esphome/components/logger/__init__.py +6 -0
- esphome/components/logger/logger.cpp +11 -20
- esphome/components/logger/logger.h +1 -2
- esphome/components/logger/logger_esp32.cpp +5 -5
- esphome/components/ltr390/ltr390.cpp +8 -5
- esphome/components/ltr501/ltr501.cpp +19 -14
- esphome/components/ltr_als_ps/ltr_als_ps.cpp +20 -13
- esphome/components/lvgl/__init__.py +2 -2
- esphome/components/lvgl/automation.py +5 -4
- esphome/components/lvgl/defines.py +0 -2
- esphome/components/lvgl/lv_validation.py +1 -3
- esphome/components/lvgl/lvcode.py +7 -8
- esphome/components/lvgl/lvgl_esphome.cpp +26 -10
- esphome/components/lvgl/schemas.py +22 -23
- esphome/components/lvgl/trigger.py +8 -3
- esphome/components/lvgl/widgets/__init__.py +2 -2
- esphome/components/lvgl/widgets/canvas.py +9 -3
- esphome/components/lvgl/widgets/line.py +2 -1
- esphome/components/lvgl/widgets/tabview.py +7 -0
- esphome/components/m5stack_8angle/m5stack_8angle.cpp +3 -3
- esphome/components/matrix_keypad/matrix_keypad.cpp +2 -2
- esphome/components/max17043/max17043.cpp +2 -2
- esphome/components/max31855/max31855.cpp +2 -1
- esphome/components/max31856/max31856.cpp +9 -11
- esphome/components/max31865/max31865.cpp +6 -4
- esphome/components/max44009/max44009.cpp +2 -2
- esphome/components/max6675/max6675.cpp +1 -1
- esphome/components/max6956/max6956.cpp +5 -3
- esphome/components/max7219/max7219.cpp +8 -6
- esphome/components/max7219digit/automation.h +52 -0
- esphome/components/max7219digit/display.py +93 -1
- esphome/components/max7219digit/max7219digit.cpp +16 -13
- esphome/components/max9611/max9611.cpp +9 -6
- esphome/components/mcp23008/mcp23008.cpp +1 -1
- esphome/components/mcp23016/mcp23016.cpp +1 -1
- esphome/components/mcp23017/mcp23017.cpp +1 -1
- esphome/components/mcp23s08/mcp23s08.cpp +1 -1
- esphome/components/mcp23s17/mcp23s17.cpp +1 -1
- esphome/components/mcp3008/mcp3008.cpp +1 -1
- esphome/components/mcp3008/sensor/mcp3008_sensor.cpp +5 -3
- esphome/components/mcp3204/mcp3204.cpp +1 -1
- esphome/components/mcp4461/mcp4461.cpp +2 -2
- esphome/components/mcp4725/mcp4725.cpp +2 -2
- esphome/components/mcp4728/mcp4728.cpp +2 -2
- esphome/components/mcp9600/mcp9600.cpp +1 -1
- esphome/components/mcp9808/mcp9808.cpp +4 -4
- esphome/components/mdns/mdns_component.cpp +8 -2
- esphome/components/mdns/mdns_component.h +3 -1
- esphome/components/mdns/mdns_esp32.cpp +2 -2
- esphome/components/media_player/__init__.py +1 -0
- esphome/components/micro_wake_word/micro_wake_word.cpp +1 -1
- esphome/components/micro_wake_word/streaming_model.cpp +10 -6
- esphome/components/micronova/micronova.h +2 -2
- esphome/components/mics_4514/mics_4514.cpp +2 -2
- esphome/components/midea/air_conditioner.cpp +7 -5
- esphome/components/midea_ir/midea_ir.cpp +1 -1
- esphome/components/mipi_spi/mipi_spi.cpp +24 -15
- esphome/components/mixer/speaker/mixer_speaker.cpp +8 -4
- esphome/components/mlx90393/sensor_mlx90393.cpp +2 -2
- esphome/components/mlx90614/mlx90614.cpp +4 -3
- esphome/components/mmc5603/mmc5603.cpp +2 -2
- esphome/components/mmc5983/mmc5983.cpp +1 -1
- esphome/components/modbus/modbus.cpp +7 -5
- esphome/components/modbus_controller/modbus_controller.cpp +6 -4
- esphome/components/modbus_controller/output/modbus_output.cpp +10 -6
- esphome/components/modbus_controller/switch/__init__.py +6 -2
- esphome/components/modbus_controller/switch/modbus_switch.cpp +4 -0
- esphome/components/modbus_controller/switch/modbus_switch.h +3 -0
- esphome/components/mpl3115a2/mpl3115a2.cpp +3 -2
- esphome/components/mpr121/mpr121.cpp +2 -2
- esphome/components/mpu6050/mpu6050.cpp +6 -6
- esphome/components/mpu6886/mpu6886.cpp +6 -6
- esphome/components/mqtt/mqtt_alarm_control_panel.cpp +7 -3
- esphome/components/mqtt/mqtt_backend_esp32.cpp +1 -1
- esphome/components/mqtt/mqtt_client.cpp +31 -24
- esphome/components/mqtt/mqtt_component.cpp +3 -3
- esphome/components/mqtt/mqtt_cover.cpp +8 -4
- esphome/components/mqtt/mqtt_fan.cpp +12 -6
- esphome/components/mqtt/mqtt_valve.cpp +4 -2
- esphome/components/ms5611/ms5611.cpp +2 -2
- esphome/components/ms8607/ms8607.cpp +2 -2
- esphome/components/msa3xx/msa3xx.cpp +16 -12
- esphome/components/my9231/my9231.cpp +7 -5
- esphome/components/nau7802/nau7802.cpp +6 -4
- esphome/components/neopixelbus/neopixelbus_light.h +2 -2
- esphome/components/network/ip_address.h +1 -1
- esphome/components/network/util.cpp +13 -0
- esphome/components/nextion/base_component.py +2 -0
- esphome/components/nextion/binary_sensor/nextion_binarysensor.cpp +3 -4
- esphome/components/nextion/display.py +34 -22
- esphome/components/nextion/nextion.cpp +182 -143
- esphome/components/nextion/nextion.h +36 -0
- esphome/components/nextion/nextion_commands.cpp +3 -3
- esphome/components/nextion/nextion_upload_arduino.cpp +69 -69
- esphome/components/nextion/nextion_upload_idf.cpp +79 -80
- esphome/components/nextion/sensor/nextion_sensor.cpp +5 -5
- esphome/components/nextion/switch/nextion_switch.cpp +2 -2
- esphome/components/nextion/text_sensor/nextion_textsensor.cpp +3 -3
- esphome/components/nfc/nci_message.h +1 -1
- esphome/components/nfc/ndef_record.h +1 -1
- esphome/components/nfc/ndef_record_text.h +1 -1
- esphome/components/nfc/ndef_record_uri.h +1 -1
- esphome/components/nfc/nfc.h +1 -1
- esphome/components/nfc/nfc_tag.h +1 -1
- esphome/components/noblex/noblex.cpp +1 -1
- esphome/components/npi19/npi19.cpp +5 -7
- esphome/components/number/__init__.py +11 -0
- esphome/components/number/number.cpp +1 -1
- esphome/components/number/number.h +0 -4
- esphome/components/online_image/__init__.py +13 -1
- esphome/components/online_image/online_image.cpp +26 -4
- esphome/components/online_image/online_image.h +21 -4
- esphome/components/opentherm/generate.py +3 -3
- esphome/components/opentherm/hub.cpp +11 -7
- esphome/components/opentherm/number/number.cpp +5 -3
- esphome/components/opentherm/opentherm.h +1 -1
- esphome/components/opentherm/schema.py +13 -13
- esphome/components/opentherm/validate.py +1 -1
- esphome/components/openthread/__init__.py +146 -0
- esphome/components/openthread/const.py +10 -0
- esphome/components/openthread/openthread.cpp +206 -0
- esphome/components/openthread/openthread.h +68 -0
- esphome/components/openthread/openthread_esp.cpp +164 -0
- esphome/components/openthread/tlv.py +58 -0
- esphome/components/openthread_info/__init__.py +0 -0
- esphome/components/openthread_info/openthread_info_text_sensor.cpp +24 -0
- esphome/components/openthread_info/openthread_info_text_sensor.h +218 -0
- esphome/components/openthread_info/text_sensor.py +105 -0
- esphome/components/output/float_output.cpp +1 -1
- esphome/components/output/switch/output_switch.cpp +1 -1
- esphome/components/packet_transport/packet_transport.cpp +6 -4
- esphome/components/pca6416a/pca6416a.cpp +2 -2
- esphome/components/pca9554/pca9554.cpp +6 -4
- esphome/components/pca9685/pca9685_output.cpp +12 -8
- esphome/components/pcd8544/pcd_8544.cpp +1 -1
- esphome/components/pcf85063/pcf85063.cpp +2 -2
- esphome/components/pcf8563/pcf8563.cpp +2 -2
- esphome/components/pcf8574/pcf8574.cpp +2 -2
- esphome/components/pid/pid_climate.cpp +8 -5
- esphome/components/pid/pid_climate.h +1 -1
- esphome/components/pid/sensor/pid_climate_sensor.cpp +1 -1
- esphome/components/pipsolar/output/pipsolar_output.cpp +1 -1
- esphome/components/pipsolar/pipsolar.cpp +3 -3
- esphome/components/pm1006/pm1006.cpp +3 -7
- esphome/components/pm1006/pm1006.h +4 -1
- esphome/components/pm2005/pm2005.cpp +12 -13
- esphome/components/pm2005/sensor.py +1 -1
- esphome/components/pmsa003i/pmsa003i.cpp +2 -2
- esphome/components/pmsx003/pmsx003.cpp +0 -4
- esphome/components/pmsx003/pmsx003.h +5 -2
- esphome/components/pmwcs3/pmwcs3.cpp +9 -13
- esphome/components/pmwcs3/pmwcs3.h +0 -1
- esphome/components/pn532/pn532.cpp +7 -7
- esphome/components/pn532/pn532.h +1 -1
- esphome/components/pn532_spi/pn532_spi.cpp +1 -1
- esphome/components/pn7150/pn7150.cpp +4 -4
- esphome/components/pn7160/pn7160.cpp +4 -4
- esphome/components/power_supply/power_supply.cpp +6 -4
- esphome/components/power_supply/power_supply.h +1 -1
- esphome/components/prometheus/__init__.py +0 -1
- esphome/components/psram/__init__.py +59 -35
- esphome/components/pulse_counter/pulse_counter_sensor.cpp +7 -4
- esphome/components/pvvx_mithermometer/display/pvvx_display.cpp +8 -5
- esphome/components/pylontech/pylontech.cpp +2 -2
- esphome/components/pylontech/sensor/pylontech_sensor.cpp +4 -2
- esphome/components/pylontech/text_sensor/pylontech_text_sensor.cpp +4 -2
- esphome/components/pzemac/pzemac.cpp +4 -2
- esphome/components/pzemdc/pzemdc.cpp +4 -2
- esphome/components/qmc5883l/qmc5883l.cpp +2 -2
- esphome/components/qmp6988/qmp6988.cpp +2 -2
- esphome/components/qmp6988/qmp6988.h +1 -1
- esphome/components/qr_code/qr_code.cpp +5 -3
- esphome/components/qspi_dbi/qspi_dbi.cpp +1 -1
- esphome/components/qwiic_pir/qwiic_pir.cpp +26 -28
- esphome/components/rc522/rc522.cpp +5 -5
- esphome/components/rdm6300/rdm6300.cpp +1 -0
- esphome/components/remote_receiver/__init__.py +10 -2
- esphome/components/remote_receiver/remote_receiver_esp32.cpp +22 -12
- esphome/components/remote_receiver/remote_receiver_esp8266.cpp +10 -7
- esphome/components/remote_receiver/remote_receiver_libretiny.cpp +10 -7
- esphome/components/remote_transmitter/__init__.py +10 -2
- esphome/components/remote_transmitter/remote_transmitter_esp32.cpp +10 -6
- esphome/components/remote_transmitter/remote_transmitter_esp8266.cpp +5 -3
- esphome/components/remote_transmitter/remote_transmitter_libretiny.cpp +5 -3
- esphome/components/resistance/resistance_sensor.cpp +6 -3
- esphome/components/restart/button/restart_button.cpp +1 -1
- esphome/components/restart/switch/restart_switch.cpp +1 -1
- esphome/components/rotary_encoder/rotary_encoder.cpp +2 -2
- esphome/components/rp2040/__init__.py +7 -0
- esphome/components/rp2040/core.cpp +8 -1
- esphome/components/rp2040/preferences.cpp +3 -3
- esphome/components/rp2040_pio_led_strip/led_strip.cpp +11 -8
- esphome/components/rp2040_pio_led_strip/light.py +1 -1
- esphome/components/rp2040_pwm/rp2040_pwm.cpp +1 -1
- esphome/components/rpi_dpi_rgb/rpi_dpi_rgb.cpp +1 -1
- esphome/components/rtttl/rtttl.cpp +11 -9
- esphome/components/safe_mode/button/safe_mode_button.cpp +1 -1
- esphome/components/safe_mode/safe_mode.cpp +9 -8
- esphome/components/safe_mode/switch/safe_mode_switch.cpp +1 -1
- esphome/components/scd30/scd30.cpp +11 -8
- esphome/components/scd4x/scd4x.cpp +12 -8
- esphome/components/sdl/display.py +40 -0
- esphome/components/sdl/sdl_esphome.cpp +2 -2
- esphome/components/sdl/sdl_esphome.h +8 -0
- esphome/components/sdm_meter/sdm_meter.cpp +5 -2
- esphome/components/sdp3x/sdp3x.cpp +11 -11
- esphome/components/sds011/sds011.cpp +5 -6
- esphome/components/sds011/sds011.h +4 -1
- esphome/components/seeed_mr24hpc1/seeed_mr24hpc1.cpp +3 -2
- esphome/components/seeed_mr60bha2/seeed_mr60bha2.cpp +1 -0
- esphome/components/seeed_mr60fda2/seeed_mr60fda2.cpp +3 -2
- esphome/components/selec_meter/selec_meter.cpp +5 -2
- esphome/components/select/__init__.py +1 -0
- esphome/components/select/select.cpp +1 -1
- esphome/components/select/select.h +0 -4
- esphome/components/sen0321/sen0321.cpp +2 -2
- esphome/components/sen21231/sen21231.cpp +1 -1
- esphome/components/sen5x/sen5x.cpp +10 -7
- esphome/components/sensirion_common/i2c_sensirion.cpp +2 -1
- esphome/components/sensirion_common/i2c_sensirion.h +1 -0
- esphome/components/sensor/__init__.py +11 -1
- esphome/components/sensor/filter.h +1 -1
- esphome/components/sensor/sensor.cpp +8 -4
- esphome/components/sensor/sensor.h +12 -11
- esphome/components/servo/servo.cpp +12 -9
- esphome/components/servo/servo.h +1 -1
- esphome/components/sfa30/sfa30.cpp +1 -1
- esphome/components/sgp30/sgp30.cpp +10 -8
- esphome/components/sgp4x/sgp4x.cpp +49 -61
- esphome/components/sgp4x/sgp4x.h +0 -1
- esphome/components/shelly_dimmer/shelly_dimmer.cpp +11 -7
- esphome/components/sht3xd/sht3xd.cpp +1 -1
- esphome/components/sht4x/sht4x.cpp +2 -2
- esphome/components/shtcx/shtcx.cpp +13 -16
- esphome/components/shutdown/button/shutdown_button.cpp +1 -1
- esphome/components/shutdown/switch/shutdown_switch.cpp +1 -1
- esphome/components/sim800l/sim800l.cpp +2 -2
- esphome/components/slow_pwm/slow_pwm_output.cpp +4 -2
- esphome/components/sm16716/sm16716.cpp +1 -1
- esphome/components/sm2135/sm2135.cpp +1 -1
- esphome/components/sm2235/sm2235.cpp +5 -3
- esphome/components/sm2335/sm2335.cpp +5 -3
- esphome/components/sml/sml.cpp +1 -1
- esphome/components/sn74hc165/sn74hc165.cpp +1 -2
- esphome/components/sn74hc595/sn74hc595.cpp +1 -2
- esphome/components/sntp/sntp_component.cpp +1 -1
- esphome/components/socket/__init__.py +2 -0
- esphome/components/socket/bsd_sockets_impl.cpp +51 -7
- esphome/components/socket/lwip_raw_tcp_impl.cpp +5 -0
- esphome/components/socket/lwip_sockets_impl.cpp +51 -7
- esphome/components/socket/socket.cpp +31 -0
- esphome/components/socket/socket.h +27 -1
- esphome/components/sonoff_d1/sonoff_d1.cpp +7 -4
- esphome/components/sonoff_d1/sonoff_d1.h +2 -2
- esphome/components/sound_level/sound_level.cpp +4 -2
- esphome/components/speaker/media_player/__init__.py +3 -0
- esphome/components/speaker/media_player/speaker_media_player.cpp +1 -3
- esphome/components/speaker/media_player/speaker_media_player.h +6 -0
- esphome/components/spi/__init__.py +10 -2
- esphome/components/spi/spi.cpp +4 -4
- esphome/components/spi_device/spi_device.cpp +1 -2
- esphome/components/sprinkler/sprinkler.cpp +9 -6
- esphome/components/sps30/sps30.cpp +16 -15
- esphome/components/ssd1306_base/ssd1306_base.cpp +1 -1
- esphome/components/ssd1306_i2c/ssd1306_i2c.cpp +11 -8
- esphome/components/ssd1306_spi/ssd1306_spi.cpp +10 -7
- esphome/components/ssd1322_base/ssd1322_base.cpp +1 -1
- esphome/components/ssd1322_spi/ssd1322_spi.cpp +1 -1
- esphome/components/ssd1325_base/ssd1325_base.cpp +1 -1
- esphome/components/ssd1325_spi/ssd1325_spi.cpp +1 -1
- esphome/components/ssd1327_base/ssd1327_base.cpp +1 -1
- esphome/components/ssd1327_i2c/ssd1327_i2c.cpp +2 -2
- esphome/components/ssd1327_spi/ssd1327_spi.cpp +1 -1
- esphome/components/ssd1331_base/ssd1331_base.cpp +1 -1
- esphome/components/ssd1331_spi/ssd1331_spi.cpp +1 -1
- esphome/components/ssd1351_base/ssd1351_base.cpp +1 -1
- esphome/components/ssd1351_spi/ssd1351_spi.cpp +1 -1
- esphome/components/st7567_base/st7567_base.cpp +3 -3
- esphome/components/st7567_i2c/st7567_i2c.cpp +7 -5
- esphome/components/st7567_spi/st7567_spi.cpp +1 -1
- esphome/components/st7701s/st7701s.cpp +4 -2
- esphome/components/st7735/st7735.cpp +3 -3
- esphome/components/st7789v/st7789v.cpp +10 -7
- esphome/components/st7920/st7920.cpp +6 -4
- esphome/components/statsd/statsd.cpp +9 -5
- esphome/components/status_led/light/status_led_light.cpp +3 -3
- esphome/components/status_led/light/status_led_light.h +1 -1
- esphome/components/status_led/status_led.cpp +1 -1
- esphome/components/stepper/stepper.h +5 -3
- esphome/components/sts3x/sts3x.cpp +2 -2
- esphome/components/switch/__init__.py +1 -0
- esphome/components/switch/switch.cpp +18 -12
- esphome/components/switch/switch.h +1 -1
- esphome/components/sx1509/__init__.py +53 -20
- esphome/components/sx1509/sx1509.cpp +29 -5
- esphome/components/sx1509/sx1509.h +9 -1
- esphome/components/t6615/t6615.cpp +1 -0
- esphome/components/tc74/tc74.cpp +1 -1
- esphome/components/tca9548a/tca9548a.cpp +1 -1
- esphome/components/tca9555/tca9555.cpp +2 -2
- esphome/components/tcs34725/tcs34725.cpp +4 -4
- esphome/components/tee501/tee501.cpp +3 -2
- esphome/components/tem3200/tem3200.cpp +5 -6
- esphome/components/template/alarm_control_panel/__init__.py +6 -0
- esphome/components/template/alarm_control_panel/template_alarm_control_panel.cpp +43 -12
- esphome/components/template/alarm_control_panel/template_alarm_control_panel.h +4 -1
- esphome/components/template/cover/template_cover.cpp +1 -1
- esphome/components/template/select/template_select.cpp +6 -4
- esphome/components/template/text/template_text.cpp +2 -3
- esphome/components/template/valve/template_valve.cpp +5 -3
- esphome/components/text/__init__.py +10 -11
- esphome/components/text/text.cpp +1 -1
- esphome/components/text/text.h +0 -4
- esphome/components/text_sensor/__init__.py +1 -0
- esphome/components/text_sensor/text_sensor.cpp +8 -4
- esphome/components/text_sensor/text_sensor.h +6 -6
- esphome/components/thermostat/thermostat_climate.cpp +67 -43
- esphome/components/time/__init__.py +1 -2
- esphome/components/time_based/time_based_cover.cpp +4 -2
- esphome/components/tlc59208f/tlc59208f_output.cpp +8 -6
- esphome/components/tm1621/tm1621.cpp +3 -3
- esphome/components/tm1637/tm1637.cpp +9 -7
- esphome/components/tm1638/tm1638.cpp +7 -5
- esphome/components/tm1651/tm1651.cpp +2 -2
- esphome/components/tmp102/tmp102.cpp +1 -3
- esphome/components/tmp102/tmp102.h +0 -3
- esphome/components/tmp1075/tmp1075.cpp +12 -9
- esphome/components/tmp117/tmp117.cpp +2 -2
- esphome/components/tof10120/tof10120_sensor.cpp +2 -2
- esphome/components/tormatic/tormatic_cover.cpp +4 -2
- esphome/components/tsl2561/tsl2561.cpp +7 -5
- esphome/components/tsl2591/tsl2591.cpp +25 -27
- esphome/components/tt21100/touchscreen/tt21100.cpp +1 -1
- esphome/components/ttp229_bsf/ttp229_bsf.cpp +1 -1
- esphome/components/ttp229_lsf/ttp229_lsf.cpp +2 -2
- esphome/components/tuya/select/tuya_select.cpp +5 -3
- esphome/components/tx20/tx20.cpp +3 -3
- esphome/components/uart/__init__.py +4 -5
- esphome/components/uart/button/uart_button.cpp +1 -1
- esphome/components/uart/switch/uart_switch.cpp +2 -2
- esphome/components/uart/uart.cpp +2 -2
- esphome/components/uart/uart_component_esp32_arduino.cpp +8 -6
- esphome/components/uart/uart_component_esp8266.cpp +9 -7
- esphome/components/uart/uart_component_esp_idf.cpp +9 -7
- esphome/components/uart/uart_component_host.cpp +11 -8
- esphome/components/uart/uart_component_libretiny.cpp +8 -6
- esphome/components/uart/uart_component_rp2040.cpp +8 -6
- esphome/components/udp/udp_component.cpp +9 -5
- esphome/components/ufire_ec/ufire_ec.cpp +5 -3
- esphome/components/ufire_ise/ufire_ise.cpp +1 -1
- esphome/components/ultrasonic/ultrasonic_sensor.cpp +5 -3
- esphome/components/update/__init__.py +1 -0
- esphome/components/update/update_entity.cpp +1 -1
- esphome/components/update/update_entity.h +0 -3
- esphome/components/uponor_smatrix/climate/uponor_smatrix_climate.cpp +1 -1
- esphome/components/uponor_smatrix/sensor/uponor_smatrix_sensor.cpp +4 -2
- esphome/components/uponor_smatrix/uponor_smatrix.cpp +2 -1
- esphome/components/uptime/sensor/uptime_timestamp_sensor.cpp +1 -1
- esphome/components/usb_host/__init__.py +64 -0
- esphome/components/usb_host/usb_host.h +116 -0
- esphome/components/usb_host/usb_host_client.cpp +394 -0
- esphome/components/usb_host/usb_host_component.cpp +35 -0
- esphome/components/usb_uart/__init__.py +134 -0
- esphome/components/usb_uart/ch34x.cpp +80 -0
- esphome/components/usb_uart/cp210x.cpp +126 -0
- esphome/components/usb_uart/usb_uart.cpp +328 -0
- esphome/components/usb_uart/usb_uart.h +151 -0
- esphome/components/valve/__init__.py +1 -0
- esphome/components/veml3235/veml3235.cpp +13 -9
- esphome/components/veml7700/veml7700.cpp +10 -6
- esphome/components/voice_assistant/voice_assistant.cpp +7 -7
- esphome/components/wake_on_lan/wake_on_lan.cpp +1 -1
- esphome/components/waveshare_epaper/waveshare_epaper.cpp +1 -1
- esphome/components/web_server/server_index_v2.h +632 -630
- esphome/components/web_server/server_index_v3.h +411 -409
- esphome/components/web_server/web_server.cpp +5 -3
- esphome/components/web_server_base/web_server_base.cpp +1 -1
- esphome/components/web_server_idf/__init__.py +0 -2
- esphome/components/web_server_idf/utils.cpp +1 -1
- esphome/components/web_server_idf/web_server_idf.cpp +7 -3
- esphome/components/web_server_idf/web_server_idf.h +7 -0
- esphome/components/weikai/__init__.py +2 -0
- esphome/components/weikai/weikai.cpp +24 -22
- esphome/components/weikai_i2c/weikai_i2c.cpp +14 -9
- esphome/components/weikai_spi/weikai_spi.cpp +11 -6
- esphome/components/wiegand/wiegand.cpp +1 -1
- esphome/components/wifi/wifi_component.cpp +50 -37
- esphome/components/wifi/wifi_component.h +7 -4
- esphome/components/wifi/wifi_component_esp32_arduino.cpp +2 -2
- esphome/components/wifi/wifi_component_esp8266.cpp +3 -3
- esphome/components/wifi/wifi_component_libretiny.cpp +4 -4
- esphome/components/wireguard/wireguard.cpp +21 -21
- esphome/components/wl_134/text_sensor.py +1 -2
- esphome/components/wled/wled_light_effect.cpp +1 -1
- esphome/components/x9c/x9c.cpp +5 -3
- esphome/components/xgzp68xx/xgzp68xx.cpp +8 -6
- esphome/components/xiaomi_cgd1/xiaomi_cgd1.cpp +4 -2
- esphome/components/xiaomi_cgdk2/xiaomi_cgdk2.cpp +4 -2
- esphome/components/xiaomi_cgg1/xiaomi_cgg1.cpp +4 -2
- esphome/components/xiaomi_hhccjcy10/xiaomi_hhccjcy10.cpp +1 -1
- esphome/components/xiaomi_lywsd02mmc/xiaomi_lywsd02mmc.cpp +4 -2
- esphome/components/xiaomi_lywsd03mmc/xiaomi_lywsd03mmc.cpp +4 -2
- esphome/components/xiaomi_mhoc401/xiaomi_mhoc401.cpp +4 -2
- esphome/components/xl9535/xl9535.cpp +2 -2
- esphome/components/xpt2046/touchscreen/xpt2046.cpp +12 -11
- esphome/components/xpt2046/touchscreen/xpt2046.h +2 -2
- esphome/config.py +3 -2
- esphome/config_validation.py +46 -17
- esphome/const.py +10 -1
- esphome/core/__init__.py +37 -18
- esphome/core/application.cpp +197 -8
- esphome/core/application.h +116 -6
- esphome/core/component.cpp +36 -15
- esphome/core/component.h +43 -13
- esphome/core/config.py +12 -0
- esphome/core/defines.h +10 -2
- esphome/core/entity_base.cpp +4 -16
- esphome/core/entity_base.h +27 -13
- esphome/core/helpers.cpp +1 -1
- esphome/core/helpers.h +5 -5
- esphome/core/log.h +2 -0
- esphome/core/log_const_en.h +4 -0
- esphome/core/scheduler.cpp +2 -2
- esphome/coroutine.py +3 -4
- esphome/cpp_generator.py +32 -32
- esphome/dashboard/core.py +2 -2
- esphome/dashboard/web_server.py +2 -2
- esphome/git.py +4 -4
- esphome/helpers.py +5 -6
- esphome/loader.py +8 -7
- esphome/log.py +7 -1
- esphome/platformio_api.py +2 -3
- esphome/storage_json.py +13 -5
- esphome/types.py +12 -13
- esphome/util.py +1 -2
- esphome/wizard.py +0 -16
- esphome/writer.py +5 -3
- esphome/yaml_util.py +6 -1
- esphome/zeroconf.py +1 -1
- {esphome-2025.5.2.dist-info → esphome-2025.6.0b2.dist-info}/METADATA +12 -11
- {esphome-2025.5.2.dist-info → esphome-2025.6.0b2.dist-info}/RECORD +746 -692
- {esphome-2025.5.2.dist-info → esphome-2025.6.0b2.dist-info}/WHEEL +1 -1
- {esphome-2025.5.2.dist-info → esphome-2025.6.0b2.dist-info}/entry_points.txt +0 -0
- {esphome-2025.5.2.dist-info → esphome-2025.6.0b2.dist-info}/licenses/LICENSE +0 -0
- {esphome-2025.5.2.dist-info → esphome-2025.6.0b2.dist-info}/top_level.txt +0 -0
esphome/core/__init__.py
CHANGED
@@ -1,8 +1,9 @@
|
|
1
|
+
from collections import defaultdict
|
1
2
|
import logging
|
2
3
|
import math
|
3
4
|
import os
|
4
5
|
import re
|
5
|
-
from typing import TYPE_CHECKING
|
6
|
+
from typing import TYPE_CHECKING
|
6
7
|
|
7
8
|
from esphome.const import (
|
8
9
|
CONF_COMMENT,
|
@@ -326,7 +327,7 @@ class ID:
|
|
326
327
|
else:
|
327
328
|
self.is_manual = is_manual
|
328
329
|
self.is_declaration = is_declaration
|
329
|
-
self.type:
|
330
|
+
self.type: MockObjClass | None = type
|
330
331
|
|
331
332
|
def resolve(self, registered_ids):
|
332
333
|
from esphome.config_validation import RESERVED_IDS
|
@@ -476,20 +477,20 @@ class EsphomeCore:
|
|
476
477
|
# True if command is run from vscode api
|
477
478
|
self.vscode = False
|
478
479
|
# The name of the node
|
479
|
-
self.name:
|
480
|
+
self.name: str | None = None
|
480
481
|
# The friendly name of the node
|
481
|
-
self.friendly_name:
|
482
|
+
self.friendly_name: str | None = None
|
482
483
|
# The area / zone of the node
|
483
|
-
self.area:
|
484
|
+
self.area: str | None = None
|
484
485
|
# Additional data components can store temporary data in
|
485
486
|
# The first key to this dict should always be the integration name
|
486
487
|
self.data = {}
|
487
488
|
# The relative path to the configuration YAML
|
488
|
-
self.config_path:
|
489
|
+
self.config_path: str | None = None
|
489
490
|
# The relative path to where all build files are stored
|
490
|
-
self.build_path:
|
491
|
+
self.build_path: str | None = None
|
491
492
|
# The validated configuration, this is None until the config has been validated
|
492
|
-
self.config:
|
493
|
+
self.config: ConfigType | None = None
|
493
494
|
# The pending tasks in the task queue (mostly for C++ generation)
|
494
495
|
# This is a priority queue (with heapq)
|
495
496
|
# Each item is a tuple of form: (-priority, unique number, task)
|
@@ -509,11 +510,16 @@ class EsphomeCore:
|
|
509
510
|
# A set of defines to set for the compile process in esphome/core/defines.h
|
510
511
|
self.defines: set[Define] = set()
|
511
512
|
# A map of all platformio options to apply
|
512
|
-
self.platformio_options: dict[str,
|
513
|
+
self.platformio_options: dict[str, str | list[str]] = {}
|
513
514
|
# A set of strings of names of loaded integrations, used to find namespace ID conflicts
|
514
515
|
self.loaded_integrations = set()
|
516
|
+
# A set of strings for platform/integration combos
|
517
|
+
self.loaded_platforms: set[str] = set()
|
515
518
|
# A set of component IDs to track what Component subclasses are declared
|
516
519
|
self.component_ids = set()
|
520
|
+
# Dict to track platform entity counts for pre-allocation
|
521
|
+
# Key: platform name (e.g. "sensor", "binary_sensor"), Value: count
|
522
|
+
self.platform_counts: defaultdict[str, int] = defaultdict(int)
|
517
523
|
# Whether ESPHome was started in verbose mode
|
518
524
|
self.verbose = False
|
519
525
|
# Whether ESPHome was started in quiet mode
|
@@ -543,10 +549,11 @@ class EsphomeCore:
|
|
543
549
|
self.platformio_options = {}
|
544
550
|
self.loaded_integrations = set()
|
545
551
|
self.component_ids = set()
|
552
|
+
self.platform_counts = defaultdict(int)
|
546
553
|
PIN_SCHEMA_REGISTRY.reset()
|
547
554
|
|
548
555
|
@property
|
549
|
-
def address(self) ->
|
556
|
+
def address(self) -> str | None:
|
550
557
|
if self.config is None:
|
551
558
|
raise ValueError("Config has not been loaded yet")
|
552
559
|
|
@@ -559,7 +566,7 @@ class EsphomeCore:
|
|
559
566
|
return None
|
560
567
|
|
561
568
|
@property
|
562
|
-
def web_port(self) ->
|
569
|
+
def web_port(self) -> int | None:
|
563
570
|
if self.config is None:
|
564
571
|
raise ValueError("Config has not been loaded yet")
|
565
572
|
|
@@ -572,7 +579,7 @@ class EsphomeCore:
|
|
572
579
|
return None
|
573
580
|
|
574
581
|
@property
|
575
|
-
def comment(self) ->
|
582
|
+
def comment(self) -> str | None:
|
576
583
|
if self.config is None:
|
577
584
|
raise ValueError("Config has not been loaded yet")
|
578
585
|
|
@@ -667,16 +674,17 @@ class EsphomeCore:
|
|
667
674
|
def using_esp_idf(self):
|
668
675
|
return self.target_framework == "esp-idf"
|
669
676
|
|
670
|
-
def add_job(self, func, *args, **kwargs):
|
677
|
+
def add_job(self, func, *args, **kwargs) -> None:
|
671
678
|
self.event_loop.add_job(func, *args, **kwargs)
|
672
679
|
|
673
|
-
def flush_tasks(self):
|
680
|
+
def flush_tasks(self) -> None:
|
674
681
|
try:
|
675
682
|
self.event_loop.flush_tasks()
|
676
683
|
except RuntimeError as e:
|
677
684
|
raise EsphomeError(str(e)) from e
|
678
685
|
|
679
|
-
def add(self, expression):
|
686
|
+
def add(self, expression, prepend=False) -> "Statement":
|
687
|
+
"""Add an expression or statement to the main setup() block."""
|
680
688
|
from esphome.cpp_generator import Expression, Statement, statement
|
681
689
|
|
682
690
|
if isinstance(expression, Expression):
|
@@ -686,11 +694,14 @@ class EsphomeCore:
|
|
686
694
|
f"Add '{expression}' must be expression or statement, not {type(expression)}"
|
687
695
|
)
|
688
696
|
|
689
|
-
|
697
|
+
if prepend:
|
698
|
+
self.main_statements.insert(0, expression)
|
699
|
+
else:
|
700
|
+
self.main_statements.append(expression)
|
690
701
|
_LOGGER.debug("Adding: %s", expression)
|
691
702
|
return expression
|
692
703
|
|
693
|
-
def add_global(self, expression, prepend=False):
|
704
|
+
def add_global(self, expression, prepend=False) -> "Statement":
|
694
705
|
from esphome.cpp_generator import Expression, Statement, statement
|
695
706
|
|
696
707
|
if isinstance(expression, Expression):
|
@@ -773,7 +784,7 @@ class EsphomeCore:
|
|
773
784
|
_LOGGER.debug("Adding define: %s", define)
|
774
785
|
return define
|
775
786
|
|
776
|
-
def add_platformio_option(self, key: str, value:
|
787
|
+
def add_platformio_option(self, key: str, value: str | list[str]) -> None:
|
777
788
|
new_val = value
|
778
789
|
old_val = self.platformio_options.get(key)
|
779
790
|
if isinstance(old_val, list):
|
@@ -820,6 +831,14 @@ class EsphomeCore:
|
|
820
831
|
def has_id(self, id):
|
821
832
|
return id in self.variables
|
822
833
|
|
834
|
+
def register_platform_component(self, platform_name: str, var) -> None:
|
835
|
+
"""Register a component for a platform and track its count.
|
836
|
+
|
837
|
+
:param platform_name: The name of the platform (e.g., 'sensor', 'binary_sensor')
|
838
|
+
:param var: The variable (component) being registered (currently unused but kept for future use)
|
839
|
+
"""
|
840
|
+
self.platform_counts[platform_name] += 1
|
841
|
+
|
823
842
|
@property
|
824
843
|
def cpp_main_section(self):
|
825
844
|
from esphome.cpp_generator import statement
|
esphome/core/application.cpp
CHANGED
@@ -2,11 +2,30 @@
|
|
2
2
|
#include "esphome/core/log.h"
|
3
3
|
#include "esphome/core/version.h"
|
4
4
|
#include "esphome/core/hal.h"
|
5
|
+
#include <algorithm>
|
5
6
|
|
6
7
|
#ifdef USE_STATUS_LED
|
7
8
|
#include "esphome/components/status_led/status_led.h"
|
8
9
|
#endif
|
9
10
|
|
11
|
+
#ifdef USE_SOCKET_SELECT_SUPPORT
|
12
|
+
#include <cerrno>
|
13
|
+
|
14
|
+
#ifdef USE_SOCKET_IMPL_LWIP_SOCKETS
|
15
|
+
// LWIP sockets implementation
|
16
|
+
#include <lwip/sockets.h>
|
17
|
+
#elif defined(USE_SOCKET_IMPL_BSD_SOCKETS)
|
18
|
+
// BSD sockets implementation
|
19
|
+
#ifdef USE_ESP32
|
20
|
+
// ESP32 "BSD sockets" are actually LWIP under the hood
|
21
|
+
#include <lwip/sockets.h>
|
22
|
+
#else
|
23
|
+
// True BSD sockets (e.g., host platform)
|
24
|
+
#include <sys/select.h>
|
25
|
+
#endif
|
26
|
+
#endif
|
27
|
+
#endif
|
28
|
+
|
10
29
|
namespace esphome {
|
11
30
|
|
12
31
|
static const char *const TAG = "app";
|
@@ -26,8 +45,8 @@ void Application::register_component_(Component *comp) {
|
|
26
45
|
this->components_.push_back(comp);
|
27
46
|
}
|
28
47
|
void Application::setup() {
|
29
|
-
ESP_LOGI(TAG, "Running through setup()
|
30
|
-
ESP_LOGV(TAG, "Sorting components by setup priority
|
48
|
+
ESP_LOGI(TAG, "Running through setup()");
|
49
|
+
ESP_LOGV(TAG, "Sorting components by setup priority");
|
31
50
|
std::stable_sort(this->components_.begin(), this->components_.end(), [](const Component *a, const Component *b) {
|
32
51
|
return a->get_actual_setup_priority() > b->get_actual_setup_priority();
|
33
52
|
});
|
@@ -47,7 +66,7 @@ void Application::setup() {
|
|
47
66
|
[](Component *a, Component *b) { return a->get_loop_priority() > b->get_loop_priority(); });
|
48
67
|
|
49
68
|
do {
|
50
|
-
|
69
|
+
uint8_t new_app_state = STATUS_LED_WARNING;
|
51
70
|
this->scheduler.call();
|
52
71
|
this->feed_wdt();
|
53
72
|
for (uint32_t j = 0; j <= i; j++) {
|
@@ -68,7 +87,7 @@ void Application::setup() {
|
|
68
87
|
this->calculate_looping_components_();
|
69
88
|
}
|
70
89
|
void Application::loop() {
|
71
|
-
|
90
|
+
uint8_t new_app_state = 0;
|
72
91
|
|
73
92
|
this->scheduler.call();
|
74
93
|
|
@@ -98,7 +117,9 @@ void Application::loop() {
|
|
98
117
|
// Use the last component's end time instead of calling millis() again
|
99
118
|
auto elapsed = last_op_end_time - this->last_loop_;
|
100
119
|
if (elapsed >= this->loop_interval_ || HighFrequencyLoopRequester::is_high_frequency()) {
|
101
|
-
|
120
|
+
// Even if we overran the loop interval, we still need to select()
|
121
|
+
// to know if any sockets have data ready
|
122
|
+
this->yield_with_select_(0);
|
102
123
|
} else {
|
103
124
|
uint32_t delay_time = this->loop_interval_ - elapsed;
|
104
125
|
uint32_t next_schedule = this->scheduler.next_schedule_in().value_or(delay_time);
|
@@ -106,7 +127,8 @@ void Application::loop() {
|
|
106
127
|
// otherwise interval=0 schedules result in constant looping with almost no sleep
|
107
128
|
next_schedule = std::max(next_schedule, delay_time / 2);
|
108
129
|
delay_time = std::min(next_schedule, delay_time);
|
109
|
-
|
130
|
+
|
131
|
+
this->yield_with_select_(delay_time);
|
110
132
|
}
|
111
133
|
this->last_loop_ = last_op_end_time;
|
112
134
|
|
@@ -139,15 +161,17 @@ void IRAM_ATTR HOT Application::feed_wdt(uint32_t time) {
|
|
139
161
|
}
|
140
162
|
}
|
141
163
|
void Application::reboot() {
|
142
|
-
ESP_LOGI(TAG, "Forcing a reboot
|
164
|
+
ESP_LOGI(TAG, "Forcing a reboot");
|
143
165
|
for (auto it = this->components_.rbegin(); it != this->components_.rend(); ++it) {
|
144
166
|
(*it)->on_shutdown();
|
145
167
|
}
|
146
168
|
arch_restart();
|
147
169
|
}
|
148
170
|
void Application::safe_reboot() {
|
149
|
-
ESP_LOGI(TAG, "Rebooting safely
|
171
|
+
ESP_LOGI(TAG, "Rebooting safely");
|
150
172
|
run_safe_shutdown_hooks();
|
173
|
+
teardown_components(TEARDOWN_TIMEOUT_REBOOT_MS);
|
174
|
+
run_powerdown_hooks();
|
151
175
|
arch_restart();
|
152
176
|
}
|
153
177
|
|
@@ -160,6 +184,56 @@ void Application::run_safe_shutdown_hooks() {
|
|
160
184
|
}
|
161
185
|
}
|
162
186
|
|
187
|
+
void Application::run_powerdown_hooks() {
|
188
|
+
for (auto it = this->components_.rbegin(); it != this->components_.rend(); ++it) {
|
189
|
+
(*it)->on_powerdown();
|
190
|
+
}
|
191
|
+
}
|
192
|
+
|
193
|
+
void Application::teardown_components(uint32_t timeout_ms) {
|
194
|
+
uint32_t start_time = millis();
|
195
|
+
|
196
|
+
// Copy all components in reverse order using reverse iterators
|
197
|
+
// Reverse order matches the behavior of run_safe_shutdown_hooks() above and ensures
|
198
|
+
// components are torn down in the opposite order of their setup_priority (which is
|
199
|
+
// used to sort components during Application::setup())
|
200
|
+
std::vector<Component *> pending_components(this->components_.rbegin(), this->components_.rend());
|
201
|
+
|
202
|
+
uint32_t now = start_time;
|
203
|
+
while (!pending_components.empty() && (now - start_time) < timeout_ms) {
|
204
|
+
// Feed watchdog during teardown to prevent triggering
|
205
|
+
this->feed_wdt(now);
|
206
|
+
|
207
|
+
// Use iterator to safely erase elements
|
208
|
+
for (auto it = pending_components.begin(); it != pending_components.end();) {
|
209
|
+
if ((*it)->teardown()) {
|
210
|
+
// Component finished teardown, erase it
|
211
|
+
it = pending_components.erase(it);
|
212
|
+
} else {
|
213
|
+
// Component still needs time
|
214
|
+
++it;
|
215
|
+
}
|
216
|
+
}
|
217
|
+
|
218
|
+
// Give some time for I/O operations if components are still pending
|
219
|
+
if (!pending_components.empty()) {
|
220
|
+
this->yield_with_select_(1);
|
221
|
+
}
|
222
|
+
|
223
|
+
// Update time for next iteration
|
224
|
+
now = millis();
|
225
|
+
}
|
226
|
+
|
227
|
+
if (!pending_components.empty()) {
|
228
|
+
// Note: At this point, connections are either disconnected or in a bad state,
|
229
|
+
// so this warning will only appear via serial rather than being transmitted to clients
|
230
|
+
for (auto *component : pending_components) {
|
231
|
+
ESP_LOGW(TAG, "%s did not complete teardown within %" PRIu32 " ms", component->get_component_source(),
|
232
|
+
timeout_ms);
|
233
|
+
}
|
234
|
+
}
|
235
|
+
}
|
236
|
+
|
163
237
|
void Application::calculate_looping_components_() {
|
164
238
|
for (auto *obj : this->components_) {
|
165
239
|
if (obj->has_overridden_loop())
|
@@ -167,6 +241,121 @@ void Application::calculate_looping_components_() {
|
|
167
241
|
}
|
168
242
|
}
|
169
243
|
|
244
|
+
#ifdef USE_SOCKET_SELECT_SUPPORT
|
245
|
+
bool Application::register_socket_fd(int fd) {
|
246
|
+
// WARNING: This function is NOT thread-safe and must only be called from the main loop
|
247
|
+
// It modifies socket_fds_ and related variables without locking
|
248
|
+
if (fd < 0)
|
249
|
+
return false;
|
250
|
+
|
251
|
+
if (fd >= FD_SETSIZE) {
|
252
|
+
ESP_LOGE(TAG, "Cannot monitor socket fd %d: exceeds FD_SETSIZE (%d)", fd, FD_SETSIZE);
|
253
|
+
ESP_LOGE(TAG, "Socket will not be monitored for data - may cause performance issues!");
|
254
|
+
return false;
|
255
|
+
}
|
256
|
+
|
257
|
+
this->socket_fds_.push_back(fd);
|
258
|
+
this->socket_fds_changed_ = true;
|
259
|
+
|
260
|
+
if (fd > this->max_fd_) {
|
261
|
+
this->max_fd_ = fd;
|
262
|
+
}
|
263
|
+
|
264
|
+
return true;
|
265
|
+
}
|
266
|
+
|
267
|
+
void Application::unregister_socket_fd(int fd) {
|
268
|
+
// WARNING: This function is NOT thread-safe and must only be called from the main loop
|
269
|
+
// It modifies socket_fds_ and related variables without locking
|
270
|
+
if (fd < 0)
|
271
|
+
return;
|
272
|
+
|
273
|
+
auto it = std::find(this->socket_fds_.begin(), this->socket_fds_.end(), fd);
|
274
|
+
if (it != this->socket_fds_.end()) {
|
275
|
+
// Swap with last element and pop - O(1) removal since order doesn't matter
|
276
|
+
if (it != this->socket_fds_.end() - 1) {
|
277
|
+
std::swap(*it, this->socket_fds_.back());
|
278
|
+
}
|
279
|
+
this->socket_fds_.pop_back();
|
280
|
+
this->socket_fds_changed_ = true;
|
281
|
+
|
282
|
+
// Only recalculate max_fd if we removed the current max
|
283
|
+
if (fd == this->max_fd_) {
|
284
|
+
if (this->socket_fds_.empty()) {
|
285
|
+
this->max_fd_ = -1;
|
286
|
+
} else {
|
287
|
+
// Find new max using std::max_element
|
288
|
+
this->max_fd_ = *std::max_element(this->socket_fds_.begin(), this->socket_fds_.end());
|
289
|
+
}
|
290
|
+
}
|
291
|
+
}
|
292
|
+
}
|
293
|
+
|
294
|
+
bool Application::is_socket_ready(int fd) const {
|
295
|
+
// This function is thread-safe for reading the result of select()
|
296
|
+
// However, it should only be called after select() has been executed in the main loop
|
297
|
+
// The read_fds_ is only modified by select() in the main loop
|
298
|
+
if (fd < 0 || fd >= FD_SETSIZE)
|
299
|
+
return false;
|
300
|
+
|
301
|
+
return FD_ISSET(fd, &this->read_fds_);
|
302
|
+
}
|
303
|
+
#endif
|
304
|
+
|
305
|
+
void Application::yield_with_select_(uint32_t delay_ms) {
|
306
|
+
// Delay while monitoring sockets. When delay_ms is 0, always yield() to ensure other tasks run
|
307
|
+
// since select() with 0 timeout only polls without yielding.
|
308
|
+
#ifdef USE_SOCKET_SELECT_SUPPORT
|
309
|
+
if (!this->socket_fds_.empty()) {
|
310
|
+
// Update fd_set if socket list has changed
|
311
|
+
if (this->socket_fds_changed_) {
|
312
|
+
FD_ZERO(&this->base_read_fds_);
|
313
|
+
for (int fd : this->socket_fds_) {
|
314
|
+
if (fd >= 0 && fd < FD_SETSIZE) {
|
315
|
+
FD_SET(fd, &this->base_read_fds_);
|
316
|
+
}
|
317
|
+
}
|
318
|
+
this->socket_fds_changed_ = false;
|
319
|
+
}
|
320
|
+
|
321
|
+
// Copy base fd_set before each select
|
322
|
+
this->read_fds_ = this->base_read_fds_;
|
323
|
+
|
324
|
+
// Convert delay_ms to timeval
|
325
|
+
struct timeval tv;
|
326
|
+
tv.tv_sec = delay_ms / 1000;
|
327
|
+
tv.tv_usec = (delay_ms - tv.tv_sec * 1000) * 1000;
|
328
|
+
|
329
|
+
// Call select with timeout
|
330
|
+
#if defined(USE_SOCKET_IMPL_LWIP_SOCKETS) || (defined(USE_ESP32) && defined(USE_SOCKET_IMPL_BSD_SOCKETS))
|
331
|
+
int ret = lwip_select(this->max_fd_ + 1, &this->read_fds_, nullptr, nullptr, &tv);
|
332
|
+
#else
|
333
|
+
int ret = ::select(this->max_fd_ + 1, &this->read_fds_, nullptr, nullptr, &tv);
|
334
|
+
#endif
|
335
|
+
|
336
|
+
// Process select() result:
|
337
|
+
// ret < 0: error (except EINTR which is normal)
|
338
|
+
// ret > 0: socket(s) have data ready - normal and expected
|
339
|
+
// ret == 0: timeout occurred - normal and expected
|
340
|
+
if (ret < 0 && errno != EINTR) {
|
341
|
+
// Actual error - log and fall back to delay
|
342
|
+
ESP_LOGW(TAG, "select() failed with errno %d", errno);
|
343
|
+
delay(delay_ms);
|
344
|
+
}
|
345
|
+
// When delay_ms is 0, we need to yield since select(0) doesn't yield
|
346
|
+
if (delay_ms == 0) {
|
347
|
+
yield();
|
348
|
+
}
|
349
|
+
} else {
|
350
|
+
// No sockets registered, use regular delay
|
351
|
+
delay(delay_ms);
|
352
|
+
}
|
353
|
+
#else
|
354
|
+
// No select support, use regular delay
|
355
|
+
delay(delay_ms);
|
356
|
+
#endif
|
357
|
+
}
|
358
|
+
|
170
359
|
Application App; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables)
|
171
360
|
|
172
361
|
} // namespace esphome
|
esphome/core/application.h
CHANGED
@@ -9,6 +9,10 @@
|
|
9
9
|
#include "esphome/core/preferences.h"
|
10
10
|
#include "esphome/core/scheduler.h"
|
11
11
|
|
12
|
+
#ifdef USE_SOCKET_SELECT_SUPPORT
|
13
|
+
#include <sys/select.h>
|
14
|
+
#endif
|
15
|
+
|
12
16
|
#ifdef USE_BINARY_SENSOR
|
13
17
|
#include "esphome/components/binary_sensor/binary_sensor.h"
|
14
18
|
#endif
|
@@ -75,10 +79,16 @@
|
|
75
79
|
|
76
80
|
namespace esphome {
|
77
81
|
|
82
|
+
// Teardown timeout constant (in milliseconds)
|
83
|
+
// For reboots, it's more important to shut down quickly than disconnect cleanly
|
84
|
+
// since we're not entering deep sleep. The only consequence of not shutting down
|
85
|
+
// cleanly is a warning in the log.
|
86
|
+
static const uint32_t TEARDOWN_TIMEOUT_REBOOT_MS = 1000; // 1 second for quick reboot
|
87
|
+
|
78
88
|
class Application {
|
79
89
|
public:
|
80
|
-
void pre_setup(const std::string &name, const std::string &friendly_name, const
|
81
|
-
const char *
|
90
|
+
void pre_setup(const std::string &name, const std::string &friendly_name, const char *area, const char *comment,
|
91
|
+
const char *compilation_time, bool name_add_mac_suffix) {
|
82
92
|
arch_init();
|
83
93
|
this->name_add_mac_suffix_ = name_add_mac_suffix;
|
84
94
|
if (name_add_mac_suffix) {
|
@@ -188,6 +198,73 @@ class Application {
|
|
188
198
|
void register_update(update::UpdateEntity *update) { this->updates_.push_back(update); }
|
189
199
|
#endif
|
190
200
|
|
201
|
+
/// Reserve space for components to avoid memory fragmentation
|
202
|
+
void reserve_components(size_t count) { this->components_.reserve(count); }
|
203
|
+
|
204
|
+
#ifdef USE_BINARY_SENSOR
|
205
|
+
void reserve_binary_sensor(size_t count) { this->binary_sensors_.reserve(count); }
|
206
|
+
#endif
|
207
|
+
#ifdef USE_SWITCH
|
208
|
+
void reserve_switch(size_t count) { this->switches_.reserve(count); }
|
209
|
+
#endif
|
210
|
+
#ifdef USE_BUTTON
|
211
|
+
void reserve_button(size_t count) { this->buttons_.reserve(count); }
|
212
|
+
#endif
|
213
|
+
#ifdef USE_SENSOR
|
214
|
+
void reserve_sensor(size_t count) { this->sensors_.reserve(count); }
|
215
|
+
#endif
|
216
|
+
#ifdef USE_TEXT_SENSOR
|
217
|
+
void reserve_text_sensor(size_t count) { this->text_sensors_.reserve(count); }
|
218
|
+
#endif
|
219
|
+
#ifdef USE_FAN
|
220
|
+
void reserve_fan(size_t count) { this->fans_.reserve(count); }
|
221
|
+
#endif
|
222
|
+
#ifdef USE_COVER
|
223
|
+
void reserve_cover(size_t count) { this->covers_.reserve(count); }
|
224
|
+
#endif
|
225
|
+
#ifdef USE_CLIMATE
|
226
|
+
void reserve_climate(size_t count) { this->climates_.reserve(count); }
|
227
|
+
#endif
|
228
|
+
#ifdef USE_LIGHT
|
229
|
+
void reserve_light(size_t count) { this->lights_.reserve(count); }
|
230
|
+
#endif
|
231
|
+
#ifdef USE_NUMBER
|
232
|
+
void reserve_number(size_t count) { this->numbers_.reserve(count); }
|
233
|
+
#endif
|
234
|
+
#ifdef USE_DATETIME_DATE
|
235
|
+
void reserve_date(size_t count) { this->dates_.reserve(count); }
|
236
|
+
#endif
|
237
|
+
#ifdef USE_DATETIME_TIME
|
238
|
+
void reserve_time(size_t count) { this->times_.reserve(count); }
|
239
|
+
#endif
|
240
|
+
#ifdef USE_DATETIME_DATETIME
|
241
|
+
void reserve_datetime(size_t count) { this->datetimes_.reserve(count); }
|
242
|
+
#endif
|
243
|
+
#ifdef USE_SELECT
|
244
|
+
void reserve_select(size_t count) { this->selects_.reserve(count); }
|
245
|
+
#endif
|
246
|
+
#ifdef USE_TEXT
|
247
|
+
void reserve_text(size_t count) { this->texts_.reserve(count); }
|
248
|
+
#endif
|
249
|
+
#ifdef USE_LOCK
|
250
|
+
void reserve_lock(size_t count) { this->locks_.reserve(count); }
|
251
|
+
#endif
|
252
|
+
#ifdef USE_VALVE
|
253
|
+
void reserve_valve(size_t count) { this->valves_.reserve(count); }
|
254
|
+
#endif
|
255
|
+
#ifdef USE_MEDIA_PLAYER
|
256
|
+
void reserve_media_player(size_t count) { this->media_players_.reserve(count); }
|
257
|
+
#endif
|
258
|
+
#ifdef USE_ALARM_CONTROL_PANEL
|
259
|
+
void reserve_alarm_control_panel(size_t count) { this->alarm_control_panels_.reserve(count); }
|
260
|
+
#endif
|
261
|
+
#ifdef USE_EVENT
|
262
|
+
void reserve_event(size_t count) { this->events_.reserve(count); }
|
263
|
+
#endif
|
264
|
+
#ifdef USE_UPDATE
|
265
|
+
void reserve_update(size_t count) { this->updates_.reserve(count); }
|
266
|
+
#endif
|
267
|
+
|
191
268
|
/// Register the component in this Application instance.
|
192
269
|
template<class C> C *register_component(C *c) {
|
193
270
|
static_assert(std::is_base_of<Component, C>::value, "Only Component subclasses can be registered");
|
@@ -208,7 +285,7 @@ class Application {
|
|
208
285
|
const std::string &get_friendly_name() const { return this->friendly_name_; }
|
209
286
|
|
210
287
|
/// Get the area of this Application set by pre_setup().
|
211
|
-
|
288
|
+
std::string get_area() const { return this->area_ == nullptr ? "" : this->area_; }
|
212
289
|
|
213
290
|
/// Get the comment of this Application set by pre_setup().
|
214
291
|
std::string get_comment() const { return this->comment_; }
|
@@ -247,7 +324,15 @@ class Application {
|
|
247
324
|
|
248
325
|
void run_safe_shutdown_hooks();
|
249
326
|
|
250
|
-
|
327
|
+
void run_powerdown_hooks();
|
328
|
+
|
329
|
+
/** Teardown all components with a timeout.
|
330
|
+
*
|
331
|
+
* @param timeout_ms Maximum time to wait for teardown in milliseconds
|
332
|
+
*/
|
333
|
+
void teardown_components(uint32_t timeout_ms);
|
334
|
+
|
335
|
+
uint8_t get_app_state() const { return this->app_state_; }
|
251
336
|
|
252
337
|
#ifdef USE_BINARY_SENSOR
|
253
338
|
const std::vector<binary_sensor::BinarySensor *> &get_binary_sensors() { return this->binary_sensors_; }
|
@@ -467,6 +552,19 @@ class Application {
|
|
467
552
|
|
468
553
|
Scheduler scheduler;
|
469
554
|
|
555
|
+
/// Register/unregister a socket file descriptor to be monitored for read events.
|
556
|
+
#ifdef USE_SOCKET_SELECT_SUPPORT
|
557
|
+
/// These functions update the fd_set used by select() in the main loop.
|
558
|
+
/// WARNING: These functions are NOT thread-safe. They must only be called from the main loop.
|
559
|
+
/// NOTE: File descriptors >= FD_SETSIZE (typically 10 on ESP) will be rejected with an error.
|
560
|
+
/// @return true if registration was successful, false if fd exceeds limits
|
561
|
+
bool register_socket_fd(int fd);
|
562
|
+
void unregister_socket_fd(int fd);
|
563
|
+
/// Check if there's data available on a socket without blocking
|
564
|
+
/// This function is thread-safe for reading, but should be called after select() has run
|
565
|
+
bool is_socket_ready(int fd) const;
|
566
|
+
#endif
|
567
|
+
|
470
568
|
protected:
|
471
569
|
friend Component;
|
472
570
|
|
@@ -476,6 +574,9 @@ class Application {
|
|
476
574
|
|
477
575
|
void feed_wdt_arch_();
|
478
576
|
|
577
|
+
/// Perform a delay while also monitoring socket file descriptors for readiness
|
578
|
+
void yield_with_select_(uint32_t delay_ms);
|
579
|
+
|
479
580
|
std::vector<Component *> components_{};
|
480
581
|
std::vector<Component *> looping_components_{};
|
481
582
|
|
@@ -545,16 +646,25 @@ class Application {
|
|
545
646
|
|
546
647
|
std::string name_;
|
547
648
|
std::string friendly_name_;
|
548
|
-
|
649
|
+
const char *area_{nullptr};
|
549
650
|
const char *comment_{nullptr};
|
550
651
|
const char *compilation_time_{nullptr};
|
551
652
|
bool name_add_mac_suffix_;
|
552
653
|
uint32_t last_loop_{0};
|
553
654
|
uint32_t loop_interval_{16};
|
554
655
|
size_t dump_config_at_{SIZE_MAX};
|
555
|
-
|
656
|
+
uint8_t app_state_{0};
|
556
657
|
Component *current_component_{nullptr};
|
557
658
|
uint32_t loop_component_start_time_{0};
|
659
|
+
|
660
|
+
#ifdef USE_SOCKET_SELECT_SUPPORT
|
661
|
+
// Socket select management
|
662
|
+
std::vector<int> socket_fds_; // Vector of all monitored socket file descriptors
|
663
|
+
bool socket_fds_changed_{false}; // Flag to rebuild base_read_fds_ when socket_fds_ changes
|
664
|
+
int max_fd_{-1}; // Highest file descriptor number for select()
|
665
|
+
fd_set base_read_fds_{}; // Cached fd_set rebuilt only when socket_fds_ changes
|
666
|
+
fd_set read_fds_{}; // Working fd_set for select(), copied from base_read_fds_
|
667
|
+
#endif
|
558
668
|
};
|
559
669
|
|
560
670
|
/// Global storage of Application pointer - only one Application can exist.
|