esphome 2025.5.2__py3-none-any.whl → 2025.6.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 +20 -14
- esphome/components/a4988/a4988.cpp +1 -1
- esphome/components/absolute_humidity/absolute_humidity.cpp +6 -4
- esphome/components/ac_dimmer/ac_dimmer.cpp +4 -2
- esphome/components/adc/adc_sensor_esp32.cpp +5 -3
- esphome/components/adc/adc_sensor_esp8266.cpp +5 -3
- esphome/components/adc/adc_sensor_libretiny.cpp +5 -3
- esphome/components/adc/adc_sensor_rp2040.cpp +5 -3
- esphome/components/adc128s102/adc128s102.cpp +1 -1
- esphome/components/ade7880/ade7880.cpp +28 -17
- esphome/components/ade7953_base/ade7953_base.cpp +12 -9
- esphome/components/ade7953_i2c/ade7953_i2c.cpp +1 -1
- esphome/components/ade7953_spi/ade7953_spi.cpp +1 -1
- esphome/components/ads1115/ads1115.cpp +3 -5
- esphome/components/ads1118/ads1118.cpp +2 -1
- esphome/components/ags10/ags10.cpp +3 -2
- esphome/components/aht10/aht10.cpp +27 -29
- esphome/components/aic3204/aic3204.cpp +2 -2
- esphome/components/alarm_control_panel/__init__.py +1 -0
- esphome/components/am2315c/am2315c.cpp +2 -2
- esphome/components/am2320/am2320.cpp +2 -2
- esphome/components/am43/am43_base.h +1 -1
- esphome/components/am43/cover/am43_cover.cpp +4 -2
- esphome/components/analog_threshold/analog_threshold_binary_sensor.cpp +4 -2
- esphome/components/apds9306/apds9306.cpp +8 -5
- esphome/components/apds9960/apds9960.cpp +2 -2
- esphome/components/api/__init__.py +5 -0
- esphome/components/api/api_connection.cpp +753 -379
- esphome/components/api/api_connection.h +341 -283
- esphome/components/api/api_frame_helper.cpp +349 -344
- esphome/components/api/api_frame_helper.h +121 -94
- esphome/components/api/api_pb2.cpp +5 -0
- esphome/components/api/api_pb2.h +703 -227
- esphome/components/api/api_pb2_service.cpp +12 -688
- esphome/components/api/api_pb2_service.h +53 -207
- esphome/components/api/api_server.cpp +71 -29
- esphome/components/api/api_server.h +9 -0
- esphome/components/api/client.py +5 -4
- esphome/components/api/homeassistant_service.h +1 -1
- esphome/components/api/list_entities.cpp +1 -1
- esphome/components/api/proto.cpp +1 -0
- esphome/components/api/proto.h +5 -4
- esphome/components/api/subscribe_state.cpp +8 -16
- esphome/components/as3935/as3935.cpp +3 -3
- esphome/components/as5600/as5600.cpp +9 -7
- esphome/components/as7341/as7341.cpp +7 -5
- esphome/components/at581x/at581x.cpp +13 -10
- esphome/components/atm90e26/atm90e26.cpp +2 -2
- esphome/components/atm90e32/atm90e32.cpp +3 -3
- esphome/components/axs15231/touchscreen/axs15231_touchscreen.cpp +5 -3
- esphome/components/bang_bang/bang_bang_climate.cpp +8 -5
- esphome/components/bedjet/bedjet_hub.cpp +6 -4
- esphome/components/beken_spi_led_strip/led_strip.cpp +11 -7
- esphome/components/bh1750/bh1750.cpp +2 -2
- esphome/components/binary_sensor/__init__.py +1 -0
- esphome/components/binary_sensor/automation.cpp +1 -2
- esphome/components/bl0906/bl0906.cpp +1 -1
- esphome/components/bl0942/bl0942.cpp +11 -8
- esphome/components/bl0942/sensor.py +1 -1
- esphome/components/ble_client/__init__.py +5 -1
- esphome/components/ble_client/output/ble_binary_output.cpp +6 -3
- esphome/components/ble_client/sensor/ble_sensor.cpp +9 -6
- esphome/components/ble_client/text_sensor/ble_text_sensor.cpp +8 -5
- esphome/components/bluetooth_proxy/__init__.py +5 -1
- esphome/components/bluetooth_proxy/bluetooth_connection.cpp +5 -5
- esphome/components/bluetooth_proxy/bluetooth_proxy.cpp +18 -16
- esphome/components/bluetooth_proxy/bluetooth_proxy.h +1 -1
- esphome/components/bme280_base/bme280_base.cpp +5 -6
- esphome/components/bme680/bme680.cpp +3 -3
- esphome/components/bme680/sensor.py +2 -2
- esphome/components/bme680_bsec/bme680_bsec.cpp +11 -7
- esphome/components/bme680_bsec/sensor.py +7 -3
- esphome/components/bme68x_bsec2/__init__.py +6 -5
- esphome/components/bme68x_bsec2/bme68x_bsec2.cpp +17 -13
- esphome/components/bme68x_bsec2/sensor.py +4 -4
- esphome/components/bme68x_bsec2_i2c/bme68x_bsec2_i2c.cpp +1 -0
- esphome/components/bmi160/bmi160.cpp +11 -11
- esphome/components/bmp085/bmp085.cpp +2 -2
- esphome/components/bmp280_base/bmp280_base.cpp +3 -3
- esphome/components/bmp3xx_base/bmp3xx_base.cpp +13 -13
- esphome/components/bmp581/bmp581.cpp +33 -27
- esphome/components/bp1658cj/bp1658cj.cpp +5 -3
- esphome/components/bp5758d/bp5758d.cpp +1 -1
- esphome/components/button/__init__.py +1 -0
- esphome/components/canbus/canbus.cpp +1 -1
- esphome/components/cap1188/cap1188.cpp +6 -4
- esphome/components/captive_portal/captive_portal.cpp +1 -1
- esphome/components/ccs811/ccs811.cpp +3 -2
- esphome/components/cd74hc4067/cd74hc4067.cpp +1 -1
- esphome/components/ch422g/ch422g.cpp +2 -2
- esphome/components/chsc6x/chsc6x_touchscreen.cpp +6 -4
- esphome/components/climate/__init__.py +1 -0
- esphome/components/climate/climate.cpp +12 -7
- esphome/components/climate/climate.h +1 -1
- esphome/components/climate_ir/climate_ir.cpp +7 -4
- esphome/components/cm1106/__init__.py +1 -0
- esphome/components/cm1106/cm1106.cpp +112 -0
- esphome/components/cm1106/cm1106.h +40 -0
- esphome/components/cm1106/sensor.py +72 -0
- esphome/components/const/__init__.py +1 -0
- esphome/components/cover/__init__.py +1 -0
- esphome/components/cs5460a/cs5460a.cpp +16 -11
- esphome/components/cse7761/cse7761.cpp +2 -2
- esphome/components/cse7766/cse7766.cpp +0 -5
- esphome/components/cse7766/cse7766.h +5 -1
- esphome/components/cst226/touchscreen/cst226_touchscreen.cpp +1 -1
- esphome/components/cst816/touchscreen/cst816_touchscreen.cpp +6 -3
- esphome/components/current_based/current_based_cover.cpp +4 -2
- esphome/components/dac7678/dac7678_output.cpp +4 -4
- esphome/components/dallas_temp/dallas_temp.cpp +2 -3
- esphome/components/daly_bms/daly_bms.cpp +2 -1
- esphome/components/dashboard_import/__init__.py +1 -2
- esphome/components/datetime/__init__.py +3 -1
- esphome/components/datetime/date_entity.cpp +5 -5
- esphome/components/datetime/datetime_base.h +0 -5
- esphome/components/datetime/datetime_entity.cpp +8 -8
- esphome/components/datetime/time_entity.cpp +4 -4
- esphome/components/debug/debug_component.cpp +1 -1
- esphome/components/debug/debug_component.h +1 -1
- esphome/components/debug/debug_esp32.cpp +4 -2
- esphome/components/deep_sleep/deep_sleep_component.cpp +11 -5
- esphome/components/deep_sleep/deep_sleep_esp32.cpp +7 -5
- esphome/components/demo/__init__.py +206 -0
- esphome/components/demo/demo_alarm_control_panel.h +65 -0
- esphome/components/demo/demo_button.h +15 -0
- esphome/components/demo/demo_date.h +34 -0
- esphome/components/demo/demo_datetime.h +40 -0
- esphome/components/demo/demo_lock.h +17 -0
- esphome/components/demo/demo_select.h +15 -0
- esphome/components/demo/demo_text.h +18 -0
- esphome/components/demo/demo_time.h +34 -0
- esphome/components/demo/demo_valve.h +54 -0
- esphome/components/dfrobot_sen0395/commands.cpp +3 -3
- esphome/components/dht/dht.cpp +29 -50
- esphome/components/dht12/dht12.cpp +2 -2
- esphome/components/display/display.h +5 -3
- esphome/components/dps310/dps310.cpp +7 -5
- esphome/components/ds1307/ds1307.cpp +2 -2
- esphome/components/dsmr/dsmr.cpp +5 -3
- esphome/components/duty_cycle/duty_cycle_sensor.cpp +2 -2
- esphome/components/duty_time/duty_time_sensor.cpp +5 -3
- esphome/components/ee895/ee895.cpp +3 -3
- esphome/components/ektf2232/touchscreen/ektf2232.cpp +1 -1
- esphome/components/emc2101/emc2101.cpp +11 -9
- esphome/components/ens160_base/ens160_base.cpp +2 -2
- esphome/components/ens210/ens210.cpp +2 -2
- esphome/components/es7210/es7210.cpp +6 -4
- esphome/components/es7243e/es7243e.cpp +1 -1
- esphome/components/es8156/es8156.cpp +1 -1
- esphome/components/es8311/es8311.cpp +8 -6
- esphome/components/es8388/__init__.py +0 -0
- esphome/components/es8388/audio_dac.py +26 -0
- esphome/components/es8388/es8388.cpp +289 -0
- esphome/components/es8388/es8388.h +81 -0
- esphome/components/es8388/es8388_const.h +83 -0
- esphome/components/es8388/select/__init__.py +47 -0
- esphome/components/es8388/select/adc_input_mic_select.cpp +12 -0
- esphome/components/es8388/select/adc_input_mic_select.h +15 -0
- esphome/components/es8388/select/dac_output_select.cpp +12 -0
- esphome/components/es8388/select/dac_output_select.h +15 -0
- esphome/components/esp32/__init__.py +118 -23
- esphome/components/esp32/boards.py +208 -125
- esphome/components/esp32/const.py +6 -0
- esphome/components/esp32/gpio.py +14 -1
- esphome/components/esp32/gpio_esp32_c5.py +45 -0
- esphome/components/esp32/gpio_esp32_p4.py +43 -0
- esphome/components/esp32/preferences.cpp +7 -7
- esphome/components/esp32_ble/__init__.py +115 -0
- esphome/components/esp32_ble/ble.cpp +101 -54
- esphome/components/esp32_ble/ble.h +24 -5
- esphome/components/esp32_ble/ble_event.h +172 -32
- esphome/components/esp32_ble/ble_scan_result.h +24 -0
- esphome/components/esp32_ble/ble_uuid.h +1 -1
- esphome/components/esp32_ble/queue.h +53 -27
- esphome/components/esp32_ble_client/ble_client_base.cpp +4 -2
- esphome/components/esp32_ble_server/__init__.py +4 -1
- esphome/components/esp32_ble_server/ble_characteristic.cpp +1 -0
- esphome/components/esp32_ble_server/ble_server.h +0 -1
- esphome/components/esp32_ble_tracker/__init__.py +7 -2
- esphome/components/esp32_ble_tracker/esp32_ble_tracker.cpp +107 -75
- esphome/components/esp32_ble_tracker/esp32_ble_tracker.h +16 -16
- esphome/components/esp32_camera/esp32_camera.cpp +35 -27
- esphome/components/esp32_camera_web_server/camera_web_server.cpp +4 -2
- esphome/components/esp32_dac/esp32_dac.cpp +2 -2
- esphome/components/esp32_improv/__init__.py +5 -1
- esphome/components/esp32_improv/esp32_improv_component.cpp +2 -2
- esphome/components/esp32_rmt_led_strip/led_strip.cpp +11 -7
- esphome/components/esp32_rmt_led_strip/light.py +5 -1
- esphome/components/esp32_touch/esp32_touch.cpp +12 -8
- esphome/components/esp8266/preferences.cpp +6 -6
- esphome/components/esp8266_pwm/esp8266_pwm.cpp +3 -3
- esphome/components/esp_ldo/__init__.py +91 -0
- esphome/components/esp_ldo/esp_ldo.cpp +43 -0
- esphome/components/esp_ldo/esp_ldo.h +43 -0
- esphome/components/esphome/ota/ota_esphome.cpp +15 -8
- esphome/components/ethernet/ethernet_component.cpp +38 -26
- esphome/components/ethernet/ethernet_component.h +1 -1
- esphome/components/event/__init__.py +1 -0
- esphome/components/exposure_notifications/exposure_notifications.cpp +1 -1
- esphome/components/ezo/ezo.cpp +1 -1
- esphome/components/ezo_pmp/ezo_pmp.cpp +1 -1
- esphome/components/factory_reset/button/factory_reset_button.cpp +1 -1
- esphome/components/factory_reset/switch/factory_reset_switch.cpp +1 -1
- esphome/components/fan/__init__.py +1 -0
- esphome/components/fan/fan.cpp +30 -19
- esphome/components/fastled_base/fastled_light.cpp +7 -5
- esphome/components/fingerprint_grow/fingerprint_grow.cpp +8 -6
- esphome/components/fs3000/fs3000.cpp +1 -1
- esphome/components/ft5x06/touchscreen/ft5x06_touchscreen.cpp +7 -4
- esphome/components/ft63x6/ft63x6.cpp +5 -3
- esphome/components/gcja5/gcja5.cpp +0 -12
- esphome/components/gcja5/gcja5.h +8 -3
- esphome/components/gdk101/gdk101.cpp +2 -2
- esphome/components/globals/globals_component.h +13 -10
- esphome/components/gp2y1010au0f/gp2y1010au0f.cpp +4 -2
- esphome/components/gp8403/gp8403.cpp +4 -2
- esphome/components/gp8403/output/gp8403_output.cpp +4 -2
- esphome/components/gpio/one_wire/gpio_one_wire.cpp +2 -2
- esphome/components/gpio/output/gpio_binary_output.cpp +1 -1
- esphome/components/gpio/switch/gpio_switch.cpp +1 -1
- esphome/components/graphical_display_menu/graphical_display_menu.cpp +12 -8
- esphome/components/grove_gas_mc_v2/grove_gas_mc_v2.cpp +5 -6
- esphome/components/grove_tb6612fng/grove_tb6612fng.cpp +1 -1
- esphome/components/grove_tb6612fng/grove_tb6612fng.h +1 -1
- esphome/components/growatt_solar/growatt_solar.cpp +6 -3
- esphome/components/gt911/touchscreen/gt911_touchscreen.cpp +1 -1
- esphome/components/haier/haier_base.cpp +2 -2
- esphome/components/haier/hon_climate.cpp +13 -6
- esphome/components/havells_solar/havells_solar.cpp +5 -2
- esphome/components/hbridge/switch/hbridge_switch.cpp +1 -1
- esphome/components/hdc1080/hdc1080.cpp +2 -2
- esphome/components/he60r/he60r.cpp +4 -2
- esphome/components/hlw8012/hlw8012.cpp +6 -4
- esphome/components/hm3301/hm3301.cpp +2 -2
- esphome/components/hmc5883l/hmc5883l.cpp +2 -2
- esphome/components/homeassistant/time/homeassistant_time.cpp +4 -2
- esphome/components/honeywell_hih_i2c/honeywell_hih.cpp +4 -4
- esphome/components/honeywellabp/honeywellabp.cpp +4 -2
- esphome/components/honeywellabp2_i2c/honeywellabp2.cpp +8 -6
- esphome/components/hte501/hte501.cpp +3 -2
- esphome/components/http_request/__init__.py +2 -2
- esphome/components/http_request/http_request.cpp +7 -5
- esphome/components/http_request/http_request_idf.cpp +4 -2
- esphome/components/http_request/ota/ota_http_request.cpp +1 -1
- esphome/components/htu21d/htu21d.cpp +2 -2
- esphome/components/htu31d/htu31d.cpp +2 -2
- esphome/components/hx711/hx711.cpp +2 -2
- esphome/components/hydreon_rgxx/hydreon_rgxx.cpp +5 -3
- esphome/components/hyt271/hyt271.cpp +2 -2
- esphome/components/i2c/i2c_bus_arduino.cpp +14 -11
- esphome/components/i2c/i2c_bus_esp_idf.cpp +13 -11
- esphome/components/i2s_audio/__init__.py +2 -0
- esphome/components/i2s_audio/i2s_audio.cpp +3 -4
- esphome/components/i2s_audio/i2s_audio.h +1 -1
- esphome/components/i2s_audio/media_player/__init__.py +1 -1
- esphome/components/i2s_audio/media_player/i2s_audio_media_player.cpp +5 -3
- esphome/components/i2s_audio/microphone/i2s_audio_microphone.cpp +48 -30
- esphome/components/i2s_audio/microphone/i2s_audio_microphone.h +2 -0
- esphome/components/i2s_audio/speaker/i2s_audio_speaker.cpp +29 -11
- esphome/components/i2s_audio/speaker/i2s_audio_speaker.h +1 -0
- esphome/components/iaqcore/iaqcore.cpp +3 -3
- esphome/components/ili9xxx/ili9xxx_display.cpp +12 -7
- esphome/components/ili9xxx/ili9xxx_display.h +1 -1
- esphome/components/image/image.cpp +1 -0
- esphome/components/ina219/ina219.cpp +2 -2
- esphome/components/ina226/ina226.cpp +8 -5
- esphome/components/ina260/ina260.cpp +1 -1
- esphome/components/ina2xx_base/ina2xx_base.cpp +13 -9
- esphome/components/ina3221/ina3221.cpp +2 -2
- esphome/components/inkplate6/display.py +12 -2
- esphome/components/inkplate6/inkplate.cpp +13 -9
- esphome/components/inkplate6/inkplate.h +7 -6
- esphome/components/integration/integration_sensor.cpp +1 -1
- esphome/components/internal_temperature/internal_temperature.cpp +4 -4
- esphome/components/json/json_util.cpp +4 -5
- esphome/components/kamstrup_kmp/kamstrup_kmp.cpp +1 -1
- esphome/components/key_collector/key_collector.cpp +4 -2
- esphome/components/kmeteriso/kmeteriso.cpp +4 -4
- esphome/components/kuntze/kuntze.cpp +4 -2
- esphome/components/lc709203f/__init__.py +1 -0
- esphome/components/lc709203f/lc709203f.cpp +299 -0
- esphome/components/lc709203f/lc709203f.h +55 -0
- esphome/components/lc709203f/sensor.py +93 -0
- esphome/components/lcd_base/lcd_display.cpp +2 -2
- esphome/components/lcd_gpio/gpio_lcd_display.cpp +5 -3
- esphome/components/lcd_menu/lcd_menu.cpp +6 -4
- esphome/components/lcd_pcf8574/pcf8574_display.cpp +6 -4
- esphome/components/ld2410/ld2410.cpp +6 -7
- esphome/components/ld2420/ld2420.cpp +9 -7
- esphome/components/ld2450/ld2450.cpp +6 -4
- esphome/components/ld2450/sensor.py +2 -2
- esphome/components/ledc/ledc_output.cpp +32 -28
- esphome/components/libretiny/const.py +1 -1
- esphome/components/libretiny/preferences.cpp +6 -7
- esphome/components/light/__init__.py +2 -1
- esphome/components/light/esp_hsv_color.h +1 -1
- esphome/components/light/light_state.cpp +9 -5
- esphome/components/light/light_state.h +15 -15
- esphome/components/light/light_transformer.h +1 -1
- esphome/components/lightwaverf/LwTx.cpp +1 -1
- esphome/components/lightwaverf/lightwaverf.cpp +1 -1
- esphome/components/lilygo_t5_47/touchscreen/lilygo_t5_47_touchscreen.cpp +1 -1
- esphome/components/lock/__init__.py +1 -0
- esphome/components/lock/lock.h +1 -1
- esphome/components/logger/__init__.py +6 -0
- esphome/components/logger/logger.cpp +11 -20
- esphome/components/logger/logger.h +1 -2
- esphome/components/logger/logger_esp32.cpp +5 -5
- esphome/components/ltr390/ltr390.cpp +8 -5
- esphome/components/ltr501/ltr501.cpp +19 -14
- esphome/components/ltr_als_ps/ltr_als_ps.cpp +20 -13
- esphome/components/lvgl/__init__.py +2 -2
- esphome/components/lvgl/automation.py +5 -4
- esphome/components/lvgl/defines.py +0 -2
- esphome/components/lvgl/lv_validation.py +1 -3
- esphome/components/lvgl/lvcode.py +7 -8
- esphome/components/lvgl/lvgl_esphome.cpp +26 -10
- esphome/components/lvgl/schemas.py +22 -23
- esphome/components/lvgl/trigger.py +8 -3
- esphome/components/lvgl/widgets/__init__.py +2 -2
- esphome/components/lvgl/widgets/canvas.py +9 -3
- esphome/components/lvgl/widgets/line.py +2 -1
- esphome/components/lvgl/widgets/tabview.py +7 -0
- esphome/components/m5stack_8angle/m5stack_8angle.cpp +3 -3
- esphome/components/matrix_keypad/matrix_keypad.cpp +2 -2
- esphome/components/max17043/max17043.cpp +2 -2
- esphome/components/max31855/max31855.cpp +2 -1
- esphome/components/max31856/max31856.cpp +9 -11
- esphome/components/max31865/max31865.cpp +6 -4
- esphome/components/max44009/max44009.cpp +2 -2
- esphome/components/max6675/max6675.cpp +1 -1
- esphome/components/max6956/max6956.cpp +5 -3
- esphome/components/max7219/max7219.cpp +8 -6
- esphome/components/max7219digit/automation.h +52 -0
- esphome/components/max7219digit/display.py +93 -1
- esphome/components/max7219digit/max7219digit.cpp +16 -13
- esphome/components/max9611/max9611.cpp +9 -6
- esphome/components/mcp23008/mcp23008.cpp +1 -1
- esphome/components/mcp23016/mcp23016.cpp +1 -1
- esphome/components/mcp23017/mcp23017.cpp +1 -1
- esphome/components/mcp23s08/mcp23s08.cpp +1 -1
- esphome/components/mcp23s17/mcp23s17.cpp +1 -1
- esphome/components/mcp3008/mcp3008.cpp +1 -1
- esphome/components/mcp3008/sensor/mcp3008_sensor.cpp +5 -3
- esphome/components/mcp3204/mcp3204.cpp +1 -1
- esphome/components/mcp4461/mcp4461.cpp +2 -2
- esphome/components/mcp4725/mcp4725.cpp +2 -2
- esphome/components/mcp4728/mcp4728.cpp +2 -2
- esphome/components/mcp9600/mcp9600.cpp +1 -1
- esphome/components/mcp9808/mcp9808.cpp +4 -4
- esphome/components/mdns/mdns_component.cpp +8 -2
- esphome/components/mdns/mdns_component.h +3 -1
- esphome/components/mdns/mdns_esp32.cpp +2 -2
- esphome/components/media_player/__init__.py +1 -0
- esphome/components/micro_wake_word/micro_wake_word.cpp +1 -1
- esphome/components/micro_wake_word/streaming_model.cpp +10 -6
- esphome/components/micronova/micronova.h +2 -2
- esphome/components/mics_4514/mics_4514.cpp +2 -2
- esphome/components/midea/air_conditioner.cpp +7 -5
- esphome/components/midea_ir/midea_ir.cpp +1 -1
- esphome/components/mipi_spi/mipi_spi.cpp +24 -15
- esphome/components/mixer/speaker/mixer_speaker.cpp +8 -4
- esphome/components/mlx90393/sensor_mlx90393.cpp +2 -2
- esphome/components/mlx90614/mlx90614.cpp +4 -3
- esphome/components/mmc5603/mmc5603.cpp +2 -2
- esphome/components/mmc5983/mmc5983.cpp +1 -1
- esphome/components/modbus/modbus.cpp +7 -5
- esphome/components/modbus_controller/modbus_controller.cpp +6 -4
- esphome/components/modbus_controller/output/modbus_output.cpp +10 -6
- esphome/components/modbus_controller/switch/__init__.py +6 -2
- esphome/components/modbus_controller/switch/modbus_switch.cpp +4 -0
- esphome/components/modbus_controller/switch/modbus_switch.h +3 -0
- esphome/components/mpl3115a2/mpl3115a2.cpp +3 -2
- esphome/components/mpr121/mpr121.cpp +2 -2
- esphome/components/mpu6050/mpu6050.cpp +6 -6
- esphome/components/mpu6886/mpu6886.cpp +6 -6
- esphome/components/mqtt/mqtt_alarm_control_panel.cpp +7 -3
- esphome/components/mqtt/mqtt_backend_esp32.cpp +1 -1
- esphome/components/mqtt/mqtt_client.cpp +31 -24
- esphome/components/mqtt/mqtt_component.cpp +3 -3
- esphome/components/mqtt/mqtt_cover.cpp +8 -4
- esphome/components/mqtt/mqtt_fan.cpp +12 -6
- esphome/components/mqtt/mqtt_valve.cpp +4 -2
- esphome/components/ms5611/ms5611.cpp +2 -2
- esphome/components/ms8607/ms8607.cpp +2 -2
- esphome/components/msa3xx/msa3xx.cpp +16 -12
- esphome/components/my9231/my9231.cpp +7 -5
- esphome/components/nau7802/nau7802.cpp +6 -4
- esphome/components/neopixelbus/neopixelbus_light.h +2 -2
- esphome/components/network/ip_address.h +1 -1
- esphome/components/network/util.cpp +13 -0
- esphome/components/nextion/base_component.py +2 -0
- esphome/components/nextion/binary_sensor/nextion_binarysensor.cpp +3 -4
- esphome/components/nextion/display.py +34 -22
- esphome/components/nextion/nextion.cpp +182 -143
- esphome/components/nextion/nextion.h +36 -0
- esphome/components/nextion/nextion_commands.cpp +3 -3
- esphome/components/nextion/nextion_upload_arduino.cpp +69 -69
- esphome/components/nextion/nextion_upload_idf.cpp +79 -80
- esphome/components/nextion/sensor/nextion_sensor.cpp +5 -5
- esphome/components/nextion/switch/nextion_switch.cpp +2 -2
- esphome/components/nextion/text_sensor/nextion_textsensor.cpp +3 -3
- esphome/components/nfc/nci_message.h +1 -1
- esphome/components/nfc/ndef_record.h +1 -1
- esphome/components/nfc/ndef_record_text.h +1 -1
- esphome/components/nfc/ndef_record_uri.h +1 -1
- esphome/components/nfc/nfc.h +1 -1
- esphome/components/nfc/nfc_tag.h +1 -1
- esphome/components/noblex/noblex.cpp +1 -1
- esphome/components/npi19/npi19.cpp +5 -7
- esphome/components/number/__init__.py +11 -0
- esphome/components/number/number.cpp +1 -1
- esphome/components/number/number.h +0 -4
- esphome/components/online_image/__init__.py +13 -1
- esphome/components/online_image/online_image.cpp +26 -4
- esphome/components/online_image/online_image.h +21 -4
- esphome/components/opentherm/generate.py +3 -3
- esphome/components/opentherm/hub.cpp +11 -7
- esphome/components/opentherm/number/number.cpp +5 -3
- esphome/components/opentherm/opentherm.h +1 -1
- esphome/components/opentherm/schema.py +13 -13
- esphome/components/opentherm/validate.py +1 -1
- esphome/components/openthread/__init__.py +146 -0
- esphome/components/openthread/const.py +10 -0
- esphome/components/openthread/openthread.cpp +206 -0
- esphome/components/openthread/openthread.h +68 -0
- esphome/components/openthread/openthread_esp.cpp +164 -0
- esphome/components/openthread/tlv.py +58 -0
- esphome/components/openthread_info/__init__.py +0 -0
- esphome/components/openthread_info/openthread_info_text_sensor.cpp +24 -0
- esphome/components/openthread_info/openthread_info_text_sensor.h +218 -0
- esphome/components/openthread_info/text_sensor.py +105 -0
- esphome/components/output/float_output.cpp +1 -1
- esphome/components/output/switch/output_switch.cpp +1 -1
- esphome/components/packet_transport/packet_transport.cpp +6 -4
- esphome/components/pca6416a/pca6416a.cpp +2 -2
- esphome/components/pca9554/pca9554.cpp +6 -4
- esphome/components/pca9685/pca9685_output.cpp +12 -8
- esphome/components/pcd8544/pcd_8544.cpp +1 -1
- esphome/components/pcf85063/pcf85063.cpp +2 -2
- esphome/components/pcf8563/pcf8563.cpp +2 -2
- esphome/components/pcf8574/pcf8574.cpp +2 -2
- esphome/components/pid/pid_climate.cpp +8 -5
- esphome/components/pid/pid_climate.h +1 -1
- esphome/components/pid/sensor/pid_climate_sensor.cpp +1 -1
- esphome/components/pipsolar/output/pipsolar_output.cpp +1 -1
- esphome/components/pipsolar/pipsolar.cpp +3 -3
- esphome/components/pm1006/pm1006.cpp +3 -7
- esphome/components/pm1006/pm1006.h +4 -1
- esphome/components/pm2005/pm2005.cpp +12 -13
- esphome/components/pm2005/sensor.py +1 -1
- esphome/components/pmsa003i/pmsa003i.cpp +2 -2
- esphome/components/pmsx003/pmsx003.cpp +0 -4
- esphome/components/pmsx003/pmsx003.h +5 -2
- esphome/components/pmwcs3/pmwcs3.cpp +9 -13
- esphome/components/pmwcs3/pmwcs3.h +0 -1
- esphome/components/pn532/pn532.cpp +7 -7
- esphome/components/pn532/pn532.h +1 -1
- esphome/components/pn532_spi/pn532_spi.cpp +1 -1
- esphome/components/pn7150/pn7150.cpp +4 -4
- esphome/components/pn7160/pn7160.cpp +4 -4
- esphome/components/power_supply/power_supply.cpp +6 -4
- esphome/components/power_supply/power_supply.h +1 -1
- esphome/components/prometheus/__init__.py +0 -1
- esphome/components/psram/__init__.py +59 -35
- esphome/components/pulse_counter/pulse_counter_sensor.cpp +7 -4
- esphome/components/pvvx_mithermometer/display/pvvx_display.cpp +8 -5
- esphome/components/pylontech/pylontech.cpp +2 -2
- esphome/components/pylontech/sensor/pylontech_sensor.cpp +4 -2
- esphome/components/pylontech/text_sensor/pylontech_text_sensor.cpp +4 -2
- esphome/components/pzemac/pzemac.cpp +4 -2
- esphome/components/pzemdc/pzemdc.cpp +4 -2
- esphome/components/qmc5883l/qmc5883l.cpp +2 -2
- esphome/components/qmp6988/qmp6988.cpp +2 -2
- esphome/components/qmp6988/qmp6988.h +1 -1
- esphome/components/qr_code/qr_code.cpp +5 -3
- esphome/components/qspi_dbi/qspi_dbi.cpp +1 -1
- esphome/components/qwiic_pir/qwiic_pir.cpp +26 -28
- esphome/components/rc522/rc522.cpp +5 -5
- esphome/components/rdm6300/rdm6300.cpp +1 -0
- esphome/components/remote_receiver/__init__.py +10 -2
- esphome/components/remote_receiver/remote_receiver_esp32.cpp +22 -12
- esphome/components/remote_receiver/remote_receiver_esp8266.cpp +10 -7
- esphome/components/remote_receiver/remote_receiver_libretiny.cpp +10 -7
- esphome/components/remote_transmitter/__init__.py +10 -2
- esphome/components/remote_transmitter/remote_transmitter_esp32.cpp +10 -6
- esphome/components/remote_transmitter/remote_transmitter_esp8266.cpp +5 -3
- esphome/components/remote_transmitter/remote_transmitter_libretiny.cpp +5 -3
- esphome/components/resistance/resistance_sensor.cpp +6 -3
- esphome/components/restart/button/restart_button.cpp +1 -1
- esphome/components/restart/switch/restart_switch.cpp +1 -1
- esphome/components/rotary_encoder/rotary_encoder.cpp +2 -2
- esphome/components/rp2040/__init__.py +7 -0
- esphome/components/rp2040/core.cpp +8 -1
- esphome/components/rp2040/preferences.cpp +3 -3
- esphome/components/rp2040_pio_led_strip/led_strip.cpp +11 -8
- esphome/components/rp2040_pio_led_strip/light.py +1 -1
- esphome/components/rp2040_pwm/rp2040_pwm.cpp +1 -1
- esphome/components/rpi_dpi_rgb/rpi_dpi_rgb.cpp +1 -1
- esphome/components/rtttl/rtttl.cpp +11 -9
- esphome/components/safe_mode/button/safe_mode_button.cpp +1 -1
- esphome/components/safe_mode/safe_mode.cpp +9 -8
- esphome/components/safe_mode/switch/safe_mode_switch.cpp +1 -1
- esphome/components/scd30/scd30.cpp +11 -8
- esphome/components/scd4x/scd4x.cpp +12 -8
- esphome/components/sdl/display.py +40 -0
- esphome/components/sdl/sdl_esphome.cpp +2 -2
- esphome/components/sdl/sdl_esphome.h +8 -0
- esphome/components/sdm_meter/sdm_meter.cpp +5 -2
- esphome/components/sdp3x/sdp3x.cpp +11 -11
- esphome/components/sds011/sds011.cpp +5 -6
- esphome/components/sds011/sds011.h +4 -1
- esphome/components/seeed_mr24hpc1/seeed_mr24hpc1.cpp +3 -2
- esphome/components/seeed_mr60bha2/seeed_mr60bha2.cpp +1 -0
- esphome/components/seeed_mr60fda2/seeed_mr60fda2.cpp +3 -2
- esphome/components/selec_meter/selec_meter.cpp +5 -2
- esphome/components/select/__init__.py +1 -0
- esphome/components/select/select.cpp +1 -1
- esphome/components/select/select.h +0 -4
- esphome/components/sen0321/sen0321.cpp +2 -2
- esphome/components/sen21231/sen21231.cpp +1 -1
- esphome/components/sen5x/sen5x.cpp +10 -7
- esphome/components/sensirion_common/i2c_sensirion.cpp +2 -1
- esphome/components/sensirion_common/i2c_sensirion.h +1 -0
- esphome/components/sensor/__init__.py +11 -1
- esphome/components/sensor/filter.h +1 -1
- esphome/components/sensor/sensor.cpp +8 -4
- esphome/components/sensor/sensor.h +12 -11
- esphome/components/servo/servo.cpp +12 -9
- esphome/components/servo/servo.h +1 -1
- esphome/components/sfa30/sfa30.cpp +1 -1
- esphome/components/sgp30/sgp30.cpp +10 -8
- esphome/components/sgp4x/sgp4x.cpp +49 -61
- esphome/components/sgp4x/sgp4x.h +0 -1
- esphome/components/shelly_dimmer/shelly_dimmer.cpp +11 -7
- esphome/components/sht3xd/sht3xd.cpp +1 -1
- esphome/components/sht4x/sht4x.cpp +2 -2
- esphome/components/shtcx/shtcx.cpp +13 -16
- esphome/components/shutdown/button/shutdown_button.cpp +1 -1
- esphome/components/shutdown/switch/shutdown_switch.cpp +1 -1
- esphome/components/sim800l/sim800l.cpp +2 -2
- esphome/components/slow_pwm/slow_pwm_output.cpp +4 -2
- esphome/components/sm16716/sm16716.cpp +1 -1
- esphome/components/sm2135/sm2135.cpp +1 -1
- esphome/components/sm2235/sm2235.cpp +5 -3
- esphome/components/sm2335/sm2335.cpp +5 -3
- esphome/components/sml/sml.cpp +1 -1
- esphome/components/sn74hc165/sn74hc165.cpp +1 -2
- esphome/components/sn74hc595/sn74hc595.cpp +1 -2
- esphome/components/sntp/sntp_component.cpp +1 -1
- esphome/components/socket/__init__.py +2 -0
- esphome/components/socket/bsd_sockets_impl.cpp +51 -7
- esphome/components/socket/lwip_raw_tcp_impl.cpp +5 -0
- esphome/components/socket/lwip_sockets_impl.cpp +51 -7
- esphome/components/socket/socket.cpp +31 -0
- esphome/components/socket/socket.h +27 -1
- esphome/components/sonoff_d1/sonoff_d1.cpp +7 -4
- esphome/components/sonoff_d1/sonoff_d1.h +2 -2
- esphome/components/sound_level/sound_level.cpp +4 -2
- esphome/components/speaker/media_player/__init__.py +3 -0
- esphome/components/speaker/media_player/speaker_media_player.cpp +1 -3
- esphome/components/speaker/media_player/speaker_media_player.h +6 -0
- esphome/components/spi/__init__.py +10 -2
- esphome/components/spi/spi.cpp +4 -4
- esphome/components/spi/spi_arduino.cpp +22 -9
- esphome/components/spi_device/spi_device.cpp +1 -2
- esphome/components/sprinkler/sprinkler.cpp +9 -6
- esphome/components/sps30/sps30.cpp +16 -15
- esphome/components/ssd1306_base/ssd1306_base.cpp +1 -1
- esphome/components/ssd1306_i2c/ssd1306_i2c.cpp +11 -8
- esphome/components/ssd1306_spi/ssd1306_spi.cpp +10 -7
- esphome/components/ssd1322_base/ssd1322_base.cpp +1 -1
- esphome/components/ssd1322_spi/ssd1322_spi.cpp +1 -1
- esphome/components/ssd1325_base/ssd1325_base.cpp +1 -1
- esphome/components/ssd1325_spi/ssd1325_spi.cpp +1 -1
- esphome/components/ssd1327_base/ssd1327_base.cpp +1 -1
- esphome/components/ssd1327_i2c/ssd1327_i2c.cpp +2 -2
- esphome/components/ssd1327_spi/ssd1327_spi.cpp +1 -1
- esphome/components/ssd1331_base/ssd1331_base.cpp +1 -1
- esphome/components/ssd1331_spi/ssd1331_spi.cpp +1 -1
- esphome/components/ssd1351_base/ssd1351_base.cpp +1 -1
- esphome/components/ssd1351_spi/ssd1351_spi.cpp +1 -1
- esphome/components/st7567_base/st7567_base.cpp +3 -3
- esphome/components/st7567_i2c/st7567_i2c.cpp +7 -5
- esphome/components/st7567_spi/st7567_spi.cpp +1 -1
- esphome/components/st7701s/st7701s.cpp +4 -2
- esphome/components/st7735/st7735.cpp +3 -3
- esphome/components/st7789v/st7789v.cpp +10 -7
- esphome/components/st7920/st7920.cpp +6 -4
- esphome/components/statsd/statsd.cpp +9 -5
- esphome/components/status_led/light/status_led_light.cpp +3 -3
- esphome/components/status_led/light/status_led_light.h +1 -1
- esphome/components/status_led/status_led.cpp +1 -1
- esphome/components/stepper/stepper.h +5 -3
- esphome/components/sts3x/sts3x.cpp +2 -2
- esphome/components/switch/__init__.py +1 -0
- esphome/components/switch/switch.cpp +18 -12
- esphome/components/switch/switch.h +14 -8
- esphome/components/sx1509/__init__.py +53 -20
- esphome/components/sx1509/sx1509.cpp +29 -5
- esphome/components/sx1509/sx1509.h +9 -1
- esphome/components/t6615/t6615.cpp +1 -0
- esphome/components/tc74/tc74.cpp +1 -1
- esphome/components/tca9548a/tca9548a.cpp +1 -1
- esphome/components/tca9555/tca9555.cpp +2 -2
- esphome/components/tcs34725/tcs34725.cpp +4 -4
- esphome/components/tee501/tee501.cpp +3 -2
- esphome/components/tem3200/tem3200.cpp +5 -6
- esphome/components/template/alarm_control_panel/__init__.py +6 -0
- esphome/components/template/alarm_control_panel/template_alarm_control_panel.cpp +43 -12
- esphome/components/template/alarm_control_panel/template_alarm_control_panel.h +4 -1
- esphome/components/template/cover/template_cover.cpp +1 -1
- esphome/components/template/select/template_select.cpp +6 -4
- esphome/components/template/text/template_text.cpp +2 -3
- esphome/components/template/valve/template_valve.cpp +5 -3
- esphome/components/text/__init__.py +10 -11
- esphome/components/text/text.cpp +1 -1
- esphome/components/text/text.h +0 -4
- esphome/components/text_sensor/__init__.py +1 -0
- esphome/components/text_sensor/text_sensor.cpp +8 -4
- esphome/components/text_sensor/text_sensor.h +6 -6
- esphome/components/thermostat/thermostat_climate.cpp +67 -43
- esphome/components/time/__init__.py +1 -2
- esphome/components/time_based/time_based_cover.cpp +4 -2
- esphome/components/tlc59208f/tlc59208f_output.cpp +8 -6
- esphome/components/tm1621/tm1621.cpp +3 -3
- esphome/components/tm1637/tm1637.cpp +9 -7
- esphome/components/tm1638/tm1638.cpp +7 -5
- esphome/components/tm1651/tm1651.cpp +2 -2
- esphome/components/tmp102/tmp102.cpp +1 -3
- esphome/components/tmp102/tmp102.h +0 -3
- esphome/components/tmp1075/tmp1075.cpp +12 -9
- esphome/components/tmp117/tmp117.cpp +2 -2
- esphome/components/tof10120/tof10120_sensor.cpp +2 -2
- esphome/components/tormatic/tormatic_cover.cpp +4 -2
- esphome/components/tsl2561/tsl2561.cpp +7 -5
- esphome/components/tsl2591/tsl2591.cpp +25 -27
- esphome/components/tt21100/touchscreen/tt21100.cpp +1 -1
- esphome/components/ttp229_bsf/ttp229_bsf.cpp +1 -1
- esphome/components/ttp229_lsf/ttp229_lsf.cpp +2 -2
- esphome/components/tuya/select/tuya_select.cpp +5 -3
- esphome/components/tx20/tx20.cpp +3 -3
- esphome/components/uart/__init__.py +4 -5
- esphome/components/uart/button/uart_button.cpp +1 -1
- esphome/components/uart/switch/uart_switch.cpp +2 -2
- esphome/components/uart/uart.cpp +2 -2
- esphome/components/uart/uart_component_esp32_arduino.cpp +8 -6
- esphome/components/uart/uart_component_esp8266.cpp +9 -7
- esphome/components/uart/uart_component_esp_idf.cpp +9 -7
- esphome/components/uart/uart_component_host.cpp +11 -8
- esphome/components/uart/uart_component_libretiny.cpp +8 -6
- esphome/components/uart/uart_component_rp2040.cpp +8 -6
- esphome/components/udp/udp_component.cpp +9 -5
- esphome/components/ufire_ec/ufire_ec.cpp +5 -3
- esphome/components/ufire_ise/ufire_ise.cpp +1 -1
- esphome/components/ultrasonic/ultrasonic_sensor.cpp +5 -3
- esphome/components/update/__init__.py +1 -0
- esphome/components/update/update_entity.cpp +1 -1
- esphome/components/update/update_entity.h +0 -3
- esphome/components/uponor_smatrix/climate/uponor_smatrix_climate.cpp +1 -1
- esphome/components/uponor_smatrix/sensor/uponor_smatrix_sensor.cpp +4 -2
- esphome/components/uponor_smatrix/uponor_smatrix.cpp +2 -1
- esphome/components/uptime/sensor/uptime_timestamp_sensor.cpp +1 -1
- esphome/components/usb_host/__init__.py +64 -0
- esphome/components/usb_host/usb_host.h +116 -0
- esphome/components/usb_host/usb_host_client.cpp +394 -0
- esphome/components/usb_host/usb_host_component.cpp +35 -0
- esphome/components/usb_uart/__init__.py +134 -0
- esphome/components/usb_uart/ch34x.cpp +80 -0
- esphome/components/usb_uart/cp210x.cpp +126 -0
- esphome/components/usb_uart/usb_uart.cpp +328 -0
- esphome/components/usb_uart/usb_uart.h +151 -0
- esphome/components/valve/__init__.py +1 -0
- esphome/components/veml3235/veml3235.cpp +13 -9
- esphome/components/veml7700/veml7700.cpp +10 -6
- esphome/components/voice_assistant/voice_assistant.cpp +7 -7
- esphome/components/wake_on_lan/wake_on_lan.cpp +1 -1
- esphome/components/waveshare_epaper/waveshare_epaper.cpp +1 -1
- esphome/components/web_server/server_index_v2.h +632 -630
- esphome/components/web_server/server_index_v3.h +411 -409
- esphome/components/web_server/web_server.cpp +5 -3
- esphome/components/web_server_base/web_server_base.cpp +1 -1
- esphome/components/web_server_idf/__init__.py +0 -2
- esphome/components/web_server_idf/utils.cpp +1 -1
- esphome/components/web_server_idf/web_server_idf.cpp +7 -3
- esphome/components/web_server_idf/web_server_idf.h +7 -0
- esphome/components/weikai/__init__.py +2 -0
- esphome/components/weikai/weikai.cpp +24 -22
- esphome/components/weikai_i2c/weikai_i2c.cpp +14 -9
- esphome/components/weikai_spi/weikai_spi.cpp +11 -6
- esphome/components/wiegand/wiegand.cpp +1 -1
- esphome/components/wifi/wifi_component.cpp +50 -37
- esphome/components/wifi/wifi_component.h +7 -4
- esphome/components/wifi/wifi_component_esp32_arduino.cpp +2 -2
- esphome/components/wifi/wifi_component_esp8266.cpp +3 -3
- esphome/components/wifi/wifi_component_libretiny.cpp +4 -4
- esphome/components/wireguard/wireguard.cpp +21 -21
- esphome/components/wl_134/text_sensor.py +1 -2
- esphome/components/wled/wled_light_effect.cpp +1 -1
- esphome/components/x9c/x9c.cpp +5 -3
- esphome/components/xgzp68xx/xgzp68xx.cpp +8 -6
- esphome/components/xiaomi_cgd1/xiaomi_cgd1.cpp +4 -2
- esphome/components/xiaomi_cgdk2/xiaomi_cgdk2.cpp +4 -2
- esphome/components/xiaomi_cgg1/xiaomi_cgg1.cpp +4 -2
- esphome/components/xiaomi_hhccjcy10/xiaomi_hhccjcy10.cpp +1 -1
- esphome/components/xiaomi_lywsd02mmc/xiaomi_lywsd02mmc.cpp +4 -2
- esphome/components/xiaomi_lywsd03mmc/xiaomi_lywsd03mmc.cpp +4 -2
- esphome/components/xiaomi_mhoc401/xiaomi_mhoc401.cpp +4 -2
- esphome/components/xl9535/xl9535.cpp +2 -2
- esphome/components/xpt2046/touchscreen/xpt2046.cpp +12 -11
- esphome/components/xpt2046/touchscreen/xpt2046.h +2 -2
- esphome/config.py +3 -2
- esphome/config_validation.py +46 -17
- esphome/const.py +10 -1
- esphome/core/__init__.py +37 -18
- esphome/core/application.cpp +197 -8
- esphome/core/application.h +116 -6
- esphome/core/component.cpp +36 -15
- esphome/core/component.h +43 -13
- esphome/core/config.py +12 -0
- esphome/core/defines.h +10 -2
- esphome/core/entity_base.cpp +4 -16
- esphome/core/entity_base.h +27 -13
- esphome/core/helpers.cpp +1 -1
- esphome/core/helpers.h +5 -5
- esphome/core/log.h +2 -0
- esphome/core/log_const_en.h +4 -0
- esphome/core/scheduler.cpp +2 -2
- esphome/coroutine.py +3 -4
- esphome/cpp_generator.py +32 -32
- esphome/dashboard/core.py +2 -2
- esphome/dashboard/web_server.py +2 -2
- esphome/git.py +4 -4
- esphome/helpers.py +5 -6
- esphome/loader.py +8 -7
- esphome/log.py +7 -1
- esphome/platformio_api.py +2 -3
- esphome/storage_json.py +13 -5
- esphome/types.py +12 -13
- esphome/util.py +1 -2
- esphome/wizard.py +0 -16
- esphome/writer.py +5 -3
- esphome/yaml_util.py +6 -1
- esphome/zeroconf.py +1 -1
- {esphome-2025.5.2.dist-info → esphome-2025.6.0.dist-info}/METADATA +12 -11
- {esphome-2025.5.2.dist-info → esphome-2025.6.0.dist-info}/RECORD +750 -696
- {esphome-2025.5.2.dist-info → esphome-2025.6.0.dist-info}/WHEEL +1 -1
- {esphome-2025.5.2.dist-info → esphome-2025.6.0.dist-info}/entry_points.txt +0 -0
- {esphome-2025.5.2.dist-info → esphome-2025.6.0.dist-info}/licenses/LICENSE +0 -0
- {esphome-2025.5.2.dist-info → esphome-2025.6.0.dist-info}/top_level.txt +0 -0
esphome/components/esp32/gpio.py
CHANGED
@@ -1,6 +1,7 @@
|
|
1
|
+
from collections.abc import Callable
|
1
2
|
from dataclasses import dataclass
|
2
3
|
import logging
|
3
|
-
from typing import Any
|
4
|
+
from typing import Any
|
4
5
|
|
5
6
|
from esphome import pins
|
6
7
|
import esphome.codegen as cg
|
@@ -26,8 +27,10 @@ from .const import (
|
|
26
27
|
VARIANT_ESP32,
|
27
28
|
VARIANT_ESP32C2,
|
28
29
|
VARIANT_ESP32C3,
|
30
|
+
VARIANT_ESP32C5,
|
29
31
|
VARIANT_ESP32C6,
|
30
32
|
VARIANT_ESP32H2,
|
33
|
+
VARIANT_ESP32P4,
|
31
34
|
VARIANT_ESP32S2,
|
32
35
|
VARIANT_ESP32S3,
|
33
36
|
esp32_ns,
|
@@ -35,8 +38,10 @@ from .const import (
|
|
35
38
|
from .gpio_esp32 import esp32_validate_gpio_pin, esp32_validate_supports
|
36
39
|
from .gpio_esp32_c2 import esp32_c2_validate_gpio_pin, esp32_c2_validate_supports
|
37
40
|
from .gpio_esp32_c3 import esp32_c3_validate_gpio_pin, esp32_c3_validate_supports
|
41
|
+
from .gpio_esp32_c5 import esp32_c5_validate_gpio_pin, esp32_c5_validate_supports
|
38
42
|
from .gpio_esp32_c6 import esp32_c6_validate_gpio_pin, esp32_c6_validate_supports
|
39
43
|
from .gpio_esp32_h2 import esp32_h2_validate_gpio_pin, esp32_h2_validate_supports
|
44
|
+
from .gpio_esp32_p4 import esp32_p4_validate_gpio_pin, esp32_p4_validate_supports
|
40
45
|
from .gpio_esp32_s2 import esp32_s2_validate_gpio_pin, esp32_s2_validate_supports
|
41
46
|
from .gpio_esp32_s3 import esp32_s3_validate_gpio_pin, esp32_s3_validate_supports
|
42
47
|
|
@@ -97,6 +102,10 @@ _esp32_validations = {
|
|
97
102
|
pin_validation=esp32_c3_validate_gpio_pin,
|
98
103
|
usage_validation=esp32_c3_validate_supports,
|
99
104
|
),
|
105
|
+
VARIANT_ESP32C5: ESP32ValidationFunctions(
|
106
|
+
pin_validation=esp32_c5_validate_gpio_pin,
|
107
|
+
usage_validation=esp32_c5_validate_supports,
|
108
|
+
),
|
100
109
|
VARIANT_ESP32C6: ESP32ValidationFunctions(
|
101
110
|
pin_validation=esp32_c6_validate_gpio_pin,
|
102
111
|
usage_validation=esp32_c6_validate_supports,
|
@@ -105,6 +114,10 @@ _esp32_validations = {
|
|
105
114
|
pin_validation=esp32_h2_validate_gpio_pin,
|
106
115
|
usage_validation=esp32_h2_validate_supports,
|
107
116
|
),
|
117
|
+
VARIANT_ESP32P4: ESP32ValidationFunctions(
|
118
|
+
pin_validation=esp32_p4_validate_gpio_pin,
|
119
|
+
usage_validation=esp32_p4_validate_supports,
|
120
|
+
),
|
108
121
|
VARIANT_ESP32S2: ESP32ValidationFunctions(
|
109
122
|
pin_validation=esp32_s2_validate_gpio_pin,
|
110
123
|
usage_validation=esp32_s2_validate_supports,
|
@@ -0,0 +1,45 @@
|
|
1
|
+
import logging
|
2
|
+
|
3
|
+
import esphome.config_validation as cv
|
4
|
+
from esphome.const import CONF_INPUT, CONF_MODE, CONF_NUMBER
|
5
|
+
from esphome.pins import check_strapping_pin
|
6
|
+
|
7
|
+
_ESP32C5_SPI_PSRAM_PINS = {
|
8
|
+
16: "SPICS0",
|
9
|
+
17: "SPIQ",
|
10
|
+
18: "SPIWP",
|
11
|
+
19: "VDD_SPI",
|
12
|
+
20: "SPIHD",
|
13
|
+
21: "SPICLK",
|
14
|
+
22: "SPID",
|
15
|
+
}
|
16
|
+
|
17
|
+
_ESP32C5_STRAPPING_PINS = {2, 7, 27, 28}
|
18
|
+
|
19
|
+
_LOGGER = logging.getLogger(__name__)
|
20
|
+
|
21
|
+
|
22
|
+
def esp32_c5_validate_gpio_pin(value):
|
23
|
+
if value < 0 or value > 28:
|
24
|
+
raise cv.Invalid(f"Invalid pin number: {value} (must be 0-28)")
|
25
|
+
if value in _ESP32C5_SPI_PSRAM_PINS:
|
26
|
+
raise cv.Invalid(
|
27
|
+
f"This pin cannot be used on ESP32-C5s and is already used by the SPI/PSRAM interface (function: {_ESP32C5_SPI_PSRAM_PINS[value]})"
|
28
|
+
)
|
29
|
+
|
30
|
+
return value
|
31
|
+
|
32
|
+
|
33
|
+
def esp32_c5_validate_supports(value):
|
34
|
+
num = value[CONF_NUMBER]
|
35
|
+
mode = value[CONF_MODE]
|
36
|
+
is_input = mode[CONF_INPUT]
|
37
|
+
|
38
|
+
if num < 0 or num > 28:
|
39
|
+
raise cv.Invalid(f"Invalid pin number: {num} (must be 0-28)")
|
40
|
+
if is_input:
|
41
|
+
# All ESP32 pins support input mode
|
42
|
+
pass
|
43
|
+
|
44
|
+
check_strapping_pin(value, _ESP32C5_STRAPPING_PINS, _LOGGER)
|
45
|
+
return value
|
@@ -0,0 +1,43 @@
|
|
1
|
+
import logging
|
2
|
+
|
3
|
+
import esphome.config_validation as cv
|
4
|
+
from esphome.const import CONF_INPUT, CONF_MODE, CONF_NUMBER
|
5
|
+
|
6
|
+
_ESP32P4_USB_JTAG_PINS = {24, 25}
|
7
|
+
|
8
|
+
_ESP32P4_STRAPPING_PINS = {34, 35, 36, 37, 38}
|
9
|
+
|
10
|
+
_LOGGER = logging.getLogger(__name__)
|
11
|
+
|
12
|
+
|
13
|
+
def esp32_p4_validate_gpio_pin(value):
|
14
|
+
if value < 0 or value > 54:
|
15
|
+
raise cv.Invalid(f"Invalid pin number: {value} (must be 0-54)")
|
16
|
+
if value in _ESP32P4_STRAPPING_PINS:
|
17
|
+
_LOGGER.warning(
|
18
|
+
"GPIO%d is a Strapping PIN and should be avoided.\n"
|
19
|
+
"Attaching external pullup/down resistors to strapping pins can cause unexpected failures.\n"
|
20
|
+
"See https://esphome.io/guides/faq.html#why-am-i-getting-a-warning-about-strapping-pins",
|
21
|
+
value,
|
22
|
+
)
|
23
|
+
if value in _ESP32P4_USB_JTAG_PINS:
|
24
|
+
_LOGGER.warning(
|
25
|
+
"GPIO%d is reserved for the USB-Serial-JTAG interface.\n"
|
26
|
+
"To use this pin as GPIO, USB-Serial-JTAG will be disabled.",
|
27
|
+
value,
|
28
|
+
)
|
29
|
+
|
30
|
+
return value
|
31
|
+
|
32
|
+
|
33
|
+
def esp32_p4_validate_supports(value):
|
34
|
+
num = value[CONF_NUMBER]
|
35
|
+
mode = value[CONF_MODE]
|
36
|
+
is_input = mode[CONF_INPUT]
|
37
|
+
|
38
|
+
if num < 0 or num > 54:
|
39
|
+
raise cv.Invalid(f"Invalid pin number: {value} (must be 0-54)")
|
40
|
+
if is_input:
|
41
|
+
# All ESP32 pins support input mode
|
42
|
+
pass
|
43
|
+
return value
|
@@ -1,8 +1,8 @@
|
|
1
1
|
#ifdef USE_ESP32
|
2
2
|
|
3
|
-
#include "esphome/core/preferences.h"
|
4
3
|
#include "esphome/core/helpers.h"
|
5
4
|
#include "esphome/core/log.h"
|
5
|
+
#include "esphome/core/preferences.h"
|
6
6
|
#include <nvs_flash.h>
|
7
7
|
#include <cstring>
|
8
8
|
#include <cinttypes>
|
@@ -84,7 +84,7 @@ class ESP32Preferences : public ESPPreferences {
|
|
84
84
|
if (err == 0)
|
85
85
|
return;
|
86
86
|
|
87
|
-
ESP_LOGW(TAG, "nvs_open failed: %s - erasing NVS
|
87
|
+
ESP_LOGW(TAG, "nvs_open failed: %s - erasing NVS", esp_err_to_name(err));
|
88
88
|
nvs_flash_deinit();
|
89
89
|
nvs_flash_erase();
|
90
90
|
nvs_flash_init();
|
@@ -111,7 +111,7 @@ class ESP32Preferences : public ESPPreferences {
|
|
111
111
|
if (s_pending_save.empty())
|
112
112
|
return true;
|
113
113
|
|
114
|
-
|
114
|
+
ESP_LOGV(TAG, "Saving %d items...", s_pending_save.size());
|
115
115
|
// goal try write all pending saves even if one fails
|
116
116
|
int cached = 0, written = 0, failed = 0;
|
117
117
|
esp_err_t last_err = ESP_OK;
|
@@ -139,10 +139,10 @@ class ESP32Preferences : public ESPPreferences {
|
|
139
139
|
}
|
140
140
|
s_pending_save.erase(s_pending_save.begin() + i);
|
141
141
|
}
|
142
|
-
ESP_LOGD(TAG, "
|
143
|
-
|
142
|
+
ESP_LOGD(TAG, "Writing %d items: %d cached, %d written, %d failed", cached + written + failed, cached, written,
|
143
|
+
failed);
|
144
144
|
if (failed > 0) {
|
145
|
-
ESP_LOGE(TAG, "
|
145
|
+
ESP_LOGE(TAG, "Writing %d items failed. Last error=%s for key=%s", failed, esp_err_to_name(last_err),
|
146
146
|
last_key.c_str());
|
147
147
|
}
|
148
148
|
|
@@ -173,7 +173,7 @@ class ESP32Preferences : public ESPPreferences {
|
|
173
173
|
}
|
174
174
|
|
175
175
|
bool reset() override {
|
176
|
-
ESP_LOGD(TAG, "
|
176
|
+
ESP_LOGD(TAG, "Erasing storage");
|
177
177
|
s_pending_save.clear();
|
178
178
|
|
179
179
|
nvs_flash_deinit();
|
@@ -1,3 +1,4 @@
|
|
1
|
+
from enum import Enum
|
1
2
|
import re
|
2
3
|
|
3
4
|
from esphome import automation
|
@@ -12,9 +13,110 @@ import esphome.final_validate as fv
|
|
12
13
|
DEPENDENCIES = ["esp32"]
|
13
14
|
CODEOWNERS = ["@jesserockz", "@Rapsssito"]
|
14
15
|
|
16
|
+
|
17
|
+
class BTLoggers(Enum):
|
18
|
+
"""Bluetooth logger categories available in ESP-IDF.
|
19
|
+
|
20
|
+
Each logger controls debug output for a specific Bluetooth subsystem.
|
21
|
+
The value is the ESP-IDF sdkconfig option name for controlling the log level.
|
22
|
+
"""
|
23
|
+
|
24
|
+
# Core Stack Layers
|
25
|
+
HCI = "CONFIG_BT_LOG_HCI_TRACE_LEVEL"
|
26
|
+
"""Host Controller Interface - Low-level interface between host and controller"""
|
27
|
+
|
28
|
+
BTM = "CONFIG_BT_LOG_BTM_TRACE_LEVEL"
|
29
|
+
"""Bluetooth Manager - Core device control, connections, and security"""
|
30
|
+
|
31
|
+
L2CAP = "CONFIG_BT_LOG_L2CAP_TRACE_LEVEL"
|
32
|
+
"""Logical Link Control and Adaptation Protocol - Connection multiplexing"""
|
33
|
+
|
34
|
+
RFCOMM = "CONFIG_BT_LOG_RFCOMM_TRACE_LEVEL"
|
35
|
+
"""Serial port emulation over Bluetooth (Classic only)"""
|
36
|
+
|
37
|
+
SDP = "CONFIG_BT_LOG_SDP_TRACE_LEVEL"
|
38
|
+
"""Service Discovery Protocol - Service discovery (Classic only)"""
|
39
|
+
|
40
|
+
GAP = "CONFIG_BT_LOG_GAP_TRACE_LEVEL"
|
41
|
+
"""Generic Access Profile - Device discovery and connections"""
|
42
|
+
|
43
|
+
# Network Protocols
|
44
|
+
BNEP = "CONFIG_BT_LOG_BNEP_TRACE_LEVEL"
|
45
|
+
"""Bluetooth Network Encapsulation Protocol - IP over Bluetooth"""
|
46
|
+
|
47
|
+
PAN = "CONFIG_BT_LOG_PAN_TRACE_LEVEL"
|
48
|
+
"""Personal Area Networking - Ethernet over Bluetooth"""
|
49
|
+
|
50
|
+
# Audio/Video Profiles (Classic Bluetooth)
|
51
|
+
A2D = "CONFIG_BT_LOG_A2D_TRACE_LEVEL"
|
52
|
+
"""Advanced Audio Distribution - A2DP audio streaming"""
|
53
|
+
|
54
|
+
AVDT = "CONFIG_BT_LOG_AVDT_TRACE_LEVEL"
|
55
|
+
"""Audio/Video Distribution Transport - A2DP transport protocol"""
|
56
|
+
|
57
|
+
AVCT = "CONFIG_BT_LOG_AVCT_TRACE_LEVEL"
|
58
|
+
"""Audio/Video Control Transport - AVRCP transport protocol"""
|
59
|
+
|
60
|
+
AVRC = "CONFIG_BT_LOG_AVRC_TRACE_LEVEL"
|
61
|
+
"""Audio/Video Remote Control - Media playback control"""
|
62
|
+
|
63
|
+
# Security
|
64
|
+
SMP = "CONFIG_BT_LOG_SMP_TRACE_LEVEL"
|
65
|
+
"""Security Manager Protocol - BLE pairing and encryption"""
|
66
|
+
|
67
|
+
# Application Layer
|
68
|
+
BTIF = "CONFIG_BT_LOG_BTIF_TRACE_LEVEL"
|
69
|
+
"""Bluetooth Interface - Application interface layer"""
|
70
|
+
|
71
|
+
BTC = "CONFIG_BT_LOG_BTC_TRACE_LEVEL"
|
72
|
+
"""Bluetooth Common - Task handling and coordination"""
|
73
|
+
|
74
|
+
# BLE Specific
|
75
|
+
BLE_SCAN = "CONFIG_BT_LOG_BLE_SCAN_TRACE_LEVEL"
|
76
|
+
"""BLE scanning operations"""
|
77
|
+
|
78
|
+
GATT = "CONFIG_BT_LOG_GATT_TRACE_LEVEL"
|
79
|
+
"""Generic Attribute Profile - BLE data exchange protocol"""
|
80
|
+
|
81
|
+
# Other Profiles
|
82
|
+
MCA = "CONFIG_BT_LOG_MCA_TRACE_LEVEL"
|
83
|
+
"""Multi-Channel Adaptation - Health device profile"""
|
84
|
+
|
85
|
+
HID = "CONFIG_BT_LOG_HID_TRACE_LEVEL"
|
86
|
+
"""Human Interface Device - Keyboards, mice, controllers"""
|
87
|
+
|
88
|
+
APPL = "CONFIG_BT_LOG_APPL_TRACE_LEVEL"
|
89
|
+
"""Application layer logging"""
|
90
|
+
|
91
|
+
OSI = "CONFIG_BT_LOG_OSI_TRACE_LEVEL"
|
92
|
+
"""OS abstraction layer - Threading, memory, timers"""
|
93
|
+
|
94
|
+
BLUFI = "CONFIG_BT_LOG_BLUFI_TRACE_LEVEL"
|
95
|
+
"""ESP32 WiFi provisioning over Bluetooth"""
|
96
|
+
|
97
|
+
|
98
|
+
# Set to track which loggers are needed by components
|
99
|
+
_required_loggers: set[BTLoggers] = set()
|
100
|
+
|
101
|
+
|
102
|
+
def register_bt_logger(*loggers: BTLoggers) -> None:
|
103
|
+
"""Register Bluetooth logger categories that a component needs.
|
104
|
+
|
105
|
+
Args:
|
106
|
+
*loggers: One or more BTLoggers enum members
|
107
|
+
"""
|
108
|
+
for logger in loggers:
|
109
|
+
if not isinstance(logger, BTLoggers):
|
110
|
+
raise TypeError(
|
111
|
+
f"Logger must be a BTLoggers enum member, got {type(logger)}"
|
112
|
+
)
|
113
|
+
_required_loggers.add(logger)
|
114
|
+
|
115
|
+
|
15
116
|
CONF_BLE_ID = "ble_id"
|
16
117
|
CONF_IO_CAPABILITY = "io_capability"
|
17
118
|
CONF_ADVERTISING_CYCLE_TIME = "advertising_cycle_time"
|
119
|
+
CONF_DISABLE_BT_LOGS = "disable_bt_logs"
|
18
120
|
|
19
121
|
NO_BLUETOOTH_VARIANTS = [const.VARIANT_ESP32S2]
|
20
122
|
|
@@ -62,6 +164,9 @@ CONFIG_SCHEMA = cv.Schema(
|
|
62
164
|
cv.Optional(
|
63
165
|
CONF_ADVERTISING_CYCLE_TIME, default="10s"
|
64
166
|
): cv.positive_time_period_milliseconds,
|
167
|
+
cv.SplitDefault(CONF_DISABLE_BT_LOGS, esp32_idf=True): cv.All(
|
168
|
+
cv.only_with_esp_idf, cv.boolean
|
169
|
+
),
|
65
170
|
}
|
66
171
|
).extend(cv.COMPONENT_SCHEMA)
|
67
172
|
|
@@ -140,6 +245,16 @@ async def to_code(config):
|
|
140
245
|
add_idf_sdkconfig_option("CONFIG_BT_ENABLED", True)
|
141
246
|
add_idf_sdkconfig_option("CONFIG_BT_BLE_42_FEATURES_SUPPORTED", True)
|
142
247
|
|
248
|
+
# Register the core BLE loggers that are always needed
|
249
|
+
register_bt_logger(BTLoggers.GAP, BTLoggers.BTM, BTLoggers.HCI)
|
250
|
+
|
251
|
+
# Apply logger settings if log disabling is enabled
|
252
|
+
if config.get(CONF_DISABLE_BT_LOGS, False):
|
253
|
+
# Disable all Bluetooth loggers that are not required
|
254
|
+
for logger in BTLoggers:
|
255
|
+
if logger not in _required_loggers:
|
256
|
+
add_idf_sdkconfig_option(f"{logger.value}_NONE", True)
|
257
|
+
|
143
258
|
cg.add_define("USE_ESP32_BLE")
|
144
259
|
|
145
260
|
|
@@ -28,7 +28,7 @@ static RAMAllocator<BLEEvent> EVENT_ALLOCATOR( // NOLINT(cppcoreguidelines-avoi
|
|
28
28
|
|
29
29
|
void ESP32BLE::setup() {
|
30
30
|
global_ble = this;
|
31
|
-
ESP_LOGCONFIG(TAG, "
|
31
|
+
ESP_LOGCONFIG(TAG, "Running setup");
|
32
32
|
|
33
33
|
if (!ble_pre_setup_()) {
|
34
34
|
ESP_LOGE(TAG, "BLE could not be prepared for configuration");
|
@@ -270,14 +270,14 @@ void ESP32BLE::loop() {
|
|
270
270
|
case BLE_COMPONENT_STATE_DISABLED:
|
271
271
|
return;
|
272
272
|
case BLE_COMPONENT_STATE_DISABLE: {
|
273
|
-
ESP_LOGD(TAG, "Disabling
|
273
|
+
ESP_LOGD(TAG, "Disabling");
|
274
274
|
|
275
275
|
for (auto *ble_event_handler : this->ble_status_event_handlers_) {
|
276
276
|
ble_event_handler->ble_before_disabled_event_handler();
|
277
277
|
}
|
278
278
|
|
279
279
|
if (!ble_dismantle_()) {
|
280
|
-
ESP_LOGE(TAG, "
|
280
|
+
ESP_LOGE(TAG, "Could not be dismantled");
|
281
281
|
this->mark_failed();
|
282
282
|
return;
|
283
283
|
}
|
@@ -285,11 +285,11 @@ void ESP32BLE::loop() {
|
|
285
285
|
return;
|
286
286
|
}
|
287
287
|
case BLE_COMPONENT_STATE_ENABLE: {
|
288
|
-
ESP_LOGD(TAG, "Enabling
|
288
|
+
ESP_LOGD(TAG, "Enabling");
|
289
289
|
this->state_ = BLE_COMPONENT_STATE_OFF;
|
290
290
|
|
291
291
|
if (!ble_setup_()) {
|
292
|
-
ESP_LOGE(TAG, "
|
292
|
+
ESP_LOGE(TAG, "Could not be set up");
|
293
293
|
this->mark_failed();
|
294
294
|
return;
|
295
295
|
}
|
@@ -304,20 +304,52 @@ void ESP32BLE::loop() {
|
|
304
304
|
BLEEvent *ble_event = this->ble_events_.pop();
|
305
305
|
while (ble_event != nullptr) {
|
306
306
|
switch (ble_event->type_) {
|
307
|
-
case BLEEvent::GATTS:
|
308
|
-
|
309
|
-
|
307
|
+
case BLEEvent::GATTS: {
|
308
|
+
esp_gatts_cb_event_t event = ble_event->event_.gatts.gatts_event;
|
309
|
+
esp_gatt_if_t gatts_if = ble_event->event_.gatts.gatts_if;
|
310
|
+
esp_ble_gatts_cb_param_t *param = ble_event->event_.gatts.gatts_param;
|
311
|
+
ESP_LOGV(TAG, "gatts_event [esp_gatt_if: %d] - %d", gatts_if, event);
|
312
|
+
for (auto *gatts_handler : this->gatts_event_handlers_) {
|
313
|
+
gatts_handler->gatts_event_handler(event, gatts_if, param);
|
314
|
+
}
|
310
315
|
break;
|
311
|
-
|
312
|
-
|
313
|
-
|
316
|
+
}
|
317
|
+
case BLEEvent::GATTC: {
|
318
|
+
esp_gattc_cb_event_t event = ble_event->event_.gattc.gattc_event;
|
319
|
+
esp_gatt_if_t gattc_if = ble_event->event_.gattc.gattc_if;
|
320
|
+
esp_ble_gattc_cb_param_t *param = ble_event->event_.gattc.gattc_param;
|
321
|
+
ESP_LOGV(TAG, "gattc_event [esp_gatt_if: %d] - %d", gattc_if, event);
|
322
|
+
for (auto *gattc_handler : this->gattc_event_handlers_) {
|
323
|
+
gattc_handler->gattc_event_handler(event, gattc_if, param);
|
324
|
+
}
|
314
325
|
break;
|
315
|
-
|
316
|
-
|
326
|
+
}
|
327
|
+
case BLEEvent::GAP: {
|
328
|
+
esp_gap_ble_cb_event_t gap_event = ble_event->event_.gap.gap_event;
|
329
|
+
if (gap_event == ESP_GAP_BLE_SCAN_RESULT_EVT) {
|
330
|
+
// Use the new scan event handler - no memcpy!
|
331
|
+
for (auto *scan_handler : this->gap_scan_event_handlers_) {
|
332
|
+
scan_handler->gap_scan_event_handler(ble_event->scan_result());
|
333
|
+
}
|
334
|
+
} else if (gap_event == ESP_GAP_BLE_SCAN_PARAM_SET_COMPLETE_EVT ||
|
335
|
+
gap_event == ESP_GAP_BLE_SCAN_START_COMPLETE_EVT ||
|
336
|
+
gap_event == ESP_GAP_BLE_SCAN_STOP_COMPLETE_EVT) {
|
337
|
+
// All three scan complete events have the same structure with just status
|
338
|
+
// The scan_complete struct matches ESP-IDF's layout exactly, so this reinterpret_cast is safe
|
339
|
+
// This is verified at compile-time by static_assert checks in ble_event.h
|
340
|
+
// The struct already contains our copy of the status (copied in BLEEvent constructor)
|
341
|
+
ESP_LOGV(TAG, "gap_event_handler - %d", gap_event);
|
342
|
+
for (auto *gap_handler : this->gap_event_handlers_) {
|
343
|
+
gap_handler->gap_event_handler(
|
344
|
+
gap_event, reinterpret_cast<esp_ble_gap_cb_param_t *>(&ble_event->event_.gap.scan_complete));
|
345
|
+
}
|
346
|
+
}
|
317
347
|
break;
|
348
|
+
}
|
318
349
|
default:
|
319
350
|
break;
|
320
351
|
}
|
352
|
+
// Destructor will clean up external allocations for GATTC/GATTS
|
321
353
|
ble_event->~BLEEvent();
|
322
354
|
EVENT_ALLOCATOR.deallocate(ble_event, 1);
|
323
355
|
ble_event = this->ble_events_.pop();
|
@@ -325,61 +357,74 @@ void ESP32BLE::loop() {
|
|
325
357
|
if (this->advertising_ != nullptr) {
|
326
358
|
this->advertising_->loop();
|
327
359
|
}
|
360
|
+
|
361
|
+
// Log dropped events periodically
|
362
|
+
size_t dropped = this->ble_events_.get_and_reset_dropped_count();
|
363
|
+
if (dropped > 0) {
|
364
|
+
ESP_LOGW(TAG, "Dropped %zu BLE events due to buffer overflow", dropped);
|
365
|
+
}
|
328
366
|
}
|
329
367
|
|
330
|
-
void
|
368
|
+
template<typename... Args> void enqueue_ble_event(Args... args) {
|
369
|
+
// Check if queue is full before allocating
|
370
|
+
if (global_ble->ble_events_.full()) {
|
371
|
+
// Queue is full, drop the event
|
372
|
+
global_ble->ble_events_.increment_dropped_count();
|
373
|
+
return;
|
374
|
+
}
|
375
|
+
|
331
376
|
BLEEvent *new_event = EVENT_ALLOCATOR.allocate(1);
|
332
377
|
if (new_event == nullptr) {
|
333
378
|
// Memory too fragmented to allocate new event. Can only drop it until memory comes back
|
379
|
+
global_ble->ble_events_.increment_dropped_count();
|
334
380
|
return;
|
335
381
|
}
|
336
|
-
new (new_event) BLEEvent(
|
337
|
-
|
382
|
+
new (new_event) BLEEvent(args...);
|
383
|
+
|
384
|
+
// Push the event - since we're the only producer and we checked full() above,
|
385
|
+
// this should always succeed unless we have a bug
|
386
|
+
if (!global_ble->ble_events_.push(new_event)) {
|
387
|
+
// This should not happen in SPSC queue with single producer
|
388
|
+
ESP_LOGE(TAG, "BLE queue push failed unexpectedly");
|
389
|
+
new_event->~BLEEvent();
|
390
|
+
EVENT_ALLOCATOR.deallocate(new_event, 1);
|
391
|
+
}
|
338
392
|
} // NOLINT(clang-analyzer-unix.Malloc)
|
339
393
|
|
340
|
-
|
341
|
-
|
342
|
-
|
343
|
-
|
394
|
+
// Explicit template instantiations for the friend function
|
395
|
+
template void enqueue_ble_event(esp_gap_ble_cb_event_t, esp_ble_gap_cb_param_t *);
|
396
|
+
template void enqueue_ble_event(esp_gatts_cb_event_t, esp_gatt_if_t, esp_ble_gatts_cb_param_t *);
|
397
|
+
template void enqueue_ble_event(esp_gattc_cb_event_t, esp_gatt_if_t, esp_ble_gattc_cb_param_t *);
|
398
|
+
|
399
|
+
void ESP32BLE::gap_event_handler(esp_gap_ble_cb_event_t event, esp_ble_gap_cb_param_t *param) {
|
400
|
+
switch (event) {
|
401
|
+
// Only queue the 4 GAP events we actually handle
|
402
|
+
case ESP_GAP_BLE_SCAN_RESULT_EVT:
|
403
|
+
case ESP_GAP_BLE_SCAN_PARAM_SET_COMPLETE_EVT:
|
404
|
+
case ESP_GAP_BLE_SCAN_START_COMPLETE_EVT:
|
405
|
+
case ESP_GAP_BLE_SCAN_STOP_COMPLETE_EVT:
|
406
|
+
enqueue_ble_event(event, param);
|
407
|
+
return;
|
408
|
+
|
409
|
+
// Ignore these GAP events as they are not relevant for our use case
|
410
|
+
case ESP_GAP_BLE_UPDATE_CONN_PARAMS_EVT:
|
411
|
+
case ESP_GAP_BLE_SET_PKT_LENGTH_COMPLETE_EVT:
|
412
|
+
return;
|
413
|
+
|
414
|
+
default:
|
415
|
+
break;
|
344
416
|
}
|
417
|
+
ESP_LOGW(TAG, "Ignoring unexpected GAP event type: %d", event);
|
345
418
|
}
|
346
419
|
|
347
420
|
void ESP32BLE::gatts_event_handler(esp_gatts_cb_event_t event, esp_gatt_if_t gatts_if,
|
348
421
|
esp_ble_gatts_cb_param_t *param) {
|
349
|
-
|
350
|
-
if (new_event == nullptr) {
|
351
|
-
// Memory too fragmented to allocate new event. Can only drop it until memory comes back
|
352
|
-
return;
|
353
|
-
}
|
354
|
-
new (new_event) BLEEvent(event, gatts_if, param);
|
355
|
-
global_ble->ble_events_.push(new_event);
|
356
|
-
} // NOLINT(clang-analyzer-unix.Malloc)
|
357
|
-
|
358
|
-
void ESP32BLE::real_gatts_event_handler_(esp_gatts_cb_event_t event, esp_gatt_if_t gatts_if,
|
359
|
-
esp_ble_gatts_cb_param_t *param) {
|
360
|
-
ESP_LOGV(TAG, "(BLE) gatts_event [esp_gatt_if: %d] - %d", gatts_if, event);
|
361
|
-
for (auto *gatts_handler : this->gatts_event_handlers_) {
|
362
|
-
gatts_handler->gatts_event_handler(event, gatts_if, param);
|
363
|
-
}
|
422
|
+
enqueue_ble_event(event, gatts_if, param);
|
364
423
|
}
|
365
424
|
|
366
425
|
void ESP32BLE::gattc_event_handler(esp_gattc_cb_event_t event, esp_gatt_if_t gattc_if,
|
367
426
|
esp_ble_gattc_cb_param_t *param) {
|
368
|
-
|
369
|
-
if (new_event == nullptr) {
|
370
|
-
// Memory too fragmented to allocate new event. Can only drop it until memory comes back
|
371
|
-
return;
|
372
|
-
}
|
373
|
-
new (new_event) BLEEvent(event, gattc_if, param);
|
374
|
-
global_ble->ble_events_.push(new_event);
|
375
|
-
} // NOLINT(clang-analyzer-unix.Malloc)
|
376
|
-
|
377
|
-
void ESP32BLE::real_gattc_event_handler_(esp_gattc_cb_event_t event, esp_gatt_if_t gattc_if,
|
378
|
-
esp_ble_gattc_cb_param_t *param) {
|
379
|
-
ESP_LOGV(TAG, "(BLE) gattc_event [esp_gatt_if: %d] - %d", gattc_if, event);
|
380
|
-
for (auto *gattc_handler : this->gattc_event_handlers_) {
|
381
|
-
gattc_handler->gattc_event_handler(event, gattc_if, param);
|
382
|
-
}
|
427
|
+
enqueue_ble_event(event, gattc_if, param);
|
383
428
|
}
|
384
429
|
|
385
430
|
float ESP32BLE::get_setup_priority() const { return setup_priority::BLUETOOTH; }
|
@@ -408,10 +453,12 @@ void ESP32BLE::dump_config() {
|
|
408
453
|
io_capability_s = "invalid";
|
409
454
|
break;
|
410
455
|
}
|
411
|
-
ESP_LOGCONFIG(TAG,
|
412
|
-
|
413
|
-
|
414
|
-
|
456
|
+
ESP_LOGCONFIG(TAG,
|
457
|
+
"ESP32 BLE:\n"
|
458
|
+
" MAC address: %02X:%02X:%02X:%02X:%02X:%02X\n"
|
459
|
+
" IO Capability: %s",
|
460
|
+
mac_address[0], mac_address[1], mac_address[2], mac_address[3], mac_address[4], mac_address[5],
|
461
|
+
io_capability_s);
|
415
462
|
} else {
|
416
463
|
ESP_LOGCONFIG(TAG, "ESP32 BLE: bluetooth stack is not enabled");
|
417
464
|
}
|
@@ -2,6 +2,7 @@
|
|
2
2
|
|
3
3
|
#include "ble_advertising.h"
|
4
4
|
#include "ble_uuid.h"
|
5
|
+
#include "ble_scan_result.h"
|
5
6
|
|
6
7
|
#include <functional>
|
7
8
|
|
@@ -22,6 +23,16 @@
|
|
22
23
|
namespace esphome {
|
23
24
|
namespace esp32_ble {
|
24
25
|
|
26
|
+
// Maximum number of BLE scan results to buffer
|
27
|
+
#ifdef USE_PSRAM
|
28
|
+
static constexpr uint8_t SCAN_RESULT_BUFFER_SIZE = 32;
|
29
|
+
#else
|
30
|
+
static constexpr uint8_t SCAN_RESULT_BUFFER_SIZE = 20;
|
31
|
+
#endif
|
32
|
+
|
33
|
+
// Maximum size of the BLE event queue - must be power of 2 for lock-free queue
|
34
|
+
static constexpr size_t MAX_BLE_QUEUE_SIZE = 64;
|
35
|
+
|
25
36
|
uint64_t ble_addr_to_uint64(const esp_bd_addr_t address);
|
26
37
|
|
27
38
|
// NOLINTNEXTLINE(modernize-use-using)
|
@@ -57,6 +68,11 @@ class GAPEventHandler {
|
|
57
68
|
virtual void gap_event_handler(esp_gap_ble_cb_event_t event, esp_ble_gap_cb_param_t *param) = 0;
|
58
69
|
};
|
59
70
|
|
71
|
+
class GAPScanEventHandler {
|
72
|
+
public:
|
73
|
+
virtual void gap_scan_event_handler(const BLEScanResult &scan_result) = 0;
|
74
|
+
};
|
75
|
+
|
60
76
|
class GATTcEventHandler {
|
61
77
|
public:
|
62
78
|
virtual void gattc_event_handler(esp_gattc_cb_event_t event, esp_gatt_if_t gattc_if,
|
@@ -101,6 +117,9 @@ class ESP32BLE : public Component {
|
|
101
117
|
void advertising_register_raw_advertisement_callback(std::function<void(bool)> &&callback);
|
102
118
|
|
103
119
|
void register_gap_event_handler(GAPEventHandler *handler) { this->gap_event_handlers_.push_back(handler); }
|
120
|
+
void register_gap_scan_event_handler(GAPScanEventHandler *handler) {
|
121
|
+
this->gap_scan_event_handlers_.push_back(handler);
|
122
|
+
}
|
104
123
|
void register_gattc_event_handler(GATTcEventHandler *handler) { this->gattc_event_handlers_.push_back(handler); }
|
105
124
|
void register_gatts_event_handler(GATTsEventHandler *handler) { this->gatts_event_handlers_.push_back(handler); }
|
106
125
|
void register_ble_status_event_handler(BLEStatusEventHandler *handler) {
|
@@ -113,22 +132,22 @@ class ESP32BLE : public Component {
|
|
113
132
|
static void gattc_event_handler(esp_gattc_cb_event_t event, esp_gatt_if_t gattc_if, esp_ble_gattc_cb_param_t *param);
|
114
133
|
static void gap_event_handler(esp_gap_ble_cb_event_t event, esp_ble_gap_cb_param_t *param);
|
115
134
|
|
116
|
-
void real_gatts_event_handler_(esp_gatts_cb_event_t event, esp_gatt_if_t gatts_if, esp_ble_gatts_cb_param_t *param);
|
117
|
-
void real_gattc_event_handler_(esp_gattc_cb_event_t event, esp_gatt_if_t gattc_if, esp_ble_gattc_cb_param_t *param);
|
118
|
-
void real_gap_event_handler_(esp_gap_ble_cb_event_t event, esp_ble_gap_cb_param_t *param);
|
119
|
-
|
120
135
|
bool ble_setup_();
|
121
136
|
bool ble_dismantle_();
|
122
137
|
bool ble_pre_setup_();
|
123
138
|
void advertising_init_();
|
124
139
|
|
140
|
+
private:
|
141
|
+
template<typename... Args> friend void enqueue_ble_event(Args... args);
|
142
|
+
|
125
143
|
std::vector<GAPEventHandler *> gap_event_handlers_;
|
144
|
+
std::vector<GAPScanEventHandler *> gap_scan_event_handlers_;
|
126
145
|
std::vector<GATTcEventHandler *> gattc_event_handlers_;
|
127
146
|
std::vector<GATTsEventHandler *> gatts_event_handlers_;
|
128
147
|
std::vector<BLEStatusEventHandler *> ble_status_event_handlers_;
|
129
148
|
BLEComponentState state_{BLE_COMPONENT_STATE_OFF};
|
130
149
|
|
131
|
-
|
150
|
+
LockFreeQueue<BLEEvent, MAX_BLE_QUEUE_SIZE> ble_events_;
|
132
151
|
BLEAdvertising *advertising_{};
|
133
152
|
esp_ble_io_cap_t io_cap_{ESP_IO_CAP_NONE};
|
134
153
|
uint32_t advertising_cycle_time_{};
|