esphome 2025.7.4__py3-none-any.whl → 2025.8.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- esphome/__main__.py +190 -83
- esphome/automation.py +2 -4
- esphome/build_gen/__init__.py +0 -0
- esphome/build_gen/platformio.py +102 -0
- esphome/components/a4988/a4988.cpp +0 -1
- esphome/components/absolute_humidity/absolute_humidity.cpp +0 -2
- esphome/components/absolute_humidity/sensor.py +2 -2
- esphome/components/adc/__init__.py +123 -85
- esphome/components/adc/adc_sensor.h +98 -35
- esphome/components/adc/adc_sensor_common.cpp +10 -4
- esphome/components/adc/adc_sensor_esp32.cpp +291 -123
- esphome/components/adc/adc_sensor_esp8266.cpp +1 -4
- esphome/components/adc/adc_sensor_libretiny.cpp +1 -2
- esphome/components/adc/adc_sensor_rp2040.cpp +1 -2
- esphome/components/adc/adc_sensor_zephyr.cpp +207 -0
- esphome/components/adc/sensor.py +61 -27
- esphome/components/adc128s102/adc128s102.cpp +1 -4
- esphome/components/ade7880/sensor.py +75 -49
- esphome/components/ads1115/ads1115.cpp +0 -1
- esphome/components/ads1118/ads1118.cpp +0 -1
- esphome/components/ags10/ags10.cpp +0 -4
- esphome/components/aht10/aht10.cpp +0 -4
- esphome/components/aic3204/aic3204.cpp +0 -2
- esphome/components/airthings_wave_plus/__init__.py +1 -1
- esphome/components/airthings_wave_plus/airthings_wave_plus.cpp +22 -4
- esphome/components/airthings_wave_plus/airthings_wave_plus.h +10 -1
- esphome/components/airthings_wave_plus/sensor.py +55 -28
- esphome/components/alarm_control_panel/__init__.py +4 -9
- esphome/components/am2315c/am2315c.cpp +0 -2
- esphome/components/am2320/am2320.cpp +0 -1
- esphome/components/animation/__init__.py +14 -11
- esphome/components/apds9306/apds9306.cpp +0 -4
- esphome/components/apds9960/apds9960.cpp +0 -1
- esphome/components/api/__init__.py +29 -4
- esphome/components/api/api_connection.cpp +378 -401
- esphome/components/api/api_connection.h +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 +475 -116
- esphome/components/atm90e32/atm90e32.h +43 -5
- esphome/components/audio/audio.h +2 -2
- esphome/components/axs15231/touchscreen/axs15231_touchscreen.cpp +0 -2
- esphome/components/beken_spi_led_strip/led_strip.cpp +0 -2
- esphome/components/bh1750/bh1750.cpp +0 -1
- esphome/components/binary_sensor/__init__.py +14 -12
- esphome/components/ble_client/__init__.py +4 -7
- esphome/components/bluetooth_proxy/__init__.py +40 -3
- esphome/components/bluetooth_proxy/bluetooth_connection.cpp +392 -81
- esphome/components/bluetooth_proxy/bluetooth_connection.h +16 -5
- esphome/components/bluetooth_proxy/bluetooth_proxy.cpp +102 -311
- esphome/components/bluetooth_proxy/bluetooth_proxy.h +30 -14
- esphome/components/bme280_base/bme280_base.cpp +15 -16
- esphome/components/bme680/bme680.cpp +2 -3
- esphome/components/bme680_bsec/bme680_bsec.cpp +0 -2
- esphome/components/bme68x_bsec2/bme68x_bsec2.cpp +0 -2
- esphome/components/bmi160/bmi160.cpp +0 -1
- esphome/components/bmp085/bmp085.cpp +0 -1
- esphome/components/bmp280_base/bmp280_base.cpp +13 -14
- esphome/components/bmp3xx_base/bmp3xx_base.cpp +0 -1
- esphome/components/bmp581/bmp581.cpp +0 -2
- esphome/components/bp1658cj/bp1658cj.cpp +0 -1
- esphome/components/bp5758d/bp5758d.cpp +0 -1
- esphome/components/button/__init__.py +0 -1
- esphome/components/canbus/__init__.py +2 -3
- esphome/components/canbus/canbus.cpp +0 -1
- esphome/components/cap1188/cap1188.cpp +0 -2
- esphome/components/captive_portal/__init__.py +1 -1
- esphome/components/cd74hc4067/cd74hc4067.cpp +0 -2
- esphome/components/ch422g/ch422g.cpp +0 -1
- esphome/components/chsc6x/chsc6x_touchscreen.cpp +0 -3
- esphome/components/climate/__init__.py +0 -1
- esphome/components/climate/climate_traits.h +24 -0
- esphome/components/cm1106/cm1106.cpp +0 -1
- esphome/components/const/__init__.py +6 -0
- esphome/components/cover/__init__.py +0 -1
- esphome/components/cover/cover.cpp +9 -13
- esphome/components/cs5460a/cs5460a.cpp +0 -2
- esphome/components/cse7761/cse7761.cpp +0 -1
- esphome/components/cst226/touchscreen/cst226_touchscreen.cpp +0 -2
- esphome/components/cst816/touchscreen/cst816_touchscreen.cpp +0 -2
- esphome/components/dac7678/dac7678_output.cpp +0 -2
- esphome/components/dallas_temp/dallas_temp.cpp +0 -1
- esphome/components/datetime/__init__.py +0 -2
- esphome/components/debug/__init__.py +15 -1
- esphome/components/debug/debug_zephyr.cpp +281 -0
- esphome/components/debug/sensor.py +2 -1
- esphome/components/deep_sleep/deep_sleep_component.cpp +0 -1
- esphome/components/deep_sleep/deep_sleep_esp32.cpp +20 -1
- esphome/components/dfrobot_sen0395/__init__.py +1 -2
- esphome/components/dht/dht.cpp +0 -1
- esphome/components/dht12/dht12.cpp +0 -1
- esphome/components/display/__init__.py +16 -3
- esphome/components/display_menu_base/__init__.py +1 -1
- esphome/components/dps310/dps310.cpp +0 -2
- esphome/components/ds1307/ds1307.cpp +0 -1
- esphome/components/ds2484/ds2484.cpp +0 -1
- esphome/components/duty_cycle/duty_cycle_sensor.cpp +0 -1
- esphome/components/ee895/ee895.cpp +0 -1
- esphome/components/ektf2232/touchscreen/ektf2232.cpp +0 -1
- esphome/components/emc2101/emc2101.cpp +0 -2
- esphome/components/ens160_base/ens160_base.cpp +0 -2
- esphome/components/ens210/ens210.cpp +0 -1
- esphome/components/es7210/es7210.cpp +0 -2
- esphome/components/es7243e/es7243e.cpp +0 -2
- esphome/components/es8156/es8156.cpp +0 -2
- esphome/components/es8311/es8311.cpp +0 -2
- esphome/components/es8388/es8388.cpp +0 -2
- esphome/components/esp32/__init__.py +203 -60
- esphome/components/esp32/boards.py +17 -0
- esphome/components/esp32/gpio.cpp +0 -1
- esphome/components/esp32/gpio.py +1 -2
- esphome/components/esp32/gpio_esp32_h2.py +2 -7
- esphome/components/esp32/gpio_esp32_p4.py +2 -7
- esphome/components/esp32/post_build.py.script +112 -61
- esphome/components/esp32_ble/__init__.py +41 -2
- esphome/components/esp32_ble/ble.cpp +14 -10
- esphome/components/esp32_ble/ble.h +18 -18
- esphome/components/esp32_ble/ble_advertising.cpp +5 -5
- esphome/components/esp32_ble/ble_advertising.h +7 -5
- esphome/components/esp32_ble/ble_event.h +139 -73
- esphome/components/esp32_ble/ble_scan_result.h +2 -4
- esphome/components/esp32_ble/ble_uuid.cpp +5 -5
- esphome/components/esp32_ble/ble_uuid.h +6 -5
- esphome/components/esp32_ble_beacon/__init__.py +4 -0
- esphome/components/esp32_ble_client/__init__.py +1 -1
- esphome/components/esp32_ble_client/ble_characteristic.cpp +4 -4
- esphome/components/esp32_ble_client/ble_characteristic.h +6 -4
- esphome/components/esp32_ble_client/ble_client_base.cpp +155 -104
- esphome/components/esp32_ble_client/ble_client_base.h +17 -6
- esphome/components/esp32_ble_client/ble_descriptor.h +6 -4
- esphome/components/esp32_ble_client/ble_service.cpp +4 -4
- esphome/components/esp32_ble_client/ble_service.h +6 -4
- esphome/components/esp32_ble_server/__init__.py +15 -12
- esphome/components/esp32_ble_tracker/__init__.py +79 -11
- esphome/components/esp32_ble_tracker/automation.h +4 -4
- esphome/components/esp32_ble_tracker/esp32_ble_tracker.cpp +264 -261
- esphome/components/esp32_ble_tracker/esp32_ble_tracker.h +103 -37
- esphome/components/esp32_camera/__init__.py +13 -1
- esphome/components/esp32_camera/esp32_camera.cpp +7 -2
- esphome/components/esp32_camera/esp32_camera.h +1 -0
- esphome/components/esp32_dac/esp32_dac.cpp +3 -19
- esphome/components/esp32_dac/esp32_dac.h +4 -8
- esphome/components/esp32_rmt_led_strip/led_strip.cpp +1 -6
- esphome/components/esp32_rmt_led_strip/light.py +1 -1
- esphome/components/esp32_touch/__init__.py +2 -3
- esphome/components/esp32_touch/esp32_touch.h +9 -6
- esphome/components/esp32_touch/esp32_touch_common.cpp +2 -0
- esphome/components/esp32_touch/esp32_touch_v1.cpp +7 -9
- esphome/components/esp32_touch/esp32_touch_v2.cpp +10 -6
- esphome/components/esp8266/__init__.py +3 -1
- esphome/components/esp8266_pwm/esp8266_pwm.cpp +0 -1
- esphome/components/esphome/ota/__init__.py +1 -2
- esphome/components/esphome/ota/ota_esphome.cpp +150 -77
- esphome/components/esphome/ota/ota_esphome.h +8 -1
- esphome/components/espnow/__init__.py +309 -0
- esphome/components/espnow/automation.h +175 -0
- esphome/components/espnow/espnow_component.cpp +468 -0
- esphome/components/espnow/espnow_component.h +183 -0
- esphome/components/espnow/espnow_err.h +19 -0
- esphome/components/espnow/espnow_packet.h +166 -0
- esphome/components/ethernet/__init__.py +7 -1
- esphome/components/ethernet/esp_eth_phy_jl1101.c +5 -0
- esphome/components/ethernet/ethernet_component.cpp +0 -1
- esphome/components/ethernet/ethernet_component.h +4 -0
- esphome/components/ethernet_info/ethernet_info_text_sensor.h +0 -3
- esphome/components/event/__init__.py +0 -1
- esphome/components/factory_reset/__init__.py +92 -0
- esphome/components/factory_reset/factory_reset.cpp +76 -0
- esphome/components/factory_reset/factory_reset.h +43 -0
- esphome/components/fan/__init__.py +0 -1
- esphome/components/fan/fan_traits.h +16 -0
- esphome/components/fastled_base/fastled_light.cpp +0 -1
- esphome/components/fastled_spi/light.py +1 -3
- esphome/components/fingerprint_grow/fingerprint_grow.cpp +0 -2
- esphome/components/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 +2 -2
- esphome/components/nfc/binary_sensor/{binary_sensor.cpp → nfc_binary_sensor.cpp} +1 -1
- esphome/components/npi19/npi19.cpp +0 -2
- esphome/components/nrf52/__init__.py +223 -0
- esphome/components/nrf52/boards.py +34 -0
- esphome/components/nrf52/const.py +18 -0
- esphome/components/nrf52/gpio.py +79 -0
- esphome/components/number/__init__.py +2 -1
- esphome/components/one_wire/__init__.py +1 -2
- esphome/components/one_wire/one_wire.cpp +0 -2
- esphome/components/one_wire/one_wire.h +0 -2
- esphome/components/opentherm/hub.cpp +0 -1
- esphome/components/opentherm/number/__init__.py +2 -2
- esphome/components/openthread/__init__.py +2 -3
- esphome/components/openthread/openthread.cpp +30 -13
- esphome/components/openthread/openthread.h +3 -0
- esphome/components/openthread/openthread_esp.cpp +3 -1
- esphome/components/opt3001/sensor.py +2 -6
- esphome/components/output/__init__.py +38 -0
- esphome/components/output/automation.h +24 -0
- esphome/components/output/switch/output_switch.cpp +0 -2
- esphome/components/packages/__init__.py +1 -2
- esphome/components/packet_transport/__init__.py +4 -3
- esphome/components/pca6416a/pca6416a.cpp +0 -1
- esphome/components/pca9554/pca9554.cpp +0 -1
- esphome/components/pca9685/pca9685_output.cpp +0 -2
- esphome/components/pcf85063/pcf85063.cpp +0 -1
- esphome/components/pcf8563/pcf8563.cpp +0 -1
- esphome/components/pcf8574/pcf8574.cpp +0 -1
- esphome/components/pi4ioe5v6408/pi4ioe5v6408.cpp +0 -1
- esphome/components/pipsolar/pipsolar.cpp +54 -42
- esphome/components/pipsolar/pipsolar.h +5 -4
- esphome/components/pipsolar/sensor/__init__.py +1 -1
- esphome/components/pm2005/pm2005.cpp +0 -1
- esphome/components/pmsa003i/pmsa003i.cpp +0 -2
- esphome/components/pmwcs3/sensor.py +1 -2
- esphome/components/pn532/pn532.cpp +0 -2
- esphome/components/pn532_spi/pn532_spi.cpp +0 -2
- esphome/components/power_supply/power_supply.cpp +7 -10
- esphome/components/power_supply/power_supply.h +1 -1
- esphome/components/psram/__init__.py +6 -1
- esphome/components/pulse_counter/pulse_counter_sensor.cpp +0 -1
- esphome/components/pulse_counter/sensor.py +9 -6
- esphome/components/pylontech/pylontech.cpp +0 -1
- esphome/components/qmc5883l/qmc5883l.cpp +0 -1
- esphome/components/qmp6988/qmp6988.cpp +0 -2
- esphome/components/qspi_dbi/display.py +2 -3
- esphome/components/qspi_dbi/qspi_dbi.cpp +0 -2
- esphome/components/qwiic_pir/binary_sensor.py +2 -3
- esphome/components/qwiic_pir/qwiic_pir.cpp +0 -2
- esphome/components/rc522/rc522.cpp +9 -31
- esphome/components/rc522_spi/rc522_spi.cpp +0 -1
- esphome/components/remote_base/__init__.py +5 -6
- esphome/components/remote_receiver/remote_receiver_esp32.cpp +0 -1
- esphome/components/remote_receiver/remote_receiver_esp8266.cpp +0 -1
- esphome/components/remote_receiver/remote_receiver_libretiny.cpp +0 -1
- esphome/components/remote_transmitter/__init__.py +26 -0
- esphome/components/remote_transmitter/automation.h +18 -0
- esphome/components/remote_transmitter/remote_transmitter.h +2 -1
- esphome/components/remote_transmitter/remote_transmitter_esp32.cpp +0 -1
- esphome/components/remote_transmitter/remote_transmitter_esp8266.cpp +2 -0
- esphome/components/remote_transmitter/remote_transmitter_libretiny.cpp +2 -0
- esphome/components/resampler/speaker/__init__.py +4 -5
- esphome/components/rf_bridge/__init__.py +4 -8
- esphome/components/rotary_encoder/rotary_encoder.cpp +0 -2
- esphome/components/rp2040/__init__.py +3 -1
- esphome/components/rp2040_pio_led_strip/led_strip.cpp +0 -2
- esphome/components/rp2040_pio_led_strip/light.py +1 -2
- esphome/components/rp2040_pwm/rp2040_pwm.cpp +1 -5
- esphome/components/rpi_dpi_rgb/display.py +13 -15
- esphome/components/rpi_dpi_rgb/rpi_dpi_rgb.cpp +0 -3
- esphome/components/runtime_stats/__init__.py +34 -0
- esphome/components/runtime_stats/runtime_stats.cpp +102 -0
- esphome/components/runtime_stats/runtime_stats.h +132 -0
- esphome/components/scd30/scd30.cpp +0 -2
- esphome/components/scd30/sensor.py +1 -2
- esphome/components/scd4x/scd4x.cpp +0 -1
- esphome/components/scd4x/sensor.py +1 -3
- esphome/components/sdl/display.py +3 -1
- esphome/components/sdl/sdl_esphome.cpp +0 -2
- esphome/components/sdp3x/sdp3x.cpp +0 -2
- esphome/components/seeed_mr24hpc1/seeed_mr24hpc1.cpp +0 -2
- esphome/components/seeed_mr60fda2/seeed_mr60fda2.cpp +0 -3
- esphome/components/select/__init__.py +2 -3
- esphome/components/select/select_traits.cpp +1 -1
- esphome/components/select/select_traits.h +1 -1
- esphome/components/sen0321/sen0321.cpp +0 -1
- esphome/components/sen5x/sen5x.cpp +0 -2
- esphome/components/senseair/senseair.cpp +7 -3
- esphome/components/senseair/senseair.h +11 -0
- esphome/components/sensor/__init__.py +36 -4
- esphome/components/sensor/filter.cpp +49 -10
- esphome/components/sensor/filter.h +22 -7
- esphome/components/sensor/sensor.cpp +0 -1
- esphome/components/sensor/sensor.h +0 -9
- esphome/components/sfa30/sfa30.cpp +0 -4
- esphome/components/sgp30/sgp30.cpp +0 -2
- esphome/components/sgp4x/sensor.py +1 -1
- esphome/components/sgp4x/sgp4x.cpp +0 -2
- esphome/components/shelly_dimmer/shelly_dimmer.cpp +0 -2
- esphome/components/sht3xd/sht3xd.cpp +0 -2
- esphome/components/sht4x/sht4x.cpp +0 -2
- esphome/components/shtcx/shtcx.cpp +0 -1
- esphome/components/sim800l/__init__.py +2 -4
- esphome/components/sm16716/sm16716.cpp +0 -1
- esphome/components/sm2135/sm2135.cpp +0 -1
- esphome/components/sm2235/sm2235.cpp +0 -1
- esphome/components/sm2335/sm2335.cpp +0 -1
- esphome/components/sn74hc165/sn74hc165.cpp +0 -1
- esphome/components/sn74hc595/sn74hc595.cpp +0 -1
- esphome/components/sntp/sntp_component.cpp +0 -1
- esphome/components/sound_level/sensor.py +1 -1
- esphome/components/speaker/media_player/__init__.py +21 -33
- esphome/components/speaker/media_player/audio_pipeline.cpp +4 -7
- esphome/components/spi/__init__.py +29 -13
- esphome/components/spi/spi.cpp +0 -2
- esphome/components/spi_device/spi_device.cpp +1 -4
- esphome/components/sprinkler/__init__.py +4 -4
- esphome/components/sps30/sps30.cpp +0 -1
- esphome/components/ssd1306_base/__init__.py +11 -11
- esphome/components/ssd1306_base/ssd1306_base.cpp +1 -1
- esphome/components/ssd1306_i2c/ssd1306_i2c.cpp +0 -1
- esphome/components/ssd1306_spi/ssd1306_spi.cpp +0 -1
- esphome/components/ssd1322_spi/ssd1322_spi.cpp +0 -1
- esphome/components/ssd1325_spi/ssd1325_spi.cpp +0 -1
- esphome/components/ssd1327_i2c/ssd1327_i2c.cpp +0 -1
- esphome/components/ssd1327_spi/ssd1327_spi.cpp +0 -1
- esphome/components/ssd1331_spi/ssd1331_spi.cpp +0 -1
- esphome/components/ssd1351_spi/ssd1351_spi.cpp +0 -1
- esphome/components/st7567_i2c/st7567_i2c.cpp +0 -1
- esphome/components/st7567_spi/st7567_spi.cpp +0 -1
- esphome/components/st7701s/display.py +10 -14
- esphome/components/st7701s/st7701s.cpp +0 -3
- esphome/components/st7735/st7735.cpp +0 -1
- esphome/components/st7789v/st7789v.cpp +0 -1
- esphome/components/st7920/st7920.cpp +0 -1
- esphome/components/status_led/light/status_led_light.cpp +0 -2
- esphome/components/status_led/status_led.cpp +0 -1
- esphome/components/stepper/__init__.py +2 -4
- esphome/components/sts3x/sts3x.cpp +0 -1
- esphome/components/substitutions/__init__.py +10 -16
- esphome/components/substitutions/jinja.py +24 -1
- esphome/components/sun/__init__.py +2 -3
- esphome/components/switch/__init__.py +31 -1
- esphome/components/switch/automation.h +24 -0
- esphome/components/switch/switch.cpp +8 -0
- esphome/components/switch/switch.h +8 -0
- esphome/components/sx126x/sx126x.cpp +0 -2
- esphome/components/sx127x/sx127x.cpp +0 -2
- esphome/components/sx1509/__init__.py +7 -5
- esphome/components/sx1509/output/sx1509_float_output.cpp +1 -1
- esphome/components/sx1509/sx1509.cpp +0 -2
- esphome/components/syslog/esphome_syslog.cpp +1 -1
- esphome/components/tc74/tc74.cpp +0 -1
- esphome/components/tca9548a/tca9548a.cpp +0 -1
- esphome/components/tca9555/tca9555.cpp +0 -1
- esphome/components/tcs34725/tcs34725.cpp +0 -1
- esphome/components/tee501/tee501.cpp +0 -1
- esphome/components/tem3200/tem3200.cpp +0 -2
- esphome/components/template/alarm_control_panel/template_alarm_control_panel.cpp +0 -1
- esphome/components/template/cover/template_cover.cpp +0 -1
- esphome/components/template/select/template_select.cpp +0 -1
- esphome/components/template/text/template_text.cpp +0 -2
- esphome/components/template/valve/template_valve.cpp +0 -1
- esphome/components/text/__init__.py +0 -1
- esphome/components/text/text_traits.h +2 -0
- esphome/components/text_sensor/__init__.py +2 -1
- esphome/components/text_sensor/text_sensor.cpp +0 -2
- esphome/components/text_sensor/text_sensor.h +0 -8
- esphome/components/thermostat/climate.py +4 -4
- esphome/components/time/__init__.py +7 -4
- esphome/components/time/real_time_clock.cpp +16 -3
- esphome/components/tlc59208f/tlc59208f_output.cpp +0 -2
- esphome/components/tlc5947/tlc5947.cpp +0 -2
- esphome/components/tlc5971/tlc5971.cpp +0 -2
- esphome/components/tm1621/tm1621.cpp +0 -2
- esphome/components/tm1637/tm1637.cpp +0 -2
- esphome/components/tm1638/tm1638.cpp +0 -2
- esphome/components/tm1651/__init__.py +45 -48
- esphome/components/tm1651/tm1651.cpp +213 -47
- esphome/components/tm1651/tm1651.h +37 -32
- esphome/components/tmp117/tmp117.cpp +0 -2
- esphome/components/tsl2561/tsl2561.cpp +0 -1
- esphome/components/tsl2591/tsl2591.cpp +0 -1
- esphome/components/tt21100/touchscreen/tt21100.cpp +0 -2
- esphome/components/ttp229_bsf/ttp229_bsf.cpp +0 -1
- esphome/components/ttp229_lsf/ttp229_lsf.cpp +0 -1
- esphome/components/tuya/climate/__init__.py +9 -10
- esphome/components/tuya/number/__init__.py +8 -6
- esphome/components/tx20/tx20.cpp +0 -1
- esphome/components/uart/uart_component_esp32_arduino.cpp +0 -1
- esphome/components/uart/uart_component_esp8266.cpp +0 -1
- esphome/components/uart/uart_component_esp_idf.cpp +0 -2
- esphome/components/uart/uart_component_libretiny.cpp +0 -2
- esphome/components/uart/uart_component_rp2040.cpp +0 -2
- esphome/components/udp/__init__.py +1 -1
- esphome/components/ufire_ec/sensor.py +1 -2
- esphome/components/ufire_ec/ufire_ec.cpp +0 -2
- esphome/components/ufire_ise/sensor.py +1 -2
- esphome/components/ufire_ise/ufire_ise.cpp +0 -2
- esphome/components/ultrasonic/ultrasonic_sensor.cpp +0 -1
- esphome/components/update/__init__.py +0 -1
- esphome/components/uptime/sensor/uptime_seconds_sensor.cpp +0 -1
- esphome/components/uptime/sensor/uptime_seconds_sensor.h +0 -2
- esphome/components/usb_host/usb_host_client.cpp +0 -1
- esphome/components/usb_host/usb_host_component.cpp +0 -1
- esphome/components/valve/__init__.py +0 -1
- esphome/components/veml3235/veml3235.cpp +0 -3
- esphome/components/veml7700/veml7700.cpp +0 -2
- esphome/components/version/version_text_sensor.cpp +0 -1
- esphome/components/version/version_text_sensor.h +0 -1
- esphome/components/vl53l0x/vl53l0x_sensor.cpp +0 -4
- esphome/components/voice_assistant/voice_assistant.cpp +9 -8
- esphome/components/web_server/__init__.py +13 -0
- esphome/components/web_server/web_server.cpp +188 -353
- esphome/components/web_server/web_server.h +61 -1
- esphome/components/web_server_base/__init__.py +1 -1
- esphome/components/web_server_base/web_server_base.cpp +2 -0
- esphome/components/web_server_base/web_server_base.h +6 -0
- esphome/components/web_server_idf/web_server_idf.cpp +10 -8
- esphome/components/web_server_idf/web_server_idf.h +2 -0
- esphome/components/weikai_i2c/weikai_i2c.cpp +1 -2
- esphome/components/weikai_spi/weikai_spi.cpp +1 -1
- esphome/components/wifi/__init__.py +17 -43
- esphome/components/wifi/wifi_component.cpp +100 -36
- esphome/components/wifi/wifi_component.h +5 -1
- esphome/components/wifi/wifi_component_esp32_arduino.cpp +30 -0
- esphome/components/wifi/wifi_component_esp_idf.cpp +30 -0
- esphome/components/wifi_info/wifi_info_text_sensor.h +0 -6
- esphome/components/wifi_signal/wifi_signal_sensor.h +0 -1
- esphome/components/wireguard/wireguard.cpp +0 -2
- esphome/components/x9c/x9c.cpp +0 -2
- esphome/components/xgzp68xx/xgzp68xx.cpp +0 -1
- esphome/components/xl9535/xl9535.cpp +0 -2
- esphome/components/zephyr/__init__.py +252 -0
- esphome/components/zephyr/const.py +16 -0
- esphome/components/zephyr/core.cpp +90 -0
- esphome/components/zephyr/gpio.cpp +120 -0
- esphome/components/zephyr/gpio.h +38 -0
- esphome/components/zephyr/pre_build.py.script +4 -0
- esphome/components/zephyr/preferences.cpp +156 -0
- esphome/components/zephyr/preferences.h +13 -0
- esphome/config.py +38 -16
- esphome/config_helpers.py +1 -2
- esphome/config_validation.py +12 -16
- esphome/const.py +26 -1
- esphome/core/__init__.py +92 -51
- esphome/core/application.cpp +75 -21
- esphome/core/application.h +106 -171
- esphome/core/color.h +10 -0
- esphome/core/component.cpp +41 -25
- esphome/core/component.h +9 -6
- esphome/core/component_iterator.cpp +61 -261
- esphome/core/component_iterator.h +15 -0
- esphome/core/config.py +26 -11
- esphome/core/defines.h +40 -2
- esphome/core/entity_base.h +18 -0
- esphome/core/entity_helpers.py +45 -10
- esphome/core/helpers.cpp +8 -15
- esphome/core/helpers.h +60 -6
- esphome/core/lock_free_queue.h +1 -1
- esphome/core/scheduler.cpp +311 -77
- esphome/core/scheduler.h +141 -28
- esphome/cpp_generator.py +2 -6
- esphome/cpp_helpers.py +1 -1
- esphome/dashboard/dashboard.py +2 -3
- esphome/dashboard/dns.py +2 -8
- esphome/dashboard/web_server.py +34 -19
- esphome/espota2.py +1 -4
- esphome/git.py +3 -1
- esphome/helpers.py +23 -4
- esphome/log.py +3 -1
- esphome/mqtt.py +3 -5
- esphome/platformio_api.py +7 -4
- esphome/types.py +12 -0
- esphome/util.py +20 -8
- esphome/voluptuous_schema.py +4 -3
- esphome/vscode.py +1 -2
- esphome/wizard.py +1 -4
- esphome/writer.py +16 -108
- esphome/yaml_util.py +7 -5
- {esphome-2025.7.4.dist-info → esphome-2025.8.0.dist-info}/METADATA +13 -14
- {esphome-2025.7.4.dist-info → esphome-2025.8.0.dist-info}/RECORD +757 -677
- 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.0.dist-info}/WHEEL +0 -0
- {esphome-2025.7.4.dist-info → esphome-2025.8.0.dist-info}/entry_points.txt +0 -0
- {esphome-2025.7.4.dist-info → esphome-2025.8.0.dist-info}/licenses/LICENSE +0 -0
- {esphome-2025.7.4.dist-info → esphome-2025.8.0.dist-info}/top_level.txt +0 -0
|
@@ -40,17 +40,21 @@ void HomeassistantSwitch::write_state(bool state) {
|
|
|
40
40
|
return;
|
|
41
41
|
}
|
|
42
42
|
|
|
43
|
+
static constexpr auto SERVICE_ON = StringRef::from_lit("homeassistant.turn_on");
|
|
44
|
+
static constexpr auto SERVICE_OFF = StringRef::from_lit("homeassistant.turn_off");
|
|
45
|
+
static constexpr auto ENTITY_ID_KEY = StringRef::from_lit("entity_id");
|
|
46
|
+
|
|
43
47
|
api::HomeassistantServiceResponse resp;
|
|
44
48
|
if (state) {
|
|
45
|
-
resp.
|
|
49
|
+
resp.set_service(SERVICE_ON);
|
|
46
50
|
} else {
|
|
47
|
-
resp.
|
|
51
|
+
resp.set_service(SERVICE_OFF);
|
|
48
52
|
}
|
|
49
53
|
|
|
50
|
-
|
|
51
|
-
entity_id_kv
|
|
54
|
+
resp.data.emplace_back();
|
|
55
|
+
auto &entity_id_kv = resp.data.back();
|
|
56
|
+
entity_id_kv.set_key(ENTITY_ID_KEY);
|
|
52
57
|
entity_id_kv.value = this->entity_id_;
|
|
53
|
-
resp.data.push_back(entity_id_kv);
|
|
54
58
|
|
|
55
59
|
api::global_api_server->send_homeassistant_service_call(resp);
|
|
56
60
|
}
|
|
@@ -9,10 +9,7 @@ static const char *const TAG = "honeywellabp";
|
|
|
9
9
|
const float MIN_COUNT = 1638.4; // 1638 counts (10% of 2^14 counts or 0x0666)
|
|
10
10
|
const float MAX_COUNT = 14745.6; // 14745 counts (90% of 2^14 counts or 0x3999)
|
|
11
11
|
|
|
12
|
-
void HONEYWELLABPSensor::setup() {
|
|
13
|
-
ESP_LOGD(TAG, "Setting up Honeywell ABP Sensor ");
|
|
14
|
-
this->spi_setup();
|
|
15
|
-
}
|
|
12
|
+
void HONEYWELLABPSensor::setup() { this->spi_setup(); }
|
|
16
13
|
|
|
17
14
|
uint8_t HONEYWELLABPSensor::readsensor_() {
|
|
18
15
|
// Polls the sensor for new data.
|
|
@@ -7,6 +7,7 @@ from esphome.const import (
|
|
|
7
7
|
KEY_TARGET_FRAMEWORK,
|
|
8
8
|
KEY_TARGET_PLATFORM,
|
|
9
9
|
PLATFORM_HOST,
|
|
10
|
+
ThreadModel,
|
|
10
11
|
)
|
|
11
12
|
from esphome.core import CORE
|
|
12
13
|
|
|
@@ -43,6 +44,7 @@ async def to_code(config):
|
|
|
43
44
|
cg.add_define("USE_ESPHOME_HOST_MAC_ADDRESS", config[CONF_MAC_ADDRESS].parts)
|
|
44
45
|
cg.add_build_flag("-std=gnu++20")
|
|
45
46
|
cg.add_define("ESPHOME_BOARD", "host")
|
|
47
|
+
cg.add_define(ThreadModel.MULTI_ATOMICS)
|
|
46
48
|
cg.add_platformio_option("platform", "platformio/native")
|
|
47
49
|
cg.add_platformio_option("lib_ldf_mode", "off")
|
|
48
50
|
cg.add_platformio_option("lib_compat_mode", "strict")
|
|
@@ -70,9 +70,8 @@ def validate_url(value):
|
|
|
70
70
|
def validate_ssl_verification(config):
|
|
71
71
|
error_message = ""
|
|
72
72
|
|
|
73
|
-
if CORE.is_esp32:
|
|
74
|
-
|
|
75
|
-
error_message = "ESPHome supports certificate verification only via ESP-IDF"
|
|
73
|
+
if CORE.is_esp32 and not CORE.using_esp_idf and config[CONF_VERIFY_SSL]:
|
|
74
|
+
error_message = "ESPHome supports certificate verification only via ESP-IDF"
|
|
76
75
|
|
|
77
76
|
if CORE.is_rp2040 and config[CONF_VERIFY_SSL]:
|
|
78
77
|
error_message = "ESPHome does not support certificate verification on RP2040"
|
|
@@ -157,8 +157,8 @@ std::shared_ptr<HttpContainer> HttpRequestIDF::perform(std::string url, std::str
|
|
|
157
157
|
container->status_code = esp_http_client_get_status_code(client);
|
|
158
158
|
container->feed_wdt();
|
|
159
159
|
container->set_response_headers(user_data.response_headers);
|
|
160
|
+
container->duration_ms = millis() - start;
|
|
160
161
|
if (is_success(container->status_code)) {
|
|
161
|
-
container->duration_ms = millis() - start;
|
|
162
162
|
return container;
|
|
163
163
|
}
|
|
164
164
|
|
|
@@ -191,8 +191,8 @@ std::shared_ptr<HttpContainer> HttpRequestIDF::perform(std::string url, std::str
|
|
|
191
191
|
container->feed_wdt();
|
|
192
192
|
container->status_code = esp_http_client_get_status_code(client);
|
|
193
193
|
container->feed_wdt();
|
|
194
|
+
container->duration_ms = millis() - start;
|
|
194
195
|
if (is_success(container->status_code)) {
|
|
195
|
-
container->duration_ms = millis() - start;
|
|
196
196
|
return container;
|
|
197
197
|
}
|
|
198
198
|
|
|
@@ -18,8 +18,6 @@ static const uint8_t HTU21D_READHEATER_REG_CMD = 0x11; /**< Read Heater Control
|
|
|
18
18
|
static const uint8_t HTU21D_REG_HTRE_BIT = 0x02; /**< Control Register Heater Bit */
|
|
19
19
|
|
|
20
20
|
void HTU21DComponent::setup() {
|
|
21
|
-
ESP_LOGCONFIG(TAG, "Running setup");
|
|
22
|
-
|
|
23
21
|
if (!this->write_bytes(HTU21D_REGISTER_RESET, nullptr, 0)) {
|
|
24
22
|
this->mark_failed();
|
|
25
23
|
return;
|
|
@@ -66,11 +66,10 @@ PROTOCOL_NAMES = {
|
|
|
66
66
|
|
|
67
67
|
def _validate(config):
|
|
68
68
|
for conf, models in SUPPORTED_OPTIONS.items():
|
|
69
|
-
if conf in config:
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
)
|
|
69
|
+
if conf in config and config[CONF_MODEL] not in models:
|
|
70
|
+
raise cv.Invalid(
|
|
71
|
+
f"{conf} is only available on {' and '.join(models)}, not {config[CONF_MODEL]}"
|
|
72
|
+
)
|
|
74
73
|
return config
|
|
75
74
|
|
|
76
75
|
|
esphome/components/i2c/i2c_bus.h
CHANGED
|
@@ -94,7 +94,7 @@ class I2CBus {
|
|
|
94
94
|
protected:
|
|
95
95
|
/// @brief Scans the I2C bus for devices. Devices presence is kept in an array of std::pair
|
|
96
96
|
/// that contains the address and the corresponding bool presence flag.
|
|
97
|
-
void
|
|
97
|
+
virtual void i2c_scan() {
|
|
98
98
|
for (uint8_t address = 8; address < 120; address++) {
|
|
99
99
|
auto err = writev(address, nullptr, 0);
|
|
100
100
|
if (err == ERROR_OK) {
|
|
@@ -13,7 +13,6 @@ namespace i2c {
|
|
|
13
13
|
static const char *const TAG = "i2c.arduino";
|
|
14
14
|
|
|
15
15
|
void ArduinoI2CBus::setup() {
|
|
16
|
-
ESP_LOGCONFIG(TAG, "Running setup");
|
|
17
16
|
recover_();
|
|
18
17
|
|
|
19
18
|
#if defined(USE_ESP32)
|
|
@@ -42,7 +41,7 @@ void ArduinoI2CBus::setup() {
|
|
|
42
41
|
this->initialized_ = true;
|
|
43
42
|
if (this->scan_) {
|
|
44
43
|
ESP_LOGV(TAG, "Scanning bus for active devices");
|
|
45
|
-
this->
|
|
44
|
+
this->i2c_scan();
|
|
46
45
|
}
|
|
47
46
|
}
|
|
48
47
|
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
#ifdef USE_ESP_IDF
|
|
2
2
|
|
|
3
3
|
#include "i2c_bus_esp_idf.h"
|
|
4
|
+
#include <driver/gpio.h>
|
|
4
5
|
#include <cinttypes>
|
|
5
6
|
#include <cstring>
|
|
6
7
|
#include "esphome/core/application.h"
|
|
@@ -18,22 +19,72 @@ namespace i2c {
|
|
|
18
19
|
static const char *const TAG = "i2c.idf";
|
|
19
20
|
|
|
20
21
|
void IDFI2CBus::setup() {
|
|
21
|
-
ESP_LOGCONFIG(TAG, "Running setup");
|
|
22
22
|
static i2c_port_t next_port = I2C_NUM_0;
|
|
23
|
-
port_ = next_port;
|
|
24
|
-
|
|
25
|
-
|
|
23
|
+
this->port_ = next_port;
|
|
24
|
+
if (this->port_ == I2C_NUM_MAX) {
|
|
25
|
+
ESP_LOGE(TAG, "No more than %u buses supported", I2C_NUM_MAX);
|
|
26
|
+
this->mark_failed();
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
if (this->timeout_ > 13000) {
|
|
31
|
+
ESP_LOGW(TAG, "Using max allowed timeout: 13 ms");
|
|
32
|
+
this->timeout_ = 13000;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
this->recover_();
|
|
36
|
+
|
|
37
|
+
#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 4, 2)
|
|
38
|
+
next_port = (i2c_port_t) (next_port + 1);
|
|
39
|
+
|
|
40
|
+
i2c_master_bus_config_t bus_conf{};
|
|
41
|
+
memset(&bus_conf, 0, sizeof(bus_conf));
|
|
42
|
+
bus_conf.sda_io_num = gpio_num_t(sda_pin_);
|
|
43
|
+
bus_conf.scl_io_num = gpio_num_t(scl_pin_);
|
|
44
|
+
bus_conf.i2c_port = this->port_;
|
|
45
|
+
bus_conf.glitch_ignore_cnt = 7;
|
|
46
|
+
#if SOC_LP_I2C_SUPPORTED
|
|
47
|
+
if (this->port_ < SOC_HP_I2C_NUM) {
|
|
48
|
+
bus_conf.clk_source = I2C_CLK_SRC_DEFAULT;
|
|
49
|
+
} else {
|
|
50
|
+
bus_conf.lp_source_clk = LP_I2C_SCLK_DEFAULT;
|
|
51
|
+
}
|
|
26
52
|
#else
|
|
27
|
-
|
|
53
|
+
bus_conf.clk_source = I2C_CLK_SRC_DEFAULT;
|
|
28
54
|
#endif
|
|
55
|
+
bus_conf.flags.enable_internal_pullup = sda_pullup_enabled_ || scl_pullup_enabled_;
|
|
56
|
+
esp_err_t err = i2c_new_master_bus(&bus_conf, &this->bus_);
|
|
57
|
+
if (err != ESP_OK) {
|
|
58
|
+
ESP_LOGW(TAG, "i2c_new_master_bus failed: %s", esp_err_to_name(err));
|
|
59
|
+
this->mark_failed();
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
29
62
|
|
|
30
|
-
|
|
31
|
-
|
|
63
|
+
i2c_device_config_t dev_conf{};
|
|
64
|
+
memset(&dev_conf, 0, sizeof(dev_conf));
|
|
65
|
+
dev_conf.dev_addr_length = I2C_ADDR_BIT_LEN_7;
|
|
66
|
+
dev_conf.device_address = I2C_DEVICE_ADDRESS_NOT_USED;
|
|
67
|
+
dev_conf.scl_speed_hz = this->frequency_;
|
|
68
|
+
dev_conf.scl_wait_us = this->timeout_;
|
|
69
|
+
err = i2c_master_bus_add_device(this->bus_, &dev_conf, &this->dev_);
|
|
70
|
+
if (err != ESP_OK) {
|
|
71
|
+
ESP_LOGW(TAG, "i2c_master_bus_add_device failed: %s", esp_err_to_name(err));
|
|
32
72
|
this->mark_failed();
|
|
33
73
|
return;
|
|
34
74
|
}
|
|
35
75
|
|
|
36
|
-
|
|
76
|
+
this->initialized_ = true;
|
|
77
|
+
|
|
78
|
+
if (this->scan_) {
|
|
79
|
+
ESP_LOGV(TAG, "Scanning for devices");
|
|
80
|
+
this->i2c_scan();
|
|
81
|
+
}
|
|
82
|
+
#else
|
|
83
|
+
#if SOC_HP_I2C_NUM > 1
|
|
84
|
+
next_port = (next_port == I2C_NUM_0) ? I2C_NUM_1 : I2C_NUM_MAX;
|
|
85
|
+
#else
|
|
86
|
+
next_port = I2C_NUM_MAX;
|
|
87
|
+
#endif
|
|
37
88
|
|
|
38
89
|
i2c_config_t conf{};
|
|
39
90
|
memset(&conf, 0, sizeof(conf));
|
|
@@ -53,11 +104,7 @@ void IDFI2CBus::setup() {
|
|
|
53
104
|
this->mark_failed();
|
|
54
105
|
return;
|
|
55
106
|
}
|
|
56
|
-
if (timeout_ > 0) {
|
|
57
|
-
if (timeout_ > 13000) {
|
|
58
|
-
ESP_LOGW(TAG, "i2c timeout of %" PRIu32 "us greater than max of 13ms on esp-idf, setting to max", timeout_);
|
|
59
|
-
timeout_ = 13000;
|
|
60
|
-
}
|
|
107
|
+
if (timeout_ > 0) {
|
|
61
108
|
err = i2c_set_timeout(port_, timeout_ * 80); // unit: APB 80MHz clock cycle
|
|
62
109
|
if (err != ESP_OK) {
|
|
63
110
|
ESP_LOGW(TAG, "i2c_set_timeout failed: %s", esp_err_to_name(err));
|
|
@@ -73,12 +120,15 @@ void IDFI2CBus::setup() {
|
|
|
73
120
|
this->mark_failed();
|
|
74
121
|
return;
|
|
75
122
|
}
|
|
123
|
+
|
|
76
124
|
initialized_ = true;
|
|
77
125
|
if (this->scan_) {
|
|
78
126
|
ESP_LOGV(TAG, "Scanning bus for active devices");
|
|
79
|
-
this->
|
|
127
|
+
this->i2c_scan();
|
|
80
128
|
}
|
|
129
|
+
#endif
|
|
81
130
|
}
|
|
131
|
+
|
|
82
132
|
void IDFI2CBus::dump_config() {
|
|
83
133
|
ESP_LOGCONFIG(TAG, "I2C Bus:");
|
|
84
134
|
ESP_LOGCONFIG(TAG,
|
|
@@ -101,13 +151,13 @@ void IDFI2CBus::dump_config() {
|
|
|
101
151
|
break;
|
|
102
152
|
}
|
|
103
153
|
if (this->scan_) {
|
|
104
|
-
|
|
154
|
+
ESP_LOGCONFIG(TAG, "Results from bus scan:");
|
|
105
155
|
if (scan_results_.empty()) {
|
|
106
|
-
|
|
156
|
+
ESP_LOGCONFIG(TAG, "Found no devices");
|
|
107
157
|
} else {
|
|
108
158
|
for (const auto &s : scan_results_) {
|
|
109
159
|
if (s.second) {
|
|
110
|
-
|
|
160
|
+
ESP_LOGCONFIG(TAG, "Found device at address 0x%02X", s.first);
|
|
111
161
|
} else {
|
|
112
162
|
ESP_LOGE(TAG, "Unknown error at address 0x%02X", s.first);
|
|
113
163
|
}
|
|
@@ -116,6 +166,17 @@ void IDFI2CBus::dump_config() {
|
|
|
116
166
|
}
|
|
117
167
|
}
|
|
118
168
|
|
|
169
|
+
#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 4, 2)
|
|
170
|
+
void IDFI2CBus::i2c_scan() {
|
|
171
|
+
for (uint8_t address = 8; address < 120; address++) {
|
|
172
|
+
auto err = i2c_master_probe(this->bus_, address, 20);
|
|
173
|
+
if (err == ESP_OK) {
|
|
174
|
+
this->scan_results_.emplace_back(address, true);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
#endif
|
|
179
|
+
|
|
119
180
|
ErrorCode IDFI2CBus::readv(uint8_t address, ReadBuffer *buffers, size_t cnt) {
|
|
120
181
|
// logging is only enabled with vv level, if warnings are shown the caller
|
|
121
182
|
// should log them
|
|
@@ -123,6 +184,74 @@ ErrorCode IDFI2CBus::readv(uint8_t address, ReadBuffer *buffers, size_t cnt) {
|
|
|
123
184
|
ESP_LOGVV(TAG, "i2c bus not initialized!");
|
|
124
185
|
return ERROR_NOT_INITIALIZED;
|
|
125
186
|
}
|
|
187
|
+
|
|
188
|
+
#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 4, 2)
|
|
189
|
+
i2c_operation_job_t jobs[cnt + 4];
|
|
190
|
+
uint8_t read = (address << 1) | I2C_MASTER_READ;
|
|
191
|
+
size_t last = 0, num = 0;
|
|
192
|
+
|
|
193
|
+
jobs[num].command = I2C_MASTER_CMD_START;
|
|
194
|
+
num++;
|
|
195
|
+
|
|
196
|
+
jobs[num].command = I2C_MASTER_CMD_WRITE;
|
|
197
|
+
jobs[num].write.ack_check = true;
|
|
198
|
+
jobs[num].write.data = &read;
|
|
199
|
+
jobs[num].write.total_bytes = 1;
|
|
200
|
+
num++;
|
|
201
|
+
|
|
202
|
+
// find the last valid index
|
|
203
|
+
for (size_t i = 0; i < cnt; i++) {
|
|
204
|
+
const auto &buf = buffers[i];
|
|
205
|
+
if (buf.len == 0) {
|
|
206
|
+
continue;
|
|
207
|
+
}
|
|
208
|
+
last = i;
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
for (size_t i = 0; i < cnt; i++) {
|
|
212
|
+
const auto &buf = buffers[i];
|
|
213
|
+
if (buf.len == 0) {
|
|
214
|
+
continue;
|
|
215
|
+
}
|
|
216
|
+
if (i == last) {
|
|
217
|
+
// the last byte read before stop should always be a nack,
|
|
218
|
+
// split the last read if len is larger than 1
|
|
219
|
+
if (buf.len > 1) {
|
|
220
|
+
jobs[num].command = I2C_MASTER_CMD_READ;
|
|
221
|
+
jobs[num].read.ack_value = I2C_ACK_VAL;
|
|
222
|
+
jobs[num].read.data = (uint8_t *) buf.data;
|
|
223
|
+
jobs[num].read.total_bytes = buf.len - 1;
|
|
224
|
+
num++;
|
|
225
|
+
}
|
|
226
|
+
jobs[num].command = I2C_MASTER_CMD_READ;
|
|
227
|
+
jobs[num].read.ack_value = I2C_NACK_VAL;
|
|
228
|
+
jobs[num].read.data = (uint8_t *) buf.data + buf.len - 1;
|
|
229
|
+
jobs[num].read.total_bytes = 1;
|
|
230
|
+
num++;
|
|
231
|
+
} else {
|
|
232
|
+
jobs[num].command = I2C_MASTER_CMD_READ;
|
|
233
|
+
jobs[num].read.ack_value = I2C_ACK_VAL;
|
|
234
|
+
jobs[num].read.data = (uint8_t *) buf.data;
|
|
235
|
+
jobs[num].read.total_bytes = buf.len;
|
|
236
|
+
num++;
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
jobs[num].command = I2C_MASTER_CMD_STOP;
|
|
241
|
+
num++;
|
|
242
|
+
|
|
243
|
+
esp_err_t err = i2c_master_execute_defined_operations(this->dev_, jobs, num, 20);
|
|
244
|
+
if (err == ESP_ERR_INVALID_STATE) {
|
|
245
|
+
ESP_LOGVV(TAG, "RX from %02X failed: not acked", address);
|
|
246
|
+
return ERROR_NOT_ACKNOWLEDGED;
|
|
247
|
+
} else if (err == ESP_ERR_TIMEOUT) {
|
|
248
|
+
ESP_LOGVV(TAG, "RX from %02X failed: timeout", address);
|
|
249
|
+
return ERROR_TIMEOUT;
|
|
250
|
+
} else if (err != ESP_OK) {
|
|
251
|
+
ESP_LOGVV(TAG, "RX from %02X failed: %s", address, esp_err_to_name(err));
|
|
252
|
+
return ERROR_UNKNOWN;
|
|
253
|
+
}
|
|
254
|
+
#else
|
|
126
255
|
i2c_cmd_handle_t cmd = i2c_cmd_link_create();
|
|
127
256
|
esp_err_t err = i2c_master_start(cmd);
|
|
128
257
|
if (err != ESP_OK) {
|
|
@@ -168,6 +297,7 @@ ErrorCode IDFI2CBus::readv(uint8_t address, ReadBuffer *buffers, size_t cnt) {
|
|
|
168
297
|
ESP_LOGVV(TAG, "RX from %02X failed: %s", address, esp_err_to_name(err));
|
|
169
298
|
return ERROR_UNKNOWN;
|
|
170
299
|
}
|
|
300
|
+
#endif
|
|
171
301
|
|
|
172
302
|
#ifdef ESPHOME_LOG_HAS_VERY_VERBOSE
|
|
173
303
|
char debug_buf[4];
|
|
@@ -185,6 +315,7 @@ ErrorCode IDFI2CBus::readv(uint8_t address, ReadBuffer *buffers, size_t cnt) {
|
|
|
185
315
|
|
|
186
316
|
return ERROR_OK;
|
|
187
317
|
}
|
|
318
|
+
|
|
188
319
|
ErrorCode IDFI2CBus::writev(uint8_t address, WriteBuffer *buffers, size_t cnt, bool stop) {
|
|
189
320
|
// logging is only enabled with vv level, if warnings are shown the caller
|
|
190
321
|
// should log them
|
|
@@ -207,6 +338,49 @@ ErrorCode IDFI2CBus::writev(uint8_t address, WriteBuffer *buffers, size_t cnt, b
|
|
|
207
338
|
ESP_LOGVV(TAG, "0x%02X TX %s", address, debug_hex.c_str());
|
|
208
339
|
#endif
|
|
209
340
|
|
|
341
|
+
#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 4, 2)
|
|
342
|
+
i2c_operation_job_t jobs[cnt + 3];
|
|
343
|
+
uint8_t write = (address << 1) | I2C_MASTER_WRITE;
|
|
344
|
+
size_t num = 0;
|
|
345
|
+
|
|
346
|
+
jobs[num].command = I2C_MASTER_CMD_START;
|
|
347
|
+
num++;
|
|
348
|
+
|
|
349
|
+
jobs[num].command = I2C_MASTER_CMD_WRITE;
|
|
350
|
+
jobs[num].write.ack_check = true;
|
|
351
|
+
jobs[num].write.data = &write;
|
|
352
|
+
jobs[num].write.total_bytes = 1;
|
|
353
|
+
num++;
|
|
354
|
+
|
|
355
|
+
for (size_t i = 0; i < cnt; i++) {
|
|
356
|
+
const auto &buf = buffers[i];
|
|
357
|
+
if (buf.len == 0) {
|
|
358
|
+
continue;
|
|
359
|
+
}
|
|
360
|
+
jobs[num].command = I2C_MASTER_CMD_WRITE;
|
|
361
|
+
jobs[num].write.ack_check = true;
|
|
362
|
+
jobs[num].write.data = (uint8_t *) buf.data;
|
|
363
|
+
jobs[num].write.total_bytes = buf.len;
|
|
364
|
+
num++;
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
if (stop) {
|
|
368
|
+
jobs[num].command = I2C_MASTER_CMD_STOP;
|
|
369
|
+
num++;
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
esp_err_t err = i2c_master_execute_defined_operations(this->dev_, jobs, num, 20);
|
|
373
|
+
if (err == ESP_ERR_INVALID_STATE) {
|
|
374
|
+
ESP_LOGVV(TAG, "TX to %02X failed: not acked", address);
|
|
375
|
+
return ERROR_NOT_ACKNOWLEDGED;
|
|
376
|
+
} else if (err == ESP_ERR_TIMEOUT) {
|
|
377
|
+
ESP_LOGVV(TAG, "TX to %02X failed: timeout", address);
|
|
378
|
+
return ERROR_TIMEOUT;
|
|
379
|
+
} else if (err != ESP_OK) {
|
|
380
|
+
ESP_LOGVV(TAG, "TX to %02X failed: %s", address, esp_err_to_name(err));
|
|
381
|
+
return ERROR_UNKNOWN;
|
|
382
|
+
}
|
|
383
|
+
#else
|
|
210
384
|
i2c_cmd_handle_t cmd = i2c_cmd_link_create();
|
|
211
385
|
esp_err_t err = i2c_master_start(cmd);
|
|
212
386
|
if (err != ESP_OK) {
|
|
@@ -252,6 +426,7 @@ ErrorCode IDFI2CBus::writev(uint8_t address, WriteBuffer *buffers, size_t cnt, b
|
|
|
252
426
|
ESP_LOGVV(TAG, "TX to %02X failed: %s", address, esp_err_to_name(err));
|
|
253
427
|
return ERROR_UNKNOWN;
|
|
254
428
|
}
|
|
429
|
+
#endif
|
|
255
430
|
return ERROR_OK;
|
|
256
431
|
}
|
|
257
432
|
|
|
@@ -2,9 +2,14 @@
|
|
|
2
2
|
|
|
3
3
|
#ifdef USE_ESP_IDF
|
|
4
4
|
|
|
5
|
-
#include
|
|
5
|
+
#include "esp_idf_version.h"
|
|
6
6
|
#include "esphome/core/component.h"
|
|
7
7
|
#include "i2c_bus.h"
|
|
8
|
+
#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 4, 2)
|
|
9
|
+
#include <driver/i2c_master.h>
|
|
10
|
+
#else
|
|
11
|
+
#include <driver/i2c.h>
|
|
12
|
+
#endif
|
|
8
13
|
|
|
9
14
|
namespace esphome {
|
|
10
15
|
namespace i2c {
|
|
@@ -38,6 +43,11 @@ class IDFI2CBus : public InternalI2CBus, public Component {
|
|
|
38
43
|
RecoveryCode recovery_result_;
|
|
39
44
|
|
|
40
45
|
protected:
|
|
46
|
+
#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 4, 2)
|
|
47
|
+
i2c_master_dev_handle_t dev_;
|
|
48
|
+
i2c_master_bus_handle_t bus_;
|
|
49
|
+
void i2c_scan() override;
|
|
50
|
+
#endif
|
|
41
51
|
i2c_port_t port_;
|
|
42
52
|
uint8_t sda_pin_;
|
|
43
53
|
bool sda_pullup_enabled_;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
from esphome import pins
|
|
2
2
|
import esphome.codegen as cg
|
|
3
|
-
from esphome.components.esp32 import get_esp32_variant
|
|
3
|
+
from esphome.components.esp32 import add_idf_sdkconfig_option, get_esp32_variant
|
|
4
4
|
from esphome.components.esp32.const import (
|
|
5
5
|
VARIANT_ESP32,
|
|
6
6
|
VARIANT_ESP32C3,
|
|
@@ -243,10 +243,7 @@ def _final_validate(_):
|
|
|
243
243
|
|
|
244
244
|
|
|
245
245
|
def use_legacy():
|
|
246
|
-
|
|
247
|
-
if not _use_legacy_driver:
|
|
248
|
-
return False
|
|
249
|
-
return True
|
|
246
|
+
return not (CORE.using_esp_idf and not _use_legacy_driver)
|
|
250
247
|
|
|
251
248
|
|
|
252
249
|
FINAL_VALIDATE_SCHEMA = _final_validate
|
|
@@ -258,6 +255,10 @@ async def to_code(config):
|
|
|
258
255
|
if use_legacy():
|
|
259
256
|
cg.add_define("USE_I2S_LEGACY")
|
|
260
257
|
|
|
258
|
+
# Helps avoid callbacks being skipped due to processor load
|
|
259
|
+
if CORE.using_esp_idf:
|
|
260
|
+
add_idf_sdkconfig_option("CONFIG_I2S_ISR_IRAM_SAFE", True)
|
|
261
|
+
|
|
261
262
|
cg.add(var.set_lrclk_pin(config[CONF_I2S_LRCLK_PIN]))
|
|
262
263
|
if CONF_I2S_BCLK_PIN in config:
|
|
263
264
|
cg.add(var.set_bclk_pin(config[CONF_I2S_BCLK_PIN]))
|
|
@@ -10,8 +10,6 @@ namespace i2s_audio {
|
|
|
10
10
|
static const char *const TAG = "i2s_audio";
|
|
11
11
|
|
|
12
12
|
void I2SAudioComponent::setup() {
|
|
13
|
-
ESP_LOGCONFIG(TAG, "Running setup");
|
|
14
|
-
|
|
15
13
|
static i2s_port_t next_port_num = I2S_NUM_0;
|
|
16
14
|
if (next_port_num >= SOC_I2S_NUM) {
|
|
17
15
|
ESP_LOGE(TAG, "Too many components");
|
|
@@ -119,10 +119,7 @@ void I2SAudioMediaPlayer::set_volume_(float volume, bool publish) {
|
|
|
119
119
|
this->volume = volume;
|
|
120
120
|
}
|
|
121
121
|
|
|
122
|
-
void I2SAudioMediaPlayer::setup() {
|
|
123
|
-
ESP_LOGCONFIG(TAG, "Running setup");
|
|
124
|
-
this->state = media_player::MEDIA_PLAYER_STATE_IDLE;
|
|
125
|
-
}
|
|
122
|
+
void I2SAudioMediaPlayer::setup() { this->state = media_player::MEDIA_PLAYER_STATE_IDLE; }
|
|
126
123
|
|
|
127
124
|
void I2SAudioMediaPlayer::loop() {
|
|
128
125
|
switch (this->i2s_state_) {
|
|
@@ -44,9 +44,8 @@ PDM_VARIANTS = [esp32.const.VARIANT_ESP32, esp32.const.VARIANT_ESP32S3]
|
|
|
44
44
|
def _validate_esp32_variant(config):
|
|
45
45
|
variant = esp32.get_esp32_variant()
|
|
46
46
|
if config[CONF_ADC_TYPE] == "external":
|
|
47
|
-
if config[CONF_PDM]:
|
|
48
|
-
|
|
49
|
-
raise cv.Invalid(f"{variant} does not support PDM")
|
|
47
|
+
if config[CONF_PDM] and variant not in PDM_VARIANTS:
|
|
48
|
+
raise cv.Invalid(f"{variant} does not support PDM")
|
|
50
49
|
return config
|
|
51
50
|
if config[CONF_ADC_TYPE] == "internal":
|
|
52
51
|
if variant not in INTERNAL_ADC_VARIANTS:
|
|
@@ -122,9 +121,8 @@ CONFIG_SCHEMA = cv.All(
|
|
|
122
121
|
|
|
123
122
|
|
|
124
123
|
def _final_validate(config):
|
|
125
|
-
if not use_legacy():
|
|
126
|
-
|
|
127
|
-
raise cv.Invalid("Internal ADC is only compatible with legacy i2s driver.")
|
|
124
|
+
if not use_legacy() and config[CONF_ADC_TYPE] == "internal":
|
|
125
|
+
raise cv.Invalid("Internal ADC is only compatible with legacy i2s driver.")
|
|
128
126
|
|
|
129
127
|
|
|
130
128
|
FINAL_VALIDATE_SCHEMA = _final_validate
|
|
@@ -24,9 +24,6 @@ static const uint32_t READ_DURATION_MS = 16;
|
|
|
24
24
|
static const size_t TASK_STACK_SIZE = 4096;
|
|
25
25
|
static const ssize_t TASK_PRIORITY = 23;
|
|
26
26
|
|
|
27
|
-
// Use an exponential moving average to correct a DC offset with weight factor 1/1000
|
|
28
|
-
static const int32_t DC_OFFSET_MOVING_AVERAGE_COEFFICIENT_DENOMINATOR = 1000;
|
|
29
|
-
|
|
30
27
|
static const char *const TAG = "i2s_audio.microphone";
|
|
31
28
|
|
|
32
29
|
enum MicrophoneEventGroupBits : uint32_t {
|
|
@@ -40,7 +37,6 @@ enum MicrophoneEventGroupBits : uint32_t {
|
|
|
40
37
|
};
|
|
41
38
|
|
|
42
39
|
void I2SAudioMicrophone::setup() {
|
|
43
|
-
ESP_LOGCONFIG(TAG, "Running setup");
|
|
44
40
|
#ifdef USE_I2S_LEGACY
|
|
45
41
|
#if SOC_I2S_SUPPORTS_ADC
|
|
46
42
|
if (this->adc_) {
|
|
@@ -382,26 +378,57 @@ void I2SAudioMicrophone::mic_task(void *params) {
|
|
|
382
378
|
}
|
|
383
379
|
|
|
384
380
|
void I2SAudioMicrophone::fix_dc_offset_(std::vector<uint8_t> &data) {
|
|
381
|
+
/**
|
|
382
|
+
* From https://www.musicdsp.org/en/latest/Filters/135-dc-filter.html:
|
|
383
|
+
*
|
|
384
|
+
* y(n) = x(n) - x(n-1) + R * y(n-1)
|
|
385
|
+
* R = 1 - (pi * 2 * frequency / samplerate)
|
|
386
|
+
*
|
|
387
|
+
* From https://en.wikipedia.org/wiki/Hearing_range:
|
|
388
|
+
* The human range is commonly given as 20Hz up.
|
|
389
|
+
*
|
|
390
|
+
* From https://en.wikipedia.org/wiki/High-resolution_audio:
|
|
391
|
+
* A reasonable upper bound for sample rate seems to be 96kHz.
|
|
392
|
+
*
|
|
393
|
+
* Calculate R value for 20Hz on a 96kHz sample rate:
|
|
394
|
+
* R = 1 - (pi * 2 * 20 / 96000)
|
|
395
|
+
* R = 0.9986910031
|
|
396
|
+
*
|
|
397
|
+
* Transform floating point to bit-shifting approximation:
|
|
398
|
+
* output = input - prev_input + R * prev_output
|
|
399
|
+
* output = input - prev_input + (prev_output - (prev_output >> S))
|
|
400
|
+
*
|
|
401
|
+
* Approximate bit-shift value S from R:
|
|
402
|
+
* R = 1 - (1 >> S)
|
|
403
|
+
* R = 1 - (1 / 2^S)
|
|
404
|
+
* R = 1 - 2^-S
|
|
405
|
+
* 0.9986910031 = 1 - 2^-S
|
|
406
|
+
* S = 9.57732 ~= 10
|
|
407
|
+
*
|
|
408
|
+
* Actual R from S:
|
|
409
|
+
* R = 1 - 2^-10 = 0.9990234375
|
|
410
|
+
*
|
|
411
|
+
* Confirm this has effect outside human hearing on 96000kHz sample:
|
|
412
|
+
* 0.9990234375 = 1 - (pi * 2 * f / 96000)
|
|
413
|
+
* f = 14.9208Hz
|
|
414
|
+
*
|
|
415
|
+
* Confirm this has effect outside human hearing on PDM 16kHz sample:
|
|
416
|
+
* 0.9990234375 = 1 - (pi * 2 * f / 16000)
|
|
417
|
+
* f = 2.4868Hz
|
|
418
|
+
*
|
|
419
|
+
*/
|
|
420
|
+
const uint8_t dc_filter_shift = 10;
|
|
385
421
|
const size_t bytes_per_sample = this->audio_stream_info_.samples_to_bytes(1);
|
|
386
422
|
const uint32_t total_samples = this->audio_stream_info_.bytes_to_samples(data.size());
|
|
387
|
-
|
|
388
|
-
if (total_samples == 0) {
|
|
389
|
-
return;
|
|
390
|
-
}
|
|
391
|
-
|
|
392
|
-
int64_t offset_accumulator = 0;
|
|
393
423
|
for (uint32_t sample_index = 0; sample_index < total_samples; ++sample_index) {
|
|
394
424
|
const uint32_t byte_index = sample_index * bytes_per_sample;
|
|
395
|
-
int32_t
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
425
|
+
int32_t input = audio::unpack_audio_sample_to_q31(&data[byte_index], bytes_per_sample);
|
|
426
|
+
int32_t output = input - this->dc_offset_prev_input_ +
|
|
427
|
+
(this->dc_offset_prev_output_ - (this->dc_offset_prev_output_ >> dc_filter_shift));
|
|
428
|
+
this->dc_offset_prev_input_ = input;
|
|
429
|
+
this->dc_offset_prev_output_ = output;
|
|
430
|
+
audio::pack_q31_as_audio_sample(output, &data[byte_index], bytes_per_sample);
|
|
399
431
|
}
|
|
400
|
-
|
|
401
|
-
const int32_t new_offset = offset_accumulator / total_samples;
|
|
402
|
-
this->dc_offset_ = new_offset / DC_OFFSET_MOVING_AVERAGE_COEFFICIENT_DENOMINATOR +
|
|
403
|
-
(DC_OFFSET_MOVING_AVERAGE_COEFFICIENT_DENOMINATOR - 1) * this->dc_offset_ /
|
|
404
|
-
DC_OFFSET_MOVING_AVERAGE_COEFFICIENT_DENOMINATOR;
|
|
405
432
|
}
|
|
406
433
|
|
|
407
434
|
size_t I2SAudioMicrophone::read_(uint8_t *buf, size_t len, TickType_t ticks_to_wait) {
|