esphome 2025.6.3__py3-none-any.whl → 2025.7.0b2__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 +1 -3
- esphome/codegen.py +2 -0
- esphome/components/ac_dimmer/ac_dimmer.cpp +6 -6
- esphome/components/adc/__init__.py +25 -1
- esphome/components/adc/adc_sensor.h +11 -11
- esphome/components/adc/adc_sensor_common.cpp +1 -1
- esphome/components/adc/adc_sensor_esp32.cpp +16 -8
- esphome/components/ade7880/ade7880.h +0 -2
- esphome/components/ads1115/ads1115.h +0 -1
- esphome/components/ads1118/ads1118.h +0 -1
- esphome/components/ags10/ags10.h +0 -2
- esphome/components/aic3204/aic3204.h +0 -1
- esphome/components/alarm_control_panel/__init__.py +5 -2
- esphome/components/alpha3/alpha3.h +0 -1
- esphome/components/am43/cover/am43_cover.h +0 -1
- esphome/components/am43/sensor/am43_sensor.h +0 -1
- esphome/components/analog_threshold/analog_threshold_binary_sensor.h +0 -2
- esphome/components/anova/anova.cpp +5 -1
- esphome/components/anova/anova.h +0 -1
- esphome/components/apds9960/apds9960.cpp +1 -1
- esphome/components/api/__init__.py +57 -21
- esphome/components/api/api_connection.cpp +344 -539
- esphome/components/api/api_connection.h +224 -141
- esphome/components/api/api_frame_helper.cpp +91 -127
- esphome/components/api/api_frame_helper.h +64 -54
- esphome/components/api/api_pb2.cpp +1837 -9044
- esphome/components/api/api_pb2.h +532 -685
- esphome/components/api/api_pb2_dump.cpp +4432 -0
- esphome/components/api/api_pb2_service.cpp +184 -425
- esphome/components/api/api_pb2_service.h +13 -6
- esphome/components/api/api_server.cpp +131 -167
- esphome/components/api/api_server.h +38 -10
- esphome/components/api/client.py +8 -2
- esphome/components/api/custom_api_device.h +8 -0
- esphome/components/api/list_entities.cpp +37 -104
- esphome/components/api/list_entities.h +33 -23
- esphome/components/api/proto.h +532 -26
- esphome/components/api/subscribe_state.cpp +23 -29
- esphome/components/api/subscribe_state.h +26 -19
- esphome/components/api/user_services.h +2 -0
- esphome/components/as5600/as5600.h +0 -1
- esphome/components/async_tcp/__init__.py +14 -5
- esphome/components/atc_mithermometer/atc_mithermometer.h +0 -1
- esphome/components/atm90e32/atm90e32.cpp +2 -1
- esphome/components/audio/audio_decoder.cpp +1 -1
- esphome/components/audio/audio_transfer_buffer.cpp +2 -2
- esphome/components/b_parasite/b_parasite.h +0 -1
- esphome/components/bedjet/bedjet_hub.cpp +5 -1
- esphome/components/bedjet/climate/bedjet_climate.cpp +5 -1
- esphome/components/beken_spi_led_strip/led_strip.cpp +4 -2
- esphome/components/bh1750/bh1750.cpp +5 -5
- esphome/components/binary_sensor/__init__.py +82 -5
- esphome/components/binary_sensor/automation.h +19 -1
- esphome/components/binary_sensor/binary_sensor.cpp +12 -30
- esphome/components/binary_sensor/binary_sensor.h +11 -25
- esphome/components/binary_sensor/filter.cpp +29 -24
- esphome/components/binary_sensor/filter.h +20 -10
- esphome/components/ble_client/output/ble_binary_output.h +0 -1
- esphome/components/ble_client/sensor/ble_rssi_sensor.cpp +5 -1
- esphome/components/ble_client/sensor/ble_rssi_sensor.h +0 -1
- esphome/components/ble_client/sensor/ble_sensor.cpp +5 -1
- esphome/components/ble_client/sensor/ble_sensor.h +0 -1
- esphome/components/ble_client/switch/ble_switch.h +0 -1
- esphome/components/ble_client/text_sensor/ble_text_sensor.cpp +5 -1
- esphome/components/ble_client/text_sensor/ble_text_sensor.h +0 -1
- esphome/components/ble_presence/ble_presence_device.h +0 -1
- esphome/components/ble_rssi/ble_rssi_sensor.h +0 -1
- esphome/components/ble_scanner/ble_scanner.h +0 -1
- esphome/components/bluetooth_proxy/bluetooth_connection.h +9 -2
- esphome/components/bluetooth_proxy/bluetooth_proxy.cpp +16 -6
- esphome/components/bluetooth_proxy/bluetooth_proxy.h +8 -2
- esphome/components/bme680/sensor.py +1 -1
- esphome/components/bmp581/bmp581.h +0 -2
- esphome/components/button/__init__.py +5 -2
- esphome/components/camera/__init__.py +1 -0
- esphome/components/camera/camera.cpp +22 -0
- esphome/components/camera/camera.h +80 -0
- esphome/components/canbus/__init__.py +1 -0
- esphome/components/cap1188/cap1188.h +0 -1
- esphome/components/captive_portal/__init__.py +12 -2
- esphome/components/captive_portal/captive_portal.cpp +12 -2
- esphome/components/captive_portal/captive_portal.h +5 -2
- esphome/components/ccs811/ccs811.h +0 -2
- esphome/components/climate/__init__.py +5 -2
- esphome/components/cm1106/sensor.py +2 -2
- esphome/components/const/__init__.py +2 -0
- esphome/components/copy/binary_sensor/copy_binary_sensor.h +0 -1
- esphome/components/copy/button/copy_button.h +0 -1
- esphome/components/copy/cover/copy_cover.h +0 -1
- esphome/components/copy/fan/copy_fan.h +0 -1
- esphome/components/copy/lock/copy_lock.h +0 -1
- esphome/components/copy/number/copy_number.h +0 -1
- esphome/components/copy/select/copy_select.h +0 -1
- esphome/components/copy/sensor/copy_sensor.h +0 -1
- esphome/components/copy/switch/copy_switch.h +0 -1
- esphome/components/copy/text/copy_text.h +0 -1
- esphome/components/copy/text_sensor/copy_text_sensor.h +0 -1
- esphome/components/cover/__init__.py +5 -2
- esphome/components/cs5460a/cs5460a.h +0 -1
- esphome/components/datetime/__init__.py +4 -2
- esphome/components/debug/__init__.py +20 -0
- esphome/components/debug/debug_esp32.cpp +2 -0
- esphome/components/deep_sleep/__init__.py +43 -9
- esphome/components/demo/__init__.py +2 -2
- esphome/components/display/display.cpp +4 -3
- esphome/components/display/display.h +0 -2
- esphome/components/display/display_buffer.cpp +1 -1
- esphome/components/ds2484/__init__.py +1 -0
- esphome/components/ds2484/ds2484.cpp +209 -0
- esphome/components/ds2484/ds2484.h +43 -0
- esphome/components/ds2484/one_wire.py +37 -0
- esphome/components/duty_time/duty_time_sensor.h +0 -1
- esphome/components/ens160_base/ens160_base.h +0 -1
- esphome/components/es7210/es7210.h +0 -1
- esphome/components/es7243e/es7243e.h +0 -1
- esphome/components/es8156/es8156.h +0 -1
- esphome/components/es8311/es8311.h +0 -1
- esphome/components/es8388/es8388.h +0 -1
- esphome/components/esp32/__init__.py +103 -135
- esphome/components/esp32/core.cpp +0 -4
- esphome/components/esp32/gpio.h +1 -1
- esphome/components/esp32/helpers.cpp +69 -0
- esphome/components/esp32_ble/ble.cpp +5 -6
- esphome/components/esp32_ble/ble.h +29 -14
- esphome/components/esp32_ble/ble_event.h +6 -6
- esphome/components/esp32_ble_client/ble_client_base.cpp +21 -6
- esphome/components/esp32_ble_client/ble_client_base.h +24 -9
- esphome/components/esp32_ble_tracker/__init__.py +2 -8
- esphome/components/esp32_ble_tracker/esp32_ble_tracker.cpp +5 -5
- esphome/components/esp32_ble_tracker/esp32_ble_tracker.h +11 -7
- esphome/components/esp32_camera/__init__.py +112 -98
- esphome/components/esp32_camera/esp32_camera.cpp +41 -31
- esphome/components/esp32_camera/esp32_camera.h +35 -30
- esphome/components/esp32_camera_web_server/__init__.py +2 -1
- esphome/components/esp32_camera_web_server/camera_web_server.cpp +8 -8
- esphome/components/esp32_camera_web_server/camera_web_server.h +3 -3
- esphome/components/esp32_hall/sensor.py +2 -21
- esphome/components/esp32_hosted/__init__.py +101 -0
- esphome/components/esp32_hosted/esp32_hosted.py.script +12 -0
- esphome/components/esp32_improv/esp32_improv_component.cpp +3 -0
- esphome/components/esp32_rmt/__init__.py +0 -58
- esphome/components/esp32_rmt_led_strip/led_strip.cpp +77 -63
- esphome/components/esp32_rmt_led_strip/led_strip.h +11 -17
- esphome/components/esp32_rmt_led_strip/light.py +14 -76
- esphome/components/esp32_touch/esp32_touch.h +174 -28
- esphome/components/esp32_touch/esp32_touch_common.cpp +162 -0
- esphome/components/esp32_touch/esp32_touch_v1.cpp +240 -0
- esphome/components/esp32_touch/esp32_touch_v2.cpp +397 -0
- esphome/components/esp8266/__init__.py +2 -0
- esphome/components/esp8266/gpio.cpp +10 -10
- esphome/components/esp8266/helpers.cpp +31 -0
- esphome/components/esphome/ota/__init__.py +1 -0
- esphome/components/esphome/ota/ota_esphome.cpp +24 -19
- esphome/components/ethernet/__init__.py +42 -23
- esphome/components/ethernet/esp_eth_phy_jl1101.c +0 -16
- esphome/components/ethernet/ethernet_component.cpp +69 -29
- esphome/components/ethernet/ethernet_component.h +18 -10
- esphome/components/event/__init__.py +5 -2
- esphome/components/ezo/ezo.h +0 -1
- esphome/components/ezo_pmp/ezo_pmp.h +0 -1
- esphome/components/fan/__init__.py +5 -2
- esphome/components/feedback/feedback_cover.h +0 -1
- esphome/components/font/__init__.py +92 -82
- esphome/components/font/font.cpp +9 -2
- esphome/components/font/font.h +20 -5
- esphome/components/fs3000/fs3000.h +0 -1
- esphome/components/gcja5/gcja5.h +0 -1
- esphome/components/gl_r01_i2c/__init__.py +0 -0
- esphome/components/gl_r01_i2c/gl_r01_i2c.cpp +68 -0
- esphome/components/gl_r01_i2c/gl_r01_i2c.h +22 -0
- esphome/components/gl_r01_i2c/sensor.py +36 -0
- esphome/components/gp8403/gp8403.h +0 -1
- esphome/components/gpio/binary_sensor/__init__.py +17 -0
- esphome/components/gpio/binary_sensor/gpio_binary_sensor.cpp +77 -3
- esphome/components/gpio/binary_sensor/gpio_binary_sensor.h +40 -0
- esphome/components/grove_gas_mc_v2/grove_gas_mc_v2.h +0 -2
- esphome/components/he60r/he60r.h +0 -1
- esphome/components/heatpumpir/climate.py +2 -1
- esphome/components/heatpumpir/heatpumpir.cpp +1 -0
- esphome/components/heatpumpir/heatpumpir.h +1 -0
- esphome/components/honeywellabp2_i2c/honeywellabp2.h +0 -1
- esphome/components/host/__init__.py +3 -1
- esphome/components/host/helpers.cpp +57 -0
- esphome/components/http_request/__init__.py +19 -1
- esphome/components/http_request/http_request.h +1 -1
- esphome/components/http_request/http_request_arduino.h +1 -0
- esphome/components/http_request/ota/ota_http_request.cpp +1 -1
- esphome/components/http_request/update/http_request_update.cpp +28 -9
- esphome/components/hydreon_rgxx/hydreon_rgxx.cpp +3 -9
- esphome/components/hydreon_rgxx/sensor.py +1 -1
- esphome/components/i2c/__init__.py +23 -11
- esphome/components/i2c/i2c_bus.h +8 -1
- esphome/components/i2c/i2c_bus_arduino.cpp +4 -3
- esphome/components/i2c/i2c_bus_arduino.h +6 -3
- esphome/components/i2c/i2c_bus_esp_idf.h +5 -3
- esphome/components/i2c_device/i2c_device.h +0 -1
- esphome/components/i2s_audio/__init__.py +2 -10
- esphome/components/i2s_audio/i2s_audio.cpp +1 -5
- esphome/components/i2s_audio/media_player/__init__.py +2 -2
- esphome/components/i2s_audio/speaker/i2s_audio_speaker.cpp +2 -2
- esphome/components/iaqcore/iaqcore.h +0 -2
- esphome/components/image/__init__.py +123 -24
- esphome/components/improv_serial/improv_serial_component.cpp +0 -4
- esphome/components/ina219/ina219.cpp +7 -0
- esphome/components/ina219/ina219.h +1 -0
- esphome/components/ina260/ina260.h +0 -2
- esphome/components/inkbird_ibsth1_mini/inkbird_ibsth1_mini.h +0 -1
- esphome/components/inkplate6/display.py +15 -0
- esphome/components/inkplate6/inkplate.cpp +2 -2
- esphome/components/integration/integration_sensor.h +0 -1
- esphome/components/internal_temperature/internal_temperature.cpp +8 -27
- esphome/components/internal_temperature/sensor.py +0 -26
- esphome/components/interval/interval.h +0 -2
- esphome/components/ld2410/button/__init__.py +3 -3
- esphome/components/ld2410/button/factory_reset_button.cpp +9 -0
- esphome/components/ld2410/button/{reset_button.h → factory_reset_button.h} +2 -2
- esphome/components/ld2410/ld2410.cpp +421 -268
- esphome/components/ld2410/ld2410.h +44 -146
- esphome/components/ld2410/number/__init__.py +2 -2
- esphome/components/ld2410/sensor.py +1 -1
- esphome/components/ld2410/switch/__init__.py +1 -1
- esphome/components/ld2420/ld2420.cpp +196 -100
- esphome/components/ld2420/ld2420.h +46 -118
- esphome/components/ld2420/number/__init__.py +2 -2
- esphome/components/ld2420/sensor/__init__.py +6 -2
- esphome/components/ld2420/sensor/ld2420_sensor.h +1 -1
- esphome/components/ld2450/button/__init__.py +3 -3
- esphome/components/ld2450/button/factory_reset_button.cpp +9 -0
- esphome/components/ld2450/button/{reset_button.h → factory_reset_button.h} +2 -2
- esphome/components/ld2450/ld2450.cpp +384 -232
- esphome/components/ld2450/ld2450.h +60 -69
- esphome/components/ld2450/switch/__init__.py +1 -1
- esphome/components/ledc/ledc_output.cpp +1 -63
- esphome/components/libretiny/__init__.py +5 -3
- esphome/components/libretiny/const.py +5 -0
- esphome/components/libretiny/generate_components.py +1 -0
- esphome/components/libretiny/helpers.cpp +35 -0
- esphome/components/libretiny/lt_component.cpp +5 -3
- esphome/components/light/__init__.py +4 -2
- esphome/components/light/addressable_light.h +3 -3
- esphome/components/light/light_call.cpp +180 -243
- esphome/components/light/light_call.h +72 -20
- esphome/components/light/light_color_values.h +14 -14
- esphome/components/light/light_state.h +15 -13
- esphome/components/light/transformers.h +2 -2
- esphome/components/ln882x/__init__.py +52 -0
- esphome/components/ln882x/boards.py +285 -0
- esphome/components/lock/__init__.py +5 -2
- esphome/components/logger/__init__.py +40 -3
- esphome/components/logger/logger.cpp +47 -12
- esphome/components/logger/logger.h +80 -49
- esphome/components/logger/logger_esp32.cpp +3 -3
- esphome/components/lps22/__init__.py +0 -0
- esphome/components/lps22/lps22.cpp +75 -0
- esphome/components/lps22/lps22.h +27 -0
- esphome/components/lps22/sensor.py +58 -0
- esphome/components/ltr390/ltr390.h +0 -1
- esphome/components/ltr501/ltr501.h +0 -1
- esphome/components/ltr_als_ps/ltr_als_ps.h +0 -1
- esphome/components/lvgl/__init__.py +1 -1
- esphome/components/lvgl/schemas.py +66 -6
- esphome/components/lvgl/styles.py +24 -16
- esphome/components/lvgl/widgets/__init__.py +12 -2
- esphome/components/lvgl/widgets/lv_bar.py +40 -19
- esphome/components/m5stack_8angle/light/m5stack_8angle_light.cpp +1 -1
- esphome/components/max9611/max9611.h +0 -1
- esphome/components/mcp23016/__init__.py +1 -1
- esphome/components/mcp23xxx_base/__init__.py +1 -1
- esphome/components/mcp4461/__init__.py +1 -1
- esphome/components/mcp4461/output/__init__.py +3 -2
- esphome/components/mcp9600/mcp9600.h +0 -2
- esphome/components/md5/md5.cpp +3 -3
- esphome/components/md5/md5.h +1 -6
- esphome/components/mdns/__init__.py +22 -11
- esphome/components/media_player/__init__.py +4 -3
- esphome/components/micro_wake_word/__init__.py +1 -5
- esphome/components/micro_wake_word/streaming_model.cpp +2 -2
- esphome/components/microphone/microphone.cpp +7 -9
- esphome/components/microphone/microphone.h +0 -2
- esphome/components/mipi_spi/display.py +1 -0
- esphome/components/mmc5603/mmc5603.cpp +1 -1
- esphome/components/modbus/modbus.cpp +33 -15
- esphome/components/modbus/modbus.h +9 -0
- esphome/components/modbus_controller/__init__.py +42 -10
- esphome/components/modbus_controller/modbus_controller.cpp +92 -11
- esphome/components/modbus_controller/modbus_controller.h +61 -7
- esphome/components/mopeka_pro_check/mopeka_pro_check.h +0 -1
- esphome/components/mopeka_std_check/mopeka_std_check.h +0 -1
- esphome/components/mpl3115a2/mpl3115a2.h +0 -2
- esphome/components/mqtt/__init__.py +16 -0
- esphome/components/mqtt/mqtt_backend.h +2 -1
- esphome/components/mqtt/mqtt_backend_esp32.cpp +132 -47
- esphome/components/mqtt/mqtt_backend_esp32.h +106 -4
- esphome/components/mqtt/mqtt_client.cpp +15 -9
- esphome/components/mqtt/mqtt_client.h +8 -3
- esphome/components/ms8607/ms8607.h +0 -1
- esphome/components/neopixelbus/light.py +4 -1
- esphome/components/neopixelbus/neopixelbus_light.h +1 -1
- esphome/components/network/__init__.py +4 -1
- esphome/components/network/ip_address.h +1 -0
- esphome/components/nextion/__init__.py +16 -0
- esphome/components/nextion/base_component.py +1 -0
- esphome/components/nextion/binary_sensor/nextion_binarysensor.cpp +1 -1
- esphome/components/nextion/display.py +14 -4
- esphome/components/nextion/nextion.cpp +166 -101
- esphome/components/nextion/nextion.h +84 -53
- esphome/components/nextion/nextion_commands.cpp +11 -10
- esphome/components/nextion/nextion_component.cpp +28 -28
- esphome/components/nextion/nextion_component.h +53 -18
- esphome/components/nextion/nextion_component_base.h +3 -0
- esphome/components/nextion/nextion_upload.cpp +36 -0
- esphome/components/nextion/nextion_upload_arduino.cpp +10 -35
- esphome/components/nextion/nextion_upload_idf.cpp +9 -33
- esphome/components/nextion/sensor/nextion_sensor.cpp +1 -1
- esphome/components/nextion/switch/nextion_switch.cpp +1 -1
- esphome/components/nextion/text_sensor/nextion_textsensor.cpp +1 -1
- esphome/components/nfc/nfc.cpp +3 -22
- esphome/components/nfc/nfc.h +3 -3
- esphome/components/number/__init__.py +5 -2
- esphome/components/online_image/__init__.py +5 -0
- esphome/components/online_image/online_image.cpp +6 -2
- esphome/components/online_image/online_image.h +4 -1
- esphome/components/opentherm/opentherm.cpp +7 -12
- esphome/components/openthread/__init__.py +47 -40
- esphome/components/openthread/const.py +1 -0
- esphome/components/openthread/openthread_esp.cpp +27 -5
- esphome/components/opt3001/__init__.py +0 -0
- esphome/components/opt3001/opt3001.cpp +122 -0
- esphome/components/opt3001/opt3001.h +27 -0
- esphome/components/opt3001/sensor.py +35 -0
- esphome/components/ota/__init__.py +17 -0
- esphome/components/ota/ota_backend.h +27 -1
- esphome/components/ota/ota_backend_arduino_esp32.cpp +12 -2
- esphome/components/ota/ota_backend_arduino_esp32.h +3 -0
- esphome/components/ota/ota_backend_arduino_esp8266.cpp +18 -4
- esphome/components/ota/ota_backend_arduino_esp8266.h +3 -0
- esphome/components/ota/ota_backend_arduino_libretiny.cpp +12 -2
- esphome/components/ota/ota_backend_arduino_libretiny.h +3 -0
- esphome/components/ota/ota_backend_arduino_rp2040.cpp +9 -2
- esphome/components/ota/ota_backend_arduino_rp2040.h +3 -0
- esphome/components/ota/ota_backend_esp_idf.cpp +10 -16
- esphome/components/ota/ota_backend_esp_idf.h +1 -0
- esphome/components/packages/__init__.py +5 -2
- esphome/components/packet_transport/binary_sensor.py +61 -4
- esphome/components/packet_transport/packet_transport.cpp +34 -1
- esphome/components/packet_transport/packet_transport.h +11 -5
- esphome/components/pcf8574/__init__.py +1 -1
- esphome/components/pi4ioe5v6408/__init__.py +84 -0
- esphome/components/pi4ioe5v6408/pi4ioe5v6408.cpp +171 -0
- esphome/components/pi4ioe5v6408/pi4ioe5v6408.h +70 -0
- esphome/components/pmsa003i/pmsa003i.h +0 -1
- esphome/components/pmsx003/pmsx003.h +0 -1
- esphome/components/pn7150/pn7150.cpp +7 -7
- esphome/components/pn7150/pn7150.h +0 -1
- esphome/components/pn7160/pn7160.cpp +7 -7
- esphome/components/pn7160/pn7160.h +0 -1
- esphome/components/preferences/syncer.h +2 -0
- esphome/components/prometheus/prometheus_handler.h +1 -1
- esphome/components/psram/psram.cpp +0 -20
- esphome/components/pulse_counter/pulse_counter_sensor.h +0 -1
- esphome/components/pulse_meter/pulse_meter_sensor.cpp +8 -4
- esphome/components/pulse_width/pulse_width.h +0 -1
- esphome/components/pvvx_mithermometer/display/pvvx_display.cpp +0 -4
- esphome/components/pvvx_mithermometer/display/pvvx_display.h +0 -2
- esphome/components/pvvx_mithermometer/pvvx_mithermometer.h +0 -1
- esphome/components/qr_code/__init__.py +13 -10
- esphome/components/qwiic_pir/qwiic_pir.h +0 -1
- esphome/components/radon_eye_ble/radon_eye_listener.cpp +1 -1
- esphome/components/rc522/rc522.h +0 -1
- esphome/components/rdm6300/rdm6300.h +0 -2
- esphome/components/remote_base/__init__.py +7 -5
- esphome/components/remote_base/remote_base.cpp +24 -21
- esphome/components/remote_base/remote_base.h +3 -26
- esphome/components/remote_receiver/__init__.py +40 -46
- esphome/components/remote_receiver/remote_receiver.h +4 -18
- esphome/components/remote_receiver/remote_receiver_esp32.cpp +0 -87
- esphome/components/remote_receiver/remote_receiver_esp8266.cpp +1 -1
- esphome/components/remote_transmitter/__init__.py +42 -43
- esphome/components/remote_transmitter/remote_transmitter.h +2 -14
- esphome/components/remote_transmitter/remote_transmitter_esp32.cpp +0 -77
- esphome/components/resistance/resistance_sensor.h +0 -1
- esphome/components/rp2040/__init__.py +2 -0
- esphome/components/rp2040/helpers.cpp +55 -0
- esphome/components/rp2040_pio_led_strip/led_strip.cpp +2 -2
- esphome/components/rpi_dpi_rgb/rpi_dpi_rgb.cpp +0 -4
- esphome/components/rtttl/__init__.py +4 -4
- esphome/components/rtttl/rtttl.cpp +10 -1
- esphome/components/ruuvitag/ruuvitag.h +0 -1
- esphome/components/safe_mode/safe_mode.cpp +2 -0
- esphome/components/safe_mode/safe_mode.h +4 -1
- esphome/components/scd30/scd30.h +0 -1
- esphome/components/scd30/sensor.py +2 -2
- esphome/components/scd4x/scd4x.cpp +61 -54
- esphome/components/scd4x/scd4x.h +17 -15
- esphome/components/scd4x/sensor.py +4 -4
- esphome/components/script/script.h +0 -2
- esphome/components/sdp3x/sensor.py +1 -1
- esphome/components/select/__init__.py +5 -2
- esphome/components/sen5x/sen5x.h +0 -1
- esphome/components/senseair/senseair.h +0 -1
- esphome/components/sensor/__init__.py +4 -2
- esphome/components/sensor/filter.cpp +1 -1
- esphome/components/sensor/sensor.cpp +12 -6
- esphome/components/sensor/sensor.h +13 -5
- esphome/components/servo/servo.h +0 -1
- esphome/components/sfa30/sfa30.h +0 -1
- esphome/components/sgp30/sgp30.h +0 -1
- esphome/components/sgp4x/sgp4x.h +0 -1
- esphome/components/shelly_dimmer/stm32flash.cpp +1 -2
- esphome/components/sht4x/sht4x.h +0 -1
- esphome/components/sm300d2/sm300d2.h +0 -2
- esphome/components/smt100/sensor.py +8 -4
- esphome/components/smt100/smt100.cpp +5 -5
- esphome/components/smt100/smt100.h +3 -3
- esphome/components/sn74hc595/__init__.py +1 -1
- esphome/components/sn74hc595/sn74hc595.cpp +5 -4
- esphome/components/sntp/sntp_component.cpp +9 -3
- esphome/components/sntp/time.py +2 -0
- esphome/components/socket/__init__.py +17 -0
- esphome/components/spi/__init__.py +27 -6
- esphome/components/spi/spi.cpp +3 -2
- esphome/components/spi/spi.h +9 -3
- esphome/components/spi/spi_arduino.cpp +3 -5
- esphome/components/spi/spi_esp_idf.cpp +40 -21
- esphome/components/spi_led_strip/spi_led_strip.cpp +1 -1
- esphome/components/sps30/sps30.h +0 -1
- esphome/components/ssd1306_base/ssd1306_base.cpp +1 -1
- esphome/components/st7701s/st7701s.cpp +0 -4
- esphome/components/status/status_binary_sensor.h +0 -2
- esphome/components/substitutions/__init__.py +76 -19
- esphome/components/substitutions/jinja.py +99 -0
- esphome/components/sun/sun.cpp +3 -4
- esphome/components/switch/__init__.py +5 -2
- esphome/components/switch/binary_sensor/switch_binary_sensor.h +0 -1
- esphome/components/sx126x/__init__.py +317 -0
- esphome/components/sx126x/automation.h +62 -0
- esphome/components/sx126x/packet_transport/__init__.py +26 -0
- esphome/components/sx126x/packet_transport/sx126x_transport.cpp +26 -0
- esphome/components/sx126x/packet_transport/sx126x_transport.h +25 -0
- esphome/components/sx126x/sx126x.cpp +523 -0
- esphome/components/sx126x/sx126x.h +140 -0
- esphome/components/sx126x/sx126x_reg.h +163 -0
- esphome/components/sx127x/__init__.py +325 -0
- esphome/components/sx127x/automation.h +62 -0
- esphome/components/sx127x/packet_transport/__init__.py +26 -0
- esphome/components/sx127x/packet_transport/sx127x_transport.cpp +26 -0
- esphome/components/sx127x/packet_transport/sx127x_transport.h +25 -0
- esphome/components/sx127x/sx127x.cpp +498 -0
- esphome/components/sx127x/sx127x.h +128 -0
- esphome/components/sx127x/sx127x_reg.h +295 -0
- esphome/components/syslog/esphome_syslog.cpp +5 -3
- esphome/components/syslog/esphome_syslog.h +1 -1
- esphome/components/tca9555/__init__.py +1 -1
- esphome/components/template/binary_sensor/template_binary_sensor.cpp +1 -9
- esphome/components/text/__init__.py +5 -2
- esphome/components/text_sensor/__init__.py +5 -2
- esphome/components/thermostat/thermostat_climate.cpp +34 -31
- esphome/components/thermostat/thermostat_climate.h +43 -39
- esphome/components/time/__init__.py +16 -2
- esphome/components/time/real_time_clock.cpp +4 -0
- esphome/components/time/real_time_clock.h +5 -1
- esphome/components/tlc5971/tlc5971.cpp +4 -1
- esphome/components/tmp1075/tmp1075.h +0 -2
- esphome/components/tof10120/tof10120_sensor.h +0 -1
- esphome/components/tormatic/tormatic_cover.h +0 -1
- esphome/components/total_daily_energy/total_daily_energy.h +0 -1
- esphome/components/tsl2591/tsl2591.cpp +1 -1
- esphome/components/ttp229_bsf/ttp229_bsf.h +0 -1
- esphome/components/ttp229_lsf/ttp229_lsf.h +0 -1
- esphome/components/tx20/tx20.cpp +2 -2
- esphome/components/uart/__init__.py +18 -0
- esphome/components/uart/uart_component_esp_idf.cpp +0 -4
- esphome/components/update/__init__.py +5 -2
- esphome/components/update/update_entity.h +8 -0
- esphome/components/usb_host/__init__.py +5 -2
- esphome/components/usb_host/usb_host_client.cpp +10 -10
- esphome/components/usb_uart/cp210x.cpp +1 -1
- esphome/components/usb_uart/usb_uart.cpp +41 -44
- esphome/components/usb_uart/usb_uart.h +4 -3
- esphome/components/valve/__init__.py +5 -2
- esphome/components/vbus/vbus.h +0 -1
- esphome/components/veml3235/veml3235.h +0 -1
- esphome/components/veml7700/veml7700.h +0 -1
- esphome/components/vl53l0x/vl53l0x_sensor.h +0 -1
- esphome/components/voice_assistant/voice_assistant.cpp +4 -4
- esphome/components/watchdog/watchdog.cpp +0 -4
- esphome/components/waveshare_epaper/waveshare_epaper.cpp +6 -6
- esphome/components/web_server/__init__.py +34 -19
- esphome/components/web_server/ota/__init__.py +32 -0
- esphome/components/web_server/ota/ota_web_server.cpp +210 -0
- esphome/components/web_server/ota/ota_web_server.h +26 -0
- esphome/components/web_server/web_server.cpp +305 -427
- esphome/components/web_server/web_server.h +33 -23
- esphome/components/web_server/web_server_v1.cpp +4 -5
- esphome/components/web_server_base/__init__.py +5 -2
- esphome/components/web_server_base/web_server_base.cpp +2 -94
- esphome/components/web_server_base/web_server_base.h +5 -25
- esphome/components/web_server_idf/multipart.cpp +254 -0
- esphome/components/web_server_idf/multipart.h +86 -0
- esphome/components/web_server_idf/utils.cpp +32 -0
- esphome/components/web_server_idf/utils.h +10 -0
- esphome/components/web_server_idf/web_server_idf.cpp +162 -16
- esphome/components/web_server_idf/web_server_idf.h +11 -10
- esphome/components/wiegand/wiegand.cpp +2 -2
- esphome/components/wifi/__init__.py +18 -0
- esphome/components/wifi/wifi_component.cpp +17 -22
- esphome/components/wifi/wifi_component.h +27 -23
- esphome/components/wifi/wifi_component_esp32_arduino.cpp +52 -59
- esphome/components/wifi/wifi_component_esp8266.cpp +46 -46
- esphome/components/wifi/wifi_component_esp_idf.cpp +35 -36
- esphome/components/wifi/wifi_component_libretiny.cpp +26 -27
- esphome/components/wifi/wifi_component_pico_w.cpp +3 -3
- esphome/components/wifi_info/wifi_info_text_sensor.cpp +6 -6
- esphome/components/wireguard/__init__.py +2 -11
- esphome/components/xiaomi_ble/xiaomi_ble.cpp +13 -1
- esphome/components/xiaomi_ble/xiaomi_ble.h +1 -0
- esphome/components/xiaomi_cgd1/xiaomi_cgd1.h +0 -1
- esphome/components/xiaomi_cgdk2/xiaomi_cgdk2.h +0 -1
- esphome/components/xiaomi_cgg1/xiaomi_cgg1.h +0 -1
- esphome/components/xiaomi_cgpr1/xiaomi_cgpr1.h +0 -1
- esphome/components/xiaomi_gcls002/xiaomi_gcls002.h +0 -1
- esphome/components/xiaomi_hhccjcy01/xiaomi_hhccjcy01.h +0 -1
- esphome/components/xiaomi_hhccjcy10/xiaomi_hhccjcy10.h +0 -1
- esphome/components/xiaomi_hhccpot002/xiaomi_hhccpot002.h +0 -1
- esphome/components/xiaomi_jqjcy01ym/xiaomi_jqjcy01ym.h +0 -1
- esphome/components/xiaomi_lywsd02/xiaomi_lywsd02.h +0 -1
- esphome/components/xiaomi_lywsd02mmc/xiaomi_lywsd02mmc.h +0 -1
- esphome/components/xiaomi_lywsd03mmc/xiaomi_lywsd03mmc.h +0 -1
- esphome/components/xiaomi_lywsdcgq/xiaomi_lywsdcgq.h +0 -1
- esphome/components/xiaomi_mhoc303/xiaomi_mhoc303.h +0 -1
- esphome/components/xiaomi_mhoc401/xiaomi_mhoc401.h +0 -1
- esphome/components/xiaomi_miscale/xiaomi_miscale.h +0 -1
- esphome/components/xiaomi_mjyd02yla/xiaomi_mjyd02yla.h +0 -1
- esphome/components/xiaomi_mue4094rt/xiaomi_mue4094rt.h +0 -1
- esphome/components/xiaomi_rtcgq02lm/xiaomi_rtcgq02lm.h +0 -1
- esphome/components/xiaomi_wx08zm/xiaomi_wx08zm.h +0 -1
- esphome/components/xiaomi_xmwsdj04mmc/__init__.py +0 -0
- esphome/components/xiaomi_xmwsdj04mmc/sensor.py +77 -0
- esphome/components/xiaomi_xmwsdj04mmc/xiaomi_xmwsdj04mmc.cpp +77 -0
- esphome/components/xiaomi_xmwsdj04mmc/xiaomi_xmwsdj04mmc.h +36 -0
- esphome/components/zio_ultrasonic/zio_ultrasonic.h +0 -2
- esphome/components/zyaura/zyaura.h +0 -1
- esphome/config.py +88 -22
- esphome/config_helpers.py +74 -1
- esphome/config_validation.py +12 -1
- esphome/const.py +65 -10
- esphome/core/__init__.py +18 -2
- esphome/core/application.cpp +163 -10
- esphome/core/application.h +145 -165
- esphome/core/area.h +19 -0
- esphome/core/automation.h +58 -9
- esphome/core/color.cpp +3 -5
- esphome/core/color.h +16 -16
- esphome/core/component.cpp +151 -18
- esphome/core/component.h +98 -4
- esphome/core/component_iterator.cpp +11 -9
- esphome/core/component_iterator.h +12 -10
- esphome/core/config.py +155 -6
- esphome/core/controller.cpp +4 -2
- esphome/core/controller.h +1 -1
- esphome/core/datatypes.h +2 -2
- esphome/core/defines.h +17 -2
- esphome/core/device.h +20 -0
- esphome/core/entity_base.cpp +20 -15
- esphome/core/entity_base.h +76 -0
- esphome/core/entity_helpers.py +168 -1
- esphome/core/event_pool.h +81 -0
- esphome/core/helpers.cpp +75 -230
- esphome/core/helpers.h +164 -104
- esphome/core/lock_free_queue.h +151 -0
- esphome/core/log.cpp +2 -2
- esphome/core/log.h +2 -0
- esphome/core/optional.h +5 -0
- esphome/core/ring_buffer.cpp +2 -2
- esphome/core/scheduler.cpp +275 -103
- esphome/core/scheduler.h +154 -17
- esphome/core/time.cpp +5 -5
- esphome/core/time.h +5 -5
- esphome/cpp_generator.py +17 -0
- esphome/cpp_helpers.py +0 -22
- esphome/cpp_types.py +3 -1
- esphome/dashboard/entries.py +1 -1
- esphome/dashboard/util/text.py +5 -21
- esphome/dashboard/web_server.py +9 -1
- esphome/helpers.py +47 -0
- esphome/loader.py +15 -1
- esphome/pins.py +14 -8
- esphome/wizard.py +17 -4
- esphome/writer.py +21 -3
- esphome/yaml_util.py +0 -2
- {esphome-2025.6.3.dist-info → esphome-2025.7.0b2.dist-info}/METADATA +10 -9
- {esphome-2025.6.3.dist-info → esphome-2025.7.0b2.dist-info}/RECORD +597 -538
- esphome/components/api/api_pb2_size.h +0 -361
- esphome/components/esp32_ble/ble_event_pool.h +0 -72
- esphome/components/esp32_ble/queue.h +0 -85
- esphome/components/esp32_hall/esp32_hall.cpp +0 -25
- esphome/components/esp32_hall/esp32_hall.h +0 -23
- esphome/components/esp32_touch/esp32_touch.cpp +0 -355
- esphome/components/ld2410/button/reset_button.cpp +0 -9
- esphome/components/ld2450/button/reset_button.cpp +0 -9
- esphome/components/openthread/tlv.py +0 -65
- /esphome/{dashboard/enum.py → enum.py} +0 -0
- {esphome-2025.6.3.dist-info → esphome-2025.7.0b2.dist-info}/WHEEL +0 -0
- {esphome-2025.6.3.dist-info → esphome-2025.7.0b2.dist-info}/entry_points.txt +0 -0
- {esphome-2025.6.3.dist-info → esphome-2025.7.0b2.dist-info}/licenses/LICENSE +0 -0
- {esphome-2025.6.3.dist-info → esphome-2025.7.0b2.dist-info}/top_level.txt +0 -0
|
@@ -268,7 +268,19 @@ def validate_tz(value: str) -> str:
|
|
|
268
268
|
|
|
269
269
|
TIME_SCHEMA = cv.Schema(
|
|
270
270
|
{
|
|
271
|
-
cv.
|
|
271
|
+
cv.SplitDefault(
|
|
272
|
+
CONF_TIMEZONE,
|
|
273
|
+
esp8266=detect_tz,
|
|
274
|
+
esp32=detect_tz,
|
|
275
|
+
rp2040=detect_tz,
|
|
276
|
+
bk72xx=detect_tz,
|
|
277
|
+
rtl87xx=detect_tz,
|
|
278
|
+
ln882x=detect_tz,
|
|
279
|
+
host=detect_tz,
|
|
280
|
+
): cv.All(
|
|
281
|
+
cv.only_with_framework(["arduino", "esp-idf", "host"]),
|
|
282
|
+
validate_tz,
|
|
283
|
+
),
|
|
272
284
|
cv.Optional(CONF_ON_TIME): automation.validate_automation(
|
|
273
285
|
{
|
|
274
286
|
cv.GenerateID(CONF_TRIGGER_ID): cv.declare_id(CronTrigger),
|
|
@@ -293,7 +305,9 @@ TIME_SCHEMA = cv.Schema(
|
|
|
293
305
|
|
|
294
306
|
|
|
295
307
|
async def setup_time_core_(time_var, config):
|
|
296
|
-
|
|
308
|
+
if timezone := config.get(CONF_TIMEZONE):
|
|
309
|
+
cg.add(time_var.set_timezone(timezone))
|
|
310
|
+
cg.add_define("USE_TIME_TIMEZONE")
|
|
297
311
|
|
|
298
312
|
for conf in config.get(CONF_ON_TIME, []):
|
|
299
313
|
trigger = cg.new_Pvariable(conf[CONF_TRIGGER_ID], time_var)
|
|
@@ -35,8 +35,10 @@ void RealTimeClock::synchronize_epoch_(uint32_t epoch) {
|
|
|
35
35
|
ret = settimeofday(&timev, nullptr);
|
|
36
36
|
}
|
|
37
37
|
|
|
38
|
+
#ifdef USE_TIME_TIMEZONE
|
|
38
39
|
// Move timezone back to local timezone.
|
|
39
40
|
this->apply_timezone_();
|
|
41
|
+
#endif
|
|
40
42
|
|
|
41
43
|
if (ret != 0) {
|
|
42
44
|
ESP_LOGW(TAG, "setimeofday() failed with code %d", ret);
|
|
@@ -49,10 +51,12 @@ void RealTimeClock::synchronize_epoch_(uint32_t epoch) {
|
|
|
49
51
|
this->time_sync_callback_.call();
|
|
50
52
|
}
|
|
51
53
|
|
|
54
|
+
#ifdef USE_TIME_TIMEZONE
|
|
52
55
|
void RealTimeClock::apply_timezone_() {
|
|
53
56
|
setenv("TZ", this->timezone_.c_str(), 1);
|
|
54
57
|
tzset();
|
|
55
58
|
}
|
|
59
|
+
#endif
|
|
56
60
|
|
|
57
61
|
} // namespace time
|
|
58
62
|
} // namespace esphome
|
|
@@ -20,6 +20,7 @@ class RealTimeClock : public PollingComponent {
|
|
|
20
20
|
public:
|
|
21
21
|
explicit RealTimeClock();
|
|
22
22
|
|
|
23
|
+
#ifdef USE_TIME_TIMEZONE
|
|
23
24
|
/// Set the time zone.
|
|
24
25
|
void set_timezone(const std::string &tz) {
|
|
25
26
|
this->timezone_ = tz;
|
|
@@ -28,6 +29,7 @@ class RealTimeClock : public PollingComponent {
|
|
|
28
29
|
|
|
29
30
|
/// Get the time zone currently in use.
|
|
30
31
|
std::string get_timezone() { return this->timezone_; }
|
|
32
|
+
#endif
|
|
31
33
|
|
|
32
34
|
/// Get the time in the currently defined timezone.
|
|
33
35
|
ESPTime now() { return ESPTime::from_epoch_local(this->timestamp_now()); }
|
|
@@ -38,7 +40,7 @@ class RealTimeClock : public PollingComponent {
|
|
|
38
40
|
/// Get the current time as the UTC epoch since January 1st 1970.
|
|
39
41
|
time_t timestamp_now() { return ::time(nullptr); }
|
|
40
42
|
|
|
41
|
-
void add_on_time_sync_callback(std::function<void()> callback) {
|
|
43
|
+
void add_on_time_sync_callback(std::function<void()> &&callback) {
|
|
42
44
|
this->time_sync_callback_.add(std::move(callback));
|
|
43
45
|
};
|
|
44
46
|
|
|
@@ -46,8 +48,10 @@ class RealTimeClock : public PollingComponent {
|
|
|
46
48
|
/// Report a unix epoch as current time.
|
|
47
49
|
void synchronize_epoch_(uint32_t epoch);
|
|
48
50
|
|
|
51
|
+
#ifdef USE_TIME_TIMEZONE
|
|
49
52
|
std::string timezone_{};
|
|
50
53
|
void apply_timezone_();
|
|
54
|
+
#endif
|
|
51
55
|
|
|
52
56
|
CallbackManager<void()> time_sync_callback_;
|
|
53
57
|
};
|
|
@@ -24,8 +24,10 @@ void TLC5971::dump_config() {
|
|
|
24
24
|
}
|
|
25
25
|
|
|
26
26
|
void TLC5971::loop() {
|
|
27
|
-
if (!this->update_)
|
|
27
|
+
if (!this->update_) {
|
|
28
|
+
this->disable_loop();
|
|
28
29
|
return;
|
|
30
|
+
}
|
|
29
31
|
|
|
30
32
|
uint32_t command;
|
|
31
33
|
|
|
@@ -93,6 +95,7 @@ void TLC5971::set_channel_value(uint16_t channel, uint16_t value) {
|
|
|
93
95
|
return;
|
|
94
96
|
if (this->pwm_amounts_[channel] != value) {
|
|
95
97
|
this->update_ = true;
|
|
98
|
+
this->enable_loop();
|
|
96
99
|
}
|
|
97
100
|
this->pwm_amounts_[channel] = value;
|
|
98
101
|
}
|
|
@@ -58,8 +58,6 @@ class TMP1075Sensor : public PollingComponent, public sensor::Sensor, public i2c
|
|
|
58
58
|
void setup() override;
|
|
59
59
|
void update() override;
|
|
60
60
|
|
|
61
|
-
float get_setup_priority() const override { return setup_priority::DATA; }
|
|
62
|
-
|
|
63
61
|
void dump_config() override;
|
|
64
62
|
|
|
65
63
|
// Call write_config() after calling any of these to send the new config to
|
|
@@ -12,7 +12,6 @@ class TOF10120Sensor : public sensor::Sensor, public PollingComponent, public i2
|
|
|
12
12
|
void setup() override;
|
|
13
13
|
|
|
14
14
|
void dump_config() override;
|
|
15
|
-
float get_setup_priority() const override { return setup_priority::DATA; }
|
|
16
15
|
void update() override;
|
|
17
16
|
};
|
|
18
17
|
} // namespace tof10120
|
|
@@ -16,7 +16,6 @@ class Tormatic : public cover::Cover, public uart::UARTDevice, public PollingCom
|
|
|
16
16
|
void loop() override;
|
|
17
17
|
void update() override;
|
|
18
18
|
void dump_config() override;
|
|
19
|
-
float get_setup_priority() const override { return setup_priority::DATA; };
|
|
20
19
|
|
|
21
20
|
void set_open_duration(uint32_t duration) { this->open_duration_ = duration; }
|
|
22
21
|
void set_close_duration(uint32_t duration) { this->close_duration_ = duration; }
|
|
@@ -23,7 +23,6 @@ class TotalDailyEnergy : public sensor::Sensor, public Component {
|
|
|
23
23
|
void set_method(TotalDailyEnergyMethod method) { method_ = method; }
|
|
24
24
|
void setup() override;
|
|
25
25
|
void dump_config() override;
|
|
26
|
-
float get_setup_priority() const override { return setup_priority::DATA; }
|
|
27
26
|
void loop() override;
|
|
28
27
|
|
|
29
28
|
void publish_state_and_save(float state);
|
|
@@ -232,7 +232,7 @@ void TSL2591Component::set_integration_time_and_gain(TSL2591IntegrationTime inte
|
|
|
232
232
|
this->integration_time_ = integration_time;
|
|
233
233
|
this->gain_ = gain;
|
|
234
234
|
if (!this->write_byte(TSL2591_COMMAND_BIT | TSL2591_REGISTER_CONTROL,
|
|
235
|
-
this->integration_time_ | this->gain_)) {
|
|
235
|
+
static_cast<uint8_t>(this->integration_time_) | static_cast<uint8_t>(this->gain_))) {
|
|
236
236
|
ESP_LOGE(TAG, "I2C write failed");
|
|
237
237
|
}
|
|
238
238
|
// The ADC values can be confused if gain or integration time are changed in the middle of a cycle.
|
|
@@ -25,7 +25,6 @@ class TTP229BSFComponent : public Component {
|
|
|
25
25
|
void register_channel(TTP229BSFChannel *channel) { this->channels_.push_back(channel); }
|
|
26
26
|
void setup() override;
|
|
27
27
|
void dump_config() override;
|
|
28
|
-
float get_setup_priority() const override { return setup_priority::DATA; }
|
|
29
28
|
void loop() override {
|
|
30
29
|
// check datavalid if sdo is high
|
|
31
30
|
if (!this->sdo_pin_->digital_read()) {
|
|
@@ -23,7 +23,6 @@ class TTP229LSFComponent : public Component, public i2c::I2CDevice {
|
|
|
23
23
|
void register_channel(TTP229Channel *channel) { this->channels_.push_back(channel); }
|
|
24
24
|
void setup() override;
|
|
25
25
|
void dump_config() override;
|
|
26
|
-
float get_setup_priority() const override { return setup_priority::DATA; }
|
|
27
26
|
void loop() override;
|
|
28
27
|
|
|
29
28
|
protected:
|
esphome/components/tx20/tx20.cpp
CHANGED
|
@@ -152,7 +152,7 @@ void IRAM_ATTR Tx20ComponentStore::gpio_intr(Tx20ComponentStore *arg) {
|
|
|
152
152
|
}
|
|
153
153
|
arg->buffer[arg->buffer_index] = 1;
|
|
154
154
|
arg->start_time = now;
|
|
155
|
-
arg->buffer_index++;
|
|
155
|
+
arg->buffer_index++; // NOLINT(clang-diagnostic-deprecated-volatile)
|
|
156
156
|
return;
|
|
157
157
|
}
|
|
158
158
|
const uint32_t delay = now - arg->start_time;
|
|
@@ -183,7 +183,7 @@ void IRAM_ATTR Tx20ComponentStore::gpio_intr(Tx20ComponentStore *arg) {
|
|
|
183
183
|
}
|
|
184
184
|
arg->spent_time += delay;
|
|
185
185
|
arg->start_time = now;
|
|
186
|
-
arg->buffer_index++;
|
|
186
|
+
arg->buffer_index++; // NOLINT(clang-diagnostic-deprecated-volatile)
|
|
187
187
|
}
|
|
188
188
|
void IRAM_ATTR Tx20ComponentStore::reset() {
|
|
189
189
|
tx20_available = false;
|
|
@@ -2,6 +2,7 @@ import re
|
|
|
2
2
|
|
|
3
3
|
from esphome import automation, pins
|
|
4
4
|
import esphome.codegen as cg
|
|
5
|
+
from esphome.config_helpers import filter_source_files_from_platform
|
|
5
6
|
import esphome.config_validation as cv
|
|
6
7
|
from esphome.const import (
|
|
7
8
|
CONF_AFTER,
|
|
@@ -27,6 +28,7 @@ from esphome.const import (
|
|
|
27
28
|
CONF_TX_PIN,
|
|
28
29
|
CONF_UART_ID,
|
|
29
30
|
PLATFORM_HOST,
|
|
31
|
+
PlatformFramework,
|
|
30
32
|
)
|
|
31
33
|
from esphome.core import CORE
|
|
32
34
|
import esphome.final_validate as fv
|
|
@@ -438,3 +440,19 @@ async def uart_write_to_code(config, action_id, template_arg, args):
|
|
|
438
440
|
else:
|
|
439
441
|
cg.add(var.set_data_static(data))
|
|
440
442
|
return var
|
|
443
|
+
|
|
444
|
+
|
|
445
|
+
FILTER_SOURCE_FILES = filter_source_files_from_platform(
|
|
446
|
+
{
|
|
447
|
+
"uart_component_esp32_arduino.cpp": {PlatformFramework.ESP32_ARDUINO},
|
|
448
|
+
"uart_component_esp_idf.cpp": {PlatformFramework.ESP32_IDF},
|
|
449
|
+
"uart_component_esp8266.cpp": {PlatformFramework.ESP8266_ARDUINO},
|
|
450
|
+
"uart_component_host.cpp": {PlatformFramework.HOST_NATIVE},
|
|
451
|
+
"uart_component_rp2040.cpp": {PlatformFramework.RP2040_ARDUINO},
|
|
452
|
+
"uart_component_libretiny.cpp": {
|
|
453
|
+
PlatformFramework.BK72XX_ARDUINO,
|
|
454
|
+
PlatformFramework.RTL87XX_ARDUINO,
|
|
455
|
+
PlatformFramework.LN882X_ARDUINO,
|
|
456
|
+
},
|
|
457
|
+
}
|
|
458
|
+
)
|
|
@@ -48,11 +48,7 @@ uart_config_t IDFUARTComponent::get_config_() {
|
|
|
48
48
|
uart_config.parity = parity;
|
|
49
49
|
uart_config.stop_bits = this->stop_bits_ == 1 ? UART_STOP_BITS_1 : UART_STOP_BITS_2;
|
|
50
50
|
uart_config.flow_ctrl = UART_HW_FLOWCTRL_DISABLE;
|
|
51
|
-
#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 0, 0)
|
|
52
51
|
uart_config.source_clk = UART_SCLK_DEFAULT;
|
|
53
|
-
#else
|
|
54
|
-
uart_config.source_clk = UART_SCLK_APB;
|
|
55
|
-
#endif
|
|
56
52
|
uart_config.rx_flow_ctrl_thresh = 122;
|
|
57
53
|
|
|
58
54
|
return uart_config;
|
|
@@ -15,8 +15,8 @@ from esphome.const import (
|
|
|
15
15
|
ENTITY_CATEGORY_CONFIG,
|
|
16
16
|
)
|
|
17
17
|
from esphome.core import CORE, coroutine_with_priority
|
|
18
|
+
from esphome.core.entity_helpers import entity_duplicate_validator, setup_entity
|
|
18
19
|
from esphome.cpp_generator import MockObjClass
|
|
19
|
-
from esphome.cpp_helpers import setup_entity
|
|
20
20
|
|
|
21
21
|
CODEOWNERS = ["@jesserockz"]
|
|
22
22
|
IS_PLATFORM_COMPONENT = True
|
|
@@ -58,6 +58,9 @@ _UPDATE_SCHEMA = (
|
|
|
58
58
|
)
|
|
59
59
|
|
|
60
60
|
|
|
61
|
+
_UPDATE_SCHEMA.add_extra(entity_duplicate_validator("update"))
|
|
62
|
+
|
|
63
|
+
|
|
61
64
|
def update_schema(
|
|
62
65
|
class_: MockObjClass = cv.UNDEFINED,
|
|
63
66
|
*,
|
|
@@ -87,7 +90,7 @@ UPDATE_SCHEMA.add_extra(cv.deprecated_schema_constant("update"))
|
|
|
87
90
|
|
|
88
91
|
|
|
89
92
|
async def setup_update_core_(var, config):
|
|
90
|
-
await setup_entity(var, config)
|
|
93
|
+
await setup_entity(var, config, "update")
|
|
91
94
|
|
|
92
95
|
if device_class_config := config.get(CONF_DEVICE_CLASS):
|
|
93
96
|
cg.add(var.set_device_class(device_class_config))
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
#pragma once
|
|
2
2
|
|
|
3
|
+
#include <memory>
|
|
3
4
|
#include "esphome/core/automation.h"
|
|
4
5
|
#include "esphome/core/component.h"
|
|
5
6
|
#include "esphome/core/entity_base.h"
|
|
@@ -38,12 +39,19 @@ class UpdateEntity : public EntityBase, public EntityBase_DeviceClass {
|
|
|
38
39
|
const UpdateState &state = state_;
|
|
39
40
|
|
|
40
41
|
void add_on_state_callback(std::function<void()> &&callback) { this->state_callback_.add(std::move(callback)); }
|
|
42
|
+
Trigger<const UpdateInfo &> *get_update_available_trigger() {
|
|
43
|
+
if (!update_available_trigger_) {
|
|
44
|
+
update_available_trigger_ = std::make_unique<Trigger<const UpdateInfo &>>();
|
|
45
|
+
}
|
|
46
|
+
return update_available_trigger_.get();
|
|
47
|
+
}
|
|
41
48
|
|
|
42
49
|
protected:
|
|
43
50
|
UpdateState state_{UPDATE_STATE_UNKNOWN};
|
|
44
51
|
UpdateInfo update_info_;
|
|
45
52
|
|
|
46
53
|
CallbackManager<void()> state_callback_{};
|
|
54
|
+
std::unique_ptr<Trigger<const UpdateInfo &>> update_available_trigger_{nullptr};
|
|
47
55
|
};
|
|
48
56
|
|
|
49
57
|
} // namespace update
|
|
@@ -6,7 +6,7 @@ from esphome.components.esp32 import (
|
|
|
6
6
|
only_on_variant,
|
|
7
7
|
)
|
|
8
8
|
import esphome.config_validation as cv
|
|
9
|
-
from esphome.const import CONF_ID
|
|
9
|
+
from esphome.const import CONF_DEVICES, CONF_ID
|
|
10
10
|
from esphome.cpp_types import Component
|
|
11
11
|
|
|
12
12
|
AUTO_LOAD = ["bytebuffer"]
|
|
@@ -16,9 +16,9 @@ usb_host_ns = cg.esphome_ns.namespace("usb_host")
|
|
|
16
16
|
USBHost = usb_host_ns.class_("USBHost", Component)
|
|
17
17
|
USBClient = usb_host_ns.class_("USBClient", Component)
|
|
18
18
|
|
|
19
|
-
CONF_DEVICES = "devices"
|
|
20
19
|
CONF_VID = "vid"
|
|
21
20
|
CONF_PID = "pid"
|
|
21
|
+
CONF_ENABLE_HUBS = "enable_hubs"
|
|
22
22
|
|
|
23
23
|
|
|
24
24
|
def usb_device_schema(cls=USBClient, vid: int = None, pid: [int] = None) -> cv.Schema:
|
|
@@ -42,6 +42,7 @@ CONFIG_SCHEMA = cv.All(
|
|
|
42
42
|
cv.COMPONENT_SCHEMA.extend(
|
|
43
43
|
{
|
|
44
44
|
cv.GenerateID(): cv.declare_id(USBHost),
|
|
45
|
+
cv.Optional(CONF_ENABLE_HUBS, default=False): cv.boolean,
|
|
45
46
|
cv.Optional(CONF_DEVICES): cv.ensure_list(usb_device_schema()),
|
|
46
47
|
}
|
|
47
48
|
),
|
|
@@ -58,6 +59,8 @@ async def register_usb_client(config):
|
|
|
58
59
|
|
|
59
60
|
async def to_code(config):
|
|
60
61
|
add_idf_sdkconfig_option("CONFIG_USB_HOST_CONTROL_TRANSFER_MAX_SIZE", 1024)
|
|
62
|
+
if config.get(CONF_ENABLE_HUBS):
|
|
63
|
+
add_idf_sdkconfig_option("CONFIG_USB_HOST_HUBS_SUPPORTED", True)
|
|
61
64
|
var = cg.new_Pvariable(config[CONF_ID])
|
|
62
65
|
await cg.register_component(var, config)
|
|
63
66
|
for device in config.get(CONF_DEVICES) or ():
|
|
@@ -70,7 +70,7 @@ static void usbh_print_cfg_desc(const usb_config_desc_t *cfg_desc) {
|
|
|
70
70
|
ESP_LOGV(TAG, "bMaxPower %dmA", cfg_desc->bMaxPower * 2);
|
|
71
71
|
}
|
|
72
72
|
|
|
73
|
-
void usb_client_print_device_descriptor(const usb_device_desc_t *devc_desc) {
|
|
73
|
+
static void usb_client_print_device_descriptor(const usb_device_desc_t *devc_desc) {
|
|
74
74
|
if (devc_desc == NULL) {
|
|
75
75
|
return;
|
|
76
76
|
}
|
|
@@ -92,8 +92,8 @@ void usb_client_print_device_descriptor(const usb_device_desc_t *devc_desc) {
|
|
|
92
92
|
ESP_LOGV(TAG, "bNumConfigurations %d", devc_desc->bNumConfigurations);
|
|
93
93
|
}
|
|
94
94
|
|
|
95
|
-
void usb_client_print_config_descriptor(const usb_config_desc_t *cfg_desc,
|
|
96
|
-
|
|
95
|
+
static void usb_client_print_config_descriptor(const usb_config_desc_t *cfg_desc,
|
|
96
|
+
print_class_descriptor_cb class_specific_cb) {
|
|
97
97
|
if (cfg_desc == nullptr) {
|
|
98
98
|
return;
|
|
99
99
|
}
|
|
@@ -128,9 +128,9 @@ void usb_client_print_config_descriptor(const usb_config_desc_t *cfg_desc,
|
|
|
128
128
|
static std::string get_descriptor_string(const usb_str_desc_t *desc) {
|
|
129
129
|
char buffer[256];
|
|
130
130
|
if (desc == nullptr)
|
|
131
|
-
return "(
|
|
131
|
+
return "(unspecified)";
|
|
132
132
|
char *p = buffer;
|
|
133
|
-
for (
|
|
133
|
+
for (int i = 0; i != desc->bLength / 2; i++) {
|
|
134
134
|
auto c = desc->wData[i];
|
|
135
135
|
if (c < 0x100)
|
|
136
136
|
*p++ = static_cast<char>(c);
|
|
@@ -169,7 +169,7 @@ void USBClient::setup() {
|
|
|
169
169
|
this->mark_failed();
|
|
170
170
|
return;
|
|
171
171
|
}
|
|
172
|
-
for (auto trq : this->trq_pool_) {
|
|
172
|
+
for (auto *trq : this->trq_pool_) {
|
|
173
173
|
usb_host_transfer_alloc(64, 0, &trq->transfer);
|
|
174
174
|
trq->client = this;
|
|
175
175
|
}
|
|
@@ -197,7 +197,8 @@ void USBClient::loop() {
|
|
|
197
197
|
ESP_LOGD(TAG, "Device descriptor: vid %X pid %X", desc->idVendor, desc->idProduct);
|
|
198
198
|
if (desc->idVendor == this->vid_ && desc->idProduct == this->pid_ || this->vid_ == 0 && this->pid_ == 0) {
|
|
199
199
|
usb_device_info_t dev_info;
|
|
200
|
-
|
|
200
|
+
err = usb_host_device_info(this->device_handle_, &dev_info);
|
|
201
|
+
if (err != ESP_OK) {
|
|
201
202
|
ESP_LOGW(TAG, "Device info failed: %s", esp_err_to_name(err));
|
|
202
203
|
this->disconnect();
|
|
203
204
|
break;
|
|
@@ -336,7 +337,7 @@ static void transfer_callback(usb_transfer_t *xfer) {
|
|
|
336
337
|
* @throws None.
|
|
337
338
|
*/
|
|
338
339
|
void USBClient::transfer_in(uint8_t ep_address, const transfer_cb_t &callback, uint16_t length) {
|
|
339
|
-
auto trq = this->get_trq_();
|
|
340
|
+
auto *trq = this->get_trq_();
|
|
340
341
|
if (trq == nullptr) {
|
|
341
342
|
ESP_LOGE(TAG, "Too many requests queued");
|
|
342
343
|
return;
|
|
@@ -349,7 +350,6 @@ void USBClient::transfer_in(uint8_t ep_address, const transfer_cb_t &callback, u
|
|
|
349
350
|
if (err != ESP_OK) {
|
|
350
351
|
ESP_LOGE(TAG, "Failed to submit transfer, address=%x, length=%d, err=%x", ep_address, length, err);
|
|
351
352
|
this->release_trq(trq);
|
|
352
|
-
this->disconnect();
|
|
353
353
|
}
|
|
354
354
|
}
|
|
355
355
|
|
|
@@ -364,7 +364,7 @@ void USBClient::transfer_in(uint8_t ep_address, const transfer_cb_t &callback, u
|
|
|
364
364
|
* @throws None.
|
|
365
365
|
*/
|
|
366
366
|
void USBClient::transfer_out(uint8_t ep_address, const transfer_cb_t &callback, const uint8_t *data, uint16_t length) {
|
|
367
|
-
auto trq = this->get_trq_();
|
|
367
|
+
auto *trq = this->get_trq_();
|
|
368
368
|
if (trq == nullptr) {
|
|
369
369
|
ESP_LOGE(TAG, "Too many requests queued");
|
|
370
370
|
return;
|
|
@@ -43,7 +43,7 @@ static constexpr uint8_t SET_BAUDRATE = 0x1E; // Set the baud rate.
|
|
|
43
43
|
static constexpr uint8_t SET_CHARS = 0x19; // Set special characters.
|
|
44
44
|
static constexpr uint8_t VENDOR_SPECIFIC = 0xFF; // Vendor specific command.
|
|
45
45
|
|
|
46
|
-
std::vector<CdcEps> USBUartTypeCP210X::
|
|
46
|
+
std::vector<CdcEps> USBUartTypeCP210X::parse_descriptors(usb_device_handle_t dev_hdl) {
|
|
47
47
|
const usb_config_desc_t *config_desc;
|
|
48
48
|
const usb_device_desc_t *device_desc;
|
|
49
49
|
int conf_offset = 0, ep_offset;
|
|
@@ -18,52 +18,48 @@ namespace usb_uart {
|
|
|
18
18
|
*/
|
|
19
19
|
static optional<CdcEps> get_cdc(const usb_config_desc_t *config_desc, uint8_t intf_idx) {
|
|
20
20
|
int conf_offset, ep_offset;
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
21
|
+
// look for an interface with an interrupt endpoint (notify), and one with two bulk endpoints (data in/out)
|
|
22
|
+
CdcEps eps{};
|
|
23
|
+
eps.bulk_interface_number = 0xFF;
|
|
24
24
|
for (;;) {
|
|
25
|
-
auto intf_desc = usb_parse_interface_descriptor(config_desc, intf_idx++, 0, &conf_offset);
|
|
25
|
+
const auto *intf_desc = usb_parse_interface_descriptor(config_desc, intf_idx++, 0, &conf_offset);
|
|
26
26
|
if (!intf_desc) {
|
|
27
27
|
ESP_LOGE(TAG, "usb_parse_interface_descriptor failed");
|
|
28
28
|
return nullopt;
|
|
29
29
|
}
|
|
30
|
-
|
|
30
|
+
ESP_LOGD(TAG, "intf_desc: bInterfaceClass=%02X, bInterfaceSubClass=%02X, bInterfaceProtocol=%02X, bNumEndpoints=%d",
|
|
31
|
+
intf_desc->bInterfaceClass, intf_desc->bInterfaceSubClass, intf_desc->bInterfaceProtocol,
|
|
32
|
+
intf_desc->bNumEndpoints);
|
|
33
|
+
for (uint8_t i = 0; i != intf_desc->bNumEndpoints; i++) {
|
|
31
34
|
ep_offset = conf_offset;
|
|
32
|
-
|
|
33
|
-
if (!
|
|
34
|
-
ESP_LOGE(TAG, "
|
|
35
|
+
const auto *ep = usb_parse_endpoint_descriptor_by_index(intf_desc, i, config_desc->wTotalLength, &ep_offset);
|
|
36
|
+
if (!ep) {
|
|
37
|
+
ESP_LOGE(TAG, "Ran out of interfaces at %d before finding all endpoints", i);
|
|
35
38
|
return nullopt;
|
|
36
39
|
}
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
ESP_LOGE(TAG, "in_ep: usb_parse_endpoint_descriptor_by_index failed");
|
|
53
|
-
return nullopt;
|
|
40
|
+
ESP_LOGD(TAG, "ep: bEndpointAddress=%02X, bmAttributes=%02X", ep->bEndpointAddress, ep->bmAttributes);
|
|
41
|
+
if (ep->bmAttributes == USB_BM_ATTRIBUTES_XFER_INT) {
|
|
42
|
+
eps.notify_ep = ep;
|
|
43
|
+
eps.interrupt_interface_number = intf_desc->bInterfaceNumber;
|
|
44
|
+
} else if (ep->bmAttributes == USB_BM_ATTRIBUTES_XFER_BULK && ep->bEndpointAddress & usb_host::USB_DIR_IN &&
|
|
45
|
+
(eps.bulk_interface_number == 0xFF || eps.bulk_interface_number == intf_desc->bInterfaceNumber)) {
|
|
46
|
+
eps.in_ep = ep;
|
|
47
|
+
eps.bulk_interface_number = intf_desc->bInterfaceNumber;
|
|
48
|
+
} else if (ep->bmAttributes == USB_BM_ATTRIBUTES_XFER_BULK && !(ep->bEndpointAddress & usb_host::USB_DIR_IN) &&
|
|
49
|
+
(eps.bulk_interface_number == 0xFF || eps.bulk_interface_number == intf_desc->bInterfaceNumber)) {
|
|
50
|
+
eps.out_ep = ep;
|
|
51
|
+
eps.bulk_interface_number = intf_desc->bInterfaceNumber;
|
|
52
|
+
} else {
|
|
53
|
+
ESP_LOGE(TAG, "Unexpected endpoint attributes: %02X", ep->bmAttributes);
|
|
54
|
+
continue;
|
|
54
55
|
}
|
|
55
|
-
if (in_ep->bmAttributes != USB_BM_ATTRIBUTES_XFER_BULK)
|
|
56
|
-
in_ep = nullptr;
|
|
57
56
|
}
|
|
58
|
-
if (in_ep != nullptr && out_ep != nullptr && notify_ep != nullptr)
|
|
59
|
-
|
|
57
|
+
if (eps.in_ep != nullptr && eps.out_ep != nullptr && eps.notify_ep != nullptr)
|
|
58
|
+
return eps;
|
|
60
59
|
}
|
|
61
|
-
if (in_ep->bEndpointAddress & usb_host::USB_DIR_IN)
|
|
62
|
-
return CdcEps{notify_ep, in_ep, out_ep, interface_number};
|
|
63
|
-
return CdcEps{notify_ep, out_ep, in_ep, interface_number};
|
|
64
60
|
}
|
|
65
61
|
|
|
66
|
-
std::vector<CdcEps> USBUartTypeCdcAcm::
|
|
62
|
+
std::vector<CdcEps> USBUartTypeCdcAcm::parse_descriptors(usb_device_handle_t dev_hdl) {
|
|
67
63
|
const usb_config_desc_t *config_desc;
|
|
68
64
|
const usb_device_desc_t *device_desc;
|
|
69
65
|
int desc_offset = 0;
|
|
@@ -78,7 +74,7 @@ std::vector<CdcEps> USBUartTypeCdcAcm::parse_descriptors_(usb_device_handle_t de
|
|
|
78
74
|
ESP_LOGE(TAG, "get_active_config_descriptor failed");
|
|
79
75
|
return {};
|
|
80
76
|
}
|
|
81
|
-
if (device_desc->bDeviceClass == USB_CLASS_COMM) {
|
|
77
|
+
if (device_desc->bDeviceClass == USB_CLASS_COMM || device_desc->bDeviceClass == USB_CLASS_VENDOR_SPEC) {
|
|
82
78
|
// single CDC-ACM device
|
|
83
79
|
if (auto eps = get_cdc(config_desc, 0)) {
|
|
84
80
|
ESP_LOGV(TAG, "Found CDC-ACM device");
|
|
@@ -194,7 +190,7 @@ void USBUartComponent::start_input(USBUartChannel *channel) {
|
|
|
194
190
|
if (!channel->initialised_ || channel->input_started_ ||
|
|
195
191
|
channel->input_buffer_.get_free_space() < channel->cdc_dev_.in_ep->wMaxPacketSize)
|
|
196
192
|
return;
|
|
197
|
-
auto ep = channel->cdc_dev_.in_ep;
|
|
193
|
+
const auto *ep = channel->cdc_dev_.in_ep;
|
|
198
194
|
auto callback = [this, channel](const usb_host::TransferStatus &status) {
|
|
199
195
|
ESP_LOGV(TAG, "Transfer result: length: %u; status %X", status.data_len, status.error_code);
|
|
200
196
|
if (!status.success) {
|
|
@@ -227,7 +223,7 @@ void USBUartComponent::start_output(USBUartChannel *channel) {
|
|
|
227
223
|
if (channel->output_buffer_.is_empty()) {
|
|
228
224
|
return;
|
|
229
225
|
}
|
|
230
|
-
auto ep = channel->cdc_dev_.out_ep;
|
|
226
|
+
const auto *ep = channel->cdc_dev_.out_ep;
|
|
231
227
|
auto callback = [this, channel](const usb_host::TransferStatus &status) {
|
|
232
228
|
ESP_LOGV(TAG, "Output Transfer result: length: %u; status %X", status.data_len, status.error_code);
|
|
233
229
|
channel->output_started_ = false;
|
|
@@ -259,15 +255,15 @@ static void fix_mps(const usb_ep_desc_t *ep) {
|
|
|
259
255
|
}
|
|
260
256
|
}
|
|
261
257
|
void USBUartTypeCdcAcm::on_connected() {
|
|
262
|
-
auto cdc_devs = this->
|
|
258
|
+
auto cdc_devs = this->parse_descriptors(this->device_handle_);
|
|
263
259
|
if (cdc_devs.empty()) {
|
|
264
260
|
this->status_set_error("No CDC-ACM device found");
|
|
265
261
|
this->disconnect();
|
|
266
262
|
return;
|
|
267
263
|
}
|
|
268
264
|
ESP_LOGD(TAG, "Found %zu CDC-ACM devices", cdc_devs.size());
|
|
269
|
-
|
|
270
|
-
for (auto channel : this->channels_) {
|
|
265
|
+
size_t i = 0;
|
|
266
|
+
for (auto *channel : this->channels_) {
|
|
271
267
|
if (i == cdc_devs.size()) {
|
|
272
268
|
ESP_LOGE(TAG, "No configuration found for channel %d", channel->index_);
|
|
273
269
|
this->status_set_warning("No configuration found for channel");
|
|
@@ -277,10 +273,11 @@ void USBUartTypeCdcAcm::on_connected() {
|
|
|
277
273
|
fix_mps(channel->cdc_dev_.in_ep);
|
|
278
274
|
fix_mps(channel->cdc_dev_.out_ep);
|
|
279
275
|
channel->initialised_ = true;
|
|
280
|
-
auto err =
|
|
276
|
+
auto err =
|
|
277
|
+
usb_host_interface_claim(this->handle_, this->device_handle_, channel->cdc_dev_.bulk_interface_number, 0);
|
|
281
278
|
if (err != ESP_OK) {
|
|
282
279
|
ESP_LOGE(TAG, "usb_host_interface_claim failed: %s, channel=%d, intf=%d", esp_err_to_name(err), channel->index_,
|
|
283
|
-
channel->cdc_dev_.
|
|
280
|
+
channel->cdc_dev_.bulk_interface_number);
|
|
284
281
|
this->status_set_error("usb_host_interface_claim failed");
|
|
285
282
|
this->disconnect();
|
|
286
283
|
return;
|
|
@@ -290,7 +287,7 @@ void USBUartTypeCdcAcm::on_connected() {
|
|
|
290
287
|
}
|
|
291
288
|
|
|
292
289
|
void USBUartTypeCdcAcm::on_disconnected() {
|
|
293
|
-
for (auto channel : this->channels_) {
|
|
290
|
+
for (auto *channel : this->channels_) {
|
|
294
291
|
if (channel->cdc_dev_.in_ep != nullptr) {
|
|
295
292
|
usb_host_endpoint_halt(this->device_handle_, channel->cdc_dev_.in_ep->bEndpointAddress);
|
|
296
293
|
usb_host_endpoint_flush(this->device_handle_, channel->cdc_dev_.in_ep->bEndpointAddress);
|
|
@@ -303,7 +300,7 @@ void USBUartTypeCdcAcm::on_disconnected() {
|
|
|
303
300
|
usb_host_endpoint_halt(this->device_handle_, channel->cdc_dev_.notify_ep->bEndpointAddress);
|
|
304
301
|
usb_host_endpoint_flush(this->device_handle_, channel->cdc_dev_.notify_ep->bEndpointAddress);
|
|
305
302
|
}
|
|
306
|
-
usb_host_interface_release(this->handle_, this->device_handle_, channel->cdc_dev_.
|
|
303
|
+
usb_host_interface_release(this->handle_, this->device_handle_, channel->cdc_dev_.bulk_interface_number);
|
|
307
304
|
channel->initialised_ = false;
|
|
308
305
|
channel->input_started_ = false;
|
|
309
306
|
channel->output_started_ = false;
|
|
@@ -314,7 +311,7 @@ void USBUartTypeCdcAcm::on_disconnected() {
|
|
|
314
311
|
}
|
|
315
312
|
|
|
316
313
|
void USBUartTypeCdcAcm::enable_channels() {
|
|
317
|
-
for (auto channel : this->channels_) {
|
|
314
|
+
for (auto *channel : this->channels_) {
|
|
318
315
|
if (!channel->initialised_)
|
|
319
316
|
continue;
|
|
320
317
|
channel->input_started_ = false;
|
|
@@ -25,7 +25,8 @@ struct CdcEps {
|
|
|
25
25
|
const usb_ep_desc_t *notify_ep;
|
|
26
26
|
const usb_ep_desc_t *in_ep;
|
|
27
27
|
const usb_ep_desc_t *out_ep;
|
|
28
|
-
uint8_t
|
|
28
|
+
uint8_t bulk_interface_number;
|
|
29
|
+
uint8_t interrupt_interface_number;
|
|
29
30
|
};
|
|
30
31
|
|
|
31
32
|
enum UARTParityOptions {
|
|
@@ -123,7 +124,7 @@ class USBUartTypeCdcAcm : public USBUartComponent {
|
|
|
123
124
|
USBUartTypeCdcAcm(uint16_t vid, uint16_t pid) : USBUartComponent(vid, pid) {}
|
|
124
125
|
|
|
125
126
|
protected:
|
|
126
|
-
virtual std::vector<CdcEps>
|
|
127
|
+
virtual std::vector<CdcEps> parse_descriptors(usb_device_handle_t dev_hdl);
|
|
127
128
|
void on_connected() override;
|
|
128
129
|
virtual void enable_channels();
|
|
129
130
|
void on_disconnected() override;
|
|
@@ -134,7 +135,7 @@ class USBUartTypeCP210X : public USBUartTypeCdcAcm {
|
|
|
134
135
|
USBUartTypeCP210X(uint16_t vid, uint16_t pid) : USBUartTypeCdcAcm(vid, pid) {}
|
|
135
136
|
|
|
136
137
|
protected:
|
|
137
|
-
std::vector<CdcEps>
|
|
138
|
+
std::vector<CdcEps> parse_descriptors(usb_device_handle_t dev_hdl) override;
|
|
138
139
|
void enable_channels() override;
|
|
139
140
|
};
|
|
140
141
|
class USBUartTypeCH34X : public USBUartTypeCdcAcm {
|
|
@@ -22,8 +22,8 @@ from esphome.const import (
|
|
|
22
22
|
DEVICE_CLASS_WATER,
|
|
23
23
|
)
|
|
24
24
|
from esphome.core import CORE, coroutine_with_priority
|
|
25
|
+
from esphome.core.entity_helpers import entity_duplicate_validator, setup_entity
|
|
25
26
|
from esphome.cpp_generator import MockObjClass
|
|
26
|
-
from esphome.cpp_helpers import setup_entity
|
|
27
27
|
|
|
28
28
|
IS_PLATFORM_COMPONENT = True
|
|
29
29
|
|
|
@@ -103,6 +103,9 @@ _VALVE_SCHEMA = (
|
|
|
103
103
|
)
|
|
104
104
|
|
|
105
105
|
|
|
106
|
+
_VALVE_SCHEMA.add_extra(entity_duplicate_validator("valve"))
|
|
107
|
+
|
|
108
|
+
|
|
106
109
|
def valve_schema(
|
|
107
110
|
class_: MockObjClass = cv.UNDEFINED,
|
|
108
111
|
*,
|
|
@@ -132,7 +135,7 @@ VALVE_SCHEMA.add_extra(cv.deprecated_schema_constant("valve"))
|
|
|
132
135
|
|
|
133
136
|
|
|
134
137
|
async def _setup_valve_core(var, config):
|
|
135
|
-
await setup_entity(var, config)
|
|
138
|
+
await setup_entity(var, config, "valve")
|
|
136
139
|
|
|
137
140
|
if device_class_config := config.get(CONF_DEVICE_CLASS):
|
|
138
141
|
cg.add(var.set_device_class(device_class_config))
|
esphome/components/vbus/vbus.h
CHANGED
|
@@ -30,7 +30,6 @@ class VBus : public uart::UARTDevice, public Component {
|
|
|
30
30
|
public:
|
|
31
31
|
void dump_config() override;
|
|
32
32
|
void loop() override;
|
|
33
|
-
float get_setup_priority() const override { return setup_priority::DATA; }
|
|
34
33
|
|
|
35
34
|
void register_listener(VBusListener *listener) { this->listeners_.push_back(listener); }
|
|
36
35
|
|