esphome 2025.4.1__py3-none-any.whl → 2025.5.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- esphome/__main__.py +16 -14
- esphome/components/ac_dimmer/ac_dimmer.cpp +3 -2
- esphome/components/adc/__init__.py +51 -34
- esphome/components/airthings_wave_base/__init__.py +1 -1
- esphome/components/alarm_control_panel/__init__.py +37 -2
- esphome/components/am43/cover/__init__.py +4 -5
- esphome/components/analog_threshold/analog_threshold_binary_sensor.cpp +6 -4
- esphome/components/analog_threshold/analog_threshold_binary_sensor.h +4 -5
- esphome/components/analog_threshold/binary_sensor.py +10 -8
- esphome/components/anova/climate.py +4 -5
- esphome/components/api/__init__.py +25 -8
- esphome/components/api/api_connection.cpp +416 -662
- esphome/components/api/api_connection.h +256 -57
- esphome/components/api/api_frame_helper.cpp +232 -177
- esphome/components/api/api_frame_helper.h +61 -8
- esphome/components/api/api_noise_context.h +13 -4
- esphome/components/api/api_pb2.cpp +1422 -1
- esphome/components/api/api_pb2.h +255 -1
- esphome/components/api/api_pb2_service.cpp +162 -49
- esphome/components/api/api_pb2_service.h +90 -51
- esphome/components/api/api_pb2_size.h +361 -0
- esphome/components/api/api_server.cpp +110 -34
- esphome/components/api/api_server.h +8 -0
- esphome/components/api/proto.h +86 -17
- esphome/components/as3935_i2c/as3935_i2c.h +0 -3
- esphome/components/as7341/as7341.h +1 -1
- esphome/components/at581x/at581x.h +4 -4
- esphome/components/atm90e32/__init__.py +1 -0
- esphome/components/atm90e32/atm90e32.cpp +576 -199
- esphome/components/atm90e32/atm90e32.h +128 -31
- esphome/components/atm90e32/atm90e32_reg.h +4 -2
- esphome/components/atm90e32/button/__init__.py +62 -10
- esphome/components/atm90e32/button/atm90e32_button.cpp +63 -4
- esphome/components/atm90e32/button/atm90e32_button.h +36 -4
- esphome/components/atm90e32/number/__init__.py +130 -0
- esphome/components/atm90e32/number/atm90e32_number.h +16 -0
- esphome/components/atm90e32/sensor.py +21 -4
- esphome/components/atm90e32/text_sensor/__init__.py +48 -0
- esphome/components/audio/__init__.py +96 -49
- esphome/components/audio/audio.h +48 -0
- esphome/components/audio/audio_decoder.cpp +1 -1
- esphome/components/audio/audio_resampler.cpp +2 -0
- esphome/components/audio/audio_resampler.h +1 -0
- esphome/components/ballu/climate.py +2 -9
- esphome/components/bang_bang/climate.py +5 -6
- esphome/components/bedjet/bedjet_hub.cpp +1 -0
- esphome/components/bedjet/climate/__init__.py +3 -8
- esphome/components/bedjet/fan/__init__.py +2 -11
- esphome/components/binary/fan/__init__.py +13 -16
- esphome/components/binary_sensor/__init__.py +13 -10
- esphome/components/bl0906/constants.h +16 -16
- esphome/components/ble_client/text_sensor/__init__.py +3 -5
- esphome/components/bluetooth_proxy/bluetooth_connection.cpp +4 -6
- esphome/components/bluetooth_proxy/bluetooth_proxy.cpp +136 -21
- esphome/components/bluetooth_proxy/bluetooth_proxy.h +7 -0
- esphome/components/button/__init__.py +11 -8
- esphome/components/canbus/canbus.cpp +3 -0
- esphome/components/canbus/canbus.h +16 -0
- esphome/components/ccs811/sensor.py +9 -6
- esphome/components/climate/__init__.py +35 -2
- esphome/components/climate/climate_mode.h +1 -1
- esphome/components/climate/climate_traits.h +63 -57
- esphome/components/climate_ir/__init__.py +57 -17
- esphome/components/climate_ir_lg/climate.py +2 -5
- esphome/components/climate_ir_lg/climate_ir_lg.cpp +7 -7
- esphome/components/climate_ir_lg/climate_ir_lg.h +1 -1
- esphome/components/color/__init__.py +2 -0
- esphome/components/const/__init__.py +5 -0
- esphome/components/coolix/climate.py +2 -9
- esphome/components/copy/cover/__init__.py +10 -9
- esphome/components/copy/fan/__init__.py +11 -9
- esphome/components/copy/lock/__init__.py +11 -9
- esphome/components/copy/text/__init__.py +9 -6
- esphome/components/cover/__init__.py +37 -2
- esphome/components/cse7766/cse7766.cpp +2 -1
- esphome/components/cst226/binary_sensor/__init__.py +28 -0
- esphome/components/cst226/binary_sensor/cs226_button.h +22 -0
- esphome/components/cst226/binary_sensor/cstt6_button.cpp +19 -0
- esphome/components/cst226/touchscreen/cst226_touchscreen.cpp +27 -5
- esphome/components/cst226/touchscreen/cst226_touchscreen.h +10 -10
- esphome/components/current_based/cover.py +37 -36
- esphome/components/current_based/current_based_cover.cpp +2 -1
- esphome/components/daikin/climate.py +2 -9
- esphome/components/daikin/daikin.cpp +15 -9
- esphome/components/daikin/daikin.h +5 -5
- esphome/components/daikin_arc/climate.py +2 -7
- esphome/components/daikin_brc/climate.py +3 -5
- esphome/components/dallas_temp/dallas_temp.cpp +17 -24
- esphome/components/dallas_temp/dallas_temp.h +0 -1
- esphome/components/daly_bms/daly_bms.cpp +2 -1
- esphome/components/debug/debug_component.cpp +6 -1
- esphome/components/debug/debug_component.h +8 -0
- esphome/components/debug/debug_esp32.cpp +109 -254
- esphome/components/debug/sensor.py +14 -0
- esphome/components/deep_sleep/deep_sleep_esp32.cpp +13 -1
- esphome/components/delonghi/climate.py +2 -9
- esphome/components/demo/__init__.py +18 -20
- esphome/components/dfrobot_sen0395/switch/__init__.py +21 -22
- esphome/components/display/rect.cpp +4 -9
- esphome/components/display/rect.h +1 -1
- esphome/components/dps310/sensor.py +6 -6
- esphome/components/ee895/sensor.py +9 -9
- esphome/components/emmeti/climate.py +2 -9
- esphome/components/endstop/cover.py +17 -16
- esphome/components/endstop/endstop_cover.cpp +2 -1
- esphome/components/ens160_base/__init__.py +12 -9
- esphome/components/esp32/__init__.py +60 -3
- esphome/components/esp32/core.cpp +11 -5
- esphome/components/esp32/gpio.cpp +86 -24
- esphome/components/esp32/gpio.py +15 -16
- esphome/components/esp32/gpio_esp32.py +1 -2
- esphome/components/esp32/gpio_esp32_c2.py +1 -1
- esphome/components/esp32/gpio_esp32_c3.py +1 -1
- esphome/components/esp32/gpio_esp32_c6.py +1 -1
- esphome/components/esp32/gpio_esp32_h2.py +1 -1
- esphome/components/esp32_ble/ble.cpp +1 -8
- esphome/components/esp32_ble/ble.h +5 -3
- esphome/components/esp32_ble/ble_advertising.cpp +2 -1
- esphome/components/esp32_ble/ble_advertising.h +1 -0
- esphome/components/esp32_ble_server/__init__.py +3 -0
- esphome/components/esp32_ble_tracker/__init__.py +7 -1
- esphome/components/esp32_ble_tracker/esp32_ble_tracker.cpp +192 -118
- esphome/components/esp32_ble_tracker/esp32_ble_tracker.h +29 -3
- esphome/components/esp32_camera/__init__.py +1 -1
- esphome/components/esp32_camera/esp32_camera.cpp +2 -10
- esphome/components/esp32_camera/esp32_camera.h +1 -1
- esphome/components/esp32_can/esp32_can.cpp +1 -1
- esphome/components/esp32_improv/esp32_improv_component.cpp +1 -1
- esphome/components/esp32_rmt_led_strip/led_strip.cpp +1 -1
- esphome/components/esp32_rmt_led_strip/led_strip.h +7 -5
- esphome/components/esp32_rmt_led_strip/light.py +9 -1
- esphome/components/esp32_touch/esp32_touch.cpp +1 -1
- esphome/components/esp8266/gpio.cpp +69 -8
- esphome/components/ethernet/ethernet_component.cpp +1 -1
- esphome/components/event/__init__.py +13 -10
- esphome/components/factory_reset/switch/__init__.py +7 -21
- esphome/components/fan/__init__.py +52 -5
- esphome/components/fastled_base/__init__.py +1 -4
- esphome/components/fastled_base/fastled_light.cpp +1 -1
- esphome/components/feedback/cover.py +38 -33
- esphome/components/feedback/feedback_cover.cpp +2 -1
- esphome/components/fujitsu_general/climate.py +2 -9
- esphome/components/gcja5/gcja5.cpp +2 -1
- esphome/components/gpio/one_wire/gpio_one_wire.cpp +45 -43
- esphome/components/gpio/one_wire/gpio_one_wire.h +2 -1
- esphome/components/gpio_expander/cached_gpio.h +22 -7
- esphome/components/gps/__init__.py +47 -17
- esphome/components/gps/gps.cpp +42 -23
- esphome/components/gps/gps.h +17 -13
- esphome/components/graph/__init__.py +1 -2
- esphome/components/gree/climate.py +4 -6
- esphome/components/gree/gree.cpp +16 -2
- esphome/components/gree/gree.h +2 -2
- esphome/components/growatt_solar/growatt_solar.cpp +2 -1
- esphome/components/haier/climate.py +37 -34
- esphome/components/hbridge/fan/__init__.py +19 -17
- esphome/components/he60r/cover.py +4 -5
- esphome/components/heatpumpir/climate.py +3 -6
- esphome/components/hitachi_ac344/climate.py +2 -9
- esphome/components/hitachi_ac424/climate.py +2 -9
- esphome/components/hlw8012/hlw8012.cpp +1 -1
- esphome/components/hm3301/hm3301.h +1 -1
- esphome/components/hte501/sensor.py +6 -6
- esphome/components/http_request/__init__.py +39 -6
- esphome/components/http_request/http_request.cpp +20 -0
- esphome/components/http_request/http_request.h +57 -15
- esphome/components/http_request/http_request_arduino.cpp +22 -6
- esphome/components/http_request/http_request_arduino.h +4 -3
- esphome/components/http_request/http_request_host.cpp +141 -0
- esphome/components/http_request/http_request_host.h +37 -0
- esphome/components/http_request/http_request_idf.cpp +35 -3
- esphome/components/http_request/http_request_idf.h +10 -3
- esphome/components/http_request/httplib.h +9691 -0
- esphome/components/http_request/update/__init__.py +11 -8
- esphome/components/hyt271/sensor.py +6 -6
- esphome/components/i2c/i2c.h +4 -0
- esphome/components/i2c/i2c_bus_esp_idf.cpp +1 -1
- esphome/components/i2s_audio/__init__.py +131 -22
- esphome/components/i2s_audio/i2s_audio.h +44 -4
- esphome/components/i2s_audio/media_player/__init__.py +19 -9
- esphome/components/i2s_audio/microphone/__init__.py +63 -5
- esphome/components/i2s_audio/microphone/i2s_audio_microphone.cpp +351 -61
- esphome/components/i2s_audio/microphone/i2s_audio_microphone.h +40 -6
- esphome/components/i2s_audio/speaker/__init__.py +31 -5
- esphome/components/i2s_audio/speaker/i2s_audio_speaker.cpp +155 -19
- esphome/components/i2s_audio/speaker/i2s_audio_speaker.h +17 -4
- esphome/components/ili9xxx/ili9xxx_init.h +1 -1
- esphome/components/image/__init__.py +37 -17
- esphome/components/image/image.cpp +25 -8
- esphome/components/internal_temperature/internal_temperature.cpp +6 -4
- esphome/components/key_collector/__init__.py +35 -0
- esphome/components/key_collector/key_collector.cpp +8 -0
- esphome/components/key_collector/key_collector.h +10 -0
- esphome/components/kuntze/kuntze.cpp +2 -1
- esphome/components/ld2410/ld2410.h +1 -1
- esphome/components/ld2450/ld2450.h +1 -1
- esphome/components/light/__init__.py +57 -0
- esphome/components/lock/__init__.py +51 -4
- esphome/components/lock/automation.h +2 -13
- esphome/components/logger/__init__.py +22 -0
- esphome/components/logger/logger.cpp +154 -103
- esphome/components/logger/logger.h +211 -36
- esphome/components/logger/task_log_buffer.cpp +138 -0
- esphome/components/logger/task_log_buffer.h +69 -0
- esphome/components/lvgl/__init__.py +13 -5
- esphome/components/lvgl/automation.py +50 -1
- esphome/components/lvgl/defines.py +0 -1
- esphome/components/lvgl/lv_validation.py +10 -1
- esphome/components/lvgl/lvgl_esphome.cpp +5 -1
- esphome/components/lvgl/schemas.py +14 -14
- esphome/components/lvgl/text/__init__.py +1 -2
- esphome/components/lvgl/widgets/arc.py +7 -6
- esphome/components/lvgl/widgets/buttonmatrix.py +3 -3
- esphome/components/lvgl/widgets/checkbox.py +2 -2
- esphome/components/lvgl/widgets/dropdown.py +2 -1
- esphome/components/lvgl/widgets/img.py +15 -12
- esphome/components/mapping/__init__.py +134 -0
- esphome/components/matrix_keypad/matrix_keypad.cpp +2 -1
- esphome/components/max7219digit/max7219digit.cpp +28 -27
- esphome/components/mdns/__init__.py +11 -5
- esphome/components/mdns/mdns_component.cpp +11 -5
- esphome/components/mdns/mdns_component.h +3 -2
- esphome/components/mdns/mdns_esp32.cpp +4 -3
- esphome/components/mdns/mdns_esp8266.cpp +4 -2
- esphome/components/mdns/mdns_libretiny.cpp +4 -2
- esphome/components/mdns/mdns_rp2040.cpp +4 -2
- esphome/components/media_player/__init__.py +40 -6
- esphome/components/mhz19/sensor.py +11 -7
- esphome/components/micro_wake_word/__init__.py +99 -31
- esphome/components/micro_wake_word/automation.h +54 -0
- esphome/components/micro_wake_word/micro_wake_word.cpp +331 -319
- esphome/components/micro_wake_word/micro_wake_word.h +58 -105
- esphome/components/micro_wake_word/preprocessor_settings.h +19 -2
- esphome/components/micro_wake_word/streaming_model.cpp +158 -41
- esphome/components/micro_wake_word/streaming_model.h +85 -13
- esphome/components/microphone/__init__.py +139 -9
- esphome/components/microphone/automation.h +14 -2
- esphome/components/microphone/microphone.cpp +21 -0
- esphome/components/microphone/microphone.h +14 -5
- esphome/components/microphone/microphone_source.cpp +95 -0
- esphome/components/microphone/microphone_source.h +80 -0
- esphome/components/mics_4514/sensor.py +25 -14
- esphome/components/midea/climate.py +3 -4
- esphome/components/midea_ir/climate.py +3 -5
- esphome/components/mipi_spi/__init__.py +15 -0
- esphome/components/mipi_spi/display.py +474 -0
- esphome/components/mipi_spi/mipi_spi.cpp +481 -0
- esphome/components/mipi_spi/mipi_spi.h +171 -0
- esphome/components/mipi_spi/models/__init__.py +65 -0
- esphome/components/mipi_spi/models/amoled.py +72 -0
- esphome/components/mipi_spi/models/commands.py +82 -0
- esphome/components/mipi_spi/models/cyd.py +10 -0
- esphome/components/mipi_spi/models/ili.py +749 -0
- esphome/components/mipi_spi/models/jc.py +260 -0
- esphome/components/mipi_spi/models/lanbon.py +15 -0
- esphome/components/mipi_spi/models/lilygo.py +60 -0
- esphome/components/mipi_spi/models/waveshare.py +139 -0
- esphome/components/mitsubishi/climate.py +2 -5
- esphome/components/mitsubishi/mitsubishi.cpp +9 -9
- esphome/components/mixer/speaker/mixer_speaker.cpp +12 -22
- esphome/components/mixer/speaker/mixer_speaker.h +1 -3
- esphome/components/mlx90393/sensor.py +5 -0
- esphome/components/mlx90393/sensor_mlx90393.cpp +195 -13
- esphome/components/mlx90393/sensor_mlx90393.h +21 -4
- esphome/components/modbus/modbus.cpp +2 -1
- esphome/components/mqtt/__init__.py +1 -1
- esphome/components/mqtt/mqtt_client.cpp +6 -2
- esphome/components/mqtt/mqtt_const.h +4 -0
- esphome/components/mqtt/mqtt_fan.cpp +39 -0
- esphome/components/mqtt/mqtt_fan.h +2 -0
- esphome/components/ms5611/sensor.py +6 -6
- esphome/components/ms8607/sensor.py +3 -3
- esphome/components/network/__init__.py +1 -1
- esphome/components/nextion/base_component.py +17 -16
- esphome/components/nextion/display.py +11 -2
- esphome/components/nextion/nextion.cpp +39 -1
- esphome/components/nextion/nextion.h +50 -0
- esphome/components/noblex/climate.py +2 -9
- esphome/components/number/__init__.py +12 -9
- esphome/components/one_wire/one_wire_bus.cpp +14 -10
- esphome/components/one_wire/one_wire_bus.h +14 -8
- esphome/components/online_image/bmp_image.cpp +48 -11
- esphome/components/online_image/bmp_image.h +2 -0
- esphome/components/opentherm/binary_sensor/__init__.py +2 -4
- esphome/components/opentherm/number/__init__.py +11 -20
- esphome/components/opentherm/sensor/__init__.py +3 -3
- esphome/components/opentherm/switch/__init__.py +3 -5
- esphome/components/output/lock/__init__.py +11 -9
- esphome/components/packages/__init__.py +33 -31
- esphome/components/packet_transport/__init__.py +201 -0
- esphome/components/packet_transport/binary_sensor.py +19 -0
- esphome/components/packet_transport/packet_transport.cpp +534 -0
- esphome/components/packet_transport/packet_transport.h +154 -0
- esphome/components/packet_transport/sensor.py +19 -0
- esphome/components/pca9685/pca9685_output.cpp +2 -1
- esphome/components/pid/climate.py +2 -4
- esphome/components/pm2005/__init__.py +1 -0
- esphome/components/pm2005/pm2005.cpp +123 -0
- esphome/components/pm2005/pm2005.h +46 -0
- esphome/components/pm2005/sensor.py +86 -0
- esphome/components/pmsa003i/pmsa003i.cpp +43 -16
- esphome/components/pmsa003i/pmsa003i.h +25 -25
- esphome/components/pmsx003/pmsx003.cpp +195 -230
- esphome/components/pmsx003/pmsx003.h +51 -33
- esphome/components/pmsx003/sensor.py +21 -11
- esphome/components/pn7150/pn7150.h +2 -2
- esphome/components/pn7160/pn7160.h +2 -2
- esphome/components/prometheus/prometheus_handler.cpp +174 -0
- esphome/components/prometheus/prometheus_handler.h +17 -0
- esphome/components/psram/__init__.py +7 -5
- esphome/components/pulse_meter/pulse_meter_sensor.cpp +32 -12
- esphome/components/pulse_meter/pulse_meter_sensor.h +5 -5
- esphome/components/pzem004t/pzem004t.cpp +2 -1
- esphome/components/qspi_dbi/__init__.py +0 -1
- esphome/components/qspi_dbi/display.py +2 -1
- esphome/components/qspi_dbi/models.py +1 -2
- esphome/components/remote_base/__init__.py +91 -0
- esphome/components/remote_base/beo4_protocol.cpp +153 -0
- esphome/components/remote_base/beo4_protocol.h +43 -0
- esphome/components/remote_base/gobox_protocol.cpp +131 -0
- esphome/components/remote_base/gobox_protocol.h +54 -0
- esphome/components/remote_receiver/remote_receiver_esp32.cpp +16 -9
- esphome/components/resampler/speaker/resampler_speaker.cpp +12 -10
- esphome/components/resampler/speaker/resampler_speaker.h +1 -1
- esphome/components/rf_bridge/rf_bridge.cpp +2 -1
- esphome/components/scd30/sensor.py +2 -3
- esphome/components/scd4x/sensor.py +4 -5
- esphome/components/sdp3x/sensor.py +2 -1
- esphome/components/sds011/sds011.cpp +2 -1
- esphome/components/select/__init__.py +19 -20
- esphome/components/sen5x/sen5x.cpp +55 -36
- esphome/components/sen5x/sensor.py +1 -1
- esphome/components/senseair/sensor.py +3 -3
- esphome/components/sensor/__init__.py +158 -14
- esphome/components/sensor/filter.cpp +23 -0
- esphome/components/sensor/filter.h +22 -0
- esphome/components/sgp30/sensor.py +14 -16
- esphome/components/sgp4x/sensor.py +1 -1
- esphome/components/sht4x/sht4x.cpp +43 -22
- esphome/components/sht4x/sht4x.h +1 -1
- esphome/components/shtcx/sensor.py +6 -6
- esphome/components/slow_pwm/slow_pwm_output.cpp +2 -1
- esphome/components/sml/text_sensor/__init__.py +4 -6
- esphome/components/sound_level/__init__.py +0 -0
- esphome/components/sound_level/sensor.py +97 -0
- esphome/components/sound_level/sound_level.cpp +194 -0
- esphome/components/sound_level/sound_level.h +73 -0
- esphome/components/speaker/media_player/__init__.py +4 -8
- esphome/components/speaker/media_player/speaker_media_player.cpp +0 -18
- esphome/components/speaker/media_player/speaker_media_player.h +0 -11
- esphome/components/speaker/speaker.h +4 -7
- esphome/components/speed/fan/__init__.py +17 -16
- esphome/components/spi/spi.h +11 -1
- esphome/components/sprinkler/__init__.py +18 -19
- esphome/components/sprinkler/sprinkler.cpp +6 -5
- esphome/components/switch/__init__.py +32 -42
- esphome/components/syslog/__init__.py +41 -0
- esphome/components/syslog/esphome_syslog.cpp +49 -0
- esphome/components/syslog/esphome_syslog.h +27 -0
- esphome/components/t6615/sensor.py +3 -3
- esphome/components/t6615/t6615.cpp +2 -1
- esphome/components/tca9555/tca9555.cpp +11 -6
- esphome/components/tcl112/climate.py +2 -9
- esphome/components/template/alarm_control_panel/__init__.py +7 -6
- esphome/components/template/alarm_control_panel/template_alarm_control_panel.cpp +21 -17
- esphome/components/template/alarm_control_panel/template_alarm_control_panel.h +2 -1
- esphome/components/template/cover/__init__.py +27 -21
- esphome/components/template/fan/__init__.py +14 -12
- esphome/components/template/lock/__init__.py +20 -25
- esphome/components/template/lock/automation.h +18 -0
- esphome/components/template/text/__init__.py +4 -3
- esphome/components/template/valve/__init__.py +32 -21
- esphome/components/template/valve/automation.h +24 -0
- esphome/components/text/__init__.py +32 -1
- esphome/components/text_sensor/__init__.py +24 -29
- esphome/components/thermostat/climate.py +5 -5
- esphome/components/time_based/cover.py +17 -16
- esphome/components/time_based/time_based_cover.cpp +2 -1
- esphome/components/tm1638/switch/__init__.py +10 -7
- esphome/components/tormatic/cover.py +4 -5
- esphome/components/toshiba/climate.py +3 -5
- esphome/components/touchscreen/touchscreen.cpp +3 -1
- esphome/components/tt21100/touchscreen/tt21100.cpp +1 -1
- esphome/components/tuya/climate/__init__.py +5 -6
- esphome/components/tuya/cover/__init__.py +6 -11
- esphome/components/tuya/select/__init__.py +15 -5
- esphome/components/tuya/select/tuya_select.cpp +6 -1
- esphome/components/tuya/select/tuya_select.h +5 -1
- esphome/components/uart/packet_transport/__init__.py +20 -0
- esphome/components/uart/packet_transport/uart_transport.cpp +88 -0
- esphome/components/uart/packet_transport/uart_transport.h +41 -0
- esphome/components/uart/switch/uart_switch.cpp +2 -1
- esphome/components/udp/__init__.py +126 -128
- esphome/components/udp/automation.h +40 -0
- esphome/components/udp/binary_sensor.py +3 -25
- esphome/components/udp/packet_transport/__init__.py +29 -0
- esphome/components/udp/packet_transport/udp_transport.cpp +36 -0
- esphome/components/udp/packet_transport/udp_transport.h +28 -0
- esphome/components/udp/sensor.py +3 -25
- esphome/components/udp/udp_component.cpp +26 -470
- esphome/components/udp/udp_component.h +21 -128
- esphome/components/update/__init__.py +31 -1
- esphome/components/uponor_smatrix/climate/__init__.py +4 -9
- esphome/components/uponor_smatrix/climate/uponor_smatrix_climate.cpp +2 -1
- esphome/components/uponor_smatrix/uponor_smatrix.cpp +2 -1
- esphome/components/uptime/text_sensor/__init__.py +47 -7
- esphome/components/uptime/text_sensor/uptime_text_sensor.cpp +12 -7
- esphome/components/uptime/text_sensor/uptime_text_sensor.h +19 -0
- esphome/components/valve/__init__.py +34 -3
- esphome/components/valve/automation.h +1 -19
- esphome/components/vl53l0x/sensor.py +11 -0
- esphome/components/vl53l0x/vl53l0x_sensor.cpp +5 -1
- esphome/components/vl53l0x/vl53l0x_sensor.h +2 -1
- esphome/components/voice_assistant/__init__.py +36 -10
- esphome/components/voice_assistant/voice_assistant.cpp +170 -144
- esphome/components/voice_assistant/voice_assistant.h +26 -25
- esphome/components/waveshare_epaper/display.py +6 -0
- esphome/components/waveshare_epaper/waveshare_epaper.cpp +439 -37
- esphome/components/waveshare_epaper/waveshare_epaper.h +60 -11
- esphome/components/weikai/weikai.cpp +0 -52
- esphome/components/whirlpool/climate.py +3 -5
- esphome/components/whynter/climate.py +3 -5
- esphome/components/xpt2046/touchscreen/xpt2046.cpp +1 -1
- esphome/components/yashima/climate.py +6 -6
- esphome/components/zhlt01/climate.py +2 -7
- esphome/config.py +13 -13
- esphome/config_validation.py +38 -58
- esphome/const.py +15 -1
- esphome/core/__init__.py +2 -0
- esphome/core/application.cpp +27 -10
- esphome/core/application.h +9 -1
- esphome/core/automation.h +4 -3
- esphome/core/component.cpp +28 -7
- esphome/core/component.h +10 -1
- esphome/core/defines.h +23 -17
- esphome/core/doxygen.h +13 -0
- esphome/core/macros.h +4 -0
- esphome/core/scheduler.cpp +7 -1
- esphome/cpp_generator.py +6 -2
- esphome/dashboard/web_server.py +3 -3
- esphome/helpers.py +39 -0
- esphome/loader.py +4 -0
- esphome/log.py +15 -19
- esphome/mqtt.py +23 -10
- esphome/platformio_api.py +1 -1
- esphome/schema_extractors.py +0 -1
- esphome/voluptuous_schema.py +3 -1
- esphome/vscode.py +15 -0
- esphome/wizard.py +47 -37
- esphome/zeroconf.py +7 -3
- {esphome-2025.4.1.dist-info → esphome-2025.5.0.dist-info}/METADATA +10 -11
- {esphome-2025.4.1.dist-info → esphome-2025.5.0.dist-info}/RECORD +456 -396
- {esphome-2025.4.1.dist-info → esphome-2025.5.0.dist-info}/WHEEL +1 -1
- esphome/components/esp32_ble/const_esp32c6.h +0 -74
- {esphome-2025.4.1.dist-info → esphome-2025.5.0.dist-info}/entry_points.txt +0 -0
- {esphome-2025.4.1.dist-info → esphome-2025.5.0.dist-info}/licenses/LICENSE +0 -0
- {esphome-2025.4.1.dist-info → esphome-2025.5.0.dist-info}/top_level.txt +0 -0
@@ -4,7 +4,6 @@ import esphome.codegen as cg
|
|
4
4
|
from esphome.components import number, switch
|
5
5
|
import esphome.config_validation as cv
|
6
6
|
from esphome.const import (
|
7
|
-
CONF_ENTITY_CATEGORY,
|
8
7
|
CONF_ID,
|
9
8
|
CONF_INITIAL_VALUE,
|
10
9
|
CONF_MAX_VALUE,
|
@@ -296,12 +295,11 @@ SPRINKLER_VALVE_SCHEMA = cv.Schema(
|
|
296
295
|
cv.Optional(CONF_PUMP_SWITCH_ID): cv.use_id(switch.Switch),
|
297
296
|
cv.Optional(CONF_RUN_DURATION): cv.positive_time_period_seconds,
|
298
297
|
cv.Optional(CONF_RUN_DURATION_NUMBER): cv.maybe_simple_value(
|
299
|
-
number.
|
298
|
+
number.number_schema(
|
299
|
+
SprinklerControllerNumber, entity_category=ENTITY_CATEGORY_CONFIG
|
300
|
+
)
|
301
|
+
.extend(
|
300
302
|
{
|
301
|
-
cv.GenerateID(): cv.declare_id(SprinklerControllerNumber),
|
302
|
-
cv.Optional(
|
303
|
-
CONF_ENTITY_CATEGORY, default=ENTITY_CATEGORY_CONFIG
|
304
|
-
): cv.entity_category,
|
305
303
|
cv.Optional(CONF_INITIAL_VALUE, default=900): cv.positive_int,
|
306
304
|
cv.Optional(CONF_MAX_VALUE, default=86400): cv.positive_int,
|
307
305
|
cv.Optional(CONF_MIN_VALUE, default=1): cv.positive_int,
|
@@ -314,7 +312,8 @@ SPRINKLER_VALVE_SCHEMA = cv.Schema(
|
|
314
312
|
CONF_UNIT_OF_MEASUREMENT, default=UNIT_SECOND
|
315
313
|
): cv.one_of(UNIT_MINUTE, UNIT_SECOND, lower="True"),
|
316
314
|
}
|
317
|
-
)
|
315
|
+
)
|
316
|
+
.extend(cv.COMPONENT_SCHEMA),
|
318
317
|
validate_min_max,
|
319
318
|
key=CONF_NAME,
|
320
319
|
),
|
@@ -371,12 +370,11 @@ SPRINKLER_CONTROLLER_SCHEMA = cv.Schema(
|
|
371
370
|
cv.Optional(CONF_NEXT_PREV_IGNORE_DISABLED, default=False): cv.boolean,
|
372
371
|
cv.Optional(CONF_MANUAL_SELECTION_DELAY): cv.positive_time_period_seconds,
|
373
372
|
cv.Optional(CONF_MULTIPLIER_NUMBER): cv.maybe_simple_value(
|
374
|
-
number.
|
373
|
+
number.number_schema(
|
374
|
+
SprinklerControllerNumber, entity_category=ENTITY_CATEGORY_CONFIG
|
375
|
+
)
|
376
|
+
.extend(
|
375
377
|
{
|
376
|
-
cv.GenerateID(): cv.declare_id(SprinklerControllerNumber),
|
377
|
-
cv.Optional(
|
378
|
-
CONF_ENTITY_CATEGORY, default=ENTITY_CATEGORY_CONFIG
|
379
|
-
): cv.entity_category,
|
380
378
|
cv.Optional(CONF_INITIAL_VALUE, default=1): cv.positive_float,
|
381
379
|
cv.Optional(CONF_MAX_VALUE, default=10): cv.positive_float,
|
382
380
|
cv.Optional(CONF_MIN_VALUE, default=0): cv.positive_float,
|
@@ -386,18 +384,18 @@ SPRINKLER_CONTROLLER_SCHEMA = cv.Schema(
|
|
386
384
|
single=True
|
387
385
|
),
|
388
386
|
}
|
389
|
-
)
|
387
|
+
)
|
388
|
+
.extend(cv.COMPONENT_SCHEMA),
|
390
389
|
validate_min_max,
|
391
390
|
key=CONF_NAME,
|
392
391
|
),
|
393
392
|
cv.Optional(CONF_REPEAT): cv.positive_int,
|
394
393
|
cv.Optional(CONF_REPEAT_NUMBER): cv.maybe_simple_value(
|
395
|
-
number.
|
394
|
+
number.number_schema(
|
395
|
+
SprinklerControllerNumber, entity_category=ENTITY_CATEGORY_CONFIG
|
396
|
+
)
|
397
|
+
.extend(
|
396
398
|
{
|
397
|
-
cv.GenerateID(): cv.declare_id(SprinklerControllerNumber),
|
398
|
-
cv.Optional(
|
399
|
-
CONF_ENTITY_CATEGORY, default=ENTITY_CATEGORY_CONFIG
|
400
|
-
): cv.entity_category,
|
401
399
|
cv.Optional(CONF_INITIAL_VALUE, default=0): cv.positive_int,
|
402
400
|
cv.Optional(CONF_MAX_VALUE, default=10): cv.positive_int,
|
403
401
|
cv.Optional(CONF_MIN_VALUE, default=0): cv.positive_int,
|
@@ -407,7 +405,8 @@ SPRINKLER_CONTROLLER_SCHEMA = cv.Schema(
|
|
407
405
|
single=True
|
408
406
|
),
|
409
407
|
}
|
410
|
-
)
|
408
|
+
)
|
409
|
+
.extend(cv.COMPONENT_SCHEMA),
|
411
410
|
validate_min_max,
|
412
411
|
key=CONF_NAME,
|
413
412
|
),
|
@@ -20,7 +20,7 @@ SprinklerSwitch::SprinklerSwitch(switch_::Switch *off_switch, switch_::Switch *o
|
|
20
20
|
bool SprinklerSwitch::is_latching_valve() { return (this->off_switch_ != nullptr) && (this->on_switch_ != nullptr); }
|
21
21
|
|
22
22
|
void SprinklerSwitch::loop() {
|
23
|
-
if ((this->pinned_millis_) && (
|
23
|
+
if ((this->pinned_millis_) && (App.get_loop_component_start_time() > this->pinned_millis_ + this->pulse_duration_)) {
|
24
24
|
this->pinned_millis_ = 0; // reset tracker
|
25
25
|
if (this->off_switch_->state) {
|
26
26
|
this->off_switch_->turn_off();
|
@@ -148,22 +148,23 @@ SprinklerValveOperator::SprinklerValveOperator(SprinklerValve *valve, Sprinkler
|
|
148
148
|
: controller_(controller), valve_(valve) {}
|
149
149
|
|
150
150
|
void SprinklerValveOperator::loop() {
|
151
|
-
|
151
|
+
uint32_t now = App.get_loop_component_start_time();
|
152
|
+
if (now >= this->start_millis_) { // dummy check
|
152
153
|
switch (this->state_) {
|
153
154
|
case STARTING:
|
154
|
-
if (
|
155
|
+
if (now > (this->start_millis_ + this->start_delay_)) {
|
155
156
|
this->run_(); // start_delay_ has been exceeded, so ensure both valves are on and update the state
|
156
157
|
}
|
157
158
|
break;
|
158
159
|
|
159
160
|
case ACTIVE:
|
160
|
-
if (
|
161
|
+
if (now > (this->start_millis_ + this->start_delay_ + this->run_duration_)) {
|
161
162
|
this->stop(); // start_delay_ + run_duration_ has been exceeded, start shutting down
|
162
163
|
}
|
163
164
|
break;
|
164
165
|
|
165
166
|
case STOPPING:
|
166
|
-
if (
|
167
|
+
if (now > (this->stop_millis_ + this->stop_delay_)) {
|
167
168
|
this->kill_(); // stop_delay_has been exceeded, ensure all valves are off
|
168
169
|
}
|
169
170
|
break;
|
@@ -72,6 +72,9 @@ _SWITCH_SCHEMA = (
|
|
72
72
|
{
|
73
73
|
cv.OnlyWith(CONF_MQTT_ID, "mqtt"): cv.declare_id(mqtt.MQTTSwitchComponent),
|
74
74
|
cv.Optional(CONF_INVERTED): cv.boolean,
|
75
|
+
cv.Optional(CONF_RESTORE_MODE, default="ALWAYS_OFF"): cv.enum(
|
76
|
+
RESTORE_MODES, upper=True, space="_"
|
77
|
+
),
|
75
78
|
cv.Optional(CONF_ON_TURN_ON): automation.validate_automation(
|
76
79
|
{
|
77
80
|
cv.GenerateID(CONF_TRIGGER_ID): cv.declare_id(SwitchTurnOnTrigger),
|
@@ -87,57 +90,44 @@ _SWITCH_SCHEMA = (
|
|
87
90
|
)
|
88
91
|
)
|
89
92
|
|
90
|
-
_UNDEF = object()
|
91
|
-
|
92
93
|
|
93
94
|
def switch_schema(
|
94
|
-
class_: MockObjClass
|
95
|
+
class_: MockObjClass,
|
95
96
|
*,
|
96
|
-
entity_category: str = _UNDEF,
|
97
|
-
device_class: str = _UNDEF,
|
98
|
-
icon: str = _UNDEF,
|
99
97
|
block_inverted: bool = False,
|
100
|
-
default_restore_mode: str =
|
98
|
+
default_restore_mode: str = cv.UNDEFINED,
|
99
|
+
device_class: str = cv.UNDEFINED,
|
100
|
+
entity_category: str = cv.UNDEFINED,
|
101
|
+
icon: str = cv.UNDEFINED,
|
101
102
|
):
|
102
|
-
schema =
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
if device_class is not _UNDEF:
|
120
|
-
schema = schema.extend(
|
121
|
-
{
|
122
|
-
cv.Optional(
|
123
|
-
CONF_DEVICE_CLASS, default=device_class
|
124
|
-
): validate_device_class
|
125
|
-
}
|
126
|
-
)
|
127
|
-
if icon is not _UNDEF:
|
128
|
-
schema = schema.extend({cv.Optional(CONF_ICON, default=icon): cv.icon})
|
103
|
+
schema = {cv.GenerateID(): cv.declare_id(class_)}
|
104
|
+
|
105
|
+
for key, default, validator in [
|
106
|
+
(CONF_DEVICE_CLASS, device_class, validate_device_class),
|
107
|
+
(CONF_ENTITY_CATEGORY, entity_category, cv.entity_category),
|
108
|
+
(CONF_ICON, icon, cv.icon),
|
109
|
+
(
|
110
|
+
CONF_RESTORE_MODE,
|
111
|
+
default_restore_mode,
|
112
|
+
cv.enum(RESTORE_MODES, upper=True, space="_")
|
113
|
+
if default_restore_mode is not cv.UNDEFINED
|
114
|
+
else cv.UNDEFINED,
|
115
|
+
),
|
116
|
+
]:
|
117
|
+
if default is not cv.UNDEFINED:
|
118
|
+
schema[cv.Optional(key, default=default)] = validator
|
119
|
+
|
129
120
|
if block_inverted:
|
130
|
-
schema =
|
131
|
-
|
132
|
-
cv.Optional(CONF_INVERTED): cv.invalid(
|
133
|
-
"Inverted is not supported for this platform!"
|
134
|
-
)
|
135
|
-
}
|
121
|
+
schema[cv.Optional(CONF_INVERTED)] = cv.invalid(
|
122
|
+
"Inverted is not supported for this platform!"
|
136
123
|
)
|
137
|
-
|
124
|
+
|
125
|
+
return _SWITCH_SCHEMA.extend(schema)
|
138
126
|
|
139
127
|
|
140
|
-
|
128
|
+
# Remove before 2025.11.0
|
129
|
+
SWITCH_SCHEMA = switch_schema(Switch)
|
130
|
+
SWITCH_SCHEMA.add_extra(cv.deprecated_schema_constant("switch"))
|
141
131
|
|
142
132
|
|
143
133
|
async def setup_switch_core_(var, config):
|
@@ -0,0 +1,41 @@
|
|
1
|
+
import esphome.codegen as cg
|
2
|
+
from esphome.components import udp
|
3
|
+
from esphome.components.logger import LOG_LEVELS, is_log_level
|
4
|
+
from esphome.components.time import RealTimeClock
|
5
|
+
from esphome.components.udp import CONF_UDP_ID
|
6
|
+
import esphome.config_validation as cv
|
7
|
+
from esphome.const import CONF_ID, CONF_LEVEL, CONF_PORT, CONF_TIME_ID
|
8
|
+
from esphome.cpp_types import Component, Parented
|
9
|
+
|
10
|
+
CODEOWNERS = ["@clydebarrow"]
|
11
|
+
|
12
|
+
DEPENDENCIES = ["udp", "logger", "time"]
|
13
|
+
|
14
|
+
syslog_ns = cg.esphome_ns.namespace("syslog")
|
15
|
+
Syslog = syslog_ns.class_("Syslog", Component, Parented.template(udp.UDPComponent))
|
16
|
+
|
17
|
+
CONF_STRIP = "strip"
|
18
|
+
CONF_FACILITY = "facility"
|
19
|
+
CONFIG_SCHEMA = udp.UDP_SCHEMA.extend(
|
20
|
+
{
|
21
|
+
cv.GenerateID(): cv.declare_id(Syslog),
|
22
|
+
cv.GenerateID(CONF_TIME_ID): cv.use_id(RealTimeClock),
|
23
|
+
cv.Optional(CONF_PORT, default=514): cv.port,
|
24
|
+
cv.Optional(CONF_LEVEL, default="DEBUG"): is_log_level,
|
25
|
+
cv.Optional(CONF_STRIP, default=True): cv.boolean,
|
26
|
+
cv.Optional(CONF_FACILITY, default=16): cv.int_range(0, 23),
|
27
|
+
}
|
28
|
+
)
|
29
|
+
|
30
|
+
|
31
|
+
async def to_code(config):
|
32
|
+
parent = await cg.get_variable(config[CONF_UDP_ID])
|
33
|
+
time = await cg.get_variable(config[CONF_TIME_ID])
|
34
|
+
cg.add(parent.set_broadcast_port(config[CONF_PORT]))
|
35
|
+
cg.add(parent.set_should_broadcast())
|
36
|
+
level = LOG_LEVELS[config[CONF_LEVEL]]
|
37
|
+
var = cg.new_Pvariable(config[CONF_ID], level, time)
|
38
|
+
await cg.register_component(var, config)
|
39
|
+
await cg.register_parented(var, parent)
|
40
|
+
cg.add(var.set_strip(config[CONF_STRIP]))
|
41
|
+
cg.add(var.set_facility(config[CONF_FACILITY]))
|
@@ -0,0 +1,49 @@
|
|
1
|
+
#include "esphome_syslog.h"
|
2
|
+
|
3
|
+
#include "esphome/components/logger/logger.h"
|
4
|
+
#include "esphome/core/application.h"
|
5
|
+
#include "esphome/core/time.h"
|
6
|
+
|
7
|
+
namespace esphome {
|
8
|
+
namespace syslog {
|
9
|
+
|
10
|
+
// Map log levels to syslog severity using an array, indexed by ESPHome log level (1-7)
|
11
|
+
constexpr int LOG_LEVEL_TO_SYSLOG_SEVERITY[] = {
|
12
|
+
3, // NONE
|
13
|
+
3, // ERROR
|
14
|
+
4, // WARN
|
15
|
+
5, // INFO
|
16
|
+
6, // CONFIG
|
17
|
+
7, // DEBUG
|
18
|
+
7, // VERBOSE
|
19
|
+
7 // VERY_VERBOSE
|
20
|
+
};
|
21
|
+
|
22
|
+
void Syslog::setup() {
|
23
|
+
logger::global_logger->add_on_log_callback(
|
24
|
+
[this](int level, const char *tag, const char *message) { this->log_(level, tag, message); });
|
25
|
+
}
|
26
|
+
|
27
|
+
void Syslog::log_(const int level, const char *tag, const char *message) const {
|
28
|
+
if (level > this->log_level_)
|
29
|
+
return;
|
30
|
+
// Syslog PRI calculation: facility * 8 + severity
|
31
|
+
int severity = 7;
|
32
|
+
if ((unsigned) level <= 7) {
|
33
|
+
severity = LOG_LEVEL_TO_SYSLOG_SEVERITY[level];
|
34
|
+
}
|
35
|
+
int pri = this->facility_ * 8 + severity;
|
36
|
+
auto timestamp = this->time_->now().strftime("%b %d %H:%M:%S");
|
37
|
+
unsigned len = strlen(message);
|
38
|
+
// remove color formatting
|
39
|
+
if (this->strip_ && message[0] == 0x1B && len > 11) {
|
40
|
+
message += 7;
|
41
|
+
len -= 11;
|
42
|
+
}
|
43
|
+
|
44
|
+
auto data = str_sprintf("<%d>%s %s %s: %.*s", pri, timestamp.c_str(), App.get_name().c_str(), tag, len, message);
|
45
|
+
this->parent_->send_packet((const uint8_t *) data.data(), data.size());
|
46
|
+
}
|
47
|
+
|
48
|
+
} // namespace syslog
|
49
|
+
} // namespace esphome
|
@@ -0,0 +1,27 @@
|
|
1
|
+
#pragma once
|
2
|
+
#include "esphome/core/component.h"
|
3
|
+
#include "esphome/core/helpers.h"
|
4
|
+
#include "esphome/core/log.h"
|
5
|
+
#include "esphome/components/udp/udp_component.h"
|
6
|
+
#include "esphome/components/time/real_time_clock.h"
|
7
|
+
|
8
|
+
#ifdef USE_NETWORK
|
9
|
+
namespace esphome {
|
10
|
+
namespace syslog {
|
11
|
+
class Syslog : public Component, public Parented<udp::UDPComponent> {
|
12
|
+
public:
|
13
|
+
Syslog(int level, time::RealTimeClock *time) : log_level_(level), time_(time) {}
|
14
|
+
void setup() override;
|
15
|
+
void set_strip(bool strip) { this->strip_ = strip; }
|
16
|
+
void set_facility(int facility) { this->facility_ = facility; }
|
17
|
+
|
18
|
+
protected:
|
19
|
+
int log_level_;
|
20
|
+
void log_(int level, const char *tag, const char *message) const;
|
21
|
+
time::RealTimeClock *time_;
|
22
|
+
bool strip_{true};
|
23
|
+
int facility_{16};
|
24
|
+
};
|
25
|
+
} // namespace syslog
|
26
|
+
} // namespace esphome
|
27
|
+
#endif
|
@@ -19,7 +19,7 @@ CONFIG_SCHEMA = (
|
|
19
19
|
cv.Schema(
|
20
20
|
{
|
21
21
|
cv.GenerateID(): cv.declare_id(T6615Component),
|
22
|
-
cv.
|
22
|
+
cv.Optional(CONF_CO2): sensor.sensor_schema(
|
23
23
|
unit_of_measurement=UNIT_PARTS_PER_MILLION,
|
24
24
|
accuracy_decimals=0,
|
25
25
|
device_class=DEVICE_CLASS_CARBON_DIOXIDE,
|
@@ -41,6 +41,6 @@ async def to_code(config):
|
|
41
41
|
await cg.register_component(var, config)
|
42
42
|
await uart.register_uart_device(var, config)
|
43
43
|
|
44
|
-
if
|
45
|
-
sens = await sensor.new_sensor(
|
44
|
+
if co2 := config.get(CONF_CO2):
|
45
|
+
sens = await sensor.new_sensor(co2)
|
46
46
|
cg.add(var.set_co2_sensor(sens))
|
@@ -63,7 +63,8 @@ void T6615Component::loop() {
|
|
63
63
|
case T6615Command::GET_PPM: {
|
64
64
|
const uint16_t ppm = encode_uint16(response_buffer[3], response_buffer[4]);
|
65
65
|
ESP_LOGD(TAG, "T6615 Received CO₂=%uppm", ppm);
|
66
|
-
this->co2_sensor_
|
66
|
+
if (this->co2_sensor_ != nullptr)
|
67
|
+
this->co2_sensor_->publish_state(ppm);
|
67
68
|
break;
|
68
69
|
}
|
69
70
|
default:
|
@@ -76,15 +76,20 @@ bool TCA9555Component::read_gpio_modes_() {
|
|
76
76
|
bool TCA9555Component::digital_read_hw(uint8_t pin) {
|
77
77
|
if (this->is_failed())
|
78
78
|
return false;
|
79
|
-
|
80
|
-
uint8_t
|
81
|
-
|
82
|
-
this->
|
83
|
-
|
84
|
-
if (!success) {
|
79
|
+
uint8_t data;
|
80
|
+
uint8_t bank_number = pin < 8 ? 0 : 1;
|
81
|
+
uint8_t register_to_read = bank_number ? TCA9555_INPUT_PORT_REGISTER_1 : TCA9555_INPUT_PORT_REGISTER_0;
|
82
|
+
if (!this->read_bytes(register_to_read, &data, 1)) {
|
85
83
|
this->status_set_warning("Failed to read input register");
|
86
84
|
return false;
|
87
85
|
}
|
86
|
+
uint8_t second_half = this->input_mask_ >> 8;
|
87
|
+
uint8_t first_half = this->input_mask_;
|
88
|
+
if (bank_number) {
|
89
|
+
this->input_mask_ = (data << 8) | (uint16_t(first_half) << 0);
|
90
|
+
} else {
|
91
|
+
this->input_mask_ = (uint16_t(second_half) << 8) | (data << 0);
|
92
|
+
}
|
88
93
|
|
89
94
|
this->status_clear_warning();
|
90
95
|
return true;
|
@@ -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
|
tcl112_ns = cg.esphome_ns.namespace("tcl112")
|
10
8
|
Tcl112Climate = tcl112_ns.class_("Tcl112Climate", climate_ir.ClimateIR)
|
11
9
|
|
12
|
-
CONFIG_SCHEMA = climate_ir.
|
13
|
-
{
|
14
|
-
cv.GenerateID(): cv.declare_id(Tcl112Climate),
|
15
|
-
}
|
16
|
-
)
|
10
|
+
CONFIG_SCHEMA = climate_ir.climate_ir_with_receiver_schema(Tcl112Climate)
|
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)
|
@@ -1,7 +1,7 @@
|
|
1
1
|
import esphome.codegen as cg
|
2
2
|
from esphome.components import alarm_control_panel, binary_sensor
|
3
3
|
import esphome.config_validation as cv
|
4
|
-
from esphome.const import CONF_BINARY_SENSORS,
|
4
|
+
from esphome.const import CONF_BINARY_SENSORS, CONF_INPUT, CONF_RESTORE_MODE
|
5
5
|
|
6
6
|
from .. import template_ns
|
7
7
|
|
@@ -51,6 +51,7 @@ ALARM_SENSOR_TYPES = {
|
|
51
51
|
"DELAYED": AlarmSensorType.ALARM_SENSOR_TYPE_DELAYED,
|
52
52
|
"INSTANT": AlarmSensorType.ALARM_SENSOR_TYPE_INSTANT,
|
53
53
|
"DELAYED_FOLLOWER": AlarmSensorType.ALARM_SENSOR_TYPE_DELAYED_FOLLOWER,
|
54
|
+
"INSTANT_ALWAYS": AlarmSensorType.ALARM_SENSOR_TYPE_INSTANT_ALWAYS,
|
54
55
|
}
|
55
56
|
|
56
57
|
|
@@ -76,9 +77,9 @@ TEMPLATE_ALARM_CONTROL_PANEL_BINARY_SENSOR_SCHEMA = cv.maybe_simple_value(
|
|
76
77
|
)
|
77
78
|
|
78
79
|
TEMPLATE_ALARM_CONTROL_PANEL_SCHEMA = (
|
79
|
-
alarm_control_panel.
|
80
|
+
alarm_control_panel.alarm_control_panel_schema(TemplateAlarmControlPanel)
|
81
|
+
.extend(
|
80
82
|
{
|
81
|
-
cv.GenerateID(): cv.declare_id(TemplateAlarmControlPanel),
|
82
83
|
cv.Optional(CONF_CODES): cv.ensure_list(cv.string_strict),
|
83
84
|
cv.Optional(CONF_REQUIRES_CODE_TO_ARM): cv.boolean,
|
84
85
|
cv.Optional(CONF_ARMING_HOME_TIME): cv.positive_time_period_milliseconds,
|
@@ -99,7 +100,8 @@ TEMPLATE_ALARM_CONTROL_PANEL_SCHEMA = (
|
|
99
100
|
RESTORE_MODES, upper=True
|
100
101
|
),
|
101
102
|
}
|
102
|
-
)
|
103
|
+
)
|
104
|
+
.extend(cv.COMPONENT_SCHEMA)
|
103
105
|
)
|
104
106
|
|
105
107
|
CONFIG_SCHEMA = cv.All(
|
@@ -109,9 +111,8 @@ CONFIG_SCHEMA = cv.All(
|
|
109
111
|
|
110
112
|
|
111
113
|
async def to_code(config):
|
112
|
-
var =
|
114
|
+
var = await alarm_control_panel.new_alarm_control_panel(config)
|
113
115
|
await cg.register_component(var, config)
|
114
|
-
await alarm_control_panel.register_alarm_control_panel(var, config)
|
115
116
|
if CONF_CODES in config:
|
116
117
|
for acode in config[CONF_CODES]:
|
117
118
|
cg.add(var.add_code(acode))
|
@@ -58,6 +58,9 @@ void TemplateAlarmControlPanel::dump_config() {
|
|
58
58
|
case ALARM_SENSOR_TYPE_DELAYED_FOLLOWER:
|
59
59
|
sensor_type = "delayed_follower";
|
60
60
|
break;
|
61
|
+
case ALARM_SENSOR_TYPE_INSTANT_ALWAYS:
|
62
|
+
sensor_type = "instant_always";
|
63
|
+
break;
|
61
64
|
case ALARM_SENSOR_TYPE_DELAYED:
|
62
65
|
default:
|
63
66
|
sensor_type = "delayed";
|
@@ -145,24 +148,25 @@ void TemplateAlarmControlPanel::loop() {
|
|
145
148
|
continue;
|
146
149
|
}
|
147
150
|
|
148
|
-
|
149
|
-
|
150
|
-
instant_sensor_not_ready = true;
|
151
|
-
break;
|
152
|
-
}
|
153
|
-
// If sensor type is of type interior follower
|
154
|
-
if (sensor_info.second.type == ALARM_SENSOR_TYPE_DELAYED_FOLLOWER) {
|
155
|
-
// Look to see if we are in the pending state
|
156
|
-
if (this->current_state_ == ACP_STATE_PENDING) {
|
157
|
-
delayed_sensor_not_ready = true;
|
158
|
-
} else {
|
151
|
+
switch (sensor_info.second.type) {
|
152
|
+
case ALARM_SENSOR_TYPE_INSTANT:
|
159
153
|
instant_sensor_not_ready = true;
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
154
|
+
break;
|
155
|
+
case ALARM_SENSOR_TYPE_INSTANT_ALWAYS:
|
156
|
+
instant_sensor_not_ready = true;
|
157
|
+
future_state = ACP_STATE_TRIGGERED;
|
158
|
+
break;
|
159
|
+
case ALARM_SENSOR_TYPE_DELAYED_FOLLOWER:
|
160
|
+
// Look to see if we are in the pending state
|
161
|
+
if (this->current_state_ == ACP_STATE_PENDING) {
|
162
|
+
delayed_sensor_not_ready = true;
|
163
|
+
} else {
|
164
|
+
instant_sensor_not_ready = true;
|
165
|
+
}
|
166
|
+
break;
|
167
|
+
case ALARM_SENSOR_TYPE_DELAYED:
|
168
|
+
default:
|
169
|
+
delayed_sensor_not_ready = true;
|
166
170
|
}
|
167
171
|
}
|
168
172
|
}
|
@@ -27,7 +27,8 @@ enum BinarySensorFlags : uint16_t {
|
|
27
27
|
enum AlarmSensorType : uint16_t {
|
28
28
|
ALARM_SENSOR_TYPE_DELAYED = 0,
|
29
29
|
ALARM_SENSOR_TYPE_INSTANT,
|
30
|
-
ALARM_SENSOR_TYPE_DELAYED_FOLLOWER
|
30
|
+
ALARM_SENSOR_TYPE_DELAYED_FOLLOWER,
|
31
|
+
ALARM_SENSOR_TYPE_INSTANT_ALWAYS,
|
31
32
|
};
|
32
33
|
|
33
34
|
#endif
|
@@ -34,31 +34,37 @@ RESTORE_MODES = {
|
|
34
34
|
CONF_HAS_POSITION = "has_position"
|
35
35
|
CONF_TOGGLE_ACTION = "toggle_action"
|
36
36
|
|
37
|
-
CONFIG_SCHEMA =
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
)
|
37
|
+
CONFIG_SCHEMA = (
|
38
|
+
cover.cover_schema(TemplateCover)
|
39
|
+
.extend(
|
40
|
+
{
|
41
|
+
cv.Optional(CONF_LAMBDA): cv.returning_lambda,
|
42
|
+
cv.Optional(CONF_OPTIMISTIC, default=False): cv.boolean,
|
43
|
+
cv.Optional(CONF_ASSUMED_STATE, default=False): cv.boolean,
|
44
|
+
cv.Optional(CONF_HAS_POSITION, default=False): cv.boolean,
|
45
|
+
cv.Optional(CONF_OPEN_ACTION): automation.validate_automation(single=True),
|
46
|
+
cv.Optional(CONF_CLOSE_ACTION): automation.validate_automation(single=True),
|
47
|
+
cv.Optional(CONF_STOP_ACTION): automation.validate_automation(single=True),
|
48
|
+
cv.Optional(CONF_TILT_ACTION): automation.validate_automation(single=True),
|
49
|
+
cv.Optional(CONF_TILT_LAMBDA): cv.returning_lambda,
|
50
|
+
cv.Optional(CONF_TOGGLE_ACTION): automation.validate_automation(
|
51
|
+
single=True
|
52
|
+
),
|
53
|
+
cv.Optional(CONF_POSITION_ACTION): automation.validate_automation(
|
54
|
+
single=True
|
55
|
+
),
|
56
|
+
cv.Optional(CONF_RESTORE_MODE, default="RESTORE"): cv.enum(
|
57
|
+
RESTORE_MODES, upper=True
|
58
|
+
),
|
59
|
+
}
|
60
|
+
)
|
61
|
+
.extend(cv.COMPONENT_SCHEMA)
|
62
|
+
)
|
56
63
|
|
57
64
|
|
58
65
|
async def to_code(config):
|
59
|
-
var =
|
66
|
+
var = await cover.new_cover(config)
|
60
67
|
await cg.register_component(var, config)
|
61
|
-
await cover.register_cover(var, config)
|
62
68
|
if CONF_LAMBDA in config:
|
63
69
|
template_ = await cg.process_lambda(
|
64
70
|
config[CONF_LAMBDA], [], return_type=cg.optional.template(float)
|
@@ -2,7 +2,7 @@ import esphome.codegen as cg
|
|
2
2
|
from esphome.components import fan
|
3
3
|
from esphome.components.fan import validate_preset_modes
|
4
4
|
import esphome.config_validation as cv
|
5
|
-
from esphome.const import
|
5
|
+
from esphome.const import CONF_PRESET_MODES, CONF_SPEED_COUNT
|
6
6
|
|
7
7
|
from .. import template_ns
|
8
8
|
|
@@ -13,21 +13,23 @@ TemplateFan = template_ns.class_("TemplateFan", cg.Component, fan.Fan)
|
|
13
13
|
CONF_HAS_DIRECTION = "has_direction"
|
14
14
|
CONF_HAS_OSCILLATING = "has_oscillating"
|
15
15
|
|
16
|
-
CONFIG_SCHEMA =
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
16
|
+
CONFIG_SCHEMA = (
|
17
|
+
fan.fan_schema(TemplateFan)
|
18
|
+
.extend(
|
19
|
+
{
|
20
|
+
cv.Optional(CONF_HAS_DIRECTION, default=False): cv.boolean,
|
21
|
+
cv.Optional(CONF_HAS_OSCILLATING, default=False): cv.boolean,
|
22
|
+
cv.Optional(CONF_SPEED_COUNT): cv.int_range(min=1),
|
23
|
+
cv.Optional(CONF_PRESET_MODES): validate_preset_modes,
|
24
|
+
}
|
25
|
+
)
|
26
|
+
.extend(cv.COMPONENT_SCHEMA)
|
27
|
+
)
|
25
28
|
|
26
29
|
|
27
30
|
async def to_code(config):
|
28
|
-
var =
|
31
|
+
var = await fan.new_fan(config)
|
29
32
|
await cg.register_component(var, config)
|
30
|
-
await fan.register_fan(var, config)
|
31
33
|
|
32
34
|
cg.add(var.set_has_direction(config[CONF_HAS_DIRECTION]))
|
33
35
|
cg.add(var.set_has_oscillating(config[CONF_HAS_OSCILLATING]))
|