esphome 2025.6.3__py3-none-any.whl → 2025.7.0b2__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- esphome/__main__.py +1 -3
- esphome/codegen.py +2 -0
- esphome/components/ac_dimmer/ac_dimmer.cpp +6 -6
- esphome/components/adc/__init__.py +25 -1
- esphome/components/adc/adc_sensor.h +11 -11
- esphome/components/adc/adc_sensor_common.cpp +1 -1
- esphome/components/adc/adc_sensor_esp32.cpp +16 -8
- esphome/components/ade7880/ade7880.h +0 -2
- esphome/components/ads1115/ads1115.h +0 -1
- esphome/components/ads1118/ads1118.h +0 -1
- esphome/components/ags10/ags10.h +0 -2
- esphome/components/aic3204/aic3204.h +0 -1
- esphome/components/alarm_control_panel/__init__.py +5 -2
- esphome/components/alpha3/alpha3.h +0 -1
- esphome/components/am43/cover/am43_cover.h +0 -1
- esphome/components/am43/sensor/am43_sensor.h +0 -1
- esphome/components/analog_threshold/analog_threshold_binary_sensor.h +0 -2
- esphome/components/anova/anova.cpp +5 -1
- esphome/components/anova/anova.h +0 -1
- esphome/components/apds9960/apds9960.cpp +1 -1
- esphome/components/api/__init__.py +57 -21
- esphome/components/api/api_connection.cpp +344 -539
- esphome/components/api/api_connection.h +224 -141
- esphome/components/api/api_frame_helper.cpp +91 -127
- esphome/components/api/api_frame_helper.h +64 -54
- esphome/components/api/api_pb2.cpp +1837 -9044
- esphome/components/api/api_pb2.h +532 -685
- esphome/components/api/api_pb2_dump.cpp +4432 -0
- esphome/components/api/api_pb2_service.cpp +184 -425
- esphome/components/api/api_pb2_service.h +13 -6
- esphome/components/api/api_server.cpp +131 -167
- esphome/components/api/api_server.h +38 -10
- esphome/components/api/client.py +8 -2
- esphome/components/api/custom_api_device.h +8 -0
- esphome/components/api/list_entities.cpp +37 -104
- esphome/components/api/list_entities.h +33 -23
- esphome/components/api/proto.h +532 -26
- esphome/components/api/subscribe_state.cpp +23 -29
- esphome/components/api/subscribe_state.h +26 -19
- esphome/components/api/user_services.h +2 -0
- esphome/components/as5600/as5600.h +0 -1
- esphome/components/async_tcp/__init__.py +14 -5
- esphome/components/atc_mithermometer/atc_mithermometer.h +0 -1
- esphome/components/atm90e32/atm90e32.cpp +2 -1
- esphome/components/audio/audio_decoder.cpp +1 -1
- esphome/components/audio/audio_transfer_buffer.cpp +2 -2
- esphome/components/b_parasite/b_parasite.h +0 -1
- esphome/components/bedjet/bedjet_hub.cpp +5 -1
- esphome/components/bedjet/climate/bedjet_climate.cpp +5 -1
- esphome/components/beken_spi_led_strip/led_strip.cpp +4 -2
- esphome/components/bh1750/bh1750.cpp +5 -5
- esphome/components/binary_sensor/__init__.py +82 -5
- esphome/components/binary_sensor/automation.h +19 -1
- esphome/components/binary_sensor/binary_sensor.cpp +12 -30
- esphome/components/binary_sensor/binary_sensor.h +11 -25
- esphome/components/binary_sensor/filter.cpp +29 -24
- esphome/components/binary_sensor/filter.h +20 -10
- esphome/components/ble_client/output/ble_binary_output.h +0 -1
- esphome/components/ble_client/sensor/ble_rssi_sensor.cpp +5 -1
- esphome/components/ble_client/sensor/ble_rssi_sensor.h +0 -1
- esphome/components/ble_client/sensor/ble_sensor.cpp +5 -1
- esphome/components/ble_client/sensor/ble_sensor.h +0 -1
- esphome/components/ble_client/switch/ble_switch.h +0 -1
- esphome/components/ble_client/text_sensor/ble_text_sensor.cpp +5 -1
- esphome/components/ble_client/text_sensor/ble_text_sensor.h +0 -1
- esphome/components/ble_presence/ble_presence_device.h +0 -1
- esphome/components/ble_rssi/ble_rssi_sensor.h +0 -1
- esphome/components/ble_scanner/ble_scanner.h +0 -1
- esphome/components/bluetooth_proxy/bluetooth_connection.h +9 -2
- esphome/components/bluetooth_proxy/bluetooth_proxy.cpp +16 -6
- esphome/components/bluetooth_proxy/bluetooth_proxy.h +8 -2
- esphome/components/bme680/sensor.py +1 -1
- esphome/components/bmp581/bmp581.h +0 -2
- esphome/components/button/__init__.py +5 -2
- esphome/components/camera/__init__.py +1 -0
- esphome/components/camera/camera.cpp +22 -0
- esphome/components/camera/camera.h +80 -0
- esphome/components/canbus/__init__.py +1 -0
- esphome/components/cap1188/cap1188.h +0 -1
- esphome/components/captive_portal/__init__.py +12 -2
- esphome/components/captive_portal/captive_portal.cpp +12 -2
- esphome/components/captive_portal/captive_portal.h +5 -2
- esphome/components/ccs811/ccs811.h +0 -2
- esphome/components/climate/__init__.py +5 -2
- esphome/components/cm1106/sensor.py +2 -2
- esphome/components/const/__init__.py +2 -0
- esphome/components/copy/binary_sensor/copy_binary_sensor.h +0 -1
- esphome/components/copy/button/copy_button.h +0 -1
- esphome/components/copy/cover/copy_cover.h +0 -1
- esphome/components/copy/fan/copy_fan.h +0 -1
- esphome/components/copy/lock/copy_lock.h +0 -1
- esphome/components/copy/number/copy_number.h +0 -1
- esphome/components/copy/select/copy_select.h +0 -1
- esphome/components/copy/sensor/copy_sensor.h +0 -1
- esphome/components/copy/switch/copy_switch.h +0 -1
- esphome/components/copy/text/copy_text.h +0 -1
- esphome/components/copy/text_sensor/copy_text_sensor.h +0 -1
- esphome/components/cover/__init__.py +5 -2
- esphome/components/cs5460a/cs5460a.h +0 -1
- esphome/components/datetime/__init__.py +4 -2
- esphome/components/debug/__init__.py +20 -0
- esphome/components/debug/debug_esp32.cpp +2 -0
- esphome/components/deep_sleep/__init__.py +43 -9
- esphome/components/demo/__init__.py +2 -2
- esphome/components/display/display.cpp +4 -3
- esphome/components/display/display.h +0 -2
- esphome/components/display/display_buffer.cpp +1 -1
- esphome/components/ds2484/__init__.py +1 -0
- esphome/components/ds2484/ds2484.cpp +209 -0
- esphome/components/ds2484/ds2484.h +43 -0
- esphome/components/ds2484/one_wire.py +37 -0
- esphome/components/duty_time/duty_time_sensor.h +0 -1
- esphome/components/ens160_base/ens160_base.h +0 -1
- esphome/components/es7210/es7210.h +0 -1
- esphome/components/es7243e/es7243e.h +0 -1
- esphome/components/es8156/es8156.h +0 -1
- esphome/components/es8311/es8311.h +0 -1
- esphome/components/es8388/es8388.h +0 -1
- esphome/components/esp32/__init__.py +103 -135
- esphome/components/esp32/core.cpp +0 -4
- esphome/components/esp32/gpio.h +1 -1
- esphome/components/esp32/helpers.cpp +69 -0
- esphome/components/esp32_ble/ble.cpp +5 -6
- esphome/components/esp32_ble/ble.h +29 -14
- esphome/components/esp32_ble/ble_event.h +6 -6
- esphome/components/esp32_ble_client/ble_client_base.cpp +21 -6
- esphome/components/esp32_ble_client/ble_client_base.h +24 -9
- esphome/components/esp32_ble_tracker/__init__.py +2 -8
- esphome/components/esp32_ble_tracker/esp32_ble_tracker.cpp +5 -5
- esphome/components/esp32_ble_tracker/esp32_ble_tracker.h +11 -7
- esphome/components/esp32_camera/__init__.py +112 -98
- esphome/components/esp32_camera/esp32_camera.cpp +41 -31
- esphome/components/esp32_camera/esp32_camera.h +35 -30
- esphome/components/esp32_camera_web_server/__init__.py +2 -1
- esphome/components/esp32_camera_web_server/camera_web_server.cpp +8 -8
- esphome/components/esp32_camera_web_server/camera_web_server.h +3 -3
- esphome/components/esp32_hall/sensor.py +2 -21
- esphome/components/esp32_hosted/__init__.py +101 -0
- esphome/components/esp32_hosted/esp32_hosted.py.script +12 -0
- esphome/components/esp32_improv/esp32_improv_component.cpp +3 -0
- esphome/components/esp32_rmt/__init__.py +0 -58
- esphome/components/esp32_rmt_led_strip/led_strip.cpp +77 -63
- esphome/components/esp32_rmt_led_strip/led_strip.h +11 -17
- esphome/components/esp32_rmt_led_strip/light.py +14 -76
- esphome/components/esp32_touch/esp32_touch.h +174 -28
- esphome/components/esp32_touch/esp32_touch_common.cpp +162 -0
- esphome/components/esp32_touch/esp32_touch_v1.cpp +240 -0
- esphome/components/esp32_touch/esp32_touch_v2.cpp +397 -0
- esphome/components/esp8266/__init__.py +2 -0
- esphome/components/esp8266/gpio.cpp +10 -10
- esphome/components/esp8266/helpers.cpp +31 -0
- esphome/components/esphome/ota/__init__.py +1 -0
- esphome/components/esphome/ota/ota_esphome.cpp +24 -19
- esphome/components/ethernet/__init__.py +42 -23
- esphome/components/ethernet/esp_eth_phy_jl1101.c +0 -16
- esphome/components/ethernet/ethernet_component.cpp +69 -29
- esphome/components/ethernet/ethernet_component.h +18 -10
- esphome/components/event/__init__.py +5 -2
- esphome/components/ezo/ezo.h +0 -1
- esphome/components/ezo_pmp/ezo_pmp.h +0 -1
- esphome/components/fan/__init__.py +5 -2
- esphome/components/feedback/feedback_cover.h +0 -1
- esphome/components/font/__init__.py +92 -82
- esphome/components/font/font.cpp +9 -2
- esphome/components/font/font.h +20 -5
- esphome/components/fs3000/fs3000.h +0 -1
- esphome/components/gcja5/gcja5.h +0 -1
- esphome/components/gl_r01_i2c/__init__.py +0 -0
- esphome/components/gl_r01_i2c/gl_r01_i2c.cpp +68 -0
- esphome/components/gl_r01_i2c/gl_r01_i2c.h +22 -0
- esphome/components/gl_r01_i2c/sensor.py +36 -0
- esphome/components/gp8403/gp8403.h +0 -1
- esphome/components/gpio/binary_sensor/__init__.py +17 -0
- esphome/components/gpio/binary_sensor/gpio_binary_sensor.cpp +77 -3
- esphome/components/gpio/binary_sensor/gpio_binary_sensor.h +40 -0
- esphome/components/grove_gas_mc_v2/grove_gas_mc_v2.h +0 -2
- esphome/components/he60r/he60r.h +0 -1
- esphome/components/heatpumpir/climate.py +2 -1
- esphome/components/heatpumpir/heatpumpir.cpp +1 -0
- esphome/components/heatpumpir/heatpumpir.h +1 -0
- esphome/components/honeywellabp2_i2c/honeywellabp2.h +0 -1
- esphome/components/host/__init__.py +3 -1
- esphome/components/host/helpers.cpp +57 -0
- esphome/components/http_request/__init__.py +19 -1
- esphome/components/http_request/http_request.h +1 -1
- esphome/components/http_request/http_request_arduino.h +1 -0
- esphome/components/http_request/ota/ota_http_request.cpp +1 -1
- esphome/components/http_request/update/http_request_update.cpp +28 -9
- esphome/components/hydreon_rgxx/hydreon_rgxx.cpp +3 -9
- esphome/components/hydreon_rgxx/sensor.py +1 -1
- esphome/components/i2c/__init__.py +23 -11
- esphome/components/i2c/i2c_bus.h +8 -1
- esphome/components/i2c/i2c_bus_arduino.cpp +4 -3
- esphome/components/i2c/i2c_bus_arduino.h +6 -3
- esphome/components/i2c/i2c_bus_esp_idf.h +5 -3
- esphome/components/i2c_device/i2c_device.h +0 -1
- esphome/components/i2s_audio/__init__.py +2 -10
- esphome/components/i2s_audio/i2s_audio.cpp +1 -5
- esphome/components/i2s_audio/media_player/__init__.py +2 -2
- esphome/components/i2s_audio/speaker/i2s_audio_speaker.cpp +2 -2
- esphome/components/iaqcore/iaqcore.h +0 -2
- esphome/components/image/__init__.py +123 -24
- esphome/components/improv_serial/improv_serial_component.cpp +0 -4
- esphome/components/ina219/ina219.cpp +7 -0
- esphome/components/ina219/ina219.h +1 -0
- esphome/components/ina260/ina260.h +0 -2
- esphome/components/inkbird_ibsth1_mini/inkbird_ibsth1_mini.h +0 -1
- esphome/components/inkplate6/display.py +15 -0
- esphome/components/inkplate6/inkplate.cpp +2 -2
- esphome/components/integration/integration_sensor.h +0 -1
- esphome/components/internal_temperature/internal_temperature.cpp +8 -27
- esphome/components/internal_temperature/sensor.py +0 -26
- esphome/components/interval/interval.h +0 -2
- esphome/components/ld2410/button/__init__.py +3 -3
- esphome/components/ld2410/button/factory_reset_button.cpp +9 -0
- esphome/components/ld2410/button/{reset_button.h → factory_reset_button.h} +2 -2
- esphome/components/ld2410/ld2410.cpp +421 -268
- esphome/components/ld2410/ld2410.h +44 -146
- esphome/components/ld2410/number/__init__.py +2 -2
- esphome/components/ld2410/sensor.py +1 -1
- esphome/components/ld2410/switch/__init__.py +1 -1
- esphome/components/ld2420/ld2420.cpp +196 -100
- esphome/components/ld2420/ld2420.h +46 -118
- esphome/components/ld2420/number/__init__.py +2 -2
- esphome/components/ld2420/sensor/__init__.py +6 -2
- esphome/components/ld2420/sensor/ld2420_sensor.h +1 -1
- esphome/components/ld2450/button/__init__.py +3 -3
- esphome/components/ld2450/button/factory_reset_button.cpp +9 -0
- esphome/components/ld2450/button/{reset_button.h → factory_reset_button.h} +2 -2
- esphome/components/ld2450/ld2450.cpp +384 -232
- esphome/components/ld2450/ld2450.h +60 -69
- esphome/components/ld2450/switch/__init__.py +1 -1
- esphome/components/ledc/ledc_output.cpp +1 -63
- esphome/components/libretiny/__init__.py +5 -3
- esphome/components/libretiny/const.py +5 -0
- esphome/components/libretiny/generate_components.py +1 -0
- esphome/components/libretiny/helpers.cpp +35 -0
- esphome/components/libretiny/lt_component.cpp +5 -3
- esphome/components/light/__init__.py +4 -2
- esphome/components/light/addressable_light.h +3 -3
- esphome/components/light/light_call.cpp +180 -243
- esphome/components/light/light_call.h +72 -20
- esphome/components/light/light_color_values.h +14 -14
- esphome/components/light/light_state.h +15 -13
- esphome/components/light/transformers.h +2 -2
- esphome/components/ln882x/__init__.py +52 -0
- esphome/components/ln882x/boards.py +285 -0
- esphome/components/lock/__init__.py +5 -2
- esphome/components/logger/__init__.py +40 -3
- esphome/components/logger/logger.cpp +47 -12
- esphome/components/logger/logger.h +80 -49
- esphome/components/logger/logger_esp32.cpp +3 -3
- esphome/components/lps22/__init__.py +0 -0
- esphome/components/lps22/lps22.cpp +75 -0
- esphome/components/lps22/lps22.h +27 -0
- esphome/components/lps22/sensor.py +58 -0
- esphome/components/ltr390/ltr390.h +0 -1
- esphome/components/ltr501/ltr501.h +0 -1
- esphome/components/ltr_als_ps/ltr_als_ps.h +0 -1
- esphome/components/lvgl/__init__.py +1 -1
- esphome/components/lvgl/schemas.py +66 -6
- esphome/components/lvgl/styles.py +24 -16
- esphome/components/lvgl/widgets/__init__.py +12 -2
- esphome/components/lvgl/widgets/lv_bar.py +40 -19
- esphome/components/m5stack_8angle/light/m5stack_8angle_light.cpp +1 -1
- esphome/components/max9611/max9611.h +0 -1
- esphome/components/mcp23016/__init__.py +1 -1
- esphome/components/mcp23xxx_base/__init__.py +1 -1
- esphome/components/mcp4461/__init__.py +1 -1
- esphome/components/mcp4461/output/__init__.py +3 -2
- esphome/components/mcp9600/mcp9600.h +0 -2
- esphome/components/md5/md5.cpp +3 -3
- esphome/components/md5/md5.h +1 -6
- esphome/components/mdns/__init__.py +22 -11
- esphome/components/media_player/__init__.py +4 -3
- esphome/components/micro_wake_word/__init__.py +1 -5
- esphome/components/micro_wake_word/streaming_model.cpp +2 -2
- esphome/components/microphone/microphone.cpp +7 -9
- esphome/components/microphone/microphone.h +0 -2
- esphome/components/mipi_spi/display.py +1 -0
- esphome/components/mmc5603/mmc5603.cpp +1 -1
- esphome/components/modbus/modbus.cpp +33 -15
- esphome/components/modbus/modbus.h +9 -0
- esphome/components/modbus_controller/__init__.py +42 -10
- esphome/components/modbus_controller/modbus_controller.cpp +92 -11
- esphome/components/modbus_controller/modbus_controller.h +61 -7
- esphome/components/mopeka_pro_check/mopeka_pro_check.h +0 -1
- esphome/components/mopeka_std_check/mopeka_std_check.h +0 -1
- esphome/components/mpl3115a2/mpl3115a2.h +0 -2
- esphome/components/mqtt/__init__.py +16 -0
- esphome/components/mqtt/mqtt_backend.h +2 -1
- esphome/components/mqtt/mqtt_backend_esp32.cpp +132 -47
- esphome/components/mqtt/mqtt_backend_esp32.h +106 -4
- esphome/components/mqtt/mqtt_client.cpp +15 -9
- esphome/components/mqtt/mqtt_client.h +8 -3
- esphome/components/ms8607/ms8607.h +0 -1
- esphome/components/neopixelbus/light.py +4 -1
- esphome/components/neopixelbus/neopixelbus_light.h +1 -1
- esphome/components/network/__init__.py +4 -1
- esphome/components/network/ip_address.h +1 -0
- esphome/components/nextion/__init__.py +16 -0
- esphome/components/nextion/base_component.py +1 -0
- esphome/components/nextion/binary_sensor/nextion_binarysensor.cpp +1 -1
- esphome/components/nextion/display.py +14 -4
- esphome/components/nextion/nextion.cpp +166 -101
- esphome/components/nextion/nextion.h +84 -53
- esphome/components/nextion/nextion_commands.cpp +11 -10
- esphome/components/nextion/nextion_component.cpp +28 -28
- esphome/components/nextion/nextion_component.h +53 -18
- esphome/components/nextion/nextion_component_base.h +3 -0
- esphome/components/nextion/nextion_upload.cpp +36 -0
- esphome/components/nextion/nextion_upload_arduino.cpp +10 -35
- esphome/components/nextion/nextion_upload_idf.cpp +9 -33
- esphome/components/nextion/sensor/nextion_sensor.cpp +1 -1
- esphome/components/nextion/switch/nextion_switch.cpp +1 -1
- esphome/components/nextion/text_sensor/nextion_textsensor.cpp +1 -1
- esphome/components/nfc/nfc.cpp +3 -22
- esphome/components/nfc/nfc.h +3 -3
- esphome/components/number/__init__.py +5 -2
- esphome/components/online_image/__init__.py +5 -0
- esphome/components/online_image/online_image.cpp +6 -2
- esphome/components/online_image/online_image.h +4 -1
- esphome/components/opentherm/opentherm.cpp +7 -12
- esphome/components/openthread/__init__.py +47 -40
- esphome/components/openthread/const.py +1 -0
- esphome/components/openthread/openthread_esp.cpp +27 -5
- esphome/components/opt3001/__init__.py +0 -0
- esphome/components/opt3001/opt3001.cpp +122 -0
- esphome/components/opt3001/opt3001.h +27 -0
- esphome/components/opt3001/sensor.py +35 -0
- esphome/components/ota/__init__.py +17 -0
- esphome/components/ota/ota_backend.h +27 -1
- esphome/components/ota/ota_backend_arduino_esp32.cpp +12 -2
- esphome/components/ota/ota_backend_arduino_esp32.h +3 -0
- esphome/components/ota/ota_backend_arduino_esp8266.cpp +18 -4
- esphome/components/ota/ota_backend_arduino_esp8266.h +3 -0
- esphome/components/ota/ota_backend_arduino_libretiny.cpp +12 -2
- esphome/components/ota/ota_backend_arduino_libretiny.h +3 -0
- esphome/components/ota/ota_backend_arduino_rp2040.cpp +9 -2
- esphome/components/ota/ota_backend_arduino_rp2040.h +3 -0
- esphome/components/ota/ota_backend_esp_idf.cpp +10 -16
- esphome/components/ota/ota_backend_esp_idf.h +1 -0
- esphome/components/packages/__init__.py +5 -2
- esphome/components/packet_transport/binary_sensor.py +61 -4
- esphome/components/packet_transport/packet_transport.cpp +34 -1
- esphome/components/packet_transport/packet_transport.h +11 -5
- esphome/components/pcf8574/__init__.py +1 -1
- esphome/components/pi4ioe5v6408/__init__.py +84 -0
- esphome/components/pi4ioe5v6408/pi4ioe5v6408.cpp +171 -0
- esphome/components/pi4ioe5v6408/pi4ioe5v6408.h +70 -0
- esphome/components/pmsa003i/pmsa003i.h +0 -1
- esphome/components/pmsx003/pmsx003.h +0 -1
- esphome/components/pn7150/pn7150.cpp +7 -7
- esphome/components/pn7150/pn7150.h +0 -1
- esphome/components/pn7160/pn7160.cpp +7 -7
- esphome/components/pn7160/pn7160.h +0 -1
- esphome/components/preferences/syncer.h +2 -0
- esphome/components/prometheus/prometheus_handler.h +1 -1
- esphome/components/psram/psram.cpp +0 -20
- esphome/components/pulse_counter/pulse_counter_sensor.h +0 -1
- esphome/components/pulse_meter/pulse_meter_sensor.cpp +8 -4
- esphome/components/pulse_width/pulse_width.h +0 -1
- esphome/components/pvvx_mithermometer/display/pvvx_display.cpp +0 -4
- esphome/components/pvvx_mithermometer/display/pvvx_display.h +0 -2
- esphome/components/pvvx_mithermometer/pvvx_mithermometer.h +0 -1
- esphome/components/qr_code/__init__.py +13 -10
- esphome/components/qwiic_pir/qwiic_pir.h +0 -1
- esphome/components/radon_eye_ble/radon_eye_listener.cpp +1 -1
- esphome/components/rc522/rc522.h +0 -1
- esphome/components/rdm6300/rdm6300.h +0 -2
- esphome/components/remote_base/__init__.py +7 -5
- esphome/components/remote_base/remote_base.cpp +24 -21
- esphome/components/remote_base/remote_base.h +3 -26
- esphome/components/remote_receiver/__init__.py +40 -46
- esphome/components/remote_receiver/remote_receiver.h +4 -18
- esphome/components/remote_receiver/remote_receiver_esp32.cpp +0 -87
- esphome/components/remote_receiver/remote_receiver_esp8266.cpp +1 -1
- esphome/components/remote_transmitter/__init__.py +42 -43
- esphome/components/remote_transmitter/remote_transmitter.h +2 -14
- esphome/components/remote_transmitter/remote_transmitter_esp32.cpp +0 -77
- esphome/components/resistance/resistance_sensor.h +0 -1
- esphome/components/rp2040/__init__.py +2 -0
- esphome/components/rp2040/helpers.cpp +55 -0
- esphome/components/rp2040_pio_led_strip/led_strip.cpp +2 -2
- esphome/components/rpi_dpi_rgb/rpi_dpi_rgb.cpp +0 -4
- esphome/components/rtttl/__init__.py +4 -4
- esphome/components/rtttl/rtttl.cpp +10 -1
- esphome/components/ruuvitag/ruuvitag.h +0 -1
- esphome/components/safe_mode/safe_mode.cpp +2 -0
- esphome/components/safe_mode/safe_mode.h +4 -1
- esphome/components/scd30/scd30.h +0 -1
- esphome/components/scd30/sensor.py +2 -2
- esphome/components/scd4x/scd4x.cpp +61 -54
- esphome/components/scd4x/scd4x.h +17 -15
- esphome/components/scd4x/sensor.py +4 -4
- esphome/components/script/script.h +0 -2
- esphome/components/sdp3x/sensor.py +1 -1
- esphome/components/select/__init__.py +5 -2
- esphome/components/sen5x/sen5x.h +0 -1
- esphome/components/senseair/senseair.h +0 -1
- esphome/components/sensor/__init__.py +4 -2
- esphome/components/sensor/filter.cpp +1 -1
- esphome/components/sensor/sensor.cpp +12 -6
- esphome/components/sensor/sensor.h +13 -5
- esphome/components/servo/servo.h +0 -1
- esphome/components/sfa30/sfa30.h +0 -1
- esphome/components/sgp30/sgp30.h +0 -1
- esphome/components/sgp4x/sgp4x.h +0 -1
- esphome/components/shelly_dimmer/stm32flash.cpp +1 -2
- esphome/components/sht4x/sht4x.h +0 -1
- esphome/components/sm300d2/sm300d2.h +0 -2
- esphome/components/smt100/sensor.py +8 -4
- esphome/components/smt100/smt100.cpp +5 -5
- esphome/components/smt100/smt100.h +3 -3
- esphome/components/sn74hc595/__init__.py +1 -1
- esphome/components/sn74hc595/sn74hc595.cpp +5 -4
- esphome/components/sntp/sntp_component.cpp +9 -3
- esphome/components/sntp/time.py +2 -0
- esphome/components/socket/__init__.py +17 -0
- esphome/components/spi/__init__.py +27 -6
- esphome/components/spi/spi.cpp +3 -2
- esphome/components/spi/spi.h +9 -3
- esphome/components/spi/spi_arduino.cpp +3 -5
- esphome/components/spi/spi_esp_idf.cpp +40 -21
- esphome/components/spi_led_strip/spi_led_strip.cpp +1 -1
- esphome/components/sps30/sps30.h +0 -1
- esphome/components/ssd1306_base/ssd1306_base.cpp +1 -1
- esphome/components/st7701s/st7701s.cpp +0 -4
- esphome/components/status/status_binary_sensor.h +0 -2
- esphome/components/substitutions/__init__.py +76 -19
- esphome/components/substitutions/jinja.py +99 -0
- esphome/components/sun/sun.cpp +3 -4
- esphome/components/switch/__init__.py +5 -2
- esphome/components/switch/binary_sensor/switch_binary_sensor.h +0 -1
- esphome/components/sx126x/__init__.py +317 -0
- esphome/components/sx126x/automation.h +62 -0
- esphome/components/sx126x/packet_transport/__init__.py +26 -0
- esphome/components/sx126x/packet_transport/sx126x_transport.cpp +26 -0
- esphome/components/sx126x/packet_transport/sx126x_transport.h +25 -0
- esphome/components/sx126x/sx126x.cpp +523 -0
- esphome/components/sx126x/sx126x.h +140 -0
- esphome/components/sx126x/sx126x_reg.h +163 -0
- esphome/components/sx127x/__init__.py +325 -0
- esphome/components/sx127x/automation.h +62 -0
- esphome/components/sx127x/packet_transport/__init__.py +26 -0
- esphome/components/sx127x/packet_transport/sx127x_transport.cpp +26 -0
- esphome/components/sx127x/packet_transport/sx127x_transport.h +25 -0
- esphome/components/sx127x/sx127x.cpp +498 -0
- esphome/components/sx127x/sx127x.h +128 -0
- esphome/components/sx127x/sx127x_reg.h +295 -0
- esphome/components/syslog/esphome_syslog.cpp +5 -3
- esphome/components/syslog/esphome_syslog.h +1 -1
- esphome/components/tca9555/__init__.py +1 -1
- esphome/components/template/binary_sensor/template_binary_sensor.cpp +1 -9
- esphome/components/text/__init__.py +5 -2
- esphome/components/text_sensor/__init__.py +5 -2
- esphome/components/thermostat/thermostat_climate.cpp +34 -31
- esphome/components/thermostat/thermostat_climate.h +43 -39
- esphome/components/time/__init__.py +16 -2
- esphome/components/time/real_time_clock.cpp +4 -0
- esphome/components/time/real_time_clock.h +5 -1
- esphome/components/tlc5971/tlc5971.cpp +4 -1
- esphome/components/tmp1075/tmp1075.h +0 -2
- esphome/components/tof10120/tof10120_sensor.h +0 -1
- esphome/components/tormatic/tormatic_cover.h +0 -1
- esphome/components/total_daily_energy/total_daily_energy.h +0 -1
- esphome/components/tsl2591/tsl2591.cpp +1 -1
- esphome/components/ttp229_bsf/ttp229_bsf.h +0 -1
- esphome/components/ttp229_lsf/ttp229_lsf.h +0 -1
- esphome/components/tx20/tx20.cpp +2 -2
- esphome/components/uart/__init__.py +18 -0
- esphome/components/uart/uart_component_esp_idf.cpp +0 -4
- esphome/components/update/__init__.py +5 -2
- esphome/components/update/update_entity.h +8 -0
- esphome/components/usb_host/__init__.py +5 -2
- esphome/components/usb_host/usb_host_client.cpp +10 -10
- esphome/components/usb_uart/cp210x.cpp +1 -1
- esphome/components/usb_uart/usb_uart.cpp +41 -44
- esphome/components/usb_uart/usb_uart.h +4 -3
- esphome/components/valve/__init__.py +5 -2
- esphome/components/vbus/vbus.h +0 -1
- esphome/components/veml3235/veml3235.h +0 -1
- esphome/components/veml7700/veml7700.h +0 -1
- esphome/components/vl53l0x/vl53l0x_sensor.h +0 -1
- esphome/components/voice_assistant/voice_assistant.cpp +4 -4
- esphome/components/watchdog/watchdog.cpp +0 -4
- esphome/components/waveshare_epaper/waveshare_epaper.cpp +6 -6
- esphome/components/web_server/__init__.py +34 -19
- esphome/components/web_server/ota/__init__.py +32 -0
- esphome/components/web_server/ota/ota_web_server.cpp +210 -0
- esphome/components/web_server/ota/ota_web_server.h +26 -0
- esphome/components/web_server/web_server.cpp +305 -427
- esphome/components/web_server/web_server.h +33 -23
- esphome/components/web_server/web_server_v1.cpp +4 -5
- esphome/components/web_server_base/__init__.py +5 -2
- esphome/components/web_server_base/web_server_base.cpp +2 -94
- esphome/components/web_server_base/web_server_base.h +5 -25
- esphome/components/web_server_idf/multipart.cpp +254 -0
- esphome/components/web_server_idf/multipart.h +86 -0
- esphome/components/web_server_idf/utils.cpp +32 -0
- esphome/components/web_server_idf/utils.h +10 -0
- esphome/components/web_server_idf/web_server_idf.cpp +162 -16
- esphome/components/web_server_idf/web_server_idf.h +11 -10
- esphome/components/wiegand/wiegand.cpp +2 -2
- esphome/components/wifi/__init__.py +18 -0
- esphome/components/wifi/wifi_component.cpp +17 -22
- esphome/components/wifi/wifi_component.h +27 -23
- esphome/components/wifi/wifi_component_esp32_arduino.cpp +52 -59
- esphome/components/wifi/wifi_component_esp8266.cpp +46 -46
- esphome/components/wifi/wifi_component_esp_idf.cpp +35 -36
- esphome/components/wifi/wifi_component_libretiny.cpp +26 -27
- esphome/components/wifi/wifi_component_pico_w.cpp +3 -3
- esphome/components/wifi_info/wifi_info_text_sensor.cpp +6 -6
- esphome/components/wireguard/__init__.py +2 -11
- esphome/components/xiaomi_ble/xiaomi_ble.cpp +13 -1
- esphome/components/xiaomi_ble/xiaomi_ble.h +1 -0
- esphome/components/xiaomi_cgd1/xiaomi_cgd1.h +0 -1
- esphome/components/xiaomi_cgdk2/xiaomi_cgdk2.h +0 -1
- esphome/components/xiaomi_cgg1/xiaomi_cgg1.h +0 -1
- esphome/components/xiaomi_cgpr1/xiaomi_cgpr1.h +0 -1
- esphome/components/xiaomi_gcls002/xiaomi_gcls002.h +0 -1
- esphome/components/xiaomi_hhccjcy01/xiaomi_hhccjcy01.h +0 -1
- esphome/components/xiaomi_hhccjcy10/xiaomi_hhccjcy10.h +0 -1
- esphome/components/xiaomi_hhccpot002/xiaomi_hhccpot002.h +0 -1
- esphome/components/xiaomi_jqjcy01ym/xiaomi_jqjcy01ym.h +0 -1
- esphome/components/xiaomi_lywsd02/xiaomi_lywsd02.h +0 -1
- esphome/components/xiaomi_lywsd02mmc/xiaomi_lywsd02mmc.h +0 -1
- esphome/components/xiaomi_lywsd03mmc/xiaomi_lywsd03mmc.h +0 -1
- esphome/components/xiaomi_lywsdcgq/xiaomi_lywsdcgq.h +0 -1
- esphome/components/xiaomi_mhoc303/xiaomi_mhoc303.h +0 -1
- esphome/components/xiaomi_mhoc401/xiaomi_mhoc401.h +0 -1
- esphome/components/xiaomi_miscale/xiaomi_miscale.h +0 -1
- esphome/components/xiaomi_mjyd02yla/xiaomi_mjyd02yla.h +0 -1
- esphome/components/xiaomi_mue4094rt/xiaomi_mue4094rt.h +0 -1
- esphome/components/xiaomi_rtcgq02lm/xiaomi_rtcgq02lm.h +0 -1
- esphome/components/xiaomi_wx08zm/xiaomi_wx08zm.h +0 -1
- esphome/components/xiaomi_xmwsdj04mmc/__init__.py +0 -0
- esphome/components/xiaomi_xmwsdj04mmc/sensor.py +77 -0
- esphome/components/xiaomi_xmwsdj04mmc/xiaomi_xmwsdj04mmc.cpp +77 -0
- esphome/components/xiaomi_xmwsdj04mmc/xiaomi_xmwsdj04mmc.h +36 -0
- esphome/components/zio_ultrasonic/zio_ultrasonic.h +0 -2
- esphome/components/zyaura/zyaura.h +0 -1
- esphome/config.py +88 -22
- esphome/config_helpers.py +74 -1
- esphome/config_validation.py +12 -1
- esphome/const.py +65 -10
- esphome/core/__init__.py +18 -2
- esphome/core/application.cpp +163 -10
- esphome/core/application.h +145 -165
- esphome/core/area.h +19 -0
- esphome/core/automation.h +58 -9
- esphome/core/color.cpp +3 -5
- esphome/core/color.h +16 -16
- esphome/core/component.cpp +151 -18
- esphome/core/component.h +98 -4
- esphome/core/component_iterator.cpp +11 -9
- esphome/core/component_iterator.h +12 -10
- esphome/core/config.py +155 -6
- esphome/core/controller.cpp +4 -2
- esphome/core/controller.h +1 -1
- esphome/core/datatypes.h +2 -2
- esphome/core/defines.h +17 -2
- esphome/core/device.h +20 -0
- esphome/core/entity_base.cpp +20 -15
- esphome/core/entity_base.h +76 -0
- esphome/core/entity_helpers.py +168 -1
- esphome/core/event_pool.h +81 -0
- esphome/core/helpers.cpp +75 -230
- esphome/core/helpers.h +164 -104
- esphome/core/lock_free_queue.h +151 -0
- esphome/core/log.cpp +2 -2
- esphome/core/log.h +2 -0
- esphome/core/optional.h +5 -0
- esphome/core/ring_buffer.cpp +2 -2
- esphome/core/scheduler.cpp +275 -103
- esphome/core/scheduler.h +154 -17
- esphome/core/time.cpp +5 -5
- esphome/core/time.h +5 -5
- esphome/cpp_generator.py +17 -0
- esphome/cpp_helpers.py +0 -22
- esphome/cpp_types.py +3 -1
- esphome/dashboard/entries.py +1 -1
- esphome/dashboard/util/text.py +5 -21
- esphome/dashboard/web_server.py +9 -1
- esphome/helpers.py +47 -0
- esphome/loader.py +15 -1
- esphome/pins.py +14 -8
- esphome/wizard.py +17 -4
- esphome/writer.py +21 -3
- esphome/yaml_util.py +0 -2
- {esphome-2025.6.3.dist-info → esphome-2025.7.0b2.dist-info}/METADATA +10 -9
- {esphome-2025.6.3.dist-info → esphome-2025.7.0b2.dist-info}/RECORD +597 -538
- esphome/components/api/api_pb2_size.h +0 -361
- esphome/components/esp32_ble/ble_event_pool.h +0 -72
- esphome/components/esp32_ble/queue.h +0 -85
- esphome/components/esp32_hall/esp32_hall.cpp +0 -25
- esphome/components/esp32_hall/esp32_hall.h +0 -23
- esphome/components/esp32_touch/esp32_touch.cpp +0 -355
- esphome/components/ld2410/button/reset_button.cpp +0 -9
- esphome/components/ld2450/button/reset_button.cpp +0 -9
- esphome/components/openthread/tlv.py +0 -65
- /esphome/{dashboard/enum.py → enum.py} +0 -0
- {esphome-2025.6.3.dist-info → esphome-2025.7.0b2.dist-info}/WHEEL +0 -0
- {esphome-2025.6.3.dist-info → esphome-2025.7.0b2.dist-info}/entry_points.txt +0 -0
- {esphome-2025.6.3.dist-info → esphome-2025.7.0b2.dist-info}/licenses/LICENSE +0 -0
- {esphome-2025.6.3.dist-info → esphome-2025.7.0b2.dist-info}/top_level.txt +0 -0
|
@@ -2,9 +2,10 @@
|
|
|
2
2
|
// See script/api_protobuf/api_protobuf.py
|
|
3
3
|
#pragma once
|
|
4
4
|
|
|
5
|
-
#include "api_pb2.h"
|
|
6
5
|
#include "esphome/core/defines.h"
|
|
7
6
|
|
|
7
|
+
#include "api_pb2.h"
|
|
8
|
+
|
|
8
9
|
namespace esphome {
|
|
9
10
|
namespace api {
|
|
10
11
|
|
|
@@ -19,7 +20,7 @@ class APIServerConnectionBase : public ProtoService {
|
|
|
19
20
|
|
|
20
21
|
template<typename T> bool send_message(const T &msg) {
|
|
21
22
|
#ifdef HAS_PROTO_MESSAGE_DUMP
|
|
22
|
-
this->log_send_message_(
|
|
23
|
+
this->log_send_message_(msg.message_name(), msg.dump());
|
|
23
24
|
#endif
|
|
24
25
|
return this->send_message_(msg, T::MESSAGE_TYPE);
|
|
25
26
|
}
|
|
@@ -68,9 +69,11 @@ class APIServerConnectionBase : public ProtoService {
|
|
|
68
69
|
virtual void on_get_time_request(const GetTimeRequest &value){};
|
|
69
70
|
virtual void on_get_time_response(const GetTimeResponse &value){};
|
|
70
71
|
|
|
72
|
+
#ifdef USE_API_SERVICES
|
|
71
73
|
virtual void on_execute_service_request(const ExecuteServiceRequest &value){};
|
|
74
|
+
#endif
|
|
72
75
|
|
|
73
|
-
#ifdef
|
|
76
|
+
#ifdef USE_CAMERA
|
|
74
77
|
virtual void on_camera_image_request(const CameraImageRequest &value){};
|
|
75
78
|
#endif
|
|
76
79
|
|
|
@@ -199,7 +202,7 @@ class APIServerConnectionBase : public ProtoService {
|
|
|
199
202
|
virtual void on_update_command_request(const UpdateCommandRequest &value){};
|
|
200
203
|
#endif
|
|
201
204
|
protected:
|
|
202
|
-
|
|
205
|
+
void read_message(uint32_t msg_size, uint32_t msg_type, uint8_t *msg_data) override;
|
|
203
206
|
};
|
|
204
207
|
|
|
205
208
|
class APIServerConnection : public APIServerConnectionBase {
|
|
@@ -215,14 +218,16 @@ class APIServerConnection : public APIServerConnectionBase {
|
|
|
215
218
|
virtual void subscribe_homeassistant_services(const SubscribeHomeassistantServicesRequest &msg) = 0;
|
|
216
219
|
virtual void subscribe_home_assistant_states(const SubscribeHomeAssistantStatesRequest &msg) = 0;
|
|
217
220
|
virtual GetTimeResponse get_time(const GetTimeRequest &msg) = 0;
|
|
221
|
+
#ifdef USE_API_SERVICES
|
|
218
222
|
virtual void execute_service(const ExecuteServiceRequest &msg) = 0;
|
|
223
|
+
#endif
|
|
219
224
|
#ifdef USE_API_NOISE
|
|
220
225
|
virtual NoiseEncryptionSetKeyResponse noise_encryption_set_key(const NoiseEncryptionSetKeyRequest &msg) = 0;
|
|
221
226
|
#endif
|
|
222
227
|
#ifdef USE_BUTTON
|
|
223
228
|
virtual void button_command(const ButtonCommandRequest &msg) = 0;
|
|
224
229
|
#endif
|
|
225
|
-
#ifdef
|
|
230
|
+
#ifdef USE_CAMERA
|
|
226
231
|
virtual void camera_image(const CameraImageRequest &msg) = 0;
|
|
227
232
|
#endif
|
|
228
233
|
#ifdef USE_CLIMATE
|
|
@@ -332,14 +337,16 @@ class APIServerConnection : public APIServerConnectionBase {
|
|
|
332
337
|
void on_subscribe_homeassistant_services_request(const SubscribeHomeassistantServicesRequest &msg) override;
|
|
333
338
|
void on_subscribe_home_assistant_states_request(const SubscribeHomeAssistantStatesRequest &msg) override;
|
|
334
339
|
void on_get_time_request(const GetTimeRequest &msg) override;
|
|
340
|
+
#ifdef USE_API_SERVICES
|
|
335
341
|
void on_execute_service_request(const ExecuteServiceRequest &msg) override;
|
|
342
|
+
#endif
|
|
336
343
|
#ifdef USE_API_NOISE
|
|
337
344
|
void on_noise_encryption_set_key_request(const NoiseEncryptionSetKeyRequest &msg) override;
|
|
338
345
|
#endif
|
|
339
346
|
#ifdef USE_BUTTON
|
|
340
347
|
void on_button_command_request(const ButtonCommandRequest &msg) override;
|
|
341
348
|
#endif
|
|
342
|
-
#ifdef
|
|
349
|
+
#ifdef USE_CAMERA
|
|
343
350
|
void on_camera_image_request(const CameraImageRequest &msg) override;
|
|
344
351
|
#endif
|
|
345
352
|
#ifdef USE_CLIMATE
|
|
@@ -47,6 +47,11 @@ void APIServer::setup() {
|
|
|
47
47
|
}
|
|
48
48
|
#endif
|
|
49
49
|
|
|
50
|
+
// Schedule reboot if no clients connect within timeout
|
|
51
|
+
if (this->reboot_timeout_ != 0) {
|
|
52
|
+
this->schedule_reboot_timeout_();
|
|
53
|
+
}
|
|
54
|
+
|
|
50
55
|
this->socket_ = socket::socket_ip_loop_monitored(SOCK_STREAM, 0); // monitored for incoming connections
|
|
51
56
|
if (this->socket_ == nullptr) {
|
|
52
57
|
ESP_LOGW(TAG, "Could not create socket");
|
|
@@ -91,34 +96,42 @@ void APIServer::setup() {
|
|
|
91
96
|
|
|
92
97
|
#ifdef USE_LOGGER
|
|
93
98
|
if (logger::global_logger != nullptr) {
|
|
94
|
-
logger::global_logger->add_on_log_callback(
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
99
|
+
logger::global_logger->add_on_log_callback(
|
|
100
|
+
[this](int level, const char *tag, const char *message, size_t message_len) {
|
|
101
|
+
if (this->shutting_down_) {
|
|
102
|
+
// Don't try to send logs during shutdown
|
|
103
|
+
// as it could result in a recursion and
|
|
104
|
+
// we would be filling a buffer we are trying to clear
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
for (auto &c : this->clients_) {
|
|
108
|
+
if (!c->flags_.remove)
|
|
109
|
+
c->try_send_log_message(level, tag, message, message_len);
|
|
110
|
+
}
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
#endif
|
|
114
|
+
|
|
115
|
+
#ifdef USE_CAMERA
|
|
116
|
+
if (camera::Camera::instance() != nullptr && !camera::Camera::instance()->is_internal()) {
|
|
117
|
+
camera::Camera::instance()->add_image_callback([this](const std::shared_ptr<camera::CameraImage> &image) {
|
|
101
118
|
for (auto &c : this->clients_) {
|
|
102
|
-
if (!c->
|
|
103
|
-
c->
|
|
119
|
+
if (!c->flags_.remove)
|
|
120
|
+
c->set_camera_state(image);
|
|
104
121
|
}
|
|
105
122
|
});
|
|
106
123
|
}
|
|
107
124
|
#endif
|
|
125
|
+
}
|
|
108
126
|
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
c->set_camera_state(image);
|
|
118
|
-
}
|
|
119
|
-
});
|
|
120
|
-
}
|
|
121
|
-
#endif
|
|
127
|
+
void APIServer::schedule_reboot_timeout_() {
|
|
128
|
+
this->status_set_warning();
|
|
129
|
+
this->set_timeout("api_reboot", this->reboot_timeout_, []() {
|
|
130
|
+
if (!global_api_server->is_connected()) {
|
|
131
|
+
ESP_LOGE(TAG, "No clients; rebooting");
|
|
132
|
+
App.reboot();
|
|
133
|
+
}
|
|
134
|
+
});
|
|
122
135
|
}
|
|
123
136
|
|
|
124
137
|
void APIServer::loop() {
|
|
@@ -130,51 +143,63 @@ void APIServer::loop() {
|
|
|
130
143
|
auto sock = this->socket_->accept_loop_monitored((struct sockaddr *) &source_addr, &addr_len);
|
|
131
144
|
if (!sock)
|
|
132
145
|
break;
|
|
133
|
-
ESP_LOGD(TAG, "
|
|
146
|
+
ESP_LOGD(TAG, "Accept %s", sock->getpeername().c_str());
|
|
134
147
|
|
|
135
148
|
auto *conn = new APIConnection(std::move(sock), this);
|
|
136
149
|
this->clients_.emplace_back(conn);
|
|
137
150
|
conn->start();
|
|
151
|
+
|
|
152
|
+
// Clear warning status and cancel reboot when first client connects
|
|
153
|
+
if (this->clients_.size() == 1 && this->reboot_timeout_ != 0) {
|
|
154
|
+
this->status_clear_warning();
|
|
155
|
+
this->cancel_timeout("api_reboot");
|
|
156
|
+
}
|
|
138
157
|
}
|
|
139
158
|
}
|
|
140
159
|
|
|
160
|
+
if (this->clients_.empty()) {
|
|
161
|
+
return;
|
|
162
|
+
}
|
|
163
|
+
|
|
141
164
|
// Process clients and remove disconnected ones in a single pass
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
// Handle disconnection
|
|
149
|
-
this->client_disconnected_trigger_->trigger(client->client_info_, client->client_peername_);
|
|
150
|
-
ESP_LOGV(TAG, "Removing connection to %s", client->client_info_.c_str());
|
|
151
|
-
|
|
152
|
-
// Swap with the last element and pop (avoids expensive vector shifts)
|
|
153
|
-
if (client_index < this->clients_.size() - 1) {
|
|
154
|
-
std::swap(this->clients_[client_index], this->clients_.back());
|
|
155
|
-
}
|
|
156
|
-
this->clients_.pop_back();
|
|
157
|
-
// Don't increment client_index since we need to process the swapped element
|
|
158
|
-
} else {
|
|
159
|
-
// Process active client
|
|
160
|
-
client->loop();
|
|
161
|
-
client_index++; // Move to next client
|
|
162
|
-
}
|
|
165
|
+
// Check network connectivity once for all clients
|
|
166
|
+
if (!network::is_connected()) {
|
|
167
|
+
// Network is down - disconnect all clients
|
|
168
|
+
for (auto &client : this->clients_) {
|
|
169
|
+
client->on_fatal_error();
|
|
170
|
+
ESP_LOGW(TAG, "%s: Network down; disconnect", client->get_client_combined_info().c_str());
|
|
163
171
|
}
|
|
172
|
+
// Continue to process and clean up the clients below
|
|
164
173
|
}
|
|
165
174
|
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
this->last_connected_ = now;
|
|
176
|
-
this->status_clear_warning();
|
|
175
|
+
size_t client_index = 0;
|
|
176
|
+
while (client_index < this->clients_.size()) {
|
|
177
|
+
auto &client = this->clients_[client_index];
|
|
178
|
+
|
|
179
|
+
if (!client->flags_.remove) {
|
|
180
|
+
// Common case: process active client
|
|
181
|
+
client->loop();
|
|
182
|
+
client_index++;
|
|
183
|
+
continue;
|
|
177
184
|
}
|
|
185
|
+
|
|
186
|
+
// Rare case: handle disconnection
|
|
187
|
+
#ifdef USE_API_CLIENT_DISCONNECTED_TRIGGER
|
|
188
|
+
this->client_disconnected_trigger_->trigger(client->client_info_, client->client_peername_);
|
|
189
|
+
#endif
|
|
190
|
+
ESP_LOGV(TAG, "Remove connection %s", client->client_info_.c_str());
|
|
191
|
+
|
|
192
|
+
// Swap with the last element and pop (avoids expensive vector shifts)
|
|
193
|
+
if (client_index < this->clients_.size() - 1) {
|
|
194
|
+
std::swap(this->clients_[client_index], this->clients_.back());
|
|
195
|
+
}
|
|
196
|
+
this->clients_.pop_back();
|
|
197
|
+
|
|
198
|
+
// Schedule reboot when last client disconnects
|
|
199
|
+
if (this->clients_.empty() && this->reboot_timeout_ != 0) {
|
|
200
|
+
this->schedule_reboot_timeout_();
|
|
201
|
+
}
|
|
202
|
+
// Don't increment client_index since we need to process the swapped element
|
|
178
203
|
}
|
|
179
204
|
}
|
|
180
205
|
|
|
@@ -193,6 +218,7 @@ void APIServer::dump_config() {
|
|
|
193
218
|
#endif
|
|
194
219
|
}
|
|
195
220
|
|
|
221
|
+
#ifdef USE_API_PASSWORD
|
|
196
222
|
bool APIServer::uses_password() const { return !this->password_.empty(); }
|
|
197
223
|
|
|
198
224
|
bool APIServer::check_password(const std::string &password) const {
|
|
@@ -223,192 +249,129 @@ bool APIServer::check_password(const std::string &password) const {
|
|
|
223
249
|
|
|
224
250
|
return result == 0;
|
|
225
251
|
}
|
|
252
|
+
#endif
|
|
226
253
|
|
|
227
254
|
void APIServer::handle_disconnect(APIConnection *conn) {}
|
|
228
255
|
|
|
256
|
+
// Macro for entities without extra parameters
|
|
257
|
+
#define API_DISPATCH_UPDATE(entity_type, entity_name) \
|
|
258
|
+
void APIServer::on_##entity_name##_update(entity_type *obj) { /* NOLINT(bugprone-macro-parentheses) */ \
|
|
259
|
+
if (obj->is_internal()) \
|
|
260
|
+
return; \
|
|
261
|
+
for (auto &c : this->clients_) \
|
|
262
|
+
c->send_##entity_name##_state(obj); \
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
// Macro for entities with extra parameters (but parameters not used in send)
|
|
266
|
+
#define API_DISPATCH_UPDATE_IGNORE_PARAMS(entity_type, entity_name, ...) \
|
|
267
|
+
void APIServer::on_##entity_name##_update(entity_type *obj, __VA_ARGS__) { /* NOLINT(bugprone-macro-parentheses) */ \
|
|
268
|
+
if (obj->is_internal()) \
|
|
269
|
+
return; \
|
|
270
|
+
for (auto &c : this->clients_) \
|
|
271
|
+
c->send_##entity_name##_state(obj); \
|
|
272
|
+
}
|
|
273
|
+
|
|
229
274
|
#ifdef USE_BINARY_SENSOR
|
|
230
|
-
|
|
231
|
-
if (obj->is_internal())
|
|
232
|
-
return;
|
|
233
|
-
for (auto &c : this->clients_)
|
|
234
|
-
c->send_binary_sensor_state(obj);
|
|
235
|
-
}
|
|
275
|
+
API_DISPATCH_UPDATE(binary_sensor::BinarySensor, binary_sensor)
|
|
236
276
|
#endif
|
|
237
277
|
|
|
238
278
|
#ifdef USE_COVER
|
|
239
|
-
|
|
240
|
-
if (obj->is_internal())
|
|
241
|
-
return;
|
|
242
|
-
for (auto &c : this->clients_)
|
|
243
|
-
c->send_cover_state(obj);
|
|
244
|
-
}
|
|
279
|
+
API_DISPATCH_UPDATE(cover::Cover, cover)
|
|
245
280
|
#endif
|
|
246
281
|
|
|
247
282
|
#ifdef USE_FAN
|
|
248
|
-
|
|
249
|
-
if (obj->is_internal())
|
|
250
|
-
return;
|
|
251
|
-
for (auto &c : this->clients_)
|
|
252
|
-
c->send_fan_state(obj);
|
|
253
|
-
}
|
|
283
|
+
API_DISPATCH_UPDATE(fan::Fan, fan)
|
|
254
284
|
#endif
|
|
255
285
|
|
|
256
286
|
#ifdef USE_LIGHT
|
|
257
|
-
|
|
258
|
-
if (obj->is_internal())
|
|
259
|
-
return;
|
|
260
|
-
for (auto &c : this->clients_)
|
|
261
|
-
c->send_light_state(obj);
|
|
262
|
-
}
|
|
287
|
+
API_DISPATCH_UPDATE(light::LightState, light)
|
|
263
288
|
#endif
|
|
264
289
|
|
|
265
290
|
#ifdef USE_SENSOR
|
|
266
|
-
|
|
267
|
-
if (obj->is_internal())
|
|
268
|
-
return;
|
|
269
|
-
for (auto &c : this->clients_)
|
|
270
|
-
c->send_sensor_state(obj);
|
|
271
|
-
}
|
|
291
|
+
API_DISPATCH_UPDATE_IGNORE_PARAMS(sensor::Sensor, sensor, float state)
|
|
272
292
|
#endif
|
|
273
293
|
|
|
274
294
|
#ifdef USE_SWITCH
|
|
275
|
-
|
|
276
|
-
if (obj->is_internal())
|
|
277
|
-
return;
|
|
278
|
-
for (auto &c : this->clients_)
|
|
279
|
-
c->send_switch_state(obj);
|
|
280
|
-
}
|
|
295
|
+
API_DISPATCH_UPDATE_IGNORE_PARAMS(switch_::Switch, switch, bool state)
|
|
281
296
|
#endif
|
|
282
297
|
|
|
283
298
|
#ifdef USE_TEXT_SENSOR
|
|
284
|
-
|
|
285
|
-
if (obj->is_internal())
|
|
286
|
-
return;
|
|
287
|
-
for (auto &c : this->clients_)
|
|
288
|
-
c->send_text_sensor_state(obj);
|
|
289
|
-
}
|
|
299
|
+
API_DISPATCH_UPDATE_IGNORE_PARAMS(text_sensor::TextSensor, text_sensor, const std::string &state)
|
|
290
300
|
#endif
|
|
291
301
|
|
|
292
302
|
#ifdef USE_CLIMATE
|
|
293
|
-
|
|
294
|
-
if (obj->is_internal())
|
|
295
|
-
return;
|
|
296
|
-
for (auto &c : this->clients_)
|
|
297
|
-
c->send_climate_state(obj);
|
|
298
|
-
}
|
|
303
|
+
API_DISPATCH_UPDATE(climate::Climate, climate)
|
|
299
304
|
#endif
|
|
300
305
|
|
|
301
306
|
#ifdef USE_NUMBER
|
|
302
|
-
|
|
303
|
-
if (obj->is_internal())
|
|
304
|
-
return;
|
|
305
|
-
for (auto &c : this->clients_)
|
|
306
|
-
c->send_number_state(obj);
|
|
307
|
-
}
|
|
307
|
+
API_DISPATCH_UPDATE_IGNORE_PARAMS(number::Number, number, float state)
|
|
308
308
|
#endif
|
|
309
309
|
|
|
310
310
|
#ifdef USE_DATETIME_DATE
|
|
311
|
-
|
|
312
|
-
if (obj->is_internal())
|
|
313
|
-
return;
|
|
314
|
-
for (auto &c : this->clients_)
|
|
315
|
-
c->send_date_state(obj);
|
|
316
|
-
}
|
|
311
|
+
API_DISPATCH_UPDATE(datetime::DateEntity, date)
|
|
317
312
|
#endif
|
|
318
313
|
|
|
319
314
|
#ifdef USE_DATETIME_TIME
|
|
320
|
-
|
|
321
|
-
if (obj->is_internal())
|
|
322
|
-
return;
|
|
323
|
-
for (auto &c : this->clients_)
|
|
324
|
-
c->send_time_state(obj);
|
|
325
|
-
}
|
|
315
|
+
API_DISPATCH_UPDATE(datetime::TimeEntity, time)
|
|
326
316
|
#endif
|
|
327
317
|
|
|
328
318
|
#ifdef USE_DATETIME_DATETIME
|
|
329
|
-
|
|
330
|
-
if (obj->is_internal())
|
|
331
|
-
return;
|
|
332
|
-
for (auto &c : this->clients_)
|
|
333
|
-
c->send_datetime_state(obj);
|
|
334
|
-
}
|
|
319
|
+
API_DISPATCH_UPDATE(datetime::DateTimeEntity, datetime)
|
|
335
320
|
#endif
|
|
336
321
|
|
|
337
322
|
#ifdef USE_TEXT
|
|
338
|
-
|
|
339
|
-
if (obj->is_internal())
|
|
340
|
-
return;
|
|
341
|
-
for (auto &c : this->clients_)
|
|
342
|
-
c->send_text_state(obj);
|
|
343
|
-
}
|
|
323
|
+
API_DISPATCH_UPDATE_IGNORE_PARAMS(text::Text, text, const std::string &state)
|
|
344
324
|
#endif
|
|
345
325
|
|
|
346
326
|
#ifdef USE_SELECT
|
|
347
|
-
|
|
348
|
-
if (obj->is_internal())
|
|
349
|
-
return;
|
|
350
|
-
for (auto &c : this->clients_)
|
|
351
|
-
c->send_select_state(obj);
|
|
352
|
-
}
|
|
327
|
+
API_DISPATCH_UPDATE_IGNORE_PARAMS(select::Select, select, const std::string &state, size_t index)
|
|
353
328
|
#endif
|
|
354
329
|
|
|
355
330
|
#ifdef USE_LOCK
|
|
356
|
-
|
|
357
|
-
if (obj->is_internal())
|
|
358
|
-
return;
|
|
359
|
-
for (auto &c : this->clients_)
|
|
360
|
-
c->send_lock_state(obj);
|
|
361
|
-
}
|
|
331
|
+
API_DISPATCH_UPDATE(lock::Lock, lock)
|
|
362
332
|
#endif
|
|
363
333
|
|
|
364
334
|
#ifdef USE_VALVE
|
|
365
|
-
|
|
366
|
-
if (obj->is_internal())
|
|
367
|
-
return;
|
|
368
|
-
for (auto &c : this->clients_)
|
|
369
|
-
c->send_valve_state(obj);
|
|
370
|
-
}
|
|
335
|
+
API_DISPATCH_UPDATE(valve::Valve, valve)
|
|
371
336
|
#endif
|
|
372
337
|
|
|
373
338
|
#ifdef USE_MEDIA_PLAYER
|
|
374
|
-
|
|
375
|
-
if (obj->is_internal())
|
|
376
|
-
return;
|
|
377
|
-
for (auto &c : this->clients_)
|
|
378
|
-
c->send_media_player_state(obj);
|
|
379
|
-
}
|
|
339
|
+
API_DISPATCH_UPDATE(media_player::MediaPlayer, media_player)
|
|
380
340
|
#endif
|
|
381
341
|
|
|
382
342
|
#ifdef USE_EVENT
|
|
343
|
+
// Event is a special case - it's the only entity that passes extra parameters to the send method
|
|
383
344
|
void APIServer::on_event(event::Event *obj, const std::string &event_type) {
|
|
345
|
+
if (obj->is_internal())
|
|
346
|
+
return;
|
|
384
347
|
for (auto &c : this->clients_)
|
|
385
348
|
c->send_event(obj, event_type);
|
|
386
349
|
}
|
|
387
350
|
#endif
|
|
388
351
|
|
|
389
352
|
#ifdef USE_UPDATE
|
|
353
|
+
// Update is a special case - the method is called on_update, not on_update_update
|
|
390
354
|
void APIServer::on_update(update::UpdateEntity *obj) {
|
|
355
|
+
if (obj->is_internal())
|
|
356
|
+
return;
|
|
391
357
|
for (auto &c : this->clients_)
|
|
392
358
|
c->send_update_state(obj);
|
|
393
359
|
}
|
|
394
360
|
#endif
|
|
395
361
|
|
|
396
362
|
#ifdef USE_ALARM_CONTROL_PANEL
|
|
397
|
-
|
|
398
|
-
if (obj->is_internal())
|
|
399
|
-
return;
|
|
400
|
-
for (auto &c : this->clients_)
|
|
401
|
-
c->send_alarm_control_panel_state(obj);
|
|
402
|
-
}
|
|
363
|
+
API_DISPATCH_UPDATE(alarm_control_panel::AlarmControlPanel, alarm_control_panel)
|
|
403
364
|
#endif
|
|
404
365
|
|
|
405
366
|
float APIServer::get_setup_priority() const { return setup_priority::AFTER_WIFI; }
|
|
406
367
|
|
|
407
368
|
void APIServer::set_port(uint16_t port) { this->port_ = port; }
|
|
408
369
|
|
|
370
|
+
#ifdef USE_API_PASSWORD
|
|
409
371
|
void APIServer::set_password(const std::string &password) { this->password_ = password; }
|
|
372
|
+
#endif
|
|
410
373
|
|
|
411
|
-
void APIServer::set_batch_delay(
|
|
374
|
+
void APIServer::set_batch_delay(uint16_t batch_delay) { this->batch_delay_ = batch_delay; }
|
|
412
375
|
|
|
413
376
|
void APIServer::send_homeassistant_service_call(const HomeassistantServiceResponse &call) {
|
|
414
377
|
for (auto &client : this->clients_) {
|
|
@@ -479,7 +442,7 @@ bool APIServer::save_noise_psk(psk_t psk, bool make_active) {
|
|
|
479
442
|
#ifdef USE_HOMEASSISTANT_TIME
|
|
480
443
|
void APIServer::request_time() {
|
|
481
444
|
for (auto &client : this->clients_) {
|
|
482
|
-
if (!client->
|
|
445
|
+
if (!client->flags_.remove && client->is_authenticated())
|
|
483
446
|
client->send_time_request();
|
|
484
447
|
}
|
|
485
448
|
}
|
|
@@ -503,8 +466,9 @@ void APIServer::on_shutdown() {
|
|
|
503
466
|
for (auto &c : this->clients_) {
|
|
504
467
|
if (!c->send_message(DisconnectRequest())) {
|
|
505
468
|
// If we can't send the disconnect request directly (tx_buffer full),
|
|
506
|
-
// schedule it
|
|
507
|
-
c->
|
|
469
|
+
// schedule it at the front of the batch so it will be sent with priority
|
|
470
|
+
c->schedule_message_front_(nullptr, &APIConnection::try_send_disconnect_request, DisconnectRequest::MESSAGE_TYPE,
|
|
471
|
+
DisconnectRequest::ESTIMATED_SIZE);
|
|
508
472
|
}
|
|
509
473
|
}
|
|
510
474
|
}
|
|
@@ -12,7 +12,9 @@
|
|
|
12
12
|
#include "esphome/core/log.h"
|
|
13
13
|
#include "list_entities.h"
|
|
14
14
|
#include "subscribe_state.h"
|
|
15
|
+
#ifdef USE_API_SERVICES
|
|
15
16
|
#include "user_services.h"
|
|
17
|
+
#endif
|
|
16
18
|
|
|
17
19
|
#include <vector>
|
|
18
20
|
|
|
@@ -35,13 +37,15 @@ class APIServer : public Component, public Controller {
|
|
|
35
37
|
void dump_config() override;
|
|
36
38
|
void on_shutdown() override;
|
|
37
39
|
bool teardown() override;
|
|
40
|
+
#ifdef USE_API_PASSWORD
|
|
38
41
|
bool check_password(const std::string &password) const;
|
|
39
42
|
bool uses_password() const;
|
|
40
|
-
void set_port(uint16_t port);
|
|
41
43
|
void set_password(const std::string &password);
|
|
44
|
+
#endif
|
|
45
|
+
void set_port(uint16_t port);
|
|
42
46
|
void set_reboot_timeout(uint32_t reboot_timeout);
|
|
43
|
-
void set_batch_delay(
|
|
44
|
-
|
|
47
|
+
void set_batch_delay(uint16_t batch_delay);
|
|
48
|
+
uint16_t get_batch_delay() const { return batch_delay_; }
|
|
45
49
|
|
|
46
50
|
// Get reference to shared buffer for API connections
|
|
47
51
|
std::vector<uint8_t> &get_shared_buffer_ref() { return shared_write_buffer_; }
|
|
@@ -54,7 +58,7 @@ class APIServer : public Component, public Controller {
|
|
|
54
58
|
|
|
55
59
|
void handle_disconnect(APIConnection *conn);
|
|
56
60
|
#ifdef USE_BINARY_SENSOR
|
|
57
|
-
void on_binary_sensor_update(binary_sensor::BinarySensor *obj
|
|
61
|
+
void on_binary_sensor_update(binary_sensor::BinarySensor *obj) override;
|
|
58
62
|
#endif
|
|
59
63
|
#ifdef USE_COVER
|
|
60
64
|
void on_cover_update(cover::Cover *obj) override;
|
|
@@ -105,7 +109,9 @@ class APIServer : public Component, public Controller {
|
|
|
105
109
|
void on_media_player_update(media_player::MediaPlayer *obj) override;
|
|
106
110
|
#endif
|
|
107
111
|
void send_homeassistant_service_call(const HomeassistantServiceResponse &call);
|
|
112
|
+
#ifdef USE_API_SERVICES
|
|
108
113
|
void register_user_service(UserServiceDescriptor *descriptor) { this->user_services_.push_back(descriptor); }
|
|
114
|
+
#endif
|
|
109
115
|
#ifdef USE_HOMEASSISTANT_TIME
|
|
110
116
|
void request_time();
|
|
111
117
|
#endif
|
|
@@ -134,27 +140,49 @@ class APIServer : public Component, public Controller {
|
|
|
134
140
|
void get_home_assistant_state(std::string entity_id, optional<std::string> attribute,
|
|
135
141
|
std::function<void(std::string)> f);
|
|
136
142
|
const std::vector<HomeAssistantStateSubscription> &get_state_subs() const;
|
|
143
|
+
#ifdef USE_API_SERVICES
|
|
137
144
|
const std::vector<UserServiceDescriptor *> &get_user_services() const { return this->user_services_; }
|
|
145
|
+
#endif
|
|
138
146
|
|
|
147
|
+
#ifdef USE_API_CLIENT_CONNECTED_TRIGGER
|
|
139
148
|
Trigger<std::string, std::string> *get_client_connected_trigger() const { return this->client_connected_trigger_; }
|
|
149
|
+
#endif
|
|
150
|
+
#ifdef USE_API_CLIENT_DISCONNECTED_TRIGGER
|
|
140
151
|
Trigger<std::string, std::string> *get_client_disconnected_trigger() const {
|
|
141
152
|
return this->client_disconnected_trigger_;
|
|
142
153
|
}
|
|
154
|
+
#endif
|
|
143
155
|
|
|
144
156
|
protected:
|
|
145
|
-
|
|
157
|
+
void schedule_reboot_timeout_();
|
|
158
|
+
// Pointers and pointer-like types first (4 bytes each)
|
|
146
159
|
std::unique_ptr<socket::Socket> socket_ = nullptr;
|
|
147
|
-
|
|
160
|
+
#ifdef USE_API_CLIENT_CONNECTED_TRIGGER
|
|
161
|
+
Trigger<std::string, std::string> *client_connected_trigger_ = new Trigger<std::string, std::string>();
|
|
162
|
+
#endif
|
|
163
|
+
#ifdef USE_API_CLIENT_DISCONNECTED_TRIGGER
|
|
164
|
+
Trigger<std::string, std::string> *client_disconnected_trigger_ = new Trigger<std::string, std::string>();
|
|
165
|
+
#endif
|
|
166
|
+
|
|
167
|
+
// 4-byte aligned types
|
|
148
168
|
uint32_t reboot_timeout_{300000};
|
|
149
|
-
|
|
150
|
-
|
|
169
|
+
|
|
170
|
+
// Vectors and strings (12 bytes each on 32-bit)
|
|
151
171
|
std::vector<std::unique_ptr<APIConnection>> clients_;
|
|
172
|
+
#ifdef USE_API_PASSWORD
|
|
152
173
|
std::string password_;
|
|
174
|
+
#endif
|
|
153
175
|
std::vector<uint8_t> shared_write_buffer_; // Shared proto write buffer for all connections
|
|
154
176
|
std::vector<HomeAssistantStateSubscription> state_subs_;
|
|
177
|
+
#ifdef USE_API_SERVICES
|
|
155
178
|
std::vector<UserServiceDescriptor *> user_services_;
|
|
156
|
-
|
|
157
|
-
|
|
179
|
+
#endif
|
|
180
|
+
|
|
181
|
+
// Group smaller types together
|
|
182
|
+
uint16_t port_{6053};
|
|
183
|
+
uint16_t batch_delay_{100};
|
|
184
|
+
bool shutting_down_ = false;
|
|
185
|
+
// 5 bytes used, 3 bytes padding
|
|
158
186
|
|
|
159
187
|
#ifdef USE_API_NOISE
|
|
160
188
|
std::shared_ptr<APINoiseContext> noise_ctx_ = std::make_shared<APINoiseContext>();
|
esphome/components/api/client.py
CHANGED
|
@@ -4,9 +4,15 @@ import asyncio
|
|
|
4
4
|
from datetime import datetime
|
|
5
5
|
import logging
|
|
6
6
|
from typing import TYPE_CHECKING, Any
|
|
7
|
+
import warnings
|
|
7
8
|
|
|
8
|
-
|
|
9
|
-
|
|
9
|
+
# Suppress protobuf version warnings
|
|
10
|
+
with warnings.catch_warnings():
|
|
11
|
+
warnings.filterwarnings(
|
|
12
|
+
"ignore", category=UserWarning, message=".*Protobuf gencode version.*"
|
|
13
|
+
)
|
|
14
|
+
from aioesphomeapi import APIClient, parse_log_message
|
|
15
|
+
from aioesphomeapi.log_runner import async_run
|
|
10
16
|
|
|
11
17
|
from esphome.const import CONF_KEY, CONF_PASSWORD, CONF_PORT, __version__
|
|
12
18
|
from esphome.core import CORE
|