esphome 2025.4.1__py3-none-any.whl → 2025.5.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 +16 -14
- esphome/components/ac_dimmer/ac_dimmer.cpp +3 -2
- esphome/components/adc/__init__.py +51 -34
- esphome/components/airthings_wave_base/__init__.py +1 -1
- esphome/components/alarm_control_panel/__init__.py +37 -2
- esphome/components/am43/cover/__init__.py +4 -5
- esphome/components/analog_threshold/analog_threshold_binary_sensor.cpp +6 -4
- esphome/components/analog_threshold/analog_threshold_binary_sensor.h +4 -5
- esphome/components/analog_threshold/binary_sensor.py +10 -8
- esphome/components/anova/climate.py +4 -5
- esphome/components/api/__init__.py +25 -8
- esphome/components/api/api_connection.cpp +416 -662
- esphome/components/api/api_connection.h +256 -57
- esphome/components/api/api_frame_helper.cpp +232 -177
- esphome/components/api/api_frame_helper.h +61 -8
- esphome/components/api/api_noise_context.h +13 -4
- esphome/components/api/api_pb2.cpp +1422 -1
- esphome/components/api/api_pb2.h +255 -1
- esphome/components/api/api_pb2_service.cpp +162 -49
- esphome/components/api/api_pb2_service.h +90 -51
- esphome/components/api/api_pb2_size.h +361 -0
- esphome/components/api/api_server.cpp +110 -34
- esphome/components/api/api_server.h +8 -0
- esphome/components/api/proto.h +86 -17
- esphome/components/as3935_i2c/as3935_i2c.h +0 -3
- esphome/components/as7341/as7341.h +1 -1
- esphome/components/at581x/at581x.h +4 -4
- esphome/components/atm90e32/__init__.py +1 -0
- esphome/components/atm90e32/atm90e32.cpp +576 -199
- esphome/components/atm90e32/atm90e32.h +128 -31
- esphome/components/atm90e32/atm90e32_reg.h +4 -2
- esphome/components/atm90e32/button/__init__.py +62 -10
- esphome/components/atm90e32/button/atm90e32_button.cpp +63 -4
- esphome/components/atm90e32/button/atm90e32_button.h +36 -4
- esphome/components/atm90e32/number/__init__.py +130 -0
- esphome/components/atm90e32/number/atm90e32_number.h +16 -0
- esphome/components/atm90e32/sensor.py +21 -4
- esphome/components/atm90e32/text_sensor/__init__.py +48 -0
- esphome/components/audio/__init__.py +96 -49
- esphome/components/audio/audio.h +48 -0
- esphome/components/audio/audio_decoder.cpp +1 -1
- esphome/components/audio/audio_resampler.cpp +2 -0
- esphome/components/audio/audio_resampler.h +1 -0
- esphome/components/ballu/climate.py +2 -9
- esphome/components/bang_bang/climate.py +5 -6
- esphome/components/bedjet/bedjet_hub.cpp +1 -0
- esphome/components/bedjet/climate/__init__.py +3 -8
- esphome/components/bedjet/fan/__init__.py +2 -11
- esphome/components/binary/fan/__init__.py +13 -16
- esphome/components/binary_sensor/__init__.py +13 -10
- esphome/components/bl0906/constants.h +16 -16
- esphome/components/ble_client/text_sensor/__init__.py +3 -5
- esphome/components/bluetooth_proxy/bluetooth_connection.cpp +4 -6
- esphome/components/bluetooth_proxy/bluetooth_proxy.cpp +136 -21
- esphome/components/bluetooth_proxy/bluetooth_proxy.h +7 -0
- esphome/components/button/__init__.py +11 -8
- esphome/components/canbus/canbus.cpp +3 -0
- esphome/components/canbus/canbus.h +16 -0
- esphome/components/ccs811/sensor.py +9 -6
- esphome/components/climate/__init__.py +35 -2
- esphome/components/climate/climate_mode.h +1 -1
- esphome/components/climate/climate_traits.h +63 -57
- esphome/components/climate_ir/__init__.py +57 -17
- esphome/components/climate_ir_lg/climate.py +2 -5
- esphome/components/climate_ir_lg/climate_ir_lg.cpp +7 -7
- esphome/components/climate_ir_lg/climate_ir_lg.h +1 -1
- esphome/components/color/__init__.py +2 -0
- esphome/components/const/__init__.py +5 -0
- esphome/components/coolix/climate.py +2 -9
- esphome/components/copy/cover/__init__.py +10 -9
- esphome/components/copy/fan/__init__.py +11 -9
- esphome/components/copy/lock/__init__.py +11 -9
- esphome/components/copy/text/__init__.py +9 -6
- esphome/components/cover/__init__.py +37 -2
- esphome/components/cse7766/cse7766.cpp +2 -1
- esphome/components/cst226/binary_sensor/__init__.py +28 -0
- esphome/components/cst226/binary_sensor/cs226_button.h +22 -0
- esphome/components/cst226/binary_sensor/cstt6_button.cpp +19 -0
- esphome/components/cst226/touchscreen/cst226_touchscreen.cpp +27 -5
- esphome/components/cst226/touchscreen/cst226_touchscreen.h +10 -10
- esphome/components/current_based/cover.py +37 -36
- esphome/components/current_based/current_based_cover.cpp +2 -1
- esphome/components/daikin/climate.py +2 -9
- esphome/components/daikin/daikin.cpp +15 -9
- esphome/components/daikin/daikin.h +5 -5
- esphome/components/daikin_arc/climate.py +2 -7
- esphome/components/daikin_brc/climate.py +3 -5
- esphome/components/dallas_temp/dallas_temp.cpp +17 -24
- esphome/components/dallas_temp/dallas_temp.h +0 -1
- esphome/components/daly_bms/daly_bms.cpp +2 -1
- esphome/components/debug/debug_component.cpp +6 -1
- esphome/components/debug/debug_component.h +8 -0
- esphome/components/debug/debug_esp32.cpp +109 -254
- esphome/components/debug/sensor.py +14 -0
- esphome/components/deep_sleep/deep_sleep_esp32.cpp +13 -1
- esphome/components/delonghi/climate.py +2 -9
- esphome/components/demo/__init__.py +18 -20
- esphome/components/dfrobot_sen0395/switch/__init__.py +21 -22
- esphome/components/display/rect.cpp +4 -9
- esphome/components/display/rect.h +1 -1
- esphome/components/dps310/sensor.py +6 -6
- esphome/components/ee895/sensor.py +9 -9
- esphome/components/emmeti/climate.py +2 -9
- esphome/components/endstop/cover.py +17 -16
- esphome/components/endstop/endstop_cover.cpp +2 -1
- esphome/components/ens160_base/__init__.py +12 -9
- esphome/components/esp32/__init__.py +60 -3
- esphome/components/esp32/core.cpp +11 -5
- esphome/components/esp32/gpio.cpp +86 -24
- esphome/components/esp32/gpio.py +15 -16
- esphome/components/esp32/gpio_esp32.py +1 -2
- esphome/components/esp32/gpio_esp32_c2.py +1 -1
- esphome/components/esp32/gpio_esp32_c3.py +1 -1
- esphome/components/esp32/gpio_esp32_c6.py +1 -1
- esphome/components/esp32/gpio_esp32_h2.py +1 -1
- esphome/components/esp32_ble/ble.cpp +1 -8
- esphome/components/esp32_ble/ble.h +5 -3
- esphome/components/esp32_ble/ble_advertising.cpp +2 -1
- esphome/components/esp32_ble/ble_advertising.h +1 -0
- esphome/components/esp32_ble_server/__init__.py +3 -0
- esphome/components/esp32_ble_tracker/__init__.py +7 -1
- esphome/components/esp32_ble_tracker/esp32_ble_tracker.cpp +192 -118
- esphome/components/esp32_ble_tracker/esp32_ble_tracker.h +29 -3
- esphome/components/esp32_camera/__init__.py +1 -1
- esphome/components/esp32_camera/esp32_camera.cpp +2 -10
- esphome/components/esp32_camera/esp32_camera.h +1 -1
- esphome/components/esp32_can/esp32_can.cpp +1 -1
- esphome/components/esp32_improv/esp32_improv_component.cpp +1 -1
- esphome/components/esp32_rmt_led_strip/led_strip.cpp +1 -1
- esphome/components/esp32_rmt_led_strip/led_strip.h +7 -5
- esphome/components/esp32_rmt_led_strip/light.py +9 -1
- esphome/components/esp32_touch/esp32_touch.cpp +1 -1
- esphome/components/esp8266/gpio.cpp +69 -8
- esphome/components/ethernet/ethernet_component.cpp +1 -1
- esphome/components/event/__init__.py +13 -10
- esphome/components/factory_reset/switch/__init__.py +7 -21
- esphome/components/fan/__init__.py +52 -5
- esphome/components/fastled_base/__init__.py +1 -4
- esphome/components/fastled_base/fastled_light.cpp +1 -1
- esphome/components/feedback/cover.py +38 -33
- esphome/components/feedback/feedback_cover.cpp +2 -1
- esphome/components/fujitsu_general/climate.py +2 -9
- esphome/components/gcja5/gcja5.cpp +2 -1
- esphome/components/gpio/one_wire/gpio_one_wire.cpp +45 -43
- esphome/components/gpio/one_wire/gpio_one_wire.h +2 -1
- esphome/components/gpio_expander/cached_gpio.h +22 -7
- esphome/components/gps/__init__.py +47 -17
- esphome/components/gps/gps.cpp +42 -23
- esphome/components/gps/gps.h +17 -13
- esphome/components/graph/__init__.py +1 -2
- esphome/components/gree/climate.py +4 -6
- esphome/components/gree/gree.cpp +16 -2
- esphome/components/gree/gree.h +2 -2
- esphome/components/growatt_solar/growatt_solar.cpp +2 -1
- esphome/components/haier/climate.py +37 -34
- esphome/components/hbridge/fan/__init__.py +19 -17
- esphome/components/he60r/cover.py +4 -5
- esphome/components/heatpumpir/climate.py +3 -6
- esphome/components/hitachi_ac344/climate.py +2 -9
- esphome/components/hitachi_ac424/climate.py +2 -9
- esphome/components/hlw8012/hlw8012.cpp +1 -1
- esphome/components/hm3301/hm3301.h +1 -1
- esphome/components/hte501/sensor.py +6 -6
- esphome/components/http_request/__init__.py +39 -6
- esphome/components/http_request/http_request.cpp +20 -0
- esphome/components/http_request/http_request.h +57 -15
- esphome/components/http_request/http_request_arduino.cpp +22 -6
- esphome/components/http_request/http_request_arduino.h +4 -3
- esphome/components/http_request/http_request_host.cpp +141 -0
- esphome/components/http_request/http_request_host.h +37 -0
- esphome/components/http_request/http_request_idf.cpp +35 -3
- esphome/components/http_request/http_request_idf.h +10 -3
- esphome/components/http_request/httplib.h +9691 -0
- esphome/components/http_request/update/__init__.py +11 -8
- esphome/components/hyt271/sensor.py +6 -6
- esphome/components/i2c/i2c.h +4 -0
- esphome/components/i2c/i2c_bus_esp_idf.cpp +1 -1
- esphome/components/i2s_audio/__init__.py +131 -22
- esphome/components/i2s_audio/i2s_audio.h +44 -4
- esphome/components/i2s_audio/media_player/__init__.py +19 -9
- esphome/components/i2s_audio/microphone/__init__.py +63 -5
- esphome/components/i2s_audio/microphone/i2s_audio_microphone.cpp +351 -61
- esphome/components/i2s_audio/microphone/i2s_audio_microphone.h +40 -6
- esphome/components/i2s_audio/speaker/__init__.py +31 -5
- esphome/components/i2s_audio/speaker/i2s_audio_speaker.cpp +155 -19
- esphome/components/i2s_audio/speaker/i2s_audio_speaker.h +17 -4
- esphome/components/ili9xxx/ili9xxx_init.h +1 -1
- esphome/components/image/__init__.py +37 -17
- esphome/components/image/image.cpp +25 -8
- esphome/components/internal_temperature/internal_temperature.cpp +6 -4
- esphome/components/key_collector/__init__.py +35 -0
- esphome/components/key_collector/key_collector.cpp +8 -0
- esphome/components/key_collector/key_collector.h +10 -0
- esphome/components/kuntze/kuntze.cpp +2 -1
- esphome/components/ld2410/ld2410.h +1 -1
- esphome/components/ld2450/ld2450.h +1 -1
- esphome/components/light/__init__.py +57 -0
- esphome/components/lock/__init__.py +51 -4
- esphome/components/lock/automation.h +2 -13
- esphome/components/logger/__init__.py +22 -0
- esphome/components/logger/logger.cpp +154 -103
- esphome/components/logger/logger.h +211 -36
- esphome/components/logger/task_log_buffer.cpp +138 -0
- esphome/components/logger/task_log_buffer.h +69 -0
- esphome/components/lvgl/__init__.py +13 -5
- esphome/components/lvgl/automation.py +50 -1
- esphome/components/lvgl/defines.py +0 -1
- esphome/components/lvgl/lv_validation.py +10 -1
- esphome/components/lvgl/lvgl_esphome.cpp +5 -1
- esphome/components/lvgl/schemas.py +14 -14
- esphome/components/lvgl/text/__init__.py +1 -2
- esphome/components/lvgl/widgets/arc.py +7 -6
- esphome/components/lvgl/widgets/buttonmatrix.py +3 -3
- esphome/components/lvgl/widgets/checkbox.py +2 -2
- esphome/components/lvgl/widgets/dropdown.py +2 -1
- esphome/components/lvgl/widgets/img.py +15 -12
- esphome/components/mapping/__init__.py +134 -0
- esphome/components/matrix_keypad/matrix_keypad.cpp +2 -1
- esphome/components/max7219digit/max7219digit.cpp +28 -27
- esphome/components/mdns/__init__.py +11 -5
- esphome/components/mdns/mdns_component.cpp +11 -5
- esphome/components/mdns/mdns_component.h +3 -2
- esphome/components/mdns/mdns_esp32.cpp +4 -3
- esphome/components/mdns/mdns_esp8266.cpp +4 -2
- esphome/components/mdns/mdns_libretiny.cpp +4 -2
- esphome/components/mdns/mdns_rp2040.cpp +4 -2
- esphome/components/media_player/__init__.py +40 -6
- esphome/components/mhz19/sensor.py +11 -7
- esphome/components/micro_wake_word/__init__.py +99 -31
- esphome/components/micro_wake_word/automation.h +54 -0
- esphome/components/micro_wake_word/micro_wake_word.cpp +331 -319
- esphome/components/micro_wake_word/micro_wake_word.h +58 -105
- esphome/components/micro_wake_word/preprocessor_settings.h +19 -2
- esphome/components/micro_wake_word/streaming_model.cpp +158 -41
- esphome/components/micro_wake_word/streaming_model.h +85 -13
- esphome/components/microphone/__init__.py +139 -9
- esphome/components/microphone/automation.h +14 -2
- esphome/components/microphone/microphone.cpp +21 -0
- esphome/components/microphone/microphone.h +14 -5
- esphome/components/microphone/microphone_source.cpp +95 -0
- esphome/components/microphone/microphone_source.h +80 -0
- esphome/components/mics_4514/sensor.py +25 -14
- esphome/components/midea/climate.py +3 -4
- esphome/components/midea_ir/climate.py +3 -5
- esphome/components/mipi_spi/__init__.py +15 -0
- esphome/components/mipi_spi/display.py +474 -0
- esphome/components/mipi_spi/mipi_spi.cpp +481 -0
- esphome/components/mipi_spi/mipi_spi.h +171 -0
- esphome/components/mipi_spi/models/__init__.py +65 -0
- esphome/components/mipi_spi/models/amoled.py +72 -0
- esphome/components/mipi_spi/models/commands.py +82 -0
- esphome/components/mipi_spi/models/cyd.py +10 -0
- esphome/components/mipi_spi/models/ili.py +749 -0
- esphome/components/mipi_spi/models/jc.py +260 -0
- esphome/components/mipi_spi/models/lanbon.py +15 -0
- esphome/components/mipi_spi/models/lilygo.py +60 -0
- esphome/components/mipi_spi/models/waveshare.py +139 -0
- esphome/components/mitsubishi/climate.py +2 -5
- esphome/components/mitsubishi/mitsubishi.cpp +9 -9
- esphome/components/mixer/speaker/mixer_speaker.cpp +12 -22
- esphome/components/mixer/speaker/mixer_speaker.h +1 -3
- esphome/components/mlx90393/sensor.py +5 -0
- esphome/components/mlx90393/sensor_mlx90393.cpp +195 -13
- esphome/components/mlx90393/sensor_mlx90393.h +21 -4
- esphome/components/modbus/modbus.cpp +2 -1
- esphome/components/mqtt/__init__.py +1 -1
- esphome/components/mqtt/mqtt_client.cpp +6 -2
- esphome/components/mqtt/mqtt_const.h +4 -0
- esphome/components/mqtt/mqtt_fan.cpp +39 -0
- esphome/components/mqtt/mqtt_fan.h +2 -0
- esphome/components/ms5611/sensor.py +6 -6
- esphome/components/ms8607/sensor.py +3 -3
- esphome/components/network/__init__.py +1 -1
- esphome/components/nextion/base_component.py +17 -16
- esphome/components/nextion/display.py +11 -2
- esphome/components/nextion/nextion.cpp +39 -1
- esphome/components/nextion/nextion.h +50 -0
- esphome/components/noblex/climate.py +2 -9
- esphome/components/number/__init__.py +12 -9
- esphome/components/one_wire/one_wire_bus.cpp +14 -10
- esphome/components/one_wire/one_wire_bus.h +14 -8
- esphome/components/online_image/bmp_image.cpp +48 -11
- esphome/components/online_image/bmp_image.h +2 -0
- esphome/components/opentherm/binary_sensor/__init__.py +2 -4
- esphome/components/opentherm/number/__init__.py +11 -20
- esphome/components/opentherm/sensor/__init__.py +3 -3
- esphome/components/opentherm/switch/__init__.py +3 -5
- esphome/components/output/lock/__init__.py +11 -9
- esphome/components/packages/__init__.py +33 -31
- esphome/components/packet_transport/__init__.py +201 -0
- esphome/components/packet_transport/binary_sensor.py +19 -0
- esphome/components/packet_transport/packet_transport.cpp +534 -0
- esphome/components/packet_transport/packet_transport.h +154 -0
- esphome/components/packet_transport/sensor.py +19 -0
- esphome/components/pca9685/pca9685_output.cpp +2 -1
- esphome/components/pid/climate.py +2 -4
- esphome/components/pm2005/__init__.py +1 -0
- esphome/components/pm2005/pm2005.cpp +123 -0
- esphome/components/pm2005/pm2005.h +46 -0
- esphome/components/pm2005/sensor.py +86 -0
- esphome/components/pmsa003i/pmsa003i.cpp +43 -16
- esphome/components/pmsa003i/pmsa003i.h +25 -25
- esphome/components/pmsx003/pmsx003.cpp +195 -230
- esphome/components/pmsx003/pmsx003.h +51 -33
- esphome/components/pmsx003/sensor.py +21 -11
- esphome/components/pn7150/pn7150.h +2 -2
- esphome/components/pn7160/pn7160.h +2 -2
- esphome/components/prometheus/prometheus_handler.cpp +174 -0
- esphome/components/prometheus/prometheus_handler.h +17 -0
- esphome/components/psram/__init__.py +7 -5
- esphome/components/pulse_meter/pulse_meter_sensor.cpp +32 -12
- esphome/components/pulse_meter/pulse_meter_sensor.h +5 -5
- esphome/components/pzem004t/pzem004t.cpp +2 -1
- esphome/components/qspi_dbi/__init__.py +0 -1
- esphome/components/qspi_dbi/display.py +2 -1
- esphome/components/qspi_dbi/models.py +1 -2
- esphome/components/remote_base/__init__.py +91 -0
- esphome/components/remote_base/beo4_protocol.cpp +153 -0
- esphome/components/remote_base/beo4_protocol.h +43 -0
- esphome/components/remote_base/gobox_protocol.cpp +131 -0
- esphome/components/remote_base/gobox_protocol.h +54 -0
- esphome/components/remote_receiver/remote_receiver_esp32.cpp +16 -9
- esphome/components/resampler/speaker/resampler_speaker.cpp +12 -10
- esphome/components/resampler/speaker/resampler_speaker.h +1 -1
- esphome/components/rf_bridge/rf_bridge.cpp +2 -1
- esphome/components/scd30/sensor.py +2 -3
- esphome/components/scd4x/sensor.py +4 -5
- esphome/components/sdp3x/sensor.py +2 -1
- esphome/components/sds011/sds011.cpp +2 -1
- esphome/components/select/__init__.py +19 -20
- esphome/components/sen5x/sen5x.cpp +55 -36
- esphome/components/sen5x/sensor.py +1 -1
- esphome/components/senseair/sensor.py +3 -3
- esphome/components/sensor/__init__.py +158 -14
- esphome/components/sensor/filter.cpp +23 -0
- esphome/components/sensor/filter.h +22 -0
- esphome/components/sgp30/sensor.py +14 -16
- esphome/components/sgp4x/sensor.py +1 -1
- esphome/components/sht4x/sht4x.cpp +43 -22
- esphome/components/sht4x/sht4x.h +1 -1
- esphome/components/shtcx/sensor.py +6 -6
- esphome/components/slow_pwm/slow_pwm_output.cpp +2 -1
- esphome/components/sml/text_sensor/__init__.py +4 -6
- esphome/components/sound_level/__init__.py +0 -0
- esphome/components/sound_level/sensor.py +97 -0
- esphome/components/sound_level/sound_level.cpp +194 -0
- esphome/components/sound_level/sound_level.h +73 -0
- esphome/components/speaker/media_player/__init__.py +4 -8
- esphome/components/speaker/media_player/speaker_media_player.cpp +0 -18
- esphome/components/speaker/media_player/speaker_media_player.h +0 -11
- esphome/components/speaker/speaker.h +4 -7
- esphome/components/speed/fan/__init__.py +17 -16
- esphome/components/spi/spi.h +11 -1
- esphome/components/sprinkler/__init__.py +18 -19
- esphome/components/sprinkler/sprinkler.cpp +6 -5
- esphome/components/switch/__init__.py +32 -42
- esphome/components/syslog/__init__.py +41 -0
- esphome/components/syslog/esphome_syslog.cpp +49 -0
- esphome/components/syslog/esphome_syslog.h +27 -0
- esphome/components/t6615/sensor.py +3 -3
- esphome/components/t6615/t6615.cpp +2 -1
- esphome/components/tca9555/tca9555.cpp +11 -6
- esphome/components/tcl112/climate.py +2 -9
- esphome/components/template/alarm_control_panel/__init__.py +7 -6
- esphome/components/template/alarm_control_panel/template_alarm_control_panel.cpp +21 -17
- esphome/components/template/alarm_control_panel/template_alarm_control_panel.h +2 -1
- esphome/components/template/cover/__init__.py +27 -21
- esphome/components/template/fan/__init__.py +14 -12
- esphome/components/template/lock/__init__.py +20 -25
- esphome/components/template/lock/automation.h +18 -0
- esphome/components/template/text/__init__.py +4 -3
- esphome/components/template/valve/__init__.py +32 -21
- esphome/components/template/valve/automation.h +24 -0
- esphome/components/text/__init__.py +32 -1
- esphome/components/text_sensor/__init__.py +24 -29
- esphome/components/thermostat/climate.py +5 -5
- esphome/components/time_based/cover.py +17 -16
- esphome/components/time_based/time_based_cover.cpp +2 -1
- esphome/components/tm1638/switch/__init__.py +10 -7
- esphome/components/tormatic/cover.py +4 -5
- esphome/components/toshiba/climate.py +3 -5
- esphome/components/touchscreen/touchscreen.cpp +3 -1
- esphome/components/tt21100/touchscreen/tt21100.cpp +1 -1
- esphome/components/tuya/climate/__init__.py +5 -6
- esphome/components/tuya/cover/__init__.py +6 -11
- esphome/components/tuya/select/__init__.py +15 -5
- esphome/components/tuya/select/tuya_select.cpp +6 -1
- esphome/components/tuya/select/tuya_select.h +5 -1
- esphome/components/uart/packet_transport/__init__.py +20 -0
- esphome/components/uart/packet_transport/uart_transport.cpp +88 -0
- esphome/components/uart/packet_transport/uart_transport.h +41 -0
- esphome/components/uart/switch/uart_switch.cpp +2 -1
- esphome/components/udp/__init__.py +126 -128
- esphome/components/udp/automation.h +40 -0
- esphome/components/udp/binary_sensor.py +3 -25
- esphome/components/udp/packet_transport/__init__.py +29 -0
- esphome/components/udp/packet_transport/udp_transport.cpp +36 -0
- esphome/components/udp/packet_transport/udp_transport.h +28 -0
- esphome/components/udp/sensor.py +3 -25
- esphome/components/udp/udp_component.cpp +26 -470
- esphome/components/udp/udp_component.h +21 -128
- esphome/components/update/__init__.py +31 -1
- esphome/components/uponor_smatrix/climate/__init__.py +4 -9
- esphome/components/uponor_smatrix/climate/uponor_smatrix_climate.cpp +2 -1
- esphome/components/uponor_smatrix/uponor_smatrix.cpp +2 -1
- esphome/components/uptime/text_sensor/__init__.py +47 -7
- esphome/components/uptime/text_sensor/uptime_text_sensor.cpp +12 -7
- esphome/components/uptime/text_sensor/uptime_text_sensor.h +19 -0
- esphome/components/valve/__init__.py +34 -3
- esphome/components/valve/automation.h +1 -19
- esphome/components/vl53l0x/sensor.py +11 -0
- esphome/components/vl53l0x/vl53l0x_sensor.cpp +5 -1
- esphome/components/vl53l0x/vl53l0x_sensor.h +2 -1
- esphome/components/voice_assistant/__init__.py +36 -10
- esphome/components/voice_assistant/voice_assistant.cpp +170 -144
- esphome/components/voice_assistant/voice_assistant.h +26 -25
- esphome/components/waveshare_epaper/display.py +6 -0
- esphome/components/waveshare_epaper/waveshare_epaper.cpp +439 -37
- esphome/components/waveshare_epaper/waveshare_epaper.h +60 -11
- esphome/components/weikai/weikai.cpp +0 -52
- esphome/components/whirlpool/climate.py +3 -5
- esphome/components/whynter/climate.py +3 -5
- esphome/components/xpt2046/touchscreen/xpt2046.cpp +1 -1
- esphome/components/yashima/climate.py +6 -6
- esphome/components/zhlt01/climate.py +2 -7
- esphome/config.py +13 -13
- esphome/config_validation.py +38 -58
- esphome/const.py +15 -1
- esphome/core/__init__.py +2 -0
- esphome/core/application.cpp +27 -10
- esphome/core/application.h +9 -1
- esphome/core/automation.h +4 -3
- esphome/core/component.cpp +28 -7
- esphome/core/component.h +10 -1
- esphome/core/defines.h +23 -17
- esphome/core/doxygen.h +13 -0
- esphome/core/macros.h +4 -0
- esphome/core/scheduler.cpp +7 -1
- esphome/cpp_generator.py +6 -2
- esphome/dashboard/web_server.py +3 -3
- esphome/helpers.py +39 -0
- esphome/loader.py +4 -0
- esphome/log.py +15 -19
- esphome/mqtt.py +23 -10
- esphome/platformio_api.py +1 -1
- esphome/schema_extractors.py +0 -1
- esphome/voluptuous_schema.py +3 -1
- esphome/vscode.py +15 -0
- esphome/wizard.py +47 -37
- esphome/zeroconf.py +7 -3
- {esphome-2025.4.1.dist-info → esphome-2025.5.0.dist-info}/METADATA +10 -11
- {esphome-2025.4.1.dist-info → esphome-2025.5.0.dist-info}/RECORD +456 -396
- {esphome-2025.4.1.dist-info → esphome-2025.5.0.dist-info}/WHEEL +1 -1
- esphome/components/esp32_ble/const_esp32c6.h +0 -74
- {esphome-2025.4.1.dist-info → esphome-2025.5.0.dist-info}/entry_points.txt +0 -0
- {esphome-2025.4.1.dist-info → esphome-2025.5.0.dist-info}/licenses/LICENSE +0 -0
- {esphome-2025.4.1.dist-info → esphome-2025.5.0.dist-info}/top_level.txt +0 -0
esphome/wizard.py
CHANGED
@@ -9,7 +9,7 @@ import esphome.config_validation as cv
|
|
9
9
|
from esphome.const import ALLOWED_NAME_CHARS, ENV_QUICKWIZARD
|
10
10
|
from esphome.core import CORE
|
11
11
|
from esphome.helpers import get_bool_env, write_file
|
12
|
-
from esphome.log import
|
12
|
+
from esphome.log import AnsiFore, color
|
13
13
|
from esphome.storage_json import StorageJSON, ext_storage_path
|
14
14
|
from esphome.util import safe_input, safe_print
|
15
15
|
|
@@ -219,7 +219,7 @@ def wizard_write(path, **kwargs):
|
|
219
219
|
elif board in rtl87xx_boards.BOARDS:
|
220
220
|
platform = "RTL87XX"
|
221
221
|
else:
|
222
|
-
safe_print(color(
|
222
|
+
safe_print(color(AnsiFore.RED, f'The board "{board}" is unknown.'))
|
223
223
|
return False
|
224
224
|
kwargs["platform"] = platform
|
225
225
|
hardware = kwargs["platform"]
|
@@ -274,12 +274,12 @@ def wizard(path):
|
|
274
274
|
|
275
275
|
if not path.endswith(".yaml") and not path.endswith(".yml"):
|
276
276
|
safe_print(
|
277
|
-
f"Please make your configuration file {color(
|
277
|
+
f"Please make your configuration file {color(AnsiFore.CYAN, path)} have the extension .yaml or .yml"
|
278
278
|
)
|
279
279
|
return 1
|
280
280
|
if os.path.exists(path):
|
281
281
|
safe_print(
|
282
|
-
f"Uh oh, it seems like {color(
|
282
|
+
f"Uh oh, it seems like {color(AnsiFore.CYAN, path)} already exists, please delete that file first or chose another configuration file."
|
283
283
|
)
|
284
284
|
return 2
|
285
285
|
|
@@ -298,17 +298,19 @@ def wizard(path):
|
|
298
298
|
sleep(3.0)
|
299
299
|
safe_print()
|
300
300
|
safe_print_step(1, CORE_BIG)
|
301
|
-
safe_print(
|
301
|
+
safe_print(
|
302
|
+
f"First up, please choose a {color(AnsiFore.GREEN, 'name')} for your node."
|
303
|
+
)
|
302
304
|
safe_print(
|
303
305
|
"It should be a unique name that can be used to identify the device later."
|
304
306
|
)
|
305
307
|
sleep(1)
|
306
308
|
safe_print(
|
307
|
-
f"For example, I like calling the node in my living room {color(
|
309
|
+
f"For example, I like calling the node in my living room {color(AnsiFore.BOLD_WHITE, 'livingroom')}."
|
308
310
|
)
|
309
311
|
safe_print()
|
310
312
|
sleep(1)
|
311
|
-
name = safe_input(color(
|
313
|
+
name = safe_input(color(AnsiFore.BOLD_WHITE, "(name): "))
|
312
314
|
|
313
315
|
while True:
|
314
316
|
try:
|
@@ -317,7 +319,7 @@ def wizard(path):
|
|
317
319
|
except vol.Invalid:
|
318
320
|
safe_print(
|
319
321
|
color(
|
320
|
-
|
322
|
+
AnsiFore.RED,
|
321
323
|
f'Oh noes, "{name}" isn\'t a valid name. Names can only '
|
322
324
|
f"include numbers, lower-case letters and hyphens. ",
|
323
325
|
)
|
@@ -325,11 +327,13 @@ def wizard(path):
|
|
325
327
|
name = strip_accents(name).lower().replace(" ", "-")
|
326
328
|
name = strip_accents(name).lower().replace("_", "-")
|
327
329
|
name = "".join(c for c in name if c in ALLOWED_NAME_CHARS)
|
328
|
-
safe_print(
|
330
|
+
safe_print(
|
331
|
+
f'Shall I use "{color(AnsiFore.CYAN, name)}" as the name instead?'
|
332
|
+
)
|
329
333
|
sleep(0.5)
|
330
334
|
name = default_input("(name [{}]): ", name)
|
331
335
|
|
332
|
-
safe_print(f'Great! Your node is now called "{color(
|
336
|
+
safe_print(f'Great! Your node is now called "{color(AnsiFore.CYAN, name)}".')
|
333
337
|
sleep(1)
|
334
338
|
safe_print_step(2, ESP_BIG)
|
335
339
|
safe_print(
|
@@ -346,7 +350,7 @@ def wizard(path):
|
|
346
350
|
sleep(0.5)
|
347
351
|
safe_print()
|
348
352
|
platform = safe_input(
|
349
|
-
color(
|
353
|
+
color(AnsiFore.BOLD_WHITE, f"({'/'.join(wizard_platforms)}): ")
|
350
354
|
)
|
351
355
|
try:
|
352
356
|
platform = vol.All(vol.Upper, vol.Any(*wizard_platforms))(platform.upper())
|
@@ -355,17 +359,19 @@ def wizard(path):
|
|
355
359
|
safe_print(
|
356
360
|
f'Unfortunately, I can\'t find an espressif microcontroller called "{platform}". Please try again.'
|
357
361
|
)
|
358
|
-
safe_print(
|
362
|
+
safe_print(
|
363
|
+
f"Thanks! You've chosen {color(AnsiFore.CYAN, platform)} as your platform."
|
364
|
+
)
|
359
365
|
safe_print()
|
360
366
|
sleep(1)
|
361
367
|
|
362
368
|
if platform == "ESP32":
|
363
369
|
board_link = (
|
364
|
-
"
|
370
|
+
"https://docs.platformio.org/en/latest/platforms/espressif32.html#boards"
|
365
371
|
)
|
366
372
|
elif platform == "ESP8266":
|
367
373
|
board_link = (
|
368
|
-
"
|
374
|
+
"https://docs.platformio.org/en/latest/platforms/espressif8266.html#boards"
|
369
375
|
)
|
370
376
|
elif platform == "RP2040":
|
371
377
|
board_link = (
|
@@ -376,27 +382,29 @@ def wizard(path):
|
|
376
382
|
else:
|
377
383
|
raise NotImplementedError("Unknown platform!")
|
378
384
|
|
379
|
-
safe_print(
|
385
|
+
safe_print(
|
386
|
+
f"Next, I need to know what {color(AnsiFore.GREEN, 'board')} you're using."
|
387
|
+
)
|
380
388
|
sleep(0.5)
|
381
|
-
safe_print(f"Please go to {color(
|
389
|
+
safe_print(f"Please go to {color(AnsiFore.GREEN, board_link)} and choose a board.")
|
382
390
|
if platform == "ESP32":
|
383
|
-
safe_print(f"(Type {color(
|
391
|
+
safe_print(f"(Type {color(AnsiFore.GREEN, 'esp01_1m')} for Sonoff devices)")
|
384
392
|
safe_print()
|
385
393
|
# Don't sleep because user needs to copy link
|
386
394
|
if platform == "ESP32":
|
387
|
-
safe_print(f'For example "{color(
|
395
|
+
safe_print(f'For example "{color(AnsiFore.BOLD_WHITE, "nodemcu-32s")}".')
|
388
396
|
boards_list = esp32_boards.BOARDS.items()
|
389
397
|
elif platform == "ESP8266":
|
390
|
-
safe_print(f'For example "{color(
|
398
|
+
safe_print(f'For example "{color(AnsiFore.BOLD_WHITE, "nodemcuv2")}".')
|
391
399
|
boards_list = esp8266_boards.BOARDS.items()
|
392
400
|
elif platform == "BK72XX":
|
393
|
-
safe_print(f'For example "{color(
|
401
|
+
safe_print(f'For example "{color(AnsiFore.BOLD_WHITE, "cb2s")}".')
|
394
402
|
boards_list = bk72xx_boards.BOARDS.items()
|
395
403
|
elif platform == "RTL87XX":
|
396
|
-
safe_print(f'For example "{color(
|
404
|
+
safe_print(f'For example "{color(AnsiFore.BOLD_WHITE, "wr3")}".')
|
397
405
|
boards_list = rtl87xx_boards.BOARDS.items()
|
398
406
|
elif platform == "RP2040":
|
399
|
-
safe_print(f'For example "{color(
|
407
|
+
safe_print(f'For example "{color(AnsiFore.BOLD_WHITE, "rpipicow")}".')
|
400
408
|
boards_list = rp2040_boards.BOARDS.items()
|
401
409
|
|
402
410
|
else:
|
@@ -409,19 +417,21 @@ def wizard(path):
|
|
409
417
|
boards.append(board_id)
|
410
418
|
|
411
419
|
while True:
|
412
|
-
board = safe_input(color(
|
420
|
+
board = safe_input(color(AnsiFore.BOLD_WHITE, "(board): "))
|
413
421
|
try:
|
414
422
|
board = vol.All(vol.Lower, vol.Any(*boards))(board)
|
415
423
|
break
|
416
424
|
except vol.Invalid:
|
417
425
|
safe_print(
|
418
|
-
color(
|
426
|
+
color(
|
427
|
+
AnsiFore.RED, f'Sorry, I don\'t think the board "{board}" exists.'
|
428
|
+
)
|
419
429
|
)
|
420
430
|
safe_print()
|
421
431
|
sleep(0.25)
|
422
432
|
safe_print()
|
423
433
|
|
424
|
-
safe_print(f"Way to go! You've chosen {color(
|
434
|
+
safe_print(f"Way to go! You've chosen {color(AnsiFore.CYAN, board)} as your board.")
|
425
435
|
safe_print()
|
426
436
|
sleep(1)
|
427
437
|
|
@@ -432,19 +442,19 @@ def wizard(path):
|
|
432
442
|
safe_print()
|
433
443
|
sleep(1)
|
434
444
|
safe_print(
|
435
|
-
f"First, what's the {color(
|
445
|
+
f"First, what's the {color(AnsiFore.GREEN, 'SSID')} (the name) of the WiFi network {name} should connect to?"
|
436
446
|
)
|
437
447
|
sleep(1.5)
|
438
|
-
safe_print(f'For example "{color(
|
448
|
+
safe_print(f'For example "{color(AnsiFore.BOLD_WHITE, "Abraham Linksys")}".')
|
439
449
|
while True:
|
440
|
-
ssid = safe_input(color(
|
450
|
+
ssid = safe_input(color(AnsiFore.BOLD_WHITE, "(ssid): "))
|
441
451
|
try:
|
442
452
|
ssid = cv.ssid(ssid)
|
443
453
|
break
|
444
454
|
except vol.Invalid:
|
445
455
|
safe_print(
|
446
456
|
color(
|
447
|
-
|
457
|
+
AnsiFore.RED,
|
448
458
|
f'Unfortunately, "{ssid}" doesn\'t seem to be a valid SSID. Please try again.',
|
449
459
|
)
|
450
460
|
)
|
@@ -452,18 +462,18 @@ def wizard(path):
|
|
452
462
|
sleep(1)
|
453
463
|
|
454
464
|
safe_print(
|
455
|
-
f'Thank you very much! You\'ve just chosen "{color(
|
465
|
+
f'Thank you very much! You\'ve just chosen "{color(AnsiFore.CYAN, ssid)}" as your SSID.'
|
456
466
|
)
|
457
467
|
safe_print()
|
458
468
|
sleep(0.75)
|
459
469
|
|
460
470
|
safe_print(
|
461
|
-
f"Now please state the {color(
|
471
|
+
f"Now please state the {color(AnsiFore.GREEN, 'password')} of the WiFi network so that I can connect to it (Leave empty for no password)"
|
462
472
|
)
|
463
473
|
safe_print()
|
464
|
-
safe_print(f'For example "{color(
|
474
|
+
safe_print(f'For example "{color(AnsiFore.BOLD_WHITE, "PASSWORD42")}"')
|
465
475
|
sleep(0.5)
|
466
|
-
psk = safe_input(color(
|
476
|
+
psk = safe_input(color(AnsiFore.BOLD_WHITE, "(PSK): "))
|
467
477
|
safe_print(
|
468
478
|
"Perfect! WiFi is now set up (you can create static IPs and so on later)."
|
469
479
|
)
|
@@ -475,12 +485,12 @@ def wizard(path):
|
|
475
485
|
"(over the air) and integrates into Home Assistant with a native API."
|
476
486
|
)
|
477
487
|
safe_print(
|
478
|
-
f"This can be insecure if you do not trust the WiFi network. Do you want to set a {color(
|
488
|
+
f"This can be insecure if you do not trust the WiFi network. Do you want to set a {color(AnsiFore.GREEN, 'password')} for connecting to this ESP?"
|
479
489
|
)
|
480
490
|
safe_print()
|
481
491
|
sleep(0.25)
|
482
492
|
safe_print("Press ENTER for no password")
|
483
|
-
password = safe_input(color(
|
493
|
+
password = safe_input(color(AnsiFore.BOLD_WHITE, "(password): "))
|
484
494
|
else:
|
485
495
|
ssid, password, psk = "", "", ""
|
486
496
|
|
@@ -497,8 +507,8 @@ def wizard(path):
|
|
497
507
|
|
498
508
|
safe_print()
|
499
509
|
safe_print(
|
500
|
-
color(
|
501
|
-
+ color(
|
510
|
+
color(AnsiFore.CYAN, "DONE! I've now written a new configuration file to ")
|
511
|
+
+ color(AnsiFore.BOLD_CYAN, path)
|
502
512
|
)
|
503
513
|
safe_print()
|
504
514
|
safe_print("Next steps:")
|
esphome/zeroconf.py
CHANGED
@@ -18,6 +18,8 @@ from esphome.storage_json import StorageJSON, ext_storage_path
|
|
18
18
|
|
19
19
|
_LOGGER = logging.getLogger(__name__)
|
20
20
|
|
21
|
+
DEFAULT_TIMEOUT = 10.0
|
22
|
+
DEFAULT_TIMEOUT_MS = DEFAULT_TIMEOUT * 1000
|
21
23
|
|
22
24
|
_BACKGROUND_TASKS: set[asyncio.Task] = set()
|
23
25
|
|
@@ -107,7 +109,7 @@ class DashboardImportDiscovery:
|
|
107
109
|
self, zeroconf: Zeroconf, info: AsyncServiceInfo, service_type: str, name: str
|
108
110
|
) -> None:
|
109
111
|
"""Process a service info."""
|
110
|
-
if await info.async_request(zeroconf, timeout=
|
112
|
+
if await info.async_request(zeroconf, timeout=DEFAULT_TIMEOUT_MS):
|
111
113
|
self._process_service_info(name, info)
|
112
114
|
|
113
115
|
def _process_service_info(self, name: str, info: ServiceInfo) -> None:
|
@@ -164,7 +166,9 @@ class DashboardImportDiscovery:
|
|
164
166
|
|
165
167
|
|
166
168
|
class EsphomeZeroconf(Zeroconf):
|
167
|
-
def resolve_host(
|
169
|
+
def resolve_host(
|
170
|
+
self, host: str, timeout: float = DEFAULT_TIMEOUT
|
171
|
+
) -> list[str] | None:
|
168
172
|
"""Resolve a host name to an IP address."""
|
169
173
|
info = AddressResolver(f"{host.partition('.')[0]}.local.")
|
170
174
|
if (
|
@@ -177,7 +181,7 @@ class EsphomeZeroconf(Zeroconf):
|
|
177
181
|
|
178
182
|
class AsyncEsphomeZeroconf(AsyncZeroconf):
|
179
183
|
async def async_resolve_host(
|
180
|
-
self, host: str, timeout: float =
|
184
|
+
self, host: str, timeout: float = DEFAULT_TIMEOUT
|
181
185
|
) -> list[str] | None:
|
182
186
|
"""Resolve a host name to an IP address."""
|
183
187
|
info = AddressResolver(f"{host.partition('.')[0]}.local.")
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: esphome
|
3
|
-
Version: 2025.
|
3
|
+
Version: 2025.5.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
|
@@ -37,13 +37,14 @@ Requires-Dist: pyserial==3.5
|
|
37
37
|
Requires-Dist: platformio==6.1.18
|
38
38
|
Requires-Dist: esptool==4.8.1
|
39
39
|
Requires-Dist: click==8.1.7
|
40
|
-
Requires-Dist: esphome-dashboard==
|
41
|
-
Requires-Dist: aioesphomeapi==
|
42
|
-
Requires-Dist: zeroconf==0.
|
43
|
-
Requires-Dist: puremagic==1.
|
40
|
+
Requires-Dist: esphome-dashboard==20250514.0
|
41
|
+
Requires-Dist: aioesphomeapi==30.2.0
|
42
|
+
Requires-Dist: zeroconf==0.147.0
|
43
|
+
Requires-Dist: puremagic==1.29
|
44
44
|
Requires-Dist: ruamel.yaml==0.18.10
|
45
45
|
Requires-Dist: esphome-glyphsets==0.2.0
|
46
46
|
Requires-Dist: pillow==10.4.0
|
47
|
+
Requires-Dist: cairosvg==2.7.1
|
47
48
|
Requires-Dist: freetype-py==2.5.1
|
48
49
|
Requires-Dist: kconfiglib==13.7.1
|
49
50
|
Requires-Dist: pyparsing>=3.0
|
@@ -51,21 +52,19 @@ Requires-Dist: argcomplete>=2.0.0
|
|
51
52
|
Provides-Extra: dev
|
52
53
|
Requires-Dist: clang-format==13.0.1; extra == "dev"
|
53
54
|
Requires-Dist: clang-tidy==18.1.8; extra == "dev"
|
54
|
-
Requires-Dist: yamllint==1.37.
|
55
|
+
Requires-Dist: yamllint==1.37.1; extra == "dev"
|
55
56
|
Provides-Extra: test
|
56
|
-
Requires-Dist: pylint==3.3.
|
57
|
+
Requires-Dist: pylint==3.3.7; extra == "test"
|
57
58
|
Requires-Dist: flake8==7.2.0; extra == "test"
|
58
|
-
Requires-Dist: ruff==0.11.
|
59
|
+
Requires-Dist: ruff==0.11.9; extra == "test"
|
59
60
|
Requires-Dist: pyupgrade==3.19.1; extra == "test"
|
60
61
|
Requires-Dist: pre-commit; extra == "test"
|
61
62
|
Requires-Dist: pytest==8.3.5; extra == "test"
|
62
|
-
Requires-Dist: pytest-cov==6.
|
63
|
+
Requires-Dist: pytest-cov==6.1.1; extra == "test"
|
63
64
|
Requires-Dist: pytest-mock==3.14.0; extra == "test"
|
64
65
|
Requires-Dist: pytest-asyncio==0.26.0; extra == "test"
|
65
66
|
Requires-Dist: asyncmock==0.4.2; extra == "test"
|
66
67
|
Requires-Dist: hypothesis==6.92.1; extra == "test"
|
67
|
-
Provides-Extra: displays
|
68
|
-
Requires-Dist: cairosvg==2.7.1; extra == "displays"
|
69
68
|
Dynamic: license-file
|
70
69
|
|
71
70
|
# ESPHome [](https://discord.gg/KhAMKrd) [](https://GitHub.com/esphome/esphome/releases/)
|