esphome 2025.4.1__py3-none-any.whl → 2025.5.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 +16 -14
- esphome/components/ac_dimmer/ac_dimmer.cpp +3 -2
- esphome/components/adc/__init__.py +51 -34
- esphome/components/airthings_wave_base/__init__.py +1 -1
- esphome/components/alarm_control_panel/__init__.py +37 -2
- esphome/components/am43/cover/__init__.py +4 -5
- esphome/components/analog_threshold/analog_threshold_binary_sensor.cpp +6 -4
- esphome/components/analog_threshold/analog_threshold_binary_sensor.h +4 -5
- esphome/components/analog_threshold/binary_sensor.py +10 -8
- esphome/components/anova/climate.py +4 -5
- esphome/components/api/__init__.py +25 -8
- esphome/components/api/api_connection.cpp +416 -662
- esphome/components/api/api_connection.h +256 -57
- esphome/components/api/api_frame_helper.cpp +232 -177
- esphome/components/api/api_frame_helper.h +61 -8
- esphome/components/api/api_noise_context.h +13 -4
- esphome/components/api/api_pb2.cpp +1422 -1
- esphome/components/api/api_pb2.h +255 -1
- esphome/components/api/api_pb2_service.cpp +162 -49
- esphome/components/api/api_pb2_service.h +90 -51
- esphome/components/api/api_pb2_size.h +361 -0
- esphome/components/api/api_server.cpp +110 -34
- esphome/components/api/api_server.h +8 -0
- esphome/components/api/proto.h +86 -17
- esphome/components/as3935_i2c/as3935_i2c.h +0 -3
- esphome/components/as7341/as7341.h +1 -1
- esphome/components/at581x/at581x.h +4 -4
- esphome/components/atm90e32/__init__.py +1 -0
- esphome/components/atm90e32/atm90e32.cpp +576 -199
- esphome/components/atm90e32/atm90e32.h +128 -31
- esphome/components/atm90e32/atm90e32_reg.h +4 -2
- esphome/components/atm90e32/button/__init__.py +62 -10
- esphome/components/atm90e32/button/atm90e32_button.cpp +63 -4
- esphome/components/atm90e32/button/atm90e32_button.h +36 -4
- esphome/components/atm90e32/number/__init__.py +130 -0
- esphome/components/atm90e32/number/atm90e32_number.h +16 -0
- esphome/components/atm90e32/sensor.py +21 -4
- esphome/components/atm90e32/text_sensor/__init__.py +48 -0
- esphome/components/audio/__init__.py +96 -49
- esphome/components/audio/audio.h +48 -0
- esphome/components/audio/audio_decoder.cpp +1 -1
- esphome/components/audio/audio_resampler.cpp +2 -0
- esphome/components/audio/audio_resampler.h +1 -0
- esphome/components/ballu/climate.py +2 -9
- esphome/components/bang_bang/climate.py +5 -6
- esphome/components/bedjet/bedjet_hub.cpp +1 -0
- esphome/components/bedjet/climate/__init__.py +3 -8
- esphome/components/bedjet/fan/__init__.py +2 -11
- esphome/components/binary/fan/__init__.py +13 -16
- esphome/components/binary_sensor/__init__.py +13 -10
- esphome/components/bl0906/constants.h +16 -16
- esphome/components/ble_client/text_sensor/__init__.py +3 -5
- esphome/components/bluetooth_proxy/bluetooth_connection.cpp +4 -6
- esphome/components/bluetooth_proxy/bluetooth_proxy.cpp +136 -21
- esphome/components/bluetooth_proxy/bluetooth_proxy.h +7 -0
- esphome/components/button/__init__.py +11 -8
- esphome/components/canbus/canbus.cpp +3 -0
- esphome/components/canbus/canbus.h +16 -0
- esphome/components/ccs811/sensor.py +9 -6
- esphome/components/climate/__init__.py +35 -2
- esphome/components/climate/climate_mode.h +1 -1
- esphome/components/climate/climate_traits.h +63 -57
- esphome/components/climate_ir/__init__.py +57 -17
- esphome/components/climate_ir_lg/climate.py +2 -5
- esphome/components/climate_ir_lg/climate_ir_lg.cpp +7 -7
- esphome/components/climate_ir_lg/climate_ir_lg.h +1 -1
- esphome/components/color/__init__.py +2 -0
- esphome/components/const/__init__.py +5 -0
- esphome/components/coolix/climate.py +2 -9
- esphome/components/copy/cover/__init__.py +10 -9
- esphome/components/copy/fan/__init__.py +11 -9
- esphome/components/copy/lock/__init__.py +11 -9
- esphome/components/copy/text/__init__.py +9 -6
- esphome/components/cover/__init__.py +37 -2
- esphome/components/cse7766/cse7766.cpp +2 -1
- esphome/components/cst226/binary_sensor/__init__.py +28 -0
- esphome/components/cst226/binary_sensor/cs226_button.h +22 -0
- esphome/components/cst226/binary_sensor/cstt6_button.cpp +19 -0
- esphome/components/cst226/touchscreen/cst226_touchscreen.cpp +27 -5
- esphome/components/cst226/touchscreen/cst226_touchscreen.h +10 -10
- esphome/components/current_based/cover.py +37 -36
- esphome/components/current_based/current_based_cover.cpp +2 -1
- esphome/components/daikin/climate.py +2 -9
- esphome/components/daikin/daikin.cpp +15 -9
- esphome/components/daikin/daikin.h +5 -5
- esphome/components/daikin_arc/climate.py +2 -7
- esphome/components/daikin_brc/climate.py +3 -5
- esphome/components/dallas_temp/dallas_temp.cpp +17 -24
- esphome/components/dallas_temp/dallas_temp.h +0 -1
- esphome/components/daly_bms/daly_bms.cpp +2 -1
- esphome/components/debug/debug_component.cpp +6 -1
- esphome/components/debug/debug_component.h +8 -0
- esphome/components/debug/debug_esp32.cpp +109 -254
- esphome/components/debug/sensor.py +14 -0
- esphome/components/deep_sleep/deep_sleep_esp32.cpp +13 -1
- esphome/components/delonghi/climate.py +2 -9
- esphome/components/demo/__init__.py +18 -20
- esphome/components/dfrobot_sen0395/switch/__init__.py +21 -22
- esphome/components/display/rect.cpp +4 -9
- esphome/components/display/rect.h +1 -1
- esphome/components/dps310/sensor.py +6 -6
- esphome/components/ee895/sensor.py +9 -9
- esphome/components/emmeti/climate.py +2 -9
- esphome/components/endstop/cover.py +17 -16
- esphome/components/endstop/endstop_cover.cpp +2 -1
- esphome/components/ens160_base/__init__.py +12 -9
- esphome/components/esp32/__init__.py +60 -3
- esphome/components/esp32/core.cpp +11 -5
- esphome/components/esp32/gpio.cpp +86 -24
- esphome/components/esp32/gpio.py +15 -16
- esphome/components/esp32/gpio_esp32.py +1 -2
- esphome/components/esp32/gpio_esp32_c2.py +1 -1
- esphome/components/esp32/gpio_esp32_c3.py +1 -1
- esphome/components/esp32/gpio_esp32_c6.py +1 -1
- esphome/components/esp32/gpio_esp32_h2.py +1 -1
- esphome/components/esp32_ble/ble.cpp +1 -8
- esphome/components/esp32_ble/ble.h +5 -3
- esphome/components/esp32_ble/ble_advertising.cpp +2 -1
- esphome/components/esp32_ble/ble_advertising.h +1 -0
- esphome/components/esp32_ble_server/__init__.py +3 -0
- esphome/components/esp32_ble_tracker/__init__.py +7 -1
- esphome/components/esp32_ble_tracker/esp32_ble_tracker.cpp +192 -118
- esphome/components/esp32_ble_tracker/esp32_ble_tracker.h +29 -3
- esphome/components/esp32_camera/__init__.py +1 -1
- esphome/components/esp32_camera/esp32_camera.cpp +2 -10
- esphome/components/esp32_camera/esp32_camera.h +1 -1
- esphome/components/esp32_can/esp32_can.cpp +1 -1
- esphome/components/esp32_improv/esp32_improv_component.cpp +1 -1
- esphome/components/esp32_rmt_led_strip/led_strip.cpp +1 -1
- esphome/components/esp32_rmt_led_strip/led_strip.h +7 -5
- esphome/components/esp32_rmt_led_strip/light.py +9 -1
- esphome/components/esp32_touch/esp32_touch.cpp +1 -1
- esphome/components/esp8266/gpio.cpp +69 -8
- esphome/components/ethernet/ethernet_component.cpp +1 -1
- esphome/components/event/__init__.py +13 -10
- esphome/components/factory_reset/switch/__init__.py +7 -21
- esphome/components/fan/__init__.py +52 -5
- esphome/components/fastled_base/__init__.py +1 -4
- esphome/components/fastled_base/fastled_light.cpp +1 -1
- esphome/components/feedback/cover.py +38 -33
- esphome/components/feedback/feedback_cover.cpp +2 -1
- esphome/components/fujitsu_general/climate.py +2 -9
- esphome/components/gcja5/gcja5.cpp +2 -1
- esphome/components/gpio/one_wire/gpio_one_wire.cpp +45 -43
- esphome/components/gpio/one_wire/gpio_one_wire.h +2 -1
- esphome/components/gpio_expander/cached_gpio.h +22 -7
- esphome/components/gps/__init__.py +47 -17
- esphome/components/gps/gps.cpp +42 -23
- esphome/components/gps/gps.h +17 -13
- esphome/components/graph/__init__.py +1 -2
- esphome/components/gree/climate.py +4 -6
- esphome/components/gree/gree.cpp +16 -2
- esphome/components/gree/gree.h +2 -2
- esphome/components/growatt_solar/growatt_solar.cpp +2 -1
- esphome/components/haier/climate.py +37 -34
- esphome/components/hbridge/fan/__init__.py +19 -17
- esphome/components/he60r/cover.py +4 -5
- esphome/components/heatpumpir/climate.py +3 -6
- esphome/components/hitachi_ac344/climate.py +2 -9
- esphome/components/hitachi_ac424/climate.py +2 -9
- esphome/components/hlw8012/hlw8012.cpp +1 -1
- esphome/components/hm3301/hm3301.h +1 -1
- esphome/components/hte501/sensor.py +6 -6
- esphome/components/http_request/__init__.py +39 -6
- esphome/components/http_request/http_request.cpp +20 -0
- esphome/components/http_request/http_request.h +57 -15
- esphome/components/http_request/http_request_arduino.cpp +22 -6
- esphome/components/http_request/http_request_arduino.h +4 -3
- esphome/components/http_request/http_request_host.cpp +141 -0
- esphome/components/http_request/http_request_host.h +37 -0
- esphome/components/http_request/http_request_idf.cpp +35 -3
- esphome/components/http_request/http_request_idf.h +10 -3
- esphome/components/http_request/httplib.h +9691 -0
- esphome/components/http_request/update/__init__.py +11 -8
- esphome/components/hyt271/sensor.py +6 -6
- esphome/components/i2c/i2c.h +4 -0
- esphome/components/i2c/i2c_bus_esp_idf.cpp +1 -1
- esphome/components/i2s_audio/__init__.py +131 -22
- esphome/components/i2s_audio/i2s_audio.h +44 -4
- esphome/components/i2s_audio/media_player/__init__.py +19 -9
- esphome/components/i2s_audio/microphone/__init__.py +63 -5
- esphome/components/i2s_audio/microphone/i2s_audio_microphone.cpp +351 -61
- esphome/components/i2s_audio/microphone/i2s_audio_microphone.h +40 -6
- esphome/components/i2s_audio/speaker/__init__.py +31 -5
- esphome/components/i2s_audio/speaker/i2s_audio_speaker.cpp +155 -19
- esphome/components/i2s_audio/speaker/i2s_audio_speaker.h +17 -4
- esphome/components/ili9xxx/ili9xxx_init.h +1 -1
- esphome/components/image/__init__.py +37 -17
- esphome/components/image/image.cpp +25 -8
- esphome/components/internal_temperature/internal_temperature.cpp +6 -4
- esphome/components/key_collector/__init__.py +35 -0
- esphome/components/key_collector/key_collector.cpp +8 -0
- esphome/components/key_collector/key_collector.h +10 -0
- esphome/components/kuntze/kuntze.cpp +2 -1
- esphome/components/ld2410/ld2410.h +1 -1
- esphome/components/ld2450/ld2450.h +1 -1
- esphome/components/light/__init__.py +57 -0
- esphome/components/lock/__init__.py +51 -4
- esphome/components/lock/automation.h +2 -13
- esphome/components/logger/__init__.py +22 -0
- esphome/components/logger/logger.cpp +154 -103
- esphome/components/logger/logger.h +211 -36
- esphome/components/logger/task_log_buffer.cpp +138 -0
- esphome/components/logger/task_log_buffer.h +69 -0
- esphome/components/lvgl/__init__.py +13 -5
- esphome/components/lvgl/automation.py +50 -1
- esphome/components/lvgl/defines.py +0 -1
- esphome/components/lvgl/lv_validation.py +10 -1
- esphome/components/lvgl/lvgl_esphome.cpp +5 -1
- esphome/components/lvgl/schemas.py +14 -14
- esphome/components/lvgl/text/__init__.py +1 -2
- esphome/components/lvgl/widgets/arc.py +7 -6
- esphome/components/lvgl/widgets/buttonmatrix.py +3 -3
- esphome/components/lvgl/widgets/checkbox.py +2 -2
- esphome/components/lvgl/widgets/dropdown.py +2 -1
- esphome/components/lvgl/widgets/img.py +15 -12
- esphome/components/mapping/__init__.py +134 -0
- esphome/components/matrix_keypad/matrix_keypad.cpp +2 -1
- esphome/components/max7219digit/max7219digit.cpp +28 -27
- esphome/components/mdns/__init__.py +11 -5
- esphome/components/mdns/mdns_component.cpp +11 -5
- esphome/components/mdns/mdns_component.h +3 -2
- esphome/components/mdns/mdns_esp32.cpp +4 -3
- esphome/components/mdns/mdns_esp8266.cpp +4 -2
- esphome/components/mdns/mdns_libretiny.cpp +4 -2
- esphome/components/mdns/mdns_rp2040.cpp +4 -2
- esphome/components/media_player/__init__.py +40 -6
- esphome/components/mhz19/sensor.py +11 -7
- esphome/components/micro_wake_word/__init__.py +99 -31
- esphome/components/micro_wake_word/automation.h +54 -0
- esphome/components/micro_wake_word/micro_wake_word.cpp +331 -319
- esphome/components/micro_wake_word/micro_wake_word.h +58 -105
- esphome/components/micro_wake_word/preprocessor_settings.h +19 -2
- esphome/components/micro_wake_word/streaming_model.cpp +158 -41
- esphome/components/micro_wake_word/streaming_model.h +85 -13
- esphome/components/microphone/__init__.py +139 -9
- esphome/components/microphone/automation.h +14 -2
- esphome/components/microphone/microphone.cpp +21 -0
- esphome/components/microphone/microphone.h +14 -5
- esphome/components/microphone/microphone_source.cpp +95 -0
- esphome/components/microphone/microphone_source.h +80 -0
- esphome/components/mics_4514/sensor.py +25 -14
- esphome/components/midea/climate.py +3 -4
- esphome/components/midea_ir/climate.py +3 -5
- esphome/components/mipi_spi/__init__.py +15 -0
- esphome/components/mipi_spi/display.py +474 -0
- esphome/components/mipi_spi/mipi_spi.cpp +481 -0
- esphome/components/mipi_spi/mipi_spi.h +171 -0
- esphome/components/mipi_spi/models/__init__.py +65 -0
- esphome/components/mipi_spi/models/amoled.py +72 -0
- esphome/components/mipi_spi/models/commands.py +82 -0
- esphome/components/mipi_spi/models/cyd.py +10 -0
- esphome/components/mipi_spi/models/ili.py +749 -0
- esphome/components/mipi_spi/models/jc.py +260 -0
- esphome/components/mipi_spi/models/lanbon.py +15 -0
- esphome/components/mipi_spi/models/lilygo.py +60 -0
- esphome/components/mipi_spi/models/waveshare.py +139 -0
- esphome/components/mitsubishi/climate.py +2 -5
- esphome/components/mitsubishi/mitsubishi.cpp +9 -9
- esphome/components/mixer/speaker/mixer_speaker.cpp +12 -22
- esphome/components/mixer/speaker/mixer_speaker.h +1 -3
- esphome/components/mlx90393/sensor.py +5 -0
- esphome/components/mlx90393/sensor_mlx90393.cpp +195 -13
- esphome/components/mlx90393/sensor_mlx90393.h +21 -4
- esphome/components/modbus/modbus.cpp +2 -1
- esphome/components/mqtt/__init__.py +1 -1
- esphome/components/mqtt/mqtt_client.cpp +6 -2
- esphome/components/mqtt/mqtt_const.h +4 -0
- esphome/components/mqtt/mqtt_fan.cpp +39 -0
- esphome/components/mqtt/mqtt_fan.h +2 -0
- esphome/components/ms5611/sensor.py +6 -6
- esphome/components/ms8607/sensor.py +3 -3
- esphome/components/network/__init__.py +1 -1
- esphome/components/nextion/base_component.py +17 -16
- esphome/components/nextion/display.py +11 -2
- esphome/components/nextion/nextion.cpp +39 -1
- esphome/components/nextion/nextion.h +50 -0
- esphome/components/noblex/climate.py +2 -9
- esphome/components/number/__init__.py +12 -9
- esphome/components/one_wire/one_wire_bus.cpp +14 -10
- esphome/components/one_wire/one_wire_bus.h +14 -8
- esphome/components/online_image/bmp_image.cpp +48 -11
- esphome/components/online_image/bmp_image.h +2 -0
- esphome/components/opentherm/binary_sensor/__init__.py +2 -4
- esphome/components/opentherm/number/__init__.py +11 -20
- esphome/components/opentherm/sensor/__init__.py +3 -3
- esphome/components/opentherm/switch/__init__.py +3 -5
- esphome/components/output/lock/__init__.py +11 -9
- esphome/components/packages/__init__.py +33 -31
- esphome/components/packet_transport/__init__.py +201 -0
- esphome/components/packet_transport/binary_sensor.py +19 -0
- esphome/components/packet_transport/packet_transport.cpp +534 -0
- esphome/components/packet_transport/packet_transport.h +154 -0
- esphome/components/packet_transport/sensor.py +19 -0
- esphome/components/pca9685/pca9685_output.cpp +2 -1
- esphome/components/pid/climate.py +2 -4
- esphome/components/pm2005/__init__.py +1 -0
- esphome/components/pm2005/pm2005.cpp +123 -0
- esphome/components/pm2005/pm2005.h +46 -0
- esphome/components/pm2005/sensor.py +86 -0
- esphome/components/pmsa003i/pmsa003i.cpp +43 -16
- esphome/components/pmsa003i/pmsa003i.h +25 -25
- esphome/components/pmsx003/pmsx003.cpp +195 -230
- esphome/components/pmsx003/pmsx003.h +51 -33
- esphome/components/pmsx003/sensor.py +21 -11
- esphome/components/pn7150/pn7150.h +2 -2
- esphome/components/pn7160/pn7160.h +2 -2
- esphome/components/prometheus/prometheus_handler.cpp +174 -0
- esphome/components/prometheus/prometheus_handler.h +17 -0
- esphome/components/psram/__init__.py +7 -5
- esphome/components/pulse_meter/pulse_meter_sensor.cpp +32 -12
- esphome/components/pulse_meter/pulse_meter_sensor.h +5 -5
- esphome/components/pzem004t/pzem004t.cpp +2 -1
- esphome/components/qspi_dbi/__init__.py +0 -1
- esphome/components/qspi_dbi/display.py +2 -1
- esphome/components/qspi_dbi/models.py +1 -2
- esphome/components/remote_base/__init__.py +91 -0
- esphome/components/remote_base/beo4_protocol.cpp +153 -0
- esphome/components/remote_base/beo4_protocol.h +43 -0
- esphome/components/remote_base/gobox_protocol.cpp +131 -0
- esphome/components/remote_base/gobox_protocol.h +54 -0
- esphome/components/remote_receiver/remote_receiver_esp32.cpp +16 -9
- esphome/components/resampler/speaker/resampler_speaker.cpp +12 -10
- esphome/components/resampler/speaker/resampler_speaker.h +1 -1
- esphome/components/rf_bridge/rf_bridge.cpp +2 -1
- esphome/components/scd30/sensor.py +2 -3
- esphome/components/scd4x/sensor.py +4 -5
- esphome/components/sdp3x/sensor.py +2 -1
- esphome/components/sds011/sds011.cpp +2 -1
- esphome/components/select/__init__.py +19 -20
- esphome/components/sen5x/sen5x.cpp +55 -36
- esphome/components/sen5x/sensor.py +1 -1
- esphome/components/senseair/sensor.py +3 -3
- esphome/components/sensor/__init__.py +158 -14
- esphome/components/sensor/filter.cpp +23 -0
- esphome/components/sensor/filter.h +22 -0
- esphome/components/sgp30/sensor.py +14 -16
- esphome/components/sgp4x/sensor.py +1 -1
- esphome/components/sht4x/sht4x.cpp +43 -22
- esphome/components/sht4x/sht4x.h +1 -1
- esphome/components/shtcx/sensor.py +6 -6
- esphome/components/slow_pwm/slow_pwm_output.cpp +2 -1
- esphome/components/sml/text_sensor/__init__.py +4 -6
- esphome/components/sound_level/__init__.py +0 -0
- esphome/components/sound_level/sensor.py +97 -0
- esphome/components/sound_level/sound_level.cpp +194 -0
- esphome/components/sound_level/sound_level.h +73 -0
- esphome/components/speaker/media_player/__init__.py +4 -8
- esphome/components/speaker/media_player/speaker_media_player.cpp +0 -18
- esphome/components/speaker/media_player/speaker_media_player.h +0 -11
- esphome/components/speaker/speaker.h +4 -7
- esphome/components/speed/fan/__init__.py +17 -16
- esphome/components/spi/spi.h +11 -1
- esphome/components/sprinkler/__init__.py +18 -19
- esphome/components/sprinkler/sprinkler.cpp +6 -5
- esphome/components/switch/__init__.py +32 -42
- esphome/components/syslog/__init__.py +41 -0
- esphome/components/syslog/esphome_syslog.cpp +49 -0
- esphome/components/syslog/esphome_syslog.h +27 -0
- esphome/components/t6615/sensor.py +3 -3
- esphome/components/t6615/t6615.cpp +2 -1
- esphome/components/tca9555/tca9555.cpp +11 -6
- esphome/components/tcl112/climate.py +2 -9
- esphome/components/template/alarm_control_panel/__init__.py +7 -6
- esphome/components/template/alarm_control_panel/template_alarm_control_panel.cpp +21 -17
- esphome/components/template/alarm_control_panel/template_alarm_control_panel.h +2 -1
- esphome/components/template/cover/__init__.py +27 -21
- esphome/components/template/fan/__init__.py +14 -12
- esphome/components/template/lock/__init__.py +20 -25
- esphome/components/template/lock/automation.h +18 -0
- esphome/components/template/text/__init__.py +4 -3
- esphome/components/template/valve/__init__.py +32 -21
- esphome/components/template/valve/automation.h +24 -0
- esphome/components/text/__init__.py +32 -1
- esphome/components/text_sensor/__init__.py +24 -29
- esphome/components/thermostat/climate.py +5 -5
- esphome/components/time_based/cover.py +17 -16
- esphome/components/time_based/time_based_cover.cpp +2 -1
- esphome/components/tm1638/switch/__init__.py +10 -7
- esphome/components/tormatic/cover.py +4 -5
- esphome/components/toshiba/climate.py +3 -5
- esphome/components/touchscreen/touchscreen.cpp +3 -1
- esphome/components/tt21100/touchscreen/tt21100.cpp +1 -1
- esphome/components/tuya/climate/__init__.py +5 -6
- esphome/components/tuya/cover/__init__.py +6 -11
- esphome/components/tuya/select/__init__.py +15 -5
- esphome/components/tuya/select/tuya_select.cpp +6 -1
- esphome/components/tuya/select/tuya_select.h +5 -1
- esphome/components/uart/packet_transport/__init__.py +20 -0
- esphome/components/uart/packet_transport/uart_transport.cpp +88 -0
- esphome/components/uart/packet_transport/uart_transport.h +41 -0
- esphome/components/uart/switch/uart_switch.cpp +2 -1
- esphome/components/udp/__init__.py +126 -128
- esphome/components/udp/automation.h +40 -0
- esphome/components/udp/binary_sensor.py +3 -25
- esphome/components/udp/packet_transport/__init__.py +29 -0
- esphome/components/udp/packet_transport/udp_transport.cpp +36 -0
- esphome/components/udp/packet_transport/udp_transport.h +28 -0
- esphome/components/udp/sensor.py +3 -25
- esphome/components/udp/udp_component.cpp +26 -470
- esphome/components/udp/udp_component.h +21 -128
- esphome/components/update/__init__.py +31 -1
- esphome/components/uponor_smatrix/climate/__init__.py +4 -9
- esphome/components/uponor_smatrix/climate/uponor_smatrix_climate.cpp +2 -1
- esphome/components/uponor_smatrix/uponor_smatrix.cpp +2 -1
- esphome/components/uptime/text_sensor/__init__.py +47 -7
- esphome/components/uptime/text_sensor/uptime_text_sensor.cpp +12 -7
- esphome/components/uptime/text_sensor/uptime_text_sensor.h +19 -0
- esphome/components/valve/__init__.py +34 -3
- esphome/components/valve/automation.h +1 -19
- esphome/components/vl53l0x/sensor.py +11 -0
- esphome/components/vl53l0x/vl53l0x_sensor.cpp +5 -1
- esphome/components/vl53l0x/vl53l0x_sensor.h +2 -1
- esphome/components/voice_assistant/__init__.py +36 -10
- esphome/components/voice_assistant/voice_assistant.cpp +170 -144
- esphome/components/voice_assistant/voice_assistant.h +26 -25
- esphome/components/waveshare_epaper/display.py +6 -0
- esphome/components/waveshare_epaper/waveshare_epaper.cpp +439 -37
- esphome/components/waveshare_epaper/waveshare_epaper.h +60 -11
- esphome/components/weikai/weikai.cpp +0 -52
- esphome/components/whirlpool/climate.py +3 -5
- esphome/components/whynter/climate.py +3 -5
- esphome/components/xpt2046/touchscreen/xpt2046.cpp +1 -1
- esphome/components/yashima/climate.py +6 -6
- esphome/components/zhlt01/climate.py +2 -7
- esphome/config.py +13 -13
- esphome/config_validation.py +38 -58
- esphome/const.py +15 -1
- esphome/core/__init__.py +2 -0
- esphome/core/application.cpp +27 -10
- esphome/core/application.h +9 -1
- esphome/core/automation.h +4 -3
- esphome/core/component.cpp +28 -7
- esphome/core/component.h +10 -1
- esphome/core/defines.h +23 -17
- esphome/core/doxygen.h +13 -0
- esphome/core/macros.h +4 -0
- esphome/core/scheduler.cpp +7 -1
- esphome/cpp_generator.py +6 -2
- esphome/dashboard/web_server.py +3 -3
- esphome/helpers.py +39 -0
- esphome/loader.py +4 -0
- esphome/log.py +15 -19
- esphome/mqtt.py +23 -10
- esphome/platformio_api.py +1 -1
- esphome/schema_extractors.py +0 -1
- esphome/voluptuous_schema.py +3 -1
- esphome/vscode.py +15 -0
- esphome/wizard.py +47 -37
- esphome/zeroconf.py +7 -3
- {esphome-2025.4.1.dist-info → esphome-2025.5.0.dist-info}/METADATA +10 -11
- {esphome-2025.4.1.dist-info → esphome-2025.5.0.dist-info}/RECORD +456 -396
- {esphome-2025.4.1.dist-info → esphome-2025.5.0.dist-info}/WHEEL +1 -1
- esphome/components/esp32_ble/const_esp32c6.h +0 -74
- {esphome-2025.4.1.dist-info → esphome-2025.5.0.dist-info}/entry_points.txt +0 -0
- {esphome-2025.4.1.dist-info → esphome-2025.5.0.dist-info}/licenses/LICENSE +0 -0
- {esphome-2025.4.1.dist-info → esphome-2025.5.0.dist-info}/top_level.txt +0 -0
@@ -1,13 +1,8 @@
|
|
1
1
|
#pragma once
|
2
2
|
|
3
|
-
#include "esphome/core/
|
3
|
+
#include "esphome/core/defines.h"
|
4
|
+
#ifdef USE_NETWORK
|
4
5
|
#include "esphome/components/network/ip_address.h"
|
5
|
-
#ifdef USE_SENSOR
|
6
|
-
#include "esphome/components/sensor/sensor.h"
|
7
|
-
#endif
|
8
|
-
#ifdef USE_BINARY_SENSOR
|
9
|
-
#include "esphome/components/binary_sensor/binary_sensor.h"
|
10
|
-
#endif
|
11
6
|
#if defined(USE_SOCKET_IMPL_BSD_SOCKETS) || defined(USE_SOCKET_IMPL_LWIP_SOCKETS)
|
12
7
|
#include "esphome/components/socket/socket.h"
|
13
8
|
#endif
|
@@ -15,116 +10,35 @@
|
|
15
10
|
#include <WiFiUdp.h>
|
16
11
|
#endif
|
17
12
|
#include <vector>
|
18
|
-
#include <map>
|
19
13
|
|
20
14
|
namespace esphome {
|
21
15
|
namespace udp {
|
22
16
|
|
23
|
-
|
24
|
-
|
25
|
-
const char *name;
|
26
|
-
uint32_t last_code[2];
|
27
|
-
};
|
28
|
-
|
29
|
-
#ifdef USE_SENSOR
|
30
|
-
struct Sensor {
|
31
|
-
sensor::Sensor *sensor;
|
32
|
-
const char *id;
|
33
|
-
bool updated;
|
34
|
-
};
|
35
|
-
#endif
|
36
|
-
#ifdef USE_BINARY_SENSOR
|
37
|
-
struct BinarySensor {
|
38
|
-
binary_sensor::BinarySensor *sensor;
|
39
|
-
const char *id;
|
40
|
-
bool updated;
|
41
|
-
};
|
42
|
-
#endif
|
43
|
-
|
44
|
-
class UDPComponent : public PollingComponent {
|
17
|
+
static const size_t MAX_PACKET_SIZE = 508;
|
18
|
+
class UDPComponent : public Component {
|
45
19
|
public:
|
46
|
-
void setup() override;
|
47
|
-
void loop() override;
|
48
|
-
void update() override;
|
49
|
-
void dump_config() override;
|
50
|
-
|
51
|
-
#ifdef USE_SENSOR
|
52
|
-
void add_sensor(const char *id, sensor::Sensor *sensor) {
|
53
|
-
Sensor st{sensor, id, true};
|
54
|
-
this->sensors_.push_back(st);
|
55
|
-
}
|
56
|
-
void add_remote_sensor(const char *hostname, const char *remote_id, sensor::Sensor *sensor) {
|
57
|
-
this->add_provider(hostname);
|
58
|
-
this->remote_sensors_[hostname][remote_id] = sensor;
|
59
|
-
}
|
60
|
-
#endif
|
61
|
-
#ifdef USE_BINARY_SENSOR
|
62
|
-
void add_binary_sensor(const char *id, binary_sensor::BinarySensor *sensor) {
|
63
|
-
BinarySensor st{sensor, id, true};
|
64
|
-
this->binary_sensors_.push_back(st);
|
65
|
-
}
|
66
|
-
|
67
|
-
void add_remote_binary_sensor(const char *hostname, const char *remote_id, binary_sensor::BinarySensor *sensor) {
|
68
|
-
this->add_provider(hostname);
|
69
|
-
this->remote_binary_sensors_[hostname][remote_id] = sensor;
|
70
|
-
}
|
71
|
-
#endif
|
72
20
|
void add_address(const char *addr) { this->addresses_.emplace_back(addr); }
|
73
|
-
#ifdef USE_NETWORK
|
74
21
|
void set_listen_address(const char *listen_addr) { this->listen_address_ = network::IPAddress(listen_addr); }
|
75
|
-
|
76
|
-
void
|
77
|
-
|
78
|
-
|
79
|
-
void
|
80
|
-
|
81
|
-
Provider provider;
|
82
|
-
provider.encryption_key = std::vector<uint8_t>{};
|
83
|
-
provider.last_code[0] = 0;
|
84
|
-
provider.last_code[1] = 0;
|
85
|
-
provider.name = hostname;
|
86
|
-
this->providers_[hostname] = provider;
|
87
|
-
#ifdef USE_SENSOR
|
88
|
-
this->remote_sensors_[hostname] = std::map<std::string, sensor::Sensor *>();
|
89
|
-
#endif
|
90
|
-
#ifdef USE_BINARY_SENSOR
|
91
|
-
this->remote_binary_sensors_[hostname] = std::map<std::string, binary_sensor::BinarySensor *>();
|
92
|
-
#endif
|
93
|
-
}
|
94
|
-
}
|
95
|
-
|
96
|
-
void set_encryption_key(std::vector<uint8_t> key) { this->encryption_key_ = std::move(key); }
|
97
|
-
void set_rolling_code_enable(bool enable) { this->rolling_code_enable_ = enable; }
|
98
|
-
void set_ping_pong_enable(bool enable) { this->ping_pong_enable_ = enable; }
|
99
|
-
void set_ping_pong_recycle_time(uint32_t recycle_time) { this->ping_pong_recyle_time_ = recycle_time; }
|
100
|
-
void set_provider_encryption(const char *name, std::vector<uint8_t> key) {
|
101
|
-
this->providers_[name].encryption_key = std::move(key);
|
22
|
+
void set_listen_port(uint16_t port) { this->listen_port_ = port; }
|
23
|
+
void set_broadcast_port(uint16_t port) { this->broadcast_port_ = port; }
|
24
|
+
void set_should_broadcast() { this->should_broadcast_ = true; }
|
25
|
+
void set_should_listen() { this->should_listen_ = true; }
|
26
|
+
void add_listener(std::function<void(std::vector<uint8_t> &)> &&listener) {
|
27
|
+
this->packet_listeners_.add(std::move(listener));
|
102
28
|
}
|
29
|
+
void setup() override;
|
30
|
+
void loop() override;
|
31
|
+
void dump_config() override;
|
32
|
+
void send_packet(const uint8_t *data, size_t size);
|
33
|
+
void send_packet(const std::vector<uint8_t> &buf) { this->send_packet(buf.data(), buf.size()); }
|
34
|
+
float get_setup_priority() const override { return setup_priority::AFTER_WIFI; };
|
103
35
|
|
104
36
|
protected:
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
void add_data_(uint8_t key, const char *id, float data);
|
109
|
-
void add_data_(uint8_t key, const char *id, uint32_t data);
|
110
|
-
void increment_code_();
|
111
|
-
void add_binary_data_(uint8_t key, const char *id, bool data);
|
112
|
-
void init_data_();
|
113
|
-
|
114
|
-
bool updated_{};
|
115
|
-
uint16_t port_{18511};
|
116
|
-
uint32_t ping_key_{};
|
117
|
-
uint32_t rolling_code_[2]{};
|
118
|
-
bool rolling_code_enable_{};
|
119
|
-
bool ping_pong_enable_{};
|
120
|
-
uint32_t ping_pong_recyle_time_{};
|
121
|
-
uint32_t last_key_time_{};
|
122
|
-
bool resend_ping_key_{};
|
123
|
-
bool resend_data_{};
|
124
|
-
bool should_send_{};
|
125
|
-
const char *name_{};
|
37
|
+
uint16_t listen_port_{};
|
38
|
+
uint16_t broadcast_port_{};
|
39
|
+
bool should_broadcast_{};
|
126
40
|
bool should_listen_{};
|
127
|
-
|
41
|
+
CallbackManager<void(std::vector<uint8_t> &)> packet_listeners_{};
|
128
42
|
|
129
43
|
#if defined(USE_SOCKET_IMPL_BSD_SOCKETS) || defined(USE_SOCKET_IMPL_LWIP_SOCKETS)
|
130
44
|
std::unique_ptr<socket::Socket> broadcast_socket_ = nullptr;
|
@@ -135,32 +49,11 @@ class UDPComponent : public PollingComponent {
|
|
135
49
|
std::vector<IPAddress> ipaddrs_{};
|
136
50
|
WiFiUDP udp_client_{};
|
137
51
|
#endif
|
138
|
-
std::vector<uint8_t> encryption_key_{};
|
139
52
|
std::vector<std::string> addresses_{};
|
140
53
|
|
141
|
-
#ifdef USE_SENSOR
|
142
|
-
std::vector<Sensor> sensors_{};
|
143
|
-
std::map<std::string, std::map<std::string, sensor::Sensor *>> remote_sensors_{};
|
144
|
-
#endif
|
145
|
-
#ifdef USE_BINARY_SENSOR
|
146
|
-
std::vector<BinarySensor> binary_sensors_{};
|
147
|
-
std::map<std::string, std::map<std::string, binary_sensor::BinarySensor *>> remote_binary_sensors_{};
|
148
|
-
#endif
|
149
|
-
#ifdef USE_NETWORK
|
150
54
|
optional<network::IPAddress> listen_address_{};
|
151
|
-
#endif
|
152
|
-
std::map<std::string, Provider> providers_{};
|
153
|
-
std::vector<uint8_t> ping_header_{};
|
154
|
-
std::vector<uint8_t> header_{};
|
155
|
-
std::vector<uint8_t> data_{};
|
156
|
-
std::map<const char *, uint32_t> ping_keys_{};
|
157
|
-
void add_key_(const char *name, uint32_t key);
|
158
|
-
void send_ping_pong_request_();
|
159
|
-
void send_packet_(void *data, size_t len);
|
160
|
-
void process_ping_request_(const char *name, uint8_t *ptr, size_t len);
|
161
|
-
|
162
|
-
inline bool is_encrypted_() { return !this->encryption_key_.empty(); }
|
163
55
|
};
|
164
56
|
|
165
57
|
} // namespace udp
|
166
58
|
} // namespace esphome
|
59
|
+
#endif
|
@@ -6,6 +6,7 @@ from esphome.const import (
|
|
6
6
|
CONF_DEVICE_CLASS,
|
7
7
|
CONF_ENTITY_CATEGORY,
|
8
8
|
CONF_FORCE_UPDATE,
|
9
|
+
CONF_ICON,
|
9
10
|
CONF_ID,
|
10
11
|
CONF_MQTT_ID,
|
11
12
|
CONF_WEB_SERVER,
|
@@ -14,6 +15,7 @@ from esphome.const import (
|
|
14
15
|
ENTITY_CATEGORY_CONFIG,
|
15
16
|
)
|
16
17
|
from esphome.core import CORE, coroutine_with_priority
|
18
|
+
from esphome.cpp_generator import MockObjClass
|
17
19
|
from esphome.cpp_helpers import setup_entity
|
18
20
|
|
19
21
|
CODEOWNERS = ["@jesserockz"]
|
@@ -38,7 +40,7 @@ DEVICE_CLASSES = [
|
|
38
40
|
|
39
41
|
CONF_ON_UPDATE_AVAILABLE = "on_update_available"
|
40
42
|
|
41
|
-
|
43
|
+
_UPDATE_SCHEMA = (
|
42
44
|
cv.ENTITY_BASE_SCHEMA.extend(web_server.WEBSERVER_SORTING_SCHEMA)
|
43
45
|
.extend(cv.MQTT_COMMAND_COMPONENT_SCHEMA)
|
44
46
|
.extend(
|
@@ -56,6 +58,34 @@ UPDATE_SCHEMA = (
|
|
56
58
|
)
|
57
59
|
|
58
60
|
|
61
|
+
def update_schema(
|
62
|
+
class_: MockObjClass = cv.UNDEFINED,
|
63
|
+
*,
|
64
|
+
icon: str = cv.UNDEFINED,
|
65
|
+
device_class: str = cv.UNDEFINED,
|
66
|
+
entity_category: str = cv.UNDEFINED,
|
67
|
+
) -> cv.Schema:
|
68
|
+
schema = {}
|
69
|
+
|
70
|
+
if class_ is not cv.UNDEFINED:
|
71
|
+
schema[cv.GenerateID()] = cv.declare_id(class_)
|
72
|
+
|
73
|
+
for key, default, validator in [
|
74
|
+
(CONF_ICON, icon, cv.icon),
|
75
|
+
(CONF_DEVICE_CLASS, device_class, cv.one_of(*DEVICE_CLASSES, lower=True)),
|
76
|
+
(CONF_ENTITY_CATEGORY, entity_category, cv.entity_category),
|
77
|
+
]:
|
78
|
+
if default is not cv.UNDEFINED:
|
79
|
+
schema[cv.Optional(key, default=default)] = validator
|
80
|
+
|
81
|
+
return _UPDATE_SCHEMA.extend(schema)
|
82
|
+
|
83
|
+
|
84
|
+
# Remove before 2025.11.0
|
85
|
+
UPDATE_SCHEMA = update_schema()
|
86
|
+
UPDATE_SCHEMA.add_extra(cv.deprecated_schema_constant("update"))
|
87
|
+
|
88
|
+
|
59
89
|
async def setup_update_core_(var, config):
|
60
90
|
await setup_entity(var, config)
|
61
91
|
|
@@ -1,7 +1,5 @@
|
|
1
1
|
import esphome.codegen as cg
|
2
2
|
from esphome.components import climate
|
3
|
-
import esphome.config_validation as cv
|
4
|
-
from esphome.const import CONF_ID
|
5
3
|
|
6
4
|
from .. import (
|
7
5
|
UPONOR_SMATRIX_DEVICE_SCHEMA,
|
@@ -19,15 +17,12 @@ UponorSmatrixClimate = uponor_smatrix_ns.class_(
|
|
19
17
|
UponorSmatrixDevice,
|
20
18
|
)
|
21
19
|
|
22
|
-
CONFIG_SCHEMA = climate.
|
23
|
-
|
24
|
-
|
25
|
-
}
|
26
|
-
).extend(UPONOR_SMATRIX_DEVICE_SCHEMA)
|
20
|
+
CONFIG_SCHEMA = climate.climate_schema(UponorSmatrixClimate).extend(
|
21
|
+
UPONOR_SMATRIX_DEVICE_SCHEMA
|
22
|
+
)
|
27
23
|
|
28
24
|
|
29
25
|
async def to_code(config):
|
30
|
-
var =
|
26
|
+
var = await climate.new_climate(config)
|
31
27
|
await cg.register_component(var, config)
|
32
|
-
await climate.register_climate(var, config)
|
33
28
|
await register_uponor_smatrix_device(var, config)
|
@@ -1,6 +1,7 @@
|
|
1
1
|
#include "uponor_smatrix_climate.h"
|
2
2
|
#include "esphome/core/helpers.h"
|
3
3
|
#include "esphome/core/log.h"
|
4
|
+
#include "esphome/core/application.h"
|
4
5
|
|
5
6
|
namespace esphome {
|
6
7
|
namespace uponor_smatrix {
|
@@ -13,7 +14,7 @@ void UponorSmatrixClimate::dump_config() {
|
|
13
14
|
}
|
14
15
|
|
15
16
|
void UponorSmatrixClimate::loop() {
|
16
|
-
const uint32_t now =
|
17
|
+
const uint32_t now = App.get_loop_component_start_time();
|
17
18
|
|
18
19
|
// Publish state after all update packets are processed
|
19
20
|
if (this->last_data_ != 0 && (now - this->last_data_ > 100) && this->target_temperature_raw_ != 0) {
|
@@ -1,5 +1,6 @@
|
|
1
1
|
#include "uponor_smatrix.h"
|
2
2
|
#include "esphome/core/log.h"
|
3
|
+
#include "esphome/core/application.h"
|
3
4
|
|
4
5
|
namespace esphome {
|
5
6
|
namespace uponor_smatrix {
|
@@ -35,7 +36,7 @@ void UponorSmatrixComponent::dump_config() {
|
|
35
36
|
}
|
36
37
|
|
37
38
|
void UponorSmatrixComponent::loop() {
|
38
|
-
const uint32_t now =
|
39
|
+
const uint32_t now = App.get_loop_component_start_time();
|
39
40
|
|
40
41
|
// Discard stale data
|
41
42
|
if (!this->rx_buffer_.empty() && (now - this->last_rx_ > 50)) {
|
@@ -1,19 +1,59 @@
|
|
1
1
|
import esphome.codegen as cg
|
2
2
|
from esphome.components import text_sensor
|
3
3
|
import esphome.config_validation as cv
|
4
|
-
from esphome.const import
|
4
|
+
from esphome.const import (
|
5
|
+
CONF_FORMAT,
|
6
|
+
CONF_HOURS,
|
7
|
+
CONF_ID,
|
8
|
+
CONF_MINUTES,
|
9
|
+
CONF_SECONDS,
|
10
|
+
ENTITY_CATEGORY_DIAGNOSTIC,
|
11
|
+
ICON_TIMER,
|
12
|
+
)
|
5
13
|
|
6
14
|
uptime_ns = cg.esphome_ns.namespace("uptime")
|
7
15
|
UptimeTextSensor = uptime_ns.class_(
|
8
16
|
"UptimeTextSensor", text_sensor.TextSensor, cg.PollingComponent
|
9
17
|
)
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
18
|
+
|
19
|
+
CONF_SEPARATOR = "separator"
|
20
|
+
CONF_DAYS = "days"
|
21
|
+
CONF_EXPAND = "expand"
|
22
|
+
|
23
|
+
CONFIG_SCHEMA = (
|
24
|
+
text_sensor.text_sensor_schema(
|
25
|
+
UptimeTextSensor,
|
26
|
+
icon=ICON_TIMER,
|
27
|
+
entity_category=ENTITY_CATEGORY_DIAGNOSTIC,
|
28
|
+
)
|
29
|
+
.extend(
|
30
|
+
{
|
31
|
+
cv.Optional(CONF_FORMAT, default={}): cv.Schema(
|
32
|
+
{
|
33
|
+
cv.Optional(CONF_DAYS, default="d"): cv.string_strict,
|
34
|
+
cv.Optional(CONF_HOURS, default="h"): cv.string_strict,
|
35
|
+
cv.Optional(CONF_MINUTES, default="m"): cv.string_strict,
|
36
|
+
cv.Optional(CONF_SECONDS, default="s"): cv.string_strict,
|
37
|
+
cv.Optional(CONF_SEPARATOR, default=""): cv.string_strict,
|
38
|
+
cv.Optional(CONF_EXPAND, default=False): cv.boolean,
|
39
|
+
}
|
40
|
+
)
|
41
|
+
}
|
42
|
+
)
|
43
|
+
.extend(cv.polling_component_schema("30s"))
|
44
|
+
)
|
15
45
|
|
16
46
|
|
17
47
|
async def to_code(config):
|
18
|
-
|
48
|
+
format = config[CONF_FORMAT]
|
49
|
+
var = cg.new_Pvariable(
|
50
|
+
config[CONF_ID],
|
51
|
+
format[CONF_DAYS],
|
52
|
+
format[CONF_HOURS],
|
53
|
+
format[CONF_MINUTES],
|
54
|
+
format[CONF_SECONDS],
|
55
|
+
format[CONF_SEPARATOR],
|
56
|
+
format[CONF_EXPAND],
|
57
|
+
)
|
58
|
+
await text_sensor.register_text_sensor(var, config)
|
19
59
|
await cg.register_component(var, config)
|
@@ -16,6 +16,11 @@ void UptimeTextSensor::setup() {
|
|
16
16
|
this->update();
|
17
17
|
}
|
18
18
|
|
19
|
+
void UptimeTextSensor::insert_buffer_(std::string &buffer, const char *key, unsigned value) const {
|
20
|
+
buffer.insert(0, this->separator_);
|
21
|
+
buffer.insert(0, str_sprintf("%u%s", value, key));
|
22
|
+
}
|
23
|
+
|
19
24
|
void UptimeTextSensor::update() {
|
20
25
|
auto now = millis();
|
21
26
|
// get whole seconds since last update. Note that even if the millis count has overflowed between updates,
|
@@ -32,25 +37,25 @@ void UptimeTextSensor::update() {
|
|
32
37
|
unsigned remainder = uptime % 60;
|
33
38
|
uptime /= 60;
|
34
39
|
if (interval < 30) {
|
35
|
-
buffer
|
36
|
-
if (uptime == 0)
|
40
|
+
this->insert_buffer_(buffer, this->seconds_text_, remainder);
|
41
|
+
if (!this->expand_ && uptime == 0)
|
37
42
|
break;
|
38
43
|
}
|
39
44
|
remainder = uptime % 60;
|
40
45
|
uptime /= 60;
|
41
46
|
if (interval < 1800) {
|
42
|
-
buffer
|
43
|
-
if (uptime == 0)
|
47
|
+
this->insert_buffer_(buffer, this->minutes_text_, remainder);
|
48
|
+
if (!this->expand_ && uptime == 0)
|
44
49
|
break;
|
45
50
|
}
|
46
51
|
remainder = uptime % 24;
|
47
52
|
uptime /= 24;
|
48
53
|
if (interval < 12 * 3600) {
|
49
|
-
buffer
|
50
|
-
if (uptime == 0)
|
54
|
+
this->insert_buffer_(buffer, this->hours_text_, remainder);
|
55
|
+
if (!this->expand_ && uptime == 0)
|
51
56
|
break;
|
52
57
|
}
|
53
|
-
buffer
|
58
|
+
this->insert_buffer_(buffer, this->days_text_, (unsigned) uptime);
|
54
59
|
break;
|
55
60
|
}
|
56
61
|
this->publish_state(buffer);
|
@@ -10,13 +10,32 @@ namespace uptime {
|
|
10
10
|
|
11
11
|
class UptimeTextSensor : public text_sensor::TextSensor, public PollingComponent {
|
12
12
|
public:
|
13
|
+
UptimeTextSensor(const char *days_text, const char *hours_text, const char *minutes_text, const char *seconds_text,
|
14
|
+
const char *separator, bool expand)
|
15
|
+
: days_text_(days_text),
|
16
|
+
hours_text_(hours_text),
|
17
|
+
minutes_text_(minutes_text),
|
18
|
+
seconds_text_(seconds_text),
|
19
|
+
separator_(separator),
|
20
|
+
expand_(expand) {}
|
13
21
|
void update() override;
|
14
22
|
void dump_config() override;
|
15
23
|
void setup() override;
|
16
24
|
|
17
25
|
float get_setup_priority() const override;
|
26
|
+
void set_days(const char *days_text) { this->days_text_ = days_text; }
|
27
|
+
void set_hours(const char *hours_text) { this->hours_text_ = hours_text; }
|
28
|
+
void set_minutes(const char *minutes_text) { this->minutes_text_ = minutes_text; }
|
29
|
+
void set_seconds(const char *seconds_text) { this->seconds_text_ = seconds_text; }
|
18
30
|
|
19
31
|
protected:
|
32
|
+
void insert_buffer_(std::string &buffer, const char *key, unsigned value) const;
|
33
|
+
const char *days_text_;
|
34
|
+
const char *hours_text_;
|
35
|
+
const char *minutes_text_;
|
36
|
+
const char *seconds_text_;
|
37
|
+
const char *separator_;
|
38
|
+
bool expand_{};
|
20
39
|
uint32_t uptime_{0}; // uptime in seconds, will overflow after 136 years
|
21
40
|
uint32_t last_ms_{0};
|
22
41
|
};
|
@@ -5,6 +5,8 @@ from esphome.components import mqtt, web_server
|
|
5
5
|
import esphome.config_validation as cv
|
6
6
|
from esphome.const import (
|
7
7
|
CONF_DEVICE_CLASS,
|
8
|
+
CONF_ENTITY_CATEGORY,
|
9
|
+
CONF_ICON,
|
8
10
|
CONF_ID,
|
9
11
|
CONF_MQTT_ID,
|
10
12
|
CONF_ON_OPEN,
|
@@ -20,6 +22,7 @@ from esphome.const import (
|
|
20
22
|
DEVICE_CLASS_WATER,
|
21
23
|
)
|
22
24
|
from esphome.core import CORE, coroutine_with_priority
|
25
|
+
from esphome.cpp_generator import MockObjClass
|
23
26
|
from esphome.cpp_helpers import setup_entity
|
24
27
|
|
25
28
|
IS_PLATFORM_COMPONENT = True
|
@@ -71,7 +74,7 @@ ValveClosedTrigger = valve_ns.class_(
|
|
71
74
|
|
72
75
|
CONF_ON_CLOSED = "on_closed"
|
73
76
|
|
74
|
-
|
77
|
+
_VALVE_SCHEMA = (
|
75
78
|
cv.ENTITY_BASE_SCHEMA.extend(web_server.WEBSERVER_SORTING_SCHEMA)
|
76
79
|
.extend(cv.MQTT_COMMAND_COMPONENT_SCHEMA)
|
77
80
|
.extend(
|
@@ -100,7 +103,35 @@ VALVE_SCHEMA = (
|
|
100
103
|
)
|
101
104
|
|
102
105
|
|
103
|
-
|
106
|
+
def valve_schema(
|
107
|
+
class_: MockObjClass = cv.UNDEFINED,
|
108
|
+
*,
|
109
|
+
device_class: str = cv.UNDEFINED,
|
110
|
+
entity_category: str = cv.UNDEFINED,
|
111
|
+
icon: str = cv.UNDEFINED,
|
112
|
+
) -> cv.Schema:
|
113
|
+
schema = {}
|
114
|
+
|
115
|
+
if class_ is not cv.UNDEFINED:
|
116
|
+
schema[cv.GenerateID()] = cv.declare_id(class_)
|
117
|
+
|
118
|
+
for key, default, validator in [
|
119
|
+
(CONF_DEVICE_CLASS, device_class, cv.one_of(*DEVICE_CLASSES, lower=True)),
|
120
|
+
(CONF_ENTITY_CATEGORY, entity_category, cv.entity_category),
|
121
|
+
(CONF_ICON, icon, cv.icon),
|
122
|
+
]:
|
123
|
+
if default is not cv.UNDEFINED:
|
124
|
+
schema[cv.Optional(key, default=default)] = validator
|
125
|
+
|
126
|
+
return _VALVE_SCHEMA.extend(schema)
|
127
|
+
|
128
|
+
|
129
|
+
# Remove before 2025.11.0
|
130
|
+
VALVE_SCHEMA = valve_schema()
|
131
|
+
VALVE_SCHEMA.add_extra(cv.deprecated_schema_constant("valve"))
|
132
|
+
|
133
|
+
|
134
|
+
async def _setup_valve_core(var, config):
|
104
135
|
await setup_entity(var, config)
|
105
136
|
|
106
137
|
if device_class_config := config.get(CONF_DEVICE_CLASS):
|
@@ -132,7 +163,7 @@ async def register_valve(var, config):
|
|
132
163
|
if not CORE.has_id(config[CONF_ID]):
|
133
164
|
var = cg.Pvariable(config[CONF_ID], var)
|
134
165
|
cg.add(cg.App.register_valve(var))
|
135
|
-
await
|
166
|
+
await _setup_valve_core(var, config)
|
136
167
|
|
137
168
|
|
138
169
|
async def new_valve(config, *args):
|
@@ -1,7 +1,7 @@
|
|
1
1
|
#pragma once
|
2
2
|
|
3
|
-
#include "esphome/core/component.h"
|
4
3
|
#include "esphome/core/automation.h"
|
4
|
+
#include "esphome/core/component.h"
|
5
5
|
#include "valve.h"
|
6
6
|
|
7
7
|
namespace esphome {
|
@@ -67,24 +67,6 @@ template<typename... Ts> class ControlAction : public Action<Ts...> {
|
|
67
67
|
Valve *valve_;
|
68
68
|
};
|
69
69
|
|
70
|
-
template<typename... Ts> class ValvePublishAction : public Action<Ts...> {
|
71
|
-
public:
|
72
|
-
ValvePublishAction(Valve *valve) : valve_(valve) {}
|
73
|
-
TEMPLATABLE_VALUE(float, position)
|
74
|
-
TEMPLATABLE_VALUE(ValveOperation, current_operation)
|
75
|
-
|
76
|
-
void play(Ts... x) override {
|
77
|
-
if (this->position_.has_value())
|
78
|
-
this->valve_->position = this->position_.value(x...);
|
79
|
-
if (this->current_operation_.has_value())
|
80
|
-
this->valve_->current_operation = this->current_operation_.value(x...);
|
81
|
-
this->valve_->publish_state();
|
82
|
-
}
|
83
|
-
|
84
|
-
protected:
|
85
|
-
Valve *valve_;
|
86
|
-
};
|
87
|
-
|
88
70
|
template<typename... Ts> class ValveIsOpenCondition : public Condition<Ts...> {
|
89
71
|
public:
|
90
72
|
ValveIsOpenCondition(Valve *valve) : valve_(valve) {}
|
@@ -20,6 +20,7 @@ VL53L0XSensor = vl53l0x_ns.class_(
|
|
20
20
|
|
21
21
|
CONF_SIGNAL_RATE_LIMIT = "signal_rate_limit"
|
22
22
|
CONF_LONG_RANGE = "long_range"
|
23
|
+
CONF_TIMING_BUDGET = "timing_budget"
|
23
24
|
|
24
25
|
|
25
26
|
def check_keys(obj):
|
@@ -54,6 +55,13 @@ CONFIG_SCHEMA = cv.All(
|
|
54
55
|
cv.Optional(CONF_LONG_RANGE, default=False): cv.boolean,
|
55
56
|
cv.Optional(CONF_TIMEOUT, default="10ms"): check_timeout,
|
56
57
|
cv.Optional(CONF_ENABLE_PIN): pins.gpio_output_pin_schema,
|
58
|
+
cv.Optional(CONF_TIMING_BUDGET): cv.All(
|
59
|
+
cv.positive_time_period_microseconds,
|
60
|
+
cv.Range(
|
61
|
+
min=cv.TimePeriod(microseconds=20000),
|
62
|
+
max=cv.TimePeriod(microseconds=4294967295),
|
63
|
+
),
|
64
|
+
),
|
57
65
|
}
|
58
66
|
)
|
59
67
|
.extend(cv.polling_component_schema("60s"))
|
@@ -73,4 +81,7 @@ async def to_code(config):
|
|
73
81
|
enable = await cg.gpio_pin_expression(config[CONF_ENABLE_PIN])
|
74
82
|
cg.add(var.set_enable_pin(enable))
|
75
83
|
|
84
|
+
if timing_budget := config.get(CONF_TIMING_BUDGET):
|
85
|
+
cg.add(var.set_timing_budget(timing_budget))
|
86
|
+
|
76
87
|
await i2c.register_i2c_device(var, config)
|
@@ -28,6 +28,7 @@ void VL53L0XSensor::dump_config() {
|
|
28
28
|
LOG_PIN(" Enable Pin: ", this->enable_pin_);
|
29
29
|
}
|
30
30
|
ESP_LOGCONFIG(TAG, " Timeout: %u%s", this->timeout_us_, this->timeout_us_ > 0 ? "us" : " (no timeout)");
|
31
|
+
ESP_LOGCONFIG(TAG, " Timing Budget %uus ", this->measurement_timing_budget_us_);
|
31
32
|
}
|
32
33
|
|
33
34
|
void VL53L0XSensor::setup() {
|
@@ -230,7 +231,10 @@ void VL53L0XSensor::setup() {
|
|
230
231
|
reg(0x84) &= ~0x10;
|
231
232
|
reg(0x0B) = 0x01;
|
232
233
|
|
233
|
-
measurement_timing_budget_us_
|
234
|
+
if (this->measurement_timing_budget_us_ == 0) {
|
235
|
+
this->measurement_timing_budget_us_ = this->get_measurement_timing_budget_();
|
236
|
+
}
|
237
|
+
|
234
238
|
reg(0x01) = 0xE8;
|
235
239
|
set_measurement_timing_budget_(measurement_timing_budget_us_);
|
236
240
|
reg(0x01) = 0x01;
|
@@ -39,6 +39,7 @@ class VL53L0XSensor : public sensor::Sensor, public PollingComponent, public i2c
|
|
39
39
|
void set_long_range(bool long_range) { long_range_ = long_range; }
|
40
40
|
void set_timeout_us(uint32_t timeout_us) { this->timeout_us_ = timeout_us; }
|
41
41
|
void set_enable_pin(GPIOPin *enable) { this->enable_pin_ = enable; }
|
42
|
+
void set_timing_budget(uint32_t timing_budget) { this->measurement_timing_budget_us_ = timing_budget; }
|
42
43
|
|
43
44
|
protected:
|
44
45
|
uint32_t get_measurement_timing_budget_();
|
@@ -59,7 +60,7 @@ class VL53L0XSensor : public sensor::Sensor, public PollingComponent, public i2c
|
|
59
60
|
float signal_rate_limit_;
|
60
61
|
bool long_range_;
|
61
62
|
GPIOPin *enable_pin_{nullptr};
|
62
|
-
uint32_t measurement_timing_budget_us_;
|
63
|
+
uint32_t measurement_timing_budget_us_{0};
|
63
64
|
bool initiated_read_{false};
|
64
65
|
bool waiting_for_interrupt_{false};
|
65
66
|
uint8_t stop_variable_;
|