esphome 2025.4.1__py3-none-any.whl → 2025.5.0__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 +416 -662
- esphome/components/api/api_connection.h +256 -57
- 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/as3935_i2c/as3935_i2c.h +0 -3
- esphome/components/as7341/as7341.h +1 -1
- esphome/components/at581x/at581x.h +4 -4
- 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 +8 -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/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 -8
- 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/__init__.py +1 -1
- esphome/components/esp32_camera/esp32_camera.cpp +2 -10
- 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/hlw8012/hlw8012.cpp +1 -1
- 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/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/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 +40 -6
- 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/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/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/weikai/weikai.cpp +0 -52
- 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 +27 -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/doxygen.h +13 -0
- 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.1.dist-info → esphome-2025.5.0.dist-info}/METADATA +10 -11
- {esphome-2025.4.1.dist-info → esphome-2025.5.0.dist-info}/RECORD +456 -396
- {esphome-2025.4.1.dist-info → esphome-2025.5.0.dist-info}/WHEEL +1 -1
- esphome/components/esp32_ble/const_esp32c6.h +0 -74
- {esphome-2025.4.1.dist-info → esphome-2025.5.0.dist-info}/entry_points.txt +0 -0
- {esphome-2025.4.1.dist-info → esphome-2025.5.0.dist-info}/licenses/LICENSE +0 -0
- {esphome-2025.4.1.dist-info → esphome-2025.5.0.dist-info}/top_level.txt +0 -0
@@ -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:");
|
@@ -27,14 +27,14 @@ CONFIG_SCHEMA = (
|
|
27
27
|
cv.Schema(
|
28
28
|
{
|
29
29
|
cv.GenerateID(): cv.declare_id(DPS310Component),
|
30
|
-
cv.
|
30
|
+
cv.Optional(CONF_TEMPERATURE): sensor.sensor_schema(
|
31
31
|
unit_of_measurement=UNIT_CELSIUS,
|
32
32
|
icon=ICON_THERMOMETER,
|
33
33
|
accuracy_decimals=1,
|
34
34
|
device_class=DEVICE_CLASS_TEMPERATURE,
|
35
35
|
state_class=STATE_CLASS_MEASUREMENT,
|
36
36
|
),
|
37
|
-
cv.
|
37
|
+
cv.Optional(CONF_PRESSURE): sensor.sensor_schema(
|
38
38
|
unit_of_measurement=UNIT_HECTOPASCAL,
|
39
39
|
icon=ICON_GAUGE,
|
40
40
|
accuracy_decimals=1,
|
@@ -53,10 +53,10 @@ async def to_code(config):
|
|
53
53
|
await cg.register_component(var, config)
|
54
54
|
await i2c.register_i2c_device(var, config)
|
55
55
|
|
56
|
-
if
|
57
|
-
sens = await sensor.new_sensor(
|
56
|
+
if temperature := config.get(CONF_TEMPERATURE):
|
57
|
+
sens = await sensor.new_sensor(temperature)
|
58
58
|
cg.add(var.set_temperature_sensor(sens))
|
59
59
|
|
60
|
-
if
|
61
|
-
sens = await sensor.new_sensor(
|
60
|
+
if pressure := config.get(CONF_PRESSURE):
|
61
|
+
sens = await sensor.new_sensor(pressure)
|
62
62
|
cg.add(var.set_pressure_sensor(sens))
|
@@ -26,19 +26,19 @@ CONFIG_SCHEMA = (
|
|
26
26
|
cv.Schema(
|
27
27
|
{
|
28
28
|
cv.GenerateID(): cv.declare_id(EE895Component),
|
29
|
-
cv.
|
29
|
+
cv.Optional(CONF_TEMPERATURE): sensor.sensor_schema(
|
30
30
|
unit_of_measurement=UNIT_CELSIUS,
|
31
31
|
accuracy_decimals=1,
|
32
32
|
device_class=DEVICE_CLASS_TEMPERATURE,
|
33
33
|
state_class=STATE_CLASS_MEASUREMENT,
|
34
34
|
),
|
35
|
-
cv.
|
35
|
+
cv.Optional(CONF_CO2): sensor.sensor_schema(
|
36
36
|
unit_of_measurement=UNIT_PARTS_PER_MILLION,
|
37
37
|
icon=ICON_MOLECULE_CO2,
|
38
38
|
accuracy_decimals=0,
|
39
39
|
state_class=STATE_CLASS_MEASUREMENT,
|
40
40
|
),
|
41
|
-
cv.
|
41
|
+
cv.Optional(CONF_PRESSURE): sensor.sensor_schema(
|
42
42
|
unit_of_measurement=UNIT_HECTOPASCAL,
|
43
43
|
accuracy_decimals=1,
|
44
44
|
device_class=DEVICE_CLASS_PRESSURE,
|
@@ -56,14 +56,14 @@ async def to_code(config):
|
|
56
56
|
await cg.register_component(var, config)
|
57
57
|
await i2c.register_i2c_device(var, config)
|
58
58
|
|
59
|
-
if
|
60
|
-
sens = await sensor.new_sensor(
|
59
|
+
if temperature := config.get(CONF_TEMPERATURE):
|
60
|
+
sens = await sensor.new_sensor(temperature)
|
61
61
|
cg.add(var.set_temperature_sensor(sens))
|
62
62
|
|
63
|
-
if
|
64
|
-
sens = await sensor.new_sensor(
|
63
|
+
if co2 := config.get(CONF_CO2):
|
64
|
+
sens = await sensor.new_sensor(co2)
|
65
65
|
cg.add(var.set_co2_sensor(sens))
|
66
66
|
|
67
|
-
if
|
68
|
-
sens = await sensor.new_sensor(
|
67
|
+
if pressure := config.get(CONF_PRESSURE):
|
68
|
+
sens = await sensor.new_sensor(pressure)
|
69
69
|
cg.add(var.set_pressure_sensor(sens))
|
@@ -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.climate_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,6 +1,7 @@
|
|
1
1
|
#include "endstop_cover.h"
|
2
2
|
#include "esphome/core/log.h"
|
3
3
|
#include "esphome/core/hal.h"
|
4
|
+
#include "esphome/core/application.h"
|
4
5
|
|
5
6
|
namespace esphome {
|
6
7
|
namespace endstop {
|
@@ -65,7 +66,7 @@ void EndstopCover::loop() {
|
|
65
66
|
if (this->current_operation == COVER_OPERATION_IDLE)
|
66
67
|
return;
|
67
68
|
|
68
|
-
const uint32_t now =
|
69
|
+
const uint32_t now = App.get_loop_component_start_time();
|
69
70
|
|
70
71
|
if (this->current_operation == COVER_OPERATION_OPENING && this->is_open_()) {
|
71
72
|
float dur = (now - this->start_dir_time_) / 1e3f;
|
@@ -28,21 +28,21 @@ UNIT_INDEX = "index"
|
|
28
28
|
|
29
29
|
CONFIG_SCHEMA_BASE = cv.Schema(
|
30
30
|
{
|
31
|
-
cv.
|
31
|
+
cv.Optional(CONF_ECO2): sensor.sensor_schema(
|
32
32
|
unit_of_measurement=UNIT_PARTS_PER_MILLION,
|
33
33
|
icon=ICON_MOLECULE_CO2,
|
34
34
|
accuracy_decimals=0,
|
35
35
|
device_class=DEVICE_CLASS_CARBON_DIOXIDE,
|
36
36
|
state_class=STATE_CLASS_MEASUREMENT,
|
37
37
|
),
|
38
|
-
cv.
|
38
|
+
cv.Optional(CONF_TVOC): sensor.sensor_schema(
|
39
39
|
unit_of_measurement=UNIT_PARTS_PER_BILLION,
|
40
40
|
icon=ICON_RADIATOR,
|
41
41
|
accuracy_decimals=0,
|
42
42
|
device_class=DEVICE_CLASS_VOLATILE_ORGANIC_COMPOUNDS_PARTS,
|
43
43
|
state_class=STATE_CLASS_MEASUREMENT,
|
44
44
|
),
|
45
|
-
cv.
|
45
|
+
cv.Optional(CONF_AQI): sensor.sensor_schema(
|
46
46
|
icon=ICON_CHEMICAL_WEAPON,
|
47
47
|
accuracy_decimals=0,
|
48
48
|
device_class=DEVICE_CLASS_AQI,
|
@@ -62,12 +62,15 @@ async def to_code_base(config):
|
|
62
62
|
var = cg.new_Pvariable(config[CONF_ID])
|
63
63
|
await cg.register_component(var, config)
|
64
64
|
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
65
|
+
if eco2_config := config.get(CONF_ECO2):
|
66
|
+
sens = await sensor.new_sensor(eco2_config)
|
67
|
+
cg.add(var.set_co2(sens))
|
68
|
+
if tvoc_config := config.get(CONF_TVOC):
|
69
|
+
sens = await sensor.new_sensor(tvoc_config)
|
70
|
+
cg.add(var.set_tvoc(sens))
|
71
|
+
if aqi_config := config.get(CONF_AQI):
|
72
|
+
sens = await sensor.new_sensor(aqi_config)
|
73
|
+
cg.add(var.set_aqi(sens))
|
71
74
|
|
72
75
|
if compensation_config := config.get(CONF_COMPENSATION):
|
73
76
|
sens = await cg.get_variable(compensation_config[CONF_TEMPERATURE])
|
@@ -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
|
|