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
@@ -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(
|
@@ -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,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
|
|
@@ -10,13 +8,8 @@ FujitsuGeneralClimate = fujitsu_general_ns.class_(
|
|
10
8
|
"FujitsuGeneralClimate", climate_ir.ClimateIR
|
11
9
|
)
|
12
10
|
|
13
|
-
CONFIG_SCHEMA = climate_ir.
|
14
|
-
{
|
15
|
-
cv.GenerateID(): cv.declare_id(FujitsuGeneralClimate),
|
16
|
-
}
|
17
|
-
)
|
11
|
+
CONFIG_SCHEMA = climate_ir.climare_ir_with_receiver_schema(FujitsuGeneralClimate)
|
18
12
|
|
19
13
|
|
20
14
|
async def to_code(config):
|
21
|
-
|
22
|
-
await climate_ir.register_climate_ir(var, config)
|
15
|
+
await climate_ir.new_climate_ir(config)
|