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.
- 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
|
@@ -6,7 +6,6 @@
|
|
|
6
6
|
#include "esphome/core/helpers.h"
|
|
7
7
|
|
|
8
8
|
#include <array>
|
|
9
|
-
#include <atomic>
|
|
10
9
|
#include <string>
|
|
11
10
|
#include <vector>
|
|
12
11
|
|
|
@@ -21,9 +20,9 @@
|
|
|
21
20
|
|
|
22
21
|
#include "esphome/components/esp32_ble/ble.h"
|
|
23
22
|
#include "esphome/components/esp32_ble/ble_uuid.h"
|
|
23
|
+
#include "esphome/components/esp32_ble/ble_scan_result.h"
|
|
24
24
|
|
|
25
|
-
namespace esphome {
|
|
26
|
-
namespace esp32_ble_tracker {
|
|
25
|
+
namespace esphome::esp32_ble_tracker {
|
|
27
26
|
|
|
28
27
|
using namespace esp32_ble;
|
|
29
28
|
|
|
@@ -34,11 +33,14 @@ enum AdvertisementParserType {
|
|
|
34
33
|
RAW_ADVERTISEMENTS,
|
|
35
34
|
};
|
|
36
35
|
|
|
36
|
+
#ifdef USE_ESP32_BLE_UUID
|
|
37
37
|
struct ServiceData {
|
|
38
38
|
ESPBTUUID uuid;
|
|
39
39
|
adv_data_t data;
|
|
40
40
|
};
|
|
41
|
+
#endif
|
|
41
42
|
|
|
43
|
+
#ifdef USE_ESP32_BLE_DEVICE
|
|
42
44
|
class ESPBLEiBeacon {
|
|
43
45
|
public:
|
|
44
46
|
ESPBLEiBeacon() { memset(&this->beacon_data_, 0, sizeof(this->beacon_data_)); }
|
|
@@ -116,13 +118,16 @@ class ESPBTDevice {
|
|
|
116
118
|
std::vector<ServiceData> service_datas_{};
|
|
117
119
|
const BLEScanResult *scan_result_{nullptr};
|
|
118
120
|
};
|
|
121
|
+
#endif // USE_ESP32_BLE_DEVICE
|
|
119
122
|
|
|
120
123
|
class ESP32BLETracker;
|
|
121
124
|
|
|
122
125
|
class ESPBTDeviceListener {
|
|
123
126
|
public:
|
|
124
127
|
virtual void on_scan_end() {}
|
|
128
|
+
#ifdef USE_ESP32_BLE_DEVICE
|
|
125
129
|
virtual bool parse_device(const ESPBTDevice &device) = 0;
|
|
130
|
+
#endif
|
|
126
131
|
virtual bool parse_devices(const BLEScanResult *scan_results, size_t count) { return false; };
|
|
127
132
|
virtual AdvertisementParserType get_advertisement_parser_type() {
|
|
128
133
|
return AdvertisementParserType::PARSED_ADVERTISEMENTS;
|
|
@@ -133,6 +138,20 @@ class ESPBTDeviceListener {
|
|
|
133
138
|
ESP32BLETracker *parent_{nullptr};
|
|
134
139
|
};
|
|
135
140
|
|
|
141
|
+
struct ClientStateCounts {
|
|
142
|
+
uint8_t connecting = 0;
|
|
143
|
+
uint8_t discovered = 0;
|
|
144
|
+
uint8_t searching = 0;
|
|
145
|
+
uint8_t disconnecting = 0;
|
|
146
|
+
|
|
147
|
+
bool operator==(const ClientStateCounts &other) const {
|
|
148
|
+
return connecting == other.connecting && discovered == other.discovered && searching == other.searching &&
|
|
149
|
+
disconnecting == other.disconnecting;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
bool operator!=(const ClientStateCounts &other) const { return !(*this == other); }
|
|
153
|
+
};
|
|
154
|
+
|
|
136
155
|
enum class ClientState : uint8_t {
|
|
137
156
|
// Connection is allocated
|
|
138
157
|
INIT,
|
|
@@ -155,20 +174,21 @@ enum class ClientState : uint8_t {
|
|
|
155
174
|
};
|
|
156
175
|
|
|
157
176
|
enum class ScannerState {
|
|
158
|
-
// Scanner is idle, init state
|
|
177
|
+
// Scanner is idle, init state
|
|
159
178
|
IDLE,
|
|
160
|
-
// Scanner is starting
|
|
179
|
+
// Scanner is starting
|
|
161
180
|
STARTING,
|
|
162
|
-
// Scanner is running
|
|
181
|
+
// Scanner is running
|
|
163
182
|
RUNNING,
|
|
164
|
-
// Scanner failed to start
|
|
183
|
+
// Scanner failed to start
|
|
165
184
|
FAILED,
|
|
166
|
-
// Scanner is stopping
|
|
185
|
+
// Scanner is stopping
|
|
167
186
|
STOPPING,
|
|
168
|
-
// Scanner is stopped, set from the ESP callback only
|
|
169
|
-
STOPPED,
|
|
170
187
|
};
|
|
171
188
|
|
|
189
|
+
// Helper function to convert ClientState to string
|
|
190
|
+
const char *client_state_to_string(ClientState state);
|
|
191
|
+
|
|
172
192
|
enum class ConnectionType : uint8_t {
|
|
173
193
|
// The default connection type, we hold all the services in ram
|
|
174
194
|
// for the duration of the connection.
|
|
@@ -237,7 +257,9 @@ class ESP32BLETracker : public Component,
|
|
|
237
257
|
void register_client(ESPBTClient *client);
|
|
238
258
|
void recalculate_advertisement_parser_types();
|
|
239
259
|
|
|
260
|
+
#ifdef USE_ESP32_BLE_DEVICE
|
|
240
261
|
void print_bt_device_info(const ESPBTDevice &device);
|
|
262
|
+
#endif
|
|
241
263
|
|
|
242
264
|
void start_scan();
|
|
243
265
|
void stop_scan();
|
|
@@ -257,8 +279,6 @@ class ESP32BLETracker : public Component,
|
|
|
257
279
|
void stop_scan_();
|
|
258
280
|
/// Start a single scan by setting up the parameters and doing some esp-idf calls.
|
|
259
281
|
void start_scan_(bool first);
|
|
260
|
-
/// Called when a scan ends
|
|
261
|
-
void end_of_scan_();
|
|
262
282
|
/// Called when a `ESP_GAP_BLE_SCAN_RESULT_EVT` event is received.
|
|
263
283
|
void gap_scan_result_(const esp_ble_gap_cb_param_t::ble_scan_result_evt_param ¶m);
|
|
264
284
|
/// Called when a `ESP_GAP_BLE_SCAN_PARAM_SET_COMPLETE_EVT` event is received.
|
|
@@ -269,53 +289,99 @@ class ESP32BLETracker : public Component,
|
|
|
269
289
|
void gap_scan_stop_complete_(const esp_ble_gap_cb_param_t::ble_scan_stop_cmpl_evt_param ¶m);
|
|
270
290
|
/// Called to set the scanner state. Will also call callbacks to let listeners know when state is changed.
|
|
271
291
|
void set_scanner_state_(ScannerState state);
|
|
292
|
+
/// Common cleanup logic when transitioning scanner to IDLE state
|
|
293
|
+
void cleanup_scan_state_(bool is_stop_complete);
|
|
294
|
+
/// Process a single scan result immediately
|
|
295
|
+
/// Returns true if a discovered client needs promotion to READY_TO_CONNECT
|
|
296
|
+
bool process_scan_result_(const BLEScanResult &scan_result);
|
|
297
|
+
#ifdef USE_ESP32_BLE_DEVICE
|
|
298
|
+
/// Check if any clients are in connecting or ready to connect state
|
|
299
|
+
bool has_connecting_clients_() const;
|
|
300
|
+
#endif
|
|
301
|
+
/// Handle scanner failure states
|
|
302
|
+
void handle_scanner_failure_();
|
|
303
|
+
/// Try to promote discovered clients to ready to connect
|
|
304
|
+
void try_promote_discovered_clients_();
|
|
305
|
+
/// Convert scanner state enum to string for logging
|
|
306
|
+
const char *scanner_state_to_string_(ScannerState state) const;
|
|
307
|
+
/// Log an unexpected scanner state
|
|
308
|
+
void log_unexpected_state_(const char *operation, ScannerState expected_state) const;
|
|
309
|
+
#ifdef USE_ESP32_BLE_SOFTWARE_COEXISTENCE
|
|
310
|
+
/// Update BLE coexistence preference
|
|
311
|
+
void update_coex_preference_(bool force_ble);
|
|
312
|
+
#endif
|
|
313
|
+
/// Count clients in each state
|
|
314
|
+
ClientStateCounts count_client_states_() const {
|
|
315
|
+
ClientStateCounts counts;
|
|
316
|
+
for (auto *client : this->clients_) {
|
|
317
|
+
switch (client->state()) {
|
|
318
|
+
case ClientState::DISCONNECTING:
|
|
319
|
+
counts.disconnecting++;
|
|
320
|
+
break;
|
|
321
|
+
case ClientState::DISCOVERED:
|
|
322
|
+
counts.discovered++;
|
|
323
|
+
break;
|
|
324
|
+
case ClientState::SEARCHING:
|
|
325
|
+
counts.searching++;
|
|
326
|
+
break;
|
|
327
|
+
case ClientState::CONNECTING:
|
|
328
|
+
case ClientState::READY_TO_CONNECT:
|
|
329
|
+
counts.connecting++;
|
|
330
|
+
break;
|
|
331
|
+
default:
|
|
332
|
+
break;
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
return counts;
|
|
336
|
+
}
|
|
272
337
|
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
/// Vector of addresses that have already been printed in print_bt_device_info
|
|
276
|
-
std::vector<uint64_t> already_discovered_;
|
|
338
|
+
// Group 1: Large objects (12+ bytes) - vectors and callback manager
|
|
277
339
|
std::vector<ESPBTDeviceListener *> listeners_;
|
|
278
|
-
/// Client parameters.
|
|
279
340
|
std::vector<ESPBTClient *> clients_;
|
|
341
|
+
CallbackManager<void(ScannerState)> scanner_state_callbacks_;
|
|
342
|
+
#ifdef USE_ESP32_BLE_DEVICE
|
|
343
|
+
/// Vector of addresses that have already been printed in print_bt_device_info
|
|
344
|
+
std::vector<uint64_t> already_discovered_;
|
|
345
|
+
#endif
|
|
346
|
+
|
|
347
|
+
// Group 2: Structs (aligned to 4 bytes)
|
|
280
348
|
/// A structure holding the ESP BLE scan parameters.
|
|
281
349
|
esp_ble_scan_params_t scan_params_;
|
|
350
|
+
ClientStateCounts client_state_counts_;
|
|
351
|
+
|
|
352
|
+
// Group 3: 4-byte types
|
|
282
353
|
/// The interval in seconds to perform scans.
|
|
283
354
|
uint32_t scan_duration_;
|
|
284
355
|
uint32_t scan_interval_;
|
|
285
356
|
uint32_t scan_window_;
|
|
357
|
+
esp_bt_status_t scan_start_failed_{ESP_BT_STATUS_SUCCESS};
|
|
358
|
+
esp_bt_status_t scan_set_param_failed_{ESP_BT_STATUS_SUCCESS};
|
|
359
|
+
|
|
360
|
+
// Group 4: 1-byte types (enums, uint8_t, bool)
|
|
361
|
+
uint8_t app_id_{0};
|
|
286
362
|
uint8_t scan_start_fail_count_{0};
|
|
363
|
+
ScannerState scanner_state_{ScannerState::IDLE};
|
|
287
364
|
bool scan_continuous_;
|
|
288
365
|
bool scan_active_;
|
|
289
|
-
ScannerState scanner_state_{ScannerState::IDLE};
|
|
290
|
-
CallbackManager<void(ScannerState)> scanner_state_callbacks_;
|
|
291
366
|
bool ble_was_disabled_{true};
|
|
292
367
|
bool raw_advertisements_{false};
|
|
293
368
|
bool parse_advertisements_{false};
|
|
294
|
-
|
|
295
|
-
// Lock-free Single-Producer Single-Consumer (SPSC) ring buffer for scan results
|
|
296
|
-
// Producer: ESP-IDF Bluetooth stack callback (gap_scan_event_handler)
|
|
297
|
-
// Consumer: ESPHome main loop (loop() method)
|
|
298
|
-
// This design ensures zero blocking in the BT callback and prevents scan result loss
|
|
299
|
-
BLEScanResult *scan_ring_buffer_;
|
|
300
|
-
std::atomic<uint8_t> ring_write_index_{0}; // Written only by BT callback (producer)
|
|
301
|
-
std::atomic<uint8_t> ring_read_index_{0}; // Written only by main loop (consumer)
|
|
302
|
-
std::atomic<uint16_t> scan_results_dropped_{0}; // Tracks buffer overflow events
|
|
303
|
-
|
|
304
|
-
esp_bt_status_t scan_start_failed_{ESP_BT_STATUS_SUCCESS};
|
|
305
|
-
esp_bt_status_t scan_set_param_failed_{ESP_BT_STATUS_SUCCESS};
|
|
306
|
-
int connecting_{0};
|
|
307
|
-
int discovered_{0};
|
|
308
|
-
int searching_{0};
|
|
309
|
-
int disconnecting_{0};
|
|
310
369
|
#ifdef USE_ESP32_BLE_SOFTWARE_COEXISTENCE
|
|
311
370
|
bool coex_prefer_ble_{false};
|
|
312
371
|
#endif
|
|
372
|
+
// Scan timeout state machine
|
|
373
|
+
enum class ScanTimeoutState : uint8_t {
|
|
374
|
+
INACTIVE, // No timeout monitoring
|
|
375
|
+
MONITORING, // Actively monitoring for timeout
|
|
376
|
+
EXCEEDED_WAIT, // Timeout exceeded, waiting one loop before reboot
|
|
377
|
+
};
|
|
378
|
+
uint32_t scan_start_time_{0};
|
|
379
|
+
ScanTimeoutState scan_timeout_state_{ScanTimeoutState::INACTIVE};
|
|
313
380
|
};
|
|
314
381
|
|
|
315
382
|
// NOLINTNEXTLINE
|
|
316
383
|
extern ESP32BLETracker *global_esp32_ble_tracker;
|
|
317
384
|
|
|
318
|
-
} // namespace esp32_ble_tracker
|
|
319
|
-
} // namespace esphome
|
|
385
|
+
} // namespace esphome::esp32_ble_tracker
|
|
320
386
|
|
|
321
387
|
#endif
|
|
@@ -119,6 +119,12 @@ ENUM_SPECIAL_EFFECT = {
|
|
|
119
119
|
"SEPIA": ESP32SpecialEffect.ESP32_SPECIAL_EFFECT_SEPIA,
|
|
120
120
|
}
|
|
121
121
|
|
|
122
|
+
camera_fb_location_t = cg.global_ns.enum("camera_fb_location_t")
|
|
123
|
+
ENUM_FB_LOCATION = {
|
|
124
|
+
"PSRAM": cg.global_ns.CAMERA_FB_IN_PSRAM,
|
|
125
|
+
"DRAM": cg.global_ns.CAMERA_FB_IN_DRAM,
|
|
126
|
+
}
|
|
127
|
+
|
|
122
128
|
# pin assignment
|
|
123
129
|
CONF_HREF_PIN = "href_pin"
|
|
124
130
|
CONF_PIXEL_CLOCK_PIN = "pixel_clock_pin"
|
|
@@ -149,6 +155,7 @@ CONF_MAX_FRAMERATE = "max_framerate"
|
|
|
149
155
|
CONF_IDLE_FRAMERATE = "idle_framerate"
|
|
150
156
|
# frame buffer
|
|
151
157
|
CONF_FRAME_BUFFER_COUNT = "frame_buffer_count"
|
|
158
|
+
CONF_FRAME_BUFFER_LOCATION = "frame_buffer_location"
|
|
152
159
|
|
|
153
160
|
# stream trigger
|
|
154
161
|
CONF_ON_STREAM_START = "on_stream_start"
|
|
@@ -230,6 +237,9 @@ CONFIG_SCHEMA = cv.All(
|
|
|
230
237
|
cv.framerate, cv.Range(min=0, max=1)
|
|
231
238
|
),
|
|
232
239
|
cv.Optional(CONF_FRAME_BUFFER_COUNT, default=1): cv.int_range(min=1, max=2),
|
|
240
|
+
cv.Optional(CONF_FRAME_BUFFER_LOCATION, default="PSRAM"): cv.enum(
|
|
241
|
+
ENUM_FB_LOCATION, upper=True
|
|
242
|
+
),
|
|
233
243
|
cv.Optional(CONF_ON_STREAM_START): automation.validate_automation(
|
|
234
244
|
{
|
|
235
245
|
cv.GenerateID(CONF_TRIGGER_ID): cv.declare_id(
|
|
@@ -301,6 +311,7 @@ SETTERS = {
|
|
|
301
311
|
CONF_WB_MODE: "set_wb_mode",
|
|
302
312
|
# test pattern
|
|
303
313
|
CONF_TEST_PATTERN: "set_test_pattern",
|
|
314
|
+
CONF_FRAME_BUFFER_LOCATION: "set_frame_buffer_location",
|
|
304
315
|
}
|
|
305
316
|
|
|
306
317
|
|
|
@@ -328,12 +339,13 @@ async def to_code(config):
|
|
|
328
339
|
else:
|
|
329
340
|
cg.add(var.set_idle_update_interval(1000 / config[CONF_IDLE_FRAMERATE]))
|
|
330
341
|
cg.add(var.set_frame_buffer_count(config[CONF_FRAME_BUFFER_COUNT]))
|
|
342
|
+
cg.add(var.set_frame_buffer_location(config[CONF_FRAME_BUFFER_LOCATION]))
|
|
331
343
|
cg.add(var.set_frame_size(config[CONF_RESOLUTION]))
|
|
332
344
|
|
|
333
345
|
cg.add_define("USE_CAMERA")
|
|
334
346
|
|
|
335
347
|
if CORE.using_esp_idf:
|
|
336
|
-
add_idf_component(name="espressif/esp32-camera", ref="2.
|
|
348
|
+
add_idf_component(name="espressif/esp32-camera", ref="2.1.1")
|
|
337
349
|
|
|
338
350
|
for conf in config.get(CONF_ON_STREAM_START, []):
|
|
339
351
|
trigger = cg.new_Pvariable(conf[CONF_TRIGGER_ID], var)
|
|
@@ -133,6 +133,7 @@ void ESP32Camera::dump_config() {
|
|
|
133
133
|
ESP_LOGCONFIG(TAG,
|
|
134
134
|
" JPEG Quality: %u\n"
|
|
135
135
|
" Framebuffer Count: %u\n"
|
|
136
|
+
" Framebuffer Location: %s\n"
|
|
136
137
|
" Contrast: %d\n"
|
|
137
138
|
" Brightness: %d\n"
|
|
138
139
|
" Saturation: %d\n"
|
|
@@ -140,8 +141,9 @@ void ESP32Camera::dump_config() {
|
|
|
140
141
|
" Horizontal Mirror: %s\n"
|
|
141
142
|
" Special Effect: %u\n"
|
|
142
143
|
" White Balance Mode: %u",
|
|
143
|
-
st.quality, conf.fb_count,
|
|
144
|
-
ONOFF(st.
|
|
144
|
+
st.quality, conf.fb_count, this->config_.fb_location == CAMERA_FB_IN_PSRAM ? "PSRAM" : "DRAM",
|
|
145
|
+
st.contrast, st.brightness, st.saturation, ONOFF(st.vflip), ONOFF(st.hmirror), st.special_effect,
|
|
146
|
+
st.wb_mode);
|
|
145
147
|
// ESP_LOGCONFIG(TAG, " Auto White Balance: %u", st.awb);
|
|
146
148
|
// ESP_LOGCONFIG(TAG, " Auto White Balance Gain: %u", st.awb_gain);
|
|
147
149
|
ESP_LOGCONFIG(TAG,
|
|
@@ -350,6 +352,9 @@ void ESP32Camera::set_frame_buffer_count(uint8_t fb_count) {
|
|
|
350
352
|
this->config_.fb_count = fb_count;
|
|
351
353
|
this->set_frame_buffer_mode(fb_count > 1 ? CAMERA_GRAB_LATEST : CAMERA_GRAB_WHEN_EMPTY);
|
|
352
354
|
}
|
|
355
|
+
void ESP32Camera::set_frame_buffer_location(camera_fb_location_t fb_location) {
|
|
356
|
+
this->config_.fb_location = fb_location;
|
|
357
|
+
}
|
|
353
358
|
|
|
354
359
|
/* ---------------- public API (specific) ---------------- */
|
|
355
360
|
void ESP32Camera::add_image_callback(std::function<void(std::shared_ptr<camera::CameraImage>)> &&callback) {
|
|
@@ -152,6 +152,7 @@ class ESP32Camera : public camera::Camera {
|
|
|
152
152
|
/* -- frame buffer */
|
|
153
153
|
void set_frame_buffer_mode(camera_grab_mode_t mode);
|
|
154
154
|
void set_frame_buffer_count(uint8_t fb_count);
|
|
155
|
+
void set_frame_buffer_location(camera_fb_location_t fb_location);
|
|
155
156
|
|
|
156
157
|
/* public API (derivated) */
|
|
157
158
|
void setup() override;
|
|
@@ -2,11 +2,7 @@
|
|
|
2
2
|
#include "esphome/core/helpers.h"
|
|
3
3
|
#include "esphome/core/log.h"
|
|
4
4
|
|
|
5
|
-
#
|
|
6
|
-
|
|
7
|
-
#ifdef USE_ARDUINO
|
|
8
|
-
#include <esp32-hal-dac.h>
|
|
9
|
-
#endif
|
|
5
|
+
#if defined(USE_ESP32_VARIANT_ESP32) || defined(USE_ESP32_VARIANT_ESP32S2)
|
|
10
6
|
|
|
11
7
|
namespace esphome {
|
|
12
8
|
namespace esp32_dac {
|
|
@@ -20,22 +16,15 @@ static constexpr uint8_t DAC0_PIN = 25;
|
|
|
20
16
|
static const char *const TAG = "esp32_dac";
|
|
21
17
|
|
|
22
18
|
void ESP32DAC::setup() {
|
|
23
|
-
ESP_LOGCONFIG(TAG, "Running setup");
|
|
24
19
|
this->pin_->setup();
|
|
25
20
|
this->turn_off();
|
|
26
21
|
|
|
27
|
-
#ifdef USE_ESP_IDF
|
|
28
22
|
const dac_channel_t channel = this->pin_->get_pin() == DAC0_PIN ? DAC_CHAN_0 : DAC_CHAN_1;
|
|
29
23
|
const dac_oneshot_config_t oneshot_cfg{channel};
|
|
30
24
|
dac_oneshot_new_channel(&oneshot_cfg, &this->dac_handle_);
|
|
31
|
-
#endif
|
|
32
25
|
}
|
|
33
26
|
|
|
34
|
-
void ESP32DAC::on_safe_shutdown() {
|
|
35
|
-
#ifdef USE_ESP_IDF
|
|
36
|
-
dac_oneshot_del_channel(this->dac_handle_);
|
|
37
|
-
#endif
|
|
38
|
-
}
|
|
27
|
+
void ESP32DAC::on_safe_shutdown() { dac_oneshot_del_channel(this->dac_handle_); }
|
|
39
28
|
|
|
40
29
|
void ESP32DAC::dump_config() {
|
|
41
30
|
ESP_LOGCONFIG(TAG, "ESP32 DAC:");
|
|
@@ -49,15 +38,10 @@ void ESP32DAC::write_state(float state) {
|
|
|
49
38
|
|
|
50
39
|
state = state * 255;
|
|
51
40
|
|
|
52
|
-
#ifdef USE_ESP_IDF
|
|
53
41
|
dac_oneshot_output_voltage(this->dac_handle_, state);
|
|
54
|
-
#endif
|
|
55
|
-
#ifdef USE_ARDUINO
|
|
56
|
-
dacWrite(this->pin_->get_pin(), state);
|
|
57
|
-
#endif
|
|
58
42
|
}
|
|
59
43
|
|
|
60
44
|
} // namespace esp32_dac
|
|
61
45
|
} // namespace esphome
|
|
62
46
|
|
|
63
|
-
#endif
|
|
47
|
+
#endif // USE_ESP32_VARIANT_ESP32 || USE_ESP32_VARIANT_ESP32S2
|
|
@@ -1,15 +1,13 @@
|
|
|
1
1
|
#pragma once
|
|
2
2
|
|
|
3
|
+
#include "esphome/components/output/float_output.h"
|
|
4
|
+
#include "esphome/core/automation.h"
|
|
3
5
|
#include "esphome/core/component.h"
|
|
4
6
|
#include "esphome/core/hal.h"
|
|
5
|
-
#include "esphome/core/automation.h"
|
|
6
|
-
#include "esphome/components/output/float_output.h"
|
|
7
7
|
|
|
8
|
-
#
|
|
8
|
+
#if defined(USE_ESP32_VARIANT_ESP32) || defined(USE_ESP32_VARIANT_ESP32S2)
|
|
9
9
|
|
|
10
|
-
#ifdef USE_ESP_IDF
|
|
11
10
|
#include <driver/dac_oneshot.h>
|
|
12
|
-
#endif
|
|
13
11
|
|
|
14
12
|
namespace esphome {
|
|
15
13
|
namespace esp32_dac {
|
|
@@ -29,12 +27,10 @@ class ESP32DAC : public output::FloatOutput, public Component {
|
|
|
29
27
|
void write_state(float state) override;
|
|
30
28
|
|
|
31
29
|
InternalGPIOPin *pin_;
|
|
32
|
-
#ifdef USE_ESP_IDF
|
|
33
30
|
dac_oneshot_handle_t dac_handle_;
|
|
34
|
-
#endif
|
|
35
31
|
};
|
|
36
32
|
|
|
37
33
|
} // namespace esp32_dac
|
|
38
34
|
} // namespace esphome
|
|
39
35
|
|
|
40
|
-
#endif
|
|
36
|
+
#endif // USE_ESP32_VARIANT_ESP32 || USE_ESP32_VARIANT_ESP32S2
|
|
@@ -42,9 +42,6 @@ static size_t IRAM_ATTR HOT encoder_callback(const void *data, size_t size, size
|
|
|
42
42
|
symbols[i] = params->bit0;
|
|
43
43
|
}
|
|
44
44
|
}
|
|
45
|
-
if ((index + 1) >= size && params->reset.duration0 == 0 && params->reset.duration1 == 0) {
|
|
46
|
-
*done = true;
|
|
47
|
-
}
|
|
48
45
|
return RMT_SYMBOLS_PER_BYTE;
|
|
49
46
|
}
|
|
50
47
|
|
|
@@ -59,8 +56,6 @@ static size_t IRAM_ATTR HOT encoder_callback(const void *data, size_t size, size
|
|
|
59
56
|
#endif
|
|
60
57
|
|
|
61
58
|
void ESP32RMTLEDStripLightOutput::setup() {
|
|
62
|
-
ESP_LOGCONFIG(TAG, "Running setup");
|
|
63
|
-
|
|
64
59
|
size_t buffer_size = this->get_buffer_size_();
|
|
65
60
|
|
|
66
61
|
RAMAllocator<uint8_t> allocator(this->use_psram_ ? 0 : RAMAllocator<uint8_t>::ALLOC_INTERNAL);
|
|
@@ -112,7 +107,7 @@ void ESP32RMTLEDStripLightOutput::setup() {
|
|
|
112
107
|
memset(&encoder, 0, sizeof(encoder));
|
|
113
108
|
encoder.callback = encoder_callback;
|
|
114
109
|
encoder.arg = &this->params_;
|
|
115
|
-
encoder.min_chunk_size =
|
|
110
|
+
encoder.min_chunk_size = RMT_SYMBOLS_PER_BYTE;
|
|
116
111
|
if (rmt_new_simple_encoder(&encoder, &this->encoder_) != ESP_OK) {
|
|
117
112
|
ESP_LOGE(TAG, "Encoder creation failed");
|
|
118
113
|
this->mark_failed();
|
|
@@ -4,6 +4,7 @@ import logging
|
|
|
4
4
|
from esphome import pins
|
|
5
5
|
import esphome.codegen as cg
|
|
6
6
|
from esphome.components import esp32, light
|
|
7
|
+
from esphome.components.const import CONF_USE_PSRAM
|
|
7
8
|
import esphome.config_validation as cv
|
|
8
9
|
from esphome.const import (
|
|
9
10
|
CONF_CHIPSET,
|
|
@@ -57,7 +58,6 @@ CHIPSETS = {
|
|
|
57
58
|
"SM16703": LEDStripTimings(300, 900, 900, 300, 0, 0),
|
|
58
59
|
}
|
|
59
60
|
|
|
60
|
-
CONF_USE_PSRAM = "use_psram"
|
|
61
61
|
CONF_IS_WRGB = "is_wrgb"
|
|
62
62
|
CONF_BIT0_HIGH = "bit0_high"
|
|
63
63
|
CONF_BIT0_LOW = "bit0_low"
|
|
@@ -294,9 +294,8 @@ async def to_code(config):
|
|
|
294
294
|
)
|
|
295
295
|
)
|
|
296
296
|
|
|
297
|
-
if get_esp32_variant() == VARIANT_ESP32:
|
|
298
|
-
|
|
299
|
-
cg.add(touch.set_iir_filter(config[CONF_IIR_FILTER]))
|
|
297
|
+
if get_esp32_variant() == VARIANT_ESP32 and CONF_IIR_FILTER in config:
|
|
298
|
+
cg.add(touch.set_iir_filter(config[CONF_IIR_FILTER]))
|
|
300
299
|
|
|
301
300
|
if get_esp32_variant() == VARIANT_ESP32S2 or get_esp32_variant() == VARIANT_ESP32S3:
|
|
302
301
|
if CONF_FILTER_MODE in config:
|
|
@@ -171,8 +171,8 @@ class ESP32TouchComponent : public Component {
|
|
|
171
171
|
// based on the filter configuration
|
|
172
172
|
uint32_t read_touch_value(touch_pad_t pad) const;
|
|
173
173
|
|
|
174
|
-
// Helper to update touch state with a known state
|
|
175
|
-
void update_touch_state_(ESP32TouchBinarySensor *child, bool is_touched);
|
|
174
|
+
// Helper to update touch state with a known state and value
|
|
175
|
+
void update_touch_state_(ESP32TouchBinarySensor *child, bool is_touched, uint32_t value);
|
|
176
176
|
|
|
177
177
|
// Helper to read touch value and update state for a given child
|
|
178
178
|
bool check_and_update_touch_state_(ESP32TouchBinarySensor *child);
|
|
@@ -234,9 +234,13 @@ class ESP32TouchBinarySensor : public binary_sensor::BinarySensor {
|
|
|
234
234
|
touch_pad_t get_touch_pad() const { return this->touch_pad_; }
|
|
235
235
|
uint32_t get_threshold() const { return this->threshold_; }
|
|
236
236
|
void set_threshold(uint32_t threshold) { this->threshold_ = threshold; }
|
|
237
|
-
|
|
237
|
+
|
|
238
|
+
/// Get the raw touch measurement value.
|
|
239
|
+
/// @note Although this method may appear unused within the component, it is a public API
|
|
240
|
+
/// used by lambdas in user configurations for custom touch value processing.
|
|
241
|
+
/// @return The current raw touch sensor reading
|
|
238
242
|
uint32_t get_value() const { return this->value_; }
|
|
239
|
-
|
|
243
|
+
|
|
240
244
|
uint32_t get_wakeup_threshold() const { return this->wakeup_threshold_; }
|
|
241
245
|
|
|
242
246
|
protected:
|
|
@@ -245,9 +249,8 @@ class ESP32TouchBinarySensor : public binary_sensor::BinarySensor {
|
|
|
245
249
|
touch_pad_t touch_pad_{TOUCH_PAD_MAX};
|
|
246
250
|
uint32_t threshold_{0};
|
|
247
251
|
uint32_t benchmark_{};
|
|
248
|
-
|
|
252
|
+
/// Stores the last raw touch measurement value.
|
|
249
253
|
uint32_t value_{0};
|
|
250
|
-
#endif
|
|
251
254
|
bool last_state_{false};
|
|
252
255
|
const uint32_t wakeup_threshold_{0};
|
|
253
256
|
|
|
@@ -100,6 +100,8 @@ void ESP32TouchComponent::process_setup_mode_logging_(uint32_t now) {
|
|
|
100
100
|
#else
|
|
101
101
|
// Read the value being used for touch detection
|
|
102
102
|
uint32_t value = this->read_touch_value(child->get_touch_pad());
|
|
103
|
+
// Store the value for get_value() access in lambdas
|
|
104
|
+
child->value_ = value;
|
|
103
105
|
ESP_LOGD(TAG, "Touch Pad '%s' (T%d): %d", child->get_name().c_str(), child->get_touch_pad(), value);
|
|
104
106
|
#endif
|
|
105
107
|
}
|
|
@@ -201,15 +201,13 @@ void IRAM_ATTR ESP32TouchComponent::touch_isr_handler(void *arg) {
|
|
|
201
201
|
touch_pad_t pad = child->get_touch_pad();
|
|
202
202
|
|
|
203
203
|
// Read current value using ISR-safe API
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
value = touch_ll_read_raw_data(pad);
|
|
212
|
-
}
|
|
204
|
+
// IMPORTANT: ESP-IDF v5.4 regression - touch_pad_read_filtered() is no longer ISR-safe
|
|
205
|
+
// In ESP-IDF v5.3 and earlier it was ISR-safe, but ESP-IDF v5.4 added mutex protection that causes:
|
|
206
|
+
// "assert failed: xQueueSemaphoreTake queue.c:1718"
|
|
207
|
+
// We must use raw values even when filter is enabled as a workaround.
|
|
208
|
+
// Users should adjust thresholds to compensate for the lack of IIR filtering.
|
|
209
|
+
// See: https://github.com/espressif/esp-idf/issues/17045
|
|
210
|
+
uint32_t value = touch_ll_read_raw_data(pad);
|
|
213
211
|
|
|
214
212
|
// Skip pads that aren’t in the trigger mask
|
|
215
213
|
if (((mask >> pad) & 1) == 0) {
|
|
@@ -10,8 +10,11 @@ namespace esp32_touch {
|
|
|
10
10
|
|
|
11
11
|
static const char *const TAG = "esp32_touch";
|
|
12
12
|
|
|
13
|
-
// Helper to update touch state with a known state
|
|
14
|
-
void ESP32TouchComponent::update_touch_state_(ESP32TouchBinarySensor *child, bool is_touched) {
|
|
13
|
+
// Helper to update touch state with a known state and value
|
|
14
|
+
void ESP32TouchComponent::update_touch_state_(ESP32TouchBinarySensor *child, bool is_touched, uint32_t value) {
|
|
15
|
+
// Store the value for get_value() access in lambdas
|
|
16
|
+
child->value_ = value;
|
|
17
|
+
|
|
15
18
|
// Always update timer when touched
|
|
16
19
|
if (is_touched) {
|
|
17
20
|
child->last_touch_time_ = App.get_loop_component_start_time();
|
|
@@ -21,9 +24,8 @@ void ESP32TouchComponent::update_touch_state_(ESP32TouchBinarySensor *child, boo
|
|
|
21
24
|
child->last_state_ = is_touched;
|
|
22
25
|
child->publish_state(is_touched);
|
|
23
26
|
if (is_touched) {
|
|
24
|
-
// ESP32-S2/S3 v2: touched when value > threshold
|
|
25
27
|
ESP_LOGV(TAG, "Touch Pad '%s' state: ON (value: %" PRIu32 " > threshold: %" PRIu32 ")", child->get_name().c_str(),
|
|
26
|
-
|
|
28
|
+
value, child->threshold_ + child->benchmark_);
|
|
27
29
|
} else {
|
|
28
30
|
ESP_LOGV(TAG, "Touch Pad '%s' state: OFF", child->get_name().c_str());
|
|
29
31
|
}
|
|
@@ -41,7 +43,7 @@ bool ESP32TouchComponent::check_and_update_touch_state_(ESP32TouchBinarySensor *
|
|
|
41
43
|
child->get_name().c_str(), child->touch_pad_, value, child->threshold_, child->benchmark_);
|
|
42
44
|
bool is_touched = value > child->benchmark_ + child->threshold_;
|
|
43
45
|
|
|
44
|
-
this->update_touch_state_(child, is_touched);
|
|
46
|
+
this->update_touch_state_(child, is_touched, value);
|
|
45
47
|
return is_touched;
|
|
46
48
|
}
|
|
47
49
|
|
|
@@ -296,7 +298,9 @@ void ESP32TouchComponent::loop() {
|
|
|
296
298
|
this->check_and_update_touch_state_(child);
|
|
297
299
|
} else if (event.intr_mask & TOUCH_PAD_INTR_MASK_ACTIVE) {
|
|
298
300
|
// We only get ACTIVE interrupts now, releases are detected by timeout
|
|
299
|
-
|
|
301
|
+
// Read the current value
|
|
302
|
+
uint32_t value = this->read_touch_value(child->touch_pad_);
|
|
303
|
+
this->update_touch_state_(child, true, value); // Always touched for ACTIVE interrupts
|
|
300
304
|
}
|
|
301
305
|
break;
|
|
302
306
|
}
|
|
@@ -15,6 +15,7 @@ from esphome.const import (
|
|
|
15
15
|
KEY_TARGET_FRAMEWORK,
|
|
16
16
|
KEY_TARGET_PLATFORM,
|
|
17
17
|
PLATFORM_ESP8266,
|
|
18
|
+
ThreadModel,
|
|
18
19
|
)
|
|
19
20
|
from esphome.core import CORE, coroutine_with_priority
|
|
20
21
|
from esphome.helpers import copy_file_if_changed
|
|
@@ -187,6 +188,7 @@ async def to_code(config):
|
|
|
187
188
|
cg.set_cpp_standard("gnu++20")
|
|
188
189
|
cg.add_define("ESPHOME_BOARD", config[CONF_BOARD])
|
|
189
190
|
cg.add_define("ESPHOME_VARIANT", "ESP8266")
|
|
191
|
+
cg.add_define(ThreadModel.SINGLE)
|
|
190
192
|
|
|
191
193
|
cg.add_platformio_option("extra_scripts", ["post:post_build.py"])
|
|
192
194
|
|
|
@@ -243,7 +245,7 @@ async def to_code(config):
|
|
|
243
245
|
if ver <= cv.Version(2, 3, 0):
|
|
244
246
|
# No ld script support
|
|
245
247
|
ld_script = None
|
|
246
|
-
|
|
248
|
+
elif ver <= cv.Version(2, 4, 2):
|
|
247
249
|
# Old ld script path
|
|
248
250
|
ld_script = ld_scripts[0]
|
|
249
251
|
else:
|
|
@@ -73,8 +73,7 @@ def ota_esphome_final_validate(config):
|
|
|
73
73
|
else:
|
|
74
74
|
new_ota_conf.append(ota_conf)
|
|
75
75
|
|
|
76
|
-
|
|
77
|
-
new_ota_conf.append(port_conf)
|
|
76
|
+
new_ota_conf.extend(merged_ota_esphome_configs_by_port.values())
|
|
78
77
|
|
|
79
78
|
full_conf[CONF_OTA] = new_ota_conf
|
|
80
79
|
fv.full_config.set(full_conf)
|