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
@@ -0,0 +1,153 @@
|
|
1
|
+
#include "beo4_protocol.h"
|
2
|
+
#include "esphome/core/log.h"
|
3
|
+
|
4
|
+
#include <cinttypes>
|
5
|
+
|
6
|
+
namespace esphome {
|
7
|
+
namespace remote_base {
|
8
|
+
|
9
|
+
static const char *const TAG = "remote.beo4";
|
10
|
+
|
11
|
+
// beo4 pulse width, high=carrier_pulse low=data_pulse
|
12
|
+
constexpr uint16_t PW_CARR_US = 200; // carrier pulse length
|
13
|
+
constexpr uint16_t PW_ZERO_US = 2925; // + 200 = 3125 µs
|
14
|
+
constexpr uint16_t PW_SAME_US = 6050; // + 200 = 6250 µs
|
15
|
+
constexpr uint16_t PW_ONE_US = 9175; // + 200 = 9375 µs
|
16
|
+
constexpr uint16_t PW_STOP_US = 12300; // + 200 = 12500 µs
|
17
|
+
constexpr uint16_t PW_START_US = 15425; // + 200 = 15625 µs
|
18
|
+
|
19
|
+
// beo4 pulse codes
|
20
|
+
constexpr uint8_t PC_ZERO = (PW_CARR_US + PW_ZERO_US) / 3125; // =1
|
21
|
+
constexpr uint8_t PC_SAME = (PW_CARR_US + PW_SAME_US) / 3125; // =2
|
22
|
+
constexpr uint8_t PC_ONE = (PW_CARR_US + PW_ONE_US) / 3125; // =3
|
23
|
+
constexpr uint8_t PC_STOP = (PW_CARR_US + PW_STOP_US) / 3125; // =4
|
24
|
+
constexpr uint8_t PC_START = (PW_CARR_US + PW_START_US) / 3125; // =5
|
25
|
+
|
26
|
+
// beo4 number of data bits = beoLink+beoSrc+beoCmd = 1+8+8 = 17
|
27
|
+
constexpr uint32_t N_BITS = 1 + 8 + 8;
|
28
|
+
|
29
|
+
// required symbols = 2*(start_sequence + n_bits + stop) = 2*(3+17+1) = 42
|
30
|
+
constexpr uint32_t N_SYM = 2 + ((3 + 17 + 1) * 2u); // + 2 = 44
|
31
|
+
|
32
|
+
// states finite-state-machine decoder
|
33
|
+
enum class RxSt { RX_IDLE, RX_DATA, RX_STOP };
|
34
|
+
|
35
|
+
void Beo4Protocol::encode(RemoteTransmitData *dst, const Beo4Data &data) {
|
36
|
+
uint32_t beo_code = ((uint32_t) data.source << 8) + (uint32_t) data.command;
|
37
|
+
uint32_t jc = 0, ic = 0;
|
38
|
+
uint32_t cur_bit = 0;
|
39
|
+
uint32_t pre_bit = 0;
|
40
|
+
dst->set_carrier_frequency(455000);
|
41
|
+
dst->reserve(N_SYM);
|
42
|
+
|
43
|
+
// start sequence=zero,zero,start
|
44
|
+
dst->item(PW_CARR_US, PW_ZERO_US);
|
45
|
+
dst->item(PW_CARR_US, PW_ZERO_US);
|
46
|
+
dst->item(PW_CARR_US, PW_START_US);
|
47
|
+
|
48
|
+
// the data-bit BeoLink is always 0
|
49
|
+
dst->item(PW_CARR_US, PW_ZERO_US);
|
50
|
+
|
51
|
+
// The B&O trick to avoid extra long and extra short
|
52
|
+
// code-frames by extracting the data-bits from left
|
53
|
+
// to right, then comparing current with previous bit
|
54
|
+
// and set pulse to "same" "one" or "zero"
|
55
|
+
for (jc = 15, ic = 0; ic < 16; ic++, jc--) {
|
56
|
+
cur_bit = ((beo_code) >> jc) & 1;
|
57
|
+
if (cur_bit == pre_bit) {
|
58
|
+
dst->item(PW_CARR_US, PW_SAME_US);
|
59
|
+
} else if (1 == cur_bit) {
|
60
|
+
dst->item(PW_CARR_US, PW_ONE_US);
|
61
|
+
} else {
|
62
|
+
dst->item(PW_CARR_US, PW_ZERO_US);
|
63
|
+
}
|
64
|
+
pre_bit = cur_bit;
|
65
|
+
}
|
66
|
+
// complete the frame with stop-symbol and final carrier pulse
|
67
|
+
dst->item(PW_CARR_US, PW_STOP_US);
|
68
|
+
dst->mark(PW_CARR_US);
|
69
|
+
}
|
70
|
+
|
71
|
+
optional<Beo4Data> Beo4Protocol::decode(RemoteReceiveData src) {
|
72
|
+
int32_t n_sym = src.size();
|
73
|
+
Beo4Data data{
|
74
|
+
.source = 0,
|
75
|
+
.command = 0,
|
76
|
+
.repeats = 0,
|
77
|
+
};
|
78
|
+
// suppress dummy codes (TSO7000 hiccups)
|
79
|
+
if (n_sym > 42) {
|
80
|
+
static uint32_t beo_code = 0;
|
81
|
+
RxSt fsm = RxSt::RX_IDLE;
|
82
|
+
int32_t ic = 0;
|
83
|
+
int32_t jc = 0;
|
84
|
+
uint32_t pre_bit = 0;
|
85
|
+
uint32_t cnt_bit = 0;
|
86
|
+
ESP_LOGD(TAG, "Beo4: n_sym=%" PRId32, n_sym);
|
87
|
+
for (jc = 0, ic = 0; ic < (n_sym - 1); ic += 2, jc++) {
|
88
|
+
int32_t pulse_width = src[ic] - src[ic + 1];
|
89
|
+
// suppress TSOP7000 (dummy pulses)
|
90
|
+
if (pulse_width > 1500) {
|
91
|
+
int32_t pulse_code = (pulse_width + 1560) / 3125;
|
92
|
+
switch (fsm) {
|
93
|
+
case RxSt::RX_IDLE: {
|
94
|
+
beo_code = 0;
|
95
|
+
cnt_bit = 0;
|
96
|
+
pre_bit = 0;
|
97
|
+
if (PC_START == pulse_code) {
|
98
|
+
fsm = RxSt::RX_DATA;
|
99
|
+
}
|
100
|
+
break;
|
101
|
+
}
|
102
|
+
case RxSt::RX_DATA: {
|
103
|
+
uint32_t cur_bit = 0;
|
104
|
+
switch (pulse_code) {
|
105
|
+
case PC_ZERO: {
|
106
|
+
cur_bit = pre_bit = 0;
|
107
|
+
break;
|
108
|
+
}
|
109
|
+
case PC_SAME: {
|
110
|
+
cur_bit = pre_bit;
|
111
|
+
break;
|
112
|
+
}
|
113
|
+
case PC_ONE: {
|
114
|
+
cur_bit = pre_bit = 1;
|
115
|
+
break;
|
116
|
+
}
|
117
|
+
default: {
|
118
|
+
fsm = RxSt::RX_IDLE;
|
119
|
+
break;
|
120
|
+
}
|
121
|
+
}
|
122
|
+
beo_code = (beo_code << 1) + cur_bit;
|
123
|
+
if (++cnt_bit == N_BITS) {
|
124
|
+
fsm = RxSt::RX_STOP;
|
125
|
+
}
|
126
|
+
break;
|
127
|
+
}
|
128
|
+
case RxSt::RX_STOP: {
|
129
|
+
if (PC_STOP == pulse_code) {
|
130
|
+
data.source = (uint8_t) ((beo_code >> 8) & 0xff);
|
131
|
+
data.command = (uint8_t) ((beo_code) &0xff);
|
132
|
+
data.repeats++;
|
133
|
+
}
|
134
|
+
if ((n_sym - ic) < 42) {
|
135
|
+
return data;
|
136
|
+
} else {
|
137
|
+
fsm = RxSt::RX_IDLE;
|
138
|
+
}
|
139
|
+
break;
|
140
|
+
}
|
141
|
+
}
|
142
|
+
}
|
143
|
+
}
|
144
|
+
}
|
145
|
+
return {}; // decoding failed
|
146
|
+
}
|
147
|
+
|
148
|
+
void Beo4Protocol::dump(const Beo4Data &data) {
|
149
|
+
ESP_LOGI(TAG, "Beo4: source=0x%02x command=0x%02x repeats=%d ", data.source, data.command, data.repeats);
|
150
|
+
}
|
151
|
+
|
152
|
+
} // namespace remote_base
|
153
|
+
} // namespace esphome
|
@@ -0,0 +1,43 @@
|
|
1
|
+
#pragma once
|
2
|
+
|
3
|
+
#include "remote_base.h"
|
4
|
+
|
5
|
+
#include <cinttypes>
|
6
|
+
|
7
|
+
namespace esphome {
|
8
|
+
namespace remote_base {
|
9
|
+
|
10
|
+
struct Beo4Data {
|
11
|
+
uint8_t source; // beoSource, e.g. video, audio, light...
|
12
|
+
uint8_t command; // beoCommend, e.g. volume+, mute,...
|
13
|
+
uint8_t repeats; // beoRepeat for repeat commands, e.g. up, down...
|
14
|
+
|
15
|
+
bool operator==(const Beo4Data &rhs) const { return source == rhs.source && command == rhs.command; }
|
16
|
+
};
|
17
|
+
|
18
|
+
class Beo4Protocol : public RemoteProtocol<Beo4Data> {
|
19
|
+
public:
|
20
|
+
void encode(RemoteTransmitData *dst, const Beo4Data &data) override;
|
21
|
+
optional<Beo4Data> decode(RemoteReceiveData src) override;
|
22
|
+
void dump(const Beo4Data &data) override;
|
23
|
+
};
|
24
|
+
|
25
|
+
DECLARE_REMOTE_PROTOCOL(Beo4)
|
26
|
+
|
27
|
+
template<typename... Ts> class Beo4Action : public RemoteTransmitterActionBase<Ts...> {
|
28
|
+
public:
|
29
|
+
TEMPLATABLE_VALUE(uint8_t, source)
|
30
|
+
TEMPLATABLE_VALUE(uint8_t, command)
|
31
|
+
TEMPLATABLE_VALUE(uint8_t, repeats)
|
32
|
+
|
33
|
+
void encode(RemoteTransmitData *dst, Ts... x) override {
|
34
|
+
Beo4Data data{};
|
35
|
+
data.source = this->source_.value(x...);
|
36
|
+
data.command = this->command_.value(x...);
|
37
|
+
data.repeats = this->repeats_.value(x...);
|
38
|
+
Beo4Protocol().encode(dst, data);
|
39
|
+
}
|
40
|
+
};
|
41
|
+
|
42
|
+
} // namespace remote_base
|
43
|
+
} // namespace esphome
|
@@ -0,0 +1,131 @@
|
|
1
|
+
#include "gobox_protocol.h"
|
2
|
+
#include "esphome/core/log.h"
|
3
|
+
|
4
|
+
namespace esphome {
|
5
|
+
namespace remote_base {
|
6
|
+
|
7
|
+
static const char *const TAG = "remote.gobox";
|
8
|
+
|
9
|
+
constexpr uint32_t BIT_MARK_US = 580; // 70us seems like a safe time delta for the receiver...
|
10
|
+
constexpr uint32_t BIT_ONE_SPACE_US = 1640;
|
11
|
+
constexpr uint32_t BIT_ZERO_SPACE_US = 545;
|
12
|
+
constexpr uint64_t HEADER = 0b011001001100010uL; // 15 bits
|
13
|
+
constexpr uint64_t HEADER_SIZE = 15;
|
14
|
+
constexpr uint64_t CODE_SIZE = 17;
|
15
|
+
|
16
|
+
void GoboxProtocol::dump_timings_(const RawTimings &timings) const {
|
17
|
+
ESP_LOGD(TAG, "Gobox: size=%u", timings.size());
|
18
|
+
for (int32_t timing : timings) {
|
19
|
+
ESP_LOGD(TAG, "Gobox: timing=%ld", (long) timing);
|
20
|
+
}
|
21
|
+
}
|
22
|
+
|
23
|
+
void GoboxProtocol::encode(RemoteTransmitData *dst, const GoboxData &data) {
|
24
|
+
ESP_LOGI(TAG, "Send Gobox: code=0x%x", data.code);
|
25
|
+
dst->set_carrier_frequency(38000);
|
26
|
+
dst->reserve((HEADER_SIZE + CODE_SIZE + 1) * 2);
|
27
|
+
uint64_t code = (HEADER << CODE_SIZE) | (data.code & ((1UL << CODE_SIZE) - 1));
|
28
|
+
ESP_LOGI(TAG, "Send Gobox: code=0x%Lx", code);
|
29
|
+
for (int16_t i = (HEADER_SIZE + CODE_SIZE - 1); i >= 0; i--) {
|
30
|
+
if (code & ((uint64_t) 1 << i)) {
|
31
|
+
dst->item(BIT_MARK_US, BIT_ONE_SPACE_US);
|
32
|
+
} else {
|
33
|
+
dst->item(BIT_MARK_US, BIT_ZERO_SPACE_US);
|
34
|
+
}
|
35
|
+
}
|
36
|
+
dst->item(BIT_MARK_US, 2000);
|
37
|
+
|
38
|
+
dump_timings_(dst->get_data());
|
39
|
+
}
|
40
|
+
|
41
|
+
optional<GoboxData> GoboxProtocol::decode(RemoteReceiveData src) {
|
42
|
+
if (src.size() < ((HEADER_SIZE + CODE_SIZE) * 2 + 1)) {
|
43
|
+
return {};
|
44
|
+
}
|
45
|
+
|
46
|
+
// First check for the header
|
47
|
+
uint64_t code = HEADER;
|
48
|
+
for (int16_t i = HEADER_SIZE - 1; i >= 0; i--) {
|
49
|
+
if (code & ((uint64_t) 1 << i)) {
|
50
|
+
if (!src.expect_item(BIT_MARK_US, BIT_ONE_SPACE_US)) {
|
51
|
+
return {};
|
52
|
+
}
|
53
|
+
} else {
|
54
|
+
if (!src.expect_item(BIT_MARK_US, BIT_ZERO_SPACE_US)) {
|
55
|
+
return {};
|
56
|
+
}
|
57
|
+
}
|
58
|
+
}
|
59
|
+
|
60
|
+
// Next, build up the code
|
61
|
+
code = 0UL;
|
62
|
+
for (int16_t i = CODE_SIZE - 1; i >= 0; i--) {
|
63
|
+
if (!src.expect_mark(BIT_MARK_US)) {
|
64
|
+
return {};
|
65
|
+
}
|
66
|
+
if (src.expect_space(BIT_ONE_SPACE_US)) {
|
67
|
+
code |= (1UL << i);
|
68
|
+
} else if (!src.expect_space(BIT_ZERO_SPACE_US)) {
|
69
|
+
return {};
|
70
|
+
}
|
71
|
+
}
|
72
|
+
|
73
|
+
if (!src.expect_mark(BIT_MARK_US)) {
|
74
|
+
return {};
|
75
|
+
}
|
76
|
+
|
77
|
+
dump_timings_(src.get_raw_data());
|
78
|
+
|
79
|
+
GoboxData out;
|
80
|
+
out.code = code;
|
81
|
+
|
82
|
+
return out;
|
83
|
+
}
|
84
|
+
|
85
|
+
void GoboxProtocol::dump(const GoboxData &data) {
|
86
|
+
ESP_LOGI(TAG, "Received Gobox: code=0x%x", data.code);
|
87
|
+
switch (data.code) {
|
88
|
+
case GOBOX_MENU:
|
89
|
+
ESP_LOGI(TAG, "Received Gobox: key=MENU");
|
90
|
+
break;
|
91
|
+
case GOBOX_RETURN:
|
92
|
+
ESP_LOGI(TAG, "Received Gobox: key=RETURN");
|
93
|
+
break;
|
94
|
+
case GOBOX_UP:
|
95
|
+
ESP_LOGI(TAG, "Received Gobox: key=UP");
|
96
|
+
break;
|
97
|
+
case GOBOX_LEFT:
|
98
|
+
ESP_LOGI(TAG, "Received Gobox: key=LEFT");
|
99
|
+
break;
|
100
|
+
case GOBOX_RIGHT:
|
101
|
+
ESP_LOGI(TAG, "Received Gobox: key=RIGHT");
|
102
|
+
break;
|
103
|
+
case GOBOX_DOWN:
|
104
|
+
ESP_LOGI(TAG, "Received Gobox: key=DOWN");
|
105
|
+
break;
|
106
|
+
case GOBOX_OK:
|
107
|
+
ESP_LOGI(TAG, "Received Gobox: key=OK");
|
108
|
+
break;
|
109
|
+
case GOBOX_TOGGLE:
|
110
|
+
ESP_LOGI(TAG, "Received Gobox: key=TOGGLE");
|
111
|
+
break;
|
112
|
+
case GOBOX_PROFILE:
|
113
|
+
ESP_LOGI(TAG, "Received Gobox: key=PROFILE");
|
114
|
+
break;
|
115
|
+
case GOBOX_FASTER:
|
116
|
+
ESP_LOGI(TAG, "Received Gobox: key=FASTER");
|
117
|
+
break;
|
118
|
+
case GOBOX_SLOWER:
|
119
|
+
ESP_LOGI(TAG, "Received Gobox: key=SLOWER");
|
120
|
+
break;
|
121
|
+
case GOBOX_LOUDER:
|
122
|
+
ESP_LOGI(TAG, "Received Gobox: key=LOUDER");
|
123
|
+
break;
|
124
|
+
case GOBOX_SOFTER:
|
125
|
+
ESP_LOGI(TAG, "Received Gobox: key=SOFTER");
|
126
|
+
break;
|
127
|
+
}
|
128
|
+
}
|
129
|
+
|
130
|
+
} // namespace remote_base
|
131
|
+
} // namespace esphome
|
@@ -0,0 +1,54 @@
|
|
1
|
+
#pragma once
|
2
|
+
|
3
|
+
#include "esphome/core/component.h"
|
4
|
+
#include "remote_base.h"
|
5
|
+
|
6
|
+
namespace esphome {
|
7
|
+
namespace remote_base {
|
8
|
+
|
9
|
+
struct GoboxData {
|
10
|
+
int code;
|
11
|
+
bool operator==(const GoboxData &rhs) const { return code == rhs.code; }
|
12
|
+
};
|
13
|
+
|
14
|
+
enum {
|
15
|
+
GOBOX_MENU = 0xaa55,
|
16
|
+
GOBOX_RETURN = 0x22dd,
|
17
|
+
GOBOX_UP = 0x0af5,
|
18
|
+
GOBOX_LEFT = 0x8a75,
|
19
|
+
GOBOX_RIGHT = 0x48b7,
|
20
|
+
GOBOX_DOWN = 0xa25d,
|
21
|
+
GOBOX_OK = 0xc837,
|
22
|
+
GOBOX_TOGGLE = 0xb847,
|
23
|
+
GOBOX_PROFILE = 0xfa05,
|
24
|
+
GOBOX_FASTER = 0xf00f,
|
25
|
+
GOBOX_SLOWER = 0xd02f,
|
26
|
+
GOBOX_LOUDER = 0xb04f,
|
27
|
+
GOBOX_SOFTER = 0xf807,
|
28
|
+
};
|
29
|
+
|
30
|
+
class GoboxProtocol : public RemoteProtocol<GoboxData> {
|
31
|
+
private:
|
32
|
+
void dump_timings_(const RawTimings &timings) const;
|
33
|
+
|
34
|
+
public:
|
35
|
+
void encode(RemoteTransmitData *dst, const GoboxData &data) override;
|
36
|
+
optional<GoboxData> decode(RemoteReceiveData src) override;
|
37
|
+
void dump(const GoboxData &data) override;
|
38
|
+
};
|
39
|
+
|
40
|
+
DECLARE_REMOTE_PROTOCOL(Gobox)
|
41
|
+
|
42
|
+
template<typename... Ts> class GoboxAction : public RemoteTransmitterActionBase<Ts...> {
|
43
|
+
public:
|
44
|
+
TEMPLATABLE_VALUE(uint64_t, code);
|
45
|
+
|
46
|
+
void encode(RemoteTransmitData *dst, Ts... x) override {
|
47
|
+
GoboxData data{};
|
48
|
+
data.code = this->code_.value(x...);
|
49
|
+
GoboxProtocol().encode(dst, data);
|
50
|
+
}
|
51
|
+
};
|
52
|
+
|
53
|
+
} // namespace remote_base
|
54
|
+
} // namespace esphome
|
@@ -208,7 +208,6 @@ void RemoteReceiverComponent::loop() {
|
|
208
208
|
this->store_.buffer_read = next_read;
|
209
209
|
|
210
210
|
if (!this->temp_.empty()) {
|
211
|
-
this->temp_.push_back(-this->idle_us_);
|
212
211
|
this->call_listeners_dumpers_();
|
213
212
|
}
|
214
213
|
}
|
@@ -219,11 +218,9 @@ void RemoteReceiverComponent::loop() {
|
|
219
218
|
this->decode_rmt_(item, len / sizeof(rmt_item32_t));
|
220
219
|
vRingbufferReturnItem(this->ringbuf_, item);
|
221
220
|
|
222
|
-
if (this->temp_.empty())
|
223
|
-
|
224
|
-
|
225
|
-
this->temp_.push_back(-this->idle_us_);
|
226
|
-
this->call_listeners_dumpers_();
|
221
|
+
if (!this->temp_.empty()) {
|
222
|
+
this->call_listeners_dumpers_();
|
223
|
+
}
|
227
224
|
}
|
228
225
|
#endif
|
229
226
|
}
|
@@ -234,6 +231,7 @@ void RemoteReceiverComponent::decode_rmt_(rmt_symbol_word_t *item, size_t item_c
|
|
234
231
|
void RemoteReceiverComponent::decode_rmt_(rmt_item32_t *item, size_t item_count) {
|
235
232
|
#endif
|
236
233
|
bool prev_level = false;
|
234
|
+
bool idle_level = false;
|
237
235
|
uint32_t prev_length = 0;
|
238
236
|
this->temp_.clear();
|
239
237
|
int32_t multiplier = this->pin_->is_inverted() ? -1 : 1;
|
@@ -266,7 +264,7 @@ void RemoteReceiverComponent::decode_rmt_(rmt_item32_t *item, size_t item_count)
|
|
266
264
|
} else if ((bool(item[i].level0) == prev_level) || (item[i].duration0 < filter_ticks)) {
|
267
265
|
prev_length += item[i].duration0;
|
268
266
|
} else {
|
269
|
-
if (prev_length
|
267
|
+
if (prev_length >= filter_ticks) {
|
270
268
|
if (prev_level) {
|
271
269
|
this->temp_.push_back(this->to_microseconds_(prev_length) * multiplier);
|
272
270
|
} else {
|
@@ -276,6 +274,7 @@ void RemoteReceiverComponent::decode_rmt_(rmt_item32_t *item, size_t item_count)
|
|
276
274
|
prev_level = bool(item[i].level0);
|
277
275
|
prev_length = item[i].duration0;
|
278
276
|
}
|
277
|
+
idle_level = !bool(item[i].level0);
|
279
278
|
|
280
279
|
if (item[i].duration1 == 0u) {
|
281
280
|
// EOF, sometimes garbage follows, break early
|
@@ -283,7 +282,7 @@ void RemoteReceiverComponent::decode_rmt_(rmt_item32_t *item, size_t item_count)
|
|
283
282
|
} else if ((bool(item[i].level1) == prev_level) || (item[i].duration1 < filter_ticks)) {
|
284
283
|
prev_length += item[i].duration1;
|
285
284
|
} else {
|
286
|
-
if (prev_length
|
285
|
+
if (prev_length >= filter_ticks) {
|
287
286
|
if (prev_level) {
|
288
287
|
this->temp_.push_back(this->to_microseconds_(prev_length) * multiplier);
|
289
288
|
} else {
|
@@ -293,14 +292,22 @@ void RemoteReceiverComponent::decode_rmt_(rmt_item32_t *item, size_t item_count)
|
|
293
292
|
prev_level = bool(item[i].level1);
|
294
293
|
prev_length = item[i].duration1;
|
295
294
|
}
|
295
|
+
idle_level = !bool(item[i].level1);
|
296
296
|
}
|
297
|
-
if (prev_length
|
297
|
+
if (prev_length >= filter_ticks && prev_level != idle_level) {
|
298
298
|
if (prev_level) {
|
299
299
|
this->temp_.push_back(this->to_microseconds_(prev_length) * multiplier);
|
300
300
|
} else {
|
301
301
|
this->temp_.push_back(-int32_t(this->to_microseconds_(prev_length)) * multiplier);
|
302
302
|
}
|
303
303
|
}
|
304
|
+
if (!this->temp_.empty()) {
|
305
|
+
if (idle_level) {
|
306
|
+
this->temp_.push_back(this->idle_us_ * multiplier);
|
307
|
+
} else {
|
308
|
+
this->temp_.push_back(-int32_t(this->idle_us_) * multiplier);
|
309
|
+
}
|
310
|
+
}
|
304
311
|
}
|
305
312
|
|
306
313
|
} // namespace remote_receiver
|
@@ -43,13 +43,18 @@ void ResamplerSpeaker::setup() {
|
|
43
43
|
return;
|
44
44
|
}
|
45
45
|
|
46
|
-
this->output_speaker_->add_audio_output_callback(
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
46
|
+
this->output_speaker_->add_audio_output_callback([this](uint32_t new_frames, int64_t write_timestamp) {
|
47
|
+
if (this->audio_stream_info_.get_sample_rate() != this->target_stream_info_.get_sample_rate()) {
|
48
|
+
// Convert the number of frames from the target sample rate to the source sample rate. Track the remainder to
|
49
|
+
// avoid losing frames from integer division truncation.
|
50
|
+
const uint64_t numerator = new_frames * this->audio_stream_info_.get_sample_rate() + this->callback_remainder_;
|
51
|
+
const uint64_t denominator = this->target_stream_info_.get_sample_rate();
|
52
|
+
this->callback_remainder_ = numerator % denominator;
|
53
|
+
this->audio_output_callback_(numerator / denominator, write_timestamp);
|
54
|
+
} else {
|
55
|
+
this->audio_output_callback_(new_frames, write_timestamp);
|
56
|
+
}
|
57
|
+
});
|
53
58
|
}
|
54
59
|
|
55
60
|
void ResamplerSpeaker::loop() {
|
@@ -283,7 +288,6 @@ void ResamplerSpeaker::resample_task(void *params) {
|
|
283
288
|
xEventGroupSetBits(this_resampler->event_group_, ResamplingEventGroupBits::ERR_ESP_NOT_SUPPORTED);
|
284
289
|
}
|
285
290
|
|
286
|
-
this_resampler->playback_differential_ms_ = 0;
|
287
291
|
while (err == ESP_OK) {
|
288
292
|
uint32_t event_bits = xEventGroupGetBits(this_resampler->event_group_);
|
289
293
|
|
@@ -295,8 +299,6 @@ void ResamplerSpeaker::resample_task(void *params) {
|
|
295
299
|
int32_t ms_differential = 0;
|
296
300
|
audio::AudioResamplerState resampler_state = resampler->resample(false, &ms_differential);
|
297
301
|
|
298
|
-
this_resampler->playback_differential_ms_ += ms_differential;
|
299
|
-
|
300
302
|
if (resampler_state == audio::AudioResamplerState::FINISHED) {
|
301
303
|
break;
|
302
304
|
} else if (resampler_state == audio::AudioResamplerState::FAILED) {
|
@@ -18,6 +18,8 @@ from esphome.const import (
|
|
18
18
|
UNIT_CELSIUS,
|
19
19
|
UNIT_PARTS_PER_MILLION,
|
20
20
|
UNIT_PERCENT,
|
21
|
+
CONF_AUTOMATIC_SELF_CALIBRATION,
|
22
|
+
CONF_AMBIENT_PRESSURE_COMPENSATION,
|
21
23
|
)
|
22
24
|
|
23
25
|
DEPENDENCIES = ["i2c"]
|
@@ -33,10 +35,7 @@ ForceRecalibrationWithReference = scd30_ns.class_(
|
|
33
35
|
"ForceRecalibrationWithReference", automation.Action
|
34
36
|
)
|
35
37
|
|
36
|
-
CONF_AUTOMATIC_SELF_CALIBRATION = "automatic_self_calibration"
|
37
38
|
CONF_ALTITUDE_COMPENSATION = "altitude_compensation"
|
38
|
-
CONF_AMBIENT_PRESSURE_COMPENSATION = "ambient_pressure_compensation"
|
39
|
-
|
40
39
|
|
41
40
|
CONFIG_SCHEMA = (
|
42
41
|
cv.Schema(
|
@@ -20,6 +20,10 @@ from esphome.const import (
|
|
20
20
|
UNIT_CELSIUS,
|
21
21
|
UNIT_PARTS_PER_MILLION,
|
22
22
|
UNIT_PERCENT,
|
23
|
+
CONF_AUTOMATIC_SELF_CALIBRATION,
|
24
|
+
CONF_AMBIENT_PRESSURE_COMPENSATION,
|
25
|
+
CONF_AMBIENT_PRESSURE_COMPENSATION_SOURCE,
|
26
|
+
CONF_MEASUREMENT_MODE,
|
23
27
|
)
|
24
28
|
|
25
29
|
CODEOWNERS = ["@sjtrny", "@martgras"]
|
@@ -47,11 +51,6 @@ FactoryResetAction = scd4x_ns.class_("FactoryResetAction", automation.Action)
|
|
47
51
|
|
48
52
|
|
49
53
|
CONF_ALTITUDE_COMPENSATION = "altitude_compensation"
|
50
|
-
CONF_AMBIENT_PRESSURE_COMPENSATION = "ambient_pressure_compensation"
|
51
|
-
CONF_AMBIENT_PRESSURE_COMPENSATION_SOURCE = "ambient_pressure_compensation_source"
|
52
|
-
CONF_AUTOMATIC_SELF_CALIBRATION = "automatic_self_calibration"
|
53
|
-
CONF_MEASUREMENT_MODE = "measurement_mode"
|
54
|
-
|
55
54
|
|
56
55
|
CONFIG_SCHEMA = (
|
57
56
|
cv.Schema(
|
@@ -5,6 +5,7 @@ from esphome.const import (
|
|
5
5
|
DEVICE_CLASS_PRESSURE,
|
6
6
|
STATE_CLASS_MEASUREMENT,
|
7
7
|
UNIT_HECTOPASCAL,
|
8
|
+
CONF_MEASUREMENT_MODE,
|
8
9
|
)
|
9
10
|
|
10
11
|
DEPENDENCIES = ["i2c"]
|
@@ -22,7 +23,7 @@ MEASUREMENT_MODE = {
|
|
22
23
|
"mass_flow": MeasurementMode.MASS_FLOW_AVG,
|
23
24
|
"differential_pressure": MeasurementMode.DP_AVG,
|
24
25
|
}
|
25
|
-
|
26
|
+
|
26
27
|
|
27
28
|
CONFIG_SCHEMA = (
|
28
29
|
sensor.sensor_schema(
|
@@ -48,7 +48,7 @@ SELECT_OPERATION_OPTIONS = {
|
|
48
48
|
}
|
49
49
|
|
50
50
|
|
51
|
-
|
51
|
+
_SELECT_SCHEMA = (
|
52
52
|
cv.ENTITY_BASE_SCHEMA.extend(web_server.WEBSERVER_SORTING_SCHEMA)
|
53
53
|
.extend(cv.MQTT_COMMAND_COMPONENT_SCHEMA)
|
54
54
|
.extend(
|
@@ -64,29 +64,28 @@ SELECT_SCHEMA = (
|
|
64
64
|
)
|
65
65
|
)
|
66
66
|
|
67
|
-
_UNDEF = object()
|
68
|
-
|
69
67
|
|
70
68
|
def select_schema(
|
71
|
-
class_: MockObjClass
|
69
|
+
class_: MockObjClass,
|
72
70
|
*,
|
73
|
-
entity_category: str =
|
74
|
-
icon: str =
|
71
|
+
entity_category: str = cv.UNDEFINED,
|
72
|
+
icon: str = cv.UNDEFINED,
|
75
73
|
):
|
76
|
-
schema = cv.
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
74
|
+
schema = {cv.GenerateID(): cv.declare_id(class_)}
|
75
|
+
|
76
|
+
for key, default, validator in [
|
77
|
+
(CONF_ENTITY_CATEGORY, entity_category, cv.entity_category),
|
78
|
+
(CONF_ICON, icon, cv.icon),
|
79
|
+
]:
|
80
|
+
if default is not cv.UNDEFINED:
|
81
|
+
schema[cv.Optional(key, default=default)] = validator
|
82
|
+
|
83
|
+
return _SELECT_SCHEMA.extend(schema)
|
84
|
+
|
85
|
+
|
86
|
+
# Remove before 2025.11.0
|
87
|
+
SELECT_SCHEMA = select_schema(Select)
|
88
|
+
SELECT_SCHEMA.add_extra(cv.deprecated_schema_constant("select"))
|
90
89
|
|
91
90
|
|
92
91
|
async def setup_select_core_(var, config, *, options: list[str]):
|
@@ -4,6 +4,7 @@ import esphome.codegen as cg
|
|
4
4
|
from esphome.components import i2c, sensirion_common, sensor
|
5
5
|
import esphome.config_validation as cv
|
6
6
|
from esphome.const import (
|
7
|
+
CONF_GAIN_FACTOR,
|
7
8
|
CONF_HUMIDITY,
|
8
9
|
CONF_ID,
|
9
10
|
CONF_OFFSET,
|
@@ -43,7 +44,6 @@ RhtAccelerationMode = sen5x_ns.enum("RhtAccelerationMode")
|
|
43
44
|
CONF_ACCELERATION_MODE = "acceleration_mode"
|
44
45
|
CONF_ALGORITHM_TUNING = "algorithm_tuning"
|
45
46
|
CONF_AUTO_CLEANING_INTERVAL = "auto_cleaning_interval"
|
46
|
-
CONF_GAIN_FACTOR = "gain_factor"
|
47
47
|
CONF_GATING_MAX_DURATION_MINUTES = "gating_max_duration_minutes"
|
48
48
|
CONF_INDEX_OFFSET = "index_offset"
|
49
49
|
CONF_LEARNING_TIME_GAIN_HOURS = "learning_time_gain_hours"
|