esphome 2025.4.2__py3-none-any.whl → 2025.5.0b3__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 +81 -13
- esphome/components/api/api_connection.h +13 -1
- 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/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/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 +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/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 -0
- 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/esp32_camera.cpp +2 -1
- 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/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/lvgl_esphome.cpp +5 -1
- esphome/components/lvgl/text/__init__.py +1 -2
- 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 +33 -1
- 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/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/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 +23 -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/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.2.dist-info → esphome-2025.5.0b3.dist-info}/METADATA +10 -11
- {esphome-2025.4.2.dist-info → esphome-2025.5.0b3.dist-info}/RECORD +440 -380
- {esphome-2025.4.2.dist-info → esphome-2025.5.0b3.dist-info}/WHEEL +1 -1
- {esphome-2025.4.2.dist-info → esphome-2025.5.0b3.dist-info}/entry_points.txt +0 -0
- {esphome-2025.4.2.dist-info → esphome-2025.5.0b3.dist-info}/licenses/LICENSE +0 -0
- {esphome-2025.4.2.dist-info → esphome-2025.5.0b3.dist-info}/top_level.txt +0 -0
@@ -154,6 +154,21 @@ enum class ClientState {
|
|
154
154
|
ESTABLISHED,
|
155
155
|
};
|
156
156
|
|
157
|
+
enum class ScannerState {
|
158
|
+
// Scanner is idle, init state, set from the main loop when processing STOPPED
|
159
|
+
IDLE,
|
160
|
+
// Scanner is starting, set from the main loop only
|
161
|
+
STARTING,
|
162
|
+
// Scanner is running, set from the ESP callback only
|
163
|
+
RUNNING,
|
164
|
+
// Scanner failed to start, set from the ESP callback only
|
165
|
+
FAILED,
|
166
|
+
// Scanner is stopping, set from the main loop only
|
167
|
+
STOPPING,
|
168
|
+
// Scanner is stopped, set from the ESP callback only
|
169
|
+
STOPPED,
|
170
|
+
};
|
171
|
+
|
157
172
|
enum class ConnectionType {
|
158
173
|
// The default connection type, we hold all the services in ram
|
159
174
|
// for the duration of the connection.
|
@@ -203,6 +218,7 @@ class ESP32BLETracker : public Component,
|
|
203
218
|
void set_scan_interval(uint32_t scan_interval) { scan_interval_ = scan_interval; }
|
204
219
|
void set_scan_window(uint32_t scan_window) { scan_window_ = scan_window; }
|
205
220
|
void set_scan_active(bool scan_active) { scan_active_ = scan_active; }
|
221
|
+
bool get_scan_active() const { return scan_active_; }
|
206
222
|
void set_scan_continuous(bool scan_continuous) { scan_continuous_ = scan_continuous; }
|
207
223
|
|
208
224
|
/// Setup the FreeRTOS task and the Bluetooth stack.
|
@@ -226,6 +242,11 @@ class ESP32BLETracker : public Component,
|
|
226
242
|
void gap_event_handler(esp_gap_ble_cb_event_t event, esp_ble_gap_cb_param_t *param) override;
|
227
243
|
void ble_before_disabled_event_handler() override;
|
228
244
|
|
245
|
+
void add_scanner_state_callback(std::function<void(ScannerState)> &&callback) {
|
246
|
+
this->scanner_state_callbacks_.add(std::move(callback));
|
247
|
+
}
|
248
|
+
ScannerState get_scanner_state() const { return this->scanner_state_; }
|
249
|
+
|
229
250
|
protected:
|
230
251
|
void stop_scan_();
|
231
252
|
/// Start a single scan by setting up the parameters and doing some esp-idf calls.
|
@@ -240,6 +261,8 @@ class ESP32BLETracker : public Component,
|
|
240
261
|
void gap_scan_start_complete_(const esp_ble_gap_cb_param_t::ble_scan_start_cmpl_evt_param ¶m);
|
241
262
|
/// Called when a `ESP_GAP_BLE_SCAN_STOP_COMPLETE_EVT` event is received.
|
242
263
|
void gap_scan_stop_complete_(const esp_ble_gap_cb_param_t::ble_scan_stop_cmpl_evt_param ¶m);
|
264
|
+
/// Called to set the scanner state. Will also call callbacks to let listeners know when state is changed.
|
265
|
+
void set_scanner_state_(ScannerState state);
|
243
266
|
|
244
267
|
int app_id_{0};
|
245
268
|
|
@@ -257,17 +280,17 @@ class ESP32BLETracker : public Component,
|
|
257
280
|
uint8_t scan_start_fail_count_{0};
|
258
281
|
bool scan_continuous_;
|
259
282
|
bool scan_active_;
|
260
|
-
|
283
|
+
ScannerState scanner_state_{ScannerState::IDLE};
|
284
|
+
CallbackManager<void(ScannerState)> scanner_state_callbacks_;
|
261
285
|
bool ble_was_disabled_{true};
|
262
286
|
bool raw_advertisements_{false};
|
263
287
|
bool parse_advertisements_{false};
|
264
288
|
SemaphoreHandle_t scan_result_lock_;
|
265
|
-
SemaphoreHandle_t scan_end_lock_;
|
266
289
|
size_t scan_result_index_{0};
|
267
290
|
#ifdef USE_PSRAM
|
268
291
|
const static u_int8_t SCAN_RESULT_BUFFER_SIZE = 32;
|
269
292
|
#else
|
270
|
-
const static u_int8_t SCAN_RESULT_BUFFER_SIZE =
|
293
|
+
const static u_int8_t SCAN_RESULT_BUFFER_SIZE = 20;
|
271
294
|
#endif // USE_PSRAM
|
272
295
|
esp_ble_gap_cb_param_t::ble_scan_result_evt_param *scan_result_buffer_;
|
273
296
|
esp_bt_status_t scan_start_failed_{ESP_BT_STATUS_SUCCESS};
|
@@ -276,6 +299,9 @@ class ESP32BLETracker : public Component,
|
|
276
299
|
int discovered_{0};
|
277
300
|
int searching_{0};
|
278
301
|
int disconnecting_{0};
|
302
|
+
#ifdef USE_ESP32_BLE_SOFTWARE_COEXISTENCE
|
303
|
+
bool coex_prefer_ble_{false};
|
304
|
+
#endif
|
279
305
|
};
|
280
306
|
|
281
307
|
// NOLINTNEXTLINE
|
@@ -3,6 +3,7 @@
|
|
3
3
|
#include "esp32_camera.h"
|
4
4
|
#include "esphome/core/log.h"
|
5
5
|
#include "esphome/core/hal.h"
|
6
|
+
#include "esphome/core/application.h"
|
6
7
|
|
7
8
|
#include <freertos/task.h>
|
8
9
|
|
@@ -162,7 +163,7 @@ void ESP32Camera::loop() {
|
|
162
163
|
}
|
163
164
|
|
164
165
|
// request idle image every idle_update_interval
|
165
|
-
const uint32_t now =
|
166
|
+
const uint32_t now = App.get_loop_component_start_time();
|
166
167
|
if (this->idle_update_interval_ != 0 && now - this->last_idle_request_ > this->idle_update_interval_) {
|
167
168
|
this->last_idle_request_ = now;
|
168
169
|
this->request_image(IDLE);
|
@@ -106,7 +106,7 @@ class CameraImageReader {
|
|
106
106
|
};
|
107
107
|
|
108
108
|
/* ---------------- ESP32Camera class ---------------- */
|
109
|
-
class ESP32Camera : public
|
109
|
+
class ESP32Camera : public EntityBase, public Component {
|
110
110
|
public:
|
111
111
|
ESP32Camera();
|
112
112
|
|
@@ -17,7 +17,7 @@ static const char *const TAG = "esp32_can";
|
|
17
17
|
static bool get_bitrate(canbus::CanSpeed bitrate, twai_timing_config_t *t_config) {
|
18
18
|
switch (bitrate) {
|
19
19
|
#if defined(USE_ESP32_VARIANT_ESP32S2) || defined(USE_ESP32_VARIANT_ESP32S3) || defined(USE_ESP32_VARIANT_ESP32C3) || \
|
20
|
-
defined(USE_ESP32_VARIANT_ESP32C6) || defined(
|
20
|
+
defined(USE_ESP32_VARIANT_ESP32C6) || defined(USE_ESP32_VARIANT_ESP32H2)
|
21
21
|
case canbus::CAN_1KBPS:
|
22
22
|
*t_config = (twai_timing_config_t) TWAI_TIMING_CONFIG_1KBITS();
|
23
23
|
return true;
|
@@ -58,7 +58,7 @@ void ESP32RMTLEDStripLightOutput::setup() {
|
|
58
58
|
channel.flags.io_loop_back = 0;
|
59
59
|
channel.flags.io_od_mode = 0;
|
60
60
|
channel.flags.invert_out = 0;
|
61
|
-
channel.flags.with_dma =
|
61
|
+
channel.flags.with_dma = this->use_dma_;
|
62
62
|
channel.intr_priority = 0;
|
63
63
|
if (rmt_new_tx_channel(&channel, &this->channel_) != ESP_OK) {
|
64
64
|
ESP_LOGE(TAG, "Channel creation failed");
|
@@ -51,6 +51,7 @@ class ESP32RMTLEDStripLightOutput : public light::AddressableLight {
|
|
51
51
|
void set_num_leds(uint16_t num_leds) { this->num_leds_ = num_leds; }
|
52
52
|
void set_is_rgbw(bool is_rgbw) { this->is_rgbw_ = is_rgbw; }
|
53
53
|
void set_is_wrgb(bool is_wrgb) { this->is_wrgb_ = is_wrgb; }
|
54
|
+
void set_use_dma(bool use_dma) { this->use_dma_ = use_dma; }
|
54
55
|
void set_use_psram(bool use_psram) { this->use_psram_ = use_psram; }
|
55
56
|
|
56
57
|
/// Set a maximum refresh rate in µs as some lights do not like being updated too often.
|
@@ -85,7 +86,7 @@ class ESP32RMTLEDStripLightOutput : public light::AddressableLight {
|
|
85
86
|
rmt_encoder_handle_t encoder_{nullptr};
|
86
87
|
rmt_symbol_word_t *rmt_buf_{nullptr};
|
87
88
|
rmt_symbol_word_t bit0_, bit1_, reset_;
|
88
|
-
uint32_t rmt_symbols_;
|
89
|
+
uint32_t rmt_symbols_{48};
|
89
90
|
#else
|
90
91
|
rmt_item32_t *rmt_buf_{nullptr};
|
91
92
|
rmt_item32_t bit0_, bit1_, reset_;
|
@@ -94,11 +95,12 @@ class ESP32RMTLEDStripLightOutput : public light::AddressableLight {
|
|
94
95
|
|
95
96
|
uint8_t pin_;
|
96
97
|
uint16_t num_leds_;
|
97
|
-
bool is_rgbw_;
|
98
|
-
bool is_wrgb_;
|
99
|
-
bool
|
98
|
+
bool is_rgbw_{false};
|
99
|
+
bool is_wrgb_{false};
|
100
|
+
bool use_dma_{false};
|
101
|
+
bool use_psram_{false};
|
100
102
|
|
101
|
-
RGBOrder rgb_order_;
|
103
|
+
RGBOrder rgb_order_{ORDER_RGB};
|
102
104
|
|
103
105
|
uint32_t last_refresh_{0};
|
104
106
|
optional<uint32_t> max_refresh_rate_{};
|
@@ -3,7 +3,7 @@ import logging
|
|
3
3
|
|
4
4
|
from esphome import pins
|
5
5
|
import esphome.codegen as cg
|
6
|
-
from esphome.components import esp32_rmt, light
|
6
|
+
from esphome.components import esp32, esp32_rmt, light
|
7
7
|
import esphome.config_validation as cv
|
8
8
|
from esphome.const import (
|
9
9
|
CONF_CHIPSET,
|
@@ -15,6 +15,7 @@ from esphome.const import (
|
|
15
15
|
CONF_RGB_ORDER,
|
16
16
|
CONF_RMT_CHANNEL,
|
17
17
|
CONF_RMT_SYMBOLS,
|
18
|
+
CONF_USE_DMA,
|
18
19
|
)
|
19
20
|
from esphome.core import CORE
|
20
21
|
|
@@ -138,6 +139,11 @@ CONFIG_SCHEMA = cv.All(
|
|
138
139
|
cv.Optional(CONF_CHIPSET): cv.one_of(*CHIPSETS, upper=True),
|
139
140
|
cv.Optional(CONF_IS_RGBW, default=False): cv.boolean,
|
140
141
|
cv.Optional(CONF_IS_WRGB, default=False): cv.boolean,
|
142
|
+
cv.Optional(CONF_USE_DMA): cv.All(
|
143
|
+
esp32.only_on_variant(supported=[esp32.const.VARIANT_ESP32S3]),
|
144
|
+
cv.only_with_esp_idf,
|
145
|
+
cv.boolean,
|
146
|
+
),
|
141
147
|
cv.Optional(CONF_USE_PSRAM, default=True): cv.boolean,
|
142
148
|
cv.Inclusive(
|
143
149
|
CONF_BIT0_HIGH,
|
@@ -211,6 +217,8 @@ async def to_code(config):
|
|
211
217
|
|
212
218
|
if esp32_rmt.use_new_rmt_driver():
|
213
219
|
cg.add(var.set_rmt_symbols(config[CONF_RMT_SYMBOLS]))
|
220
|
+
if CONF_USE_DMA in config:
|
221
|
+
cg.add(var.set_use_dma(config[CONF_USE_DMA]))
|
214
222
|
else:
|
215
223
|
rmt_channel_t = cg.global_ns.enum("rmt_channel_t")
|
216
224
|
cg.add(
|
@@ -288,7 +288,7 @@ uint32_t ESP32TouchComponent::component_touch_pad_read(touch_pad_t tp) {
|
|
288
288
|
}
|
289
289
|
|
290
290
|
void ESP32TouchComponent::loop() {
|
291
|
-
const uint32_t now =
|
291
|
+
const uint32_t now = App.get_loop_component_start_time();
|
292
292
|
bool should_print = this->setup_mode_ && now - this->setup_mode_last_log_print_ > 250;
|
293
293
|
for (auto *child : this->children_) {
|
294
294
|
child->value_ = this->component_touch_pad_read(child->get_touch_pad());
|
@@ -8,7 +8,7 @@ namespace esp8266 {
|
|
8
8
|
|
9
9
|
static const char *const TAG = "esp8266";
|
10
10
|
|
11
|
-
static int
|
11
|
+
static int flags_to_mode(gpio::Flags flags, uint8_t pin) {
|
12
12
|
if (flags == gpio::FLAG_INPUT) { // NOLINT(bugprone-branch-clone)
|
13
13
|
return INPUT;
|
14
14
|
} else if (flags == gpio::FLAG_OUTPUT) {
|
@@ -34,12 +34,36 @@ static int IRAM_ATTR flags_to_mode(gpio::Flags flags, uint8_t pin) {
|
|
34
34
|
struct ISRPinArg {
|
35
35
|
uint8_t pin;
|
36
36
|
bool inverted;
|
37
|
+
volatile uint32_t *in_reg;
|
38
|
+
volatile uint32_t *out_set_reg;
|
39
|
+
volatile uint32_t *out_clr_reg;
|
40
|
+
volatile uint32_t *mode_set_reg;
|
41
|
+
volatile uint32_t *mode_clr_reg;
|
42
|
+
volatile uint32_t *func_reg;
|
43
|
+
uint32_t mask;
|
37
44
|
};
|
38
45
|
|
39
46
|
ISRInternalGPIOPin ESP8266GPIOPin::to_isr() const {
|
40
47
|
auto *arg = new ISRPinArg{}; // NOLINT(cppcoreguidelines-owning-memory)
|
41
|
-
arg->pin = pin_;
|
42
|
-
arg->inverted = inverted_;
|
48
|
+
arg->pin = this->pin_;
|
49
|
+
arg->inverted = this->inverted_;
|
50
|
+
if (this->pin_ < 16) {
|
51
|
+
arg->in_reg = &GPI;
|
52
|
+
arg->out_set_reg = &GPOS;
|
53
|
+
arg->out_clr_reg = &GPOC;
|
54
|
+
arg->mode_set_reg = &GPES;
|
55
|
+
arg->mode_clr_reg = &GPEC;
|
56
|
+
arg->func_reg = &GPF(this->pin_);
|
57
|
+
arg->mask = 1 << this->pin_;
|
58
|
+
} else {
|
59
|
+
arg->in_reg = &GP16I;
|
60
|
+
arg->out_set_reg = &GP16O;
|
61
|
+
arg->out_clr_reg = nullptr;
|
62
|
+
arg->mode_set_reg = &GP16E;
|
63
|
+
arg->mode_clr_reg = nullptr;
|
64
|
+
arg->func_reg = &GPF16;
|
65
|
+
arg->mask = 1;
|
66
|
+
}
|
43
67
|
return ISRInternalGPIOPin((void *) arg);
|
44
68
|
}
|
45
69
|
|
@@ -88,20 +112,57 @@ void ESP8266GPIOPin::detach_interrupt() const { detachInterrupt(pin_); }
|
|
88
112
|
using namespace esp8266;
|
89
113
|
|
90
114
|
bool IRAM_ATTR ISRInternalGPIOPin::digital_read() {
|
91
|
-
auto *arg = reinterpret_cast<ISRPinArg *>(arg_);
|
92
|
-
return bool(
|
115
|
+
auto *arg = reinterpret_cast<ISRPinArg *>(this->arg_);
|
116
|
+
return bool(*arg->in_reg & arg->mask) != arg->inverted;
|
93
117
|
}
|
118
|
+
|
94
119
|
void IRAM_ATTR ISRInternalGPIOPin::digital_write(bool value) {
|
95
120
|
auto *arg = reinterpret_cast<ISRPinArg *>(arg_);
|
96
|
-
|
121
|
+
if (arg->pin < 16) {
|
122
|
+
if (value != arg->inverted) {
|
123
|
+
*arg->out_set_reg = arg->mask;
|
124
|
+
} else {
|
125
|
+
*arg->out_clr_reg = arg->mask;
|
126
|
+
}
|
127
|
+
} else {
|
128
|
+
if (value != arg->inverted) {
|
129
|
+
*arg->out_set_reg |= 1;
|
130
|
+
} else {
|
131
|
+
*arg->out_set_reg &= ~1;
|
132
|
+
}
|
133
|
+
}
|
97
134
|
}
|
135
|
+
|
98
136
|
void IRAM_ATTR ISRInternalGPIOPin::clear_interrupt() {
|
99
137
|
auto *arg = reinterpret_cast<ISRPinArg *>(arg_);
|
100
138
|
GPIO_REG_WRITE(GPIO_STATUS_W1TC_ADDRESS, 1UL << arg->pin);
|
101
139
|
}
|
140
|
+
|
102
141
|
void IRAM_ATTR ISRInternalGPIOPin::pin_mode(gpio::Flags flags) {
|
103
|
-
auto *arg = reinterpret_cast<ISRPinArg *>(arg_);
|
104
|
-
|
142
|
+
auto *arg = reinterpret_cast<ISRPinArg *>(this->arg_);
|
143
|
+
if (arg->pin < 16) {
|
144
|
+
if (flags & gpio::FLAG_OUTPUT) {
|
145
|
+
*arg->mode_set_reg = arg->mask;
|
146
|
+
} else {
|
147
|
+
*arg->mode_clr_reg = arg->mask;
|
148
|
+
}
|
149
|
+
if (flags & gpio::FLAG_PULLUP) {
|
150
|
+
*arg->func_reg |= 1 << GPFPU;
|
151
|
+
} else {
|
152
|
+
*arg->func_reg &= ~(1 << GPFPU);
|
153
|
+
}
|
154
|
+
} else {
|
155
|
+
if (flags & gpio::FLAG_OUTPUT) {
|
156
|
+
*arg->mode_set_reg |= 1;
|
157
|
+
} else {
|
158
|
+
*arg->mode_set_reg &= ~1;
|
159
|
+
}
|
160
|
+
if (flags & gpio::FLAG_PULLDOWN) {
|
161
|
+
*arg->func_reg |= 1 << GP16FPD;
|
162
|
+
} else {
|
163
|
+
*arg->func_reg &= ~(1 << GP16FPD);
|
164
|
+
}
|
165
|
+
}
|
105
166
|
}
|
106
167
|
|
107
168
|
} // namespace esphome
|
@@ -41,7 +41,7 @@ EventTrigger = event_ns.class_("EventTrigger", automation.Trigger.template())
|
|
41
41
|
|
42
42
|
validate_device_class = cv.one_of(*DEVICE_CLASSES, lower=True, space="_")
|
43
43
|
|
44
|
-
|
44
|
+
_EVENT_SCHEMA = (
|
45
45
|
cv.ENTITY_BASE_SCHEMA.extend(web_server.WEBSERVER_SORTING_SCHEMA)
|
46
46
|
.extend(cv.MQTT_COMPONENT_SCHEMA)
|
47
47
|
.extend(
|
@@ -58,19 +58,17 @@ EVENT_SCHEMA = (
|
|
58
58
|
)
|
59
59
|
)
|
60
60
|
|
61
|
-
_UNDEF = object()
|
62
|
-
|
63
61
|
|
64
62
|
def event_schema(
|
65
|
-
class_: MockObjClass =
|
63
|
+
class_: MockObjClass = cv.UNDEFINED,
|
66
64
|
*,
|
67
|
-
icon: str =
|
68
|
-
entity_category: str =
|
69
|
-
device_class: str =
|
65
|
+
icon: str = cv.UNDEFINED,
|
66
|
+
entity_category: str = cv.UNDEFINED,
|
67
|
+
device_class: str = cv.UNDEFINED,
|
70
68
|
) -> cv.Schema:
|
71
69
|
schema = {}
|
72
70
|
|
73
|
-
if class_ is not
|
71
|
+
if class_ is not cv.UNDEFINED:
|
74
72
|
schema[cv.GenerateID()] = cv.declare_id(class_)
|
75
73
|
|
76
74
|
for key, default, validator in [
|
@@ -78,10 +76,15 @@ def event_schema(
|
|
78
76
|
(CONF_ENTITY_CATEGORY, entity_category, cv.entity_category),
|
79
77
|
(CONF_DEVICE_CLASS, device_class, validate_device_class),
|
80
78
|
]:
|
81
|
-
if default is not
|
79
|
+
if default is not cv.UNDEFINED:
|
82
80
|
schema[cv.Optional(key, default=default)] = validator
|
83
81
|
|
84
|
-
return
|
82
|
+
return _EVENT_SCHEMA.extend(schema)
|
83
|
+
|
84
|
+
|
85
|
+
# Remove before 2025.11.0
|
86
|
+
EVENT_SCHEMA = event_schema()
|
87
|
+
EVENT_SCHEMA.add_extra(cv.deprecated_schema_constant("event"))
|
85
88
|
|
86
89
|
|
87
90
|
async def setup_event_core_(var, config, *, event_types: list[str]):
|
@@ -1,14 +1,7 @@
|
|
1
1
|
import esphome.codegen as cg
|
2
2
|
from esphome.components import switch
|
3
3
|
import esphome.config_validation as cv
|
4
|
-
from esphome.const import
|
5
|
-
CONF_ENTITY_CATEGORY,
|
6
|
-
CONF_ICON,
|
7
|
-
CONF_ID,
|
8
|
-
CONF_INVERTED,
|
9
|
-
ENTITY_CATEGORY_CONFIG,
|
10
|
-
ICON_RESTART_ALERT,
|
11
|
-
)
|
4
|
+
from esphome.const import ENTITY_CATEGORY_CONFIG, ICON_RESTART_ALERT
|
12
5
|
|
13
6
|
from .. import factory_reset_ns
|
14
7
|
|
@@ -16,21 +9,14 @@ FactoryResetSwitch = factory_reset_ns.class_(
|
|
16
9
|
"FactoryResetSwitch", switch.Switch, cg.Component
|
17
10
|
)
|
18
11
|
|
19
|
-
CONFIG_SCHEMA = switch.
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
),
|
25
|
-
cv.Optional(CONF_ICON, default=ICON_RESTART_ALERT): cv.icon,
|
26
|
-
cv.Optional(
|
27
|
-
CONF_ENTITY_CATEGORY, default=ENTITY_CATEGORY_CONFIG
|
28
|
-
): cv.entity_category,
|
29
|
-
}
|
12
|
+
CONFIG_SCHEMA = switch.switch_schema(
|
13
|
+
FactoryResetSwitch,
|
14
|
+
block_inverted=True,
|
15
|
+
icon=ICON_RESTART_ALERT,
|
16
|
+
entity_category=ENTITY_CATEGORY_CONFIG,
|
30
17
|
).extend(cv.COMPONENT_SCHEMA)
|
31
18
|
|
32
19
|
|
33
20
|
async def to_code(config):
|
34
|
-
var =
|
21
|
+
var = await switch.new_switch(config)
|
35
22
|
await cg.register_component(var, config)
|
36
|
-
await switch.register_switch(var, config)
|
@@ -5,6 +5,10 @@ from esphome.components import mqtt, web_server
|
|
5
5
|
import esphome.config_validation as cv
|
6
6
|
from esphome.const import (
|
7
7
|
CONF_DIRECTION,
|
8
|
+
CONF_DIRECTION_COMMAND_TOPIC,
|
9
|
+
CONF_DIRECTION_STATE_TOPIC,
|
10
|
+
CONF_ENTITY_CATEGORY,
|
11
|
+
CONF_ICON,
|
8
12
|
CONF_ID,
|
9
13
|
CONF_MQTT_ID,
|
10
14
|
CONF_OFF_SPEED_CYCLE,
|
@@ -80,16 +84,21 @@ FanPresetSetTrigger = fan_ns.class_(
|
|
80
84
|
FanIsOnCondition = fan_ns.class_("FanIsOnCondition", automation.Condition.template())
|
81
85
|
FanIsOffCondition = fan_ns.class_("FanIsOffCondition", automation.Condition.template())
|
82
86
|
|
83
|
-
|
87
|
+
_FAN_SCHEMA = (
|
84
88
|
cv.ENTITY_BASE_SCHEMA.extend(web_server.WEBSERVER_SORTING_SCHEMA)
|
85
89
|
.extend(cv.MQTT_COMMAND_COMPONENT_SCHEMA)
|
86
90
|
.extend(
|
87
91
|
{
|
88
|
-
cv.GenerateID(): cv.declare_id(Fan),
|
89
92
|
cv.Optional(CONF_RESTORE_MODE, default="ALWAYS_OFF"): cv.enum(
|
90
93
|
RESTORE_MODES, upper=True, space="_"
|
91
94
|
),
|
92
95
|
cv.OnlyWith(CONF_MQTT_ID, "mqtt"): cv.declare_id(mqtt.MQTTFanComponent),
|
96
|
+
cv.Optional(CONF_DIRECTION_STATE_TOPIC): cv.All(
|
97
|
+
cv.requires_component("mqtt"), cv.publish_topic
|
98
|
+
),
|
99
|
+
cv.Optional(CONF_DIRECTION_COMMAND_TOPIC): cv.All(
|
100
|
+
cv.requires_component("mqtt"), cv.subscribe_topic
|
101
|
+
),
|
93
102
|
cv.Optional(CONF_OSCILLATION_STATE_TOPIC): cv.All(
|
94
103
|
cv.requires_component("mqtt"), cv.publish_topic
|
95
104
|
),
|
@@ -151,6 +160,37 @@ FAN_SCHEMA = (
|
|
151
160
|
)
|
152
161
|
)
|
153
162
|
|
163
|
+
|
164
|
+
def fan_schema(
|
165
|
+
class_: cg.Pvariable,
|
166
|
+
*,
|
167
|
+
entity_category: str = cv.UNDEFINED,
|
168
|
+
icon: str = cv.UNDEFINED,
|
169
|
+
default_restore_mode: str = cv.UNDEFINED,
|
170
|
+
) -> cv.Schema:
|
171
|
+
schema = {
|
172
|
+
cv.GenerateID(): cv.declare_id(class_),
|
173
|
+
}
|
174
|
+
|
175
|
+
for key, default, validator in [
|
176
|
+
(CONF_ENTITY_CATEGORY, entity_category, cv.entity_category),
|
177
|
+
(CONF_ICON, icon, cv.icon),
|
178
|
+
(
|
179
|
+
CONF_RESTORE_MODE,
|
180
|
+
default_restore_mode,
|
181
|
+
cv.enum(RESTORE_MODES, upper=True, space="_"),
|
182
|
+
),
|
183
|
+
]:
|
184
|
+
if default is not cv.UNDEFINED:
|
185
|
+
schema[cv.Optional(key, default=default)] = validator
|
186
|
+
|
187
|
+
return _FAN_SCHEMA.extend(schema)
|
188
|
+
|
189
|
+
|
190
|
+
# Remove before 2025.11.0
|
191
|
+
FAN_SCHEMA = fan_schema(Fan)
|
192
|
+
FAN_SCHEMA.add_extra(cv.deprecated_schema_constant("fan"))
|
193
|
+
|
154
194
|
_PRESET_MODES_SCHEMA = cv.All(
|
155
195
|
cv.ensure_list(cv.string_strict),
|
156
196
|
cv.Length(min=1),
|
@@ -193,6 +233,14 @@ async def setup_fan_core_(var, config):
|
|
193
233
|
mqtt_ = cg.new_Pvariable(mqtt_id, var)
|
194
234
|
await mqtt.register_mqtt_component(mqtt_, config)
|
195
235
|
|
236
|
+
if (
|
237
|
+
direction_state_topic := config.get(CONF_DIRECTION_STATE_TOPIC)
|
238
|
+
) is not None:
|
239
|
+
cg.add(mqtt_.set_custom_direction_state_topic(direction_state_topic))
|
240
|
+
if (
|
241
|
+
direction_command_topic := config.get(CONF_DIRECTION_COMMAND_TOPIC)
|
242
|
+
) is not None:
|
243
|
+
cg.add(mqtt_.set_custom_direction_command_topic(direction_command_topic))
|
196
244
|
if (
|
197
245
|
oscillation_state_topic := config.get(CONF_OSCILLATION_STATE_TOPIC)
|
198
246
|
) is not None:
|
@@ -251,10 +299,9 @@ async def register_fan(var, config):
|
|
251
299
|
await setup_fan_core_(var, config)
|
252
300
|
|
253
301
|
|
254
|
-
async def
|
255
|
-
var = cg.new_Pvariable(config[CONF_ID])
|
302
|
+
async def new_fan(config, *args):
|
303
|
+
var = cg.new_Pvariable(config[CONF_ID], *args)
|
256
304
|
await register_fan(var, config)
|
257
|
-
await cg.register_component(var, config)
|
258
305
|
return var
|
259
306
|
|
260
307
|
|
@@ -40,9 +40,6 @@ async def new_fastled_light(config):
|
|
40
40
|
if CONF_MAX_REFRESH_RATE in config:
|
41
41
|
cg.add(var.set_max_refresh_rate(config[CONF_MAX_REFRESH_RATE]))
|
42
42
|
|
43
|
+
cg.add_library("fastled/FastLED", "3.9.16")
|
43
44
|
await light.register_light(var, config)
|
44
|
-
# https://github.com/FastLED/FastLED/blob/master/library.json
|
45
|
-
# 3.3.3 has an issue on ESP32 with RMT and fastled_clockless:
|
46
|
-
# https://github.com/esphome/issues/issues/1375
|
47
|
-
cg.add_library("fastled/FastLED", "3.3.2")
|
48
45
|
return var
|
@@ -34,7 +34,7 @@ void FastLEDLightOutput::write_state(light::LightState *state) {
|
|
34
34
|
this->mark_shown_();
|
35
35
|
|
36
36
|
ESP_LOGVV(TAG, "Writing RGB values to bus...");
|
37
|
-
this->controller_->showLeds();
|
37
|
+
this->controller_->showLeds(this->state_parent_->current_values.get_brightness() * 255);
|
38
38
|
}
|
39
39
|
|
40
40
|
} // namespace fastled_base
|
@@ -7,7 +7,6 @@ from esphome.const import (
|
|
7
7
|
CONF_CLOSE_ACTION,
|
8
8
|
CONF_CLOSE_DURATION,
|
9
9
|
CONF_CLOSE_ENDSTOP,
|
10
|
-
CONF_ID,
|
11
10
|
CONF_MAX_DURATION,
|
12
11
|
CONF_OPEN_ACTION,
|
13
12
|
CONF_OPEN_DURATION,
|
@@ -50,36 +49,43 @@ def validate_infer_endstop(config):
|
|
50
49
|
return config
|
51
50
|
|
52
51
|
|
53
|
-
CONFIG_FEEDBACK_COVER_BASE_SCHEMA =
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
52
|
+
CONFIG_FEEDBACK_COVER_BASE_SCHEMA = (
|
53
|
+
cover.cover_schema(FeedbackCover)
|
54
|
+
.extend(
|
55
|
+
{
|
56
|
+
cv.Required(CONF_STOP_ACTION): automation.validate_automation(single=True),
|
57
|
+
cv.Required(CONF_OPEN_ACTION): automation.validate_automation(single=True),
|
58
|
+
cv.Required(CONF_OPEN_DURATION): cv.positive_time_period_milliseconds,
|
59
|
+
cv.Optional(CONF_OPEN_ENDSTOP): cv.use_id(binary_sensor.BinarySensor),
|
60
|
+
cv.Optional(CONF_OPEN_SENSOR): cv.use_id(binary_sensor.BinarySensor),
|
61
|
+
cv.Optional(CONF_OPEN_OBSTACLE_SENSOR): cv.use_id(
|
62
|
+
binary_sensor.BinarySensor
|
63
|
+
),
|
64
|
+
cv.Required(CONF_CLOSE_ACTION): automation.validate_automation(single=True),
|
65
|
+
cv.Required(CONF_CLOSE_DURATION): cv.positive_time_period_milliseconds,
|
66
|
+
cv.Optional(CONF_CLOSE_ENDSTOP): cv.use_id(binary_sensor.BinarySensor),
|
67
|
+
cv.Optional(CONF_CLOSE_SENSOR): cv.use_id(binary_sensor.BinarySensor),
|
68
|
+
cv.Optional(CONF_CLOSE_OBSTACLE_SENSOR): cv.use_id(
|
69
|
+
binary_sensor.BinarySensor
|
70
|
+
),
|
71
|
+
cv.Optional(CONF_MAX_DURATION): cv.positive_time_period_milliseconds,
|
72
|
+
cv.Optional(CONF_HAS_BUILT_IN_ENDSTOP, default=False): cv.boolean,
|
73
|
+
cv.Optional(CONF_ASSUMED_STATE): cv.boolean,
|
74
|
+
cv.Optional(
|
75
|
+
CONF_UPDATE_INTERVAL, "1000ms"
|
76
|
+
): cv.positive_time_period_milliseconds,
|
77
|
+
cv.Optional(CONF_INFER_ENDSTOP_FROM_MOVEMENT, False): cv.boolean,
|
78
|
+
cv.Optional(
|
79
|
+
CONF_DIRECTION_CHANGE_WAIT_TIME
|
80
|
+
): cv.positive_time_period_milliseconds,
|
81
|
+
cv.Optional(
|
82
|
+
CONF_ACCELERATION_WAIT_TIME, "0s"
|
83
|
+
): cv.positive_time_period_milliseconds,
|
84
|
+
cv.Optional(CONF_OBSTACLE_ROLLBACK, default="10%"): cv.percentage,
|
85
|
+
},
|
86
|
+
)
|
87
|
+
.extend(cv.COMPONENT_SCHEMA)
|
88
|
+
)
|
83
89
|
|
84
90
|
|
85
91
|
CONFIG_SCHEMA = cv.All(
|
@@ -90,9 +96,8 @@ CONFIG_SCHEMA = cv.All(
|
|
90
96
|
|
91
97
|
|
92
98
|
async def to_code(config):
|
93
|
-
var =
|
99
|
+
var = await cover.new_cover(config)
|
94
100
|
await cg.register_component(var, config)
|
95
|
-
await cover.register_cover(var, config)
|
96
101
|
|
97
102
|
# STOP
|
98
103
|
await automation.build_automation(
|
@@ -1,6 +1,7 @@
|
|
1
1
|
#include "feedback_cover.h"
|
2
2
|
#include "esphome/core/hal.h"
|
3
3
|
#include "esphome/core/log.h"
|
4
|
+
#include "esphome/core/application.h"
|
4
5
|
|
5
6
|
namespace esphome {
|
6
7
|
namespace feedback {
|
@@ -220,7 +221,7 @@ void FeedbackCover::set_open_obstacle_sensor(binary_sensor::BinarySensor *open_o
|
|
220
221
|
void FeedbackCover::loop() {
|
221
222
|
if (this->current_operation == COVER_OPERATION_IDLE)
|
222
223
|
return;
|
223
|
-
const uint32_t now =
|
224
|
+
const uint32_t now = App.get_loop_component_start_time();
|
224
225
|
|
225
226
|
// Recompute position every loop cycle
|
226
227
|
this->recompute_position_();
|