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
|
@@ -65,7 +65,6 @@ class VEML3235Sensor : public sensor::Sensor, public PollingComponent, public i2
|
|
|
65
65
|
void setup() override;
|
|
66
66
|
void dump_config() override;
|
|
67
67
|
void update() override { this->publish_state(this->read_lx_()); }
|
|
68
|
-
float get_setup_priority() const override { return setup_priority::DATA; }
|
|
69
68
|
|
|
70
69
|
// Used by ESPHome framework. Does NOT actually set the value on the device.
|
|
71
70
|
void set_auto_gain(bool auto_gain) { this->auto_gain_ = auto_gain; }
|
|
@@ -102,7 +102,6 @@ class VEML7700Component : public PollingComponent, public i2c::I2CDevice {
|
|
|
102
102
|
//
|
|
103
103
|
// EspHome framework functions
|
|
104
104
|
//
|
|
105
|
-
float get_setup_priority() const override { return setup_priority::DATA; }
|
|
106
105
|
void setup() override;
|
|
107
106
|
void dump_config() override;
|
|
108
107
|
void update() override;
|
|
@@ -30,7 +30,6 @@ class VL53L0XSensor : public sensor::Sensor, public PollingComponent, public i2c
|
|
|
30
30
|
void setup() override;
|
|
31
31
|
|
|
32
32
|
void dump_config() override;
|
|
33
|
-
float get_setup_priority() const override { return setup_priority::DATA; }
|
|
34
33
|
void update() override;
|
|
35
34
|
|
|
36
35
|
void loop() override;
|
|
@@ -85,7 +85,7 @@ bool VoiceAssistant::start_udp_socket_() {
|
|
|
85
85
|
bool VoiceAssistant::allocate_buffers_() {
|
|
86
86
|
#ifdef USE_SPEAKER
|
|
87
87
|
if ((this->speaker_ != nullptr) && (this->speaker_buffer_ == nullptr)) {
|
|
88
|
-
|
|
88
|
+
RAMAllocator<uint8_t> speaker_allocator;
|
|
89
89
|
this->speaker_buffer_ = speaker_allocator.allocate(SPEAKER_BUFFER_SIZE);
|
|
90
90
|
if (this->speaker_buffer_ == nullptr) {
|
|
91
91
|
ESP_LOGW(TAG, "Could not allocate speaker buffer");
|
|
@@ -103,7 +103,7 @@ bool VoiceAssistant::allocate_buffers_() {
|
|
|
103
103
|
}
|
|
104
104
|
|
|
105
105
|
if (this->send_buffer_ == nullptr) {
|
|
106
|
-
|
|
106
|
+
RAMAllocator<uint8_t> send_allocator;
|
|
107
107
|
this->send_buffer_ = send_allocator.allocate(SEND_BUFFER_SIZE);
|
|
108
108
|
if (send_buffer_ == nullptr) {
|
|
109
109
|
ESP_LOGW(TAG, "Could not allocate send buffer");
|
|
@@ -136,7 +136,7 @@ void VoiceAssistant::clear_buffers_() {
|
|
|
136
136
|
|
|
137
137
|
void VoiceAssistant::deallocate_buffers_() {
|
|
138
138
|
if (this->send_buffer_ != nullptr) {
|
|
139
|
-
|
|
139
|
+
RAMAllocator<uint8_t> send_deallocator;
|
|
140
140
|
send_deallocator.deallocate(this->send_buffer_, SEND_BUFFER_SIZE);
|
|
141
141
|
this->send_buffer_ = nullptr;
|
|
142
142
|
}
|
|
@@ -147,7 +147,7 @@ void VoiceAssistant::deallocate_buffers_() {
|
|
|
147
147
|
|
|
148
148
|
#ifdef USE_SPEAKER
|
|
149
149
|
if ((this->speaker_ != nullptr) && (this->speaker_buffer_ != nullptr)) {
|
|
150
|
-
|
|
150
|
+
RAMAllocator<uint8_t> speaker_deallocator;
|
|
151
151
|
speaker_deallocator.deallocate(this->speaker_buffer_, SPEAKER_BUFFER_SIZE);
|
|
152
152
|
this->speaker_buffer_ = nullptr;
|
|
153
153
|
}
|
|
@@ -38,16 +38,12 @@ WatchdogManager::~WatchdogManager() {
|
|
|
38
38
|
void WatchdogManager::set_timeout_(uint32_t timeout_ms) {
|
|
39
39
|
ESP_LOGV(TAG, "Adjusting WDT to %" PRIu32 "ms", timeout_ms);
|
|
40
40
|
#ifdef USE_ESP32
|
|
41
|
-
#if ESP_IDF_VERSION_MAJOR >= 5
|
|
42
41
|
esp_task_wdt_config_t wdt_config = {
|
|
43
42
|
.timeout_ms = timeout_ms,
|
|
44
43
|
.idle_core_mask = (1 << SOC_CPU_CORES_NUM) - 1,
|
|
45
44
|
.trigger_panic = true,
|
|
46
45
|
};
|
|
47
46
|
esp_task_wdt_reconfigure(&wdt_config);
|
|
48
|
-
#else
|
|
49
|
-
esp_task_wdt_init(timeout_ms / 1000, true);
|
|
50
|
-
#endif // ESP_IDF_VERSION_MAJOR
|
|
51
47
|
#endif // USE_ESP32
|
|
52
48
|
|
|
53
49
|
#ifdef USE_RP2040
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
#include "waveshare_epaper.h"
|
|
2
|
+
#include <bitset>
|
|
3
|
+
#include <cinttypes>
|
|
2
4
|
#include "esphome/core/application.h"
|
|
3
5
|
#include "esphome/core/helpers.h"
|
|
4
6
|
#include "esphome/core/log.h"
|
|
5
|
-
#include <cinttypes>
|
|
6
|
-
#include <bitset>
|
|
7
7
|
|
|
8
8
|
namespace esphome {
|
|
9
9
|
namespace waveshare_epaper {
|
|
@@ -185,7 +185,7 @@ void WaveshareEPaper7C::setup() {
|
|
|
185
185
|
this->initialize();
|
|
186
186
|
}
|
|
187
187
|
void WaveshareEPaper7C::init_internal_7c_(uint32_t buffer_length) {
|
|
188
|
-
|
|
188
|
+
RAMAllocator<uint8_t> allocator;
|
|
189
189
|
uint32_t small_buffer_length = buffer_length / NUM_BUFFERS;
|
|
190
190
|
|
|
191
191
|
for (int i = 0; i < NUM_BUFFERS; i++) {
|
|
@@ -2054,7 +2054,7 @@ void GDEW029T5::initialize() {
|
|
|
2054
2054
|
this->deep_sleep_between_updates_ = true;
|
|
2055
2055
|
|
|
2056
2056
|
// old buffer for partial update
|
|
2057
|
-
|
|
2057
|
+
RAMAllocator<uint8_t> allocator;
|
|
2058
2058
|
this->old_buffer_ = allocator.allocate(this->get_buffer_length_());
|
|
2059
2059
|
if (this->old_buffer_ == nullptr) {
|
|
2060
2060
|
ESP_LOGE(TAG, "Could not allocate old buffer for display!");
|
|
@@ -2199,7 +2199,7 @@ void GDEW029T5::dump_config() {
|
|
|
2199
2199
|
|
|
2200
2200
|
void GDEW0154M09::initialize() {
|
|
2201
2201
|
this->init_internal_();
|
|
2202
|
-
|
|
2202
|
+
RAMAllocator<uint8_t> allocator;
|
|
2203
2203
|
this->lastbuff_ = allocator.allocate(this->get_buffer_length_());
|
|
2204
2204
|
if (this->lastbuff_ != nullptr) {
|
|
2205
2205
|
memset(this->lastbuff_, 0xff, sizeof(uint8_t) * this->get_buffer_length_());
|
|
@@ -3132,7 +3132,7 @@ void HOT GDEY0583T81::display() {
|
|
|
3132
3132
|
} else {
|
|
3133
3133
|
// Partial out (PTOUT), makes the display exit partial mode
|
|
3134
3134
|
this->command(0x92);
|
|
3135
|
-
ESP_LOGD(TAG, "Partial update done, next full update after %
|
|
3135
|
+
ESP_LOGD(TAG, "Partial update done, next full update after %" PRIu32 " cycles",
|
|
3136
3136
|
this->full_update_every_ - this->at_update_ - 1);
|
|
3137
3137
|
}
|
|
3138
3138
|
|
|
@@ -28,10 +28,12 @@ from esphome.const import (
|
|
|
28
28
|
PLATFORM_BK72XX,
|
|
29
29
|
PLATFORM_ESP32,
|
|
30
30
|
PLATFORM_ESP8266,
|
|
31
|
+
PLATFORM_LN882X,
|
|
31
32
|
PLATFORM_RTL87XX,
|
|
32
33
|
)
|
|
33
34
|
from esphome.core import CORE, coroutine_with_priority
|
|
34
35
|
import esphome.final_validate as fv
|
|
36
|
+
from esphome.types import ConfigType
|
|
35
37
|
|
|
36
38
|
AUTO_LOAD = ["json", "web_server_base"]
|
|
37
39
|
|
|
@@ -39,13 +41,14 @@ CONF_SORTING_GROUP_ID = "sorting_group_id"
|
|
|
39
41
|
CONF_SORTING_GROUPS = "sorting_groups"
|
|
40
42
|
CONF_SORTING_WEIGHT = "sorting_weight"
|
|
41
43
|
|
|
44
|
+
|
|
42
45
|
web_server_ns = cg.esphome_ns.namespace("web_server")
|
|
43
46
|
WebServer = web_server_ns.class_("WebServer", cg.Component, cg.Controller)
|
|
44
47
|
|
|
45
48
|
sorting_groups = {}
|
|
46
49
|
|
|
47
50
|
|
|
48
|
-
def default_url(config):
|
|
51
|
+
def default_url(config: ConfigType) -> ConfigType:
|
|
49
52
|
config = config.copy()
|
|
50
53
|
if config[CONF_VERSION] == 1:
|
|
51
54
|
if CONF_CSS_URL not in config:
|
|
@@ -65,19 +68,27 @@ def default_url(config):
|
|
|
65
68
|
return config
|
|
66
69
|
|
|
67
70
|
|
|
68
|
-
def validate_local(config):
|
|
71
|
+
def validate_local(config: ConfigType) -> ConfigType:
|
|
69
72
|
if CONF_LOCAL in config and config[CONF_VERSION] == 1:
|
|
70
73
|
raise cv.Invalid("'local' is not supported in version 1")
|
|
71
74
|
return config
|
|
72
75
|
|
|
73
76
|
|
|
74
|
-
def
|
|
75
|
-
if
|
|
76
|
-
|
|
77
|
+
def validate_ota_removed(config: ConfigType) -> ConfigType:
|
|
78
|
+
# Only raise error if OTA is explicitly enabled (True)
|
|
79
|
+
# If it's False or not specified, we can safely ignore it
|
|
80
|
+
if config.get(CONF_OTA):
|
|
81
|
+
raise cv.Invalid(
|
|
82
|
+
f"The '{CONF_OTA}' option has been removed from 'web_server'. "
|
|
83
|
+
f"Please use the new OTA platform structure instead:\n\n"
|
|
84
|
+
f"ota:\n"
|
|
85
|
+
f" - platform: web_server\n\n"
|
|
86
|
+
f"See https://esphome.io/components/ota for more information."
|
|
87
|
+
)
|
|
77
88
|
return config
|
|
78
89
|
|
|
79
90
|
|
|
80
|
-
def validate_sorting_groups(config):
|
|
91
|
+
def validate_sorting_groups(config: ConfigType) -> ConfigType:
|
|
81
92
|
if CONF_SORTING_GROUPS in config and config[CONF_VERSION] != 3:
|
|
82
93
|
raise cv.Invalid(
|
|
83
94
|
f"'{CONF_SORTING_GROUPS}' is only supported in 'web_server' version 3"
|
|
@@ -88,7 +99,7 @@ def validate_sorting_groups(config):
|
|
|
88
99
|
def _validate_no_sorting_component(
|
|
89
100
|
sorting_component: str,
|
|
90
101
|
webserver_version: int,
|
|
91
|
-
config:
|
|
102
|
+
config: ConfigType,
|
|
92
103
|
path: list[str] | None = None,
|
|
93
104
|
) -> None:
|
|
94
105
|
if path is None:
|
|
@@ -111,7 +122,7 @@ def _validate_no_sorting_component(
|
|
|
111
122
|
)
|
|
112
123
|
|
|
113
124
|
|
|
114
|
-
def _final_validate_sorting(config):
|
|
125
|
+
def _final_validate_sorting(config: ConfigType) -> ConfigType:
|
|
115
126
|
if (webserver_version := config.get(CONF_VERSION)) != 3:
|
|
116
127
|
_validate_no_sorting_component(
|
|
117
128
|
CONF_SORTING_WEIGHT, webserver_version, fv.full_config.get()
|
|
@@ -174,24 +185,25 @@ CONFIG_SCHEMA = cv.All(
|
|
|
174
185
|
web_server_base.WebServerBase
|
|
175
186
|
),
|
|
176
187
|
cv.Optional(CONF_INCLUDE_INTERNAL, default=False): cv.boolean,
|
|
177
|
-
cv.
|
|
178
|
-
CONF_OTA,
|
|
179
|
-
esp8266=True,
|
|
180
|
-
esp32_arduino=True,
|
|
181
|
-
esp32_idf=False,
|
|
182
|
-
bk72xx=True,
|
|
183
|
-
rtl87xx=True,
|
|
184
|
-
): cv.boolean,
|
|
188
|
+
cv.Optional(CONF_OTA, default=False): cv.boolean,
|
|
185
189
|
cv.Optional(CONF_LOG, default=True): cv.boolean,
|
|
186
190
|
cv.Optional(CONF_LOCAL): cv.boolean,
|
|
187
191
|
cv.Optional(CONF_SORTING_GROUPS): cv.ensure_list(sorting_group),
|
|
188
192
|
}
|
|
189
193
|
).extend(cv.COMPONENT_SCHEMA),
|
|
190
|
-
cv.only_on(
|
|
194
|
+
cv.only_on(
|
|
195
|
+
[
|
|
196
|
+
PLATFORM_ESP32,
|
|
197
|
+
PLATFORM_ESP8266,
|
|
198
|
+
PLATFORM_BK72XX,
|
|
199
|
+
PLATFORM_LN882X,
|
|
200
|
+
PLATFORM_RTL87XX,
|
|
201
|
+
]
|
|
202
|
+
),
|
|
191
203
|
default_url,
|
|
192
204
|
validate_local,
|
|
193
|
-
validate_ota,
|
|
194
205
|
validate_sorting_groups,
|
|
206
|
+
validate_ota_removed,
|
|
195
207
|
)
|
|
196
208
|
|
|
197
209
|
|
|
@@ -211,6 +223,7 @@ async def add_entity_config(entity, config):
|
|
|
211
223
|
sorting_weight = config.get(CONF_SORTING_WEIGHT, 50)
|
|
212
224
|
sorting_group_hash = hash(config.get(CONF_SORTING_GROUP_ID))
|
|
213
225
|
|
|
226
|
+
cg.add_define("USE_WEBSERVER_SORTING")
|
|
214
227
|
cg.add(
|
|
215
228
|
web_server.add_entity_config(
|
|
216
229
|
entity,
|
|
@@ -274,7 +287,8 @@ async def to_code(config):
|
|
|
274
287
|
else:
|
|
275
288
|
cg.add(var.set_css_url(config[CONF_CSS_URL]))
|
|
276
289
|
cg.add(var.set_js_url(config[CONF_JS_URL]))
|
|
277
|
-
|
|
290
|
+
# OTA is now handled by the web_server OTA platform
|
|
291
|
+
# The CONF_OTA option is kept only for backwards compatibility validation
|
|
278
292
|
cg.add(var.set_expose_log(config[CONF_LOG]))
|
|
279
293
|
if config[CONF_ENABLE_PRIVATE_NETWORK_ACCESS]:
|
|
280
294
|
cg.add_define("USE_WEBSERVER_PRIVATE_NETWORK_ACCESS")
|
|
@@ -296,4 +310,5 @@ async def to_code(config):
|
|
|
296
310
|
cg.add_define("USE_WEBSERVER_LOCAL")
|
|
297
311
|
|
|
298
312
|
if (sorting_group_config := config.get(CONF_SORTING_GROUPS)) is not None:
|
|
313
|
+
cg.add_define("USE_WEBSERVER_SORTING")
|
|
299
314
|
add_sorting_groups(var, sorting_group_config)
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import esphome.codegen as cg
|
|
2
|
+
from esphome.components.esp32 import add_idf_component
|
|
3
|
+
from esphome.components.ota import BASE_OTA_SCHEMA, OTAComponent, ota_to_code
|
|
4
|
+
import esphome.config_validation as cv
|
|
5
|
+
from esphome.const import CONF_ID
|
|
6
|
+
from esphome.core import CORE, coroutine_with_priority
|
|
7
|
+
|
|
8
|
+
CODEOWNERS = ["@esphome/core"]
|
|
9
|
+
DEPENDENCIES = ["network", "web_server_base"]
|
|
10
|
+
|
|
11
|
+
web_server_ns = cg.esphome_ns.namespace("web_server")
|
|
12
|
+
WebServerOTAComponent = web_server_ns.class_("WebServerOTAComponent", OTAComponent)
|
|
13
|
+
|
|
14
|
+
CONFIG_SCHEMA = (
|
|
15
|
+
cv.Schema(
|
|
16
|
+
{
|
|
17
|
+
cv.GenerateID(): cv.declare_id(WebServerOTAComponent),
|
|
18
|
+
}
|
|
19
|
+
)
|
|
20
|
+
.extend(BASE_OTA_SCHEMA)
|
|
21
|
+
.extend(cv.COMPONENT_SCHEMA)
|
|
22
|
+
)
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
@coroutine_with_priority(52.0)
|
|
26
|
+
async def to_code(config):
|
|
27
|
+
var = cg.new_Pvariable(config[CONF_ID])
|
|
28
|
+
await ota_to_code(var, config)
|
|
29
|
+
await cg.register_component(var, config)
|
|
30
|
+
cg.add_define("USE_WEBSERVER_OTA")
|
|
31
|
+
if CORE.using_esp_idf:
|
|
32
|
+
add_idf_component(name="zorxx/multipart-parser", ref="1.0.1")
|
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
#include "ota_web_server.h"
|
|
2
|
+
#ifdef USE_WEBSERVER_OTA
|
|
3
|
+
|
|
4
|
+
#include "esphome/components/ota/ota_backend.h"
|
|
5
|
+
#include "esphome/core/application.h"
|
|
6
|
+
#include "esphome/core/log.h"
|
|
7
|
+
|
|
8
|
+
#ifdef USE_ARDUINO
|
|
9
|
+
#ifdef USE_ESP8266
|
|
10
|
+
#include <Updater.h>
|
|
11
|
+
#elif defined(USE_ESP32) || defined(USE_LIBRETINY)
|
|
12
|
+
#include <Update.h>
|
|
13
|
+
#endif
|
|
14
|
+
#endif // USE_ARDUINO
|
|
15
|
+
|
|
16
|
+
namespace esphome {
|
|
17
|
+
namespace web_server {
|
|
18
|
+
|
|
19
|
+
static const char *const TAG = "web_server.ota";
|
|
20
|
+
|
|
21
|
+
class OTARequestHandler : public AsyncWebHandler {
|
|
22
|
+
public:
|
|
23
|
+
OTARequestHandler(WebServerOTAComponent *parent) : parent_(parent) {}
|
|
24
|
+
void handleRequest(AsyncWebServerRequest *request) override;
|
|
25
|
+
void handleUpload(AsyncWebServerRequest *request, const String &filename, size_t index, uint8_t *data, size_t len,
|
|
26
|
+
bool final) override;
|
|
27
|
+
bool canHandle(AsyncWebServerRequest *request) const override {
|
|
28
|
+
return request->url() == "/update" && request->method() == HTTP_POST;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
// NOLINTNEXTLINE(readability-identifier-naming)
|
|
32
|
+
bool isRequestHandlerTrivial() const override { return false; }
|
|
33
|
+
|
|
34
|
+
protected:
|
|
35
|
+
void report_ota_progress_(AsyncWebServerRequest *request);
|
|
36
|
+
void schedule_ota_reboot_();
|
|
37
|
+
void ota_init_(const char *filename);
|
|
38
|
+
|
|
39
|
+
uint32_t last_ota_progress_{0};
|
|
40
|
+
uint32_t ota_read_length_{0};
|
|
41
|
+
WebServerOTAComponent *parent_;
|
|
42
|
+
bool ota_success_{false};
|
|
43
|
+
|
|
44
|
+
private:
|
|
45
|
+
std::unique_ptr<ota::OTABackend> ota_backend_{nullptr};
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
void OTARequestHandler::report_ota_progress_(AsyncWebServerRequest *request) {
|
|
49
|
+
const uint32_t now = millis();
|
|
50
|
+
if (now - this->last_ota_progress_ > 1000) {
|
|
51
|
+
float percentage = 0.0f;
|
|
52
|
+
if (request->contentLength() != 0) {
|
|
53
|
+
// Note: Using contentLength() for progress calculation is technically wrong as it includes
|
|
54
|
+
// multipart headers/boundaries, but it's only off by a small amount and we don't have
|
|
55
|
+
// access to the actual firmware size until the upload is complete. This is intentional
|
|
56
|
+
// as it still gives the user a reasonable progress indication.
|
|
57
|
+
percentage = (this->ota_read_length_ * 100.0f) / request->contentLength();
|
|
58
|
+
ESP_LOGD(TAG, "OTA in progress: %0.1f%%", percentage);
|
|
59
|
+
} else {
|
|
60
|
+
ESP_LOGD(TAG, "OTA in progress: %u bytes read", this->ota_read_length_);
|
|
61
|
+
}
|
|
62
|
+
#ifdef USE_OTA_STATE_CALLBACK
|
|
63
|
+
// Report progress - use call_deferred since we're in web server task
|
|
64
|
+
this->parent_->state_callback_.call_deferred(ota::OTA_IN_PROGRESS, percentage, 0);
|
|
65
|
+
#endif
|
|
66
|
+
this->last_ota_progress_ = now;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
void OTARequestHandler::schedule_ota_reboot_() {
|
|
71
|
+
ESP_LOGI(TAG, "OTA update successful!");
|
|
72
|
+
this->parent_->set_timeout(100, []() {
|
|
73
|
+
ESP_LOGI(TAG, "Performing OTA reboot now");
|
|
74
|
+
App.safe_reboot();
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
void OTARequestHandler::ota_init_(const char *filename) {
|
|
79
|
+
ESP_LOGI(TAG, "OTA Update Start: %s", filename);
|
|
80
|
+
this->ota_read_length_ = 0;
|
|
81
|
+
this->ota_success_ = false;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
void OTARequestHandler::handleUpload(AsyncWebServerRequest *request, const String &filename, size_t index,
|
|
85
|
+
uint8_t *data, size_t len, bool final) {
|
|
86
|
+
ota::OTAResponseTypes error_code = ota::OTA_RESPONSE_OK;
|
|
87
|
+
|
|
88
|
+
if (index == 0 && !this->ota_backend_) {
|
|
89
|
+
// Initialize OTA on first call
|
|
90
|
+
this->ota_init_(filename.c_str());
|
|
91
|
+
|
|
92
|
+
#ifdef USE_OTA_STATE_CALLBACK
|
|
93
|
+
// Notify OTA started - use call_deferred since we're in web server task
|
|
94
|
+
this->parent_->state_callback_.call_deferred(ota::OTA_STARTED, 0.0f, 0);
|
|
95
|
+
#endif
|
|
96
|
+
|
|
97
|
+
// Platform-specific pre-initialization
|
|
98
|
+
#ifdef USE_ARDUINO
|
|
99
|
+
#ifdef USE_ESP8266
|
|
100
|
+
Update.runAsync(true);
|
|
101
|
+
#endif
|
|
102
|
+
#if defined(USE_ESP32) || defined(USE_LIBRETINY)
|
|
103
|
+
if (Update.isRunning()) {
|
|
104
|
+
Update.abort();
|
|
105
|
+
}
|
|
106
|
+
#endif
|
|
107
|
+
#endif // USE_ARDUINO
|
|
108
|
+
|
|
109
|
+
this->ota_backend_ = ota::make_ota_backend();
|
|
110
|
+
if (!this->ota_backend_) {
|
|
111
|
+
ESP_LOGE(TAG, "Failed to create OTA backend");
|
|
112
|
+
#ifdef USE_OTA_STATE_CALLBACK
|
|
113
|
+
this->parent_->state_callback_.call_deferred(ota::OTA_ERROR, 0.0f,
|
|
114
|
+
static_cast<uint8_t>(ota::OTA_RESPONSE_ERROR_UNKNOWN));
|
|
115
|
+
#endif
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
// Web server OTA uses multipart uploads where the actual firmware size
|
|
120
|
+
// is unknown (contentLength includes multipart overhead)
|
|
121
|
+
// Pass 0 to indicate unknown size
|
|
122
|
+
error_code = this->ota_backend_->begin(0);
|
|
123
|
+
if (error_code != ota::OTA_RESPONSE_OK) {
|
|
124
|
+
ESP_LOGE(TAG, "OTA begin failed: %d", error_code);
|
|
125
|
+
this->ota_backend_.reset();
|
|
126
|
+
#ifdef USE_OTA_STATE_CALLBACK
|
|
127
|
+
this->parent_->state_callback_.call_deferred(ota::OTA_ERROR, 0.0f, static_cast<uint8_t>(error_code));
|
|
128
|
+
#endif
|
|
129
|
+
return;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
if (!this->ota_backend_) {
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
// Process data
|
|
138
|
+
if (len > 0) {
|
|
139
|
+
error_code = this->ota_backend_->write(data, len);
|
|
140
|
+
if (error_code != ota::OTA_RESPONSE_OK) {
|
|
141
|
+
ESP_LOGE(TAG, "OTA write failed: %d", error_code);
|
|
142
|
+
this->ota_backend_->abort();
|
|
143
|
+
this->ota_backend_.reset();
|
|
144
|
+
#ifdef USE_OTA_STATE_CALLBACK
|
|
145
|
+
this->parent_->state_callback_.call_deferred(ota::OTA_ERROR, 0.0f, static_cast<uint8_t>(error_code));
|
|
146
|
+
#endif
|
|
147
|
+
return;
|
|
148
|
+
}
|
|
149
|
+
this->ota_read_length_ += len;
|
|
150
|
+
this->report_ota_progress_(request);
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
// Finalize
|
|
154
|
+
if (final) {
|
|
155
|
+
ESP_LOGD(TAG, "OTA final chunk: index=%u, len=%u, total_read=%u, contentLength=%u", index, len,
|
|
156
|
+
this->ota_read_length_, request->contentLength());
|
|
157
|
+
|
|
158
|
+
// For Arduino framework, the Update library tracks expected size from firmware header
|
|
159
|
+
// If we haven't received enough data, calling end() will fail
|
|
160
|
+
// This can happen if the upload is interrupted or the client disconnects
|
|
161
|
+
error_code = this->ota_backend_->end();
|
|
162
|
+
if (error_code == ota::OTA_RESPONSE_OK) {
|
|
163
|
+
this->ota_success_ = true;
|
|
164
|
+
#ifdef USE_OTA_STATE_CALLBACK
|
|
165
|
+
// Report completion before reboot - use call_deferred since we're in web server task
|
|
166
|
+
this->parent_->state_callback_.call_deferred(ota::OTA_COMPLETED, 100.0f, 0);
|
|
167
|
+
#endif
|
|
168
|
+
this->schedule_ota_reboot_();
|
|
169
|
+
} else {
|
|
170
|
+
ESP_LOGE(TAG, "OTA end failed: %d", error_code);
|
|
171
|
+
#ifdef USE_OTA_STATE_CALLBACK
|
|
172
|
+
this->parent_->state_callback_.call_deferred(ota::OTA_ERROR, 0.0f, static_cast<uint8_t>(error_code));
|
|
173
|
+
#endif
|
|
174
|
+
}
|
|
175
|
+
this->ota_backend_.reset();
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
void OTARequestHandler::handleRequest(AsyncWebServerRequest *request) {
|
|
180
|
+
AsyncWebServerResponse *response;
|
|
181
|
+
// Use the ota_success_ flag to determine the actual result
|
|
182
|
+
const char *msg = this->ota_success_ ? "Update Successful!" : "Update Failed!";
|
|
183
|
+
response = request->beginResponse(200, "text/plain", msg);
|
|
184
|
+
response->addHeader("Connection", "close");
|
|
185
|
+
request->send(response);
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
void WebServerOTAComponent::setup() {
|
|
189
|
+
// Get the global web server base instance and register our handler
|
|
190
|
+
auto *base = web_server_base::global_web_server_base;
|
|
191
|
+
if (base == nullptr) {
|
|
192
|
+
ESP_LOGE(TAG, "WebServerBase not found");
|
|
193
|
+
this->mark_failed();
|
|
194
|
+
return;
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
// AsyncWebServer takes ownership of the handler and will delete it when the server is destroyed
|
|
198
|
+
base->add_handler(new OTARequestHandler(this)); // NOLINT
|
|
199
|
+
#ifdef USE_OTA_STATE_CALLBACK
|
|
200
|
+
// Register with global OTA callback system
|
|
201
|
+
ota::register_ota_platform(this);
|
|
202
|
+
#endif
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
void WebServerOTAComponent::dump_config() { ESP_LOGCONFIG(TAG, "Web Server OTA"); }
|
|
206
|
+
|
|
207
|
+
} // namespace web_server
|
|
208
|
+
} // namespace esphome
|
|
209
|
+
|
|
210
|
+
#endif // USE_WEBSERVER_OTA
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
#pragma once
|
|
2
|
+
|
|
3
|
+
#include "esphome/core/defines.h"
|
|
4
|
+
#ifdef USE_WEBSERVER_OTA
|
|
5
|
+
|
|
6
|
+
#include "esphome/components/ota/ota_backend.h"
|
|
7
|
+
#include "esphome/components/web_server_base/web_server_base.h"
|
|
8
|
+
#include "esphome/core/component.h"
|
|
9
|
+
|
|
10
|
+
namespace esphome {
|
|
11
|
+
namespace web_server {
|
|
12
|
+
|
|
13
|
+
class WebServerOTAComponent : public ota::OTAComponent {
|
|
14
|
+
public:
|
|
15
|
+
void setup() override;
|
|
16
|
+
void dump_config() override;
|
|
17
|
+
float get_setup_priority() const override { return setup_priority::AFTER_WIFI; }
|
|
18
|
+
|
|
19
|
+
protected:
|
|
20
|
+
friend class OTARequestHandler;
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
} // namespace web_server
|
|
24
|
+
} // namespace esphome
|
|
25
|
+
|
|
26
|
+
#endif // USE_WEBSERVER_OTA
|