esphome 2025.6.3__py3-none-any.whl → 2025.7.0b1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- esphome/__main__.py +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 +42 -20
- esphome/components/api/api_connection.cpp +318 -391
- esphome/components/api/api_connection.h +206 -126
- esphome/components/api/api_frame_helper.cpp +89 -124
- esphome/components/api/api_frame_helper.h +57 -45
- esphome/components/api/api_pb2.cpp +414 -4350
- esphome/components/api/api_pb2.h +287 -198
- esphome/components/api/api_pb2_dump.cpp +4333 -0
- esphome/components/api/api_pb2_service.cpp +180 -425
- esphome/components/api/api_pb2_service.h +7 -6
- esphome/components/api/api_pb2_size.h +2 -4
- esphome/components/api/api_server.cpp +138 -167
- esphome/components/api/api_server.h +66 -12
- esphome/components/api/client.py +8 -2
- esphome/components/api/list_entities.cpp +36 -105
- esphome/components/api/list_entities.h +31 -23
- esphome/components/api/proto.h +26 -3
- esphome/components/api/subscribe_state.cpp +23 -29
- esphome/components/api/subscribe_state.h +26 -19
- 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/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 +102 -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 +111 -97
- 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 +238 -0
- esphome/components/esp32_touch/esp32_touch_v2.cpp +397 -0
- esphome/components/esp8266/__init__.py +1 -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 +2 -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 +430 -261
- 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 +4 -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 +126 -45
- 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 +31 -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 +1 -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/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 +7 -7
- esphome/core/component_iterator.h +9 -7
- 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 +162 -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 +278 -103
- esphome/core/scheduler.h +157 -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 +16 -3
- esphome/writer.py +21 -3
- esphome/yaml_util.py +0 -2
- {esphome-2025.6.3.dist-info → esphome-2025.7.0b1.dist-info}/METADATA +10 -9
- {esphome-2025.6.3.dist-info → esphome-2025.7.0b1.dist-info}/RECORD +591 -531
- 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.0b1.dist-info}/WHEEL +0 -0
- {esphome-2025.6.3.dist-info → esphome-2025.7.0b1.dist-info}/entry_points.txt +0 -0
- {esphome-2025.6.3.dist-info → esphome-2025.7.0b1.dist-info}/licenses/LICENSE +0 -0
- {esphome-2025.6.3.dist-info → esphome-2025.7.0b1.dist-info}/top_level.txt +0 -0
|
@@ -18,10 +18,13 @@ namespace api {
|
|
|
18
18
|
|
|
19
19
|
// Keepalive timeout in milliseconds
|
|
20
20
|
static constexpr uint32_t KEEPALIVE_TIMEOUT_MS = 60000;
|
|
21
|
+
// Maximum number of entities to process in a single batch during initial state/info sending
|
|
22
|
+
static constexpr size_t MAX_INITIAL_PER_BATCH = 20;
|
|
21
23
|
|
|
22
24
|
class APIConnection : public APIServerConnection {
|
|
23
25
|
public:
|
|
24
26
|
friend class APIServer;
|
|
27
|
+
friend class ListEntitiesIterator;
|
|
25
28
|
APIConnection(std::unique_ptr<socket::Socket> socket, APIServer *parent);
|
|
26
29
|
virtual ~APIConnection();
|
|
27
30
|
|
|
@@ -34,98 +37,79 @@ class APIConnection : public APIServerConnection {
|
|
|
34
37
|
}
|
|
35
38
|
#ifdef USE_BINARY_SENSOR
|
|
36
39
|
bool send_binary_sensor_state(binary_sensor::BinarySensor *binary_sensor);
|
|
37
|
-
void send_binary_sensor_info(binary_sensor::BinarySensor *binary_sensor);
|
|
38
40
|
#endif
|
|
39
41
|
#ifdef USE_COVER
|
|
40
42
|
bool send_cover_state(cover::Cover *cover);
|
|
41
|
-
void send_cover_info(cover::Cover *cover);
|
|
42
43
|
void cover_command(const CoverCommandRequest &msg) override;
|
|
43
44
|
#endif
|
|
44
45
|
#ifdef USE_FAN
|
|
45
46
|
bool send_fan_state(fan::Fan *fan);
|
|
46
|
-
void send_fan_info(fan::Fan *fan);
|
|
47
47
|
void fan_command(const FanCommandRequest &msg) override;
|
|
48
48
|
#endif
|
|
49
49
|
#ifdef USE_LIGHT
|
|
50
50
|
bool send_light_state(light::LightState *light);
|
|
51
|
-
void send_light_info(light::LightState *light);
|
|
52
51
|
void light_command(const LightCommandRequest &msg) override;
|
|
53
52
|
#endif
|
|
54
53
|
#ifdef USE_SENSOR
|
|
55
54
|
bool send_sensor_state(sensor::Sensor *sensor);
|
|
56
|
-
void send_sensor_info(sensor::Sensor *sensor);
|
|
57
55
|
#endif
|
|
58
56
|
#ifdef USE_SWITCH
|
|
59
57
|
bool send_switch_state(switch_::Switch *a_switch);
|
|
60
|
-
void send_switch_info(switch_::Switch *a_switch);
|
|
61
58
|
void switch_command(const SwitchCommandRequest &msg) override;
|
|
62
59
|
#endif
|
|
63
60
|
#ifdef USE_TEXT_SENSOR
|
|
64
61
|
bool send_text_sensor_state(text_sensor::TextSensor *text_sensor);
|
|
65
|
-
void send_text_sensor_info(text_sensor::TextSensor *text_sensor);
|
|
66
62
|
#endif
|
|
67
|
-
#ifdef
|
|
68
|
-
void set_camera_state(std::shared_ptr<
|
|
69
|
-
void send_camera_info(esp32_camera::ESP32Camera *camera);
|
|
63
|
+
#ifdef USE_CAMERA
|
|
64
|
+
void set_camera_state(std::shared_ptr<camera::CameraImage> image);
|
|
70
65
|
void camera_image(const CameraImageRequest &msg) override;
|
|
71
66
|
#endif
|
|
72
67
|
#ifdef USE_CLIMATE
|
|
73
68
|
bool send_climate_state(climate::Climate *climate);
|
|
74
|
-
void send_climate_info(climate::Climate *climate);
|
|
75
69
|
void climate_command(const ClimateCommandRequest &msg) override;
|
|
76
70
|
#endif
|
|
77
71
|
#ifdef USE_NUMBER
|
|
78
72
|
bool send_number_state(number::Number *number);
|
|
79
|
-
void send_number_info(number::Number *number);
|
|
80
73
|
void number_command(const NumberCommandRequest &msg) override;
|
|
81
74
|
#endif
|
|
82
75
|
#ifdef USE_DATETIME_DATE
|
|
83
76
|
bool send_date_state(datetime::DateEntity *date);
|
|
84
|
-
void send_date_info(datetime::DateEntity *date);
|
|
85
77
|
void date_command(const DateCommandRequest &msg) override;
|
|
86
78
|
#endif
|
|
87
79
|
#ifdef USE_DATETIME_TIME
|
|
88
80
|
bool send_time_state(datetime::TimeEntity *time);
|
|
89
|
-
void send_time_info(datetime::TimeEntity *time);
|
|
90
81
|
void time_command(const TimeCommandRequest &msg) override;
|
|
91
82
|
#endif
|
|
92
83
|
#ifdef USE_DATETIME_DATETIME
|
|
93
84
|
bool send_datetime_state(datetime::DateTimeEntity *datetime);
|
|
94
|
-
void send_datetime_info(datetime::DateTimeEntity *datetime);
|
|
95
85
|
void datetime_command(const DateTimeCommandRequest &msg) override;
|
|
96
86
|
#endif
|
|
97
87
|
#ifdef USE_TEXT
|
|
98
88
|
bool send_text_state(text::Text *text);
|
|
99
|
-
void send_text_info(text::Text *text);
|
|
100
89
|
void text_command(const TextCommandRequest &msg) override;
|
|
101
90
|
#endif
|
|
102
91
|
#ifdef USE_SELECT
|
|
103
92
|
bool send_select_state(select::Select *select);
|
|
104
|
-
void send_select_info(select::Select *select);
|
|
105
93
|
void select_command(const SelectCommandRequest &msg) override;
|
|
106
94
|
#endif
|
|
107
95
|
#ifdef USE_BUTTON
|
|
108
|
-
void send_button_info(button::Button *button);
|
|
109
96
|
void button_command(const ButtonCommandRequest &msg) override;
|
|
110
97
|
#endif
|
|
111
98
|
#ifdef USE_LOCK
|
|
112
99
|
bool send_lock_state(lock::Lock *a_lock);
|
|
113
|
-
void send_lock_info(lock::Lock *a_lock);
|
|
114
100
|
void lock_command(const LockCommandRequest &msg) override;
|
|
115
101
|
#endif
|
|
116
102
|
#ifdef USE_VALVE
|
|
117
103
|
bool send_valve_state(valve::Valve *valve);
|
|
118
|
-
void send_valve_info(valve::Valve *valve);
|
|
119
104
|
void valve_command(const ValveCommandRequest &msg) override;
|
|
120
105
|
#endif
|
|
121
106
|
#ifdef USE_MEDIA_PLAYER
|
|
122
107
|
bool send_media_player_state(media_player::MediaPlayer *media_player);
|
|
123
|
-
void send_media_player_info(media_player::MediaPlayer *media_player);
|
|
124
108
|
void media_player_command(const MediaPlayerCommandRequest &msg) override;
|
|
125
109
|
#endif
|
|
126
|
-
bool try_send_log_message(int level, const char *tag, const char *line);
|
|
110
|
+
bool try_send_log_message(int level, const char *tag, const char *line, size_t message_len);
|
|
127
111
|
void send_homeassistant_service_call(const HomeassistantServiceResponse &call) {
|
|
128
|
-
if (!this->
|
|
112
|
+
if (!this->flags_.service_call_subscription)
|
|
129
113
|
return;
|
|
130
114
|
this->send_message(call);
|
|
131
115
|
}
|
|
@@ -167,26 +151,22 @@ class APIConnection : public APIServerConnection {
|
|
|
167
151
|
|
|
168
152
|
#ifdef USE_ALARM_CONTROL_PANEL
|
|
169
153
|
bool send_alarm_control_panel_state(alarm_control_panel::AlarmControlPanel *a_alarm_control_panel);
|
|
170
|
-
void send_alarm_control_panel_info(alarm_control_panel::AlarmControlPanel *a_alarm_control_panel);
|
|
171
154
|
void alarm_control_panel_command(const AlarmControlPanelCommandRequest &msg) override;
|
|
172
155
|
#endif
|
|
173
156
|
|
|
174
157
|
#ifdef USE_EVENT
|
|
175
158
|
void send_event(event::Event *event, const std::string &event_type);
|
|
176
|
-
void send_event_info(event::Event *event);
|
|
177
159
|
#endif
|
|
178
160
|
|
|
179
161
|
#ifdef USE_UPDATE
|
|
180
162
|
bool send_update_state(update::UpdateEntity *update);
|
|
181
|
-
void send_update_info(update::UpdateEntity *update);
|
|
182
163
|
void update_command(const UpdateCommandRequest &msg) override;
|
|
183
164
|
#endif
|
|
184
165
|
|
|
185
166
|
void on_disconnect_response(const DisconnectResponse &value) override;
|
|
186
167
|
void on_ping_response(const PingResponse &value) override {
|
|
187
168
|
// we initiated ping
|
|
188
|
-
this->
|
|
189
|
-
this->sent_ping_ = false;
|
|
169
|
+
this->flags_.sent_ping = false;
|
|
190
170
|
}
|
|
191
171
|
void on_home_assistant_state_response(const HomeAssistantStateResponse &msg) override;
|
|
192
172
|
#ifdef USE_HOMEASSISTANT_TIME
|
|
@@ -199,16 +179,16 @@ class APIConnection : public APIServerConnection {
|
|
|
199
179
|
DeviceInfoResponse device_info(const DeviceInfoRequest &msg) override;
|
|
200
180
|
void list_entities(const ListEntitiesRequest &msg) override { this->list_entities_iterator_.begin(); }
|
|
201
181
|
void subscribe_states(const SubscribeStatesRequest &msg) override {
|
|
202
|
-
this->
|
|
182
|
+
this->flags_.state_subscription = true;
|
|
203
183
|
this->initial_state_iterator_.begin();
|
|
204
184
|
}
|
|
205
185
|
void subscribe_logs(const SubscribeLogsRequest &msg) override {
|
|
206
|
-
this->
|
|
186
|
+
this->flags_.log_subscription = msg.level;
|
|
207
187
|
if (msg.dump_config)
|
|
208
188
|
App.schedule_dump_config();
|
|
209
189
|
}
|
|
210
190
|
void subscribe_homeassistant_services(const SubscribeHomeassistantServicesRequest &msg) override {
|
|
211
|
-
this->
|
|
191
|
+
this->flags_.service_call_subscription = true;
|
|
212
192
|
}
|
|
213
193
|
void subscribe_home_assistant_states(const SubscribeHomeAssistantStatesRequest &msg) override;
|
|
214
194
|
GetTimeResponse get_time(const GetTimeRequest &msg) override {
|
|
@@ -220,9 +200,12 @@ class APIConnection : public APIServerConnection {
|
|
|
220
200
|
NoiseEncryptionSetKeyResponse noise_encryption_set_key(const NoiseEncryptionSetKeyRequest &msg) override;
|
|
221
201
|
#endif
|
|
222
202
|
|
|
223
|
-
bool is_authenticated() override {
|
|
203
|
+
bool is_authenticated() override {
|
|
204
|
+
return static_cast<ConnectionState>(this->flags_.connection_state) == ConnectionState::AUTHENTICATED;
|
|
205
|
+
}
|
|
224
206
|
bool is_connection_setup() override {
|
|
225
|
-
return this->
|
|
207
|
+
return static_cast<ConnectionState>(this->flags_.connection_state) == ConnectionState::CONNECTED ||
|
|
208
|
+
this->is_authenticated();
|
|
226
209
|
}
|
|
227
210
|
void on_fatal_error() override;
|
|
228
211
|
void on_unauthenticated_access() override;
|
|
@@ -275,7 +258,13 @@ class APIConnection : public APIServerConnection {
|
|
|
275
258
|
bool try_to_clear_buffer(bool log_out_of_space);
|
|
276
259
|
bool send_buffer(ProtoWriteBuffer buffer, uint16_t message_type) override;
|
|
277
260
|
|
|
278
|
-
std::string get_client_combined_info() const {
|
|
261
|
+
std::string get_client_combined_info() const {
|
|
262
|
+
if (this->client_info_ == this->client_peername_) {
|
|
263
|
+
// Before Hello message, both are the same (just IP:port)
|
|
264
|
+
return this->client_info_;
|
|
265
|
+
}
|
|
266
|
+
return this->client_info_ + " (" + this->client_peername_ + ")";
|
|
267
|
+
}
|
|
279
268
|
|
|
280
269
|
// Buffer allocator methods for batch processing
|
|
281
270
|
ProtoWriteBuffer allocate_single_message_buffer(uint16_t size);
|
|
@@ -295,17 +284,42 @@ class APIConnection : public APIServerConnection {
|
|
|
295
284
|
response.icon = entity->get_icon();
|
|
296
285
|
response.disabled_by_default = entity->is_disabled_by_default();
|
|
297
286
|
response.entity_category = static_cast<enums::EntityCategory>(entity->get_entity_category());
|
|
287
|
+
#ifdef USE_DEVICES
|
|
288
|
+
response.device_id = entity->get_device_id();
|
|
289
|
+
#endif
|
|
298
290
|
}
|
|
299
291
|
|
|
300
292
|
// Helper function to fill common entity state fields
|
|
301
293
|
static void fill_entity_state_base(esphome::EntityBase *entity, StateResponseProtoMessage &response) {
|
|
302
294
|
response.key = entity->get_object_id_hash();
|
|
295
|
+
#ifdef USE_DEVICES
|
|
296
|
+
response.device_id = entity->get_device_id();
|
|
297
|
+
#endif
|
|
303
298
|
}
|
|
304
299
|
|
|
305
300
|
// Non-template helper to encode any ProtoMessage
|
|
306
301
|
static uint16_t encode_message_to_buffer(ProtoMessage &msg, uint16_t message_type, APIConnection *conn,
|
|
307
302
|
uint32_t remaining_size, bool is_single);
|
|
308
303
|
|
|
304
|
+
#ifdef USE_VOICE_ASSISTANT
|
|
305
|
+
// Helper to check voice assistant validity and connection ownership
|
|
306
|
+
inline bool check_voice_assistant_api_connection_() const;
|
|
307
|
+
#endif
|
|
308
|
+
|
|
309
|
+
// Helper method to process multiple entities from an iterator in a batch
|
|
310
|
+
template<typename Iterator> void process_iterator_batch_(Iterator &iterator) {
|
|
311
|
+
size_t initial_size = this->deferred_batch_.size();
|
|
312
|
+
while (!iterator.completed() && (this->deferred_batch_.size() - initial_size) < MAX_INITIAL_PER_BATCH) {
|
|
313
|
+
iterator.advance();
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
// If the batch is full, process it immediately
|
|
317
|
+
// Note: iterator.advance() already calls schedule_batch_() via schedule_message_()
|
|
318
|
+
if (this->deferred_batch_.size() >= MAX_INITIAL_PER_BATCH) {
|
|
319
|
+
this->process_batch_();
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
|
|
309
323
|
#ifdef USE_BINARY_SENSOR
|
|
310
324
|
static uint16_t try_send_binary_sensor_state(EntityBase *entity, APIConnection *conn, uint32_t remaining_size,
|
|
311
325
|
bool is_single);
|
|
@@ -416,7 +430,7 @@ class APIConnection : public APIServerConnection {
|
|
|
416
430
|
static uint16_t try_send_update_info(EntityBase *entity, APIConnection *conn, uint32_t remaining_size,
|
|
417
431
|
bool is_single);
|
|
418
432
|
#endif
|
|
419
|
-
#ifdef
|
|
433
|
+
#ifdef USE_CAMERA
|
|
420
434
|
static uint16_t try_send_camera_info(EntityBase *entity, APIConnection *conn, uint32_t remaining_size,
|
|
421
435
|
bool is_single);
|
|
422
436
|
#endif
|
|
@@ -432,124 +446,82 @@ class APIConnection : public APIServerConnection {
|
|
|
432
446
|
// Helper function to get estimated message size for buffer pre-allocation
|
|
433
447
|
static uint16_t get_estimated_message_size(uint16_t message_type);
|
|
434
448
|
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
AUTHENTICATED,
|
|
439
|
-
} connection_state_{ConnectionState::WAITING_FOR_HELLO};
|
|
449
|
+
// Batch message method for ping requests
|
|
450
|
+
static uint16_t try_send_ping_request(EntityBase *entity, APIConnection *conn, uint32_t remaining_size,
|
|
451
|
+
bool is_single);
|
|
440
452
|
|
|
441
|
-
|
|
453
|
+
// === Optimal member ordering for 32-bit systems ===
|
|
442
454
|
|
|
455
|
+
// Group 1: Pointers (4 bytes each on 32-bit)
|
|
443
456
|
std::unique_ptr<APIFrameHelper> helper_;
|
|
457
|
+
APIServer *parent_;
|
|
444
458
|
|
|
459
|
+
// Group 2: Larger objects (must be 4-byte aligned)
|
|
460
|
+
// These contain vectors/pointers internally, so putting them early ensures good alignment
|
|
461
|
+
InitialStateIterator initial_state_iterator_;
|
|
462
|
+
ListEntitiesIterator list_entities_iterator_;
|
|
463
|
+
#ifdef USE_CAMERA
|
|
464
|
+
std::unique_ptr<camera::CameraImageReader> image_reader_;
|
|
465
|
+
#endif
|
|
466
|
+
|
|
467
|
+
// Group 3: Strings (12 bytes each on 32-bit, 4-byte aligned)
|
|
445
468
|
std::string client_info_;
|
|
446
469
|
std::string client_peername_;
|
|
447
|
-
std::string client_combined_info_;
|
|
448
|
-
uint32_t client_api_version_major_{0};
|
|
449
|
-
uint32_t client_api_version_minor_{0};
|
|
450
|
-
#ifdef USE_ESP32_CAMERA
|
|
451
|
-
esp32_camera::CameraImageReader image_reader_;
|
|
452
|
-
#endif
|
|
453
470
|
|
|
454
|
-
|
|
455
|
-
int log_subscription_{ESPHOME_LOG_LEVEL_NONE};
|
|
471
|
+
// Group 4: 4-byte types
|
|
456
472
|
uint32_t last_traffic_;
|
|
457
|
-
uint32_t next_ping_retry_{0};
|
|
458
|
-
uint8_t ping_retries_{0};
|
|
459
|
-
bool sent_ping_{false};
|
|
460
|
-
bool service_call_subscription_{false};
|
|
461
|
-
bool next_close_ = false;
|
|
462
|
-
APIServer *parent_;
|
|
463
|
-
InitialStateIterator initial_state_iterator_;
|
|
464
|
-
ListEntitiesIterator list_entities_iterator_;
|
|
465
473
|
int state_subs_at_ = -1;
|
|
466
474
|
|
|
467
475
|
// Function pointer type for message encoding
|
|
468
476
|
using MessageCreatorPtr = uint16_t (*)(EntityBase *, APIConnection *, uint32_t remaining_size, bool is_single);
|
|
469
477
|
|
|
470
|
-
// Optimized MessageCreator class using union dispatch
|
|
471
478
|
class MessageCreator {
|
|
472
479
|
public:
|
|
473
|
-
// Constructor for function pointer
|
|
474
|
-
MessageCreator(MessageCreatorPtr ptr)
|
|
480
|
+
// Constructor for function pointer
|
|
481
|
+
MessageCreator(MessageCreatorPtr ptr) { data_.function_ptr = ptr; }
|
|
475
482
|
|
|
476
483
|
// Constructor for string state capture
|
|
477
|
-
MessageCreator(const std::string &
|
|
478
|
-
data_.string_ptr = new std::string(value);
|
|
479
|
-
}
|
|
484
|
+
explicit MessageCreator(const std::string &str_value) { data_.string_ptr = new std::string(str_value); }
|
|
480
485
|
|
|
481
|
-
//
|
|
482
|
-
~MessageCreator() {
|
|
483
|
-
// Clean up string data for string-based message types
|
|
484
|
-
if (uses_string_data_()) {
|
|
485
|
-
delete data_.string_ptr;
|
|
486
|
-
}
|
|
487
|
-
}
|
|
486
|
+
// No destructor - cleanup must be called explicitly with message_type
|
|
488
487
|
|
|
489
|
-
//
|
|
490
|
-
MessageCreator(const MessageCreator &other)
|
|
491
|
-
|
|
492
|
-
data_.ptr = other.data_.ptr;
|
|
493
|
-
} else if (uses_string_data_()) {
|
|
494
|
-
data_.string_ptr = new std::string(*other.data_.string_ptr);
|
|
495
|
-
} else {
|
|
496
|
-
data_ = other.data_; // For POD types
|
|
497
|
-
}
|
|
498
|
-
}
|
|
488
|
+
// Delete copy operations - MessageCreator should only be moved
|
|
489
|
+
MessageCreator(const MessageCreator &other) = delete;
|
|
490
|
+
MessageCreator &operator=(const MessageCreator &other) = delete;
|
|
499
491
|
|
|
500
492
|
// Move constructor
|
|
501
|
-
MessageCreator(MessageCreator &&other) noexcept : data_(other.data_)
|
|
502
|
-
other.message_type_ = 0; // Reset other to function pointer type
|
|
503
|
-
other.data_.ptr = nullptr;
|
|
504
|
-
}
|
|
505
|
-
|
|
506
|
-
// Assignment operators (needed for batch deduplication)
|
|
507
|
-
MessageCreator &operator=(const MessageCreator &other) {
|
|
508
|
-
if (this != &other) {
|
|
509
|
-
// Clean up current string data if needed
|
|
510
|
-
if (uses_string_data_()) {
|
|
511
|
-
delete data_.string_ptr;
|
|
512
|
-
}
|
|
513
|
-
// Copy new data
|
|
514
|
-
message_type_ = other.message_type_;
|
|
515
|
-
if (other.message_type_ == 0) {
|
|
516
|
-
data_.ptr = other.data_.ptr;
|
|
517
|
-
} else if (other.uses_string_data_()) {
|
|
518
|
-
data_.string_ptr = new std::string(*other.data_.string_ptr);
|
|
519
|
-
} else {
|
|
520
|
-
data_ = other.data_;
|
|
521
|
-
}
|
|
522
|
-
}
|
|
523
|
-
return *this;
|
|
524
|
-
}
|
|
493
|
+
MessageCreator(MessageCreator &&other) noexcept : data_(other.data_) { other.data_.function_ptr = nullptr; }
|
|
525
494
|
|
|
495
|
+
// Move assignment
|
|
526
496
|
MessageCreator &operator=(MessageCreator &&other) noexcept {
|
|
527
497
|
if (this != &other) {
|
|
528
|
-
//
|
|
529
|
-
|
|
530
|
-
delete data_.string_ptr;
|
|
531
|
-
}
|
|
532
|
-
// Move data
|
|
533
|
-
message_type_ = other.message_type_;
|
|
498
|
+
// IMPORTANT: Caller must ensure cleanup() was called if this contains a string!
|
|
499
|
+
// In our usage, this happens in add_item() deduplication and vector::erase()
|
|
534
500
|
data_ = other.data_;
|
|
535
|
-
|
|
536
|
-
other.message_type_ = 0;
|
|
537
|
-
other.data_.ptr = nullptr;
|
|
501
|
+
other.data_.function_ptr = nullptr;
|
|
538
502
|
}
|
|
539
503
|
return *this;
|
|
540
504
|
}
|
|
541
505
|
|
|
542
|
-
// Call operator
|
|
543
|
-
uint16_t operator()(EntityBase *entity, APIConnection *conn, uint32_t remaining_size, bool is_single
|
|
506
|
+
// Call operator - uses message_type to determine union type
|
|
507
|
+
uint16_t operator()(EntityBase *entity, APIConnection *conn, uint32_t remaining_size, bool is_single,
|
|
508
|
+
uint16_t message_type) const;
|
|
509
|
+
|
|
510
|
+
// Manual cleanup method - must be called before destruction for string types
|
|
511
|
+
void cleanup(uint16_t message_type) {
|
|
512
|
+
#ifdef USE_EVENT
|
|
513
|
+
if (message_type == EventResponse::MESSAGE_TYPE && data_.string_ptr != nullptr) {
|
|
514
|
+
delete data_.string_ptr;
|
|
515
|
+
data_.string_ptr = nullptr;
|
|
516
|
+
}
|
|
517
|
+
#endif
|
|
518
|
+
}
|
|
544
519
|
|
|
545
520
|
private:
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
std::string *string_ptr; // 8 bytes
|
|
551
|
-
} data_; // 8 bytes
|
|
552
|
-
uint16_t message_type_; // 2 bytes (0 = function ptr, >0 = state capture)
|
|
521
|
+
union Data {
|
|
522
|
+
MessageCreatorPtr function_ptr;
|
|
523
|
+
std::string *string_ptr;
|
|
524
|
+
} data_; // 4 bytes on 32-bit, 8 bytes on 64-bit - same as before
|
|
553
525
|
};
|
|
554
526
|
|
|
555
527
|
// Generic batching mechanism for both state updates and entity info
|
|
@@ -566,24 +538,86 @@ class APIConnection : public APIServerConnection {
|
|
|
566
538
|
|
|
567
539
|
std::vector<BatchItem> items;
|
|
568
540
|
uint32_t batch_start_time{0};
|
|
569
|
-
bool batch_scheduled{false};
|
|
570
541
|
|
|
542
|
+
private:
|
|
543
|
+
// Helper to cleanup items from the beginning
|
|
544
|
+
void cleanup_items_(size_t count) {
|
|
545
|
+
for (size_t i = 0; i < count; i++) {
|
|
546
|
+
items[i].creator.cleanup(items[i].message_type);
|
|
547
|
+
}
|
|
548
|
+
}
|
|
549
|
+
|
|
550
|
+
public:
|
|
571
551
|
DeferredBatch() {
|
|
572
552
|
// Pre-allocate capacity for typical batch sizes to avoid reallocation
|
|
573
553
|
items.reserve(8);
|
|
574
554
|
}
|
|
575
555
|
|
|
556
|
+
~DeferredBatch() {
|
|
557
|
+
// Ensure cleanup of any remaining items
|
|
558
|
+
clear();
|
|
559
|
+
}
|
|
560
|
+
|
|
576
561
|
// Add item to the batch
|
|
577
562
|
void add_item(EntityBase *entity, MessageCreator creator, uint16_t message_type);
|
|
563
|
+
// Add item to the front of the batch (for high priority messages like ping)
|
|
564
|
+
void add_item_front(EntityBase *entity, MessageCreator creator, uint16_t message_type);
|
|
565
|
+
|
|
566
|
+
// Clear all items with proper cleanup
|
|
578
567
|
void clear() {
|
|
568
|
+
cleanup_items_(items.size());
|
|
579
569
|
items.clear();
|
|
580
|
-
batch_scheduled = false;
|
|
581
570
|
batch_start_time = 0;
|
|
582
571
|
}
|
|
572
|
+
|
|
573
|
+
// Remove processed items from the front with proper cleanup
|
|
574
|
+
void remove_front(size_t count) {
|
|
575
|
+
cleanup_items_(count);
|
|
576
|
+
items.erase(items.begin(), items.begin() + count);
|
|
577
|
+
}
|
|
578
|
+
|
|
583
579
|
bool empty() const { return items.empty(); }
|
|
580
|
+
size_t size() const { return items.size(); }
|
|
581
|
+
const BatchItem &operator[](size_t index) const { return items[index]; }
|
|
584
582
|
};
|
|
585
583
|
|
|
584
|
+
// DeferredBatch here (16 bytes, 4-byte aligned)
|
|
586
585
|
DeferredBatch deferred_batch_;
|
|
586
|
+
|
|
587
|
+
// ConnectionState enum for type safety
|
|
588
|
+
enum class ConnectionState : uint8_t {
|
|
589
|
+
WAITING_FOR_HELLO = 0,
|
|
590
|
+
CONNECTED = 1,
|
|
591
|
+
AUTHENTICATED = 2,
|
|
592
|
+
};
|
|
593
|
+
|
|
594
|
+
// Group 5: Pack all small members together to minimize padding
|
|
595
|
+
// This group starts at a 4-byte boundary after DeferredBatch
|
|
596
|
+
struct APIFlags {
|
|
597
|
+
// Connection state only needs 2 bits (3 states)
|
|
598
|
+
uint8_t connection_state : 2;
|
|
599
|
+
// Log subscription needs 3 bits (log levels 0-7)
|
|
600
|
+
uint8_t log_subscription : 3;
|
|
601
|
+
// Boolean flags (1 bit each)
|
|
602
|
+
uint8_t remove : 1;
|
|
603
|
+
uint8_t state_subscription : 1;
|
|
604
|
+
uint8_t sent_ping : 1;
|
|
605
|
+
|
|
606
|
+
uint8_t service_call_subscription : 1;
|
|
607
|
+
uint8_t next_close : 1;
|
|
608
|
+
uint8_t batch_scheduled : 1;
|
|
609
|
+
uint8_t batch_first_message : 1; // For batch buffer allocation
|
|
610
|
+
uint8_t should_try_send_immediately : 1; // True after initial states are sent
|
|
611
|
+
#ifdef HAS_PROTO_MESSAGE_DUMP
|
|
612
|
+
uint8_t log_only_mode : 1;
|
|
613
|
+
#endif
|
|
614
|
+
} flags_{}; // 2 bytes total
|
|
615
|
+
|
|
616
|
+
// 2-byte types immediately after flags_ (no padding between them)
|
|
617
|
+
uint16_t client_api_version_major_{0};
|
|
618
|
+
uint16_t client_api_version_minor_{0};
|
|
619
|
+
// Total: 2 (flags) + 2 + 2 = 6 bytes, then 2 bytes padding to next 4-byte boundary
|
|
620
|
+
|
|
587
621
|
uint32_t get_batch_delay_ms_() const;
|
|
588
622
|
// Message will use 8 more bytes than the minimum size, and typical
|
|
589
623
|
// MTU is 1500. Sometimes users will see as low as 1460 MTU.
|
|
@@ -600,9 +634,49 @@ class APIConnection : public APIServerConnection {
|
|
|
600
634
|
|
|
601
635
|
bool schedule_batch_();
|
|
602
636
|
void process_batch_();
|
|
637
|
+
void clear_batch_() {
|
|
638
|
+
this->deferred_batch_.clear();
|
|
639
|
+
this->flags_.batch_scheduled = false;
|
|
640
|
+
}
|
|
603
641
|
|
|
604
|
-
|
|
605
|
-
|
|
642
|
+
#ifdef HAS_PROTO_MESSAGE_DUMP
|
|
643
|
+
// Helper to log a proto message from a MessageCreator object
|
|
644
|
+
void log_proto_message_(EntityBase *entity, const MessageCreator &creator, uint16_t message_type) {
|
|
645
|
+
this->flags_.log_only_mode = true;
|
|
646
|
+
creator(entity, this, MAX_PACKET_SIZE, true, message_type);
|
|
647
|
+
this->flags_.log_only_mode = false;
|
|
648
|
+
}
|
|
649
|
+
|
|
650
|
+
void log_batch_item_(const DeferredBatch::BatchItem &item) {
|
|
651
|
+
// Use the helper to log the message
|
|
652
|
+
this->log_proto_message_(item.entity, item.creator, item.message_type);
|
|
653
|
+
}
|
|
654
|
+
#endif
|
|
655
|
+
|
|
656
|
+
// Helper method to send a message either immediately or via batching
|
|
657
|
+
bool send_message_smart_(EntityBase *entity, MessageCreatorPtr creator, uint16_t message_type) {
|
|
658
|
+
// Try to send immediately if:
|
|
659
|
+
// 1. We should try to send immediately (should_try_send_immediately = true)
|
|
660
|
+
// 2. Batch delay is 0 (user has opted in to immediate sending)
|
|
661
|
+
// 3. Buffer has space available
|
|
662
|
+
if (this->flags_.should_try_send_immediately && this->get_batch_delay_ms_() == 0 &&
|
|
663
|
+
this->helper_->can_write_without_blocking()) {
|
|
664
|
+
// Now actually encode and send
|
|
665
|
+
if (creator(entity, this, MAX_PACKET_SIZE, true) &&
|
|
666
|
+
this->send_buffer(ProtoWriteBuffer{&this->parent_->get_shared_buffer_ref()}, message_type)) {
|
|
667
|
+
#ifdef HAS_PROTO_MESSAGE_DUMP
|
|
668
|
+
// Log the message in verbose mode
|
|
669
|
+
this->log_proto_message_(entity, MessageCreator(creator), message_type);
|
|
670
|
+
#endif
|
|
671
|
+
return true;
|
|
672
|
+
}
|
|
673
|
+
|
|
674
|
+
// If immediate send failed, fall through to batching
|
|
675
|
+
}
|
|
676
|
+
|
|
677
|
+
// Fall back to scheduled batching
|
|
678
|
+
return this->schedule_message_(entity, creator, message_type);
|
|
679
|
+
}
|
|
606
680
|
|
|
607
681
|
// Helper function to schedule a deferred message with known message type
|
|
608
682
|
bool schedule_message_(EntityBase *entity, MessageCreator creator, uint16_t message_type) {
|
|
@@ -614,6 +688,12 @@ class APIConnection : public APIServerConnection {
|
|
|
614
688
|
bool schedule_message_(EntityBase *entity, MessageCreatorPtr function_ptr, uint16_t message_type) {
|
|
615
689
|
return schedule_message_(entity, MessageCreator(function_ptr), message_type);
|
|
616
690
|
}
|
|
691
|
+
|
|
692
|
+
// Helper function to schedule a high priority message at the front of the batch
|
|
693
|
+
bool schedule_message_front_(EntityBase *entity, MessageCreatorPtr function_ptr, uint16_t message_type) {
|
|
694
|
+
this->deferred_batch_.add_item_front(entity, MessageCreator(function_ptr), message_type);
|
|
695
|
+
return this->schedule_batch_();
|
|
696
|
+
}
|
|
617
697
|
};
|
|
618
698
|
|
|
619
699
|
} // namespace api
|