esphome 2025.6.3__py3-none-any.whl → 2025.7.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- esphome/__main__.py +1 -3
- esphome/codegen.py +2 -0
- esphome/components/ac_dimmer/ac_dimmer.cpp +6 -6
- esphome/components/adc/__init__.py +25 -1
- esphome/components/adc/adc_sensor.h +11 -11
- esphome/components/adc/adc_sensor_common.cpp +1 -1
- esphome/components/adc/adc_sensor_esp32.cpp +16 -8
- esphome/components/ade7880/ade7880.h +0 -2
- esphome/components/ads1115/ads1115.h +0 -1
- esphome/components/ads1118/ads1118.h +0 -1
- esphome/components/ags10/ags10.h +0 -2
- esphome/components/aic3204/aic3204.h +0 -1
- esphome/components/alarm_control_panel/__init__.py +5 -2
- esphome/components/alpha3/alpha3.h +0 -1
- esphome/components/am43/cover/am43_cover.h +0 -1
- esphome/components/am43/sensor/am43_sensor.h +0 -1
- esphome/components/analog_threshold/analog_threshold_binary_sensor.h +0 -2
- esphome/components/anova/anova.cpp +5 -1
- esphome/components/anova/anova.h +0 -1
- esphome/components/apds9960/apds9960.cpp +1 -1
- esphome/components/api/__init__.py +57 -21
- esphome/components/api/api_connection.cpp +344 -539
- esphome/components/api/api_connection.h +224 -141
- esphome/components/api/api_frame_helper.cpp +91 -127
- esphome/components/api/api_frame_helper.h +64 -54
- esphome/components/api/api_pb2.cpp +1837 -9044
- esphome/components/api/api_pb2.h +532 -685
- esphome/components/api/api_pb2_dump.cpp +4432 -0
- esphome/components/api/api_pb2_service.cpp +184 -425
- esphome/components/api/api_pb2_service.h +13 -6
- esphome/components/api/api_server.cpp +131 -167
- esphome/components/api/api_server.h +38 -10
- esphome/components/api/client.py +8 -2
- esphome/components/api/custom_api_device.h +8 -0
- esphome/components/api/list_entities.cpp +37 -104
- esphome/components/api/list_entities.h +33 -23
- esphome/components/api/proto.h +532 -26
- esphome/components/api/subscribe_state.cpp +23 -29
- esphome/components/api/subscribe_state.h +26 -19
- esphome/components/api/user_services.h +2 -0
- esphome/components/as3935_spi/as3935_spi.h +0 -2
- esphome/components/as5600/as5600.h +0 -1
- esphome/components/async_tcp/__init__.py +14 -5
- esphome/components/atc_mithermometer/atc_mithermometer.h +0 -1
- esphome/components/atm90e32/atm90e32.cpp +2 -1
- esphome/components/audio/audio_decoder.cpp +1 -1
- esphome/components/audio/audio_transfer_buffer.cpp +2 -2
- esphome/components/b_parasite/b_parasite.h +0 -1
- esphome/components/bedjet/bedjet_hub.cpp +5 -1
- esphome/components/bedjet/climate/bedjet_climate.cpp +5 -1
- esphome/components/beken_spi_led_strip/led_strip.cpp +4 -2
- esphome/components/bh1750/bh1750.cpp +5 -5
- esphome/components/binary_sensor/__init__.py +82 -5
- esphome/components/binary_sensor/automation.h +19 -1
- esphome/components/binary_sensor/binary_sensor.cpp +12 -30
- esphome/components/binary_sensor/binary_sensor.h +11 -25
- esphome/components/binary_sensor/filter.cpp +29 -24
- esphome/components/binary_sensor/filter.h +20 -10
- esphome/components/ble_client/output/ble_binary_output.h +0 -1
- esphome/components/ble_client/sensor/ble_rssi_sensor.cpp +5 -1
- esphome/components/ble_client/sensor/ble_rssi_sensor.h +0 -1
- esphome/components/ble_client/sensor/ble_sensor.cpp +5 -1
- esphome/components/ble_client/sensor/ble_sensor.h +0 -1
- esphome/components/ble_client/switch/ble_switch.h +0 -1
- esphome/components/ble_client/text_sensor/ble_text_sensor.cpp +5 -1
- esphome/components/ble_client/text_sensor/ble_text_sensor.h +0 -1
- esphome/components/ble_presence/ble_presence_device.h +0 -1
- esphome/components/ble_rssi/ble_rssi_sensor.h +0 -1
- esphome/components/ble_scanner/ble_scanner.h +0 -1
- esphome/components/bluetooth_proxy/bluetooth_connection.h +9 -2
- esphome/components/bluetooth_proxy/bluetooth_proxy.cpp +16 -6
- esphome/components/bluetooth_proxy/bluetooth_proxy.h +8 -2
- esphome/components/bme680/sensor.py +1 -1
- esphome/components/bmp581/bmp581.h +0 -2
- esphome/components/button/__init__.py +5 -2
- esphome/components/camera/__init__.py +1 -0
- esphome/components/camera/camera.cpp +22 -0
- esphome/components/camera/camera.h +80 -0
- esphome/components/canbus/__init__.py +1 -0
- esphome/components/cap1188/cap1188.h +0 -1
- esphome/components/captive_portal/__init__.py +12 -2
- esphome/components/captive_portal/captive_portal.cpp +12 -2
- esphome/components/captive_portal/captive_portal.h +5 -2
- esphome/components/ccs811/ccs811.h +0 -2
- esphome/components/climate/__init__.py +5 -2
- esphome/components/cm1106/sensor.py +2 -2
- esphome/components/const/__init__.py +2 -0
- esphome/components/copy/binary_sensor/copy_binary_sensor.h +0 -1
- esphome/components/copy/button/copy_button.h +0 -1
- esphome/components/copy/cover/copy_cover.h +0 -1
- esphome/components/copy/fan/copy_fan.h +0 -1
- esphome/components/copy/lock/copy_lock.h +0 -1
- esphome/components/copy/number/copy_number.h +0 -1
- esphome/components/copy/select/copy_select.h +0 -1
- esphome/components/copy/sensor/copy_sensor.h +0 -1
- esphome/components/copy/switch/copy_switch.h +0 -1
- esphome/components/copy/text/copy_text.h +0 -1
- esphome/components/copy/text_sensor/copy_text_sensor.h +0 -1
- esphome/components/cover/__init__.py +5 -2
- esphome/components/cs5460a/cs5460a.h +0 -1
- esphome/components/datetime/__init__.py +4 -2
- esphome/components/debug/__init__.py +20 -0
- esphome/components/debug/debug_esp32.cpp +2 -0
- esphome/components/deep_sleep/__init__.py +43 -9
- esphome/components/demo/__init__.py +2 -2
- esphome/components/display/display.cpp +4 -3
- esphome/components/display/display.h +0 -2
- esphome/components/display/display_buffer.cpp +1 -1
- esphome/components/ds2484/__init__.py +1 -0
- esphome/components/ds2484/ds2484.cpp +209 -0
- esphome/components/ds2484/ds2484.h +43 -0
- esphome/components/ds2484/one_wire.py +37 -0
- esphome/components/duty_time/duty_time_sensor.h +0 -1
- esphome/components/ens160_base/ens160_base.h +0 -1
- esphome/components/es7210/es7210.h +0 -1
- esphome/components/es7243e/es7243e.h +0 -1
- esphome/components/es8156/es8156.h +0 -1
- esphome/components/es8311/es8311.h +0 -1
- esphome/components/es8388/es8388.h +0 -1
- esphome/components/esp32/__init__.py +103 -135
- esphome/components/esp32/core.cpp +0 -4
- esphome/components/esp32/gpio.h +1 -1
- esphome/components/esp32/helpers.cpp +69 -0
- esphome/components/esp32_ble/ble.cpp +5 -6
- esphome/components/esp32_ble/ble.h +29 -14
- esphome/components/esp32_ble/ble_event.h +6 -6
- esphome/components/esp32_ble_client/ble_client_base.cpp +21 -6
- esphome/components/esp32_ble_client/ble_client_base.h +24 -9
- esphome/components/esp32_ble_tracker/__init__.py +2 -8
- esphome/components/esp32_ble_tracker/esp32_ble_tracker.cpp +5 -5
- esphome/components/esp32_ble_tracker/esp32_ble_tracker.h +11 -7
- esphome/components/esp32_camera/__init__.py +112 -98
- esphome/components/esp32_camera/esp32_camera.cpp +41 -31
- esphome/components/esp32_camera/esp32_camera.h +35 -30
- esphome/components/esp32_camera_web_server/__init__.py +2 -1
- esphome/components/esp32_camera_web_server/camera_web_server.cpp +8 -8
- esphome/components/esp32_camera_web_server/camera_web_server.h +3 -3
- esphome/components/esp32_hall/sensor.py +2 -21
- esphome/components/esp32_hosted/__init__.py +101 -0
- esphome/components/esp32_hosted/esp32_hosted.py.script +12 -0
- esphome/components/esp32_improv/esp32_improv_component.cpp +3 -0
- esphome/components/esp32_rmt/__init__.py +0 -58
- esphome/components/esp32_rmt_led_strip/led_strip.cpp +77 -63
- esphome/components/esp32_rmt_led_strip/led_strip.h +11 -17
- esphome/components/esp32_rmt_led_strip/light.py +14 -76
- esphome/components/esp32_touch/esp32_touch.h +174 -28
- esphome/components/esp32_touch/esp32_touch_common.cpp +162 -0
- esphome/components/esp32_touch/esp32_touch_v1.cpp +240 -0
- esphome/components/esp32_touch/esp32_touch_v2.cpp +397 -0
- esphome/components/esp8266/__init__.py +2 -0
- esphome/components/esp8266/gpio.cpp +10 -10
- esphome/components/esp8266/helpers.cpp +31 -0
- esphome/components/esp_ldo/__init__.py +10 -8
- esphome/components/esp_ldo/esp_ldo.h +3 -0
- esphome/components/esphome/ota/__init__.py +1 -0
- esphome/components/esphome/ota/ota_esphome.cpp +24 -19
- esphome/components/ethernet/__init__.py +42 -23
- esphome/components/ethernet/esp_eth_phy_jl1101.c +0 -16
- esphome/components/ethernet/ethernet_component.cpp +69 -29
- esphome/components/ethernet/ethernet_component.h +18 -10
- esphome/components/event/__init__.py +5 -2
- esphome/components/ezo/ezo.h +0 -1
- esphome/components/ezo_pmp/ezo_pmp.h +0 -1
- esphome/components/fan/__init__.py +5 -2
- esphome/components/fan/fan.cpp +4 -0
- esphome/components/feedback/feedback_cover.h +0 -1
- esphome/components/font/__init__.py +92 -82
- esphome/components/font/font.cpp +9 -2
- esphome/components/font/font.h +20 -5
- esphome/components/fs3000/fs3000.h +0 -1
- esphome/components/gcja5/gcja5.h +0 -1
- esphome/components/gl_r01_i2c/__init__.py +0 -0
- esphome/components/gl_r01_i2c/gl_r01_i2c.cpp +68 -0
- esphome/components/gl_r01_i2c/gl_r01_i2c.h +22 -0
- esphome/components/gl_r01_i2c/sensor.py +36 -0
- esphome/components/gp8403/gp8403.h +0 -1
- esphome/components/gpio/binary_sensor/__init__.py +39 -1
- esphome/components/gpio/binary_sensor/gpio_binary_sensor.cpp +77 -3
- esphome/components/gpio/binary_sensor/gpio_binary_sensor.h +40 -0
- esphome/components/grove_gas_mc_v2/grove_gas_mc_v2.h +0 -2
- esphome/components/he60r/he60r.h +0 -1
- esphome/components/heatpumpir/climate.py +2 -1
- esphome/components/heatpumpir/heatpumpir.cpp +1 -0
- esphome/components/heatpumpir/heatpumpir.h +1 -0
- esphome/components/honeywellabp2_i2c/honeywellabp2.h +0 -1
- esphome/components/host/__init__.py +3 -1
- esphome/components/host/helpers.cpp +57 -0
- esphome/components/http_request/__init__.py +19 -1
- esphome/components/http_request/http_request.h +1 -1
- esphome/components/http_request/http_request_arduino.h +1 -0
- esphome/components/http_request/ota/ota_http_request.cpp +1 -1
- esphome/components/http_request/update/http_request_update.cpp +35 -16
- esphome/components/hydreon_rgxx/hydreon_rgxx.cpp +3 -9
- esphome/components/hydreon_rgxx/sensor.py +1 -1
- esphome/components/i2c/__init__.py +23 -11
- esphome/components/i2c/i2c_bus.h +8 -1
- esphome/components/i2c/i2c_bus_arduino.cpp +4 -3
- esphome/components/i2c/i2c_bus_arduino.h +6 -3
- esphome/components/i2c/i2c_bus_esp_idf.h +5 -3
- esphome/components/i2c_device/i2c_device.h +0 -1
- esphome/components/i2s_audio/__init__.py +2 -10
- esphome/components/i2s_audio/i2s_audio.cpp +1 -5
- esphome/components/i2s_audio/media_player/__init__.py +2 -2
- esphome/components/i2s_audio/speaker/__init__.py +1 -1
- esphome/components/i2s_audio/speaker/i2s_audio_speaker.cpp +2 -2
- esphome/components/iaqcore/iaqcore.h +0 -2
- esphome/components/image/__init__.py +123 -24
- esphome/components/improv_serial/improv_serial_component.cpp +0 -4
- esphome/components/ina219/ina219.cpp +7 -0
- esphome/components/ina219/ina219.h +1 -0
- esphome/components/ina260/ina260.h +0 -2
- esphome/components/inkbird_ibsth1_mini/inkbird_ibsth1_mini.h +0 -1
- esphome/components/inkplate6/display.py +15 -0
- esphome/components/inkplate6/inkplate.cpp +2 -2
- esphome/components/integration/integration_sensor.h +0 -1
- esphome/components/internal_temperature/internal_temperature.cpp +8 -27
- esphome/components/internal_temperature/sensor.py +0 -26
- esphome/components/interval/interval.h +0 -2
- esphome/components/json/__init__.py +1 -1
- esphome/components/json/json_util.cpp +56 -63
- esphome/components/ld2410/button/__init__.py +3 -3
- esphome/components/ld2410/button/factory_reset_button.cpp +9 -0
- esphome/components/ld2410/button/{reset_button.h → factory_reset_button.h} +2 -2
- esphome/components/ld2410/ld2410.cpp +421 -268
- esphome/components/ld2410/ld2410.h +44 -146
- esphome/components/ld2410/number/__init__.py +2 -2
- esphome/components/ld2410/sensor.py +1 -1
- esphome/components/ld2410/switch/__init__.py +1 -1
- esphome/components/ld2420/binary_sensor/ld2420_binary_sensor.cpp +2 -2
- esphome/components/ld2420/button/reconfig_buttons.cpp +1 -1
- esphome/components/ld2420/ld2420.cpp +252 -147
- esphome/components/ld2420/ld2420.h +52 -126
- esphome/components/ld2420/number/__init__.py +2 -2
- esphome/components/ld2420/number/gate_config_number.cpp +1 -1
- esphome/components/ld2420/select/operating_mode_select.cpp +1 -1
- esphome/components/ld2420/sensor/__init__.py +6 -2
- esphome/components/ld2420/sensor/ld2420_sensor.cpp +2 -2
- esphome/components/ld2420/sensor/ld2420_sensor.h +1 -1
- esphome/components/ld2420/text_sensor/text_sensor.cpp +2 -2
- esphome/components/ld2450/button/__init__.py +3 -3
- esphome/components/ld2450/button/factory_reset_button.cpp +9 -0
- esphome/components/ld2450/button/{reset_button.h → factory_reset_button.h} +2 -2
- esphome/components/ld2450/ld2450.cpp +384 -232
- esphome/components/ld2450/ld2450.h +60 -69
- esphome/components/ld2450/switch/__init__.py +1 -1
- esphome/components/ledc/ledc_output.cpp +1 -63
- esphome/components/libretiny/__init__.py +5 -3
- esphome/components/libretiny/const.py +5 -0
- esphome/components/libretiny/generate_components.py +1 -0
- esphome/components/libretiny/helpers.cpp +35 -0
- esphome/components/libretiny/lt_component.cpp +5 -3
- esphome/components/light/__init__.py +4 -2
- esphome/components/light/addressable_light.h +3 -3
- esphome/components/light/light_call.cpp +180 -243
- esphome/components/light/light_call.h +72 -20
- esphome/components/light/light_color_values.h +14 -14
- esphome/components/light/light_json_schema.cpp +17 -16
- esphome/components/light/light_state.h +15 -13
- esphome/components/light/transformers.h +2 -2
- esphome/components/ln882x/__init__.py +52 -0
- esphome/components/ln882x/boards.py +285 -0
- esphome/components/lock/__init__.py +5 -2
- esphome/components/logger/__init__.py +40 -3
- esphome/components/logger/logger.cpp +47 -12
- esphome/components/logger/logger.h +80 -49
- esphome/components/logger/logger_esp32.cpp +3 -3
- esphome/components/lps22/__init__.py +0 -0
- esphome/components/lps22/lps22.cpp +75 -0
- esphome/components/lps22/lps22.h +27 -0
- esphome/components/lps22/sensor.py +58 -0
- esphome/components/ltr390/ltr390.h +0 -1
- esphome/components/ltr501/ltr501.h +0 -1
- esphome/components/ltr_als_ps/ltr_als_ps.h +0 -1
- esphome/components/lvgl/__init__.py +1 -1
- esphome/components/lvgl/schemas.py +66 -6
- esphome/components/lvgl/styles.py +24 -16
- esphome/components/lvgl/widgets/__init__.py +12 -2
- esphome/components/lvgl/widgets/lv_bar.py +40 -19
- esphome/components/lvgl/widgets/meter.py +20 -13
- esphome/components/m5stack_8angle/light/m5stack_8angle_light.cpp +1 -1
- esphome/components/max9611/max9611.h +0 -1
- esphome/components/mcp23016/__init__.py +1 -1
- esphome/components/mcp23xxx_base/__init__.py +1 -1
- esphome/components/mcp4461/__init__.py +1 -1
- esphome/components/mcp4461/output/__init__.py +3 -2
- esphome/components/mcp9600/mcp9600.h +0 -2
- esphome/components/md5/md5.cpp +3 -3
- esphome/components/md5/md5.h +1 -6
- esphome/components/mdns/__init__.py +22 -11
- esphome/components/media_player/__init__.py +4 -3
- esphome/components/micro_wake_word/__init__.py +1 -5
- esphome/components/micro_wake_word/streaming_model.cpp +2 -2
- esphome/components/microphone/microphone.cpp +7 -9
- esphome/components/microphone/microphone.h +0 -2
- esphome/components/mipi_spi/display.py +1 -0
- esphome/components/mmc5603/mmc5603.cpp +1 -1
- esphome/components/modbus/modbus.cpp +33 -15
- esphome/components/modbus/modbus.h +9 -0
- esphome/components/modbus_controller/__init__.py +42 -10
- esphome/components/modbus_controller/modbus_controller.cpp +92 -11
- esphome/components/modbus_controller/modbus_controller.h +61 -7
- esphome/components/mopeka_pro_check/mopeka_pro_check.h +0 -1
- esphome/components/mopeka_std_check/mopeka_std_check.h +0 -1
- esphome/components/mpl3115a2/mpl3115a2.h +0 -2
- esphome/components/mqtt/__init__.py +16 -0
- esphome/components/mqtt/mqtt_alarm_control_panel.cpp +2 -1
- esphome/components/mqtt/mqtt_backend.h +2 -1
- esphome/components/mqtt/mqtt_backend_esp32.cpp +132 -47
- esphome/components/mqtt/mqtt_backend_esp32.h +106 -4
- esphome/components/mqtt/mqtt_binary_sensor.cpp +1 -0
- esphome/components/mqtt/mqtt_button.cpp +4 -1
- esphome/components/mqtt/mqtt_client.cpp +17 -9
- esphome/components/mqtt/mqtt_client.h +8 -3
- esphome/components/mqtt/mqtt_climate.cpp +6 -4
- esphome/components/mqtt/mqtt_component.cpp +3 -1
- esphome/components/mqtt/mqtt_cover.cpp +1 -0
- esphome/components/mqtt/mqtt_date.cpp +4 -3
- esphome/components/mqtt/mqtt_datetime.cpp +7 -6
- esphome/components/mqtt/mqtt_event.cpp +6 -3
- esphome/components/mqtt/mqtt_fan.cpp +1 -0
- esphome/components/mqtt/mqtt_light.cpp +8 -4
- esphome/components/mqtt/mqtt_lock.cpp +3 -1
- esphome/components/mqtt/mqtt_number.cpp +1 -0
- esphome/components/mqtt/mqtt_select.cpp +2 -1
- esphome/components/mqtt/mqtt_sensor.cpp +3 -1
- esphome/components/mqtt/mqtt_switch.cpp +3 -1
- esphome/components/mqtt/mqtt_text.cpp +1 -0
- esphome/components/mqtt/mqtt_text_sensor.cpp +3 -1
- esphome/components/mqtt/mqtt_time.cpp +4 -3
- esphome/components/mqtt/mqtt_update.cpp +1 -0
- esphome/components/mqtt/mqtt_valve.cpp +3 -1
- esphome/components/ms8607/ms8607.cpp +1 -1
- esphome/components/ms8607/ms8607.h +0 -1
- esphome/components/neopixelbus/light.py +4 -1
- esphome/components/neopixelbus/neopixelbus_light.h +1 -1
- esphome/components/network/__init__.py +4 -1
- esphome/components/network/ip_address.h +1 -0
- esphome/components/nextion/__init__.py +16 -0
- esphome/components/nextion/base_component.py +1 -0
- esphome/components/nextion/binary_sensor/nextion_binarysensor.cpp +1 -1
- esphome/components/nextion/display.py +14 -4
- esphome/components/nextion/nextion.cpp +166 -101
- esphome/components/nextion/nextion.h +84 -53
- esphome/components/nextion/nextion_commands.cpp +11 -10
- esphome/components/nextion/nextion_component.cpp +28 -28
- esphome/components/nextion/nextion_component.h +53 -18
- esphome/components/nextion/nextion_component_base.h +3 -0
- esphome/components/nextion/nextion_upload.cpp +36 -0
- esphome/components/nextion/nextion_upload_arduino.cpp +10 -35
- esphome/components/nextion/nextion_upload_idf.cpp +9 -33
- esphome/components/nextion/sensor/nextion_sensor.cpp +1 -1
- esphome/components/nextion/switch/nextion_switch.cpp +1 -1
- esphome/components/nextion/text_sensor/nextion_textsensor.cpp +1 -1
- esphome/components/nfc/nfc.cpp +3 -22
- esphome/components/nfc/nfc.h +3 -3
- esphome/components/number/__init__.py +5 -2
- esphome/components/online_image/__init__.py +9 -1
- esphome/components/online_image/online_image.cpp +17 -7
- esphome/components/online_image/online_image.h +10 -2
- esphome/components/opentherm/opentherm.cpp +7 -12
- esphome/components/opentherm/output/output.cpp +1 -1
- esphome/components/openthread/__init__.py +47 -40
- esphome/components/openthread/const.py +1 -0
- esphome/components/openthread/openthread_esp.cpp +27 -5
- esphome/components/opt3001/__init__.py +0 -0
- esphome/components/opt3001/opt3001.cpp +122 -0
- esphome/components/opt3001/opt3001.h +27 -0
- esphome/components/opt3001/sensor.py +35 -0
- esphome/components/ota/__init__.py +17 -0
- esphome/components/ota/ota_backend.h +27 -1
- esphome/components/ota/ota_backend_arduino_esp32.cpp +12 -2
- esphome/components/ota/ota_backend_arduino_esp32.h +3 -0
- esphome/components/ota/ota_backend_arduino_esp8266.cpp +18 -4
- esphome/components/ota/ota_backend_arduino_esp8266.h +3 -0
- esphome/components/ota/ota_backend_arduino_libretiny.cpp +12 -2
- esphome/components/ota/ota_backend_arduino_libretiny.h +3 -0
- esphome/components/ota/ota_backend_arduino_rp2040.cpp +9 -2
- esphome/components/ota/ota_backend_arduino_rp2040.h +3 -0
- esphome/components/ota/ota_backend_esp_idf.cpp +10 -16
- esphome/components/ota/ota_backend_esp_idf.h +1 -0
- esphome/components/packages/__init__.py +5 -2
- esphome/components/packet_transport/binary_sensor.py +61 -4
- esphome/components/packet_transport/packet_transport.cpp +34 -1
- esphome/components/packet_transport/packet_transport.h +11 -5
- esphome/components/pcf8574/__init__.py +1 -1
- esphome/components/pi4ioe5v6408/__init__.py +84 -0
- esphome/components/pi4ioe5v6408/pi4ioe5v6408.cpp +171 -0
- esphome/components/pi4ioe5v6408/pi4ioe5v6408.h +70 -0
- esphome/components/pmsa003i/pmsa003i.h +0 -1
- esphome/components/pmsx003/pmsx003.h +0 -1
- esphome/components/pn7150/pn7150.cpp +7 -7
- esphome/components/pn7150/pn7150.h +0 -1
- esphome/components/pn7160/pn7160.cpp +7 -7
- esphome/components/pn7160/pn7160.h +0 -1
- esphome/components/preferences/syncer.h +2 -0
- esphome/components/prometheus/prometheus_handler.h +1 -1
- esphome/components/psram/psram.cpp +0 -20
- esphome/components/pulse_counter/pulse_counter_sensor.h +0 -1
- esphome/components/pulse_meter/pulse_meter_sensor.cpp +8 -4
- esphome/components/pulse_width/pulse_width.h +0 -1
- esphome/components/pvvx_mithermometer/display/pvvx_display.cpp +0 -4
- esphome/components/pvvx_mithermometer/display/pvvx_display.h +0 -2
- esphome/components/pvvx_mithermometer/pvvx_mithermometer.h +0 -1
- esphome/components/qr_code/__init__.py +13 -10
- esphome/components/qwiic_pir/qwiic_pir.h +0 -1
- esphome/components/radon_eye_ble/radon_eye_listener.cpp +1 -1
- esphome/components/rc522/rc522.h +0 -1
- esphome/components/rdm6300/rdm6300.h +0 -2
- esphome/components/remote_base/__init__.py +7 -5
- esphome/components/remote_base/remote_base.cpp +24 -21
- esphome/components/remote_base/remote_base.h +3 -26
- esphome/components/remote_receiver/__init__.py +40 -46
- esphome/components/remote_receiver/remote_receiver.h +4 -18
- esphome/components/remote_receiver/remote_receiver_esp32.cpp +0 -87
- esphome/components/remote_receiver/remote_receiver_esp8266.cpp +1 -1
- esphome/components/remote_transmitter/__init__.py +42 -43
- esphome/components/remote_transmitter/remote_transmitter.h +2 -14
- esphome/components/remote_transmitter/remote_transmitter_esp32.cpp +0 -77
- esphome/components/resistance/resistance_sensor.h +0 -1
- esphome/components/rp2040/__init__.py +2 -0
- esphome/components/rp2040/helpers.cpp +55 -0
- esphome/components/rp2040_pio_led_strip/led_strip.cpp +2 -2
- esphome/components/rpi_dpi_rgb/rpi_dpi_rgb.cpp +0 -4
- esphome/components/rtttl/__init__.py +4 -4
- esphome/components/rtttl/rtttl.cpp +10 -1
- esphome/components/ruuvitag/ruuvitag.h +0 -1
- esphome/components/safe_mode/safe_mode.cpp +2 -0
- esphome/components/safe_mode/safe_mode.h +4 -1
- esphome/components/scd30/scd30.h +0 -1
- esphome/components/scd30/sensor.py +2 -2
- esphome/components/scd4x/scd4x.cpp +61 -54
- esphome/components/scd4x/scd4x.h +17 -15
- esphome/components/scd4x/sensor.py +4 -4
- esphome/components/script/script.h +0 -2
- esphome/components/sdp3x/sensor.py +1 -1
- esphome/components/select/__init__.py +5 -2
- esphome/components/sen5x/sen5x.h +0 -1
- esphome/components/senseair/senseair.h +0 -1
- esphome/components/sensor/__init__.py +4 -2
- esphome/components/sensor/filter.cpp +1 -1
- esphome/components/sensor/sensor.cpp +12 -6
- esphome/components/sensor/sensor.h +13 -5
- esphome/components/servo/servo.cpp +2 -2
- esphome/components/servo/servo.h +0 -1
- esphome/components/sfa30/sfa30.h +0 -1
- esphome/components/sgp30/sgp30.h +0 -1
- esphome/components/sgp4x/sgp4x.h +0 -1
- esphome/components/shelly_dimmer/stm32flash.cpp +1 -2
- esphome/components/sht4x/sht4x.h +0 -1
- esphome/components/sm300d2/sm300d2.h +0 -2
- esphome/components/smt100/sensor.py +8 -4
- esphome/components/smt100/smt100.cpp +5 -5
- esphome/components/smt100/smt100.h +3 -3
- esphome/components/sn74hc595/__init__.py +1 -1
- esphome/components/sn74hc595/sn74hc595.cpp +5 -4
- esphome/components/sntp/sntp_component.cpp +9 -3
- esphome/components/sntp/time.py +2 -0
- esphome/components/socket/__init__.py +17 -0
- esphome/components/spi/__init__.py +27 -6
- esphome/components/spi/spi.cpp +3 -2
- esphome/components/spi/spi.h +9 -3
- esphome/components/spi/spi_arduino.cpp +3 -5
- esphome/components/spi/spi_esp_idf.cpp +40 -21
- esphome/components/spi_led_strip/spi_led_strip.cpp +1 -1
- esphome/components/sps30/sps30.h +0 -1
- esphome/components/ssd1306_base/ssd1306_base.cpp +1 -1
- esphome/components/st7701s/st7701s.cpp +0 -4
- esphome/components/status/status_binary_sensor.h +0 -2
- esphome/components/substitutions/__init__.py +81 -21
- esphome/components/substitutions/jinja.py +99 -0
- esphome/components/sun/sun.cpp +3 -4
- esphome/components/switch/__init__.py +5 -2
- esphome/components/switch/binary_sensor/switch_binary_sensor.h +0 -1
- esphome/components/sx126x/__init__.py +317 -0
- esphome/components/sx126x/automation.h +62 -0
- esphome/components/sx126x/packet_transport/__init__.py +26 -0
- esphome/components/sx126x/packet_transport/sx126x_transport.cpp +26 -0
- esphome/components/sx126x/packet_transport/sx126x_transport.h +25 -0
- esphome/components/sx126x/sx126x.cpp +523 -0
- esphome/components/sx126x/sx126x.h +140 -0
- esphome/components/sx126x/sx126x_reg.h +163 -0
- esphome/components/sx127x/__init__.py +325 -0
- esphome/components/sx127x/automation.h +62 -0
- esphome/components/sx127x/packet_transport/__init__.py +26 -0
- esphome/components/sx127x/packet_transport/sx127x_transport.cpp +26 -0
- esphome/components/sx127x/packet_transport/sx127x_transport.h +25 -0
- esphome/components/sx127x/sx127x.cpp +498 -0
- esphome/components/sx127x/sx127x.h +128 -0
- esphome/components/sx127x/sx127x_reg.h +295 -0
- esphome/components/syslog/esphome_syslog.cpp +5 -3
- esphome/components/syslog/esphome_syslog.h +1 -1
- esphome/components/tca9555/__init__.py +1 -1
- esphome/components/template/binary_sensor/template_binary_sensor.cpp +1 -9
- esphome/components/text/__init__.py +5 -2
- esphome/components/text_sensor/__init__.py +5 -2
- esphome/components/thermostat/thermostat_climate.cpp +34 -31
- esphome/components/thermostat/thermostat_climate.h +43 -39
- esphome/components/time/__init__.py +16 -2
- esphome/components/time/real_time_clock.cpp +4 -0
- esphome/components/time/real_time_clock.h +5 -1
- esphome/components/tlc5971/tlc5971.cpp +4 -1
- esphome/components/tmp1075/tmp1075.h +0 -2
- esphome/components/tof10120/tof10120_sensor.h +0 -1
- esphome/components/tormatic/tormatic_cover.h +0 -1
- esphome/components/total_daily_energy/total_daily_energy.h +0 -1
- esphome/components/tsl2591/tsl2591.cpp +1 -1
- esphome/components/ttp229_bsf/ttp229_bsf.h +0 -1
- esphome/components/ttp229_lsf/ttp229_lsf.h +0 -1
- esphome/components/tx20/tx20.cpp +2 -2
- esphome/components/uart/__init__.py +18 -0
- esphome/components/uart/uart_component_esp_idf.cpp +0 -4
- esphome/components/update/__init__.py +5 -2
- esphome/components/update/update_entity.h +8 -0
- esphome/components/usb_host/__init__.py +5 -2
- esphome/components/usb_host/usb_host_client.cpp +10 -10
- esphome/components/usb_uart/cp210x.cpp +1 -1
- esphome/components/usb_uart/usb_uart.cpp +41 -44
- esphome/components/usb_uart/usb_uart.h +4 -3
- esphome/components/valve/__init__.py +5 -2
- esphome/components/vbus/vbus.h +0 -1
- esphome/components/veml3235/veml3235.h +0 -1
- esphome/components/veml7700/veml7700.h +0 -1
- esphome/components/vl53l0x/vl53l0x_sensor.h +0 -1
- esphome/components/voice_assistant/voice_assistant.cpp +4 -4
- esphome/components/watchdog/watchdog.cpp +0 -4
- esphome/components/waveshare_epaper/waveshare_epaper.cpp +6 -6
- esphome/components/web_server/__init__.py +34 -19
- esphome/components/web_server/ota/__init__.py +32 -0
- esphome/components/web_server/ota/ota_web_server.cpp +210 -0
- esphome/components/web_server/ota/ota_web_server.h +26 -0
- esphome/components/web_server/web_server.cpp +318 -436
- esphome/components/web_server/web_server.h +33 -23
- esphome/components/web_server/web_server_v1.cpp +4 -5
- esphome/components/web_server_base/__init__.py +5 -2
- esphome/components/web_server_base/web_server_base.cpp +2 -94
- esphome/components/web_server_base/web_server_base.h +5 -25
- esphome/components/web_server_idf/multipart.cpp +254 -0
- esphome/components/web_server_idf/multipart.h +86 -0
- esphome/components/web_server_idf/utils.cpp +32 -0
- esphome/components/web_server_idf/utils.h +10 -0
- esphome/components/web_server_idf/web_server_idf.cpp +164 -16
- esphome/components/web_server_idf/web_server_idf.h +11 -10
- esphome/components/wiegand/wiegand.cpp +2 -2
- esphome/components/wifi/__init__.py +18 -0
- esphome/components/wifi/wifi_component.cpp +17 -22
- esphome/components/wifi/wifi_component.h +27 -23
- esphome/components/wifi/wifi_component_esp32_arduino.cpp +52 -59
- esphome/components/wifi/wifi_component_esp8266.cpp +46 -46
- esphome/components/wifi/wifi_component_esp_idf.cpp +35 -36
- esphome/components/wifi/wifi_component_libretiny.cpp +26 -27
- esphome/components/wifi/wifi_component_pico_w.cpp +3 -3
- esphome/components/wifi_info/wifi_info_text_sensor.cpp +6 -6
- esphome/components/wireguard/__init__.py +2 -11
- esphome/components/xiaomi_ble/xiaomi_ble.cpp +13 -1
- esphome/components/xiaomi_ble/xiaomi_ble.h +1 -0
- esphome/components/xiaomi_cgd1/xiaomi_cgd1.h +0 -1
- esphome/components/xiaomi_cgdk2/xiaomi_cgdk2.h +0 -1
- esphome/components/xiaomi_cgg1/xiaomi_cgg1.h +0 -1
- esphome/components/xiaomi_cgpr1/xiaomi_cgpr1.h +0 -1
- esphome/components/xiaomi_gcls002/xiaomi_gcls002.h +0 -1
- esphome/components/xiaomi_hhccjcy01/xiaomi_hhccjcy01.h +0 -1
- esphome/components/xiaomi_hhccjcy10/xiaomi_hhccjcy10.h +0 -1
- esphome/components/xiaomi_hhccpot002/xiaomi_hhccpot002.h +0 -1
- esphome/components/xiaomi_jqjcy01ym/xiaomi_jqjcy01ym.h +0 -1
- esphome/components/xiaomi_lywsd02/xiaomi_lywsd02.h +0 -1
- esphome/components/xiaomi_lywsd02mmc/xiaomi_lywsd02mmc.h +0 -1
- esphome/components/xiaomi_lywsd03mmc/xiaomi_lywsd03mmc.h +0 -1
- esphome/components/xiaomi_lywsdcgq/xiaomi_lywsdcgq.h +0 -1
- esphome/components/xiaomi_mhoc303/xiaomi_mhoc303.h +0 -1
- esphome/components/xiaomi_mhoc401/xiaomi_mhoc401.h +0 -1
- esphome/components/xiaomi_miscale/xiaomi_miscale.h +0 -1
- esphome/components/xiaomi_mjyd02yla/xiaomi_mjyd02yla.h +0 -1
- esphome/components/xiaomi_mue4094rt/xiaomi_mue4094rt.h +0 -1
- esphome/components/xiaomi_rtcgq02lm/xiaomi_rtcgq02lm.h +0 -1
- esphome/components/xiaomi_wx08zm/xiaomi_wx08zm.h +0 -1
- esphome/components/xiaomi_xmwsdj04mmc/__init__.py +0 -0
- esphome/components/xiaomi_xmwsdj04mmc/sensor.py +77 -0
- esphome/components/xiaomi_xmwsdj04mmc/xiaomi_xmwsdj04mmc.cpp +77 -0
- esphome/components/xiaomi_xmwsdj04mmc/xiaomi_xmwsdj04mmc.h +36 -0
- esphome/components/zio_ultrasonic/zio_ultrasonic.h +0 -2
- esphome/components/zyaura/zyaura.h +0 -1
- esphome/config.py +88 -22
- esphome/config_helpers.py +74 -1
- esphome/config_validation.py +12 -1
- esphome/const.py +65 -10
- esphome/core/__init__.py +18 -2
- esphome/core/application.cpp +169 -10
- esphome/core/application.h +145 -165
- esphome/core/area.h +19 -0
- esphome/core/automation.h +58 -9
- esphome/core/color.cpp +3 -5
- esphome/core/color.h +16 -16
- esphome/core/component.cpp +156 -22
- esphome/core/component.h +98 -4
- esphome/core/component_iterator.cpp +11 -9
- esphome/core/component_iterator.h +12 -10
- esphome/core/config.py +155 -6
- esphome/core/controller.cpp +4 -2
- esphome/core/controller.h +1 -1
- esphome/core/datatypes.h +2 -2
- esphome/core/defines.h +17 -2
- esphome/core/device.h +20 -0
- esphome/core/entity_base.cpp +20 -15
- esphome/core/entity_base.h +76 -0
- esphome/core/entity_helpers.py +168 -1
- esphome/core/event_pool.h +81 -0
- esphome/core/helpers.cpp +75 -230
- esphome/core/helpers.h +165 -105
- esphome/core/lock_free_queue.h +151 -0
- esphome/core/log.cpp +2 -2
- esphome/core/log.h +2 -0
- esphome/core/optional.h +5 -0
- esphome/core/ring_buffer.cpp +2 -2
- esphome/core/scheduler.cpp +275 -103
- esphome/core/scheduler.h +154 -17
- esphome/core/time.cpp +5 -5
- esphome/core/time.h +5 -5
- esphome/cpp_generator.py +17 -0
- esphome/cpp_helpers.py +0 -22
- esphome/cpp_types.py +3 -1
- esphome/dashboard/entries.py +1 -1
- esphome/dashboard/util/text.py +5 -21
- esphome/dashboard/web_server.py +9 -1
- esphome/helpers.py +47 -0
- esphome/loader.py +15 -1
- esphome/pins.py +14 -8
- esphome/platformio_api.py +2 -0
- esphome/wizard.py +17 -4
- esphome/writer.py +44 -3
- esphome/yaml_util.py +0 -2
- {esphome-2025.6.3.dist-info → esphome-2025.7.0.dist-info}/METADATA +10 -9
- {esphome-2025.6.3.dist-info → esphome-2025.7.0.dist-info}/RECORD +637 -578
- esphome/components/api/api_pb2_size.h +0 -361
- esphome/components/esp32_ble/ble_event_pool.h +0 -72
- esphome/components/esp32_ble/queue.h +0 -85
- esphome/components/esp32_hall/esp32_hall.cpp +0 -25
- esphome/components/esp32_hall/esp32_hall.h +0 -23
- esphome/components/esp32_touch/esp32_touch.cpp +0 -355
- esphome/components/ld2410/button/reset_button.cpp +0 -9
- esphome/components/ld2450/button/reset_button.cpp +0 -9
- esphome/components/openthread/tlv.py +0 -65
- /esphome/{dashboard/enum.py → enum.py} +0 -0
- {esphome-2025.6.3.dist-info → esphome-2025.7.0.dist-info}/WHEEL +0 -0
- {esphome-2025.6.3.dist-info → esphome-2025.7.0.dist-info}/entry_points.txt +0 -0
- {esphome-2025.6.3.dist-info → esphome-2025.7.0.dist-info}/licenses/LICENSE +0 -0
- {esphome-2025.6.3.dist-info → esphome-2025.7.0.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
#pragma once
|
|
2
|
+
|
|
3
|
+
#include "esphome/core/component.h"
|
|
4
|
+
#include "esphome/components/sensor/sensor.h"
|
|
5
|
+
#include "esphome/components/esp32_ble_tracker/esp32_ble_tracker.h"
|
|
6
|
+
#include "esphome/components/xiaomi_ble/xiaomi_ble.h"
|
|
7
|
+
|
|
8
|
+
#ifdef USE_ESP32
|
|
9
|
+
|
|
10
|
+
namespace esphome {
|
|
11
|
+
namespace xiaomi_xmwsdj04mmc {
|
|
12
|
+
|
|
13
|
+
class XiaomiXMWSDJ04MMC : public Component, public esp32_ble_tracker::ESPBTDeviceListener {
|
|
14
|
+
public:
|
|
15
|
+
void set_address(uint64_t address) { this->address_ = address; }
|
|
16
|
+
void set_bindkey(const std::string &bindkey);
|
|
17
|
+
|
|
18
|
+
bool parse_device(const esp32_ble_tracker::ESPBTDevice &device) override;
|
|
19
|
+
|
|
20
|
+
void dump_config() override;
|
|
21
|
+
void set_temperature(sensor::Sensor *temperature) { this->temperature_ = temperature; }
|
|
22
|
+
void set_humidity(sensor::Sensor *humidity) { this->humidity_ = humidity; }
|
|
23
|
+
void set_battery_level(sensor::Sensor *battery_level) { this->battery_level_ = battery_level; }
|
|
24
|
+
|
|
25
|
+
protected:
|
|
26
|
+
uint64_t address_;
|
|
27
|
+
uint8_t bindkey_[16];
|
|
28
|
+
sensor::Sensor *temperature_{nullptr};
|
|
29
|
+
sensor::Sensor *humidity_{nullptr};
|
|
30
|
+
sensor::Sensor *battery_level_{nullptr};
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
} // namespace xiaomi_xmwsdj04mmc
|
|
34
|
+
} // namespace esphome
|
|
35
|
+
|
|
36
|
+
#endif
|
|
@@ -11,8 +11,6 @@ namespace zio_ultrasonic {
|
|
|
11
11
|
|
|
12
12
|
class ZioUltrasonicComponent : public i2c::I2CDevice, public PollingComponent, public sensor::Sensor {
|
|
13
13
|
public:
|
|
14
|
-
float get_setup_priority() const override { return setup_priority::DATA; }
|
|
15
|
-
|
|
16
14
|
void dump_config() override;
|
|
17
15
|
|
|
18
16
|
void update() override;
|
|
@@ -69,7 +69,6 @@ class ZyAuraSensor : public PollingComponent {
|
|
|
69
69
|
void setup() override { this->store_.setup(this->pin_clock_, this->pin_data_); }
|
|
70
70
|
void dump_config() override;
|
|
71
71
|
void update() override;
|
|
72
|
-
float get_setup_priority() const override { return setup_priority::DATA; }
|
|
73
72
|
|
|
74
73
|
protected:
|
|
75
74
|
ZaSensorStore store_;
|
esphome/config.py
CHANGED
|
@@ -67,6 +67,42 @@ ConfigPath = list[str | int]
|
|
|
67
67
|
path_context = contextvars.ContextVar("Config path")
|
|
68
68
|
|
|
69
69
|
|
|
70
|
+
def _process_platform_config(
|
|
71
|
+
result: Config,
|
|
72
|
+
component_name: str,
|
|
73
|
+
platform_name: str,
|
|
74
|
+
platform_config: ConfigType,
|
|
75
|
+
path: ConfigPath,
|
|
76
|
+
) -> None:
|
|
77
|
+
"""Process a platform configuration and add necessary validation steps.
|
|
78
|
+
|
|
79
|
+
This is shared between LoadValidationStep and AutoLoadValidationStep to avoid duplication.
|
|
80
|
+
"""
|
|
81
|
+
# Get the platform manifest
|
|
82
|
+
platform = get_platform(component_name, platform_name)
|
|
83
|
+
if platform is None:
|
|
84
|
+
result.add_str_error(
|
|
85
|
+
f"Platform not found: '{component_name}.{platform_name}'", path
|
|
86
|
+
)
|
|
87
|
+
return
|
|
88
|
+
|
|
89
|
+
# Add platform to loaded integrations
|
|
90
|
+
CORE.loaded_integrations.add(platform_name)
|
|
91
|
+
CORE.loaded_platforms.add(f"{component_name}/{platform_name}")
|
|
92
|
+
|
|
93
|
+
# Process platform's AUTO_LOAD
|
|
94
|
+
for load in platform.auto_load:
|
|
95
|
+
if load not in result:
|
|
96
|
+
result.add_validation_step(AutoLoadValidationStep(load))
|
|
97
|
+
|
|
98
|
+
# Add validation steps for the platform
|
|
99
|
+
p_domain = f"{component_name}.{platform_name}"
|
|
100
|
+
result.add_output_path(path, p_domain)
|
|
101
|
+
result.add_validation_step(
|
|
102
|
+
MetadataValidationStep(path, p_domain, platform_config, platform)
|
|
103
|
+
)
|
|
104
|
+
|
|
105
|
+
|
|
70
106
|
def _path_begins_with(path: ConfigPath, other: ConfigPath) -> bool:
|
|
71
107
|
if len(path) < len(other):
|
|
72
108
|
return False
|
|
@@ -379,26 +415,11 @@ class LoadValidationStep(ConfigValidationStep):
|
|
|
379
415
|
path,
|
|
380
416
|
)
|
|
381
417
|
continue
|
|
382
|
-
# Remove temp output path
|
|
418
|
+
# Remove temp output path
|
|
383
419
|
result.remove_output_path(path, p_domain)
|
|
384
|
-
p_domain = f"{self.domain}.{p_name}"
|
|
385
|
-
result.add_output_path(path, p_domain)
|
|
386
|
-
# Try Load platform
|
|
387
|
-
platform = get_platform(self.domain, p_name)
|
|
388
|
-
if platform is None:
|
|
389
|
-
result.add_str_error(f"Platform not found: '{p_domain}'", path)
|
|
390
|
-
continue
|
|
391
|
-
CORE.loaded_integrations.add(p_name)
|
|
392
|
-
CORE.loaded_platforms.add(f"{self.domain}/{p_name}")
|
|
393
420
|
|
|
394
|
-
# Process
|
|
395
|
-
|
|
396
|
-
if load not in result:
|
|
397
|
-
result.add_validation_step(AutoLoadValidationStep(load))
|
|
398
|
-
|
|
399
|
-
result.add_validation_step(
|
|
400
|
-
MetadataValidationStep(path, p_domain, p_config, platform)
|
|
401
|
-
)
|
|
421
|
+
# Process the platform configuration
|
|
422
|
+
_process_platform_config(result, self.domain, p_name, p_config, path)
|
|
402
423
|
|
|
403
424
|
|
|
404
425
|
class AutoLoadValidationStep(ConfigValidationStep):
|
|
@@ -413,10 +434,56 @@ class AutoLoadValidationStep(ConfigValidationStep):
|
|
|
413
434
|
self.domain = domain
|
|
414
435
|
|
|
415
436
|
def run(self, result: Config) -> None:
|
|
416
|
-
|
|
417
|
-
|
|
437
|
+
# Regular component auto-load (no platform)
|
|
438
|
+
if "." not in self.domain:
|
|
439
|
+
if self.domain in result:
|
|
440
|
+
# already loaded
|
|
441
|
+
return
|
|
442
|
+
result.add_validation_step(LoadValidationStep(self.domain, core.AutoLoad()))
|
|
418
443
|
return
|
|
419
|
-
|
|
444
|
+
|
|
445
|
+
# Platform-specific auto-load (e.g., "ota.web_server")
|
|
446
|
+
component_name, _, platform_name = self.domain.partition(".")
|
|
447
|
+
|
|
448
|
+
# Check if component exists
|
|
449
|
+
if component_name not in result:
|
|
450
|
+
# Component doesn't exist, load it first
|
|
451
|
+
result.add_validation_step(LoadValidationStep(component_name, []))
|
|
452
|
+
# Re-run this step after the component is loaded
|
|
453
|
+
result.add_validation_step(AutoLoadValidationStep(self.domain))
|
|
454
|
+
return
|
|
455
|
+
|
|
456
|
+
# Component exists, check if it's a platform component
|
|
457
|
+
component = get_component(component_name)
|
|
458
|
+
if component is None or not component.is_platform_component:
|
|
459
|
+
result.add_str_error(
|
|
460
|
+
f"Component {component_name} is not a platform component, "
|
|
461
|
+
f"cannot auto-load platform {platform_name}",
|
|
462
|
+
[component_name],
|
|
463
|
+
)
|
|
464
|
+
return
|
|
465
|
+
|
|
466
|
+
# Ensure the component config is a list
|
|
467
|
+
component_conf = result.get(component_name)
|
|
468
|
+
if not isinstance(component_conf, list):
|
|
469
|
+
component_conf = result[component_name] = []
|
|
470
|
+
|
|
471
|
+
# Check if platform already exists
|
|
472
|
+
if any(
|
|
473
|
+
isinstance(conf, dict) and conf.get(CONF_PLATFORM) == platform_name
|
|
474
|
+
for conf in component_conf
|
|
475
|
+
):
|
|
476
|
+
return
|
|
477
|
+
|
|
478
|
+
# Add and process the platform configuration
|
|
479
|
+
platform_conf = core.AutoLoad()
|
|
480
|
+
platform_conf[CONF_PLATFORM] = platform_name
|
|
481
|
+
component_conf.append(platform_conf)
|
|
482
|
+
|
|
483
|
+
path = [component_name, len(component_conf) - 1]
|
|
484
|
+
_process_platform_config(
|
|
485
|
+
result, component_name, platform_name, platform_conf, path
|
|
486
|
+
)
|
|
420
487
|
|
|
421
488
|
|
|
422
489
|
class MetadataValidationStep(ConfigValidationStep):
|
|
@@ -789,7 +856,6 @@ def validate_config(
|
|
|
789
856
|
result.add_output_path([CONF_SUBSTITUTIONS], CONF_SUBSTITUTIONS)
|
|
790
857
|
try:
|
|
791
858
|
substitutions.do_substitution_pass(config, command_line_substitutions)
|
|
792
|
-
substitutions.do_substitution_pass(config, command_line_substitutions)
|
|
793
859
|
except vol.Invalid as err:
|
|
794
860
|
result.add_error(err)
|
|
795
861
|
return result
|
esphome/config_helpers.py
CHANGED
|
@@ -1,4 +1,20 @@
|
|
|
1
|
-
from
|
|
1
|
+
from collections.abc import Callable
|
|
2
|
+
|
|
3
|
+
from esphome.const import (
|
|
4
|
+
CONF_ID,
|
|
5
|
+
CONF_LEVEL,
|
|
6
|
+
CONF_LOGGER,
|
|
7
|
+
KEY_CORE,
|
|
8
|
+
KEY_TARGET_FRAMEWORK,
|
|
9
|
+
KEY_TARGET_PLATFORM,
|
|
10
|
+
PlatformFramework,
|
|
11
|
+
)
|
|
12
|
+
from esphome.core import CORE
|
|
13
|
+
|
|
14
|
+
# Pre-build lookup map from (platform, framework) tuples to PlatformFramework enum
|
|
15
|
+
_PLATFORM_FRAMEWORK_LOOKUP = {
|
|
16
|
+
(pf.value[0].value, pf.value[1].value): pf for pf in PlatformFramework
|
|
17
|
+
}
|
|
2
18
|
|
|
3
19
|
|
|
4
20
|
class Extend:
|
|
@@ -103,3 +119,60 @@ def merge_config(full_old, full_new):
|
|
|
103
119
|
return new
|
|
104
120
|
|
|
105
121
|
return merge(full_old, full_new)
|
|
122
|
+
|
|
123
|
+
|
|
124
|
+
def filter_source_files_from_platform(
|
|
125
|
+
files_map: dict[str, set[PlatformFramework]],
|
|
126
|
+
) -> Callable[[], list[str]]:
|
|
127
|
+
"""Helper to build a FILTER_SOURCE_FILES function from platform mapping.
|
|
128
|
+
|
|
129
|
+
Args:
|
|
130
|
+
files_map: Dict mapping filename to set of PlatformFramework enums
|
|
131
|
+
that should compile this file
|
|
132
|
+
|
|
133
|
+
Returns:
|
|
134
|
+
Function that returns list of files to exclude for current platform
|
|
135
|
+
"""
|
|
136
|
+
|
|
137
|
+
def filter_source_files() -> list[str]:
|
|
138
|
+
# Get current platform/framework
|
|
139
|
+
core_data = CORE.data.get(KEY_CORE, {})
|
|
140
|
+
target_platform = core_data.get(KEY_TARGET_PLATFORM)
|
|
141
|
+
target_framework = core_data.get(KEY_TARGET_FRAMEWORK)
|
|
142
|
+
|
|
143
|
+
if not target_platform or not target_framework:
|
|
144
|
+
return []
|
|
145
|
+
|
|
146
|
+
# Direct lookup of current PlatformFramework
|
|
147
|
+
current_platform_framework = _PLATFORM_FRAMEWORK_LOOKUP.get(
|
|
148
|
+
(target_platform, target_framework)
|
|
149
|
+
)
|
|
150
|
+
|
|
151
|
+
if not current_platform_framework:
|
|
152
|
+
return []
|
|
153
|
+
|
|
154
|
+
# Return files that should be excluded for current platform
|
|
155
|
+
return [
|
|
156
|
+
filename
|
|
157
|
+
for filename, platforms in files_map.items()
|
|
158
|
+
if current_platform_framework not in platforms
|
|
159
|
+
]
|
|
160
|
+
|
|
161
|
+
return filter_source_files
|
|
162
|
+
|
|
163
|
+
|
|
164
|
+
def get_logger_level() -> str:
|
|
165
|
+
"""Get the configured logger level.
|
|
166
|
+
|
|
167
|
+
This is used by components to determine what logging features to include
|
|
168
|
+
based on the configured log level.
|
|
169
|
+
|
|
170
|
+
Returns:
|
|
171
|
+
The configured logger level string, defaults to "DEBUG" if not configured
|
|
172
|
+
"""
|
|
173
|
+
# Check if logger config exists
|
|
174
|
+
if CONF_LOGGER not in CORE.config:
|
|
175
|
+
return "DEBUG"
|
|
176
|
+
|
|
177
|
+
logger_config = CORE.config[CONF_LOGGER]
|
|
178
|
+
return logger_config.get(CONF_LEVEL, "DEBUG")
|
esphome/config_validation.py
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
"""Helpers for config validation using voluptuous."""
|
|
2
2
|
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
3
5
|
from contextlib import contextmanager
|
|
4
6
|
from dataclasses import dataclass
|
|
5
7
|
from datetime import datetime
|
|
@@ -29,6 +31,7 @@ from esphome.const import (
|
|
|
29
31
|
CONF_COMMAND_RETAIN,
|
|
30
32
|
CONF_COMMAND_TOPIC,
|
|
31
33
|
CONF_DAY,
|
|
34
|
+
CONF_DEVICE_ID,
|
|
32
35
|
CONF_DISABLED_BY_DEFAULT,
|
|
33
36
|
CONF_DISCOVERY,
|
|
34
37
|
CONF_ENTITY_CATEGORY,
|
|
@@ -355,6 +358,13 @@ def icon(value):
|
|
|
355
358
|
)
|
|
356
359
|
|
|
357
360
|
|
|
361
|
+
def sub_device_id(value: str | None) -> core.ID:
|
|
362
|
+
# Lazy import to avoid circular imports
|
|
363
|
+
from esphome.core.config import Device
|
|
364
|
+
|
|
365
|
+
return use_id(Device)(value)
|
|
366
|
+
|
|
367
|
+
|
|
358
368
|
def boolean(value):
|
|
359
369
|
"""Validate the given config option to be a boolean.
|
|
360
370
|
|
|
@@ -1896,6 +1906,7 @@ ENTITY_BASE_SCHEMA = Schema(
|
|
|
1896
1906
|
Optional(CONF_DISABLED_BY_DEFAULT, default=False): boolean,
|
|
1897
1907
|
Optional(CONF_ICON): icon,
|
|
1898
1908
|
Optional(CONF_ENTITY_CATEGORY): entity_category,
|
|
1909
|
+
Optional(CONF_DEVICE_ID): sub_device_id,
|
|
1899
1910
|
}
|
|
1900
1911
|
)
|
|
1901
1912
|
|
|
@@ -1964,7 +1975,7 @@ class Version:
|
|
|
1964
1975
|
return f"{self.major}.{self.minor}.{self.patch}"
|
|
1965
1976
|
|
|
1966
1977
|
@classmethod
|
|
1967
|
-
def parse(cls, value: str) ->
|
|
1978
|
+
def parse(cls, value: str) -> Version:
|
|
1968
1979
|
match = re.match(r"^(\d+).(\d+).(\d+)-?\w*$", value)
|
|
1969
1980
|
if match is None:
|
|
1970
1981
|
raise ValueError(f"Not a valid version number {value}")
|
esphome/const.py
CHANGED
|
@@ -1,19 +1,65 @@
|
|
|
1
1
|
"""Constants used by esphome."""
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
from enum import Enum
|
|
4
|
+
|
|
5
|
+
from esphome.enum import StrEnum
|
|
6
|
+
|
|
7
|
+
__version__ = "2025.7.0"
|
|
4
8
|
|
|
5
9
|
ALLOWED_NAME_CHARS = "abcdefghijklmnopqrstuvwxyz0123456789-_"
|
|
6
10
|
VALID_SUBSTITUTIONS_CHARACTERS = (
|
|
7
11
|
"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_"
|
|
8
12
|
)
|
|
9
13
|
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
14
|
+
|
|
15
|
+
class Platform(StrEnum):
|
|
16
|
+
"""Platform identifiers for ESPHome."""
|
|
17
|
+
|
|
18
|
+
BK72XX = "bk72xx"
|
|
19
|
+
ESP32 = "esp32"
|
|
20
|
+
ESP8266 = "esp8266"
|
|
21
|
+
HOST = "host"
|
|
22
|
+
LIBRETINY_OLDSTYLE = "libretiny"
|
|
23
|
+
LN882X = "ln882x"
|
|
24
|
+
RP2040 = "rp2040"
|
|
25
|
+
RTL87XX = "rtl87xx"
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
class Framework(StrEnum):
|
|
29
|
+
"""Framework identifiers for ESPHome."""
|
|
30
|
+
|
|
31
|
+
ARDUINO = "arduino"
|
|
32
|
+
ESP_IDF = "esp-idf"
|
|
33
|
+
NATIVE = "host"
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
class PlatformFramework(Enum):
|
|
37
|
+
"""Combined platform-framework identifiers with tuple values."""
|
|
38
|
+
|
|
39
|
+
# ESP32 variants
|
|
40
|
+
ESP32_ARDUINO = (Platform.ESP32, Framework.ARDUINO)
|
|
41
|
+
ESP32_IDF = (Platform.ESP32, Framework.ESP_IDF)
|
|
42
|
+
|
|
43
|
+
# Arduino framework platforms
|
|
44
|
+
ESP8266_ARDUINO = (Platform.ESP8266, Framework.ARDUINO)
|
|
45
|
+
RP2040_ARDUINO = (Platform.RP2040, Framework.ARDUINO)
|
|
46
|
+
BK72XX_ARDUINO = (Platform.BK72XX, Framework.ARDUINO)
|
|
47
|
+
RTL87XX_ARDUINO = (Platform.RTL87XX, Framework.ARDUINO)
|
|
48
|
+
LN882X_ARDUINO = (Platform.LN882X, Framework.ARDUINO)
|
|
49
|
+
|
|
50
|
+
# Host platform (native)
|
|
51
|
+
HOST_NATIVE = (Platform.HOST, Framework.NATIVE)
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
# Maintain backward compatibility by reassigning after enum definition
|
|
55
|
+
PLATFORM_BK72XX = Platform.BK72XX
|
|
56
|
+
PLATFORM_ESP32 = Platform.ESP32
|
|
57
|
+
PLATFORM_ESP8266 = Platform.ESP8266
|
|
58
|
+
PLATFORM_HOST = Platform.HOST
|
|
59
|
+
PLATFORM_LIBRETINY_OLDSTYLE = Platform.LIBRETINY_OLDSTYLE
|
|
60
|
+
PLATFORM_LN882X = Platform.LN882X
|
|
61
|
+
PLATFORM_RP2040 = Platform.RP2040
|
|
62
|
+
PLATFORM_RTL87XX = Platform.RTL87XX
|
|
17
63
|
|
|
18
64
|
|
|
19
65
|
SOURCE_FILE_EXTENSIONS = {".cpp", ".hpp", ".h", ".c", ".tcc", ".ino"}
|
|
@@ -56,6 +102,8 @@ CONF_AP = "ap"
|
|
|
56
102
|
CONF_APPARENT_POWER = "apparent_power"
|
|
57
103
|
CONF_ARDUINO_VERSION = "arduino_version"
|
|
58
104
|
CONF_AREA = "area"
|
|
105
|
+
CONF_AREA_ID = "area_id"
|
|
106
|
+
CONF_AREAS = "areas"
|
|
59
107
|
CONF_ARGS = "args"
|
|
60
108
|
CONF_ASSUMED_STATE = "assumed_state"
|
|
61
109
|
CONF_AT = "at"
|
|
@@ -89,6 +137,7 @@ CONF_BIT_DEPTH = "bit_depth"
|
|
|
89
137
|
CONF_BITS_PER_SAMPLE = "bits_per_sample"
|
|
90
138
|
CONF_BLOCK = "block"
|
|
91
139
|
CONF_BLUE = "blue"
|
|
140
|
+
CONF_BLUETOOTH = "bluetooth"
|
|
92
141
|
CONF_BOARD = "board"
|
|
93
142
|
CONF_BOARD_FLASH_MODE = "board_flash_mode"
|
|
94
143
|
CONF_BORDER = "border"
|
|
@@ -216,6 +265,8 @@ CONF_DEST = "dest"
|
|
|
216
265
|
CONF_DEVICE = "device"
|
|
217
266
|
CONF_DEVICE_CLASS = "device_class"
|
|
218
267
|
CONF_DEVICE_FACTOR = "device_factor"
|
|
268
|
+
CONF_DEVICE_ID = "device_id"
|
|
269
|
+
CONF_DEVICES = "devices"
|
|
219
270
|
CONF_DIELECTRIC_CONSTANT = "dielectric_constant"
|
|
220
271
|
CONF_DIMENSIONS = "dimensions"
|
|
221
272
|
CONF_DIO_PIN = "dio_pin"
|
|
@@ -527,7 +578,9 @@ CONF_MONTH = "month"
|
|
|
527
578
|
CONF_MONTHS = "months"
|
|
528
579
|
CONF_MOSI_PIN = "mosi_pin"
|
|
529
580
|
CONF_MOTION = "motion"
|
|
581
|
+
CONF_MOVE_THRESHOLD = "move_threshold"
|
|
530
582
|
CONF_MOVEMENT_COUNTER = "movement_counter"
|
|
583
|
+
CONF_MOVING_DISTANCE = "moving_distance"
|
|
531
584
|
CONF_MQTT = "mqtt"
|
|
532
585
|
CONF_MQTT_ID = "mqtt_id"
|
|
533
586
|
CONF_MULTIPLE = "multiple"
|
|
@@ -646,6 +699,7 @@ CONF_PAYLOAD = "payload"
|
|
|
646
699
|
CONF_PAYLOAD_AVAILABLE = "payload_available"
|
|
647
700
|
CONF_PAYLOAD_NOT_AVAILABLE = "payload_not_available"
|
|
648
701
|
CONF_PERIOD = "period"
|
|
702
|
+
CONF_PERMITTIVITY = "permittivity"
|
|
649
703
|
CONF_PH = "ph"
|
|
650
704
|
CONF_PHASE_A = "phase_a"
|
|
651
705
|
CONF_PHASE_ANGLE = "phase_angle"
|
|
@@ -835,6 +889,7 @@ CONF_STEP = "step"
|
|
|
835
889
|
CONF_STEP_DELAY = "step_delay"
|
|
836
890
|
CONF_STEP_MODE = "step_mode"
|
|
837
891
|
CONF_STEP_PIN = "step_pin"
|
|
892
|
+
CONF_STILL_THRESHOLD = "still_threshold"
|
|
838
893
|
CONF_STOP = "stop"
|
|
839
894
|
CONF_STOP_ACTION = "stop_action"
|
|
840
895
|
CONF_STORE_BASELINE = "store_baseline"
|
|
@@ -1091,7 +1146,7 @@ UNIT_KILOMETER_PER_HOUR = "km/h"
|
|
|
1091
1146
|
UNIT_KILOVOLT_AMPS = "kVA"
|
|
1092
1147
|
UNIT_KILOVOLT_AMPS_HOURS = "kVAh"
|
|
1093
1148
|
UNIT_KILOVOLT_AMPS_REACTIVE = "kVAR"
|
|
1094
|
-
UNIT_KILOVOLT_AMPS_REACTIVE_HOURS = "
|
|
1149
|
+
UNIT_KILOVOLT_AMPS_REACTIVE_HOURS = "kvarh"
|
|
1095
1150
|
UNIT_KILOWATT = "kW"
|
|
1096
1151
|
UNIT_KILOWATT_HOURS = "kWh"
|
|
1097
1152
|
UNIT_LITRE = "L"
|
|
@@ -1127,7 +1182,7 @@ UNIT_VOLT = "V"
|
|
|
1127
1182
|
UNIT_VOLT_AMPS = "VA"
|
|
1128
1183
|
UNIT_VOLT_AMPS_HOURS = "VAh"
|
|
1129
1184
|
UNIT_VOLT_AMPS_REACTIVE = "var"
|
|
1130
|
-
UNIT_VOLT_AMPS_REACTIVE_HOURS = "
|
|
1185
|
+
UNIT_VOLT_AMPS_REACTIVE_HOURS = "varh"
|
|
1131
1186
|
UNIT_WATT = "W"
|
|
1132
1187
|
UNIT_WATT_HOURS = "Wh"
|
|
1133
1188
|
|
esphome/core/__init__.py
CHANGED
|
@@ -20,6 +20,7 @@ from esphome.const import (
|
|
|
20
20
|
PLATFORM_ESP32,
|
|
21
21
|
PLATFORM_ESP8266,
|
|
22
22
|
PLATFORM_HOST,
|
|
23
|
+
PLATFORM_LN882X,
|
|
23
24
|
PLATFORM_RP2040,
|
|
24
25
|
PLATFORM_RTL87XX,
|
|
25
26
|
)
|
|
@@ -507,6 +508,8 @@ class EsphomeCore:
|
|
|
507
508
|
self.libraries: list[Library] = []
|
|
508
509
|
# A set of build flags to set in the platformio project
|
|
509
510
|
self.build_flags: set[str] = set()
|
|
511
|
+
# A set of build unflags to set in the platformio project
|
|
512
|
+
self.build_unflags: set[str] = set()
|
|
510
513
|
# A set of defines to set for the compile process in esphome/core/defines.h
|
|
511
514
|
self.defines: set[Define] = set()
|
|
512
515
|
# A map of all platformio options to apply
|
|
@@ -520,6 +523,9 @@ class EsphomeCore:
|
|
|
520
523
|
# Dict to track platform entity counts for pre-allocation
|
|
521
524
|
# Key: platform name (e.g. "sensor", "binary_sensor"), Value: count
|
|
522
525
|
self.platform_counts: defaultdict[str, int] = defaultdict(int)
|
|
526
|
+
# Track entity unique IDs to handle duplicates
|
|
527
|
+
# Set of (device_id, platform, sanitized_name) tuples
|
|
528
|
+
self.unique_ids: set[tuple[str, str, str]] = set()
|
|
523
529
|
# Whether ESPHome was started in verbose mode
|
|
524
530
|
self.verbose = False
|
|
525
531
|
# Whether ESPHome was started in quiet mode
|
|
@@ -545,11 +551,13 @@ class EsphomeCore:
|
|
|
545
551
|
self.global_statements = []
|
|
546
552
|
self.libraries = []
|
|
547
553
|
self.build_flags = set()
|
|
554
|
+
self.build_unflags = set()
|
|
548
555
|
self.defines = set()
|
|
549
556
|
self.platformio_options = {}
|
|
550
557
|
self.loaded_integrations = set()
|
|
551
558
|
self.component_ids = set()
|
|
552
559
|
self.platform_counts = defaultdict(int)
|
|
560
|
+
self.unique_ids = set()
|
|
553
561
|
PIN_SCHEMA_REGISTRY.reset()
|
|
554
562
|
|
|
555
563
|
@property
|
|
@@ -654,9 +662,13 @@ class EsphomeCore:
|
|
|
654
662
|
def is_rtl87xx(self):
|
|
655
663
|
return self.target_platform == PLATFORM_RTL87XX
|
|
656
664
|
|
|
665
|
+
@property
|
|
666
|
+
def is_ln882x(self):
|
|
667
|
+
return self.target_platform == PLATFORM_LN882X
|
|
668
|
+
|
|
657
669
|
@property
|
|
658
670
|
def is_libretiny(self):
|
|
659
|
-
return self.is_bk72xx or self.is_rtl87xx
|
|
671
|
+
return self.is_bk72xx or self.is_rtl87xx or self.is_ln882x
|
|
660
672
|
|
|
661
673
|
@property
|
|
662
674
|
def is_host(self):
|
|
@@ -766,11 +778,15 @@ class EsphomeCore:
|
|
|
766
778
|
self.libraries.append(library)
|
|
767
779
|
return library
|
|
768
780
|
|
|
769
|
-
def add_build_flag(self, build_flag):
|
|
781
|
+
def add_build_flag(self, build_flag: str) -> str:
|
|
770
782
|
self.build_flags.add(build_flag)
|
|
771
783
|
_LOGGER.debug("Adding build flag: %s", build_flag)
|
|
772
784
|
return build_flag
|
|
773
785
|
|
|
786
|
+
def add_build_unflag(self, build_unflag: str) -> None:
|
|
787
|
+
self.build_unflags.add(build_unflag)
|
|
788
|
+
_LOGGER.debug("Adding build unflag: %s", build_unflag)
|
|
789
|
+
|
|
774
790
|
def add_define(self, define):
|
|
775
791
|
if isinstance(define, str):
|
|
776
792
|
define = Define(define)
|