esphome 2025.6.3__py3-none-any.whl → 2025.7.0b2__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- esphome/__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/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/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 +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 +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 +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/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 +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_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 +132 -47
- 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 +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.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 +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 +305 -427
- 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 +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 +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 +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/wizard.py +17 -4
- esphome/writer.py +21 -3
- esphome/yaml_util.py +0 -2
- {esphome-2025.6.3.dist-info → esphome-2025.7.0b2.dist-info}/METADATA +10 -9
- {esphome-2025.6.3.dist-info → esphome-2025.7.0b2.dist-info}/RECORD +597 -538
- 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.0b2.dist-info}/WHEEL +0 -0
- {esphome-2025.6.3.dist-info → esphome-2025.7.0b2.dist-info}/entry_points.txt +0 -0
- {esphome-2025.6.3.dist-info → esphome-2025.7.0b2.dist-info}/licenses/LICENSE +0 -0
- {esphome-2025.6.3.dist-info → esphome-2025.7.0b2.dist-info}/top_level.txt +0 -0
|
@@ -3,14 +3,14 @@
|
|
|
3
3
|
#ifdef USE_NEXTION_TFT_UPLOAD
|
|
4
4
|
#ifdef USE_ESP_IDF
|
|
5
5
|
|
|
6
|
+
#include <esp_heap_caps.h>
|
|
7
|
+
#include <esp_http_client.h>
|
|
8
|
+
#include <cinttypes>
|
|
9
|
+
#include "esphome/components/network/util.h"
|
|
6
10
|
#include "esphome/core/application.h"
|
|
7
11
|
#include "esphome/core/defines.h"
|
|
8
|
-
#include "esphome/core/util.h"
|
|
9
12
|
#include "esphome/core/log.h"
|
|
10
|
-
#include "esphome/
|
|
11
|
-
#include <cinttypes>
|
|
12
|
-
#include <esp_heap_caps.h>
|
|
13
|
-
#include <esp_http_client.h>
|
|
13
|
+
#include "esphome/core/util.h"
|
|
14
14
|
|
|
15
15
|
namespace esphome {
|
|
16
16
|
namespace nextion {
|
|
@@ -51,7 +51,7 @@ int Nextion::upload_by_chunks_(esp_http_client_handle_t http_client, uint32_t &r
|
|
|
51
51
|
}
|
|
52
52
|
|
|
53
53
|
// Allocate the buffer dynamically
|
|
54
|
-
|
|
54
|
+
RAMAllocator<uint8_t> allocator;
|
|
55
55
|
uint8_t *buffer = allocator.allocate(4096);
|
|
56
56
|
if (!buffer) {
|
|
57
57
|
ESP_LOGE(TAG, "Buffer alloc failed");
|
|
@@ -155,7 +155,7 @@ bool Nextion::upload_tft(uint32_t baud_rate, bool exit_reparse) {
|
|
|
155
155
|
ESP_LOGD(TAG, "Exit reparse: %s", YESNO(exit_reparse));
|
|
156
156
|
ESP_LOGD(TAG, "URL: %s", this->tft_url_.c_str());
|
|
157
157
|
|
|
158
|
-
if (this->is_updating_) {
|
|
158
|
+
if (this->connection_state_.is_updating_) {
|
|
159
159
|
ESP_LOGW(TAG, "Upload in progress");
|
|
160
160
|
return false;
|
|
161
161
|
}
|
|
@@ -165,7 +165,7 @@ bool Nextion::upload_tft(uint32_t baud_rate, bool exit_reparse) {
|
|
|
165
165
|
return false;
|
|
166
166
|
}
|
|
167
167
|
|
|
168
|
-
this->is_updating_ = true;
|
|
168
|
+
this->connection_state_.is_updating_ = true;
|
|
169
169
|
|
|
170
170
|
if (exit_reparse) {
|
|
171
171
|
ESP_LOGD(TAG, "Exit reparse mode");
|
|
@@ -246,7 +246,7 @@ bool Nextion::upload_tft(uint32_t baud_rate, bool exit_reparse) {
|
|
|
246
246
|
|
|
247
247
|
// The Nextion will ignore the upload command if it is sleeping
|
|
248
248
|
ESP_LOGV(TAG, "Wake-up");
|
|
249
|
-
this->ignore_is_setup_ = true;
|
|
249
|
+
this->connection_state_.ignore_is_setup_ = true;
|
|
250
250
|
this->send_command_("sleep=0");
|
|
251
251
|
this->send_command_("dim=100");
|
|
252
252
|
vTaskDelay(pdMS_TO_TICKS(250)); // NOLINT
|
|
@@ -335,30 +335,6 @@ bool Nextion::upload_tft(uint32_t baud_rate, bool exit_reparse) {
|
|
|
335
335
|
return this->upload_end_(true);
|
|
336
336
|
}
|
|
337
337
|
|
|
338
|
-
bool Nextion::upload_end_(bool successful) {
|
|
339
|
-
ESP_LOGD(TAG, "TFT upload done: %s", YESNO(successful));
|
|
340
|
-
|
|
341
|
-
if (successful) {
|
|
342
|
-
ESP_LOGD(TAG, "Restart");
|
|
343
|
-
delay(1500); // NOLINT
|
|
344
|
-
App.safe_reboot();
|
|
345
|
-
} else {
|
|
346
|
-
ESP_LOGE(TAG, "TFT upload failed");
|
|
347
|
-
|
|
348
|
-
this->is_updating_ = false;
|
|
349
|
-
this->ignore_is_setup_ = false;
|
|
350
|
-
|
|
351
|
-
uint32_t baud_rate = this->parent_->get_baud_rate();
|
|
352
|
-
if (baud_rate != this->original_baud_rate_) {
|
|
353
|
-
ESP_LOGD(TAG, "Baud back: %" PRIu32 "->%" PRIu32, baud_rate, this->original_baud_rate_);
|
|
354
|
-
this->parent_->set_baud_rate(this->original_baud_rate_);
|
|
355
|
-
this->parent_->load_settings();
|
|
356
|
-
}
|
|
357
|
-
}
|
|
358
|
-
|
|
359
|
-
return successful;
|
|
360
|
-
}
|
|
361
|
-
|
|
362
338
|
} // namespace nextion
|
|
363
339
|
} // namespace esphome
|
|
364
340
|
|
|
@@ -53,7 +53,7 @@ void NextionSensor::set_state(float state, bool publish, bool send_to_nextion) {
|
|
|
53
53
|
|
|
54
54
|
if (this->wave_chan_id_ == UINT8_MAX) {
|
|
55
55
|
if (send_to_nextion) {
|
|
56
|
-
if (this->nextion_->is_sleeping() || !this->
|
|
56
|
+
if (this->nextion_->is_sleeping() || !this->component_flags_.visible) {
|
|
57
57
|
this->needs_to_send_update_ = true;
|
|
58
58
|
} else {
|
|
59
59
|
this->needs_to_send_update_ = false;
|
|
@@ -28,7 +28,7 @@ void NextionSwitch::set_state(bool state, bool publish, bool send_to_nextion) {
|
|
|
28
28
|
return;
|
|
29
29
|
|
|
30
30
|
if (send_to_nextion) {
|
|
31
|
-
if (this->nextion_->is_sleeping() || !this->
|
|
31
|
+
if (this->nextion_->is_sleeping() || !this->component_flags_.visible) {
|
|
32
32
|
this->needs_to_send_update_ = true;
|
|
33
33
|
} else {
|
|
34
34
|
this->needs_to_send_update_ = false;
|
|
@@ -26,7 +26,7 @@ void NextionTextSensor::set_state(const std::string &state, bool publish, bool s
|
|
|
26
26
|
return;
|
|
27
27
|
|
|
28
28
|
if (send_to_nextion) {
|
|
29
|
-
if (this->nextion_->is_sleeping() || !this->
|
|
29
|
+
if (this->nextion_->is_sleeping() || !this->component_flags_.visible) {
|
|
30
30
|
this->needs_to_send_update_ = true;
|
|
31
31
|
} else {
|
|
32
32
|
this->nextion_->add_no_result_to_queue_with_set(this, state);
|
esphome/components/nfc/nfc.cpp
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
#include "nfc.h"
|
|
2
2
|
#include <cstdio>
|
|
3
|
+
#include "esphome/core/helpers.h"
|
|
3
4
|
#include "esphome/core/log.h"
|
|
4
5
|
|
|
5
6
|
namespace esphome {
|
|
@@ -7,29 +8,9 @@ namespace nfc {
|
|
|
7
8
|
|
|
8
9
|
static const char *const TAG = "nfc";
|
|
9
10
|
|
|
10
|
-
std::string format_uid(std::vector<uint8_t> &uid) {
|
|
11
|
-
char buf[(uid.size() * 2) + uid.size() - 1];
|
|
12
|
-
int offset = 0;
|
|
13
|
-
for (size_t i = 0; i < uid.size(); i++) {
|
|
14
|
-
const char *format = "%02X";
|
|
15
|
-
if (i + 1 < uid.size())
|
|
16
|
-
format = "%02X-";
|
|
17
|
-
offset += sprintf(buf + offset, format, uid[i]);
|
|
18
|
-
}
|
|
19
|
-
return std::string(buf);
|
|
20
|
-
}
|
|
11
|
+
std::string format_uid(const std::vector<uint8_t> &uid) { return format_hex_pretty(uid, '-', false); }
|
|
21
12
|
|
|
22
|
-
std::string format_bytes(std::vector<uint8_t> &bytes) {
|
|
23
|
-
char buf[(bytes.size() * 2) + bytes.size() - 1];
|
|
24
|
-
int offset = 0;
|
|
25
|
-
for (size_t i = 0; i < bytes.size(); i++) {
|
|
26
|
-
const char *format = "%02X";
|
|
27
|
-
if (i + 1 < bytes.size())
|
|
28
|
-
format = "%02X ";
|
|
29
|
-
offset += sprintf(buf + offset, format, bytes[i]);
|
|
30
|
-
}
|
|
31
|
-
return std::string(buf);
|
|
32
|
-
}
|
|
13
|
+
std::string format_bytes(const std::vector<uint8_t> &bytes) { return format_hex_pretty(bytes, ' ', false); }
|
|
33
14
|
|
|
34
15
|
uint8_t guess_tag_type(uint8_t uid_length) {
|
|
35
16
|
if (uid_length == 4) {
|
esphome/components/nfc/nfc.h
CHANGED
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
|
|
3
3
|
#include "esphome/core/helpers.h"
|
|
4
4
|
#include "esphome/core/log.h"
|
|
5
|
-
#include "ndef_record.h"
|
|
6
5
|
#include "ndef_message.h"
|
|
6
|
+
#include "ndef_record.h"
|
|
7
7
|
#include "nfc_tag.h"
|
|
8
8
|
|
|
9
9
|
#include <vector>
|
|
@@ -53,8 +53,8 @@ static const uint8_t DEFAULT_KEY[6] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
|
|
|
53
53
|
static const uint8_t NDEF_KEY[6] = {0xD3, 0xF7, 0xD3, 0xF7, 0xD3, 0xF7};
|
|
54
54
|
static const uint8_t MAD_KEY[6] = {0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5};
|
|
55
55
|
|
|
56
|
-
std::string format_uid(std::vector<uint8_t> &uid);
|
|
57
|
-
std::string format_bytes(std::vector<uint8_t> &bytes);
|
|
56
|
+
std::string format_uid(const std::vector<uint8_t> &uid);
|
|
57
|
+
std::string format_bytes(const std::vector<uint8_t> &bytes);
|
|
58
58
|
|
|
59
59
|
uint8_t guess_tag_type(uint8_t uid_length);
|
|
60
60
|
uint8_t get_mifare_classic_ndef_start_index(std::vector<uint8_t> &data);
|
|
@@ -76,8 +76,8 @@ from esphome.const import (
|
|
|
76
76
|
DEVICE_CLASS_WIND_SPEED,
|
|
77
77
|
)
|
|
78
78
|
from esphome.core import CORE, coroutine_with_priority
|
|
79
|
+
from esphome.core.entity_helpers import entity_duplicate_validator, setup_entity
|
|
79
80
|
from esphome.cpp_generator import MockObjClass
|
|
80
|
-
from esphome.cpp_helpers import setup_entity
|
|
81
81
|
|
|
82
82
|
CODEOWNERS = ["@esphome/core"]
|
|
83
83
|
DEVICE_CLASSES = [
|
|
@@ -207,6 +207,9 @@ _NUMBER_SCHEMA = (
|
|
|
207
207
|
)
|
|
208
208
|
|
|
209
209
|
|
|
210
|
+
_NUMBER_SCHEMA.add_extra(entity_duplicate_validator("number"))
|
|
211
|
+
|
|
212
|
+
|
|
210
213
|
def number_schema(
|
|
211
214
|
class_: MockObjClass,
|
|
212
215
|
*,
|
|
@@ -237,7 +240,7 @@ NUMBER_SCHEMA.add_extra(cv.deprecated_schema_constant("number"))
|
|
|
237
240
|
async def setup_number_core_(
|
|
238
241
|
var, config, *, min_value: float, max_value: float, step: float
|
|
239
242
|
):
|
|
240
|
-
await setup_entity(var, config)
|
|
243
|
+
await setup_entity(var, config, "number")
|
|
241
244
|
|
|
242
245
|
cg.add(var.traits.set_min_value(min_value))
|
|
243
246
|
cg.add(var.traits.set_max_value(max_value))
|
|
@@ -34,6 +34,7 @@ MULTI_CONF = True
|
|
|
34
34
|
|
|
35
35
|
CONF_ON_DOWNLOAD_FINISHED = "on_download_finished"
|
|
36
36
|
CONF_PLACEHOLDER = "placeholder"
|
|
37
|
+
CONF_UPDATE = "update"
|
|
37
38
|
|
|
38
39
|
_LOGGER = logging.getLogger(__name__)
|
|
39
40
|
|
|
@@ -167,6 +168,7 @@ SET_URL_SCHEMA = cv.Schema(
|
|
|
167
168
|
{
|
|
168
169
|
cv.GenerateID(): cv.use_id(OnlineImage),
|
|
169
170
|
cv.Required(CONF_URL): cv.templatable(cv.url),
|
|
171
|
+
cv.Optional(CONF_UPDATE, default=True): cv.templatable(bool),
|
|
170
172
|
}
|
|
171
173
|
)
|
|
172
174
|
|
|
@@ -188,6 +190,9 @@ async def online_image_action_to_code(config, action_id, template_arg, args):
|
|
|
188
190
|
if CONF_URL in config:
|
|
189
191
|
template_ = await cg.templatable(config[CONF_URL], args, cg.std_string)
|
|
190
192
|
cg.add(var.set_url(template_))
|
|
193
|
+
if CONF_UPDATE in config:
|
|
194
|
+
template_ = await cg.templatable(config[CONF_UPDATE], args, bool)
|
|
195
|
+
cg.add(var.set_update(template_))
|
|
191
196
|
return var
|
|
192
197
|
|
|
193
198
|
|
|
@@ -178,18 +178,21 @@ void OnlineImage::update() {
|
|
|
178
178
|
if (this->format_ == ImageFormat::BMP) {
|
|
179
179
|
ESP_LOGD(TAG, "Allocating BMP decoder");
|
|
180
180
|
this->decoder_ = make_unique<BmpDecoder>(this);
|
|
181
|
+
this->enable_loop();
|
|
181
182
|
}
|
|
182
183
|
#endif // USE_ONLINE_IMAGE_BMP_SUPPORT
|
|
183
184
|
#ifdef USE_ONLINE_IMAGE_JPEG_SUPPORT
|
|
184
185
|
if (this->format_ == ImageFormat::JPEG) {
|
|
185
186
|
ESP_LOGD(TAG, "Allocating JPEG decoder");
|
|
186
187
|
this->decoder_ = esphome::make_unique<JpegDecoder>(this);
|
|
188
|
+
this->enable_loop();
|
|
187
189
|
}
|
|
188
190
|
#endif // USE_ONLINE_IMAGE_JPEG_SUPPORT
|
|
189
191
|
#ifdef USE_ONLINE_IMAGE_PNG_SUPPORT
|
|
190
192
|
if (this->format_ == ImageFormat::PNG) {
|
|
191
193
|
ESP_LOGD(TAG, "Allocating PNG decoder");
|
|
192
194
|
this->decoder_ = make_unique<PngDecoder>(this);
|
|
195
|
+
this->enable_loop();
|
|
193
196
|
}
|
|
194
197
|
#endif // USE_ONLINE_IMAGE_PNG_SUPPORT
|
|
195
198
|
|
|
@@ -212,6 +215,7 @@ void OnlineImage::update() {
|
|
|
212
215
|
void OnlineImage::loop() {
|
|
213
216
|
if (!this->decoder_) {
|
|
214
217
|
// Not decoding at the moment => nothing to do.
|
|
218
|
+
this->disable_loop();
|
|
215
219
|
return;
|
|
216
220
|
}
|
|
217
221
|
if (!this->downloader_ || this->decoder_->is_finished()) {
|
|
@@ -220,7 +224,7 @@ void OnlineImage::loop() {
|
|
|
220
224
|
this->height_ = buffer_height_;
|
|
221
225
|
ESP_LOGD(TAG, "Image fully downloaded, read %zu bytes, width/height = %d/%d", this->downloader_->get_bytes_read(),
|
|
222
226
|
this->width_, this->height_);
|
|
223
|
-
ESP_LOGD(TAG, "Total time: %
|
|
227
|
+
ESP_LOGD(TAG, "Total time: %" PRIu32 "s", (uint32_t) (::time(nullptr) - this->start_time_));
|
|
224
228
|
this->etag_ = this->downloader_->get_response_header(ETAG_HEADER_NAME);
|
|
225
229
|
this->last_modified_ = this->downloader_->get_response_header(LAST_MODIFIED_HEADER_NAME);
|
|
226
230
|
this->download_finished_callback_.call(false);
|
|
@@ -340,7 +344,7 @@ void OnlineImage::end_connection_() {
|
|
|
340
344
|
}
|
|
341
345
|
|
|
342
346
|
bool OnlineImage::validate_url_(const std::string &url) {
|
|
343
|
-
if ((url.length() < 8) ||
|
|
347
|
+
if ((url.length() < 8) || !url.starts_with("http") || (url.find("://") == std::string::npos)) {
|
|
344
348
|
ESP_LOGE(TAG, "URL is invalid and/or must be prefixed with 'http://' or 'https://'");
|
|
345
349
|
return false;
|
|
346
350
|
}
|
|
@@ -201,9 +201,12 @@ template<typename... Ts> class OnlineImageSetUrlAction : public Action<Ts...> {
|
|
|
201
201
|
public:
|
|
202
202
|
OnlineImageSetUrlAction(OnlineImage *parent) : parent_(parent) {}
|
|
203
203
|
TEMPLATABLE_VALUE(std::string, url)
|
|
204
|
+
TEMPLATABLE_VALUE(bool, update)
|
|
204
205
|
void play(Ts... x) override {
|
|
205
206
|
this->parent_->set_url(this->url_.value(x...));
|
|
206
|
-
this->
|
|
207
|
+
if (this->update_.value(x...)) {
|
|
208
|
+
this->parent_->update();
|
|
209
|
+
}
|
|
207
210
|
}
|
|
208
211
|
|
|
209
212
|
protected:
|
|
@@ -272,18 +272,13 @@ bool OpenTherm::init_esp32_timer_() {
|
|
|
272
272
|
this->timer_idx_ = timer_idx;
|
|
273
273
|
|
|
274
274
|
timer_config_t const config = {
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
#endif
|
|
283
|
-
.divider = 80,
|
|
284
|
-
#if defined(SOC_TIMER_GROUP_SUPPORT_XTAL) && ESP_IDF_VERSION_MAJOR < 5
|
|
285
|
-
.clk_src = TIMER_SRC_CLK_APB
|
|
286
|
-
#endif
|
|
275
|
+
.alarm_en = TIMER_ALARM_EN,
|
|
276
|
+
.counter_en = TIMER_PAUSE,
|
|
277
|
+
.intr_type = TIMER_INTR_LEVEL,
|
|
278
|
+
.counter_dir = TIMER_COUNT_UP,
|
|
279
|
+
.auto_reload = TIMER_AUTORELOAD_EN,
|
|
280
|
+
.clk_src = TIMER_SRC_CLK_DEFAULT,
|
|
281
|
+
.divider = 80,
|
|
287
282
|
};
|
|
288
283
|
|
|
289
284
|
esp_err_t result;
|
|
@@ -11,6 +11,7 @@ from esphome.const import CONF_CHANNEL, CONF_ENABLE_IPV6, CONF_ID
|
|
|
11
11
|
import esphome.final_validate as fv
|
|
12
12
|
|
|
13
13
|
from .const import (
|
|
14
|
+
CONF_DEVICE_TYPE,
|
|
14
15
|
CONF_EXT_PAN_ID,
|
|
15
16
|
CONF_FORCE_DATASET,
|
|
16
17
|
CONF_MDNS_ID,
|
|
@@ -22,7 +23,6 @@ from .const import (
|
|
|
22
23
|
CONF_SRP_ID,
|
|
23
24
|
CONF_TLV,
|
|
24
25
|
)
|
|
25
|
-
from .tlv import parse_tlv
|
|
26
26
|
|
|
27
27
|
CODEOWNERS = ["@mrene"]
|
|
28
28
|
|
|
@@ -33,6 +33,11 @@ AUTO_LOAD = ["network"]
|
|
|
33
33
|
CONFLICTS_WITH = ["wifi"]
|
|
34
34
|
DEPENDENCIES = ["esp32"]
|
|
35
35
|
|
|
36
|
+
CONF_DEVICE_TYPES = [
|
|
37
|
+
"FTD",
|
|
38
|
+
"MTD",
|
|
39
|
+
]
|
|
40
|
+
|
|
36
41
|
|
|
37
42
|
def set_sdkconfig_options(config):
|
|
38
43
|
# and expose options for using SPI/UART RCPs
|
|
@@ -43,58 +48,58 @@ def set_sdkconfig_options(config):
|
|
|
43
48
|
add_idf_sdkconfig_option("CONFIG_OPENTHREAD_CLI", False)
|
|
44
49
|
|
|
45
50
|
add_idf_sdkconfig_option("CONFIG_OPENTHREAD_ENABLED", True)
|
|
46
|
-
add_idf_sdkconfig_option("CONFIG_OPENTHREAD_NETWORK_PANID", config[CONF_PAN_ID])
|
|
47
|
-
add_idf_sdkconfig_option("CONFIG_OPENTHREAD_NETWORK_CHANNEL", config[CONF_CHANNEL])
|
|
48
|
-
add_idf_sdkconfig_option(
|
|
49
|
-
"CONFIG_OPENTHREAD_NETWORK_MASTERKEY", f"{config[CONF_NETWORK_KEY]:X}".lower()
|
|
50
|
-
)
|
|
51
|
-
|
|
52
|
-
if network_name := config.get(CONF_NETWORK_NAME):
|
|
53
|
-
add_idf_sdkconfig_option("CONFIG_OPENTHREAD_NETWORK_NAME", network_name)
|
|
54
|
-
|
|
55
|
-
if (ext_pan_id := config.get(CONF_EXT_PAN_ID)) is not None:
|
|
56
|
-
add_idf_sdkconfig_option(
|
|
57
|
-
"CONFIG_OPENTHREAD_NETWORK_EXTPANID", f"{ext_pan_id:X}".lower()
|
|
58
|
-
)
|
|
59
|
-
if (mesh_local_prefix := config.get(CONF_MESH_LOCAL_PREFIX)) is not None:
|
|
60
|
-
add_idf_sdkconfig_option(
|
|
61
|
-
"CONFIG_OPENTHREAD_MESH_LOCAL_PREFIX", f"{mesh_local_prefix}".lower()
|
|
62
|
-
)
|
|
63
|
-
if (pskc := config.get(CONF_PSKC)) is not None:
|
|
64
|
-
add_idf_sdkconfig_option("CONFIG_OPENTHREAD_NETWORK_PSKC", f"{pskc:X}".lower())
|
|
65
51
|
|
|
66
|
-
if
|
|
67
|
-
|
|
68
|
-
|
|
52
|
+
if tlv := config.get(CONF_TLV):
|
|
53
|
+
cg.add_define("USE_OPENTHREAD_TLVS", tlv)
|
|
54
|
+
else:
|
|
55
|
+
if pan_id := config.get(CONF_PAN_ID):
|
|
56
|
+
add_idf_sdkconfig_option("CONFIG_OPENTHREAD_NETWORK_PANID", pan_id)
|
|
57
|
+
|
|
58
|
+
if channel := config.get(CONF_CHANNEL):
|
|
59
|
+
add_idf_sdkconfig_option("CONFIG_OPENTHREAD_NETWORK_CHANNEL", channel)
|
|
60
|
+
|
|
61
|
+
if network_key := config.get(CONF_NETWORK_KEY):
|
|
62
|
+
add_idf_sdkconfig_option(
|
|
63
|
+
"CONFIG_OPENTHREAD_NETWORK_MASTERKEY", f"{network_key:X}".lower()
|
|
64
|
+
)
|
|
65
|
+
|
|
66
|
+
if network_name := config.get(CONF_NETWORK_NAME):
|
|
67
|
+
add_idf_sdkconfig_option("CONFIG_OPENTHREAD_NETWORK_NAME", network_name)
|
|
68
|
+
|
|
69
|
+
if (ext_pan_id := config.get(CONF_EXT_PAN_ID)) is not None:
|
|
70
|
+
add_idf_sdkconfig_option(
|
|
71
|
+
"CONFIG_OPENTHREAD_NETWORK_EXTPANID", f"{ext_pan_id:X}".lower()
|
|
72
|
+
)
|
|
73
|
+
if (mesh_local_prefix := config.get(CONF_MESH_LOCAL_PREFIX)) is not None:
|
|
74
|
+
add_idf_sdkconfig_option(
|
|
75
|
+
"CONFIG_OPENTHREAD_MESH_LOCAL_PREFIX", f"{mesh_local_prefix}".lower()
|
|
76
|
+
)
|
|
77
|
+
if (pskc := config.get(CONF_PSKC)) is not None:
|
|
78
|
+
add_idf_sdkconfig_option(
|
|
79
|
+
"CONFIG_OPENTHREAD_NETWORK_PSKC", f"{pskc:X}".lower()
|
|
80
|
+
)
|
|
81
|
+
|
|
82
|
+
if force_dataset := config.get(CONF_FORCE_DATASET):
|
|
83
|
+
if force_dataset:
|
|
84
|
+
cg.add_define("USE_OPENTHREAD_FORCE_DATASET")
|
|
69
85
|
|
|
70
86
|
add_idf_sdkconfig_option("CONFIG_OPENTHREAD_DNS64_CLIENT", True)
|
|
71
87
|
add_idf_sdkconfig_option("CONFIG_OPENTHREAD_SRP_CLIENT", True)
|
|
72
88
|
add_idf_sdkconfig_option("CONFIG_OPENTHREAD_SRP_CLIENT_MAX_SERVICES", 5)
|
|
73
89
|
|
|
74
90
|
# TODO: Add suport for sleepy end devices
|
|
75
|
-
add_idf_sdkconfig_option("
|
|
91
|
+
add_idf_sdkconfig_option(f"CONFIG_OPENTHREAD_{config.get(CONF_DEVICE_TYPE)}", True)
|
|
76
92
|
|
|
77
93
|
|
|
78
94
|
openthread_ns = cg.esphome_ns.namespace("openthread")
|
|
79
95
|
OpenThreadComponent = openthread_ns.class_("OpenThreadComponent", cg.Component)
|
|
80
96
|
OpenThreadSrpComponent = openthread_ns.class_("OpenThreadSrpComponent", cg.Component)
|
|
81
97
|
|
|
82
|
-
|
|
83
|
-
def _convert_tlv(config):
|
|
84
|
-
if tlv := config.get(CONF_TLV):
|
|
85
|
-
config = config.copy()
|
|
86
|
-
parsed_tlv = parse_tlv(tlv)
|
|
87
|
-
validated = _CONNECTION_SCHEMA(parsed_tlv)
|
|
88
|
-
config.update(validated)
|
|
89
|
-
del config[CONF_TLV]
|
|
90
|
-
return config
|
|
91
|
-
|
|
92
|
-
|
|
93
98
|
_CONNECTION_SCHEMA = cv.Schema(
|
|
94
99
|
{
|
|
95
|
-
cv.
|
|
96
|
-
cv.
|
|
97
|
-
cv.
|
|
100
|
+
cv.Optional(CONF_PAN_ID): cv.hex_int,
|
|
101
|
+
cv.Optional(CONF_CHANNEL): cv.int_,
|
|
102
|
+
cv.Optional(CONF_NETWORK_KEY): cv.hex_int,
|
|
98
103
|
cv.Optional(CONF_EXT_PAN_ID): cv.hex_int,
|
|
99
104
|
cv.Optional(CONF_NETWORK_NAME): cv.string_strict,
|
|
100
105
|
cv.Optional(CONF_PSKC): cv.hex_int,
|
|
@@ -108,12 +113,14 @@ CONFIG_SCHEMA = cv.All(
|
|
|
108
113
|
cv.GenerateID(): cv.declare_id(OpenThreadComponent),
|
|
109
114
|
cv.GenerateID(CONF_SRP_ID): cv.declare_id(OpenThreadSrpComponent),
|
|
110
115
|
cv.GenerateID(CONF_MDNS_ID): cv.use_id(MDNSComponent),
|
|
116
|
+
cv.Optional(CONF_DEVICE_TYPE, default="FTD"): cv.one_of(
|
|
117
|
+
*CONF_DEVICE_TYPES, upper=True
|
|
118
|
+
),
|
|
111
119
|
cv.Optional(CONF_FORCE_DATASET): cv.boolean,
|
|
112
120
|
cv.Optional(CONF_TLV): cv.string_strict,
|
|
113
121
|
}
|
|
114
122
|
).extend(_CONNECTION_SCHEMA),
|
|
115
|
-
cv.has_exactly_one_key(
|
|
116
|
-
_convert_tlv,
|
|
123
|
+
cv.has_exactly_one_key(CONF_NETWORK_KEY, CONF_TLV),
|
|
117
124
|
cv.only_with_esp_idf,
|
|
118
125
|
only_on_variant(supported=[VARIANT_ESP32C6, VARIANT_ESP32H2]),
|
|
119
126
|
)
|
|
@@ -111,14 +111,36 @@ void OpenThreadComponent::ot_main() {
|
|
|
111
111
|
esp_openthread_cli_create_task();
|
|
112
112
|
#endif
|
|
113
113
|
ESP_LOGI(TAG, "Activating dataset...");
|
|
114
|
-
otOperationalDatasetTlvs dataset;
|
|
114
|
+
otOperationalDatasetTlvs dataset = {};
|
|
115
115
|
|
|
116
|
-
#
|
|
117
|
-
|
|
118
|
-
#else
|
|
116
|
+
#ifndef USE_OPENTHREAD_FORCE_DATASET
|
|
117
|
+
// Check if openthread has a valid dataset from a previous execution
|
|
119
118
|
otError error = otDatasetGetActiveTlvs(esp_openthread_get_instance(), &dataset);
|
|
120
|
-
|
|
119
|
+
if (error != OT_ERROR_NONE) {
|
|
120
|
+
// Make sure the length is 0 so we fallback to the configuration
|
|
121
|
+
dataset.mLength = 0;
|
|
122
|
+
} else {
|
|
123
|
+
ESP_LOGI(TAG, "Found OpenThread-managed dataset, ignoring esphome configuration");
|
|
124
|
+
ESP_LOGI(TAG, "(set force_dataset: true to override)");
|
|
125
|
+
}
|
|
126
|
+
#endif
|
|
127
|
+
|
|
128
|
+
#ifdef USE_OPENTHREAD_TLVS
|
|
129
|
+
if (dataset.mLength == 0) {
|
|
130
|
+
// If we didn't have an active dataset, and we have tlvs, parse it and pass it to esp_openthread_auto_start
|
|
131
|
+
size_t len = (sizeof(USE_OPENTHREAD_TLVS) - 1) / 2;
|
|
132
|
+
if (len > sizeof(dataset.mTlvs)) {
|
|
133
|
+
ESP_LOGW(TAG, "TLV buffer too small, truncating");
|
|
134
|
+
len = sizeof(dataset.mTlvs);
|
|
135
|
+
}
|
|
136
|
+
parse_hex(USE_OPENTHREAD_TLVS, sizeof(USE_OPENTHREAD_TLVS) - 1, dataset.mTlvs, len);
|
|
137
|
+
dataset.mLength = len;
|
|
138
|
+
}
|
|
121
139
|
#endif
|
|
140
|
+
|
|
141
|
+
// Pass the existing dataset, or NULL which will use the preprocessor definitions
|
|
142
|
+
ESP_ERROR_CHECK(esp_openthread_auto_start(dataset.mLength > 0 ? &dataset : nullptr));
|
|
143
|
+
|
|
122
144
|
esp_openthread_launch_mainloop();
|
|
123
145
|
|
|
124
146
|
// Clean up
|
|
File without changes
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
#include "opt3001.h"
|
|
2
|
+
#include "esphome/core/log.h"
|
|
3
|
+
|
|
4
|
+
namespace esphome {
|
|
5
|
+
namespace opt3001 {
|
|
6
|
+
|
|
7
|
+
static const char *const TAG = "opt3001.sensor";
|
|
8
|
+
|
|
9
|
+
static const uint8_t OPT3001_REG_RESULT = 0x00;
|
|
10
|
+
static const uint8_t OPT3001_REG_CONFIGURATION = 0x01;
|
|
11
|
+
// See datasheet for full description of each bit.
|
|
12
|
+
static const uint16_t OPT3001_CONFIGURATION_RANGE_FULL = 0b1100000000000000;
|
|
13
|
+
static const uint16_t OPT3001_CONFIGURATION_CONVERSION_TIME_800 = 0b100000000000;
|
|
14
|
+
static const uint16_t OPT3001_CONFIGURATION_CONVERSION_MODE_MASK = 0b11000000000;
|
|
15
|
+
static const uint16_t OPT3001_CONFIGURATION_CONVERSION_MODE_SINGLE_SHOT = 0b01000000000;
|
|
16
|
+
static const uint16_t OPT3001_CONFIGURATION_CONVERSION_MODE_SHUTDOWN = 0b00000000000;
|
|
17
|
+
// tl;dr: Configure an automatic-ranged, 800ms single shot reading,
|
|
18
|
+
// with INT processing disabled
|
|
19
|
+
static const uint16_t OPT3001_CONFIGURATION_FULL_RANGE_ONE_SHOT = OPT3001_CONFIGURATION_RANGE_FULL |
|
|
20
|
+
OPT3001_CONFIGURATION_CONVERSION_TIME_800 |
|
|
21
|
+
OPT3001_CONFIGURATION_CONVERSION_MODE_SINGLE_SHOT;
|
|
22
|
+
static const uint16_t OPT3001_CONVERSION_TIME_800 = 825; // give it 25 extra ms; it seems to not be ready quite often
|
|
23
|
+
|
|
24
|
+
/*
|
|
25
|
+
opt3001 properties:
|
|
26
|
+
|
|
27
|
+
- e (exponent) = high 4 bits of result register
|
|
28
|
+
- m (mantissa) = low 12 bits of result register
|
|
29
|
+
- formula: (0.01 * 2^e) * m lx
|
|
30
|
+
|
|
31
|
+
*/
|
|
32
|
+
|
|
33
|
+
void OPT3001Sensor::read_result_(const std::function<void(float)> &f) {
|
|
34
|
+
// ensure the single shot flag is clear, indicating it's done
|
|
35
|
+
uint16_t raw_value;
|
|
36
|
+
if (this->read(reinterpret_cast<uint8_t *>(&raw_value), 2) != i2c::ERROR_OK) {
|
|
37
|
+
ESP_LOGW(TAG, "Reading configuration register failed");
|
|
38
|
+
f(NAN);
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
raw_value = i2c::i2ctohs(raw_value);
|
|
42
|
+
|
|
43
|
+
if ((raw_value & OPT3001_CONFIGURATION_CONVERSION_MODE_MASK) != OPT3001_CONFIGURATION_CONVERSION_MODE_SHUTDOWN) {
|
|
44
|
+
// not ready; wait 10ms and try again
|
|
45
|
+
ESP_LOGW(TAG, "Data not ready; waiting 10ms");
|
|
46
|
+
this->set_timeout("opt3001_wait", 10, [this, f]() { read_result_(f); });
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
if (this->read_register(OPT3001_REG_RESULT, reinterpret_cast<uint8_t *>(&raw_value), 2) != i2c::ERROR_OK) {
|
|
51
|
+
ESP_LOGW(TAG, "Reading result register failed");
|
|
52
|
+
f(NAN);
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
raw_value = i2c::i2ctohs(raw_value);
|
|
56
|
+
|
|
57
|
+
uint8_t exponent = raw_value >> 12;
|
|
58
|
+
uint16_t mantissa = raw_value & 0b111111111111;
|
|
59
|
+
|
|
60
|
+
double lx = 0.01 * pow(2.0, double(exponent)) * double(mantissa);
|
|
61
|
+
f(float(lx));
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
void OPT3001Sensor::read_lx_(const std::function<void(float)> &f) {
|
|
65
|
+
// turn on (after one-shot sensor automatically powers down)
|
|
66
|
+
uint16_t start_measurement = i2c::htoi2cs(OPT3001_CONFIGURATION_FULL_RANGE_ONE_SHOT);
|
|
67
|
+
if (this->write_register(OPT3001_REG_CONFIGURATION, reinterpret_cast<uint8_t *>(&start_measurement), 2) !=
|
|
68
|
+
i2c::ERROR_OK) {
|
|
69
|
+
ESP_LOGW(TAG, "Triggering one shot measurement failed");
|
|
70
|
+
f(NAN);
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
this->set_timeout("read", OPT3001_CONVERSION_TIME_800, [this, f]() {
|
|
75
|
+
if (this->write(&OPT3001_REG_CONFIGURATION, 1, true) != i2c::ERROR_OK) {
|
|
76
|
+
ESP_LOGW(TAG, "Starting configuration register read failed");
|
|
77
|
+
f(NAN);
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
this->read_result_(f);
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
void OPT3001Sensor::dump_config() {
|
|
86
|
+
LOG_SENSOR("", "OPT3001", this);
|
|
87
|
+
LOG_I2C_DEVICE(this);
|
|
88
|
+
if (this->is_failed()) {
|
|
89
|
+
ESP_LOGE(TAG, ESP_LOG_MSG_COMM_FAIL);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
LOG_UPDATE_INTERVAL(this);
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
void OPT3001Sensor::update() {
|
|
96
|
+
// Set a flag and skip just in case the sensor isn't responding,
|
|
97
|
+
// and we just keep waiting for it in read_result_.
|
|
98
|
+
// This way we don't end up with potentially boundless "threads"
|
|
99
|
+
// using up memory and eventually crashing the device
|
|
100
|
+
if (this->updating_) {
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
this->updating_ = true;
|
|
104
|
+
|
|
105
|
+
this->read_lx_([this](float val) {
|
|
106
|
+
this->updating_ = false;
|
|
107
|
+
|
|
108
|
+
if (std::isnan(val)) {
|
|
109
|
+
this->status_set_warning();
|
|
110
|
+
this->publish_state(NAN);
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
ESP_LOGD(TAG, "'%s': Illuminance=%.1flx", this->get_name().c_str(), val);
|
|
114
|
+
this->status_clear_warning();
|
|
115
|
+
this->publish_state(val);
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
float OPT3001Sensor::get_setup_priority() const { return setup_priority::DATA; }
|
|
120
|
+
|
|
121
|
+
} // namespace opt3001
|
|
122
|
+
} // namespace esphome
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
#pragma once
|
|
2
|
+
|
|
3
|
+
#include "esphome/core/component.h"
|
|
4
|
+
#include "esphome/components/sensor/sensor.h"
|
|
5
|
+
#include "esphome/components/i2c/i2c.h"
|
|
6
|
+
|
|
7
|
+
namespace esphome {
|
|
8
|
+
namespace opt3001 {
|
|
9
|
+
|
|
10
|
+
/// This class implements support for the i2c-based OPT3001 ambient light sensor.
|
|
11
|
+
class OPT3001Sensor : public sensor::Sensor, public PollingComponent, public i2c::I2CDevice {
|
|
12
|
+
public:
|
|
13
|
+
void dump_config() override;
|
|
14
|
+
void update() override;
|
|
15
|
+
float get_setup_priority() const override;
|
|
16
|
+
|
|
17
|
+
protected:
|
|
18
|
+
// checks if one-shot is complete before reading the result and returning it
|
|
19
|
+
void read_result_(const std::function<void(float)> &f);
|
|
20
|
+
// begins a one-shot measurement
|
|
21
|
+
void read_lx_(const std::function<void(float)> &f);
|
|
22
|
+
|
|
23
|
+
bool updating_{false};
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
} // namespace opt3001
|
|
27
|
+
} // namespace esphome
|