esphome 2025.6.2__py3-none-any.whl → 2025.7.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 +1 -3
- esphome/codegen.py +2 -0
- esphome/components/ac_dimmer/ac_dimmer.cpp +6 -6
- esphome/components/adc/__init__.py +25 -1
- esphome/components/adc/adc_sensor.h +11 -11
- esphome/components/adc/adc_sensor_common.cpp +1 -1
- esphome/components/adc/adc_sensor_esp32.cpp +16 -8
- esphome/components/ade7880/ade7880.h +0 -2
- esphome/components/ads1115/ads1115.h +0 -1
- esphome/components/ads1118/ads1118.h +0 -1
- esphome/components/ags10/ags10.h +0 -2
- esphome/components/aic3204/aic3204.h +0 -1
- esphome/components/alarm_control_panel/__init__.py +5 -2
- esphome/components/alpha3/alpha3.h +0 -1
- esphome/components/am43/cover/am43_cover.h +0 -1
- esphome/components/am43/sensor/am43_sensor.h +0 -1
- esphome/components/analog_threshold/analog_threshold_binary_sensor.h +0 -2
- esphome/components/anova/anova.cpp +5 -1
- esphome/components/anova/anova.h +0 -1
- esphome/components/apds9960/apds9960.cpp +1 -1
- esphome/components/api/__init__.py +57 -21
- esphome/components/api/api_connection.cpp +344 -539
- esphome/components/api/api_connection.h +224 -141
- esphome/components/api/api_frame_helper.cpp +91 -127
- esphome/components/api/api_frame_helper.h +64 -54
- esphome/components/api/api_pb2.cpp +1837 -9044
- esphome/components/api/api_pb2.h +532 -685
- esphome/components/api/api_pb2_dump.cpp +4432 -0
- esphome/components/api/api_pb2_service.cpp +184 -425
- esphome/components/api/api_pb2_service.h +13 -6
- esphome/components/api/api_server.cpp +131 -167
- esphome/components/api/api_server.h +38 -10
- esphome/components/api/client.py +10 -4
- esphome/components/api/custom_api_device.h +8 -0
- esphome/components/api/list_entities.cpp +37 -104
- esphome/components/api/list_entities.h +33 -23
- esphome/components/api/proto.h +532 -26
- esphome/components/api/subscribe_state.cpp +23 -29
- esphome/components/api/subscribe_state.h +26 -19
- esphome/components/api/user_services.h +2 -0
- esphome/components/as3935_spi/as3935_spi.h +0 -2
- esphome/components/as5600/as5600.h +0 -1
- esphome/components/async_tcp/__init__.py +14 -5
- esphome/components/atc_mithermometer/atc_mithermometer.h +0 -1
- esphome/components/atm90e32/atm90e32.cpp +2 -1
- esphome/components/audio/audio_decoder.cpp +1 -1
- esphome/components/audio/audio_transfer_buffer.cpp +2 -2
- esphome/components/b_parasite/b_parasite.h +0 -1
- esphome/components/bedjet/bedjet_hub.cpp +5 -1
- esphome/components/bedjet/climate/bedjet_climate.cpp +5 -1
- esphome/components/beken_spi_led_strip/led_strip.cpp +4 -2
- esphome/components/bh1750/bh1750.cpp +5 -5
- esphome/components/binary_sensor/__init__.py +82 -5
- esphome/components/binary_sensor/automation.h +19 -1
- esphome/components/binary_sensor/binary_sensor.cpp +12 -30
- esphome/components/binary_sensor/binary_sensor.h +11 -25
- esphome/components/binary_sensor/filter.cpp +29 -24
- esphome/components/binary_sensor/filter.h +20 -10
- esphome/components/ble_client/output/ble_binary_output.h +0 -1
- esphome/components/ble_client/sensor/ble_rssi_sensor.cpp +5 -1
- esphome/components/ble_client/sensor/ble_rssi_sensor.h +0 -1
- esphome/components/ble_client/sensor/ble_sensor.cpp +5 -1
- esphome/components/ble_client/sensor/ble_sensor.h +0 -1
- esphome/components/ble_client/switch/ble_switch.h +0 -1
- esphome/components/ble_client/text_sensor/ble_text_sensor.cpp +5 -1
- esphome/components/ble_client/text_sensor/ble_text_sensor.h +0 -1
- esphome/components/ble_presence/ble_presence_device.h +0 -1
- esphome/components/ble_rssi/ble_rssi_sensor.h +0 -1
- esphome/components/ble_scanner/ble_scanner.h +0 -1
- esphome/components/bluetooth_proxy/bluetooth_connection.h +9 -2
- esphome/components/bluetooth_proxy/bluetooth_proxy.cpp +16 -6
- esphome/components/bluetooth_proxy/bluetooth_proxy.h +8 -2
- esphome/components/bme680/sensor.py +1 -1
- esphome/components/bmp581/bmp581.h +0 -2
- esphome/components/button/__init__.py +5 -2
- esphome/components/camera/__init__.py +1 -0
- esphome/components/camera/camera.cpp +22 -0
- esphome/components/camera/camera.h +80 -0
- esphome/components/canbus/__init__.py +1 -0
- esphome/components/cap1188/cap1188.h +0 -1
- esphome/components/captive_portal/__init__.py +12 -2
- esphome/components/captive_portal/captive_portal.cpp +12 -2
- esphome/components/captive_portal/captive_portal.h +5 -2
- esphome/components/ccs811/ccs811.h +0 -2
- esphome/components/climate/__init__.py +5 -2
- esphome/components/cm1106/sensor.py +2 -2
- esphome/components/const/__init__.py +2 -0
- esphome/components/copy/binary_sensor/copy_binary_sensor.h +0 -1
- esphome/components/copy/button/copy_button.h +0 -1
- esphome/components/copy/cover/copy_cover.h +0 -1
- esphome/components/copy/fan/copy_fan.h +0 -1
- esphome/components/copy/lock/copy_lock.h +0 -1
- esphome/components/copy/number/copy_number.h +0 -1
- esphome/components/copy/select/copy_select.h +0 -1
- esphome/components/copy/sensor/copy_sensor.h +0 -1
- esphome/components/copy/switch/copy_switch.h +0 -1
- esphome/components/copy/text/copy_text.h +0 -1
- esphome/components/copy/text_sensor/copy_text_sensor.h +0 -1
- esphome/components/cover/__init__.py +5 -2
- esphome/components/cs5460a/cs5460a.h +0 -1
- esphome/components/datetime/__init__.py +4 -2
- esphome/components/debug/__init__.py +20 -0
- esphome/components/debug/debug_esp32.cpp +2 -0
- esphome/components/deep_sleep/__init__.py +43 -9
- esphome/components/demo/__init__.py +2 -2
- esphome/components/display/display.cpp +4 -3
- esphome/components/display/display.h +0 -2
- esphome/components/display/display_buffer.cpp +1 -1
- esphome/components/ds2484/__init__.py +1 -0
- esphome/components/ds2484/ds2484.cpp +209 -0
- esphome/components/ds2484/ds2484.h +43 -0
- esphome/components/ds2484/one_wire.py +37 -0
- esphome/components/duty_time/duty_time_sensor.h +0 -1
- esphome/components/ens160_base/ens160_base.h +0 -1
- esphome/components/es7210/es7210.h +0 -1
- esphome/components/es7243e/es7243e.h +0 -1
- esphome/components/es8156/es8156.h +0 -1
- esphome/components/es8311/es8311.h +0 -1
- esphome/components/es8388/es8388.h +0 -1
- esphome/components/esp32/__init__.py +103 -135
- esphome/components/esp32/core.cpp +0 -4
- esphome/components/esp32/gpio.h +1 -1
- esphome/components/esp32/helpers.cpp +69 -0
- esphome/components/esp32_ble/ble.cpp +5 -6
- esphome/components/esp32_ble/ble.h +29 -14
- esphome/components/esp32_ble/ble_event.h +6 -6
- esphome/components/esp32_ble_client/ble_client_base.cpp +21 -6
- esphome/components/esp32_ble_client/ble_client_base.h +24 -9
- esphome/components/esp32_ble_tracker/__init__.py +2 -8
- esphome/components/esp32_ble_tracker/esp32_ble_tracker.cpp +5 -5
- esphome/components/esp32_ble_tracker/esp32_ble_tracker.h +11 -7
- esphome/components/esp32_camera/__init__.py +112 -98
- esphome/components/esp32_camera/esp32_camera.cpp +41 -31
- esphome/components/esp32_camera/esp32_camera.h +35 -30
- esphome/components/esp32_camera_web_server/__init__.py +2 -1
- esphome/components/esp32_camera_web_server/camera_web_server.cpp +8 -8
- esphome/components/esp32_camera_web_server/camera_web_server.h +3 -3
- esphome/components/esp32_hall/sensor.py +2 -21
- esphome/components/esp32_hosted/__init__.py +101 -0
- esphome/components/esp32_hosted/esp32_hosted.py.script +12 -0
- esphome/components/esp32_improv/esp32_improv_component.cpp +3 -0
- esphome/components/esp32_rmt/__init__.py +0 -58
- esphome/components/esp32_rmt_led_strip/led_strip.cpp +77 -63
- esphome/components/esp32_rmt_led_strip/led_strip.h +11 -17
- esphome/components/esp32_rmt_led_strip/light.py +14 -76
- esphome/components/esp32_touch/esp32_touch.h +174 -28
- esphome/components/esp32_touch/esp32_touch_common.cpp +162 -0
- esphome/components/esp32_touch/esp32_touch_v1.cpp +240 -0
- esphome/components/esp32_touch/esp32_touch_v2.cpp +397 -0
- esphome/components/esp8266/__init__.py +2 -0
- esphome/components/esp8266/gpio.cpp +10 -10
- esphome/components/esp8266/helpers.cpp +31 -0
- esphome/components/esp_ldo/__init__.py +10 -8
- esphome/components/esp_ldo/esp_ldo.h +3 -0
- esphome/components/esphome/ota/__init__.py +1 -0
- esphome/components/esphome/ota/ota_esphome.cpp +24 -19
- esphome/components/ethernet/__init__.py +42 -23
- esphome/components/ethernet/esp_eth_phy_jl1101.c +0 -16
- esphome/components/ethernet/ethernet_component.cpp +69 -29
- esphome/components/ethernet/ethernet_component.h +18 -10
- esphome/components/event/__init__.py +5 -2
- esphome/components/ezo/ezo.h +0 -1
- esphome/components/ezo_pmp/ezo_pmp.h +0 -1
- esphome/components/fan/__init__.py +5 -2
- esphome/components/fan/fan.cpp +4 -0
- esphome/components/feedback/feedback_cover.h +0 -1
- esphome/components/font/__init__.py +92 -82
- esphome/components/font/font.cpp +9 -2
- esphome/components/font/font.h +20 -5
- esphome/components/fs3000/fs3000.h +0 -1
- esphome/components/gcja5/gcja5.h +0 -1
- esphome/components/gl_r01_i2c/__init__.py +0 -0
- esphome/components/gl_r01_i2c/gl_r01_i2c.cpp +68 -0
- esphome/components/gl_r01_i2c/gl_r01_i2c.h +22 -0
- esphome/components/gl_r01_i2c/sensor.py +36 -0
- esphome/components/gp8403/gp8403.h +0 -1
- esphome/components/gpio/binary_sensor/__init__.py +39 -1
- esphome/components/gpio/binary_sensor/gpio_binary_sensor.cpp +77 -3
- esphome/components/gpio/binary_sensor/gpio_binary_sensor.h +40 -0
- esphome/components/grove_gas_mc_v2/grove_gas_mc_v2.h +0 -2
- esphome/components/he60r/he60r.h +0 -1
- esphome/components/heatpumpir/climate.py +2 -1
- esphome/components/heatpumpir/heatpumpir.cpp +1 -0
- esphome/components/heatpumpir/heatpumpir.h +1 -0
- esphome/components/honeywellabp2_i2c/honeywellabp2.h +0 -1
- esphome/components/host/__init__.py +3 -1
- esphome/components/host/helpers.cpp +57 -0
- esphome/components/http_request/__init__.py +19 -1
- esphome/components/http_request/http_request.h +1 -1
- esphome/components/http_request/http_request_arduino.cpp +0 -1
- esphome/components/http_request/http_request_arduino.h +1 -0
- esphome/components/http_request/http_request_idf.cpp +0 -1
- esphome/components/http_request/ota/ota_http_request.cpp +1 -1
- esphome/components/http_request/update/http_request_update.cpp +35 -16
- esphome/components/hydreon_rgxx/hydreon_rgxx.cpp +3 -9
- esphome/components/hydreon_rgxx/sensor.py +1 -1
- esphome/components/i2c/__init__.py +23 -11
- esphome/components/i2c/i2c_bus.h +8 -1
- esphome/components/i2c/i2c_bus_arduino.cpp +4 -3
- esphome/components/i2c/i2c_bus_arduino.h +6 -3
- esphome/components/i2c/i2c_bus_esp_idf.h +5 -3
- esphome/components/i2c_device/i2c_device.h +0 -1
- esphome/components/i2s_audio/__init__.py +2 -10
- esphome/components/i2s_audio/i2s_audio.cpp +1 -5
- esphome/components/i2s_audio/media_player/__init__.py +2 -2
- esphome/components/i2s_audio/speaker/__init__.py +1 -1
- esphome/components/i2s_audio/speaker/i2s_audio_speaker.cpp +2 -2
- esphome/components/iaqcore/iaqcore.h +0 -2
- esphome/components/image/__init__.py +123 -24
- esphome/components/improv_serial/improv_serial_component.cpp +0 -4
- esphome/components/ina219/ina219.cpp +7 -0
- esphome/components/ina219/ina219.h +1 -0
- esphome/components/ina260/ina260.h +0 -2
- esphome/components/inkbird_ibsth1_mini/inkbird_ibsth1_mini.h +0 -1
- esphome/components/inkplate6/display.py +15 -0
- esphome/components/inkplate6/inkplate.cpp +2 -2
- esphome/components/integration/integration_sensor.h +0 -1
- esphome/components/internal_temperature/internal_temperature.cpp +8 -27
- esphome/components/internal_temperature/sensor.py +0 -26
- esphome/components/interval/interval.h +0 -2
- esphome/components/json/__init__.py +1 -1
- esphome/components/json/json_util.cpp +56 -63
- esphome/components/ld2410/button/__init__.py +3 -3
- esphome/components/ld2410/button/factory_reset_button.cpp +9 -0
- esphome/components/ld2410/button/{reset_button.h → factory_reset_button.h} +2 -2
- esphome/components/ld2410/ld2410.cpp +421 -268
- esphome/components/ld2410/ld2410.h +44 -146
- esphome/components/ld2410/number/__init__.py +2 -2
- esphome/components/ld2410/sensor.py +1 -1
- esphome/components/ld2410/switch/__init__.py +1 -1
- esphome/components/ld2420/binary_sensor/ld2420_binary_sensor.cpp +2 -2
- esphome/components/ld2420/button/reconfig_buttons.cpp +1 -1
- esphome/components/ld2420/ld2420.cpp +252 -147
- esphome/components/ld2420/ld2420.h +52 -126
- esphome/components/ld2420/number/__init__.py +2 -2
- esphome/components/ld2420/number/gate_config_number.cpp +1 -1
- esphome/components/ld2420/select/operating_mode_select.cpp +1 -1
- esphome/components/ld2420/sensor/__init__.py +6 -2
- esphome/components/ld2420/sensor/ld2420_sensor.cpp +2 -2
- esphome/components/ld2420/sensor/ld2420_sensor.h +1 -1
- esphome/components/ld2420/text_sensor/text_sensor.cpp +2 -2
- esphome/components/ld2450/button/__init__.py +3 -3
- esphome/components/ld2450/button/factory_reset_button.cpp +9 -0
- esphome/components/ld2450/button/{reset_button.h → factory_reset_button.h} +2 -2
- esphome/components/ld2450/ld2450.cpp +384 -232
- esphome/components/ld2450/ld2450.h +60 -69
- esphome/components/ld2450/switch/__init__.py +1 -1
- esphome/components/ledc/ledc_output.cpp +1 -63
- esphome/components/libretiny/__init__.py +5 -3
- esphome/components/libretiny/const.py +5 -0
- esphome/components/libretiny/generate_components.py +1 -0
- esphome/components/libretiny/helpers.cpp +35 -0
- esphome/components/libretiny/lt_component.cpp +5 -3
- esphome/components/light/__init__.py +4 -2
- esphome/components/light/addressable_light.h +3 -3
- esphome/components/light/light_call.cpp +180 -243
- esphome/components/light/light_call.h +72 -20
- esphome/components/light/light_color_values.h +14 -14
- esphome/components/light/light_json_schema.cpp +17 -16
- esphome/components/light/light_state.h +15 -13
- esphome/components/light/transformers.h +2 -2
- esphome/components/ln882x/__init__.py +52 -0
- esphome/components/ln882x/boards.py +285 -0
- esphome/components/lock/__init__.py +5 -2
- esphome/components/logger/__init__.py +40 -3
- esphome/components/logger/logger.cpp +47 -12
- esphome/components/logger/logger.h +80 -49
- esphome/components/logger/logger_esp32.cpp +3 -3
- esphome/components/lps22/__init__.py +0 -0
- esphome/components/lps22/lps22.cpp +75 -0
- esphome/components/lps22/lps22.h +27 -0
- esphome/components/lps22/sensor.py +58 -0
- esphome/components/ltr390/ltr390.h +0 -1
- esphome/components/ltr501/ltr501.h +0 -1
- esphome/components/ltr_als_ps/ltr_als_ps.h +0 -1
- esphome/components/lvgl/__init__.py +1 -1
- esphome/components/lvgl/schemas.py +66 -6
- esphome/components/lvgl/styles.py +24 -16
- esphome/components/lvgl/widgets/__init__.py +12 -2
- esphome/components/lvgl/widgets/lv_bar.py +40 -19
- esphome/components/lvgl/widgets/meter.py +20 -13
- esphome/components/m5stack_8angle/light/m5stack_8angle_light.cpp +1 -1
- esphome/components/max9611/max9611.h +0 -1
- esphome/components/mcp23016/__init__.py +1 -1
- esphome/components/mcp23xxx_base/__init__.py +1 -1
- esphome/components/mcp4461/__init__.py +1 -1
- esphome/components/mcp4461/output/__init__.py +3 -2
- esphome/components/mcp9600/mcp9600.h +0 -2
- esphome/components/md5/md5.cpp +3 -3
- esphome/components/md5/md5.h +1 -6
- esphome/components/mdns/__init__.py +22 -11
- esphome/components/media_player/__init__.py +4 -3
- esphome/components/micro_wake_word/__init__.py +1 -5
- esphome/components/micro_wake_word/streaming_model.cpp +2 -2
- esphome/components/microphone/microphone.cpp +7 -9
- esphome/components/microphone/microphone.h +0 -2
- esphome/components/mipi_spi/display.py +1 -0
- esphome/components/mmc5603/mmc5603.cpp +1 -1
- esphome/components/modbus/modbus.cpp +33 -15
- esphome/components/modbus/modbus.h +9 -0
- esphome/components/modbus_controller/__init__.py +42 -10
- esphome/components/modbus_controller/modbus_controller.cpp +92 -11
- esphome/components/modbus_controller/modbus_controller.h +61 -7
- esphome/components/mopeka_pro_check/mopeka_pro_check.h +0 -1
- esphome/components/mopeka_std_check/mopeka_std_check.h +0 -1
- esphome/components/mpl3115a2/mpl3115a2.h +0 -2
- esphome/components/mqtt/__init__.py +16 -0
- esphome/components/mqtt/mqtt_alarm_control_panel.cpp +2 -1
- esphome/components/mqtt/mqtt_backend.h +2 -1
- esphome/components/mqtt/mqtt_backend_esp32.cpp +132 -47
- esphome/components/mqtt/mqtt_backend_esp32.h +106 -4
- esphome/components/mqtt/mqtt_binary_sensor.cpp +1 -0
- esphome/components/mqtt/mqtt_button.cpp +4 -1
- esphome/components/mqtt/mqtt_client.cpp +17 -9
- esphome/components/mqtt/mqtt_client.h +8 -3
- esphome/components/mqtt/mqtt_climate.cpp +6 -4
- esphome/components/mqtt/mqtt_component.cpp +3 -1
- esphome/components/mqtt/mqtt_cover.cpp +1 -0
- esphome/components/mqtt/mqtt_date.cpp +4 -3
- esphome/components/mqtt/mqtt_datetime.cpp +7 -6
- esphome/components/mqtt/mqtt_event.cpp +6 -3
- esphome/components/mqtt/mqtt_fan.cpp +1 -0
- esphome/components/mqtt/mqtt_light.cpp +8 -4
- esphome/components/mqtt/mqtt_lock.cpp +3 -1
- esphome/components/mqtt/mqtt_number.cpp +1 -0
- esphome/components/mqtt/mqtt_select.cpp +2 -1
- esphome/components/mqtt/mqtt_sensor.cpp +3 -1
- esphome/components/mqtt/mqtt_switch.cpp +3 -1
- esphome/components/mqtt/mqtt_text.cpp +1 -0
- esphome/components/mqtt/mqtt_text_sensor.cpp +3 -1
- esphome/components/mqtt/mqtt_time.cpp +4 -3
- esphome/components/mqtt/mqtt_update.cpp +1 -0
- esphome/components/mqtt/mqtt_valve.cpp +3 -1
- esphome/components/ms8607/ms8607.cpp +1 -1
- esphome/components/ms8607/ms8607.h +0 -1
- esphome/components/neopixelbus/light.py +4 -1
- esphome/components/neopixelbus/neopixelbus_light.h +1 -1
- esphome/components/network/__init__.py +4 -1
- esphome/components/network/ip_address.h +1 -0
- esphome/components/nextion/__init__.py +16 -0
- esphome/components/nextion/base_component.py +1 -0
- esphome/components/nextion/binary_sensor/nextion_binarysensor.cpp +1 -1
- esphome/components/nextion/display.py +14 -4
- esphome/components/nextion/nextion.cpp +166 -101
- esphome/components/nextion/nextion.h +84 -53
- esphome/components/nextion/nextion_commands.cpp +11 -10
- esphome/components/nextion/nextion_component.cpp +28 -28
- esphome/components/nextion/nextion_component.h +53 -18
- esphome/components/nextion/nextion_component_base.h +3 -0
- esphome/components/nextion/nextion_upload.cpp +36 -0
- esphome/components/nextion/nextion_upload_arduino.cpp +10 -35
- esphome/components/nextion/nextion_upload_idf.cpp +9 -33
- esphome/components/nextion/sensor/nextion_sensor.cpp +1 -1
- esphome/components/nextion/switch/nextion_switch.cpp +1 -1
- esphome/components/nextion/text_sensor/nextion_textsensor.cpp +1 -1
- esphome/components/nfc/nfc.cpp +3 -22
- esphome/components/nfc/nfc.h +3 -3
- esphome/components/number/__init__.py +5 -2
- esphome/components/online_image/__init__.py +9 -1
- esphome/components/online_image/online_image.cpp +17 -7
- esphome/components/online_image/online_image.h +10 -2
- esphome/components/opentherm/opentherm.cpp +7 -12
- esphome/components/opentherm/output/output.cpp +1 -1
- esphome/components/openthread/__init__.py +47 -40
- esphome/components/openthread/const.py +1 -0
- esphome/components/openthread/openthread_esp.cpp +27 -5
- esphome/components/opt3001/__init__.py +0 -0
- esphome/components/opt3001/opt3001.cpp +122 -0
- esphome/components/opt3001/opt3001.h +27 -0
- esphome/components/opt3001/sensor.py +35 -0
- esphome/components/ota/__init__.py +17 -0
- esphome/components/ota/ota_backend.h +27 -1
- esphome/components/ota/ota_backend_arduino_esp32.cpp +12 -2
- esphome/components/ota/ota_backend_arduino_esp32.h +3 -0
- esphome/components/ota/ota_backend_arduino_esp8266.cpp +18 -4
- esphome/components/ota/ota_backend_arduino_esp8266.h +3 -0
- esphome/components/ota/ota_backend_arduino_libretiny.cpp +12 -2
- esphome/components/ota/ota_backend_arduino_libretiny.h +3 -0
- esphome/components/ota/ota_backend_arduino_rp2040.cpp +9 -2
- esphome/components/ota/ota_backend_arduino_rp2040.h +3 -0
- esphome/components/ota/ota_backend_esp_idf.cpp +10 -16
- esphome/components/ota/ota_backend_esp_idf.h +1 -0
- esphome/components/packages/__init__.py +5 -2
- esphome/components/packet_transport/binary_sensor.py +61 -4
- esphome/components/packet_transport/packet_transport.cpp +34 -1
- esphome/components/packet_transport/packet_transport.h +11 -5
- esphome/components/pcf8574/__init__.py +1 -1
- esphome/components/pi4ioe5v6408/__init__.py +84 -0
- esphome/components/pi4ioe5v6408/pi4ioe5v6408.cpp +171 -0
- esphome/components/pi4ioe5v6408/pi4ioe5v6408.h +70 -0
- esphome/components/pmsa003i/pmsa003i.h +0 -1
- esphome/components/pmsx003/pmsx003.h +0 -1
- esphome/components/pn7150/pn7150.cpp +7 -7
- esphome/components/pn7150/pn7150.h +0 -1
- esphome/components/pn7160/pn7160.cpp +7 -7
- esphome/components/pn7160/pn7160.h +0 -1
- esphome/components/preferences/syncer.h +2 -0
- esphome/components/prometheus/prometheus_handler.h +1 -1
- esphome/components/psram/psram.cpp +0 -20
- esphome/components/pulse_counter/pulse_counter_sensor.h +0 -1
- esphome/components/pulse_meter/pulse_meter_sensor.cpp +8 -4
- esphome/components/pulse_width/pulse_width.h +0 -1
- esphome/components/pvvx_mithermometer/display/pvvx_display.cpp +0 -4
- esphome/components/pvvx_mithermometer/display/pvvx_display.h +0 -2
- esphome/components/pvvx_mithermometer/pvvx_mithermometer.h +0 -1
- esphome/components/qr_code/__init__.py +13 -10
- esphome/components/qwiic_pir/qwiic_pir.h +0 -1
- esphome/components/radon_eye_ble/radon_eye_listener.cpp +1 -1
- esphome/components/rc522/rc522.h +0 -1
- esphome/components/rdm6300/rdm6300.h +0 -2
- esphome/components/remote_base/__init__.py +7 -5
- esphome/components/remote_base/remote_base.cpp +24 -21
- esphome/components/remote_base/remote_base.h +3 -26
- esphome/components/remote_receiver/__init__.py +40 -46
- esphome/components/remote_receiver/remote_receiver.h +4 -18
- esphome/components/remote_receiver/remote_receiver_esp32.cpp +0 -87
- esphome/components/remote_receiver/remote_receiver_esp8266.cpp +1 -1
- esphome/components/remote_transmitter/__init__.py +42 -43
- esphome/components/remote_transmitter/remote_transmitter.h +2 -14
- esphome/components/remote_transmitter/remote_transmitter_esp32.cpp +0 -77
- esphome/components/resistance/resistance_sensor.h +0 -1
- esphome/components/rp2040/__init__.py +2 -0
- esphome/components/rp2040/helpers.cpp +55 -0
- esphome/components/rp2040_pio_led_strip/led_strip.cpp +2 -2
- esphome/components/rpi_dpi_rgb/rpi_dpi_rgb.cpp +0 -4
- esphome/components/rtttl/__init__.py +4 -4
- esphome/components/rtttl/rtttl.cpp +10 -1
- esphome/components/ruuvitag/ruuvitag.h +0 -1
- esphome/components/safe_mode/safe_mode.cpp +2 -0
- esphome/components/safe_mode/safe_mode.h +4 -1
- esphome/components/scd30/scd30.h +0 -1
- esphome/components/scd30/sensor.py +2 -2
- esphome/components/scd4x/scd4x.cpp +61 -54
- esphome/components/scd4x/scd4x.h +17 -15
- esphome/components/scd4x/sensor.py +4 -4
- esphome/components/script/script.h +0 -2
- esphome/components/sdp3x/sensor.py +1 -1
- esphome/components/select/__init__.py +5 -2
- esphome/components/sen5x/sen5x.h +0 -1
- esphome/components/senseair/senseair.h +0 -1
- esphome/components/sensor/__init__.py +4 -2
- esphome/components/sensor/filter.cpp +1 -1
- esphome/components/sensor/sensor.cpp +12 -6
- esphome/components/sensor/sensor.h +13 -5
- esphome/components/servo/servo.cpp +2 -2
- esphome/components/servo/servo.h +0 -1
- esphome/components/sfa30/sfa30.h +0 -1
- esphome/components/sgp30/sgp30.h +0 -1
- esphome/components/sgp4x/sgp4x.h +0 -1
- esphome/components/shelly_dimmer/stm32flash.cpp +1 -2
- esphome/components/sht4x/sht4x.h +0 -1
- esphome/components/sm300d2/sm300d2.h +0 -2
- esphome/components/smt100/sensor.py +8 -4
- esphome/components/smt100/smt100.cpp +5 -5
- esphome/components/smt100/smt100.h +3 -3
- esphome/components/sn74hc595/__init__.py +1 -1
- esphome/components/sn74hc595/sn74hc595.cpp +5 -4
- esphome/components/sntp/sntp_component.cpp +9 -3
- esphome/components/sntp/time.py +2 -0
- esphome/components/socket/__init__.py +17 -0
- esphome/components/spi/__init__.py +27 -6
- esphome/components/spi/spi.cpp +3 -2
- esphome/components/spi/spi.h +9 -3
- esphome/components/spi/spi_arduino.cpp +3 -5
- esphome/components/spi/spi_esp_idf.cpp +40 -21
- esphome/components/spi_led_strip/spi_led_strip.cpp +1 -1
- esphome/components/sps30/sps30.h +0 -1
- esphome/components/ssd1306_base/ssd1306_base.cpp +1 -1
- esphome/components/st7701s/st7701s.cpp +0 -4
- esphome/components/status/status_binary_sensor.h +0 -2
- esphome/components/substitutions/__init__.py +81 -21
- esphome/components/substitutions/jinja.py +99 -0
- esphome/components/sun/sun.cpp +3 -4
- esphome/components/switch/__init__.py +5 -2
- esphome/components/switch/binary_sensor/switch_binary_sensor.h +0 -1
- esphome/components/sx126x/__init__.py +317 -0
- esphome/components/sx126x/automation.h +62 -0
- esphome/components/sx126x/packet_transport/__init__.py +26 -0
- esphome/components/sx126x/packet_transport/sx126x_transport.cpp +26 -0
- esphome/components/sx126x/packet_transport/sx126x_transport.h +25 -0
- esphome/components/sx126x/sx126x.cpp +523 -0
- esphome/components/sx126x/sx126x.h +140 -0
- esphome/components/sx126x/sx126x_reg.h +163 -0
- esphome/components/sx127x/__init__.py +325 -0
- esphome/components/sx127x/automation.h +62 -0
- esphome/components/sx127x/packet_transport/__init__.py +26 -0
- esphome/components/sx127x/packet_transport/sx127x_transport.cpp +26 -0
- esphome/components/sx127x/packet_transport/sx127x_transport.h +25 -0
- esphome/components/sx127x/sx127x.cpp +498 -0
- esphome/components/sx127x/sx127x.h +128 -0
- esphome/components/sx127x/sx127x_reg.h +295 -0
- esphome/components/syslog/esphome_syslog.cpp +5 -3
- esphome/components/syslog/esphome_syslog.h +1 -1
- esphome/components/tca9555/__init__.py +1 -1
- esphome/components/template/binary_sensor/template_binary_sensor.cpp +1 -9
- esphome/components/text/__init__.py +5 -2
- esphome/components/text_sensor/__init__.py +5 -2
- esphome/components/thermostat/thermostat_climate.cpp +34 -31
- esphome/components/thermostat/thermostat_climate.h +43 -39
- esphome/components/time/__init__.py +16 -2
- esphome/components/time/real_time_clock.cpp +4 -0
- esphome/components/time/real_time_clock.h +5 -1
- esphome/components/tlc5971/tlc5971.cpp +4 -1
- esphome/components/tmp1075/tmp1075.h +0 -2
- esphome/components/tof10120/tof10120_sensor.h +0 -1
- esphome/components/tormatic/tormatic_cover.h +0 -1
- esphome/components/total_daily_energy/total_daily_energy.h +0 -1
- esphome/components/tsl2591/tsl2591.cpp +1 -1
- esphome/components/ttp229_bsf/ttp229_bsf.h +0 -1
- esphome/components/ttp229_lsf/ttp229_lsf.h +0 -1
- esphome/components/tx20/tx20.cpp +2 -2
- esphome/components/uart/__init__.py +18 -0
- esphome/components/uart/uart_component_esp_idf.cpp +1 -5
- esphome/components/update/__init__.py +5 -2
- esphome/components/update/update_entity.h +8 -0
- esphome/components/usb_host/__init__.py +5 -2
- esphome/components/usb_host/usb_host_client.cpp +10 -10
- esphome/components/usb_uart/cp210x.cpp +1 -1
- esphome/components/usb_uart/usb_uart.cpp +41 -44
- esphome/components/usb_uart/usb_uart.h +4 -3
- esphome/components/valve/__init__.py +5 -2
- esphome/components/vbus/vbus.h +0 -1
- esphome/components/veml3235/veml3235.h +0 -1
- esphome/components/veml7700/veml7700.h +0 -1
- esphome/components/vl53l0x/vl53l0x_sensor.h +0 -1
- esphome/components/voice_assistant/voice_assistant.cpp +4 -4
- esphome/components/watchdog/watchdog.cpp +0 -4
- esphome/components/waveshare_epaper/waveshare_epaper.cpp +6 -6
- esphome/components/web_server/__init__.py +34 -19
- esphome/components/web_server/ota/__init__.py +32 -0
- esphome/components/web_server/ota/ota_web_server.cpp +210 -0
- esphome/components/web_server/ota/ota_web_server.h +26 -0
- esphome/components/web_server/web_server.cpp +324 -439
- esphome/components/web_server/web_server.h +33 -23
- esphome/components/web_server/web_server_v1.cpp +4 -5
- esphome/components/web_server_base/__init__.py +5 -2
- esphome/components/web_server_base/web_server_base.cpp +2 -94
- esphome/components/web_server_base/web_server_base.h +5 -25
- esphome/components/web_server_idf/multipart.cpp +254 -0
- esphome/components/web_server_idf/multipart.h +86 -0
- esphome/components/web_server_idf/utils.cpp +32 -0
- esphome/components/web_server_idf/utils.h +10 -0
- esphome/components/web_server_idf/web_server_idf.cpp +164 -16
- esphome/components/web_server_idf/web_server_idf.h +11 -10
- esphome/components/wiegand/wiegand.cpp +2 -2
- esphome/components/wifi/__init__.py +18 -0
- esphome/components/wifi/wifi_component.cpp +17 -22
- esphome/components/wifi/wifi_component.h +27 -23
- esphome/components/wifi/wifi_component_esp32_arduino.cpp +52 -59
- esphome/components/wifi/wifi_component_esp8266.cpp +46 -46
- esphome/components/wifi/wifi_component_esp_idf.cpp +35 -36
- esphome/components/wifi/wifi_component_libretiny.cpp +26 -27
- esphome/components/wifi/wifi_component_pico_w.cpp +3 -3
- esphome/components/wifi_info/wifi_info_text_sensor.cpp +6 -6
- esphome/components/wireguard/__init__.py +2 -11
- esphome/components/xiaomi_ble/xiaomi_ble.cpp +13 -1
- esphome/components/xiaomi_ble/xiaomi_ble.h +1 -0
- esphome/components/xiaomi_cgd1/xiaomi_cgd1.h +0 -1
- esphome/components/xiaomi_cgdk2/xiaomi_cgdk2.h +0 -1
- esphome/components/xiaomi_cgg1/xiaomi_cgg1.h +0 -1
- esphome/components/xiaomi_cgpr1/xiaomi_cgpr1.h +0 -1
- esphome/components/xiaomi_gcls002/xiaomi_gcls002.h +0 -1
- esphome/components/xiaomi_hhccjcy01/xiaomi_hhccjcy01.h +0 -1
- esphome/components/xiaomi_hhccjcy10/xiaomi_hhccjcy10.h +0 -1
- esphome/components/xiaomi_hhccpot002/xiaomi_hhccpot002.h +0 -1
- esphome/components/xiaomi_jqjcy01ym/xiaomi_jqjcy01ym.h +0 -1
- esphome/components/xiaomi_lywsd02/xiaomi_lywsd02.h +0 -1
- esphome/components/xiaomi_lywsd02mmc/xiaomi_lywsd02mmc.h +0 -1
- esphome/components/xiaomi_lywsd03mmc/xiaomi_lywsd03mmc.h +0 -1
- esphome/components/xiaomi_lywsdcgq/xiaomi_lywsdcgq.h +0 -1
- esphome/components/xiaomi_mhoc303/xiaomi_mhoc303.h +0 -1
- esphome/components/xiaomi_mhoc401/xiaomi_mhoc401.h +0 -1
- esphome/components/xiaomi_miscale/xiaomi_miscale.h +0 -1
- esphome/components/xiaomi_mjyd02yla/xiaomi_mjyd02yla.h +0 -1
- esphome/components/xiaomi_mue4094rt/xiaomi_mue4094rt.h +0 -1
- esphome/components/xiaomi_rtcgq02lm/xiaomi_rtcgq02lm.h +0 -1
- esphome/components/xiaomi_wx08zm/xiaomi_wx08zm.h +0 -1
- esphome/components/xiaomi_xmwsdj04mmc/__init__.py +0 -0
- esphome/components/xiaomi_xmwsdj04mmc/sensor.py +77 -0
- esphome/components/xiaomi_xmwsdj04mmc/xiaomi_xmwsdj04mmc.cpp +77 -0
- esphome/components/xiaomi_xmwsdj04mmc/xiaomi_xmwsdj04mmc.h +36 -0
- esphome/components/zio_ultrasonic/zio_ultrasonic.h +0 -2
- esphome/components/zyaura/zyaura.h +0 -1
- esphome/config.py +88 -22
- esphome/config_helpers.py +74 -1
- esphome/config_validation.py +12 -1
- esphome/const.py +65 -10
- esphome/core/__init__.py +18 -2
- esphome/core/application.cpp +169 -10
- esphome/core/application.h +145 -165
- esphome/core/area.h +19 -0
- esphome/core/automation.h +58 -9
- esphome/core/color.cpp +3 -5
- esphome/core/color.h +16 -16
- esphome/core/component.cpp +156 -22
- esphome/core/component.h +98 -4
- esphome/core/component_iterator.cpp +11 -9
- esphome/core/component_iterator.h +12 -10
- esphome/core/config.py +155 -6
- esphome/core/controller.cpp +4 -2
- esphome/core/controller.h +1 -1
- esphome/core/datatypes.h +2 -2
- esphome/core/defines.h +17 -2
- esphome/core/device.h +20 -0
- esphome/core/entity_base.cpp +20 -15
- esphome/core/entity_base.h +76 -0
- esphome/core/entity_helpers.py +168 -1
- esphome/core/event_pool.h +81 -0
- esphome/core/helpers.cpp +75 -230
- esphome/core/helpers.h +165 -105
- esphome/core/lock_free_queue.h +151 -0
- esphome/core/log.cpp +2 -2
- esphome/core/log.h +2 -0
- esphome/core/optional.h +5 -0
- esphome/core/ring_buffer.cpp +2 -2
- esphome/core/scheduler.cpp +275 -103
- esphome/core/scheduler.h +154 -17
- esphome/core/time.cpp +5 -5
- esphome/core/time.h +5 -5
- esphome/cpp_generator.py +17 -0
- esphome/cpp_helpers.py +0 -22
- esphome/cpp_types.py +3 -1
- esphome/dashboard/entries.py +1 -1
- esphome/dashboard/util/text.py +5 -21
- esphome/dashboard/web_server.py +9 -1
- esphome/helpers.py +47 -0
- esphome/loader.py +15 -1
- esphome/pins.py +14 -8
- esphome/platformio_api.py +2 -0
- esphome/wizard.py +17 -4
- esphome/writer.py +44 -3
- esphome/yaml_util.py +0 -2
- {esphome-2025.6.2.dist-info → esphome-2025.7.0.dist-info}/METADATA +10 -9
- {esphome-2025.6.2.dist-info → esphome-2025.7.0.dist-info}/RECORD +639 -580
- esphome/components/api/api_pb2_size.h +0 -361
- esphome/components/esp32_ble/ble_event_pool.h +0 -72
- esphome/components/esp32_ble/queue.h +0 -85
- esphome/components/esp32_hall/esp32_hall.cpp +0 -25
- esphome/components/esp32_hall/esp32_hall.h +0 -23
- esphome/components/esp32_touch/esp32_touch.cpp +0 -355
- esphome/components/ld2410/button/reset_button.cpp +0 -9
- esphome/components/ld2450/button/reset_button.cpp +0 -9
- esphome/components/openthread/tlv.py +0 -65
- /esphome/{dashboard/enum.py → enum.py} +0 -0
- {esphome-2025.6.2.dist-info → esphome-2025.7.0.dist-info}/WHEEL +0 -0
- {esphome-2025.6.2.dist-info → esphome-2025.7.0.dist-info}/entry_points.txt +0 -0
- {esphome-2025.6.2.dist-info → esphome-2025.7.0.dist-info}/licenses/LICENSE +0 -0
- {esphome-2025.6.2.dist-info → esphome-2025.7.0.dist-info}/top_level.txt +0 -0
|
@@ -7,43 +7,26 @@ namespace binary_sensor {
|
|
|
7
7
|
|
|
8
8
|
static const char *const TAG = "binary_sensor";
|
|
9
9
|
|
|
10
|
-
void BinarySensor::
|
|
11
|
-
this->state_callback_.add(std::move(callback));
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
void BinarySensor::publish_state(bool state) {
|
|
15
|
-
if (!this->publish_dedup_.next(state))
|
|
16
|
-
return;
|
|
10
|
+
void BinarySensor::publish_state(bool new_state) {
|
|
17
11
|
if (this->filter_list_ == nullptr) {
|
|
18
|
-
this->send_state_internal(
|
|
12
|
+
this->send_state_internal(new_state);
|
|
19
13
|
} else {
|
|
20
|
-
this->filter_list_->input(
|
|
14
|
+
this->filter_list_->input(new_state);
|
|
21
15
|
}
|
|
22
16
|
}
|
|
23
|
-
void BinarySensor::publish_initial_state(bool
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
if (this->filter_list_ == nullptr) {
|
|
27
|
-
this->send_state_internal(state, true);
|
|
28
|
-
} else {
|
|
29
|
-
this->filter_list_->input(state, true);
|
|
30
|
-
}
|
|
17
|
+
void BinarySensor::publish_initial_state(bool new_state) {
|
|
18
|
+
this->invalidate_state();
|
|
19
|
+
this->publish_state(new_state);
|
|
31
20
|
}
|
|
32
|
-
void BinarySensor::send_state_internal(bool
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
this->has_state_ = true;
|
|
39
|
-
this->state = state;
|
|
40
|
-
if (!is_initial || this->publish_initial_state_) {
|
|
41
|
-
this->state_callback_.call(state);
|
|
21
|
+
void BinarySensor::send_state_internal(bool new_state) {
|
|
22
|
+
// copy the new state to the visible property for backwards compatibility, before any callbacks
|
|
23
|
+
this->state = new_state;
|
|
24
|
+
// Note that set_state_ de-dups and will only trigger callbacks if the state has actually changed
|
|
25
|
+
if (this->set_state_(new_state)) {
|
|
26
|
+
ESP_LOGD(TAG, "'%s': New state is %s", this->get_name().c_str(), ONOFF(new_state));
|
|
42
27
|
}
|
|
43
28
|
}
|
|
44
29
|
|
|
45
|
-
BinarySensor::BinarySensor() : state(false) {}
|
|
46
|
-
|
|
47
30
|
void BinarySensor::add_filter(Filter *filter) {
|
|
48
31
|
filter->parent_ = this;
|
|
49
32
|
if (this->filter_list_ == nullptr) {
|
|
@@ -60,7 +43,6 @@ void BinarySensor::add_filters(const std::vector<Filter *> &filters) {
|
|
|
60
43
|
this->add_filter(filter);
|
|
61
44
|
}
|
|
62
45
|
}
|
|
63
|
-
bool BinarySensor::has_state() const { return this->has_state_; }
|
|
64
46
|
bool BinarySensor::is_status_binary_sensor() const { return false; }
|
|
65
47
|
|
|
66
48
|
} // namespace binary_sensor
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
#pragma once
|
|
2
2
|
|
|
3
|
-
#include "esphome/core/component.h"
|
|
4
3
|
#include "esphome/core/entity_base.h"
|
|
5
4
|
#include "esphome/core/helpers.h"
|
|
6
5
|
#include "esphome/components/binary_sensor/filter.h"
|
|
@@ -34,52 +33,39 @@ namespace binary_sensor {
|
|
|
34
33
|
* The sub classes should notify the front-end of new states via the publish_state() method which
|
|
35
34
|
* handles inverted inputs for you.
|
|
36
35
|
*/
|
|
37
|
-
class BinarySensor : public
|
|
36
|
+
class BinarySensor : public StatefulEntityBase<bool>, public EntityBase_DeviceClass {
|
|
38
37
|
public:
|
|
39
|
-
explicit BinarySensor();
|
|
40
|
-
|
|
41
|
-
/** Add a callback to be notified of state changes.
|
|
42
|
-
*
|
|
43
|
-
* @param callback The void(bool) callback.
|
|
44
|
-
*/
|
|
45
|
-
void add_on_state_callback(std::function<void(bool)> &&callback);
|
|
38
|
+
explicit BinarySensor(){};
|
|
46
39
|
|
|
47
40
|
/** Publish a new state to the front-end.
|
|
48
41
|
*
|
|
49
|
-
* @param
|
|
42
|
+
* @param new_state The new state.
|
|
50
43
|
*/
|
|
51
|
-
void publish_state(bool
|
|
44
|
+
void publish_state(bool new_state);
|
|
52
45
|
|
|
53
46
|
/** Publish the initial state, this will not make the callback manager send callbacks
|
|
54
47
|
* and is meant only for the initial state on boot.
|
|
55
48
|
*
|
|
56
|
-
* @param
|
|
49
|
+
* @param new_state The new state.
|
|
57
50
|
*/
|
|
58
|
-
void publish_initial_state(bool
|
|
59
|
-
|
|
60
|
-
/// The current reported state of the binary sensor.
|
|
61
|
-
bool state{false};
|
|
51
|
+
void publish_initial_state(bool new_state);
|
|
62
52
|
|
|
63
53
|
void add_filter(Filter *filter);
|
|
64
54
|
void add_filters(const std::vector<Filter *> &filters);
|
|
65
55
|
|
|
66
|
-
void set_publish_initial_state(bool publish_initial_state) { this->publish_initial_state_ = publish_initial_state; }
|
|
67
|
-
|
|
68
56
|
// ========== INTERNAL METHODS ==========
|
|
69
57
|
// (In most use cases you won't need these)
|
|
70
|
-
void send_state_internal(bool
|
|
58
|
+
void send_state_internal(bool new_state);
|
|
71
59
|
|
|
72
60
|
/// Return whether this binary sensor has outputted a state.
|
|
73
|
-
virtual bool has_state() const;
|
|
74
|
-
|
|
75
61
|
virtual bool is_status_binary_sensor() const;
|
|
76
62
|
|
|
63
|
+
// For backward compatibility, provide an accessible property
|
|
64
|
+
|
|
65
|
+
bool state{};
|
|
66
|
+
|
|
77
67
|
protected:
|
|
78
|
-
CallbackManager<void(bool)> state_callback_{};
|
|
79
68
|
Filter *filter_list_{nullptr};
|
|
80
|
-
bool has_state_{false};
|
|
81
|
-
bool publish_initial_state_{false};
|
|
82
|
-
Deduplicator<bool> publish_dedup_;
|
|
83
69
|
};
|
|
84
70
|
|
|
85
71
|
class BinarySensorInitiallyOff : public BinarySensor {
|
|
@@ -9,37 +9,42 @@ namespace binary_sensor {
|
|
|
9
9
|
|
|
10
10
|
static const char *const TAG = "sensor.filter";
|
|
11
11
|
|
|
12
|
-
void Filter::output(bool value
|
|
13
|
-
if (!this->dedup_.next(value))
|
|
14
|
-
return;
|
|
15
|
-
|
|
12
|
+
void Filter::output(bool value) {
|
|
16
13
|
if (this->next_ == nullptr) {
|
|
17
|
-
this->parent_->send_state_internal(value
|
|
14
|
+
this->parent_->send_state_internal(value);
|
|
18
15
|
} else {
|
|
19
|
-
this->next_->input(value
|
|
16
|
+
this->next_->input(value);
|
|
20
17
|
}
|
|
21
18
|
}
|
|
22
|
-
void Filter::input(bool value
|
|
23
|
-
|
|
19
|
+
void Filter::input(bool value) {
|
|
20
|
+
if (!this->dedup_.next(value))
|
|
21
|
+
return;
|
|
22
|
+
auto b = this->new_value(value);
|
|
24
23
|
if (b.has_value()) {
|
|
25
|
-
this->output(*b
|
|
24
|
+
this->output(*b);
|
|
26
25
|
}
|
|
27
26
|
}
|
|
28
27
|
|
|
29
|
-
|
|
28
|
+
void TimeoutFilter::input(bool value) {
|
|
29
|
+
this->set_timeout("timeout", this->timeout_delay_.value(), [this]() { this->parent_->invalidate_state(); });
|
|
30
|
+
// we do not de-dup here otherwise changes from invalid to valid state will not be output
|
|
31
|
+
this->output(value);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
optional<bool> DelayedOnOffFilter::new_value(bool value) {
|
|
30
35
|
if (value) {
|
|
31
|
-
this->set_timeout("ON_OFF", this->on_delay_.value(), [this
|
|
36
|
+
this->set_timeout("ON_OFF", this->on_delay_.value(), [this]() { this->output(true); });
|
|
32
37
|
} else {
|
|
33
|
-
this->set_timeout("ON_OFF", this->off_delay_.value(), [this
|
|
38
|
+
this->set_timeout("ON_OFF", this->off_delay_.value(), [this]() { this->output(false); });
|
|
34
39
|
}
|
|
35
40
|
return {};
|
|
36
41
|
}
|
|
37
42
|
|
|
38
43
|
float DelayedOnOffFilter::get_setup_priority() const { return setup_priority::HARDWARE; }
|
|
39
44
|
|
|
40
|
-
optional<bool> DelayedOnFilter::new_value(bool value
|
|
45
|
+
optional<bool> DelayedOnFilter::new_value(bool value) {
|
|
41
46
|
if (value) {
|
|
42
|
-
this->set_timeout("ON", this->delay_.value(), [this
|
|
47
|
+
this->set_timeout("ON", this->delay_.value(), [this]() { this->output(true); });
|
|
43
48
|
return {};
|
|
44
49
|
} else {
|
|
45
50
|
this->cancel_timeout("ON");
|
|
@@ -49,9 +54,9 @@ optional<bool> DelayedOnFilter::new_value(bool value, bool is_initial) {
|
|
|
49
54
|
|
|
50
55
|
float DelayedOnFilter::get_setup_priority() const { return setup_priority::HARDWARE; }
|
|
51
56
|
|
|
52
|
-
optional<bool> DelayedOffFilter::new_value(bool value
|
|
57
|
+
optional<bool> DelayedOffFilter::new_value(bool value) {
|
|
53
58
|
if (!value) {
|
|
54
|
-
this->set_timeout("OFF", this->delay_.value(), [this
|
|
59
|
+
this->set_timeout("OFF", this->delay_.value(), [this]() { this->output(false); });
|
|
55
60
|
return {};
|
|
56
61
|
} else {
|
|
57
62
|
this->cancel_timeout("OFF");
|
|
@@ -61,11 +66,11 @@ optional<bool> DelayedOffFilter::new_value(bool value, bool is_initial) {
|
|
|
61
66
|
|
|
62
67
|
float DelayedOffFilter::get_setup_priority() const { return setup_priority::HARDWARE; }
|
|
63
68
|
|
|
64
|
-
optional<bool> InvertFilter::new_value(bool value
|
|
69
|
+
optional<bool> InvertFilter::new_value(bool value) { return !value; }
|
|
65
70
|
|
|
66
71
|
AutorepeatFilter::AutorepeatFilter(std::vector<AutorepeatFilterTiming> timings) : timings_(std::move(timings)) {}
|
|
67
72
|
|
|
68
|
-
optional<bool> AutorepeatFilter::new_value(bool value
|
|
73
|
+
optional<bool> AutorepeatFilter::new_value(bool value) {
|
|
69
74
|
if (value) {
|
|
70
75
|
// Ignore if already running
|
|
71
76
|
if (this->active_timing_ != 0)
|
|
@@ -101,7 +106,7 @@ void AutorepeatFilter::next_timing_() {
|
|
|
101
106
|
|
|
102
107
|
void AutorepeatFilter::next_value_(bool val) {
|
|
103
108
|
const AutorepeatFilterTiming &timing = this->timings_[this->active_timing_ - 2];
|
|
104
|
-
this->output(val
|
|
109
|
+
this->output(val); // This is at least the second one so not initial
|
|
105
110
|
this->set_timeout("ON_OFF", val ? timing.time_on : timing.time_off, [this, val]() { this->next_value_(!val); });
|
|
106
111
|
}
|
|
107
112
|
|
|
@@ -109,18 +114,18 @@ float AutorepeatFilter::get_setup_priority() const { return setup_priority::HARD
|
|
|
109
114
|
|
|
110
115
|
LambdaFilter::LambdaFilter(std::function<optional<bool>(bool)> f) : f_(std::move(f)) {}
|
|
111
116
|
|
|
112
|
-
optional<bool> LambdaFilter::new_value(bool value
|
|
117
|
+
optional<bool> LambdaFilter::new_value(bool value) { return this->f_(value); }
|
|
113
118
|
|
|
114
|
-
optional<bool> SettleFilter::new_value(bool value
|
|
119
|
+
optional<bool> SettleFilter::new_value(bool value) {
|
|
115
120
|
if (!this->steady_) {
|
|
116
|
-
this->set_timeout("SETTLE", this->delay_.value(), [this, value
|
|
121
|
+
this->set_timeout("SETTLE", this->delay_.value(), [this, value]() {
|
|
117
122
|
this->steady_ = true;
|
|
118
|
-
this->output(value
|
|
123
|
+
this->output(value);
|
|
119
124
|
});
|
|
120
125
|
return {};
|
|
121
126
|
} else {
|
|
122
127
|
this->steady_ = false;
|
|
123
|
-
this->output(value
|
|
128
|
+
this->output(value);
|
|
124
129
|
this->set_timeout("SETTLE", this->delay_.value(), [this]() { this->steady_ = true; });
|
|
125
130
|
return value;
|
|
126
131
|
}
|
|
@@ -14,11 +14,11 @@ class BinarySensor;
|
|
|
14
14
|
|
|
15
15
|
class Filter {
|
|
16
16
|
public:
|
|
17
|
-
virtual optional<bool> new_value(bool value
|
|
17
|
+
virtual optional<bool> new_value(bool value) = 0;
|
|
18
18
|
|
|
19
|
-
void input(bool value
|
|
19
|
+
virtual void input(bool value);
|
|
20
20
|
|
|
21
|
-
void output(bool value
|
|
21
|
+
void output(bool value);
|
|
22
22
|
|
|
23
23
|
protected:
|
|
24
24
|
friend BinarySensor;
|
|
@@ -28,9 +28,19 @@ class Filter {
|
|
|
28
28
|
Deduplicator<bool> dedup_;
|
|
29
29
|
};
|
|
30
30
|
|
|
31
|
+
class TimeoutFilter : public Filter, public Component {
|
|
32
|
+
public:
|
|
33
|
+
optional<bool> new_value(bool value) override { return value; }
|
|
34
|
+
void input(bool value) override;
|
|
35
|
+
template<typename T> void set_timeout_value(T timeout) { this->timeout_delay_ = timeout; }
|
|
36
|
+
|
|
37
|
+
protected:
|
|
38
|
+
TemplatableValue<uint32_t> timeout_delay_{};
|
|
39
|
+
};
|
|
40
|
+
|
|
31
41
|
class DelayedOnOffFilter : public Filter, public Component {
|
|
32
42
|
public:
|
|
33
|
-
optional<bool> new_value(bool value
|
|
43
|
+
optional<bool> new_value(bool value) override;
|
|
34
44
|
|
|
35
45
|
float get_setup_priority() const override;
|
|
36
46
|
|
|
@@ -44,7 +54,7 @@ class DelayedOnOffFilter : public Filter, public Component {
|
|
|
44
54
|
|
|
45
55
|
class DelayedOnFilter : public Filter, public Component {
|
|
46
56
|
public:
|
|
47
|
-
optional<bool> new_value(bool value
|
|
57
|
+
optional<bool> new_value(bool value) override;
|
|
48
58
|
|
|
49
59
|
float get_setup_priority() const override;
|
|
50
60
|
|
|
@@ -56,7 +66,7 @@ class DelayedOnFilter : public Filter, public Component {
|
|
|
56
66
|
|
|
57
67
|
class DelayedOffFilter : public Filter, public Component {
|
|
58
68
|
public:
|
|
59
|
-
optional<bool> new_value(bool value
|
|
69
|
+
optional<bool> new_value(bool value) override;
|
|
60
70
|
|
|
61
71
|
float get_setup_priority() const override;
|
|
62
72
|
|
|
@@ -68,7 +78,7 @@ class DelayedOffFilter : public Filter, public Component {
|
|
|
68
78
|
|
|
69
79
|
class InvertFilter : public Filter {
|
|
70
80
|
public:
|
|
71
|
-
optional<bool> new_value(bool value
|
|
81
|
+
optional<bool> new_value(bool value) override;
|
|
72
82
|
};
|
|
73
83
|
|
|
74
84
|
struct AutorepeatFilterTiming {
|
|
@@ -86,7 +96,7 @@ class AutorepeatFilter : public Filter, public Component {
|
|
|
86
96
|
public:
|
|
87
97
|
explicit AutorepeatFilter(std::vector<AutorepeatFilterTiming> timings);
|
|
88
98
|
|
|
89
|
-
optional<bool> new_value(bool value
|
|
99
|
+
optional<bool> new_value(bool value) override;
|
|
90
100
|
|
|
91
101
|
float get_setup_priority() const override;
|
|
92
102
|
|
|
@@ -102,7 +112,7 @@ class LambdaFilter : public Filter {
|
|
|
102
112
|
public:
|
|
103
113
|
explicit LambdaFilter(std::function<optional<bool>(bool)> f);
|
|
104
114
|
|
|
105
|
-
optional<bool> new_value(bool value
|
|
115
|
+
optional<bool> new_value(bool value) override;
|
|
106
116
|
|
|
107
117
|
protected:
|
|
108
118
|
std::function<optional<bool>(bool)> f_;
|
|
@@ -110,7 +120,7 @@ class LambdaFilter : public Filter {
|
|
|
110
120
|
|
|
111
121
|
class SettleFilter : public Filter, public Component {
|
|
112
122
|
public:
|
|
113
|
-
optional<bool> new_value(bool value
|
|
123
|
+
optional<bool> new_value(bool value) override;
|
|
114
124
|
|
|
115
125
|
float get_setup_priority() const override;
|
|
116
126
|
|
|
@@ -16,7 +16,6 @@ class BLEBinaryOutput : public output::BinaryOutput, public BLEClientNode, publi
|
|
|
16
16
|
public:
|
|
17
17
|
void dump_config() override;
|
|
18
18
|
void loop() override {}
|
|
19
|
-
float get_setup_priority() const override { return setup_priority::DATA; }
|
|
20
19
|
void set_service_uuid16(uint16_t uuid) { this->service_uuid_ = espbt::ESPBTUUID::from_uint16(uuid); }
|
|
21
20
|
void set_service_uuid32(uint32_t uuid) { this->service_uuid_ = espbt::ESPBTUUID::from_uint32(uuid); }
|
|
22
21
|
void set_service_uuid128(uint8_t *uuid) { this->service_uuid_ = espbt::ESPBTUUID::from_raw(uuid); }
|
|
@@ -11,7 +11,11 @@ namespace ble_client {
|
|
|
11
11
|
|
|
12
12
|
static const char *const TAG = "ble_rssi_sensor";
|
|
13
13
|
|
|
14
|
-
void BLEClientRSSISensor::loop() {
|
|
14
|
+
void BLEClientRSSISensor::loop() {
|
|
15
|
+
// Parent BLEClientNode has a loop() method, but this component uses
|
|
16
|
+
// polling via update() and BLE GAP callbacks so loop isn't needed
|
|
17
|
+
this->disable_loop();
|
|
18
|
+
}
|
|
15
19
|
|
|
16
20
|
void BLEClientRSSISensor::dump_config() {
|
|
17
21
|
LOG_SENSOR("", "BLE Client RSSI Sensor", this);
|
|
@@ -18,7 +18,6 @@ class BLEClientRSSISensor : public sensor::Sensor, public PollingComponent, publ
|
|
|
18
18
|
void loop() override;
|
|
19
19
|
void update() override;
|
|
20
20
|
void dump_config() override;
|
|
21
|
-
float get_setup_priority() const override { return setup_priority::DATA; }
|
|
22
21
|
|
|
23
22
|
void gap_event_handler(esp_gap_ble_cb_event_t event, esp_ble_gap_cb_param_t *param) override;
|
|
24
23
|
|
|
@@ -11,7 +11,11 @@ namespace ble_client {
|
|
|
11
11
|
|
|
12
12
|
static const char *const TAG = "ble_sensor";
|
|
13
13
|
|
|
14
|
-
void BLESensor::loop() {
|
|
14
|
+
void BLESensor::loop() {
|
|
15
|
+
// Parent BLEClientNode has a loop() method, but this component uses
|
|
16
|
+
// polling via update() and BLE callbacks so loop isn't needed
|
|
17
|
+
this->disable_loop();
|
|
18
|
+
}
|
|
15
19
|
|
|
16
20
|
void BLESensor::dump_config() {
|
|
17
21
|
LOG_SENSOR("", "BLE Sensor", this);
|
|
@@ -24,7 +24,6 @@ class BLESensor : public sensor::Sensor, public PollingComponent, public BLEClie
|
|
|
24
24
|
void gattc_event_handler(esp_gattc_cb_event_t event, esp_gatt_if_t gattc_if,
|
|
25
25
|
esp_ble_gattc_cb_param_t *param) override;
|
|
26
26
|
void dump_config() override;
|
|
27
|
-
float get_setup_priority() const override { return setup_priority::DATA; }
|
|
28
27
|
void set_service_uuid16(uint16_t uuid) { this->service_uuid_ = espbt::ESPBTUUID::from_uint16(uuid); }
|
|
29
28
|
void set_service_uuid32(uint32_t uuid) { this->service_uuid_ = espbt::ESPBTUUID::from_uint32(uuid); }
|
|
30
29
|
void set_service_uuid128(uint8_t *uuid) { this->service_uuid_ = espbt::ESPBTUUID::from_raw(uuid); }
|
|
@@ -19,7 +19,6 @@ class BLEClientSwitch : public switch_::Switch, public Component, public BLEClie
|
|
|
19
19
|
void loop() override {}
|
|
20
20
|
void gattc_event_handler(esp_gattc_cb_event_t event, esp_gatt_if_t gattc_if,
|
|
21
21
|
esp_ble_gattc_cb_param_t *param) override;
|
|
22
|
-
float get_setup_priority() const override { return setup_priority::DATA; }
|
|
23
22
|
|
|
24
23
|
protected:
|
|
25
24
|
void write_state(bool state) override;
|
|
@@ -14,7 +14,11 @@ static const char *const TAG = "ble_text_sensor";
|
|
|
14
14
|
|
|
15
15
|
static const std::string EMPTY = "";
|
|
16
16
|
|
|
17
|
-
void BLETextSensor::loop() {
|
|
17
|
+
void BLETextSensor::loop() {
|
|
18
|
+
// Parent BLEClientNode has a loop() method, but this component uses
|
|
19
|
+
// polling via update() and BLE callbacks so loop isn't needed
|
|
20
|
+
this->disable_loop();
|
|
21
|
+
}
|
|
18
22
|
|
|
19
23
|
void BLETextSensor::dump_config() {
|
|
20
24
|
LOG_TEXT_SENSOR("", "BLE Text Sensor", this);
|
|
@@ -20,7 +20,6 @@ class BLETextSensor : public text_sensor::TextSensor, public PollingComponent, p
|
|
|
20
20
|
void gattc_event_handler(esp_gattc_cb_event_t event, esp_gatt_if_t gattc_if,
|
|
21
21
|
esp_ble_gattc_cb_param_t *param) override;
|
|
22
22
|
void dump_config() override;
|
|
23
|
-
float get_setup_priority() const override { return setup_priority::DATA; }
|
|
24
23
|
void set_service_uuid16(uint16_t uuid) { this->service_uuid_ = espbt::ESPBTUUID::from_uint16(uuid); }
|
|
25
24
|
void set_service_uuid32(uint32_t uuid) { this->service_uuid_ = espbt::ESPBTUUID::from_uint32(uuid); }
|
|
26
25
|
void set_service_uuid128(uint8_t *uuid) { this->service_uuid_ = espbt::ESPBTUUID::from_raw(uuid); }
|
|
@@ -105,7 +105,6 @@ class BLEPresenceDevice : public binary_sensor::BinarySensorInitiallyOff,
|
|
|
105
105
|
this->set_found_(false);
|
|
106
106
|
}
|
|
107
107
|
void dump_config() override;
|
|
108
|
-
float get_setup_priority() const override { return setup_priority::DATA; }
|
|
109
108
|
|
|
110
109
|
protected:
|
|
111
110
|
void set_found_(bool state) {
|
|
@@ -99,7 +99,6 @@ class BLERSSISensor : public sensor::Sensor, public esp32_ble_tracker::ESPBTDevi
|
|
|
99
99
|
return false;
|
|
100
100
|
}
|
|
101
101
|
void dump_config() override;
|
|
102
|
-
float get_setup_priority() const override { return setup_priority::DATA; }
|
|
103
102
|
|
|
104
103
|
protected:
|
|
105
104
|
enum MatchType { MATCH_BY_MAC_ADDRESS, MATCH_BY_IRK, MATCH_BY_SERVICE_UUID, MATCH_BY_IBEACON_UUID };
|
|
@@ -26,10 +26,17 @@ class BluetoothConnection : public esp32_ble_client::BLEClientBase {
|
|
|
26
26
|
|
|
27
27
|
protected:
|
|
28
28
|
friend class BluetoothProxy;
|
|
29
|
-
bool seen_mtu_or_services_{false};
|
|
30
29
|
|
|
31
|
-
|
|
30
|
+
// Memory optimized layout for 32-bit systems
|
|
31
|
+
// Group 1: Pointers (4 bytes each, naturally aligned)
|
|
32
32
|
BluetoothProxy *proxy_;
|
|
33
|
+
|
|
34
|
+
// Group 2: 2-byte types
|
|
35
|
+
int16_t send_service_{-2}; // Needs to handle negative values and service count
|
|
36
|
+
|
|
37
|
+
// Group 3: 1-byte types
|
|
38
|
+
bool seen_mtu_or_services_{false};
|
|
39
|
+
// 1 byte used, 1 byte padding
|
|
33
40
|
};
|
|
34
41
|
|
|
35
42
|
} // namespace bluetooth_proxy
|
|
@@ -52,11 +52,21 @@ bool BluetoothProxy::parse_device(const esp32_ble_tracker::ESPBTDevice &device)
|
|
|
52
52
|
return true;
|
|
53
53
|
}
|
|
54
54
|
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
55
|
+
// Batch size for BLE advertisements to maximize WiFi efficiency
|
|
56
|
+
// Each advertisement is up to 80 bytes when packaged (including protocol overhead)
|
|
57
|
+
// Most advertisements are 20-30 bytes, allowing even more to fit per packet
|
|
58
|
+
// 16 advertisements × 80 bytes (worst case) = 1280 bytes out of ~1320 bytes usable payload
|
|
59
|
+
// This achieves ~97% WiFi MTU utilization while staying under the limit
|
|
60
|
+
static constexpr size_t FLUSH_BATCH_SIZE = 16;
|
|
61
|
+
|
|
62
|
+
namespace {
|
|
63
|
+
// Batch buffer in anonymous namespace to avoid guard variable (saves 8 bytes)
|
|
64
|
+
// This is initialized at program startup before any threads
|
|
65
|
+
// NOLINTNEXTLINE(cppcoreguidelines-avoid-non-const-global-variables)
|
|
66
|
+
std::vector<api::BluetoothLERawAdvertisement> batch_buffer;
|
|
67
|
+
} // namespace
|
|
68
|
+
|
|
69
|
+
static std::vector<api::BluetoothLERawAdvertisement> &get_batch_buffer() { return batch_buffer; }
|
|
60
70
|
|
|
61
71
|
bool BluetoothProxy::parse_devices(const esp32_ble::BLEScanResult *scan_results, size_t count) {
|
|
62
72
|
if (!api::global_api_server->is_connected() || this->api_connection_ == nullptr || !this->raw_advertisements_)
|
|
@@ -170,7 +180,7 @@ int BluetoothProxy::get_bluetooth_connections_free() {
|
|
|
170
180
|
void BluetoothProxy::loop() {
|
|
171
181
|
if (!api::global_api_server->is_connected() || this->api_connection_ == nullptr) {
|
|
172
182
|
for (auto *connection : this->connections_) {
|
|
173
|
-
if (connection->get_address() != 0) {
|
|
183
|
+
if (connection->get_address() != 0 && !connection->disconnect_pending()) {
|
|
174
184
|
connection->disconnect();
|
|
175
185
|
}
|
|
176
186
|
}
|
|
@@ -134,11 +134,17 @@ class BluetoothProxy : public esp32_ble_tracker::ESPBTDeviceListener, public Com
|
|
|
134
134
|
|
|
135
135
|
BluetoothConnection *get_connection_(uint64_t address, bool reserve);
|
|
136
136
|
|
|
137
|
-
|
|
137
|
+
// Memory optimized layout for 32-bit systems
|
|
138
|
+
// Group 1: Pointers (4 bytes each, naturally aligned)
|
|
139
|
+
api::APIConnection *api_connection_{nullptr};
|
|
138
140
|
|
|
141
|
+
// Group 2: Container types (typically 12 bytes on 32-bit)
|
|
139
142
|
std::vector<BluetoothConnection *> connections_{};
|
|
140
|
-
|
|
143
|
+
|
|
144
|
+
// Group 3: 1-byte types grouped together
|
|
145
|
+
bool active_;
|
|
141
146
|
bool raw_advertisements_{false};
|
|
147
|
+
// 2 bytes used, 2 bytes padding
|
|
142
148
|
};
|
|
143
149
|
|
|
144
150
|
extern BluetoothProxy *global_bluetooth_proxy; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables)
|
|
@@ -12,8 +12,8 @@ from esphome.const import (
|
|
|
12
12
|
CONF_OVERSAMPLING,
|
|
13
13
|
CONF_PRESSURE,
|
|
14
14
|
CONF_TEMPERATURE,
|
|
15
|
-
DEVICE_CLASS_HUMIDITY,
|
|
16
15
|
DEVICE_CLASS_ATMOSPHERIC_PRESSURE,
|
|
16
|
+
DEVICE_CLASS_HUMIDITY,
|
|
17
17
|
DEVICE_CLASS_TEMPERATURE,
|
|
18
18
|
ICON_GAS_CYLINDER,
|
|
19
19
|
STATE_CLASS_MEASUREMENT,
|
|
@@ -18,8 +18,8 @@ from esphome.const import (
|
|
|
18
18
|
DEVICE_CLASS_UPDATE,
|
|
19
19
|
)
|
|
20
20
|
from esphome.core import CORE, coroutine_with_priority
|
|
21
|
+
from esphome.core.entity_helpers import entity_duplicate_validator, setup_entity
|
|
21
22
|
from esphome.cpp_generator import MockObjClass
|
|
22
|
-
from esphome.cpp_helpers import setup_entity
|
|
23
23
|
|
|
24
24
|
CODEOWNERS = ["@esphome/core"]
|
|
25
25
|
IS_PLATFORM_COMPONENT = True
|
|
@@ -61,6 +61,9 @@ _BUTTON_SCHEMA = (
|
|
|
61
61
|
)
|
|
62
62
|
|
|
63
63
|
|
|
64
|
+
_BUTTON_SCHEMA.add_extra(entity_duplicate_validator("button"))
|
|
65
|
+
|
|
66
|
+
|
|
64
67
|
def button_schema(
|
|
65
68
|
class_: MockObjClass,
|
|
66
69
|
*,
|
|
@@ -87,7 +90,7 @@ BUTTON_SCHEMA.add_extra(cv.deprecated_schema_constant("button"))
|
|
|
87
90
|
|
|
88
91
|
|
|
89
92
|
async def setup_button_core_(var, config):
|
|
90
|
-
await setup_entity(var, config)
|
|
93
|
+
await setup_entity(var, config, "button")
|
|
91
94
|
|
|
92
95
|
for conf in config.get(CONF_ON_PRESS, []):
|
|
93
96
|
trigger = cg.new_Pvariable(conf[CONF_TRIGGER_ID], var)
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
CODEOWNERS = ["@DT-art1", "@bdraco"]
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
#include "camera.h"
|
|
2
|
+
|
|
3
|
+
namespace esphome {
|
|
4
|
+
namespace camera {
|
|
5
|
+
|
|
6
|
+
// NOLINTNEXTLINE(cppcoreguidelines-avoid-non-const-global-variables)
|
|
7
|
+
Camera *Camera::global_camera = nullptr;
|
|
8
|
+
|
|
9
|
+
Camera::Camera() {
|
|
10
|
+
if (global_camera != nullptr) {
|
|
11
|
+
this->status_set_error("Multiple cameras are configured, but only one is supported.");
|
|
12
|
+
this->mark_failed();
|
|
13
|
+
return;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
global_camera = this;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
Camera *Camera::instance() { return global_camera; }
|
|
20
|
+
|
|
21
|
+
} // namespace camera
|
|
22
|
+
} // namespace esphome
|