esphome 2025.4.1__py3-none-any.whl → 2025.5.0b2__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/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 +77 -10
- esphome/components/api/api_connection.h +6 -1
- esphome/components/api/api_frame_helper.cpp +98 -130
- esphome/components/api/api_frame_helper.h +12 -2
- 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 +38 -9
- esphome/components/as3935_i2c/as3935_i2c.h +0 -3
- esphome/components/as7341/as7341.h +1 -1
- esphome/components/atm90e32/__init__.py +1 -0
- esphome/components/atm90e32/atm90e32.cpp +576 -199
- esphome/components/atm90e32/atm90e32.h +128 -31
- esphome/components/atm90e32/atm90e32_reg.h +4 -2
- esphome/components/atm90e32/button/__init__.py +62 -10
- esphome/components/atm90e32/button/atm90e32_button.cpp +63 -4
- esphome/components/atm90e32/button/atm90e32_button.h +36 -4
- esphome/components/atm90e32/number/__init__.py +130 -0
- esphome/components/atm90e32/number/atm90e32_number.h +16 -0
- esphome/components/atm90e32/sensor.py +21 -4
- esphome/components/atm90e32/text_sensor/__init__.py +48 -0
- esphome/components/audio/__init__.py +96 -49
- esphome/components/audio/audio.h +48 -0
- esphome/components/audio/audio_decoder.cpp +1 -1
- esphome/components/audio/audio_resampler.cpp +2 -0
- esphome/components/audio/audio_resampler.h +1 -0
- esphome/components/ballu/climate.py +2 -9
- esphome/components/bang_bang/climate.py +5 -6
- esphome/components/bedjet/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/binary_sensor/binary_sensor.cpp +6 -10
- esphome/components/binary_sensor/binary_sensor.h +1 -1
- esphome/components/binary_sensor/filter.cpp +21 -21
- esphome/components/binary_sensor/filter.h +10 -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 +135 -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/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/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/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/debug/debug_component.cpp +5 -0
- esphome/components/debug/debug_component.h +6 -0
- esphome/components/debug/debug_esp32.cpp +109 -254
- esphome/components/debug/sensor.py +14 -0
- esphome/components/deep_sleep/deep_sleep_esp32.cpp +13 -1
- esphome/components/delonghi/climate.py +2 -9
- esphome/components/demo/__init__.py +18 -20
- esphome/components/dfrobot_sen0395/switch/__init__.py +21 -22
- esphome/components/display/rect.cpp +4 -9
- esphome/components/display/rect.h +1 -1
- esphome/components/emmeti/climate.py +2 -9
- esphome/components/endstop/cover.py +17 -16
- 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.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_can/esp32_can.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/esp8266/gpio.cpp +69 -8
- 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/fujitsu_general/climate.py +2 -9
- 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 +11 -2
- esphome/components/gps/gps.cpp +11 -8
- esphome/components/gps/gps.h +9 -6
- 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/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/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/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/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 +21 -0
- esphome/components/logger/logger.cpp +125 -95
- esphome/components/logger/logger.h +160 -35
- 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/max7219digit/max7219digit.cpp +27 -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/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/mqtt/__init__.py +1 -1
- esphome/components/mqtt/mqtt_client.cpp +5 -1
- 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/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 +193 -229
- 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/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/scd30/sensor.py +2 -3
- esphome/components/scd4x/sensor.py +4 -5
- esphome/components/sdp3x/sensor.py +2 -1
- esphome/components/select/__init__.py +19 -20
- esphome/components/sen5x/sensor.py +1 -1
- esphome/components/sensor/__init__.py +158 -14
- esphome/components/sensor/filter.cpp +23 -0
- esphome/components/sensor/filter.h +22 -0
- esphome/components/sgp4x/sensor.py +1 -1
- esphome/components/sht4x/sht4x.cpp +43 -22
- esphome/components/sht4x/sht4x.h +1 -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/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/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/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/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/uptime/text_sensor/__init__.py +47 -7
- esphome/components/uptime/text_sensor/uptime_text_sensor.cpp +12 -7
- esphome/components/uptime/text_sensor/uptime_text_sensor.h +19 -0
- esphome/components/valve/__init__.py +34 -3
- esphome/components/valve/automation.h +1 -19
- esphome/components/vl53l0x/sensor.py +11 -0
- esphome/components/vl53l0x/vl53l0x_sensor.cpp +5 -1
- esphome/components/vl53l0x/vl53l0x_sensor.h +2 -1
- esphome/components/voice_assistant/__init__.py +36 -10
- esphome/components/voice_assistant/voice_assistant.cpp +170 -144
- esphome/components/voice_assistant/voice_assistant.h +26 -25
- esphome/components/waveshare_epaper/display.py +6 -0
- esphome/components/waveshare_epaper/waveshare_epaper.cpp +439 -37
- esphome/components/waveshare_epaper/waveshare_epaper.h +60 -11
- esphome/components/whirlpool/climate.py +3 -5
- esphome/components/whynter/climate.py +3 -5
- esphome/components/xpt2046/touchscreen/xpt2046.cpp +1 -1
- esphome/components/yashima/climate.py +6 -6
- esphome/components/zhlt01/climate.py +2 -7
- esphome/config_validation.py +38 -58
- esphome/const.py +15 -1
- esphome/core/__init__.py +2 -0
- esphome/core/application.cpp +1 -0
- esphome/core/application.h +4 -0
- esphome/core/automation.h +4 -3
- esphome/core/component.cpp +19 -3
- esphome/core/component.h +5 -0
- esphome/core/defines.h +23 -17
- esphome/core/macros.h +4 -0
- esphome/core/scheduler.cpp +3 -0
- esphome/cpp_generator.py +6 -2
- esphome/dashboard/web_server.py +3 -3
- esphome/helpers.py +39 -0
- esphome/loader.py +4 -0
- esphome/mqtt.py +21 -8
- esphome/platformio_api.py +1 -1
- esphome/schema_extractors.py +0 -1
- esphome/vscode.py +15 -0
- esphome/wizard.py +2 -2
- esphome/zeroconf.py +7 -3
- {esphome-2025.4.1.dist-info → esphome-2025.5.0b2.dist-info}/METADATA +10 -11
- {esphome-2025.4.1.dist-info → esphome-2025.5.0b2.dist-info}/RECORD +411 -352
- {esphome-2025.4.1.dist-info → esphome-2025.5.0b2.dist-info}/WHEEL +1 -1
- esphome/components/esp32_ble/const_esp32c6.h +0 -74
- {esphome-2025.4.1.dist-info → esphome-2025.5.0b2.dist-info}/entry_points.txt +0 -0
- {esphome-2025.4.1.dist-info → esphome-2025.5.0b2.dist-info}/licenses/LICENSE +0 -0
- {esphome-2025.4.1.dist-info → esphome-2025.5.0b2.dist-info}/top_level.txt +0 -0
@@ -5,6 +5,8 @@ from esphome.components import mqtt, web_server
|
|
5
5
|
import esphome.config_validation as cv
|
6
6
|
from esphome.const import (
|
7
7
|
CONF_DEVICE_CLASS,
|
8
|
+
CONF_ENTITY_CATEGORY,
|
9
|
+
CONF_ICON,
|
8
10
|
CONF_ID,
|
9
11
|
CONF_MQTT_ID,
|
10
12
|
CONF_ON_OPEN,
|
@@ -31,6 +33,7 @@ from esphome.const import (
|
|
31
33
|
DEVICE_CLASS_WINDOW,
|
32
34
|
)
|
33
35
|
from esphome.core import CORE, coroutine_with_priority
|
36
|
+
from esphome.cpp_generator import MockObjClass
|
34
37
|
from esphome.cpp_helpers import setup_entity
|
35
38
|
|
36
39
|
IS_PLATFORM_COMPONENT = True
|
@@ -89,12 +92,11 @@ CoverClosedTrigger = cover_ns.class_(
|
|
89
92
|
|
90
93
|
CONF_ON_CLOSED = "on_closed"
|
91
94
|
|
92
|
-
|
95
|
+
_COVER_SCHEMA = (
|
93
96
|
cv.ENTITY_BASE_SCHEMA.extend(web_server.WEBSERVER_SORTING_SCHEMA)
|
94
97
|
.extend(cv.MQTT_COMMAND_COMPONENT_SCHEMA)
|
95
98
|
.extend(
|
96
99
|
{
|
97
|
-
cv.GenerateID(): cv.declare_id(Cover),
|
98
100
|
cv.OnlyWith(CONF_MQTT_ID, "mqtt"): cv.declare_id(mqtt.MQTTCoverComponent),
|
99
101
|
cv.Optional(CONF_DEVICE_CLASS): cv.one_of(*DEVICE_CLASSES, lower=True),
|
100
102
|
cv.Optional(CONF_POSITION_COMMAND_TOPIC): cv.All(
|
@@ -124,6 +126,33 @@ COVER_SCHEMA = (
|
|
124
126
|
)
|
125
127
|
|
126
128
|
|
129
|
+
def cover_schema(
|
130
|
+
class_: MockObjClass,
|
131
|
+
*,
|
132
|
+
device_class: str = cv.UNDEFINED,
|
133
|
+
entity_category: str = cv.UNDEFINED,
|
134
|
+
icon: str = cv.UNDEFINED,
|
135
|
+
) -> cv.Schema:
|
136
|
+
schema = {
|
137
|
+
cv.GenerateID(): cv.declare_id(class_),
|
138
|
+
}
|
139
|
+
|
140
|
+
for key, default, validator in [
|
141
|
+
(CONF_DEVICE_CLASS, device_class, cv.one_of(*DEVICE_CLASSES, lower=True)),
|
142
|
+
(CONF_ENTITY_CATEGORY, entity_category, cv.entity_category),
|
143
|
+
(CONF_ICON, icon, cv.icon),
|
144
|
+
]:
|
145
|
+
if default is not cv.UNDEFINED:
|
146
|
+
schema[cv.Optional(key, default=default)] = validator
|
147
|
+
|
148
|
+
return _COVER_SCHEMA.extend(schema)
|
149
|
+
|
150
|
+
|
151
|
+
# Remove before 2025.11.0
|
152
|
+
COVER_SCHEMA = cover_schema(Cover)
|
153
|
+
COVER_SCHEMA.add_extra(cv.deprecated_schema_constant("cover"))
|
154
|
+
|
155
|
+
|
127
156
|
async def setup_cover_core_(var, config):
|
128
157
|
await setup_entity(var, config)
|
129
158
|
|
@@ -163,6 +192,12 @@ async def register_cover(var, config):
|
|
163
192
|
await setup_cover_core_(var, config)
|
164
193
|
|
165
194
|
|
195
|
+
async def new_cover(config, *args):
|
196
|
+
var = cg.new_Pvariable(config[CONF_ID], *args)
|
197
|
+
await register_cover(var, config)
|
198
|
+
return var
|
199
|
+
|
200
|
+
|
166
201
|
COVER_ACTION_SCHEMA = maybe_simple_id(
|
167
202
|
{
|
168
203
|
cv.Required(CONF_ID): cv.use_id(Cover),
|
@@ -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,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.climare_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.climare_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.climare_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 "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)
|
@@ -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_();
|