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
@@ -0,0 +1,28 @@
|
|
1
|
+
import esphome.codegen as cg
|
2
|
+
from esphome.components import binary_sensor
|
3
|
+
import esphome.config_validation as cv
|
4
|
+
|
5
|
+
from .. import cst226_ns
|
6
|
+
from ..touchscreen import CST226ButtonListener, CST226Touchscreen
|
7
|
+
|
8
|
+
CONF_CST226_ID = "cst226_id"
|
9
|
+
|
10
|
+
CST226Button = cst226_ns.class_(
|
11
|
+
"CST226Button",
|
12
|
+
binary_sensor.BinarySensor,
|
13
|
+
cg.Component,
|
14
|
+
CST226ButtonListener,
|
15
|
+
cg.Parented.template(CST226Touchscreen),
|
16
|
+
)
|
17
|
+
|
18
|
+
CONFIG_SCHEMA = binary_sensor.binary_sensor_schema(CST226Button).extend(
|
19
|
+
{
|
20
|
+
cv.GenerateID(CONF_CST226_ID): cv.use_id(CST226Touchscreen),
|
21
|
+
}
|
22
|
+
)
|
23
|
+
|
24
|
+
|
25
|
+
async def to_code(config):
|
26
|
+
var = await binary_sensor.new_binary_sensor(config)
|
27
|
+
await cg.register_component(var, config)
|
28
|
+
await cg.register_parented(var, config[CONF_CST226_ID])
|
@@ -0,0 +1,22 @@
|
|
1
|
+
#pragma once
|
2
|
+
|
3
|
+
#include "esphome/components/binary_sensor/binary_sensor.h"
|
4
|
+
#include "../touchscreen/cst226_touchscreen.h"
|
5
|
+
#include "esphome/core/helpers.h"
|
6
|
+
|
7
|
+
namespace esphome {
|
8
|
+
namespace cst226 {
|
9
|
+
|
10
|
+
class CST226Button : public binary_sensor::BinarySensor,
|
11
|
+
public Component,
|
12
|
+
public CST226ButtonListener,
|
13
|
+
public Parented<CST226Touchscreen> {
|
14
|
+
public:
|
15
|
+
void setup() override;
|
16
|
+
void dump_config() override;
|
17
|
+
|
18
|
+
void update_button(bool state) override;
|
19
|
+
};
|
20
|
+
|
21
|
+
} // namespace cst226
|
22
|
+
} // namespace esphome
|
@@ -0,0 +1,19 @@
|
|
1
|
+
#include "cs226_button.h"
|
2
|
+
#include "esphome/core/log.h"
|
3
|
+
|
4
|
+
namespace esphome {
|
5
|
+
namespace cst226 {
|
6
|
+
|
7
|
+
static const char *const TAG = "CST226.binary_sensor";
|
8
|
+
|
9
|
+
void CST226Button::setup() {
|
10
|
+
this->parent_->register_button_listener(this);
|
11
|
+
this->publish_initial_state(false);
|
12
|
+
}
|
13
|
+
|
14
|
+
void CST226Button::dump_config() { LOG_BINARY_SENSOR("", "CST226 Button", this); }
|
15
|
+
|
16
|
+
void CST226Button::update_button(bool state) { this->publish_state(state); }
|
17
|
+
|
18
|
+
} // namespace cst226
|
19
|
+
} // namespace esphome
|
@@ -3,8 +3,10 @@
|
|
3
3
|
namespace esphome {
|
4
4
|
namespace cst226 {
|
5
5
|
|
6
|
+
static const char *const TAG = "cst226.touchscreen";
|
7
|
+
|
6
8
|
void CST226Touchscreen::setup() {
|
7
|
-
|
9
|
+
ESP_LOGCONFIG(TAG, "Setting up CST226 Touchscreen...");
|
8
10
|
if (this->reset_pin_ != nullptr) {
|
9
11
|
this->reset_pin_->setup();
|
10
12
|
this->reset_pin_->digital_write(true);
|
@@ -26,6 +28,11 @@ void CST226Touchscreen::update_touches() {
|
|
26
28
|
return;
|
27
29
|
}
|
28
30
|
this->status_clear_warning();
|
31
|
+
if (data[0] == 0x83 && data[1] == 0x17 && data[5] == 0x80) {
|
32
|
+
this->update_button_state_(true);
|
33
|
+
return;
|
34
|
+
}
|
35
|
+
this->update_button_state_(false);
|
29
36
|
if (data[6] != 0xAB || data[0] == 0xAB || data[5] == 0x80) {
|
30
37
|
this->skip_update_ = true;
|
31
38
|
return;
|
@@ -43,13 +50,21 @@ void CST226Touchscreen::update_touches() {
|
|
43
50
|
int16_t y = (data[index + 2] << 4) | (data[index + 3] & 0x0F);
|
44
51
|
int16_t z = data[index + 4];
|
45
52
|
this->add_raw_touch_position_(id, x, y, z);
|
46
|
-
|
53
|
+
ESP_LOGV(TAG, "Read touch %d: %d/%d", id, x, y);
|
47
54
|
index += 5;
|
48
55
|
if (i == 0)
|
49
56
|
index += 2;
|
50
57
|
}
|
51
58
|
}
|
52
59
|
|
60
|
+
bool CST226Touchscreen::read16_(uint16_t addr, uint8_t *data, size_t len) {
|
61
|
+
if (this->read_register16(addr, data, len) != i2c::ERROR_OK) {
|
62
|
+
ESP_LOGE(TAG, "Read data from 0x%04X failed", addr);
|
63
|
+
this->mark_failed();
|
64
|
+
return false;
|
65
|
+
}
|
66
|
+
return true;
|
67
|
+
}
|
53
68
|
void CST226Touchscreen::continue_setup_() {
|
54
69
|
uint8_t buffer[8];
|
55
70
|
if (this->interrupt_pin_ != nullptr) {
|
@@ -58,7 +73,7 @@ void CST226Touchscreen::continue_setup_() {
|
|
58
73
|
}
|
59
74
|
buffer[0] = 0xD1;
|
60
75
|
if (this->write_register16(0xD1, buffer, 1) != i2c::ERROR_OK) {
|
61
|
-
|
76
|
+
ESP_LOGE(TAG, "Write byte to 0xD1 failed");
|
62
77
|
this->mark_failed();
|
63
78
|
return;
|
64
79
|
}
|
@@ -66,7 +81,7 @@ void CST226Touchscreen::continue_setup_() {
|
|
66
81
|
if (this->read16_(0xD204, buffer, 4)) {
|
67
82
|
uint16_t chip_id = buffer[2] + (buffer[3] << 8);
|
68
83
|
uint16_t project_id = buffer[0] + (buffer[1] << 8);
|
69
|
-
|
84
|
+
ESP_LOGCONFIG(TAG, "Chip ID %X, project ID %x", chip_id, project_id);
|
70
85
|
}
|
71
86
|
if (this->x_raw_max_ == 0 || this->y_raw_max_ == 0) {
|
72
87
|
if (this->read16_(0xD1F8, buffer, 4)) {
|
@@ -80,7 +95,14 @@ void CST226Touchscreen::continue_setup_() {
|
|
80
95
|
}
|
81
96
|
}
|
82
97
|
this->setup_complete_ = true;
|
83
|
-
|
98
|
+
ESP_LOGCONFIG(TAG, "CST226 Touchscreen setup complete");
|
99
|
+
}
|
100
|
+
void CST226Touchscreen::update_button_state_(bool state) {
|
101
|
+
if (this->button_touched_ == state)
|
102
|
+
return;
|
103
|
+
this->button_touched_ = state;
|
104
|
+
for (auto *listener : this->button_listeners_)
|
105
|
+
listener->update_button(state);
|
84
106
|
}
|
85
107
|
|
86
108
|
void CST226Touchscreen::dump_config() {
|
@@ -9,10 +9,13 @@
|
|
9
9
|
namespace esphome {
|
10
10
|
namespace cst226 {
|
11
11
|
|
12
|
-
static const char *const TAG = "cst226.touchscreen";
|
13
|
-
|
14
12
|
static const uint8_t CST226_REG_STATUS = 0x00;
|
15
13
|
|
14
|
+
class CST226ButtonListener {
|
15
|
+
public:
|
16
|
+
virtual void update_button(bool state) = 0;
|
17
|
+
};
|
18
|
+
|
16
19
|
class CST226Touchscreen : public touchscreen::Touchscreen, public i2c::I2CDevice {
|
17
20
|
public:
|
18
21
|
void setup() override;
|
@@ -22,22 +25,19 @@ class CST226Touchscreen : public touchscreen::Touchscreen, public i2c::I2CDevice
|
|
22
25
|
void set_interrupt_pin(InternalGPIOPin *pin) { this->interrupt_pin_ = pin; }
|
23
26
|
void set_reset_pin(GPIOPin *pin) { this->reset_pin_ = pin; }
|
24
27
|
bool can_proceed() override { return this->setup_complete_ || this->is_failed(); }
|
28
|
+
void register_button_listener(CST226ButtonListener *listener) { this->button_listeners_.push_back(listener); }
|
25
29
|
|
26
30
|
protected:
|
27
|
-
bool read16_(uint16_t addr, uint8_t *data, size_t len)
|
28
|
-
if (this->read_register16(addr, data, len) != i2c::ERROR_OK) {
|
29
|
-
esph_log_e(TAG, "Read data from 0x%04X failed", addr);
|
30
|
-
this->mark_failed();
|
31
|
-
return false;
|
32
|
-
}
|
33
|
-
return true;
|
34
|
-
}
|
31
|
+
bool read16_(uint16_t addr, uint8_t *data, size_t len);
|
35
32
|
void continue_setup_();
|
33
|
+
void update_button_state_(bool state);
|
36
34
|
|
37
35
|
InternalGPIOPin *interrupt_pin_{};
|
38
36
|
GPIOPin *reset_pin_{};
|
39
37
|
uint8_t chip_id_{};
|
40
38
|
bool setup_complete_{};
|
39
|
+
std::vector<CST226ButtonListener *> button_listeners_;
|
40
|
+
bool button_touched_{};
|
41
41
|
};
|
42
42
|
|
43
43
|
} // namespace cst226
|
@@ -5,7 +5,6 @@ import esphome.config_validation as cv
|
|
5
5
|
from esphome.const import (
|
6
6
|
CONF_CLOSE_ACTION,
|
7
7
|
CONF_CLOSE_DURATION,
|
8
|
-
CONF_ID,
|
9
8
|
CONF_MAX_DURATION,
|
10
9
|
CONF_OPEN_ACTION,
|
11
10
|
CONF_OPEN_DURATION,
|
@@ -30,45 +29,47 @@ CurrentBasedCover = current_based_ns.class_(
|
|
30
29
|
"CurrentBasedCover", cover.Cover, cg.Component
|
31
30
|
)
|
32
31
|
|
33
|
-
CONFIG_SCHEMA =
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
32
|
+
CONFIG_SCHEMA = (
|
33
|
+
cover.cover_schema(CurrentBasedCover)
|
34
|
+
.extend(
|
35
|
+
{
|
36
|
+
cv.Required(CONF_STOP_ACTION): automation.validate_automation(single=True),
|
37
|
+
cv.Required(CONF_OPEN_SENSOR): cv.use_id(sensor.Sensor),
|
38
|
+
cv.Required(CONF_OPEN_MOVING_CURRENT_THRESHOLD): cv.float_range(
|
39
|
+
min=0, min_included=False
|
40
|
+
),
|
41
|
+
cv.Optional(CONF_OPEN_OBSTACLE_CURRENT_THRESHOLD): cv.float_range(
|
42
|
+
min=0, min_included=False
|
43
|
+
),
|
44
|
+
cv.Required(CONF_OPEN_ACTION): automation.validate_automation(single=True),
|
45
|
+
cv.Required(CONF_OPEN_DURATION): cv.positive_time_period_milliseconds,
|
46
|
+
cv.Required(CONF_CLOSE_SENSOR): cv.use_id(sensor.Sensor),
|
47
|
+
cv.Required(CONF_CLOSE_MOVING_CURRENT_THRESHOLD): cv.float_range(
|
48
|
+
min=0, min_included=False
|
49
|
+
),
|
50
|
+
cv.Optional(CONF_CLOSE_OBSTACLE_CURRENT_THRESHOLD): cv.float_range(
|
51
|
+
min=0, min_included=False
|
52
|
+
),
|
53
|
+
cv.Required(CONF_CLOSE_ACTION): automation.validate_automation(single=True),
|
54
|
+
cv.Required(CONF_CLOSE_DURATION): cv.positive_time_period_milliseconds,
|
55
|
+
cv.Optional(CONF_OBSTACLE_ROLLBACK, default="10%"): cv.percentage,
|
56
|
+
cv.Optional(CONF_MAX_DURATION): cv.positive_time_period_milliseconds,
|
57
|
+
cv.Optional(CONF_MALFUNCTION_DETECTION, default=True): cv.boolean,
|
58
|
+
cv.Optional(CONF_MALFUNCTION_ACTION): automation.validate_automation(
|
59
|
+
single=True
|
60
|
+
),
|
61
|
+
cv.Optional(
|
62
|
+
CONF_START_SENSING_DELAY, default="500ms"
|
63
|
+
): cv.positive_time_period_milliseconds,
|
64
|
+
}
|
65
|
+
)
|
66
|
+
.extend(cv.COMPONENT_SCHEMA)
|
67
|
+
)
|
66
68
|
|
67
69
|
|
68
70
|
async def to_code(config):
|
69
|
-
var =
|
71
|
+
var = await cover.new_cover(config)
|
70
72
|
await cg.register_component(var, config)
|
71
|
-
await cover.register_cover(var, config)
|
72
73
|
|
73
74
|
await automation.build_automation(
|
74
75
|
var.get_stop_trigger(), [], config[CONF_STOP_ACTION]
|
@@ -1,6 +1,7 @@
|
|
1
1
|
#include "current_based_cover.h"
|
2
2
|
#include "esphome/core/hal.h"
|
3
3
|
#include "esphome/core/log.h"
|
4
|
+
#include "esphome/core/application.h"
|
4
5
|
#include <cfloat>
|
5
6
|
|
6
7
|
namespace esphome {
|
@@ -60,7 +61,7 @@ void CurrentBasedCover::loop() {
|
|
60
61
|
if (this->current_operation == COVER_OPERATION_IDLE)
|
61
62
|
return;
|
62
63
|
|
63
|
-
const uint32_t now =
|
64
|
+
const uint32_t now = App.get_loop_component_start_time();
|
64
65
|
|
65
66
|
if (this->current_operation == COVER_OPERATION_OPENING) {
|
66
67
|
if (this->malfunction_detection_ && this->is_closing_()) { // Malfunction
|
@@ -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
|
daikin_ns = cg.esphome_ns.namespace("daikin")
|
9
7
|
DaikinClimate = daikin_ns.class_("DaikinClimate", climate_ir.ClimateIR)
|
10
8
|
|
11
|
-
CONFIG_SCHEMA = climate_ir.
|
12
|
-
{
|
13
|
-
cv.GenerateID(): cv.declare_id(DaikinClimate),
|
14
|
-
}
|
15
|
-
)
|
9
|
+
CONFIG_SCHEMA = climate_ir.climate_ir_with_receiver_schema(DaikinClimate)
|
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)
|
@@ -65,7 +65,7 @@ void DaikinClimate::transmit_state() {
|
|
65
65
|
transmit.perform();
|
66
66
|
}
|
67
67
|
|
68
|
-
uint8_t DaikinClimate::operation_mode_() {
|
68
|
+
uint8_t DaikinClimate::operation_mode_() const {
|
69
69
|
uint8_t operating_mode = DAIKIN_MODE_ON;
|
70
70
|
switch (this->mode) {
|
71
71
|
case climate::CLIMATE_MODE_COOL:
|
@@ -92,9 +92,12 @@ uint8_t DaikinClimate::operation_mode_() {
|
|
92
92
|
return operating_mode;
|
93
93
|
}
|
94
94
|
|
95
|
-
uint16_t DaikinClimate::fan_speed_() {
|
95
|
+
uint16_t DaikinClimate::fan_speed_() const {
|
96
96
|
uint16_t fan_speed;
|
97
97
|
switch (this->fan_mode.value()) {
|
98
|
+
case climate::CLIMATE_FAN_QUIET:
|
99
|
+
fan_speed = DAIKIN_FAN_SILENT << 8;
|
100
|
+
break;
|
98
101
|
case climate::CLIMATE_FAN_LOW:
|
99
102
|
fan_speed = DAIKIN_FAN_1 << 8;
|
100
103
|
break;
|
@@ -126,12 +129,11 @@ uint16_t DaikinClimate::fan_speed_() {
|
|
126
129
|
return fan_speed;
|
127
130
|
}
|
128
131
|
|
129
|
-
uint8_t DaikinClimate::temperature_() {
|
132
|
+
uint8_t DaikinClimate::temperature_() const {
|
130
133
|
// Force special temperatures depending on the mode
|
131
134
|
switch (this->mode) {
|
132
135
|
case climate::CLIMATE_MODE_FAN_ONLY:
|
133
136
|
return 0x32;
|
134
|
-
case climate::CLIMATE_MODE_HEAT_COOL:
|
135
137
|
case climate::CLIMATE_MODE_DRY:
|
136
138
|
return 0xc0;
|
137
139
|
default:
|
@@ -148,19 +150,25 @@ bool DaikinClimate::parse_state_frame_(const uint8_t frame[]) {
|
|
148
150
|
if (frame[DAIKIN_STATE_FRAME_SIZE - 1] != checksum)
|
149
151
|
return false;
|
150
152
|
uint8_t mode = frame[5];
|
153
|
+
// Temperature is given in degrees celcius * 2
|
154
|
+
// only update for states that use the temperature
|
155
|
+
uint8_t temperature = frame[6];
|
151
156
|
if (mode & DAIKIN_MODE_ON) {
|
152
157
|
switch (mode & 0xF0) {
|
153
158
|
case DAIKIN_MODE_COOL:
|
154
159
|
this->mode = climate::CLIMATE_MODE_COOL;
|
160
|
+
this->target_temperature = static_cast<float>(temperature * 0.5f);
|
155
161
|
break;
|
156
162
|
case DAIKIN_MODE_DRY:
|
157
163
|
this->mode = climate::CLIMATE_MODE_DRY;
|
158
164
|
break;
|
159
165
|
case DAIKIN_MODE_HEAT:
|
160
166
|
this->mode = climate::CLIMATE_MODE_HEAT;
|
167
|
+
this->target_temperature = static_cast<float>(temperature * 0.5f);
|
161
168
|
break;
|
162
169
|
case DAIKIN_MODE_AUTO:
|
163
170
|
this->mode = climate::CLIMATE_MODE_HEAT_COOL;
|
171
|
+
this->target_temperature = static_cast<float>(temperature * 0.5f);
|
164
172
|
break;
|
165
173
|
case DAIKIN_MODE_FAN:
|
166
174
|
this->mode = climate::CLIMATE_MODE_FAN_ONLY;
|
@@ -169,10 +177,6 @@ bool DaikinClimate::parse_state_frame_(const uint8_t frame[]) {
|
|
169
177
|
} else {
|
170
178
|
this->mode = climate::CLIMATE_MODE_OFF;
|
171
179
|
}
|
172
|
-
uint8_t temperature = frame[6];
|
173
|
-
if (!(temperature & 0xC0)) {
|
174
|
-
this->target_temperature = temperature >> 1;
|
175
|
-
}
|
176
180
|
uint8_t fan_mode = frame[8];
|
177
181
|
uint8_t swing_mode = frame[9];
|
178
182
|
if (fan_mode & 0xF && swing_mode & 0xF) {
|
@@ -187,7 +191,6 @@ bool DaikinClimate::parse_state_frame_(const uint8_t frame[]) {
|
|
187
191
|
switch (fan_mode & 0xF0) {
|
188
192
|
case DAIKIN_FAN_1:
|
189
193
|
case DAIKIN_FAN_2:
|
190
|
-
case DAIKIN_FAN_SILENT:
|
191
194
|
this->fan_mode = climate::CLIMATE_FAN_LOW;
|
192
195
|
break;
|
193
196
|
case DAIKIN_FAN_3:
|
@@ -200,6 +203,9 @@ bool DaikinClimate::parse_state_frame_(const uint8_t frame[]) {
|
|
200
203
|
case DAIKIN_FAN_AUTO:
|
201
204
|
this->fan_mode = climate::CLIMATE_FAN_AUTO;
|
202
205
|
break;
|
206
|
+
case DAIKIN_FAN_SILENT:
|
207
|
+
this->fan_mode = climate::CLIMATE_FAN_QUIET;
|
208
|
+
break;
|
203
209
|
}
|
204
210
|
this->publish_state();
|
205
211
|
return true;
|
@@ -44,17 +44,17 @@ class DaikinClimate : public climate_ir::ClimateIR {
|
|
44
44
|
public:
|
45
45
|
DaikinClimate()
|
46
46
|
: climate_ir::ClimateIR(DAIKIN_TEMP_MIN, DAIKIN_TEMP_MAX, 1.0f, true, true,
|
47
|
-
{climate::
|
48
|
-
climate::CLIMATE_FAN_HIGH},
|
47
|
+
{climate::CLIMATE_FAN_QUIET, climate::CLIMATE_FAN_AUTO, climate::CLIMATE_FAN_LOW,
|
48
|
+
climate::CLIMATE_FAN_MEDIUM, climate::CLIMATE_FAN_HIGH},
|
49
49
|
{climate::CLIMATE_SWING_OFF, climate::CLIMATE_SWING_VERTICAL,
|
50
50
|
climate::CLIMATE_SWING_HORIZONTAL, climate::CLIMATE_SWING_BOTH}) {}
|
51
51
|
|
52
52
|
protected:
|
53
53
|
// Transmit via IR the state of this climate controller.
|
54
54
|
void transmit_state() override;
|
55
|
-
uint8_t operation_mode_();
|
56
|
-
uint16_t fan_speed_();
|
57
|
-
uint8_t temperature_();
|
55
|
+
uint8_t operation_mode_() const;
|
56
|
+
uint16_t fan_speed_() const;
|
57
|
+
uint8_t temperature_() const;
|
58
58
|
// Handle received IR Buffer
|
59
59
|
bool on_receive(remote_base::RemoteReceiveData data) override;
|
60
60
|
bool parse_state_frame_(const uint8_t frame[]);
|
@@ -1,18 +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
|
daikin_arc_ns = cg.esphome_ns.namespace("daikin_arc")
|
9
7
|
DaikinArcClimate = daikin_arc_ns.class_("DaikinArcClimate", climate_ir.ClimateIR)
|
10
8
|
|
11
|
-
CONFIG_SCHEMA = climate_ir.
|
12
|
-
{cv.GenerateID(): cv.declare_id(DaikinArcClimate)}
|
13
|
-
)
|
9
|
+
CONFIG_SCHEMA = climate_ir.climate_ir_with_receiver_schema(DaikinArcClimate)
|
14
10
|
|
15
11
|
|
16
12
|
async def to_code(config):
|
17
|
-
|
18
|
-
await climate_ir.register_climate_ir(var, config)
|
13
|
+
await climate_ir.new_climate_ir(config)
|
@@ -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_USE_FAHRENHEIT
|
5
5
|
|
6
6
|
AUTO_LOAD = ["climate_ir"]
|
7
7
|
|
@@ -9,15 +9,13 @@ daikin_brc_ns = cg.esphome_ns.namespace("daikin_brc")
|
|
9
9
|
DaikinBrcClimate = daikin_brc_ns.class_("DaikinBrcClimate", climate_ir.ClimateIR)
|
10
10
|
|
11
11
|
|
12
|
-
CONFIG_SCHEMA = climate_ir.
|
12
|
+
CONFIG_SCHEMA = climate_ir.climate_ir_with_receiver_schema(DaikinBrcClimate).extend(
|
13
13
|
{
|
14
|
-
cv.GenerateID(): cv.declare_id(DaikinBrcClimate),
|
15
14
|
cv.Optional(CONF_USE_FAHRENHEIT, default=False): cv.boolean,
|
16
15
|
}
|
17
16
|
)
|
18
17
|
|
19
18
|
|
20
19
|
async def to_code(config):
|
21
|
-
var =
|
22
|
-
await climate_ir.register_climate_ir(var, config)
|
20
|
+
var = await climate_ir.new_climate_ir(config)
|
23
21
|
cg.add(var.set_fahrenheit(config[CONF_USE_FAHRENHEIT]))
|
@@ -56,21 +56,13 @@ void DallasTemperatureSensor::update() {
|
|
56
56
|
});
|
57
57
|
}
|
58
58
|
|
59
|
-
void IRAM_ATTR DallasTemperatureSensor::read_scratch_pad_int_() {
|
60
|
-
for (uint8_t &i : this->scratch_pad_) {
|
61
|
-
i = this->bus_->read8();
|
62
|
-
}
|
63
|
-
}
|
64
|
-
|
65
59
|
bool DallasTemperatureSensor::read_scratch_pad_() {
|
66
|
-
bool success;
|
67
|
-
{
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
}
|
73
|
-
if (!success) {
|
60
|
+
bool success = this->send_command_(DALLAS_COMMAND_READ_SCRATCH_PAD);
|
61
|
+
if (success) {
|
62
|
+
for (uint8_t &i : this->scratch_pad_) {
|
63
|
+
i = this->bus_->read8();
|
64
|
+
}
|
65
|
+
} else {
|
74
66
|
ESP_LOGW(TAG, "'%s' - reading scratch pad failed bus reset", this->get_name().c_str());
|
75
67
|
this->status_set_warning("bus reset failed");
|
76
68
|
}
|
@@ -113,17 +105,14 @@ void DallasTemperatureSensor::setup() {
|
|
113
105
|
return;
|
114
106
|
this->scratch_pad_[4] = res;
|
115
107
|
|
116
|
-
{
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
this->bus_->write8(this->scratch_pad_[3]); // low alarm temp
|
121
|
-
this->bus_->write8(this->scratch_pad_[4]); // resolution
|
122
|
-
}
|
123
|
-
|
124
|
-
// write value to EEPROM
|
125
|
-
this->send_command_(DALLAS_COMMAND_COPY_SCRATCH_PAD);
|
108
|
+
if (this->send_command_(DALLAS_COMMAND_WRITE_SCRATCH_PAD)) {
|
109
|
+
this->bus_->write8(this->scratch_pad_[2]); // high alarm temp
|
110
|
+
this->bus_->write8(this->scratch_pad_[3]); // low alarm temp
|
111
|
+
this->bus_->write8(this->scratch_pad_[4]); // resolution
|
126
112
|
}
|
113
|
+
|
114
|
+
// write value to EEPROM
|
115
|
+
this->send_command_(DALLAS_COMMAND_COPY_SCRATCH_PAD);
|
127
116
|
}
|
128
117
|
|
129
118
|
bool DallasTemperatureSensor::check_scratch_pad_() {
|
@@ -138,6 +127,10 @@ bool DallasTemperatureSensor::check_scratch_pad_() {
|
|
138
127
|
if (!chksum_validity) {
|
139
128
|
ESP_LOGW(TAG, "'%s' - Scratch pad checksum invalid!", this->get_name().c_str());
|
140
129
|
this->status_set_warning("scratch pad checksum invalid");
|
130
|
+
ESP_LOGD(TAG, "Scratch pad: %02X.%02X.%02X.%02X.%02X.%02X.%02X.%02X.%02X (%02X)", this->scratch_pad_[0],
|
131
|
+
this->scratch_pad_[1], this->scratch_pad_[2], this->scratch_pad_[3], this->scratch_pad_[4],
|
132
|
+
this->scratch_pad_[5], this->scratch_pad_[6], this->scratch_pad_[7], this->scratch_pad_[8],
|
133
|
+
crc8(this->scratch_pad_, 8));
|
141
134
|
}
|
142
135
|
return chksum_validity;
|
143
136
|
}
|
@@ -23,7 +23,6 @@ class DallasTemperatureSensor : public PollingComponent, public sensor::Sensor,
|
|
23
23
|
/// Get the number of milliseconds we have to wait for the conversion phase.
|
24
24
|
uint16_t millis_to_wait_for_conversion_() const;
|
25
25
|
bool read_scratch_pad_();
|
26
|
-
void read_scratch_pad_int_();
|
27
26
|
bool check_scratch_pad_();
|
28
27
|
float get_temp_c_();
|
29
28
|
};
|
@@ -1,6 +1,7 @@
|
|
1
1
|
#include "daly_bms.h"
|
2
2
|
#include <vector>
|
3
3
|
#include "esphome/core/log.h"
|
4
|
+
#include "esphome/core/application.h"
|
4
5
|
|
5
6
|
namespace esphome {
|
6
7
|
namespace daly_bms {
|
@@ -32,7 +33,7 @@ void DalyBmsComponent::update() {
|
|
32
33
|
}
|
33
34
|
|
34
35
|
void DalyBmsComponent::loop() {
|
35
|
-
const uint32_t now =
|
36
|
+
const uint32_t now = App.get_loop_component_start_time();
|
36
37
|
if (this->receiving_ && (now - this->last_transmission_ >= 200)) {
|
37
38
|
// last transmission too long ago. Reset RX index.
|
38
39
|
ESP_LOGW(TAG, "Last transmission too long ago. Reset RX index.");
|
@@ -1,6 +1,7 @@
|
|
1
1
|
#include "debug_component.h"
|
2
2
|
|
3
3
|
#include <algorithm>
|
4
|
+
#include "esphome/core/application.h"
|
4
5
|
#include "esphome/core/log.h"
|
5
6
|
#include "esphome/core/hal.h"
|
6
7
|
#include "esphome/core/helpers.h"
|
@@ -25,6 +26,7 @@ void DebugComponent::dump_config() {
|
|
25
26
|
#ifdef USE_SENSOR
|
26
27
|
LOG_SENSOR(" ", "Free space on heap", this->free_sensor_);
|
27
28
|
LOG_SENSOR(" ", "Largest free heap block", this->block_sensor_);
|
29
|
+
LOG_SENSOR(" ", "CPU frequency", this->cpu_frequency_sensor_);
|
28
30
|
#if defined(USE_ESP8266) && USE_ARDUINO_VERSION_CODE >= VERSION_CODE(2, 5, 2)
|
29
31
|
LOG_SENSOR(" ", "Heap fragmentation", this->fragmentation_sensor_);
|
30
32
|
#endif // defined(USE_ESP8266) && USE_ARDUINO_VERSION_CODE >= VERSION_CODE(2, 5, 2)
|
@@ -68,7 +70,7 @@ void DebugComponent::loop() {
|
|
68
70
|
#ifdef USE_SENSOR
|
69
71
|
// calculate loop time - from last call to this one
|
70
72
|
if (this->loop_time_sensor_ != nullptr) {
|
71
|
-
uint32_t now =
|
73
|
+
uint32_t now = App.get_loop_component_start_time();
|
72
74
|
uint32_t loop_time = now - this->last_loop_timetag_;
|
73
75
|
this->max_loop_time_ = std::max(this->max_loop_time_, loop_time);
|
74
76
|
this->last_loop_timetag_ = now;
|
@@ -86,6 +88,9 @@ void DebugComponent::update() {
|
|
86
88
|
this->loop_time_sensor_->publish_state(this->max_loop_time_);
|
87
89
|
this->max_loop_time_ = 0;
|
88
90
|
}
|
91
|
+
if (this->cpu_frequency_sensor_ != nullptr) {
|
92
|
+
this->cpu_frequency_sensor_->publish_state(arch_get_cpu_freq_hz());
|
93
|
+
}
|
89
94
|
|
90
95
|
#endif // USE_SENSOR
|
91
96
|
update_platform_();
|
@@ -36,7 +36,13 @@ class DebugComponent : public PollingComponent {
|
|
36
36
|
#ifdef USE_ESP32
|
37
37
|
void set_psram_sensor(sensor::Sensor *psram_sensor) { this->psram_sensor_ = psram_sensor; }
|
38
38
|
#endif // USE_ESP32
|
39
|
+
void set_cpu_frequency_sensor(sensor::Sensor *cpu_frequency_sensor) {
|
40
|
+
this->cpu_frequency_sensor_ = cpu_frequency_sensor;
|
41
|
+
}
|
39
42
|
#endif // USE_SENSOR
|
43
|
+
#ifdef USE_ESP32
|
44
|
+
void on_shutdown() override;
|
45
|
+
#endif // USE_ESP32
|
40
46
|
protected:
|
41
47
|
uint32_t free_heap_{};
|
42
48
|
|
@@ -53,6 +59,7 @@ class DebugComponent : public PollingComponent {
|
|
53
59
|
#ifdef USE_ESP32
|
54
60
|
sensor::Sensor *psram_sensor_{nullptr};
|
55
61
|
#endif // USE_ESP32
|
62
|
+
sensor::Sensor *cpu_frequency_sensor_{nullptr};
|
56
63
|
#endif // USE_SENSOR
|
57
64
|
|
58
65
|
#ifdef USE_ESP32
|
@@ -75,6 +82,7 @@ class DebugComponent : public PollingComponent {
|
|
75
82
|
#endif // USE_TEXT_SENSOR
|
76
83
|
|
77
84
|
std::string get_reset_reason_();
|
85
|
+
std::string get_wakeup_cause_();
|
78
86
|
uint32_t get_free_heap_();
|
79
87
|
void get_device_info_(std::string &device_info);
|
80
88
|
void update_platform_();
|