esphome 2025.7.5__py3-none-any.whl → 2025.8.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 +190 -83
- esphome/automation.py +2 -4
- esphome/build_gen/__init__.py +0 -0
- esphome/build_gen/platformio.py +102 -0
- esphome/components/a4988/a4988.cpp +0 -1
- esphome/components/absolute_humidity/absolute_humidity.cpp +0 -2
- esphome/components/absolute_humidity/sensor.py +2 -2
- esphome/components/adc/__init__.py +123 -85
- esphome/components/adc/adc_sensor.h +98 -35
- esphome/components/adc/adc_sensor_common.cpp +10 -4
- esphome/components/adc/adc_sensor_esp32.cpp +291 -123
- esphome/components/adc/adc_sensor_esp8266.cpp +1 -4
- esphome/components/adc/adc_sensor_libretiny.cpp +1 -2
- esphome/components/adc/adc_sensor_rp2040.cpp +1 -2
- esphome/components/adc/adc_sensor_zephyr.cpp +207 -0
- esphome/components/adc/sensor.py +61 -27
- esphome/components/adc128s102/adc128s102.cpp +1 -4
- esphome/components/ade7880/sensor.py +75 -49
- esphome/components/ads1115/ads1115.cpp +0 -1
- esphome/components/ads1118/ads1118.cpp +0 -1
- esphome/components/ags10/ags10.cpp +0 -4
- esphome/components/aht10/aht10.cpp +0 -4
- esphome/components/aic3204/aic3204.cpp +0 -2
- esphome/components/airthings_wave_plus/__init__.py +1 -1
- esphome/components/airthings_wave_plus/airthings_wave_plus.cpp +22 -4
- esphome/components/airthings_wave_plus/airthings_wave_plus.h +10 -1
- esphome/components/airthings_wave_plus/sensor.py +55 -28
- esphome/components/alarm_control_panel/__init__.py +4 -9
- esphome/components/am2315c/am2315c.cpp +0 -2
- esphome/components/am2320/am2320.cpp +0 -1
- esphome/components/animation/__init__.py +14 -11
- esphome/components/apds9306/apds9306.cpp +0 -4
- esphome/components/apds9960/apds9960.cpp +0 -1
- esphome/components/api/__init__.py +29 -4
- esphome/components/api/api_connection.cpp +378 -401
- esphome/components/api/api_connection.h +102 -52
- esphome/components/api/api_frame_helper.cpp +69 -896
- esphome/components/api/api_frame_helper.h +31 -126
- esphome/components/api/api_frame_helper_noise.cpp +583 -0
- esphome/components/api/api_frame_helper_noise.h +68 -0
- esphome/components/api/api_frame_helper_plaintext.cpp +290 -0
- esphome/components/api/api_frame_helper_plaintext.h +53 -0
- esphome/components/api/api_noise_context.h +2 -4
- esphome/components/api/api_pb2.cpp +1601 -1808
- esphome/components/api/api_pb2.h +367 -323
- esphome/components/api/api_pb2_dump.cpp +1137 -3466
- esphome/components/api/api_pb2_includes.h +34 -0
- esphome/components/api/api_pb2_service.cpp +94 -105
- esphome/components/api/api_pb2_service.h +27 -16
- esphome/components/api/api_server.cpp +18 -17
- esphome/components/api/api_server.h +8 -5
- esphome/components/api/client.py +16 -8
- esphome/components/api/custom_api_device.h +68 -14
- esphome/components/api/homeassistant_service.h +24 -19
- esphome/components/api/list_entities.cpp +3 -5
- esphome/components/api/list_entities.h +2 -4
- esphome/components/api/proto.cpp +3 -5
- esphome/components/api/proto.h +239 -274
- esphome/components/api/subscribe_state.cpp +2 -4
- esphome/components/api/subscribe_state.h +2 -4
- esphome/components/api/user_services.cpp +2 -4
- esphome/components/api/user_services.h +8 -8
- esphome/components/as3935/as3935.cpp +0 -2
- esphome/components/as3935_spi/as3935_spi.cpp +0 -2
- esphome/components/as5600/__init__.py +1 -1
- esphome/components/as5600/as5600.cpp +0 -2
- esphome/components/as5600/sensor/__init__.py +0 -1
- esphome/components/as7341/as7341.cpp +0 -1
- esphome/components/async_tcp/__init__.py +1 -1
- esphome/components/at581x/at581x.cpp +1 -1
- esphome/components/atm90e26/atm90e26.cpp +0 -1
- esphome/components/atm90e32/atm90e32.cpp +475 -116
- esphome/components/atm90e32/atm90e32.h +43 -5
- esphome/components/audio/audio.h +2 -2
- esphome/components/axs15231/touchscreen/axs15231_touchscreen.cpp +0 -2
- esphome/components/beken_spi_led_strip/led_strip.cpp +0 -2
- esphome/components/bh1750/bh1750.cpp +0 -1
- esphome/components/binary_sensor/__init__.py +14 -12
- esphome/components/ble_client/__init__.py +4 -7
- esphome/components/bluetooth_proxy/__init__.py +40 -3
- esphome/components/bluetooth_proxy/bluetooth_connection.cpp +392 -81
- esphome/components/bluetooth_proxy/bluetooth_connection.h +16 -5
- esphome/components/bluetooth_proxy/bluetooth_proxy.cpp +102 -311
- esphome/components/bluetooth_proxy/bluetooth_proxy.h +30 -14
- esphome/components/bme280_base/bme280_base.cpp +15 -16
- esphome/components/bme680/bme680.cpp +2 -3
- esphome/components/bme680_bsec/bme680_bsec.cpp +0 -2
- esphome/components/bme68x_bsec2/bme68x_bsec2.cpp +0 -2
- esphome/components/bmi160/bmi160.cpp +0 -1
- esphome/components/bmp085/bmp085.cpp +0 -1
- esphome/components/bmp280_base/bmp280_base.cpp +13 -14
- esphome/components/bmp3xx_base/bmp3xx_base.cpp +0 -1
- esphome/components/bmp581/bmp581.cpp +0 -2
- esphome/components/bp1658cj/bp1658cj.cpp +0 -1
- esphome/components/bp5758d/bp5758d.cpp +0 -1
- esphome/components/button/__init__.py +0 -1
- esphome/components/canbus/__init__.py +2 -3
- esphome/components/canbus/canbus.cpp +0 -1
- esphome/components/cap1188/cap1188.cpp +0 -2
- esphome/components/captive_portal/__init__.py +1 -1
- esphome/components/cd74hc4067/cd74hc4067.cpp +0 -2
- esphome/components/ch422g/ch422g.cpp +0 -1
- esphome/components/chsc6x/chsc6x_touchscreen.cpp +0 -3
- esphome/components/climate/__init__.py +0 -1
- esphome/components/climate/climate_traits.h +24 -0
- esphome/components/cm1106/cm1106.cpp +0 -1
- esphome/components/const/__init__.py +6 -0
- esphome/components/cover/__init__.py +0 -1
- esphome/components/cover/cover.cpp +9 -13
- esphome/components/cs5460a/cs5460a.cpp +0 -2
- esphome/components/cse7761/cse7761.cpp +0 -1
- esphome/components/cst226/touchscreen/cst226_touchscreen.cpp +0 -2
- esphome/components/cst816/touchscreen/cst816_touchscreen.cpp +0 -2
- esphome/components/dac7678/dac7678_output.cpp +0 -2
- esphome/components/dallas_temp/dallas_temp.cpp +0 -1
- esphome/components/datetime/__init__.py +0 -2
- esphome/components/debug/__init__.py +15 -1
- esphome/components/debug/debug_zephyr.cpp +281 -0
- esphome/components/debug/sensor.py +2 -1
- esphome/components/deep_sleep/deep_sleep_component.cpp +0 -1
- esphome/components/deep_sleep/deep_sleep_esp32.cpp +20 -1
- esphome/components/dfrobot_sen0395/__init__.py +1 -2
- esphome/components/dht/dht.cpp +0 -1
- esphome/components/dht12/dht12.cpp +0 -1
- esphome/components/display/__init__.py +16 -3
- esphome/components/display_menu_base/__init__.py +1 -1
- esphome/components/dps310/dps310.cpp +0 -2
- esphome/components/ds1307/ds1307.cpp +0 -1
- esphome/components/ds2484/ds2484.cpp +0 -1
- esphome/components/duty_cycle/duty_cycle_sensor.cpp +0 -1
- esphome/components/ee895/ee895.cpp +0 -1
- esphome/components/ektf2232/touchscreen/ektf2232.cpp +0 -1
- esphome/components/emc2101/emc2101.cpp +0 -2
- esphome/components/ens160_base/ens160_base.cpp +0 -2
- esphome/components/ens210/ens210.cpp +0 -1
- esphome/components/es7210/es7210.cpp +0 -2
- esphome/components/es7243e/es7243e.cpp +0 -2
- esphome/components/es8156/es8156.cpp +0 -2
- esphome/components/es8311/es8311.cpp +0 -2
- esphome/components/es8388/es8388.cpp +0 -2
- esphome/components/esp32/__init__.py +203 -60
- esphome/components/esp32/boards.py +17 -0
- esphome/components/esp32/gpio.cpp +0 -1
- esphome/components/esp32/gpio.py +1 -2
- esphome/components/esp32/gpio_esp32_h2.py +2 -7
- esphome/components/esp32/gpio_esp32_p4.py +2 -7
- esphome/components/esp32/post_build.py.script +112 -61
- esphome/components/esp32_ble/__init__.py +41 -2
- esphome/components/esp32_ble/ble.cpp +14 -10
- esphome/components/esp32_ble/ble.h +18 -18
- esphome/components/esp32_ble/ble_advertising.cpp +5 -5
- esphome/components/esp32_ble/ble_advertising.h +7 -5
- esphome/components/esp32_ble/ble_event.h +139 -73
- esphome/components/esp32_ble/ble_scan_result.h +2 -4
- esphome/components/esp32_ble/ble_uuid.cpp +5 -5
- esphome/components/esp32_ble/ble_uuid.h +6 -5
- esphome/components/esp32_ble_beacon/__init__.py +4 -0
- esphome/components/esp32_ble_client/__init__.py +1 -1
- esphome/components/esp32_ble_client/ble_characteristic.cpp +4 -4
- esphome/components/esp32_ble_client/ble_characteristic.h +6 -4
- esphome/components/esp32_ble_client/ble_client_base.cpp +155 -104
- esphome/components/esp32_ble_client/ble_client_base.h +17 -6
- esphome/components/esp32_ble_client/ble_descriptor.h +6 -4
- esphome/components/esp32_ble_client/ble_service.cpp +4 -4
- esphome/components/esp32_ble_client/ble_service.h +6 -4
- esphome/components/esp32_ble_server/__init__.py +15 -12
- esphome/components/esp32_ble_tracker/__init__.py +79 -11
- esphome/components/esp32_ble_tracker/automation.h +4 -4
- esphome/components/esp32_ble_tracker/esp32_ble_tracker.cpp +264 -261
- esphome/components/esp32_ble_tracker/esp32_ble_tracker.h +103 -37
- esphome/components/esp32_camera/__init__.py +13 -1
- esphome/components/esp32_camera/esp32_camera.cpp +7 -2
- esphome/components/esp32_camera/esp32_camera.h +1 -0
- esphome/components/esp32_dac/esp32_dac.cpp +3 -19
- esphome/components/esp32_dac/esp32_dac.h +4 -8
- esphome/components/esp32_rmt_led_strip/led_strip.cpp +1 -6
- esphome/components/esp32_rmt_led_strip/light.py +1 -1
- esphome/components/esp32_touch/__init__.py +2 -3
- esphome/components/esp32_touch/esp32_touch.h +9 -6
- esphome/components/esp32_touch/esp32_touch_common.cpp +2 -0
- esphome/components/esp32_touch/esp32_touch_v1.cpp +7 -9
- esphome/components/esp32_touch/esp32_touch_v2.cpp +10 -6
- esphome/components/esp8266/__init__.py +3 -1
- esphome/components/esp8266_pwm/esp8266_pwm.cpp +0 -1
- esphome/components/esphome/ota/__init__.py +1 -2
- esphome/components/esphome/ota/ota_esphome.cpp +150 -77
- esphome/components/esphome/ota/ota_esphome.h +8 -1
- esphome/components/espnow/__init__.py +309 -0
- esphome/components/espnow/automation.h +175 -0
- esphome/components/espnow/espnow_component.cpp +468 -0
- esphome/components/espnow/espnow_component.h +183 -0
- esphome/components/espnow/espnow_err.h +19 -0
- esphome/components/espnow/espnow_packet.h +166 -0
- esphome/components/ethernet/__init__.py +7 -1
- esphome/components/ethernet/esp_eth_phy_jl1101.c +5 -0
- esphome/components/ethernet/ethernet_component.cpp +0 -1
- esphome/components/ethernet/ethernet_component.h +4 -0
- esphome/components/ethernet_info/ethernet_info_text_sensor.h +0 -3
- esphome/components/event/__init__.py +0 -1
- esphome/components/factory_reset/__init__.py +92 -0
- esphome/components/factory_reset/factory_reset.cpp +76 -0
- esphome/components/factory_reset/factory_reset.h +43 -0
- esphome/components/fan/__init__.py +0 -1
- esphome/components/fan/fan_traits.h +16 -0
- esphome/components/fastled_base/fastled_light.cpp +0 -1
- esphome/components/fastled_spi/light.py +1 -3
- esphome/components/fingerprint_grow/fingerprint_grow.cpp +0 -2
- esphome/components/fs3000/fs3000.cpp +0 -2
- esphome/components/ft5x06/touchscreen/ft5x06_touchscreen.cpp +0 -2
- esphome/components/ft63x6/ft63x6.cpp +0 -1
- esphome/components/gdk101/gdk101.cpp +0 -1
- esphome/components/gl_r01_i2c/gl_r01_i2c.cpp +0 -1
- esphome/components/gl_r01_i2c/sensor.py +1 -1
- esphome/components/gpio/one_wire/gpio_one_wire.cpp +0 -1
- esphome/components/gpio/switch/gpio_switch.cpp +0 -2
- esphome/components/gpio_expander/cached_gpio.h +24 -15
- esphome/components/gps/__init__.py +6 -2
- esphome/components/gps/gps.cpp +50 -49
- esphome/components/gps/gps.h +4 -8
- esphome/components/gps/time/gps_time.cpp +3 -9
- esphome/components/gps/time/gps_time.h +4 -7
- esphome/components/graph/__init__.py +1 -1
- esphome/components/grove_gas_mc_v2/grove_gas_mc_v2.cpp +0 -1
- esphome/components/grove_tb6612fng/grove_tb6612fng.cpp +0 -1
- esphome/components/gt911/touchscreen/gt911_touchscreen.cpp +21 -12
- esphome/components/gt911/touchscreen/gt911_touchscreen.h +26 -2
- esphome/components/haier/climate.py +5 -10
- esphome/components/haier/haier_base.cpp +0 -1
- esphome/components/hbridge/switch/hbridge_switch.cpp +0 -2
- esphome/components/hdc1080/hdc1080.cpp +0 -2
- esphome/components/heatpumpir/climate.py +2 -2
- esphome/components/hlw8012/hlw8012.cpp +0 -1
- esphome/components/hm3301/hm3301.cpp +0 -1
- esphome/components/hmc5883l/hmc5883l.cpp +0 -1
- esphome/components/homeassistant/__init__.py +1 -0
- esphome/components/homeassistant/number/__init__.py +1 -0
- esphome/components/homeassistant/number/homeassistant_number.cpp +11 -7
- esphome/components/homeassistant/switch/__init__.py +1 -0
- esphome/components/homeassistant/switch/homeassistant_switch.cpp +9 -5
- esphome/components/honeywellabp/honeywellabp.cpp +1 -4
- esphome/components/host/__init__.py +2 -0
- esphome/components/hte501/hte501.cpp +0 -1
- esphome/components/http_request/__init__.py +2 -3
- esphome/components/http_request/http_request_idf.cpp +2 -2
- esphome/components/htu21d/htu21d.cpp +0 -2
- esphome/components/htu31d/htu31d.cpp +0 -2
- esphome/components/hx711/hx711.cpp +0 -1
- esphome/components/hydreon_rgxx/hydreon_rgxx.cpp +0 -1
- esphome/components/hydreon_rgxx/sensor.py +4 -5
- esphome/components/i2c/i2c_bus.h +1 -1
- esphome/components/i2c/i2c_bus_arduino.cpp +1 -2
- esphome/components/i2c/i2c_bus_esp_idf.cpp +192 -17
- esphome/components/i2c/i2c_bus_esp_idf.h +11 -1
- esphome/components/i2s_audio/__init__.py +6 -5
- esphome/components/i2s_audio/i2s_audio.cpp +0 -2
- esphome/components/i2s_audio/media_player/i2s_audio_media_player.cpp +1 -4
- esphome/components/i2s_audio/microphone/__init__.py +4 -6
- esphome/components/i2s_audio/microphone/i2s_audio_microphone.cpp +0 -1
- esphome/components/i2s_audio/microphone/i2s_audio_microphone.h +2 -2
- esphome/components/i2s_audio/speaker/i2s_audio_speaker.cpp +273 -269
- esphome/components/i2s_audio/speaker/i2s_audio_speaker.h +19 -34
- esphome/components/ili9xxx/display.py +4 -3
- esphome/components/ili9xxx/ili9xxx_display.cpp +0 -2
- esphome/components/image/__init__.py +123 -92
- esphome/components/improv_serial/__init__.py +7 -8
- esphome/components/ina219/ina219.cpp +0 -1
- esphome/components/ina226/ina226.cpp +0 -2
- esphome/components/ina260/ina260.cpp +0 -2
- esphome/components/ina2xx_base/__init__.py +2 -5
- esphome/components/ina2xx_base/ina2xx_base.cpp +0 -2
- esphome/components/ina3221/ina3221.cpp +0 -1
- esphome/components/internal_temperature/internal_temperature.cpp +0 -2
- esphome/components/interval/interval.h +5 -9
- esphome/components/json/__init__.py +1 -1
- esphome/components/kmeteriso/kmeteriso.cpp +0 -2
- esphome/components/lc709203f/lc709203f.cpp +0 -2
- esphome/components/lcd_gpio/display.py +1 -3
- esphome/components/lcd_gpio/gpio_lcd_display.cpp +0 -1
- esphome/components/lcd_pcf8574/pcf8574_display.cpp +0 -1
- esphome/components/ld2410/__init__.py +4 -6
- esphome/components/ld2410/binary_sensor.py +4 -0
- esphome/components/ld2410/ld2410.cpp +56 -100
- esphome/components/ld2410/ld2410.h +17 -15
- esphome/components/ld2410/sensor.py +24 -10
- esphome/components/ld2412/__init__.py +46 -0
- esphome/components/ld2412/binary_sensor.py +70 -0
- esphome/components/ld2412/button/__init__.py +74 -0
- esphome/components/ld2412/button/factory_reset_button.cpp +9 -0
- esphome/components/ld2412/button/factory_reset_button.h +18 -0
- esphome/components/ld2412/button/query_button.cpp +9 -0
- esphome/components/ld2412/button/query_button.h +18 -0
- esphome/components/ld2412/button/restart_button.cpp +9 -0
- esphome/components/ld2412/button/restart_button.h +18 -0
- esphome/components/ld2412/button/start_dynamic_background_correction_button.cpp +11 -0
- esphome/components/ld2412/button/start_dynamic_background_correction_button.h +18 -0
- esphome/components/ld2412/ld2412.cpp +861 -0
- esphome/components/ld2412/ld2412.h +141 -0
- esphome/components/ld2412/number/__init__.py +126 -0
- esphome/components/ld2412/number/gate_threshold_number.cpp +14 -0
- esphome/components/ld2412/number/gate_threshold_number.h +19 -0
- esphome/components/ld2412/number/light_threshold_number.cpp +12 -0
- esphome/components/ld2412/number/light_threshold_number.h +18 -0
- esphome/components/ld2412/number/max_distance_timeout_number.cpp +12 -0
- esphome/components/ld2412/number/max_distance_timeout_number.h +18 -0
- esphome/components/ld2412/select/__init__.py +82 -0
- esphome/components/ld2412/select/baud_rate_select.cpp +12 -0
- esphome/components/ld2412/select/baud_rate_select.h +18 -0
- esphome/components/ld2412/select/distance_resolution_select.cpp +12 -0
- esphome/components/ld2412/select/distance_resolution_select.h +18 -0
- esphome/components/ld2412/select/light_out_control_select.cpp +12 -0
- esphome/components/ld2412/select/light_out_control_select.h +18 -0
- esphome/components/ld2412/sensor.py +124 -0
- esphome/components/ld2412/switch/__init__.py +45 -0
- esphome/components/ld2412/switch/bluetooth_switch.cpp +12 -0
- esphome/components/ld2412/switch/bluetooth_switch.h +18 -0
- esphome/components/ld2412/switch/engineering_mode_switch.cpp +12 -0
- esphome/components/ld2412/switch/engineering_mode_switch.h +18 -0
- esphome/components/ld2412/text_sensor.py +34 -0
- esphome/components/ld2420/ld2420.cpp +0 -1
- esphome/components/ld2450/__init__.py +3 -4
- esphome/components/ld2450/binary_sensor.py +3 -0
- esphome/components/ld2450/ld2450.cpp +77 -165
- esphome/components/ld2450/ld2450.h +26 -54
- esphome/components/ld2450/sensor.py +120 -6
- esphome/components/ld2450/text_sensor.py +5 -4
- esphome/components/ld24xx/__init__.py +1 -0
- esphome/components/ld24xx/ld24xx.h +65 -0
- esphome/components/ledc/ledc_output.cpp +0 -1
- esphome/components/libretiny/__init__.py +2 -0
- esphome/components/light/__init__.py +0 -1
- esphome/components/light/effects.py +70 -45
- esphome/components/light/light_call.cpp +101 -66
- esphome/components/light/light_color_values.h +16 -11
- esphome/components/light/light_json_schema.cpp +46 -44
- esphome/components/light/light_state.cpp +8 -11
- esphome/components/light/light_traits.h +17 -0
- esphome/components/lightwaverf/lightwaverf.cpp +0 -2
- esphome/components/lilygo_t5_47/touchscreen/lilygo_t5_47_touchscreen.cpp +0 -1
- esphome/components/lock/__init__.py +0 -1
- esphome/components/logger/__init__.py +31 -9
- esphome/components/logger/logger.cpp +12 -7
- esphome/components/logger/logger.h +25 -14
- esphome/components/logger/logger_esp32.cpp +2 -7
- esphome/components/logger/logger_esp8266.cpp +2 -4
- esphome/components/logger/logger_host.cpp +2 -4
- esphome/components/logger/logger_libretiny.cpp +2 -4
- esphome/components/logger/logger_rp2040.cpp +2 -4
- esphome/components/logger/logger_zephyr.cpp +86 -0
- esphome/components/logger/select/logger_level_select.cpp +2 -4
- esphome/components/logger/select/logger_level_select.h +2 -4
- esphome/components/logger/task_log_buffer.cpp +2 -4
- esphome/components/logger/task_log_buffer.h +2 -4
- esphome/components/lps22/sensor.py +5 -5
- esphome/components/ltr390/ltr390.cpp +0 -2
- esphome/components/ltr501/ltr501.cpp +0 -1
- esphome/components/ltr_als_ps/ltr_als_ps.cpp +0 -1
- esphome/components/lvgl/__init__.py +14 -13
- esphome/components/lvgl/automation.py +2 -4
- esphome/components/lvgl/defines.py +0 -2
- esphome/components/lvgl/helpers.py +1 -1
- esphome/components/lvgl/lv_validation.py +7 -4
- esphome/components/lvgl/lvgl_esphome.cpp +2 -3
- esphome/components/lvgl/styles.py +2 -2
- esphome/components/lvgl/types.py +1 -1
- esphome/components/lvgl/widgets/__init__.py +2 -2
- esphome/components/lvgl/widgets/arc.py +14 -11
- esphome/components/lvgl/widgets/buttonmatrix.py +1 -1
- esphome/components/lvgl/widgets/qrcode.py +7 -7
- esphome/components/lvgl/widgets/spinner.py +6 -6
- esphome/components/lvgl/widgets/switch.py +2 -2
- esphome/components/lvgl/widgets/tabview.py +3 -3
- esphome/components/m5stack_8angle/m5stack_8angle.cpp +0 -1
- esphome/components/matrix_keypad/__init__.py +4 -3
- esphome/components/max17043/max17043.cpp +0 -2
- esphome/components/max31855/max31855.cpp +1 -4
- esphome/components/max31856/max31856.cpp +0 -4
- esphome/components/max31865/max31865.cpp +0 -1
- esphome/components/max44009/max44009.cpp +0 -1
- esphome/components/max6675/max6675.cpp +1 -4
- esphome/components/max6956/max6956.cpp +0 -1
- esphome/components/max7219/max7219.cpp +0 -1
- esphome/components/max7219digit/display.py +1 -1
- esphome/components/max7219digit/max7219digit.cpp +0 -1
- esphome/components/max9611/max9611.cpp +0 -1
- esphome/components/mcp23008/__init__.py +1 -1
- esphome/components/mcp23008/mcp23008.cpp +0 -1
- esphome/components/mcp23016/mcp23016.cpp +0 -1
- esphome/components/mcp23017/__init__.py +1 -1
- esphome/components/mcp23017/mcp23017.cpp +0 -1
- esphome/components/mcp23s08/__init__.py +1 -1
- esphome/components/mcp23s08/mcp23s08.cpp +0 -1
- esphome/components/mcp23s17/__init__.py +1 -1
- esphome/components/mcp23s17/mcp23s17.cpp +0 -1
- esphome/components/mcp23x08_base/__init__.py +2 -0
- esphome/components/mcp23x08_base/mcp23x08_base.cpp +9 -7
- esphome/components/mcp23x08_base/mcp23x08_base.h +9 -4
- esphome/components/mcp23x17_base/__init__.py +2 -0
- esphome/components/mcp23x17_base/mcp23x17_base.cpp +20 -7
- esphome/components/mcp23x17_base/mcp23x17_base.h +9 -4
- esphome/components/mcp23xxx_base/__init__.py +11 -5
- esphome/components/mcp23xxx_base/mcp23xxx_base.cpp +15 -12
- esphome/components/mcp23xxx_base/mcp23xxx_base.h +8 -7
- esphome/components/mcp3008/mcp3008.cpp +1 -4
- esphome/components/mcp3204/mcp3204.cpp +1 -4
- esphome/components/mcp4461/mcp4461.cpp +0 -1
- esphome/components/mcp4725/mcp4725.cpp +0 -1
- esphome/components/mcp4728/mcp4728.cpp +0 -1
- esphome/components/mcp9600/mcp9600.cpp +0 -2
- esphome/components/mcp9808/mcp9808.cpp +0 -2
- esphome/components/mdns/__init__.py +3 -0
- esphome/components/mdns/mdns_component.cpp +2 -0
- esphome/components/mdns/mdns_component.h +4 -0
- esphome/components/media_player/__init__.py +40 -0
- esphome/components/media_player/automation.h +16 -0
- esphome/components/media_player/media_player.cpp +13 -0
- esphome/components/media_player/media_player.h +50 -3
- esphome/components/micro_wake_word/micro_wake_word.cpp +0 -3
- esphome/components/mics_4514/mics_4514.cpp +1 -6
- esphome/components/midea/ir_transmitter.h +4 -4
- esphome/components/mipi/__init__.py +416 -0
- esphome/components/mipi_dsi/__init__.py +5 -0
- esphome/components/mipi_dsi/display.py +233 -0
- esphome/components/mipi_dsi/mipi_dsi.cpp +379 -0
- esphome/components/mipi_dsi/mipi_dsi.h +123 -0
- esphome/components/mipi_dsi/models/__init__.py +0 -0
- esphome/components/mipi_dsi/models/guition.py +38 -0
- esphome/components/mipi_dsi/models/m5stack.py +57 -0
- esphome/components/mipi_dsi/models/waveshare.py +105 -0
- esphome/components/mipi_rgb/models/lilygo.py +0 -0
- esphome/components/mipi_spi/__init__.py +0 -9
- esphome/components/mipi_spi/display.py +220 -256
- esphome/components/mipi_spi/mipi_spi.cpp +1 -485
- esphome/components/mipi_spi/mipi_spi.h +556 -108
- esphome/components/mipi_spi/models/__init__.py +0 -65
- esphome/components/mipi_spi/models/adafruit.py +30 -0
- esphome/components/mipi_spi/models/amoled.py +41 -5
- esphome/components/mipi_spi/models/ili.py +5 -5
- esphome/components/mipi_spi/models/jc.py +1 -3
- esphome/components/mipi_spi/models/lilygo.py +1 -1
- esphome/components/mipi_spi/models/waveshare.py +16 -1
- esphome/components/mixer/speaker/__init__.py +4 -5
- esphome/components/mlx90393/sensor.py +7 -5
- esphome/components/mlx90393/sensor_mlx90393.cpp +0 -1
- esphome/components/mlx90614/mlx90614.cpp +0 -1
- esphome/components/mmc5603/mmc5603.cpp +0 -1
- esphome/components/mmc5983/mmc5983.cpp +0 -2
- esphome/components/mpl3115a2/mpl3115a2.cpp +0 -2
- esphome/components/mpr121/__init__.py +7 -6
- esphome/components/mpr121/mpr121.cpp +0 -1
- esphome/components/mpu6050/mpu6050.cpp +0 -1
- esphome/components/mpu6886/mpu6886.cpp +0 -1
- esphome/components/mqtt/__init__.py +1 -2
- esphome/components/mqtt/mqtt_button.cpp +1 -1
- esphome/components/mqtt/mqtt_client.cpp +0 -1
- esphome/components/mqtt/mqtt_component.cpp +8 -14
- esphome/components/mqtt/mqtt_component.h +0 -7
- esphome/components/mqtt/mqtt_sensor.cpp +0 -1
- esphome/components/mqtt/mqtt_sensor.h +0 -1
- esphome/components/mqtt/mqtt_text_sensor.cpp +0 -1
- esphome/components/mqtt/mqtt_text_sensor.h +0 -1
- esphome/components/ms5611/ms5611.cpp +0 -1
- esphome/components/ms8607/ms8607.cpp +0 -1
- esphome/components/msa3xx/msa3xx.cpp +0 -2
- esphome/components/my9231/my9231.cpp +0 -2
- esphome/components/nau7802/nau7802.cpp +0 -1
- esphome/components/neopixelbus/light.py +3 -0
- esphome/components/network/util.cpp +29 -0
- esphome/components/nextion/nextion.cpp +2 -2
- esphome/components/nfc/binary_sensor/{binary_sensor.cpp → nfc_binary_sensor.cpp} +1 -1
- esphome/components/npi19/npi19.cpp +0 -2
- esphome/components/nrf52/__init__.py +223 -0
- esphome/components/nrf52/boards.py +34 -0
- esphome/components/nrf52/const.py +18 -0
- esphome/components/nrf52/gpio.py +79 -0
- esphome/components/number/__init__.py +2 -1
- esphome/components/one_wire/__init__.py +1 -2
- esphome/components/one_wire/one_wire.cpp +0 -2
- esphome/components/one_wire/one_wire.h +0 -2
- esphome/components/opentherm/hub.cpp +0 -1
- esphome/components/opentherm/number/__init__.py +2 -2
- esphome/components/openthread/__init__.py +2 -3
- esphome/components/openthread/openthread.cpp +30 -13
- esphome/components/openthread/openthread.h +3 -0
- esphome/components/openthread/openthread_esp.cpp +3 -1
- esphome/components/opt3001/sensor.py +2 -6
- esphome/components/output/__init__.py +38 -0
- esphome/components/output/automation.h +24 -0
- esphome/components/output/switch/output_switch.cpp +0 -2
- esphome/components/packages/__init__.py +1 -2
- esphome/components/packet_transport/__init__.py +4 -3
- esphome/components/pca6416a/pca6416a.cpp +0 -1
- esphome/components/pca9554/pca9554.cpp +0 -1
- esphome/components/pca9685/pca9685_output.cpp +0 -2
- esphome/components/pcf85063/pcf85063.cpp +0 -1
- esphome/components/pcf8563/pcf8563.cpp +0 -1
- esphome/components/pcf8574/pcf8574.cpp +0 -1
- esphome/components/pi4ioe5v6408/pi4ioe5v6408.cpp +0 -1
- esphome/components/pipsolar/pipsolar.cpp +54 -42
- esphome/components/pipsolar/pipsolar.h +5 -4
- esphome/components/pipsolar/sensor/__init__.py +1 -1
- esphome/components/pm2005/pm2005.cpp +0 -1
- esphome/components/pmsa003i/pmsa003i.cpp +0 -2
- esphome/components/pmwcs3/sensor.py +1 -2
- esphome/components/pn532/pn532.cpp +0 -2
- esphome/components/pn532_spi/pn532_spi.cpp +0 -2
- esphome/components/power_supply/power_supply.cpp +7 -10
- esphome/components/power_supply/power_supply.h +1 -1
- esphome/components/psram/__init__.py +6 -1
- esphome/components/pulse_counter/pulse_counter_sensor.cpp +0 -1
- esphome/components/pulse_counter/sensor.py +9 -6
- esphome/components/pylontech/pylontech.cpp +0 -1
- esphome/components/qmc5883l/qmc5883l.cpp +0 -1
- esphome/components/qmp6988/qmp6988.cpp +0 -2
- esphome/components/qspi_dbi/display.py +2 -3
- esphome/components/qspi_dbi/qspi_dbi.cpp +0 -2
- esphome/components/qwiic_pir/binary_sensor.py +2 -3
- esphome/components/qwiic_pir/qwiic_pir.cpp +0 -2
- esphome/components/rc522/rc522.cpp +9 -31
- esphome/components/rc522_spi/rc522_spi.cpp +0 -1
- esphome/components/remote_base/__init__.py +5 -6
- esphome/components/remote_receiver/remote_receiver_esp32.cpp +0 -1
- esphome/components/remote_receiver/remote_receiver_esp8266.cpp +0 -1
- esphome/components/remote_receiver/remote_receiver_libretiny.cpp +0 -1
- esphome/components/remote_transmitter/__init__.py +26 -0
- esphome/components/remote_transmitter/automation.h +18 -0
- esphome/components/remote_transmitter/remote_transmitter.h +2 -1
- esphome/components/remote_transmitter/remote_transmitter_esp32.cpp +0 -1
- esphome/components/remote_transmitter/remote_transmitter_esp8266.cpp +2 -0
- esphome/components/remote_transmitter/remote_transmitter_libretiny.cpp +2 -0
- esphome/components/resampler/speaker/__init__.py +4 -5
- esphome/components/rf_bridge/__init__.py +4 -8
- esphome/components/rotary_encoder/rotary_encoder.cpp +0 -2
- esphome/components/rp2040/__init__.py +3 -1
- esphome/components/rp2040_pio_led_strip/led_strip.cpp +0 -2
- esphome/components/rp2040_pio_led_strip/light.py +1 -2
- esphome/components/rp2040_pwm/rp2040_pwm.cpp +1 -5
- esphome/components/rpi_dpi_rgb/display.py +13 -15
- esphome/components/rpi_dpi_rgb/rpi_dpi_rgb.cpp +0 -3
- esphome/components/runtime_stats/__init__.py +34 -0
- esphome/components/runtime_stats/runtime_stats.cpp +102 -0
- esphome/components/runtime_stats/runtime_stats.h +132 -0
- esphome/components/scd30/scd30.cpp +0 -2
- esphome/components/scd30/sensor.py +1 -2
- esphome/components/scd4x/scd4x.cpp +0 -1
- esphome/components/scd4x/sensor.py +1 -3
- esphome/components/sdl/display.py +3 -1
- esphome/components/sdl/sdl_esphome.cpp +0 -2
- esphome/components/sdp3x/sdp3x.cpp +0 -2
- esphome/components/seeed_mr24hpc1/seeed_mr24hpc1.cpp +0 -2
- esphome/components/seeed_mr60fda2/seeed_mr60fda2.cpp +0 -3
- esphome/components/select/__init__.py +2 -3
- esphome/components/select/select_traits.cpp +1 -1
- esphome/components/select/select_traits.h +1 -1
- esphome/components/sen0321/sen0321.cpp +0 -1
- esphome/components/sen5x/sen5x.cpp +0 -2
- esphome/components/senseair/senseair.cpp +7 -3
- esphome/components/senseair/senseair.h +11 -0
- esphome/components/sensor/__init__.py +36 -4
- esphome/components/sensor/filter.cpp +49 -10
- esphome/components/sensor/filter.h +22 -7
- esphome/components/sensor/sensor.cpp +0 -1
- esphome/components/sensor/sensor.h +0 -9
- esphome/components/sfa30/sfa30.cpp +0 -4
- esphome/components/sgp30/sgp30.cpp +0 -2
- esphome/components/sgp4x/sensor.py +1 -1
- esphome/components/sgp4x/sgp4x.cpp +0 -2
- esphome/components/shelly_dimmer/shelly_dimmer.cpp +0 -2
- esphome/components/sht3xd/sht3xd.cpp +0 -2
- esphome/components/sht4x/sht4x.cpp +0 -2
- esphome/components/shtcx/shtcx.cpp +0 -1
- esphome/components/sim800l/__init__.py +2 -4
- esphome/components/sm16716/sm16716.cpp +0 -1
- esphome/components/sm2135/sm2135.cpp +0 -1
- esphome/components/sm2235/sm2235.cpp +0 -1
- esphome/components/sm2335/sm2335.cpp +0 -1
- esphome/components/sn74hc165/sn74hc165.cpp +0 -1
- esphome/components/sn74hc595/sn74hc595.cpp +0 -1
- esphome/components/sntp/sntp_component.cpp +0 -1
- esphome/components/sound_level/sensor.py +1 -1
- esphome/components/speaker/media_player/__init__.py +21 -33
- esphome/components/speaker/media_player/audio_pipeline.cpp +4 -7
- esphome/components/spi/__init__.py +29 -13
- esphome/components/spi/spi.cpp +0 -2
- esphome/components/spi_device/spi_device.cpp +1 -4
- esphome/components/sprinkler/__init__.py +4 -4
- esphome/components/sps30/sps30.cpp +0 -1
- esphome/components/ssd1306_base/__init__.py +11 -11
- esphome/components/ssd1306_base/ssd1306_base.cpp +1 -1
- esphome/components/ssd1306_i2c/ssd1306_i2c.cpp +0 -1
- esphome/components/ssd1306_spi/ssd1306_spi.cpp +0 -1
- esphome/components/ssd1322_spi/ssd1322_spi.cpp +0 -1
- esphome/components/ssd1325_spi/ssd1325_spi.cpp +0 -1
- esphome/components/ssd1327_i2c/ssd1327_i2c.cpp +0 -1
- esphome/components/ssd1327_spi/ssd1327_spi.cpp +0 -1
- esphome/components/ssd1331_spi/ssd1331_spi.cpp +0 -1
- esphome/components/ssd1351_spi/ssd1351_spi.cpp +0 -1
- esphome/components/st7567_i2c/st7567_i2c.cpp +0 -1
- esphome/components/st7567_spi/st7567_spi.cpp +0 -1
- esphome/components/st7701s/display.py +10 -14
- esphome/components/st7701s/st7701s.cpp +0 -3
- esphome/components/st7735/st7735.cpp +0 -1
- esphome/components/st7789v/st7789v.cpp +0 -1
- esphome/components/st7920/st7920.cpp +0 -1
- esphome/components/status_led/light/status_led_light.cpp +0 -2
- esphome/components/status_led/status_led.cpp +0 -1
- esphome/components/stepper/__init__.py +2 -4
- esphome/components/sts3x/sts3x.cpp +0 -1
- esphome/components/substitutions/__init__.py +10 -16
- esphome/components/substitutions/jinja.py +24 -1
- esphome/components/sun/__init__.py +2 -3
- esphome/components/switch/__init__.py +31 -1
- esphome/components/switch/automation.h +24 -0
- esphome/components/switch/switch.cpp +8 -0
- esphome/components/switch/switch.h +8 -0
- esphome/components/sx126x/sx126x.cpp +0 -2
- esphome/components/sx127x/sx127x.cpp +0 -2
- esphome/components/sx1509/__init__.py +7 -5
- esphome/components/sx1509/output/sx1509_float_output.cpp +1 -1
- esphome/components/sx1509/sx1509.cpp +0 -2
- esphome/components/syslog/esphome_syslog.cpp +1 -1
- esphome/components/tc74/tc74.cpp +0 -1
- esphome/components/tca9548a/tca9548a.cpp +0 -1
- esphome/components/tca9555/tca9555.cpp +0 -1
- esphome/components/tcs34725/tcs34725.cpp +0 -1
- esphome/components/tee501/tee501.cpp +0 -1
- esphome/components/tem3200/tem3200.cpp +0 -2
- esphome/components/template/alarm_control_panel/template_alarm_control_panel.cpp +0 -1
- esphome/components/template/cover/template_cover.cpp +0 -1
- esphome/components/template/select/template_select.cpp +0 -1
- esphome/components/template/text/template_text.cpp +0 -2
- esphome/components/template/valve/template_valve.cpp +0 -1
- esphome/components/text/__init__.py +0 -1
- esphome/components/text/text_traits.h +2 -0
- esphome/components/text_sensor/__init__.py +2 -1
- esphome/components/text_sensor/text_sensor.cpp +0 -2
- esphome/components/text_sensor/text_sensor.h +0 -8
- esphome/components/thermostat/climate.py +4 -4
- esphome/components/time/__init__.py +7 -4
- esphome/components/time/real_time_clock.cpp +16 -3
- esphome/components/tlc59208f/tlc59208f_output.cpp +0 -2
- esphome/components/tlc5947/tlc5947.cpp +0 -2
- esphome/components/tlc5971/tlc5971.cpp +0 -2
- esphome/components/tm1621/tm1621.cpp +0 -2
- esphome/components/tm1637/tm1637.cpp +0 -2
- esphome/components/tm1638/tm1638.cpp +0 -2
- esphome/components/tm1651/__init__.py +45 -48
- esphome/components/tm1651/tm1651.cpp +213 -47
- esphome/components/tm1651/tm1651.h +37 -32
- esphome/components/tmp117/tmp117.cpp +0 -2
- esphome/components/tsl2561/tsl2561.cpp +0 -1
- esphome/components/tsl2591/tsl2591.cpp +0 -1
- esphome/components/tt21100/touchscreen/tt21100.cpp +0 -2
- esphome/components/ttp229_bsf/ttp229_bsf.cpp +0 -1
- esphome/components/ttp229_lsf/ttp229_lsf.cpp +0 -1
- esphome/components/tuya/climate/__init__.py +9 -10
- esphome/components/tuya/number/__init__.py +8 -6
- esphome/components/tx20/tx20.cpp +0 -1
- esphome/components/uart/uart_component_esp32_arduino.cpp +0 -1
- esphome/components/uart/uart_component_esp8266.cpp +0 -1
- esphome/components/uart/uart_component_esp_idf.cpp +0 -2
- esphome/components/uart/uart_component_libretiny.cpp +0 -2
- esphome/components/uart/uart_component_rp2040.cpp +0 -2
- esphome/components/udp/__init__.py +1 -1
- esphome/components/ufire_ec/sensor.py +1 -2
- esphome/components/ufire_ec/ufire_ec.cpp +0 -2
- esphome/components/ufire_ise/sensor.py +1 -2
- esphome/components/ufire_ise/ufire_ise.cpp +0 -2
- esphome/components/ultrasonic/ultrasonic_sensor.cpp +0 -1
- esphome/components/update/__init__.py +0 -1
- esphome/components/uptime/sensor/uptime_seconds_sensor.cpp +0 -1
- esphome/components/uptime/sensor/uptime_seconds_sensor.h +0 -2
- esphome/components/usb_host/usb_host_client.cpp +0 -1
- esphome/components/usb_host/usb_host_component.cpp +0 -1
- esphome/components/valve/__init__.py +0 -1
- esphome/components/veml3235/veml3235.cpp +0 -3
- esphome/components/veml7700/veml7700.cpp +0 -2
- esphome/components/version/version_text_sensor.cpp +0 -1
- esphome/components/version/version_text_sensor.h +0 -1
- esphome/components/vl53l0x/vl53l0x_sensor.cpp +0 -4
- esphome/components/voice_assistant/voice_assistant.cpp +9 -8
- esphome/components/web_server/__init__.py +13 -0
- esphome/components/web_server/web_server.cpp +188 -353
- esphome/components/web_server/web_server.h +61 -1
- esphome/components/web_server_base/__init__.py +1 -1
- esphome/components/web_server_base/web_server_base.cpp +2 -0
- esphome/components/web_server_base/web_server_base.h +6 -0
- esphome/components/web_server_idf/web_server_idf.cpp +10 -8
- esphome/components/web_server_idf/web_server_idf.h +2 -0
- esphome/components/weikai_i2c/weikai_i2c.cpp +1 -2
- esphome/components/weikai_spi/weikai_spi.cpp +1 -1
- esphome/components/wifi/__init__.py +17 -43
- esphome/components/wifi/wifi_component.cpp +100 -36
- esphome/components/wifi/wifi_component.h +5 -1
- esphome/components/wifi/wifi_component_esp32_arduino.cpp +30 -0
- esphome/components/wifi/wifi_component_esp_idf.cpp +30 -0
- esphome/components/wifi_info/wifi_info_text_sensor.h +0 -6
- esphome/components/wifi_signal/wifi_signal_sensor.h +0 -1
- esphome/components/wireguard/wireguard.cpp +0 -2
- esphome/components/x9c/x9c.cpp +0 -2
- esphome/components/xgzp68xx/xgzp68xx.cpp +0 -1
- esphome/components/xl9535/xl9535.cpp +0 -2
- esphome/components/zephyr/__init__.py +252 -0
- esphome/components/zephyr/const.py +16 -0
- esphome/components/zephyr/core.cpp +90 -0
- esphome/components/zephyr/gpio.cpp +120 -0
- esphome/components/zephyr/gpio.h +38 -0
- esphome/components/zephyr/pre_build.py.script +4 -0
- esphome/components/zephyr/preferences.cpp +156 -0
- esphome/components/zephyr/preferences.h +13 -0
- esphome/config.py +38 -16
- esphome/config_helpers.py +1 -2
- esphome/config_validation.py +12 -16
- esphome/const.py +26 -1
- esphome/core/__init__.py +92 -51
- esphome/core/application.cpp +75 -21
- esphome/core/application.h +106 -171
- esphome/core/color.h +10 -0
- esphome/core/component.cpp +41 -25
- esphome/core/component.h +9 -6
- esphome/core/component_iterator.cpp +61 -261
- esphome/core/component_iterator.h +15 -0
- esphome/core/config.py +26 -11
- esphome/core/defines.h +40 -2
- esphome/core/entity_base.h +18 -0
- esphome/core/entity_helpers.py +45 -10
- esphome/core/helpers.cpp +8 -15
- esphome/core/helpers.h +60 -6
- esphome/core/lock_free_queue.h +1 -1
- esphome/core/scheduler.cpp +311 -77
- esphome/core/scheduler.h +141 -28
- esphome/cpp_generator.py +2 -6
- esphome/cpp_helpers.py +1 -1
- esphome/dashboard/dashboard.py +2 -3
- esphome/dashboard/dns.py +2 -8
- esphome/dashboard/web_server.py +34 -19
- esphome/espota2.py +1 -4
- esphome/git.py +3 -1
- esphome/helpers.py +23 -4
- esphome/log.py +3 -1
- esphome/mqtt.py +3 -5
- esphome/platformio_api.py +7 -4
- esphome/types.py +12 -0
- esphome/util.py +20 -8
- esphome/voluptuous_schema.py +4 -3
- esphome/vscode.py +1 -2
- esphome/wizard.py +1 -4
- esphome/writer.py +16 -108
- esphome/yaml_util.py +7 -5
- {esphome-2025.7.5.dist-info → esphome-2025.8.0.dist-info}/METADATA +13 -14
- {esphome-2025.7.5.dist-info → esphome-2025.8.0.dist-info}/RECORD +755 -675
- esphome/components/mipi_spi/models/commands.py +0 -82
- /esphome/components/nfc/binary_sensor/{binary_sensor.h → nfc_binary_sensor.h} +0 -0
- {esphome-2025.7.5.dist-info → esphome-2025.8.0.dist-info}/WHEEL +0 -0
- {esphome-2025.7.5.dist-info → esphome-2025.8.0.dist-info}/entry_points.txt +0 -0
- {esphome-2025.7.5.dist-info → esphome-2025.8.0.dist-info}/licenses/LICENSE +0 -0
- {esphome-2025.7.5.dist-info → esphome-2025.8.0.dist-info}/top_level.txt +0 -0
|
@@ -5,10 +5,27 @@
|
|
|
5
5
|
|
|
6
6
|
#ifdef USE_ESP32
|
|
7
7
|
|
|
8
|
-
|
|
9
|
-
|
|
8
|
+
#include <esp_gap_ble_api.h>
|
|
9
|
+
#include <esp_gatt_defs.h>
|
|
10
|
+
|
|
11
|
+
namespace esphome::esp32_ble_client {
|
|
10
12
|
|
|
11
13
|
static const char *const TAG = "esp32_ble_client";
|
|
14
|
+
|
|
15
|
+
// Intermediate connection parameters for standard operation
|
|
16
|
+
// ESP-IDF defaults (12.5-15ms) are too slow for stable connections through WiFi-based BLE proxies,
|
|
17
|
+
// causing disconnections. These medium parameters balance responsiveness with bandwidth usage.
|
|
18
|
+
static const uint16_t MEDIUM_MIN_CONN_INTERVAL = 0x07; // 7 * 1.25ms = 8.75ms
|
|
19
|
+
static const uint16_t MEDIUM_MAX_CONN_INTERVAL = 0x09; // 9 * 1.25ms = 11.25ms
|
|
20
|
+
// The timeout value was increased from 6s to 8s to address stability issues observed
|
|
21
|
+
// in certain BLE devices when operating through WiFi-based BLE proxies. The longer
|
|
22
|
+
// timeout reduces the likelihood of disconnections during periods of high latency.
|
|
23
|
+
static const uint16_t MEDIUM_CONN_TIMEOUT = 800; // 800 * 10ms = 8s
|
|
24
|
+
|
|
25
|
+
// Fastest connection parameters for devices with short discovery timeouts
|
|
26
|
+
static const uint16_t FAST_MIN_CONN_INTERVAL = 0x06; // 6 * 1.25ms = 7.5ms (BLE minimum)
|
|
27
|
+
static const uint16_t FAST_MAX_CONN_INTERVAL = 0x06; // 6 * 1.25ms = 7.5ms
|
|
28
|
+
static const uint16_t FAST_CONN_TIMEOUT = 1000; // 1000 * 10ms = 10s
|
|
12
29
|
static const esp_bt_uuid_t NOTIFY_DESC_UUID = {
|
|
13
30
|
.len = ESP_UUID_LEN_16,
|
|
14
31
|
.uuid =
|
|
@@ -27,8 +44,10 @@ void BLEClientBase::set_state(espbt::ClientState st) {
|
|
|
27
44
|
ESPBTClient::set_state(st);
|
|
28
45
|
|
|
29
46
|
if (st == espbt::ClientState::READY_TO_CONNECT) {
|
|
30
|
-
// Enable loop
|
|
47
|
+
// Enable loop for state processing
|
|
31
48
|
this->enable_loop();
|
|
49
|
+
// Connect immediately instead of waiting for next loop
|
|
50
|
+
this->connect();
|
|
32
51
|
}
|
|
33
52
|
}
|
|
34
53
|
|
|
@@ -45,11 +64,6 @@ void BLEClientBase::loop() {
|
|
|
45
64
|
}
|
|
46
65
|
this->set_state(espbt::ClientState::IDLE);
|
|
47
66
|
}
|
|
48
|
-
// READY_TO_CONNECT means we have discovered the device
|
|
49
|
-
// and the scanner has been stopped by the tracker.
|
|
50
|
-
else if (this->state_ == espbt::ClientState::READY_TO_CONNECT) {
|
|
51
|
-
this->connect();
|
|
52
|
-
}
|
|
53
67
|
// If its idle, we can disable the loop as set_state
|
|
54
68
|
// will enable it again when we need to connect.
|
|
55
69
|
else if (this->state_ == espbt::ClientState::IDLE) {
|
|
@@ -64,40 +78,7 @@ void BLEClientBase::dump_config() {
|
|
|
64
78
|
" Address: %s\n"
|
|
65
79
|
" Auto-Connect: %s",
|
|
66
80
|
this->address_str().c_str(), TRUEFALSE(this->auto_connect_));
|
|
67
|
-
|
|
68
|
-
switch (this->state()) {
|
|
69
|
-
case espbt::ClientState::INIT:
|
|
70
|
-
state_name = "INIT";
|
|
71
|
-
break;
|
|
72
|
-
case espbt::ClientState::DISCONNECTING:
|
|
73
|
-
state_name = "DISCONNECTING";
|
|
74
|
-
break;
|
|
75
|
-
case espbt::ClientState::IDLE:
|
|
76
|
-
state_name = "IDLE";
|
|
77
|
-
break;
|
|
78
|
-
case espbt::ClientState::SEARCHING:
|
|
79
|
-
state_name = "SEARCHING";
|
|
80
|
-
break;
|
|
81
|
-
case espbt::ClientState::DISCOVERED:
|
|
82
|
-
state_name = "DISCOVERED";
|
|
83
|
-
break;
|
|
84
|
-
case espbt::ClientState::READY_TO_CONNECT:
|
|
85
|
-
state_name = "READY_TO_CONNECT";
|
|
86
|
-
break;
|
|
87
|
-
case espbt::ClientState::CONNECTING:
|
|
88
|
-
state_name = "CONNECTING";
|
|
89
|
-
break;
|
|
90
|
-
case espbt::ClientState::CONNECTED:
|
|
91
|
-
state_name = "CONNECTED";
|
|
92
|
-
break;
|
|
93
|
-
case espbt::ClientState::ESTABLISHED:
|
|
94
|
-
state_name = "ESTABLISHED";
|
|
95
|
-
break;
|
|
96
|
-
default:
|
|
97
|
-
state_name = "UNKNOWN_STATE";
|
|
98
|
-
break;
|
|
99
|
-
}
|
|
100
|
-
ESP_LOGCONFIG(TAG, " State: %s", state_name.c_str());
|
|
81
|
+
ESP_LOGCONFIG(TAG, " State: %s", espbt::client_state_to_string(this->state()));
|
|
101
82
|
if (this->status_ == ESP_GATT_NO_RESOURCES) {
|
|
102
83
|
ESP_LOGE(TAG, " Failed due to no resources. Try to reduce number of BLE clients in config.");
|
|
103
84
|
} else if (this->status_ != ESP_GATT_OK) {
|
|
@@ -105,6 +86,7 @@ void BLEClientBase::dump_config() {
|
|
|
105
86
|
}
|
|
106
87
|
}
|
|
107
88
|
|
|
89
|
+
#ifdef USE_ESP32_BLE_DEVICE
|
|
108
90
|
bool BLEClientBase::parse_device(const espbt::ESPBTDevice &device) {
|
|
109
91
|
if (!this->auto_connect_)
|
|
110
92
|
return false;
|
|
@@ -122,15 +104,46 @@ bool BLEClientBase::parse_device(const espbt::ESPBTDevice &device) {
|
|
|
122
104
|
this->remote_addr_type_ = device.get_address_type();
|
|
123
105
|
return true;
|
|
124
106
|
}
|
|
107
|
+
#endif
|
|
125
108
|
|
|
126
109
|
void BLEClientBase::connect() {
|
|
127
|
-
ESP_LOGI(TAG, "[%d] [%s] 0x%02x
|
|
110
|
+
ESP_LOGI(TAG, "[%d] [%s] 0x%02x Connecting", this->connection_index_, this->address_str_.c_str(),
|
|
128
111
|
this->remote_addr_type_);
|
|
129
112
|
this->paired_ = false;
|
|
113
|
+
|
|
114
|
+
// Set preferred connection parameters before connecting
|
|
115
|
+
// Use FAST for all V3 connections (better latency and reliability)
|
|
116
|
+
// Use MEDIUM for V1/legacy connections (balanced performance)
|
|
117
|
+
uint16_t min_interval, max_interval, timeout;
|
|
118
|
+
const char *param_type;
|
|
119
|
+
|
|
120
|
+
if (this->connection_type_ == espbt::ConnectionType::V3_WITHOUT_CACHE ||
|
|
121
|
+
this->connection_type_ == espbt::ConnectionType::V3_WITH_CACHE) {
|
|
122
|
+
min_interval = FAST_MIN_CONN_INTERVAL;
|
|
123
|
+
max_interval = FAST_MAX_CONN_INTERVAL;
|
|
124
|
+
timeout = FAST_CONN_TIMEOUT;
|
|
125
|
+
param_type = "fast";
|
|
126
|
+
} else {
|
|
127
|
+
min_interval = MEDIUM_MIN_CONN_INTERVAL;
|
|
128
|
+
max_interval = MEDIUM_MAX_CONN_INTERVAL;
|
|
129
|
+
timeout = MEDIUM_CONN_TIMEOUT;
|
|
130
|
+
param_type = "medium";
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
auto param_ret = esp_ble_gap_set_prefer_conn_params(this->remote_bda_, min_interval, max_interval,
|
|
134
|
+
0, // latency: 0
|
|
135
|
+
timeout);
|
|
136
|
+
if (param_ret != ESP_OK) {
|
|
137
|
+
ESP_LOGW(TAG, "[%d] [%s] esp_ble_gap_set_prefer_conn_params failed: %d", this->connection_index_,
|
|
138
|
+
this->address_str_.c_str(), param_ret);
|
|
139
|
+
} else {
|
|
140
|
+
this->log_connection_params_(param_type);
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
// Now open the connection
|
|
130
144
|
auto ret = esp_ble_gattc_open(this->gattc_if_, this->remote_bda_, this->remote_addr_type_, true);
|
|
131
145
|
if (ret) {
|
|
132
|
-
|
|
133
|
-
ret);
|
|
146
|
+
this->log_gattc_warning_("esp_ble_gattc_open", ret);
|
|
134
147
|
this->set_state(espbt::ClientState::IDLE);
|
|
135
148
|
} else {
|
|
136
149
|
this->set_state(espbt::ClientState::CONNECTING);
|
|
@@ -140,14 +153,9 @@ void BLEClientBase::connect() {
|
|
|
140
153
|
esp_err_t BLEClientBase::pair() { return esp_ble_set_encryption(this->remote_bda_, ESP_BLE_SEC_ENCRYPT); }
|
|
141
154
|
|
|
142
155
|
void BLEClientBase::disconnect() {
|
|
143
|
-
if (this->state_ == espbt::ClientState::IDLE) {
|
|
144
|
-
ESP_LOGI(TAG, "[%d] [%s] Disconnect requested, but already
|
|
145
|
-
this->
|
|
146
|
-
return;
|
|
147
|
-
}
|
|
148
|
-
if (this->state_ == espbt::ClientState::DISCONNECTING) {
|
|
149
|
-
ESP_LOGI(TAG, "[%d] [%s] Disconnect requested, but already disconnecting.", this->connection_index_,
|
|
150
|
-
this->address_str_.c_str());
|
|
156
|
+
if (this->state_ == espbt::ClientState::IDLE || this->state_ == espbt::ClientState::DISCONNECTING) {
|
|
157
|
+
ESP_LOGI(TAG, "[%d] [%s] Disconnect requested, but already %s", this->connection_index_, this->address_str_.c_str(),
|
|
158
|
+
espbt::client_state_to_string(this->state_));
|
|
151
159
|
return;
|
|
152
160
|
}
|
|
153
161
|
if (this->state_ == espbt::ClientState::CONNECTING || this->conn_id_ == UNSET_CONN_ID) {
|
|
@@ -182,8 +190,7 @@ void BLEClientBase::unconditional_disconnect() {
|
|
|
182
190
|
// In the future we might consider App.reboot() here since
|
|
183
191
|
// the BLE stack is in an indeterminate state.
|
|
184
192
|
//
|
|
185
|
-
|
|
186
|
-
err);
|
|
193
|
+
this->log_gattc_warning_("esp_ble_gattc_close", err);
|
|
187
194
|
}
|
|
188
195
|
|
|
189
196
|
if (this->state_ == espbt::ClientState::SEARCHING || this->state_ == espbt::ClientState::READY_TO_CONNECT ||
|
|
@@ -196,9 +203,11 @@ void BLEClientBase::unconditional_disconnect() {
|
|
|
196
203
|
}
|
|
197
204
|
|
|
198
205
|
void BLEClientBase::release_services() {
|
|
206
|
+
#ifdef USE_ESP32_BLE_DEVICE
|
|
199
207
|
for (auto &svc : this->services_)
|
|
200
208
|
delete svc; // NOLINT(cppcoreguidelines-owning-memory)
|
|
201
209
|
this->services_.clear();
|
|
210
|
+
#endif
|
|
202
211
|
#ifndef CONFIG_BT_GATTC_CACHE_NVS_FLASH
|
|
203
212
|
esp_ble_gattc_cache_clean(this->remote_bda_);
|
|
204
213
|
#endif
|
|
@@ -208,6 +217,36 @@ void BLEClientBase::log_event_(const char *name) {
|
|
|
208
217
|
ESP_LOGD(TAG, "[%d] [%s] %s", this->connection_index_, this->address_str_.c_str(), name);
|
|
209
218
|
}
|
|
210
219
|
|
|
220
|
+
void BLEClientBase::log_gattc_event_(const char *name) {
|
|
221
|
+
ESP_LOGD(TAG, "[%d] [%s] ESP_GATTC_%s_EVT", this->connection_index_, this->address_str_.c_str(), name);
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
void BLEClientBase::log_gattc_warning_(const char *operation, esp_gatt_status_t status) {
|
|
225
|
+
ESP_LOGW(TAG, "[%d] [%s] %s error, status=%d", this->connection_index_, this->address_str_.c_str(), operation,
|
|
226
|
+
status);
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
void BLEClientBase::log_gattc_warning_(const char *operation, esp_err_t err) {
|
|
230
|
+
ESP_LOGW(TAG, "[%d] [%s] %s error, status=%d", this->connection_index_, this->address_str_.c_str(), operation, err);
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
void BLEClientBase::log_connection_params_(const char *param_type) {
|
|
234
|
+
ESP_LOGD(TAG, "[%d] [%s] %s conn params", this->connection_index_, this->address_str_.c_str(), param_type);
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
void BLEClientBase::restore_medium_conn_params_() {
|
|
238
|
+
// Restore to medium connection parameters after initial connection phase
|
|
239
|
+
// This balances performance with bandwidth usage for normal operation
|
|
240
|
+
esp_ble_conn_update_params_t conn_params = {{0}};
|
|
241
|
+
memcpy(conn_params.bda, this->remote_bda_, sizeof(esp_bd_addr_t));
|
|
242
|
+
conn_params.min_int = MEDIUM_MIN_CONN_INTERVAL;
|
|
243
|
+
conn_params.max_int = MEDIUM_MAX_CONN_INTERVAL;
|
|
244
|
+
conn_params.latency = 0;
|
|
245
|
+
conn_params.timeout = MEDIUM_CONN_TIMEOUT;
|
|
246
|
+
this->log_connection_params_("medium");
|
|
247
|
+
esp_ble_gap_update_conn_params(&conn_params);
|
|
248
|
+
}
|
|
249
|
+
|
|
211
250
|
bool BLEClientBase::gattc_event_handler(esp_gattc_cb_event_t event, esp_gatt_if_t esp_gattc_if,
|
|
212
251
|
esp_ble_gattc_cb_param_t *param) {
|
|
213
252
|
if (event == ESP_GATTC_REG_EVT && this->app_id != param->reg.app_id)
|
|
@@ -235,30 +274,18 @@ bool BLEClientBase::gattc_event_handler(esp_gattc_cb_event_t event, esp_gatt_if_
|
|
|
235
274
|
case ESP_GATTC_OPEN_EVT: {
|
|
236
275
|
if (!this->check_addr(param->open.remote_bda))
|
|
237
276
|
return false;
|
|
238
|
-
this->
|
|
239
|
-
|
|
277
|
+
this->log_gattc_event_("OPEN");
|
|
278
|
+
// conn_id was already set in ESP_GATTC_CONNECT_EVT
|
|
240
279
|
this->service_count_ = 0;
|
|
241
280
|
if (this->state_ != espbt::ClientState::CONNECTING) {
|
|
242
281
|
// This should not happen but lets log it in case it does
|
|
243
282
|
// because it means we have a bad assumption about how the
|
|
244
283
|
// ESP BT stack works.
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
this->address_str_.c_str(), param->open.status);
|
|
248
|
-
} else if (this->state_ == espbt::ClientState::ESTABLISHED) {
|
|
249
|
-
ESP_LOGE(TAG, "[%d] [%s] Got ESP_GATTC_OPEN_EVT while already established, status=%d",
|
|
250
|
-
this->connection_index_, this->address_str_.c_str(), param->open.status);
|
|
251
|
-
} else if (this->state_ == espbt::ClientState::DISCONNECTING) {
|
|
252
|
-
ESP_LOGE(TAG, "[%d] [%s] Got ESP_GATTC_OPEN_EVT while disconnecting, status=%d", this->connection_index_,
|
|
253
|
-
this->address_str_.c_str(), param->open.status);
|
|
254
|
-
} else {
|
|
255
|
-
ESP_LOGE(TAG, "[%d] [%s] Got ESP_GATTC_OPEN_EVT while not in connecting state, status=%d",
|
|
256
|
-
this->connection_index_, this->address_str_.c_str(), param->open.status);
|
|
257
|
-
}
|
|
284
|
+
ESP_LOGE(TAG, "[%d] [%s] Got ESP_GATTC_OPEN_EVT while in %s state, status=%d", this->connection_index_,
|
|
285
|
+
this->address_str_.c_str(), espbt::client_state_to_string(this->state_), param->open.status);
|
|
258
286
|
}
|
|
259
287
|
if (param->open.status != ESP_GATT_OK && param->open.status != ESP_GATT_ALREADY_OPEN) {
|
|
260
|
-
|
|
261
|
-
param->open.status);
|
|
288
|
+
this->log_gattc_warning_("Connection open", param->open.status);
|
|
262
289
|
this->set_state(espbt::ClientState::IDLE);
|
|
263
290
|
break;
|
|
264
291
|
}
|
|
@@ -270,32 +297,47 @@ bool BLEClientBase::gattc_event_handler(esp_gattc_cb_event_t event, esp_gatt_if_
|
|
|
270
297
|
this->conn_id_ = UNSET_CONN_ID;
|
|
271
298
|
break;
|
|
272
299
|
}
|
|
273
|
-
|
|
274
|
-
if (ret) {
|
|
275
|
-
ESP_LOGW(TAG, "[%d] [%s] esp_ble_gattc_send_mtu_req failed, status=%x", this->connection_index_,
|
|
276
|
-
this->address_str_.c_str(), ret);
|
|
277
|
-
}
|
|
300
|
+
// MTU negotiation already started in ESP_GATTC_CONNECT_EVT
|
|
278
301
|
this->set_state(espbt::ClientState::CONNECTED);
|
|
302
|
+
ESP_LOGI(TAG, "[%d] [%s] Connection open", this->connection_index_, this->address_str_.c_str());
|
|
279
303
|
if (this->connection_type_ == espbt::ConnectionType::V3_WITH_CACHE) {
|
|
280
|
-
|
|
304
|
+
// Restore to medium connection parameters for cached connections too
|
|
305
|
+
this->restore_medium_conn_params_();
|
|
281
306
|
// only set our state, subclients might have more stuff to do yet.
|
|
282
307
|
this->state_ = espbt::ClientState::ESTABLISHED;
|
|
283
308
|
break;
|
|
284
309
|
}
|
|
310
|
+
ESP_LOGD(TAG, "[%d] [%s] Searching for services", this->connection_index_, this->address_str_.c_str());
|
|
285
311
|
esp_ble_gattc_search_service(esp_gattc_if, param->cfg_mtu.conn_id, nullptr);
|
|
286
312
|
break;
|
|
287
313
|
}
|
|
288
314
|
case ESP_GATTC_CONNECT_EVT: {
|
|
289
315
|
if (!this->check_addr(param->connect.remote_bda))
|
|
290
316
|
return false;
|
|
291
|
-
this->
|
|
317
|
+
this->log_gattc_event_("CONNECT");
|
|
318
|
+
this->conn_id_ = param->connect.conn_id;
|
|
319
|
+
// Start MTU negotiation immediately as recommended by ESP-IDF examples
|
|
320
|
+
// (gatt_client, ble_throughput) which call esp_ble_gattc_send_mtu_req in
|
|
321
|
+
// ESP_GATTC_CONNECT_EVT instead of waiting for ESP_GATTC_OPEN_EVT.
|
|
322
|
+
// This saves ~3ms in the connection process.
|
|
323
|
+
auto ret = esp_ble_gattc_send_mtu_req(this->gattc_if_, param->connect.conn_id);
|
|
324
|
+
if (ret) {
|
|
325
|
+
this->log_gattc_warning_("esp_ble_gattc_send_mtu_req", ret);
|
|
326
|
+
}
|
|
292
327
|
break;
|
|
293
328
|
}
|
|
294
329
|
case ESP_GATTC_DISCONNECT_EVT: {
|
|
295
330
|
if (!this->check_addr(param->disconnect.remote_bda))
|
|
296
331
|
return false;
|
|
297
|
-
|
|
298
|
-
|
|
332
|
+
// Check if we were disconnected while waiting for service discovery
|
|
333
|
+
if (param->disconnect.reason == ESP_GATT_CONN_TERMINATE_PEER_USER &&
|
|
334
|
+
this->state_ == espbt::ClientState::CONNECTED) {
|
|
335
|
+
ESP_LOGW(TAG, "[%d] [%s] Disconnected by remote during service discovery", this->connection_index_,
|
|
336
|
+
this->address_str_.c_str());
|
|
337
|
+
} else {
|
|
338
|
+
ESP_LOGD(TAG, "[%d] [%s] ESP_GATTC_DISCONNECT_EVT, reason 0x%02x", this->connection_index_,
|
|
339
|
+
this->address_str_.c_str(), param->disconnect.reason);
|
|
340
|
+
}
|
|
299
341
|
this->release_services();
|
|
300
342
|
this->set_state(espbt::ClientState::IDLE);
|
|
301
343
|
break;
|
|
@@ -318,7 +360,7 @@ bool BLEClientBase::gattc_event_handler(esp_gattc_cb_event_t event, esp_gatt_if_
|
|
|
318
360
|
case ESP_GATTC_CLOSE_EVT: {
|
|
319
361
|
if (this->conn_id_ != param->close.conn_id)
|
|
320
362
|
return false;
|
|
321
|
-
this->
|
|
363
|
+
this->log_gattc_event_("CLOSE");
|
|
322
364
|
this->release_services();
|
|
323
365
|
this->set_state(espbt::ClientState::IDLE);
|
|
324
366
|
this->conn_id_ = UNSET_CONN_ID;
|
|
@@ -330,63 +372,74 @@ bool BLEClientBase::gattc_event_handler(esp_gattc_cb_event_t event, esp_gatt_if_
|
|
|
330
372
|
this->service_count_++;
|
|
331
373
|
if (this->connection_type_ == espbt::ConnectionType::V3_WITHOUT_CACHE) {
|
|
332
374
|
// V3 clients don't need services initialized since
|
|
333
|
-
// they
|
|
375
|
+
// as they use the ESP APIs to get services.
|
|
334
376
|
break;
|
|
335
377
|
}
|
|
378
|
+
#ifdef USE_ESP32_BLE_DEVICE
|
|
336
379
|
BLEService *ble_service = new BLEService(); // NOLINT(cppcoreguidelines-owning-memory)
|
|
337
380
|
ble_service->uuid = espbt::ESPBTUUID::from_uuid(param->search_res.srvc_id.uuid);
|
|
338
381
|
ble_service->start_handle = param->search_res.start_handle;
|
|
339
382
|
ble_service->end_handle = param->search_res.end_handle;
|
|
340
383
|
ble_service->client = this;
|
|
341
384
|
this->services_.push_back(ble_service);
|
|
385
|
+
#endif
|
|
342
386
|
break;
|
|
343
387
|
}
|
|
344
388
|
case ESP_GATTC_SEARCH_CMPL_EVT: {
|
|
345
389
|
if (this->conn_id_ != param->search_cmpl.conn_id)
|
|
346
390
|
return false;
|
|
347
|
-
this->
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
391
|
+
this->log_gattc_event_("SEARCH_CMPL");
|
|
392
|
+
// For V3 connections, restore to medium connection parameters after service discovery
|
|
393
|
+
// This balances performance with bandwidth usage after the critical discovery phase
|
|
394
|
+
if (this->connection_type_ == espbt::ConnectionType::V3_WITHOUT_CACHE ||
|
|
395
|
+
this->connection_type_ == espbt::ConnectionType::V3_WITH_CACHE) {
|
|
396
|
+
this->restore_medium_conn_params_();
|
|
397
|
+
} else {
|
|
398
|
+
#ifdef USE_ESP32_BLE_DEVICE
|
|
399
|
+
for (auto &svc : this->services_) {
|
|
400
|
+
ESP_LOGV(TAG, "[%d] [%s] Service UUID: %s", this->connection_index_, this->address_str_.c_str(),
|
|
401
|
+
svc->uuid.to_string().c_str());
|
|
402
|
+
ESP_LOGV(TAG, "[%d] [%s] start_handle: 0x%x end_handle: 0x%x", this->connection_index_,
|
|
403
|
+
this->address_str_.c_str(), svc->start_handle, svc->end_handle);
|
|
404
|
+
}
|
|
405
|
+
#endif
|
|
353
406
|
}
|
|
354
|
-
ESP_LOGI(TAG, "[%d] [%s]
|
|
407
|
+
ESP_LOGI(TAG, "[%d] [%s] Service discovery complete", this->connection_index_, this->address_str_.c_str());
|
|
355
408
|
this->state_ = espbt::ClientState::ESTABLISHED;
|
|
356
409
|
break;
|
|
357
410
|
}
|
|
358
411
|
case ESP_GATTC_READ_DESCR_EVT: {
|
|
359
412
|
if (this->conn_id_ != param->write.conn_id)
|
|
360
413
|
return false;
|
|
361
|
-
this->
|
|
414
|
+
this->log_gattc_event_("READ_DESCR");
|
|
362
415
|
break;
|
|
363
416
|
}
|
|
364
417
|
case ESP_GATTC_WRITE_DESCR_EVT: {
|
|
365
418
|
if (this->conn_id_ != param->write.conn_id)
|
|
366
419
|
return false;
|
|
367
|
-
this->
|
|
420
|
+
this->log_gattc_event_("WRITE_DESCR");
|
|
368
421
|
break;
|
|
369
422
|
}
|
|
370
423
|
case ESP_GATTC_WRITE_CHAR_EVT: {
|
|
371
424
|
if (this->conn_id_ != param->write.conn_id)
|
|
372
425
|
return false;
|
|
373
|
-
this->
|
|
426
|
+
this->log_gattc_event_("WRITE_CHAR");
|
|
374
427
|
break;
|
|
375
428
|
}
|
|
376
429
|
case ESP_GATTC_READ_CHAR_EVT: {
|
|
377
430
|
if (this->conn_id_ != param->read.conn_id)
|
|
378
431
|
return false;
|
|
379
|
-
this->
|
|
432
|
+
this->log_gattc_event_("READ_CHAR");
|
|
380
433
|
break;
|
|
381
434
|
}
|
|
382
435
|
case ESP_GATTC_NOTIFY_EVT: {
|
|
383
436
|
if (this->conn_id_ != param->notify.conn_id)
|
|
384
437
|
return false;
|
|
385
|
-
this->
|
|
438
|
+
this->log_gattc_event_("NOTIFY");
|
|
386
439
|
break;
|
|
387
440
|
}
|
|
388
441
|
case ESP_GATTC_REG_FOR_NOTIFY_EVT: {
|
|
389
|
-
this->
|
|
442
|
+
this->log_gattc_event_("REG_FOR_NOTIFY");
|
|
390
443
|
if (this->connection_type_ == espbt::ConnectionType::V3_WITH_CACHE ||
|
|
391
444
|
this->connection_type_ == espbt::ConnectionType::V3_WITHOUT_CACHE) {
|
|
392
445
|
// Client is responsible for flipping the descriptor value
|
|
@@ -398,8 +451,7 @@ bool BLEClientBase::gattc_event_handler(esp_gattc_cb_event_t event, esp_gatt_if_
|
|
|
398
451
|
esp_gatt_status_t descr_status = esp_ble_gattc_get_descr_by_char_handle(
|
|
399
452
|
this->gattc_if_, this->conn_id_, param->reg_for_notify.handle, NOTIFY_DESC_UUID, &desc_result, &count);
|
|
400
453
|
if (descr_status != ESP_GATT_OK) {
|
|
401
|
-
|
|
402
|
-
this->address_str_.c_str(), descr_status);
|
|
454
|
+
this->log_gattc_warning_("esp_ble_gattc_get_descr_by_char_handle", descr_status);
|
|
403
455
|
break;
|
|
404
456
|
}
|
|
405
457
|
esp_gattc_char_elem_t char_result;
|
|
@@ -407,8 +459,7 @@ bool BLEClientBase::gattc_event_handler(esp_gattc_cb_event_t event, esp_gatt_if_
|
|
|
407
459
|
esp_ble_gattc_get_all_char(this->gattc_if_, this->conn_id_, param->reg_for_notify.handle,
|
|
408
460
|
param->reg_for_notify.handle, &char_result, &count, 0);
|
|
409
461
|
if (char_status != ESP_GATT_OK) {
|
|
410
|
-
|
|
411
|
-
this->address_str_.c_str(), char_status);
|
|
462
|
+
this->log_gattc_warning_("esp_ble_gattc_get_all_char", char_status);
|
|
412
463
|
break;
|
|
413
464
|
}
|
|
414
465
|
|
|
@@ -422,8 +473,7 @@ bool BLEClientBase::gattc_event_handler(esp_gattc_cb_event_t event, esp_gatt_if_
|
|
|
422
473
|
(uint8_t *) ¬ify_en, ESP_GATT_WRITE_TYPE_RSP, ESP_GATT_AUTH_REQ_NONE);
|
|
423
474
|
ESP_LOGD(TAG, "Wrote notify descriptor %d, properties=%d", notify_en, char_result.properties);
|
|
424
475
|
if (status) {
|
|
425
|
-
|
|
426
|
-
this->address_str_.c_str(), status);
|
|
476
|
+
this->log_gattc_warning_("esp_ble_gattc_write_char_descr", status);
|
|
427
477
|
}
|
|
428
478
|
break;
|
|
429
479
|
}
|
|
@@ -531,6 +581,7 @@ float BLEClientBase::parse_char_value(uint8_t *value, uint16_t length) {
|
|
|
531
581
|
return NAN;
|
|
532
582
|
}
|
|
533
583
|
|
|
584
|
+
#ifdef USE_ESP32_BLE_DEVICE
|
|
534
585
|
BLEService *BLEClientBase::get_service(espbt::ESPBTUUID uuid) {
|
|
535
586
|
for (auto *svc : this->services_) {
|
|
536
587
|
if (svc->uuid == uuid)
|
|
@@ -607,8 +658,8 @@ BLEDescriptor *BLEClientBase::get_descriptor(uint16_t handle) {
|
|
|
607
658
|
}
|
|
608
659
|
return nullptr;
|
|
609
660
|
}
|
|
661
|
+
#endif // USE_ESP32_BLE_DEVICE
|
|
610
662
|
|
|
611
|
-
} // namespace esp32_ble_client
|
|
612
|
-
} // namespace esphome
|
|
663
|
+
} // namespace esphome::esp32_ble_client
|
|
613
664
|
|
|
614
665
|
#endif // USE_ESP32
|
|
@@ -5,7 +5,9 @@
|
|
|
5
5
|
#include "esphome/components/esp32_ble_tracker/esp32_ble_tracker.h"
|
|
6
6
|
#include "esphome/core/component.h"
|
|
7
7
|
|
|
8
|
+
#ifdef USE_ESP32_BLE_DEVICE
|
|
8
9
|
#include "ble_service.h"
|
|
10
|
+
#endif
|
|
9
11
|
|
|
10
12
|
#include <array>
|
|
11
13
|
#include <string>
|
|
@@ -16,8 +18,7 @@
|
|
|
16
18
|
#include <esp_gatt_common_api.h>
|
|
17
19
|
#include <esp_gattc_api.h>
|
|
18
20
|
|
|
19
|
-
namespace esphome {
|
|
20
|
-
namespace esp32_ble_client {
|
|
21
|
+
namespace esphome::esp32_ble_client {
|
|
21
22
|
|
|
22
23
|
namespace espbt = esphome::esp32_ble_tracker;
|
|
23
24
|
|
|
@@ -31,7 +32,9 @@ class BLEClientBase : public espbt::ESPBTClient, public Component {
|
|
|
31
32
|
void dump_config() override;
|
|
32
33
|
|
|
33
34
|
void run_later(std::function<void()> &&f); // NOLINT
|
|
35
|
+
#ifdef USE_ESP32_BLE_DEVICE
|
|
34
36
|
bool parse_device(const espbt::ESPBTDevice &device) override;
|
|
37
|
+
#endif
|
|
35
38
|
void on_scan_end() override {}
|
|
36
39
|
bool gattc_event_handler(esp_gattc_cb_event_t event, esp_gatt_if_t gattc_if,
|
|
37
40
|
esp_ble_gattc_cb_param_t *param) override;
|
|
@@ -46,7 +49,7 @@ class BLEClientBase : public espbt::ESPBTClient, public Component {
|
|
|
46
49
|
|
|
47
50
|
void set_auto_connect(bool auto_connect) { this->auto_connect_ = auto_connect; }
|
|
48
51
|
|
|
49
|
-
void set_address(uint64_t address) {
|
|
52
|
+
virtual void set_address(uint64_t address) {
|
|
50
53
|
this->address_ = address;
|
|
51
54
|
this->remote_bda_[0] = (address >> 40) & 0xFF;
|
|
52
55
|
this->remote_bda_[1] = (address >> 32) & 0xFF;
|
|
@@ -64,8 +67,9 @@ class BLEClientBase : public espbt::ESPBTClient, public Component {
|
|
|
64
67
|
(uint8_t) (this->address_ >> 0) & 0xff);
|
|
65
68
|
}
|
|
66
69
|
}
|
|
67
|
-
std::string address_str() const { return this->address_str_; }
|
|
70
|
+
const std::string &address_str() const { return this->address_str_; }
|
|
68
71
|
|
|
72
|
+
#ifdef USE_ESP32_BLE_DEVICE
|
|
69
73
|
BLEService *get_service(espbt::ESPBTUUID uuid);
|
|
70
74
|
BLEService *get_service(uint16_t uuid);
|
|
71
75
|
BLECharacteristic *get_characteristic(espbt::ESPBTUUID service, espbt::ESPBTUUID chr);
|
|
@@ -76,6 +80,7 @@ class BLEClientBase : public espbt::ESPBTClient, public Component {
|
|
|
76
80
|
BLEDescriptor *get_descriptor(uint16_t handle);
|
|
77
81
|
// Get the configuration descriptor for the given characteristic handle.
|
|
78
82
|
BLEDescriptor *get_config_descriptor(uint16_t handle);
|
|
83
|
+
#endif
|
|
79
84
|
|
|
80
85
|
float parse_char_value(uint8_t *value, uint16_t length);
|
|
81
86
|
|
|
@@ -102,7 +107,9 @@ class BLEClientBase : public espbt::ESPBTClient, public Component {
|
|
|
102
107
|
|
|
103
108
|
// Group 2: Container types (grouped for memory optimization)
|
|
104
109
|
std::string address_str_{};
|
|
110
|
+
#ifdef USE_ESP32_BLE_DEVICE
|
|
105
111
|
std::vector<BLEService *> services_;
|
|
112
|
+
#endif
|
|
106
113
|
|
|
107
114
|
// Group 3: 4-byte types
|
|
108
115
|
int gattc_if_;
|
|
@@ -125,9 +132,13 @@ class BLEClientBase : public espbt::ESPBTClient, public Component {
|
|
|
125
132
|
// 6 bytes used, 2 bytes padding
|
|
126
133
|
|
|
127
134
|
void log_event_(const char *name);
|
|
135
|
+
void log_gattc_event_(const char *name);
|
|
136
|
+
void restore_medium_conn_params_();
|
|
137
|
+
void log_gattc_warning_(const char *operation, esp_gatt_status_t status);
|
|
138
|
+
void log_gattc_warning_(const char *operation, esp_err_t err);
|
|
139
|
+
void log_connection_params_(const char *param_type);
|
|
128
140
|
};
|
|
129
141
|
|
|
130
|
-
} // namespace esp32_ble_client
|
|
131
|
-
} // namespace esphome
|
|
142
|
+
} // namespace esphome::esp32_ble_client
|
|
132
143
|
|
|
133
144
|
#endif // USE_ESP32
|
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
#pragma once
|
|
2
2
|
|
|
3
|
+
#include "esphome/core/defines.h"
|
|
4
|
+
|
|
3
5
|
#ifdef USE_ESP32
|
|
6
|
+
#ifdef USE_ESP32_BLE_DEVICE
|
|
4
7
|
|
|
5
8
|
#include "esphome/components/esp32_ble_tracker/esp32_ble_tracker.h"
|
|
6
9
|
|
|
7
|
-
namespace esphome {
|
|
8
|
-
namespace esp32_ble_client {
|
|
10
|
+
namespace esphome::esp32_ble_client {
|
|
9
11
|
|
|
10
12
|
namespace espbt = esphome::esp32_ble_tracker;
|
|
11
13
|
|
|
@@ -19,7 +21,7 @@ class BLEDescriptor {
|
|
|
19
21
|
BLECharacteristic *characteristic;
|
|
20
22
|
};
|
|
21
23
|
|
|
22
|
-
} // namespace esp32_ble_client
|
|
23
|
-
} // namespace esphome
|
|
24
|
+
} // namespace esphome::esp32_ble_client
|
|
24
25
|
|
|
26
|
+
#endif // USE_ESP32_BLE_DEVICE
|
|
25
27
|
#endif // USE_ESP32
|
|
@@ -4,9 +4,9 @@
|
|
|
4
4
|
#include "esphome/core/log.h"
|
|
5
5
|
|
|
6
6
|
#ifdef USE_ESP32
|
|
7
|
+
#ifdef USE_ESP32_BLE_DEVICE
|
|
7
8
|
|
|
8
|
-
namespace esphome {
|
|
9
|
-
namespace esp32_ble_client {
|
|
9
|
+
namespace esphome::esp32_ble_client {
|
|
10
10
|
|
|
11
11
|
static const char *const TAG = "esp32_ble_client";
|
|
12
12
|
|
|
@@ -71,7 +71,7 @@ void BLEService::parse_characteristics() {
|
|
|
71
71
|
}
|
|
72
72
|
}
|
|
73
73
|
|
|
74
|
-
} // namespace esp32_ble_client
|
|
75
|
-
} // namespace esphome
|
|
74
|
+
} // namespace esphome::esp32_ble_client
|
|
76
75
|
|
|
76
|
+
#endif // USE_ESP32_BLE_DEVICE
|
|
77
77
|
#endif // USE_ESP32
|
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
#pragma once
|
|
2
2
|
|
|
3
|
+
#include "esphome/core/defines.h"
|
|
4
|
+
|
|
3
5
|
#ifdef USE_ESP32
|
|
6
|
+
#ifdef USE_ESP32_BLE_DEVICE
|
|
4
7
|
|
|
5
8
|
#include "esphome/components/esp32_ble_tracker/esp32_ble_tracker.h"
|
|
6
9
|
|
|
@@ -8,8 +11,7 @@
|
|
|
8
11
|
|
|
9
12
|
#include <vector>
|
|
10
13
|
|
|
11
|
-
namespace esphome {
|
|
12
|
-
namespace esp32_ble_client {
|
|
14
|
+
namespace esphome::esp32_ble_client {
|
|
13
15
|
|
|
14
16
|
namespace espbt = esphome::esp32_ble_tracker;
|
|
15
17
|
|
|
@@ -30,7 +32,7 @@ class BLEService {
|
|
|
30
32
|
BLECharacteristic *get_characteristic(uint16_t uuid);
|
|
31
33
|
};
|
|
32
34
|
|
|
33
|
-
} // namespace esp32_ble_client
|
|
34
|
-
} // namespace esphome
|
|
35
|
+
} // namespace esphome::esp32_ble_client
|
|
35
36
|
|
|
37
|
+
#endif // USE_ESP32_BLE_DEVICE
|
|
36
38
|
#endif // USE_ESP32
|