esphome 2025.7.4__py3-none-any.whl → 2025.8.0b1__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.
Potentially problematic release.
This version of esphome might be problematic. Click here for more details.
- esphome/__main__.py +189 -82
- 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 +112 -56
- 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 +488 -118
- esphome/components/atm90e32/atm90e32.h +44 -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 +387 -82
- 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 +199 -58
- 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 +40 -2
- esphome/components/esp32_ble/ble.cpp +12 -8
- 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 +2 -4
- 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/font/__init__.py +9 -1
- 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 +46 -19
- esphome/components/i2s_audio/microphone/i2s_audio_microphone.h +4 -3
- 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/lvgl/widgets/tileview.py +15 -7
- 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 +0 -1
- 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/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 +2 -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/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 +187 -352
- 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 +8 -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 +8 -15
- esphome/const.py +26 -1
- esphome/core/__init__.py +88 -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 +41 -6
- esphome/core/helpers.cpp +8 -15
- esphome/core/helpers.h +60 -6
- esphome/core/lock_free_queue.h +1 -1
- esphome/core/scheduler.cpp +277 -74
- esphome/core/scheduler.h +89 -27
- 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 +5 -107
- esphome/yaml_util.py +7 -5
- {esphome-2025.7.4.dist-info → esphome-2025.8.0b1.dist-info}/METADATA +12 -13
- {esphome-2025.7.4.dist-info → esphome-2025.8.0b1.dist-info}/RECORD +753 -673
- 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.4.dist-info → esphome-2025.8.0b1.dist-info}/WHEEL +0 -0
- {esphome-2025.7.4.dist-info → esphome-2025.8.0b1.dist-info}/entry_points.txt +0 -0
- {esphome-2025.7.4.dist-info → esphome-2025.8.0b1.dist-info}/licenses/LICENSE +0 -0
- {esphome-2025.7.4.dist-info → esphome-2025.8.0b1.dist-info}/top_level.txt +0 -0
|
@@ -1,77 +1,128 @@
|
|
|
1
|
-
#
|
|
2
|
-
|
|
3
|
-
#
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
import
|
|
7
|
-
import shutil
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
1
|
+
Import("env") # noqa: F821
|
|
2
|
+
|
|
3
|
+
import itertools # noqa: E402
|
|
4
|
+
import json # noqa: E402
|
|
5
|
+
import os # noqa: E402
|
|
6
|
+
import pathlib # noqa: E402
|
|
7
|
+
import shutil # noqa: E402
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
def merge_factory_bin(source, target, env):
|
|
11
|
+
"""
|
|
12
|
+
Merges all flash sections into a single .factory.bin using esptool.
|
|
13
|
+
Attempts multiple methods to detect image layout: flasher_args.json, FLASH_EXTRA_IMAGES, fallback guesses.
|
|
14
|
+
"""
|
|
15
|
+
firmware_name = os.path.basename(env.subst("$PROGNAME")) + ".bin"
|
|
16
|
+
build_dir = pathlib.Path(env.subst("$BUILD_DIR"))
|
|
17
|
+
firmware_path = build_dir / firmware_name
|
|
18
|
+
flash_size = env.BoardConfig().get("upload.flash_size", "4MB")
|
|
19
|
+
chip = env.BoardConfig().get("build.mcu", "esp32")
|
|
20
|
+
|
|
21
|
+
sections = []
|
|
22
|
+
flasher_args_path = build_dir / "flasher_args.json"
|
|
23
|
+
|
|
24
|
+
# 1. Try flasher_args.json
|
|
25
|
+
if flasher_args_path.exists():
|
|
26
|
+
try:
|
|
27
|
+
with flasher_args_path.open() as f:
|
|
28
|
+
flash_data = json.load(f)
|
|
29
|
+
for addr, fname in sorted(
|
|
30
|
+
flash_data["flash_files"].items(), key=lambda kv: int(kv[0], 16)
|
|
31
|
+
):
|
|
32
|
+
file_path = pathlib.Path(fname)
|
|
33
|
+
if file_path.exists():
|
|
34
|
+
sections.append((addr, str(file_path)))
|
|
35
|
+
else:
|
|
36
|
+
print(f"Info: {file_path.name} not found - skipping")
|
|
37
|
+
except Exception as e:
|
|
38
|
+
print(f"Warning: Failed to parse flasher_args.json - {e}")
|
|
39
|
+
|
|
40
|
+
# 2. Try FLASH_EXTRA_IMAGES if flasher_args.json failed or was empty
|
|
41
|
+
if not sections:
|
|
42
|
+
flash_images = env.get("FLASH_EXTRA_IMAGES")
|
|
43
|
+
if flash_images:
|
|
44
|
+
print("Using FLASH_EXTRA_IMAGES from PlatformIO environment")
|
|
45
|
+
# flatten any nested lists
|
|
46
|
+
flat = list(
|
|
47
|
+
itertools.chain.from_iterable(
|
|
48
|
+
x if isinstance(x, (list, tuple)) else [x] for x in flash_images
|
|
49
|
+
)
|
|
50
|
+
)
|
|
51
|
+
entries = [env.subst(x) for x in flat]
|
|
52
|
+
for i in range(0, len(entries) - 1, 2):
|
|
53
|
+
addr, fname = entries[i], entries[i + 1]
|
|
54
|
+
if isinstance(fname, (list, tuple)):
|
|
55
|
+
print(
|
|
56
|
+
f"Warning: Skipping malformed FLASH_EXTRA_IMAGES entry: {fname}"
|
|
57
|
+
)
|
|
58
|
+
continue
|
|
59
|
+
file_path = pathlib.Path(str(fname))
|
|
60
|
+
if file_path.exists():
|
|
61
|
+
sections.append((addr, file_path))
|
|
62
|
+
else:
|
|
63
|
+
print(f"Info: {file_path.name} not found — skipping")
|
|
64
|
+
if sections:
|
|
65
|
+
# Append main firmware to sections
|
|
66
|
+
sections.append(("0x10000", firmware_path))
|
|
67
|
+
|
|
68
|
+
# 3. Final fallback: guess standard image locations
|
|
69
|
+
if not sections:
|
|
70
|
+
print("Fallback: guessing legacy image paths")
|
|
71
|
+
guesses = [
|
|
72
|
+
("0x0", build_dir / "bootloader" / "bootloader.bin"),
|
|
73
|
+
("0x8000", build_dir / "partition_table" / "partition-table.bin"),
|
|
74
|
+
("0xe000", build_dir / "ota_data_initial.bin"),
|
|
75
|
+
("0x10000", firmware_path),
|
|
76
|
+
]
|
|
77
|
+
for addr, file_path in guesses:
|
|
78
|
+
if file_path.exists():
|
|
79
|
+
sections.append((addr, file_path))
|
|
80
|
+
else:
|
|
81
|
+
print(f"Info: {file_path.name} not found — skipping")
|
|
82
|
+
|
|
83
|
+
# If no valid sections found, skip merge
|
|
84
|
+
if not sections:
|
|
85
|
+
print("No valid flash sections found — skipping .factory.bin creation.")
|
|
86
|
+
return
|
|
87
|
+
|
|
88
|
+
output_path = firmware_path.with_suffix(".factory.bin")
|
|
89
|
+
python_exe = f'"{env.subst("$PYTHONEXE")}"'
|
|
37
90
|
cmd = [
|
|
91
|
+
python_exe,
|
|
92
|
+
"-m",
|
|
93
|
+
"esptool",
|
|
38
94
|
"--chip",
|
|
39
95
|
chip,
|
|
40
|
-
"
|
|
41
|
-
"-
|
|
42
|
-
new_file_name,
|
|
43
|
-
"--flash_size",
|
|
96
|
+
"merge-bin",
|
|
97
|
+
"--flash-size",
|
|
44
98
|
flash_size,
|
|
99
|
+
"--output",
|
|
100
|
+
str(output_path),
|
|
45
101
|
]
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
for section in sections:
|
|
49
|
-
sect_adr, sect_file = section.split(" ", 1)
|
|
50
|
-
if verbose:
|
|
51
|
-
print(f" - {sect_adr} | {sect_file}")
|
|
52
|
-
cmd += [sect_adr, sect_file]
|
|
102
|
+
for addr, file_path in sections:
|
|
103
|
+
cmd += [addr, str(file_path)]
|
|
53
104
|
|
|
54
|
-
|
|
105
|
+
print(f"Merging binaries into {output_path}")
|
|
106
|
+
result = env.Execute(
|
|
107
|
+
env.VerboseAction(" ".join(cmd), "Merging binaries with esptool")
|
|
108
|
+
)
|
|
55
109
|
|
|
56
|
-
if
|
|
57
|
-
print(f"
|
|
58
|
-
print()
|
|
59
|
-
print(f"Using esptool.py arguments: {' '.join(cmd)}")
|
|
60
|
-
print()
|
|
61
|
-
|
|
62
|
-
if os.environ.get("ESPHOME_USE_SUBPROCESS") is None:
|
|
63
|
-
esptool.main(cmd)
|
|
110
|
+
if result == 0:
|
|
111
|
+
print(f"Successfully created {output_path}")
|
|
64
112
|
else:
|
|
65
|
-
|
|
113
|
+
print(f"Error: esptool merge-bin failed with code {result}")
|
|
66
114
|
|
|
67
115
|
|
|
68
116
|
def esp32_copy_ota_bin(source, target, env):
|
|
117
|
+
"""
|
|
118
|
+
Copy the main firmware to a .ota.bin file for compatibility with ESPHome OTA tools.
|
|
119
|
+
"""
|
|
69
120
|
firmware_name = env.subst("$BUILD_DIR/${PROGNAME}.bin")
|
|
70
121
|
new_file_name = env.subst("$BUILD_DIR/${PROGNAME}.ota.bin")
|
|
71
|
-
|
|
72
122
|
shutil.copyfile(firmware_name, new_file_name)
|
|
123
|
+
print(f"Copied firmware to {new_file_name}")
|
|
73
124
|
|
|
74
125
|
|
|
75
|
-
#
|
|
76
|
-
env.AddPostAction("$BUILD_DIR/${PROGNAME}.bin",
|
|
77
|
-
env.AddPostAction("$BUILD_DIR/${PROGNAME}.bin", esp32_copy_ota_bin) # noqa
|
|
126
|
+
# Run merge first, then ota copy second
|
|
127
|
+
env.AddPostAction("$BUILD_DIR/${PROGNAME}.bin", merge_factory_bin) # noqa: F821
|
|
128
|
+
env.AddPostAction("$BUILD_DIR/${PROGNAME}.bin", esp32_copy_ota_bin) # noqa: F821
|
|
@@ -6,12 +6,13 @@ import esphome.codegen as cg
|
|
|
6
6
|
from esphome.components.esp32 import add_idf_sdkconfig_option, const, get_esp32_variant
|
|
7
7
|
import esphome.config_validation as cv
|
|
8
8
|
from esphome.const import CONF_ENABLE_ON_BOOT, CONF_ESPHOME, CONF_ID, CONF_NAME
|
|
9
|
-
from esphome.core import CORE
|
|
9
|
+
from esphome.core import CORE, TimePeriod
|
|
10
10
|
from esphome.core.config import CONF_NAME_ADD_MAC_SUFFIX
|
|
11
11
|
import esphome.final_validate as fv
|
|
12
12
|
|
|
13
13
|
DEPENDENCIES = ["esp32"]
|
|
14
|
-
CODEOWNERS = ["@jesserockz", "@Rapsssito"]
|
|
14
|
+
CODEOWNERS = ["@jesserockz", "@Rapsssito", "@bdraco"]
|
|
15
|
+
DOMAIN = "esp32_ble"
|
|
15
16
|
|
|
16
17
|
|
|
17
18
|
class BTLoggers(Enum):
|
|
@@ -115,8 +116,11 @@ def register_bt_logger(*loggers: BTLoggers) -> None:
|
|
|
115
116
|
|
|
116
117
|
CONF_BLE_ID = "ble_id"
|
|
117
118
|
CONF_IO_CAPABILITY = "io_capability"
|
|
119
|
+
CONF_ADVERTISING = "advertising"
|
|
118
120
|
CONF_ADVERTISING_CYCLE_TIME = "advertising_cycle_time"
|
|
119
121
|
CONF_DISABLE_BT_LOGS = "disable_bt_logs"
|
|
122
|
+
CONF_CONNECTION_TIMEOUT = "connection_timeout"
|
|
123
|
+
CONF_MAX_NOTIFICATIONS = "max_notifications"
|
|
120
124
|
|
|
121
125
|
NO_BLUETOOTH_VARIANTS = [const.VARIANT_ESP32S2]
|
|
122
126
|
|
|
@@ -161,12 +165,23 @@ CONFIG_SCHEMA = cv.Schema(
|
|
|
161
165
|
IO_CAPABILITY, lower=True
|
|
162
166
|
),
|
|
163
167
|
cv.Optional(CONF_ENABLE_ON_BOOT, default=True): cv.boolean,
|
|
168
|
+
cv.Optional(CONF_ADVERTISING, default=False): cv.boolean,
|
|
164
169
|
cv.Optional(
|
|
165
170
|
CONF_ADVERTISING_CYCLE_TIME, default="10s"
|
|
166
171
|
): cv.positive_time_period_milliseconds,
|
|
167
172
|
cv.SplitDefault(CONF_DISABLE_BT_LOGS, esp32_idf=True): cv.All(
|
|
168
173
|
cv.only_with_esp_idf, cv.boolean
|
|
169
174
|
),
|
|
175
|
+
cv.SplitDefault(CONF_CONNECTION_TIMEOUT, esp32_idf="20s"): cv.All(
|
|
176
|
+
cv.only_with_esp_idf,
|
|
177
|
+
cv.positive_time_period_seconds,
|
|
178
|
+
cv.Range(min=TimePeriod(seconds=10), max=TimePeriod(seconds=180)),
|
|
179
|
+
),
|
|
180
|
+
cv.SplitDefault(CONF_MAX_NOTIFICATIONS, esp32_idf=12): cv.All(
|
|
181
|
+
cv.only_with_esp_idf,
|
|
182
|
+
cv.positive_int,
|
|
183
|
+
cv.Range(min=1, max=64),
|
|
184
|
+
),
|
|
170
185
|
}
|
|
171
186
|
).extend(cv.COMPONENT_SCHEMA)
|
|
172
187
|
|
|
@@ -255,8 +270,31 @@ async def to_code(config):
|
|
|
255
270
|
if logger not in _required_loggers:
|
|
256
271
|
add_idf_sdkconfig_option(f"{logger.value}_NONE", True)
|
|
257
272
|
|
|
273
|
+
# Set BLE connection establishment timeout to match aioesphomeapi/bleak-retry-connector
|
|
274
|
+
# Default is 20 seconds instead of ESP-IDF's 30 seconds. Because there is no way to
|
|
275
|
+
# cancel a BLE connection in progress, when aioesphomeapi times out at 20 seconds,
|
|
276
|
+
# the connection slot remains occupied for the remaining time, preventing new connection
|
|
277
|
+
# attempts and wasting valuable connection slots.
|
|
278
|
+
if CONF_CONNECTION_TIMEOUT in config:
|
|
279
|
+
timeout_seconds = int(config[CONF_CONNECTION_TIMEOUT].total_seconds)
|
|
280
|
+
add_idf_sdkconfig_option(
|
|
281
|
+
"CONFIG_BT_BLE_ESTAB_LINK_CONN_TOUT", timeout_seconds
|
|
282
|
+
)
|
|
283
|
+
|
|
284
|
+
# Set the maximum number of notification registrations
|
|
285
|
+
# This controls how many BLE characteristics can have notifications enabled
|
|
286
|
+
# across all connections for a single GATT client interface
|
|
287
|
+
# https://github.com/esphome/issues/issues/6808
|
|
288
|
+
if CONF_MAX_NOTIFICATIONS in config:
|
|
289
|
+
add_idf_sdkconfig_option(
|
|
290
|
+
"CONFIG_BT_GATTC_NOTIF_REG_MAX", config[CONF_MAX_NOTIFICATIONS]
|
|
291
|
+
)
|
|
292
|
+
|
|
258
293
|
cg.add_define("USE_ESP32_BLE")
|
|
259
294
|
|
|
295
|
+
if config[CONF_ADVERTISING]:
|
|
296
|
+
cg.add_define("USE_ESP32_BLE_ADVERTISING")
|
|
297
|
+
|
|
260
298
|
|
|
261
299
|
@automation.register_condition("ble.enabled", BLEEnabledCondition, cv.Schema({}))
|
|
262
300
|
async def ble_enabled_to_code(config, condition_id, template_arg, args):
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
#ifdef USE_ESP32
|
|
2
|
-
|
|
3
1
|
#include "ble.h"
|
|
4
2
|
|
|
3
|
+
#ifdef USE_ESP32
|
|
4
|
+
|
|
5
5
|
#include "esphome/core/application.h"
|
|
6
6
|
#include "esphome/core/helpers.h"
|
|
7
7
|
#include "esphome/core/log.h"
|
|
@@ -19,15 +19,12 @@
|
|
|
19
19
|
#include <esp32-hal-bt.h>
|
|
20
20
|
#endif
|
|
21
21
|
|
|
22
|
-
namespace esphome {
|
|
23
|
-
namespace esp32_ble {
|
|
22
|
+
namespace esphome::esp32_ble {
|
|
24
23
|
|
|
25
24
|
static const char *const TAG = "esp32_ble";
|
|
26
25
|
|
|
27
26
|
void ESP32BLE::setup() {
|
|
28
27
|
global_ble = this;
|
|
29
|
-
ESP_LOGCONFIG(TAG, "Running setup");
|
|
30
|
-
|
|
31
28
|
if (!ble_pre_setup_()) {
|
|
32
29
|
ESP_LOGE(TAG, "BLE could not be prepared for configuration");
|
|
33
30
|
this->mark_failed();
|
|
@@ -56,6 +53,7 @@ void ESP32BLE::disable() {
|
|
|
56
53
|
|
|
57
54
|
bool ESP32BLE::is_active() { return this->state_ == BLE_COMPONENT_STATE_ACTIVE; }
|
|
58
55
|
|
|
56
|
+
#ifdef USE_ESP32_BLE_ADVERTISING
|
|
59
57
|
void ESP32BLE::advertising_start() {
|
|
60
58
|
this->advertising_init_();
|
|
61
59
|
if (!this->is_active())
|
|
@@ -91,6 +89,7 @@ void ESP32BLE::advertising_remove_service_uuid(ESPBTUUID uuid) {
|
|
|
91
89
|
this->advertising_->remove_service_uuid(uuid);
|
|
92
90
|
this->advertising_start();
|
|
93
91
|
}
|
|
92
|
+
#endif
|
|
94
93
|
|
|
95
94
|
bool ESP32BLE::ble_pre_setup_() {
|
|
96
95
|
esp_err_t err = nvs_flash_init();
|
|
@@ -101,6 +100,7 @@ bool ESP32BLE::ble_pre_setup_() {
|
|
|
101
100
|
return true;
|
|
102
101
|
}
|
|
103
102
|
|
|
103
|
+
#ifdef USE_ESP32_BLE_ADVERTISING
|
|
104
104
|
void ESP32BLE::advertising_init_() {
|
|
105
105
|
if (this->advertising_ != nullptr)
|
|
106
106
|
return;
|
|
@@ -110,6 +110,7 @@ void ESP32BLE::advertising_init_() {
|
|
|
110
110
|
this->advertising_->set_min_preferred_interval(0x06);
|
|
111
111
|
this->advertising_->set_appearance(this->appearance_);
|
|
112
112
|
}
|
|
113
|
+
#endif
|
|
113
114
|
|
|
114
115
|
bool ESP32BLE::ble_setup_() {
|
|
115
116
|
esp_err_t err;
|
|
@@ -397,9 +398,11 @@ void ESP32BLE::loop() {
|
|
|
397
398
|
this->ble_event_pool_.release(ble_event);
|
|
398
399
|
ble_event = this->ble_events_.pop();
|
|
399
400
|
}
|
|
401
|
+
#ifdef USE_ESP32_BLE_ADVERTISING
|
|
400
402
|
if (this->advertising_ != nullptr) {
|
|
401
403
|
this->advertising_->loop();
|
|
402
404
|
}
|
|
405
|
+
#endif
|
|
403
406
|
|
|
404
407
|
// Log dropped events periodically
|
|
405
408
|
uint16_t dropped = this->ble_events_.get_and_reset_dropped_count();
|
|
@@ -471,6 +474,8 @@ void ESP32BLE::gap_event_handler(esp_gap_ble_cb_event_t event, esp_ble_gap_cb_pa
|
|
|
471
474
|
// Ignore these GAP events as they are not relevant for our use case
|
|
472
475
|
case ESP_GAP_BLE_UPDATE_CONN_PARAMS_EVT:
|
|
473
476
|
case ESP_GAP_BLE_SET_PKT_LENGTH_COMPLETE_EVT:
|
|
477
|
+
case ESP_GAP_BLE_PHY_UPDATE_COMPLETE_EVT: // BLE 5.0 PHY update complete
|
|
478
|
+
case ESP_GAP_BLE_CHANNEL_SELECT_ALGORITHM_EVT: // BLE 5.0 channel selection algorithm
|
|
474
479
|
return;
|
|
475
480
|
|
|
476
481
|
default:
|
|
@@ -538,7 +543,6 @@ uint64_t ble_addr_to_uint64(const esp_bd_addr_t address) {
|
|
|
538
543
|
|
|
539
544
|
ESP32BLE *global_ble = nullptr; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables)
|
|
540
545
|
|
|
541
|
-
} // namespace esp32_ble
|
|
542
|
-
} // namespace esphome
|
|
546
|
+
} // namespace esphome::esp32_ble
|
|
543
547
|
|
|
544
548
|
#endif
|
|
@@ -1,14 +1,17 @@
|
|
|
1
1
|
#pragma once
|
|
2
2
|
|
|
3
|
-
#include "
|
|
3
|
+
#include "esphome/core/defines.h" // Must be included before conditional includes
|
|
4
|
+
|
|
4
5
|
#include "ble_uuid.h"
|
|
5
6
|
#include "ble_scan_result.h"
|
|
7
|
+
#ifdef USE_ESP32_BLE_ADVERTISING
|
|
8
|
+
#include "ble_advertising.h"
|
|
9
|
+
#endif
|
|
6
10
|
|
|
7
11
|
#include <functional>
|
|
8
12
|
|
|
9
13
|
#include "esphome/core/automation.h"
|
|
10
14
|
#include "esphome/core/component.h"
|
|
11
|
-
#include "esphome/core/defines.h"
|
|
12
15
|
#include "esphome/core/helpers.h"
|
|
13
16
|
|
|
14
17
|
#include "ble_event.h"
|
|
@@ -21,24 +24,16 @@
|
|
|
21
24
|
#include <esp_gattc_api.h>
|
|
22
25
|
#include <esp_gatts_api.h>
|
|
23
26
|
|
|
24
|
-
namespace esphome {
|
|
25
|
-
namespace esp32_ble {
|
|
27
|
+
namespace esphome::esp32_ble {
|
|
26
28
|
|
|
27
|
-
// Maximum
|
|
28
|
-
//
|
|
29
|
-
// With 16 advertisements per batch and some safety margin:
|
|
30
|
-
// - Without PSRAM: 24 entries (1.5× batch size)
|
|
31
|
-
// - With PSRAM: 36 entries (2.25× batch size)
|
|
32
|
-
// The reduced structure size (~80 bytes vs ~400 bytes) allows for larger buffers
|
|
29
|
+
// Maximum size of the BLE event queue
|
|
30
|
+
// Increased to absorb the ring buffer capacity from esp32_ble_tracker
|
|
33
31
|
#ifdef USE_PSRAM
|
|
34
|
-
static constexpr uint8_t
|
|
32
|
+
static constexpr uint8_t MAX_BLE_QUEUE_SIZE = 100; // 64 + 36 (ring buffer size with PSRAM)
|
|
35
33
|
#else
|
|
36
|
-
static constexpr uint8_t
|
|
34
|
+
static constexpr uint8_t MAX_BLE_QUEUE_SIZE = 88; // 64 + 24 (ring buffer size without PSRAM)
|
|
37
35
|
#endif
|
|
38
36
|
|
|
39
|
-
// Maximum size of the BLE event queue - must be power of 2 for lock-free queue
|
|
40
|
-
static constexpr size_t MAX_BLE_QUEUE_SIZE = 64;
|
|
41
|
-
|
|
42
37
|
uint64_t ble_addr_to_uint64(const esp_bd_addr_t address);
|
|
43
38
|
|
|
44
39
|
// NOLINTNEXTLINE(modernize-use-using)
|
|
@@ -114,6 +109,7 @@ class ESP32BLE : public Component {
|
|
|
114
109
|
float get_setup_priority() const override;
|
|
115
110
|
void set_name(const std::string &name) { this->name_ = name; }
|
|
116
111
|
|
|
112
|
+
#ifdef USE_ESP32_BLE_ADVERTISING
|
|
117
113
|
void advertising_start();
|
|
118
114
|
void advertising_set_service_data(const std::vector<uint8_t> &data);
|
|
119
115
|
void advertising_set_manufacturer_data(const std::vector<uint8_t> &data);
|
|
@@ -121,6 +117,7 @@ class ESP32BLE : public Component {
|
|
|
121
117
|
void advertising_add_service_uuid(ESPBTUUID uuid);
|
|
122
118
|
void advertising_remove_service_uuid(ESPBTUUID uuid);
|
|
123
119
|
void advertising_register_raw_advertisement_callback(std::function<void(bool)> &&callback);
|
|
120
|
+
#endif
|
|
124
121
|
|
|
125
122
|
void register_gap_event_handler(GAPEventHandler *handler) { this->gap_event_handlers_.push_back(handler); }
|
|
126
123
|
void register_gap_scan_event_handler(GAPScanEventHandler *handler) {
|
|
@@ -141,7 +138,9 @@ class ESP32BLE : public Component {
|
|
|
141
138
|
bool ble_setup_();
|
|
142
139
|
bool ble_dismantle_();
|
|
143
140
|
bool ble_pre_setup_();
|
|
141
|
+
#ifdef USE_ESP32_BLE_ADVERTISING
|
|
144
142
|
void advertising_init_();
|
|
143
|
+
#endif
|
|
145
144
|
|
|
146
145
|
private:
|
|
147
146
|
template<typename... Args> friend void enqueue_ble_event(Args... args);
|
|
@@ -161,7 +160,9 @@ class ESP32BLE : public Component {
|
|
|
161
160
|
optional<std::string> name_;
|
|
162
161
|
|
|
163
162
|
// 4-byte aligned members
|
|
164
|
-
|
|
163
|
+
#ifdef USE_ESP32_BLE_ADVERTISING
|
|
164
|
+
BLEAdvertising *advertising_{}; // 4 bytes (pointer)
|
|
165
|
+
#endif
|
|
165
166
|
esp_ble_io_cap_t io_cap_{ESP_IO_CAP_NONE}; // 4 bytes (enum)
|
|
166
167
|
uint32_t advertising_cycle_time_{}; // 4 bytes
|
|
167
168
|
|
|
@@ -191,7 +192,6 @@ template<typename... Ts> class BLEDisableAction : public Action<Ts...> {
|
|
|
191
192
|
void play(Ts... x) override { global_ble->disable(); }
|
|
192
193
|
};
|
|
193
194
|
|
|
194
|
-
} // namespace esp32_ble
|
|
195
|
-
} // namespace esphome
|
|
195
|
+
} // namespace esphome::esp32_ble
|
|
196
196
|
|
|
197
197
|
#endif
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
#include "ble_advertising.h"
|
|
2
2
|
|
|
3
3
|
#ifdef USE_ESP32
|
|
4
|
+
#ifdef USE_ESP32_BLE_ADVERTISING
|
|
4
5
|
|
|
5
6
|
#include <cstdio>
|
|
6
7
|
#include <cstring>
|
|
@@ -8,8 +9,7 @@
|
|
|
8
9
|
#include "esphome/core/log.h"
|
|
9
10
|
#include "esphome/core/application.h"
|
|
10
11
|
|
|
11
|
-
namespace esphome {
|
|
12
|
-
namespace esp32_ble {
|
|
12
|
+
namespace esphome::esp32_ble {
|
|
13
13
|
|
|
14
14
|
static const char *const TAG = "esp32_ble.advertising";
|
|
15
15
|
|
|
@@ -160,7 +160,7 @@ void BLEAdvertising::register_raw_advertisement_callback(std::function<void(bool
|
|
|
160
160
|
this->raw_advertisements_callbacks_.push_back(std::move(callback));
|
|
161
161
|
}
|
|
162
162
|
|
|
163
|
-
} // namespace esp32_ble
|
|
164
|
-
} // namespace esphome
|
|
163
|
+
} // namespace esphome::esp32_ble
|
|
165
164
|
|
|
166
|
-
#endif
|
|
165
|
+
#endif // USE_ESP32_BLE_ADVERTISING
|
|
166
|
+
#endif // USE_ESP32
|
|
@@ -1,17 +1,19 @@
|
|
|
1
1
|
#pragma once
|
|
2
2
|
|
|
3
|
+
#include "esphome/core/defines.h"
|
|
4
|
+
|
|
3
5
|
#include <array>
|
|
4
6
|
#include <functional>
|
|
5
7
|
#include <vector>
|
|
6
8
|
|
|
7
9
|
#ifdef USE_ESP32
|
|
10
|
+
#ifdef USE_ESP32_BLE_ADVERTISING
|
|
8
11
|
|
|
9
12
|
#include <esp_bt.h>
|
|
10
13
|
#include <esp_gap_ble_api.h>
|
|
11
14
|
#include <esp_gatts_api.h>
|
|
12
15
|
|
|
13
|
-
namespace esphome {
|
|
14
|
-
namespace esp32_ble {
|
|
16
|
+
namespace esphome::esp32_ble {
|
|
15
17
|
|
|
16
18
|
using raw_adv_data_t = struct {
|
|
17
19
|
uint8_t *data;
|
|
@@ -55,7 +57,7 @@ class BLEAdvertising {
|
|
|
55
57
|
int8_t current_adv_index_{-1}; // -1 means standard scan response
|
|
56
58
|
};
|
|
57
59
|
|
|
58
|
-
} // namespace esp32_ble
|
|
59
|
-
} // namespace esphome
|
|
60
|
+
} // namespace esphome::esp32_ble
|
|
60
61
|
|
|
61
|
-
#endif
|
|
62
|
+
#endif // USE_ESP32_BLE_ADVERTISING
|
|
63
|
+
#endif // USE_ESP32
|
|
@@ -11,8 +11,7 @@
|
|
|
11
11
|
|
|
12
12
|
#include "ble_scan_result.h"
|
|
13
13
|
|
|
14
|
-
namespace esphome {
|
|
15
|
-
namespace esp32_ble {
|
|
14
|
+
namespace esphome::esp32_ble {
|
|
16
15
|
|
|
17
16
|
// Compile-time verification that ESP-IDF scan complete events only contain a status field
|
|
18
17
|
// This ensures our reinterpret_cast in ble.cpp is safe
|
|
@@ -395,7 +394,6 @@ static_assert(sizeof(esp_ble_sec_t) <= 73, "esp_ble_sec_t is larger than BLEScan
|
|
|
395
394
|
|
|
396
395
|
// BLEEvent total size: 84 bytes (80 byte union + 1 byte type + 3 bytes padding)
|
|
397
396
|
|
|
398
|
-
} // namespace esp32_ble
|
|
399
|
-
} // namespace esphome
|
|
397
|
+
} // namespace esphome::esp32_ble
|
|
400
398
|
|
|
401
399
|
#endif
|
|
@@ -4,8 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
#include <esp_gap_ble_api.h>
|
|
6
6
|
|
|
7
|
-
namespace esphome {
|
|
8
|
-
namespace esp32_ble {
|
|
7
|
+
namespace esphome::esp32_ble {
|
|
9
8
|
|
|
10
9
|
// Structure for BLE scan results - only fields we actually use
|
|
11
10
|
struct __attribute__((packed)) BLEScanResult {
|
|
@@ -18,7 +17,6 @@ struct __attribute__((packed)) BLEScanResult {
|
|
|
18
17
|
uint8_t search_evt;
|
|
19
18
|
}; // ~73 bytes vs ~400 bytes for full esp_ble_gap_cb_param_t
|
|
20
19
|
|
|
21
|
-
} // namespace esp32_ble
|
|
22
|
-
} // namespace esphome
|
|
20
|
+
} // namespace esphome::esp32_ble
|
|
23
21
|
|
|
24
22
|
#endif
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
#include "ble_uuid.h"
|
|
2
2
|
|
|
3
3
|
#ifdef USE_ESP32
|
|
4
|
+
#ifdef USE_ESP32_BLE_UUID
|
|
4
5
|
|
|
5
6
|
#include <cstring>
|
|
6
7
|
#include <cstdio>
|
|
7
8
|
#include <cinttypes>
|
|
8
9
|
#include "esphome/core/log.h"
|
|
9
10
|
|
|
10
|
-
namespace esphome {
|
|
11
|
-
namespace esp32_ble {
|
|
11
|
+
namespace esphome::esp32_ble {
|
|
12
12
|
|
|
13
13
|
static const char *const TAG = "esp32_ble";
|
|
14
14
|
|
|
@@ -189,7 +189,7 @@ std::string ESPBTUUID::to_string() const {
|
|
|
189
189
|
return "";
|
|
190
190
|
}
|
|
191
191
|
|
|
192
|
-
} // namespace esp32_ble
|
|
193
|
-
} // namespace esphome
|
|
192
|
+
} // namespace esphome::esp32_ble
|
|
194
193
|
|
|
195
|
-
#endif
|
|
194
|
+
#endif // USE_ESP32_BLE_UUID
|
|
195
|
+
#endif // USE_ESP32
|
|
@@ -1,15 +1,16 @@
|
|
|
1
1
|
#pragma once
|
|
2
2
|
|
|
3
|
+
#include "esphome/core/defines.h"
|
|
3
4
|
#include "esphome/core/hal.h"
|
|
4
5
|
#include "esphome/core/helpers.h"
|
|
5
6
|
|
|
6
7
|
#ifdef USE_ESP32
|
|
8
|
+
#ifdef USE_ESP32_BLE_UUID
|
|
7
9
|
|
|
8
10
|
#include <string>
|
|
9
11
|
#include <esp_bt_defs.h>
|
|
10
12
|
|
|
11
|
-
namespace esphome {
|
|
12
|
-
namespace esp32_ble {
|
|
13
|
+
namespace esphome::esp32_ble {
|
|
13
14
|
|
|
14
15
|
class ESPBTUUID {
|
|
15
16
|
public:
|
|
@@ -41,7 +42,7 @@ class ESPBTUUID {
|
|
|
41
42
|
esp_bt_uuid_t uuid_;
|
|
42
43
|
};
|
|
43
44
|
|
|
44
|
-
} // namespace esp32_ble
|
|
45
|
-
} // namespace esphome
|
|
45
|
+
} // namespace esphome::esp32_ble
|
|
46
46
|
|
|
47
|
-
#endif
|
|
47
|
+
#endif // USE_ESP32_BLE_UUID
|
|
48
|
+
#endif // USE_ESP32
|
|
@@ -65,6 +65,8 @@ FINAL_VALIDATE_SCHEMA = esp32_ble.validate_variant
|
|
|
65
65
|
|
|
66
66
|
|
|
67
67
|
async def to_code(config):
|
|
68
|
+
cg.add_define("USE_ESP32_BLE_UUID")
|
|
69
|
+
|
|
68
70
|
uuid = config[CONF_UUID].hex
|
|
69
71
|
uuid_arr = [
|
|
70
72
|
cg.RawExpression(f"0x{uuid[i : i + 2]}") for i in range(0, len(uuid), 2)
|
|
@@ -82,6 +84,8 @@ async def to_code(config):
|
|
|
82
84
|
cg.add(var.set_measured_power(config[CONF_MEASURED_POWER]))
|
|
83
85
|
cg.add(var.set_tx_power(config[CONF_TX_POWER]))
|
|
84
86
|
|
|
87
|
+
cg.add_define("USE_ESP32_BLE_ADVERTISING")
|
|
88
|
+
|
|
85
89
|
if CORE.using_esp_idf:
|
|
86
90
|
add_idf_sdkconfig_option("CONFIG_BT_ENABLED", True)
|
|
87
91
|
add_idf_sdkconfig_option("CONFIG_BT_BLE_42_FEATURES_SUPPORTED", True)
|
|
@@ -2,7 +2,7 @@ import esphome.codegen as cg
|
|
|
2
2
|
from esphome.components import esp32_ble_tracker
|
|
3
3
|
|
|
4
4
|
AUTO_LOAD = ["esp32_ble_tracker"]
|
|
5
|
-
CODEOWNERS = ["@jesserockz"]
|
|
5
|
+
CODEOWNERS = ["@jesserockz", "@bdraco"]
|
|
6
6
|
DEPENDENCIES = ["esp32"]
|
|
7
7
|
|
|
8
8
|
esp32_ble_client_ns = cg.esphome_ns.namespace("esp32_ble_client")
|
|
@@ -5,9 +5,9 @@
|
|
|
5
5
|
#include "esphome/core/log.h"
|
|
6
6
|
|
|
7
7
|
#ifdef USE_ESP32
|
|
8
|
+
#ifdef USE_ESP32_BLE_DEVICE
|
|
8
9
|
|
|
9
|
-
namespace esphome {
|
|
10
|
-
namespace esp32_ble_client {
|
|
10
|
+
namespace esphome::esp32_ble_client {
|
|
11
11
|
|
|
12
12
|
static const char *const TAG = "esp32_ble_client";
|
|
13
13
|
|
|
@@ -93,7 +93,7 @@ esp_err_t BLECharacteristic::write_value(uint8_t *new_val, int16_t new_val_size)
|
|
|
93
93
|
return write_value(new_val, new_val_size, ESP_GATT_WRITE_TYPE_NO_RSP);
|
|
94
94
|
}
|
|
95
95
|
|
|
96
|
-
} // namespace esp32_ble_client
|
|
97
|
-
} // namespace esphome
|
|
96
|
+
} // namespace esphome::esp32_ble_client
|
|
98
97
|
|
|
98
|
+
#endif // USE_ESP32_BLE_DEVICE
|
|
99
99
|
#endif // USE_ESP32
|