esphome 2025.7.5__py3-none-any.whl → 2025.8.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- esphome/__main__.py +190 -83
- esphome/automation.py +2 -4
- esphome/build_gen/__init__.py +0 -0
- esphome/build_gen/platformio.py +102 -0
- esphome/components/a4988/a4988.cpp +0 -1
- esphome/components/absolute_humidity/absolute_humidity.cpp +0 -2
- esphome/components/absolute_humidity/sensor.py +2 -2
- esphome/components/adc/__init__.py +123 -85
- esphome/components/adc/adc_sensor.h +98 -35
- esphome/components/adc/adc_sensor_common.cpp +10 -4
- esphome/components/adc/adc_sensor_esp32.cpp +291 -123
- esphome/components/adc/adc_sensor_esp8266.cpp +1 -4
- esphome/components/adc/adc_sensor_libretiny.cpp +1 -2
- esphome/components/adc/adc_sensor_rp2040.cpp +1 -2
- esphome/components/adc/adc_sensor_zephyr.cpp +207 -0
- esphome/components/adc/sensor.py +61 -27
- esphome/components/adc128s102/adc128s102.cpp +1 -4
- esphome/components/ade7880/sensor.py +75 -49
- esphome/components/ads1115/ads1115.cpp +0 -1
- esphome/components/ads1118/ads1118.cpp +0 -1
- esphome/components/ags10/ags10.cpp +0 -4
- esphome/components/aht10/aht10.cpp +0 -4
- esphome/components/aic3204/aic3204.cpp +0 -2
- esphome/components/airthings_wave_plus/__init__.py +1 -1
- esphome/components/airthings_wave_plus/airthings_wave_plus.cpp +22 -4
- esphome/components/airthings_wave_plus/airthings_wave_plus.h +10 -1
- esphome/components/airthings_wave_plus/sensor.py +55 -28
- esphome/components/alarm_control_panel/__init__.py +4 -9
- esphome/components/am2315c/am2315c.cpp +0 -2
- esphome/components/am2320/am2320.cpp +0 -1
- esphome/components/animation/__init__.py +14 -11
- esphome/components/apds9306/apds9306.cpp +0 -4
- esphome/components/apds9960/apds9960.cpp +0 -1
- esphome/components/api/__init__.py +29 -4
- esphome/components/api/api_connection.cpp +378 -401
- esphome/components/api/api_connection.h +102 -52
- esphome/components/api/api_frame_helper.cpp +69 -896
- esphome/components/api/api_frame_helper.h +31 -126
- esphome/components/api/api_frame_helper_noise.cpp +583 -0
- esphome/components/api/api_frame_helper_noise.h +68 -0
- esphome/components/api/api_frame_helper_plaintext.cpp +290 -0
- esphome/components/api/api_frame_helper_plaintext.h +53 -0
- esphome/components/api/api_noise_context.h +2 -4
- esphome/components/api/api_pb2.cpp +1601 -1808
- esphome/components/api/api_pb2.h +367 -323
- esphome/components/api/api_pb2_dump.cpp +1137 -3466
- esphome/components/api/api_pb2_includes.h +34 -0
- esphome/components/api/api_pb2_service.cpp +94 -105
- esphome/components/api/api_pb2_service.h +27 -16
- esphome/components/api/api_server.cpp +18 -17
- esphome/components/api/api_server.h +8 -5
- esphome/components/api/client.py +16 -8
- esphome/components/api/custom_api_device.h +68 -14
- esphome/components/api/homeassistant_service.h +24 -19
- esphome/components/api/list_entities.cpp +3 -5
- esphome/components/api/list_entities.h +2 -4
- esphome/components/api/proto.cpp +3 -5
- esphome/components/api/proto.h +239 -274
- esphome/components/api/subscribe_state.cpp +2 -4
- esphome/components/api/subscribe_state.h +2 -4
- esphome/components/api/user_services.cpp +2 -4
- esphome/components/api/user_services.h +8 -8
- esphome/components/as3935/as3935.cpp +0 -2
- esphome/components/as3935_spi/as3935_spi.cpp +0 -2
- esphome/components/as5600/__init__.py +1 -1
- esphome/components/as5600/as5600.cpp +0 -2
- esphome/components/as5600/sensor/__init__.py +0 -1
- esphome/components/as7341/as7341.cpp +0 -1
- esphome/components/async_tcp/__init__.py +1 -1
- esphome/components/at581x/at581x.cpp +1 -1
- esphome/components/atm90e26/atm90e26.cpp +0 -1
- esphome/components/atm90e32/atm90e32.cpp +475 -116
- esphome/components/atm90e32/atm90e32.h +43 -5
- esphome/components/audio/audio.h +2 -2
- esphome/components/axs15231/touchscreen/axs15231_touchscreen.cpp +0 -2
- esphome/components/beken_spi_led_strip/led_strip.cpp +0 -2
- esphome/components/bh1750/bh1750.cpp +0 -1
- esphome/components/binary_sensor/__init__.py +14 -12
- esphome/components/ble_client/__init__.py +4 -7
- esphome/components/bluetooth_proxy/__init__.py +40 -3
- esphome/components/bluetooth_proxy/bluetooth_connection.cpp +392 -81
- esphome/components/bluetooth_proxy/bluetooth_connection.h +16 -5
- esphome/components/bluetooth_proxy/bluetooth_proxy.cpp +102 -311
- esphome/components/bluetooth_proxy/bluetooth_proxy.h +30 -14
- esphome/components/bme280_base/bme280_base.cpp +15 -16
- esphome/components/bme680/bme680.cpp +2 -3
- esphome/components/bme680_bsec/bme680_bsec.cpp +0 -2
- esphome/components/bme68x_bsec2/bme68x_bsec2.cpp +0 -2
- esphome/components/bmi160/bmi160.cpp +0 -1
- esphome/components/bmp085/bmp085.cpp +0 -1
- esphome/components/bmp280_base/bmp280_base.cpp +13 -14
- esphome/components/bmp3xx_base/bmp3xx_base.cpp +0 -1
- esphome/components/bmp581/bmp581.cpp +0 -2
- esphome/components/bp1658cj/bp1658cj.cpp +0 -1
- esphome/components/bp5758d/bp5758d.cpp +0 -1
- esphome/components/button/__init__.py +0 -1
- esphome/components/canbus/__init__.py +2 -3
- esphome/components/canbus/canbus.cpp +0 -1
- esphome/components/cap1188/cap1188.cpp +0 -2
- esphome/components/captive_portal/__init__.py +1 -1
- esphome/components/cd74hc4067/cd74hc4067.cpp +0 -2
- esphome/components/ch422g/ch422g.cpp +0 -1
- esphome/components/chsc6x/chsc6x_touchscreen.cpp +0 -3
- esphome/components/climate/__init__.py +0 -1
- esphome/components/climate/climate_traits.h +24 -0
- esphome/components/cm1106/cm1106.cpp +0 -1
- esphome/components/const/__init__.py +6 -0
- esphome/components/cover/__init__.py +0 -1
- esphome/components/cover/cover.cpp +9 -13
- esphome/components/cs5460a/cs5460a.cpp +0 -2
- esphome/components/cse7761/cse7761.cpp +0 -1
- esphome/components/cst226/touchscreen/cst226_touchscreen.cpp +0 -2
- esphome/components/cst816/touchscreen/cst816_touchscreen.cpp +0 -2
- esphome/components/dac7678/dac7678_output.cpp +0 -2
- esphome/components/dallas_temp/dallas_temp.cpp +0 -1
- esphome/components/datetime/__init__.py +0 -2
- esphome/components/debug/__init__.py +15 -1
- esphome/components/debug/debug_zephyr.cpp +281 -0
- esphome/components/debug/sensor.py +2 -1
- esphome/components/deep_sleep/deep_sleep_component.cpp +0 -1
- esphome/components/deep_sleep/deep_sleep_esp32.cpp +20 -1
- esphome/components/dfrobot_sen0395/__init__.py +1 -2
- esphome/components/dht/dht.cpp +0 -1
- esphome/components/dht12/dht12.cpp +0 -1
- esphome/components/display/__init__.py +16 -3
- esphome/components/display_menu_base/__init__.py +1 -1
- esphome/components/dps310/dps310.cpp +0 -2
- esphome/components/ds1307/ds1307.cpp +0 -1
- esphome/components/ds2484/ds2484.cpp +0 -1
- esphome/components/duty_cycle/duty_cycle_sensor.cpp +0 -1
- esphome/components/ee895/ee895.cpp +0 -1
- esphome/components/ektf2232/touchscreen/ektf2232.cpp +0 -1
- esphome/components/emc2101/emc2101.cpp +0 -2
- esphome/components/ens160_base/ens160_base.cpp +0 -2
- esphome/components/ens210/ens210.cpp +0 -1
- esphome/components/es7210/es7210.cpp +0 -2
- esphome/components/es7243e/es7243e.cpp +0 -2
- esphome/components/es8156/es8156.cpp +0 -2
- esphome/components/es8311/es8311.cpp +0 -2
- esphome/components/es8388/es8388.cpp +0 -2
- esphome/components/esp32/__init__.py +203 -60
- esphome/components/esp32/boards.py +17 -0
- esphome/components/esp32/gpio.cpp +0 -1
- esphome/components/esp32/gpio.py +1 -2
- esphome/components/esp32/gpio_esp32_h2.py +2 -7
- esphome/components/esp32/gpio_esp32_p4.py +2 -7
- esphome/components/esp32/post_build.py.script +112 -61
- esphome/components/esp32_ble/__init__.py +41 -2
- esphome/components/esp32_ble/ble.cpp +14 -10
- esphome/components/esp32_ble/ble.h +18 -18
- esphome/components/esp32_ble/ble_advertising.cpp +5 -5
- esphome/components/esp32_ble/ble_advertising.h +7 -5
- esphome/components/esp32_ble/ble_event.h +139 -73
- esphome/components/esp32_ble/ble_scan_result.h +2 -4
- esphome/components/esp32_ble/ble_uuid.cpp +5 -5
- esphome/components/esp32_ble/ble_uuid.h +6 -5
- esphome/components/esp32_ble_beacon/__init__.py +4 -0
- esphome/components/esp32_ble_client/__init__.py +1 -1
- esphome/components/esp32_ble_client/ble_characteristic.cpp +4 -4
- esphome/components/esp32_ble_client/ble_characteristic.h +6 -4
- esphome/components/esp32_ble_client/ble_client_base.cpp +155 -104
- esphome/components/esp32_ble_client/ble_client_base.h +17 -6
- esphome/components/esp32_ble_client/ble_descriptor.h +6 -4
- esphome/components/esp32_ble_client/ble_service.cpp +4 -4
- esphome/components/esp32_ble_client/ble_service.h +6 -4
- esphome/components/esp32_ble_server/__init__.py +15 -12
- esphome/components/esp32_ble_tracker/__init__.py +79 -11
- esphome/components/esp32_ble_tracker/automation.h +4 -4
- esphome/components/esp32_ble_tracker/esp32_ble_tracker.cpp +264 -261
- esphome/components/esp32_ble_tracker/esp32_ble_tracker.h +103 -37
- esphome/components/esp32_camera/__init__.py +13 -1
- esphome/components/esp32_camera/esp32_camera.cpp +7 -2
- esphome/components/esp32_camera/esp32_camera.h +1 -0
- esphome/components/esp32_dac/esp32_dac.cpp +3 -19
- esphome/components/esp32_dac/esp32_dac.h +4 -8
- esphome/components/esp32_rmt_led_strip/led_strip.cpp +1 -6
- esphome/components/esp32_rmt_led_strip/light.py +1 -1
- esphome/components/esp32_touch/__init__.py +2 -3
- esphome/components/esp32_touch/esp32_touch.h +9 -6
- esphome/components/esp32_touch/esp32_touch_common.cpp +2 -0
- esphome/components/esp32_touch/esp32_touch_v1.cpp +7 -9
- esphome/components/esp32_touch/esp32_touch_v2.cpp +10 -6
- esphome/components/esp8266/__init__.py +3 -1
- esphome/components/esp8266_pwm/esp8266_pwm.cpp +0 -1
- esphome/components/esphome/ota/__init__.py +1 -2
- esphome/components/esphome/ota/ota_esphome.cpp +150 -77
- esphome/components/esphome/ota/ota_esphome.h +8 -1
- esphome/components/espnow/__init__.py +309 -0
- esphome/components/espnow/automation.h +175 -0
- esphome/components/espnow/espnow_component.cpp +468 -0
- esphome/components/espnow/espnow_component.h +183 -0
- esphome/components/espnow/espnow_err.h +19 -0
- esphome/components/espnow/espnow_packet.h +166 -0
- esphome/components/ethernet/__init__.py +7 -1
- esphome/components/ethernet/esp_eth_phy_jl1101.c +5 -0
- esphome/components/ethernet/ethernet_component.cpp +0 -1
- esphome/components/ethernet/ethernet_component.h +4 -0
- esphome/components/ethernet_info/ethernet_info_text_sensor.h +0 -3
- esphome/components/event/__init__.py +0 -1
- esphome/components/factory_reset/__init__.py +92 -0
- esphome/components/factory_reset/factory_reset.cpp +76 -0
- esphome/components/factory_reset/factory_reset.h +43 -0
- esphome/components/fan/__init__.py +0 -1
- esphome/components/fan/fan_traits.h +16 -0
- esphome/components/fastled_base/fastled_light.cpp +0 -1
- esphome/components/fastled_spi/light.py +1 -3
- esphome/components/fingerprint_grow/fingerprint_grow.cpp +0 -2
- esphome/components/fs3000/fs3000.cpp +0 -2
- esphome/components/ft5x06/touchscreen/ft5x06_touchscreen.cpp +0 -2
- esphome/components/ft63x6/ft63x6.cpp +0 -1
- esphome/components/gdk101/gdk101.cpp +0 -1
- esphome/components/gl_r01_i2c/gl_r01_i2c.cpp +0 -1
- esphome/components/gl_r01_i2c/sensor.py +1 -1
- esphome/components/gpio/one_wire/gpio_one_wire.cpp +0 -1
- esphome/components/gpio/switch/gpio_switch.cpp +0 -2
- esphome/components/gpio_expander/cached_gpio.h +24 -15
- esphome/components/gps/__init__.py +6 -2
- esphome/components/gps/gps.cpp +50 -49
- esphome/components/gps/gps.h +4 -8
- esphome/components/gps/time/gps_time.cpp +3 -9
- esphome/components/gps/time/gps_time.h +4 -7
- esphome/components/graph/__init__.py +1 -1
- esphome/components/grove_gas_mc_v2/grove_gas_mc_v2.cpp +0 -1
- esphome/components/grove_tb6612fng/grove_tb6612fng.cpp +0 -1
- esphome/components/gt911/touchscreen/gt911_touchscreen.cpp +21 -12
- esphome/components/gt911/touchscreen/gt911_touchscreen.h +26 -2
- esphome/components/haier/climate.py +5 -10
- esphome/components/haier/haier_base.cpp +0 -1
- esphome/components/hbridge/switch/hbridge_switch.cpp +0 -2
- esphome/components/hdc1080/hdc1080.cpp +0 -2
- esphome/components/heatpumpir/climate.py +2 -2
- esphome/components/hlw8012/hlw8012.cpp +0 -1
- esphome/components/hm3301/hm3301.cpp +0 -1
- esphome/components/hmc5883l/hmc5883l.cpp +0 -1
- esphome/components/homeassistant/__init__.py +1 -0
- esphome/components/homeassistant/number/__init__.py +1 -0
- esphome/components/homeassistant/number/homeassistant_number.cpp +11 -7
- esphome/components/homeassistant/switch/__init__.py +1 -0
- esphome/components/homeassistant/switch/homeassistant_switch.cpp +9 -5
- esphome/components/honeywellabp/honeywellabp.cpp +1 -4
- esphome/components/host/__init__.py +2 -0
- esphome/components/hte501/hte501.cpp +0 -1
- esphome/components/http_request/__init__.py +2 -3
- esphome/components/http_request/http_request_idf.cpp +2 -2
- esphome/components/htu21d/htu21d.cpp +0 -2
- esphome/components/htu31d/htu31d.cpp +0 -2
- esphome/components/hx711/hx711.cpp +0 -1
- esphome/components/hydreon_rgxx/hydreon_rgxx.cpp +0 -1
- esphome/components/hydreon_rgxx/sensor.py +4 -5
- esphome/components/i2c/i2c_bus.h +1 -1
- esphome/components/i2c/i2c_bus_arduino.cpp +1 -2
- esphome/components/i2c/i2c_bus_esp_idf.cpp +192 -17
- esphome/components/i2c/i2c_bus_esp_idf.h +11 -1
- esphome/components/i2s_audio/__init__.py +6 -5
- esphome/components/i2s_audio/i2s_audio.cpp +0 -2
- esphome/components/i2s_audio/media_player/i2s_audio_media_player.cpp +1 -4
- esphome/components/i2s_audio/microphone/__init__.py +4 -6
- esphome/components/i2s_audio/microphone/i2s_audio_microphone.cpp +0 -1
- esphome/components/i2s_audio/microphone/i2s_audio_microphone.h +2 -2
- esphome/components/i2s_audio/speaker/i2s_audio_speaker.cpp +273 -269
- esphome/components/i2s_audio/speaker/i2s_audio_speaker.h +19 -34
- esphome/components/ili9xxx/display.py +4 -3
- esphome/components/ili9xxx/ili9xxx_display.cpp +0 -2
- esphome/components/image/__init__.py +123 -92
- esphome/components/improv_serial/__init__.py +7 -8
- esphome/components/ina219/ina219.cpp +0 -1
- esphome/components/ina226/ina226.cpp +0 -2
- esphome/components/ina260/ina260.cpp +0 -2
- esphome/components/ina2xx_base/__init__.py +2 -5
- esphome/components/ina2xx_base/ina2xx_base.cpp +0 -2
- esphome/components/ina3221/ina3221.cpp +0 -1
- esphome/components/internal_temperature/internal_temperature.cpp +0 -2
- esphome/components/interval/interval.h +5 -9
- esphome/components/json/__init__.py +1 -1
- esphome/components/kmeteriso/kmeteriso.cpp +0 -2
- esphome/components/lc709203f/lc709203f.cpp +0 -2
- esphome/components/lcd_gpio/display.py +1 -3
- esphome/components/lcd_gpio/gpio_lcd_display.cpp +0 -1
- esphome/components/lcd_pcf8574/pcf8574_display.cpp +0 -1
- esphome/components/ld2410/__init__.py +4 -6
- esphome/components/ld2410/binary_sensor.py +4 -0
- esphome/components/ld2410/ld2410.cpp +56 -100
- esphome/components/ld2410/ld2410.h +17 -15
- esphome/components/ld2410/sensor.py +24 -10
- esphome/components/ld2412/__init__.py +46 -0
- esphome/components/ld2412/binary_sensor.py +70 -0
- esphome/components/ld2412/button/__init__.py +74 -0
- esphome/components/ld2412/button/factory_reset_button.cpp +9 -0
- esphome/components/ld2412/button/factory_reset_button.h +18 -0
- esphome/components/ld2412/button/query_button.cpp +9 -0
- esphome/components/ld2412/button/query_button.h +18 -0
- esphome/components/ld2412/button/restart_button.cpp +9 -0
- esphome/components/ld2412/button/restart_button.h +18 -0
- esphome/components/ld2412/button/start_dynamic_background_correction_button.cpp +11 -0
- esphome/components/ld2412/button/start_dynamic_background_correction_button.h +18 -0
- esphome/components/ld2412/ld2412.cpp +861 -0
- esphome/components/ld2412/ld2412.h +141 -0
- esphome/components/ld2412/number/__init__.py +126 -0
- esphome/components/ld2412/number/gate_threshold_number.cpp +14 -0
- esphome/components/ld2412/number/gate_threshold_number.h +19 -0
- esphome/components/ld2412/number/light_threshold_number.cpp +12 -0
- esphome/components/ld2412/number/light_threshold_number.h +18 -0
- esphome/components/ld2412/number/max_distance_timeout_number.cpp +12 -0
- esphome/components/ld2412/number/max_distance_timeout_number.h +18 -0
- esphome/components/ld2412/select/__init__.py +82 -0
- esphome/components/ld2412/select/baud_rate_select.cpp +12 -0
- esphome/components/ld2412/select/baud_rate_select.h +18 -0
- esphome/components/ld2412/select/distance_resolution_select.cpp +12 -0
- esphome/components/ld2412/select/distance_resolution_select.h +18 -0
- esphome/components/ld2412/select/light_out_control_select.cpp +12 -0
- esphome/components/ld2412/select/light_out_control_select.h +18 -0
- esphome/components/ld2412/sensor.py +124 -0
- esphome/components/ld2412/switch/__init__.py +45 -0
- esphome/components/ld2412/switch/bluetooth_switch.cpp +12 -0
- esphome/components/ld2412/switch/bluetooth_switch.h +18 -0
- esphome/components/ld2412/switch/engineering_mode_switch.cpp +12 -0
- esphome/components/ld2412/switch/engineering_mode_switch.h +18 -0
- esphome/components/ld2412/text_sensor.py +34 -0
- esphome/components/ld2420/ld2420.cpp +0 -1
- esphome/components/ld2450/__init__.py +3 -4
- esphome/components/ld2450/binary_sensor.py +3 -0
- esphome/components/ld2450/ld2450.cpp +77 -165
- esphome/components/ld2450/ld2450.h +26 -54
- esphome/components/ld2450/sensor.py +120 -6
- esphome/components/ld2450/text_sensor.py +5 -4
- esphome/components/ld24xx/__init__.py +1 -0
- esphome/components/ld24xx/ld24xx.h +65 -0
- esphome/components/ledc/ledc_output.cpp +0 -1
- esphome/components/libretiny/__init__.py +2 -0
- esphome/components/light/__init__.py +0 -1
- esphome/components/light/effects.py +70 -45
- esphome/components/light/light_call.cpp +101 -66
- esphome/components/light/light_color_values.h +16 -11
- esphome/components/light/light_json_schema.cpp +46 -44
- esphome/components/light/light_state.cpp +8 -11
- esphome/components/light/light_traits.h +17 -0
- esphome/components/lightwaverf/lightwaverf.cpp +0 -2
- esphome/components/lilygo_t5_47/touchscreen/lilygo_t5_47_touchscreen.cpp +0 -1
- esphome/components/lock/__init__.py +0 -1
- esphome/components/logger/__init__.py +31 -9
- esphome/components/logger/logger.cpp +12 -7
- esphome/components/logger/logger.h +25 -14
- esphome/components/logger/logger_esp32.cpp +2 -7
- esphome/components/logger/logger_esp8266.cpp +2 -4
- esphome/components/logger/logger_host.cpp +2 -4
- esphome/components/logger/logger_libretiny.cpp +2 -4
- esphome/components/logger/logger_rp2040.cpp +2 -4
- esphome/components/logger/logger_zephyr.cpp +86 -0
- esphome/components/logger/select/logger_level_select.cpp +2 -4
- esphome/components/logger/select/logger_level_select.h +2 -4
- esphome/components/logger/task_log_buffer.cpp +2 -4
- esphome/components/logger/task_log_buffer.h +2 -4
- esphome/components/lps22/sensor.py +5 -5
- esphome/components/ltr390/ltr390.cpp +0 -2
- esphome/components/ltr501/ltr501.cpp +0 -1
- esphome/components/ltr_als_ps/ltr_als_ps.cpp +0 -1
- esphome/components/lvgl/__init__.py +14 -13
- esphome/components/lvgl/automation.py +2 -4
- esphome/components/lvgl/defines.py +0 -2
- esphome/components/lvgl/helpers.py +1 -1
- esphome/components/lvgl/lv_validation.py +7 -4
- esphome/components/lvgl/lvgl_esphome.cpp +2 -3
- esphome/components/lvgl/styles.py +2 -2
- esphome/components/lvgl/types.py +1 -1
- esphome/components/lvgl/widgets/__init__.py +2 -2
- esphome/components/lvgl/widgets/arc.py +14 -11
- esphome/components/lvgl/widgets/buttonmatrix.py +1 -1
- esphome/components/lvgl/widgets/qrcode.py +7 -7
- esphome/components/lvgl/widgets/spinner.py +6 -6
- esphome/components/lvgl/widgets/switch.py +2 -2
- esphome/components/lvgl/widgets/tabview.py +3 -3
- esphome/components/m5stack_8angle/m5stack_8angle.cpp +0 -1
- esphome/components/matrix_keypad/__init__.py +4 -3
- esphome/components/max17043/max17043.cpp +0 -2
- esphome/components/max31855/max31855.cpp +1 -4
- esphome/components/max31856/max31856.cpp +0 -4
- esphome/components/max31865/max31865.cpp +0 -1
- esphome/components/max44009/max44009.cpp +0 -1
- esphome/components/max6675/max6675.cpp +1 -4
- esphome/components/max6956/max6956.cpp +0 -1
- esphome/components/max7219/max7219.cpp +0 -1
- esphome/components/max7219digit/display.py +1 -1
- esphome/components/max7219digit/max7219digit.cpp +0 -1
- esphome/components/max9611/max9611.cpp +0 -1
- esphome/components/mcp23008/__init__.py +1 -1
- esphome/components/mcp23008/mcp23008.cpp +0 -1
- esphome/components/mcp23016/mcp23016.cpp +0 -1
- esphome/components/mcp23017/__init__.py +1 -1
- esphome/components/mcp23017/mcp23017.cpp +0 -1
- esphome/components/mcp23s08/__init__.py +1 -1
- esphome/components/mcp23s08/mcp23s08.cpp +0 -1
- esphome/components/mcp23s17/__init__.py +1 -1
- esphome/components/mcp23s17/mcp23s17.cpp +0 -1
- esphome/components/mcp23x08_base/__init__.py +2 -0
- esphome/components/mcp23x08_base/mcp23x08_base.cpp +9 -7
- esphome/components/mcp23x08_base/mcp23x08_base.h +9 -4
- esphome/components/mcp23x17_base/__init__.py +2 -0
- esphome/components/mcp23x17_base/mcp23x17_base.cpp +20 -7
- esphome/components/mcp23x17_base/mcp23x17_base.h +9 -4
- esphome/components/mcp23xxx_base/__init__.py +11 -5
- esphome/components/mcp23xxx_base/mcp23xxx_base.cpp +15 -12
- esphome/components/mcp23xxx_base/mcp23xxx_base.h +8 -7
- esphome/components/mcp3008/mcp3008.cpp +1 -4
- esphome/components/mcp3204/mcp3204.cpp +1 -4
- esphome/components/mcp4461/mcp4461.cpp +0 -1
- esphome/components/mcp4725/mcp4725.cpp +0 -1
- esphome/components/mcp4728/mcp4728.cpp +0 -1
- esphome/components/mcp9600/mcp9600.cpp +0 -2
- esphome/components/mcp9808/mcp9808.cpp +0 -2
- esphome/components/mdns/__init__.py +3 -0
- esphome/components/mdns/mdns_component.cpp +2 -0
- esphome/components/mdns/mdns_component.h +4 -0
- esphome/components/media_player/__init__.py +40 -0
- esphome/components/media_player/automation.h +16 -0
- esphome/components/media_player/media_player.cpp +13 -0
- esphome/components/media_player/media_player.h +50 -3
- esphome/components/micro_wake_word/micro_wake_word.cpp +0 -3
- esphome/components/mics_4514/mics_4514.cpp +1 -6
- esphome/components/midea/ir_transmitter.h +4 -4
- esphome/components/mipi/__init__.py +416 -0
- esphome/components/mipi_dsi/__init__.py +5 -0
- esphome/components/mipi_dsi/display.py +233 -0
- esphome/components/mipi_dsi/mipi_dsi.cpp +379 -0
- esphome/components/mipi_dsi/mipi_dsi.h +123 -0
- esphome/components/mipi_dsi/models/__init__.py +0 -0
- esphome/components/mipi_dsi/models/guition.py +38 -0
- esphome/components/mipi_dsi/models/m5stack.py +57 -0
- esphome/components/mipi_dsi/models/waveshare.py +105 -0
- esphome/components/mipi_rgb/models/lilygo.py +0 -0
- esphome/components/mipi_spi/__init__.py +0 -9
- esphome/components/mipi_spi/display.py +220 -256
- esphome/components/mipi_spi/mipi_spi.cpp +1 -485
- esphome/components/mipi_spi/mipi_spi.h +556 -108
- esphome/components/mipi_spi/models/__init__.py +0 -65
- esphome/components/mipi_spi/models/adafruit.py +30 -0
- esphome/components/mipi_spi/models/amoled.py +41 -5
- esphome/components/mipi_spi/models/ili.py +5 -5
- esphome/components/mipi_spi/models/jc.py +1 -3
- esphome/components/mipi_spi/models/lilygo.py +1 -1
- esphome/components/mipi_spi/models/waveshare.py +16 -1
- esphome/components/mixer/speaker/__init__.py +4 -5
- esphome/components/mlx90393/sensor.py +7 -5
- esphome/components/mlx90393/sensor_mlx90393.cpp +0 -1
- esphome/components/mlx90614/mlx90614.cpp +0 -1
- esphome/components/mmc5603/mmc5603.cpp +0 -1
- esphome/components/mmc5983/mmc5983.cpp +0 -2
- esphome/components/mpl3115a2/mpl3115a2.cpp +0 -2
- esphome/components/mpr121/__init__.py +7 -6
- esphome/components/mpr121/mpr121.cpp +0 -1
- esphome/components/mpu6050/mpu6050.cpp +0 -1
- esphome/components/mpu6886/mpu6886.cpp +0 -1
- esphome/components/mqtt/__init__.py +1 -2
- esphome/components/mqtt/mqtt_button.cpp +1 -1
- esphome/components/mqtt/mqtt_client.cpp +0 -1
- esphome/components/mqtt/mqtt_component.cpp +8 -14
- esphome/components/mqtt/mqtt_component.h +0 -7
- esphome/components/mqtt/mqtt_sensor.cpp +0 -1
- esphome/components/mqtt/mqtt_sensor.h +0 -1
- esphome/components/mqtt/mqtt_text_sensor.cpp +0 -1
- esphome/components/mqtt/mqtt_text_sensor.h +0 -1
- esphome/components/ms5611/ms5611.cpp +0 -1
- esphome/components/ms8607/ms8607.cpp +0 -1
- esphome/components/msa3xx/msa3xx.cpp +0 -2
- esphome/components/my9231/my9231.cpp +0 -2
- esphome/components/nau7802/nau7802.cpp +0 -1
- esphome/components/neopixelbus/light.py +3 -0
- esphome/components/network/util.cpp +29 -0
- esphome/components/nextion/nextion.cpp +2 -2
- esphome/components/nfc/binary_sensor/{binary_sensor.cpp → nfc_binary_sensor.cpp} +1 -1
- esphome/components/npi19/npi19.cpp +0 -2
- esphome/components/nrf52/__init__.py +223 -0
- esphome/components/nrf52/boards.py +34 -0
- esphome/components/nrf52/const.py +18 -0
- esphome/components/nrf52/gpio.py +79 -0
- esphome/components/number/__init__.py +2 -1
- esphome/components/one_wire/__init__.py +1 -2
- esphome/components/one_wire/one_wire.cpp +0 -2
- esphome/components/one_wire/one_wire.h +0 -2
- esphome/components/opentherm/hub.cpp +0 -1
- esphome/components/opentherm/number/__init__.py +2 -2
- esphome/components/openthread/__init__.py +2 -3
- esphome/components/openthread/openthread.cpp +30 -13
- esphome/components/openthread/openthread.h +3 -0
- esphome/components/openthread/openthread_esp.cpp +3 -1
- esphome/components/opt3001/sensor.py +2 -6
- esphome/components/output/__init__.py +38 -0
- esphome/components/output/automation.h +24 -0
- esphome/components/output/switch/output_switch.cpp +0 -2
- esphome/components/packages/__init__.py +1 -2
- esphome/components/packet_transport/__init__.py +4 -3
- esphome/components/pca6416a/pca6416a.cpp +0 -1
- esphome/components/pca9554/pca9554.cpp +0 -1
- esphome/components/pca9685/pca9685_output.cpp +0 -2
- esphome/components/pcf85063/pcf85063.cpp +0 -1
- esphome/components/pcf8563/pcf8563.cpp +0 -1
- esphome/components/pcf8574/pcf8574.cpp +0 -1
- esphome/components/pi4ioe5v6408/pi4ioe5v6408.cpp +0 -1
- esphome/components/pipsolar/pipsolar.cpp +54 -42
- esphome/components/pipsolar/pipsolar.h +5 -4
- esphome/components/pipsolar/sensor/__init__.py +1 -1
- esphome/components/pm2005/pm2005.cpp +0 -1
- esphome/components/pmsa003i/pmsa003i.cpp +0 -2
- esphome/components/pmwcs3/sensor.py +1 -2
- esphome/components/pn532/pn532.cpp +0 -2
- esphome/components/pn532_spi/pn532_spi.cpp +0 -2
- esphome/components/power_supply/power_supply.cpp +7 -10
- esphome/components/power_supply/power_supply.h +1 -1
- esphome/components/psram/__init__.py +6 -1
- esphome/components/pulse_counter/pulse_counter_sensor.cpp +0 -1
- esphome/components/pulse_counter/sensor.py +9 -6
- esphome/components/pylontech/pylontech.cpp +0 -1
- esphome/components/qmc5883l/qmc5883l.cpp +0 -1
- esphome/components/qmp6988/qmp6988.cpp +0 -2
- esphome/components/qspi_dbi/display.py +2 -3
- esphome/components/qspi_dbi/qspi_dbi.cpp +0 -2
- esphome/components/qwiic_pir/binary_sensor.py +2 -3
- esphome/components/qwiic_pir/qwiic_pir.cpp +0 -2
- esphome/components/rc522/rc522.cpp +9 -31
- esphome/components/rc522_spi/rc522_spi.cpp +0 -1
- esphome/components/remote_base/__init__.py +5 -6
- esphome/components/remote_receiver/remote_receiver_esp32.cpp +0 -1
- esphome/components/remote_receiver/remote_receiver_esp8266.cpp +0 -1
- esphome/components/remote_receiver/remote_receiver_libretiny.cpp +0 -1
- esphome/components/remote_transmitter/__init__.py +26 -0
- esphome/components/remote_transmitter/automation.h +18 -0
- esphome/components/remote_transmitter/remote_transmitter.h +2 -1
- esphome/components/remote_transmitter/remote_transmitter_esp32.cpp +0 -1
- esphome/components/remote_transmitter/remote_transmitter_esp8266.cpp +2 -0
- esphome/components/remote_transmitter/remote_transmitter_libretiny.cpp +2 -0
- esphome/components/resampler/speaker/__init__.py +4 -5
- esphome/components/rf_bridge/__init__.py +4 -8
- esphome/components/rotary_encoder/rotary_encoder.cpp +0 -2
- esphome/components/rp2040/__init__.py +3 -1
- esphome/components/rp2040_pio_led_strip/led_strip.cpp +0 -2
- esphome/components/rp2040_pio_led_strip/light.py +1 -2
- esphome/components/rp2040_pwm/rp2040_pwm.cpp +1 -5
- esphome/components/rpi_dpi_rgb/display.py +13 -15
- esphome/components/rpi_dpi_rgb/rpi_dpi_rgb.cpp +0 -3
- esphome/components/runtime_stats/__init__.py +34 -0
- esphome/components/runtime_stats/runtime_stats.cpp +102 -0
- esphome/components/runtime_stats/runtime_stats.h +132 -0
- esphome/components/scd30/scd30.cpp +0 -2
- esphome/components/scd30/sensor.py +1 -2
- esphome/components/scd4x/scd4x.cpp +0 -1
- esphome/components/scd4x/sensor.py +1 -3
- esphome/components/sdl/display.py +3 -1
- esphome/components/sdl/sdl_esphome.cpp +0 -2
- esphome/components/sdp3x/sdp3x.cpp +0 -2
- esphome/components/seeed_mr24hpc1/seeed_mr24hpc1.cpp +0 -2
- esphome/components/seeed_mr60fda2/seeed_mr60fda2.cpp +0 -3
- esphome/components/select/__init__.py +2 -3
- esphome/components/select/select_traits.cpp +1 -1
- esphome/components/select/select_traits.h +1 -1
- esphome/components/sen0321/sen0321.cpp +0 -1
- esphome/components/sen5x/sen5x.cpp +0 -2
- esphome/components/senseair/senseair.cpp +7 -3
- esphome/components/senseair/senseair.h +11 -0
- esphome/components/sensor/__init__.py +36 -4
- esphome/components/sensor/filter.cpp +49 -10
- esphome/components/sensor/filter.h +22 -7
- esphome/components/sensor/sensor.cpp +0 -1
- esphome/components/sensor/sensor.h +0 -9
- esphome/components/sfa30/sfa30.cpp +0 -4
- esphome/components/sgp30/sgp30.cpp +0 -2
- esphome/components/sgp4x/sensor.py +1 -1
- esphome/components/sgp4x/sgp4x.cpp +0 -2
- esphome/components/shelly_dimmer/shelly_dimmer.cpp +0 -2
- esphome/components/sht3xd/sht3xd.cpp +0 -2
- esphome/components/sht4x/sht4x.cpp +0 -2
- esphome/components/shtcx/shtcx.cpp +0 -1
- esphome/components/sim800l/__init__.py +2 -4
- esphome/components/sm16716/sm16716.cpp +0 -1
- esphome/components/sm2135/sm2135.cpp +0 -1
- esphome/components/sm2235/sm2235.cpp +0 -1
- esphome/components/sm2335/sm2335.cpp +0 -1
- esphome/components/sn74hc165/sn74hc165.cpp +0 -1
- esphome/components/sn74hc595/sn74hc595.cpp +0 -1
- esphome/components/sntp/sntp_component.cpp +0 -1
- esphome/components/sound_level/sensor.py +1 -1
- esphome/components/speaker/media_player/__init__.py +21 -33
- esphome/components/speaker/media_player/audio_pipeline.cpp +4 -7
- esphome/components/spi/__init__.py +29 -13
- esphome/components/spi/spi.cpp +0 -2
- esphome/components/spi_device/spi_device.cpp +1 -4
- esphome/components/sprinkler/__init__.py +4 -4
- esphome/components/sps30/sps30.cpp +0 -1
- esphome/components/ssd1306_base/__init__.py +11 -11
- esphome/components/ssd1306_base/ssd1306_base.cpp +1 -1
- esphome/components/ssd1306_i2c/ssd1306_i2c.cpp +0 -1
- esphome/components/ssd1306_spi/ssd1306_spi.cpp +0 -1
- esphome/components/ssd1322_spi/ssd1322_spi.cpp +0 -1
- esphome/components/ssd1325_spi/ssd1325_spi.cpp +0 -1
- esphome/components/ssd1327_i2c/ssd1327_i2c.cpp +0 -1
- esphome/components/ssd1327_spi/ssd1327_spi.cpp +0 -1
- esphome/components/ssd1331_spi/ssd1331_spi.cpp +0 -1
- esphome/components/ssd1351_spi/ssd1351_spi.cpp +0 -1
- esphome/components/st7567_i2c/st7567_i2c.cpp +0 -1
- esphome/components/st7567_spi/st7567_spi.cpp +0 -1
- esphome/components/st7701s/display.py +10 -14
- esphome/components/st7701s/st7701s.cpp +0 -3
- esphome/components/st7735/st7735.cpp +0 -1
- esphome/components/st7789v/st7789v.cpp +0 -1
- esphome/components/st7920/st7920.cpp +0 -1
- esphome/components/status_led/light/status_led_light.cpp +0 -2
- esphome/components/status_led/status_led.cpp +0 -1
- esphome/components/stepper/__init__.py +2 -4
- esphome/components/sts3x/sts3x.cpp +0 -1
- esphome/components/substitutions/__init__.py +10 -16
- esphome/components/substitutions/jinja.py +24 -1
- esphome/components/sun/__init__.py +2 -3
- esphome/components/switch/__init__.py +31 -1
- esphome/components/switch/automation.h +24 -0
- esphome/components/switch/switch.cpp +8 -0
- esphome/components/switch/switch.h +8 -0
- esphome/components/sx126x/sx126x.cpp +0 -2
- esphome/components/sx127x/sx127x.cpp +0 -2
- esphome/components/sx1509/__init__.py +7 -5
- esphome/components/sx1509/output/sx1509_float_output.cpp +1 -1
- esphome/components/sx1509/sx1509.cpp +0 -2
- esphome/components/syslog/esphome_syslog.cpp +1 -1
- esphome/components/tc74/tc74.cpp +0 -1
- esphome/components/tca9548a/tca9548a.cpp +0 -1
- esphome/components/tca9555/tca9555.cpp +0 -1
- esphome/components/tcs34725/tcs34725.cpp +0 -1
- esphome/components/tee501/tee501.cpp +0 -1
- esphome/components/tem3200/tem3200.cpp +0 -2
- esphome/components/template/alarm_control_panel/template_alarm_control_panel.cpp +0 -1
- esphome/components/template/cover/template_cover.cpp +0 -1
- esphome/components/template/select/template_select.cpp +0 -1
- esphome/components/template/text/template_text.cpp +0 -2
- esphome/components/template/valve/template_valve.cpp +0 -1
- esphome/components/text/__init__.py +0 -1
- esphome/components/text/text_traits.h +2 -0
- esphome/components/text_sensor/__init__.py +2 -1
- esphome/components/text_sensor/text_sensor.cpp +0 -2
- esphome/components/text_sensor/text_sensor.h +0 -8
- esphome/components/thermostat/climate.py +4 -4
- esphome/components/time/__init__.py +7 -4
- esphome/components/time/real_time_clock.cpp +16 -3
- esphome/components/tlc59208f/tlc59208f_output.cpp +0 -2
- esphome/components/tlc5947/tlc5947.cpp +0 -2
- esphome/components/tlc5971/tlc5971.cpp +0 -2
- esphome/components/tm1621/tm1621.cpp +0 -2
- esphome/components/tm1637/tm1637.cpp +0 -2
- esphome/components/tm1638/tm1638.cpp +0 -2
- esphome/components/tm1651/__init__.py +45 -48
- esphome/components/tm1651/tm1651.cpp +213 -47
- esphome/components/tm1651/tm1651.h +37 -32
- esphome/components/tmp117/tmp117.cpp +0 -2
- esphome/components/tsl2561/tsl2561.cpp +0 -1
- esphome/components/tsl2591/tsl2591.cpp +0 -1
- esphome/components/tt21100/touchscreen/tt21100.cpp +0 -2
- esphome/components/ttp229_bsf/ttp229_bsf.cpp +0 -1
- esphome/components/ttp229_lsf/ttp229_lsf.cpp +0 -1
- esphome/components/tuya/climate/__init__.py +9 -10
- esphome/components/tuya/number/__init__.py +8 -6
- esphome/components/tx20/tx20.cpp +0 -1
- esphome/components/uart/uart_component_esp32_arduino.cpp +0 -1
- esphome/components/uart/uart_component_esp8266.cpp +0 -1
- esphome/components/uart/uart_component_esp_idf.cpp +0 -2
- esphome/components/uart/uart_component_libretiny.cpp +0 -2
- esphome/components/uart/uart_component_rp2040.cpp +0 -2
- esphome/components/udp/__init__.py +1 -1
- esphome/components/ufire_ec/sensor.py +1 -2
- esphome/components/ufire_ec/ufire_ec.cpp +0 -2
- esphome/components/ufire_ise/sensor.py +1 -2
- esphome/components/ufire_ise/ufire_ise.cpp +0 -2
- esphome/components/ultrasonic/ultrasonic_sensor.cpp +0 -1
- esphome/components/update/__init__.py +0 -1
- esphome/components/uptime/sensor/uptime_seconds_sensor.cpp +0 -1
- esphome/components/uptime/sensor/uptime_seconds_sensor.h +0 -2
- esphome/components/usb_host/usb_host_client.cpp +0 -1
- esphome/components/usb_host/usb_host_component.cpp +0 -1
- esphome/components/valve/__init__.py +0 -1
- esphome/components/veml3235/veml3235.cpp +0 -3
- esphome/components/veml7700/veml7700.cpp +0 -2
- esphome/components/version/version_text_sensor.cpp +0 -1
- esphome/components/version/version_text_sensor.h +0 -1
- esphome/components/vl53l0x/vl53l0x_sensor.cpp +0 -4
- esphome/components/voice_assistant/voice_assistant.cpp +9 -8
- esphome/components/web_server/__init__.py +13 -0
- esphome/components/web_server/web_server.cpp +188 -353
- esphome/components/web_server/web_server.h +61 -1
- esphome/components/web_server_base/__init__.py +1 -1
- esphome/components/web_server_base/web_server_base.cpp +2 -0
- esphome/components/web_server_base/web_server_base.h +6 -0
- esphome/components/web_server_idf/web_server_idf.cpp +10 -8
- esphome/components/web_server_idf/web_server_idf.h +2 -0
- esphome/components/weikai_i2c/weikai_i2c.cpp +1 -2
- esphome/components/weikai_spi/weikai_spi.cpp +1 -1
- esphome/components/wifi/__init__.py +17 -43
- esphome/components/wifi/wifi_component.cpp +100 -36
- esphome/components/wifi/wifi_component.h +5 -1
- esphome/components/wifi/wifi_component_esp32_arduino.cpp +30 -0
- esphome/components/wifi/wifi_component_esp_idf.cpp +30 -0
- esphome/components/wifi_info/wifi_info_text_sensor.h +0 -6
- esphome/components/wifi_signal/wifi_signal_sensor.h +0 -1
- esphome/components/wireguard/wireguard.cpp +0 -2
- esphome/components/x9c/x9c.cpp +0 -2
- esphome/components/xgzp68xx/xgzp68xx.cpp +0 -1
- esphome/components/xl9535/xl9535.cpp +0 -2
- esphome/components/zephyr/__init__.py +252 -0
- esphome/components/zephyr/const.py +16 -0
- esphome/components/zephyr/core.cpp +90 -0
- esphome/components/zephyr/gpio.cpp +120 -0
- esphome/components/zephyr/gpio.h +38 -0
- esphome/components/zephyr/pre_build.py.script +4 -0
- esphome/components/zephyr/preferences.cpp +156 -0
- esphome/components/zephyr/preferences.h +13 -0
- esphome/config.py +38 -16
- esphome/config_helpers.py +1 -2
- esphome/config_validation.py +12 -16
- esphome/const.py +26 -1
- esphome/core/__init__.py +92 -51
- esphome/core/application.cpp +75 -21
- esphome/core/application.h +106 -171
- esphome/core/color.h +10 -0
- esphome/core/component.cpp +41 -25
- esphome/core/component.h +9 -6
- esphome/core/component_iterator.cpp +61 -261
- esphome/core/component_iterator.h +15 -0
- esphome/core/config.py +26 -11
- esphome/core/defines.h +40 -2
- esphome/core/entity_base.h +18 -0
- esphome/core/entity_helpers.py +45 -10
- esphome/core/helpers.cpp +8 -15
- esphome/core/helpers.h +60 -6
- esphome/core/lock_free_queue.h +1 -1
- esphome/core/scheduler.cpp +311 -77
- esphome/core/scheduler.h +141 -28
- esphome/cpp_generator.py +2 -6
- esphome/cpp_helpers.py +1 -1
- esphome/dashboard/dashboard.py +2 -3
- esphome/dashboard/dns.py +2 -8
- esphome/dashboard/web_server.py +34 -19
- esphome/espota2.py +1 -4
- esphome/git.py +3 -1
- esphome/helpers.py +23 -4
- esphome/log.py +3 -1
- esphome/mqtt.py +3 -5
- esphome/platformio_api.py +7 -4
- esphome/types.py +12 -0
- esphome/util.py +20 -8
- esphome/voluptuous_schema.py +4 -3
- esphome/vscode.py +1 -2
- esphome/wizard.py +1 -4
- esphome/writer.py +16 -108
- esphome/yaml_util.py +7 -5
- {esphome-2025.7.5.dist-info → esphome-2025.8.0.dist-info}/METADATA +13 -14
- {esphome-2025.7.5.dist-info → esphome-2025.8.0.dist-info}/RECORD +755 -675
- esphome/components/mipi_spi/models/commands.py +0 -82
- /esphome/components/nfc/binary_sensor/{binary_sensor.h → nfc_binary_sensor.h} +0 -0
- {esphome-2025.7.5.dist-info → esphome-2025.8.0.dist-info}/WHEEL +0 -0
- {esphome-2025.7.5.dist-info → esphome-2025.8.0.dist-info}/entry_points.txt +0 -0
- {esphome-2025.7.5.dist-info → esphome-2025.8.0.dist-info}/licenses/LICENSE +0 -0
- {esphome-2025.7.5.dist-info → esphome-2025.8.0.dist-info}/top_level.txt +0 -0
esphome/core/__init__.py
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
from collections import defaultdict
|
|
2
|
+
from contextlib import contextmanager
|
|
2
3
|
import logging
|
|
3
4
|
import math
|
|
4
5
|
import os
|
|
@@ -21,6 +22,7 @@ from esphome.const import (
|
|
|
21
22
|
PLATFORM_ESP8266,
|
|
22
23
|
PLATFORM_HOST,
|
|
23
24
|
PLATFORM_LN882X,
|
|
25
|
+
PLATFORM_NRF52,
|
|
24
26
|
PLATFORM_RP2040,
|
|
25
27
|
PLATFORM_RTL87XX,
|
|
26
28
|
)
|
|
@@ -37,7 +39,7 @@ from esphome.util import OrderedDict
|
|
|
37
39
|
|
|
38
40
|
if TYPE_CHECKING:
|
|
39
41
|
from ..cpp_generator import MockObj, MockObjClass, Statement
|
|
40
|
-
from ..types import ConfigType
|
|
42
|
+
from ..types import ConfigType, EntityMetadata
|
|
41
43
|
|
|
42
44
|
_LOGGER = logging.getLogger(__name__)
|
|
43
45
|
|
|
@@ -262,7 +264,7 @@ class TimePeriodMinutes(TimePeriod):
|
|
|
262
264
|
pass
|
|
263
265
|
|
|
264
266
|
|
|
265
|
-
LAMBDA_PROG = re.compile(r"
|
|
267
|
+
LAMBDA_PROG = re.compile(r"\bid\(\s*([a-zA-Z_][a-zA-Z0-9_]*)\s*\)(\.?)")
|
|
266
268
|
|
|
267
269
|
|
|
268
270
|
class Lambda:
|
|
@@ -469,6 +471,52 @@ class Library:
|
|
|
469
471
|
return self.as_tuple == other.as_tuple
|
|
470
472
|
return NotImplemented
|
|
471
473
|
|
|
474
|
+
def reconcile_with(self, other):
|
|
475
|
+
"""Merge two libraries, reconciling any conflicts."""
|
|
476
|
+
|
|
477
|
+
if self.name != other.name:
|
|
478
|
+
# Different libraries, no reconciliation possible
|
|
479
|
+
raise ValueError(
|
|
480
|
+
f"Cannot reconcile libraries with different names: {self.name} and {other.name}"
|
|
481
|
+
)
|
|
482
|
+
|
|
483
|
+
# repository specificity takes precedence over version specificity
|
|
484
|
+
if self.repository is None and other.repository is None:
|
|
485
|
+
pass # No repositories, no conflict, continue on
|
|
486
|
+
|
|
487
|
+
elif self.repository is None:
|
|
488
|
+
# incoming library has a repository, use it
|
|
489
|
+
self.repository = other.repository
|
|
490
|
+
self.version = other.version
|
|
491
|
+
return self
|
|
492
|
+
|
|
493
|
+
elif other.repository is None:
|
|
494
|
+
return self # use the repository/version already present
|
|
495
|
+
|
|
496
|
+
elif self.repository != other.repository:
|
|
497
|
+
raise ValueError(
|
|
498
|
+
f"Reconciliation failed! Libraries {self} and {other} requested with conflicting repositories!"
|
|
499
|
+
)
|
|
500
|
+
|
|
501
|
+
if self.version is None and other.version is None:
|
|
502
|
+
return self # Arduino library reconciled against another Arduino library, current is acceptable
|
|
503
|
+
|
|
504
|
+
if self.version is None:
|
|
505
|
+
# incoming library has a version, use it
|
|
506
|
+
self.version = other.version
|
|
507
|
+
return self
|
|
508
|
+
|
|
509
|
+
if other.version is None:
|
|
510
|
+
return self # incoming library has no version, current is acceptable
|
|
511
|
+
|
|
512
|
+
# Same versions, current library is acceptable
|
|
513
|
+
if self.version != other.version:
|
|
514
|
+
raise ValueError(
|
|
515
|
+
f"Version pinning failed! Libraries {other} and {self} "
|
|
516
|
+
"requested with conflicting versions!"
|
|
517
|
+
)
|
|
518
|
+
return self
|
|
519
|
+
|
|
472
520
|
|
|
473
521
|
# pylint: disable=too-many-public-methods
|
|
474
522
|
class EsphomeCore:
|
|
@@ -504,8 +552,8 @@ class EsphomeCore:
|
|
|
504
552
|
self.main_statements: list[Statement] = []
|
|
505
553
|
# A list of statements to insert in the global block (includes and global variables)
|
|
506
554
|
self.global_statements: list[Statement] = []
|
|
507
|
-
# A
|
|
508
|
-
self.
|
|
555
|
+
# A map of platformio libraries to add to the project (shortname: (name, version, repository))
|
|
556
|
+
self.platformio_libraries: dict[str, Library] = {}
|
|
509
557
|
# A set of build flags to set in the platformio project
|
|
510
558
|
self.build_flags: set[str] = set()
|
|
511
559
|
# A set of build unflags to set in the platformio project
|
|
@@ -524,14 +572,16 @@ class EsphomeCore:
|
|
|
524
572
|
# Key: platform name (e.g. "sensor", "binary_sensor"), Value: count
|
|
525
573
|
self.platform_counts: defaultdict[str, int] = defaultdict(int)
|
|
526
574
|
# Track entity unique IDs to handle duplicates
|
|
527
|
-
#
|
|
528
|
-
self.unique_ids:
|
|
575
|
+
# Dict mapping (device_id, platform, sanitized_name) -> entity metadata
|
|
576
|
+
self.unique_ids: dict[tuple[str, str, str], EntityMetadata] = {}
|
|
529
577
|
# Whether ESPHome was started in verbose mode
|
|
530
578
|
self.verbose = False
|
|
531
579
|
# Whether ESPHome was started in quiet mode
|
|
532
580
|
self.quiet = False
|
|
533
581
|
# A list of all known ID classes
|
|
534
582
|
self.id_classes = {}
|
|
583
|
+
# The current component being processed during validation
|
|
584
|
+
self.current_component: str | None = None
|
|
535
585
|
|
|
536
586
|
def reset(self):
|
|
537
587
|
from esphome.pins import PIN_SCHEMA_REGISTRY
|
|
@@ -549,7 +599,7 @@ class EsphomeCore:
|
|
|
549
599
|
self.variables = {}
|
|
550
600
|
self.main_statements = []
|
|
551
601
|
self.global_statements = []
|
|
552
|
-
self.
|
|
602
|
+
self.platformio_libraries = {}
|
|
553
603
|
self.build_flags = set()
|
|
554
604
|
self.build_unflags = set()
|
|
555
605
|
self.defines = set()
|
|
@@ -557,9 +607,20 @@ class EsphomeCore:
|
|
|
557
607
|
self.loaded_integrations = set()
|
|
558
608
|
self.component_ids = set()
|
|
559
609
|
self.platform_counts = defaultdict(int)
|
|
560
|
-
self.unique_ids =
|
|
610
|
+
self.unique_ids = {}
|
|
611
|
+
self.current_component = None
|
|
561
612
|
PIN_SCHEMA_REGISTRY.reset()
|
|
562
613
|
|
|
614
|
+
@contextmanager
|
|
615
|
+
def component_context(self, component: str):
|
|
616
|
+
"""Context manager to set the current component being processed."""
|
|
617
|
+
old_component = self.current_component
|
|
618
|
+
self.current_component = component
|
|
619
|
+
try:
|
|
620
|
+
yield
|
|
621
|
+
finally:
|
|
622
|
+
self.current_component = old_component
|
|
623
|
+
|
|
563
624
|
@property
|
|
564
625
|
def address(self) -> str | None:
|
|
565
626
|
if self.config is None:
|
|
@@ -670,6 +731,10 @@ class EsphomeCore:
|
|
|
670
731
|
def is_libretiny(self):
|
|
671
732
|
return self.is_bk72xx or self.is_rtl87xx or self.is_ln882x
|
|
672
733
|
|
|
734
|
+
@property
|
|
735
|
+
def is_nrf52(self):
|
|
736
|
+
return self.target_platform == PLATFORM_NRF52
|
|
737
|
+
|
|
673
738
|
@property
|
|
674
739
|
def is_host(self):
|
|
675
740
|
return self.target_platform == PLATFORM_HOST
|
|
@@ -686,6 +751,10 @@ class EsphomeCore:
|
|
|
686
751
|
def using_esp_idf(self):
|
|
687
752
|
return self.target_framework == "esp-idf"
|
|
688
753
|
|
|
754
|
+
@property
|
|
755
|
+
def using_zephyr(self):
|
|
756
|
+
return self.target_framework == "zephyr"
|
|
757
|
+
|
|
689
758
|
def add_job(self, func, *args, **kwargs) -> None:
|
|
690
759
|
self.event_loop.add_job(func, *args, **kwargs)
|
|
691
760
|
|
|
@@ -729,54 +798,26 @@ class EsphomeCore:
|
|
|
729
798
|
_LOGGER.debug("Adding global: %s", expression)
|
|
730
799
|
return expression
|
|
731
800
|
|
|
732
|
-
def add_library(self, library):
|
|
801
|
+
def add_library(self, library: Library):
|
|
733
802
|
if not isinstance(library, Library):
|
|
734
|
-
raise
|
|
803
|
+
raise TypeError(
|
|
735
804
|
f"Library {library} must be instance of Library, not {type(library)}"
|
|
736
805
|
)
|
|
737
|
-
for other in self.libraries[:]:
|
|
738
|
-
if other.name is None or library.name is None:
|
|
739
|
-
continue
|
|
740
|
-
library_name = (
|
|
741
|
-
library.name if "/" not in library.name else library.name.split("/")[1]
|
|
742
|
-
)
|
|
743
|
-
other_name = (
|
|
744
|
-
other.name if "/" not in other.name else other.name.split("/")[1]
|
|
745
|
-
)
|
|
746
|
-
if other_name != library_name:
|
|
747
|
-
continue
|
|
748
|
-
if other.repository is not None:
|
|
749
|
-
if library.repository is None or other.repository == library.repository:
|
|
750
|
-
# Other is using a/the same repository, takes precedence
|
|
751
|
-
break
|
|
752
|
-
raise ValueError(
|
|
753
|
-
f"Adding named Library with repository failed! Libraries {library} and {other} "
|
|
754
|
-
"requested with conflicting repositories!"
|
|
755
|
-
)
|
|
756
|
-
|
|
757
|
-
if library.repository is not None:
|
|
758
|
-
# This is more specific since its using a repository
|
|
759
|
-
self.libraries.remove(other)
|
|
760
|
-
continue
|
|
761
|
-
|
|
762
|
-
if library.version is None:
|
|
763
|
-
# Other requirement is more specific
|
|
764
|
-
break
|
|
765
|
-
if other.version is None:
|
|
766
|
-
# Found more specific version requirement
|
|
767
|
-
self.libraries.remove(other)
|
|
768
|
-
continue
|
|
769
|
-
if other.version == library.version:
|
|
770
|
-
break
|
|
771
806
|
|
|
772
|
-
|
|
773
|
-
|
|
774
|
-
|
|
775
|
-
|
|
776
|
-
|
|
807
|
+
if not library.name:
|
|
808
|
+
raise ValueError(f"The library for {library.repository} must have a name")
|
|
809
|
+
|
|
810
|
+
short_name = (
|
|
811
|
+
library.name if "/" not in library.name else library.name.split("/")[-1]
|
|
812
|
+
)
|
|
813
|
+
|
|
814
|
+
if short_name not in self.platformio_libraries:
|
|
777
815
|
_LOGGER.debug("Adding library: %s", library)
|
|
778
|
-
self.
|
|
779
|
-
|
|
816
|
+
self.platformio_libraries[short_name] = library
|
|
817
|
+
return library
|
|
818
|
+
|
|
819
|
+
self.platformio_libraries[short_name].reconcile_with(library)
|
|
820
|
+
return self.platformio_libraries[short_name]
|
|
780
821
|
|
|
781
822
|
def add_build_flag(self, build_flag: str) -> str:
|
|
782
823
|
self.build_flags.add(build_flag)
|
esphome/core/application.cpp
CHANGED
|
@@ -4,6 +4,9 @@
|
|
|
4
4
|
#include "esphome/core/hal.h"
|
|
5
5
|
#include <algorithm>
|
|
6
6
|
#include <ranges>
|
|
7
|
+
#ifdef USE_RUNTIME_STATS
|
|
8
|
+
#include "esphome/components/runtime_stats/runtime_stats.h"
|
|
9
|
+
#endif
|
|
7
10
|
|
|
8
11
|
#ifdef USE_STATUS_LED
|
|
9
12
|
#include "esphome/components/status_led/status_led.h"
|
|
@@ -31,6 +34,44 @@ namespace esphome {
|
|
|
31
34
|
|
|
32
35
|
static const char *const TAG = "app";
|
|
33
36
|
|
|
37
|
+
// Helper function for insertion sort of components by setup priority
|
|
38
|
+
// Using insertion sort instead of std::stable_sort saves ~1.3KB of flash
|
|
39
|
+
// by avoiding template instantiations (std::rotate, std::stable_sort, lambdas)
|
|
40
|
+
// IMPORTANT: This sort is stable (preserves relative order of equal elements),
|
|
41
|
+
// which is necessary to maintain user-defined component order for same priority
|
|
42
|
+
template<typename Iterator> static void insertion_sort_by_setup_priority(Iterator first, Iterator last) {
|
|
43
|
+
for (auto it = first + 1; it != last; ++it) {
|
|
44
|
+
auto key = *it;
|
|
45
|
+
float key_priority = key->get_actual_setup_priority();
|
|
46
|
+
auto j = it - 1;
|
|
47
|
+
|
|
48
|
+
// Using '<' (not '<=') ensures stability - equal priority components keep their order
|
|
49
|
+
while (j >= first && (*j)->get_actual_setup_priority() < key_priority) {
|
|
50
|
+
*(j + 1) = *j;
|
|
51
|
+
j--;
|
|
52
|
+
}
|
|
53
|
+
*(j + 1) = key;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
// Helper function for insertion sort of components by loop priority
|
|
58
|
+
// IMPORTANT: This sort is stable (preserves relative order of equal elements),
|
|
59
|
+
// which is required when components are re-sorted during setup() if they block
|
|
60
|
+
template<typename Iterator> static void insertion_sort_by_loop_priority(Iterator first, Iterator last) {
|
|
61
|
+
for (auto it = first + 1; it != last; ++it) {
|
|
62
|
+
auto key = *it;
|
|
63
|
+
float key_priority = key->get_loop_priority();
|
|
64
|
+
auto j = it - 1;
|
|
65
|
+
|
|
66
|
+
// Using '<' (not '<=') ensures stability - equal priority components keep their order
|
|
67
|
+
while (j >= first && (*j)->get_loop_priority() < key_priority) {
|
|
68
|
+
*(j + 1) = *j;
|
|
69
|
+
j--;
|
|
70
|
+
}
|
|
71
|
+
*(j + 1) = key;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
|
|
34
75
|
void Application::register_component_(Component *comp) {
|
|
35
76
|
if (comp == nullptr) {
|
|
36
77
|
ESP_LOGW(TAG, "Tried to register null component!");
|
|
@@ -48,9 +89,12 @@ void Application::register_component_(Component *comp) {
|
|
|
48
89
|
void Application::setup() {
|
|
49
90
|
ESP_LOGI(TAG, "Running through setup()");
|
|
50
91
|
ESP_LOGV(TAG, "Sorting components by setup priority");
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
92
|
+
|
|
93
|
+
// Sort by setup priority using our helper function
|
|
94
|
+
insertion_sort_by_setup_priority(this->components_.begin(), this->components_.end());
|
|
95
|
+
|
|
96
|
+
// Initialize looping_components_ early so enable_pending_loops_() works during setup
|
|
97
|
+
this->calculate_looping_components_();
|
|
54
98
|
|
|
55
99
|
for (uint32_t i = 0; i < this->components_.size(); i++) {
|
|
56
100
|
Component *component = this->components_[i];
|
|
@@ -63,8 +107,8 @@ void Application::setup() {
|
|
|
63
107
|
if (component->can_proceed())
|
|
64
108
|
continue;
|
|
65
109
|
|
|
66
|
-
|
|
67
|
-
|
|
110
|
+
// Sort components 0 through i by loop priority
|
|
111
|
+
insertion_sort_by_loop_priority(this->components_.begin(), this->components_.begin() + i + 1);
|
|
68
112
|
|
|
69
113
|
do {
|
|
70
114
|
uint8_t new_app_state = STATUS_LED_WARNING;
|
|
@@ -94,7 +138,6 @@ void Application::setup() {
|
|
|
94
138
|
clear_setup_priority_overrides();
|
|
95
139
|
|
|
96
140
|
this->schedule_dump_config();
|
|
97
|
-
this->calculate_looping_components_();
|
|
98
141
|
}
|
|
99
142
|
void Application::loop() {
|
|
100
143
|
uint8_t new_app_state = 0;
|
|
@@ -126,6 +169,14 @@ void Application::loop() {
|
|
|
126
169
|
this->after_loop_tasks_();
|
|
127
170
|
this->app_state_ = new_app_state;
|
|
128
171
|
|
|
172
|
+
#ifdef USE_RUNTIME_STATS
|
|
173
|
+
// Process any pending runtime stats printing after all components have run
|
|
174
|
+
// This ensures stats printing doesn't affect component timing measurements
|
|
175
|
+
if (global_runtime_stats != nullptr) {
|
|
176
|
+
global_runtime_stats->process_pending_stats(last_op_end_time);
|
|
177
|
+
}
|
|
178
|
+
#endif
|
|
179
|
+
|
|
129
180
|
// Use the last component's end time instead of calling millis() again
|
|
130
181
|
auto elapsed = last_op_end_time - this->last_loop_;
|
|
131
182
|
if (elapsed >= this->loop_interval_ || HighFrequencyLoopRequester::is_high_frequency()) {
|
|
@@ -134,7 +185,7 @@ void Application::loop() {
|
|
|
134
185
|
this->yield_with_select_(0);
|
|
135
186
|
} else {
|
|
136
187
|
uint32_t delay_time = this->loop_interval_ - elapsed;
|
|
137
|
-
uint32_t next_schedule = this->scheduler.next_schedule_in().value_or(delay_time);
|
|
188
|
+
uint32_t next_schedule = this->scheduler.next_schedule_in(last_op_end_time).value_or(delay_time);
|
|
138
189
|
// next_schedule is max 0.5*delay_time
|
|
139
190
|
// otherwise interval=0 schedules result in constant looping with almost no sleep
|
|
140
191
|
next_schedule = std::max(next_schedule, delay_time / 2);
|
|
@@ -258,7 +309,9 @@ void Application::calculate_looping_components_() {
|
|
|
258
309
|
// Pre-reserve vector to avoid reallocations
|
|
259
310
|
this->looping_components_.reserve(total_looping);
|
|
260
311
|
|
|
261
|
-
//
|
|
312
|
+
// Add all components with loop override that aren't already LOOP_DONE
|
|
313
|
+
// Some components (like logger) may call disable_loop() during initialization
|
|
314
|
+
// before setup runs, so we need to respect their LOOP_DONE state
|
|
262
315
|
for (auto *obj : this->components_) {
|
|
263
316
|
if (obj->has_overridden_loop() &&
|
|
264
317
|
(obj->get_component_state() & COMPONENT_STATE_MASK) != COMPONENT_STATE_LOOP_DONE) {
|
|
@@ -268,8 +321,8 @@ void Application::calculate_looping_components_() {
|
|
|
268
321
|
|
|
269
322
|
this->looping_components_active_end_ = this->looping_components_.size();
|
|
270
323
|
|
|
271
|
-
// Then add
|
|
272
|
-
// This handles components that called disable_loop() during
|
|
324
|
+
// Then add any components that are already LOOP_DONE to the inactive section
|
|
325
|
+
// This handles components that called disable_loop() during initialization
|
|
273
326
|
for (auto *obj : this->components_) {
|
|
274
327
|
if (obj->has_overridden_loop() &&
|
|
275
328
|
(obj->get_component_state() & COMPONENT_STATE_MASK) == COMPONENT_STATE_LOOP_DONE) {
|
|
@@ -387,7 +440,7 @@ void Application::enable_pending_loops_() {
|
|
|
387
440
|
|
|
388
441
|
void Application::before_loop_tasks_(uint32_t loop_start_time) {
|
|
389
442
|
// Process scheduled tasks
|
|
390
|
-
this->scheduler.call();
|
|
443
|
+
this->scheduler.call(loop_start_time);
|
|
391
444
|
|
|
392
445
|
// Feed the watchdog timer
|
|
393
446
|
this->feed_wdt(loop_start_time);
|
|
@@ -444,24 +497,25 @@ void Application::unregister_socket_fd(int fd) {
|
|
|
444
497
|
if (fd < 0)
|
|
445
498
|
return;
|
|
446
499
|
|
|
447
|
-
|
|
448
|
-
|
|
500
|
+
for (size_t i = 0; i < this->socket_fds_.size(); i++) {
|
|
501
|
+
if (this->socket_fds_[i] != fd)
|
|
502
|
+
continue;
|
|
503
|
+
|
|
449
504
|
// Swap with last element and pop - O(1) removal since order doesn't matter
|
|
450
|
-
if (
|
|
451
|
-
|
|
452
|
-
}
|
|
505
|
+
if (i < this->socket_fds_.size() - 1)
|
|
506
|
+
this->socket_fds_[i] = this->socket_fds_.back();
|
|
453
507
|
this->socket_fds_.pop_back();
|
|
454
508
|
this->socket_fds_changed_ = true;
|
|
455
509
|
|
|
456
510
|
// Only recalculate max_fd if we removed the current max
|
|
457
511
|
if (fd == this->max_fd_) {
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
this->max_fd_ = *std::max_element(this->socket_fds_.begin(), this->socket_fds_.end());
|
|
512
|
+
this->max_fd_ = -1;
|
|
513
|
+
for (int sock_fd : this->socket_fds_) {
|
|
514
|
+
if (sock_fd > this->max_fd_)
|
|
515
|
+
this->max_fd_ = sock_fd;
|
|
463
516
|
}
|
|
464
517
|
}
|
|
518
|
+
return;
|
|
465
519
|
}
|
|
466
520
|
}
|
|
467
521
|
|