esphome 2025.6.3__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 +8 -2
- 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.h +1 -0
- 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 +0 -4
- 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 +318 -436
- 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.3.dist-info → esphome-2025.7.0.dist-info}/METADATA +10 -9
- {esphome-2025.6.3.dist-info → esphome-2025.7.0.dist-info}/RECORD +637 -578
- 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.3.dist-info → esphome-2025.7.0.dist-info}/WHEEL +0 -0
- {esphome-2025.6.3.dist-info → esphome-2025.7.0.dist-info}/entry_points.txt +0 -0
- {esphome-2025.6.3.dist-info → esphome-2025.7.0.dist-info}/licenses/LICENSE +0 -0
- {esphome-2025.6.3.dist-info → esphome-2025.7.0.dist-info}/top_level.txt +0 -0
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
#include "ld2420.h"
|
|
2
|
+
#include "esphome/core/application.h"
|
|
2
3
|
#include "esphome/core/helpers.h"
|
|
3
4
|
|
|
4
5
|
/*
|
|
@@ -40,7 +41,7 @@ There are three documented parameters for modes:
|
|
|
40
41
|
00 04 = Energy output mode
|
|
41
42
|
This mode outputs detailed signal energy values for each gate and the target distance.
|
|
42
43
|
The data format consist of the following.
|
|
43
|
-
Header HH, Length LL,
|
|
44
|
+
Header HH, Length LL, Presence PP, Distance DD, 16 Gate Energies EE, Footer FF
|
|
44
45
|
HH HH HH HH LL LL PP DD DD EE EE .. 16x .. FF FF FF FF
|
|
45
46
|
F4 F3 F2 F1 23 00 00 00 00 00 00 .. .. .. .. F8 F7 F6 F5
|
|
46
47
|
00 00 = debug output mode
|
|
@@ -62,38 +63,106 @@ namespace ld2420 {
|
|
|
62
63
|
|
|
63
64
|
static const char *const TAG = "ld2420";
|
|
64
65
|
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
66
|
+
// Local const's
|
|
67
|
+
static const uint16_t REFRESH_RATE_MS = 1000;
|
|
68
|
+
|
|
69
|
+
// Command sets
|
|
70
|
+
static const uint16_t CMD_DISABLE_CONF = 0x00FE;
|
|
71
|
+
static const uint16_t CMD_ENABLE_CONF = 0x00FF;
|
|
72
|
+
static const uint16_t CMD_PARM_HIGH_TRESH = 0x0012;
|
|
73
|
+
static const uint16_t CMD_PARM_LOW_TRESH = 0x0021;
|
|
74
|
+
static const uint16_t CMD_PROTOCOL_VER = 0x0002;
|
|
75
|
+
static const uint16_t CMD_READ_ABD_PARAM = 0x0008;
|
|
76
|
+
static const uint16_t CMD_READ_REG_ADDR = 0x0020;
|
|
77
|
+
static const uint16_t CMD_READ_REGISTER = 0x0002;
|
|
78
|
+
static const uint16_t CMD_READ_SERIAL_NUM = 0x0011;
|
|
79
|
+
static const uint16_t CMD_READ_SYS_PARAM = 0x0013;
|
|
80
|
+
static const uint16_t CMD_READ_VERSION = 0x0000;
|
|
81
|
+
static const uint16_t CMD_RESTART = 0x0068;
|
|
82
|
+
static const uint16_t CMD_SYSTEM_MODE = 0x0000;
|
|
83
|
+
static const uint16_t CMD_SYSTEM_MODE_GR = 0x0003;
|
|
84
|
+
static const uint16_t CMD_SYSTEM_MODE_MTT = 0x0001;
|
|
85
|
+
static const uint16_t CMD_SYSTEM_MODE_SIMPLE = 0x0064;
|
|
86
|
+
static const uint16_t CMD_SYSTEM_MODE_DEBUG = 0x0000;
|
|
87
|
+
static const uint16_t CMD_SYSTEM_MODE_ENERGY = 0x0004;
|
|
88
|
+
static const uint16_t CMD_SYSTEM_MODE_VS = 0x0002;
|
|
89
|
+
static const uint16_t CMD_WRITE_ABD_PARAM = 0x0007;
|
|
90
|
+
static const uint16_t CMD_WRITE_REGISTER = 0x0001;
|
|
91
|
+
static const uint16_t CMD_WRITE_SYS_PARAM = 0x0012;
|
|
92
|
+
|
|
93
|
+
static const uint8_t CMD_ABD_DATA_REPLY_SIZE = 0x04;
|
|
94
|
+
static const uint8_t CMD_ABD_DATA_REPLY_START = 0x0A;
|
|
95
|
+
static const uint8_t CMD_MAX_BYTES = 0x64;
|
|
96
|
+
static const uint8_t CMD_REG_DATA_REPLY_SIZE = 0x02;
|
|
97
|
+
|
|
98
|
+
static const uint8_t LD2420_ERROR_NONE = 0x00;
|
|
99
|
+
static const uint8_t LD2420_ERROR_TIMEOUT = 0x02;
|
|
100
|
+
static const uint8_t LD2420_ERROR_UNKNOWN = 0x01;
|
|
101
|
+
|
|
102
|
+
// Register address values
|
|
103
|
+
static const uint16_t CMD_MIN_GATE_REG = 0x0000;
|
|
104
|
+
static const uint16_t CMD_MAX_GATE_REG = 0x0001;
|
|
105
|
+
static const uint16_t CMD_TIMEOUT_REG = 0x0004;
|
|
106
|
+
static const uint16_t CMD_GATE_MOVE_THRESH[TOTAL_GATES] = {0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015,
|
|
107
|
+
0x0016, 0x0017, 0x0018, 0x0019, 0x001A, 0x001B,
|
|
108
|
+
0x001C, 0x001D, 0x001E, 0x001F};
|
|
109
|
+
static const uint16_t CMD_GATE_STILL_THRESH[TOTAL_GATES] = {0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025,
|
|
110
|
+
0x0026, 0x0027, 0x0028, 0x0029, 0x002A, 0x002B,
|
|
111
|
+
0x002C, 0x002D, 0x002E, 0x002F};
|
|
112
|
+
static const uint32_t FACTORY_MOVE_THRESH[TOTAL_GATES] = {60000, 30000, 400, 250, 250, 250, 250, 250,
|
|
113
|
+
250, 250, 250, 250, 250, 250, 250, 250};
|
|
114
|
+
static const uint32_t FACTORY_STILL_THRESH[TOTAL_GATES] = {40000, 20000, 200, 200, 200, 200, 200, 150,
|
|
115
|
+
150, 100, 100, 100, 100, 100, 100, 100};
|
|
116
|
+
static const uint16_t FACTORY_TIMEOUT = 120;
|
|
117
|
+
static const uint16_t FACTORY_MIN_GATE = 1;
|
|
118
|
+
static const uint16_t FACTORY_MAX_GATE = 12;
|
|
119
|
+
|
|
120
|
+
// COMMAND_BYTE Header & Footer
|
|
121
|
+
static const uint32_t CMD_FRAME_FOOTER = 0x01020304;
|
|
122
|
+
static const uint32_t CMD_FRAME_HEADER = 0xFAFBFCFD;
|
|
123
|
+
static const uint32_t DEBUG_FRAME_FOOTER = 0xFAFBFCFD;
|
|
124
|
+
static const uint32_t DEBUG_FRAME_HEADER = 0x1410BFAA;
|
|
125
|
+
static const uint32_t ENERGY_FRAME_FOOTER = 0xF5F6F7F8;
|
|
126
|
+
static const uint32_t ENERGY_FRAME_HEADER = 0xF1F2F3F4;
|
|
127
|
+
static const int CALIBRATE_VERSION_MIN = 154;
|
|
128
|
+
static const uint8_t CMD_FRAME_COMMAND = 6;
|
|
129
|
+
static const uint8_t CMD_FRAME_DATA_LENGTH = 4;
|
|
130
|
+
static const uint8_t CMD_FRAME_STATUS = 7;
|
|
131
|
+
static const uint8_t CMD_ERROR_WORD = 8;
|
|
132
|
+
static const uint8_t ENERGY_SENSOR_START = 9;
|
|
133
|
+
static const uint8_t CALIBRATE_REPORT_INTERVAL = 4;
|
|
134
|
+
static const std::string OP_NORMAL_MODE_STRING = "Normal";
|
|
135
|
+
static const std::string OP_SIMPLE_MODE_STRING = "Simple";
|
|
136
|
+
|
|
137
|
+
// Memory-efficient lookup tables
|
|
138
|
+
struct StringToUint8 {
|
|
139
|
+
const char *str;
|
|
140
|
+
const uint8_t value;
|
|
141
|
+
};
|
|
142
|
+
|
|
143
|
+
static constexpr StringToUint8 OP_MODE_BY_STR[] = {
|
|
144
|
+
{"Normal", OP_NORMAL_MODE},
|
|
145
|
+
{"Calibrate", OP_CALIBRATE_MODE},
|
|
146
|
+
{"Simple", OP_SIMPLE_MODE},
|
|
147
|
+
};
|
|
148
|
+
|
|
149
|
+
static constexpr const char *ERR_MESSAGE[] = {
|
|
150
|
+
"None",
|
|
151
|
+
"Unknown",
|
|
152
|
+
"Timeout",
|
|
153
|
+
};
|
|
154
|
+
|
|
155
|
+
// Helper function for lookups
|
|
156
|
+
template<size_t N> uint8_t find_uint8(const StringToUint8 (&arr)[N], const std::string &str) {
|
|
157
|
+
for (const auto &entry : arr) {
|
|
158
|
+
if (str == entry.str) {
|
|
159
|
+
return entry.value;
|
|
160
|
+
}
|
|
93
161
|
}
|
|
162
|
+
return 0xFF; // Not found
|
|
94
163
|
}
|
|
95
164
|
|
|
96
|
-
uint8_t
|
|
165
|
+
static uint8_t calc_checksum(void *data, size_t size) {
|
|
97
166
|
uint8_t checksum = 0;
|
|
98
167
|
uint8_t *data_bytes = (uint8_t *) data;
|
|
99
168
|
for (size_t i = 0; i < size; i++) {
|
|
@@ -102,7 +171,7 @@ uint8_t LD2420Component::calc_checksum(void *data, size_t size) {
|
|
|
102
171
|
return checksum;
|
|
103
172
|
}
|
|
104
173
|
|
|
105
|
-
int
|
|
174
|
+
static int get_firmware_int(const char *version_string) {
|
|
106
175
|
std::string version_str = version_string;
|
|
107
176
|
if (version_str[0] == 'v') {
|
|
108
177
|
version_str = version_str.substr(1);
|
|
@@ -112,10 +181,41 @@ int LD2420Component::get_firmware_int_(const char *version_string) {
|
|
|
112
181
|
return version_integer;
|
|
113
182
|
}
|
|
114
183
|
|
|
184
|
+
float LD2420Component::get_setup_priority() const { return setup_priority::BUS; }
|
|
185
|
+
|
|
186
|
+
void LD2420Component::dump_config() {
|
|
187
|
+
ESP_LOGCONFIG(TAG,
|
|
188
|
+
"LD2420:\n"
|
|
189
|
+
" Firmware version: %7s",
|
|
190
|
+
this->firmware_ver_);
|
|
191
|
+
#ifdef USE_NUMBER
|
|
192
|
+
ESP_LOGCONFIG(TAG, "Number:");
|
|
193
|
+
LOG_NUMBER(" ", "Gate Timeout:", this->gate_timeout_number_);
|
|
194
|
+
LOG_NUMBER(" ", "Gate Max Distance:", this->max_gate_distance_number_);
|
|
195
|
+
LOG_NUMBER(" ", "Gate Min Distance:", this->min_gate_distance_number_);
|
|
196
|
+
LOG_NUMBER(" ", "Gate Select:", this->gate_select_number_);
|
|
197
|
+
for (uint8_t gate = 0; gate < TOTAL_GATES; gate++) {
|
|
198
|
+
LOG_NUMBER(" ", "Gate Move Threshold:", this->gate_move_threshold_numbers_[gate]);
|
|
199
|
+
LOG_NUMBER(" ", "Gate Still Threshold::", this->gate_still_threshold_numbers_[gate]);
|
|
200
|
+
}
|
|
201
|
+
#endif
|
|
202
|
+
#ifdef USE_BUTTON
|
|
203
|
+
LOG_BUTTON(" ", "Apply Config:", this->apply_config_button_);
|
|
204
|
+
LOG_BUTTON(" ", "Revert Edits:", this->revert_config_button_);
|
|
205
|
+
LOG_BUTTON(" ", "Factory Reset:", this->factory_reset_button_);
|
|
206
|
+
LOG_BUTTON(" ", "Restart Module:", this->restart_module_button_);
|
|
207
|
+
#endif
|
|
208
|
+
ESP_LOGCONFIG(TAG, "Select:");
|
|
209
|
+
LOG_SELECT(" ", "Operating Mode", this->operating_selector_);
|
|
210
|
+
if (ld2420::get_firmware_int(this->firmware_ver_) < CALIBRATE_VERSION_MIN) {
|
|
211
|
+
ESP_LOGW(TAG, "Firmware version %s and older supports Simple Mode only", this->firmware_ver_);
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
|
|
115
215
|
void LD2420Component::setup() {
|
|
116
216
|
ESP_LOGCONFIG(TAG, "Running setup");
|
|
117
217
|
if (this->set_config_mode(true) == LD2420_ERROR_TIMEOUT) {
|
|
118
|
-
ESP_LOGE(TAG,
|
|
218
|
+
ESP_LOGE(TAG, ESP_LOG_MSG_COMM_FAIL);
|
|
119
219
|
this->mark_failed();
|
|
120
220
|
return;
|
|
121
221
|
}
|
|
@@ -124,24 +224,24 @@ void LD2420Component::setup() {
|
|
|
124
224
|
this->init_gate_config_numbers();
|
|
125
225
|
#endif
|
|
126
226
|
this->get_firmware_version_();
|
|
127
|
-
const char *pfw = this->
|
|
227
|
+
const char *pfw = this->firmware_ver_;
|
|
128
228
|
std::string fw_str(pfw);
|
|
129
229
|
|
|
130
|
-
for (auto &listener : listeners_) {
|
|
230
|
+
for (auto &listener : this->listeners_) {
|
|
131
231
|
listener->on_fw_version(fw_str);
|
|
132
232
|
}
|
|
133
233
|
|
|
134
|
-
for (uint8_t gate = 0; gate <
|
|
234
|
+
for (uint8_t gate = 0; gate < TOTAL_GATES; gate++) {
|
|
135
235
|
delay_microseconds_safe(125);
|
|
136
236
|
this->get_gate_threshold_(gate);
|
|
137
237
|
}
|
|
138
238
|
|
|
139
239
|
memcpy(&this->new_config, &this->current_config, sizeof(this->current_config));
|
|
140
|
-
if (
|
|
240
|
+
if (ld2420::get_firmware_int(this->firmware_ver_) < CALIBRATE_VERSION_MIN) {
|
|
141
241
|
this->set_operating_mode(OP_SIMPLE_MODE_STRING);
|
|
142
242
|
this->operating_selector_->publish_state(OP_SIMPLE_MODE_STRING);
|
|
143
243
|
this->set_mode_(CMD_SYSTEM_MODE_SIMPLE);
|
|
144
|
-
ESP_LOGW(TAG, "
|
|
244
|
+
ESP_LOGW(TAG, "Firmware version %s and older supports Simple Mode only", this->firmware_ver_);
|
|
145
245
|
} else {
|
|
146
246
|
this->set_mode_(CMD_SYSTEM_MODE_ENERGY);
|
|
147
247
|
this->operating_selector_->publish_state(OP_NORMAL_MODE_STRING);
|
|
@@ -151,23 +251,22 @@ void LD2420Component::setup() {
|
|
|
151
251
|
#endif
|
|
152
252
|
this->set_system_mode(this->system_mode_);
|
|
153
253
|
this->set_config_mode(false);
|
|
154
|
-
ESP_LOGCONFIG(TAG, "LD2420 setup complete.");
|
|
155
254
|
}
|
|
156
255
|
|
|
157
256
|
void LD2420Component::apply_config_action() {
|
|
158
257
|
const uint8_t checksum = calc_checksum(&this->new_config, sizeof(this->new_config));
|
|
159
258
|
if (checksum == calc_checksum(&this->current_config, sizeof(this->current_config))) {
|
|
160
|
-
|
|
259
|
+
ESP_LOGD(TAG, "No configuration change detected");
|
|
161
260
|
return;
|
|
162
261
|
}
|
|
163
|
-
|
|
262
|
+
ESP_LOGD(TAG, "Reconfiguring");
|
|
164
263
|
if (this->set_config_mode(true) == LD2420_ERROR_TIMEOUT) {
|
|
165
|
-
ESP_LOGE(TAG,
|
|
264
|
+
ESP_LOGE(TAG, ESP_LOG_MSG_COMM_FAIL);
|
|
166
265
|
this->mark_failed();
|
|
167
266
|
return;
|
|
168
267
|
}
|
|
169
268
|
this->set_min_max_distances_timeout(this->new_config.max_gate, this->new_config.min_gate, this->new_config.timeout);
|
|
170
|
-
for (uint8_t gate = 0; gate <
|
|
269
|
+
for (uint8_t gate = 0; gate < TOTAL_GATES; gate++) {
|
|
171
270
|
delay_microseconds_safe(125);
|
|
172
271
|
this->set_gate_threshold(gate);
|
|
173
272
|
}
|
|
@@ -178,13 +277,12 @@ void LD2420Component::apply_config_action() {
|
|
|
178
277
|
this->set_system_mode(this->system_mode_);
|
|
179
278
|
this->set_config_mode(false); // Disable config mode to save new values in LD2420 nvm
|
|
180
279
|
this->set_operating_mode(OP_NORMAL_MODE_STRING);
|
|
181
|
-
ESP_LOGCONFIG(TAG, "LD2420 reconfig complete.");
|
|
182
280
|
}
|
|
183
281
|
|
|
184
282
|
void LD2420Component::factory_reset_action() {
|
|
185
|
-
|
|
283
|
+
ESP_LOGD(TAG, "Setting factory defaults");
|
|
186
284
|
if (this->set_config_mode(true) == LD2420_ERROR_TIMEOUT) {
|
|
187
|
-
ESP_LOGE(TAG,
|
|
285
|
+
ESP_LOGE(TAG, ESP_LOG_MSG_COMM_FAIL);
|
|
188
286
|
this->mark_failed();
|
|
189
287
|
return;
|
|
190
288
|
}
|
|
@@ -194,7 +292,7 @@ void LD2420Component::factory_reset_action() {
|
|
|
194
292
|
this->min_gate_distance_number_->state = FACTORY_MIN_GATE;
|
|
195
293
|
this->max_gate_distance_number_->state = FACTORY_MAX_GATE;
|
|
196
294
|
#endif
|
|
197
|
-
for (uint8_t gate = 0; gate <
|
|
295
|
+
for (uint8_t gate = 0; gate < TOTAL_GATES; gate++) {
|
|
198
296
|
this->new_config.move_thresh[gate] = FACTORY_MOVE_THRESH[gate];
|
|
199
297
|
this->new_config.still_thresh[gate] = FACTORY_STILL_THRESH[gate];
|
|
200
298
|
delay_microseconds_safe(125);
|
|
@@ -207,18 +305,16 @@ void LD2420Component::factory_reset_action() {
|
|
|
207
305
|
this->init_gate_config_numbers();
|
|
208
306
|
this->refresh_gate_config_numbers();
|
|
209
307
|
#endif
|
|
210
|
-
ESP_LOGCONFIG(TAG, "LD2420 factory reset complete.");
|
|
211
308
|
}
|
|
212
309
|
|
|
213
310
|
void LD2420Component::restart_module_action() {
|
|
214
|
-
|
|
311
|
+
ESP_LOGD(TAG, "Restarting");
|
|
215
312
|
this->send_module_restart();
|
|
216
313
|
this->set_timeout(250, [this]() {
|
|
217
314
|
this->set_config_mode(true);
|
|
218
|
-
this->set_system_mode(system_mode_);
|
|
315
|
+
this->set_system_mode(this->system_mode_);
|
|
219
316
|
this->set_config_mode(false);
|
|
220
317
|
});
|
|
221
|
-
ESP_LOGCONFIG(TAG, "LD2420 Restarted.");
|
|
222
318
|
}
|
|
223
319
|
|
|
224
320
|
void LD2420Component::revert_config_action() {
|
|
@@ -226,25 +322,18 @@ void LD2420Component::revert_config_action() {
|
|
|
226
322
|
#ifdef USE_NUMBER
|
|
227
323
|
this->init_gate_config_numbers();
|
|
228
324
|
#endif
|
|
229
|
-
|
|
325
|
+
ESP_LOGD(TAG, "Reverted config number edits");
|
|
230
326
|
}
|
|
231
327
|
|
|
232
328
|
void LD2420Component::loop() {
|
|
233
329
|
// If there is a active send command do not process it here, the send command call will handle it.
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
return;
|
|
237
|
-
static uint8_t buffer[2048];
|
|
238
|
-
static uint8_t rx_data;
|
|
239
|
-
while (available()) {
|
|
240
|
-
rx_data = read();
|
|
241
|
-
this->readline_(rx_data, buffer, sizeof(buffer));
|
|
242
|
-
}
|
|
330
|
+
while (!this->cmd_active_ && this->available()) {
|
|
331
|
+
this->readline_(this->read(), this->buffer_data_, MAX_LINE_LENGTH);
|
|
243
332
|
}
|
|
244
333
|
}
|
|
245
334
|
|
|
246
335
|
void LD2420Component::update_radar_data(uint16_t const *gate_energy, uint8_t sample_number) {
|
|
247
|
-
for (uint8_t gate = 0; gate <
|
|
336
|
+
for (uint8_t gate = 0; gate < TOTAL_GATES; ++gate) {
|
|
248
337
|
this->radar_data[gate][sample_number] = gate_energy[gate];
|
|
249
338
|
}
|
|
250
339
|
this->total_sample_number_counter++;
|
|
@@ -254,7 +343,7 @@ void LD2420Component::auto_calibrate_sensitivity() {
|
|
|
254
343
|
// Calculate average and peak values for each gate
|
|
255
344
|
const float move_factor = gate_move_sensitivity_factor + 1;
|
|
256
345
|
const float still_factor = (gate_still_sensitivity_factor / 2) + 1;
|
|
257
|
-
for (uint8_t gate = 0; gate <
|
|
346
|
+
for (uint8_t gate = 0; gate < TOTAL_GATES; ++gate) {
|
|
258
347
|
uint32_t sum = 0;
|
|
259
348
|
uint16_t peak = 0;
|
|
260
349
|
|
|
@@ -270,8 +359,9 @@ void LD2420Component::auto_calibrate_sensitivity() {
|
|
|
270
359
|
|
|
271
360
|
// Store average and peak values
|
|
272
361
|
this->gate_avg[gate] = sum / CALIBRATE_SAMPLES;
|
|
273
|
-
if (this->gate_peak[gate] < peak)
|
|
362
|
+
if (this->gate_peak[gate] < peak) {
|
|
274
363
|
this->gate_peak[gate] = peak;
|
|
364
|
+
}
|
|
275
365
|
|
|
276
366
|
uint32_t calculated_value =
|
|
277
367
|
(static_cast<uint32_t>(this->gate_peak[gate]) + (move_factor * static_cast<uint32_t>(this->gate_peak[gate])));
|
|
@@ -283,7 +373,7 @@ void LD2420Component::auto_calibrate_sensitivity() {
|
|
|
283
373
|
}
|
|
284
374
|
|
|
285
375
|
void LD2420Component::report_gate_data() {
|
|
286
|
-
for (uint8_t gate = 0; gate <
|
|
376
|
+
for (uint8_t gate = 0; gate < TOTAL_GATES; ++gate) {
|
|
287
377
|
// Output results
|
|
288
378
|
ESP_LOGI(TAG, "Gate: %2d Avg: %5d Peak: %5d", gate, this->gate_avg[gate], this->gate_peak[gate]);
|
|
289
379
|
}
|
|
@@ -292,13 +382,13 @@ void LD2420Component::report_gate_data() {
|
|
|
292
382
|
|
|
293
383
|
void LD2420Component::set_operating_mode(const std::string &state) {
|
|
294
384
|
// If unsupported firmware ignore mode select
|
|
295
|
-
if (
|
|
296
|
-
this->current_operating_mode =
|
|
385
|
+
if (ld2420::get_firmware_int(firmware_ver_) >= CALIBRATE_VERSION_MIN) {
|
|
386
|
+
this->current_operating_mode = find_uint8(OP_MODE_BY_STR, state);
|
|
297
387
|
// Entering Auto Calibrate we need to clear the privoiuos data collection
|
|
298
388
|
this->operating_selector_->publish_state(state);
|
|
299
389
|
if (current_operating_mode == OP_CALIBRATE_MODE) {
|
|
300
390
|
this->set_calibration_(true);
|
|
301
|
-
for (uint8_t gate = 0; gate <
|
|
391
|
+
for (uint8_t gate = 0; gate < TOTAL_GATES; gate++) {
|
|
302
392
|
this->gate_avg[gate] = 0;
|
|
303
393
|
this->gate_peak[gate] = 0;
|
|
304
394
|
for (uint8_t i = 0; i < CALIBRATE_SAMPLES; i++) {
|
|
@@ -308,8 +398,9 @@ void LD2420Component::set_operating_mode(const std::string &state) {
|
|
|
308
398
|
}
|
|
309
399
|
} else {
|
|
310
400
|
// Set the current data back so we don't have new data that can be applied in error.
|
|
311
|
-
if (this->get_calibration_())
|
|
401
|
+
if (this->get_calibration_()) {
|
|
312
402
|
memcpy(&this->new_config, &this->current_config, sizeof(this->current_config));
|
|
403
|
+
}
|
|
313
404
|
this->set_calibration_(false);
|
|
314
405
|
}
|
|
315
406
|
} else {
|
|
@@ -319,29 +410,32 @@ void LD2420Component::set_operating_mode(const std::string &state) {
|
|
|
319
410
|
}
|
|
320
411
|
|
|
321
412
|
void LD2420Component::readline_(int rx_data, uint8_t *buffer, int len) {
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
413
|
+
if (rx_data < 0) {
|
|
414
|
+
return; // No data available
|
|
415
|
+
}
|
|
416
|
+
if (this->buffer_pos_ < len - 1) {
|
|
417
|
+
buffer[this->buffer_pos_++] = rx_data;
|
|
418
|
+
buffer[this->buffer_pos_] = 0;
|
|
419
|
+
} else {
|
|
420
|
+
// We should never get here, but just in case...
|
|
421
|
+
ESP_LOGW(TAG, "Max command length exceeded; ignoring");
|
|
422
|
+
this->buffer_pos_ = 0;
|
|
423
|
+
}
|
|
424
|
+
if (this->buffer_pos_ < 4) {
|
|
425
|
+
return; // Not enough data to process yet
|
|
426
|
+
}
|
|
427
|
+
if (memcmp(&buffer[this->buffer_pos_ - 4], &CMD_FRAME_FOOTER, sizeof(CMD_FRAME_FOOTER)) == 0) {
|
|
428
|
+
this->cmd_active_ = false; // Set command state to inactive after response
|
|
429
|
+
this->handle_ack_data_(buffer, this->buffer_pos_);
|
|
430
|
+
this->buffer_pos_ = 0;
|
|
431
|
+
} else if ((buffer[this->buffer_pos_ - 2] == 0x0D && buffer[this->buffer_pos_ - 1] == 0x0A) &&
|
|
432
|
+
(this->get_mode_() == CMD_SYSTEM_MODE_SIMPLE)) {
|
|
433
|
+
this->handle_simple_mode_(buffer, this->buffer_pos_);
|
|
434
|
+
this->buffer_pos_ = 0;
|
|
435
|
+
} else if ((memcmp(&buffer[this->buffer_pos_ - 4], &ENERGY_FRAME_FOOTER, sizeof(ENERGY_FRAME_FOOTER)) == 0) &&
|
|
436
|
+
(this->get_mode_() == CMD_SYSTEM_MODE_ENERGY)) {
|
|
437
|
+
this->handle_energy_mode_(buffer, this->buffer_pos_);
|
|
438
|
+
this->buffer_pos_ = 0;
|
|
345
439
|
}
|
|
346
440
|
}
|
|
347
441
|
|
|
@@ -365,13 +459,14 @@ void LD2420Component::handle_energy_mode_(uint8_t *buffer, int len) {
|
|
|
365
459
|
}
|
|
366
460
|
|
|
367
461
|
// Resonable refresh rate for home assistant database size health
|
|
368
|
-
const int32_t current_millis =
|
|
369
|
-
if (current_millis - this->last_periodic_millis < REFRESH_RATE_MS)
|
|
462
|
+
const int32_t current_millis = App.get_loop_component_start_time();
|
|
463
|
+
if (current_millis - this->last_periodic_millis < REFRESH_RATE_MS) {
|
|
370
464
|
return;
|
|
465
|
+
}
|
|
371
466
|
this->last_periodic_millis = current_millis;
|
|
372
467
|
for (auto &listener : this->listeners_) {
|
|
373
|
-
listener->on_distance(get_distance_());
|
|
374
|
-
listener->on_presence(get_presence_());
|
|
468
|
+
listener->on_distance(this->get_distance_());
|
|
469
|
+
listener->on_presence(this->get_presence_());
|
|
375
470
|
listener->on_energy(this->gate_energy_, sizeof(this->gate_energy_) / sizeof(this->gate_energy_[0]));
|
|
376
471
|
}
|
|
377
472
|
|
|
@@ -392,9 +487,9 @@ void LD2420Component::handle_simple_mode_(const uint8_t *inbuf, int len) {
|
|
|
392
487
|
char outbuf[bufsize]{0};
|
|
393
488
|
while (true) {
|
|
394
489
|
if (inbuf[pos - 2] == 'O' && inbuf[pos - 1] == 'F' && inbuf[pos] == 'F') {
|
|
395
|
-
set_presence_(false);
|
|
490
|
+
this->set_presence_(false);
|
|
396
491
|
} else if (inbuf[pos - 1] == 'O' && inbuf[pos] == 'N') {
|
|
397
|
-
set_presence_(true);
|
|
492
|
+
this->set_presence_(true);
|
|
398
493
|
}
|
|
399
494
|
if (inbuf[pos] >= '0' && inbuf[pos] <= '9') {
|
|
400
495
|
if (index < bufsize - 1) {
|
|
@@ -410,19 +505,21 @@ void LD2420Component::handle_simple_mode_(const uint8_t *inbuf, int len) {
|
|
|
410
505
|
}
|
|
411
506
|
}
|
|
412
507
|
outbuf[index] = '\0';
|
|
413
|
-
if (index > 1)
|
|
414
|
-
set_distance_(strtol(outbuf, &endptr, 10));
|
|
508
|
+
if (index > 1) {
|
|
509
|
+
this->set_distance_(strtol(outbuf, &endptr, 10));
|
|
510
|
+
}
|
|
415
511
|
|
|
416
|
-
if (get_mode_() == CMD_SYSTEM_MODE_SIMPLE) {
|
|
512
|
+
if (this->get_mode_() == CMD_SYSTEM_MODE_SIMPLE) {
|
|
417
513
|
// Resonable refresh rate for home assistant database size health
|
|
418
|
-
const int32_t current_millis =
|
|
419
|
-
if (current_millis - this->last_normal_periodic_millis < REFRESH_RATE_MS)
|
|
514
|
+
const int32_t current_millis = App.get_loop_component_start_time();
|
|
515
|
+
if (current_millis - this->last_normal_periodic_millis < REFRESH_RATE_MS) {
|
|
420
516
|
return;
|
|
517
|
+
}
|
|
421
518
|
this->last_normal_periodic_millis = current_millis;
|
|
422
519
|
for (auto &listener : this->listeners_)
|
|
423
|
-
listener->on_distance(get_distance_());
|
|
520
|
+
listener->on_distance(this->get_distance_());
|
|
424
521
|
for (auto &listener : this->listeners_)
|
|
425
|
-
listener->on_presence(get_presence_());
|
|
522
|
+
listener->on_presence(this->get_presence_());
|
|
426
523
|
}
|
|
427
524
|
}
|
|
428
525
|
|
|
@@ -433,10 +530,10 @@ void LD2420Component::handle_ack_data_(uint8_t *buffer, int len) {
|
|
|
433
530
|
uint8_t data_element = 0;
|
|
434
531
|
uint16_t data_pos = 0;
|
|
435
532
|
if (this->cmd_reply_.length > CMD_MAX_BYTES) {
|
|
436
|
-
ESP_LOGW(TAG, "
|
|
533
|
+
ESP_LOGW(TAG, "Reply frame too long");
|
|
437
534
|
return;
|
|
438
535
|
} else if (this->cmd_reply_.length < 2) {
|
|
439
|
-
ESP_LOGW(TAG, "
|
|
536
|
+
ESP_LOGW(TAG, "Command frame too short");
|
|
440
537
|
return;
|
|
441
538
|
}
|
|
442
539
|
memcpy(&this->cmd_reply_.error, &buffer[CMD_ERROR_WORD], sizeof(this->cmd_reply_.error));
|
|
@@ -447,13 +544,13 @@ void LD2420Component::handle_ack_data_(uint8_t *buffer, int len) {
|
|
|
447
544
|
this->cmd_reply_.ack = true;
|
|
448
545
|
switch ((uint16_t) this->cmd_reply_.command) {
|
|
449
546
|
case (CMD_ENABLE_CONF):
|
|
450
|
-
|
|
547
|
+
ESP_LOGV(TAG, "Set config enable: CMD = %2X %s", CMD_ENABLE_CONF, result);
|
|
451
548
|
break;
|
|
452
549
|
case (CMD_DISABLE_CONF):
|
|
453
|
-
|
|
550
|
+
ESP_LOGV(TAG, "Set config disable: CMD = %2X %s", CMD_DISABLE_CONF, result);
|
|
454
551
|
break;
|
|
455
552
|
case (CMD_READ_REGISTER):
|
|
456
|
-
|
|
553
|
+
ESP_LOGV(TAG, "Read register: CMD = %2X %s", CMD_READ_REGISTER, result);
|
|
457
554
|
// TODO Read/Write register is not implemented yet, this will get flushed out to a proper header file
|
|
458
555
|
data_pos = 0x0A;
|
|
459
556
|
for (uint16_t index = 0; index < (CMD_REG_DATA_REPLY_SIZE * // NOLINT
|
|
@@ -465,13 +562,13 @@ void LD2420Component::handle_ack_data_(uint8_t *buffer, int len) {
|
|
|
465
562
|
}
|
|
466
563
|
break;
|
|
467
564
|
case (CMD_WRITE_REGISTER):
|
|
468
|
-
|
|
565
|
+
ESP_LOGV(TAG, "Write register: CMD = %2X %s", CMD_WRITE_REGISTER, result);
|
|
469
566
|
break;
|
|
470
567
|
case (CMD_WRITE_ABD_PARAM):
|
|
471
|
-
|
|
568
|
+
ESP_LOGV(TAG, "Write gate parameter(s): %2X %s", CMD_WRITE_ABD_PARAM, result);
|
|
472
569
|
break;
|
|
473
570
|
case (CMD_READ_ABD_PARAM):
|
|
474
|
-
|
|
571
|
+
ESP_LOGV(TAG, "Read gate parameter(s): %2X %s", CMD_READ_ABD_PARAM, result);
|
|
475
572
|
data_pos = CMD_ABD_DATA_REPLY_START;
|
|
476
573
|
for (uint16_t index = 0; index < (CMD_ABD_DATA_REPLY_SIZE * // NOLINT
|
|
477
574
|
((buffer[CMD_FRAME_DATA_LENGTH] - 4) / CMD_ABD_DATA_REPLY_SIZE));
|
|
@@ -483,11 +580,11 @@ void LD2420Component::handle_ack_data_(uint8_t *buffer, int len) {
|
|
|
483
580
|
}
|
|
484
581
|
break;
|
|
485
582
|
case (CMD_WRITE_SYS_PARAM):
|
|
486
|
-
|
|
583
|
+
ESP_LOGV(TAG, "Set system parameter(s): %2X %s", CMD_WRITE_SYS_PARAM, result);
|
|
487
584
|
break;
|
|
488
585
|
case (CMD_READ_VERSION):
|
|
489
|
-
memcpy(this->
|
|
490
|
-
|
|
586
|
+
memcpy(this->firmware_ver_, &buffer[12], buffer[10]);
|
|
587
|
+
ESP_LOGV(TAG, "Firmware version: %7s %s", this->firmware_ver_, result);
|
|
491
588
|
break;
|
|
492
589
|
default:
|
|
493
590
|
break;
|
|
@@ -497,11 +594,12 @@ void LD2420Component::handle_ack_data_(uint8_t *buffer, int len) {
|
|
|
497
594
|
int LD2420Component::send_cmd_from_array(CmdFrameT frame) {
|
|
498
595
|
uint32_t start_millis = millis();
|
|
499
596
|
uint8_t error = 0;
|
|
500
|
-
uint8_t ack_buffer[
|
|
501
|
-
uint8_t cmd_buffer[
|
|
597
|
+
uint8_t ack_buffer[MAX_LINE_LENGTH];
|
|
598
|
+
uint8_t cmd_buffer[MAX_LINE_LENGTH];
|
|
502
599
|
this->cmd_reply_.ack = false;
|
|
503
|
-
if (frame.command != CMD_RESTART)
|
|
504
|
-
this->
|
|
600
|
+
if (frame.command != CMD_RESTART) {
|
|
601
|
+
this->cmd_active_ = true;
|
|
602
|
+
} // Restart does not reply, thus no ack state required
|
|
505
603
|
uint8_t retry = 3;
|
|
506
604
|
while (retry) {
|
|
507
605
|
frame.length = 0;
|
|
@@ -523,9 +621,7 @@ int LD2420Component::send_cmd_from_array(CmdFrameT frame) {
|
|
|
523
621
|
|
|
524
622
|
memcpy(cmd_buffer + frame.length, &frame.footer, sizeof(frame.footer));
|
|
525
623
|
frame.length += sizeof(frame.footer);
|
|
526
|
-
|
|
527
|
-
this->write_byte(cmd_buffer[index]);
|
|
528
|
-
}
|
|
624
|
+
this->write_array(cmd_buffer, frame.length);
|
|
529
625
|
|
|
530
626
|
error = 0;
|
|
531
627
|
if (frame.command == CMD_RESTART) {
|
|
@@ -533,8 +629,8 @@ int LD2420Component::send_cmd_from_array(CmdFrameT frame) {
|
|
|
533
629
|
}
|
|
534
630
|
|
|
535
631
|
while (!this->cmd_reply_.ack) {
|
|
536
|
-
while (available()) {
|
|
537
|
-
this->readline_(read(), ack_buffer, sizeof(ack_buffer));
|
|
632
|
+
while (this->available()) {
|
|
633
|
+
this->readline_(this->read(), ack_buffer, sizeof(ack_buffer));
|
|
538
634
|
}
|
|
539
635
|
delay_microseconds_safe(1450);
|
|
540
636
|
// Wait on an Rx from the LD2420 for up to 3 1 second loops, otherwise it could trigger a WDT.
|
|
@@ -545,10 +641,12 @@ int LD2420Component::send_cmd_from_array(CmdFrameT frame) {
|
|
|
545
641
|
break;
|
|
546
642
|
}
|
|
547
643
|
}
|
|
548
|
-
if (this->cmd_reply_.ack)
|
|
644
|
+
if (this->cmd_reply_.ack) {
|
|
549
645
|
retry = 0;
|
|
550
|
-
|
|
551
|
-
|
|
646
|
+
}
|
|
647
|
+
if (this->cmd_reply_.error > 0) {
|
|
648
|
+
this->handle_cmd_error(error);
|
|
649
|
+
}
|
|
552
650
|
}
|
|
553
651
|
return error;
|
|
554
652
|
}
|
|
@@ -563,7 +661,7 @@ uint8_t LD2420Component::set_config_mode(bool enable) {
|
|
|
563
661
|
cmd_frame.data_length += sizeof(CMD_PROTOCOL_VER);
|
|
564
662
|
}
|
|
565
663
|
cmd_frame.footer = CMD_FRAME_FOOTER;
|
|
566
|
-
|
|
664
|
+
ESP_LOGV(TAG, "Sending set config %s command: %2X", enable ? "enable" : "disable", cmd_frame.command);
|
|
567
665
|
return this->send_cmd_from_array(cmd_frame);
|
|
568
666
|
}
|
|
569
667
|
|
|
@@ -576,7 +674,7 @@ void LD2420Component::ld2420_restart() {
|
|
|
576
674
|
cmd_frame.header = CMD_FRAME_HEADER;
|
|
577
675
|
cmd_frame.command = CMD_RESTART;
|
|
578
676
|
cmd_frame.footer = CMD_FRAME_FOOTER;
|
|
579
|
-
|
|
677
|
+
ESP_LOGV(TAG, "Sending restart command: %2X", cmd_frame.command);
|
|
580
678
|
this->send_cmd_from_array(cmd_frame);
|
|
581
679
|
}
|
|
582
680
|
|
|
@@ -588,7 +686,7 @@ void LD2420Component::get_reg_value_(uint16_t reg) {
|
|
|
588
686
|
cmd_frame.data[1] = reg;
|
|
589
687
|
cmd_frame.data_length += 2;
|
|
590
688
|
cmd_frame.footer = CMD_FRAME_FOOTER;
|
|
591
|
-
|
|
689
|
+
ESP_LOGV(TAG, "Sending read register %4X command: %2X", reg, cmd_frame.command);
|
|
592
690
|
this->send_cmd_from_array(cmd_frame);
|
|
593
691
|
}
|
|
594
692
|
|
|
@@ -602,11 +700,11 @@ void LD2420Component::set_reg_value(uint16_t reg, uint16_t value) {
|
|
|
602
700
|
memcpy(&cmd_frame.data[cmd_frame.data_length], &value, sizeof(CMD_REG_DATA_REPLY_SIZE));
|
|
603
701
|
cmd_frame.data_length += 2;
|
|
604
702
|
cmd_frame.footer = CMD_FRAME_FOOTER;
|
|
605
|
-
|
|
703
|
+
ESP_LOGV(TAG, "Sending write register %4X command: %2X data = %4X", reg, cmd_frame.command, value);
|
|
606
704
|
this->send_cmd_from_array(cmd_frame);
|
|
607
705
|
}
|
|
608
706
|
|
|
609
|
-
void LD2420Component::handle_cmd_error(uint8_t error) {
|
|
707
|
+
void LD2420Component::handle_cmd_error(uint8_t error) { ESP_LOGE(TAG, "Command failed: %s", ERR_MESSAGE[error]); }
|
|
610
708
|
|
|
611
709
|
int LD2420Component::get_gate_threshold_(uint8_t gate) {
|
|
612
710
|
uint8_t error;
|
|
@@ -619,7 +717,7 @@ int LD2420Component::get_gate_threshold_(uint8_t gate) {
|
|
|
619
717
|
memcpy(&cmd_frame.data[cmd_frame.data_length], &CMD_GATE_STILL_THRESH[gate], sizeof(CMD_GATE_STILL_THRESH[gate]));
|
|
620
718
|
cmd_frame.data_length += 2;
|
|
621
719
|
cmd_frame.footer = CMD_FRAME_FOOTER;
|
|
622
|
-
|
|
720
|
+
ESP_LOGV(TAG, "Sending read gate %d high/low threshold command: %2X", gate, cmd_frame.command);
|
|
623
721
|
error = this->send_cmd_from_array(cmd_frame);
|
|
624
722
|
if (error == 0) {
|
|
625
723
|
this->current_config.move_thresh[gate] = cmd_reply_.data[0];
|
|
@@ -644,7 +742,7 @@ int LD2420Component::get_min_max_distances_timeout_() {
|
|
|
644
742
|
sizeof(CMD_TIMEOUT_REG)); // Register: global delay time
|
|
645
743
|
cmd_frame.data_length += sizeof(CMD_TIMEOUT_REG);
|
|
646
744
|
cmd_frame.footer = CMD_FRAME_FOOTER;
|
|
647
|
-
|
|
745
|
+
ESP_LOGV(TAG, "Sending read gate min max and timeout command: %2X", cmd_frame.command);
|
|
648
746
|
error = this->send_cmd_from_array(cmd_frame);
|
|
649
747
|
if (error == 0) {
|
|
650
748
|
this->current_config.min_gate = (uint16_t) cmd_reply_.data[0];
|
|
@@ -667,9 +765,10 @@ void LD2420Component::set_system_mode(uint16_t mode) {
|
|
|
667
765
|
memcpy(&cmd_frame.data[cmd_frame.data_length], &unknown_parm, sizeof(unknown_parm));
|
|
668
766
|
cmd_frame.data_length += sizeof(unknown_parm);
|
|
669
767
|
cmd_frame.footer = CMD_FRAME_FOOTER;
|
|
670
|
-
|
|
671
|
-
if (this->send_cmd_from_array(cmd_frame) == 0)
|
|
672
|
-
set_mode_(mode);
|
|
768
|
+
ESP_LOGV(TAG, "Sending write system mode command: %2X", cmd_frame.command);
|
|
769
|
+
if (this->send_cmd_from_array(cmd_frame) == 0) {
|
|
770
|
+
this->set_mode_(mode);
|
|
771
|
+
}
|
|
673
772
|
}
|
|
674
773
|
|
|
675
774
|
void LD2420Component::get_firmware_version_() {
|
|
@@ -679,7 +778,7 @@ void LD2420Component::get_firmware_version_() {
|
|
|
679
778
|
cmd_frame.command = CMD_READ_VERSION;
|
|
680
779
|
cmd_frame.footer = CMD_FRAME_FOOTER;
|
|
681
780
|
|
|
682
|
-
|
|
781
|
+
ESP_LOGV(TAG, "Sending read firmware version command: %2X", cmd_frame.command);
|
|
683
782
|
this->send_cmd_from_array(cmd_frame);
|
|
684
783
|
}
|
|
685
784
|
|
|
@@ -712,7 +811,7 @@ void LD2420Component::set_min_max_distances_timeout(uint32_t max_gate_distance,
|
|
|
712
811
|
cmd_frame.data_length += sizeof(timeout);
|
|
713
812
|
cmd_frame.footer = CMD_FRAME_FOOTER;
|
|
714
813
|
|
|
715
|
-
|
|
814
|
+
ESP_LOGV(TAG, "Sending write gate min max and timeout command: %2X", cmd_frame.command);
|
|
716
815
|
this->send_cmd_from_array(cmd_frame);
|
|
717
816
|
}
|
|
718
817
|
|
|
@@ -738,25 +837,31 @@ void LD2420Component::set_gate_threshold(uint8_t gate) {
|
|
|
738
837
|
sizeof(this->new_config.still_thresh[gate]));
|
|
739
838
|
cmd_frame.data_length += sizeof(this->new_config.still_thresh[gate]);
|
|
740
839
|
cmd_frame.footer = CMD_FRAME_FOOTER;
|
|
741
|
-
|
|
840
|
+
ESP_LOGV(TAG, "Sending set gate %4X sensitivity command: %2X", gate, cmd_frame.command);
|
|
742
841
|
this->send_cmd_from_array(cmd_frame);
|
|
743
842
|
}
|
|
744
843
|
|
|
745
844
|
#ifdef USE_NUMBER
|
|
746
845
|
void LD2420Component::init_gate_config_numbers() {
|
|
747
|
-
if (this->gate_timeout_number_ != nullptr)
|
|
846
|
+
if (this->gate_timeout_number_ != nullptr) {
|
|
748
847
|
this->gate_timeout_number_->publish_state(static_cast<uint16_t>(this->current_config.timeout));
|
|
749
|
-
|
|
848
|
+
}
|
|
849
|
+
if (this->gate_select_number_ != nullptr) {
|
|
750
850
|
this->gate_select_number_->publish_state(0);
|
|
751
|
-
|
|
851
|
+
}
|
|
852
|
+
if (this->min_gate_distance_number_ != nullptr) {
|
|
752
853
|
this->min_gate_distance_number_->publish_state(static_cast<uint16_t>(this->current_config.min_gate));
|
|
753
|
-
|
|
854
|
+
}
|
|
855
|
+
if (this->max_gate_distance_number_ != nullptr) {
|
|
754
856
|
this->max_gate_distance_number_->publish_state(static_cast<uint16_t>(this->current_config.max_gate));
|
|
755
|
-
|
|
857
|
+
}
|
|
858
|
+
if (this->gate_move_sensitivity_factor_number_ != nullptr) {
|
|
756
859
|
this->gate_move_sensitivity_factor_number_->publish_state(this->gate_move_sensitivity_factor);
|
|
757
|
-
|
|
860
|
+
}
|
|
861
|
+
if (this->gate_still_sensitivity_factor_number_ != nullptr) {
|
|
758
862
|
this->gate_still_sensitivity_factor_number_->publish_state(this->gate_still_sensitivity_factor);
|
|
759
|
-
|
|
863
|
+
}
|
|
864
|
+
for (uint8_t gate = 0; gate < TOTAL_GATES; gate++) {
|
|
760
865
|
if (this->gate_still_threshold_numbers_[gate] != nullptr) {
|
|
761
866
|
this->gate_still_threshold_numbers_[gate]->publish_state(
|
|
762
867
|
static_cast<uint16_t>(this->current_config.still_thresh[gate]));
|