esphome 2025.5.2__py3-none-any.whl → 2025.6.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 +20 -14
- esphome/components/a4988/a4988.cpp +1 -1
- esphome/components/absolute_humidity/absolute_humidity.cpp +6 -4
- esphome/components/ac_dimmer/ac_dimmer.cpp +4 -2
- esphome/components/adc/adc_sensor_esp32.cpp +5 -3
- esphome/components/adc/adc_sensor_esp8266.cpp +5 -3
- esphome/components/adc/adc_sensor_libretiny.cpp +5 -3
- esphome/components/adc/adc_sensor_rp2040.cpp +5 -3
- esphome/components/adc128s102/adc128s102.cpp +1 -1
- esphome/components/ade7880/ade7880.cpp +28 -17
- esphome/components/ade7953_base/ade7953_base.cpp +12 -9
- esphome/components/ade7953_i2c/ade7953_i2c.cpp +1 -1
- esphome/components/ade7953_spi/ade7953_spi.cpp +1 -1
- esphome/components/ads1115/ads1115.cpp +3 -5
- esphome/components/ads1118/ads1118.cpp +2 -1
- esphome/components/ags10/ags10.cpp +3 -2
- esphome/components/aht10/aht10.cpp +27 -29
- esphome/components/aic3204/aic3204.cpp +2 -2
- esphome/components/alarm_control_panel/__init__.py +1 -0
- esphome/components/am2315c/am2315c.cpp +2 -2
- esphome/components/am2320/am2320.cpp +2 -2
- esphome/components/am43/am43_base.h +1 -1
- esphome/components/am43/cover/am43_cover.cpp +4 -2
- esphome/components/analog_threshold/analog_threshold_binary_sensor.cpp +4 -2
- esphome/components/apds9306/apds9306.cpp +8 -5
- esphome/components/apds9960/apds9960.cpp +2 -2
- esphome/components/api/__init__.py +5 -0
- esphome/components/api/api_connection.cpp +712 -358
- esphome/components/api/api_connection.h +343 -284
- esphome/components/api/api_frame_helper.cpp +349 -344
- esphome/components/api/api_frame_helper.h +121 -94
- esphome/components/api/api_pb2.cpp +2 -0
- esphome/components/api/api_pb2.h +637 -1
- esphome/components/api/api_pb2_service.cpp +12 -688
- esphome/components/api/api_pb2_service.h +53 -207
- esphome/components/api/api_server.cpp +71 -29
- esphome/components/api/api_server.h +9 -0
- esphome/components/api/client.py +5 -2
- esphome/components/api/homeassistant_service.h +1 -1
- esphome/components/api/list_entities.cpp +1 -1
- esphome/components/api/proto.cpp +1 -0
- esphome/components/api/proto.h +4 -3
- esphome/components/api/subscribe_state.cpp +8 -16
- esphome/components/as3935/as3935.cpp +3 -3
- esphome/components/as5600/as5600.cpp +9 -7
- esphome/components/as7341/as7341.cpp +7 -5
- esphome/components/at581x/at581x.cpp +13 -10
- esphome/components/atm90e26/atm90e26.cpp +2 -2
- esphome/components/atm90e32/atm90e32.cpp +3 -3
- esphome/components/axs15231/touchscreen/axs15231_touchscreen.cpp +5 -3
- esphome/components/bang_bang/bang_bang_climate.cpp +8 -5
- esphome/components/bedjet/bedjet_hub.cpp +6 -4
- esphome/components/beken_spi_led_strip/led_strip.cpp +11 -7
- esphome/components/bh1750/bh1750.cpp +2 -2
- esphome/components/binary_sensor/__init__.py +1 -0
- esphome/components/binary_sensor/automation.cpp +1 -2
- esphome/components/bl0906/bl0906.cpp +1 -1
- esphome/components/bl0942/bl0942.cpp +11 -8
- esphome/components/bl0942/sensor.py +1 -1
- esphome/components/ble_client/__init__.py +5 -1
- esphome/components/ble_client/output/ble_binary_output.cpp +6 -3
- esphome/components/ble_client/sensor/ble_sensor.cpp +9 -6
- esphome/components/ble_client/text_sensor/ble_text_sensor.cpp +8 -5
- esphome/components/bluetooth_proxy/__init__.py +5 -1
- esphome/components/bluetooth_proxy/bluetooth_connection.cpp +5 -5
- esphome/components/bluetooth_proxy/bluetooth_proxy.cpp +16 -14
- esphome/components/bme280_base/bme280_base.cpp +3 -3
- esphome/components/bme680/bme680.cpp +3 -3
- esphome/components/bme680/sensor.py +2 -2
- esphome/components/bme680_bsec/bme680_bsec.cpp +11 -7
- esphome/components/bme680_bsec/sensor.py +7 -3
- esphome/components/bme68x_bsec2/__init__.py +6 -5
- esphome/components/bme68x_bsec2/bme68x_bsec2.cpp +17 -13
- esphome/components/bme68x_bsec2/sensor.py +4 -4
- esphome/components/bme68x_bsec2_i2c/bme68x_bsec2_i2c.cpp +1 -0
- esphome/components/bmi160/bmi160.cpp +11 -11
- esphome/components/bmp085/bmp085.cpp +2 -2
- esphome/components/bmp280_base/bmp280_base.cpp +3 -3
- esphome/components/bmp3xx_base/bmp3xx_base.cpp +13 -13
- esphome/components/bmp581/bmp581.cpp +33 -27
- esphome/components/bp1658cj/bp1658cj.cpp +5 -3
- esphome/components/bp5758d/bp5758d.cpp +1 -1
- esphome/components/button/__init__.py +1 -0
- esphome/components/canbus/canbus.cpp +1 -1
- esphome/components/cap1188/cap1188.cpp +6 -4
- esphome/components/captive_portal/captive_portal.cpp +1 -1
- esphome/components/ccs811/ccs811.cpp +3 -2
- esphome/components/cd74hc4067/cd74hc4067.cpp +1 -1
- esphome/components/ch422g/ch422g.cpp +2 -2
- esphome/components/chsc6x/chsc6x_touchscreen.cpp +6 -4
- esphome/components/climate/__init__.py +1 -0
- esphome/components/climate/climate.cpp +12 -7
- esphome/components/climate/climate.h +1 -1
- esphome/components/climate_ir/climate_ir.cpp +7 -4
- esphome/components/cm1106/__init__.py +1 -0
- esphome/components/cm1106/cm1106.cpp +112 -0
- esphome/components/cm1106/cm1106.h +40 -0
- esphome/components/cm1106/sensor.py +72 -0
- esphome/components/const/__init__.py +1 -0
- esphome/components/cover/__init__.py +1 -0
- esphome/components/cs5460a/cs5460a.cpp +16 -11
- esphome/components/cse7761/cse7761.cpp +2 -2
- esphome/components/cse7766/cse7766.cpp +0 -5
- esphome/components/cse7766/cse7766.h +5 -1
- esphome/components/cst226/touchscreen/cst226_touchscreen.cpp +1 -1
- esphome/components/cst816/touchscreen/cst816_touchscreen.cpp +6 -3
- esphome/components/current_based/current_based_cover.cpp +4 -2
- esphome/components/dac7678/dac7678_output.cpp +4 -4
- esphome/components/dallas_temp/dallas_temp.cpp +2 -3
- esphome/components/daly_bms/daly_bms.cpp +2 -1
- esphome/components/dashboard_import/__init__.py +1 -2
- esphome/components/datetime/__init__.py +3 -1
- esphome/components/debug/debug_component.cpp +1 -1
- esphome/components/debug/debug_component.h +1 -1
- esphome/components/debug/debug_esp32.cpp +4 -2
- esphome/components/deep_sleep/deep_sleep_component.cpp +11 -5
- esphome/components/deep_sleep/deep_sleep_esp32.cpp +7 -5
- esphome/components/demo/__init__.py +206 -0
- esphome/components/demo/demo_alarm_control_panel.h +65 -0
- esphome/components/demo/demo_button.h +15 -0
- esphome/components/demo/demo_date.h +34 -0
- esphome/components/demo/demo_datetime.h +40 -0
- esphome/components/demo/demo_lock.h +17 -0
- esphome/components/demo/demo_select.h +15 -0
- esphome/components/demo/demo_text.h +18 -0
- esphome/components/demo/demo_time.h +34 -0
- esphome/components/demo/demo_valve.h +54 -0
- esphome/components/dfrobot_sen0395/commands.cpp +3 -3
- esphome/components/dht/dht.cpp +29 -50
- esphome/components/dht12/dht12.cpp +2 -2
- esphome/components/display/display.h +5 -3
- esphome/components/dps310/dps310.cpp +7 -5
- esphome/components/ds1307/ds1307.cpp +2 -2
- esphome/components/dsmr/dsmr.cpp +5 -3
- esphome/components/duty_cycle/duty_cycle_sensor.cpp +2 -2
- esphome/components/duty_time/duty_time_sensor.cpp +5 -3
- esphome/components/ee895/ee895.cpp +3 -3
- esphome/components/ektf2232/touchscreen/ektf2232.cpp +1 -1
- esphome/components/emc2101/emc2101.cpp +11 -9
- esphome/components/ens160_base/ens160_base.cpp +2 -2
- esphome/components/ens210/ens210.cpp +2 -2
- esphome/components/es7210/es7210.cpp +6 -4
- esphome/components/es7243e/es7243e.cpp +1 -1
- esphome/components/es8156/es8156.cpp +1 -1
- esphome/components/es8311/es8311.cpp +8 -6
- esphome/components/es8388/__init__.py +0 -0
- esphome/components/es8388/audio_dac.py +26 -0
- esphome/components/es8388/es8388.cpp +289 -0
- esphome/components/es8388/es8388.h +81 -0
- esphome/components/es8388/es8388_const.h +83 -0
- esphome/components/es8388/select/__init__.py +47 -0
- esphome/components/es8388/select/adc_input_mic_select.cpp +12 -0
- esphome/components/es8388/select/adc_input_mic_select.h +15 -0
- esphome/components/es8388/select/dac_output_select.cpp +12 -0
- esphome/components/es8388/select/dac_output_select.h +15 -0
- esphome/components/esp32/__init__.py +88 -20
- esphome/components/esp32/boards.py +208 -125
- esphome/components/esp32/const.py +6 -0
- esphome/components/esp32/gpio.py +14 -1
- esphome/components/esp32/gpio_esp32_c5.py +45 -0
- esphome/components/esp32/gpio_esp32_p4.py +43 -0
- esphome/components/esp32/preferences.cpp +7 -7
- esphome/components/esp32_ble/__init__.py +115 -0
- esphome/components/esp32_ble/ble.cpp +11 -9
- esphome/components/esp32_ble/ble_uuid.h +1 -1
- esphome/components/esp32_ble_client/ble_client_base.cpp +4 -2
- esphome/components/esp32_ble_server/__init__.py +4 -1
- esphome/components/esp32_ble_server/ble_characteristic.cpp +1 -0
- esphome/components/esp32_ble_server/ble_server.h +0 -1
- esphome/components/esp32_ble_tracker/__init__.py +6 -2
- esphome/components/esp32_ble_tracker/esp32_ble_tracker.cpp +12 -9
- esphome/components/esp32_camera/esp32_camera.cpp +35 -27
- esphome/components/esp32_camera_web_server/camera_web_server.cpp +4 -2
- esphome/components/esp32_dac/esp32_dac.cpp +2 -2
- esphome/components/esp32_improv/__init__.py +5 -1
- esphome/components/esp32_improv/esp32_improv_component.cpp +2 -2
- esphome/components/esp32_rmt_led_strip/led_strip.cpp +11 -7
- esphome/components/esp32_rmt_led_strip/light.py +5 -1
- esphome/components/esp32_touch/esp32_touch.cpp +12 -8
- esphome/components/esp8266/preferences.cpp +6 -6
- esphome/components/esp8266_pwm/esp8266_pwm.cpp +3 -3
- esphome/components/esp_ldo/__init__.py +91 -0
- esphome/components/esp_ldo/esp_ldo.cpp +43 -0
- esphome/components/esp_ldo/esp_ldo.h +43 -0
- esphome/components/esphome/ota/ota_esphome.cpp +15 -8
- esphome/components/ethernet/ethernet_component.cpp +38 -26
- esphome/components/ethernet/ethernet_component.h +1 -1
- esphome/components/event/__init__.py +1 -0
- esphome/components/exposure_notifications/exposure_notifications.cpp +1 -1
- esphome/components/ezo/ezo.cpp +1 -1
- esphome/components/ezo_pmp/ezo_pmp.cpp +1 -1
- esphome/components/factory_reset/button/factory_reset_button.cpp +1 -1
- esphome/components/factory_reset/switch/factory_reset_switch.cpp +1 -1
- esphome/components/fan/__init__.py +1 -0
- esphome/components/fan/fan.cpp +4 -2
- esphome/components/fastled_base/fastled_light.cpp +7 -5
- esphome/components/fingerprint_grow/fingerprint_grow.cpp +8 -6
- esphome/components/fs3000/fs3000.cpp +1 -1
- esphome/components/ft5x06/touchscreen/ft5x06_touchscreen.cpp +7 -4
- esphome/components/ft63x6/ft63x6.cpp +5 -3
- esphome/components/gcja5/gcja5.cpp +0 -12
- esphome/components/gcja5/gcja5.h +8 -3
- esphome/components/gdk101/gdk101.cpp +2 -2
- esphome/components/globals/globals_component.h +13 -10
- esphome/components/gp2y1010au0f/gp2y1010au0f.cpp +4 -2
- esphome/components/gp8403/gp8403.cpp +4 -2
- esphome/components/gp8403/output/gp8403_output.cpp +4 -2
- esphome/components/gpio/one_wire/gpio_one_wire.cpp +2 -2
- esphome/components/gpio/output/gpio_binary_output.cpp +1 -1
- esphome/components/gpio/switch/gpio_switch.cpp +1 -1
- esphome/components/graphical_display_menu/graphical_display_menu.cpp +12 -8
- esphome/components/grove_gas_mc_v2/grove_gas_mc_v2.cpp +5 -6
- esphome/components/grove_tb6612fng/grove_tb6612fng.cpp +1 -1
- esphome/components/grove_tb6612fng/grove_tb6612fng.h +1 -1
- esphome/components/growatt_solar/growatt_solar.cpp +6 -3
- esphome/components/gt911/touchscreen/gt911_touchscreen.cpp +1 -1
- esphome/components/haier/haier_base.cpp +2 -2
- esphome/components/haier/hon_climate.cpp +13 -6
- esphome/components/havells_solar/havells_solar.cpp +5 -2
- esphome/components/hbridge/switch/hbridge_switch.cpp +1 -1
- esphome/components/hdc1080/hdc1080.cpp +2 -2
- esphome/components/he60r/he60r.cpp +4 -2
- esphome/components/hlw8012/hlw8012.cpp +6 -4
- esphome/components/hm3301/hm3301.cpp +2 -2
- esphome/components/hmc5883l/hmc5883l.cpp +2 -2
- esphome/components/homeassistant/time/homeassistant_time.cpp +4 -2
- esphome/components/honeywell_hih_i2c/honeywell_hih.cpp +4 -4
- esphome/components/honeywellabp/honeywellabp.cpp +4 -2
- esphome/components/honeywellabp2_i2c/honeywellabp2.cpp +8 -6
- esphome/components/hte501/hte501.cpp +3 -2
- esphome/components/http_request/__init__.py +2 -2
- esphome/components/http_request/http_request.cpp +7 -5
- esphome/components/http_request/http_request_idf.cpp +4 -2
- esphome/components/http_request/ota/ota_http_request.cpp +1 -1
- esphome/components/htu21d/htu21d.cpp +2 -2
- esphome/components/htu31d/htu31d.cpp +2 -2
- esphome/components/hx711/hx711.cpp +2 -2
- esphome/components/hydreon_rgxx/hydreon_rgxx.cpp +5 -3
- esphome/components/hyt271/hyt271.cpp +2 -2
- esphome/components/i2c/i2c_bus_arduino.cpp +14 -11
- esphome/components/i2c/i2c_bus_esp_idf.cpp +13 -11
- esphome/components/i2s_audio/__init__.py +2 -0
- esphome/components/i2s_audio/i2s_audio.cpp +3 -4
- esphome/components/i2s_audio/i2s_audio.h +1 -1
- esphome/components/i2s_audio/media_player/__init__.py +1 -1
- esphome/components/i2s_audio/media_player/i2s_audio_media_player.cpp +5 -3
- esphome/components/i2s_audio/microphone/i2s_audio_microphone.cpp +1 -1
- esphome/components/i2s_audio/speaker/i2s_audio_speaker.cpp +1 -1
- esphome/components/iaqcore/iaqcore.cpp +3 -3
- esphome/components/ili9xxx/ili9xxx_display.cpp +12 -7
- esphome/components/ili9xxx/ili9xxx_display.h +1 -1
- esphome/components/image/image.cpp +1 -0
- esphome/components/ina219/ina219.cpp +2 -2
- esphome/components/ina226/ina226.cpp +8 -5
- esphome/components/ina260/ina260.cpp +1 -1
- esphome/components/ina2xx_base/ina2xx_base.cpp +13 -9
- esphome/components/ina3221/ina3221.cpp +2 -2
- esphome/components/inkplate6/display.py +12 -2
- esphome/components/inkplate6/inkplate.cpp +13 -9
- esphome/components/inkplate6/inkplate.h +7 -6
- esphome/components/integration/integration_sensor.cpp +1 -1
- esphome/components/internal_temperature/internal_temperature.cpp +4 -4
- esphome/components/json/json_util.cpp +4 -5
- esphome/components/kamstrup_kmp/kamstrup_kmp.cpp +1 -1
- esphome/components/key_collector/key_collector.cpp +4 -2
- esphome/components/kmeteriso/kmeteriso.cpp +2 -1
- esphome/components/kuntze/kuntze.cpp +4 -2
- esphome/components/lc709203f/__init__.py +1 -0
- esphome/components/lc709203f/lc709203f.cpp +299 -0
- esphome/components/lc709203f/lc709203f.h +55 -0
- esphome/components/lc709203f/sensor.py +93 -0
- esphome/components/lcd_base/lcd_display.cpp +2 -2
- esphome/components/lcd_gpio/gpio_lcd_display.cpp +5 -3
- esphome/components/lcd_menu/lcd_menu.cpp +6 -4
- esphome/components/lcd_pcf8574/pcf8574_display.cpp +6 -4
- esphome/components/ld2410/ld2410.cpp +6 -7
- esphome/components/ld2420/ld2420.cpp +9 -7
- esphome/components/ld2450/ld2450.cpp +6 -4
- esphome/components/ld2450/sensor.py +2 -2
- esphome/components/ledc/ledc_output.cpp +32 -28
- esphome/components/libretiny/const.py +1 -1
- esphome/components/libretiny/preferences.cpp +6 -7
- esphome/components/light/__init__.py +2 -1
- esphome/components/light/esp_hsv_color.h +1 -1
- esphome/components/light/light_state.cpp +9 -5
- esphome/components/light/light_transformer.h +1 -1
- esphome/components/lightwaverf/LwTx.cpp +1 -1
- esphome/components/lightwaverf/lightwaverf.cpp +1 -1
- esphome/components/lilygo_t5_47/touchscreen/lilygo_t5_47_touchscreen.cpp +1 -1
- esphome/components/lock/__init__.py +1 -0
- esphome/components/lock/lock.h +1 -1
- esphome/components/logger/__init__.py +6 -0
- esphome/components/logger/logger.cpp +9 -5
- esphome/components/logger/logger_esp32.cpp +5 -5
- esphome/components/ltr390/ltr390.cpp +8 -5
- esphome/components/ltr501/ltr501.cpp +19 -14
- esphome/components/ltr_als_ps/ltr_als_ps.cpp +20 -13
- esphome/components/lvgl/__init__.py +2 -2
- esphome/components/lvgl/automation.py +5 -4
- esphome/components/lvgl/defines.py +0 -2
- esphome/components/lvgl/lv_validation.py +1 -3
- esphome/components/lvgl/lvcode.py +7 -8
- esphome/components/lvgl/lvgl_esphome.cpp +26 -10
- esphome/components/lvgl/schemas.py +22 -23
- esphome/components/lvgl/trigger.py +8 -3
- esphome/components/lvgl/widgets/__init__.py +2 -2
- esphome/components/lvgl/widgets/canvas.py +9 -3
- esphome/components/lvgl/widgets/line.py +2 -1
- esphome/components/lvgl/widgets/tabview.py +7 -0
- esphome/components/m5stack_8angle/m5stack_8angle.cpp +3 -3
- esphome/components/matrix_keypad/matrix_keypad.cpp +2 -2
- esphome/components/max17043/max17043.cpp +2 -2
- esphome/components/max31855/max31855.cpp +2 -1
- esphome/components/max31856/max31856.cpp +9 -11
- esphome/components/max31865/max31865.cpp +6 -4
- esphome/components/max44009/max44009.cpp +2 -2
- esphome/components/max6675/max6675.cpp +1 -1
- esphome/components/max6956/max6956.cpp +5 -3
- esphome/components/max7219/max7219.cpp +8 -6
- esphome/components/max7219digit/automation.h +52 -0
- esphome/components/max7219digit/display.py +93 -1
- esphome/components/max7219digit/max7219digit.cpp +16 -13
- esphome/components/max9611/max9611.cpp +9 -6
- esphome/components/mcp23008/mcp23008.cpp +1 -1
- esphome/components/mcp23016/mcp23016.cpp +1 -1
- esphome/components/mcp23017/mcp23017.cpp +1 -1
- esphome/components/mcp23s08/mcp23s08.cpp +1 -1
- esphome/components/mcp23s17/mcp23s17.cpp +1 -1
- esphome/components/mcp3008/mcp3008.cpp +1 -1
- esphome/components/mcp3008/sensor/mcp3008_sensor.cpp +5 -3
- esphome/components/mcp3204/mcp3204.cpp +1 -1
- esphome/components/mcp4461/mcp4461.cpp +2 -2
- esphome/components/mcp4725/mcp4725.cpp +2 -2
- esphome/components/mcp4728/mcp4728.cpp +2 -2
- esphome/components/mcp9600/mcp9600.cpp +1 -1
- esphome/components/mcp9808/mcp9808.cpp +4 -4
- esphome/components/mdns/mdns_component.cpp +8 -2
- esphome/components/mdns/mdns_component.h +3 -1
- esphome/components/mdns/mdns_esp32.cpp +2 -2
- esphome/components/media_player/__init__.py +1 -0
- esphome/components/micro_wake_word/micro_wake_word.cpp +1 -1
- esphome/components/micro_wake_word/streaming_model.cpp +10 -6
- esphome/components/micronova/micronova.h +2 -2
- esphome/components/mics_4514/mics_4514.cpp +2 -2
- esphome/components/midea/air_conditioner.cpp +7 -5
- esphome/components/midea_ir/midea_ir.cpp +1 -1
- esphome/components/mipi_spi/mipi_spi.cpp +24 -15
- esphome/components/mixer/speaker/mixer_speaker.cpp +8 -4
- esphome/components/mlx90393/sensor_mlx90393.cpp +2 -2
- esphome/components/mlx90614/mlx90614.cpp +4 -3
- esphome/components/mmc5603/mmc5603.cpp +2 -2
- esphome/components/mmc5983/mmc5983.cpp +1 -1
- esphome/components/modbus/modbus.cpp +7 -5
- esphome/components/modbus_controller/modbus_controller.cpp +6 -4
- esphome/components/modbus_controller/output/modbus_output.cpp +10 -6
- esphome/components/modbus_controller/switch/__init__.py +6 -2
- esphome/components/modbus_controller/switch/modbus_switch.cpp +4 -0
- esphome/components/modbus_controller/switch/modbus_switch.h +3 -0
- esphome/components/mpl3115a2/mpl3115a2.cpp +3 -2
- esphome/components/mpr121/mpr121.cpp +2 -2
- esphome/components/mpu6050/mpu6050.cpp +6 -6
- esphome/components/mpu6886/mpu6886.cpp +6 -6
- esphome/components/mqtt/mqtt_alarm_control_panel.cpp +7 -3
- esphome/components/mqtt/mqtt_backend_esp32.cpp +1 -1
- esphome/components/mqtt/mqtt_client.cpp +31 -24
- esphome/components/mqtt/mqtt_component.cpp +2 -2
- esphome/components/mqtt/mqtt_cover.cpp +8 -4
- esphome/components/mqtt/mqtt_fan.cpp +12 -6
- esphome/components/mqtt/mqtt_valve.cpp +4 -2
- esphome/components/ms5611/ms5611.cpp +2 -2
- esphome/components/ms8607/ms8607.cpp +2 -2
- esphome/components/msa3xx/msa3xx.cpp +16 -12
- esphome/components/my9231/my9231.cpp +7 -5
- esphome/components/nau7802/nau7802.cpp +6 -4
- esphome/components/neopixelbus/neopixelbus_light.h +2 -2
- esphome/components/network/ip_address.h +1 -1
- esphome/components/network/util.cpp +13 -0
- esphome/components/nextion/base_component.py +2 -0
- esphome/components/nextion/binary_sensor/nextion_binarysensor.cpp +2 -3
- esphome/components/nextion/display.py +34 -22
- esphome/components/nextion/nextion.cpp +182 -143
- esphome/components/nextion/nextion.h +36 -0
- esphome/components/nextion/nextion_commands.cpp +3 -3
- esphome/components/nextion/nextion_upload_arduino.cpp +58 -61
- esphome/components/nextion/nextion_upload_idf.cpp +69 -72
- esphome/components/nextion/sensor/nextion_sensor.cpp +4 -4
- esphome/components/nextion/switch/nextion_switch.cpp +2 -2
- esphome/components/nextion/text_sensor/nextion_textsensor.cpp +2 -2
- esphome/components/nfc/nci_message.h +1 -1
- esphome/components/nfc/ndef_record.h +1 -1
- esphome/components/nfc/ndef_record_text.h +1 -1
- esphome/components/nfc/ndef_record_uri.h +1 -1
- esphome/components/nfc/nfc.h +1 -1
- esphome/components/nfc/nfc_tag.h +1 -1
- esphome/components/noblex/noblex.cpp +1 -1
- esphome/components/npi19/npi19.cpp +5 -7
- esphome/components/number/__init__.py +11 -0
- esphome/components/online_image/__init__.py +13 -1
- esphome/components/online_image/online_image.cpp +26 -4
- esphome/components/online_image/online_image.h +21 -4
- esphome/components/opentherm/generate.py +3 -3
- esphome/components/opentherm/hub.cpp +11 -7
- esphome/components/opentherm/number/number.cpp +5 -3
- esphome/components/opentherm/opentherm.h +1 -1
- esphome/components/opentherm/schema.py +13 -13
- esphome/components/opentherm/validate.py +1 -1
- esphome/components/openthread/__init__.py +146 -0
- esphome/components/openthread/const.py +10 -0
- esphome/components/openthread/openthread.cpp +206 -0
- esphome/components/openthread/openthread.h +68 -0
- esphome/components/openthread/openthread_esp.cpp +164 -0
- esphome/components/openthread/tlv.py +58 -0
- esphome/components/openthread_info/__init__.py +0 -0
- esphome/components/openthread_info/openthread_info_text_sensor.cpp +24 -0
- esphome/components/openthread_info/openthread_info_text_sensor.h +218 -0
- esphome/components/openthread_info/text_sensor.py +105 -0
- esphome/components/output/float_output.cpp +1 -1
- esphome/components/output/switch/output_switch.cpp +1 -1
- esphome/components/packet_transport/packet_transport.cpp +6 -4
- esphome/components/pca6416a/pca6416a.cpp +2 -2
- esphome/components/pca9554/pca9554.cpp +6 -4
- esphome/components/pca9685/pca9685_output.cpp +12 -8
- esphome/components/pcd8544/pcd_8544.cpp +1 -1
- esphome/components/pcf85063/pcf85063.cpp +2 -2
- esphome/components/pcf8563/pcf8563.cpp +2 -2
- esphome/components/pcf8574/pcf8574.cpp +2 -2
- esphome/components/pid/pid_climate.cpp +8 -5
- esphome/components/pid/pid_climate.h +1 -1
- esphome/components/pid/sensor/pid_climate_sensor.cpp +1 -1
- esphome/components/pipsolar/output/pipsolar_output.cpp +1 -1
- esphome/components/pipsolar/pipsolar.cpp +3 -3
- esphome/components/pm1006/pm1006.cpp +3 -7
- esphome/components/pm1006/pm1006.h +4 -1
- esphome/components/pm2005/pm2005.cpp +12 -13
- esphome/components/pm2005/sensor.py +1 -1
- esphome/components/pmsa003i/pmsa003i.cpp +2 -2
- esphome/components/pmsx003/pmsx003.cpp +0 -4
- esphome/components/pmsx003/pmsx003.h +5 -2
- esphome/components/pmwcs3/pmwcs3.cpp +9 -13
- esphome/components/pmwcs3/pmwcs3.h +0 -1
- esphome/components/pn532/pn532.cpp +7 -7
- esphome/components/pn532/pn532.h +1 -1
- esphome/components/pn532_spi/pn532_spi.cpp +1 -1
- esphome/components/pn7150/pn7150.cpp +4 -4
- esphome/components/pn7160/pn7160.cpp +4 -4
- esphome/components/power_supply/power_supply.cpp +6 -4
- esphome/components/power_supply/power_supply.h +1 -1
- esphome/components/psram/__init__.py +59 -35
- esphome/components/pulse_counter/pulse_counter_sensor.cpp +7 -4
- esphome/components/pvvx_mithermometer/display/pvvx_display.cpp +8 -5
- esphome/components/pylontech/pylontech.cpp +2 -2
- esphome/components/pylontech/sensor/pylontech_sensor.cpp +4 -2
- esphome/components/pylontech/text_sensor/pylontech_text_sensor.cpp +4 -2
- esphome/components/pzemac/pzemac.cpp +4 -2
- esphome/components/pzemdc/pzemdc.cpp +4 -2
- esphome/components/qmc5883l/qmc5883l.cpp +2 -2
- esphome/components/qmp6988/qmp6988.cpp +2 -2
- esphome/components/qmp6988/qmp6988.h +1 -1
- esphome/components/qr_code/qr_code.cpp +5 -3
- esphome/components/qspi_dbi/qspi_dbi.cpp +1 -1
- esphome/components/qwiic_pir/qwiic_pir.cpp +26 -28
- esphome/components/rc522/rc522.cpp +5 -5
- esphome/components/rdm6300/rdm6300.cpp +1 -0
- esphome/components/remote_receiver/__init__.py +10 -2
- esphome/components/remote_receiver/remote_receiver_esp32.cpp +22 -12
- esphome/components/remote_receiver/remote_receiver_esp8266.cpp +10 -7
- esphome/components/remote_receiver/remote_receiver_libretiny.cpp +10 -7
- esphome/components/remote_transmitter/__init__.py +10 -2
- esphome/components/remote_transmitter/remote_transmitter_esp32.cpp +10 -6
- esphome/components/remote_transmitter/remote_transmitter_esp8266.cpp +5 -3
- esphome/components/remote_transmitter/remote_transmitter_libretiny.cpp +5 -3
- esphome/components/resistance/resistance_sensor.cpp +6 -3
- esphome/components/restart/button/restart_button.cpp +1 -1
- esphome/components/restart/switch/restart_switch.cpp +1 -1
- esphome/components/rotary_encoder/rotary_encoder.cpp +2 -2
- esphome/components/rp2040/__init__.py +7 -0
- esphome/components/rp2040/core.cpp +8 -1
- esphome/components/rp2040/preferences.cpp +3 -3
- esphome/components/rp2040_pio_led_strip/led_strip.cpp +11 -8
- esphome/components/rp2040_pio_led_strip/light.py +1 -1
- esphome/components/rp2040_pwm/rp2040_pwm.cpp +1 -1
- esphome/components/rpi_dpi_rgb/rpi_dpi_rgb.cpp +1 -1
- esphome/components/rtttl/rtttl.cpp +11 -9
- esphome/components/safe_mode/button/safe_mode_button.cpp +1 -1
- esphome/components/safe_mode/safe_mode.cpp +9 -8
- esphome/components/safe_mode/switch/safe_mode_switch.cpp +1 -1
- esphome/components/scd30/scd30.cpp +11 -8
- esphome/components/scd4x/scd4x.cpp +12 -8
- esphome/components/sdl/display.py +40 -0
- esphome/components/sdl/sdl_esphome.cpp +2 -2
- esphome/components/sdl/sdl_esphome.h +8 -0
- esphome/components/sdm_meter/sdm_meter.cpp +5 -2
- esphome/components/sdp3x/sdp3x.cpp +11 -11
- esphome/components/sds011/sds011.cpp +5 -6
- esphome/components/sds011/sds011.h +4 -1
- esphome/components/seeed_mr24hpc1/seeed_mr24hpc1.cpp +3 -2
- esphome/components/seeed_mr60bha2/seeed_mr60bha2.cpp +1 -0
- esphome/components/seeed_mr60fda2/seeed_mr60fda2.cpp +3 -2
- esphome/components/selec_meter/selec_meter.cpp +5 -2
- esphome/components/select/__init__.py +1 -0
- esphome/components/sen0321/sen0321.cpp +2 -2
- esphome/components/sen21231/sen21231.cpp +1 -1
- esphome/components/sen5x/sen5x.cpp +10 -7
- esphome/components/sensirion_common/i2c_sensirion.cpp +2 -1
- esphome/components/sensirion_common/i2c_sensirion.h +1 -0
- esphome/components/sensor/__init__.py +11 -1
- esphome/components/sensor/filter.h +1 -1
- esphome/components/sensor/sensor.h +9 -5
- esphome/components/servo/servo.cpp +12 -9
- esphome/components/servo/servo.h +1 -1
- esphome/components/sfa30/sfa30.cpp +1 -1
- esphome/components/sgp30/sgp30.cpp +10 -8
- esphome/components/sgp4x/sgp4x.cpp +49 -61
- esphome/components/sgp4x/sgp4x.h +0 -1
- esphome/components/shelly_dimmer/shelly_dimmer.cpp +11 -7
- esphome/components/sht3xd/sht3xd.cpp +1 -1
- esphome/components/sht4x/sht4x.cpp +2 -2
- esphome/components/shtcx/shtcx.cpp +13 -16
- esphome/components/shutdown/button/shutdown_button.cpp +1 -1
- esphome/components/shutdown/switch/shutdown_switch.cpp +1 -1
- esphome/components/sim800l/sim800l.cpp +2 -2
- esphome/components/slow_pwm/slow_pwm_output.cpp +4 -2
- esphome/components/sm16716/sm16716.cpp +1 -1
- esphome/components/sm2135/sm2135.cpp +1 -1
- esphome/components/sm2235/sm2235.cpp +5 -3
- esphome/components/sm2335/sm2335.cpp +5 -3
- esphome/components/sml/sml.cpp +1 -1
- esphome/components/sn74hc165/sn74hc165.cpp +1 -2
- esphome/components/sn74hc595/sn74hc595.cpp +1 -2
- esphome/components/sntp/sntp_component.cpp +1 -1
- esphome/components/socket/__init__.py +2 -0
- esphome/components/socket/bsd_sockets_impl.cpp +51 -7
- esphome/components/socket/lwip_raw_tcp_impl.cpp +5 -0
- esphome/components/socket/lwip_sockets_impl.cpp +51 -7
- esphome/components/socket/socket.cpp +31 -0
- esphome/components/socket/socket.h +27 -1
- esphome/components/sonoff_d1/sonoff_d1.cpp +7 -4
- esphome/components/sonoff_d1/sonoff_d1.h +2 -2
- esphome/components/sound_level/sound_level.cpp +4 -2
- esphome/components/speaker/media_player/__init__.py +3 -0
- esphome/components/speaker/media_player/speaker_media_player.cpp +1 -3
- esphome/components/speaker/media_player/speaker_media_player.h +6 -0
- esphome/components/spi/__init__.py +10 -2
- esphome/components/spi/spi.cpp +4 -4
- esphome/components/spi_device/spi_device.cpp +1 -2
- esphome/components/sprinkler/sprinkler.cpp +9 -6
- esphome/components/sps30/sps30.cpp +16 -15
- esphome/components/ssd1306_base/ssd1306_base.cpp +1 -1
- esphome/components/ssd1306_i2c/ssd1306_i2c.cpp +11 -8
- esphome/components/ssd1306_spi/ssd1306_spi.cpp +10 -7
- esphome/components/ssd1322_base/ssd1322_base.cpp +1 -1
- esphome/components/ssd1322_spi/ssd1322_spi.cpp +1 -1
- esphome/components/ssd1325_base/ssd1325_base.cpp +1 -1
- esphome/components/ssd1325_spi/ssd1325_spi.cpp +1 -1
- esphome/components/ssd1327_base/ssd1327_base.cpp +1 -1
- esphome/components/ssd1327_i2c/ssd1327_i2c.cpp +2 -2
- esphome/components/ssd1327_spi/ssd1327_spi.cpp +1 -1
- esphome/components/ssd1331_base/ssd1331_base.cpp +1 -1
- esphome/components/ssd1331_spi/ssd1331_spi.cpp +1 -1
- esphome/components/ssd1351_base/ssd1351_base.cpp +1 -1
- esphome/components/ssd1351_spi/ssd1351_spi.cpp +1 -1
- esphome/components/st7567_base/st7567_base.cpp +3 -3
- esphome/components/st7567_i2c/st7567_i2c.cpp +7 -5
- esphome/components/st7567_spi/st7567_spi.cpp +1 -1
- esphome/components/st7701s/st7701s.cpp +4 -2
- esphome/components/st7735/st7735.cpp +3 -3
- esphome/components/st7789v/st7789v.cpp +10 -7
- esphome/components/st7920/st7920.cpp +6 -4
- esphome/components/statsd/statsd.cpp +9 -5
- esphome/components/status_led/light/status_led_light.cpp +1 -1
- esphome/components/status_led/status_led.cpp +1 -1
- esphome/components/stepper/stepper.h +5 -3
- esphome/components/sts3x/sts3x.cpp +2 -2
- esphome/components/switch/__init__.py +1 -0
- esphome/components/switch/switch.cpp +18 -12
- esphome/components/switch/switch.h +1 -1
- esphome/components/sx1509/__init__.py +53 -20
- esphome/components/sx1509/sx1509.cpp +29 -5
- esphome/components/sx1509/sx1509.h +9 -1
- esphome/components/t6615/t6615.cpp +1 -0
- esphome/components/tc74/tc74.cpp +1 -1
- esphome/components/tca9548a/tca9548a.cpp +1 -1
- esphome/components/tca9555/tca9555.cpp +2 -2
- esphome/components/tcs34725/tcs34725.cpp +4 -4
- esphome/components/tee501/tee501.cpp +3 -2
- esphome/components/tem3200/tem3200.cpp +5 -6
- esphome/components/template/alarm_control_panel/__init__.py +6 -0
- esphome/components/template/alarm_control_panel/template_alarm_control_panel.cpp +38 -12
- esphome/components/template/alarm_control_panel/template_alarm_control_panel.h +3 -1
- esphome/components/template/cover/template_cover.cpp +1 -1
- esphome/components/template/select/template_select.cpp +6 -4
- esphome/components/template/text/template_text.cpp +2 -3
- esphome/components/template/valve/template_valve.cpp +5 -3
- esphome/components/text/__init__.py +10 -11
- esphome/components/text_sensor/__init__.py +1 -0
- esphome/components/thermostat/thermostat_climate.cpp +67 -43
- esphome/components/time/__init__.py +1 -2
- esphome/components/time_based/time_based_cover.cpp +4 -2
- esphome/components/tlc59208f/tlc59208f_output.cpp +8 -6
- esphome/components/tm1621/tm1621.cpp +3 -3
- esphome/components/tm1637/tm1637.cpp +9 -7
- esphome/components/tm1638/tm1638.cpp +7 -5
- esphome/components/tm1651/tm1651.cpp +2 -2
- esphome/components/tmp102/tmp102.cpp +1 -3
- esphome/components/tmp102/tmp102.h +0 -3
- esphome/components/tmp1075/tmp1075.cpp +12 -9
- esphome/components/tmp117/tmp117.cpp +2 -2
- esphome/components/tof10120/tof10120_sensor.cpp +2 -2
- esphome/components/tormatic/tormatic_cover.cpp +4 -2
- esphome/components/tsl2561/tsl2561.cpp +7 -5
- esphome/components/tsl2591/tsl2591.cpp +25 -27
- esphome/components/tt21100/touchscreen/tt21100.cpp +1 -1
- esphome/components/ttp229_bsf/ttp229_bsf.cpp +1 -1
- esphome/components/ttp229_lsf/ttp229_lsf.cpp +2 -2
- esphome/components/tuya/select/tuya_select.cpp +5 -3
- esphome/components/tx20/tx20.cpp +3 -3
- esphome/components/uart/__init__.py +4 -5
- esphome/components/uart/button/uart_button.cpp +1 -1
- esphome/components/uart/switch/uart_switch.cpp +2 -2
- esphome/components/uart/uart.cpp +2 -2
- esphome/components/uart/uart_component_esp32_arduino.cpp +8 -6
- esphome/components/uart/uart_component_esp8266.cpp +9 -7
- esphome/components/uart/uart_component_esp_idf.cpp +9 -7
- esphome/components/uart/uart_component_host.cpp +11 -8
- esphome/components/uart/uart_component_libretiny.cpp +8 -6
- esphome/components/uart/uart_component_rp2040.cpp +8 -6
- esphome/components/udp/udp_component.cpp +9 -5
- esphome/components/ufire_ec/ufire_ec.cpp +5 -3
- esphome/components/ufire_ise/ufire_ise.cpp +1 -1
- esphome/components/ultrasonic/ultrasonic_sensor.cpp +5 -3
- esphome/components/update/__init__.py +1 -0
- esphome/components/uponor_smatrix/climate/uponor_smatrix_climate.cpp +1 -1
- esphome/components/uponor_smatrix/sensor/uponor_smatrix_sensor.cpp +4 -2
- esphome/components/uponor_smatrix/uponor_smatrix.cpp +2 -1
- esphome/components/usb_host/__init__.py +64 -0
- esphome/components/usb_host/usb_host.h +116 -0
- esphome/components/usb_host/usb_host_client.cpp +394 -0
- esphome/components/usb_host/usb_host_component.cpp +35 -0
- esphome/components/usb_uart/__init__.py +134 -0
- esphome/components/usb_uart/ch34x.cpp +80 -0
- esphome/components/usb_uart/cp210x.cpp +126 -0
- esphome/components/usb_uart/usb_uart.cpp +328 -0
- esphome/components/usb_uart/usb_uart.h +151 -0
- esphome/components/valve/__init__.py +1 -0
- esphome/components/veml3235/veml3235.cpp +13 -9
- esphome/components/veml7700/veml7700.cpp +10 -6
- esphome/components/voice_assistant/voice_assistant.cpp +7 -7
- esphome/components/wake_on_lan/wake_on_lan.cpp +1 -1
- esphome/components/waveshare_epaper/waveshare_epaper.cpp +1 -1
- esphome/components/web_server/server_index_v2.h +632 -630
- esphome/components/web_server/server_index_v3.h +411 -409
- esphome/components/web_server/web_server.cpp +5 -3
- esphome/components/web_server_base/web_server_base.cpp +1 -1
- esphome/components/web_server_idf/utils.cpp +1 -1
- esphome/components/web_server_idf/web_server_idf.cpp +1 -1
- esphome/components/weikai/__init__.py +2 -0
- esphome/components/weikai/weikai.cpp +23 -21
- esphome/components/weikai_i2c/weikai_i2c.cpp +14 -9
- esphome/components/weikai_spi/weikai_spi.cpp +11 -6
- esphome/components/wiegand/wiegand.cpp +1 -1
- esphome/components/wifi/wifi_component.cpp +50 -37
- esphome/components/wifi/wifi_component.h +7 -4
- esphome/components/wifi/wifi_component_esp32_arduino.cpp +2 -2
- esphome/components/wifi/wifi_component_esp8266.cpp +3 -3
- esphome/components/wifi/wifi_component_libretiny.cpp +4 -4
- esphome/components/wireguard/wireguard.cpp +21 -21
- esphome/components/wl_134/text_sensor.py +1 -2
- esphome/components/wled/wled_light_effect.cpp +1 -1
- esphome/components/x9c/x9c.cpp +5 -3
- esphome/components/xgzp68xx/xgzp68xx.cpp +8 -6
- esphome/components/xiaomi_cgd1/xiaomi_cgd1.cpp +4 -2
- esphome/components/xiaomi_cgdk2/xiaomi_cgdk2.cpp +4 -2
- esphome/components/xiaomi_cgg1/xiaomi_cgg1.cpp +4 -2
- esphome/components/xiaomi_hhccjcy10/xiaomi_hhccjcy10.cpp +1 -1
- esphome/components/xiaomi_lywsd02mmc/xiaomi_lywsd02mmc.cpp +4 -2
- esphome/components/xiaomi_lywsd03mmc/xiaomi_lywsd03mmc.cpp +4 -2
- esphome/components/xiaomi_mhoc401/xiaomi_mhoc401.cpp +4 -2
- esphome/components/xl9535/xl9535.cpp +2 -2
- esphome/components/xpt2046/touchscreen/xpt2046.cpp +12 -11
- esphome/components/xpt2046/touchscreen/xpt2046.h +2 -2
- esphome/config.py +3 -2
- esphome/config_validation.py +46 -17
- esphome/const.py +10 -1
- esphome/core/__init__.py +37 -18
- esphome/core/application.cpp +188 -5
- esphome/core/application.h +110 -0
- esphome/core/component.h +13 -0
- esphome/core/config.py +12 -0
- esphome/core/defines.h +10 -2
- esphome/core/helpers.cpp +1 -1
- esphome/core/helpers.h +4 -4
- esphome/core/log.h +2 -0
- esphome/core/log_const_en.h +4 -0
- esphome/core/scheduler.cpp +2 -2
- esphome/coroutine.py +3 -4
- esphome/cpp_generator.py +32 -32
- esphome/dashboard/core.py +2 -2
- esphome/dashboard/web_server.py +2 -2
- esphome/git.py +4 -4
- esphome/helpers.py +5 -6
- esphome/loader.py +8 -7
- esphome/log.py +7 -1
- esphome/platformio_api.py +2 -3
- esphome/storage_json.py +13 -5
- esphome/types.py +12 -13
- esphome/util.py +1 -2
- esphome/writer.py +5 -3
- esphome/yaml_util.py +6 -1
- esphome/zeroconf.py +1 -1
- {esphome-2025.5.2.dist-info → esphome-2025.6.0b1.dist-info}/METADATA +12 -11
- {esphome-2025.5.2.dist-info → esphome-2025.6.0b1.dist-info}/RECORD +715 -662
- {esphome-2025.5.2.dist-info → esphome-2025.6.0b1.dist-info}/WHEEL +1 -1
- {esphome-2025.5.2.dist-info → esphome-2025.6.0b1.dist-info}/entry_points.txt +0 -0
- {esphome-2025.5.2.dist-info → esphome-2025.6.0b1.dist-info}/licenses/LICENSE +0 -0
- {esphome-2025.5.2.dist-info → esphome-2025.6.0b1.dist-info}/top_level.txt +0 -0
@@ -11,6 +11,7 @@
|
|
11
11
|
#include "esphome/core/entity_base.h"
|
12
12
|
|
13
13
|
#include <vector>
|
14
|
+
#include <functional>
|
14
15
|
|
15
16
|
namespace esphome {
|
16
17
|
namespace api {
|
@@ -18,49 +19,9 @@ namespace api {
|
|
18
19
|
// Keepalive timeout in milliseconds
|
19
20
|
static constexpr uint32_t KEEPALIVE_TIMEOUT_MS = 60000;
|
20
21
|
|
21
|
-
using send_message_t = bool (APIConnection::*)(void *);
|
22
|
-
|
23
|
-
/*
|
24
|
-
This class holds a pointer to the source component that wants to publish a message, and a pointer to a function that
|
25
|
-
will lazily publish that message. The two pointers allow dedup in the deferred queue if multiple publishes for the
|
26
|
-
same component are backed up, and take up only 8 bytes of memory. The entry in the deferred queue (a std::vector) is
|
27
|
-
the DeferredMessage instance itself (not a pointer to one elsewhere in heap) so still only 8 bytes per entry. Even
|
28
|
-
100 backed up messages (you'd have to have at least 100 sensors publishing because of dedup) would take up only 0.8
|
29
|
-
kB.
|
30
|
-
*/
|
31
|
-
class DeferredMessageQueue {
|
32
|
-
struct DeferredMessage {
|
33
|
-
friend class DeferredMessageQueue;
|
34
|
-
|
35
|
-
protected:
|
36
|
-
void *source_;
|
37
|
-
send_message_t send_message_;
|
38
|
-
|
39
|
-
public:
|
40
|
-
DeferredMessage(void *source, send_message_t send_message) : source_(source), send_message_(send_message) {}
|
41
|
-
bool operator==(const DeferredMessage &test) const {
|
42
|
-
return (source_ == test.source_ && send_message_ == test.send_message_);
|
43
|
-
}
|
44
|
-
} __attribute__((packed));
|
45
|
-
|
46
|
-
protected:
|
47
|
-
// vector is used very specifically for its zero memory overhead even though items are popped from the front (memory
|
48
|
-
// footprint is more important than speed here)
|
49
|
-
std::vector<DeferredMessage> deferred_queue_;
|
50
|
-
APIConnection *api_connection_;
|
51
|
-
|
52
|
-
// helper for allowing only unique entries in the queue
|
53
|
-
void dmq_push_back_with_dedup_(void *source, send_message_t send_message);
|
54
|
-
|
55
|
-
public:
|
56
|
-
DeferredMessageQueue(APIConnection *api_connection) : api_connection_(api_connection) {}
|
57
|
-
void process_queue();
|
58
|
-
void defer(void *source, send_message_t send_message);
|
59
|
-
bool empty() const { return deferred_queue_.empty(); }
|
60
|
-
};
|
61
|
-
|
62
22
|
class APIConnection : public APIServerConnection {
|
63
23
|
public:
|
24
|
+
friend class APIServer;
|
64
25
|
APIConnection(std::unique_ptr<socket::Socket> socket, APIServer *parent);
|
65
26
|
virtual ~APIConnection();
|
66
27
|
|
@@ -68,225 +29,105 @@ class APIConnection : public APIServerConnection {
|
|
68
29
|
void loop();
|
69
30
|
|
70
31
|
bool send_list_info_done() {
|
71
|
-
|
72
|
-
|
32
|
+
return this->schedule_message_(nullptr, &APIConnection::try_send_list_info_done,
|
33
|
+
ListEntitiesDoneResponse::MESSAGE_TYPE);
|
73
34
|
}
|
74
35
|
#ifdef USE_BINARY_SENSOR
|
75
|
-
bool send_binary_sensor_state(binary_sensor::BinarySensor *binary_sensor
|
36
|
+
bool send_binary_sensor_state(binary_sensor::BinarySensor *binary_sensor);
|
76
37
|
void send_binary_sensor_info(binary_sensor::BinarySensor *binary_sensor);
|
77
|
-
|
78
|
-
protected:
|
79
|
-
bool try_send_binary_sensor_state_(binary_sensor::BinarySensor *binary_sensor);
|
80
|
-
bool try_send_binary_sensor_state_(binary_sensor::BinarySensor *binary_sensor, bool state);
|
81
|
-
bool try_send_binary_sensor_info_(binary_sensor::BinarySensor *binary_sensor);
|
82
|
-
|
83
|
-
public:
|
84
38
|
#endif
|
85
39
|
#ifdef USE_COVER
|
86
40
|
bool send_cover_state(cover::Cover *cover);
|
87
41
|
void send_cover_info(cover::Cover *cover);
|
88
42
|
void cover_command(const CoverCommandRequest &msg) override;
|
89
|
-
|
90
|
-
protected:
|
91
|
-
bool try_send_cover_state_(cover::Cover *cover);
|
92
|
-
bool try_send_cover_info_(cover::Cover *cover);
|
93
|
-
|
94
|
-
public:
|
95
43
|
#endif
|
96
44
|
#ifdef USE_FAN
|
97
45
|
bool send_fan_state(fan::Fan *fan);
|
98
46
|
void send_fan_info(fan::Fan *fan);
|
99
47
|
void fan_command(const FanCommandRequest &msg) override;
|
100
|
-
|
101
|
-
protected:
|
102
|
-
bool try_send_fan_state_(fan::Fan *fan);
|
103
|
-
bool try_send_fan_info_(fan::Fan *fan);
|
104
|
-
|
105
|
-
public:
|
106
48
|
#endif
|
107
49
|
#ifdef USE_LIGHT
|
108
50
|
bool send_light_state(light::LightState *light);
|
109
51
|
void send_light_info(light::LightState *light);
|
110
52
|
void light_command(const LightCommandRequest &msg) override;
|
111
|
-
|
112
|
-
protected:
|
113
|
-
bool try_send_light_state_(light::LightState *light);
|
114
|
-
bool try_send_light_info_(light::LightState *light);
|
115
|
-
|
116
|
-
public:
|
117
53
|
#endif
|
118
54
|
#ifdef USE_SENSOR
|
119
|
-
bool send_sensor_state(sensor::Sensor *sensor
|
55
|
+
bool send_sensor_state(sensor::Sensor *sensor);
|
120
56
|
void send_sensor_info(sensor::Sensor *sensor);
|
121
|
-
|
122
|
-
protected:
|
123
|
-
bool try_send_sensor_state_(sensor::Sensor *sensor);
|
124
|
-
bool try_send_sensor_state_(sensor::Sensor *sensor, float state);
|
125
|
-
bool try_send_sensor_info_(sensor::Sensor *sensor);
|
126
|
-
|
127
|
-
public:
|
128
57
|
#endif
|
129
58
|
#ifdef USE_SWITCH
|
130
|
-
bool send_switch_state(switch_::Switch *a_switch
|
59
|
+
bool send_switch_state(switch_::Switch *a_switch);
|
131
60
|
void send_switch_info(switch_::Switch *a_switch);
|
132
61
|
void switch_command(const SwitchCommandRequest &msg) override;
|
133
|
-
|
134
|
-
protected:
|
135
|
-
bool try_send_switch_state_(switch_::Switch *a_switch);
|
136
|
-
bool try_send_switch_state_(switch_::Switch *a_switch, bool state);
|
137
|
-
bool try_send_switch_info_(switch_::Switch *a_switch);
|
138
|
-
|
139
|
-
public:
|
140
62
|
#endif
|
141
63
|
#ifdef USE_TEXT_SENSOR
|
142
|
-
bool send_text_sensor_state(text_sensor::TextSensor *text_sensor
|
64
|
+
bool send_text_sensor_state(text_sensor::TextSensor *text_sensor);
|
143
65
|
void send_text_sensor_info(text_sensor::TextSensor *text_sensor);
|
144
|
-
|
145
|
-
protected:
|
146
|
-
bool try_send_text_sensor_state_(text_sensor::TextSensor *text_sensor);
|
147
|
-
bool try_send_text_sensor_state_(text_sensor::TextSensor *text_sensor, std::string state);
|
148
|
-
bool try_send_text_sensor_info_(text_sensor::TextSensor *text_sensor);
|
149
|
-
|
150
|
-
public:
|
151
66
|
#endif
|
152
67
|
#ifdef USE_ESP32_CAMERA
|
153
68
|
void set_camera_state(std::shared_ptr<esp32_camera::CameraImage> image);
|
154
69
|
void send_camera_info(esp32_camera::ESP32Camera *camera);
|
155
70
|
void camera_image(const CameraImageRequest &msg) override;
|
156
|
-
|
157
|
-
protected:
|
158
|
-
bool try_send_camera_info_(esp32_camera::ESP32Camera *camera);
|
159
|
-
|
160
|
-
public:
|
161
71
|
#endif
|
162
72
|
#ifdef USE_CLIMATE
|
163
73
|
bool send_climate_state(climate::Climate *climate);
|
164
74
|
void send_climate_info(climate::Climate *climate);
|
165
75
|
void climate_command(const ClimateCommandRequest &msg) override;
|
166
|
-
|
167
|
-
protected:
|
168
|
-
bool try_send_climate_state_(climate::Climate *climate);
|
169
|
-
bool try_send_climate_info_(climate::Climate *climate);
|
170
|
-
|
171
|
-
public:
|
172
76
|
#endif
|
173
77
|
#ifdef USE_NUMBER
|
174
|
-
bool send_number_state(number::Number *number
|
78
|
+
bool send_number_state(number::Number *number);
|
175
79
|
void send_number_info(number::Number *number);
|
176
80
|
void number_command(const NumberCommandRequest &msg) override;
|
177
|
-
|
178
|
-
protected:
|
179
|
-
bool try_send_number_state_(number::Number *number);
|
180
|
-
bool try_send_number_state_(number::Number *number, float state);
|
181
|
-
bool try_send_number_info_(number::Number *number);
|
182
|
-
|
183
|
-
public:
|
184
81
|
#endif
|
185
82
|
#ifdef USE_DATETIME_DATE
|
186
83
|
bool send_date_state(datetime::DateEntity *date);
|
187
84
|
void send_date_info(datetime::DateEntity *date);
|
188
85
|
void date_command(const DateCommandRequest &msg) override;
|
189
|
-
|
190
|
-
protected:
|
191
|
-
bool try_send_date_state_(datetime::DateEntity *date);
|
192
|
-
bool try_send_date_info_(datetime::DateEntity *date);
|
193
|
-
|
194
|
-
public:
|
195
86
|
#endif
|
196
87
|
#ifdef USE_DATETIME_TIME
|
197
88
|
bool send_time_state(datetime::TimeEntity *time);
|
198
89
|
void send_time_info(datetime::TimeEntity *time);
|
199
90
|
void time_command(const TimeCommandRequest &msg) override;
|
200
|
-
|
201
|
-
protected:
|
202
|
-
bool try_send_time_state_(datetime::TimeEntity *time);
|
203
|
-
bool try_send_time_info_(datetime::TimeEntity *time);
|
204
|
-
|
205
|
-
public:
|
206
91
|
#endif
|
207
92
|
#ifdef USE_DATETIME_DATETIME
|
208
93
|
bool send_datetime_state(datetime::DateTimeEntity *datetime);
|
209
94
|
void send_datetime_info(datetime::DateTimeEntity *datetime);
|
210
95
|
void datetime_command(const DateTimeCommandRequest &msg) override;
|
211
|
-
|
212
|
-
protected:
|
213
|
-
bool try_send_datetime_state_(datetime::DateTimeEntity *datetime);
|
214
|
-
bool try_send_datetime_info_(datetime::DateTimeEntity *datetime);
|
215
|
-
|
216
|
-
public:
|
217
96
|
#endif
|
218
97
|
#ifdef USE_TEXT
|
219
|
-
bool send_text_state(text::Text *text
|
98
|
+
bool send_text_state(text::Text *text);
|
220
99
|
void send_text_info(text::Text *text);
|
221
100
|
void text_command(const TextCommandRequest &msg) override;
|
222
|
-
|
223
|
-
protected:
|
224
|
-
bool try_send_text_state_(text::Text *text);
|
225
|
-
bool try_send_text_state_(text::Text *text, std::string state);
|
226
|
-
bool try_send_text_info_(text::Text *text);
|
227
|
-
|
228
|
-
public:
|
229
101
|
#endif
|
230
102
|
#ifdef USE_SELECT
|
231
|
-
bool send_select_state(select::Select *select
|
103
|
+
bool send_select_state(select::Select *select);
|
232
104
|
void send_select_info(select::Select *select);
|
233
105
|
void select_command(const SelectCommandRequest &msg) override;
|
234
|
-
|
235
|
-
protected:
|
236
|
-
bool try_send_select_state_(select::Select *select);
|
237
|
-
bool try_send_select_state_(select::Select *select, std::string state);
|
238
|
-
bool try_send_select_info_(select::Select *select);
|
239
|
-
|
240
|
-
public:
|
241
106
|
#endif
|
242
107
|
#ifdef USE_BUTTON
|
243
108
|
void send_button_info(button::Button *button);
|
244
109
|
void button_command(const ButtonCommandRequest &msg) override;
|
245
|
-
|
246
|
-
protected:
|
247
|
-
bool try_send_button_info_(button::Button *button);
|
248
|
-
|
249
|
-
public:
|
250
110
|
#endif
|
251
111
|
#ifdef USE_LOCK
|
252
|
-
bool send_lock_state(lock::Lock *a_lock
|
112
|
+
bool send_lock_state(lock::Lock *a_lock);
|
253
113
|
void send_lock_info(lock::Lock *a_lock);
|
254
114
|
void lock_command(const LockCommandRequest &msg) override;
|
255
|
-
|
256
|
-
protected:
|
257
|
-
bool try_send_lock_state_(lock::Lock *a_lock);
|
258
|
-
bool try_send_lock_state_(lock::Lock *a_lock, lock::LockState state);
|
259
|
-
bool try_send_lock_info_(lock::Lock *a_lock);
|
260
|
-
|
261
|
-
public:
|
262
115
|
#endif
|
263
116
|
#ifdef USE_VALVE
|
264
117
|
bool send_valve_state(valve::Valve *valve);
|
265
118
|
void send_valve_info(valve::Valve *valve);
|
266
119
|
void valve_command(const ValveCommandRequest &msg) override;
|
267
|
-
|
268
|
-
protected:
|
269
|
-
bool try_send_valve_state_(valve::Valve *valve);
|
270
|
-
bool try_send_valve_info_(valve::Valve *valve);
|
271
|
-
|
272
|
-
public:
|
273
120
|
#endif
|
274
121
|
#ifdef USE_MEDIA_PLAYER
|
275
122
|
bool send_media_player_state(media_player::MediaPlayer *media_player);
|
276
123
|
void send_media_player_info(media_player::MediaPlayer *media_player);
|
277
124
|
void media_player_command(const MediaPlayerCommandRequest &msg) override;
|
278
|
-
|
279
|
-
protected:
|
280
|
-
bool try_send_media_player_state_(media_player::MediaPlayer *media_player);
|
281
|
-
bool try_send_media_player_info_(media_player::MediaPlayer *media_player);
|
282
|
-
|
283
|
-
public:
|
284
125
|
#endif
|
285
126
|
bool try_send_log_message(int level, const char *tag, const char *line);
|
286
127
|
void send_homeassistant_service_call(const HomeassistantServiceResponse &call) {
|
287
128
|
if (!this->service_call_subscription_)
|
288
129
|
return;
|
289
|
-
this->
|
130
|
+
this->send_message(call);
|
290
131
|
}
|
291
132
|
#ifdef USE_BLUETOOTH_PROXY
|
292
133
|
void subscribe_bluetooth_le_advertisements(const SubscribeBluetoothLEAdvertisementsRequest &msg) override;
|
@@ -308,7 +149,7 @@ class APIConnection : public APIServerConnection {
|
|
308
149
|
#ifdef USE_HOMEASSISTANT_TIME
|
309
150
|
void send_time_request() {
|
310
151
|
GetTimeRequest req;
|
311
|
-
this->
|
152
|
+
this->send_message(req);
|
312
153
|
}
|
313
154
|
#endif
|
314
155
|
|
@@ -328,36 +169,17 @@ class APIConnection : public APIServerConnection {
|
|
328
169
|
bool send_alarm_control_panel_state(alarm_control_panel::AlarmControlPanel *a_alarm_control_panel);
|
329
170
|
void send_alarm_control_panel_info(alarm_control_panel::AlarmControlPanel *a_alarm_control_panel);
|
330
171
|
void alarm_control_panel_command(const AlarmControlPanelCommandRequest &msg) override;
|
331
|
-
|
332
|
-
protected:
|
333
|
-
bool try_send_alarm_control_panel_state_(alarm_control_panel::AlarmControlPanel *a_alarm_control_panel);
|
334
|
-
bool try_send_alarm_control_panel_info_(alarm_control_panel::AlarmControlPanel *a_alarm_control_panel);
|
335
|
-
|
336
|
-
public:
|
337
172
|
#endif
|
338
173
|
|
339
174
|
#ifdef USE_EVENT
|
340
|
-
void send_event(event::Event *event, std::string event_type);
|
175
|
+
void send_event(event::Event *event, const std::string &event_type);
|
341
176
|
void send_event_info(event::Event *event);
|
342
|
-
|
343
|
-
protected:
|
344
|
-
bool try_send_event_(event::Event *event);
|
345
|
-
bool try_send_event_(event::Event *event, std::string event_type);
|
346
|
-
bool try_send_event_info_(event::Event *event);
|
347
|
-
|
348
|
-
public:
|
349
177
|
#endif
|
350
178
|
|
351
179
|
#ifdef USE_UPDATE
|
352
180
|
bool send_update_state(update::UpdateEntity *update);
|
353
181
|
void send_update_info(update::UpdateEntity *update);
|
354
182
|
void update_command(const UpdateCommandRequest &msg) override;
|
355
|
-
|
356
|
-
protected:
|
357
|
-
bool try_send_update_state_(update::UpdateEntity *update);
|
358
|
-
bool try_send_update_info_(update::UpdateEntity *update);
|
359
|
-
|
360
|
-
public:
|
361
183
|
#endif
|
362
184
|
|
363
185
|
void on_disconnect_response(const DisconnectResponse &value) override;
|
@@ -407,102 +229,67 @@ class APIConnection : public APIServerConnection {
|
|
407
229
|
void on_no_setup_connection() override;
|
408
230
|
ProtoWriteBuffer create_buffer(uint32_t reserve_size) override {
|
409
231
|
// FIXME: ensure no recursive writes can happen
|
410
|
-
|
232
|
+
|
411
233
|
// Get header padding size - used for both reserve and insert
|
412
234
|
uint8_t header_padding = this->helper_->frame_header_padding();
|
235
|
+
|
236
|
+
// Get shared buffer from parent server
|
237
|
+
std::vector<uint8_t> &shared_buf = this->parent_->get_shared_buffer_ref();
|
238
|
+
shared_buf.clear();
|
413
239
|
// Reserve space for header padding + message + footer
|
414
240
|
// - Header padding: space for protocol headers (7 bytes for Noise, 6 for Plaintext)
|
415
241
|
// - Footer: space for MAC (16 bytes for Noise, 0 for Plaintext)
|
416
|
-
|
242
|
+
shared_buf.reserve(reserve_size + header_padding + this->helper_->frame_footer_size());
|
417
243
|
// Insert header padding bytes so message encoding starts at the correct position
|
418
|
-
|
419
|
-
return {&
|
244
|
+
shared_buf.insert(shared_buf.begin(), header_padding, 0);
|
245
|
+
return {&shared_buf};
|
420
246
|
}
|
421
|
-
bool try_to_clear_buffer(bool log_out_of_space);
|
422
|
-
bool send_buffer(ProtoWriteBuffer buffer, uint32_t message_type) override;
|
423
247
|
|
424
|
-
|
425
|
-
|
426
|
-
|
427
|
-
|
428
|
-
|
429
|
-
|
430
|
-
|
431
|
-
|
432
|
-
|
433
|
-
|
434
|
-
|
435
|
-
|
436
|
-
|
437
|
-
|
438
|
-
|
439
|
-
|
440
|
-
|
441
|
-
|
442
|
-
|
443
|
-
|
248
|
+
// Prepare buffer for next message in batch
|
249
|
+
ProtoWriteBuffer prepare_message_buffer(uint16_t message_size, bool is_first_message) {
|
250
|
+
// Get reference to shared buffer (it maintains state between batch messages)
|
251
|
+
std::vector<uint8_t> &shared_buf = this->parent_->get_shared_buffer_ref();
|
252
|
+
size_t current_size = shared_buf.size();
|
253
|
+
|
254
|
+
if (is_first_message) {
|
255
|
+
// For first message, initialize buffer with header padding
|
256
|
+
uint8_t header_padding = this->helper_->frame_header_padding();
|
257
|
+
shared_buf.clear();
|
258
|
+
shared_buf.reserve(message_size + header_padding);
|
259
|
+
shared_buf.resize(header_padding);
|
260
|
+
// Fill header padding with zeros
|
261
|
+
std::fill(shared_buf.begin(), shared_buf.end(), 0);
|
262
|
+
} else {
|
263
|
+
// For subsequent messages, add footer space for previous message and header for this message
|
264
|
+
uint8_t footer_size = this->helper_->frame_footer_size();
|
265
|
+
uint8_t header_padding = this->helper_->frame_header_padding();
|
266
|
+
|
267
|
+
// Reserve additional space for everything
|
268
|
+
shared_buf.reserve(current_size + footer_size + header_padding + message_size);
|
269
|
+
|
270
|
+
// Single resize to add both footer and header padding
|
271
|
+
size_t new_size = current_size + footer_size + header_padding;
|
272
|
+
shared_buf.resize(new_size);
|
273
|
+
|
274
|
+
// Fill the newly added bytes with zeros (footer + header padding)
|
275
|
+
std::fill(shared_buf.begin() + current_size, shared_buf.end(), 0);
|
444
276
|
}
|
445
|
-
this->deferred_message_queue_.defer(entity, try_send_func);
|
446
|
-
return true;
|
447
|
-
}
|
448
277
|
|
449
|
-
|
450
|
-
* Send entity state method that handles explicit state values.
|
451
|
-
* Only attempts to build and send the message if the transmit buffer is available.
|
452
|
-
*
|
453
|
-
* This method accepts a state parameter to be used instead of the entity's current state.
|
454
|
-
* It attempts to send the state with the provided value first, and if that fails due to buffer constraints,
|
455
|
-
* it defers the entity for later processing using the entity-only function.
|
456
|
-
*
|
457
|
-
* @tparam EntityT The entity type
|
458
|
-
* @tparam StateT Type of the state parameter
|
459
|
-
* @tparam Args Additional argument types (if any)
|
460
|
-
* @param entity The entity to send state for
|
461
|
-
* @param try_send_entity_func The function that tries to send the state with entity pointer only
|
462
|
-
* @param try_send_state_func The function that tries to send the state with entity and state parameters
|
463
|
-
* @param state The state value to send
|
464
|
-
* @param args Additional arguments to pass to the try_send_state_func
|
465
|
-
* @return True on success or message deferred, false if subscription check failed
|
466
|
-
*/
|
467
|
-
template<typename EntityT, typename StateT, typename... Args>
|
468
|
-
bool send_state_with_value_(EntityT *entity, bool (APIConnection::*try_send_entity_func)(EntityT *),
|
469
|
-
bool (APIConnection::*try_send_state_func)(EntityT *, StateT, Args...), StateT state,
|
470
|
-
Args... args) {
|
471
|
-
if (!this->state_subscription_)
|
472
|
-
return false;
|
473
|
-
if (this->try_to_clear_buffer(true) && (this->*try_send_state_func)(entity, state, args...)) {
|
474
|
-
return true;
|
475
|
-
}
|
476
|
-
this->deferred_message_queue_.defer(entity, reinterpret_cast<send_message_t>(try_send_entity_func));
|
477
|
-
return true;
|
278
|
+
return {&shared_buf};
|
478
279
|
}
|
479
280
|
|
480
|
-
|
481
|
-
|
482
|
-
* Only attempts to build and send the message if the transmit buffer is available.
|
483
|
-
*
|
484
|
-
* @param entity The entity to send info for
|
485
|
-
* @param try_send_func The function that tries to send the info
|
486
|
-
*/
|
487
|
-
void send_info_(esphome::EntityBase *entity, send_message_t try_send_func) {
|
488
|
-
if (this->try_to_clear_buffer(true) && (this->*try_send_func)(entity)) {
|
489
|
-
return;
|
490
|
-
}
|
491
|
-
this->deferred_message_queue_.defer(entity, try_send_func);
|
492
|
-
}
|
281
|
+
bool try_to_clear_buffer(bool log_out_of_space);
|
282
|
+
bool send_buffer(ProtoWriteBuffer buffer, uint16_t message_type) override;
|
493
283
|
|
494
|
-
|
495
|
-
|
496
|
-
|
497
|
-
|
498
|
-
|
499
|
-
|
500
|
-
|
501
|
-
|
502
|
-
|
503
|
-
template<typename ResponseT>
|
504
|
-
bool try_send_entity_info_(esphome::EntityBase *entity, ResponseT &response,
|
505
|
-
bool (APIServerConnectionBase::*send_response_func)(const ResponseT &)) {
|
284
|
+
std::string get_client_combined_info() const { return this->client_combined_info_; }
|
285
|
+
|
286
|
+
// Buffer allocator methods for batch processing
|
287
|
+
ProtoWriteBuffer allocate_single_message_buffer(uint16_t size);
|
288
|
+
ProtoWriteBuffer allocate_batch_message_buffer(uint16_t size);
|
289
|
+
|
290
|
+
protected:
|
291
|
+
// Helper function to fill common entity fields
|
292
|
+
template<typename ResponseT> static void fill_entity_info_base(esphome::EntityBase *entity, ResponseT &response) {
|
506
293
|
// Set common fields that are shared by all entity types
|
507
294
|
response.key = entity->get_object_id_hash();
|
508
295
|
response.object_id = entity->get_object_id();
|
@@ -514,12 +301,137 @@ class APIConnection : public APIServerConnection {
|
|
514
301
|
response.icon = entity->get_icon();
|
515
302
|
response.disabled_by_default = entity->is_disabled_by_default();
|
516
303
|
response.entity_category = static_cast<enums::EntityCategory>(entity->get_entity_category());
|
517
|
-
|
518
|
-
// Send the response using the provided send method
|
519
|
-
return (this->*send_response_func)(response);
|
520
304
|
}
|
521
305
|
|
522
|
-
|
306
|
+
// Non-template helper to encode any ProtoMessage
|
307
|
+
static uint16_t encode_message_to_buffer(ProtoMessage &msg, uint16_t message_type, APIConnection *conn,
|
308
|
+
uint32_t remaining_size, bool is_single);
|
309
|
+
|
310
|
+
#ifdef USE_BINARY_SENSOR
|
311
|
+
static uint16_t try_send_binary_sensor_state(EntityBase *entity, APIConnection *conn, uint32_t remaining_size,
|
312
|
+
bool is_single);
|
313
|
+
static uint16_t try_send_binary_sensor_info(EntityBase *entity, APIConnection *conn, uint32_t remaining_size,
|
314
|
+
bool is_single);
|
315
|
+
#endif
|
316
|
+
#ifdef USE_COVER
|
317
|
+
static uint16_t try_send_cover_state(EntityBase *entity, APIConnection *conn, uint32_t remaining_size,
|
318
|
+
bool is_single);
|
319
|
+
static uint16_t try_send_cover_info(EntityBase *entity, APIConnection *conn, uint32_t remaining_size, bool is_single);
|
320
|
+
#endif
|
321
|
+
#ifdef USE_FAN
|
322
|
+
static uint16_t try_send_fan_state(EntityBase *entity, APIConnection *conn, uint32_t remaining_size, bool is_single);
|
323
|
+
static uint16_t try_send_fan_info(EntityBase *entity, APIConnection *conn, uint32_t remaining_size, bool is_single);
|
324
|
+
#endif
|
325
|
+
#ifdef USE_LIGHT
|
326
|
+
static uint16_t try_send_light_state(EntityBase *entity, APIConnection *conn, uint32_t remaining_size,
|
327
|
+
bool is_single);
|
328
|
+
static uint16_t try_send_light_info(EntityBase *entity, APIConnection *conn, uint32_t remaining_size, bool is_single);
|
329
|
+
#endif
|
330
|
+
#ifdef USE_SENSOR
|
331
|
+
static uint16_t try_send_sensor_state(EntityBase *entity, APIConnection *conn, uint32_t remaining_size,
|
332
|
+
bool is_single);
|
333
|
+
static uint16_t try_send_sensor_info(EntityBase *entity, APIConnection *conn, uint32_t remaining_size,
|
334
|
+
bool is_single);
|
335
|
+
#endif
|
336
|
+
#ifdef USE_SWITCH
|
337
|
+
static uint16_t try_send_switch_state(EntityBase *entity, APIConnection *conn, uint32_t remaining_size,
|
338
|
+
bool is_single);
|
339
|
+
static uint16_t try_send_switch_info(EntityBase *entity, APIConnection *conn, uint32_t remaining_size,
|
340
|
+
bool is_single);
|
341
|
+
#endif
|
342
|
+
#ifdef USE_TEXT_SENSOR
|
343
|
+
static uint16_t try_send_text_sensor_state(EntityBase *entity, APIConnection *conn, uint32_t remaining_size,
|
344
|
+
bool is_single);
|
345
|
+
static uint16_t try_send_text_sensor_info(EntityBase *entity, APIConnection *conn, uint32_t remaining_size,
|
346
|
+
bool is_single);
|
347
|
+
#endif
|
348
|
+
#ifdef USE_CLIMATE
|
349
|
+
static uint16_t try_send_climate_state(EntityBase *entity, APIConnection *conn, uint32_t remaining_size,
|
350
|
+
bool is_single);
|
351
|
+
static uint16_t try_send_climate_info(EntityBase *entity, APIConnection *conn, uint32_t remaining_size,
|
352
|
+
bool is_single);
|
353
|
+
#endif
|
354
|
+
#ifdef USE_NUMBER
|
355
|
+
static uint16_t try_send_number_state(EntityBase *entity, APIConnection *conn, uint32_t remaining_size,
|
356
|
+
bool is_single);
|
357
|
+
static uint16_t try_send_number_info(EntityBase *entity, APIConnection *conn, uint32_t remaining_size,
|
358
|
+
bool is_single);
|
359
|
+
#endif
|
360
|
+
#ifdef USE_DATETIME_DATE
|
361
|
+
static uint16_t try_send_date_state(EntityBase *entity, APIConnection *conn, uint32_t remaining_size, bool is_single);
|
362
|
+
static uint16_t try_send_date_info(EntityBase *entity, APIConnection *conn, uint32_t remaining_size, bool is_single);
|
363
|
+
#endif
|
364
|
+
#ifdef USE_DATETIME_TIME
|
365
|
+
static uint16_t try_send_time_state(EntityBase *entity, APIConnection *conn, uint32_t remaining_size, bool is_single);
|
366
|
+
static uint16_t try_send_time_info(EntityBase *entity, APIConnection *conn, uint32_t remaining_size, bool is_single);
|
367
|
+
#endif
|
368
|
+
#ifdef USE_DATETIME_DATETIME
|
369
|
+
static uint16_t try_send_datetime_state(EntityBase *entity, APIConnection *conn, uint32_t remaining_size,
|
370
|
+
bool is_single);
|
371
|
+
static uint16_t try_send_datetime_info(EntityBase *entity, APIConnection *conn, uint32_t remaining_size,
|
372
|
+
bool is_single);
|
373
|
+
#endif
|
374
|
+
#ifdef USE_TEXT
|
375
|
+
static uint16_t try_send_text_state(EntityBase *entity, APIConnection *conn, uint32_t remaining_size, bool is_single);
|
376
|
+
static uint16_t try_send_text_info(EntityBase *entity, APIConnection *conn, uint32_t remaining_size, bool is_single);
|
377
|
+
#endif
|
378
|
+
#ifdef USE_SELECT
|
379
|
+
static uint16_t try_send_select_state(EntityBase *entity, APIConnection *conn, uint32_t remaining_size,
|
380
|
+
bool is_single);
|
381
|
+
static uint16_t try_send_select_info(EntityBase *entity, APIConnection *conn, uint32_t remaining_size,
|
382
|
+
bool is_single);
|
383
|
+
#endif
|
384
|
+
#ifdef USE_BUTTON
|
385
|
+
static uint16_t try_send_button_info(EntityBase *entity, APIConnection *conn, uint32_t remaining_size,
|
386
|
+
bool is_single);
|
387
|
+
#endif
|
388
|
+
#ifdef USE_LOCK
|
389
|
+
static uint16_t try_send_lock_state(EntityBase *entity, APIConnection *conn, uint32_t remaining_size, bool is_single);
|
390
|
+
static uint16_t try_send_lock_info(EntityBase *entity, APIConnection *conn, uint32_t remaining_size, bool is_single);
|
391
|
+
#endif
|
392
|
+
#ifdef USE_VALVE
|
393
|
+
static uint16_t try_send_valve_state(EntityBase *entity, APIConnection *conn, uint32_t remaining_size,
|
394
|
+
bool is_single);
|
395
|
+
static uint16_t try_send_valve_info(EntityBase *entity, APIConnection *conn, uint32_t remaining_size, bool is_single);
|
396
|
+
#endif
|
397
|
+
#ifdef USE_MEDIA_PLAYER
|
398
|
+
static uint16_t try_send_media_player_state(EntityBase *entity, APIConnection *conn, uint32_t remaining_size,
|
399
|
+
bool is_single);
|
400
|
+
static uint16_t try_send_media_player_info(EntityBase *entity, APIConnection *conn, uint32_t remaining_size,
|
401
|
+
bool is_single);
|
402
|
+
#endif
|
403
|
+
#ifdef USE_ALARM_CONTROL_PANEL
|
404
|
+
static uint16_t try_send_alarm_control_panel_state(EntityBase *entity, APIConnection *conn, uint32_t remaining_size,
|
405
|
+
bool is_single);
|
406
|
+
static uint16_t try_send_alarm_control_panel_info(EntityBase *entity, APIConnection *conn, uint32_t remaining_size,
|
407
|
+
bool is_single);
|
408
|
+
#endif
|
409
|
+
#ifdef USE_EVENT
|
410
|
+
static uint16_t try_send_event_response(event::Event *event, const std::string &event_type, APIConnection *conn,
|
411
|
+
uint32_t remaining_size, bool is_single);
|
412
|
+
static uint16_t try_send_event_info(EntityBase *entity, APIConnection *conn, uint32_t remaining_size, bool is_single);
|
413
|
+
#endif
|
414
|
+
#ifdef USE_UPDATE
|
415
|
+
static uint16_t try_send_update_state(EntityBase *entity, APIConnection *conn, uint32_t remaining_size,
|
416
|
+
bool is_single);
|
417
|
+
static uint16_t try_send_update_info(EntityBase *entity, APIConnection *conn, uint32_t remaining_size,
|
418
|
+
bool is_single);
|
419
|
+
#endif
|
420
|
+
#ifdef USE_ESP32_CAMERA
|
421
|
+
static uint16_t try_send_camera_info(EntityBase *entity, APIConnection *conn, uint32_t remaining_size,
|
422
|
+
bool is_single);
|
423
|
+
#endif
|
424
|
+
|
425
|
+
// Method for ListEntitiesDone batching
|
426
|
+
static uint16_t try_send_list_info_done(EntityBase *entity, APIConnection *conn, uint32_t remaining_size,
|
427
|
+
bool is_single);
|
428
|
+
|
429
|
+
// Method for DisconnectRequest batching
|
430
|
+
static uint16_t try_send_disconnect_request(EntityBase *entity, APIConnection *conn, uint32_t remaining_size,
|
431
|
+
bool is_single);
|
432
|
+
|
433
|
+
// Helper function to get estimated message size for buffer pre-allocation
|
434
|
+
static uint16_t get_estimated_message_size(uint16_t message_type);
|
523
435
|
|
524
436
|
enum class ConnectionState {
|
525
437
|
WAITING_FOR_HELLO,
|
@@ -529,9 +441,6 @@ class APIConnection : public APIServerConnection {
|
|
529
441
|
|
530
442
|
bool remove_{false};
|
531
443
|
|
532
|
-
// Buffer used to encode proto messages
|
533
|
-
// Re-use to prevent allocations
|
534
|
-
std::vector<uint8_t> proto_write_buffer_;
|
535
444
|
std::unique_ptr<APIFrameHelper> helper_;
|
536
445
|
|
537
446
|
std::string client_info_;
|
@@ -552,10 +461,160 @@ class APIConnection : public APIServerConnection {
|
|
552
461
|
bool service_call_subscription_{false};
|
553
462
|
bool next_close_ = false;
|
554
463
|
APIServer *parent_;
|
555
|
-
DeferredMessageQueue deferred_message_queue_;
|
556
464
|
InitialStateIterator initial_state_iterator_;
|
557
465
|
ListEntitiesIterator list_entities_iterator_;
|
558
466
|
int state_subs_at_ = -1;
|
467
|
+
|
468
|
+
// Function pointer type for message encoding
|
469
|
+
using MessageCreatorPtr = uint16_t (*)(EntityBase *, APIConnection *, uint32_t remaining_size, bool is_single);
|
470
|
+
|
471
|
+
// Optimized MessageCreator class using union dispatch
|
472
|
+
class MessageCreator {
|
473
|
+
public:
|
474
|
+
// Constructor for function pointer (message_type = 0)
|
475
|
+
MessageCreator(MessageCreatorPtr ptr) : message_type_(0) { data_.ptr = ptr; }
|
476
|
+
|
477
|
+
// Constructor for string state capture
|
478
|
+
MessageCreator(const std::string &value, uint16_t msg_type) : message_type_(msg_type) {
|
479
|
+
data_.string_ptr = new std::string(value);
|
480
|
+
}
|
481
|
+
|
482
|
+
// Destructor
|
483
|
+
~MessageCreator() {
|
484
|
+
// Clean up string data for string-based message types
|
485
|
+
if (uses_string_data_()) {
|
486
|
+
delete data_.string_ptr;
|
487
|
+
}
|
488
|
+
}
|
489
|
+
|
490
|
+
// Copy constructor
|
491
|
+
MessageCreator(const MessageCreator &other) : message_type_(other.message_type_) {
|
492
|
+
if (message_type_ == 0) {
|
493
|
+
data_.ptr = other.data_.ptr;
|
494
|
+
} else if (uses_string_data_()) {
|
495
|
+
data_.string_ptr = new std::string(*other.data_.string_ptr);
|
496
|
+
} else {
|
497
|
+
data_ = other.data_; // For POD types
|
498
|
+
}
|
499
|
+
}
|
500
|
+
|
501
|
+
// Move constructor
|
502
|
+
MessageCreator(MessageCreator &&other) noexcept : data_(other.data_), message_type_(other.message_type_) {
|
503
|
+
other.message_type_ = 0; // Reset other to function pointer type
|
504
|
+
other.data_.ptr = nullptr;
|
505
|
+
}
|
506
|
+
|
507
|
+
// Assignment operators (needed for batch deduplication)
|
508
|
+
MessageCreator &operator=(const MessageCreator &other) {
|
509
|
+
if (this != &other) {
|
510
|
+
// Clean up current string data if needed
|
511
|
+
if (uses_string_data_()) {
|
512
|
+
delete data_.string_ptr;
|
513
|
+
}
|
514
|
+
// Copy new data
|
515
|
+
message_type_ = other.message_type_;
|
516
|
+
if (other.message_type_ == 0) {
|
517
|
+
data_.ptr = other.data_.ptr;
|
518
|
+
} else if (other.uses_string_data_()) {
|
519
|
+
data_.string_ptr = new std::string(*other.data_.string_ptr);
|
520
|
+
} else {
|
521
|
+
data_ = other.data_;
|
522
|
+
}
|
523
|
+
}
|
524
|
+
return *this;
|
525
|
+
}
|
526
|
+
|
527
|
+
MessageCreator &operator=(MessageCreator &&other) noexcept {
|
528
|
+
if (this != &other) {
|
529
|
+
// Clean up current string data if needed
|
530
|
+
if (uses_string_data_()) {
|
531
|
+
delete data_.string_ptr;
|
532
|
+
}
|
533
|
+
// Move data
|
534
|
+
message_type_ = other.message_type_;
|
535
|
+
data_ = other.data_;
|
536
|
+
// Reset other to safe state
|
537
|
+
other.message_type_ = 0;
|
538
|
+
other.data_.ptr = nullptr;
|
539
|
+
}
|
540
|
+
return *this;
|
541
|
+
}
|
542
|
+
|
543
|
+
// Call operator
|
544
|
+
uint16_t operator()(EntityBase *entity, APIConnection *conn, uint32_t remaining_size, bool is_single) const;
|
545
|
+
|
546
|
+
private:
|
547
|
+
// Helper to check if this message type uses heap-allocated strings
|
548
|
+
bool uses_string_data_() const { return message_type_ == EventResponse::MESSAGE_TYPE; }
|
549
|
+
union CreatorData {
|
550
|
+
MessageCreatorPtr ptr; // 8 bytes
|
551
|
+
std::string *string_ptr; // 8 bytes
|
552
|
+
} data_; // 8 bytes
|
553
|
+
uint16_t message_type_; // 2 bytes (0 = function ptr, >0 = state capture)
|
554
|
+
};
|
555
|
+
|
556
|
+
// Generic batching mechanism for both state updates and entity info
|
557
|
+
struct DeferredBatch {
|
558
|
+
struct BatchItem {
|
559
|
+
EntityBase *entity; // Entity pointer
|
560
|
+
MessageCreator creator; // Function that creates the message when needed
|
561
|
+
uint16_t message_type; // Message type for overhead calculation
|
562
|
+
|
563
|
+
// Constructor for creating BatchItem
|
564
|
+
BatchItem(EntityBase *entity, MessageCreator creator, uint16_t message_type)
|
565
|
+
: entity(entity), creator(std::move(creator)), message_type(message_type) {}
|
566
|
+
};
|
567
|
+
|
568
|
+
std::vector<BatchItem> items;
|
569
|
+
uint32_t batch_start_time{0};
|
570
|
+
bool batch_scheduled{false};
|
571
|
+
|
572
|
+
DeferredBatch() {
|
573
|
+
// Pre-allocate capacity for typical batch sizes to avoid reallocation
|
574
|
+
items.reserve(8);
|
575
|
+
}
|
576
|
+
|
577
|
+
// Add item to the batch
|
578
|
+
void add_item(EntityBase *entity, MessageCreator creator, uint16_t message_type);
|
579
|
+
void clear() {
|
580
|
+
items.clear();
|
581
|
+
batch_scheduled = false;
|
582
|
+
batch_start_time = 0;
|
583
|
+
}
|
584
|
+
bool empty() const { return items.empty(); }
|
585
|
+
};
|
586
|
+
|
587
|
+
DeferredBatch deferred_batch_;
|
588
|
+
uint32_t get_batch_delay_ms_() const;
|
589
|
+
// Message will use 8 more bytes than the minimum size, and typical
|
590
|
+
// MTU is 1500. Sometimes users will see as low as 1460 MTU.
|
591
|
+
// If its IPv6 the header is 40 bytes, and if its IPv4
|
592
|
+
// the header is 20 bytes. So we have 1460 - 40 = 1420 bytes
|
593
|
+
// available for the payload. But we also need to add the size of
|
594
|
+
// the protobuf overhead, which is 8 bytes.
|
595
|
+
//
|
596
|
+
// To be safe we pick 1390 bytes as the maximum size
|
597
|
+
// to send in one go. This is the maximum size of a single packet
|
598
|
+
// that can be sent over the network.
|
599
|
+
// This is to avoid fragmentation of the packet.
|
600
|
+
static constexpr size_t MAX_PACKET_SIZE = 1390; // MTU
|
601
|
+
|
602
|
+
bool schedule_batch_();
|
603
|
+
void process_batch_();
|
604
|
+
|
605
|
+
// State for batch buffer allocation
|
606
|
+
bool batch_first_message_{false};
|
607
|
+
|
608
|
+
// Helper function to schedule a deferred message with known message type
|
609
|
+
bool schedule_message_(EntityBase *entity, MessageCreator creator, uint16_t message_type) {
|
610
|
+
this->deferred_batch_.add_item(entity, std::move(creator), message_type);
|
611
|
+
return this->schedule_batch_();
|
612
|
+
}
|
613
|
+
|
614
|
+
// Overload for function pointers (for info messages and current state reads)
|
615
|
+
bool schedule_message_(EntityBase *entity, MessageCreatorPtr function_ptr, uint16_t message_type) {
|
616
|
+
return schedule_message_(entity, MessageCreator(function_ptr), message_type);
|
617
|
+
}
|
559
618
|
};
|
560
619
|
|
561
620
|
} // namespace api
|