esphome 2025.4.1__py3-none-any.whl → 2025.5.0b2__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- esphome/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 +77 -10
- esphome/components/api/api_connection.h +6 -1
- esphome/components/api/api_frame_helper.cpp +98 -130
- esphome/components/api/api_frame_helper.h +12 -2
- 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 +38 -9
- esphome/components/as3935_i2c/as3935_i2c.h +0 -3
- esphome/components/as7341/as7341.h +1 -1
- 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/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/binary_sensor/binary_sensor.cpp +6 -10
- esphome/components/binary_sensor/binary_sensor.h +1 -1
- esphome/components/binary_sensor/filter.cpp +21 -21
- esphome/components/binary_sensor/filter.h +10 -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 +135 -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/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/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/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/debug/debug_component.cpp +5 -0
- esphome/components/debug/debug_component.h +6 -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/emmeti/climate.py +2 -9
- esphome/components/endstop/cover.py +17 -16
- 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.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_can/esp32_can.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/esp8266/gpio.cpp +69 -8
- 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/fujitsu_general/climate.py +2 -9
- 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 +11 -2
- esphome/components/gps/gps.cpp +11 -8
- esphome/components/gps/gps.h +9 -6
- 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/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/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/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/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 +21 -0
- esphome/components/logger/logger.cpp +125 -95
- esphome/components/logger/logger.h +160 -35
- 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/max7219digit/max7219digit.cpp +27 -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/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/mqtt/__init__.py +1 -1
- esphome/components/mqtt/mqtt_client.cpp +5 -1
- 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/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 +193 -229
- 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/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/scd30/sensor.py +2 -3
- esphome/components/scd4x/sensor.py +4 -5
- esphome/components/sdp3x/sensor.py +2 -1
- esphome/components/select/__init__.py +19 -20
- esphome/components/sen5x/sensor.py +1 -1
- esphome/components/sensor/__init__.py +158 -14
- esphome/components/sensor/filter.cpp +23 -0
- esphome/components/sensor/filter.h +22 -0
- esphome/components/sgp4x/sensor.py +1 -1
- esphome/components/sht4x/sht4x.cpp +43 -22
- esphome/components/sht4x/sht4x.h +1 -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/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/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/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/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/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/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_validation.py +38 -58
- esphome/const.py +15 -1
- esphome/core/__init__.py +2 -0
- esphome/core/application.cpp +1 -0
- esphome/core/application.h +4 -0
- esphome/core/automation.h +4 -3
- esphome/core/component.cpp +19 -3
- esphome/core/component.h +5 -0
- esphome/core/defines.h +23 -17
- esphome/core/macros.h +4 -0
- esphome/core/scheduler.cpp +3 -0
- esphome/cpp_generator.py +6 -2
- esphome/dashboard/web_server.py +3 -3
- esphome/helpers.py +39 -0
- esphome/loader.py +4 -0
- esphome/mqtt.py +21 -8
- esphome/platformio_api.py +1 -1
- esphome/schema_extractors.py +0 -1
- esphome/vscode.py +15 -0
- esphome/wizard.py +2 -2
- esphome/zeroconf.py +7 -3
- {esphome-2025.4.1.dist-info → esphome-2025.5.0b2.dist-info}/METADATA +10 -11
- {esphome-2025.4.1.dist-info → esphome-2025.5.0b2.dist-info}/RECORD +411 -352
- {esphome-2025.4.1.dist-info → esphome-2025.5.0b2.dist-info}/WHEEL +1 -1
- esphome/components/esp32_ble/const_esp32c6.h +0 -74
- {esphome-2025.4.1.dist-info → esphome-2025.5.0b2.dist-info}/entry_points.txt +0 -0
- {esphome-2025.4.1.dist-info → esphome-2025.5.0b2.dist-info}/licenses/LICENSE +0 -0
- {esphome-2025.4.1.dist-info → esphome-2025.5.0b2.dist-info}/top_level.txt +0 -0
@@ -2,7 +2,7 @@ import esphome.codegen as cg
|
|
2
2
|
from esphome.components import climate, remote_transmitter, sensor
|
3
3
|
from esphome.components.remote_base import CONF_TRANSMITTER_ID
|
4
4
|
import esphome.config_validation as cv
|
5
|
-
from esphome.const import
|
5
|
+
from esphome.const import CONF_SENSOR, CONF_SUPPORTS_COOL, CONF_SUPPORTS_HEAT
|
6
6
|
|
7
7
|
AUTO_LOAD = ["sensor"]
|
8
8
|
|
@@ -10,9 +10,9 @@ yashima_ns = cg.esphome_ns.namespace("yashima")
|
|
10
10
|
YashimaClimate = yashima_ns.class_("YashimaClimate", climate.Climate, cg.Component)
|
11
11
|
|
12
12
|
CONFIG_SCHEMA = cv.All(
|
13
|
-
climate.
|
13
|
+
climate.climate_schema(YashimaClimate)
|
14
|
+
.extend(
|
14
15
|
{
|
15
|
-
cv.GenerateID(): cv.declare_id(YashimaClimate),
|
16
16
|
cv.GenerateID(CONF_TRANSMITTER_ID): cv.use_id(
|
17
17
|
remote_transmitter.RemoteTransmitterComponent
|
18
18
|
),
|
@@ -20,14 +20,14 @@ CONFIG_SCHEMA = cv.All(
|
|
20
20
|
cv.Optional(CONF_SUPPORTS_HEAT, default=True): cv.boolean,
|
21
21
|
cv.Optional(CONF_SENSOR): cv.use_id(sensor.Sensor),
|
22
22
|
}
|
23
|
-
)
|
23
|
+
)
|
24
|
+
.extend(cv.COMPONENT_SCHEMA)
|
24
25
|
)
|
25
26
|
|
26
27
|
|
27
28
|
async def to_code(config):
|
28
|
-
var =
|
29
|
+
var = await climate.new_climate(config)
|
29
30
|
await cg.register_component(var, config)
|
30
|
-
await climate.register_climate(var, config)
|
31
31
|
|
32
32
|
cg.add(var.set_supports_cool(config[CONF_SUPPORTS_COOL]))
|
33
33
|
cg.add(var.set_supports_heat(config[CONF_SUPPORTS_HEAT]))
|
@@ -1,7 +1,5 @@
|
|
1
1
|
import esphome.codegen as cg
|
2
2
|
from esphome.components import climate_ir
|
3
|
-
import esphome.config_validation as cv
|
4
|
-
from esphome.const import CONF_ID
|
5
3
|
|
6
4
|
AUTO_LOAD = ["climate_ir"]
|
7
5
|
CODEOWNERS = ["@cfeenstra1024"]
|
@@ -9,11 +7,8 @@ CODEOWNERS = ["@cfeenstra1024"]
|
|
9
7
|
zhlt01_ns = cg.esphome_ns.namespace("zhlt01")
|
10
8
|
ZHLT01Climate = zhlt01_ns.class_("ZHLT01Climate", climate_ir.ClimateIR)
|
11
9
|
|
12
|
-
CONFIG_SCHEMA = climate_ir.
|
13
|
-
{cv.GenerateID(): cv.declare_id(ZHLT01Climate)}
|
14
|
-
)
|
10
|
+
CONFIG_SCHEMA = climate_ir.climare_ir_with_receiver_schema(ZHLT01Climate)
|
15
11
|
|
16
12
|
|
17
13
|
async def to_code(config):
|
18
|
-
|
19
|
-
await climate_ir.register_climate_ir(var, config)
|
14
|
+
await climate_ir.new_climate_ir(config)
|
esphome/config_validation.py
CHANGED
@@ -56,7 +56,6 @@ from esphome.const import (
|
|
56
56
|
KEY_CORE,
|
57
57
|
KEY_FRAMEWORK_VERSION,
|
58
58
|
KEY_TARGET_FRAMEWORK,
|
59
|
-
KEY_TARGET_PLATFORM,
|
60
59
|
PLATFORM_ESP32,
|
61
60
|
PLATFORM_ESP8266,
|
62
61
|
PLATFORM_RP2040,
|
@@ -117,7 +116,7 @@ RequiredFieldInvalid = vol.RequiredFieldInvalid
|
|
117
116
|
ROOT_CONFIG_PATH = object()
|
118
117
|
|
119
118
|
RESERVED_IDS = [
|
120
|
-
# C++ keywords
|
119
|
+
# C++ keywords https://en.cppreference.com/w/cpp/keyword
|
121
120
|
"alarm",
|
122
121
|
"alignas",
|
123
122
|
"alignof",
|
@@ -1942,70 +1941,28 @@ def platformio_version_constraint(value):
|
|
1942
1941
|
|
1943
1942
|
def require_framework_version(
|
1944
1943
|
*,
|
1945
|
-
esp_idf=None,
|
1946
|
-
esp32_arduino=None,
|
1947
|
-
esp8266_arduino=None,
|
1948
|
-
rp2040_arduino=None,
|
1949
|
-
bk72xx_libretiny=None,
|
1950
|
-
host=None,
|
1951
1944
|
max_version=False,
|
1952
1945
|
extra_message=None,
|
1946
|
+
**kwargs,
|
1953
1947
|
):
|
1954
1948
|
def validator(value):
|
1955
1949
|
core_data = CORE.data[KEY_CORE]
|
1956
1950
|
framework = core_data[KEY_TARGET_FRAMEWORK]
|
1957
|
-
|
1958
|
-
|
1959
|
-
|
1960
|
-
|
1961
|
-
|
1962
|
-
raise Invalid(msg)
|
1963
|
-
required = esp_idf
|
1964
|
-
elif CORE.is_bk72xx and framework == "arduino":
|
1965
|
-
if bk72xx_libretiny is None:
|
1966
|
-
msg = "This feature is incompatible with BK72XX"
|
1967
|
-
if extra_message:
|
1968
|
-
msg += f". {extra_message}"
|
1969
|
-
raise Invalid(msg)
|
1970
|
-
required = bk72xx_libretiny
|
1971
|
-
elif CORE.is_esp32 and framework == "arduino":
|
1972
|
-
if esp32_arduino is None:
|
1973
|
-
msg = "This feature is incompatible with ESP32 using arduino framework"
|
1974
|
-
if extra_message:
|
1975
|
-
msg += f". {extra_message}"
|
1976
|
-
raise Invalid(msg)
|
1977
|
-
required = esp32_arduino
|
1978
|
-
elif CORE.is_esp8266 and framework == "arduino":
|
1979
|
-
if esp8266_arduino is None:
|
1980
|
-
msg = "This feature is incompatible with ESP8266"
|
1981
|
-
if extra_message:
|
1982
|
-
msg += f". {extra_message}"
|
1983
|
-
raise Invalid(msg)
|
1984
|
-
required = esp8266_arduino
|
1985
|
-
elif CORE.is_rp2040 and framework == "arduino":
|
1986
|
-
if rp2040_arduino is None:
|
1987
|
-
msg = "This feature is incompatible with RP2040"
|
1988
|
-
if extra_message:
|
1989
|
-
msg += f". {extra_message}"
|
1990
|
-
raise Invalid(msg)
|
1991
|
-
required = rp2040_arduino
|
1992
|
-
elif CORE.is_host and framework == "host":
|
1993
|
-
if host is None:
|
1994
|
-
msg = "This feature is incompatible with host platform"
|
1995
|
-
if extra_message:
|
1996
|
-
msg += f". {extra_message}"
|
1997
|
-
raise Invalid(msg)
|
1998
|
-
required = host
|
1951
|
+
|
1952
|
+
if CORE.is_host and framework == "host":
|
1953
|
+
key = "host"
|
1954
|
+
elif framework == "esp-idf":
|
1955
|
+
key = "esp_idf"
|
1999
1956
|
else:
|
2000
|
-
|
2001
|
-
f"""
|
2002
|
-
Internal Error: require_framework_version does not support this platform configuration
|
2003
|
-
platform: {core_data[KEY_TARGET_PLATFORM]}
|
2004
|
-
framework: {framework}
|
1957
|
+
key = CORE.target_platform + "_" + framework
|
2005
1958
|
|
2006
|
-
|
2007
|
-
""
|
2008
|
-
|
1959
|
+
if key not in kwargs:
|
1960
|
+
msg = f"This feature is incompatible with {CORE.target_platform.upper()} using {framework} framework"
|
1961
|
+
if extra_message:
|
1962
|
+
msg += f". {extra_message}"
|
1963
|
+
raise Invalid(msg)
|
1964
|
+
|
1965
|
+
required = kwargs[key]
|
2009
1966
|
|
2010
1967
|
if max_version:
|
2011
1968
|
if core_data[KEY_FRAMEWORK_VERSION] > required:
|
@@ -2115,3 +2072,26 @@ def rename_key(old_key, new_key):
|
|
2115
2072
|
return config
|
2116
2073
|
|
2117
2074
|
return validator
|
2075
|
+
|
2076
|
+
|
2077
|
+
# Remove before 2025.11.0
|
2078
|
+
def deprecated_schema_constant(entity_type: str):
|
2079
|
+
def validator(config):
|
2080
|
+
type: str = "unknown"
|
2081
|
+
if (id := config.get(CONF_ID)) is not None and isinstance(id, core.ID):
|
2082
|
+
type = str(id.type).split("::", maxsplit=1)[0]
|
2083
|
+
_LOGGER.warning(
|
2084
|
+
"Using `%s.%s_SCHEMA` is deprecated and will be removed in ESPHome 2025.11.0. "
|
2085
|
+
"Please use `%s.%s_schema(...)` instead. "
|
2086
|
+
"If you are seeing this, report an issue to the external_component author and ask them to update it. "
|
2087
|
+
"https://developers.esphome.io/blog/2025/05/14/_schema-deprecations/. "
|
2088
|
+
"Component using this schema: %s",
|
2089
|
+
entity_type,
|
2090
|
+
entity_type.upper(),
|
2091
|
+
entity_type,
|
2092
|
+
entity_type,
|
2093
|
+
type,
|
2094
|
+
)
|
2095
|
+
return config
|
2096
|
+
|
2097
|
+
return validator
|
esphome/const.py
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
"""Constants used by esphome."""
|
2
2
|
|
3
|
-
__version__ = "2025.
|
3
|
+
__version__ = "2025.5.0b2"
|
4
4
|
|
5
5
|
ALLOWED_NAME_CHARS = "abcdefghijklmnopqrstuvwxyz0123456789-_"
|
6
6
|
VALID_SUBSTITUTIONS_CHARACTERS = (
|
@@ -45,6 +45,8 @@ CONF_ALLOW_OTHER_USES = "allow_other_uses"
|
|
45
45
|
CONF_ALPHA = "alpha"
|
46
46
|
CONF_ALTITUDE = "altitude"
|
47
47
|
CONF_AMBIENT_LIGHT = "ambient_light"
|
48
|
+
CONF_AMBIENT_PRESSURE_COMPENSATION = "ambient_pressure_compensation"
|
49
|
+
CONF_AMBIENT_PRESSURE_COMPENSATION_SOURCE = "ambient_pressure_compensation_source"
|
48
50
|
CONF_AMMONIA = "ammonia"
|
49
51
|
CONF_ANALOG = "analog"
|
50
52
|
CONF_AND = "and"
|
@@ -63,6 +65,7 @@ CONF_AUTH = "auth"
|
|
63
65
|
CONF_AUTO_CLEAR_ENABLED = "auto_clear_enabled"
|
64
66
|
CONF_AUTO_MODE = "auto_mode"
|
65
67
|
CONF_AUTOCONF = "autoconf"
|
68
|
+
CONF_AUTOMATIC_SELF_CALIBRATION = "automatic_self_calibration"
|
66
69
|
CONF_AUTOMATION_ID = "automation_id"
|
67
70
|
CONF_AVAILABILITY = "availability"
|
68
71
|
CONF_AWAY = "away"
|
@@ -157,6 +160,7 @@ CONF_CONDITION = "condition"
|
|
157
160
|
CONF_CONDITION_ID = "condition_id"
|
158
161
|
CONF_CONDUCTIVITY = "conductivity"
|
159
162
|
CONF_CONSTANT_BRIGHTNESS = "constant_brightness"
|
163
|
+
CONF_CONTINUOUS = "continuous"
|
160
164
|
CONF_CONTRAST = "contrast"
|
161
165
|
CONF_COOL_ACTION = "cool_action"
|
162
166
|
CONF_COOL_DEADBAND = "cool_deadband"
|
@@ -217,7 +221,9 @@ CONF_DIMENSIONS = "dimensions"
|
|
217
221
|
CONF_DIO_PIN = "dio_pin"
|
218
222
|
CONF_DIR_PIN = "dir_pin"
|
219
223
|
CONF_DIRECTION = "direction"
|
224
|
+
CONF_DIRECTION_COMMAND_TOPIC = "direction_command_topic"
|
220
225
|
CONF_DIRECTION_OUTPUT = "direction_output"
|
226
|
+
CONF_DIRECTION_STATE_TOPIC = "direction_state_topic"
|
221
227
|
CONF_DISABLE_CRC = "disable_crc"
|
222
228
|
CONF_DISABLED = "disabled"
|
223
229
|
CONF_DISABLED_BY_DEFAULT = "disabled_by_default"
|
@@ -330,6 +336,7 @@ CONF_FULL_SPECTRUM = "full_spectrum"
|
|
330
336
|
CONF_FULL_SPECTRUM_COUNTS = "full_spectrum_counts"
|
331
337
|
CONF_FULL_UPDATE_EVERY = "full_update_every"
|
332
338
|
CONF_GAIN = "gain"
|
339
|
+
CONF_GAIN_FACTOR = "gain_factor"
|
333
340
|
CONF_GAMMA_CORRECT = "gamma_correct"
|
334
341
|
CONF_GAS_RESISTANCE = "gas_resistance"
|
335
342
|
CONF_GATEWAY = "gateway"
|
@@ -401,6 +408,7 @@ CONF_INITIAL_OPTION = "initial_option"
|
|
401
408
|
CONF_INITIAL_STATE = "initial_state"
|
402
409
|
CONF_INITIAL_VALUE = "initial_value"
|
403
410
|
CONF_INPUT = "input"
|
411
|
+
CONF_INT_DATAPOINT = "int_datapoint"
|
404
412
|
CONF_INTEGRATION_TIME = "integration_time"
|
405
413
|
CONF_INTENSITY = "intensity"
|
406
414
|
CONF_INTERLOCK = "interlock"
|
@@ -477,6 +485,7 @@ CONF_MAX_VALUE = "max_value"
|
|
477
485
|
CONF_MAX_VOLTAGE = "max_voltage"
|
478
486
|
CONF_MDNS = "mdns"
|
479
487
|
CONF_MEASUREMENT_DURATION = "measurement_duration"
|
488
|
+
CONF_MEASUREMENT_MODE = "measurement_mode"
|
480
489
|
CONF_MEASUREMENT_SEQUENCE_NUMBER = "measurement_sequence_number"
|
481
490
|
CONF_MEDIA_PLAYER = "media_player"
|
482
491
|
CONF_MEDIUM = "medium"
|
@@ -795,6 +804,7 @@ CONF_SHUTDOWN_MESSAGE = "shutdown_message"
|
|
795
804
|
CONF_SIGNAL_STRENGTH = "signal_strength"
|
796
805
|
CONF_SINGLE_LIGHT_ID = "single_light_id"
|
797
806
|
CONF_SIZE = "size"
|
807
|
+
CONF_SKIP_CERT_CN_CHECK = "skip_cert_cn_check"
|
798
808
|
CONF_SLEEP_DURATION = "sleep_duration"
|
799
809
|
CONF_SLEEP_PIN = "sleep_pin"
|
800
810
|
CONF_SLEEP_WHEN_DONE = "sleep_when_done"
|
@@ -891,6 +901,8 @@ CONF_TIMES = "times"
|
|
891
901
|
CONF_TIMEZONE = "timezone"
|
892
902
|
CONF_TIMING = "timing"
|
893
903
|
CONF_TO = "to"
|
904
|
+
CONF_TO_NTC_RESISTANCE = "to_ntc_resistance"
|
905
|
+
CONF_TO_NTC_TEMPERATURE = "to_ntc_temperature"
|
894
906
|
CONF_TOLERANCE = "tolerance"
|
895
907
|
CONF_TOPIC = "topic"
|
896
908
|
CONF_TOPIC_PREFIX = "topic_prefix"
|
@@ -1080,6 +1092,7 @@ UNIT_KILOWATT = "kW"
|
|
1080
1092
|
UNIT_KILOWATT_HOURS = "kWh"
|
1081
1093
|
UNIT_LITRE = "L"
|
1082
1094
|
UNIT_LUX = "lx"
|
1095
|
+
UNIT_MEGAJOULE = "MJ"
|
1083
1096
|
UNIT_METER = "m"
|
1084
1097
|
UNIT_METER_PER_SECOND_SQUARED = "m/s²"
|
1085
1098
|
UNIT_MICROAMP = "µA"
|
@@ -1093,6 +1106,7 @@ UNIT_MILLIGRAMS_PER_CUBIC_METER = "mg/m³"
|
|
1093
1106
|
UNIT_MILLIMETER = "mm"
|
1094
1107
|
UNIT_MILLISECOND = "ms"
|
1095
1108
|
UNIT_MILLISIEMENS_PER_CENTIMETER = "mS/cm"
|
1109
|
+
UNIT_MILLIVOLT = "mV"
|
1096
1110
|
UNIT_MINUTE = "min"
|
1097
1111
|
UNIT_OHM = "Ω"
|
1098
1112
|
UNIT_PARTS_PER_BILLION = "ppb"
|
esphome/core/__init__.py
CHANGED
esphome/core/application.cpp
CHANGED
esphome/core/application.h
CHANGED
@@ -97,6 +97,9 @@ class Application {
|
|
97
97
|
this->compilation_time_ = compilation_time;
|
98
98
|
}
|
99
99
|
|
100
|
+
void set_current_component(Component *component) { this->current_component_ = component; }
|
101
|
+
Component *get_current_component() { return this->current_component_; }
|
102
|
+
|
100
103
|
#ifdef USE_BINARY_SENSOR
|
101
104
|
void register_binary_sensor(binary_sensor::BinarySensor *binary_sensor) {
|
102
105
|
this->binary_sensors_.push_back(binary_sensor);
|
@@ -547,6 +550,7 @@ class Application {
|
|
547
550
|
uint32_t loop_interval_{16};
|
548
551
|
size_t dump_config_at_{SIZE_MAX};
|
549
552
|
uint32_t app_state_{0};
|
553
|
+
Component *current_component_{nullptr};
|
550
554
|
};
|
551
555
|
|
552
556
|
/// Global storage of Application pointer - only one Application can exist.
|
esphome/core/automation.h
CHANGED
@@ -1,10 +1,11 @@
|
|
1
1
|
#pragma once
|
2
2
|
|
3
|
-
#include <vector>
|
4
3
|
#include "esphome/core/component.h"
|
5
|
-
#include "esphome/core/helpers.h"
|
6
4
|
#include "esphome/core/defines.h"
|
5
|
+
#include "esphome/core/helpers.h"
|
7
6
|
#include "esphome/core/preferences.h"
|
7
|
+
#include <utility>
|
8
|
+
#include <vector>
|
8
9
|
|
9
10
|
namespace esphome {
|
10
11
|
|
@@ -27,7 +28,7 @@ template<typename T, typename... X> class TemplatableValue {
|
|
27
28
|
TemplatableValue() : type_(NONE) {}
|
28
29
|
|
29
30
|
template<typename F, enable_if_t<!is_invocable<F, X...>::value, int> = 0>
|
30
|
-
TemplatableValue(F value) : type_(VALUE), value_(value) {}
|
31
|
+
TemplatableValue(F value) : type_(VALUE), value_(std::move(value)) {}
|
31
32
|
|
32
33
|
template<typename F, enable_if_t<is_invocable<F, X...>::value, int> = 0>
|
33
34
|
TemplatableValue(F f) : type_(LAMBDA), f_(f) {}
|
esphome/core/component.cpp
CHANGED
@@ -39,6 +39,9 @@ const uint32_t STATUS_LED_OK = 0x0000;
|
|
39
39
|
const uint32_t STATUS_LED_WARNING = 0x0100;
|
40
40
|
const uint32_t STATUS_LED_ERROR = 0x0200;
|
41
41
|
|
42
|
+
const uint32_t WARN_IF_BLOCKING_OVER_MS = 50U; ///< Initial blocking time allowed without warning
|
43
|
+
const uint32_t WARN_IF_BLOCKING_INCREMENT_MS = 10U; ///< How long the blocking time must be larger to warn again
|
44
|
+
|
42
45
|
uint32_t global_state = 0; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables)
|
43
46
|
|
44
47
|
float Component::get_loop_priority() const { return 0.0f; }
|
@@ -115,6 +118,13 @@ const char *Component::get_component_source() const {
|
|
115
118
|
return "<unknown>";
|
116
119
|
return this->component_source_;
|
117
120
|
}
|
121
|
+
bool Component::should_warn_of_blocking(uint32_t blocking_time) {
|
122
|
+
if (blocking_time > this->warn_if_blocking_over_) {
|
123
|
+
this->warn_if_blocking_over_ = blocking_time + WARN_IF_BLOCKING_INCREMENT_MS;
|
124
|
+
return true;
|
125
|
+
}
|
126
|
+
return false;
|
127
|
+
}
|
118
128
|
void Component::mark_failed() {
|
119
129
|
ESP_LOGE(TAG, "Component %s was marked as failed.", this->get_component_source());
|
120
130
|
this->component_state_ &= ~COMPONENT_STATE_MASK;
|
@@ -233,10 +243,16 @@ void PollingComponent::set_update_interval(uint32_t update_interval) { this->upd
|
|
233
243
|
WarnIfComponentBlockingGuard::WarnIfComponentBlockingGuard(Component *component)
|
234
244
|
: started_(millis()), component_(component) {}
|
235
245
|
WarnIfComponentBlockingGuard::~WarnIfComponentBlockingGuard() {
|
236
|
-
uint32_t
|
237
|
-
|
246
|
+
uint32_t blocking_time = millis() - this->started_;
|
247
|
+
bool should_warn;
|
248
|
+
if (this->component_ != nullptr) {
|
249
|
+
should_warn = this->component_->should_warn_of_blocking(blocking_time);
|
250
|
+
} else {
|
251
|
+
should_warn = blocking_time > WARN_IF_BLOCKING_OVER_MS;
|
252
|
+
}
|
253
|
+
if (should_warn) {
|
238
254
|
const char *src = component_ == nullptr ? "<null>" : component_->get_component_source();
|
239
|
-
ESP_LOGW(TAG, "Component %s took a long time for an operation (%" PRIu32 " ms).", src,
|
255
|
+
ESP_LOGW(TAG, "Component %s took a long time for an operation (%" PRIu32 " ms).", src, blocking_time);
|
240
256
|
ESP_LOGW(TAG, "Components should block for at most 30 ms.");
|
241
257
|
;
|
242
258
|
}
|
esphome/core/component.h
CHANGED
@@ -65,6 +65,8 @@ extern const uint32_t STATUS_LED_ERROR;
|
|
65
65
|
|
66
66
|
enum class RetryResult { DONE, RETRY };
|
67
67
|
|
68
|
+
extern const uint32_t WARN_IF_BLOCKING_OVER_MS;
|
69
|
+
|
68
70
|
class Component {
|
69
71
|
public:
|
70
72
|
/** Where the component's initialization should happen.
|
@@ -158,6 +160,8 @@ class Component {
|
|
158
160
|
*/
|
159
161
|
const char *get_component_source() const;
|
160
162
|
|
163
|
+
bool should_warn_of_blocking(uint32_t blocking_time);
|
164
|
+
|
161
165
|
protected:
|
162
166
|
friend class Application;
|
163
167
|
|
@@ -284,6 +288,7 @@ class Component {
|
|
284
288
|
uint32_t component_state_{0x0000}; ///< State of this component.
|
285
289
|
float setup_priority_override_{NAN};
|
286
290
|
const char *component_source_{nullptr};
|
291
|
+
uint32_t warn_if_blocking_over_{WARN_IF_BLOCKING_OVER_MS};
|
287
292
|
std::string error_message_{};
|
288
293
|
};
|
289
294
|
|
esphome/core/defines.h
CHANGED
@@ -20,11 +20,6 @@
|
|
20
20
|
|
21
21
|
// Feature flags
|
22
22
|
#define USE_ALARM_CONTROL_PANEL
|
23
|
-
#define USE_AUDIO_FLAC_SUPPORT
|
24
|
-
#define USE_AUDIO_MP3_SUPPORT
|
25
|
-
#define USE_API
|
26
|
-
#define USE_API_NOISE
|
27
|
-
#define USE_API_PLAINTEXT
|
28
23
|
#define USE_BINARY_SENSOR
|
29
24
|
#define USE_BUTTON
|
30
25
|
#define USE_CLIMATE
|
@@ -79,20 +74,10 @@
|
|
79
74
|
#define USE_LVGL_TEXTAREA
|
80
75
|
#define USE_LVGL_TILEVIEW
|
81
76
|
#define USE_LVGL_TOUCHSCREEN
|
82
|
-
#define USE_MD5
|
83
77
|
#define USE_MDNS
|
84
78
|
#define USE_MEDIA_PLAYER
|
85
|
-
#define USE_MQTT
|
86
|
-
#define USE_NETWORK
|
87
79
|
#define USE_NEXTION_TFT_UPLOAD
|
88
80
|
#define USE_NUMBER
|
89
|
-
#define USE_ONLINE_IMAGE_BMP_SUPPORT
|
90
|
-
#define USE_ONLINE_IMAGE_PNG_SUPPORT
|
91
|
-
#define USE_ONLINE_IMAGE_JPEG_SUPPORT
|
92
|
-
#define USE_OTA
|
93
|
-
#define USE_OTA_PASSWORD
|
94
|
-
#define USE_OTA_STATE_CALLBACK
|
95
|
-
#define USE_OTA_VERSION 2
|
96
81
|
#define USE_OUTPUT
|
97
82
|
#define USE_POWER_SUPPLY
|
98
83
|
#define USE_QR_CODE
|
@@ -107,14 +92,34 @@
|
|
107
92
|
#define USE_UART_DEBUGGER
|
108
93
|
#define USE_UPDATE
|
109
94
|
#define USE_VALVE
|
95
|
+
|
96
|
+
// Feature flags which do not work for zephyr
|
97
|
+
#ifndef USE_ZEPHYR
|
98
|
+
#define USE_AUDIO_FLAC_SUPPORT
|
99
|
+
#define USE_AUDIO_MP3_SUPPORT
|
100
|
+
#define USE_API
|
101
|
+
#define USE_API_NOISE
|
102
|
+
#define USE_API_PLAINTEXT
|
103
|
+
#define USE_MD5
|
104
|
+
#define USE_MQTT
|
105
|
+
#define USE_NETWORK
|
106
|
+
#define USE_ONLINE_IMAGE_BMP_SUPPORT
|
107
|
+
#define USE_ONLINE_IMAGE_PNG_SUPPORT
|
108
|
+
#define USE_ONLINE_IMAGE_JPEG_SUPPORT
|
109
|
+
#define USE_OTA
|
110
|
+
#define USE_OTA_PASSWORD
|
111
|
+
#define USE_OTA_STATE_CALLBACK
|
112
|
+
#define USE_OTA_VERSION 2
|
110
113
|
#define USE_WIFI
|
111
114
|
#define USE_WIFI_AP
|
112
115
|
#define USE_WIREGUARD
|
116
|
+
#endif
|
113
117
|
|
114
118
|
// Arduino-specific feature flags
|
115
119
|
#ifdef USE_ARDUINO
|
116
120
|
#define USE_PROMETHEUS
|
117
121
|
#define USE_WIFI_WPA2_EAP
|
122
|
+
#define USE_I2S_LEGACY
|
118
123
|
#endif
|
119
124
|
|
120
125
|
// IDF-specific feature flags
|
@@ -131,7 +136,6 @@
|
|
131
136
|
#define USE_ESP32_BLE_SERVER
|
132
137
|
#define USE_ESP32_CAMERA
|
133
138
|
#define USE_IMPROV
|
134
|
-
#define USE_MICRO_WAKE_WORD_VAD
|
135
139
|
#define USE_MICROPHONE
|
136
140
|
#define USE_PSRAM
|
137
141
|
#define USE_SOCKET_IMPL_BSD_SOCKETS
|
@@ -148,7 +152,9 @@
|
|
148
152
|
#endif
|
149
153
|
|
150
154
|
#ifdef USE_ESP_IDF
|
151
|
-
#define USE_ESP_IDF_VERSION_CODE VERSION_CODE(5, 1,
|
155
|
+
#define USE_ESP_IDF_VERSION_CODE VERSION_CODE(5, 1, 6)
|
156
|
+
#define USE_MICRO_WAKE_WORD
|
157
|
+
#define USE_MICRO_WAKE_WORD_VAD
|
152
158
|
#endif
|
153
159
|
|
154
160
|
#if defined(USE_ESP32_VARIANT_ESP32S2)
|
esphome/core/macros.h
CHANGED
esphome/core/scheduler.cpp
CHANGED
@@ -1,4 +1,6 @@
|
|
1
1
|
#include "scheduler.h"
|
2
|
+
|
3
|
+
#include "application.h"
|
2
4
|
#include "esphome/core/defines.h"
|
3
5
|
#include "esphome/core/log.h"
|
4
6
|
#include "esphome/core/helpers.h"
|
@@ -215,6 +217,7 @@ void HOT Scheduler::call() {
|
|
215
217
|
this->pop_raw_();
|
216
218
|
continue;
|
217
219
|
}
|
220
|
+
App.set_current_component(item->component);
|
218
221
|
|
219
222
|
#ifdef ESPHOME_DEBUG_SCHEDULER
|
220
223
|
ESP_LOGV(TAG, "Running %s '%s/%s' with interval=%" PRIu32 " next_execution=%" PRIu64 " (now=%" PRIu64 ")",
|
esphome/cpp_generator.py
CHANGED
@@ -789,13 +789,17 @@ class MockObj(Expression):
|
|
789
789
|
|
790
790
|
def class_(self, name: str, *parents: "MockObjClass") -> "MockObjClass":
|
791
791
|
op = "" if self.op == "" else "::"
|
792
|
-
|
792
|
+
result = MockObjClass(f"{self.base}{op}{name}", ".", parents=parents)
|
793
|
+
CORE.id_classes[str(result)] = result
|
794
|
+
return result
|
793
795
|
|
794
796
|
def struct(self, name: str) -> "MockObjClass":
|
795
797
|
return self.class_(name)
|
796
798
|
|
797
799
|
def enum(self, name: str, is_class: bool = False) -> "MockObj":
|
798
|
-
|
800
|
+
result = MockObjEnum(enum=name, is_class=is_class, base=self.base, op=self.op)
|
801
|
+
CORE.id_classes[str(result)] = result
|
802
|
+
return result
|
799
803
|
|
800
804
|
def operator(self, name: str) -> "MockObj":
|
801
805
|
"""Various other operations.
|
esphome/dashboard/web_server.py
CHANGED
@@ -38,7 +38,7 @@ import yaml
|
|
38
38
|
from yaml.nodes import Node
|
39
39
|
|
40
40
|
from esphome import const, platformio_api, yaml_util
|
41
|
-
from esphome.helpers import get_bool_env, mkdir_p
|
41
|
+
from esphome.helpers import get_bool_env, mkdir_p, sort_ip_addresses
|
42
42
|
from esphome.storage_json import (
|
43
43
|
StorageJSON,
|
44
44
|
archive_storage_path,
|
@@ -336,7 +336,7 @@ class EsphomePortCommandWebSocket(EsphomeCommandWebSocket):
|
|
336
336
|
# Use the IP address if available but only
|
337
337
|
# if the API is loaded and the device is online
|
338
338
|
# since MQTT logging will not work otherwise
|
339
|
-
port = address_list[0]
|
339
|
+
port = sort_ip_addresses(address_list)[0]
|
340
340
|
elif (
|
341
341
|
entry.address
|
342
342
|
and (
|
@@ -347,7 +347,7 @@ class EsphomePortCommandWebSocket(EsphomeCommandWebSocket):
|
|
347
347
|
and not isinstance(address_list, Exception)
|
348
348
|
):
|
349
349
|
# If mdns is not available, try to use the DNS cache
|
350
|
-
port = address_list[0]
|
350
|
+
port = sort_ip_addresses(address_list)[0]
|
351
351
|
|
352
352
|
return [
|
353
353
|
*DASHBOARD_COMMAND,
|
esphome/helpers.py
CHANGED
@@ -200,6 +200,45 @@ def resolve_ip_address(host, port):
|
|
200
200
|
return res
|
201
201
|
|
202
202
|
|
203
|
+
def sort_ip_addresses(address_list: list[str]) -> list[str]:
|
204
|
+
"""Takes a list of IP addresses in string form, e.g. from mDNS or MQTT,
|
205
|
+
and sorts them into the best order to actually try connecting to them.
|
206
|
+
|
207
|
+
This is roughly based on RFC6724 but a lot simpler: First we choose
|
208
|
+
IPv6 addresses, then Legacy IP addresses, and lowest priority is
|
209
|
+
link-local IPv6 addresses that don't have a link specified (which
|
210
|
+
are useless, but mDNS does provide them in that form). Addresses
|
211
|
+
which cannot be parsed are silently dropped.
|
212
|
+
"""
|
213
|
+
import socket
|
214
|
+
|
215
|
+
# First "resolve" all the IP addresses to getaddrinfo() tuples of the form
|
216
|
+
# (family, type, proto, canonname, sockaddr)
|
217
|
+
res: list[
|
218
|
+
tuple[
|
219
|
+
int,
|
220
|
+
int,
|
221
|
+
int,
|
222
|
+
Union[str, None],
|
223
|
+
Union[tuple[str, int], tuple[str, int, int, int]],
|
224
|
+
]
|
225
|
+
] = []
|
226
|
+
for addr in address_list:
|
227
|
+
# This should always work as these are supposed to be IP addresses
|
228
|
+
try:
|
229
|
+
res += socket.getaddrinfo(
|
230
|
+
addr, 0, proto=socket.IPPROTO_TCP, flags=socket.AI_NUMERICHOST
|
231
|
+
)
|
232
|
+
except OSError:
|
233
|
+
_LOGGER.info("Failed to parse IP address '%s'", addr)
|
234
|
+
|
235
|
+
# Now use that information to sort them.
|
236
|
+
res.sort(key=addr_preference_)
|
237
|
+
|
238
|
+
# Finally, turn the getaddrinfo() tuples back into plain hostnames.
|
239
|
+
return [socket.getnameinfo(r[4], socket.NI_NUMERICHOST)[0] for r in res]
|
240
|
+
|
241
|
+
|
203
242
|
def get_bool_env(var, default=False):
|
204
243
|
value = os.getenv(var, default)
|
205
244
|
if isinstance(value, str):
|
esphome/loader.py
CHANGED
@@ -91,6 +91,10 @@ class ComponentManifest:
|
|
91
91
|
def codeowners(self) -> list[str]:
|
92
92
|
return getattr(self.module, "CODEOWNERS", [])
|
93
93
|
|
94
|
+
@property
|
95
|
+
def instance_type(self) -> list[str]:
|
96
|
+
return getattr(self.module, "INSTANCE_TYPE", None)
|
97
|
+
|
94
98
|
@property
|
95
99
|
def final_validate_schema(self) -> Optional[Callable[[ConfigType], None]]:
|
96
100
|
"""Components can declare a `FINAL_VALIDATE_SCHEMA` cv.Schema that gets called
|