esphome 2025.7.4__py3-none-any.whl → 2025.8.0b1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of esphome might be problematic. Click here for more details.
- esphome/__main__.py +189 -82
- 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 +112 -56
- 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 +488 -118
- esphome/components/atm90e32/atm90e32.h +44 -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 +387 -82
- 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 +199 -58
- 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 +40 -2
- esphome/components/esp32_ble/ble.cpp +12 -8
- 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 +2 -4
- 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/font/__init__.py +9 -1
- 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 +46 -19
- esphome/components/i2s_audio/microphone/i2s_audio_microphone.h +4 -3
- 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/lvgl/widgets/tileview.py +15 -7
- 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 +0 -1
- 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/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 +2 -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/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 +187 -352
- 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 +8 -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 +8 -15
- esphome/const.py +26 -1
- esphome/core/__init__.py +88 -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 +41 -6
- esphome/core/helpers.cpp +8 -15
- esphome/core/helpers.h +60 -6
- esphome/core/lock_free_queue.h +1 -1
- esphome/core/scheduler.cpp +277 -74
- esphome/core/scheduler.h +89 -27
- 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 +5 -107
- esphome/yaml_util.py +7 -5
- {esphome-2025.7.4.dist-info → esphome-2025.8.0b1.dist-info}/METADATA +12 -13
- {esphome-2025.7.4.dist-info → esphome-2025.8.0b1.dist-info}/RECORD +753 -673
- 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.4.dist-info → esphome-2025.8.0b1.dist-info}/WHEEL +0 -0
- {esphome-2025.7.4.dist-info → esphome-2025.8.0b1.dist-info}/entry_points.txt +0 -0
- {esphome-2025.7.4.dist-info → esphome-2025.8.0b1.dist-info}/licenses/LICENSE +0 -0
- {esphome-2025.7.4.dist-info → esphome-2025.8.0b1.dist-info}/top_level.txt +0 -0
esphome/__main__.py
CHANGED
|
@@ -2,12 +2,14 @@
|
|
|
2
2
|
import argparse
|
|
3
3
|
from datetime import datetime
|
|
4
4
|
import functools
|
|
5
|
+
import getpass
|
|
5
6
|
import importlib
|
|
6
7
|
import logging
|
|
7
8
|
import os
|
|
8
9
|
import re
|
|
9
10
|
import sys
|
|
10
11
|
import time
|
|
12
|
+
from typing import Protocol
|
|
11
13
|
|
|
12
14
|
import argcomplete
|
|
13
15
|
|
|
@@ -34,6 +36,7 @@ from esphome.const import (
|
|
|
34
36
|
CONF_PORT,
|
|
35
37
|
CONF_SUBSTITUTIONS,
|
|
36
38
|
CONF_TOPIC,
|
|
39
|
+
ENV_NOGITIGNORE,
|
|
37
40
|
PLATFORM_ESP32,
|
|
38
41
|
PLATFORM_ESP8266,
|
|
39
42
|
PLATFORM_RP2040,
|
|
@@ -42,6 +45,7 @@ from esphome.const import (
|
|
|
42
45
|
from esphome.core import CORE, EsphomeError, coroutine
|
|
43
46
|
from esphome.helpers import get_bool_env, indent, is_ip_address
|
|
44
47
|
from esphome.log import AnsiFore, color, setup_log
|
|
48
|
+
from esphome.types import ConfigType
|
|
45
49
|
from esphome.util import (
|
|
46
50
|
get_serial_ports,
|
|
47
51
|
list_yaml_files,
|
|
@@ -53,6 +57,23 @@ from esphome.util import (
|
|
|
53
57
|
_LOGGER = logging.getLogger(__name__)
|
|
54
58
|
|
|
55
59
|
|
|
60
|
+
class ArgsProtocol(Protocol):
|
|
61
|
+
device: list[str] | None
|
|
62
|
+
reset: bool
|
|
63
|
+
username: str | None
|
|
64
|
+
password: str | None
|
|
65
|
+
client_id: str | None
|
|
66
|
+
topic: str | None
|
|
67
|
+
file: str | None
|
|
68
|
+
no_logs: bool
|
|
69
|
+
only_generate: bool
|
|
70
|
+
show_secrets: bool
|
|
71
|
+
dashboard: bool
|
|
72
|
+
configuration: str
|
|
73
|
+
name: str
|
|
74
|
+
upload_speed: str | None
|
|
75
|
+
|
|
76
|
+
|
|
56
77
|
def choose_prompt(options, purpose: str = None):
|
|
57
78
|
if not options:
|
|
58
79
|
raise EsphomeError(
|
|
@@ -86,30 +107,54 @@ def choose_prompt(options, purpose: str = None):
|
|
|
86
107
|
|
|
87
108
|
|
|
88
109
|
def choose_upload_log_host(
|
|
89
|
-
default
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
110
|
+
default: list[str] | str | None,
|
|
111
|
+
check_default: str | None,
|
|
112
|
+
show_ota: bool,
|
|
113
|
+
show_mqtt: bool,
|
|
114
|
+
show_api: bool,
|
|
115
|
+
purpose: str | None = None,
|
|
116
|
+
) -> list[str]:
|
|
117
|
+
# Convert to list for uniform handling
|
|
118
|
+
defaults = [default] if isinstance(default, str) else default or []
|
|
119
|
+
|
|
120
|
+
# If devices specified, resolve them
|
|
121
|
+
if defaults:
|
|
122
|
+
resolved: list[str] = []
|
|
123
|
+
for device in defaults:
|
|
124
|
+
if device == "SERIAL":
|
|
125
|
+
serial_ports = get_serial_ports()
|
|
126
|
+
if not serial_ports:
|
|
127
|
+
_LOGGER.warning("No serial ports found, skipping SERIAL device")
|
|
128
|
+
continue
|
|
129
|
+
options = [
|
|
130
|
+
(f"{port.path} ({port.description})", port.path)
|
|
131
|
+
for port in serial_ports
|
|
132
|
+
]
|
|
133
|
+
resolved.append(choose_prompt(options, purpose=purpose))
|
|
134
|
+
elif device == "OTA":
|
|
135
|
+
if (show_ota and "ota" in CORE.config) or (
|
|
136
|
+
show_api and "api" in CORE.config
|
|
137
|
+
):
|
|
138
|
+
resolved.append(CORE.address)
|
|
139
|
+
elif show_mqtt and has_mqtt_logging():
|
|
140
|
+
resolved.append("MQTT")
|
|
141
|
+
else:
|
|
142
|
+
resolved.append(device)
|
|
143
|
+
return resolved
|
|
144
|
+
|
|
145
|
+
# No devices specified, show interactive chooser
|
|
146
|
+
options = [
|
|
147
|
+
(f"{port.path} ({port.description})", port.path) for port in get_serial_ports()
|
|
148
|
+
]
|
|
96
149
|
if (show_ota and "ota" in CORE.config) or (show_api and "api" in CORE.config):
|
|
97
150
|
options.append((f"Over The Air ({CORE.address})", CORE.address))
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
if (
|
|
101
|
-
show_mqtt
|
|
102
|
-
and (mqtt_config := CORE.config.get(CONF_MQTT))
|
|
103
|
-
and mqtt_logging_enabled(mqtt_config)
|
|
104
|
-
):
|
|
151
|
+
if show_mqtt and has_mqtt_logging():
|
|
152
|
+
mqtt_config = CORE.config[CONF_MQTT]
|
|
105
153
|
options.append((f"MQTT ({mqtt_config[CONF_BROKER]})", "MQTT"))
|
|
106
|
-
|
|
107
|
-
return "MQTT"
|
|
108
|
-
if default is not None:
|
|
109
|
-
return default
|
|
154
|
+
|
|
110
155
|
if check_default is not None and check_default in [opt[1] for opt in options]:
|
|
111
|
-
return check_default
|
|
112
|
-
return choose_prompt(options, purpose=purpose)
|
|
156
|
+
return [check_default]
|
|
157
|
+
return [choose_prompt(options, purpose=purpose)]
|
|
113
158
|
|
|
114
159
|
|
|
115
160
|
def mqtt_logging_enabled(mqtt_config):
|
|
@@ -118,12 +163,17 @@ def mqtt_logging_enabled(mqtt_config):
|
|
|
118
163
|
return False
|
|
119
164
|
if CONF_TOPIC not in log_topic:
|
|
120
165
|
return False
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
166
|
+
return log_topic.get(CONF_LEVEL, None) != "NONE"
|
|
167
|
+
|
|
168
|
+
|
|
169
|
+
def has_mqtt_logging() -> bool:
|
|
170
|
+
"""Check if MQTT logging is available."""
|
|
171
|
+
return (mqtt_config := CORE.config.get(CONF_MQTT)) and mqtt_logging_enabled(
|
|
172
|
+
mqtt_config
|
|
173
|
+
)
|
|
124
174
|
|
|
125
175
|
|
|
126
|
-
def get_port_type(port):
|
|
176
|
+
def get_port_type(port: str) -> str:
|
|
127
177
|
if port.startswith("/") or port.startswith("COM"):
|
|
128
178
|
return "SERIAL"
|
|
129
179
|
if port == "MQTT":
|
|
@@ -131,7 +181,7 @@ def get_port_type(port):
|
|
|
131
181
|
return "NETWORK"
|
|
132
182
|
|
|
133
183
|
|
|
134
|
-
def run_miniterm(config, port, args):
|
|
184
|
+
def run_miniterm(config: ConfigType, port: str, args) -> int:
|
|
135
185
|
from aioesphomeapi import LogParser
|
|
136
186
|
import serial
|
|
137
187
|
|
|
@@ -208,12 +258,15 @@ def wrap_to_code(name, comp):
|
|
|
208
258
|
return wrapped
|
|
209
259
|
|
|
210
260
|
|
|
211
|
-
def write_cpp(config):
|
|
261
|
+
def write_cpp(config: ConfigType) -> int:
|
|
262
|
+
if not get_bool_env(ENV_NOGITIGNORE):
|
|
263
|
+
writer.write_gitignore()
|
|
264
|
+
|
|
212
265
|
generate_cpp_contents(config)
|
|
213
266
|
return write_cpp_file()
|
|
214
267
|
|
|
215
268
|
|
|
216
|
-
def generate_cpp_contents(config):
|
|
269
|
+
def generate_cpp_contents(config: ConfigType) -> None:
|
|
217
270
|
_LOGGER.info("Generating C++ source...")
|
|
218
271
|
|
|
219
272
|
for name, component, conf in iter_component_configs(CORE.config):
|
|
@@ -224,15 +277,18 @@ def generate_cpp_contents(config):
|
|
|
224
277
|
CORE.flush_tasks()
|
|
225
278
|
|
|
226
279
|
|
|
227
|
-
def write_cpp_file():
|
|
228
|
-
writer.write_platformio_project()
|
|
229
|
-
|
|
280
|
+
def write_cpp_file() -> int:
|
|
230
281
|
code_s = indent(CORE.cpp_main_section)
|
|
231
282
|
writer.write_cpp(code_s)
|
|
283
|
+
|
|
284
|
+
from esphome.build_gen import platformio
|
|
285
|
+
|
|
286
|
+
platformio.write_project()
|
|
287
|
+
|
|
232
288
|
return 0
|
|
233
289
|
|
|
234
290
|
|
|
235
|
-
def compile_program(args, config):
|
|
291
|
+
def compile_program(args: ArgsProtocol, config: ConfigType) -> int:
|
|
236
292
|
from esphome import platformio_api
|
|
237
293
|
|
|
238
294
|
_LOGGER.info("Compiling app...")
|
|
@@ -243,7 +299,9 @@ def compile_program(args, config):
|
|
|
243
299
|
return 0 if idedata is not None else 1
|
|
244
300
|
|
|
245
301
|
|
|
246
|
-
def upload_using_esptool(
|
|
302
|
+
def upload_using_esptool(
|
|
303
|
+
config: ConfigType, port: str, file: str, speed: int
|
|
304
|
+
) -> str | int:
|
|
247
305
|
from esphome import platformio_api
|
|
248
306
|
|
|
249
307
|
first_baudrate = speed or config[CONF_ESPHOME][CONF_PLATFORMIO_OPTIONS].get(
|
|
@@ -271,20 +329,20 @@ def upload_using_esptool(config, port, file, speed):
|
|
|
271
329
|
|
|
272
330
|
def run_esptool(baud_rate):
|
|
273
331
|
cmd = [
|
|
274
|
-
"esptool
|
|
332
|
+
"esptool",
|
|
275
333
|
"--before",
|
|
276
|
-
"
|
|
334
|
+
"default-reset",
|
|
277
335
|
"--after",
|
|
278
|
-
"
|
|
336
|
+
"hard-reset",
|
|
279
337
|
"--baud",
|
|
280
338
|
str(baud_rate),
|
|
281
339
|
"--port",
|
|
282
340
|
port,
|
|
283
341
|
"--chip",
|
|
284
342
|
mcu,
|
|
285
|
-
"
|
|
343
|
+
"write-flash",
|
|
286
344
|
"-z",
|
|
287
|
-
"--
|
|
345
|
+
"--flash-size",
|
|
288
346
|
"detect",
|
|
289
347
|
]
|
|
290
348
|
for img in flash_images:
|
|
@@ -308,7 +366,7 @@ def upload_using_esptool(config, port, file, speed):
|
|
|
308
366
|
return run_esptool(115200)
|
|
309
367
|
|
|
310
368
|
|
|
311
|
-
def upload_using_platformio(config, port):
|
|
369
|
+
def upload_using_platformio(config: ConfigType, port: str):
|
|
312
370
|
from esphome import platformio_api
|
|
313
371
|
|
|
314
372
|
upload_args = ["-t", "upload", "-t", "nobuild"]
|
|
@@ -317,7 +375,7 @@ def upload_using_platformio(config, port):
|
|
|
317
375
|
return platformio_api.run_platformio_cli_run(config, CORE.verbose, *upload_args)
|
|
318
376
|
|
|
319
377
|
|
|
320
|
-
def check_permissions(port):
|
|
378
|
+
def check_permissions(port: str):
|
|
321
379
|
if os.name == "posix" and get_port_type(port) == "SERIAL":
|
|
322
380
|
# Check if we can open selected serial port
|
|
323
381
|
if not os.access(port, os.F_OK):
|
|
@@ -330,12 +388,12 @@ def check_permissions(port):
|
|
|
330
388
|
raise EsphomeError(
|
|
331
389
|
"You do not have read or write permission on the selected serial port. "
|
|
332
390
|
"To resolve this issue, you can add your user to the dialout group "
|
|
333
|
-
f"by running the following command: sudo usermod -a -G dialout {
|
|
391
|
+
f"by running the following command: sudo usermod -a -G dialout {getpass.getuser()}. "
|
|
334
392
|
"You will need to log out & back in or reboot to activate the new group access."
|
|
335
393
|
)
|
|
336
394
|
|
|
337
395
|
|
|
338
|
-
def upload_program(config, args, host):
|
|
396
|
+
def upload_program(config: ConfigType, args: ArgsProtocol, host: str) -> int | str:
|
|
339
397
|
try:
|
|
340
398
|
module = importlib.import_module("esphome.components." + CORE.target_platform)
|
|
341
399
|
if getattr(module, "upload_program")(config, args, host):
|
|
@@ -350,7 +408,7 @@ def upload_program(config, args, host):
|
|
|
350
408
|
return upload_using_esptool(config, host, file, args.upload_speed)
|
|
351
409
|
|
|
352
410
|
if CORE.target_platform in (PLATFORM_RP2040):
|
|
353
|
-
return upload_using_platformio(config,
|
|
411
|
+
return upload_using_platformio(config, host)
|
|
354
412
|
|
|
355
413
|
if CORE.is_libretiny:
|
|
356
414
|
return upload_using_platformio(config, host)
|
|
@@ -373,9 +431,12 @@ def upload_program(config, args, host):
|
|
|
373
431
|
remote_port = int(ota_conf[CONF_PORT])
|
|
374
432
|
password = ota_conf.get(CONF_PASSWORD, "")
|
|
375
433
|
|
|
434
|
+
# Check if we should use MQTT for address resolution
|
|
435
|
+
# This happens when no device was specified, or the current host is "MQTT"/"OTA"
|
|
436
|
+
devices: list[str] = args.device or []
|
|
376
437
|
if (
|
|
377
438
|
CONF_MQTT in config # pylint: disable=too-many-boolean-expressions
|
|
378
|
-
and (not
|
|
439
|
+
and (not devices or host in ("MQTT", "OTA"))
|
|
379
440
|
and (
|
|
380
441
|
((config[CONF_MDNS][CONF_DISABLED]) and not is_ip_address(CORE.address))
|
|
381
442
|
or get_port_type(host) == "MQTT"
|
|
@@ -393,23 +454,28 @@ def upload_program(config, args, host):
|
|
|
393
454
|
return espota2.run_ota(host, remote_port, password, CORE.firmware_bin)
|
|
394
455
|
|
|
395
456
|
|
|
396
|
-
def show_logs(config, args,
|
|
457
|
+
def show_logs(config: ConfigType, args: ArgsProtocol, devices: list[str]) -> int | None:
|
|
397
458
|
if "logger" not in config:
|
|
398
459
|
raise EsphomeError("Logger is not configured!")
|
|
460
|
+
|
|
461
|
+
port = devices[0]
|
|
462
|
+
|
|
399
463
|
if get_port_type(port) == "SERIAL":
|
|
400
464
|
check_permissions(port)
|
|
401
465
|
return run_miniterm(config, port, args)
|
|
402
466
|
if get_port_type(port) == "NETWORK" and "api" in config:
|
|
467
|
+
addresses_to_use = devices
|
|
403
468
|
if config[CONF_MDNS][CONF_DISABLED] and CONF_MQTT in config:
|
|
404
469
|
from esphome import mqtt
|
|
405
470
|
|
|
406
|
-
|
|
471
|
+
mqtt_address = mqtt.get_esphome_device_ip(
|
|
407
472
|
config, args.username, args.password, args.client_id
|
|
408
473
|
)[0]
|
|
474
|
+
addresses_to_use = [mqtt_address]
|
|
409
475
|
|
|
410
476
|
from esphome.components.api.client import run_logs
|
|
411
477
|
|
|
412
|
-
return run_logs(config,
|
|
478
|
+
return run_logs(config, addresses_to_use)
|
|
413
479
|
if get_port_type(port) == "MQTT" and "mqtt" in config:
|
|
414
480
|
from esphome import mqtt
|
|
415
481
|
|
|
@@ -420,7 +486,7 @@ def show_logs(config, args, port):
|
|
|
420
486
|
raise EsphomeError("No remote or local logging method configured (api/mqtt/logger)")
|
|
421
487
|
|
|
422
488
|
|
|
423
|
-
def clean_mqtt(config, args):
|
|
489
|
+
def clean_mqtt(config: ConfigType, args: ArgsProtocol) -> int | None:
|
|
424
490
|
from esphome import mqtt
|
|
425
491
|
|
|
426
492
|
return mqtt.clear_topic(
|
|
@@ -428,13 +494,13 @@ def clean_mqtt(config, args):
|
|
|
428
494
|
)
|
|
429
495
|
|
|
430
496
|
|
|
431
|
-
def command_wizard(args):
|
|
497
|
+
def command_wizard(args: ArgsProtocol) -> int | None:
|
|
432
498
|
from esphome import wizard
|
|
433
499
|
|
|
434
500
|
return wizard.wizard(args.configuration)
|
|
435
501
|
|
|
436
502
|
|
|
437
|
-
def command_config(args, config):
|
|
503
|
+
def command_config(args: ArgsProtocol, config: ConfigType) -> int | None:
|
|
438
504
|
if not CORE.verbose:
|
|
439
505
|
config = strip_default_ids(config)
|
|
440
506
|
output = yaml_util.dump(config, args.show_secrets)
|
|
@@ -449,7 +515,7 @@ def command_config(args, config):
|
|
|
449
515
|
return 0
|
|
450
516
|
|
|
451
517
|
|
|
452
|
-
def command_vscode(args):
|
|
518
|
+
def command_vscode(args: ArgsProtocol) -> int | None:
|
|
453
519
|
from esphome import vscode
|
|
454
520
|
|
|
455
521
|
logging.disable(logging.INFO)
|
|
@@ -457,7 +523,7 @@ def command_vscode(args):
|
|
|
457
523
|
vscode.read_config(args)
|
|
458
524
|
|
|
459
525
|
|
|
460
|
-
def command_compile(args, config):
|
|
526
|
+
def command_compile(args: ArgsProtocol, config: ConfigType) -> int | None:
|
|
461
527
|
exit_code = write_cpp(config)
|
|
462
528
|
if exit_code != 0:
|
|
463
529
|
return exit_code
|
|
@@ -471,8 +537,9 @@ def command_compile(args, config):
|
|
|
471
537
|
return 0
|
|
472
538
|
|
|
473
539
|
|
|
474
|
-
def command_upload(args, config):
|
|
475
|
-
|
|
540
|
+
def command_upload(args: ArgsProtocol, config: ConfigType) -> int | None:
|
|
541
|
+
# Get devices, resolving special identifiers like OTA
|
|
542
|
+
devices = choose_upload_log_host(
|
|
476
543
|
default=args.device,
|
|
477
544
|
check_default=None,
|
|
478
545
|
show_ota=True,
|
|
@@ -480,14 +547,22 @@ def command_upload(args, config):
|
|
|
480
547
|
show_api=False,
|
|
481
548
|
purpose="uploading",
|
|
482
549
|
)
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
550
|
+
|
|
551
|
+
# Try each device until one succeeds
|
|
552
|
+
exit_code = 1
|
|
553
|
+
for device in devices:
|
|
554
|
+
_LOGGER.info("Uploading to %s", device)
|
|
555
|
+
exit_code = upload_program(config, args, device)
|
|
556
|
+
if exit_code == 0:
|
|
557
|
+
_LOGGER.info("Successfully uploaded program.")
|
|
558
|
+
return 0
|
|
559
|
+
if len(devices) > 1:
|
|
560
|
+
_LOGGER.warning("Failed to upload to %s", device)
|
|
561
|
+
|
|
562
|
+
return exit_code
|
|
488
563
|
|
|
489
564
|
|
|
490
|
-
def command_discover(args, config):
|
|
565
|
+
def command_discover(args: ArgsProtocol, config: ConfigType) -> int | None:
|
|
491
566
|
if "mqtt" in config:
|
|
492
567
|
from esphome import mqtt
|
|
493
568
|
|
|
@@ -496,8 +571,9 @@ def command_discover(args, config):
|
|
|
496
571
|
raise EsphomeError("No discover method configured (mqtt)")
|
|
497
572
|
|
|
498
573
|
|
|
499
|
-
def command_logs(args, config):
|
|
500
|
-
|
|
574
|
+
def command_logs(args: ArgsProtocol, config: ConfigType) -> int | None:
|
|
575
|
+
# Get devices, resolving special identifiers like OTA
|
|
576
|
+
devices = choose_upload_log_host(
|
|
501
577
|
default=args.device,
|
|
502
578
|
check_default=None,
|
|
503
579
|
show_ota=False,
|
|
@@ -505,10 +581,10 @@ def command_logs(args, config):
|
|
|
505
581
|
show_api=True,
|
|
506
582
|
purpose="logging",
|
|
507
583
|
)
|
|
508
|
-
return show_logs(config, args,
|
|
584
|
+
return show_logs(config, args, devices)
|
|
509
585
|
|
|
510
586
|
|
|
511
|
-
def command_run(args, config):
|
|
587
|
+
def command_run(args: ArgsProtocol, config: ConfigType) -> int | None:
|
|
512
588
|
exit_code = write_cpp(config)
|
|
513
589
|
if exit_code != 0:
|
|
514
590
|
return exit_code
|
|
@@ -525,7 +601,8 @@ def command_run(args, config):
|
|
|
525
601
|
program_path = idedata.raw["prog_path"]
|
|
526
602
|
return run_external_process(program_path)
|
|
527
603
|
|
|
528
|
-
|
|
604
|
+
# Get devices, resolving special identifiers like OTA
|
|
605
|
+
devices = choose_upload_log_host(
|
|
529
606
|
default=args.device,
|
|
530
607
|
check_default=None,
|
|
531
608
|
show_ota=True,
|
|
@@ -533,39 +610,53 @@ def command_run(args, config):
|
|
|
533
610
|
show_api=True,
|
|
534
611
|
purpose="uploading",
|
|
535
612
|
)
|
|
536
|
-
|
|
537
|
-
|
|
613
|
+
|
|
614
|
+
# Try each device for upload until one succeeds
|
|
615
|
+
successful_device: str | None = None
|
|
616
|
+
for device in devices:
|
|
617
|
+
_LOGGER.info("Uploading to %s", device)
|
|
618
|
+
exit_code = upload_program(config, args, device)
|
|
619
|
+
if exit_code == 0:
|
|
620
|
+
_LOGGER.info("Successfully uploaded program.")
|
|
621
|
+
successful_device = device
|
|
622
|
+
break
|
|
623
|
+
if len(devices) > 1:
|
|
624
|
+
_LOGGER.warning("Failed to upload to %s", device)
|
|
625
|
+
|
|
626
|
+
if successful_device is None:
|
|
538
627
|
return exit_code
|
|
539
|
-
|
|
628
|
+
|
|
540
629
|
if args.no_logs:
|
|
541
630
|
return 0
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
631
|
+
|
|
632
|
+
# For logs, prefer the device we successfully uploaded to
|
|
633
|
+
devices = choose_upload_log_host(
|
|
634
|
+
default=successful_device,
|
|
635
|
+
check_default=successful_device,
|
|
545
636
|
show_ota=False,
|
|
546
637
|
show_mqtt=True,
|
|
547
638
|
show_api=True,
|
|
548
639
|
purpose="logging",
|
|
549
640
|
)
|
|
550
|
-
return show_logs(config, args,
|
|
641
|
+
return show_logs(config, args, devices)
|
|
551
642
|
|
|
552
643
|
|
|
553
|
-
def command_clean_mqtt(args, config):
|
|
644
|
+
def command_clean_mqtt(args: ArgsProtocol, config: ConfigType) -> int | None:
|
|
554
645
|
return clean_mqtt(config, args)
|
|
555
646
|
|
|
556
647
|
|
|
557
|
-
def command_mqtt_fingerprint(args, config):
|
|
648
|
+
def command_mqtt_fingerprint(args: ArgsProtocol, config: ConfigType) -> int | None:
|
|
558
649
|
from esphome import mqtt
|
|
559
650
|
|
|
560
651
|
return mqtt.get_fingerprint(config)
|
|
561
652
|
|
|
562
653
|
|
|
563
|
-
def command_version(args):
|
|
654
|
+
def command_version(args: ArgsProtocol) -> int | None:
|
|
564
655
|
safe_print(f"Version: {const.__version__}")
|
|
565
656
|
return 0
|
|
566
657
|
|
|
567
658
|
|
|
568
|
-
def command_clean(args, config):
|
|
659
|
+
def command_clean(args: ArgsProtocol, config: ConfigType) -> int | None:
|
|
569
660
|
try:
|
|
570
661
|
writer.clean_build()
|
|
571
662
|
except OSError as err:
|
|
@@ -575,13 +666,13 @@ def command_clean(args, config):
|
|
|
575
666
|
return 0
|
|
576
667
|
|
|
577
668
|
|
|
578
|
-
def command_dashboard(args):
|
|
669
|
+
def command_dashboard(args: ArgsProtocol) -> int | None:
|
|
579
670
|
from esphome.dashboard import dashboard
|
|
580
671
|
|
|
581
672
|
return dashboard.start_dashboard(args)
|
|
582
673
|
|
|
583
674
|
|
|
584
|
-
def command_update_all(args):
|
|
675
|
+
def command_update_all(args: ArgsProtocol) -> int | None:
|
|
585
676
|
import click
|
|
586
677
|
|
|
587
678
|
success = {}
|
|
@@ -628,7 +719,7 @@ def command_update_all(args):
|
|
|
628
719
|
return failed
|
|
629
720
|
|
|
630
721
|
|
|
631
|
-
def command_idedata(args, config):
|
|
722
|
+
def command_idedata(args: ArgsProtocol, config: ConfigType) -> int:
|
|
632
723
|
import json
|
|
633
724
|
|
|
634
725
|
from esphome import platformio_api
|
|
@@ -644,7 +735,7 @@ def command_idedata(args, config):
|
|
|
644
735
|
return 0
|
|
645
736
|
|
|
646
737
|
|
|
647
|
-
def command_rename(args, config):
|
|
738
|
+
def command_rename(args: ArgsProtocol, config: ConfigType) -> int | None:
|
|
648
739
|
for c in args.name:
|
|
649
740
|
if c not in ALLOWED_NAME_CHARS:
|
|
650
741
|
print(
|
|
@@ -761,6 +852,12 @@ POST_CONFIG_ACTIONS = {
|
|
|
761
852
|
"discover": command_discover,
|
|
762
853
|
}
|
|
763
854
|
|
|
855
|
+
SIMPLE_CONFIG_ACTIONS = [
|
|
856
|
+
"clean",
|
|
857
|
+
"clean-mqtt",
|
|
858
|
+
"config",
|
|
859
|
+
]
|
|
860
|
+
|
|
764
861
|
|
|
765
862
|
def parse_args(argv):
|
|
766
863
|
options_parser = argparse.ArgumentParser(add_help=False)
|
|
@@ -848,7 +945,8 @@ def parse_args(argv):
|
|
|
848
945
|
)
|
|
849
946
|
parser_upload.add_argument(
|
|
850
947
|
"--device",
|
|
851
|
-
|
|
948
|
+
action="append",
|
|
949
|
+
help="Manually specify the serial port/address to use, for example /dev/ttyUSB0. Can be specified multiple times for fallback addresses.",
|
|
852
950
|
)
|
|
853
951
|
parser_upload.add_argument(
|
|
854
952
|
"--upload_speed",
|
|
@@ -870,7 +968,8 @@ def parse_args(argv):
|
|
|
870
968
|
)
|
|
871
969
|
parser_logs.add_argument(
|
|
872
970
|
"--device",
|
|
873
|
-
|
|
971
|
+
action="append",
|
|
972
|
+
help="Manually specify the serial port/address to use, for example /dev/ttyUSB0. Can be specified multiple times for fallback addresses.",
|
|
874
973
|
)
|
|
875
974
|
parser_logs.add_argument(
|
|
876
975
|
"--reset",
|
|
@@ -899,7 +998,8 @@ def parse_args(argv):
|
|
|
899
998
|
)
|
|
900
999
|
parser_run.add_argument(
|
|
901
1000
|
"--device",
|
|
902
|
-
|
|
1001
|
+
action="append",
|
|
1002
|
+
help="Manually specify the serial port/address to use, for example /dev/ttyUSB0. Can be specified multiple times for fallback addresses.",
|
|
903
1003
|
)
|
|
904
1004
|
parser_run.add_argument(
|
|
905
1005
|
"--upload_speed",
|
|
@@ -1026,6 +1126,13 @@ def parse_args(argv):
|
|
|
1026
1126
|
arguments = argv[1:]
|
|
1027
1127
|
|
|
1028
1128
|
argcomplete.autocomplete(parser)
|
|
1129
|
+
|
|
1130
|
+
if len(arguments) > 0 and arguments[0] in SIMPLE_CONFIG_ACTIONS:
|
|
1131
|
+
args, unknown_args = parser.parse_known_args(arguments)
|
|
1132
|
+
if unknown_args:
|
|
1133
|
+
_LOGGER.warning("Ignored unrecognized arguments: %s", unknown_args)
|
|
1134
|
+
return args
|
|
1135
|
+
|
|
1029
1136
|
return parser.parse_args(arguments)
|
|
1030
1137
|
|
|
1031
1138
|
|
esphome/automation.py
CHANGED
|
@@ -391,8 +391,7 @@ async def build_action(full_config, template_arg, args):
|
|
|
391
391
|
)
|
|
392
392
|
action_id = full_config[CONF_TYPE_ID]
|
|
393
393
|
builder = registry_entry.coroutine_fun
|
|
394
|
-
|
|
395
|
-
return ret
|
|
394
|
+
return await builder(config, action_id, template_arg, args)
|
|
396
395
|
|
|
397
396
|
|
|
398
397
|
async def build_action_list(config, templ, arg_type):
|
|
@@ -409,8 +408,7 @@ async def build_condition(full_config, template_arg, args):
|
|
|
409
408
|
)
|
|
410
409
|
action_id = full_config[CONF_TYPE_ID]
|
|
411
410
|
builder = registry_entry.coroutine_fun
|
|
412
|
-
|
|
413
|
-
return ret
|
|
411
|
+
return await builder(config, action_id, template_arg, args)
|
|
414
412
|
|
|
415
413
|
|
|
416
414
|
async def build_condition_list(config, templ, args):
|
|
File without changes
|