esphome 2025.7.4__py3-none-any.whl → 2025.8.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 +190 -83
- 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 +475 -116
- esphome/components/atm90e32/atm90e32.h +43 -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 +392 -81
- 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 +203 -60
- 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 +41 -2
- esphome/components/esp32_ble/ble.cpp +14 -10
- 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 +139 -73
- 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 +2 -2
- 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/pipsolar.cpp +54 -42
- esphome/components/pipsolar/pipsolar.h +5 -4
- 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 +6 -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/senseair/senseair.cpp +7 -3
- esphome/components/senseair/senseair.h +11 -0
- 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 +188 -353
- 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 +17 -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 +12 -16
- esphome/const.py +26 -1
- esphome/core/__init__.py +92 -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 +45 -10
- esphome/core/helpers.cpp +8 -15
- esphome/core/helpers.h +60 -6
- esphome/core/lock_free_queue.h +1 -1
- esphome/core/scheduler.cpp +311 -77
- esphome/core/scheduler.h +141 -28
- 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 +16 -108
- esphome/yaml_util.py +7 -5
- {esphome-2025.7.4.dist-info → esphome-2025.8.0.dist-info}/METADATA +13 -14
- {esphome-2025.7.4.dist-info → esphome-2025.8.0.dist-info}/RECORD +757 -677
- 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.0.dist-info}/WHEEL +0 -0
- {esphome-2025.7.4.dist-info → esphome-2025.8.0.dist-info}/entry_points.txt +0 -0
- {esphome-2025.7.4.dist-info → esphome-2025.8.0.dist-info}/licenses/LICENSE +0 -0
- {esphome-2025.7.4.dist-info → esphome-2025.8.0.dist-info}/top_level.txt +0 -0
|
@@ -1062,12 +1062,11 @@ def validate_raw_alternating(value):
|
|
|
1062
1062
|
last_negative = None
|
|
1063
1063
|
for i, val in enumerate(value):
|
|
1064
1064
|
this_negative = val < 0
|
|
1065
|
-
if i != 0:
|
|
1066
|
-
|
|
1067
|
-
|
|
1068
|
-
|
|
1069
|
-
|
|
1070
|
-
)
|
|
1065
|
+
if i != 0 and this_negative == last_negative:
|
|
1066
|
+
raise cv.Invalid(
|
|
1067
|
+
f"Values must alternate between being positive and negative, please see index {i} and {i + 1}",
|
|
1068
|
+
[i],
|
|
1069
|
+
)
|
|
1071
1070
|
last_negative = this_negative
|
|
1072
1071
|
return value
|
|
1073
1072
|
|
|
@@ -38,7 +38,6 @@ static bool IRAM_ATTR HOT rmt_callback(rmt_channel_handle_t channel, const rmt_r
|
|
|
38
38
|
}
|
|
39
39
|
|
|
40
40
|
void RemoteReceiverComponent::setup() {
|
|
41
|
-
ESP_LOGCONFIG(TAG, "Running setup");
|
|
42
41
|
rmt_rx_channel_config_t channel;
|
|
43
42
|
memset(&channel, 0, sizeof(channel));
|
|
44
43
|
channel.clk_src = RMT_CLK_SRC_DEFAULT;
|
|
@@ -13,6 +13,7 @@ from esphome.const import (
|
|
|
13
13
|
CONF_PIN,
|
|
14
14
|
CONF_RMT_SYMBOLS,
|
|
15
15
|
CONF_USE_DMA,
|
|
16
|
+
CONF_VALUE,
|
|
16
17
|
PlatformFramework,
|
|
17
18
|
)
|
|
18
19
|
from esphome.core import CORE
|
|
@@ -22,11 +23,17 @@ AUTO_LOAD = ["remote_base"]
|
|
|
22
23
|
CONF_EOT_LEVEL = "eot_level"
|
|
23
24
|
CONF_ON_TRANSMIT = "on_transmit"
|
|
24
25
|
CONF_ON_COMPLETE = "on_complete"
|
|
26
|
+
CONF_TRANSMITTER_ID = remote_base.CONF_TRANSMITTER_ID
|
|
25
27
|
|
|
26
28
|
remote_transmitter_ns = cg.esphome_ns.namespace("remote_transmitter")
|
|
27
29
|
RemoteTransmitterComponent = remote_transmitter_ns.class_(
|
|
28
30
|
"RemoteTransmitterComponent", remote_base.RemoteTransmitterBase, cg.Component
|
|
29
31
|
)
|
|
32
|
+
DigitalWriteAction = remote_transmitter_ns.class_(
|
|
33
|
+
"DigitalWriteAction",
|
|
34
|
+
automation.Action,
|
|
35
|
+
cg.Parented.template(RemoteTransmitterComponent),
|
|
36
|
+
)
|
|
30
37
|
|
|
31
38
|
MULTI_CONF = True
|
|
32
39
|
CONFIG_SCHEMA = cv.Schema(
|
|
@@ -63,6 +70,25 @@ CONFIG_SCHEMA = cv.Schema(
|
|
|
63
70
|
}
|
|
64
71
|
).extend(cv.COMPONENT_SCHEMA)
|
|
65
72
|
|
|
73
|
+
DIGITAL_WRITE_ACTION_SCHEMA = cv.maybe_simple_value(
|
|
74
|
+
{
|
|
75
|
+
cv.GenerateID(CONF_TRANSMITTER_ID): cv.use_id(RemoteTransmitterComponent),
|
|
76
|
+
cv.Required(CONF_VALUE): cv.templatable(cv.boolean),
|
|
77
|
+
},
|
|
78
|
+
key=CONF_VALUE,
|
|
79
|
+
)
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
@automation.register_action(
|
|
83
|
+
"remote_transmitter.digital_write", DigitalWriteAction, DIGITAL_WRITE_ACTION_SCHEMA
|
|
84
|
+
)
|
|
85
|
+
async def digital_write_action_to_code(config, action_id, template_arg, args):
|
|
86
|
+
var = cg.new_Pvariable(action_id, template_arg)
|
|
87
|
+
await cg.register_parented(var, config[CONF_TRANSMITTER_ID])
|
|
88
|
+
template_ = await cg.templatable(config[CONF_VALUE], args, bool)
|
|
89
|
+
cg.add(var.set_value(template_))
|
|
90
|
+
return var
|
|
91
|
+
|
|
66
92
|
|
|
67
93
|
async def to_code(config):
|
|
68
94
|
pin = await cg.gpio_pin_expression(config[CONF_PIN])
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
#pragma once
|
|
2
|
+
|
|
3
|
+
#include "esphome/components/remote_transmitter/remote_transmitter.h"
|
|
4
|
+
#include "esphome/core/automation.h"
|
|
5
|
+
#include "esphome/core/component.h"
|
|
6
|
+
#include "esphome/core/helpers.h"
|
|
7
|
+
|
|
8
|
+
namespace esphome {
|
|
9
|
+
namespace remote_transmitter {
|
|
10
|
+
|
|
11
|
+
template<typename... Ts> class DigitalWriteAction : public Action<Ts...>, public Parented<RemoteTransmitterComponent> {
|
|
12
|
+
public:
|
|
13
|
+
TEMPLATABLE_VALUE(bool, value)
|
|
14
|
+
void play(Ts... x) override { this->parent_->digital_write(this->value_.value(x...)); }
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
} // namespace remote_transmitter
|
|
18
|
+
} // namespace esphome
|
|
@@ -30,10 +30,11 @@ class RemoteTransmitterComponent : public remote_base::RemoteTransmitterBase,
|
|
|
30
30
|
|
|
31
31
|
void set_carrier_duty_percent(uint8_t carrier_duty_percent) { this->carrier_duty_percent_ = carrier_duty_percent; }
|
|
32
32
|
|
|
33
|
+
void digital_write(bool value);
|
|
34
|
+
|
|
33
35
|
#if defined(USE_ESP32)
|
|
34
36
|
void set_with_dma(bool with_dma) { this->with_dma_ = with_dma; }
|
|
35
37
|
void set_eot_level(bool eot_level) { this->eot_level_ = eot_level; }
|
|
36
|
-
void digital_write(bool value);
|
|
37
38
|
#endif
|
|
38
39
|
|
|
39
40
|
Trigger<> *get_transmit_trigger() const { return this->transmit_trigger_; };
|
|
@@ -73,6 +73,8 @@ void RemoteTransmitterComponent::space_(uint32_t usec) {
|
|
|
73
73
|
this->target_time_ += usec;
|
|
74
74
|
}
|
|
75
75
|
|
|
76
|
+
void RemoteTransmitterComponent::digital_write(bool value) { this->pin_->digital_write(value); }
|
|
77
|
+
|
|
76
78
|
void RemoteTransmitterComponent::send_internal(uint32_t send_times, uint32_t send_wait) {
|
|
77
79
|
ESP_LOGD(TAG, "Sending remote code");
|
|
78
80
|
uint32_t on_time, off_time;
|
|
@@ -75,6 +75,8 @@ void RemoteTransmitterComponent::space_(uint32_t usec) {
|
|
|
75
75
|
this->target_time_ += usec;
|
|
76
76
|
}
|
|
77
77
|
|
|
78
|
+
void RemoteTransmitterComponent::digital_write(bool value) { this->pin_->digital_write(value); }
|
|
79
|
+
|
|
78
80
|
void RemoteTransmitterComponent::send_internal(uint32_t send_times, uint32_t send_wait) {
|
|
79
81
|
ESP_LOGD(TAG, "Sending remote code");
|
|
80
82
|
uint32_t on_time, off_time;
|
|
@@ -90,11 +90,10 @@ async def to_code(config):
|
|
|
90
90
|
|
|
91
91
|
if task_stack_in_psram := config.get(CONF_TASK_STACK_IN_PSRAM):
|
|
92
92
|
cg.add(var.set_task_stack_in_psram(task_stack_in_psram))
|
|
93
|
-
if task_stack_in_psram:
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
)
|
|
93
|
+
if task_stack_in_psram and config[CONF_TASK_STACK_IN_PSRAM]:
|
|
94
|
+
esp32.add_idf_sdkconfig_option(
|
|
95
|
+
"CONFIG_SPIRAM_ALLOW_STACK_EXTERNAL_MEMORY", True
|
|
96
|
+
)
|
|
98
97
|
|
|
99
98
|
cg.add(var.set_target_bits_per_sample(config[CONF_BITS_PER_SAMPLE]))
|
|
100
99
|
cg.add(var.set_target_sample_rate(config[CONF_SAMPLE_RATE]))
|
|
@@ -136,8 +136,7 @@ RFBRIDGE_ID_SCHEMA = cv.Schema({cv.GenerateID(): cv.use_id(RFBridgeComponent)})
|
|
|
136
136
|
@automation.register_action("rf_bridge.learn", RFBridgeLearnAction, RFBRIDGE_ID_SCHEMA)
|
|
137
137
|
async def rf_bridge_learnx_to_code(config, action_id, template_args, args):
|
|
138
138
|
paren = await cg.get_variable(config[CONF_ID])
|
|
139
|
-
|
|
140
|
-
return var
|
|
139
|
+
return cg.new_Pvariable(action_id, template_args, paren)
|
|
141
140
|
|
|
142
141
|
|
|
143
142
|
@automation.register_action(
|
|
@@ -149,8 +148,7 @@ async def rf_bridge_start_advanced_sniffing_to_code(
|
|
|
149
148
|
config, action_id, template_args, args
|
|
150
149
|
):
|
|
151
150
|
paren = await cg.get_variable(config[CONF_ID])
|
|
152
|
-
|
|
153
|
-
return var
|
|
151
|
+
return cg.new_Pvariable(action_id, template_args, paren)
|
|
154
152
|
|
|
155
153
|
|
|
156
154
|
@automation.register_action(
|
|
@@ -162,8 +160,7 @@ async def rf_bridge_stop_advanced_sniffing_to_code(
|
|
|
162
160
|
config, action_id, template_args, args
|
|
163
161
|
):
|
|
164
162
|
paren = await cg.get_variable(config[CONF_ID])
|
|
165
|
-
|
|
166
|
-
return var
|
|
163
|
+
return cg.new_Pvariable(action_id, template_args, paren)
|
|
167
164
|
|
|
168
165
|
|
|
169
166
|
@automation.register_action(
|
|
@@ -175,8 +172,7 @@ async def rf_bridge_start_bucket_sniffing_to_code(
|
|
|
175
172
|
config, action_id, template_args, args
|
|
176
173
|
):
|
|
177
174
|
paren = await cg.get_variable(config[CONF_ID])
|
|
178
|
-
|
|
179
|
-
return var
|
|
175
|
+
return cg.new_Pvariable(action_id, template_args, paren)
|
|
180
176
|
|
|
181
177
|
|
|
182
178
|
RFBRIDGE_SEND_ADVANCED_CODE_SCHEMA = cv.Schema(
|
|
@@ -129,8 +129,6 @@ void IRAM_ATTR HOT RotaryEncoderSensorStore::gpio_intr(RotaryEncoderSensorStore
|
|
|
129
129
|
}
|
|
130
130
|
|
|
131
131
|
void RotaryEncoderSensor::setup() {
|
|
132
|
-
ESP_LOGCONFIG(TAG, "Running setup for '%s'", this->name_.c_str());
|
|
133
|
-
|
|
134
132
|
int32_t initial_value = 0;
|
|
135
133
|
switch (this->restore_mode_) {
|
|
136
134
|
case ROTARY_ENCODER_RESTORE_DEFAULT_ZERO:
|
|
@@ -16,6 +16,7 @@ from esphome.const import (
|
|
|
16
16
|
KEY_TARGET_FRAMEWORK,
|
|
17
17
|
KEY_TARGET_PLATFORM,
|
|
18
18
|
PLATFORM_RP2040,
|
|
19
|
+
ThreadModel,
|
|
19
20
|
)
|
|
20
21
|
from esphome.core import CORE, EsphomeError, coroutine_with_priority
|
|
21
22
|
from esphome.helpers import copy_file_if_changed, mkdir_p, read_file, write_file
|
|
@@ -171,6 +172,7 @@ async def to_code(config):
|
|
|
171
172
|
cg.set_cpp_standard("gnu++20")
|
|
172
173
|
cg.add_define("ESPHOME_BOARD", config[CONF_BOARD])
|
|
173
174
|
cg.add_define("ESPHOME_VARIANT", "RP2040")
|
|
175
|
+
cg.add_define(ThreadModel.SINGLE)
|
|
174
176
|
|
|
175
177
|
cg.add_platformio_option("extra_scripts", ["post:post_build.py"])
|
|
176
178
|
|
|
@@ -204,7 +206,7 @@ def add_pio_file(component: str, key: str, data: str):
|
|
|
204
206
|
cv.validate_id_name(key)
|
|
205
207
|
except cv.Invalid as e:
|
|
206
208
|
raise EsphomeError(
|
|
207
|
-
f"[{component}] Invalid PIO key: {key}. Allowed characters: [{ascii_letters}{digits}_]\nPlease report an issue https://github.com/esphome/issues"
|
|
209
|
+
f"[{component}] Invalid PIO key: {key}. Allowed characters: [{ascii_letters}{digits}_]\nPlease report an issue https://github.com/esphome/esphome/issues"
|
|
208
210
|
) from e
|
|
209
211
|
CORE.data[KEY_RP2040][KEY_PIO_FILES][key] = data
|
|
210
212
|
|
|
@@ -16,11 +16,7 @@ namespace rp2040_pwm {
|
|
|
16
16
|
|
|
17
17
|
static const char *const TAG = "rp2040_pwm";
|
|
18
18
|
|
|
19
|
-
void RP2040PWM::setup() {
|
|
20
|
-
ESP_LOGCONFIG(TAG, "Running setup");
|
|
21
|
-
|
|
22
|
-
this->setup_pwm_();
|
|
23
|
-
}
|
|
19
|
+
void RP2040PWM::setup() { this->setup_pwm_(); }
|
|
24
20
|
|
|
25
21
|
void RP2040PWM::setup_pwm_() {
|
|
26
22
|
pwm_config config = pwm_get_default_config();
|
|
@@ -2,6 +2,18 @@ from esphome import pins
|
|
|
2
2
|
import esphome.codegen as cg
|
|
3
3
|
from esphome.components import display
|
|
4
4
|
from esphome.components.esp32 import const, only_on_variant
|
|
5
|
+
from esphome.components.mipi import (
|
|
6
|
+
CONF_DE_PIN,
|
|
7
|
+
CONF_HSYNC_BACK_PORCH,
|
|
8
|
+
CONF_HSYNC_FRONT_PORCH,
|
|
9
|
+
CONF_HSYNC_PULSE_WIDTH,
|
|
10
|
+
CONF_PCLK_FREQUENCY,
|
|
11
|
+
CONF_PCLK_INVERTED,
|
|
12
|
+
CONF_PCLK_PIN,
|
|
13
|
+
CONF_VSYNC_BACK_PORCH,
|
|
14
|
+
CONF_VSYNC_FRONT_PORCH,
|
|
15
|
+
CONF_VSYNC_PULSE_WIDTH,
|
|
16
|
+
)
|
|
5
17
|
import esphome.config_validation as cv
|
|
6
18
|
from esphome.const import (
|
|
7
19
|
CONF_BLUE,
|
|
@@ -27,18 +39,6 @@ from esphome.const import (
|
|
|
27
39
|
|
|
28
40
|
DEPENDENCIES = ["esp32"]
|
|
29
41
|
|
|
30
|
-
CONF_DE_PIN = "de_pin"
|
|
31
|
-
CONF_PCLK_PIN = "pclk_pin"
|
|
32
|
-
|
|
33
|
-
CONF_HSYNC_FRONT_PORCH = "hsync_front_porch"
|
|
34
|
-
CONF_HSYNC_PULSE_WIDTH = "hsync_pulse_width"
|
|
35
|
-
CONF_HSYNC_BACK_PORCH = "hsync_back_porch"
|
|
36
|
-
CONF_VSYNC_FRONT_PORCH = "vsync_front_porch"
|
|
37
|
-
CONF_VSYNC_PULSE_WIDTH = "vsync_pulse_width"
|
|
38
|
-
CONF_VSYNC_BACK_PORCH = "vsync_back_porch"
|
|
39
|
-
CONF_PCLK_FREQUENCY = "pclk_frequency"
|
|
40
|
-
CONF_PCLK_INVERTED = "pclk_inverted"
|
|
41
|
-
|
|
42
42
|
rpi_dpi_rgb_ns = cg.esphome_ns.namespace("rpi_dpi_rgb")
|
|
43
43
|
RPI_DPI_RGB = rpi_dpi_rgb_ns.class_("RpiDpiRgb", display.Display, cg.Component)
|
|
44
44
|
ColorOrder = display.display_ns.enum("ColorMode")
|
|
@@ -140,7 +140,6 @@ async def to_code(config):
|
|
|
140
140
|
cg.add(var.set_vsync_front_porch(config[CONF_VSYNC_FRONT_PORCH]))
|
|
141
141
|
cg.add(var.set_pclk_inverted(config[CONF_PCLK_INVERTED]))
|
|
142
142
|
cg.add(var.set_pclk_frequency(config[CONF_PCLK_FREQUENCY]))
|
|
143
|
-
index = 0
|
|
144
143
|
dpins = []
|
|
145
144
|
if CONF_RED in config[CONF_DATA_PINS]:
|
|
146
145
|
red_pins = config[CONF_DATA_PINS][CONF_RED]
|
|
@@ -158,10 +157,9 @@ async def to_code(config):
|
|
|
158
157
|
dpins = dpins[8:16] + dpins[0:8]
|
|
159
158
|
else:
|
|
160
159
|
dpins = config[CONF_DATA_PINS]
|
|
161
|
-
for pin in dpins:
|
|
160
|
+
for index, pin in enumerate(dpins):
|
|
162
161
|
data_pin = await cg.gpio_pin_expression(pin)
|
|
163
162
|
cg.add(var.add_data_pin(data_pin, index))
|
|
164
|
-
index += 1
|
|
165
163
|
|
|
166
164
|
if enable_pin := config.get(CONF_ENABLE_PIN):
|
|
167
165
|
enable = await cg.gpio_pin_expression(enable_pin)
|
|
@@ -6,7 +6,6 @@ namespace esphome {
|
|
|
6
6
|
namespace rpi_dpi_rgb {
|
|
7
7
|
|
|
8
8
|
void RpiDpiRgb::setup() {
|
|
9
|
-
ESP_LOGCONFIG(TAG, "Running setup");
|
|
10
9
|
this->reset_display_();
|
|
11
10
|
esp_lcd_rgb_panel_config_t config{};
|
|
12
11
|
config.flags.fb_in_psram = 1;
|
|
@@ -23,7 +22,6 @@ void RpiDpiRgb::setup() {
|
|
|
23
22
|
config.timings.flags.pclk_active_neg = this->pclk_inverted_;
|
|
24
23
|
config.timings.pclk_hz = this->pclk_frequency_;
|
|
25
24
|
config.clk_src = LCD_CLK_SRC_PLL160M;
|
|
26
|
-
config.psram_trans_align = 64;
|
|
27
25
|
size_t data_pin_count = sizeof(this->data_pins_) / sizeof(this->data_pins_[0]);
|
|
28
26
|
for (size_t i = 0; i != data_pin_count; i++) {
|
|
29
27
|
config.data_gpio_nums[i] = this->data_pins_[i]->get_pin();
|
|
@@ -42,7 +40,6 @@ void RpiDpiRgb::setup() {
|
|
|
42
40
|
}
|
|
43
41
|
ESP_ERROR_CHECK(esp_lcd_panel_reset(this->handle_));
|
|
44
42
|
ESP_ERROR_CHECK(esp_lcd_panel_init(this->handle_));
|
|
45
|
-
ESP_LOGCONFIG(TAG, "RPI_DPI_RGB setup complete");
|
|
46
43
|
}
|
|
47
44
|
void RpiDpiRgb::loop() {
|
|
48
45
|
if (this->handle_ != nullptr)
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Runtime statistics component for ESPHome.
|
|
3
|
+
"""
|
|
4
|
+
|
|
5
|
+
import esphome.codegen as cg
|
|
6
|
+
import esphome.config_validation as cv
|
|
7
|
+
from esphome.const import CONF_ID
|
|
8
|
+
|
|
9
|
+
CODEOWNERS = ["@bdraco"]
|
|
10
|
+
|
|
11
|
+
CONF_LOG_INTERVAL = "log_interval"
|
|
12
|
+
|
|
13
|
+
runtime_stats_ns = cg.esphome_ns.namespace("runtime_stats")
|
|
14
|
+
RuntimeStatsCollector = runtime_stats_ns.class_("RuntimeStatsCollector")
|
|
15
|
+
|
|
16
|
+
CONFIG_SCHEMA = cv.Schema(
|
|
17
|
+
{
|
|
18
|
+
cv.GenerateID(): cv.declare_id(RuntimeStatsCollector),
|
|
19
|
+
cv.Optional(
|
|
20
|
+
CONF_LOG_INTERVAL, default="60s"
|
|
21
|
+
): cv.positive_time_period_milliseconds,
|
|
22
|
+
}
|
|
23
|
+
)
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
async def to_code(config):
|
|
27
|
+
"""Generate code for the runtime statistics component."""
|
|
28
|
+
# Define USE_RUNTIME_STATS when this component is used
|
|
29
|
+
cg.add_define("USE_RUNTIME_STATS")
|
|
30
|
+
|
|
31
|
+
# Create the runtime stats instance (constructor sets global_runtime_stats)
|
|
32
|
+
var = cg.new_Pvariable(config[CONF_ID])
|
|
33
|
+
|
|
34
|
+
cg.add(var.set_log_interval(config[CONF_LOG_INTERVAL]))
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
#include "runtime_stats.h"
|
|
2
|
+
|
|
3
|
+
#ifdef USE_RUNTIME_STATS
|
|
4
|
+
|
|
5
|
+
#include "esphome/core/component.h"
|
|
6
|
+
#include <algorithm>
|
|
7
|
+
|
|
8
|
+
namespace esphome {
|
|
9
|
+
|
|
10
|
+
namespace runtime_stats {
|
|
11
|
+
|
|
12
|
+
RuntimeStatsCollector::RuntimeStatsCollector() : log_interval_(60000), next_log_time_(0) {
|
|
13
|
+
global_runtime_stats = this;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
void RuntimeStatsCollector::record_component_time(Component *component, uint32_t duration_ms, uint32_t current_time) {
|
|
17
|
+
if (component == nullptr)
|
|
18
|
+
return;
|
|
19
|
+
|
|
20
|
+
// Check if we have cached the name for this component
|
|
21
|
+
auto name_it = this->component_names_cache_.find(component);
|
|
22
|
+
if (name_it == this->component_names_cache_.end()) {
|
|
23
|
+
// First time seeing this component, cache its name
|
|
24
|
+
const char *source = component->get_component_source();
|
|
25
|
+
this->component_names_cache_[component] = source;
|
|
26
|
+
this->component_stats_[source].record_time(duration_ms);
|
|
27
|
+
} else {
|
|
28
|
+
this->component_stats_[name_it->second].record_time(duration_ms);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
if (this->next_log_time_ == 0) {
|
|
32
|
+
this->next_log_time_ = current_time + this->log_interval_;
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
void RuntimeStatsCollector::log_stats_() {
|
|
38
|
+
ESP_LOGI(TAG, "Component Runtime Statistics");
|
|
39
|
+
ESP_LOGI(TAG, "Period stats (last %" PRIu32 "ms):", this->log_interval_);
|
|
40
|
+
|
|
41
|
+
// First collect stats we want to display
|
|
42
|
+
std::vector<ComponentStatPair> stats_to_display;
|
|
43
|
+
|
|
44
|
+
for (const auto &it : this->component_stats_) {
|
|
45
|
+
const ComponentRuntimeStats &stats = it.second;
|
|
46
|
+
if (stats.get_period_count() > 0) {
|
|
47
|
+
ComponentStatPair pair = {it.first, &stats};
|
|
48
|
+
stats_to_display.push_back(pair);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
// Sort by period runtime (descending)
|
|
53
|
+
std::sort(stats_to_display.begin(), stats_to_display.end(), std::greater<ComponentStatPair>());
|
|
54
|
+
|
|
55
|
+
// Log top components by period runtime
|
|
56
|
+
for (const auto &it : stats_to_display) {
|
|
57
|
+
const char *source = it.name;
|
|
58
|
+
const ComponentRuntimeStats *stats = it.stats;
|
|
59
|
+
|
|
60
|
+
ESP_LOGI(TAG, " %s: count=%" PRIu32 ", avg=%.2fms, max=%" PRIu32 "ms, total=%" PRIu32 "ms", source,
|
|
61
|
+
stats->get_period_count(), stats->get_period_avg_time_ms(), stats->get_period_max_time_ms(),
|
|
62
|
+
stats->get_period_time_ms());
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
// Log total stats since boot
|
|
66
|
+
ESP_LOGI(TAG, "Total stats (since boot):");
|
|
67
|
+
|
|
68
|
+
// Re-sort by total runtime for all-time stats
|
|
69
|
+
std::sort(stats_to_display.begin(), stats_to_display.end(),
|
|
70
|
+
[](const ComponentStatPair &a, const ComponentStatPair &b) {
|
|
71
|
+
return a.stats->get_total_time_ms() > b.stats->get_total_time_ms();
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
for (const auto &it : stats_to_display) {
|
|
75
|
+
const char *source = it.name;
|
|
76
|
+
const ComponentRuntimeStats *stats = it.stats;
|
|
77
|
+
|
|
78
|
+
ESP_LOGI(TAG, " %s: count=%" PRIu32 ", avg=%.2fms, max=%" PRIu32 "ms, total=%" PRIu32 "ms", source,
|
|
79
|
+
stats->get_total_count(), stats->get_total_avg_time_ms(), stats->get_total_max_time_ms(),
|
|
80
|
+
stats->get_total_time_ms());
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
void RuntimeStatsCollector::process_pending_stats(uint32_t current_time) {
|
|
85
|
+
if (this->next_log_time_ == 0)
|
|
86
|
+
return;
|
|
87
|
+
|
|
88
|
+
if (current_time >= this->next_log_time_) {
|
|
89
|
+
this->log_stats_();
|
|
90
|
+
this->reset_stats_();
|
|
91
|
+
this->next_log_time_ = current_time + this->log_interval_;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
} // namespace runtime_stats
|
|
96
|
+
|
|
97
|
+
runtime_stats::RuntimeStatsCollector *global_runtime_stats =
|
|
98
|
+
nullptr; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables)
|
|
99
|
+
|
|
100
|
+
} // namespace esphome
|
|
101
|
+
|
|
102
|
+
#endif // USE_RUNTIME_STATS
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
#pragma once
|
|
2
|
+
|
|
3
|
+
#include "esphome/core/defines.h"
|
|
4
|
+
|
|
5
|
+
#ifdef USE_RUNTIME_STATS
|
|
6
|
+
|
|
7
|
+
#include <map>
|
|
8
|
+
#include <vector>
|
|
9
|
+
#include <cstdint>
|
|
10
|
+
#include <cstring>
|
|
11
|
+
#include "esphome/core/helpers.h"
|
|
12
|
+
#include "esphome/core/log.h"
|
|
13
|
+
|
|
14
|
+
namespace esphome {
|
|
15
|
+
|
|
16
|
+
class Component; // Forward declaration
|
|
17
|
+
|
|
18
|
+
namespace runtime_stats {
|
|
19
|
+
|
|
20
|
+
static const char *const TAG = "runtime_stats";
|
|
21
|
+
|
|
22
|
+
class ComponentRuntimeStats {
|
|
23
|
+
public:
|
|
24
|
+
ComponentRuntimeStats()
|
|
25
|
+
: period_count_(0),
|
|
26
|
+
period_time_ms_(0),
|
|
27
|
+
period_max_time_ms_(0),
|
|
28
|
+
total_count_(0),
|
|
29
|
+
total_time_ms_(0),
|
|
30
|
+
total_max_time_ms_(0) {}
|
|
31
|
+
|
|
32
|
+
void record_time(uint32_t duration_ms) {
|
|
33
|
+
// Update period counters
|
|
34
|
+
this->period_count_++;
|
|
35
|
+
this->period_time_ms_ += duration_ms;
|
|
36
|
+
if (duration_ms > this->period_max_time_ms_)
|
|
37
|
+
this->period_max_time_ms_ = duration_ms;
|
|
38
|
+
|
|
39
|
+
// Update total counters
|
|
40
|
+
this->total_count_++;
|
|
41
|
+
this->total_time_ms_ += duration_ms;
|
|
42
|
+
if (duration_ms > this->total_max_time_ms_)
|
|
43
|
+
this->total_max_time_ms_ = duration_ms;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
void reset_period_stats() {
|
|
47
|
+
this->period_count_ = 0;
|
|
48
|
+
this->period_time_ms_ = 0;
|
|
49
|
+
this->period_max_time_ms_ = 0;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
// Period stats (reset each logging interval)
|
|
53
|
+
uint32_t get_period_count() const { return this->period_count_; }
|
|
54
|
+
uint32_t get_period_time_ms() const { return this->period_time_ms_; }
|
|
55
|
+
uint32_t get_period_max_time_ms() const { return this->period_max_time_ms_; }
|
|
56
|
+
float get_period_avg_time_ms() const {
|
|
57
|
+
return this->period_count_ > 0 ? this->period_time_ms_ / static_cast<float>(this->period_count_) : 0.0f;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
// Total stats (persistent until reboot)
|
|
61
|
+
uint32_t get_total_count() const { return this->total_count_; }
|
|
62
|
+
uint32_t get_total_time_ms() const { return this->total_time_ms_; }
|
|
63
|
+
uint32_t get_total_max_time_ms() const { return this->total_max_time_ms_; }
|
|
64
|
+
float get_total_avg_time_ms() const {
|
|
65
|
+
return this->total_count_ > 0 ? this->total_time_ms_ / static_cast<float>(this->total_count_) : 0.0f;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
protected:
|
|
69
|
+
// Period stats (reset each logging interval)
|
|
70
|
+
uint32_t period_count_;
|
|
71
|
+
uint32_t period_time_ms_;
|
|
72
|
+
uint32_t period_max_time_ms_;
|
|
73
|
+
|
|
74
|
+
// Total stats (persistent until reboot)
|
|
75
|
+
uint32_t total_count_;
|
|
76
|
+
uint32_t total_time_ms_;
|
|
77
|
+
uint32_t total_max_time_ms_;
|
|
78
|
+
};
|
|
79
|
+
|
|
80
|
+
// For sorting components by run time
|
|
81
|
+
struct ComponentStatPair {
|
|
82
|
+
const char *name;
|
|
83
|
+
const ComponentRuntimeStats *stats;
|
|
84
|
+
|
|
85
|
+
bool operator>(const ComponentStatPair &other) const {
|
|
86
|
+
// Sort by period time as that's what we're displaying in the logs
|
|
87
|
+
return stats->get_period_time_ms() > other.stats->get_period_time_ms();
|
|
88
|
+
}
|
|
89
|
+
};
|
|
90
|
+
|
|
91
|
+
class RuntimeStatsCollector {
|
|
92
|
+
public:
|
|
93
|
+
RuntimeStatsCollector();
|
|
94
|
+
|
|
95
|
+
void set_log_interval(uint32_t log_interval) { this->log_interval_ = log_interval; }
|
|
96
|
+
uint32_t get_log_interval() const { return this->log_interval_; }
|
|
97
|
+
|
|
98
|
+
void record_component_time(Component *component, uint32_t duration_ms, uint32_t current_time);
|
|
99
|
+
|
|
100
|
+
// Process any pending stats printing (should be called after component loop)
|
|
101
|
+
void process_pending_stats(uint32_t current_time);
|
|
102
|
+
|
|
103
|
+
protected:
|
|
104
|
+
void log_stats_();
|
|
105
|
+
|
|
106
|
+
void reset_stats_() {
|
|
107
|
+
for (auto &it : this->component_stats_) {
|
|
108
|
+
it.second.reset_period_stats();
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
// Use const char* keys for efficiency
|
|
113
|
+
// Custom comparator for const char* keys in map
|
|
114
|
+
// Without this, std::map would compare pointer addresses instead of string contents,
|
|
115
|
+
// causing identical component names at different addresses to be treated as different keys
|
|
116
|
+
struct CStrCompare {
|
|
117
|
+
bool operator()(const char *a, const char *b) const { return std::strcmp(a, b) < 0; }
|
|
118
|
+
};
|
|
119
|
+
std::map<const char *, ComponentRuntimeStats, CStrCompare> component_stats_;
|
|
120
|
+
std::map<Component *, const char *> component_names_cache_;
|
|
121
|
+
uint32_t log_interval_;
|
|
122
|
+
uint32_t next_log_time_;
|
|
123
|
+
};
|
|
124
|
+
|
|
125
|
+
} // namespace runtime_stats
|
|
126
|
+
|
|
127
|
+
extern runtime_stats::RuntimeStatsCollector
|
|
128
|
+
*global_runtime_stats; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables)
|
|
129
|
+
|
|
130
|
+
} // namespace esphome
|
|
131
|
+
|
|
132
|
+
#endif // USE_RUNTIME_STATS
|
|
@@ -26,8 +26,6 @@ static const uint16_t SCD30_CMD_TEMPERATURE_OFFSET = 0x5403;
|
|
|
26
26
|
static const uint16_t SCD30_CMD_SOFT_RESET = 0xD304;
|
|
27
27
|
|
|
28
28
|
void SCD30Component::setup() {
|
|
29
|
-
ESP_LOGCONFIG(TAG, "Running setup");
|
|
30
|
-
|
|
31
29
|
#ifdef USE_ESP8266
|
|
32
30
|
Wire.setClockStretchLimit(150000);
|
|
33
31
|
#endif
|
|
@@ -3,6 +3,7 @@ import esphome.codegen as cg
|
|
|
3
3
|
from esphome.components import i2c, sensirion_common, sensor
|
|
4
4
|
import esphome.config_validation as cv
|
|
5
5
|
from esphome.const import (
|
|
6
|
+
CONF_ALTITUDE_COMPENSATION,
|
|
6
7
|
CONF_AMBIENT_PRESSURE_COMPENSATION,
|
|
7
8
|
CONF_AUTOMATIC_SELF_CALIBRATION,
|
|
8
9
|
CONF_CO2,
|
|
@@ -35,8 +36,6 @@ ForceRecalibrationWithReference = scd30_ns.class_(
|
|
|
35
36
|
"ForceRecalibrationWithReference", automation.Action
|
|
36
37
|
)
|
|
37
38
|
|
|
38
|
-
CONF_ALTITUDE_COMPENSATION = "altitude_compensation"
|
|
39
|
-
|
|
40
39
|
CONFIG_SCHEMA = (
|
|
41
40
|
cv.Schema(
|
|
42
41
|
{
|
|
@@ -27,7 +27,6 @@ static const uint16_t SCD4X_CMD_GET_FEATURESET = 0x202f;
|
|
|
27
27
|
static const float SCD4X_TEMPERATURE_OFFSET_MULTIPLIER = (1 << 16) / 175.0f;
|
|
28
28
|
|
|
29
29
|
void SCD4XComponent::setup() {
|
|
30
|
-
ESP_LOGCONFIG(TAG, "Running setup");
|
|
31
30
|
// the sensor needs 1000 ms to enter the idle state
|
|
32
31
|
this->set_timeout(1000, [this]() {
|
|
33
32
|
this->status_clear_error();
|