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,7 @@ import esphome.codegen as cg
|
|
2
2
|
from esphome.components import switch
|
3
3
|
import esphome.config_validation as cv
|
4
4
|
from esphome.const import CONF_TYPE, ENTITY_CATEGORY_CONFIG
|
5
|
+
from esphome.cpp_generator import MockObjClass
|
5
6
|
|
6
7
|
from .. import CONF_DFROBOT_SEN0395_ID, DfrobotSen0395Component
|
7
8
|
|
@@ -26,32 +27,30 @@ Sen0395StartAfterBootSwitch = dfrobot_sen0395_ns.class_(
|
|
26
27
|
"Sen0395StartAfterBootSwitch", DfrobotSen0395Switch
|
27
28
|
)
|
28
29
|
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
30
|
+
|
31
|
+
def _switch_schema(class_: MockObjClass) -> cv.Schema:
|
32
|
+
return (
|
33
|
+
switch.switch_schema(
|
34
|
+
class_,
|
35
|
+
entity_category=ENTITY_CATEGORY_CONFIG,
|
36
|
+
)
|
37
|
+
.extend(
|
38
|
+
{
|
39
|
+
cv.GenerateID(CONF_DFROBOT_SEN0395_ID): cv.use_id(
|
40
|
+
DfrobotSen0395Component
|
41
|
+
),
|
42
|
+
}
|
43
|
+
)
|
44
|
+
.extend(cv.COMPONENT_SCHEMA)
|
37
45
|
)
|
38
|
-
|
39
|
-
)
|
46
|
+
|
40
47
|
|
41
48
|
CONFIG_SCHEMA = cv.typed_schema(
|
42
49
|
{
|
43
|
-
"sensor_active":
|
44
|
-
|
45
|
-
),
|
46
|
-
"
|
47
|
-
{cv.GenerateID(): cv.declare_id(Sen0395LedSwitch)}
|
48
|
-
),
|
49
|
-
"presence_via_uart": _SWITCH_SCHEMA.extend(
|
50
|
-
{cv.GenerateID(): cv.declare_id(Sen0395UartPresenceSwitch)}
|
51
|
-
),
|
52
|
-
"start_after_boot": _SWITCH_SCHEMA.extend(
|
53
|
-
{cv.GenerateID(): cv.declare_id(Sen0395StartAfterBootSwitch)}
|
54
|
-
),
|
50
|
+
"sensor_active": _switch_schema(Sen0395PowerSwitch),
|
51
|
+
"turn_on_led": _switch_schema(Sen0395LedSwitch),
|
52
|
+
"presence_via_uart": _switch_schema(Sen0395UartPresenceSwitch),
|
53
|
+
"start_after_boot": _switch_schema(Sen0395StartAfterBootSwitch),
|
55
54
|
}
|
56
55
|
)
|
57
56
|
|
@@ -69,21 +69,16 @@ bool Rect::inside(int16_t test_x, int16_t test_y, bool absolute) const { // NOL
|
|
69
69
|
return true;
|
70
70
|
}
|
71
71
|
if (absolute) {
|
72
|
-
return
|
73
|
-
} else {
|
74
|
-
return ((test_x >= 0) && (test_x <= this->w) && (test_y >= 0) && (test_y <= this->h));
|
72
|
+
return test_x >= this->x && test_x < this->x2() && test_y >= this->y && test_y < this->y2();
|
75
73
|
}
|
74
|
+
return test_x >= 0 && test_x < this->w && test_y >= 0 && test_y < this->h;
|
76
75
|
}
|
77
76
|
|
78
|
-
bool Rect::inside(Rect rect
|
77
|
+
bool Rect::inside(Rect rect) const {
|
79
78
|
if (!this->is_set() || !rect.is_set()) {
|
80
79
|
return true;
|
81
80
|
}
|
82
|
-
|
83
|
-
return ((rect.x <= this->x2()) && (rect.x2() >= this->x) && (rect.y <= this->y2()) && (rect.y2() >= this->y));
|
84
|
-
} else {
|
85
|
-
return ((rect.x <= this->w) && (rect.w >= 0) && (rect.y <= this->h) && (rect.h >= 0));
|
86
|
-
}
|
81
|
+
return this->x2() >= rect.x && this->x <= rect.x2() && this->y2() >= rect.y && this->y <= rect.y2();
|
87
82
|
}
|
88
83
|
|
89
84
|
void Rect::info(const std::string &prefix) {
|
@@ -26,7 +26,7 @@ class Rect {
|
|
26
26
|
void extend(Rect rect);
|
27
27
|
void shrink(Rect rect);
|
28
28
|
|
29
|
-
bool inside(Rect rect
|
29
|
+
bool inside(Rect rect) const;
|
30
30
|
bool inside(int16_t test_x, int16_t test_y, bool absolute = true) const;
|
31
31
|
bool equal(Rect rect) const;
|
32
32
|
void info(const std::string &prefix = "rect info:");
|
@@ -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
|
CODEOWNERS = ["@E440QF"]
|
7
5
|
AUTO_LOAD = ["climate_ir"]
|
@@ -9,13 +7,8 @@ AUTO_LOAD = ["climate_ir"]
|
|
9
7
|
emmeti_ns = cg.esphome_ns.namespace("emmeti")
|
10
8
|
EmmetiClimate = emmeti_ns.class_("EmmetiClimate", climate_ir.ClimateIR)
|
11
9
|
|
12
|
-
CONFIG_SCHEMA = climate_ir.
|
13
|
-
{
|
14
|
-
cv.GenerateID(): cv.declare_id(EmmetiClimate),
|
15
|
-
}
|
16
|
-
)
|
10
|
+
CONFIG_SCHEMA = climate_ir.climare_ir_with_receiver_schema(EmmetiClimate)
|
17
11
|
|
18
12
|
|
19
13
|
async def to_code(config):
|
20
|
-
|
21
|
-
await climate_ir.register_climate_ir(var, config)
|
14
|
+
await climate_ir.new_climate_ir(config)
|
@@ -6,7 +6,6 @@ from esphome.const import (
|
|
6
6
|
CONF_CLOSE_ACTION,
|
7
7
|
CONF_CLOSE_DURATION,
|
8
8
|
CONF_CLOSE_ENDSTOP,
|
9
|
-
CONF_ID,
|
10
9
|
CONF_MAX_DURATION,
|
11
10
|
CONF_OPEN_ACTION,
|
12
11
|
CONF_OPEN_DURATION,
|
@@ -17,25 +16,27 @@ from esphome.const import (
|
|
17
16
|
endstop_ns = cg.esphome_ns.namespace("endstop")
|
18
17
|
EndstopCover = endstop_ns.class_("EndstopCover", cover.Cover, cg.Component)
|
19
18
|
|
20
|
-
CONFIG_SCHEMA =
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
19
|
+
CONFIG_SCHEMA = (
|
20
|
+
cover.cover_schema(EndstopCover)
|
21
|
+
.extend(
|
22
|
+
{
|
23
|
+
cv.Required(CONF_STOP_ACTION): automation.validate_automation(single=True),
|
24
|
+
cv.Required(CONF_OPEN_ENDSTOP): cv.use_id(binary_sensor.BinarySensor),
|
25
|
+
cv.Required(CONF_OPEN_ACTION): automation.validate_automation(single=True),
|
26
|
+
cv.Required(CONF_OPEN_DURATION): cv.positive_time_period_milliseconds,
|
27
|
+
cv.Required(CONF_CLOSE_ACTION): automation.validate_automation(single=True),
|
28
|
+
cv.Required(CONF_CLOSE_ENDSTOP): cv.use_id(binary_sensor.BinarySensor),
|
29
|
+
cv.Required(CONF_CLOSE_DURATION): cv.positive_time_period_milliseconds,
|
30
|
+
cv.Optional(CONF_MAX_DURATION): cv.positive_time_period_milliseconds,
|
31
|
+
}
|
32
|
+
)
|
33
|
+
.extend(cv.COMPONENT_SCHEMA)
|
34
|
+
)
|
33
35
|
|
34
36
|
|
35
37
|
async def to_code(config):
|
36
|
-
var =
|
38
|
+
var = await cover.new_cover(config)
|
37
39
|
await cg.register_component(var, config)
|
38
|
-
await cover.register_cover(var, config)
|
39
40
|
|
40
41
|
await automation.build_automation(
|
41
42
|
var.get_stop_trigger(), [], config[CONF_STOP_ACTION]
|
@@ -1,4 +1,5 @@
|
|
1
1
|
from dataclasses import dataclass
|
2
|
+
import itertools
|
2
3
|
import logging
|
3
4
|
import os
|
4
5
|
from pathlib import Path
|
@@ -37,6 +38,7 @@ from esphome.const import (
|
|
37
38
|
__version__,
|
38
39
|
)
|
39
40
|
from esphome.core import CORE, HexInt, TimePeriod
|
41
|
+
from esphome.cpp_generator import RawExpression
|
40
42
|
import esphome.final_validate as fv
|
41
43
|
from esphome.helpers import copy_file_if_changed, mkdir_p, write_file_if_changed
|
42
44
|
|
@@ -54,6 +56,12 @@ from .const import ( # noqa
|
|
54
56
|
KEY_SUBMODULES,
|
55
57
|
KEY_VARIANT,
|
56
58
|
VARIANT_ESP32,
|
59
|
+
VARIANT_ESP32C2,
|
60
|
+
VARIANT_ESP32C3,
|
61
|
+
VARIANT_ESP32C6,
|
62
|
+
VARIANT_ESP32H2,
|
63
|
+
VARIANT_ESP32S2,
|
64
|
+
VARIANT_ESP32S3,
|
57
65
|
VARIANT_FRIENDLY,
|
58
66
|
VARIANTS,
|
59
67
|
)
|
@@ -70,7 +78,43 @@ CONF_RELEASE = "release"
|
|
70
78
|
CONF_ENABLE_IDF_EXPERIMENTAL_FEATURES = "enable_idf_experimental_features"
|
71
79
|
|
72
80
|
|
81
|
+
def get_cpu_frequencies(*frequencies):
|
82
|
+
return [str(x) + "MHZ" for x in frequencies]
|
83
|
+
|
84
|
+
|
85
|
+
CPU_FREQUENCIES = {
|
86
|
+
VARIANT_ESP32: get_cpu_frequencies(80, 160, 240),
|
87
|
+
VARIANT_ESP32S2: get_cpu_frequencies(80, 160, 240),
|
88
|
+
VARIANT_ESP32S3: get_cpu_frequencies(80, 160, 240),
|
89
|
+
VARIANT_ESP32C2: get_cpu_frequencies(80, 120),
|
90
|
+
VARIANT_ESP32C3: get_cpu_frequencies(80, 160),
|
91
|
+
VARIANT_ESP32C6: get_cpu_frequencies(80, 120, 160),
|
92
|
+
VARIANT_ESP32H2: get_cpu_frequencies(16, 32, 48, 64, 96),
|
93
|
+
}
|
94
|
+
|
95
|
+
# Make sure not missed here if a new variant added.
|
96
|
+
assert all(v in CPU_FREQUENCIES for v in VARIANTS)
|
97
|
+
|
98
|
+
FULL_CPU_FREQUENCIES = set(itertools.chain.from_iterable(CPU_FREQUENCIES.values()))
|
99
|
+
|
100
|
+
|
73
101
|
def set_core_data(config):
|
102
|
+
cpu_frequency = config.get(CONF_CPU_FREQUENCY, None)
|
103
|
+
variant = config[CONF_VARIANT]
|
104
|
+
# if not specified in config, set to 160MHz if supported, the fastest otherwise
|
105
|
+
if cpu_frequency is None:
|
106
|
+
choices = CPU_FREQUENCIES[variant]
|
107
|
+
if "160MHZ" in choices:
|
108
|
+
cpu_frequency = "160MHZ"
|
109
|
+
else:
|
110
|
+
cpu_frequency = choices[-1]
|
111
|
+
config[CONF_CPU_FREQUENCY] = cpu_frequency
|
112
|
+
elif cpu_frequency not in CPU_FREQUENCIES[variant]:
|
113
|
+
raise cv.Invalid(
|
114
|
+
f"Invalid CPU frequency '{cpu_frequency}' for {config[CONF_VARIANT]}",
|
115
|
+
path=[CONF_CPU_FREQUENCY],
|
116
|
+
)
|
117
|
+
|
74
118
|
CORE.data[KEY_ESP32] = {}
|
75
119
|
CORE.data[KEY_CORE][KEY_TARGET_PLATFORM] = PLATFORM_ESP32
|
76
120
|
conf = config[CONF_FRAMEWORK]
|
@@ -83,6 +127,7 @@ def set_core_data(config):
|
|
83
127
|
CORE.data[KEY_CORE][KEY_FRAMEWORK_VERSION] = cv.Version.parse(
|
84
128
|
config[CONF_FRAMEWORK][CONF_VERSION]
|
85
129
|
)
|
130
|
+
|
86
131
|
CORE.data[KEY_ESP32][KEY_BOARD] = config[CONF_BOARD]
|
87
132
|
CORE.data[KEY_ESP32][KEY_VARIANT] = config[CONF_VARIANT]
|
88
133
|
CORE.data[KEY_ESP32][KEY_EXTRA_BUILD_FILES] = {}
|
@@ -251,7 +296,7 @@ ARDUINO_PLATFORM_VERSION = cv.Version(5, 4, 0)
|
|
251
296
|
# The default/recommended esp-idf framework version
|
252
297
|
# - https://github.com/espressif/esp-idf/releases
|
253
298
|
# - https://api.registry.platformio.org/v3/packages/platformio/tool/framework-espidf
|
254
|
-
RECOMMENDED_ESP_IDF_FRAMEWORK_VERSION = cv.Version(5, 1,
|
299
|
+
RECOMMENDED_ESP_IDF_FRAMEWORK_VERSION = cv.Version(5, 1, 6)
|
255
300
|
# The platformio/espressif32 version to use for esp-idf frameworks
|
256
301
|
# - https://github.com/platformio/platform-espressif32/releases
|
257
302
|
# - https://api.registry.platformio.org/v3/packages/platformio/platform/espressif32
|
@@ -274,12 +319,15 @@ SUPPORTED_PLATFORMIO_ESP_IDF_5X = [
|
|
274
319
|
# pioarduino versions that don't require a release number
|
275
320
|
# List based on https://github.com/pioarduino/esp-idf/releases
|
276
321
|
SUPPORTED_PIOARDUINO_ESP_IDF_5X = [
|
322
|
+
cv.Version(5, 5, 0),
|
277
323
|
cv.Version(5, 4, 1),
|
278
324
|
cv.Version(5, 4, 0),
|
325
|
+
cv.Version(5, 3, 3),
|
279
326
|
cv.Version(5, 3, 2),
|
280
327
|
cv.Version(5, 3, 1),
|
281
328
|
cv.Version(5, 3, 0),
|
282
329
|
cv.Version(5, 1, 5),
|
330
|
+
cv.Version(5, 1, 6),
|
283
331
|
]
|
284
332
|
|
285
333
|
|
@@ -321,8 +369,8 @@ def _arduino_check_versions(value):
|
|
321
369
|
def _esp_idf_check_versions(value):
|
322
370
|
value = value.copy()
|
323
371
|
lookups = {
|
324
|
-
"dev": (cv.Version(5, 1,
|
325
|
-
"latest": (cv.Version(5, 1,
|
372
|
+
"dev": (cv.Version(5, 1, 6), "https://github.com/espressif/esp-idf.git"),
|
373
|
+
"latest": (cv.Version(5, 1, 6), None),
|
326
374
|
"recommended": (RECOMMENDED_ESP_IDF_FRAMEWORK_VERSION, None),
|
327
375
|
}
|
328
376
|
|
@@ -550,11 +598,15 @@ FLASH_SIZES = [
|
|
550
598
|
]
|
551
599
|
|
552
600
|
CONF_FLASH_SIZE = "flash_size"
|
601
|
+
CONF_CPU_FREQUENCY = "cpu_frequency"
|
553
602
|
CONF_PARTITIONS = "partitions"
|
554
603
|
CONFIG_SCHEMA = cv.All(
|
555
604
|
cv.Schema(
|
556
605
|
{
|
557
606
|
cv.Required(CONF_BOARD): cv.string_strict,
|
607
|
+
cv.Optional(CONF_CPU_FREQUENCY): cv.one_of(
|
608
|
+
*FULL_CPU_FREQUENCIES, upper=True
|
609
|
+
),
|
558
610
|
cv.Optional(CONF_FLASH_SIZE, default="4MB"): cv.one_of(
|
559
611
|
*FLASH_SIZES, upper=True
|
560
612
|
),
|
@@ -595,6 +647,7 @@ async def to_code(config):
|
|
595
647
|
os.path.join(os.path.dirname(__file__), "post_build.py.script"),
|
596
648
|
)
|
597
649
|
|
650
|
+
freq = config[CONF_CPU_FREQUENCY][:-3]
|
598
651
|
if conf[CONF_TYPE] == FRAMEWORK_ESP_IDF:
|
599
652
|
cg.add_platformio_option("framework", "espidf")
|
600
653
|
cg.add_build_flag("-DUSE_ESP_IDF")
|
@@ -628,6 +681,9 @@ async def to_code(config):
|
|
628
681
|
add_idf_sdkconfig_option("CONFIG_ESP_TASK_WDT_CHECK_IDLE_TASK_CPU0", False)
|
629
682
|
add_idf_sdkconfig_option("CONFIG_ESP_TASK_WDT_CHECK_IDLE_TASK_CPU1", False)
|
630
683
|
|
684
|
+
# Set default CPU frequency
|
685
|
+
add_idf_sdkconfig_option(f"CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ_{freq}", True)
|
686
|
+
|
631
687
|
cg.add_platformio_option("board_build.partitions", "partitions.csv")
|
632
688
|
if CONF_PARTITIONS in config:
|
633
689
|
add_extra_build_file(
|
@@ -693,6 +749,7 @@ async def to_code(config):
|
|
693
749
|
f"VERSION_CODE({framework_ver.major}, {framework_ver.minor}, {framework_ver.patch})"
|
694
750
|
),
|
695
751
|
)
|
752
|
+
cg.add(RawExpression(f"setCpuFrequencyMhz({freq})"))
|
696
753
|
|
697
754
|
|
698
755
|
APP_PARTITION_SIZES = {
|
@@ -13,11 +13,13 @@
|
|
13
13
|
#include <hal/cpu_hal.h>
|
14
14
|
|
15
15
|
#ifdef USE_ARDUINO
|
16
|
-
#include <
|
17
|
-
#
|
16
|
+
#include <Esp.h>
|
17
|
+
#else
|
18
|
+
#include <esp_clk_tree.h>
|
18
19
|
|
19
20
|
void setup();
|
20
21
|
void loop();
|
22
|
+
#endif
|
21
23
|
|
22
24
|
namespace esphome {
|
23
25
|
|
@@ -59,9 +61,13 @@ uint32_t arch_get_cpu_cycle_count() { return esp_cpu_get_cycle_count(); }
|
|
59
61
|
uint32_t arch_get_cpu_cycle_count() { return cpu_hal_get_cycle_count(); }
|
60
62
|
#endif
|
61
63
|
uint32_t arch_get_cpu_freq_hz() {
|
62
|
-
|
63
|
-
|
64
|
-
|
64
|
+
uint32_t freq = 0;
|
65
|
+
#ifdef USE_ESP_IDF
|
66
|
+
esp_clk_tree_src_get_freq_hz(SOC_MOD_CLK_CPU, ESP_CLK_TREE_SRC_FREQ_PRECISION_CACHED, &freq);
|
67
|
+
#elif defined(USE_ARDUINO)
|
68
|
+
freq = ESP.getCpuFreqMHz() * 1000000;
|
69
|
+
#endif
|
70
|
+
return freq;
|
65
71
|
}
|
66
72
|
|
67
73
|
#ifdef USE_ESP_IDF
|
@@ -2,42 +2,66 @@
|
|
2
2
|
|
3
3
|
#include "gpio.h"
|
4
4
|
#include "esphome/core/log.h"
|
5
|
+
#include "driver/gpio.h"
|
6
|
+
#include "driver/rtc_io.h"
|
7
|
+
#include "hal/gpio_hal.h"
|
8
|
+
#include "soc/soc_caps.h"
|
9
|
+
#include "soc/gpio_periph.h"
|
5
10
|
#include <cinttypes>
|
6
11
|
|
12
|
+
#if (SOC_RTCIO_PIN_COUNT > 0)
|
13
|
+
#include "hal/rtc_io_hal.h"
|
14
|
+
#endif
|
15
|
+
|
16
|
+
#ifndef SOC_GPIO_SUPPORT_RTC_INDEPENDENT
|
17
|
+
#define SOC_GPIO_SUPPORT_RTC_INDEPENDENT 0 // NOLINT
|
18
|
+
#endif
|
19
|
+
|
7
20
|
namespace esphome {
|
8
21
|
namespace esp32 {
|
9
22
|
|
10
23
|
static const char *const TAG = "esp32";
|
11
24
|
|
25
|
+
static const gpio_hal_context_t GPIO_HAL = {.dev = GPIO_HAL_GET_HW(GPIO_PORT_0)};
|
26
|
+
|
12
27
|
bool ESP32InternalGPIOPin::isr_service_installed = false; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables)
|
13
28
|
|
14
|
-
static gpio_mode_t
|
29
|
+
static gpio_mode_t flags_to_mode(gpio::Flags flags) {
|
15
30
|
flags = (gpio::Flags)(flags & ~(gpio::FLAG_PULLUP | gpio::FLAG_PULLDOWN));
|
16
|
-
if (flags == gpio::FLAG_INPUT)
|
31
|
+
if (flags == gpio::FLAG_INPUT)
|
17
32
|
return GPIO_MODE_INPUT;
|
18
|
-
|
33
|
+
if (flags == gpio::FLAG_OUTPUT)
|
19
34
|
return GPIO_MODE_OUTPUT;
|
20
|
-
|
35
|
+
if (flags == (gpio::FLAG_OUTPUT | gpio::FLAG_OPEN_DRAIN))
|
21
36
|
return GPIO_MODE_OUTPUT_OD;
|
22
|
-
|
37
|
+
if (flags == (gpio::FLAG_INPUT | gpio::FLAG_OUTPUT | gpio::FLAG_OPEN_DRAIN))
|
23
38
|
return GPIO_MODE_INPUT_OUTPUT_OD;
|
24
|
-
|
39
|
+
if (flags == (gpio::FLAG_INPUT | gpio::FLAG_OUTPUT))
|
25
40
|
return GPIO_MODE_INPUT_OUTPUT;
|
26
|
-
|
27
|
-
|
28
|
-
return GPIO_MODE_DISABLE;
|
29
|
-
}
|
41
|
+
// unsupported or gpio::FLAG_NONE
|
42
|
+
return GPIO_MODE_DISABLE;
|
30
43
|
}
|
31
44
|
|
32
45
|
struct ISRPinArg {
|
33
46
|
gpio_num_t pin;
|
47
|
+
gpio::Flags flags;
|
34
48
|
bool inverted;
|
49
|
+
#if defined(USE_ESP32_VARIANT_ESP32)
|
50
|
+
bool use_rtc;
|
51
|
+
int rtc_pin;
|
52
|
+
#endif
|
35
53
|
};
|
36
54
|
|
37
55
|
ISRInternalGPIOPin ESP32InternalGPIOPin::to_isr() const {
|
38
56
|
auto *arg = new ISRPinArg{}; // NOLINT(cppcoreguidelines-owning-memory)
|
39
|
-
arg->pin = pin_;
|
57
|
+
arg->pin = this->pin_;
|
58
|
+
arg->flags = gpio::FLAG_NONE;
|
40
59
|
arg->inverted = inverted_;
|
60
|
+
#if defined(USE_ESP32_VARIANT_ESP32)
|
61
|
+
arg->use_rtc = rtc_gpio_is_valid_gpio(this->pin_);
|
62
|
+
if (arg->use_rtc)
|
63
|
+
arg->rtc_pin = rtc_io_number_get(this->pin_);
|
64
|
+
#endif
|
41
65
|
return ISRInternalGPIOPin((void *) arg);
|
42
66
|
}
|
43
67
|
|
@@ -90,6 +114,7 @@ void ESP32InternalGPIOPin::setup() {
|
|
90
114
|
if (flags_ & gpio::FLAG_OUTPUT) {
|
91
115
|
gpio_set_drive_capability(pin_, drive_strength_);
|
92
116
|
}
|
117
|
+
ESP_LOGD(TAG, "rtc: %d", SOC_GPIO_SUPPORT_RTC_INDEPENDENT);
|
93
118
|
}
|
94
119
|
|
95
120
|
void ESP32InternalGPIOPin::pin_mode(gpio::Flags flags) {
|
@@ -115,28 +140,65 @@ void ESP32InternalGPIOPin::detach_interrupt() const { gpio_intr_disable(pin_); }
|
|
115
140
|
using namespace esp32;
|
116
141
|
|
117
142
|
bool IRAM_ATTR ISRInternalGPIOPin::digital_read() {
|
118
|
-
auto *arg = reinterpret_cast<ISRPinArg *>(arg_);
|
119
|
-
return bool(
|
143
|
+
auto *arg = reinterpret_cast<ISRPinArg *>(this->arg_);
|
144
|
+
return bool(gpio_hal_get_level(&GPIO_HAL, arg->pin)) != arg->inverted;
|
120
145
|
}
|
146
|
+
|
121
147
|
void IRAM_ATTR ISRInternalGPIOPin::digital_write(bool value) {
|
122
|
-
auto *arg = reinterpret_cast<ISRPinArg *>(arg_);
|
123
|
-
|
148
|
+
auto *arg = reinterpret_cast<ISRPinArg *>(this->arg_);
|
149
|
+
gpio_hal_set_level(&GPIO_HAL, arg->pin, value != arg->inverted);
|
124
150
|
}
|
151
|
+
|
125
152
|
void IRAM_ATTR ISRInternalGPIOPin::clear_interrupt() {
|
126
153
|
// not supported
|
127
154
|
}
|
155
|
+
|
128
156
|
void IRAM_ATTR ISRInternalGPIOPin::pin_mode(gpio::Flags flags) {
|
129
157
|
auto *arg = reinterpret_cast<ISRPinArg *>(arg_);
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
158
|
+
gpio::Flags diff = (gpio::Flags)(flags ^ arg->flags);
|
159
|
+
if (diff & gpio::FLAG_OUTPUT) {
|
160
|
+
if (flags & gpio::FLAG_OUTPUT) {
|
161
|
+
gpio_hal_output_enable(&GPIO_HAL, arg->pin);
|
162
|
+
if (flags & gpio::FLAG_OPEN_DRAIN)
|
163
|
+
gpio_hal_od_enable(&GPIO_HAL, arg->pin);
|
164
|
+
} else {
|
165
|
+
gpio_hal_output_disable(&GPIO_HAL, arg->pin);
|
166
|
+
}
|
167
|
+
}
|
168
|
+
if (diff & gpio::FLAG_INPUT) {
|
169
|
+
if (flags & gpio::FLAG_INPUT) {
|
170
|
+
gpio_hal_input_enable(&GPIO_HAL, arg->pin);
|
171
|
+
#if defined(USE_ESP32_VARIANT_ESP32)
|
172
|
+
if (arg->use_rtc) {
|
173
|
+
if (flags & gpio::FLAG_PULLUP) {
|
174
|
+
rtcio_hal_pullup_enable(arg->rtc_pin);
|
175
|
+
} else {
|
176
|
+
rtcio_hal_pullup_disable(arg->rtc_pin);
|
177
|
+
}
|
178
|
+
if (flags & gpio::FLAG_PULLDOWN) {
|
179
|
+
rtcio_hal_pulldown_enable(arg->rtc_pin);
|
180
|
+
} else {
|
181
|
+
rtcio_hal_pulldown_disable(arg->rtc_pin);
|
182
|
+
}
|
183
|
+
} else
|
184
|
+
#endif
|
185
|
+
{
|
186
|
+
if (flags & gpio::FLAG_PULLUP) {
|
187
|
+
gpio_hal_pullup_en(&GPIO_HAL, arg->pin);
|
188
|
+
} else {
|
189
|
+
gpio_hal_pullup_dis(&GPIO_HAL, arg->pin);
|
190
|
+
}
|
191
|
+
if (flags & gpio::FLAG_PULLDOWN) {
|
192
|
+
gpio_hal_pulldown_en(&GPIO_HAL, arg->pin);
|
193
|
+
} else {
|
194
|
+
gpio_hal_pulldown_dis(&GPIO_HAL, arg->pin);
|
195
|
+
}
|
196
|
+
}
|
197
|
+
} else {
|
198
|
+
gpio_hal_input_disable(&GPIO_HAL, arg->pin);
|
199
|
+
}
|
138
200
|
}
|
139
|
-
|
201
|
+
arg->flags = flags;
|
140
202
|
}
|
141
203
|
|
142
204
|
} // namespace esphome
|
esphome/components/esp32/gpio.py
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
from dataclasses import dataclass
|
2
2
|
import logging
|
3
|
-
from typing import Any
|
3
|
+
from typing import Any, Callable
|
4
4
|
|
5
5
|
from esphome import pins
|
6
6
|
import esphome.codegen as cg
|
@@ -64,8 +64,7 @@ def _lookup_pin(value):
|
|
64
64
|
def _translate_pin(value):
|
65
65
|
if isinstance(value, dict) or value is None:
|
66
66
|
raise cv.Invalid(
|
67
|
-
"This variable only supports pin numbers, not full pin schemas "
|
68
|
-
"(with inverted and mode)."
|
67
|
+
"This variable only supports pin numbers, not full pin schemas (with inverted and mode)."
|
69
68
|
)
|
70
69
|
if isinstance(value, int) and not isinstance(value, bool):
|
71
70
|
return value
|
@@ -82,30 +81,22 @@ def _translate_pin(value):
|
|
82
81
|
|
83
82
|
@dataclass
|
84
83
|
class ESP32ValidationFunctions:
|
85
|
-
pin_validation: Any
|
86
|
-
usage_validation: Any
|
84
|
+
pin_validation: Callable[[Any], Any]
|
85
|
+
usage_validation: Callable[[Any], Any]
|
87
86
|
|
88
87
|
|
89
88
|
_esp32_validations = {
|
90
89
|
VARIANT_ESP32: ESP32ValidationFunctions(
|
91
90
|
pin_validation=esp32_validate_gpio_pin, usage_validation=esp32_validate_supports
|
92
91
|
),
|
93
|
-
|
94
|
-
pin_validation=
|
95
|
-
usage_validation=
|
92
|
+
VARIANT_ESP32C2: ESP32ValidationFunctions(
|
93
|
+
pin_validation=esp32_c2_validate_gpio_pin,
|
94
|
+
usage_validation=esp32_c2_validate_supports,
|
96
95
|
),
|
97
96
|
VARIANT_ESP32C3: ESP32ValidationFunctions(
|
98
97
|
pin_validation=esp32_c3_validate_gpio_pin,
|
99
98
|
usage_validation=esp32_c3_validate_supports,
|
100
99
|
),
|
101
|
-
VARIANT_ESP32S3: ESP32ValidationFunctions(
|
102
|
-
pin_validation=esp32_s3_validate_gpio_pin,
|
103
|
-
usage_validation=esp32_s3_validate_supports,
|
104
|
-
),
|
105
|
-
VARIANT_ESP32C2: ESP32ValidationFunctions(
|
106
|
-
pin_validation=esp32_c2_validate_gpio_pin,
|
107
|
-
usage_validation=esp32_c2_validate_supports,
|
108
|
-
),
|
109
100
|
VARIANT_ESP32C6: ESP32ValidationFunctions(
|
110
101
|
pin_validation=esp32_c6_validate_gpio_pin,
|
111
102
|
usage_validation=esp32_c6_validate_supports,
|
@@ -114,6 +105,14 @@ _esp32_validations = {
|
|
114
105
|
pin_validation=esp32_h2_validate_gpio_pin,
|
115
106
|
usage_validation=esp32_h2_validate_supports,
|
116
107
|
),
|
108
|
+
VARIANT_ESP32S2: ESP32ValidationFunctions(
|
109
|
+
pin_validation=esp32_s2_validate_gpio_pin,
|
110
|
+
usage_validation=esp32_s2_validate_supports,
|
111
|
+
),
|
112
|
+
VARIANT_ESP32S3: ESP32ValidationFunctions(
|
113
|
+
pin_validation=esp32_s3_validate_gpio_pin,
|
114
|
+
usage_validation=esp32_s3_validate_supports,
|
115
|
+
),
|
117
116
|
}
|
118
117
|
|
119
118
|
|
@@ -31,8 +31,7 @@ def esp32_validate_gpio_pin(value):
|
|
31
31
|
)
|
32
32
|
if 9 <= value <= 10:
|
33
33
|
_LOGGER.warning(
|
34
|
-
"Pin %s (9-10) might already be used by the "
|
35
|
-
"flash interface in QUAD IO flash mode.",
|
34
|
+
"Pin %s (9-10) might already be used by the flash interface in QUAD IO flash mode.",
|
36
35
|
value,
|
37
36
|
)
|
38
37
|
if value in (24, 28, 29, 30, 31):
|
@@ -22,7 +22,7 @@ def esp32_c2_validate_supports(value):
|
|
22
22
|
is_input = mode[CONF_INPUT]
|
23
23
|
|
24
24
|
if num < 0 or num > 20:
|
25
|
-
raise cv.Invalid(f"Invalid pin number: {
|
25
|
+
raise cv.Invalid(f"Invalid pin number: {num} (must be 0-20)")
|
26
26
|
|
27
27
|
if is_input:
|
28
28
|
# All ESP32 pins support input mode
|
@@ -35,7 +35,7 @@ def esp32_c3_validate_supports(value):
|
|
35
35
|
is_input = mode[CONF_INPUT]
|
36
36
|
|
37
37
|
if num < 0 or num > 21:
|
38
|
-
raise cv.Invalid(f"Invalid pin number: {
|
38
|
+
raise cv.Invalid(f"Invalid pin number: {num} (must be 0-21)")
|
39
39
|
|
40
40
|
if is_input:
|
41
41
|
# All ESP32 pins support input mode
|
@@ -36,7 +36,7 @@ def esp32_c6_validate_supports(value):
|
|
36
36
|
is_input = mode[CONF_INPUT]
|
37
37
|
|
38
38
|
if num < 0 or num > 23:
|
39
|
-
raise cv.Invalid(f"Invalid pin number: {
|
39
|
+
raise cv.Invalid(f"Invalid pin number: {num} (must be 0-23)")
|
40
40
|
if is_input:
|
41
41
|
# All ESP32 pins support input mode
|
42
42
|
pass
|
@@ -45,7 +45,7 @@ def esp32_h2_validate_supports(value):
|
|
45
45
|
is_input = mode[CONF_INPUT]
|
46
46
|
|
47
47
|
if num < 0 or num > 27:
|
48
|
-
raise cv.Invalid(f"Invalid pin number: {
|
48
|
+
raise cv.Invalid(f"Invalid pin number: {num} (must be 0-27)")
|
49
49
|
if is_input:
|
50
50
|
# All ESP32 pins support input mode
|
51
51
|
pass
|
@@ -2,10 +2,6 @@
|
|
2
2
|
|
3
3
|
#include "ble.h"
|
4
4
|
|
5
|
-
#ifdef USE_ESP32_VARIANT_ESP32C6
|
6
|
-
#include "const_esp32c6.h"
|
7
|
-
#endif // USE_ESP32_VARIANT_ESP32C6
|
8
|
-
|
9
5
|
#include "esphome/core/application.h"
|
10
6
|
#include "esphome/core/log.h"
|
11
7
|
|
@@ -114,6 +110,7 @@ void ESP32BLE::advertising_init_() {
|
|
114
110
|
|
115
111
|
this->advertising_->set_scan_response(true);
|
116
112
|
this->advertising_->set_min_preferred_interval(0x06);
|
113
|
+
this->advertising_->set_appearance(this->appearance_);
|
117
114
|
}
|
118
115
|
|
119
116
|
bool ESP32BLE::ble_setup_() {
|
@@ -127,11 +124,7 @@ bool ESP32BLE::ble_setup_() {
|
|
127
124
|
if (esp_bt_controller_get_status() != ESP_BT_CONTROLLER_STATUS_ENABLED) {
|
128
125
|
// start bt controller
|
129
126
|
if (esp_bt_controller_get_status() == ESP_BT_CONTROLLER_STATUS_IDLE) {
|
130
|
-
#ifdef USE_ESP32_VARIANT_ESP32C6
|
131
|
-
esp_bt_controller_config_t cfg = BT_CONTROLLER_CONFIG;
|
132
|
-
#else
|
133
127
|
esp_bt_controller_config_t cfg = BT_CONTROLLER_INIT_CONFIG_DEFAULT();
|
134
|
-
#endif
|
135
128
|
err = esp_bt_controller_init(&cfg);
|
136
129
|
if (err != ESP_OK) {
|
137
130
|
ESP_LOGE(TAG, "esp_bt_controller_init failed: %s", esp_err_to_name(err));
|