esphome 2025.7.4__py3-none-any.whl → 2025.8.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.
Potentially problematic release.
This version of esphome might be problematic. Click here for more details.
- esphome/__main__.py +189 -82
- esphome/automation.py +2 -4
- esphome/build_gen/__init__.py +0 -0
- esphome/build_gen/platformio.py +102 -0
- esphome/components/a4988/a4988.cpp +0 -1
- esphome/components/absolute_humidity/absolute_humidity.cpp +0 -2
- esphome/components/absolute_humidity/sensor.py +2 -2
- esphome/components/adc/__init__.py +123 -85
- esphome/components/adc/adc_sensor.h +98 -35
- esphome/components/adc/adc_sensor_common.cpp +10 -4
- esphome/components/adc/adc_sensor_esp32.cpp +291 -123
- esphome/components/adc/adc_sensor_esp8266.cpp +1 -4
- esphome/components/adc/adc_sensor_libretiny.cpp +1 -2
- esphome/components/adc/adc_sensor_rp2040.cpp +1 -2
- esphome/components/adc/adc_sensor_zephyr.cpp +207 -0
- esphome/components/adc/sensor.py +61 -27
- esphome/components/adc128s102/adc128s102.cpp +1 -4
- esphome/components/ade7880/sensor.py +75 -49
- esphome/components/ads1115/ads1115.cpp +0 -1
- esphome/components/ads1118/ads1118.cpp +0 -1
- esphome/components/ags10/ags10.cpp +0 -4
- esphome/components/aht10/aht10.cpp +0 -4
- esphome/components/aic3204/aic3204.cpp +0 -2
- esphome/components/airthings_wave_plus/__init__.py +1 -1
- esphome/components/airthings_wave_plus/airthings_wave_plus.cpp +22 -4
- esphome/components/airthings_wave_plus/airthings_wave_plus.h +10 -1
- esphome/components/airthings_wave_plus/sensor.py +55 -28
- esphome/components/alarm_control_panel/__init__.py +4 -9
- esphome/components/am2315c/am2315c.cpp +0 -2
- esphome/components/am2320/am2320.cpp +0 -1
- esphome/components/animation/__init__.py +14 -11
- esphome/components/apds9306/apds9306.cpp +0 -4
- esphome/components/apds9960/apds9960.cpp +0 -1
- esphome/components/api/__init__.py +29 -4
- esphome/components/api/api_connection.cpp +378 -401
- esphome/components/api/api_connection.h +112 -56
- esphome/components/api/api_frame_helper.cpp +69 -896
- esphome/components/api/api_frame_helper.h +31 -126
- esphome/components/api/api_frame_helper_noise.cpp +583 -0
- esphome/components/api/api_frame_helper_noise.h +68 -0
- esphome/components/api/api_frame_helper_plaintext.cpp +290 -0
- esphome/components/api/api_frame_helper_plaintext.h +53 -0
- esphome/components/api/api_noise_context.h +2 -4
- esphome/components/api/api_pb2.cpp +1601 -1808
- esphome/components/api/api_pb2.h +367 -323
- esphome/components/api/api_pb2_dump.cpp +1137 -3466
- esphome/components/api/api_pb2_includes.h +34 -0
- esphome/components/api/api_pb2_service.cpp +94 -105
- esphome/components/api/api_pb2_service.h +27 -16
- esphome/components/api/api_server.cpp +18 -17
- esphome/components/api/api_server.h +8 -5
- esphome/components/api/client.py +16 -8
- esphome/components/api/custom_api_device.h +68 -14
- esphome/components/api/homeassistant_service.h +24 -19
- esphome/components/api/list_entities.cpp +3 -5
- esphome/components/api/list_entities.h +2 -4
- esphome/components/api/proto.cpp +3 -5
- esphome/components/api/proto.h +239 -274
- esphome/components/api/subscribe_state.cpp +2 -4
- esphome/components/api/subscribe_state.h +2 -4
- esphome/components/api/user_services.cpp +2 -4
- esphome/components/api/user_services.h +8 -8
- esphome/components/as3935/as3935.cpp +0 -2
- esphome/components/as3935_spi/as3935_spi.cpp +0 -2
- esphome/components/as5600/__init__.py +1 -1
- esphome/components/as5600/as5600.cpp +0 -2
- esphome/components/as5600/sensor/__init__.py +0 -1
- esphome/components/as7341/as7341.cpp +0 -1
- esphome/components/async_tcp/__init__.py +1 -1
- esphome/components/at581x/at581x.cpp +1 -1
- esphome/components/atm90e26/atm90e26.cpp +0 -1
- esphome/components/atm90e32/atm90e32.cpp +488 -118
- esphome/components/atm90e32/atm90e32.h +44 -5
- esphome/components/audio/audio.h +2 -2
- esphome/components/axs15231/touchscreen/axs15231_touchscreen.cpp +0 -2
- esphome/components/beken_spi_led_strip/led_strip.cpp +0 -2
- esphome/components/bh1750/bh1750.cpp +0 -1
- esphome/components/binary_sensor/__init__.py +14 -12
- esphome/components/ble_client/__init__.py +4 -7
- esphome/components/bluetooth_proxy/__init__.py +40 -3
- esphome/components/bluetooth_proxy/bluetooth_connection.cpp +387 -82
- esphome/components/bluetooth_proxy/bluetooth_connection.h +16 -5
- esphome/components/bluetooth_proxy/bluetooth_proxy.cpp +102 -311
- esphome/components/bluetooth_proxy/bluetooth_proxy.h +30 -14
- esphome/components/bme280_base/bme280_base.cpp +15 -16
- esphome/components/bme680/bme680.cpp +2 -3
- esphome/components/bme680_bsec/bme680_bsec.cpp +0 -2
- esphome/components/bme68x_bsec2/bme68x_bsec2.cpp +0 -2
- esphome/components/bmi160/bmi160.cpp +0 -1
- esphome/components/bmp085/bmp085.cpp +0 -1
- esphome/components/bmp280_base/bmp280_base.cpp +13 -14
- esphome/components/bmp3xx_base/bmp3xx_base.cpp +0 -1
- esphome/components/bmp581/bmp581.cpp +0 -2
- esphome/components/bp1658cj/bp1658cj.cpp +0 -1
- esphome/components/bp5758d/bp5758d.cpp +0 -1
- esphome/components/button/__init__.py +0 -1
- esphome/components/canbus/__init__.py +2 -3
- esphome/components/canbus/canbus.cpp +0 -1
- esphome/components/cap1188/cap1188.cpp +0 -2
- esphome/components/captive_portal/__init__.py +1 -1
- esphome/components/cd74hc4067/cd74hc4067.cpp +0 -2
- esphome/components/ch422g/ch422g.cpp +0 -1
- esphome/components/chsc6x/chsc6x_touchscreen.cpp +0 -3
- esphome/components/climate/__init__.py +0 -1
- esphome/components/climate/climate_traits.h +24 -0
- esphome/components/cm1106/cm1106.cpp +0 -1
- esphome/components/const/__init__.py +6 -0
- esphome/components/cover/__init__.py +0 -1
- esphome/components/cover/cover.cpp +9 -13
- esphome/components/cs5460a/cs5460a.cpp +0 -2
- esphome/components/cse7761/cse7761.cpp +0 -1
- esphome/components/cst226/touchscreen/cst226_touchscreen.cpp +0 -2
- esphome/components/cst816/touchscreen/cst816_touchscreen.cpp +0 -2
- esphome/components/dac7678/dac7678_output.cpp +0 -2
- esphome/components/dallas_temp/dallas_temp.cpp +0 -1
- esphome/components/datetime/__init__.py +0 -2
- esphome/components/debug/__init__.py +15 -1
- esphome/components/debug/debug_zephyr.cpp +281 -0
- esphome/components/debug/sensor.py +2 -1
- esphome/components/deep_sleep/deep_sleep_component.cpp +0 -1
- esphome/components/deep_sleep/deep_sleep_esp32.cpp +20 -1
- esphome/components/dfrobot_sen0395/__init__.py +1 -2
- esphome/components/dht/dht.cpp +0 -1
- esphome/components/dht12/dht12.cpp +0 -1
- esphome/components/display/__init__.py +16 -3
- esphome/components/display_menu_base/__init__.py +1 -1
- esphome/components/dps310/dps310.cpp +0 -2
- esphome/components/ds1307/ds1307.cpp +0 -1
- esphome/components/ds2484/ds2484.cpp +0 -1
- esphome/components/duty_cycle/duty_cycle_sensor.cpp +0 -1
- esphome/components/ee895/ee895.cpp +0 -1
- esphome/components/ektf2232/touchscreen/ektf2232.cpp +0 -1
- esphome/components/emc2101/emc2101.cpp +0 -2
- esphome/components/ens160_base/ens160_base.cpp +0 -2
- esphome/components/ens210/ens210.cpp +0 -1
- esphome/components/es7210/es7210.cpp +0 -2
- esphome/components/es7243e/es7243e.cpp +0 -2
- esphome/components/es8156/es8156.cpp +0 -2
- esphome/components/es8311/es8311.cpp +0 -2
- esphome/components/es8388/es8388.cpp +0 -2
- esphome/components/esp32/__init__.py +199 -58
- esphome/components/esp32/boards.py +17 -0
- esphome/components/esp32/gpio.cpp +0 -1
- esphome/components/esp32/gpio.py +1 -2
- esphome/components/esp32/gpio_esp32_h2.py +2 -7
- esphome/components/esp32/gpio_esp32_p4.py +2 -7
- esphome/components/esp32/post_build.py.script +112 -61
- esphome/components/esp32_ble/__init__.py +40 -2
- esphome/components/esp32_ble/ble.cpp +12 -8
- esphome/components/esp32_ble/ble.h +18 -18
- esphome/components/esp32_ble/ble_advertising.cpp +5 -5
- esphome/components/esp32_ble/ble_advertising.h +7 -5
- esphome/components/esp32_ble/ble_event.h +2 -4
- esphome/components/esp32_ble/ble_scan_result.h +2 -4
- esphome/components/esp32_ble/ble_uuid.cpp +5 -5
- esphome/components/esp32_ble/ble_uuid.h +6 -5
- esphome/components/esp32_ble_beacon/__init__.py +4 -0
- esphome/components/esp32_ble_client/__init__.py +1 -1
- esphome/components/esp32_ble_client/ble_characteristic.cpp +4 -4
- esphome/components/esp32_ble_client/ble_characteristic.h +6 -4
- esphome/components/esp32_ble_client/ble_client_base.cpp +155 -104
- esphome/components/esp32_ble_client/ble_client_base.h +17 -6
- esphome/components/esp32_ble_client/ble_descriptor.h +6 -4
- esphome/components/esp32_ble_client/ble_service.cpp +4 -4
- esphome/components/esp32_ble_client/ble_service.h +6 -4
- esphome/components/esp32_ble_server/__init__.py +15 -12
- esphome/components/esp32_ble_tracker/__init__.py +79 -11
- esphome/components/esp32_ble_tracker/automation.h +4 -4
- esphome/components/esp32_ble_tracker/esp32_ble_tracker.cpp +264 -261
- esphome/components/esp32_ble_tracker/esp32_ble_tracker.h +103 -37
- esphome/components/esp32_camera/__init__.py +13 -1
- esphome/components/esp32_camera/esp32_camera.cpp +7 -2
- esphome/components/esp32_camera/esp32_camera.h +1 -0
- esphome/components/esp32_dac/esp32_dac.cpp +3 -19
- esphome/components/esp32_dac/esp32_dac.h +4 -8
- esphome/components/esp32_rmt_led_strip/led_strip.cpp +1 -6
- esphome/components/esp32_rmt_led_strip/light.py +1 -1
- esphome/components/esp32_touch/__init__.py +2 -3
- esphome/components/esp32_touch/esp32_touch.h +9 -6
- esphome/components/esp32_touch/esp32_touch_common.cpp +2 -0
- esphome/components/esp32_touch/esp32_touch_v1.cpp +7 -9
- esphome/components/esp32_touch/esp32_touch_v2.cpp +10 -6
- esphome/components/esp8266/__init__.py +3 -1
- esphome/components/esp8266_pwm/esp8266_pwm.cpp +0 -1
- esphome/components/esphome/ota/__init__.py +1 -2
- esphome/components/esphome/ota/ota_esphome.cpp +150 -77
- esphome/components/esphome/ota/ota_esphome.h +8 -1
- esphome/components/espnow/__init__.py +309 -0
- esphome/components/espnow/automation.h +175 -0
- esphome/components/espnow/espnow_component.cpp +468 -0
- esphome/components/espnow/espnow_component.h +183 -0
- esphome/components/espnow/espnow_err.h +19 -0
- esphome/components/espnow/espnow_packet.h +166 -0
- esphome/components/ethernet/__init__.py +7 -1
- esphome/components/ethernet/esp_eth_phy_jl1101.c +5 -0
- esphome/components/ethernet/ethernet_component.cpp +0 -1
- esphome/components/ethernet/ethernet_component.h +4 -0
- esphome/components/ethernet_info/ethernet_info_text_sensor.h +0 -3
- esphome/components/event/__init__.py +0 -1
- esphome/components/factory_reset/__init__.py +92 -0
- esphome/components/factory_reset/factory_reset.cpp +76 -0
- esphome/components/factory_reset/factory_reset.h +43 -0
- esphome/components/fan/__init__.py +0 -1
- esphome/components/fan/fan_traits.h +16 -0
- esphome/components/fastled_base/fastled_light.cpp +0 -1
- esphome/components/fastled_spi/light.py +1 -3
- esphome/components/fingerprint_grow/fingerprint_grow.cpp +0 -2
- esphome/components/font/__init__.py +9 -1
- esphome/components/fs3000/fs3000.cpp +0 -2
- esphome/components/ft5x06/touchscreen/ft5x06_touchscreen.cpp +0 -2
- esphome/components/ft63x6/ft63x6.cpp +0 -1
- esphome/components/gdk101/gdk101.cpp +0 -1
- esphome/components/gl_r01_i2c/gl_r01_i2c.cpp +0 -1
- esphome/components/gl_r01_i2c/sensor.py +1 -1
- esphome/components/gpio/one_wire/gpio_one_wire.cpp +0 -1
- esphome/components/gpio/switch/gpio_switch.cpp +0 -2
- esphome/components/gpio_expander/cached_gpio.h +24 -15
- esphome/components/gps/__init__.py +6 -2
- esphome/components/gps/gps.cpp +50 -49
- esphome/components/gps/gps.h +4 -8
- esphome/components/gps/time/gps_time.cpp +3 -9
- esphome/components/gps/time/gps_time.h +4 -7
- esphome/components/graph/__init__.py +1 -1
- esphome/components/grove_gas_mc_v2/grove_gas_mc_v2.cpp +0 -1
- esphome/components/grove_tb6612fng/grove_tb6612fng.cpp +0 -1
- esphome/components/gt911/touchscreen/gt911_touchscreen.cpp +21 -12
- esphome/components/gt911/touchscreen/gt911_touchscreen.h +26 -2
- esphome/components/haier/climate.py +5 -10
- esphome/components/haier/haier_base.cpp +0 -1
- esphome/components/hbridge/switch/hbridge_switch.cpp +0 -2
- esphome/components/hdc1080/hdc1080.cpp +0 -2
- esphome/components/heatpumpir/climate.py +2 -2
- esphome/components/hlw8012/hlw8012.cpp +0 -1
- esphome/components/hm3301/hm3301.cpp +0 -1
- esphome/components/hmc5883l/hmc5883l.cpp +0 -1
- esphome/components/homeassistant/__init__.py +1 -0
- esphome/components/homeassistant/number/__init__.py +1 -0
- esphome/components/homeassistant/number/homeassistant_number.cpp +11 -7
- esphome/components/homeassistant/switch/__init__.py +1 -0
- esphome/components/homeassistant/switch/homeassistant_switch.cpp +9 -5
- esphome/components/honeywellabp/honeywellabp.cpp +1 -4
- esphome/components/host/__init__.py +2 -0
- esphome/components/hte501/hte501.cpp +0 -1
- esphome/components/http_request/__init__.py +2 -3
- esphome/components/http_request/http_request_idf.cpp +2 -2
- esphome/components/htu21d/htu21d.cpp +0 -2
- esphome/components/htu31d/htu31d.cpp +0 -2
- esphome/components/hx711/hx711.cpp +0 -1
- esphome/components/hydreon_rgxx/hydreon_rgxx.cpp +0 -1
- esphome/components/hydreon_rgxx/sensor.py +4 -5
- esphome/components/i2c/i2c_bus.h +1 -1
- esphome/components/i2c/i2c_bus_arduino.cpp +1 -2
- esphome/components/i2c/i2c_bus_esp_idf.cpp +192 -17
- esphome/components/i2c/i2c_bus_esp_idf.h +11 -1
- esphome/components/i2s_audio/__init__.py +6 -5
- esphome/components/i2s_audio/i2s_audio.cpp +0 -2
- esphome/components/i2s_audio/media_player/i2s_audio_media_player.cpp +1 -4
- esphome/components/i2s_audio/microphone/__init__.py +4 -6
- esphome/components/i2s_audio/microphone/i2s_audio_microphone.cpp +46 -19
- esphome/components/i2s_audio/microphone/i2s_audio_microphone.h +4 -3
- esphome/components/i2s_audio/speaker/i2s_audio_speaker.cpp +273 -269
- esphome/components/i2s_audio/speaker/i2s_audio_speaker.h +19 -34
- esphome/components/ili9xxx/display.py +4 -3
- esphome/components/ili9xxx/ili9xxx_display.cpp +0 -2
- esphome/components/image/__init__.py +123 -92
- esphome/components/improv_serial/__init__.py +7 -8
- esphome/components/ina219/ina219.cpp +0 -1
- esphome/components/ina226/ina226.cpp +0 -2
- esphome/components/ina260/ina260.cpp +0 -2
- esphome/components/ina2xx_base/__init__.py +2 -5
- esphome/components/ina2xx_base/ina2xx_base.cpp +0 -2
- esphome/components/ina3221/ina3221.cpp +0 -1
- esphome/components/internal_temperature/internal_temperature.cpp +0 -2
- esphome/components/interval/interval.h +5 -9
- esphome/components/json/__init__.py +1 -1
- esphome/components/kmeteriso/kmeteriso.cpp +0 -2
- esphome/components/lc709203f/lc709203f.cpp +0 -2
- esphome/components/lcd_gpio/display.py +1 -3
- esphome/components/lcd_gpio/gpio_lcd_display.cpp +0 -1
- esphome/components/lcd_pcf8574/pcf8574_display.cpp +0 -1
- esphome/components/ld2410/__init__.py +4 -6
- esphome/components/ld2410/binary_sensor.py +4 -0
- esphome/components/ld2410/ld2410.cpp +56 -100
- esphome/components/ld2410/ld2410.h +17 -15
- esphome/components/ld2410/sensor.py +24 -10
- esphome/components/ld2412/__init__.py +46 -0
- esphome/components/ld2412/binary_sensor.py +70 -0
- esphome/components/ld2412/button/__init__.py +74 -0
- esphome/components/ld2412/button/factory_reset_button.cpp +9 -0
- esphome/components/ld2412/button/factory_reset_button.h +18 -0
- esphome/components/ld2412/button/query_button.cpp +9 -0
- esphome/components/ld2412/button/query_button.h +18 -0
- esphome/components/ld2412/button/restart_button.cpp +9 -0
- esphome/components/ld2412/button/restart_button.h +18 -0
- esphome/components/ld2412/button/start_dynamic_background_correction_button.cpp +11 -0
- esphome/components/ld2412/button/start_dynamic_background_correction_button.h +18 -0
- esphome/components/ld2412/ld2412.cpp +861 -0
- esphome/components/ld2412/ld2412.h +141 -0
- esphome/components/ld2412/number/__init__.py +126 -0
- esphome/components/ld2412/number/gate_threshold_number.cpp +14 -0
- esphome/components/ld2412/number/gate_threshold_number.h +19 -0
- esphome/components/ld2412/number/light_threshold_number.cpp +12 -0
- esphome/components/ld2412/number/light_threshold_number.h +18 -0
- esphome/components/ld2412/number/max_distance_timeout_number.cpp +12 -0
- esphome/components/ld2412/number/max_distance_timeout_number.h +18 -0
- esphome/components/ld2412/select/__init__.py +82 -0
- esphome/components/ld2412/select/baud_rate_select.cpp +12 -0
- esphome/components/ld2412/select/baud_rate_select.h +18 -0
- esphome/components/ld2412/select/distance_resolution_select.cpp +12 -0
- esphome/components/ld2412/select/distance_resolution_select.h +18 -0
- esphome/components/ld2412/select/light_out_control_select.cpp +12 -0
- esphome/components/ld2412/select/light_out_control_select.h +18 -0
- esphome/components/ld2412/sensor.py +124 -0
- esphome/components/ld2412/switch/__init__.py +45 -0
- esphome/components/ld2412/switch/bluetooth_switch.cpp +12 -0
- esphome/components/ld2412/switch/bluetooth_switch.h +18 -0
- esphome/components/ld2412/switch/engineering_mode_switch.cpp +12 -0
- esphome/components/ld2412/switch/engineering_mode_switch.h +18 -0
- esphome/components/ld2412/text_sensor.py +34 -0
- esphome/components/ld2420/ld2420.cpp +0 -1
- esphome/components/ld2450/__init__.py +3 -4
- esphome/components/ld2450/binary_sensor.py +3 -0
- esphome/components/ld2450/ld2450.cpp +77 -165
- esphome/components/ld2450/ld2450.h +26 -54
- esphome/components/ld2450/sensor.py +120 -6
- esphome/components/ld2450/text_sensor.py +5 -4
- esphome/components/ld24xx/__init__.py +1 -0
- esphome/components/ld24xx/ld24xx.h +65 -0
- esphome/components/ledc/ledc_output.cpp +0 -1
- esphome/components/libretiny/__init__.py +2 -0
- esphome/components/light/__init__.py +0 -1
- esphome/components/light/effects.py +70 -45
- esphome/components/light/light_call.cpp +101 -66
- esphome/components/light/light_color_values.h +16 -11
- esphome/components/light/light_json_schema.cpp +46 -44
- esphome/components/light/light_state.cpp +8 -11
- esphome/components/light/light_traits.h +17 -0
- esphome/components/lightwaverf/lightwaverf.cpp +0 -2
- esphome/components/lilygo_t5_47/touchscreen/lilygo_t5_47_touchscreen.cpp +0 -1
- esphome/components/lock/__init__.py +0 -1
- esphome/components/logger/__init__.py +31 -9
- esphome/components/logger/logger.cpp +12 -7
- esphome/components/logger/logger.h +25 -14
- esphome/components/logger/logger_esp32.cpp +2 -7
- esphome/components/logger/logger_esp8266.cpp +2 -4
- esphome/components/logger/logger_host.cpp +2 -4
- esphome/components/logger/logger_libretiny.cpp +2 -4
- esphome/components/logger/logger_rp2040.cpp +2 -4
- esphome/components/logger/logger_zephyr.cpp +86 -0
- esphome/components/logger/select/logger_level_select.cpp +2 -4
- esphome/components/logger/select/logger_level_select.h +2 -4
- esphome/components/logger/task_log_buffer.cpp +2 -4
- esphome/components/logger/task_log_buffer.h +2 -4
- esphome/components/lps22/sensor.py +5 -5
- esphome/components/ltr390/ltr390.cpp +0 -2
- esphome/components/ltr501/ltr501.cpp +0 -1
- esphome/components/ltr_als_ps/ltr_als_ps.cpp +0 -1
- esphome/components/lvgl/__init__.py +14 -13
- esphome/components/lvgl/automation.py +2 -4
- esphome/components/lvgl/defines.py +0 -2
- esphome/components/lvgl/helpers.py +1 -1
- esphome/components/lvgl/lv_validation.py +7 -4
- esphome/components/lvgl/lvgl_esphome.cpp +2 -3
- esphome/components/lvgl/styles.py +2 -2
- esphome/components/lvgl/types.py +1 -1
- esphome/components/lvgl/widgets/__init__.py +2 -2
- esphome/components/lvgl/widgets/arc.py +14 -11
- esphome/components/lvgl/widgets/buttonmatrix.py +1 -1
- esphome/components/lvgl/widgets/qrcode.py +7 -7
- esphome/components/lvgl/widgets/spinner.py +6 -6
- esphome/components/lvgl/widgets/switch.py +2 -2
- esphome/components/lvgl/widgets/tabview.py +3 -3
- esphome/components/lvgl/widgets/tileview.py +15 -7
- esphome/components/m5stack_8angle/m5stack_8angle.cpp +0 -1
- esphome/components/matrix_keypad/__init__.py +4 -3
- esphome/components/max17043/max17043.cpp +0 -2
- esphome/components/max31855/max31855.cpp +1 -4
- esphome/components/max31856/max31856.cpp +0 -4
- esphome/components/max31865/max31865.cpp +0 -1
- esphome/components/max44009/max44009.cpp +0 -1
- esphome/components/max6675/max6675.cpp +1 -4
- esphome/components/max6956/max6956.cpp +0 -1
- esphome/components/max7219/max7219.cpp +0 -1
- esphome/components/max7219digit/display.py +1 -1
- esphome/components/max7219digit/max7219digit.cpp +0 -1
- esphome/components/max9611/max9611.cpp +0 -1
- esphome/components/mcp23008/__init__.py +1 -1
- esphome/components/mcp23008/mcp23008.cpp +0 -1
- esphome/components/mcp23016/mcp23016.cpp +0 -1
- esphome/components/mcp23017/__init__.py +1 -1
- esphome/components/mcp23017/mcp23017.cpp +0 -1
- esphome/components/mcp23s08/__init__.py +1 -1
- esphome/components/mcp23s08/mcp23s08.cpp +0 -1
- esphome/components/mcp23s17/__init__.py +1 -1
- esphome/components/mcp23s17/mcp23s17.cpp +0 -1
- esphome/components/mcp23x08_base/__init__.py +2 -0
- esphome/components/mcp23x08_base/mcp23x08_base.cpp +9 -7
- esphome/components/mcp23x08_base/mcp23x08_base.h +9 -4
- esphome/components/mcp23x17_base/__init__.py +2 -0
- esphome/components/mcp23x17_base/mcp23x17_base.cpp +20 -7
- esphome/components/mcp23x17_base/mcp23x17_base.h +9 -4
- esphome/components/mcp23xxx_base/__init__.py +11 -5
- esphome/components/mcp23xxx_base/mcp23xxx_base.cpp +15 -12
- esphome/components/mcp23xxx_base/mcp23xxx_base.h +8 -7
- esphome/components/mcp3008/mcp3008.cpp +1 -4
- esphome/components/mcp3204/mcp3204.cpp +1 -4
- esphome/components/mcp4461/mcp4461.cpp +0 -1
- esphome/components/mcp4725/mcp4725.cpp +0 -1
- esphome/components/mcp4728/mcp4728.cpp +0 -1
- esphome/components/mcp9600/mcp9600.cpp +0 -2
- esphome/components/mcp9808/mcp9808.cpp +0 -2
- esphome/components/mdns/__init__.py +3 -0
- esphome/components/mdns/mdns_component.cpp +2 -0
- esphome/components/mdns/mdns_component.h +4 -0
- esphome/components/media_player/__init__.py +40 -0
- esphome/components/media_player/automation.h +16 -0
- esphome/components/media_player/media_player.cpp +13 -0
- esphome/components/media_player/media_player.h +50 -3
- esphome/components/micro_wake_word/micro_wake_word.cpp +0 -3
- esphome/components/mics_4514/mics_4514.cpp +1 -6
- esphome/components/midea/ir_transmitter.h +4 -4
- esphome/components/mipi/__init__.py +416 -0
- esphome/components/mipi_dsi/__init__.py +5 -0
- esphome/components/mipi_dsi/display.py +233 -0
- esphome/components/mipi_dsi/mipi_dsi.cpp +379 -0
- esphome/components/mipi_dsi/mipi_dsi.h +123 -0
- esphome/components/mipi_dsi/models/__init__.py +0 -0
- esphome/components/mipi_dsi/models/guition.py +38 -0
- esphome/components/mipi_dsi/models/m5stack.py +57 -0
- esphome/components/mipi_dsi/models/waveshare.py +105 -0
- esphome/components/mipi_rgb/models/lilygo.py +0 -0
- esphome/components/mipi_spi/__init__.py +0 -9
- esphome/components/mipi_spi/display.py +220 -256
- esphome/components/mipi_spi/mipi_spi.cpp +1 -485
- esphome/components/mipi_spi/mipi_spi.h +556 -108
- esphome/components/mipi_spi/models/__init__.py +0 -65
- esphome/components/mipi_spi/models/adafruit.py +30 -0
- esphome/components/mipi_spi/models/amoled.py +41 -5
- esphome/components/mipi_spi/models/ili.py +5 -5
- esphome/components/mipi_spi/models/jc.py +1 -3
- esphome/components/mipi_spi/models/lilygo.py +1 -1
- esphome/components/mipi_spi/models/waveshare.py +16 -1
- esphome/components/mixer/speaker/__init__.py +4 -5
- esphome/components/mlx90393/sensor.py +7 -5
- esphome/components/mlx90393/sensor_mlx90393.cpp +0 -1
- esphome/components/mlx90614/mlx90614.cpp +0 -1
- esphome/components/mmc5603/mmc5603.cpp +0 -1
- esphome/components/mmc5983/mmc5983.cpp +0 -2
- esphome/components/mpl3115a2/mpl3115a2.cpp +0 -2
- esphome/components/mpr121/__init__.py +7 -6
- esphome/components/mpr121/mpr121.cpp +0 -1
- esphome/components/mpu6050/mpu6050.cpp +0 -1
- esphome/components/mpu6886/mpu6886.cpp +0 -1
- esphome/components/mqtt/__init__.py +1 -2
- esphome/components/mqtt/mqtt_button.cpp +1 -1
- esphome/components/mqtt/mqtt_client.cpp +0 -1
- esphome/components/mqtt/mqtt_component.cpp +8 -14
- esphome/components/mqtt/mqtt_component.h +0 -7
- esphome/components/mqtt/mqtt_sensor.cpp +0 -1
- esphome/components/mqtt/mqtt_sensor.h +0 -1
- esphome/components/mqtt/mqtt_text_sensor.cpp +0 -1
- esphome/components/mqtt/mqtt_text_sensor.h +0 -1
- esphome/components/ms5611/ms5611.cpp +0 -1
- esphome/components/ms8607/ms8607.cpp +0 -1
- esphome/components/msa3xx/msa3xx.cpp +0 -2
- esphome/components/my9231/my9231.cpp +0 -2
- esphome/components/nau7802/nau7802.cpp +0 -1
- esphome/components/neopixelbus/light.py +3 -0
- esphome/components/network/util.cpp +29 -0
- esphome/components/nextion/nextion.cpp +0 -1
- esphome/components/nfc/binary_sensor/{binary_sensor.cpp → nfc_binary_sensor.cpp} +1 -1
- esphome/components/npi19/npi19.cpp +0 -2
- esphome/components/nrf52/__init__.py +223 -0
- esphome/components/nrf52/boards.py +34 -0
- esphome/components/nrf52/const.py +18 -0
- esphome/components/nrf52/gpio.py +79 -0
- esphome/components/number/__init__.py +2 -1
- esphome/components/one_wire/__init__.py +1 -2
- esphome/components/one_wire/one_wire.cpp +0 -2
- esphome/components/one_wire/one_wire.h +0 -2
- esphome/components/opentherm/hub.cpp +0 -1
- esphome/components/opentherm/number/__init__.py +2 -2
- esphome/components/openthread/__init__.py +2 -3
- esphome/components/openthread/openthread.cpp +30 -13
- esphome/components/openthread/openthread.h +3 -0
- esphome/components/openthread/openthread_esp.cpp +3 -1
- esphome/components/opt3001/sensor.py +2 -6
- esphome/components/output/__init__.py +38 -0
- esphome/components/output/automation.h +24 -0
- esphome/components/output/switch/output_switch.cpp +0 -2
- esphome/components/packages/__init__.py +1 -2
- esphome/components/packet_transport/__init__.py +4 -3
- esphome/components/pca6416a/pca6416a.cpp +0 -1
- esphome/components/pca9554/pca9554.cpp +0 -1
- esphome/components/pca9685/pca9685_output.cpp +0 -2
- esphome/components/pcf85063/pcf85063.cpp +0 -1
- esphome/components/pcf8563/pcf8563.cpp +0 -1
- esphome/components/pcf8574/pcf8574.cpp +0 -1
- esphome/components/pi4ioe5v6408/pi4ioe5v6408.cpp +0 -1
- esphome/components/pipsolar/sensor/__init__.py +1 -1
- esphome/components/pm2005/pm2005.cpp +0 -1
- esphome/components/pmsa003i/pmsa003i.cpp +0 -2
- esphome/components/pmwcs3/sensor.py +1 -2
- esphome/components/pn532/pn532.cpp +0 -2
- esphome/components/pn532_spi/pn532_spi.cpp +0 -2
- esphome/components/power_supply/power_supply.cpp +7 -10
- esphome/components/power_supply/power_supply.h +1 -1
- esphome/components/psram/__init__.py +2 -1
- esphome/components/pulse_counter/pulse_counter_sensor.cpp +0 -1
- esphome/components/pulse_counter/sensor.py +9 -6
- esphome/components/pylontech/pylontech.cpp +0 -1
- esphome/components/qmc5883l/qmc5883l.cpp +0 -1
- esphome/components/qmp6988/qmp6988.cpp +0 -2
- esphome/components/qspi_dbi/display.py +2 -3
- esphome/components/qspi_dbi/qspi_dbi.cpp +0 -2
- esphome/components/qwiic_pir/binary_sensor.py +2 -3
- esphome/components/qwiic_pir/qwiic_pir.cpp +0 -2
- esphome/components/rc522/rc522.cpp +9 -31
- esphome/components/rc522_spi/rc522_spi.cpp +0 -1
- esphome/components/remote_base/__init__.py +5 -6
- esphome/components/remote_receiver/remote_receiver_esp32.cpp +0 -1
- esphome/components/remote_receiver/remote_receiver_esp8266.cpp +0 -1
- esphome/components/remote_receiver/remote_receiver_libretiny.cpp +0 -1
- esphome/components/remote_transmitter/__init__.py +26 -0
- esphome/components/remote_transmitter/automation.h +18 -0
- esphome/components/remote_transmitter/remote_transmitter.h +2 -1
- esphome/components/remote_transmitter/remote_transmitter_esp32.cpp +0 -1
- esphome/components/remote_transmitter/remote_transmitter_esp8266.cpp +2 -0
- esphome/components/remote_transmitter/remote_transmitter_libretiny.cpp +2 -0
- esphome/components/resampler/speaker/__init__.py +4 -5
- esphome/components/rf_bridge/__init__.py +4 -8
- esphome/components/rotary_encoder/rotary_encoder.cpp +0 -2
- esphome/components/rp2040/__init__.py +3 -1
- esphome/components/rp2040_pio_led_strip/led_strip.cpp +0 -2
- esphome/components/rp2040_pio_led_strip/light.py +1 -2
- esphome/components/rp2040_pwm/rp2040_pwm.cpp +1 -5
- esphome/components/rpi_dpi_rgb/display.py +13 -15
- esphome/components/rpi_dpi_rgb/rpi_dpi_rgb.cpp +0 -3
- esphome/components/runtime_stats/__init__.py +34 -0
- esphome/components/runtime_stats/runtime_stats.cpp +102 -0
- esphome/components/runtime_stats/runtime_stats.h +132 -0
- esphome/components/scd30/scd30.cpp +0 -2
- esphome/components/scd30/sensor.py +1 -2
- esphome/components/scd4x/scd4x.cpp +0 -1
- esphome/components/scd4x/sensor.py +1 -3
- esphome/components/sdl/display.py +3 -1
- esphome/components/sdl/sdl_esphome.cpp +0 -2
- esphome/components/sdp3x/sdp3x.cpp +0 -2
- esphome/components/seeed_mr24hpc1/seeed_mr24hpc1.cpp +0 -2
- esphome/components/seeed_mr60fda2/seeed_mr60fda2.cpp +0 -3
- esphome/components/select/__init__.py +2 -3
- esphome/components/select/select_traits.cpp +1 -1
- esphome/components/select/select_traits.h +1 -1
- esphome/components/sen0321/sen0321.cpp +0 -1
- esphome/components/sen5x/sen5x.cpp +0 -2
- esphome/components/sensor/__init__.py +36 -4
- esphome/components/sensor/filter.cpp +49 -10
- esphome/components/sensor/filter.h +22 -7
- esphome/components/sensor/sensor.cpp +0 -1
- esphome/components/sensor/sensor.h +0 -9
- esphome/components/sfa30/sfa30.cpp +0 -4
- esphome/components/sgp30/sgp30.cpp +0 -2
- esphome/components/sgp4x/sensor.py +1 -1
- esphome/components/sgp4x/sgp4x.cpp +0 -2
- esphome/components/shelly_dimmer/shelly_dimmer.cpp +0 -2
- esphome/components/sht3xd/sht3xd.cpp +0 -2
- esphome/components/sht4x/sht4x.cpp +0 -2
- esphome/components/shtcx/shtcx.cpp +0 -1
- esphome/components/sim800l/__init__.py +2 -4
- esphome/components/sm16716/sm16716.cpp +0 -1
- esphome/components/sm2135/sm2135.cpp +0 -1
- esphome/components/sm2235/sm2235.cpp +0 -1
- esphome/components/sm2335/sm2335.cpp +0 -1
- esphome/components/sn74hc165/sn74hc165.cpp +0 -1
- esphome/components/sn74hc595/sn74hc595.cpp +0 -1
- esphome/components/sntp/sntp_component.cpp +0 -1
- esphome/components/sound_level/sensor.py +1 -1
- esphome/components/speaker/media_player/__init__.py +21 -33
- esphome/components/speaker/media_player/audio_pipeline.cpp +4 -7
- esphome/components/spi/__init__.py +29 -13
- esphome/components/spi/spi.cpp +0 -2
- esphome/components/spi_device/spi_device.cpp +1 -4
- esphome/components/sprinkler/__init__.py +4 -4
- esphome/components/sps30/sps30.cpp +0 -1
- esphome/components/ssd1306_base/__init__.py +11 -11
- esphome/components/ssd1306_base/ssd1306_base.cpp +1 -1
- esphome/components/ssd1306_i2c/ssd1306_i2c.cpp +0 -1
- esphome/components/ssd1306_spi/ssd1306_spi.cpp +0 -1
- esphome/components/ssd1322_spi/ssd1322_spi.cpp +0 -1
- esphome/components/ssd1325_spi/ssd1325_spi.cpp +0 -1
- esphome/components/ssd1327_i2c/ssd1327_i2c.cpp +0 -1
- esphome/components/ssd1327_spi/ssd1327_spi.cpp +0 -1
- esphome/components/ssd1331_spi/ssd1331_spi.cpp +0 -1
- esphome/components/ssd1351_spi/ssd1351_spi.cpp +0 -1
- esphome/components/st7567_i2c/st7567_i2c.cpp +0 -1
- esphome/components/st7567_spi/st7567_spi.cpp +0 -1
- esphome/components/st7701s/display.py +10 -14
- esphome/components/st7701s/st7701s.cpp +0 -3
- esphome/components/st7735/st7735.cpp +0 -1
- esphome/components/st7789v/st7789v.cpp +0 -1
- esphome/components/st7920/st7920.cpp +0 -1
- esphome/components/status_led/light/status_led_light.cpp +0 -2
- esphome/components/status_led/status_led.cpp +0 -1
- esphome/components/stepper/__init__.py +2 -4
- esphome/components/sts3x/sts3x.cpp +0 -1
- esphome/components/substitutions/__init__.py +10 -16
- esphome/components/substitutions/jinja.py +24 -1
- esphome/components/sun/__init__.py +2 -3
- esphome/components/switch/__init__.py +31 -1
- esphome/components/switch/automation.h +24 -0
- esphome/components/switch/switch.cpp +8 -0
- esphome/components/switch/switch.h +8 -0
- esphome/components/sx126x/sx126x.cpp +0 -2
- esphome/components/sx127x/sx127x.cpp +0 -2
- esphome/components/sx1509/__init__.py +7 -5
- esphome/components/sx1509/output/sx1509_float_output.cpp +1 -1
- esphome/components/sx1509/sx1509.cpp +0 -2
- esphome/components/syslog/esphome_syslog.cpp +1 -1
- esphome/components/tc74/tc74.cpp +0 -1
- esphome/components/tca9548a/tca9548a.cpp +0 -1
- esphome/components/tca9555/tca9555.cpp +0 -1
- esphome/components/tcs34725/tcs34725.cpp +0 -1
- esphome/components/tee501/tee501.cpp +0 -1
- esphome/components/tem3200/tem3200.cpp +0 -2
- esphome/components/template/alarm_control_panel/template_alarm_control_panel.cpp +0 -1
- esphome/components/template/cover/template_cover.cpp +0 -1
- esphome/components/template/select/template_select.cpp +0 -1
- esphome/components/template/text/template_text.cpp +0 -2
- esphome/components/template/valve/template_valve.cpp +0 -1
- esphome/components/text/__init__.py +0 -1
- esphome/components/text/text_traits.h +2 -0
- esphome/components/text_sensor/__init__.py +2 -1
- esphome/components/text_sensor/text_sensor.cpp +0 -2
- esphome/components/text_sensor/text_sensor.h +0 -8
- esphome/components/thermostat/climate.py +4 -4
- esphome/components/time/__init__.py +7 -4
- esphome/components/time/real_time_clock.cpp +16 -3
- esphome/components/tlc59208f/tlc59208f_output.cpp +0 -2
- esphome/components/tlc5947/tlc5947.cpp +0 -2
- esphome/components/tlc5971/tlc5971.cpp +0 -2
- esphome/components/tm1621/tm1621.cpp +0 -2
- esphome/components/tm1637/tm1637.cpp +0 -2
- esphome/components/tm1638/tm1638.cpp +0 -2
- esphome/components/tm1651/__init__.py +45 -48
- esphome/components/tm1651/tm1651.cpp +213 -47
- esphome/components/tm1651/tm1651.h +37 -32
- esphome/components/tmp117/tmp117.cpp +0 -2
- esphome/components/tsl2561/tsl2561.cpp +0 -1
- esphome/components/tsl2591/tsl2591.cpp +0 -1
- esphome/components/tt21100/touchscreen/tt21100.cpp +0 -2
- esphome/components/ttp229_bsf/ttp229_bsf.cpp +0 -1
- esphome/components/ttp229_lsf/ttp229_lsf.cpp +0 -1
- esphome/components/tuya/climate/__init__.py +9 -10
- esphome/components/tuya/number/__init__.py +8 -6
- esphome/components/tx20/tx20.cpp +0 -1
- esphome/components/uart/uart_component_esp32_arduino.cpp +0 -1
- esphome/components/uart/uart_component_esp8266.cpp +0 -1
- esphome/components/uart/uart_component_esp_idf.cpp +0 -2
- esphome/components/uart/uart_component_libretiny.cpp +0 -2
- esphome/components/uart/uart_component_rp2040.cpp +0 -2
- esphome/components/udp/__init__.py +1 -1
- esphome/components/ufire_ec/sensor.py +1 -2
- esphome/components/ufire_ec/ufire_ec.cpp +0 -2
- esphome/components/ufire_ise/sensor.py +1 -2
- esphome/components/ufire_ise/ufire_ise.cpp +0 -2
- esphome/components/ultrasonic/ultrasonic_sensor.cpp +0 -1
- esphome/components/update/__init__.py +0 -1
- esphome/components/uptime/sensor/uptime_seconds_sensor.cpp +0 -1
- esphome/components/uptime/sensor/uptime_seconds_sensor.h +0 -2
- esphome/components/usb_host/usb_host_client.cpp +0 -1
- esphome/components/usb_host/usb_host_component.cpp +0 -1
- esphome/components/valve/__init__.py +0 -1
- esphome/components/veml3235/veml3235.cpp +0 -3
- esphome/components/veml7700/veml7700.cpp +0 -2
- esphome/components/version/version_text_sensor.cpp +0 -1
- esphome/components/version/version_text_sensor.h +0 -1
- esphome/components/vl53l0x/vl53l0x_sensor.cpp +0 -4
- esphome/components/voice_assistant/voice_assistant.cpp +9 -8
- esphome/components/web_server/__init__.py +13 -0
- esphome/components/web_server/web_server.cpp +187 -352
- esphome/components/web_server/web_server.h +61 -1
- esphome/components/web_server_base/__init__.py +1 -1
- esphome/components/web_server_base/web_server_base.cpp +2 -0
- esphome/components/web_server_base/web_server_base.h +6 -0
- esphome/components/web_server_idf/web_server_idf.cpp +10 -8
- esphome/components/web_server_idf/web_server_idf.h +2 -0
- esphome/components/weikai_i2c/weikai_i2c.cpp +1 -2
- esphome/components/weikai_spi/weikai_spi.cpp +1 -1
- esphome/components/wifi/__init__.py +8 -43
- esphome/components/wifi/wifi_component.cpp +100 -36
- esphome/components/wifi/wifi_component.h +5 -1
- esphome/components/wifi/wifi_component_esp32_arduino.cpp +30 -0
- esphome/components/wifi/wifi_component_esp_idf.cpp +30 -0
- esphome/components/wifi_info/wifi_info_text_sensor.h +0 -6
- esphome/components/wifi_signal/wifi_signal_sensor.h +0 -1
- esphome/components/wireguard/wireguard.cpp +0 -2
- esphome/components/x9c/x9c.cpp +0 -2
- esphome/components/xgzp68xx/xgzp68xx.cpp +0 -1
- esphome/components/xl9535/xl9535.cpp +0 -2
- esphome/components/zephyr/__init__.py +252 -0
- esphome/components/zephyr/const.py +16 -0
- esphome/components/zephyr/core.cpp +90 -0
- esphome/components/zephyr/gpio.cpp +120 -0
- esphome/components/zephyr/gpio.h +38 -0
- esphome/components/zephyr/pre_build.py.script +4 -0
- esphome/components/zephyr/preferences.cpp +156 -0
- esphome/components/zephyr/preferences.h +13 -0
- esphome/config.py +38 -16
- esphome/config_helpers.py +1 -2
- esphome/config_validation.py +8 -15
- esphome/const.py +26 -1
- esphome/core/__init__.py +88 -51
- esphome/core/application.cpp +75 -21
- esphome/core/application.h +106 -171
- esphome/core/color.h +10 -0
- esphome/core/component.cpp +41 -25
- esphome/core/component.h +9 -6
- esphome/core/component_iterator.cpp +61 -261
- esphome/core/component_iterator.h +15 -0
- esphome/core/config.py +26 -11
- esphome/core/defines.h +40 -2
- esphome/core/entity_base.h +18 -0
- esphome/core/entity_helpers.py +41 -6
- esphome/core/helpers.cpp +8 -15
- esphome/core/helpers.h +60 -6
- esphome/core/lock_free_queue.h +1 -1
- esphome/core/scheduler.cpp +277 -74
- esphome/core/scheduler.h +89 -27
- esphome/cpp_generator.py +2 -6
- esphome/cpp_helpers.py +1 -1
- esphome/dashboard/dashboard.py +2 -3
- esphome/dashboard/dns.py +2 -8
- esphome/dashboard/web_server.py +34 -19
- esphome/espota2.py +1 -4
- esphome/git.py +3 -1
- esphome/helpers.py +23 -4
- esphome/log.py +3 -1
- esphome/mqtt.py +3 -5
- esphome/platformio_api.py +7 -4
- esphome/types.py +12 -0
- esphome/util.py +20 -8
- esphome/voluptuous_schema.py +4 -3
- esphome/vscode.py +1 -2
- esphome/wizard.py +1 -4
- esphome/writer.py +5 -107
- esphome/yaml_util.py +7 -5
- {esphome-2025.7.4.dist-info → esphome-2025.8.0b1.dist-info}/METADATA +12 -13
- {esphome-2025.7.4.dist-info → esphome-2025.8.0b1.dist-info}/RECORD +753 -673
- esphome/components/mipi_spi/models/commands.py +0 -82
- /esphome/components/nfc/binary_sensor/{binary_sensor.h → nfc_binary_sensor.h} +0 -0
- {esphome-2025.7.4.dist-info → esphome-2025.8.0b1.dist-info}/WHEEL +0 -0
- {esphome-2025.7.4.dist-info → esphome-2025.8.0b1.dist-info}/entry_points.txt +0 -0
- {esphome-2025.7.4.dist-info → esphome-2025.8.0b1.dist-info}/licenses/LICENSE +0 -0
- {esphome-2025.7.4.dist-info → esphome-2025.8.0b1.dist-info}/top_level.txt +0 -0
|
@@ -6,8 +6,7 @@
|
|
|
6
6
|
|
|
7
7
|
#include "api_pb2.h"
|
|
8
8
|
|
|
9
|
-
namespace esphome {
|
|
10
|
-
namespace api {
|
|
9
|
+
namespace esphome::api {
|
|
11
10
|
|
|
12
11
|
class APIServerConnectionBase : public ProtoService {
|
|
13
12
|
public:
|
|
@@ -18,11 +17,11 @@ class APIServerConnectionBase : public ProtoService {
|
|
|
18
17
|
public:
|
|
19
18
|
#endif
|
|
20
19
|
|
|
21
|
-
|
|
20
|
+
bool send_message(const ProtoMessage &msg, uint8_t message_type) {
|
|
22
21
|
#ifdef HAS_PROTO_MESSAGE_DUMP
|
|
23
22
|
this->log_send_message_(msg.message_name(), msg.dump());
|
|
24
23
|
#endif
|
|
25
|
-
return this->send_message_(msg,
|
|
24
|
+
return this->send_message_(msg, message_type);
|
|
26
25
|
}
|
|
27
26
|
|
|
28
27
|
virtual void on_hello_request(const HelloRequest &value){};
|
|
@@ -61,11 +60,17 @@ class APIServerConnectionBase : public ProtoService {
|
|
|
61
60
|
virtual void on_noise_encryption_set_key_request(const NoiseEncryptionSetKeyRequest &value){};
|
|
62
61
|
#endif
|
|
63
62
|
|
|
63
|
+
#ifdef USE_API_HOMEASSISTANT_SERVICES
|
|
64
64
|
virtual void on_subscribe_homeassistant_services_request(const SubscribeHomeassistantServicesRequest &value){};
|
|
65
|
+
#endif
|
|
65
66
|
|
|
67
|
+
#ifdef USE_API_HOMEASSISTANT_STATES
|
|
66
68
|
virtual void on_subscribe_home_assistant_states_request(const SubscribeHomeAssistantStatesRequest &value){};
|
|
69
|
+
#endif
|
|
67
70
|
|
|
71
|
+
#ifdef USE_API_HOMEASSISTANT_STATES
|
|
68
72
|
virtual void on_home_assistant_state_response(const HomeAssistantStateResponse &value){};
|
|
73
|
+
#endif
|
|
69
74
|
virtual void on_get_time_request(const GetTimeRequest &value){};
|
|
70
75
|
virtual void on_get_time_response(const GetTimeResponse &value){};
|
|
71
76
|
|
|
@@ -207,22 +212,26 @@ class APIServerConnectionBase : public ProtoService {
|
|
|
207
212
|
|
|
208
213
|
class APIServerConnection : public APIServerConnectionBase {
|
|
209
214
|
public:
|
|
210
|
-
virtual
|
|
211
|
-
virtual
|
|
212
|
-
virtual
|
|
213
|
-
virtual
|
|
214
|
-
virtual
|
|
215
|
+
virtual bool send_hello_response(const HelloRequest &msg) = 0;
|
|
216
|
+
virtual bool send_connect_response(const ConnectRequest &msg) = 0;
|
|
217
|
+
virtual bool send_disconnect_response(const DisconnectRequest &msg) = 0;
|
|
218
|
+
virtual bool send_ping_response(const PingRequest &msg) = 0;
|
|
219
|
+
virtual bool send_device_info_response(const DeviceInfoRequest &msg) = 0;
|
|
215
220
|
virtual void list_entities(const ListEntitiesRequest &msg) = 0;
|
|
216
221
|
virtual void subscribe_states(const SubscribeStatesRequest &msg) = 0;
|
|
217
222
|
virtual void subscribe_logs(const SubscribeLogsRequest &msg) = 0;
|
|
223
|
+
#ifdef USE_API_HOMEASSISTANT_SERVICES
|
|
218
224
|
virtual void subscribe_homeassistant_services(const SubscribeHomeassistantServicesRequest &msg) = 0;
|
|
225
|
+
#endif
|
|
226
|
+
#ifdef USE_API_HOMEASSISTANT_STATES
|
|
219
227
|
virtual void subscribe_home_assistant_states(const SubscribeHomeAssistantStatesRequest &msg) = 0;
|
|
220
|
-
|
|
228
|
+
#endif
|
|
229
|
+
virtual bool send_get_time_response(const GetTimeRequest &msg) = 0;
|
|
221
230
|
#ifdef USE_API_SERVICES
|
|
222
231
|
virtual void execute_service(const ExecuteServiceRequest &msg) = 0;
|
|
223
232
|
#endif
|
|
224
233
|
#ifdef USE_API_NOISE
|
|
225
|
-
virtual
|
|
234
|
+
virtual bool send_noise_encryption_set_key_response(const NoiseEncryptionSetKeyRequest &msg) = 0;
|
|
226
235
|
#endif
|
|
227
236
|
#ifdef USE_BUTTON
|
|
228
237
|
virtual void button_command(const ButtonCommandRequest &msg) = 0;
|
|
@@ -303,7 +312,7 @@ class APIServerConnection : public APIServerConnectionBase {
|
|
|
303
312
|
virtual void bluetooth_gatt_notify(const BluetoothGATTNotifyRequest &msg) = 0;
|
|
304
313
|
#endif
|
|
305
314
|
#ifdef USE_BLUETOOTH_PROXY
|
|
306
|
-
virtual
|
|
315
|
+
virtual bool send_subscribe_bluetooth_connections_free_response(
|
|
307
316
|
const SubscribeBluetoothConnectionsFreeRequest &msg) = 0;
|
|
308
317
|
#endif
|
|
309
318
|
#ifdef USE_BLUETOOTH_PROXY
|
|
@@ -316,8 +325,7 @@ class APIServerConnection : public APIServerConnectionBase {
|
|
|
316
325
|
virtual void subscribe_voice_assistant(const SubscribeVoiceAssistantRequest &msg) = 0;
|
|
317
326
|
#endif
|
|
318
327
|
#ifdef USE_VOICE_ASSISTANT
|
|
319
|
-
virtual
|
|
320
|
-
const VoiceAssistantConfigurationRequest &msg) = 0;
|
|
328
|
+
virtual bool send_voice_assistant_get_configuration_response(const VoiceAssistantConfigurationRequest &msg) = 0;
|
|
321
329
|
#endif
|
|
322
330
|
#ifdef USE_VOICE_ASSISTANT
|
|
323
331
|
virtual void voice_assistant_set_configuration(const VoiceAssistantSetConfiguration &msg) = 0;
|
|
@@ -334,8 +342,12 @@ class APIServerConnection : public APIServerConnectionBase {
|
|
|
334
342
|
void on_list_entities_request(const ListEntitiesRequest &msg) override;
|
|
335
343
|
void on_subscribe_states_request(const SubscribeStatesRequest &msg) override;
|
|
336
344
|
void on_subscribe_logs_request(const SubscribeLogsRequest &msg) override;
|
|
345
|
+
#ifdef USE_API_HOMEASSISTANT_SERVICES
|
|
337
346
|
void on_subscribe_homeassistant_services_request(const SubscribeHomeassistantServicesRequest &msg) override;
|
|
347
|
+
#endif
|
|
348
|
+
#ifdef USE_API_HOMEASSISTANT_STATES
|
|
338
349
|
void on_subscribe_home_assistant_states_request(const SubscribeHomeAssistantStatesRequest &msg) override;
|
|
350
|
+
#endif
|
|
339
351
|
void on_get_time_request(const GetTimeRequest &msg) override;
|
|
340
352
|
#ifdef USE_API_SERVICES
|
|
341
353
|
void on_execute_service_request(const ExecuteServiceRequest &msg) override;
|
|
@@ -445,5 +457,4 @@ class APIServerConnection : public APIServerConnectionBase {
|
|
|
445
457
|
#endif
|
|
446
458
|
};
|
|
447
459
|
|
|
448
|
-
} // namespace api
|
|
449
|
-
} // namespace esphome
|
|
460
|
+
} // namespace esphome::api
|
|
@@ -16,8 +16,7 @@
|
|
|
16
16
|
|
|
17
17
|
#include <algorithm>
|
|
18
18
|
|
|
19
|
-
namespace esphome {
|
|
20
|
-
namespace api {
|
|
19
|
+
namespace esphome::api {
|
|
21
20
|
|
|
22
21
|
static const char *const TAG = "api";
|
|
23
22
|
|
|
@@ -31,7 +30,6 @@ APIServer::APIServer() {
|
|
|
31
30
|
}
|
|
32
31
|
|
|
33
32
|
void APIServer::setup() {
|
|
34
|
-
ESP_LOGCONFIG(TAG, "Running setup");
|
|
35
33
|
this->setup_controller();
|
|
36
34
|
|
|
37
35
|
#ifdef USE_API_NOISE
|
|
@@ -105,7 +103,7 @@ void APIServer::setup() {
|
|
|
105
103
|
return;
|
|
106
104
|
}
|
|
107
105
|
for (auto &c : this->clients_) {
|
|
108
|
-
if (!c->flags_.remove)
|
|
106
|
+
if (!c->flags_.remove && c->get_log_subscription_level() >= level)
|
|
109
107
|
c->try_send_log_message(level, tag, message, message_len);
|
|
110
108
|
}
|
|
111
109
|
});
|
|
@@ -185,9 +183,9 @@ void APIServer::loop() {
|
|
|
185
183
|
|
|
186
184
|
// Rare case: handle disconnection
|
|
187
185
|
#ifdef USE_API_CLIENT_DISCONNECTED_TRIGGER
|
|
188
|
-
this->client_disconnected_trigger_->trigger(client->client_info_, client->
|
|
186
|
+
this->client_disconnected_trigger_->trigger(client->client_info_.name, client->client_info_.peername);
|
|
189
187
|
#endif
|
|
190
|
-
ESP_LOGV(TAG, "Remove connection %s", client->client_info_.c_str());
|
|
188
|
+
ESP_LOGV(TAG, "Remove connection %s", client->client_info_.name.c_str());
|
|
191
189
|
|
|
192
190
|
// Swap with the last element and pop (avoids expensive vector shifts)
|
|
193
191
|
if (client_index < this->clients_.size() - 1) {
|
|
@@ -205,22 +203,20 @@ void APIServer::loop() {
|
|
|
205
203
|
|
|
206
204
|
void APIServer::dump_config() {
|
|
207
205
|
ESP_LOGCONFIG(TAG,
|
|
208
|
-
"
|
|
206
|
+
"Server:\n"
|
|
209
207
|
" Address: %s:%u",
|
|
210
208
|
network::get_use_address().c_str(), this->port_);
|
|
211
209
|
#ifdef USE_API_NOISE
|
|
212
|
-
ESP_LOGCONFIG(TAG, "
|
|
210
|
+
ESP_LOGCONFIG(TAG, " Noise encryption: %s", YESNO(this->noise_ctx_->has_psk()));
|
|
213
211
|
if (!this->noise_ctx_->has_psk()) {
|
|
214
|
-
ESP_LOGCONFIG(TAG, " Supports
|
|
212
|
+
ESP_LOGCONFIG(TAG, " Supports encryption: YES");
|
|
215
213
|
}
|
|
216
214
|
#else
|
|
217
|
-
ESP_LOGCONFIG(TAG, "
|
|
215
|
+
ESP_LOGCONFIG(TAG, " Noise encryption: NO");
|
|
218
216
|
#endif
|
|
219
217
|
}
|
|
220
218
|
|
|
221
219
|
#ifdef USE_API_PASSWORD
|
|
222
|
-
bool APIServer::uses_password() const { return !this->password_.empty(); }
|
|
223
|
-
|
|
224
220
|
bool APIServer::check_password(const std::string &password) const {
|
|
225
221
|
// depend only on input password length
|
|
226
222
|
const char *a = this->password_.c_str();
|
|
@@ -373,12 +369,15 @@ void APIServer::set_password(const std::string &password) { this->password_ = pa
|
|
|
373
369
|
|
|
374
370
|
void APIServer::set_batch_delay(uint16_t batch_delay) { this->batch_delay_ = batch_delay; }
|
|
375
371
|
|
|
372
|
+
#ifdef USE_API_HOMEASSISTANT_SERVICES
|
|
376
373
|
void APIServer::send_homeassistant_service_call(const HomeassistantServiceResponse &call) {
|
|
377
374
|
for (auto &client : this->clients_) {
|
|
378
375
|
client->send_homeassistant_service_call(call);
|
|
379
376
|
}
|
|
380
377
|
}
|
|
378
|
+
#endif
|
|
381
379
|
|
|
380
|
+
#ifdef USE_API_HOMEASSISTANT_STATES
|
|
382
381
|
void APIServer::subscribe_home_assistant_state(std::string entity_id, optional<std::string> attribute,
|
|
383
382
|
std::function<void(std::string)> f) {
|
|
384
383
|
this->state_subs_.push_back(HomeAssistantStateSubscription{
|
|
@@ -402,6 +401,7 @@ void APIServer::get_home_assistant_state(std::string entity_id, optional<std::st
|
|
|
402
401
|
const std::vector<APIServer::HomeAssistantStateSubscription> &APIServer::get_state_subs() const {
|
|
403
402
|
return this->state_subs_;
|
|
404
403
|
}
|
|
404
|
+
#endif
|
|
405
405
|
|
|
406
406
|
uint16_t APIServer::get_port() const { return this->port_; }
|
|
407
407
|
|
|
@@ -428,10 +428,11 @@ bool APIServer::save_noise_psk(psk_t psk, bool make_active) {
|
|
|
428
428
|
ESP_LOGD(TAG, "Noise PSK saved");
|
|
429
429
|
if (make_active) {
|
|
430
430
|
this->set_timeout(100, [this, psk]() {
|
|
431
|
-
ESP_LOGW(TAG, "Disconnecting all clients to reset
|
|
431
|
+
ESP_LOGW(TAG, "Disconnecting all clients to reset PSK");
|
|
432
432
|
this->set_noise_psk(psk);
|
|
433
433
|
for (auto &c : this->clients_) {
|
|
434
|
-
|
|
434
|
+
DisconnectRequest req;
|
|
435
|
+
c->send_message(req, DisconnectRequest::MESSAGE_TYPE);
|
|
435
436
|
}
|
|
436
437
|
});
|
|
437
438
|
}
|
|
@@ -464,7 +465,8 @@ void APIServer::on_shutdown() {
|
|
|
464
465
|
|
|
465
466
|
// Send disconnect requests to all connected clients
|
|
466
467
|
for (auto &c : this->clients_) {
|
|
467
|
-
|
|
468
|
+
DisconnectRequest req;
|
|
469
|
+
if (!c->send_message(req, DisconnectRequest::MESSAGE_TYPE)) {
|
|
468
470
|
// If we can't send the disconnect request directly (tx_buffer full),
|
|
469
471
|
// schedule it at the front of the batch so it will be sent with priority
|
|
470
472
|
c->schedule_message_front_(nullptr, &APIConnection::try_send_disconnect_request, DisconnectRequest::MESSAGE_TYPE,
|
|
@@ -484,6 +486,5 @@ bool APIServer::teardown() {
|
|
|
484
486
|
return this->clients_.empty();
|
|
485
487
|
}
|
|
486
488
|
|
|
487
|
-
} // namespace api
|
|
488
|
-
} // namespace esphome
|
|
489
|
+
} // namespace esphome::api
|
|
489
490
|
#endif
|
|
@@ -18,8 +18,7 @@
|
|
|
18
18
|
|
|
19
19
|
#include <vector>
|
|
20
20
|
|
|
21
|
-
namespace esphome {
|
|
22
|
-
namespace api {
|
|
21
|
+
namespace esphome::api {
|
|
23
22
|
|
|
24
23
|
#ifdef USE_API_NOISE
|
|
25
24
|
struct SavedNoisePsk {
|
|
@@ -39,7 +38,6 @@ class APIServer : public Component, public Controller {
|
|
|
39
38
|
bool teardown() override;
|
|
40
39
|
#ifdef USE_API_PASSWORD
|
|
41
40
|
bool check_password(const std::string &password) const;
|
|
42
|
-
bool uses_password() const;
|
|
43
41
|
void set_password(const std::string &password);
|
|
44
42
|
#endif
|
|
45
43
|
void set_port(uint16_t port);
|
|
@@ -108,7 +106,9 @@ class APIServer : public Component, public Controller {
|
|
|
108
106
|
#ifdef USE_MEDIA_PLAYER
|
|
109
107
|
void on_media_player_update(media_player::MediaPlayer *obj) override;
|
|
110
108
|
#endif
|
|
109
|
+
#ifdef USE_API_HOMEASSISTANT_SERVICES
|
|
111
110
|
void send_homeassistant_service_call(const HomeassistantServiceResponse &call);
|
|
111
|
+
#endif
|
|
112
112
|
#ifdef USE_API_SERVICES
|
|
113
113
|
void register_user_service(UserServiceDescriptor *descriptor) { this->user_services_.push_back(descriptor); }
|
|
114
114
|
#endif
|
|
@@ -128,6 +128,7 @@ class APIServer : public Component, public Controller {
|
|
|
128
128
|
|
|
129
129
|
bool is_connected() const;
|
|
130
130
|
|
|
131
|
+
#ifdef USE_API_HOMEASSISTANT_STATES
|
|
131
132
|
struct HomeAssistantStateSubscription {
|
|
132
133
|
std::string entity_id;
|
|
133
134
|
optional<std::string> attribute;
|
|
@@ -140,6 +141,7 @@ class APIServer : public Component, public Controller {
|
|
|
140
141
|
void get_home_assistant_state(std::string entity_id, optional<std::string> attribute,
|
|
141
142
|
std::function<void(std::string)> f);
|
|
142
143
|
const std::vector<HomeAssistantStateSubscription> &get_state_subs() const;
|
|
144
|
+
#endif
|
|
143
145
|
#ifdef USE_API_SERVICES
|
|
144
146
|
const std::vector<UserServiceDescriptor *> &get_user_services() const { return this->user_services_; }
|
|
145
147
|
#endif
|
|
@@ -173,7 +175,9 @@ class APIServer : public Component, public Controller {
|
|
|
173
175
|
std::string password_;
|
|
174
176
|
#endif
|
|
175
177
|
std::vector<uint8_t> shared_write_buffer_; // Shared proto write buffer for all connections
|
|
178
|
+
#ifdef USE_API_HOMEASSISTANT_STATES
|
|
176
179
|
std::vector<HomeAssistantStateSubscription> state_subs_;
|
|
180
|
+
#endif
|
|
177
181
|
#ifdef USE_API_SERVICES
|
|
178
182
|
std::vector<UserServiceDescriptor *> user_services_;
|
|
179
183
|
#endif
|
|
@@ -197,6 +201,5 @@ template<typename... Ts> class APIConnectedCondition : public Condition<Ts...> {
|
|
|
197
201
|
bool check(Ts... x) override { return global_api_server->is_connected(); }
|
|
198
202
|
};
|
|
199
203
|
|
|
200
|
-
} // namespace api
|
|
201
|
-
} // namespace esphome
|
|
204
|
+
} // namespace esphome::api
|
|
202
205
|
#endif
|
esphome/components/api/client.py
CHANGED
|
@@ -14,6 +14,8 @@ with warnings.catch_warnings():
|
|
|
14
14
|
from aioesphomeapi import APIClient, parse_log_message
|
|
15
15
|
from aioesphomeapi.log_runner import async_run
|
|
16
16
|
|
|
17
|
+
import contextlib
|
|
18
|
+
|
|
17
19
|
from esphome.const import CONF_KEY, CONF_PASSWORD, CONF_PORT, __version__
|
|
18
20
|
from esphome.core import CORE
|
|
19
21
|
|
|
@@ -28,7 +30,7 @@ if TYPE_CHECKING:
|
|
|
28
30
|
_LOGGER = logging.getLogger(__name__)
|
|
29
31
|
|
|
30
32
|
|
|
31
|
-
async def async_run_logs(config: dict[str, Any],
|
|
33
|
+
async def async_run_logs(config: dict[str, Any], addresses: list[str]) -> None:
|
|
32
34
|
"""Run the logs command in the event loop."""
|
|
33
35
|
conf = config["api"]
|
|
34
36
|
name = config["esphome"]["name"]
|
|
@@ -37,13 +39,21 @@ async def async_run_logs(config: dict[str, Any], address: str) -> None:
|
|
|
37
39
|
noise_psk: str | None = None
|
|
38
40
|
if (encryption := conf.get(CONF_ENCRYPTION)) and (key := encryption.get(CONF_KEY)):
|
|
39
41
|
noise_psk = key
|
|
40
|
-
|
|
42
|
+
|
|
43
|
+
if len(addresses) == 1:
|
|
44
|
+
_LOGGER.info("Starting log output from %s using esphome API", addresses[0])
|
|
45
|
+
else:
|
|
46
|
+
_LOGGER.info(
|
|
47
|
+
"Starting log output from %s using esphome API", " or ".join(addresses)
|
|
48
|
+
)
|
|
49
|
+
|
|
41
50
|
cli = APIClient(
|
|
42
|
-
address
|
|
51
|
+
addresses[0], # Primary address for compatibility
|
|
43
52
|
port,
|
|
44
53
|
password,
|
|
45
54
|
client_info=f"ESPHome Logs {__version__}",
|
|
46
55
|
noise_psk=noise_psk,
|
|
56
|
+
addresses=addresses, # Pass all addresses for automatic retry
|
|
47
57
|
)
|
|
48
58
|
dashboard = CORE.dashboard
|
|
49
59
|
|
|
@@ -64,9 +74,7 @@ async def async_run_logs(config: dict[str, Any], address: str) -> None:
|
|
|
64
74
|
await stop()
|
|
65
75
|
|
|
66
76
|
|
|
67
|
-
def run_logs(config: dict[str, Any],
|
|
77
|
+
def run_logs(config: dict[str, Any], addresses: list[str]) -> None:
|
|
68
78
|
"""Run the logs command."""
|
|
69
|
-
|
|
70
|
-
asyncio.run(async_run_logs(config,
|
|
71
|
-
except KeyboardInterrupt:
|
|
72
|
-
pass
|
|
79
|
+
with contextlib.suppress(KeyboardInterrupt):
|
|
80
|
+
asyncio.run(async_run_logs(config, addresses))
|
|
@@ -6,8 +6,7 @@
|
|
|
6
6
|
#ifdef USE_API_SERVICES
|
|
7
7
|
#include "user_services.h"
|
|
8
8
|
#endif
|
|
9
|
-
namespace esphome {
|
|
10
|
-
namespace api {
|
|
9
|
+
namespace esphome::api {
|
|
11
10
|
|
|
12
11
|
#ifdef USE_API_SERVICES
|
|
13
12
|
template<typename T, typename... Ts> class CustomAPIDeviceService : public UserServiceBase<Ts...> {
|
|
@@ -57,6 +56,14 @@ class CustomAPIDevice {
|
|
|
57
56
|
auto *service = new CustomAPIDeviceService<T, Ts...>(name, arg_names, (T *) this, callback); // NOLINT
|
|
58
57
|
global_api_server->register_user_service(service);
|
|
59
58
|
}
|
|
59
|
+
#else
|
|
60
|
+
template<typename T, typename... Ts>
|
|
61
|
+
void register_service(void (T::*callback)(Ts...), const std::string &name,
|
|
62
|
+
const std::array<std::string, sizeof...(Ts)> &arg_names) {
|
|
63
|
+
static_assert(
|
|
64
|
+
sizeof(T) == 0,
|
|
65
|
+
"register_service() requires 'custom_services: true' in the 'api:' section of your YAML configuration");
|
|
66
|
+
}
|
|
60
67
|
#endif
|
|
61
68
|
|
|
62
69
|
/** Register a custom native API service that will show up in Home Assistant.
|
|
@@ -82,8 +89,15 @@ class CustomAPIDevice {
|
|
|
82
89
|
auto *service = new CustomAPIDeviceService<T>(name, {}, (T *) this, callback); // NOLINT
|
|
83
90
|
global_api_server->register_user_service(service);
|
|
84
91
|
}
|
|
92
|
+
#else
|
|
93
|
+
template<typename T> void register_service(void (T::*callback)(), const std::string &name) {
|
|
94
|
+
static_assert(
|
|
95
|
+
sizeof(T) == 0,
|
|
96
|
+
"register_service() requires 'custom_services: true' in the 'api:' section of your YAML configuration");
|
|
97
|
+
}
|
|
85
98
|
#endif
|
|
86
99
|
|
|
100
|
+
#ifdef USE_API_HOMEASSISTANT_STATES
|
|
87
101
|
/** Subscribe to the state (or attribute state) of an entity from Home Assistant.
|
|
88
102
|
*
|
|
89
103
|
* Usage:
|
|
@@ -135,7 +149,25 @@ class CustomAPIDevice {
|
|
|
135
149
|
auto f = std::bind(callback, (T *) this, entity_id, std::placeholders::_1);
|
|
136
150
|
global_api_server->subscribe_home_assistant_state(entity_id, optional<std::string>(attribute), f);
|
|
137
151
|
}
|
|
152
|
+
#else
|
|
153
|
+
template<typename T>
|
|
154
|
+
void subscribe_homeassistant_state(void (T::*callback)(std::string), const std::string &entity_id,
|
|
155
|
+
const std::string &attribute = "") {
|
|
156
|
+
static_assert(sizeof(T) == 0,
|
|
157
|
+
"subscribe_homeassistant_state() requires 'homeassistant_states: true' in the 'api:' section "
|
|
158
|
+
"of your YAML configuration");
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
template<typename T>
|
|
162
|
+
void subscribe_homeassistant_state(void (T::*callback)(std::string, std::string), const std::string &entity_id,
|
|
163
|
+
const std::string &attribute = "") {
|
|
164
|
+
static_assert(sizeof(T) == 0,
|
|
165
|
+
"subscribe_homeassistant_state() requires 'homeassistant_states: true' in the 'api:' section "
|
|
166
|
+
"of your YAML configuration");
|
|
167
|
+
}
|
|
168
|
+
#endif
|
|
138
169
|
|
|
170
|
+
#ifdef USE_API_HOMEASSISTANT_SERVICES
|
|
139
171
|
/** Call a Home Assistant service from ESPHome.
|
|
140
172
|
*
|
|
141
173
|
* Usage:
|
|
@@ -148,7 +180,7 @@ class CustomAPIDevice {
|
|
|
148
180
|
*/
|
|
149
181
|
void call_homeassistant_service(const std::string &service_name) {
|
|
150
182
|
HomeassistantServiceResponse resp;
|
|
151
|
-
resp.
|
|
183
|
+
resp.set_service(StringRef(service_name));
|
|
152
184
|
global_api_server->send_homeassistant_service_call(resp);
|
|
153
185
|
}
|
|
154
186
|
|
|
@@ -168,12 +200,12 @@ class CustomAPIDevice {
|
|
|
168
200
|
*/
|
|
169
201
|
void call_homeassistant_service(const std::string &service_name, const std::map<std::string, std::string> &data) {
|
|
170
202
|
HomeassistantServiceResponse resp;
|
|
171
|
-
resp.
|
|
203
|
+
resp.set_service(StringRef(service_name));
|
|
172
204
|
for (auto &it : data) {
|
|
173
|
-
|
|
174
|
-
kv
|
|
205
|
+
resp.data.emplace_back();
|
|
206
|
+
auto &kv = resp.data.back();
|
|
207
|
+
kv.set_key(StringRef(it.first));
|
|
175
208
|
kv.value = it.second;
|
|
176
|
-
resp.data.push_back(kv);
|
|
177
209
|
}
|
|
178
210
|
global_api_server->send_homeassistant_service_call(resp);
|
|
179
211
|
}
|
|
@@ -190,7 +222,7 @@ class CustomAPIDevice {
|
|
|
190
222
|
*/
|
|
191
223
|
void fire_homeassistant_event(const std::string &event_name) {
|
|
192
224
|
HomeassistantServiceResponse resp;
|
|
193
|
-
resp.
|
|
225
|
+
resp.set_service(StringRef(event_name));
|
|
194
226
|
resp.is_event = true;
|
|
195
227
|
global_api_server->send_homeassistant_service_call(resp);
|
|
196
228
|
}
|
|
@@ -210,18 +242,40 @@ class CustomAPIDevice {
|
|
|
210
242
|
*/
|
|
211
243
|
void fire_homeassistant_event(const std::string &service_name, const std::map<std::string, std::string> &data) {
|
|
212
244
|
HomeassistantServiceResponse resp;
|
|
213
|
-
resp.
|
|
245
|
+
resp.set_service(StringRef(service_name));
|
|
214
246
|
resp.is_event = true;
|
|
215
247
|
for (auto &it : data) {
|
|
216
|
-
|
|
217
|
-
kv
|
|
248
|
+
resp.data.emplace_back();
|
|
249
|
+
auto &kv = resp.data.back();
|
|
250
|
+
kv.set_key(StringRef(it.first));
|
|
218
251
|
kv.value = it.second;
|
|
219
|
-
resp.data.push_back(kv);
|
|
220
252
|
}
|
|
221
253
|
global_api_server->send_homeassistant_service_call(resp);
|
|
222
254
|
}
|
|
255
|
+
#else
|
|
256
|
+
template<typename T = void> void call_homeassistant_service(const std::string &service_name) {
|
|
257
|
+
static_assert(sizeof(T) == 0, "call_homeassistant_service() requires 'homeassistant_services: true' in the 'api:' "
|
|
258
|
+
"section of your YAML configuration");
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
template<typename T = void>
|
|
262
|
+
void call_homeassistant_service(const std::string &service_name, const std::map<std::string, std::string> &data) {
|
|
263
|
+
static_assert(sizeof(T) == 0, "call_homeassistant_service() requires 'homeassistant_services: true' in the 'api:' "
|
|
264
|
+
"section of your YAML configuration");
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
template<typename T = void> void fire_homeassistant_event(const std::string &event_name) {
|
|
268
|
+
static_assert(sizeof(T) == 0, "fire_homeassistant_event() requires 'homeassistant_services: true' in the 'api:' "
|
|
269
|
+
"section of your YAML configuration");
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
template<typename T = void>
|
|
273
|
+
void fire_homeassistant_event(const std::string &service_name, const std::map<std::string, std::string> &data) {
|
|
274
|
+
static_assert(sizeof(T) == 0, "fire_homeassistant_event() requires 'homeassistant_services: true' in the 'api:' "
|
|
275
|
+
"section of your YAML configuration");
|
|
276
|
+
}
|
|
277
|
+
#endif
|
|
223
278
|
};
|
|
224
279
|
|
|
225
|
-
} // namespace api
|
|
226
|
-
} // namespace esphome
|
|
280
|
+
} // namespace esphome::api
|
|
227
281
|
#endif
|
|
@@ -2,13 +2,13 @@
|
|
|
2
2
|
|
|
3
3
|
#include "api_server.h"
|
|
4
4
|
#ifdef USE_API
|
|
5
|
+
#ifdef USE_API_HOMEASSISTANT_SERVICES
|
|
5
6
|
#include "api_pb2.h"
|
|
6
7
|
#include "esphome/core/automation.h"
|
|
7
8
|
#include "esphome/core/helpers.h"
|
|
8
9
|
#include <vector>
|
|
9
10
|
|
|
10
|
-
namespace esphome {
|
|
11
|
-
namespace api {
|
|
11
|
+
namespace esphome::api {
|
|
12
12
|
|
|
13
13
|
template<typename... X> class TemplatableStringValue : public TemplatableValue<std::string, X...> {
|
|
14
14
|
private:
|
|
@@ -36,6 +36,9 @@ template<typename... X> class TemplatableStringValue : public TemplatableValue<s
|
|
|
36
36
|
|
|
37
37
|
template<typename... Ts> class TemplatableKeyValuePair {
|
|
38
38
|
public:
|
|
39
|
+
// Keys are always string literals from YAML dictionary keys (e.g., "code", "event")
|
|
40
|
+
// and never templatable values or lambdas. Only the value parameter can be a lambda/template.
|
|
41
|
+
// Using pass-by-value with std::move allows optimal performance for both lvalues and rvalues.
|
|
39
42
|
template<typename T> TemplatableKeyValuePair(std::string key, T value) : key(std::move(key)), value(value) {}
|
|
40
43
|
std::string key;
|
|
41
44
|
TemplatableStringValue<Ts...> value;
|
|
@@ -47,37 +50,39 @@ template<typename... Ts> class HomeAssistantServiceCallAction : public Action<Ts
|
|
|
47
50
|
|
|
48
51
|
template<typename T> void set_service(T service) { this->service_ = service; }
|
|
49
52
|
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
+
// Keys are always string literals from the Python code generation (e.g., cg.add(var.add_data("tag_id", templ))).
|
|
54
|
+
// The value parameter can be a lambda/template, but keys are never templatable.
|
|
55
|
+
// Using pass-by-value allows the compiler to optimize for both lvalues and rvalues.
|
|
56
|
+
template<typename T> void add_data(std::string key, T value) { this->data_.emplace_back(std::move(key), value); }
|
|
53
57
|
template<typename T> void add_data_template(std::string key, T value) {
|
|
54
|
-
this->data_template_.
|
|
58
|
+
this->data_template_.emplace_back(std::move(key), value);
|
|
55
59
|
}
|
|
56
60
|
template<typename T> void add_variable(std::string key, T value) {
|
|
57
|
-
this->variables_.
|
|
61
|
+
this->variables_.emplace_back(std::move(key), value);
|
|
58
62
|
}
|
|
59
63
|
|
|
60
64
|
void play(Ts... x) override {
|
|
61
65
|
HomeassistantServiceResponse resp;
|
|
62
|
-
|
|
66
|
+
std::string service_value = this->service_.value(x...);
|
|
67
|
+
resp.set_service(StringRef(service_value));
|
|
63
68
|
resp.is_event = this->is_event_;
|
|
64
69
|
for (auto &it : this->data_) {
|
|
65
|
-
|
|
66
|
-
kv
|
|
70
|
+
resp.data.emplace_back();
|
|
71
|
+
auto &kv = resp.data.back();
|
|
72
|
+
kv.set_key(StringRef(it.key));
|
|
67
73
|
kv.value = it.value.value(x...);
|
|
68
|
-
resp.data.push_back(kv);
|
|
69
74
|
}
|
|
70
75
|
for (auto &it : this->data_template_) {
|
|
71
|
-
|
|
72
|
-
kv
|
|
76
|
+
resp.data_template.emplace_back();
|
|
77
|
+
auto &kv = resp.data_template.back();
|
|
78
|
+
kv.set_key(StringRef(it.key));
|
|
73
79
|
kv.value = it.value.value(x...);
|
|
74
|
-
resp.data_template.push_back(kv);
|
|
75
80
|
}
|
|
76
81
|
for (auto &it : this->variables_) {
|
|
77
|
-
|
|
78
|
-
kv
|
|
82
|
+
resp.variables.emplace_back();
|
|
83
|
+
auto &kv = resp.variables.back();
|
|
84
|
+
kv.set_key(StringRef(it.key));
|
|
79
85
|
kv.value = it.value.value(x...);
|
|
80
|
-
resp.variables.push_back(kv);
|
|
81
86
|
}
|
|
82
87
|
this->parent_->send_homeassistant_service_call(resp);
|
|
83
88
|
}
|
|
@@ -91,6 +96,6 @@ template<typename... Ts> class HomeAssistantServiceCallAction : public Action<Ts
|
|
|
91
96
|
std::vector<TemplatableKeyValuePair<Ts...>> variables_;
|
|
92
97
|
};
|
|
93
98
|
|
|
94
|
-
} // namespace api
|
|
95
|
-
|
|
99
|
+
} // namespace esphome::api
|
|
100
|
+
#endif
|
|
96
101
|
#endif
|
|
@@ -6,8 +6,7 @@
|
|
|
6
6
|
#include "esphome/core/log.h"
|
|
7
7
|
#include "esphome/core/util.h"
|
|
8
8
|
|
|
9
|
-
namespace esphome {
|
|
10
|
-
namespace api {
|
|
9
|
+
namespace esphome::api {
|
|
11
10
|
|
|
12
11
|
// Generate entity handler implementations using macros
|
|
13
12
|
#ifdef USE_BINARY_SENSOR
|
|
@@ -86,10 +85,9 @@ ListEntitiesIterator::ListEntitiesIterator(APIConnection *client) : client_(clie
|
|
|
86
85
|
#ifdef USE_API_SERVICES
|
|
87
86
|
bool ListEntitiesIterator::on_service(UserServiceDescriptor *service) {
|
|
88
87
|
auto resp = service->encode_list_service_response();
|
|
89
|
-
return this->client_->send_message(resp);
|
|
88
|
+
return this->client_->send_message(resp, ListEntitiesServicesResponse::MESSAGE_TYPE);
|
|
90
89
|
}
|
|
91
90
|
#endif
|
|
92
91
|
|
|
93
|
-
} // namespace api
|
|
94
|
-
} // namespace esphome
|
|
92
|
+
} // namespace esphome::api
|
|
95
93
|
#endif
|
|
@@ -4,8 +4,7 @@
|
|
|
4
4
|
#ifdef USE_API
|
|
5
5
|
#include "esphome/core/component.h"
|
|
6
6
|
#include "esphome/core/component_iterator.h"
|
|
7
|
-
namespace esphome {
|
|
8
|
-
namespace api {
|
|
7
|
+
namespace esphome::api {
|
|
9
8
|
|
|
10
9
|
class APIConnection;
|
|
11
10
|
|
|
@@ -96,6 +95,5 @@ class ListEntitiesIterator : public ComponentIterator {
|
|
|
96
95
|
APIConnection *client_;
|
|
97
96
|
};
|
|
98
97
|
|
|
99
|
-
} // namespace api
|
|
100
|
-
} // namespace esphome
|
|
98
|
+
} // namespace esphome::api
|
|
101
99
|
#endif
|
esphome/components/api/proto.cpp
CHANGED
|
@@ -3,12 +3,11 @@
|
|
|
3
3
|
#include "esphome/core/helpers.h"
|
|
4
4
|
#include "esphome/core/log.h"
|
|
5
5
|
|
|
6
|
-
namespace esphome {
|
|
7
|
-
namespace api {
|
|
6
|
+
namespace esphome::api {
|
|
8
7
|
|
|
9
8
|
static const char *const TAG = "api.proto";
|
|
10
9
|
|
|
11
|
-
void
|
|
10
|
+
void ProtoDecodableMessage::decode(const uint8_t *buffer, size_t length) {
|
|
12
11
|
uint32_t i = 0;
|
|
13
12
|
bool error = false;
|
|
14
13
|
while (i < length) {
|
|
@@ -89,5 +88,4 @@ std::string ProtoMessage::dump() const {
|
|
|
89
88
|
}
|
|
90
89
|
#endif
|
|
91
90
|
|
|
92
|
-
} // namespace api
|
|
93
|
-
} // namespace esphome
|
|
91
|
+
} // namespace esphome::api
|