esphome 2025.4.2__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/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/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/__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/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/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.2.dist-info → esphome-2025.5.0.dist-info}/METADATA +10 -11
- {esphome-2025.4.2.dist-info → esphome-2025.5.0.dist-info}/RECORD +444 -383
- {esphome-2025.4.2.dist-info → esphome-2025.5.0.dist-info}/WHEEL +1 -1
- {esphome-2025.4.2.dist-info → esphome-2025.5.0.dist-info}/entry_points.txt +0 -0
- {esphome-2025.4.2.dist-info → esphome-2025.5.0.dist-info}/licenses/LICENSE +0 -0
- {esphome-2025.4.2.dist-info → esphome-2025.5.0.dist-info}/top_level.txt +0 -0
esphome/components/gps/gps.h
CHANGED
@@ -5,7 +5,7 @@
|
|
5
5
|
#include "esphome/core/component.h"
|
6
6
|
#include "esphome/components/uart/uart.h"
|
7
7
|
#include "esphome/components/sensor/sensor.h"
|
8
|
-
#include <
|
8
|
+
#include <TinyGPSPlus.h>
|
9
9
|
|
10
10
|
#include <vector>
|
11
11
|
|
@@ -27,12 +27,13 @@ class GPSListener {
|
|
27
27
|
|
28
28
|
class GPS : public PollingComponent, public uart::UARTDevice {
|
29
29
|
public:
|
30
|
-
void set_latitude_sensor(sensor::Sensor *latitude_sensor) { latitude_sensor_ = latitude_sensor; }
|
31
|
-
void set_longitude_sensor(sensor::Sensor *longitude_sensor) { longitude_sensor_ = longitude_sensor; }
|
32
|
-
void set_speed_sensor(sensor::Sensor *speed_sensor) { speed_sensor_ = speed_sensor; }
|
33
|
-
void set_course_sensor(sensor::Sensor *course_sensor) { course_sensor_ = course_sensor; }
|
34
|
-
void set_altitude_sensor(sensor::Sensor *altitude_sensor) { altitude_sensor_ = altitude_sensor; }
|
35
|
-
void set_satellites_sensor(sensor::Sensor *satellites_sensor) { satellites_sensor_ = satellites_sensor; }
|
30
|
+
void set_latitude_sensor(sensor::Sensor *latitude_sensor) { this->latitude_sensor_ = latitude_sensor; }
|
31
|
+
void set_longitude_sensor(sensor::Sensor *longitude_sensor) { this->longitude_sensor_ = longitude_sensor; }
|
32
|
+
void set_speed_sensor(sensor::Sensor *speed_sensor) { this->speed_sensor_ = speed_sensor; }
|
33
|
+
void set_course_sensor(sensor::Sensor *course_sensor) { this->course_sensor_ = course_sensor; }
|
34
|
+
void set_altitude_sensor(sensor::Sensor *altitude_sensor) { this->altitude_sensor_ = altitude_sensor; }
|
35
|
+
void set_satellites_sensor(sensor::Sensor *satellites_sensor) { this->satellites_sensor_ = satellites_sensor; }
|
36
|
+
void set_hdop_sensor(sensor::Sensor *hdop_sensor) { this->hdop_sensor_ = hdop_sensor; }
|
36
37
|
|
37
38
|
void register_listener(GPSListener *listener) {
|
38
39
|
listener->parent_ = this;
|
@@ -40,18 +41,20 @@ class GPS : public PollingComponent, public uart::UARTDevice {
|
|
40
41
|
}
|
41
42
|
float get_setup_priority() const override { return setup_priority::HARDWARE; }
|
42
43
|
|
44
|
+
void dump_config() override;
|
43
45
|
void loop() override;
|
44
46
|
void update() override;
|
45
47
|
|
46
48
|
TinyGPSPlus &get_tiny_gps() { return this->tiny_gps_; }
|
47
49
|
|
48
50
|
protected:
|
49
|
-
float latitude_
|
50
|
-
float longitude_
|
51
|
-
float speed_
|
52
|
-
float course_
|
53
|
-
float altitude_
|
54
|
-
|
51
|
+
float latitude_{NAN};
|
52
|
+
float longitude_{NAN};
|
53
|
+
float speed_{NAN};
|
54
|
+
float course_{NAN};
|
55
|
+
float altitude_{NAN};
|
56
|
+
uint16_t satellites_{0};
|
57
|
+
float hdop_{NAN};
|
55
58
|
|
56
59
|
sensor::Sensor *latitude_sensor_{nullptr};
|
57
60
|
sensor::Sensor *longitude_sensor_{nullptr};
|
@@ -59,6 +62,7 @@ class GPS : public PollingComponent, public uart::UARTDevice {
|
|
59
62
|
sensor::Sensor *course_sensor_{nullptr};
|
60
63
|
sensor::Sensor *altitude_sensor_{nullptr};
|
61
64
|
sensor::Sensor *satellites_sensor_{nullptr};
|
65
|
+
sensor::Sensor *hdop_sensor_{nullptr};
|
62
66
|
|
63
67
|
bool has_time_{false};
|
64
68
|
TinyGPSPlus tiny_gps_;
|
@@ -5,6 +5,7 @@ import esphome.config_validation as cv
|
|
5
5
|
from esphome.const import (
|
6
6
|
CONF_BORDER,
|
7
7
|
CONF_COLOR,
|
8
|
+
CONF_CONTINUOUS,
|
8
9
|
CONF_DIRECTION,
|
9
10
|
CONF_DURATION,
|
10
11
|
CONF_HEIGHT,
|
@@ -61,8 +62,6 @@ VALUE_POSITION_TYPE = {
|
|
61
62
|
"BELOW": ValuePositionType.VALUE_POSITION_TYPE_BELOW,
|
62
63
|
}
|
63
64
|
|
64
|
-
CONF_CONTINUOUS = "continuous"
|
65
|
-
|
66
65
|
GRAPH_TRACE_SCHEMA = cv.Schema(
|
67
66
|
{
|
68
67
|
cv.GenerateID(): cv.declare_id(GraphTrace),
|
@@ -1,7 +1,7 @@
|
|
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
|
4
|
+
from esphome.const import CONF_MODEL
|
5
5
|
|
6
6
|
CODEOWNERS = ["@orestismers"]
|
7
7
|
|
@@ -18,18 +18,16 @@ MODELS = {
|
|
18
18
|
"yac": Model.GREE_YAC,
|
19
19
|
"yac1fb9": Model.GREE_YAC1FB9,
|
20
20
|
"yx1ff": Model.GREE_YX1FF,
|
21
|
+
"yag": Model.GREE_YAG,
|
21
22
|
}
|
22
23
|
|
23
|
-
CONFIG_SCHEMA = climate_ir.
|
24
|
+
CONFIG_SCHEMA = climate_ir.climate_ir_with_receiver_schema(GreeClimate).extend(
|
24
25
|
{
|
25
|
-
cv.GenerateID(): cv.declare_id(GreeClimate),
|
26
26
|
cv.Required(CONF_MODEL): cv.enum(MODELS),
|
27
27
|
}
|
28
28
|
)
|
29
29
|
|
30
30
|
|
31
31
|
async def to_code(config):
|
32
|
-
var =
|
32
|
+
var = await climate_ir.new_climate_ir(config)
|
33
33
|
cg.add(var.set_model(config[CONF_MODEL]))
|
34
|
-
|
35
|
-
await climate_ir.register_climate_ir(var, config)
|
esphome/components/gree/gree.cpp
CHANGED
@@ -22,13 +22,21 @@ void GreeClimate::transmit_state() {
|
|
22
22
|
remote_state[0] = this->fan_speed_() | this->operation_mode_();
|
23
23
|
remote_state[1] = this->temperature_();
|
24
24
|
|
25
|
-
if (this->model_ == GREE_YAN || this->model_ == GREE_YX1FF) {
|
25
|
+
if (this->model_ == GREE_YAN || this->model_ == GREE_YX1FF || this->model_ == GREE_YAG) {
|
26
26
|
remote_state[2] = 0x60;
|
27
27
|
remote_state[3] = 0x50;
|
28
28
|
remote_state[4] = this->vertical_swing_();
|
29
29
|
}
|
30
30
|
|
31
|
-
if (this->model_ ==
|
31
|
+
if (this->model_ == GREE_YAG) {
|
32
|
+
remote_state[5] = 0x40;
|
33
|
+
|
34
|
+
if (this->vertical_swing_() == GREE_VDIR_SWING || this->horizontal_swing_() == GREE_HDIR_SWING) {
|
35
|
+
remote_state[0] |= (1 << 6);
|
36
|
+
}
|
37
|
+
}
|
38
|
+
|
39
|
+
if (this->model_ == GREE_YAC || this->model_ == GREE_YAG) {
|
32
40
|
remote_state[4] |= (this->horizontal_swing_() << 4);
|
33
41
|
}
|
34
42
|
|
@@ -57,6 +65,12 @@ void GreeClimate::transmit_state() {
|
|
57
65
|
// Calculate the checksum
|
58
66
|
if (this->model_ == GREE_YAN || this->model_ == GREE_YX1FF) {
|
59
67
|
remote_state[7] = ((remote_state[0] << 4) + (remote_state[1] << 4) + 0xC0);
|
68
|
+
} else if (this->model_ == GREE_YAG) {
|
69
|
+
remote_state[7] =
|
70
|
+
((((remote_state[0] & 0x0F) + (remote_state[1] & 0x0F) + (remote_state[2] & 0x0F) + (remote_state[3] & 0x0F) +
|
71
|
+
((remote_state[4] & 0xF0) >> 4) + ((remote_state[5] & 0xF0) >> 4) + ((remote_state[6] & 0xF0) >> 4) + 0x0A) &
|
72
|
+
0x0F)
|
73
|
+
<< 4);
|
60
74
|
} else {
|
61
75
|
remote_state[7] =
|
62
76
|
((((remote_state[0] & 0x0F) + (remote_state[1] & 0x0F) + (remote_state[2] & 0x0F) + (remote_state[3] & 0x0F) +
|
esphome/components/gree/gree.h
CHANGED
@@ -58,7 +58,7 @@ const uint8_t GREE_VDIR_MIDDLE = 0x04;
|
|
58
58
|
const uint8_t GREE_VDIR_MDOWN = 0x05;
|
59
59
|
const uint8_t GREE_VDIR_DOWN = 0x06;
|
60
60
|
|
61
|
-
// Only available on YAC
|
61
|
+
// Only available on YAC/YAG
|
62
62
|
// Horizontal air directions. Note that these cannot be set on all heat pumps
|
63
63
|
const uint8_t GREE_HDIR_AUTO = 0x00;
|
64
64
|
const uint8_t GREE_HDIR_MANUAL = 0x00;
|
@@ -78,7 +78,7 @@ const uint8_t GREE_PRESET_SLEEP = 0x01;
|
|
78
78
|
const uint8_t GREE_PRESET_SLEEP_BIT = 0x80;
|
79
79
|
|
80
80
|
// Model codes
|
81
|
-
enum Model { GREE_GENERIC, GREE_YAN, GREE_YAA, GREE_YAC, GREE_YAC1FB9, GREE_YX1FF };
|
81
|
+
enum Model { GREE_GENERIC, GREE_YAN, GREE_YAA, GREE_YAC, GREE_YAC1FB9, GREE_YX1FF, GREE_YAG };
|
82
82
|
|
83
83
|
class GreeClimate : public climate_ir::ClimateIR {
|
84
84
|
public:
|
@@ -1,5 +1,6 @@
|
|
1
1
|
#include "growatt_solar.h"
|
2
2
|
#include "esphome/core/log.h"
|
3
|
+
#include "esphome/core/application.h"
|
3
4
|
|
4
5
|
namespace esphome {
|
5
6
|
namespace growatt_solar {
|
@@ -18,7 +19,7 @@ void GrowattSolar::loop() {
|
|
18
19
|
|
19
20
|
void GrowattSolar::update() {
|
20
21
|
// If our last send has had no reply yet, and it wasn't that long ago, do nothing.
|
21
|
-
uint32_t now =
|
22
|
+
const uint32_t now = App.get_loop_component_start_time();
|
22
23
|
if (now - this->last_send_ < this->get_update_interval() / 2) {
|
23
24
|
return;
|
24
25
|
}
|
@@ -30,6 +30,7 @@ from esphome.const import (
|
|
30
30
|
CONF_VISUAL,
|
31
31
|
CONF_WIFI,
|
32
32
|
)
|
33
|
+
from esphome.cpp_generator import MockObjClass
|
33
34
|
import esphome.final_validate as fv
|
34
35
|
|
35
36
|
_LOGGER = logging.getLogger(__name__)
|
@@ -185,42 +186,46 @@ def validate_visual(config):
|
|
185
186
|
return config
|
186
187
|
|
187
188
|
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
189
|
+
def _base_config_schema(class_: MockObjClass) -> cv.Schema:
|
190
|
+
return (
|
191
|
+
climate.climate_schema(class_)
|
192
|
+
.extend(
|
193
|
+
{
|
194
|
+
cv.Optional(CONF_SUPPORTED_MODES): cv.ensure_list(
|
195
|
+
cv.enum(SUPPORTED_CLIMATE_MODES_OPTIONS, upper=True)
|
196
|
+
),
|
197
|
+
cv.Optional(
|
198
|
+
CONF_SUPPORTED_SWING_MODES,
|
199
|
+
default=[
|
200
|
+
"VERTICAL",
|
201
|
+
"HORIZONTAL",
|
202
|
+
"BOTH",
|
203
|
+
],
|
204
|
+
): cv.ensure_list(cv.enum(SUPPORTED_SWING_MODES_OPTIONS, upper=True)),
|
205
|
+
cv.Optional(CONF_WIFI_SIGNAL, default=False): cv.boolean,
|
206
|
+
cv.Optional(CONF_DISPLAY): cv.boolean,
|
207
|
+
cv.Optional(
|
208
|
+
CONF_ANSWER_TIMEOUT,
|
209
|
+
): cv.positive_time_period_milliseconds,
|
210
|
+
cv.Optional(CONF_ON_STATUS_MESSAGE): automation.validate_automation(
|
211
|
+
{
|
212
|
+
cv.GenerateID(CONF_TRIGGER_ID): cv.declare_id(
|
213
|
+
StatusMessageTrigger
|
214
|
+
),
|
215
|
+
}
|
216
|
+
),
|
217
|
+
}
|
218
|
+
)
|
219
|
+
.extend(uart.UART_DEVICE_SCHEMA)
|
220
|
+
.extend(cv.COMPONENT_SCHEMA)
|
213
221
|
)
|
214
|
-
|
215
|
-
.extend(cv.COMPONENT_SCHEMA)
|
216
|
-
)
|
222
|
+
|
217
223
|
|
218
224
|
CONFIG_SCHEMA = cv.All(
|
219
225
|
cv.typed_schema(
|
220
226
|
{
|
221
|
-
PROTOCOL_SMARTAIR2:
|
227
|
+
PROTOCOL_SMARTAIR2: _base_config_schema(Smartair2Climate).extend(
|
222
228
|
{
|
223
|
-
cv.GenerateID(): cv.declare_id(Smartair2Climate),
|
224
229
|
cv.Optional(
|
225
230
|
CONF_ALTERNATIVE_SWING_CONTROL, default=False
|
226
231
|
): cv.boolean,
|
@@ -232,9 +237,8 @@ CONFIG_SCHEMA = cv.All(
|
|
232
237
|
),
|
233
238
|
}
|
234
239
|
),
|
235
|
-
PROTOCOL_HON:
|
240
|
+
PROTOCOL_HON: _base_config_schema(HonClimate).extend(
|
236
241
|
{
|
237
|
-
cv.GenerateID(): cv.declare_id(HonClimate),
|
238
242
|
cv.Optional(
|
239
243
|
CONF_CONTROL_METHOD, default="SET_GROUP_PARAMETERS"
|
240
244
|
): cv.ensure_list(
|
@@ -464,10 +468,9 @@ FINAL_VALIDATE_SCHEMA = _final_validate
|
|
464
468
|
|
465
469
|
async def to_code(config):
|
466
470
|
cg.add(haier_ns.init_haier_protocol_logging())
|
467
|
-
var =
|
471
|
+
var = await climate.new_climate(config)
|
468
472
|
await cg.register_component(var, config)
|
469
473
|
await uart.register_uart_device(var, config)
|
470
|
-
await climate.register_climate(var, config)
|
471
474
|
|
472
475
|
cg.add(var.set_send_wifi(config[CONF_WIFI_SIGNAL]))
|
473
476
|
if CONF_CONTROL_METHOD in config:
|
@@ -30,25 +30,28 @@ DECAY_MODE_OPTIONS = {
|
|
30
30
|
# Actions
|
31
31
|
BrakeAction = hbridge_ns.class_("BrakeAction", automation.Action)
|
32
32
|
|
33
|
-
CONFIG_SCHEMA =
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
33
|
+
CONFIG_SCHEMA = (
|
34
|
+
fan.fan_schema(HBridgeFan)
|
35
|
+
.extend(
|
36
|
+
{
|
37
|
+
cv.Required(CONF_PIN_A): cv.use_id(output.FloatOutput),
|
38
|
+
cv.Required(CONF_PIN_B): cv.use_id(output.FloatOutput),
|
39
|
+
cv.Optional(CONF_DECAY_MODE, default="SLOW"): cv.enum(
|
40
|
+
DECAY_MODE_OPTIONS, upper=True
|
41
|
+
),
|
42
|
+
cv.Optional(CONF_SPEED_COUNT, default=100): cv.int_range(min=1),
|
43
|
+
cv.Optional(CONF_ENABLE_PIN): cv.use_id(output.FloatOutput),
|
44
|
+
cv.Optional(CONF_PRESET_MODES): validate_preset_modes,
|
45
|
+
}
|
46
|
+
)
|
47
|
+
.extend(cv.COMPONENT_SCHEMA)
|
48
|
+
)
|
46
49
|
|
47
50
|
|
48
51
|
@automation.register_action(
|
49
52
|
"fan.hbridge.brake",
|
50
53
|
BrakeAction,
|
51
|
-
maybe_simple_id({cv.
|
54
|
+
maybe_simple_id({cv.GenerateID(): cv.use_id(HBridgeFan)}),
|
52
55
|
)
|
53
56
|
async def fan_hbridge_brake_to_code(config, action_id, template_arg, args):
|
54
57
|
paren = await cg.get_variable(config[CONF_ID])
|
@@ -56,13 +59,12 @@ async def fan_hbridge_brake_to_code(config, action_id, template_arg, args):
|
|
56
59
|
|
57
60
|
|
58
61
|
async def to_code(config):
|
59
|
-
var =
|
60
|
-
config
|
62
|
+
var = await fan.new_fan(
|
63
|
+
config,
|
61
64
|
config[CONF_SPEED_COUNT],
|
62
65
|
config[CONF_DECAY_MODE],
|
63
66
|
)
|
64
67
|
await cg.register_component(var, config)
|
65
|
-
await fan.register_fan(var, config)
|
66
68
|
pin_a_ = await cg.get_variable(config[CONF_PIN_A])
|
67
69
|
cg.add(var.set_pin_a(pin_a_))
|
68
70
|
pin_b_ = await cg.get_variable(config[CONF_PIN_B])
|
@@ -1,17 +1,17 @@
|
|
1
1
|
import esphome.codegen as cg
|
2
2
|
from esphome.components import cover, uart
|
3
3
|
import esphome.config_validation as cv
|
4
|
-
from esphome.const import CONF_CLOSE_DURATION,
|
4
|
+
from esphome.const import CONF_CLOSE_DURATION, CONF_OPEN_DURATION
|
5
5
|
|
6
6
|
he60r_ns = cg.esphome_ns.namespace("he60r")
|
7
7
|
HE60rCover = he60r_ns.class_("HE60rCover", cover.Cover, cg.Component)
|
8
8
|
|
9
9
|
CONFIG_SCHEMA = (
|
10
|
-
cover.
|
10
|
+
cover.cover_schema(HE60rCover)
|
11
|
+
.extend(uart.UART_DEVICE_SCHEMA)
|
11
12
|
.extend(cv.COMPONENT_SCHEMA)
|
12
13
|
.extend(
|
13
14
|
{
|
14
|
-
cv.GenerateID(): cv.declare_id(HE60rCover),
|
15
15
|
cv.Optional(
|
16
16
|
CONF_OPEN_DURATION, default="15s"
|
17
17
|
): cv.positive_time_period_milliseconds,
|
@@ -34,9 +34,8 @@ FINAL_VALIDATE_SCHEMA = uart.final_validate_device_schema(
|
|
34
34
|
|
35
35
|
|
36
36
|
async def to_code(config):
|
37
|
-
var =
|
37
|
+
var = await cover.new_cover(config)
|
38
38
|
await cg.register_component(var, config)
|
39
|
-
await cover.register_cover(var, config)
|
40
39
|
await uart.register_uart_device(var, config)
|
41
40
|
|
42
41
|
cg.add(var.set_close_duration(config[CONF_CLOSE_DURATION]))
|
@@ -2,7 +2,6 @@ import esphome.codegen as cg
|
|
2
2
|
from esphome.components import climate_ir
|
3
3
|
import esphome.config_validation as cv
|
4
4
|
from esphome.const import (
|
5
|
-
CONF_ID,
|
6
5
|
CONF_MAX_TEMPERATURE,
|
7
6
|
CONF_MIN_TEMPERATURE,
|
8
7
|
CONF_PROTOCOL,
|
@@ -98,9 +97,8 @@ VERTICAL_DIRECTIONS = {
|
|
98
97
|
}
|
99
98
|
|
100
99
|
CONFIG_SCHEMA = cv.All(
|
101
|
-
climate_ir.
|
100
|
+
climate_ir.climate_ir_with_receiver_schema(HeatpumpIRClimate).extend(
|
102
101
|
{
|
103
|
-
cv.GenerateID(): cv.declare_id(HeatpumpIRClimate),
|
104
102
|
cv.Required(CONF_PROTOCOL): cv.enum(PROTOCOLS),
|
105
103
|
cv.Required(CONF_HORIZONTAL_DEFAULT): cv.enum(HORIZONTAL_DIRECTIONS),
|
106
104
|
cv.Required(CONF_VERTICAL_DEFAULT): cv.enum(VERTICAL_DIRECTIONS),
|
@@ -112,8 +110,8 @@ CONFIG_SCHEMA = cv.All(
|
|
112
110
|
)
|
113
111
|
|
114
112
|
|
115
|
-
def to_code(config):
|
116
|
-
var =
|
113
|
+
async def to_code(config):
|
114
|
+
var = await climate_ir.new_climate_ir(config)
|
117
115
|
if CONF_VISUAL not in config:
|
118
116
|
config[CONF_VISUAL] = {}
|
119
117
|
visual = config[CONF_VISUAL]
|
@@ -121,7 +119,6 @@ def to_code(config):
|
|
121
119
|
visual[CONF_MAX_TEMPERATURE] = config[CONF_MAX_TEMPERATURE]
|
122
120
|
if CONF_MIN_TEMPERATURE not in visual:
|
123
121
|
visual[CONF_MIN_TEMPERATURE] = config[CONF_MIN_TEMPERATURE]
|
124
|
-
yield climate_ir.register_climate_ir(var, config)
|
125
122
|
cg.add(var.set_protocol(config[CONF_PROTOCOL]))
|
126
123
|
cg.add(var.set_horizontal_default(config[CONF_HORIZONTAL_DEFAULT]))
|
127
124
|
cg.add(var.set_vertical_default(config[CONF_VERTICAL_DEFAULT]))
|
@@ -1,20 +1,13 @@
|
|
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
|
|
8
6
|
hitachi_ac344_ns = cg.esphome_ns.namespace("hitachi_ac344")
|
9
7
|
HitachiClimate = hitachi_ac344_ns.class_("HitachiClimate", climate_ir.ClimateIR)
|
10
8
|
|
11
|
-
CONFIG_SCHEMA = climate_ir.
|
12
|
-
{
|
13
|
-
cv.GenerateID(): cv.declare_id(HitachiClimate),
|
14
|
-
}
|
15
|
-
)
|
9
|
+
CONFIG_SCHEMA = climate_ir.climate_ir_with_receiver_schema(HitachiClimate)
|
16
10
|
|
17
11
|
|
18
12
|
async def to_code(config):
|
19
|
-
|
20
|
-
await climate_ir.register_climate_ir(var, config)
|
13
|
+
await climate_ir.new_climate_ir(config)
|
@@ -1,20 +1,13 @@
|
|
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
|
|
8
6
|
hitachi_ac424_ns = cg.esphome_ns.namespace("hitachi_ac424")
|
9
7
|
HitachiClimate = hitachi_ac424_ns.class_("HitachiClimate", climate_ir.ClimateIR)
|
10
8
|
|
11
|
-
CONFIG_SCHEMA = climate_ir.
|
12
|
-
{
|
13
|
-
cv.GenerateID(): cv.declare_id(HitachiClimate),
|
14
|
-
}
|
15
|
-
)
|
9
|
+
CONFIG_SCHEMA = climate_ir.climate_ir_with_receiver_schema(HitachiClimate)
|
16
10
|
|
17
11
|
|
18
12
|
async def to_code(config):
|
19
|
-
|
20
|
-
await climate_ir.register_climate_ir(var, config)
|
13
|
+
await climate_ir.new_climate_ir(config)
|
@@ -25,13 +25,13 @@ CONFIG_SCHEMA = (
|
|
25
25
|
cv.Schema(
|
26
26
|
{
|
27
27
|
cv.GenerateID(): cv.declare_id(HTE501Component),
|
28
|
-
cv.
|
28
|
+
cv.Optional(CONF_TEMPERATURE): sensor.sensor_schema(
|
29
29
|
unit_of_measurement=UNIT_CELSIUS,
|
30
30
|
accuracy_decimals=1,
|
31
31
|
device_class=DEVICE_CLASS_TEMPERATURE,
|
32
32
|
state_class=STATE_CLASS_MEASUREMENT,
|
33
33
|
),
|
34
|
-
cv.
|
34
|
+
cv.Optional(CONF_HUMIDITY): sensor.sensor_schema(
|
35
35
|
unit_of_measurement=UNIT_PERCENT,
|
36
36
|
accuracy_decimals=1,
|
37
37
|
device_class=DEVICE_CLASS_HUMIDITY,
|
@@ -49,10 +49,10 @@ async def to_code(config):
|
|
49
49
|
await cg.register_component(var, config)
|
50
50
|
await i2c.register_i2c_device(var, config)
|
51
51
|
|
52
|
-
if
|
53
|
-
sens = await sensor.new_sensor(
|
52
|
+
if temperature := config.get(CONF_TEMPERATURE):
|
53
|
+
sens = await sensor.new_sensor(temperature)
|
54
54
|
cg.add(var.set_temperature_sensor(sens))
|
55
55
|
|
56
|
-
if
|
57
|
-
sens = await sensor.new_sensor(
|
56
|
+
if humidity := config.get(CONF_HUMIDITY):
|
57
|
+
sens = await sensor.new_sensor(humidity)
|
58
58
|
cg.add(var.set_humidity_sensor(sens))
|
@@ -10,9 +10,11 @@ from esphome.const import (
|
|
10
10
|
CONF_TIMEOUT,
|
11
11
|
CONF_TRIGGER_ID,
|
12
12
|
CONF_URL,
|
13
|
+
PLATFORM_HOST,
|
13
14
|
__version__,
|
14
15
|
)
|
15
16
|
from esphome.core import CORE, Lambda
|
17
|
+
from esphome.helpers import IS_MACOS
|
16
18
|
|
17
19
|
DEPENDENCIES = ["network"]
|
18
20
|
AUTO_LOAD = ["json", "watchdog"]
|
@@ -21,6 +23,7 @@ http_request_ns = cg.esphome_ns.namespace("http_request")
|
|
21
23
|
HttpRequestComponent = http_request_ns.class_("HttpRequestComponent", cg.Component)
|
22
24
|
HttpRequestArduino = http_request_ns.class_("HttpRequestArduino", HttpRequestComponent)
|
23
25
|
HttpRequestIDF = http_request_ns.class_("HttpRequestIDF", HttpRequestComponent)
|
26
|
+
HttpRequestHost = http_request_ns.class_("HttpRequestHost", HttpRequestComponent)
|
24
27
|
|
25
28
|
HttpContainer = http_request_ns.class_("HttpContainer")
|
26
29
|
|
@@ -43,10 +46,13 @@ CONF_REDIRECT_LIMIT = "redirect_limit"
|
|
43
46
|
CONF_WATCHDOG_TIMEOUT = "watchdog_timeout"
|
44
47
|
CONF_BUFFER_SIZE_RX = "buffer_size_rx"
|
45
48
|
CONF_BUFFER_SIZE_TX = "buffer_size_tx"
|
49
|
+
CONF_CA_CERTIFICATE_PATH = "ca_certificate_path"
|
46
50
|
|
47
51
|
CONF_MAX_RESPONSE_BUFFER_SIZE = "max_response_buffer_size"
|
48
52
|
CONF_ON_RESPONSE = "on_response"
|
49
53
|
CONF_HEADERS = "headers"
|
54
|
+
CONF_REQUEST_HEADERS = "request_headers"
|
55
|
+
CONF_COLLECT_HEADERS = "collect_headers"
|
50
56
|
CONF_BODY = "body"
|
51
57
|
CONF_JSON = "json"
|
52
58
|
CONF_CAPTURE_RESPONSE = "capture_response"
|
@@ -85,6 +91,8 @@ def validate_ssl_verification(config):
|
|
85
91
|
|
86
92
|
|
87
93
|
def _declare_request_class(value):
|
94
|
+
if CORE.is_host:
|
95
|
+
return cv.declare_id(HttpRequestHost)(value)
|
88
96
|
if CORE.using_esp_idf:
|
89
97
|
return cv.declare_id(HttpRequestIDF)(value)
|
90
98
|
if CORE.is_esp8266 or CORE.is_esp32 or CORE.is_rp2040:
|
@@ -119,6 +127,10 @@ CONFIG_SCHEMA = cv.All(
|
|
119
127
|
cv.SplitDefault(CONF_BUFFER_SIZE_TX, esp32_idf=512): cv.All(
|
120
128
|
cv.uint16_t, cv.only_with_esp_idf
|
121
129
|
),
|
130
|
+
cv.Optional(CONF_CA_CERTIFICATE_PATH): cv.All(
|
131
|
+
cv.file_,
|
132
|
+
cv.only_on(PLATFORM_HOST),
|
133
|
+
),
|
122
134
|
}
|
123
135
|
).extend(cv.COMPONENT_SCHEMA),
|
124
136
|
cv.require_framework_version(
|
@@ -126,6 +138,7 @@ CONFIG_SCHEMA = cv.All(
|
|
126
138
|
esp32_arduino=cv.Version(0, 0, 0),
|
127
139
|
esp_idf=cv.Version(0, 0, 0),
|
128
140
|
rp2040_arduino=cv.Version(0, 0, 0),
|
141
|
+
host=cv.Version(0, 0, 0),
|
129
142
|
),
|
130
143
|
validate_ssl_verification,
|
131
144
|
)
|
@@ -168,6 +181,21 @@ async def to_code(config):
|
|
168
181
|
cg.add_library("ESP8266HTTPClient", None)
|
169
182
|
if CORE.is_rp2040 and CORE.using_arduino:
|
170
183
|
cg.add_library("HTTPClient", None)
|
184
|
+
if CORE.is_host:
|
185
|
+
if IS_MACOS:
|
186
|
+
cg.add_build_flag("-I/opt/homebrew/opt/openssl/include")
|
187
|
+
cg.add_build_flag("-L/opt/homebrew/opt/openssl/lib")
|
188
|
+
cg.add_build_flag("-lssl")
|
189
|
+
cg.add_build_flag("-lcrypto")
|
190
|
+
cg.add_build_flag("-Wl,-framework,CoreFoundation")
|
191
|
+
cg.add_build_flag("-Wl,-framework,Security")
|
192
|
+
cg.add_define("CPPHTTPLIB_USE_CERTS_FROM_MACOSX_KEYCHAIN")
|
193
|
+
cg.add_define("CPPHTTPLIB_OPENSSL_SUPPORT")
|
194
|
+
elif path := config.get(CONF_CA_CERTIFICATE_PATH):
|
195
|
+
cg.add_define("CPPHTTPLIB_OPENSSL_SUPPORT")
|
196
|
+
cg.add(var.set_ca_path(path))
|
197
|
+
cg.add_build_flag("-lssl")
|
198
|
+
cg.add_build_flag("-lcrypto")
|
171
199
|
|
172
200
|
await cg.register_component(var, config)
|
173
201
|
|
@@ -176,9 +204,13 @@ HTTP_REQUEST_ACTION_SCHEMA = cv.Schema(
|
|
176
204
|
{
|
177
205
|
cv.GenerateID(): cv.use_id(HttpRequestComponent),
|
178
206
|
cv.Required(CONF_URL): cv.templatable(validate_url),
|
179
|
-
cv.Optional(CONF_HEADERS): cv.
|
207
|
+
cv.Optional(CONF_HEADERS): cv.invalid(
|
208
|
+
"The 'headers' options has been renamed to 'request_headers'"
|
209
|
+
),
|
210
|
+
cv.Optional(CONF_REQUEST_HEADERS): cv.All(
|
180
211
|
cv.Schema({cv.string: cv.templatable(cv.string)})
|
181
212
|
),
|
213
|
+
cv.Optional(CONF_COLLECT_HEADERS): cv.ensure_list(cv.string),
|
182
214
|
cv.Optional(CONF_VERIFY_SSL): cv.invalid(
|
183
215
|
f"{CONF_VERIFY_SSL} has moved to the base component configuration."
|
184
216
|
),
|
@@ -263,11 +295,12 @@ async def http_request_action_to_code(config, action_id, template_arg, args):
|
|
263
295
|
for key in json_:
|
264
296
|
template_ = await cg.templatable(json_[key], args, cg.std_string)
|
265
297
|
cg.add(var.add_json(key, template_))
|
266
|
-
for key in config.get(
|
267
|
-
template_ = await cg.templatable(
|
268
|
-
|
269
|
-
|
270
|
-
|
298
|
+
for key, value in config.get(CONF_REQUEST_HEADERS, {}).items():
|
299
|
+
template_ = await cg.templatable(value, args, cg.const_char_ptr)
|
300
|
+
cg.add(var.add_request_header(key, template_))
|
301
|
+
|
302
|
+
for value in config.get(CONF_COLLECT_HEADERS, []):
|
303
|
+
cg.add(var.add_collect_header(value))
|
271
304
|
|
272
305
|
for conf in config.get(CONF_ON_RESPONSE, []):
|
273
306
|
trigger = cg.new_Pvariable(conf[CONF_TRIGGER_ID])
|
@@ -20,5 +20,25 @@ void HttpRequestComponent::dump_config() {
|
|
20
20
|
}
|
21
21
|
}
|
22
22
|
|
23
|
+
std::string HttpContainer::get_response_header(const std::string &header_name) {
|
24
|
+
auto response_headers = this->get_response_headers();
|
25
|
+
auto header_name_lower_case = str_lower_case(header_name);
|
26
|
+
if (response_headers.count(header_name_lower_case) == 0) {
|
27
|
+
ESP_LOGW(TAG, "No header with name %s found", header_name_lower_case.c_str());
|
28
|
+
return "";
|
29
|
+
} else {
|
30
|
+
auto values = response_headers[header_name_lower_case];
|
31
|
+
if (values.empty()) {
|
32
|
+
ESP_LOGE(TAG, "header with name %s returned an empty list, this shouldn't happen",
|
33
|
+
header_name_lower_case.c_str());
|
34
|
+
return "";
|
35
|
+
} else {
|
36
|
+
auto header_value = values.front();
|
37
|
+
ESP_LOGD(TAG, "Header with name %s found with value %s", header_name_lower_case.c_str(), header_value.c_str());
|
38
|
+
return header_value;
|
39
|
+
}
|
40
|
+
}
|
41
|
+
}
|
42
|
+
|
23
43
|
} // namespace http_request
|
24
44
|
} // namespace esphome
|