esphome 2025.4.2__py3-none-any.whl → 2025.5.0b3__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 +81 -13
- esphome/components/api/api_connection.h +13 -1
- 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/as7341/as7341.h +1 -1
- 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 +6 -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/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 -0
- 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/esp32_camera.cpp +2 -1
- 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/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/lvgl_esphome.cpp +5 -1
- esphome/components/lvgl/text/__init__.py +1 -2
- 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 +33 -1
- 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/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/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 +23 -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/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.2.dist-info → esphome-2025.5.0b3.dist-info}/METADATA +10 -11
- {esphome-2025.4.2.dist-info → esphome-2025.5.0b3.dist-info}/RECORD +440 -380
- {esphome-2025.4.2.dist-info → esphome-2025.5.0b3.dist-info}/WHEEL +1 -1
- {esphome-2025.4.2.dist-info → esphome-2025.5.0b3.dist-info}/entry_points.txt +0 -0
- {esphome-2025.4.2.dist-info → esphome-2025.5.0b3.dist-info}/licenses/LICENSE +0 -0
- {esphome-2025.4.2.dist-info → esphome-2025.5.0b3.dist-info}/top_level.txt +0 -0
@@ -40,24 +40,24 @@ namespace climate {
|
|
40
40
|
*/
|
41
41
|
class ClimateTraits {
|
42
42
|
public:
|
43
|
-
bool get_supports_current_temperature() const { return supports_current_temperature_; }
|
43
|
+
bool get_supports_current_temperature() const { return this->supports_current_temperature_; }
|
44
44
|
void set_supports_current_temperature(bool supports_current_temperature) {
|
45
|
-
supports_current_temperature_ = supports_current_temperature;
|
45
|
+
this->supports_current_temperature_ = supports_current_temperature;
|
46
46
|
}
|
47
|
-
bool get_supports_current_humidity() const { return supports_current_humidity_; }
|
47
|
+
bool get_supports_current_humidity() const { return this->supports_current_humidity_; }
|
48
48
|
void set_supports_current_humidity(bool supports_current_humidity) {
|
49
|
-
supports_current_humidity_ = supports_current_humidity;
|
49
|
+
this->supports_current_humidity_ = supports_current_humidity;
|
50
50
|
}
|
51
|
-
bool get_supports_two_point_target_temperature() const { return supports_two_point_target_temperature_; }
|
51
|
+
bool get_supports_two_point_target_temperature() const { return this->supports_two_point_target_temperature_; }
|
52
52
|
void set_supports_two_point_target_temperature(bool supports_two_point_target_temperature) {
|
53
|
-
supports_two_point_target_temperature_ = supports_two_point_target_temperature;
|
53
|
+
this->supports_two_point_target_temperature_ = supports_two_point_target_temperature;
|
54
54
|
}
|
55
|
-
bool get_supports_target_humidity() const { return supports_target_humidity_; }
|
55
|
+
bool get_supports_target_humidity() const { return this->supports_target_humidity_; }
|
56
56
|
void set_supports_target_humidity(bool supports_target_humidity) {
|
57
|
-
supports_target_humidity_ = supports_target_humidity;
|
57
|
+
this->supports_target_humidity_ = supports_target_humidity;
|
58
58
|
}
|
59
|
-
void set_supported_modes(std::set<ClimateMode> modes) { supported_modes_ = std::move(modes); }
|
60
|
-
void add_supported_mode(ClimateMode mode) { supported_modes_.insert(mode); }
|
59
|
+
void set_supported_modes(std::set<ClimateMode> modes) { this->supported_modes_ = std::move(modes); }
|
60
|
+
void add_supported_mode(ClimateMode mode) { this->supported_modes_.insert(mode); }
|
61
61
|
ESPDEPRECATED("This method is deprecated, use set_supported_modes() instead", "v1.20")
|
62
62
|
void set_supports_auto_mode(bool supports_auto_mode) { set_mode_support_(CLIMATE_MODE_AUTO, supports_auto_mode); }
|
63
63
|
ESPDEPRECATED("This method is deprecated, use set_supported_modes() instead", "v1.20")
|
@@ -72,15 +72,15 @@ class ClimateTraits {
|
|
72
72
|
}
|
73
73
|
ESPDEPRECATED("This method is deprecated, use set_supported_modes() instead", "v1.20")
|
74
74
|
void set_supports_dry_mode(bool supports_dry_mode) { set_mode_support_(CLIMATE_MODE_DRY, supports_dry_mode); }
|
75
|
-
bool supports_mode(ClimateMode mode) const { return supported_modes_.count(mode); }
|
76
|
-
const std::set<ClimateMode> &get_supported_modes() const { return supported_modes_; }
|
75
|
+
bool supports_mode(ClimateMode mode) const { return this->supported_modes_.count(mode); }
|
76
|
+
const std::set<ClimateMode> &get_supported_modes() const { return this->supported_modes_; }
|
77
77
|
|
78
|
-
void set_supports_action(bool supports_action) { supports_action_ = supports_action; }
|
79
|
-
bool get_supports_action() const { return supports_action_; }
|
78
|
+
void set_supports_action(bool supports_action) { this->supports_action_ = supports_action; }
|
79
|
+
bool get_supports_action() const { return this->supports_action_; }
|
80
80
|
|
81
|
-
void set_supported_fan_modes(std::set<ClimateFanMode> modes) { supported_fan_modes_ = std::move(modes); }
|
82
|
-
void add_supported_fan_mode(ClimateFanMode mode) { supported_fan_modes_.insert(mode); }
|
83
|
-
void add_supported_custom_fan_mode(const std::string &mode) { supported_custom_fan_modes_.insert(mode); }
|
81
|
+
void set_supported_fan_modes(std::set<ClimateFanMode> modes) { this->supported_fan_modes_ = std::move(modes); }
|
82
|
+
void add_supported_fan_mode(ClimateFanMode mode) { this->supported_fan_modes_.insert(mode); }
|
83
|
+
void add_supported_custom_fan_mode(const std::string &mode) { this->supported_custom_fan_modes_.insert(mode); }
|
84
84
|
ESPDEPRECATED("This method is deprecated, use set_supported_fan_modes() instead", "v1.20")
|
85
85
|
void set_supports_fan_mode_on(bool supported) { set_fan_mode_support_(CLIMATE_FAN_ON, supported); }
|
86
86
|
ESPDEPRECATED("This method is deprecated, use set_supported_fan_modes() instead", "v1.20")
|
@@ -99,35 +99,37 @@ class ClimateTraits {
|
|
99
99
|
void set_supports_fan_mode_focus(bool supported) { set_fan_mode_support_(CLIMATE_FAN_FOCUS, supported); }
|
100
100
|
ESPDEPRECATED("This method is deprecated, use set_supported_fan_modes() instead", "v1.20")
|
101
101
|
void set_supports_fan_mode_diffuse(bool supported) { set_fan_mode_support_(CLIMATE_FAN_DIFFUSE, supported); }
|
102
|
-
bool supports_fan_mode(ClimateFanMode fan_mode) const { return supported_fan_modes_.count(fan_mode); }
|
103
|
-
bool get_supports_fan_modes() const {
|
104
|
-
|
102
|
+
bool supports_fan_mode(ClimateFanMode fan_mode) const { return this->supported_fan_modes_.count(fan_mode); }
|
103
|
+
bool get_supports_fan_modes() const {
|
104
|
+
return !this->supported_fan_modes_.empty() || !this->supported_custom_fan_modes_.empty();
|
105
|
+
}
|
106
|
+
const std::set<ClimateFanMode> &get_supported_fan_modes() const { return this->supported_fan_modes_; }
|
105
107
|
|
106
108
|
void set_supported_custom_fan_modes(std::set<std::string> supported_custom_fan_modes) {
|
107
|
-
supported_custom_fan_modes_ = std::move(supported_custom_fan_modes);
|
109
|
+
this->supported_custom_fan_modes_ = std::move(supported_custom_fan_modes);
|
108
110
|
}
|
109
|
-
const std::set<std::string> &get_supported_custom_fan_modes() const { return supported_custom_fan_modes_; }
|
111
|
+
const std::set<std::string> &get_supported_custom_fan_modes() const { return this->supported_custom_fan_modes_; }
|
110
112
|
bool supports_custom_fan_mode(const std::string &custom_fan_mode) const {
|
111
|
-
return supported_custom_fan_modes_.count(custom_fan_mode);
|
113
|
+
return this->supported_custom_fan_modes_.count(custom_fan_mode);
|
112
114
|
}
|
113
115
|
|
114
|
-
void set_supported_presets(std::set<ClimatePreset> presets) { supported_presets_ = std::move(presets); }
|
115
|
-
void add_supported_preset(ClimatePreset preset) { supported_presets_.insert(preset); }
|
116
|
-
void add_supported_custom_preset(const std::string &preset) { supported_custom_presets_.insert(preset); }
|
117
|
-
bool supports_preset(ClimatePreset preset) const { return supported_presets_.count(preset); }
|
118
|
-
bool get_supports_presets() const { return !supported_presets_.empty(); }
|
119
|
-
const std::set<climate::ClimatePreset> &get_supported_presets() const { return supported_presets_; }
|
116
|
+
void set_supported_presets(std::set<ClimatePreset> presets) { this->supported_presets_ = std::move(presets); }
|
117
|
+
void add_supported_preset(ClimatePreset preset) { this->supported_presets_.insert(preset); }
|
118
|
+
void add_supported_custom_preset(const std::string &preset) { this->supported_custom_presets_.insert(preset); }
|
119
|
+
bool supports_preset(ClimatePreset preset) const { return this->supported_presets_.count(preset); }
|
120
|
+
bool get_supports_presets() const { return !this->supported_presets_.empty(); }
|
121
|
+
const std::set<climate::ClimatePreset> &get_supported_presets() const { return this->supported_presets_; }
|
120
122
|
|
121
123
|
void set_supported_custom_presets(std::set<std::string> supported_custom_presets) {
|
122
|
-
supported_custom_presets_ = std::move(supported_custom_presets);
|
124
|
+
this->supported_custom_presets_ = std::move(supported_custom_presets);
|
123
125
|
}
|
124
|
-
const std::set<std::string> &get_supported_custom_presets() const { return supported_custom_presets_; }
|
126
|
+
const std::set<std::string> &get_supported_custom_presets() const { return this->supported_custom_presets_; }
|
125
127
|
bool supports_custom_preset(const std::string &custom_preset) const {
|
126
|
-
return supported_custom_presets_.count(custom_preset);
|
128
|
+
return this->supported_custom_presets_.count(custom_preset);
|
127
129
|
}
|
128
130
|
|
129
|
-
void set_supported_swing_modes(std::set<ClimateSwingMode> modes) { supported_swing_modes_ = std::move(modes); }
|
130
|
-
void add_supported_swing_mode(ClimateSwingMode mode) { supported_swing_modes_.insert(mode); }
|
131
|
+
void set_supported_swing_modes(std::set<ClimateSwingMode> modes) { this->supported_swing_modes_ = std::move(modes); }
|
132
|
+
void add_supported_swing_mode(ClimateSwingMode mode) { this->supported_swing_modes_.insert(mode); }
|
131
133
|
ESPDEPRECATED("This method is deprecated, use set_supported_swing_modes() instead", "v1.20")
|
132
134
|
void set_supports_swing_mode_off(bool supported) { set_swing_mode_support_(CLIMATE_SWING_OFF, supported); }
|
133
135
|
ESPDEPRECATED("This method is deprecated, use set_supported_swing_modes() instead", "v1.20")
|
@@ -138,54 +140,58 @@ class ClimateTraits {
|
|
138
140
|
void set_supports_swing_mode_horizontal(bool supported) {
|
139
141
|
set_swing_mode_support_(CLIMATE_SWING_HORIZONTAL, supported);
|
140
142
|
}
|
141
|
-
bool supports_swing_mode(ClimateSwingMode swing_mode) const { return supported_swing_modes_.count(swing_mode); }
|
142
|
-
bool get_supports_swing_modes() const { return !supported_swing_modes_.empty(); }
|
143
|
-
const std::set<ClimateSwingMode> &get_supported_swing_modes() const { return supported_swing_modes_; }
|
143
|
+
bool supports_swing_mode(ClimateSwingMode swing_mode) const { return this->supported_swing_modes_.count(swing_mode); }
|
144
|
+
bool get_supports_swing_modes() const { return !this->supported_swing_modes_.empty(); }
|
145
|
+
const std::set<ClimateSwingMode> &get_supported_swing_modes() const { return this->supported_swing_modes_; }
|
144
146
|
|
145
|
-
float get_visual_min_temperature() const { return visual_min_temperature_; }
|
146
|
-
void set_visual_min_temperature(float visual_min_temperature) {
|
147
|
-
|
148
|
-
|
149
|
-
float
|
150
|
-
float
|
147
|
+
float get_visual_min_temperature() const { return this->visual_min_temperature_; }
|
148
|
+
void set_visual_min_temperature(float visual_min_temperature) {
|
149
|
+
this->visual_min_temperature_ = visual_min_temperature;
|
150
|
+
}
|
151
|
+
float get_visual_max_temperature() const { return this->visual_max_temperature_; }
|
152
|
+
void set_visual_max_temperature(float visual_max_temperature) {
|
153
|
+
this->visual_max_temperature_ = visual_max_temperature;
|
154
|
+
}
|
155
|
+
float get_visual_target_temperature_step() const { return this->visual_target_temperature_step_; }
|
156
|
+
float get_visual_current_temperature_step() const { return this->visual_current_temperature_step_; }
|
151
157
|
void set_visual_target_temperature_step(float temperature_step) {
|
152
|
-
visual_target_temperature_step_ = temperature_step;
|
158
|
+
this->visual_target_temperature_step_ = temperature_step;
|
153
159
|
}
|
154
160
|
void set_visual_current_temperature_step(float temperature_step) {
|
155
|
-
visual_current_temperature_step_ = temperature_step;
|
161
|
+
this->visual_current_temperature_step_ = temperature_step;
|
156
162
|
}
|
157
163
|
void set_visual_temperature_step(float temperature_step) {
|
158
|
-
visual_target_temperature_step_ = temperature_step;
|
159
|
-
visual_current_temperature_step_ = temperature_step;
|
164
|
+
this->visual_target_temperature_step_ = temperature_step;
|
165
|
+
this->visual_current_temperature_step_ = temperature_step;
|
160
166
|
}
|
161
167
|
int8_t get_target_temperature_accuracy_decimals() const;
|
162
168
|
int8_t get_current_temperature_accuracy_decimals() const;
|
163
169
|
|
164
|
-
float get_visual_min_humidity() const { return visual_min_humidity_; }
|
165
|
-
void set_visual_min_humidity(float visual_min_humidity) { visual_min_humidity_ = visual_min_humidity; }
|
166
|
-
float get_visual_max_humidity() const { return visual_max_humidity_; }
|
167
|
-
void set_visual_max_humidity(float visual_max_humidity) { visual_max_humidity_ = visual_max_humidity; }
|
170
|
+
float get_visual_min_humidity() const { return this->visual_min_humidity_; }
|
171
|
+
void set_visual_min_humidity(float visual_min_humidity) { this->visual_min_humidity_ = visual_min_humidity; }
|
172
|
+
float get_visual_max_humidity() const { return this->visual_max_humidity_; }
|
173
|
+
void set_visual_max_humidity(float visual_max_humidity) { this->visual_max_humidity_ = visual_max_humidity; }
|
168
174
|
|
169
175
|
protected:
|
170
176
|
void set_mode_support_(climate::ClimateMode mode, bool supported) {
|
171
177
|
if (supported) {
|
172
|
-
supported_modes_.insert(mode);
|
178
|
+
this->supported_modes_.insert(mode);
|
173
179
|
} else {
|
174
|
-
supported_modes_.erase(mode);
|
180
|
+
this->supported_modes_.erase(mode);
|
175
181
|
}
|
176
182
|
}
|
177
183
|
void set_fan_mode_support_(climate::ClimateFanMode mode, bool supported) {
|
178
184
|
if (supported) {
|
179
|
-
supported_fan_modes_.insert(mode);
|
185
|
+
this->supported_fan_modes_.insert(mode);
|
180
186
|
} else {
|
181
|
-
supported_fan_modes_.erase(mode);
|
187
|
+
this->supported_fan_modes_.erase(mode);
|
182
188
|
}
|
183
189
|
}
|
184
190
|
void set_swing_mode_support_(climate::ClimateSwingMode mode, bool supported) {
|
185
191
|
if (supported) {
|
186
|
-
supported_swing_modes_.insert(mode);
|
192
|
+
this->supported_swing_modes_.insert(mode);
|
187
193
|
} else {
|
188
|
-
supported_swing_modes_.erase(mode);
|
194
|
+
this->supported_swing_modes_.erase(mode);
|
189
195
|
}
|
190
196
|
}
|
191
197
|
|
@@ -1,7 +1,13 @@
|
|
1
|
+
import logging
|
2
|
+
|
3
|
+
from esphome import core
|
1
4
|
import esphome.codegen as cg
|
2
5
|
from esphome.components import climate, remote_base, sensor
|
3
6
|
import esphome.config_validation as cv
|
4
|
-
from esphome.const import CONF_SENSOR, CONF_SUPPORTS_COOL, CONF_SUPPORTS_HEAT
|
7
|
+
from esphome.const import CONF_ID, CONF_SENSOR, CONF_SUPPORTS_COOL, CONF_SUPPORTS_HEAT
|
8
|
+
from esphome.cpp_generator import MockObjClass
|
9
|
+
|
10
|
+
_LOGGER = logging.getLogger(__name__)
|
5
11
|
|
6
12
|
DEPENDENCIES = ["remote_transmitter"]
|
7
13
|
AUTO_LOAD = ["sensor", "remote_base"]
|
@@ -16,30 +22,58 @@ ClimateIR = climate_ir_ns.class_(
|
|
16
22
|
remote_base.RemoteTransmittable,
|
17
23
|
)
|
18
24
|
|
19
|
-
|
20
|
-
|
25
|
+
|
26
|
+
def climate_ir_schema(
|
27
|
+
class_: MockObjClass,
|
28
|
+
) -> cv.Schema:
|
29
|
+
return (
|
30
|
+
climate.climate_schema(class_)
|
31
|
+
.extend(
|
32
|
+
{
|
33
|
+
cv.Optional(CONF_SUPPORTS_COOL, default=True): cv.boolean,
|
34
|
+
cv.Optional(CONF_SUPPORTS_HEAT, default=True): cv.boolean,
|
35
|
+
cv.Optional(CONF_SENSOR): cv.use_id(sensor.Sensor),
|
36
|
+
}
|
37
|
+
)
|
38
|
+
.extend(cv.COMPONENT_SCHEMA)
|
39
|
+
.extend(remote_base.REMOTE_TRANSMITTABLE_SCHEMA)
|
40
|
+
)
|
41
|
+
|
42
|
+
|
43
|
+
def climate_ir_with_receiver_schema(
|
44
|
+
class_: MockObjClass,
|
45
|
+
) -> cv.Schema:
|
46
|
+
return climate_ir_schema(class_).extend(
|
21
47
|
{
|
22
|
-
cv.Optional(
|
23
|
-
|
24
|
-
|
48
|
+
cv.Optional(remote_base.CONF_RECEIVER_ID): cv.use_id(
|
49
|
+
remote_base.RemoteReceiverBase
|
50
|
+
),
|
25
51
|
}
|
26
52
|
)
|
27
|
-
.extend(cv.COMPONENT_SCHEMA)
|
28
|
-
.extend(remote_base.REMOTE_TRANSMITTABLE_SCHEMA)
|
29
|
-
)
|
30
53
|
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
54
|
+
|
55
|
+
# Remove before 2025.11.0
|
56
|
+
def deprecated_schema_constant(config):
|
57
|
+
type: str = "unknown"
|
58
|
+
if (id := config.get(CONF_ID)) is not None and isinstance(id, core.ID):
|
59
|
+
type = str(id.type).split("::", maxsplit=1)[0]
|
60
|
+
_LOGGER.warning(
|
61
|
+
"Using `climate_ir.CLIMATE_IR_WITH_RECEIVER_SCHEMA` is deprecated and will be removed in ESPHome 2025.11.0. "
|
62
|
+
"Please use `climate_ir.climate_ir_with_receiver_schema(...)` instead. "
|
63
|
+
"If you are seeing this, report an issue to the external_component author and ask them to update it. "
|
64
|
+
"https://developers.esphome.io/blog/2025/05/14/_schema-deprecations/. "
|
65
|
+
"Component using this schema: %s",
|
66
|
+
type,
|
67
|
+
)
|
68
|
+
return config
|
69
|
+
|
70
|
+
|
71
|
+
CLIMATE_IR_WITH_RECEIVER_SCHEMA = climate_ir_with_receiver_schema(ClimateIR)
|
72
|
+
CLIMATE_IR_WITH_RECEIVER_SCHEMA.add_extra(deprecated_schema_constant)
|
38
73
|
|
39
74
|
|
40
75
|
async def register_climate_ir(var, config):
|
41
76
|
await cg.register_component(var, config)
|
42
|
-
await climate.register_climate(var, config)
|
43
77
|
await remote_base.register_transmittable(var, config)
|
44
78
|
cg.add(var.set_supports_cool(config[CONF_SUPPORTS_COOL]))
|
45
79
|
cg.add(var.set_supports_heat(config[CONF_SUPPORTS_HEAT]))
|
@@ -48,3 +82,9 @@ async def register_climate_ir(var, config):
|
|
48
82
|
if sensor_id := config.get(CONF_SENSOR):
|
49
83
|
sens = await cg.get_variable(sensor_id)
|
50
84
|
cg.add(var.set_sensor(sens))
|
85
|
+
|
86
|
+
|
87
|
+
async def new_climate_ir(config, *args):
|
88
|
+
var = await climate.new_climate(config, *args)
|
89
|
+
await register_climate_ir(var, config)
|
90
|
+
return var
|
@@ -1,7 +1,6 @@
|
|
1
1
|
import esphome.codegen as cg
|
2
2
|
from esphome.components import climate_ir
|
3
3
|
import esphome.config_validation as cv
|
4
|
-
from esphome.const import CONF_ID
|
5
4
|
|
6
5
|
AUTO_LOAD = ["climate_ir"]
|
7
6
|
|
@@ -14,9 +13,8 @@ CONF_BIT_HIGH = "bit_high"
|
|
14
13
|
CONF_BIT_ONE_LOW = "bit_one_low"
|
15
14
|
CONF_BIT_ZERO_LOW = "bit_zero_low"
|
16
15
|
|
17
|
-
CONFIG_SCHEMA = climate_ir.
|
16
|
+
CONFIG_SCHEMA = climate_ir.climate_ir_with_receiver_schema(LgIrClimate).extend(
|
18
17
|
{
|
19
|
-
cv.GenerateID(): cv.declare_id(LgIrClimate),
|
20
18
|
cv.Optional(
|
21
19
|
CONF_HEADER_HIGH, default="8000us"
|
22
20
|
): cv.positive_time_period_microseconds,
|
@@ -37,8 +35,7 @@ CONFIG_SCHEMA = climate_ir.CLIMATE_IR_WITH_RECEIVER_SCHEMA.extend(
|
|
37
35
|
|
38
36
|
|
39
37
|
async def to_code(config):
|
40
|
-
var =
|
41
|
-
await climate_ir.register_climate_ir(var, config)
|
38
|
+
var = await climate_ir.new_climate_ir(config)
|
42
39
|
|
43
40
|
cg.add(var.set_header_high(config[CONF_HEADER_HIGH]))
|
44
41
|
cg.add(var.set_header_low(config[CONF_HEADER_LOW]))
|
@@ -32,7 +32,7 @@ const uint32_t FAN_MAX = 0x40;
|
|
32
32
|
|
33
33
|
// Temperature
|
34
34
|
const uint8_t TEMP_RANGE = TEMP_MAX - TEMP_MIN + 1;
|
35
|
-
const uint32_t TEMP_MASK =
|
35
|
+
const uint32_t TEMP_MASK = 0xF00;
|
36
36
|
const uint32_t TEMP_SHIFT = 8;
|
37
37
|
|
38
38
|
const uint16_t BITS = 28;
|
@@ -43,11 +43,11 @@ void LgIrClimate::transmit_state() {
|
|
43
43
|
// ESP_LOGD(TAG, "climate_lg_ir mode_before_ code: 0x%02X", modeBefore_);
|
44
44
|
|
45
45
|
// Set command
|
46
|
-
if (send_swing_cmd_) {
|
47
|
-
send_swing_cmd_ = false;
|
46
|
+
if (this->send_swing_cmd_) {
|
47
|
+
this->send_swing_cmd_ = false;
|
48
48
|
remote_state |= COMMAND_SWING;
|
49
49
|
} else {
|
50
|
-
bool climate_is_off = (mode_before_ == climate::CLIMATE_MODE_OFF);
|
50
|
+
bool climate_is_off = (this->mode_before_ == climate::CLIMATE_MODE_OFF);
|
51
51
|
switch (this->mode) {
|
52
52
|
case climate::CLIMATE_MODE_COOL:
|
53
53
|
remote_state |= climate_is_off ? COMMAND_ON_COOL : COMMAND_COOL;
|
@@ -71,7 +71,7 @@ void LgIrClimate::transmit_state() {
|
|
71
71
|
}
|
72
72
|
}
|
73
73
|
|
74
|
-
mode_before_ = this->mode;
|
74
|
+
this->mode_before_ = this->mode;
|
75
75
|
|
76
76
|
ESP_LOGD(TAG, "climate_lg_ir mode code: 0x%02X", this->mode);
|
77
77
|
|
@@ -102,7 +102,7 @@ void LgIrClimate::transmit_state() {
|
|
102
102
|
remote_state |= ((temp - 15) << TEMP_SHIFT);
|
103
103
|
}
|
104
104
|
|
105
|
-
transmit_(remote_state);
|
105
|
+
this->transmit_(remote_state);
|
106
106
|
this->publish_state();
|
107
107
|
}
|
108
108
|
|
@@ -187,7 +187,7 @@ bool LgIrClimate::on_receive(remote_base::RemoteReceiveData data) {
|
|
187
187
|
}
|
188
188
|
|
189
189
|
void LgIrClimate::transmit_(uint32_t value) {
|
190
|
-
calc_checksum_(value);
|
190
|
+
this->calc_checksum_(value);
|
191
191
|
ESP_LOGD(TAG, "Sending climate_lg_ir code: 0x%02" PRIX32, value);
|
192
192
|
|
193
193
|
auto transmit = this->transmitter_->transmit();
|
@@ -21,7 +21,7 @@ class LgIrClimate : public climate_ir::ClimateIR {
|
|
21
21
|
|
22
22
|
/// Override control to change settings of the climate device.
|
23
23
|
void control(const climate::ClimateCall &call) override {
|
24
|
-
send_swing_cmd_ = call.get_swing_mode().has_value();
|
24
|
+
this->send_swing_cmd_ = call.get_swing_mode().has_value();
|
25
25
|
// swing resets after unit powered off
|
26
26
|
if (call.get_mode().has_value() && *call.get_mode() == climate::CLIMATE_MODE_OFF)
|
27
27
|
this->swing_mode = climate::CLIMATE_SWING_OFF;
|
@@ -1,7 +1,5 @@
|
|
1
1
|
import esphome.codegen as cg
|
2
2
|
from esphome.components import climate_ir
|
3
|
-
import esphome.config_validation as cv
|
4
|
-
from esphome.const import CONF_ID
|
5
3
|
|
6
4
|
AUTO_LOAD = ["climate_ir"]
|
7
5
|
CODEOWNERS = ["@glmnet"]
|
@@ -9,13 +7,8 @@ CODEOWNERS = ["@glmnet"]
|
|
9
7
|
coolix_ns = cg.esphome_ns.namespace("coolix")
|
10
8
|
CoolixClimate = coolix_ns.class_("CoolixClimate", climate_ir.ClimateIR)
|
11
9
|
|
12
|
-
CONFIG_SCHEMA = climate_ir.
|
13
|
-
{
|
14
|
-
cv.GenerateID(): cv.declare_id(CoolixClimate),
|
15
|
-
}
|
16
|
-
)
|
10
|
+
CONFIG_SCHEMA = climate_ir.climate_ir_with_receiver_schema(CoolixClimate)
|
17
11
|
|
18
12
|
|
19
13
|
async def to_code(config):
|
20
|
-
|
21
|
-
await climate_ir.register_climate_ir(var, config)
|
14
|
+
await climate_ir.new_climate_ir(config)
|
@@ -5,7 +5,6 @@ from esphome.const import (
|
|
5
5
|
CONF_DEVICE_CLASS,
|
6
6
|
CONF_ENTITY_CATEGORY,
|
7
7
|
CONF_ICON,
|
8
|
-
CONF_ID,
|
9
8
|
CONF_SOURCE_ID,
|
10
9
|
)
|
11
10
|
from esphome.core.entity_helpers import inherit_property_from
|
@@ -15,12 +14,15 @@ from .. import copy_ns
|
|
15
14
|
CopyCover = copy_ns.class_("CopyCover", cover.Cover, cg.Component)
|
16
15
|
|
17
16
|
|
18
|
-
CONFIG_SCHEMA =
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
17
|
+
CONFIG_SCHEMA = (
|
18
|
+
cover.cover_schema(CopyCover)
|
19
|
+
.extend(
|
20
|
+
{
|
21
|
+
cv.Required(CONF_SOURCE_ID): cv.use_id(cover.Cover),
|
22
|
+
}
|
23
|
+
)
|
24
|
+
.extend(cv.COMPONENT_SCHEMA)
|
25
|
+
)
|
24
26
|
|
25
27
|
FINAL_VALIDATE_SCHEMA = cv.All(
|
26
28
|
inherit_property_from(CONF_ICON, CONF_SOURCE_ID),
|
@@ -30,8 +32,7 @@ FINAL_VALIDATE_SCHEMA = cv.All(
|
|
30
32
|
|
31
33
|
|
32
34
|
async def to_code(config):
|
33
|
-
var =
|
34
|
-
await cover.register_cover(var, config)
|
35
|
+
var = await cover.new_cover(config)
|
35
36
|
await cg.register_component(var, config)
|
36
37
|
|
37
38
|
source = await cg.get_variable(config[CONF_SOURCE_ID])
|
@@ -1,7 +1,7 @@
|
|
1
1
|
import esphome.codegen as cg
|
2
2
|
from esphome.components import fan
|
3
3
|
import esphome.config_validation as cv
|
4
|
-
from esphome.const import CONF_ENTITY_CATEGORY, CONF_ICON,
|
4
|
+
from esphome.const import CONF_ENTITY_CATEGORY, CONF_ICON, CONF_SOURCE_ID
|
5
5
|
from esphome.core.entity_helpers import inherit_property_from
|
6
6
|
|
7
7
|
from .. import copy_ns
|
@@ -9,12 +9,15 @@ from .. import copy_ns
|
|
9
9
|
CopyFan = copy_ns.class_("CopyFan", fan.Fan, cg.Component)
|
10
10
|
|
11
11
|
|
12
|
-
CONFIG_SCHEMA =
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
12
|
+
CONFIG_SCHEMA = (
|
13
|
+
fan.fan_schema(CopyFan)
|
14
|
+
.extend(
|
15
|
+
{
|
16
|
+
cv.Required(CONF_SOURCE_ID): cv.use_id(fan.Fan),
|
17
|
+
}
|
18
|
+
)
|
19
|
+
.extend(cv.COMPONENT_SCHEMA)
|
20
|
+
)
|
18
21
|
|
19
22
|
FINAL_VALIDATE_SCHEMA = cv.All(
|
20
23
|
inherit_property_from(CONF_ICON, CONF_SOURCE_ID),
|
@@ -23,8 +26,7 @@ FINAL_VALIDATE_SCHEMA = cv.All(
|
|
23
26
|
|
24
27
|
|
25
28
|
async def to_code(config):
|
26
|
-
var =
|
27
|
-
await fan.register_fan(var, config)
|
29
|
+
var = await fan.new_fan(config)
|
28
30
|
await cg.register_component(var, config)
|
29
31
|
|
30
32
|
source = await cg.get_variable(config[CONF_SOURCE_ID])
|
@@ -1,7 +1,7 @@
|
|
1
1
|
import esphome.codegen as cg
|
2
2
|
from esphome.components import lock
|
3
3
|
import esphome.config_validation as cv
|
4
|
-
from esphome.const import CONF_ENTITY_CATEGORY, CONF_ICON,
|
4
|
+
from esphome.const import CONF_ENTITY_CATEGORY, CONF_ICON, CONF_SOURCE_ID
|
5
5
|
from esphome.core.entity_helpers import inherit_property_from
|
6
6
|
|
7
7
|
from .. import copy_ns
|
@@ -9,12 +9,15 @@ from .. import copy_ns
|
|
9
9
|
CopyLock = copy_ns.class_("CopyLock", lock.Lock, cg.Component)
|
10
10
|
|
11
11
|
|
12
|
-
CONFIG_SCHEMA =
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
12
|
+
CONFIG_SCHEMA = (
|
13
|
+
lock.lock_schema(CopyLock)
|
14
|
+
.extend(
|
15
|
+
{
|
16
|
+
cv.Required(CONF_SOURCE_ID): cv.use_id(lock.Lock),
|
17
|
+
}
|
18
|
+
)
|
19
|
+
.extend(cv.COMPONENT_SCHEMA)
|
20
|
+
)
|
18
21
|
|
19
22
|
FINAL_VALIDATE_SCHEMA = cv.All(
|
20
23
|
inherit_property_from(CONF_ICON, CONF_SOURCE_ID),
|
@@ -23,8 +26,7 @@ FINAL_VALIDATE_SCHEMA = cv.All(
|
|
23
26
|
|
24
27
|
|
25
28
|
async def to_code(config):
|
26
|
-
var =
|
27
|
-
await lock.register_lock(var, config)
|
29
|
+
var = await lock.new_lock(config)
|
28
30
|
await cg.register_component(var, config)
|
29
31
|
|
30
32
|
source = await cg.get_variable(config[CONF_SOURCE_ID])
|
@@ -9,12 +9,15 @@ from .. import copy_ns
|
|
9
9
|
CopyText = copy_ns.class_("CopyText", text.Text, cg.Component)
|
10
10
|
|
11
11
|
|
12
|
-
CONFIG_SCHEMA =
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
12
|
+
CONFIG_SCHEMA = (
|
13
|
+
text.text_schema(CopyText)
|
14
|
+
.extend(
|
15
|
+
{
|
16
|
+
cv.Required(CONF_SOURCE_ID): cv.use_id(text.Text),
|
17
|
+
}
|
18
|
+
)
|
19
|
+
.extend(cv.COMPONENT_SCHEMA)
|
20
|
+
)
|
18
21
|
|
19
22
|
FINAL_VALIDATE_SCHEMA = cv.All(
|
20
23
|
inherit_property_from(CONF_ICON, CONF_SOURCE_ID),
|
@@ -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,
|
@@ -31,6 +33,7 @@ from esphome.const import (
|
|
31
33
|
DEVICE_CLASS_WINDOW,
|
32
34
|
)
|
33
35
|
from esphome.core import CORE, coroutine_with_priority
|
36
|
+
from esphome.cpp_generator import MockObjClass
|
34
37
|
from esphome.cpp_helpers import setup_entity
|
35
38
|
|
36
39
|
IS_PLATFORM_COMPONENT = True
|
@@ -89,12 +92,11 @@ CoverClosedTrigger = cover_ns.class_(
|
|
89
92
|
|
90
93
|
CONF_ON_CLOSED = "on_closed"
|
91
94
|
|
92
|
-
|
95
|
+
_COVER_SCHEMA = (
|
93
96
|
cv.ENTITY_BASE_SCHEMA.extend(web_server.WEBSERVER_SORTING_SCHEMA)
|
94
97
|
.extend(cv.MQTT_COMMAND_COMPONENT_SCHEMA)
|
95
98
|
.extend(
|
96
99
|
{
|
97
|
-
cv.GenerateID(): cv.declare_id(Cover),
|
98
100
|
cv.OnlyWith(CONF_MQTT_ID, "mqtt"): cv.declare_id(mqtt.MQTTCoverComponent),
|
99
101
|
cv.Optional(CONF_DEVICE_CLASS): cv.one_of(*DEVICE_CLASSES, lower=True),
|
100
102
|
cv.Optional(CONF_POSITION_COMMAND_TOPIC): cv.All(
|
@@ -124,6 +126,33 @@ COVER_SCHEMA = (
|
|
124
126
|
)
|
125
127
|
|
126
128
|
|
129
|
+
def cover_schema(
|
130
|
+
class_: MockObjClass,
|
131
|
+
*,
|
132
|
+
device_class: str = cv.UNDEFINED,
|
133
|
+
entity_category: str = cv.UNDEFINED,
|
134
|
+
icon: str = cv.UNDEFINED,
|
135
|
+
) -> cv.Schema:
|
136
|
+
schema = {
|
137
|
+
cv.GenerateID(): cv.declare_id(class_),
|
138
|
+
}
|
139
|
+
|
140
|
+
for key, default, validator in [
|
141
|
+
(CONF_DEVICE_CLASS, device_class, cv.one_of(*DEVICE_CLASSES, lower=True)),
|
142
|
+
(CONF_ENTITY_CATEGORY, entity_category, cv.entity_category),
|
143
|
+
(CONF_ICON, icon, cv.icon),
|
144
|
+
]:
|
145
|
+
if default is not cv.UNDEFINED:
|
146
|
+
schema[cv.Optional(key, default=default)] = validator
|
147
|
+
|
148
|
+
return _COVER_SCHEMA.extend(schema)
|
149
|
+
|
150
|
+
|
151
|
+
# Remove before 2025.11.0
|
152
|
+
COVER_SCHEMA = cover_schema(Cover)
|
153
|
+
COVER_SCHEMA.add_extra(cv.deprecated_schema_constant("cover"))
|
154
|
+
|
155
|
+
|
127
156
|
async def setup_cover_core_(var, config):
|
128
157
|
await setup_entity(var, config)
|
129
158
|
|
@@ -163,6 +192,12 @@ async def register_cover(var, config):
|
|
163
192
|
await setup_cover_core_(var, config)
|
164
193
|
|
165
194
|
|
195
|
+
async def new_cover(config, *args):
|
196
|
+
var = cg.new_Pvariable(config[CONF_ID], *args)
|
197
|
+
await register_cover(var, config)
|
198
|
+
return var
|
199
|
+
|
200
|
+
|
166
201
|
COVER_ACTION_SCHEMA = maybe_simple_id(
|
167
202
|
{
|
168
203
|
cv.Required(CONF_ID): cv.use_id(Cover),
|
@@ -1,5 +1,6 @@
|
|
1
1
|
#include "cse7766.h"
|
2
2
|
#include "esphome/core/log.h"
|
3
|
+
#include "esphome/core/application.h"
|
3
4
|
|
4
5
|
namespace esphome {
|
5
6
|
namespace cse7766 {
|
@@ -7,7 +8,7 @@ namespace cse7766 {
|
|
7
8
|
static const char *const TAG = "cse7766";
|
8
9
|
|
9
10
|
void CSE7766Component::loop() {
|
10
|
-
const uint32_t now =
|
11
|
+
const uint32_t now = App.get_loop_component_start_time();
|
11
12
|
if (now - this->last_transmission_ >= 500) {
|
12
13
|
// last transmission too long ago. Reset RX index.
|
13
14
|
this->raw_data_index_ = 0;
|