esphome 2025.6.3__py3-none-any.whl → 2025.7.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- esphome/__main__.py +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/as3935_spi/as3935_spi.h +0 -2
- 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/esp_ldo/__init__.py +10 -8
- esphome/components/esp_ldo/esp_ldo.h +3 -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/fan/fan.cpp +4 -0
- 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 +39 -1
- 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 +35 -16
- 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/__init__.py +1 -1
- 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/json/__init__.py +1 -1
- esphome/components/json/json_util.cpp +56 -63
- 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/binary_sensor/ld2420_binary_sensor.cpp +2 -2
- esphome/components/ld2420/button/reconfig_buttons.cpp +1 -1
- esphome/components/ld2420/ld2420.cpp +252 -147
- esphome/components/ld2420/ld2420.h +52 -126
- esphome/components/ld2420/number/__init__.py +2 -2
- esphome/components/ld2420/number/gate_config_number.cpp +1 -1
- esphome/components/ld2420/select/operating_mode_select.cpp +1 -1
- esphome/components/ld2420/sensor/__init__.py +6 -2
- esphome/components/ld2420/sensor/ld2420_sensor.cpp +2 -2
- esphome/components/ld2420/sensor/ld2420_sensor.h +1 -1
- esphome/components/ld2420/text_sensor/text_sensor.cpp +2 -2
- 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_json_schema.cpp +17 -16
- 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/lvgl/widgets/meter.py +20 -13
- 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_alarm_control_panel.cpp +2 -1
- 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_binary_sensor.cpp +1 -0
- esphome/components/mqtt/mqtt_button.cpp +4 -1
- esphome/components/mqtt/mqtt_client.cpp +17 -9
- esphome/components/mqtt/mqtt_client.h +8 -3
- esphome/components/mqtt/mqtt_climate.cpp +6 -4
- esphome/components/mqtt/mqtt_component.cpp +3 -1
- esphome/components/mqtt/mqtt_cover.cpp +1 -0
- esphome/components/mqtt/mqtt_date.cpp +4 -3
- esphome/components/mqtt/mqtt_datetime.cpp +7 -6
- esphome/components/mqtt/mqtt_event.cpp +6 -3
- esphome/components/mqtt/mqtt_fan.cpp +1 -0
- esphome/components/mqtt/mqtt_light.cpp +8 -4
- esphome/components/mqtt/mqtt_lock.cpp +3 -1
- esphome/components/mqtt/mqtt_number.cpp +1 -0
- esphome/components/mqtt/mqtt_select.cpp +2 -1
- esphome/components/mqtt/mqtt_sensor.cpp +3 -1
- esphome/components/mqtt/mqtt_switch.cpp +3 -1
- esphome/components/mqtt/mqtt_text.cpp +1 -0
- esphome/components/mqtt/mqtt_text_sensor.cpp +3 -1
- esphome/components/mqtt/mqtt_time.cpp +4 -3
- esphome/components/mqtt/mqtt_update.cpp +1 -0
- esphome/components/mqtt/mqtt_valve.cpp +3 -1
- esphome/components/ms8607/ms8607.cpp +1 -1
- 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 +9 -1
- esphome/components/online_image/online_image.cpp +17 -7
- esphome/components/online_image/online_image.h +10 -2
- esphome/components/opentherm/opentherm.cpp +7 -12
- esphome/components/opentherm/output/output.cpp +1 -1
- 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.cpp +2 -2
- 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 +81 -21
- 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 +318 -436
- 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 +164 -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 +169 -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 +156 -22
- 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 +165 -105
- 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/platformio_api.py +2 -0
- esphome/wizard.py +17 -4
- esphome/writer.py +44 -3
- esphome/yaml_util.py +0 -2
- {esphome-2025.6.3.dist-info → esphome-2025.7.0.dist-info}/METADATA +10 -9
- {esphome-2025.6.3.dist-info → esphome-2025.7.0.dist-info}/RECORD +637 -578
- 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.0.dist-info}/WHEEL +0 -0
- {esphome-2025.6.3.dist-info → esphome-2025.7.0.dist-info}/entry_points.txt +0 -0
- {esphome-2025.6.3.dist-info → esphome-2025.7.0.dist-info}/licenses/LICENSE +0 -0
- {esphome-2025.6.3.dist-info → esphome-2025.7.0.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
|
|
|
@@ -30,102 +33,83 @@ class APIConnection : public APIServerConnection {
|
|
|
30
33
|
|
|
31
34
|
bool send_list_info_done() {
|
|
32
35
|
return this->schedule_message_(nullptr, &APIConnection::try_send_list_info_done,
|
|
33
|
-
ListEntitiesDoneResponse::MESSAGE_TYPE);
|
|
36
|
+
ListEntitiesDoneResponse::MESSAGE_TYPE, ListEntitiesDoneResponse::ESTIMATED_SIZE);
|
|
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,30 +179,35 @@ 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 {
|
|
215
195
|
// TODO
|
|
216
196
|
return {};
|
|
217
197
|
}
|
|
198
|
+
#ifdef USE_API_SERVICES
|
|
218
199
|
void execute_service(const ExecuteServiceRequest &msg) override;
|
|
200
|
+
#endif
|
|
219
201
|
#ifdef USE_API_NOISE
|
|
220
202
|
NoiseEncryptionSetKeyResponse noise_encryption_set_key(const NoiseEncryptionSetKeyRequest &msg) override;
|
|
221
203
|
#endif
|
|
222
204
|
|
|
223
|
-
bool is_authenticated() override {
|
|
205
|
+
bool is_authenticated() override {
|
|
206
|
+
return static_cast<ConnectionState>(this->flags_.connection_state) == ConnectionState::AUTHENTICATED;
|
|
207
|
+
}
|
|
224
208
|
bool is_connection_setup() override {
|
|
225
|
-
return this->
|
|
209
|
+
return static_cast<ConnectionState>(this->flags_.connection_state) == ConnectionState::CONNECTED ||
|
|
210
|
+
this->is_authenticated();
|
|
226
211
|
}
|
|
227
212
|
void on_fatal_error() override;
|
|
228
213
|
void on_unauthenticated_access() override;
|
|
@@ -273,9 +258,15 @@ class APIConnection : public APIServerConnection {
|
|
|
273
258
|
}
|
|
274
259
|
|
|
275
260
|
bool try_to_clear_buffer(bool log_out_of_space);
|
|
276
|
-
bool send_buffer(ProtoWriteBuffer buffer,
|
|
261
|
+
bool send_buffer(ProtoWriteBuffer buffer, uint8_t message_type) override;
|
|
277
262
|
|
|
278
|
-
std::string get_client_combined_info() const {
|
|
263
|
+
std::string get_client_combined_info() const {
|
|
264
|
+
if (this->client_info_ == this->client_peername_) {
|
|
265
|
+
// Before Hello message, both are the same (just IP:port)
|
|
266
|
+
return this->client_info_;
|
|
267
|
+
}
|
|
268
|
+
return this->client_info_ + " (" + this->client_peername_ + ")";
|
|
269
|
+
}
|
|
279
270
|
|
|
280
271
|
// Buffer allocator methods for batch processing
|
|
281
272
|
ProtoWriteBuffer allocate_single_message_buffer(uint16_t size);
|
|
@@ -295,17 +286,42 @@ class APIConnection : public APIServerConnection {
|
|
|
295
286
|
response.icon = entity->get_icon();
|
|
296
287
|
response.disabled_by_default = entity->is_disabled_by_default();
|
|
297
288
|
response.entity_category = static_cast<enums::EntityCategory>(entity->get_entity_category());
|
|
289
|
+
#ifdef USE_DEVICES
|
|
290
|
+
response.device_id = entity->get_device_id();
|
|
291
|
+
#endif
|
|
298
292
|
}
|
|
299
293
|
|
|
300
294
|
// Helper function to fill common entity state fields
|
|
301
295
|
static void fill_entity_state_base(esphome::EntityBase *entity, StateResponseProtoMessage &response) {
|
|
302
296
|
response.key = entity->get_object_id_hash();
|
|
297
|
+
#ifdef USE_DEVICES
|
|
298
|
+
response.device_id = entity->get_device_id();
|
|
299
|
+
#endif
|
|
303
300
|
}
|
|
304
301
|
|
|
305
302
|
// Non-template helper to encode any ProtoMessage
|
|
306
|
-
static uint16_t encode_message_to_buffer(ProtoMessage &msg,
|
|
303
|
+
static uint16_t encode_message_to_buffer(ProtoMessage &msg, uint8_t message_type, APIConnection *conn,
|
|
307
304
|
uint32_t remaining_size, bool is_single);
|
|
308
305
|
|
|
306
|
+
#ifdef USE_VOICE_ASSISTANT
|
|
307
|
+
// Helper to check voice assistant validity and connection ownership
|
|
308
|
+
inline bool check_voice_assistant_api_connection_() const;
|
|
309
|
+
#endif
|
|
310
|
+
|
|
311
|
+
// Helper method to process multiple entities from an iterator in a batch
|
|
312
|
+
template<typename Iterator> void process_iterator_batch_(Iterator &iterator) {
|
|
313
|
+
size_t initial_size = this->deferred_batch_.size();
|
|
314
|
+
while (!iterator.completed() && (this->deferred_batch_.size() - initial_size) < MAX_INITIAL_PER_BATCH) {
|
|
315
|
+
iterator.advance();
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
// If the batch is full, process it immediately
|
|
319
|
+
// Note: iterator.advance() already calls schedule_batch_() via schedule_message_()
|
|
320
|
+
if (this->deferred_batch_.size() >= MAX_INITIAL_PER_BATCH) {
|
|
321
|
+
this->process_batch_();
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
|
|
309
325
|
#ifdef USE_BINARY_SENSOR
|
|
310
326
|
static uint16_t try_send_binary_sensor_state(EntityBase *entity, APIConnection *conn, uint32_t remaining_size,
|
|
311
327
|
bool is_single);
|
|
@@ -416,7 +432,7 @@ class APIConnection : public APIServerConnection {
|
|
|
416
432
|
static uint16_t try_send_update_info(EntityBase *entity, APIConnection *conn, uint32_t remaining_size,
|
|
417
433
|
bool is_single);
|
|
418
434
|
#endif
|
|
419
|
-
#ifdef
|
|
435
|
+
#ifdef USE_CAMERA
|
|
420
436
|
static uint16_t try_send_camera_info(EntityBase *entity, APIConnection *conn, uint32_t remaining_size,
|
|
421
437
|
bool is_single);
|
|
422
438
|
#endif
|
|
@@ -429,127 +445,82 @@ class APIConnection : public APIServerConnection {
|
|
|
429
445
|
static uint16_t try_send_disconnect_request(EntityBase *entity, APIConnection *conn, uint32_t remaining_size,
|
|
430
446
|
bool is_single);
|
|
431
447
|
|
|
432
|
-
//
|
|
433
|
-
static uint16_t
|
|
434
|
-
|
|
435
|
-
enum class ConnectionState {
|
|
436
|
-
WAITING_FOR_HELLO,
|
|
437
|
-
CONNECTED,
|
|
438
|
-
AUTHENTICATED,
|
|
439
|
-
} connection_state_{ConnectionState::WAITING_FOR_HELLO};
|
|
448
|
+
// Batch message method for ping requests
|
|
449
|
+
static uint16_t try_send_ping_request(EntityBase *entity, APIConnection *conn, uint32_t remaining_size,
|
|
450
|
+
bool is_single);
|
|
440
451
|
|
|
441
|
-
|
|
452
|
+
// === Optimal member ordering for 32-bit systems ===
|
|
442
453
|
|
|
454
|
+
// Group 1: Pointers (4 bytes each on 32-bit)
|
|
443
455
|
std::unique_ptr<APIFrameHelper> helper_;
|
|
456
|
+
APIServer *parent_;
|
|
457
|
+
|
|
458
|
+
// Group 2: Larger objects (must be 4-byte aligned)
|
|
459
|
+
// These contain vectors/pointers internally, so putting them early ensures good alignment
|
|
460
|
+
InitialStateIterator initial_state_iterator_;
|
|
461
|
+
ListEntitiesIterator list_entities_iterator_;
|
|
462
|
+
#ifdef USE_CAMERA
|
|
463
|
+
std::unique_ptr<camera::CameraImageReader> image_reader_;
|
|
464
|
+
#endif
|
|
444
465
|
|
|
466
|
+
// Group 3: Strings (12 bytes each on 32-bit, 4-byte aligned)
|
|
445
467
|
std::string client_info_;
|
|
446
468
|
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
469
|
|
|
454
|
-
|
|
455
|
-
int log_subscription_{ESPHOME_LOG_LEVEL_NONE};
|
|
470
|
+
// Group 4: 4-byte types
|
|
456
471
|
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
472
|
int state_subs_at_ = -1;
|
|
466
473
|
|
|
467
474
|
// Function pointer type for message encoding
|
|
468
475
|
using MessageCreatorPtr = uint16_t (*)(EntityBase *, APIConnection *, uint32_t remaining_size, bool is_single);
|
|
469
476
|
|
|
470
|
-
// Optimized MessageCreator class using union dispatch
|
|
471
477
|
class MessageCreator {
|
|
472
478
|
public:
|
|
473
|
-
// Constructor for function pointer
|
|
474
|
-
MessageCreator(MessageCreatorPtr ptr)
|
|
479
|
+
// Constructor for function pointer
|
|
480
|
+
MessageCreator(MessageCreatorPtr ptr) { data_.function_ptr = ptr; }
|
|
475
481
|
|
|
476
482
|
// Constructor for string state capture
|
|
477
|
-
MessageCreator(const std::string &
|
|
478
|
-
data_.string_ptr = new std::string(value);
|
|
479
|
-
}
|
|
483
|
+
explicit MessageCreator(const std::string &str_value) { data_.string_ptr = new std::string(str_value); }
|
|
480
484
|
|
|
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
|
-
}
|
|
485
|
+
// No destructor - cleanup must be called explicitly with message_type
|
|
488
486
|
|
|
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
|
-
}
|
|
487
|
+
// Delete copy operations - MessageCreator should only be moved
|
|
488
|
+
MessageCreator(const MessageCreator &other) = delete;
|
|
489
|
+
MessageCreator &operator=(const MessageCreator &other) = delete;
|
|
499
490
|
|
|
500
491
|
// 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
|
-
}
|
|
492
|
+
MessageCreator(MessageCreator &&other) noexcept : data_(other.data_) { other.data_.function_ptr = nullptr; }
|
|
525
493
|
|
|
494
|
+
// Move assignment
|
|
526
495
|
MessageCreator &operator=(MessageCreator &&other) noexcept {
|
|
527
496
|
if (this != &other) {
|
|
528
|
-
//
|
|
529
|
-
|
|
530
|
-
delete data_.string_ptr;
|
|
531
|
-
}
|
|
532
|
-
// Move data
|
|
533
|
-
message_type_ = other.message_type_;
|
|
497
|
+
// IMPORTANT: Caller must ensure cleanup() was called if this contains a string!
|
|
498
|
+
// In our usage, this happens in add_item() deduplication and vector::erase()
|
|
534
499
|
data_ = other.data_;
|
|
535
|
-
|
|
536
|
-
other.message_type_ = 0;
|
|
537
|
-
other.data_.ptr = nullptr;
|
|
500
|
+
other.data_.function_ptr = nullptr;
|
|
538
501
|
}
|
|
539
502
|
return *this;
|
|
540
503
|
}
|
|
541
504
|
|
|
542
|
-
// Call operator
|
|
543
|
-
uint16_t operator()(EntityBase *entity, APIConnection *conn, uint32_t remaining_size, bool is_single
|
|
505
|
+
// Call operator - uses message_type to determine union type
|
|
506
|
+
uint16_t operator()(EntityBase *entity, APIConnection *conn, uint32_t remaining_size, bool is_single,
|
|
507
|
+
uint8_t message_type) const;
|
|
508
|
+
|
|
509
|
+
// Manual cleanup method - must be called before destruction for string types
|
|
510
|
+
void cleanup(uint8_t message_type) {
|
|
511
|
+
#ifdef USE_EVENT
|
|
512
|
+
if (message_type == EventResponse::MESSAGE_TYPE && data_.string_ptr != nullptr) {
|
|
513
|
+
delete data_.string_ptr;
|
|
514
|
+
data_.string_ptr = nullptr;
|
|
515
|
+
}
|
|
516
|
+
#endif
|
|
517
|
+
}
|
|
544
518
|
|
|
545
519
|
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)
|
|
520
|
+
union Data {
|
|
521
|
+
MessageCreatorPtr function_ptr;
|
|
522
|
+
std::string *string_ptr;
|
|
523
|
+
} data_; // 4 bytes on 32-bit, 8 bytes on 64-bit - same as before
|
|
553
524
|
};
|
|
554
525
|
|
|
555
526
|
// Generic batching mechanism for both state updates and entity info
|
|
@@ -557,33 +528,96 @@ class APIConnection : public APIServerConnection {
|
|
|
557
528
|
struct BatchItem {
|
|
558
529
|
EntityBase *entity; // Entity pointer
|
|
559
530
|
MessageCreator creator; // Function that creates the message when needed
|
|
560
|
-
|
|
531
|
+
uint8_t message_type; // Message type for overhead calculation (max 255)
|
|
532
|
+
uint8_t estimated_size; // Estimated message size (max 255 bytes)
|
|
561
533
|
|
|
562
534
|
// Constructor for creating BatchItem
|
|
563
|
-
BatchItem(EntityBase *entity, MessageCreator creator,
|
|
564
|
-
: entity(entity), creator(std::move(creator)), message_type(message_type) {}
|
|
535
|
+
BatchItem(EntityBase *entity, MessageCreator creator, uint8_t message_type, uint8_t estimated_size)
|
|
536
|
+
: entity(entity), creator(std::move(creator)), message_type(message_type), estimated_size(estimated_size) {}
|
|
565
537
|
};
|
|
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
|
-
void add_item(EntityBase *entity, MessageCreator creator,
|
|
562
|
+
void add_item(EntityBase *entity, MessageCreator creator, uint8_t message_type, uint8_t estimated_size);
|
|
563
|
+
// Add item to the front of the batch (for high priority messages like ping)
|
|
564
|
+
void add_item_front(EntityBase *entity, MessageCreator creator, uint8_t message_type, uint8_t estimated_size);
|
|
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.
|
|
@@ -596,23 +630,72 @@ class APIConnection : public APIServerConnection {
|
|
|
596
630
|
// to send in one go. This is the maximum size of a single packet
|
|
597
631
|
// that can be sent over the network.
|
|
598
632
|
// This is to avoid fragmentation of the packet.
|
|
599
|
-
static constexpr size_t
|
|
633
|
+
static constexpr size_t MAX_BATCH_PACKET_SIZE = 1390; // MTU
|
|
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
|
+
}
|
|
641
|
+
|
|
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, uint8_t message_type) {
|
|
645
|
+
this->flags_.log_only_mode = true;
|
|
646
|
+
creator(entity, this, MAX_BATCH_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
|
|
603
655
|
|
|
604
|
-
//
|
|
605
|
-
bool
|
|
656
|
+
// Helper method to send a message either immediately or via batching
|
|
657
|
+
bool send_message_smart_(EntityBase *entity, MessageCreatorPtr creator, uint8_t message_type,
|
|
658
|
+
uint8_t estimated_size) {
|
|
659
|
+
// Try to send immediately if:
|
|
660
|
+
// 1. We should try to send immediately (should_try_send_immediately = true)
|
|
661
|
+
// 2. Batch delay is 0 (user has opted in to immediate sending)
|
|
662
|
+
// 3. Buffer has space available
|
|
663
|
+
if (this->flags_.should_try_send_immediately && this->get_batch_delay_ms_() == 0 &&
|
|
664
|
+
this->helper_->can_write_without_blocking()) {
|
|
665
|
+
// Now actually encode and send
|
|
666
|
+
if (creator(entity, this, MAX_BATCH_PACKET_SIZE, true) &&
|
|
667
|
+
this->send_buffer(ProtoWriteBuffer{&this->parent_->get_shared_buffer_ref()}, message_type)) {
|
|
668
|
+
#ifdef HAS_PROTO_MESSAGE_DUMP
|
|
669
|
+
// Log the message in verbose mode
|
|
670
|
+
this->log_proto_message_(entity, MessageCreator(creator), message_type);
|
|
671
|
+
#endif
|
|
672
|
+
return true;
|
|
673
|
+
}
|
|
674
|
+
|
|
675
|
+
// If immediate send failed, fall through to batching
|
|
676
|
+
}
|
|
677
|
+
|
|
678
|
+
// Fall back to scheduled batching
|
|
679
|
+
return this->schedule_message_(entity, creator, message_type, estimated_size);
|
|
680
|
+
}
|
|
606
681
|
|
|
607
682
|
// Helper function to schedule a deferred message with known message type
|
|
608
|
-
bool schedule_message_(EntityBase *entity, MessageCreator creator,
|
|
609
|
-
this->deferred_batch_.add_item(entity, std::move(creator), message_type);
|
|
683
|
+
bool schedule_message_(EntityBase *entity, MessageCreator creator, uint8_t message_type, uint8_t estimated_size) {
|
|
684
|
+
this->deferred_batch_.add_item(entity, std::move(creator), message_type, estimated_size);
|
|
610
685
|
return this->schedule_batch_();
|
|
611
686
|
}
|
|
612
687
|
|
|
613
688
|
// Overload for function pointers (for info messages and current state reads)
|
|
614
|
-
bool schedule_message_(EntityBase *entity, MessageCreatorPtr function_ptr,
|
|
615
|
-
|
|
689
|
+
bool schedule_message_(EntityBase *entity, MessageCreatorPtr function_ptr, uint8_t message_type,
|
|
690
|
+
uint8_t estimated_size) {
|
|
691
|
+
return schedule_message_(entity, MessageCreator(function_ptr), message_type, estimated_size);
|
|
692
|
+
}
|
|
693
|
+
|
|
694
|
+
// Helper function to schedule a high priority message at the front of the batch
|
|
695
|
+
bool schedule_message_front_(EntityBase *entity, MessageCreatorPtr function_ptr, uint8_t message_type,
|
|
696
|
+
uint8_t estimated_size) {
|
|
697
|
+
this->deferred_batch_.add_item_front(entity, MessageCreator(function_ptr), message_type, estimated_size);
|
|
698
|
+
return this->schedule_batch_();
|
|
616
699
|
}
|
|
617
700
|
};
|
|
618
701
|
|