esphome 2025.8.3__py3-none-any.whl → 2025.9.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 +177 -105
- esphome/components/absolute_humidity/absolute_humidity.cpp +3 -5
- esphome/components/adc/__init__.py +1 -26
- esphome/components/adc/adc_sensor_esp32.cpp +29 -6
- esphome/components/adc/sensor.py +20 -0
- esphome/components/ade7880/ade7880.cpp +1 -1
- esphome/components/ags10/ags10.cpp +3 -18
- esphome/components/ags10/ags10.h +2 -12
- esphome/components/aht10/aht10.cpp +3 -3
- esphome/components/airthings_ble/__init__.py +2 -2
- esphome/components/alarm_control_panel/__init__.py +2 -2
- esphome/components/am2315c/am2315c.cpp +1 -17
- esphome/components/am2315c/am2315c.h +2 -3
- esphome/components/api/__init__.py +2 -2
- esphome/components/api/api_connection.cpp +38 -34
- esphome/components/api/api_connection.h +20 -40
- esphome/components/api/api_frame_helper.cpp +25 -25
- esphome/components/api/api_frame_helper.h +3 -3
- esphome/components/api/api_frame_helper_noise.cpp +75 -40
- esphome/components/api/api_frame_helper_noise.h +3 -7
- esphome/components/api/api_frame_helper_plaintext.cpp +17 -4
- esphome/components/api/api_frame_helper_plaintext.h +1 -4
- esphome/components/api/api_pb2.cpp +12 -2
- esphome/components/api/api_pb2.h +144 -143
- esphome/components/api/api_pb2_dump.cpp +6 -1
- esphome/components/api/api_pb2_service.cpp +0 -14
- esphome/components/api/api_pb2_service.h +1 -3
- esphome/components/api/client.py +5 -3
- esphome/components/api/proto.cpp +33 -37
- esphome/components/async_tcp/__init__.py +2 -2
- esphome/components/atm90e26/sensor.py +2 -0
- esphome/components/atm90e32/sensor.py +4 -2
- esphome/components/audio_adc/__init__.py +2 -2
- esphome/components/audio_dac/__init__.py +2 -2
- esphome/components/axs15231/touchscreen/axs15231_touchscreen.cpp +1 -1
- esphome/components/bedjet/bedjet_hub.cpp +1 -1
- esphome/components/binary_sensor/__init__.py +2 -2
- esphome/components/binary_sensor/binary_sensor.cpp +13 -0
- esphome/components/binary_sensor/binary_sensor.h +4 -7
- esphome/components/bl0940/__init__.py +6 -1
- esphome/components/bl0940/bl0940.cpp +178 -41
- esphome/components/bl0940/bl0940.h +121 -76
- esphome/components/bl0940/button/__init__.py +27 -0
- esphome/components/bl0940/button/calibration_reset_button.cpp +20 -0
- esphome/components/bl0940/button/calibration_reset_button.h +19 -0
- esphome/components/bl0940/number/__init__.py +94 -0
- esphome/components/bl0940/number/calibration_number.cpp +29 -0
- esphome/components/bl0940/number/calibration_number.h +26 -0
- esphome/components/bl0940/sensor.py +151 -2
- esphome/components/bl0942/bl0942.cpp +1 -1
- esphome/components/ble_client/output/__init__.py +4 -4
- esphome/components/bluetooth_proxy/__init__.py +1 -1
- esphome/components/bluetooth_proxy/bluetooth_connection.h +1 -1
- esphome/components/bluetooth_proxy/bluetooth_proxy.cpp +15 -7
- esphome/components/bluetooth_proxy/bluetooth_proxy.h +6 -3
- esphome/components/button/__init__.py +2 -2
- esphome/components/button/button.cpp +13 -0
- esphome/components/button/button.h +4 -7
- esphome/components/camera/buffer.h +18 -0
- esphome/components/camera/buffer_impl.cpp +20 -0
- esphome/components/camera/buffer_impl.h +26 -0
- esphome/components/camera/camera.h +43 -0
- esphome/components/camera/encoder.h +69 -0
- esphome/components/camera_encoder/__init__.py +62 -0
- esphome/components/camera_encoder/encoder_buffer_impl.cpp +23 -0
- esphome/components/camera_encoder/encoder_buffer_impl.h +25 -0
- esphome/components/camera_encoder/esp32_camera_jpeg_encoder.cpp +82 -0
- esphome/components/camera_encoder/esp32_camera_jpeg_encoder.h +39 -0
- esphome/components/captive_portal/__init__.py +2 -2
- esphome/components/captive_portal/captive_index.h +77 -97
- esphome/components/captive_portal/captive_portal.cpp +35 -12
- esphome/components/captive_portal/captive_portal.h +3 -3
- esphome/components/ccs811/ccs811.cpp +3 -3
- esphome/components/climate/__init__.py +2 -2
- esphome/components/climate/climate.cpp +1 -1
- esphome/components/cover/__init__.py +5 -5
- esphome/components/cover/cover.cpp +1 -1
- esphome/components/cover/cover.h +2 -2
- esphome/components/dallas_temp/dallas_temp.cpp +2 -2
- esphome/components/datetime/__init__.py +2 -2
- esphome/components/datetime/date_entity.h +2 -2
- esphome/components/datetime/datetime_entity.h +2 -2
- esphome/components/datetime/time_entity.h +2 -2
- esphome/components/debug/debug_esp32.cpp +1 -1
- esphome/components/display/__init__.py +4 -4
- esphome/components/duty_time/duty_time_sensor.cpp +1 -1
- esphome/components/esp32/__init__.py +0 -5
- esphome/components/esp32/gpio.cpp +27 -23
- esphome/components/esp32/gpio.h +26 -11
- esphome/components/esp32/preferences.cpp +8 -4
- esphome/components/esp32_ble/__init__.py +7 -2
- esphome/components/esp32_ble/ble_uuid.cpp +30 -9
- esphome/components/esp32_ble_beacon/esp32_ble_beacon.cpp +4 -3
- esphome/components/esp32_ble_client/ble_client_base.cpp +7 -3
- esphome/components/esp32_ble_client/ble_client_base.h +8 -5
- esphome/components/esp32_ble_tracker/__init__.py +2 -2
- esphome/components/esp32_ble_tracker/esp32_ble_tracker.cpp +11 -47
- esphome/components/esp32_ble_tracker/esp32_ble_tracker.h +2 -14
- esphome/components/esp8266/__init__.py +2 -2
- esphome/components/esp8266/core.cpp +2 -2
- esphome/components/esp8266/gpio.py +4 -4
- esphome/components/esp8266/preferences.cpp +30 -28
- esphome/components/esphome/ota/__init__.py +2 -2
- esphome/components/esphome/ota/ota_esphome.cpp +21 -19
- esphome/components/esphome/ota/ota_esphome.h +6 -5
- esphome/components/ethernet/__init__.py +18 -2
- esphome/components/ethernet/ethernet_component.cpp +53 -3
- esphome/components/ethernet/ethernet_component.h +4 -0
- esphome/components/event/__init__.py +2 -2
- esphome/components/event/event.h +4 -4
- esphome/components/factory_reset/button/factory_reset_button.cpp +18 -1
- esphome/components/factory_reset/button/factory_reset_button.h +6 -1
- esphome/components/factory_reset/switch/factory_reset_switch.cpp +18 -1
- esphome/components/factory_reset/switch/factory_reset_switch.h +5 -1
- esphome/components/fan/__init__.py +2 -2
- esphome/components/fan/fan.cpp +2 -1
- esphome/components/gdk101/gdk101.cpp +4 -4
- esphome/components/globals/__init__.py +2 -2
- esphome/components/gpio/binary_sensor/gpio_binary_sensor.cpp +19 -18
- esphome/components/gpio_expander/cached_gpio.h +36 -16
- esphome/components/grove_gas_mc_v2/grove_gas_mc_v2.cpp +5 -5
- esphome/components/gt911/touchscreen/gt911_touchscreen.cpp +1 -1
- esphome/components/haier/haier_base.cpp +1 -1
- esphome/components/haier/hon_climate.cpp +1 -1
- esphome/components/hlw8012/hlw8012.cpp +5 -5
- esphome/components/honeywellabp2_i2c/honeywellabp2.cpp +4 -4
- esphome/components/host/preferences.h +3 -2
- esphome/components/hte501/hte501.cpp +3 -21
- esphome/components/hte501/hte501.h +2 -3
- esphome/components/http_request/ota/__init__.py +2 -2
- esphome/components/i2c/__init__.py +2 -2
- esphome/components/i2c/i2c.cpp +13 -9
- esphome/components/i2c/i2c_bus.h +36 -6
- esphome/components/i2s_audio/__init__.py +8 -2
- esphome/components/i2s_audio/media_player/__init__.py +1 -1
- esphome/components/i2s_audio/microphone/__init__.py +1 -1
- esphome/components/i2s_audio/speaker/__init__.py +1 -1
- esphome/components/ina2xx_base/__init__.py +4 -2
- esphome/components/inkplate/__init__.py +1 -0
- esphome/components/inkplate/const.py +105 -0
- esphome/components/inkplate/display.py +238 -0
- esphome/components/{inkplate6 → inkplate}/inkplate.cpp +156 -74
- esphome/components/{inkplate6 → inkplate}/inkplate.h +28 -68
- esphome/components/inkplate6/__init__.py +0 -1
- esphome/components/inkplate6/display.py +2 -211
- esphome/components/integration/integration_sensor.cpp +1 -1
- esphome/components/json/__init__.py +2 -2
- esphome/components/kmeteriso/kmeteriso.cpp +1 -1
- esphome/components/lc709203f/lc709203f.cpp +4 -17
- esphome/components/lc709203f/lc709203f.h +2 -3
- esphome/components/ld2420/text_sensor/{text_sensor.cpp → ld2420_text_sensor.cpp} +1 -1
- esphome/components/ld2450/ld2450.cpp +1 -1
- esphome/components/libretiny/preferences.cpp +13 -5
- esphome/components/light/__init__.py +2 -2
- esphome/components/light/addressable_light_effect.h +7 -0
- esphome/components/light/base_light_effects.h +8 -0
- esphome/components/light/light_call.cpp +22 -20
- esphome/components/light/light_effect.cpp +36 -0
- esphome/components/light/light_effect.h +14 -0
- esphome/components/light/light_json_schema.cpp +9 -1
- esphome/components/light/light_state.cpp +2 -2
- esphome/components/light/light_state.h +39 -0
- esphome/components/lock/__init__.py +2 -2
- esphome/components/lock/lock.h +2 -2
- esphome/components/logger/__init__.py +2 -2
- esphome/components/logger/logger.cpp +25 -4
- esphome/components/logger/logger.h +1 -1
- esphome/components/logger/logger_esp32.cpp +16 -8
- esphome/components/logger/logger_esp8266.cpp +11 -3
- esphome/components/logger/logger_libretiny.cpp +13 -3
- esphome/components/logger/logger_rp2040.cpp +14 -3
- esphome/components/logger/logger_zephyr.cpp +15 -4
- esphome/components/lvgl/defines.py +1 -0
- esphome/components/lvgl/hello_world.py +96 -33
- esphome/components/lvgl/number/lvgl_number.h +1 -1
- esphome/components/lvgl/select/lvgl_select.h +1 -1
- esphome/components/lvgl/widgets/__init__.py +0 -1
- esphome/components/lvgl/widgets/spinbox.py +20 -11
- esphome/components/m5stack_8angle/binary_sensor/m5stack_8angle_binary_sensor.cpp +1 -1
- esphome/components/m5stack_8angle/sensor/m5stack_8angle_sensor.cpp +1 -1
- esphome/components/mapping/__init__.py +13 -5
- esphome/components/mapping/mapping.h +69 -0
- esphome/components/max17043/max17043.cpp +2 -2
- esphome/components/mcp23016/__init__.py +1 -0
- esphome/components/mcp23016/mcp23016.cpp +20 -5
- esphome/components/mcp23016/mcp23016.h +10 -4
- esphome/components/mcp23x08_base/mcp23x08_base.cpp +1 -1
- esphome/components/mcp23x17_base/mcp23x17_base.cpp +2 -2
- esphome/components/md5/md5.cpp +3 -2
- esphome/components/mdns/__init__.py +2 -2
- esphome/components/mdns/mdns_component.cpp +145 -54
- esphome/components/media_player/__init__.py +2 -2
- esphome/components/micro_wake_word/__init__.py +2 -2
- esphome/components/microphone/__init__.py +2 -2
- esphome/components/mipi/__init__.py +77 -33
- esphome/components/mipi_rgb/__init__.py +2 -0
- esphome/components/mipi_rgb/display.py +321 -0
- esphome/components/mipi_rgb/mipi_rgb.cpp +388 -0
- esphome/components/mipi_rgb/mipi_rgb.h +127 -0
- esphome/components/mipi_rgb/models/guition.py +24 -0
- esphome/components/mipi_rgb/models/lilygo.py +228 -0
- esphome/components/mipi_rgb/models/rpi.py +9 -0
- esphome/components/mipi_rgb/models/st7701s.py +214 -0
- esphome/components/mipi_rgb/models/waveshare.py +64 -0
- esphome/components/mipi_spi/models/jc.py +229 -0
- esphome/components/mlx90614/mlx90614.cpp +1 -16
- esphome/components/mlx90614/mlx90614.h +0 -1
- esphome/components/mqtt/__init__.py +2 -2
- esphome/components/mqtt/mqtt_client.cpp +1 -1
- esphome/components/mqtt/mqtt_sensor.cpp +7 -2
- esphome/components/ms5611/ms5611.cpp +7 -6
- esphome/components/network/__init__.py +2 -2
- esphome/components/nextion/nextion_upload.cpp +4 -1
- esphome/components/nrf52/__init__.py +49 -6
- esphome/components/nrf52/const.py +1 -0
- esphome/components/nrf52/dfu.cpp +51 -0
- esphome/components/nrf52/dfu.h +24 -0
- esphome/components/ntc/ntc.cpp +1 -1
- esphome/components/number/__init__.py +2 -2
- esphome/components/number/automation.cpp +1 -1
- esphome/components/number/number.cpp +21 -0
- esphome/components/number/number.h +4 -13
- esphome/components/opentherm/hub.h +6 -6
- esphome/components/opentherm/number/{number.cpp → opentherm_number.cpp} +2 -2
- esphome/components/opentherm/output/{output.cpp → opentherm_output.cpp} +1 -1
- esphome/components/opentherm/switch/{switch.cpp → opentherm_switch.cpp} +1 -1
- esphome/components/openthread/openthread.cpp +41 -7
- esphome/components/openthread/openthread.h +11 -0
- esphome/components/ota/__init__.py +2 -2
- esphome/components/pca6416a/__init__.py +1 -0
- esphome/components/pca6416a/pca6416a.cpp +20 -5
- esphome/components/pca6416a/pca6416a.h +12 -5
- esphome/components/pca9554/__init__.py +2 -1
- esphome/components/pca9554/pca9554.cpp +12 -18
- esphome/components/pca9554/pca9554.h +10 -9
- esphome/components/pcf8574/__init__.py +1 -0
- esphome/components/pcf8574/pcf8574.cpp +14 -5
- esphome/components/pcf8574/pcf8574.h +13 -6
- esphome/components/pi4ioe5v6408/pi4ioe5v6408.cpp +7 -7
- esphome/components/pipsolar/__init__.py +3 -3
- esphome/components/pipsolar/output/__init__.py +4 -4
- esphome/components/pulse_width/pulse_width.cpp +2 -2
- esphome/components/qmp6988/qmp6988.cpp +81 -126
- esphome/components/qmp6988/qmp6988.h +31 -37
- esphome/components/radon_eye_ble/__init__.py +2 -2
- esphome/components/remote_base/__init__.py +6 -8
- esphome/components/rotary_encoder/rotary_encoder.cpp +1 -1
- esphome/components/rp2040/__init__.py +2 -2
- esphome/components/runtime_stats/runtime_stats.cpp +10 -23
- esphome/components/runtime_stats/runtime_stats.h +4 -10
- esphome/components/safe_mode/__init__.py +2 -2
- esphome/components/safe_mode/safe_mode.cpp +33 -31
- esphome/components/script/script.cpp +6 -0
- esphome/components/script/script.h +19 -5
- esphome/components/sdm_meter/sensor.py +3 -1
- esphome/components/select/__init__.py +2 -2
- esphome/components/select/select.cpp +3 -3
- esphome/components/select/select.h +2 -2
- esphome/components/select/select_call.cpp +1 -1
- esphome/components/sen5x/sen5x.cpp +58 -55
- esphome/components/sen5x/sen5x.h +21 -15
- esphome/components/sen5x/sensor.py +67 -44
- esphome/components/sensirion_common/i2c_sensirion.cpp +18 -47
- esphome/components/sensirion_common/i2c_sensirion.h +39 -55
- esphome/components/sensor/__init__.py +2 -2
- esphome/components/sensor/automation.h +1 -1
- esphome/components/sensor/sensor.cpp +34 -6
- esphome/components/sensor/sensor.h +4 -21
- esphome/components/sgp30/sgp30.cpp +34 -35
- esphome/components/sgp30/sgp30.h +11 -10
- esphome/components/sgp4x/sgp4x.cpp +2 -2
- esphome/components/shelly_dimmer/light.py +7 -7
- esphome/components/sht4x/sht4x.cpp +1 -1
- esphome/components/sntp/sntp_component.cpp +36 -9
- esphome/components/sntp/sntp_component.h +7 -0
- esphome/components/sound_level/sound_level.cpp +1 -1
- esphome/components/speaker/__init__.py +2 -2
- esphome/components/speaker/media_player/__init__.py +2 -2
- esphome/components/speaker/media_player/speaker_media_player.cpp +1 -1
- esphome/components/spi/__init__.py +2 -2
- esphome/components/sprinkler/sprinkler.cpp +1 -1
- esphome/components/sps30/sps30.cpp +18 -23
- esphome/components/sps30/sps30.h +3 -3
- esphome/components/status_led/__init__.py +2 -2
- esphome/components/stepper/__init__.py +2 -2
- esphome/components/switch/__init__.py +2 -2
- esphome/components/switch/switch.cpp +5 -5
- esphome/components/sx1509/__init__.py +1 -1
- esphome/components/sx1509/sx1509.cpp +12 -7
- esphome/components/sx1509/sx1509.h +11 -4
- esphome/components/tca9555/tca9555.cpp +5 -5
- esphome/components/tee501/tee501.cpp +2 -21
- esphome/components/tee501/tee501.h +2 -4
- esphome/components/template/alarm_control_panel/template_alarm_control_panel.cpp +1 -1
- esphome/components/template/datetime/template_date.cpp +1 -1
- esphome/components/template/datetime/template_datetime.cpp +2 -2
- esphome/components/template/datetime/template_time.cpp +1 -1
- esphome/components/template/number/template_number.cpp +1 -1
- esphome/components/template/select/template_select.cpp +1 -1
- esphome/components/template/text/template_text.cpp +1 -1
- esphome/components/text/__init__.py +2 -2
- esphome/components/text/text.h +2 -2
- esphome/components/text_sensor/__init__.py +2 -2
- esphome/components/text_sensor/text_sensor.h +4 -4
- esphome/components/thermostat/climate.py +11 -7
- esphome/components/thermostat/thermostat_climate.cpp +237 -206
- esphome/components/thermostat/thermostat_climate.h +52 -41
- esphome/components/time/__init__.py +2 -2
- esphome/components/tmp1075/tmp1075.cpp +1 -1
- esphome/components/total_daily_energy/total_daily_energy.cpp +1 -1
- esphome/components/touchscreen/__init__.py +2 -2
- esphome/components/tuya/number/tuya_number.cpp +1 -1
- esphome/components/udp/udp_component.cpp +3 -3
- esphome/components/ufire_ec/ufire_ec.cpp +4 -4
- esphome/components/ufire_ise/ufire_ise.cpp +4 -4
- esphome/components/update/__init__.py +2 -2
- esphome/components/usb_uart/usb_uart.cpp +1 -1
- esphome/components/valve/__init__.py +5 -5
- esphome/components/valve/valve.cpp +1 -1
- esphome/components/valve/valve.h +2 -2
- esphome/components/wake_on_lan/wake_on_lan.cpp +2 -2
- esphome/components/waveshare_epaper/waveshare_213v3.cpp +1 -1
- esphome/components/web_server/__init__.py +2 -2
- esphome/components/web_server/ota/__init__.py +2 -2
- esphome/components/web_server/ota/ota_web_server.cpp +11 -0
- esphome/components/web_server/server_index_v2.h +149 -149
- esphome/components/web_server/web_server.cpp +58 -12
- esphome/components/web_server_base/__init__.py +2 -2
- esphome/components/wifi/__init__.py +5 -5
- esphome/components/wifi/wifi_component.cpp +4 -4
- esphome/components/wifi/wifi_component_esp_idf.cpp +2 -0
- esphome/components/wifi_info/wifi_info_text_sensor.h +3 -2
- esphome/config_validation.py +2 -2
- esphome/const.py +3 -1
- esphome/core/__init__.py +1 -0
- esphome/core/application.cpp +89 -51
- esphome/core/application.h +1 -0
- esphome/core/component.cpp +41 -19
- esphome/core/component.h +17 -13
- esphome/core/config.py +7 -7
- esphome/core/defines.h +5 -0
- esphome/core/entity_base.cpp +22 -8
- esphome/core/entity_base.h +43 -0
- esphome/core/helpers.cpp +34 -20
- esphome/core/helpers.h +33 -3
- esphome/core/ring_buffer.cpp +6 -2
- esphome/core/ring_buffer.h +2 -1
- esphome/core/scheduler.cpp +178 -97
- esphome/core/scheduler.h +67 -36
- esphome/core/time.cpp +6 -20
- esphome/coroutine.py +80 -3
- esphome/cpp_generator.py +13 -0
- esphome/cpp_helpers.py +2 -2
- esphome/dashboard/web_server.py +69 -15
- esphome/espota2.py +13 -6
- esphome/helpers.py +68 -83
- esphome/resolver.py +67 -0
- esphome/util.py +9 -6
- esphome/wizard.py +81 -34
- esphome/writer.py +13 -0
- {esphome-2025.8.3.dist-info → esphome-2025.9.0.dist-info}/METADATA +9 -9
- {esphome-2025.8.3.dist-info → esphome-2025.9.0.dist-info}/RECORD +370 -339
- /esphome/components/ld2420/text_sensor/{text_sensor.h → ld2420_text_sensor.h} +0 -0
- /esphome/components/opentherm/number/{number.h → opentherm_number.h} +0 -0
- /esphome/components/opentherm/output/{output.h → opentherm_output.h} +0 -0
- /esphome/components/opentherm/switch/{switch.h → opentherm_switch.h} +0 -0
- {esphome-2025.8.3.dist-info → esphome-2025.9.0.dist-info}/WHEEL +0 -0
- {esphome-2025.8.3.dist-info → esphome-2025.9.0.dist-info}/entry_points.txt +0 -0
- {esphome-2025.8.3.dist-info → esphome-2025.9.0.dist-info}/licenses/LICENSE +0 -0
- {esphome-2025.8.3.dist-info → esphome-2025.9.0.dist-info}/top_level.txt +0 -0
esphome/wizard.py
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
import os
|
2
2
|
import random
|
3
3
|
import string
|
4
|
+
from typing import Literal, NotRequired, TypedDict, Unpack
|
4
5
|
import unicodedata
|
5
6
|
|
6
7
|
import voluptuous as vol
|
@@ -103,11 +104,25 @@ HARDWARE_BASE_CONFIGS = {
|
|
103
104
|
}
|
104
105
|
|
105
106
|
|
106
|
-
def sanitize_double_quotes(value):
|
107
|
+
def sanitize_double_quotes(value: str) -> str:
|
107
108
|
return value.replace("\\", "\\\\").replace('"', '\\"')
|
108
109
|
|
109
110
|
|
110
|
-
|
111
|
+
class WizardFileKwargs(TypedDict):
|
112
|
+
"""Keyword arguments for wizard_file function."""
|
113
|
+
|
114
|
+
name: str
|
115
|
+
platform: Literal["ESP8266", "ESP32", "RP2040", "BK72XX", "LN882X", "RTL87XX"]
|
116
|
+
board: str
|
117
|
+
ssid: NotRequired[str]
|
118
|
+
psk: NotRequired[str]
|
119
|
+
password: NotRequired[str]
|
120
|
+
ota_password: NotRequired[str]
|
121
|
+
api_encryption_key: NotRequired[str]
|
122
|
+
friendly_name: NotRequired[str]
|
123
|
+
|
124
|
+
|
125
|
+
def wizard_file(**kwargs: Unpack[WizardFileKwargs]) -> str:
|
111
126
|
letters = string.ascii_letters + string.digits
|
112
127
|
ap_name_base = kwargs["name"].replace("_", " ").title()
|
113
128
|
ap_name = f"{ap_name_base} Fallback Hotspot"
|
@@ -180,7 +195,25 @@ captive_portal:
|
|
180
195
|
return config
|
181
196
|
|
182
197
|
|
183
|
-
|
198
|
+
class WizardWriteKwargs(TypedDict):
|
199
|
+
"""Keyword arguments for wizard_write function."""
|
200
|
+
|
201
|
+
name: str
|
202
|
+
type: Literal["basic", "empty", "upload"]
|
203
|
+
# Required for "basic" type
|
204
|
+
board: NotRequired[str]
|
205
|
+
platform: NotRequired[str]
|
206
|
+
ssid: NotRequired[str]
|
207
|
+
psk: NotRequired[str]
|
208
|
+
password: NotRequired[str]
|
209
|
+
ota_password: NotRequired[str]
|
210
|
+
api_encryption_key: NotRequired[str]
|
211
|
+
friendly_name: NotRequired[str]
|
212
|
+
# Required for "upload" type
|
213
|
+
file_text: NotRequired[str]
|
214
|
+
|
215
|
+
|
216
|
+
def wizard_write(path: str, **kwargs: Unpack[WizardWriteKwargs]) -> bool:
|
184
217
|
from esphome.components.bk72xx import boards as bk72xx_boards
|
185
218
|
from esphome.components.esp32 import boards as esp32_boards
|
186
219
|
from esphome.components.esp8266 import boards as esp8266_boards
|
@@ -189,32 +222,45 @@ def wizard_write(path, **kwargs):
|
|
189
222
|
from esphome.components.rtl87xx import boards as rtl87xx_boards
|
190
223
|
|
191
224
|
name = kwargs["name"]
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
225
|
+
if kwargs["type"] == "empty":
|
226
|
+
file_text = ""
|
227
|
+
# Will be updated later after editing the file
|
228
|
+
hardware = "UNKNOWN"
|
229
|
+
elif kwargs["type"] == "upload":
|
230
|
+
file_text = kwargs["file_text"]
|
231
|
+
hardware = "UNKNOWN"
|
232
|
+
else: # "basic"
|
233
|
+
board = kwargs["board"]
|
234
|
+
|
235
|
+
for key in ("ssid", "psk", "password", "ota_password"):
|
236
|
+
if key in kwargs:
|
237
|
+
kwargs[key] = sanitize_double_quotes(kwargs[key])
|
238
|
+
if "platform" not in kwargs:
|
239
|
+
if board in esp8266_boards.BOARDS:
|
240
|
+
platform = "ESP8266"
|
241
|
+
elif board in esp32_boards.BOARDS:
|
242
|
+
platform = "ESP32"
|
243
|
+
elif board in rp2040_boards.BOARDS:
|
244
|
+
platform = "RP2040"
|
245
|
+
elif board in bk72xx_boards.BOARDS:
|
246
|
+
platform = "BK72XX"
|
247
|
+
elif board in ln882x_boards.BOARDS:
|
248
|
+
platform = "LN882X"
|
249
|
+
elif board in rtl87xx_boards.BOARDS:
|
250
|
+
platform = "RTL87XX"
|
251
|
+
else:
|
252
|
+
safe_print(color(AnsiFore.RED, f'The board "{board}" is unknown.'))
|
253
|
+
return False
|
254
|
+
kwargs["platform"] = platform
|
255
|
+
hardware = kwargs["platform"]
|
256
|
+
file_text = wizard_file(**kwargs)
|
257
|
+
|
258
|
+
# Check if file already exists to prevent overwriting
|
259
|
+
if os.path.exists(path) and os.path.isfile(path):
|
260
|
+
safe_print(color(AnsiFore.RED, f'The file "{path}" already exists.'))
|
261
|
+
return False
|
262
|
+
|
263
|
+
write_file(path, file_text)
|
218
264
|
storage = StorageJSON.from_wizard(name, name, f"{name}.local", hardware)
|
219
265
|
storage_path = ext_storage_path(os.path.basename(path))
|
220
266
|
storage.save(storage_path)
|
@@ -224,14 +270,14 @@ def wizard_write(path, **kwargs):
|
|
224
270
|
|
225
271
|
if get_bool_env(ENV_QUICKWIZARD):
|
226
272
|
|
227
|
-
def sleep(time):
|
273
|
+
def sleep(time: float) -> None:
|
228
274
|
pass
|
229
275
|
|
230
276
|
else:
|
231
277
|
from time import sleep
|
232
278
|
|
233
279
|
|
234
|
-
def safe_print_step(step, big):
|
280
|
+
def safe_print_step(step: int, big: str) -> None:
|
235
281
|
safe_print()
|
236
282
|
safe_print()
|
237
283
|
safe_print(f"============= STEP {step} =============")
|
@@ -240,14 +286,14 @@ def safe_print_step(step, big):
|
|
240
286
|
sleep(0.25)
|
241
287
|
|
242
288
|
|
243
|
-
def default_input(text, default):
|
289
|
+
def default_input(text: str, default: str) -> str:
|
244
290
|
safe_print()
|
245
291
|
safe_print(f"Press ENTER for default ({default})")
|
246
292
|
return safe_input(text.format(default)) or default
|
247
293
|
|
248
294
|
|
249
295
|
# From https://stackoverflow.com/a/518232/8924614
|
250
|
-
def strip_accents(value):
|
296
|
+
def strip_accents(value: str) -> str:
|
251
297
|
return "".join(
|
252
298
|
c
|
253
299
|
for c in unicodedata.normalize("NFD", str(value))
|
@@ -255,7 +301,7 @@ def strip_accents(value):
|
|
255
301
|
)
|
256
302
|
|
257
303
|
|
258
|
-
def wizard(path):
|
304
|
+
def wizard(path: str) -> int:
|
259
305
|
from esphome.components.bk72xx import boards as bk72xx_boards
|
260
306
|
from esphome.components.esp32 import boards as esp32_boards
|
261
307
|
from esphome.components.esp8266 import boards as esp8266_boards
|
@@ -496,6 +542,7 @@ def wizard(path):
|
|
496
542
|
ssid=ssid,
|
497
543
|
psk=psk,
|
498
544
|
password=password,
|
545
|
+
type="basic",
|
499
546
|
):
|
500
547
|
return 1
|
501
548
|
|
esphome/writer.py
CHANGED
@@ -315,6 +315,19 @@ def clean_build():
|
|
315
315
|
_LOGGER.info("Deleting %s", dependencies_lock)
|
316
316
|
os.remove(dependencies_lock)
|
317
317
|
|
318
|
+
# Clean PlatformIO cache to resolve CMake compiler detection issues
|
319
|
+
# This helps when toolchain paths change or get corrupted
|
320
|
+
try:
|
321
|
+
from platformio.project.helpers import get_project_cache_dir
|
322
|
+
except ImportError:
|
323
|
+
# PlatformIO is not available, skip cache cleaning
|
324
|
+
pass
|
325
|
+
else:
|
326
|
+
cache_dir = get_project_cache_dir()
|
327
|
+
if cache_dir and cache_dir.strip() and os.path.isdir(cache_dir):
|
328
|
+
_LOGGER.info("Deleting PlatformIO cache %s", cache_dir)
|
329
|
+
shutil.rmtree(cache_dir)
|
330
|
+
|
318
331
|
|
319
332
|
GITIGNORE_CONTENT = """# Gitignore settings for ESPHome
|
320
333
|
# This is an example and may include too much for your use-case.
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: esphome
|
3
|
-
Version: 2025.
|
3
|
+
Version: 2025.9.0
|
4
4
|
Summary: ESPHome is a system to configure your microcontrollers by simple yet powerful configuration files and control them remotely through Home Automation systems.
|
5
5
|
Author-email: The ESPHome Authors <esphome@openhomefoundation.org>
|
6
6
|
License: MIT
|
@@ -36,11 +36,11 @@ Requires-Dist: pyserial==3.5
|
|
36
36
|
Requires-Dist: platformio==6.1.18
|
37
37
|
Requires-Dist: esptool==5.0.2
|
38
38
|
Requires-Dist: click==8.1.7
|
39
|
-
Requires-Dist: esphome-dashboard==
|
40
|
-
Requires-Dist: aioesphomeapi==
|
41
|
-
Requires-Dist: zeroconf==0.147.
|
39
|
+
Requires-Dist: esphome-dashboard==20250904.0
|
40
|
+
Requires-Dist: aioesphomeapi==40.2.1
|
41
|
+
Requires-Dist: zeroconf==0.147.2
|
42
42
|
Requires-Dist: puremagic==1.30
|
43
|
-
Requires-Dist: ruamel.yaml==0.18.
|
43
|
+
Requires-Dist: ruamel.yaml==0.18.15
|
44
44
|
Requires-Dist: esphome-glyphsets==0.2.0
|
45
45
|
Requires-Dist: pillow==10.4.0
|
46
46
|
Requires-Dist: cairosvg==2.8.2
|
@@ -56,12 +56,12 @@ Requires-Dist: yamllint==1.37.1; extra == "dev"
|
|
56
56
|
Provides-Extra: test
|
57
57
|
Requires-Dist: pylint==3.3.8; extra == "test"
|
58
58
|
Requires-Dist: flake8==7.3.0; extra == "test"
|
59
|
-
Requires-Dist: ruff==0.12.
|
59
|
+
Requires-Dist: ruff==0.12.12; extra == "test"
|
60
60
|
Requires-Dist: pyupgrade==3.20.0; extra == "test"
|
61
61
|
Requires-Dist: pre-commit; extra == "test"
|
62
|
-
Requires-Dist: pytest==8.4.
|
63
|
-
Requires-Dist: pytest-cov==
|
64
|
-
Requires-Dist: pytest-mock==3.
|
62
|
+
Requires-Dist: pytest==8.4.2; extra == "test"
|
63
|
+
Requires-Dist: pytest-cov==7.0.0; extra == "test"
|
64
|
+
Requires-Dist: pytest-mock==3.15.0; extra == "test"
|
65
65
|
Requires-Dist: pytest-asyncio==1.1.0; extra == "test"
|
66
66
|
Requires-Dist: pytest-xdist==3.8.0; extra == "test"
|
67
67
|
Requires-Dist: asyncmock==0.4.2; extra == "test"
|