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,6 +2,8 @@ from esphome import automation
|
|
2
2
|
import esphome.codegen as cg
|
3
3
|
import esphome.config_validation as cv
|
4
4
|
from esphome.const import (
|
5
|
+
CONF_ENTITY_CATEGORY,
|
6
|
+
CONF_ICON,
|
5
7
|
CONF_ID,
|
6
8
|
CONF_ON_IDLE,
|
7
9
|
CONF_ON_STATE,
|
@@ -10,6 +12,7 @@ from esphome.const import (
|
|
10
12
|
)
|
11
13
|
from esphome.core import CORE
|
12
14
|
from esphome.coroutine import coroutine_with_priority
|
15
|
+
from esphome.cpp_generator import MockObjClass
|
13
16
|
from esphome.cpp_helpers import setup_entity
|
14
17
|
|
15
18
|
CODEOWNERS = ["@jesserockz"]
|
@@ -103,7 +106,13 @@ async def register_media_player(var, config):
|
|
103
106
|
await setup_media_player_core_(var, config)
|
104
107
|
|
105
108
|
|
106
|
-
|
109
|
+
async def new_media_player(config, *args):
|
110
|
+
var = cg.new_Pvariable(config[CONF_ID], *args)
|
111
|
+
await register_media_player(var, config)
|
112
|
+
return var
|
113
|
+
|
114
|
+
|
115
|
+
_MEDIA_PLAYER_SCHEMA = cv.ENTITY_BASE_SCHEMA.extend(
|
107
116
|
{
|
108
117
|
cv.Optional(CONF_ON_STATE): automation.validate_automation(
|
109
118
|
{
|
@@ -134,11 +143,36 @@ MEDIA_PLAYER_SCHEMA = cv.ENTITY_BASE_SCHEMA.extend(
|
|
134
143
|
)
|
135
144
|
|
136
145
|
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
146
|
+
def media_player_schema(
|
147
|
+
class_: MockObjClass,
|
148
|
+
*,
|
149
|
+
entity_category: str = cv.UNDEFINED,
|
150
|
+
icon: str = cv.UNDEFINED,
|
151
|
+
) -> cv.Schema:
|
152
|
+
schema = {cv.GenerateID(CONF_ID): cv.declare_id(class_)}
|
153
|
+
|
154
|
+
for key, default, validator in [
|
155
|
+
(CONF_ENTITY_CATEGORY, entity_category, cv.entity_category),
|
156
|
+
(CONF_ICON, icon, cv.icon),
|
157
|
+
]:
|
158
|
+
if default is not cv.UNDEFINED:
|
159
|
+
schema[cv.Optional(key, default=default)] = validator
|
160
|
+
|
161
|
+
return _MEDIA_PLAYER_SCHEMA.extend(schema)
|
162
|
+
|
163
|
+
|
164
|
+
# Remove before 2025.11.0
|
165
|
+
MEDIA_PLAYER_SCHEMA = media_player_schema(MediaPlayer)
|
166
|
+
MEDIA_PLAYER_SCHEMA.add_extra(cv.deprecated_schema_constant("media_player"))
|
167
|
+
|
168
|
+
|
169
|
+
MEDIA_PLAYER_ACTION_SCHEMA = automation.maybe_simple_id(
|
170
|
+
cv.Schema(
|
171
|
+
{
|
172
|
+
cv.GenerateID(): cv.use_id(MediaPlayer),
|
173
|
+
cv.Optional(CONF_ANNOUNCEMENT, default=False): cv.templatable(cv.boolean),
|
174
|
+
}
|
175
|
+
)
|
142
176
|
)
|
143
177
|
|
144
178
|
MEDIA_PLAYER_CONDITION_SCHEMA = automation.maybe_simple_id(
|
@@ -12,6 +12,7 @@ import esphome.config_validation as cv
|
|
12
12
|
from esphome.const import (
|
13
13
|
CONF_FILE,
|
14
14
|
CONF_ID,
|
15
|
+
CONF_INTERNAL,
|
15
16
|
CONF_MICROPHONE,
|
16
17
|
CONF_MODEL,
|
17
18
|
CONF_PASSWORD,
|
@@ -40,6 +41,7 @@ CONF_ON_WAKE_WORD_DETECTED = "on_wake_word_detected"
|
|
40
41
|
CONF_PROBABILITY_CUTOFF = "probability_cutoff"
|
41
42
|
CONF_SLIDING_WINDOW_AVERAGE_SIZE = "sliding_window_average_size"
|
42
43
|
CONF_SLIDING_WINDOW_SIZE = "sliding_window_size"
|
44
|
+
CONF_STOP_AFTER_DETECTION = "stop_after_detection"
|
43
45
|
CONF_TENSOR_ARENA_SIZE = "tensor_arena_size"
|
44
46
|
CONF_VAD = "vad"
|
45
47
|
|
@@ -49,13 +51,20 @@ micro_wake_word_ns = cg.esphome_ns.namespace("micro_wake_word")
|
|
49
51
|
|
50
52
|
MicroWakeWord = micro_wake_word_ns.class_("MicroWakeWord", cg.Component)
|
51
53
|
|
54
|
+
DisableModelAction = micro_wake_word_ns.class_("DisableModelAction", automation.Action)
|
55
|
+
EnableModelAction = micro_wake_word_ns.class_("EnableModelAction", automation.Action)
|
52
56
|
StartAction = micro_wake_word_ns.class_("StartAction", automation.Action)
|
53
57
|
StopAction = micro_wake_word_ns.class_("StopAction", automation.Action)
|
54
58
|
|
59
|
+
ModelIsEnabledCondition = micro_wake_word_ns.class_(
|
60
|
+
"ModelIsEnabledCondition", automation.Condition
|
61
|
+
)
|
55
62
|
IsRunningCondition = micro_wake_word_ns.class_(
|
56
63
|
"IsRunningCondition", automation.Condition
|
57
64
|
)
|
58
65
|
|
66
|
+
WakeWordModel = micro_wake_word_ns.class_("WakeWordModel")
|
67
|
+
|
59
68
|
|
60
69
|
def _validate_json_filename(value):
|
61
70
|
value = cv.string(value)
|
@@ -169,9 +178,10 @@ def _convert_manifest_v1_to_v2(v1_manifest):
|
|
169
178
|
|
170
179
|
# Original Inception-based V1 manifest models require a minimum of 45672 bytes
|
171
180
|
v2_manifest[KEY_MICRO][CONF_TENSOR_ARENA_SIZE] = 45672
|
172
|
-
|
173
181
|
# Original Inception-based V1 manifest models use a 20 ms feature step size
|
174
182
|
v2_manifest[KEY_MICRO][CONF_FEATURE_STEP_SIZE] = 20
|
183
|
+
# Original Inception-based V1 manifest models were trained only on TTS English samples
|
184
|
+
v2_manifest[KEY_TRAINED_LANGUAGES] = ["en"]
|
175
185
|
|
176
186
|
return v2_manifest
|
177
187
|
|
@@ -296,14 +306,16 @@ MODEL_SOURCE_SCHEMA = cv.Any(
|
|
296
306
|
|
297
307
|
MODEL_SCHEMA = cv.Schema(
|
298
308
|
{
|
309
|
+
cv.GenerateID(CONF_ID): cv.declare_id(WakeWordModel),
|
299
310
|
cv.Optional(CONF_MODEL): MODEL_SOURCE_SCHEMA,
|
300
311
|
cv.Optional(CONF_PROBABILITY_CUTOFF): cv.percentage,
|
301
312
|
cv.Optional(CONF_SLIDING_WINDOW_SIZE): cv.positive_int,
|
313
|
+
cv.Optional(CONF_INTERNAL, default=False): cv.boolean,
|
302
314
|
cv.GenerateID(CONF_RAW_DATA_ID): cv.declare_id(cg.uint8),
|
303
315
|
}
|
304
316
|
)
|
305
317
|
|
306
|
-
#
|
318
|
+
# Provides a default VAD model that could be overridden
|
307
319
|
VAD_MODEL_SCHEMA = MODEL_SCHEMA.extend(
|
308
320
|
cv.Schema(
|
309
321
|
{
|
@@ -328,7 +340,14 @@ CONFIG_SCHEMA = cv.All(
|
|
328
340
|
cv.Schema(
|
329
341
|
{
|
330
342
|
cv.GenerateID(): cv.declare_id(MicroWakeWord),
|
331
|
-
cv.
|
343
|
+
cv.Optional(
|
344
|
+
CONF_MICROPHONE, default={}
|
345
|
+
): microphone.microphone_source_schema(
|
346
|
+
min_bits_per_sample=16,
|
347
|
+
max_bits_per_sample=16,
|
348
|
+
min_channels=1,
|
349
|
+
max_channels=1,
|
350
|
+
),
|
332
351
|
cv.Required(CONF_MODELS): cv.ensure_list(
|
333
352
|
cv.maybe_simple_value(MODEL_SCHEMA, key=CONF_MODEL)
|
334
353
|
),
|
@@ -336,6 +355,7 @@ CONFIG_SCHEMA = cv.All(
|
|
336
355
|
single=True
|
337
356
|
),
|
338
357
|
cv.Optional(CONF_VAD): _maybe_empty_vad_schema,
|
358
|
+
cv.Optional(CONF_STOP_AFTER_DETECTION, default=True): cv.boolean,
|
339
359
|
cv.Optional(CONF_MODEL): cv.invalid(
|
340
360
|
f"The {CONF_MODEL} parameter has moved to be a list element under the {CONF_MODELS} parameter."
|
341
361
|
),
|
@@ -404,39 +424,42 @@ def _feature_step_size_validate(config):
|
|
404
424
|
raise cv.Invalid("Cannot load models with different features step sizes.")
|
405
425
|
|
406
426
|
|
407
|
-
FINAL_VALIDATE_SCHEMA =
|
427
|
+
FINAL_VALIDATE_SCHEMA = cv.All(
|
428
|
+
cv.Schema(
|
429
|
+
{
|
430
|
+
cv.Required(
|
431
|
+
CONF_MICROPHONE
|
432
|
+
): microphone.final_validate_microphone_source_schema(
|
433
|
+
"micro_wake_word", sample_rate=16000
|
434
|
+
),
|
435
|
+
},
|
436
|
+
extra=cv.ALLOW_EXTRA,
|
437
|
+
),
|
438
|
+
_feature_step_size_validate,
|
439
|
+
)
|
408
440
|
|
409
441
|
|
410
442
|
async def to_code(config):
|
411
443
|
var = cg.new_Pvariable(config[CONF_ID])
|
412
444
|
await cg.register_component(var, config)
|
413
445
|
|
414
|
-
|
415
|
-
cg.add(var.
|
446
|
+
mic_source = await microphone.microphone_source_to_code(config[CONF_MICROPHONE])
|
447
|
+
cg.add(var.set_microphone_source(mic_source))
|
448
|
+
|
449
|
+
cg.add_define("USE_MICRO_WAKE_WORD")
|
450
|
+
cg.add_define("USE_OTA_STATE_CALLBACK")
|
416
451
|
|
417
452
|
esp32.add_idf_component(
|
418
453
|
name="esp-tflite-micro",
|
419
454
|
repo="https://github.com/espressif/esp-tflite-micro",
|
420
|
-
ref="v1.3.1",
|
421
|
-
)
|
422
|
-
# add esp-nn dependency for tflite-micro to work around https://github.com/espressif/esp-nn/issues/17
|
423
|
-
# ...remove after switching to IDF 5.1.4+
|
424
|
-
esp32.add_idf_component(
|
425
|
-
name="esp-nn",
|
426
|
-
repo="https://github.com/espressif/esp-nn",
|
427
|
-
ref="v1.1.0",
|
455
|
+
ref="v1.3.3.1",
|
428
456
|
)
|
429
457
|
|
430
458
|
cg.add_build_flag("-DTF_LITE_STATIC_MEMORY")
|
431
459
|
cg.add_build_flag("-DTF_LITE_DISABLE_X86_NEON")
|
432
460
|
cg.add_build_flag("-DESP_NN")
|
433
461
|
|
434
|
-
|
435
|
-
await automation.build_automation(
|
436
|
-
var.get_wake_word_detected_trigger(),
|
437
|
-
[(cg.std_string, "wake_word")],
|
438
|
-
on_wake_word_detection_config,
|
439
|
-
)
|
462
|
+
cg.add_library("kahrendt/ESPMicroSpeechFeatures", "1.1.0")
|
440
463
|
|
441
464
|
if vad_model := config.get(CONF_VAD):
|
442
465
|
cg.add_define("USE_MICRO_WAKE_WORD_VAD")
|
@@ -444,7 +467,7 @@ async def to_code(config):
|
|
444
467
|
# Use the general model loading code for the VAD codegen
|
445
468
|
config[CONF_MODELS].append(vad_model)
|
446
469
|
|
447
|
-
for model_parameters in config[CONF_MODELS]:
|
470
|
+
for i, model_parameters in enumerate(config[CONF_MODELS]):
|
448
471
|
model_config = model_parameters.get(CONF_MODEL)
|
449
472
|
data = []
|
450
473
|
manifest, data = _model_config_to_manifest_data(model_config)
|
@@ -455,6 +478,8 @@ async def to_code(config):
|
|
455
478
|
probability_cutoff = model_parameters.get(
|
456
479
|
CONF_PROBABILITY_CUTOFF, manifest[KEY_MICRO][CONF_PROBABILITY_CUTOFF]
|
457
480
|
)
|
481
|
+
quantized_probability_cutoff = int(probability_cutoff * 255)
|
482
|
+
|
458
483
|
sliding_window_size = model_parameters.get(
|
459
484
|
CONF_SLIDING_WINDOW_SIZE,
|
460
485
|
manifest[KEY_MICRO][CONF_SLIDING_WINDOW_SIZE],
|
@@ -464,24 +489,40 @@ async def to_code(config):
|
|
464
489
|
cg.add(
|
465
490
|
var.add_vad_model(
|
466
491
|
prog_arr,
|
467
|
-
|
492
|
+
quantized_probability_cutoff,
|
468
493
|
sliding_window_size,
|
469
494
|
manifest[KEY_MICRO][CONF_TENSOR_ARENA_SIZE],
|
470
495
|
)
|
471
496
|
)
|
472
497
|
else:
|
473
|
-
|
474
|
-
|
475
|
-
|
476
|
-
|
477
|
-
|
478
|
-
|
479
|
-
|
480
|
-
|
498
|
+
# Only enable the first wake word by default. After first boot, the enable state is saved/loaded to the flash
|
499
|
+
default_enabled = i == 0
|
500
|
+
wake_word_model = cg.new_Pvariable(
|
501
|
+
model_parameters[CONF_ID],
|
502
|
+
str(model_parameters[CONF_ID]),
|
503
|
+
prog_arr,
|
504
|
+
quantized_probability_cutoff,
|
505
|
+
sliding_window_size,
|
506
|
+
manifest[KEY_WAKE_WORD],
|
507
|
+
manifest[KEY_MICRO][CONF_TENSOR_ARENA_SIZE],
|
508
|
+
default_enabled,
|
509
|
+
model_parameters[CONF_INTERNAL],
|
481
510
|
)
|
482
511
|
|
512
|
+
for lang in manifest[KEY_TRAINED_LANGUAGES]:
|
513
|
+
cg.add(wake_word_model.add_trained_language(lang))
|
514
|
+
|
515
|
+
cg.add(var.add_wake_word_model(wake_word_model))
|
516
|
+
|
483
517
|
cg.add(var.set_features_step_size(manifest[KEY_MICRO][CONF_FEATURE_STEP_SIZE]))
|
484
|
-
cg.
|
518
|
+
cg.add(var.set_stop_after_detection(config[CONF_STOP_AFTER_DETECTION]))
|
519
|
+
|
520
|
+
if on_wake_word_detection_config := config.get(CONF_ON_WAKE_WORD_DETECTED):
|
521
|
+
await automation.build_automation(
|
522
|
+
var.get_wake_word_detected_trigger(),
|
523
|
+
[(cg.std_string, "wake_word")],
|
524
|
+
on_wake_word_detection_config,
|
525
|
+
)
|
485
526
|
|
486
527
|
|
487
528
|
MICRO_WAKE_WORD_ACTION_SCHEMA = cv.Schema({cv.GenerateID(): cv.use_id(MicroWakeWord)})
|
@@ -496,3 +537,30 @@ async def micro_wake_word_action_to_code(config, action_id, template_arg, args):
|
|
496
537
|
var = cg.new_Pvariable(action_id, template_arg)
|
497
538
|
await cg.register_parented(var, config[CONF_ID])
|
498
539
|
return var
|
540
|
+
|
541
|
+
|
542
|
+
MICRO_WAKE_WORLD_MODEL_ACTION_SCHEMA = automation.maybe_simple_id(
|
543
|
+
{
|
544
|
+
cv.Required(CONF_ID): cv.use_id(WakeWordModel),
|
545
|
+
}
|
546
|
+
)
|
547
|
+
|
548
|
+
|
549
|
+
@register_action(
|
550
|
+
"micro_wake_word.enable_model",
|
551
|
+
EnableModelAction,
|
552
|
+
MICRO_WAKE_WORLD_MODEL_ACTION_SCHEMA,
|
553
|
+
)
|
554
|
+
@register_action(
|
555
|
+
"micro_wake_word.disable_model",
|
556
|
+
DisableModelAction,
|
557
|
+
MICRO_WAKE_WORLD_MODEL_ACTION_SCHEMA,
|
558
|
+
)
|
559
|
+
@register_condition(
|
560
|
+
"micro_wake_word.model_is_enabled",
|
561
|
+
ModelIsEnabledCondition,
|
562
|
+
MICRO_WAKE_WORLD_MODEL_ACTION_SCHEMA,
|
563
|
+
)
|
564
|
+
async def model_action(config, action_id, template_arg, args):
|
565
|
+
parent = await cg.get_variable(config[CONF_ID])
|
566
|
+
return cg.new_Pvariable(action_id, template_arg, parent)
|
@@ -0,0 +1,54 @@
|
|
1
|
+
#pragma once
|
2
|
+
|
3
|
+
#include "micro_wake_word.h"
|
4
|
+
#include "streaming_model.h"
|
5
|
+
|
6
|
+
#ifdef USE_ESP_IDF
|
7
|
+
namespace esphome {
|
8
|
+
namespace micro_wake_word {
|
9
|
+
|
10
|
+
template<typename... Ts> class StartAction : public Action<Ts...>, public Parented<MicroWakeWord> {
|
11
|
+
public:
|
12
|
+
void play(Ts... x) override { this->parent_->start(); }
|
13
|
+
};
|
14
|
+
|
15
|
+
template<typename... Ts> class StopAction : public Action<Ts...>, public Parented<MicroWakeWord> {
|
16
|
+
public:
|
17
|
+
void play(Ts... x) override { this->parent_->stop(); }
|
18
|
+
};
|
19
|
+
|
20
|
+
template<typename... Ts> class IsRunningCondition : public Condition<Ts...>, public Parented<MicroWakeWord> {
|
21
|
+
public:
|
22
|
+
bool check(Ts... x) override { return this->parent_->is_running(); }
|
23
|
+
};
|
24
|
+
|
25
|
+
template<typename... Ts> class EnableModelAction : public Action<Ts...> {
|
26
|
+
public:
|
27
|
+
explicit EnableModelAction(WakeWordModel *wake_word_model) : wake_word_model_(wake_word_model) {}
|
28
|
+
void play(Ts... x) override { this->wake_word_model_->enable(); }
|
29
|
+
|
30
|
+
protected:
|
31
|
+
WakeWordModel *wake_word_model_;
|
32
|
+
};
|
33
|
+
|
34
|
+
template<typename... Ts> class DisableModelAction : public Action<Ts...> {
|
35
|
+
public:
|
36
|
+
explicit DisableModelAction(WakeWordModel *wake_word_model) : wake_word_model_(wake_word_model) {}
|
37
|
+
void play(Ts... x) override { this->wake_word_model_->disable(); }
|
38
|
+
|
39
|
+
protected:
|
40
|
+
WakeWordModel *wake_word_model_;
|
41
|
+
};
|
42
|
+
|
43
|
+
template<typename... Ts> class ModelIsEnabledCondition : public Condition<Ts...> {
|
44
|
+
public:
|
45
|
+
explicit ModelIsEnabledCondition(WakeWordModel *wake_word_model) : wake_word_model_(wake_word_model) {}
|
46
|
+
bool check(Ts... x) override { return this->wake_word_model_->is_enabled(); }
|
47
|
+
|
48
|
+
protected:
|
49
|
+
WakeWordModel *wake_word_model_;
|
50
|
+
};
|
51
|
+
|
52
|
+
} // namespace micro_wake_word
|
53
|
+
} // namespace esphome
|
54
|
+
#endif
|