esphome 2025.6.2__py3-none-any.whl → 2025.7.0b1__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 +42 -20
- esphome/components/api/api_connection.cpp +318 -391
- esphome/components/api/api_connection.h +206 -126
- esphome/components/api/api_frame_helper.cpp +89 -124
- esphome/components/api/api_frame_helper.h +57 -45
- esphome/components/api/api_pb2.cpp +414 -4350
- esphome/components/api/api_pb2.h +287 -198
- esphome/components/api/api_pb2_dump.cpp +4333 -0
- esphome/components/api/api_pb2_service.cpp +180 -425
- esphome/components/api/api_pb2_service.h +7 -6
- esphome/components/api/api_pb2_size.h +2 -4
- esphome/components/api/api_server.cpp +138 -167
- esphome/components/api/api_server.h +66 -12
- esphome/components/api/client.py +10 -4
- esphome/components/api/list_entities.cpp +36 -105
- esphome/components/api/list_entities.h +31 -23
- esphome/components/api/proto.h +26 -3
- esphome/components/api/subscribe_state.cpp +23 -29
- esphome/components/api/subscribe_state.h +26 -19
- 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/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 +102 -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 +111 -97
- 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 +238 -0
- esphome/components/esp32_touch/esp32_touch_v2.cpp +397 -0
- esphome/components/esp8266/__init__.py +1 -0
- esphome/components/esp8266/gpio.cpp +10 -10
- esphome/components/esp8266/helpers.cpp +31 -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/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 +17 -0
- 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 +2 -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 +28 -9
- 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/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/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 +430 -261
- 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/ld2420.cpp +196 -100
- esphome/components/ld2420/ld2420.h +46 -118
- esphome/components/ld2420/number/__init__.py +2 -2
- esphome/components/ld2420/sensor/__init__.py +6 -2
- esphome/components/ld2420/sensor/ld2420_sensor.h +1 -1
- 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 +4 -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_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/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_backend.h +2 -1
- esphome/components/mqtt/mqtt_backend_esp32.cpp +126 -45
- esphome/components/mqtt/mqtt_backend_esp32.h +106 -4
- esphome/components/mqtt/mqtt_client.cpp +15 -9
- esphome/components/mqtt/mqtt_client.h +8 -3
- 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 +5 -0
- esphome/components/online_image/online_image.cpp +6 -2
- esphome/components/online_image/online_image.h +4 -1
- esphome/components/opentherm/opentherm.cpp +7 -12
- 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 +31 -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 +1 -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.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 +76 -19
- 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/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 +311 -430
- 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 +162 -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 +163 -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 +151 -18
- esphome/core/component.h +98 -4
- esphome/core/component_iterator.cpp +7 -7
- esphome/core/component_iterator.h +9 -7
- 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 +162 -1
- esphome/core/event_pool.h +81 -0
- esphome/core/helpers.cpp +75 -230
- esphome/core/helpers.h +164 -104
- 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 +278 -103
- esphome/core/scheduler.h +157 -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/wizard.py +16 -3
- esphome/writer.py +21 -3
- esphome/yaml_util.py +0 -2
- {esphome-2025.6.2.dist-info → esphome-2025.7.0b1.dist-info}/METADATA +10 -9
- {esphome-2025.6.2.dist-info → esphome-2025.7.0b1.dist-info}/RECORD +593 -533
- 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.0b1.dist-info}/WHEEL +0 -0
- {esphome-2025.6.2.dist-info → esphome-2025.7.0b1.dist-info}/entry_points.txt +0 -0
- {esphome-2025.6.2.dist-info → esphome-2025.7.0b1.dist-info}/licenses/LICENSE +0 -0
- {esphome-2025.6.2.dist-info → esphome-2025.7.0b1.dist-info}/top_level.txt +0 -0
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
#include <string>
|
|
7
7
|
#include "esphome/core/helpers.h"
|
|
8
8
|
#include "esphome/core/log.h"
|
|
9
|
+
#include "esphome/core/application.h"
|
|
9
10
|
|
|
10
11
|
namespace esphome {
|
|
11
12
|
namespace mqtt {
|
|
@@ -13,49 +14,6 @@ namespace mqtt {
|
|
|
13
14
|
static const char *const TAG = "mqtt.idf";
|
|
14
15
|
|
|
15
16
|
bool MQTTBackendESP32::initialize_() {
|
|
16
|
-
#if ESP_IDF_VERSION_MAJOR < 5
|
|
17
|
-
mqtt_cfg_.user_context = (void *) this;
|
|
18
|
-
mqtt_cfg_.buffer_size = MQTT_BUFFER_SIZE;
|
|
19
|
-
|
|
20
|
-
mqtt_cfg_.host = this->host_.c_str();
|
|
21
|
-
mqtt_cfg_.port = this->port_;
|
|
22
|
-
mqtt_cfg_.keepalive = this->keep_alive_;
|
|
23
|
-
mqtt_cfg_.disable_clean_session = !this->clean_session_;
|
|
24
|
-
|
|
25
|
-
if (!this->username_.empty()) {
|
|
26
|
-
mqtt_cfg_.username = this->username_.c_str();
|
|
27
|
-
if (!this->password_.empty()) {
|
|
28
|
-
mqtt_cfg_.password = this->password_.c_str();
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
if (!this->lwt_topic_.empty()) {
|
|
33
|
-
mqtt_cfg_.lwt_topic = this->lwt_topic_.c_str();
|
|
34
|
-
this->mqtt_cfg_.lwt_qos = this->lwt_qos_;
|
|
35
|
-
this->mqtt_cfg_.lwt_retain = this->lwt_retain_;
|
|
36
|
-
|
|
37
|
-
if (!this->lwt_message_.empty()) {
|
|
38
|
-
mqtt_cfg_.lwt_msg = this->lwt_message_.c_str();
|
|
39
|
-
mqtt_cfg_.lwt_msg_len = this->lwt_message_.size();
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
if (!this->client_id_.empty()) {
|
|
44
|
-
mqtt_cfg_.client_id = this->client_id_.c_str();
|
|
45
|
-
}
|
|
46
|
-
if (ca_certificate_.has_value()) {
|
|
47
|
-
mqtt_cfg_.cert_pem = ca_certificate_.value().c_str();
|
|
48
|
-
mqtt_cfg_.skip_cert_common_name_check = skip_cert_cn_check_;
|
|
49
|
-
mqtt_cfg_.transport = MQTT_TRANSPORT_OVER_SSL;
|
|
50
|
-
|
|
51
|
-
if (this->cl_certificate_.has_value() && this->cl_key_.has_value()) {
|
|
52
|
-
mqtt_cfg_.client_cert_pem = this->cl_certificate_.value().c_str();
|
|
53
|
-
mqtt_cfg_.client_key_pem = this->cl_key_.value().c_str();
|
|
54
|
-
}
|
|
55
|
-
} else {
|
|
56
|
-
mqtt_cfg_.transport = MQTT_TRANSPORT_OVER_TCP;
|
|
57
|
-
}
|
|
58
|
-
#else
|
|
59
17
|
mqtt_cfg_.broker.address.hostname = this->host_.c_str();
|
|
60
18
|
mqtt_cfg_.broker.address.port = this->port_;
|
|
61
19
|
mqtt_cfg_.session.keepalive = this->keep_alive_;
|
|
@@ -94,15 +52,30 @@ bool MQTTBackendESP32::initialize_() {
|
|
|
94
52
|
} else {
|
|
95
53
|
mqtt_cfg_.broker.address.transport = MQTT_TRANSPORT_OVER_TCP;
|
|
96
54
|
}
|
|
97
|
-
|
|
55
|
+
|
|
98
56
|
auto *mqtt_client = esp_mqtt_client_init(&mqtt_cfg_);
|
|
99
57
|
if (mqtt_client) {
|
|
100
58
|
handler_.reset(mqtt_client);
|
|
101
59
|
is_initalized_ = true;
|
|
102
60
|
esp_mqtt_client_register_event(mqtt_client, MQTT_EVENT_ANY, mqtt_event_handler, this);
|
|
61
|
+
#if defined(USE_MQTT_IDF_ENQUEUE)
|
|
62
|
+
// Create the task only after MQTT client is initialized successfully
|
|
63
|
+
// Use larger stack size when TLS is enabled
|
|
64
|
+
size_t stack_size = this->ca_certificate_.has_value() ? TASK_STACK_SIZE_TLS : TASK_STACK_SIZE;
|
|
65
|
+
xTaskCreate(esphome_mqtt_task, "esphome_mqtt", stack_size, (void *) this, TASK_PRIORITY, &this->task_handle_);
|
|
66
|
+
if (this->task_handle_ == nullptr) {
|
|
67
|
+
ESP_LOGE(TAG, "Failed to create MQTT task");
|
|
68
|
+
// Clean up MQTT client since we can't start the async task
|
|
69
|
+
handler_.reset();
|
|
70
|
+
is_initalized_ = false;
|
|
71
|
+
return false;
|
|
72
|
+
}
|
|
73
|
+
// Set the task handle so the queue can notify it
|
|
74
|
+
this->mqtt_queue_.set_task_to_notify(this->task_handle_);
|
|
75
|
+
#endif
|
|
103
76
|
return true;
|
|
104
77
|
} else {
|
|
105
|
-
ESP_LOGE(TAG, "Failed to
|
|
78
|
+
ESP_LOGE(TAG, "Failed to init client");
|
|
106
79
|
return false;
|
|
107
80
|
}
|
|
108
81
|
}
|
|
@@ -115,6 +88,26 @@ void MQTTBackendESP32::loop() {
|
|
|
115
88
|
mqtt_event_handler_(event);
|
|
116
89
|
mqtt_events_.pop();
|
|
117
90
|
}
|
|
91
|
+
|
|
92
|
+
#if defined(USE_MQTT_IDF_ENQUEUE)
|
|
93
|
+
// Periodically log dropped messages to avoid blocking during spikes.
|
|
94
|
+
// During high load, many messages can be dropped in quick succession.
|
|
95
|
+
// Logging each drop immediately would flood the logs and potentially
|
|
96
|
+
// cause more drops if MQTT logging is enabled (cascade effect).
|
|
97
|
+
// Instead, we accumulate the count and log a summary periodically.
|
|
98
|
+
// IMPORTANT: Don't move this to the scheduler - if drops are due to memory
|
|
99
|
+
// pressure, the scheduler's heap allocations would make things worse.
|
|
100
|
+
uint32_t now = App.get_loop_component_start_time();
|
|
101
|
+
// Handle rollover: (now - last_time) works correctly with unsigned arithmetic
|
|
102
|
+
// even when now < last_time due to rollover
|
|
103
|
+
if ((now - this->last_dropped_log_time_) >= DROP_LOG_INTERVAL_MS) {
|
|
104
|
+
uint16_t dropped = this->mqtt_queue_.get_and_reset_dropped_count();
|
|
105
|
+
if (dropped > 0) {
|
|
106
|
+
ESP_LOGW(TAG, "Dropped %u messages (%us)", dropped, DROP_LOG_INTERVAL_MS / 1000);
|
|
107
|
+
}
|
|
108
|
+
this->last_dropped_log_time_ = now;
|
|
109
|
+
}
|
|
110
|
+
#endif
|
|
118
111
|
}
|
|
119
112
|
|
|
120
113
|
void MQTTBackendESP32::mqtt_event_handler_(const Event &event) {
|
|
@@ -127,12 +120,20 @@ void MQTTBackendESP32::mqtt_event_handler_(const Event &event) {
|
|
|
127
120
|
case MQTT_EVENT_CONNECTED:
|
|
128
121
|
ESP_LOGV(TAG, "MQTT_EVENT_CONNECTED");
|
|
129
122
|
this->is_connected_ = true;
|
|
123
|
+
#if defined(USE_MQTT_IDF_ENQUEUE)
|
|
124
|
+
this->last_dropped_log_time_ = 0;
|
|
125
|
+
xTaskNotifyGive(this->task_handle_);
|
|
126
|
+
#endif
|
|
130
127
|
this->on_connect_.call(event.session_present);
|
|
131
128
|
break;
|
|
132
129
|
case MQTT_EVENT_DISCONNECTED:
|
|
133
130
|
ESP_LOGV(TAG, "MQTT_EVENT_DISCONNECTED");
|
|
134
131
|
// TODO is there a way to get the disconnect reason?
|
|
135
132
|
this->is_connected_ = false;
|
|
133
|
+
#if defined(USE_MQTT_IDF_ENQUEUE)
|
|
134
|
+
this->last_dropped_log_time_ = 0;
|
|
135
|
+
xTaskNotifyGive(this->task_handle_);
|
|
136
|
+
#endif
|
|
136
137
|
this->on_disconnect_.call(MQTTClientDisconnectReason::TCP_DISCONNECTED);
|
|
137
138
|
break;
|
|
138
139
|
|
|
@@ -188,6 +189,86 @@ void MQTTBackendESP32::mqtt_event_handler(void *handler_args, esp_event_base_t b
|
|
|
188
189
|
}
|
|
189
190
|
}
|
|
190
191
|
|
|
192
|
+
#if defined(USE_MQTT_IDF_ENQUEUE)
|
|
193
|
+
void MQTTBackendESP32::esphome_mqtt_task(void *params) {
|
|
194
|
+
MQTTBackendESP32 *this_mqtt = (MQTTBackendESP32 *) params;
|
|
195
|
+
|
|
196
|
+
while (true) {
|
|
197
|
+
// Wait for notification indefinitely
|
|
198
|
+
ulTaskNotifyTake(pdTRUE, portMAX_DELAY);
|
|
199
|
+
|
|
200
|
+
// Process all queued items
|
|
201
|
+
struct QueueElement *elem;
|
|
202
|
+
while ((elem = this_mqtt->mqtt_queue_.pop()) != nullptr) {
|
|
203
|
+
if (this_mqtt->is_connected_) {
|
|
204
|
+
switch (elem->type) {
|
|
205
|
+
case MQTT_QUEUE_TYPE_SUBSCRIBE:
|
|
206
|
+
esp_mqtt_client_subscribe(this_mqtt->handler_.get(), elem->topic, elem->qos);
|
|
207
|
+
break;
|
|
208
|
+
|
|
209
|
+
case MQTT_QUEUE_TYPE_UNSUBSCRIBE:
|
|
210
|
+
esp_mqtt_client_unsubscribe(this_mqtt->handler_.get(), elem->topic);
|
|
211
|
+
break;
|
|
212
|
+
|
|
213
|
+
case MQTT_QUEUE_TYPE_PUBLISH:
|
|
214
|
+
esp_mqtt_client_publish(this_mqtt->handler_.get(), elem->topic, elem->payload, elem->payload_len, elem->qos,
|
|
215
|
+
elem->retain);
|
|
216
|
+
break;
|
|
217
|
+
|
|
218
|
+
default:
|
|
219
|
+
ESP_LOGE(TAG, "Invalid operation type from MQTT queue");
|
|
220
|
+
break;
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
this_mqtt->mqtt_event_pool_.release(elem);
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
// Clean up any remaining items in the queue
|
|
228
|
+
struct QueueElement *elem;
|
|
229
|
+
while ((elem = this_mqtt->mqtt_queue_.pop()) != nullptr) {
|
|
230
|
+
this_mqtt->mqtt_event_pool_.release(elem);
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
// Note: EventPool destructor will clean up the pool itself
|
|
234
|
+
// Task will delete itself
|
|
235
|
+
vTaskDelete(nullptr);
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
bool MQTTBackendESP32::enqueue_(MqttQueueTypeT type, const char *topic, int qos, bool retain, const char *payload,
|
|
239
|
+
size_t len) {
|
|
240
|
+
auto *elem = this->mqtt_event_pool_.allocate();
|
|
241
|
+
|
|
242
|
+
if (!elem) {
|
|
243
|
+
// Queue is full - increment counter but don't log immediately.
|
|
244
|
+
// Logging here can cause a cascade effect: if MQTT logging is enabled,
|
|
245
|
+
// each dropped message would generate a log message, which could itself
|
|
246
|
+
// be sent via MQTT, causing more drops and more logs in a feedback loop
|
|
247
|
+
// that eventually triggers a watchdog reset. Instead, we log periodically
|
|
248
|
+
// in loop() to prevent blocking the event loop during spikes.
|
|
249
|
+
this->mqtt_queue_.increment_dropped_count();
|
|
250
|
+
return false;
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
elem->type = type;
|
|
254
|
+
elem->qos = qos;
|
|
255
|
+
elem->retain = retain;
|
|
256
|
+
|
|
257
|
+
// Use the helper to allocate and copy data
|
|
258
|
+
if (!elem->set_data(topic, payload, len)) {
|
|
259
|
+
// Allocation failed, return elem to pool
|
|
260
|
+
this->mqtt_event_pool_.release(elem);
|
|
261
|
+
// Increment counter without logging to avoid cascade effect during memory pressure
|
|
262
|
+
this->mqtt_queue_.increment_dropped_count();
|
|
263
|
+
return false;
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
// Push to queue - always succeeds since we allocated from the pool
|
|
267
|
+
this->mqtt_queue_.push(elem);
|
|
268
|
+
return true;
|
|
269
|
+
}
|
|
270
|
+
#endif // USE_MQTT_IDF_ENQUEUE
|
|
271
|
+
|
|
191
272
|
} // namespace mqtt
|
|
192
273
|
} // namespace esphome
|
|
193
274
|
#endif // USE_ESP32
|
|
@@ -6,9 +6,14 @@
|
|
|
6
6
|
|
|
7
7
|
#include <string>
|
|
8
8
|
#include <queue>
|
|
9
|
+
#include <cstring>
|
|
9
10
|
#include <mqtt_client.h>
|
|
11
|
+
#include <freertos/FreeRTOS.h>
|
|
12
|
+
#include <freertos/task.h>
|
|
10
13
|
#include "esphome/components/network/ip_address.h"
|
|
11
14
|
#include "esphome/core/helpers.h"
|
|
15
|
+
#include "esphome/core/lock_free_queue.h"
|
|
16
|
+
#include "esphome/core/event_pool.h"
|
|
12
17
|
|
|
13
18
|
namespace esphome {
|
|
14
19
|
namespace mqtt {
|
|
@@ -42,9 +47,79 @@ struct Event {
|
|
|
42
47
|
error_handle(*event.error_handle) {}
|
|
43
48
|
};
|
|
44
49
|
|
|
50
|
+
enum MqttQueueTypeT : uint8_t {
|
|
51
|
+
MQTT_QUEUE_TYPE_NONE = 0,
|
|
52
|
+
MQTT_QUEUE_TYPE_SUBSCRIBE,
|
|
53
|
+
MQTT_QUEUE_TYPE_UNSUBSCRIBE,
|
|
54
|
+
MQTT_QUEUE_TYPE_PUBLISH,
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
struct QueueElement {
|
|
58
|
+
char *topic;
|
|
59
|
+
char *payload;
|
|
60
|
+
uint16_t payload_len; // MQTT max payload is 64KiB
|
|
61
|
+
uint8_t type : 2;
|
|
62
|
+
uint8_t qos : 2; // QoS only needs values 0-2
|
|
63
|
+
uint8_t retain : 1;
|
|
64
|
+
uint8_t reserved : 3; // Reserved for future use
|
|
65
|
+
|
|
66
|
+
QueueElement() : topic(nullptr), payload(nullptr), payload_len(0), qos(0), retain(0), reserved(0) {}
|
|
67
|
+
|
|
68
|
+
// Helper to set topic/payload (uses RAMAllocator)
|
|
69
|
+
bool set_data(const char *topic_str, const char *payload_data, size_t len) {
|
|
70
|
+
// Check payload size limit (MQTT max is 64KiB)
|
|
71
|
+
if (len > std::numeric_limits<uint16_t>::max()) {
|
|
72
|
+
return false;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
// Use RAMAllocator with default flags (tries external RAM first, falls back to internal)
|
|
76
|
+
RAMAllocator<char> allocator;
|
|
77
|
+
|
|
78
|
+
// Allocate and copy topic
|
|
79
|
+
size_t topic_len = strlen(topic_str) + 1;
|
|
80
|
+
topic = allocator.allocate(topic_len);
|
|
81
|
+
if (!topic)
|
|
82
|
+
return false;
|
|
83
|
+
memcpy(topic, topic_str, topic_len);
|
|
84
|
+
|
|
85
|
+
if (payload_data && len) {
|
|
86
|
+
payload = allocator.allocate(len);
|
|
87
|
+
if (!payload) {
|
|
88
|
+
allocator.deallocate(topic, topic_len);
|
|
89
|
+
topic = nullptr;
|
|
90
|
+
return false;
|
|
91
|
+
}
|
|
92
|
+
memcpy(payload, payload_data, len);
|
|
93
|
+
payload_len = static_cast<uint16_t>(len);
|
|
94
|
+
} else {
|
|
95
|
+
payload = nullptr;
|
|
96
|
+
payload_len = 0;
|
|
97
|
+
}
|
|
98
|
+
return true;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
// Helper to release (uses RAMAllocator)
|
|
102
|
+
void release() {
|
|
103
|
+
RAMAllocator<char> allocator;
|
|
104
|
+
if (topic) {
|
|
105
|
+
allocator.deallocate(topic, strlen(topic) + 1);
|
|
106
|
+
topic = nullptr;
|
|
107
|
+
}
|
|
108
|
+
if (payload) {
|
|
109
|
+
allocator.deallocate(payload, payload_len);
|
|
110
|
+
payload = nullptr;
|
|
111
|
+
}
|
|
112
|
+
payload_len = 0;
|
|
113
|
+
}
|
|
114
|
+
};
|
|
115
|
+
|
|
45
116
|
class MQTTBackendESP32 final : public MQTTBackend {
|
|
46
117
|
public:
|
|
47
118
|
static const size_t MQTT_BUFFER_SIZE = 4096;
|
|
119
|
+
static const size_t TASK_STACK_SIZE = 3072;
|
|
120
|
+
static const size_t TASK_STACK_SIZE_TLS = 4096; // Larger stack for TLS operations
|
|
121
|
+
static const ssize_t TASK_PRIORITY = 5;
|
|
122
|
+
static const uint8_t MQTT_QUEUE_LENGTH = 30; // 30*12 bytes = 360
|
|
48
123
|
|
|
49
124
|
void set_keep_alive(uint16_t keep_alive) final { this->keep_alive_ = keep_alive; }
|
|
50
125
|
void set_client_id(const char *client_id) final { this->client_id_ = client_id; }
|
|
@@ -105,15 +180,23 @@ class MQTTBackendESP32 final : public MQTTBackend {
|
|
|
105
180
|
}
|
|
106
181
|
|
|
107
182
|
bool subscribe(const char *topic, uint8_t qos) final {
|
|
183
|
+
#if defined(USE_MQTT_IDF_ENQUEUE)
|
|
184
|
+
return enqueue_(MQTT_QUEUE_TYPE_SUBSCRIBE, topic, qos);
|
|
185
|
+
#else
|
|
108
186
|
return esp_mqtt_client_subscribe(handler_.get(), topic, qos) != -1;
|
|
187
|
+
#endif
|
|
188
|
+
}
|
|
189
|
+
bool unsubscribe(const char *topic) final {
|
|
190
|
+
#if defined(USE_MQTT_IDF_ENQUEUE)
|
|
191
|
+
return enqueue_(MQTT_QUEUE_TYPE_UNSUBSCRIBE, topic);
|
|
192
|
+
#else
|
|
193
|
+
return esp_mqtt_client_unsubscribe(handler_.get(), topic) != -1;
|
|
194
|
+
#endif
|
|
109
195
|
}
|
|
110
|
-
bool unsubscribe(const char *topic) final { return esp_mqtt_client_unsubscribe(handler_.get(), topic) != -1; }
|
|
111
196
|
|
|
112
197
|
bool publish(const char *topic, const char *payload, size_t length, uint8_t qos, bool retain) final {
|
|
113
198
|
#if defined(USE_MQTT_IDF_ENQUEUE)
|
|
114
|
-
|
|
115
|
-
// it can delay sending a couple of seconds but won't block
|
|
116
|
-
return esp_mqtt_client_enqueue(handler_.get(), topic, payload, length, qos, retain, true) != -1;
|
|
199
|
+
return enqueue_(MQTT_QUEUE_TYPE_PUBLISH, topic, qos, retain, payload, length);
|
|
117
200
|
#else
|
|
118
201
|
// might block for several seconds, either due to network timeout (10s)
|
|
119
202
|
// or if publishing payloads longer than internal buffer (due to message fragmentation)
|
|
@@ -129,6 +212,12 @@ class MQTTBackendESP32 final : public MQTTBackend {
|
|
|
129
212
|
void set_cl_key(const std::string &key) { cl_key_ = key; }
|
|
130
213
|
void set_skip_cert_cn_check(bool skip_check) { skip_cert_cn_check_ = skip_check; }
|
|
131
214
|
|
|
215
|
+
// No destructor needed: ESPHome components live for the entire device runtime.
|
|
216
|
+
// The MQTT task and queue will run until the device reboots or loses power,
|
|
217
|
+
// at which point the entire process terminates and FreeRTOS cleans up all tasks.
|
|
218
|
+
// Implementing a destructor would add complexity and potential race conditions
|
|
219
|
+
// for a scenario that never occurs in practice.
|
|
220
|
+
|
|
132
221
|
protected:
|
|
133
222
|
bool initialize_();
|
|
134
223
|
void mqtt_event_handler_(const Event &event);
|
|
@@ -160,6 +249,14 @@ class MQTTBackendESP32 final : public MQTTBackend {
|
|
|
160
249
|
optional<std::string> cl_certificate_;
|
|
161
250
|
optional<std::string> cl_key_;
|
|
162
251
|
bool skip_cert_cn_check_{false};
|
|
252
|
+
#if defined(USE_MQTT_IDF_ENQUEUE)
|
|
253
|
+
static void esphome_mqtt_task(void *params);
|
|
254
|
+
EventPool<struct QueueElement, MQTT_QUEUE_LENGTH> mqtt_event_pool_;
|
|
255
|
+
NotifyingLockFreeQueue<struct QueueElement, MQTT_QUEUE_LENGTH> mqtt_queue_;
|
|
256
|
+
TaskHandle_t task_handle_{nullptr};
|
|
257
|
+
bool enqueue_(MqttQueueTypeT type, const char *topic, int qos = 0, bool retain = false, const char *payload = NULL,
|
|
258
|
+
size_t len = 0);
|
|
259
|
+
#endif
|
|
163
260
|
|
|
164
261
|
// callbacks
|
|
165
262
|
CallbackManager<on_connect_callback_t> on_connect_;
|
|
@@ -169,6 +266,11 @@ class MQTTBackendESP32 final : public MQTTBackend {
|
|
|
169
266
|
CallbackManager<on_message_callback_t> on_message_;
|
|
170
267
|
CallbackManager<on_publish_user_callback_t> on_publish_;
|
|
171
268
|
std::queue<Event> mqtt_events_;
|
|
269
|
+
|
|
270
|
+
#if defined(USE_MQTT_IDF_ENQUEUE)
|
|
271
|
+
uint32_t last_dropped_log_time_{0};
|
|
272
|
+
static constexpr uint32_t DROP_LOG_INTERVAL_MS = 10000; // Log every 10 seconds
|
|
273
|
+
#endif
|
|
172
274
|
};
|
|
173
275
|
|
|
174
276
|
} // namespace mqtt
|
|
@@ -57,14 +57,15 @@ void MQTTClientComponent::setup() {
|
|
|
57
57
|
});
|
|
58
58
|
#ifdef USE_LOGGER
|
|
59
59
|
if (this->is_log_message_enabled() && logger::global_logger != nullptr) {
|
|
60
|
-
logger::global_logger->add_on_log_callback(
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
60
|
+
logger::global_logger->add_on_log_callback(
|
|
61
|
+
[this](int level, const char *tag, const char *message, size_t message_len) {
|
|
62
|
+
if (level <= this->log_level_ && this->is_connected()) {
|
|
63
|
+
this->publish({.topic = this->log_message_.topic,
|
|
64
|
+
.payload = std::string(message, message_len),
|
|
65
|
+
.qos = this->log_message_.qos,
|
|
66
|
+
.retain = this->log_message_.retain});
|
|
67
|
+
}
|
|
68
|
+
});
|
|
68
69
|
}
|
|
69
70
|
#endif
|
|
70
71
|
|
|
@@ -176,7 +177,8 @@ void MQTTClientComponent::dump_config() {
|
|
|
176
177
|
}
|
|
177
178
|
}
|
|
178
179
|
bool MQTTClientComponent::can_proceed() {
|
|
179
|
-
return network::is_disabled() || this->state_ == MQTT_CLIENT_DISABLED || this->is_connected()
|
|
180
|
+
return network::is_disabled() || this->state_ == MQTT_CLIENT_DISABLED || this->is_connected() ||
|
|
181
|
+
!this->wait_for_connection_;
|
|
180
182
|
}
|
|
181
183
|
|
|
182
184
|
void MQTTClientComponent::start_dnslookup_() {
|
|
@@ -228,6 +230,8 @@ void MQTTClientComponent::check_dnslookup_() {
|
|
|
228
230
|
if (this->dns_resolve_error_) {
|
|
229
231
|
ESP_LOGW(TAG, "Couldn't resolve IP address for '%s'", this->credentials_.address.c_str());
|
|
230
232
|
this->state_ = MQTT_CLIENT_DISCONNECTED;
|
|
233
|
+
this->disconnect_reason_ = MQTTClientDisconnectReason::DNS_RESOLVE_ERROR;
|
|
234
|
+
this->on_disconnect_.call(MQTTClientDisconnectReason::DNS_RESOLVE_ERROR);
|
|
231
235
|
return;
|
|
232
236
|
}
|
|
233
237
|
|
|
@@ -697,7 +701,9 @@ void MQTTClientComponent::set_on_connect(mqtt_on_connect_callback_t &&callback)
|
|
|
697
701
|
}
|
|
698
702
|
|
|
699
703
|
void MQTTClientComponent::set_on_disconnect(mqtt_on_disconnect_callback_t &&callback) {
|
|
704
|
+
auto callback_copy = callback;
|
|
700
705
|
this->mqtt_backend_.set_on_disconnect(std::forward<mqtt_on_disconnect_callback_t>(callback));
|
|
706
|
+
this->on_disconnect_.add(std::move(callback_copy));
|
|
701
707
|
}
|
|
702
708
|
|
|
703
709
|
#if ASYNC_TCP_SSL_ENABLED
|
|
@@ -4,11 +4,12 @@
|
|
|
4
4
|
|
|
5
5
|
#ifdef USE_MQTT
|
|
6
6
|
|
|
7
|
-
#include "esphome/core/component.h"
|
|
8
|
-
#include "esphome/core/automation.h"
|
|
9
|
-
#include "esphome/core/log.h"
|
|
10
7
|
#include "esphome/components/json/json_util.h"
|
|
11
8
|
#include "esphome/components/network/ip_address.h"
|
|
9
|
+
#include "esphome/core/automation.h"
|
|
10
|
+
#include "esphome/core/component.h"
|
|
11
|
+
#include "esphome/core/helpers.h"
|
|
12
|
+
#include "esphome/core/log.h"
|
|
12
13
|
#if defined(USE_ESP32)
|
|
13
14
|
#include "mqtt_backend_esp32.h"
|
|
14
15
|
#elif defined(USE_ESP8266)
|
|
@@ -267,6 +268,8 @@ class MQTTClientComponent : public Component {
|
|
|
267
268
|
void set_publish_nan_as_none(bool publish_nan_as_none);
|
|
268
269
|
bool is_publish_nan_as_none() const;
|
|
269
270
|
|
|
271
|
+
void set_wait_for_connection(bool wait_for_connection) { this->wait_for_connection_ = wait_for_connection; }
|
|
272
|
+
|
|
270
273
|
protected:
|
|
271
274
|
void send_device_info_();
|
|
272
275
|
|
|
@@ -332,8 +335,10 @@ class MQTTClientComponent : public Component {
|
|
|
332
335
|
uint32_t connect_begin_;
|
|
333
336
|
uint32_t last_connected_{0};
|
|
334
337
|
optional<MQTTClientDisconnectReason> disconnect_reason_{};
|
|
338
|
+
CallbackManager<MQTTBackend::on_disconnect_callback_t> on_disconnect_;
|
|
335
339
|
|
|
336
340
|
bool publish_nan_as_none_{false};
|
|
341
|
+
bool wait_for_connection_{false};
|
|
337
342
|
};
|
|
338
343
|
|
|
339
344
|
extern MQTTClientComponent *global_mqtt_client; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables)
|
|
@@ -37,7 +37,6 @@ class MS8607Component : public PollingComponent, public i2c::I2CDevice {
|
|
|
37
37
|
void setup() override;
|
|
38
38
|
void update() override;
|
|
39
39
|
void dump_config() override;
|
|
40
|
-
float get_setup_priority() const override { return setup_priority::DATA; };
|
|
41
40
|
|
|
42
41
|
void set_temperature_sensor(sensor::Sensor *temperature_sensor) { temperature_sensor_ = temperature_sensor; }
|
|
43
42
|
void set_pressure_sensor(sensor::Sensor *pressure_sensor) { pressure_sensor_ = pressure_sensor; }
|
|
@@ -215,4 +215,7 @@ async def to_code(config):
|
|
|
215
215
|
|
|
216
216
|
# https://github.com/Makuna/NeoPixelBus/blob/master/library.json
|
|
217
217
|
# Version Listed Here: https://registry.platformio.org/libraries/makuna/NeoPixelBus/versions
|
|
218
|
-
|
|
218
|
+
if CORE.is_esp32:
|
|
219
|
+
cg.add_library("makuna/NeoPixelBus", "2.8.0")
|
|
220
|
+
else:
|
|
221
|
+
cg.add_library("makuna/NeoPixelBus", "2.7.3")
|
|
@@ -2,7 +2,7 @@ import esphome.codegen as cg
|
|
|
2
2
|
from esphome.components.esp32 import add_idf_sdkconfig_option
|
|
3
3
|
import esphome.config_validation as cv
|
|
4
4
|
from esphome.const import CONF_ENABLE_IPV6, CONF_MIN_IPV6_ADDR_COUNT
|
|
5
|
-
from esphome.core import CORE
|
|
5
|
+
from esphome.core import CORE, coroutine_with_priority
|
|
6
6
|
|
|
7
7
|
CODEOWNERS = ["@esphome/core"]
|
|
8
8
|
AUTO_LOAD = ["mdns"]
|
|
@@ -36,8 +36,11 @@ CONFIG_SCHEMA = cv.Schema(
|
|
|
36
36
|
)
|
|
37
37
|
|
|
38
38
|
|
|
39
|
+
@coroutine_with_priority(201.0)
|
|
39
40
|
async def to_code(config):
|
|
40
41
|
cg.add_define("USE_NETWORK")
|
|
42
|
+
if CORE.using_arduino and CORE.is_esp32:
|
|
43
|
+
cg.add_library("Networking", None)
|
|
41
44
|
if (enable_ipv6 := config.get(CONF_ENABLE_IPV6, None)) is not None:
|
|
42
45
|
cg.add_define("USE_NETWORK_IPV6", enable_ipv6)
|
|
43
46
|
if enable_ipv6:
|
|
@@ -56,6 +56,7 @@ struct IPAddress {
|
|
|
56
56
|
IP_ADDR4(&ip_addr_, first, second, third, fourth);
|
|
57
57
|
}
|
|
58
58
|
IPAddress(const ip_addr_t *other_ip) { ip_addr_copy(ip_addr_, *other_ip); }
|
|
59
|
+
IPAddress(const char *in_address) { ipaddr_aton(in_address, &ip_addr_); }
|
|
59
60
|
IPAddress(const std::string &in_address) { ipaddr_aton(in_address.c_str(), &ip_addr_); }
|
|
60
61
|
IPAddress(ip4_addr_t *other_ip) {
|
|
61
62
|
memcpy((void *) &ip_addr_, (void *) other_ip, sizeof(ip4_addr_t));
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import esphome.codegen as cg
|
|
2
2
|
from esphome.components import uart
|
|
3
|
+
from esphome.config_helpers import filter_source_files_from_platform
|
|
4
|
+
from esphome.const import PlatformFramework
|
|
3
5
|
|
|
4
6
|
nextion_ns = cg.esphome_ns.namespace("nextion")
|
|
5
7
|
Nextion = nextion_ns.class_("Nextion", cg.PollingComponent, uart.UARTDevice)
|
|
@@ -8,3 +10,17 @@ nextion_ref = Nextion.operator("ref")
|
|
|
8
10
|
CONF_NEXTION_ID = "nextion_id"
|
|
9
11
|
CONF_PUBLISH_STATE = "publish_state"
|
|
10
12
|
CONF_SEND_TO_NEXTION = "send_to_nextion"
|
|
13
|
+
|
|
14
|
+
FILTER_SOURCE_FILES = filter_source_files_from_platform(
|
|
15
|
+
{
|
|
16
|
+
"nextion_upload_arduino.cpp": {
|
|
17
|
+
PlatformFramework.ESP32_ARDUINO,
|
|
18
|
+
PlatformFramework.ESP8266_ARDUINO,
|
|
19
|
+
PlatformFramework.RP2040_ARDUINO,
|
|
20
|
+
PlatformFramework.BK72XX_ARDUINO,
|
|
21
|
+
PlatformFramework.RTL87XX_ARDUINO,
|
|
22
|
+
PlatformFramework.LN882X_ARDUINO,
|
|
23
|
+
},
|
|
24
|
+
"nextion_upload_idf.cpp": {PlatformFramework.ESP32_IDF},
|
|
25
|
+
}
|
|
26
|
+
)
|
|
@@ -11,6 +11,7 @@ CONF_AUTO_WAKE_ON_TOUCH = "auto_wake_on_touch"
|
|
|
11
11
|
CONF_BACKGROUND_PRESSED_COLOR = "background_pressed_color"
|
|
12
12
|
CONF_COMMAND_SPACING = "command_spacing"
|
|
13
13
|
CONF_COMPONENT_NAME = "component_name"
|
|
14
|
+
CONF_DUMP_DEVICE_INFO = "dump_device_info"
|
|
14
15
|
CONF_EXIT_REPARSE_ON_START = "exit_reparse_on_start"
|
|
15
16
|
CONF_FONT_ID = "font_id"
|
|
16
17
|
CONF_FOREGROUND_PRESSED_COLOR = "foreground_pressed_color"
|
|
@@ -44,7 +44,7 @@ void NextionBinarySensor::set_state(bool state, bool publish, bool send_to_nexti
|
|
|
44
44
|
return;
|
|
45
45
|
|
|
46
46
|
if (send_to_nextion) {
|
|
47
|
-
if (this->nextion_->is_sleeping() || !this->
|
|
47
|
+
if (this->nextion_->is_sleeping() || !this->component_flags_.visible) {
|
|
48
48
|
this->needs_to_send_update_ = true;
|
|
49
49
|
} else {
|
|
50
50
|
this->needs_to_send_update_ = false;
|
|
@@ -15,6 +15,7 @@ from . import Nextion, nextion_ns, nextion_ref
|
|
|
15
15
|
from .base_component import (
|
|
16
16
|
CONF_AUTO_WAKE_ON_TOUCH,
|
|
17
17
|
CONF_COMMAND_SPACING,
|
|
18
|
+
CONF_DUMP_DEVICE_INFO,
|
|
18
19
|
CONF_EXIT_REPARSE_ON_START,
|
|
19
20
|
CONF_MAX_COMMANDS_PER_LOOP,
|
|
20
21
|
CONF_MAX_QUEUE_SIZE,
|
|
@@ -57,6 +58,7 @@ CONFIG_SCHEMA = (
|
|
|
57
58
|
cv.positive_time_period_milliseconds,
|
|
58
59
|
cv.Range(max=TimePeriod(milliseconds=255)),
|
|
59
60
|
),
|
|
61
|
+
cv.Optional(CONF_DUMP_DEVICE_INFO, default=False): cv.boolean,
|
|
60
62
|
cv.Optional(CONF_EXIT_REPARSE_ON_START, default=False): cv.boolean,
|
|
61
63
|
cv.Optional(CONF_MAX_COMMANDS_PER_LOOP): cv.uint16_t,
|
|
62
64
|
cv.Optional(CONF_MAX_QUEUE_SIZE): cv.positive_int,
|
|
@@ -95,7 +97,9 @@ CONFIG_SCHEMA = (
|
|
|
95
97
|
cv.Optional(CONF_SKIP_CONNECTION_HANDSHAKE, default=False): cv.boolean,
|
|
96
98
|
cv.Optional(CONF_START_UP_PAGE): cv.uint8_t,
|
|
97
99
|
cv.Optional(CONF_TFT_URL): cv.url,
|
|
98
|
-
cv.Optional(CONF_TOUCH_SLEEP_TIMEOUT): cv.
|
|
100
|
+
cv.Optional(CONF_TOUCH_SLEEP_TIMEOUT): cv.Any(
|
|
101
|
+
0, cv.int_range(min=3, max=65535)
|
|
102
|
+
),
|
|
99
103
|
cv.Optional(CONF_WAKE_UP_PAGE): cv.uint8_t,
|
|
100
104
|
}
|
|
101
105
|
)
|
|
@@ -150,7 +154,7 @@ async def to_code(config):
|
|
|
150
154
|
cg.add_define("USE_NEXTION_TFT_UPLOAD")
|
|
151
155
|
cg.add(var.set_tft_url(config[CONF_TFT_URL]))
|
|
152
156
|
if CORE.is_esp32 and CORE.using_arduino:
|
|
153
|
-
cg.add_library("
|
|
157
|
+
cg.add_library("NetworkClientSecure", None)
|
|
154
158
|
cg.add_library("HTTPClient", None)
|
|
155
159
|
elif CORE.is_esp32 and CORE.using_esp_idf:
|
|
156
160
|
esp32.add_idf_sdkconfig_option("CONFIG_ESP_TLS_INSECURE", True)
|
|
@@ -167,13 +171,19 @@ async def to_code(config):
|
|
|
167
171
|
cg.add(var.set_wake_up_page(config[CONF_WAKE_UP_PAGE]))
|
|
168
172
|
|
|
169
173
|
if CONF_START_UP_PAGE in config:
|
|
174
|
+
cg.add_define("USE_NEXTION_CONF_START_UP_PAGE")
|
|
170
175
|
cg.add(var.set_start_up_page(config[CONF_START_UP_PAGE]))
|
|
171
176
|
|
|
172
177
|
cg.add(var.set_auto_wake_on_touch(config[CONF_AUTO_WAKE_ON_TOUCH]))
|
|
173
178
|
|
|
174
|
-
|
|
179
|
+
if config[CONF_DUMP_DEVICE_INFO]:
|
|
180
|
+
cg.add_define("USE_NEXTION_CONFIG_DUMP_DEVICE_INFO")
|
|
181
|
+
|
|
182
|
+
if config[CONF_EXIT_REPARSE_ON_START]:
|
|
183
|
+
cg.add_define("USE_NEXTION_CONFIG_EXIT_REPARSE_ON_START")
|
|
175
184
|
|
|
176
|
-
|
|
185
|
+
if config[CONF_SKIP_CONNECTION_HANDSHAKE]:
|
|
186
|
+
cg.add_define("USE_NEXTION_CONFIG_SKIP_CONNECTION_HANDSHAKE")
|
|
177
187
|
|
|
178
188
|
if max_commands_per_loop := config.get(CONF_MAX_COMMANDS_PER_LOOP):
|
|
179
189
|
cg.add_define("USE_NEXTION_MAX_COMMANDS_PER_LOOP")
|