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
|
@@ -0,0 +1,523 @@
|
|
|
1
|
+
#include "sx126x.h"
|
|
2
|
+
#include "esphome/core/hal.h"
|
|
3
|
+
#include "esphome/core/log.h"
|
|
4
|
+
|
|
5
|
+
namespace esphome {
|
|
6
|
+
namespace sx126x {
|
|
7
|
+
|
|
8
|
+
static const char *const TAG = "sx126x";
|
|
9
|
+
static const uint16_t RAMP[8] = {10, 20, 40, 80, 200, 800, 1700, 3400};
|
|
10
|
+
static const uint32_t BW_HZ[31] = {4800, 5800, 7300, 9700, 11700, 14600, 19500, 23400, 29300, 39000, 46900,
|
|
11
|
+
58600, 78200, 93800, 117300, 156200, 187200, 234300, 312000, 373600, 467000, 7810,
|
|
12
|
+
10420, 15630, 20830, 31250, 41670, 62500, 125000, 250000, 500000};
|
|
13
|
+
static const uint8_t BW_LORA[10] = {LORA_BW_7810, LORA_BW_10420, LORA_BW_15630, LORA_BW_20830, LORA_BW_31250,
|
|
14
|
+
LORA_BW_41670, LORA_BW_62500, LORA_BW_125000, LORA_BW_250000, LORA_BW_500000};
|
|
15
|
+
static const uint8_t BW_FSK[21] = {
|
|
16
|
+
FSK_BW_4800, FSK_BW_5800, FSK_BW_7300, FSK_BW_9700, FSK_BW_11700, FSK_BW_14600, FSK_BW_19500,
|
|
17
|
+
FSK_BW_23400, FSK_BW_29300, FSK_BW_39000, FSK_BW_46900, FSK_BW_58600, FSK_BW_78200, FSK_BW_93800,
|
|
18
|
+
FSK_BW_117300, FSK_BW_156200, FSK_BW_187200, FSK_BW_234300, FSK_BW_312000, FSK_BW_373600, FSK_BW_467000};
|
|
19
|
+
|
|
20
|
+
static constexpr uint32_t RESET_DELAY_HIGH_US = 5000;
|
|
21
|
+
static constexpr uint32_t RESET_DELAY_LOW_US = 2000;
|
|
22
|
+
static constexpr uint32_t SWITCHING_DELAY_US = 1;
|
|
23
|
+
static constexpr uint32_t TRANSMIT_TIMEOUT_MS = 4000;
|
|
24
|
+
static constexpr uint32_t BUSY_TIMEOUT_MS = 20;
|
|
25
|
+
|
|
26
|
+
// OCP (Over Current Protection) values
|
|
27
|
+
static constexpr uint8_t OCP_80MA = 0x18; // 80 mA max current
|
|
28
|
+
static constexpr uint8_t OCP_140MA = 0x38; // 140 mA max current
|
|
29
|
+
|
|
30
|
+
// LoRa low data rate optimization threshold
|
|
31
|
+
static constexpr float LOW_DATA_RATE_OPTIMIZE_THRESHOLD = 16.38f; // 16.38 ms
|
|
32
|
+
|
|
33
|
+
uint8_t SX126x::read_fifo_(uint8_t offset, std::vector<uint8_t> &packet) {
|
|
34
|
+
this->wait_busy_();
|
|
35
|
+
this->enable();
|
|
36
|
+
this->transfer_byte(RADIO_READ_BUFFER);
|
|
37
|
+
this->transfer_byte(offset);
|
|
38
|
+
uint8_t status = this->transfer_byte(0x00);
|
|
39
|
+
for (uint8_t &byte : packet) {
|
|
40
|
+
byte = this->transfer_byte(0x00);
|
|
41
|
+
}
|
|
42
|
+
this->disable();
|
|
43
|
+
return status;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
void SX126x::write_fifo_(uint8_t offset, const std::vector<uint8_t> &packet) {
|
|
47
|
+
this->wait_busy_();
|
|
48
|
+
this->enable();
|
|
49
|
+
this->transfer_byte(RADIO_WRITE_BUFFER);
|
|
50
|
+
this->transfer_byte(offset);
|
|
51
|
+
for (const uint8_t &byte : packet) {
|
|
52
|
+
this->transfer_byte(byte);
|
|
53
|
+
}
|
|
54
|
+
this->disable();
|
|
55
|
+
delayMicroseconds(SWITCHING_DELAY_US);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
uint8_t SX126x::read_opcode_(uint8_t opcode, uint8_t *data, uint8_t size) {
|
|
59
|
+
this->wait_busy_();
|
|
60
|
+
this->enable();
|
|
61
|
+
this->transfer_byte(opcode);
|
|
62
|
+
uint8_t status = this->transfer_byte(0x00);
|
|
63
|
+
for (int32_t i = 0; i < size; i++) {
|
|
64
|
+
data[i] = this->transfer_byte(0x00);
|
|
65
|
+
}
|
|
66
|
+
this->disable();
|
|
67
|
+
return status;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
void SX126x::write_opcode_(uint8_t opcode, uint8_t *data, uint8_t size) {
|
|
71
|
+
this->wait_busy_();
|
|
72
|
+
this->enable();
|
|
73
|
+
this->transfer_byte(opcode);
|
|
74
|
+
for (int32_t i = 0; i < size; i++) {
|
|
75
|
+
this->transfer_byte(data[i]);
|
|
76
|
+
}
|
|
77
|
+
this->disable();
|
|
78
|
+
delayMicroseconds(SWITCHING_DELAY_US);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
void SX126x::read_register_(uint16_t reg, uint8_t *data, uint8_t size) {
|
|
82
|
+
this->wait_busy_();
|
|
83
|
+
this->enable();
|
|
84
|
+
this->write_byte(RADIO_READ_REGISTER);
|
|
85
|
+
this->write_byte((reg >> 8) & 0xFF);
|
|
86
|
+
this->write_byte((reg >> 0) & 0xFF);
|
|
87
|
+
this->write_byte(0x00);
|
|
88
|
+
for (int32_t i = 0; i < size; i++) {
|
|
89
|
+
data[i] = this->transfer_byte(0x00);
|
|
90
|
+
}
|
|
91
|
+
this->disable();
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
void SX126x::write_register_(uint16_t reg, uint8_t *data, uint8_t size) {
|
|
95
|
+
this->wait_busy_();
|
|
96
|
+
this->enable();
|
|
97
|
+
this->write_byte(RADIO_WRITE_REGISTER);
|
|
98
|
+
this->write_byte((reg >> 8) & 0xFF);
|
|
99
|
+
this->write_byte((reg >> 0) & 0xFF);
|
|
100
|
+
for (int32_t i = 0; i < size; i++) {
|
|
101
|
+
this->transfer_byte(data[i]);
|
|
102
|
+
}
|
|
103
|
+
this->disable();
|
|
104
|
+
delayMicroseconds(SWITCHING_DELAY_US);
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
void SX126x::setup() {
|
|
108
|
+
ESP_LOGCONFIG(TAG, "Running setup");
|
|
109
|
+
|
|
110
|
+
// setup pins
|
|
111
|
+
this->busy_pin_->setup();
|
|
112
|
+
this->rst_pin_->setup();
|
|
113
|
+
this->dio1_pin_->setup();
|
|
114
|
+
|
|
115
|
+
// start spi
|
|
116
|
+
this->spi_setup();
|
|
117
|
+
|
|
118
|
+
// configure rf
|
|
119
|
+
this->configure();
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
void SX126x::configure() {
|
|
123
|
+
uint8_t buf[8];
|
|
124
|
+
|
|
125
|
+
// toggle chip reset
|
|
126
|
+
this->rst_pin_->digital_write(true);
|
|
127
|
+
delayMicroseconds(RESET_DELAY_HIGH_US);
|
|
128
|
+
this->rst_pin_->digital_write(false);
|
|
129
|
+
delayMicroseconds(RESET_DELAY_LOW_US);
|
|
130
|
+
this->rst_pin_->digital_write(true);
|
|
131
|
+
delayMicroseconds(RESET_DELAY_HIGH_US);
|
|
132
|
+
|
|
133
|
+
// wakeup
|
|
134
|
+
this->read_opcode_(RADIO_GET_STATUS, nullptr, 0);
|
|
135
|
+
|
|
136
|
+
// config tcxo
|
|
137
|
+
if (this->tcxo_voltage_ != TCXO_CTRL_NONE) {
|
|
138
|
+
uint32_t delay = this->tcxo_delay_ >> 6;
|
|
139
|
+
buf[0] = this->tcxo_voltage_;
|
|
140
|
+
buf[1] = (delay >> 16) & 0xFF;
|
|
141
|
+
buf[2] = (delay >> 8) & 0xFF;
|
|
142
|
+
buf[3] = (delay >> 0) & 0xFF;
|
|
143
|
+
this->write_opcode_(RADIO_SET_TCXOMODE, buf, 4);
|
|
144
|
+
buf[0] = 0x7F;
|
|
145
|
+
this->write_opcode_(RADIO_CALIBRATE, buf, 1);
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
// clear errors
|
|
149
|
+
buf[0] = 0x00;
|
|
150
|
+
buf[1] = 0x00;
|
|
151
|
+
this->write_opcode_(RADIO_CLR_ERROR, buf, 2);
|
|
152
|
+
|
|
153
|
+
// rf switch
|
|
154
|
+
if (this->rf_switch_) {
|
|
155
|
+
buf[0] = 0x01;
|
|
156
|
+
this->write_opcode_(RADIO_SET_RFSWITCHMODE, buf, 1);
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
// check silicon version to make sure hw is ok
|
|
160
|
+
this->read_register_(REG_VERSION_STRING, (uint8_t *) this->version_, 16);
|
|
161
|
+
if (strncmp(this->version_, "SX126", 5) != 0 && strncmp(this->version_, "LLCC68", 6) != 0) {
|
|
162
|
+
this->mark_failed();
|
|
163
|
+
return;
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
// setup packet type
|
|
167
|
+
buf[0] = this->modulation_;
|
|
168
|
+
this->write_opcode_(RADIO_SET_PACKETTYPE, buf, 1);
|
|
169
|
+
|
|
170
|
+
// calibrate image
|
|
171
|
+
this->run_image_cal();
|
|
172
|
+
|
|
173
|
+
// set frequency
|
|
174
|
+
uint64_t freq = ((uint64_t) this->frequency_ << 25) / XTAL_FREQ;
|
|
175
|
+
buf[0] = (uint8_t) ((freq >> 24) & 0xFF);
|
|
176
|
+
buf[1] = (uint8_t) ((freq >> 16) & 0xFF);
|
|
177
|
+
buf[2] = (uint8_t) ((freq >> 8) & 0xFF);
|
|
178
|
+
buf[3] = (uint8_t) (freq & 0xFF);
|
|
179
|
+
this->write_opcode_(RADIO_SET_RFFREQUENCY, buf, 4);
|
|
180
|
+
|
|
181
|
+
// configure pa
|
|
182
|
+
int8_t pa_power = this->pa_power_;
|
|
183
|
+
if (this->hw_version_ == "sx1261") {
|
|
184
|
+
// the following values were taken from section 13.1.14.1 table 13-21
|
|
185
|
+
// in rev 2.1 of the datasheet
|
|
186
|
+
if (pa_power == 15) {
|
|
187
|
+
uint8_t cfg[4] = {0x06, 0x00, 0x01, 0x01};
|
|
188
|
+
this->write_opcode_(RADIO_SET_PACONFIG, cfg, 4);
|
|
189
|
+
} else {
|
|
190
|
+
uint8_t cfg[4] = {0x04, 0x00, 0x01, 0x01};
|
|
191
|
+
this->write_opcode_(RADIO_SET_PACONFIG, cfg, 4);
|
|
192
|
+
}
|
|
193
|
+
pa_power = std::max(pa_power, (int8_t) -3);
|
|
194
|
+
pa_power = std::min(pa_power, (int8_t) 14);
|
|
195
|
+
buf[0] = OCP_80MA;
|
|
196
|
+
this->write_register_(REG_OCP, buf, 1);
|
|
197
|
+
} else {
|
|
198
|
+
// the following values were taken from section 13.1.14.1 table 13-21
|
|
199
|
+
// in rev 2.1 of the datasheet
|
|
200
|
+
uint8_t cfg[4] = {0x04, 0x07, 0x00, 0x01};
|
|
201
|
+
this->write_opcode_(RADIO_SET_PACONFIG, cfg, 4);
|
|
202
|
+
pa_power = std::max(pa_power, (int8_t) -3);
|
|
203
|
+
pa_power = std::min(pa_power, (int8_t) 22);
|
|
204
|
+
buf[0] = OCP_140MA;
|
|
205
|
+
this->write_register_(REG_OCP, buf, 1);
|
|
206
|
+
}
|
|
207
|
+
buf[0] = pa_power;
|
|
208
|
+
buf[1] = this->pa_ramp_;
|
|
209
|
+
this->write_opcode_(RADIO_SET_TXPARAMS, buf, 2);
|
|
210
|
+
|
|
211
|
+
// configure modem
|
|
212
|
+
if (this->modulation_ == PACKET_TYPE_LORA) {
|
|
213
|
+
// set modulation params
|
|
214
|
+
float duration = 1000.0f * std::pow(2, this->spreading_factor_) / BW_HZ[this->bandwidth_];
|
|
215
|
+
buf[0] = this->spreading_factor_;
|
|
216
|
+
buf[1] = BW_LORA[this->bandwidth_ - SX126X_BW_7810];
|
|
217
|
+
buf[2] = this->coding_rate_;
|
|
218
|
+
buf[3] = (duration > LOW_DATA_RATE_OPTIMIZE_THRESHOLD) ? 0x01 : 0x00;
|
|
219
|
+
this->write_opcode_(RADIO_SET_MODULATIONPARAMS, buf, 4);
|
|
220
|
+
|
|
221
|
+
// set packet params and sync word
|
|
222
|
+
this->set_packet_params_(this->payload_length_);
|
|
223
|
+
if (this->sync_value_.size() == 2) {
|
|
224
|
+
this->write_register_(REG_LORA_SYNCWORD, this->sync_value_.data(), this->sync_value_.size());
|
|
225
|
+
}
|
|
226
|
+
} else {
|
|
227
|
+
// set modulation params
|
|
228
|
+
uint32_t bitrate = ((uint64_t) XTAL_FREQ * 32) / this->bitrate_;
|
|
229
|
+
uint32_t fdev = ((uint64_t) this->deviation_ << 25) / XTAL_FREQ;
|
|
230
|
+
buf[0] = (bitrate >> 16) & 0xFF;
|
|
231
|
+
buf[1] = (bitrate >> 8) & 0xFF;
|
|
232
|
+
buf[2] = (bitrate >> 0) & 0xFF;
|
|
233
|
+
buf[3] = this->shaping_;
|
|
234
|
+
buf[4] = BW_FSK[this->bandwidth_ - SX126X_BW_4800];
|
|
235
|
+
buf[5] = (fdev >> 16) & 0xFF;
|
|
236
|
+
buf[6] = (fdev >> 8) & 0xFF;
|
|
237
|
+
buf[7] = (fdev >> 0) & 0xFF;
|
|
238
|
+
this->write_opcode_(RADIO_SET_MODULATIONPARAMS, buf, 8);
|
|
239
|
+
|
|
240
|
+
// set packet params and sync word
|
|
241
|
+
this->set_packet_params_(this->payload_length_);
|
|
242
|
+
if (!this->sync_value_.empty()) {
|
|
243
|
+
this->write_register_(REG_GFSK_SYNCWORD, this->sync_value_.data(), this->sync_value_.size());
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
// switch to rx or sleep
|
|
248
|
+
if (this->rx_start_) {
|
|
249
|
+
this->set_mode_rx();
|
|
250
|
+
} else {
|
|
251
|
+
this->set_mode_sleep();
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
size_t SX126x::get_max_packet_size() {
|
|
256
|
+
if (this->payload_length_ > 0) {
|
|
257
|
+
return this->payload_length_;
|
|
258
|
+
}
|
|
259
|
+
return 255;
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
void SX126x::set_packet_params_(uint8_t payload_length) {
|
|
263
|
+
uint8_t buf[9];
|
|
264
|
+
if (this->modulation_ == PACKET_TYPE_LORA) {
|
|
265
|
+
buf[0] = (this->preamble_size_ >> 8) & 0xFF;
|
|
266
|
+
buf[1] = (this->preamble_size_ >> 0) & 0xFF;
|
|
267
|
+
buf[2] = (this->payload_length_ > 0) ? 0x01 : 0x00;
|
|
268
|
+
buf[3] = payload_length;
|
|
269
|
+
buf[4] = (this->crc_enable_) ? 0x01 : 0x00;
|
|
270
|
+
buf[5] = 0x00;
|
|
271
|
+
this->write_opcode_(RADIO_SET_PACKETPARAMS, buf, 6);
|
|
272
|
+
} else {
|
|
273
|
+
uint16_t preamble_size = this->preamble_size_ * 8;
|
|
274
|
+
buf[0] = (preamble_size >> 8) & 0xFF;
|
|
275
|
+
buf[1] = (preamble_size >> 0) & 0xFF;
|
|
276
|
+
buf[2] = (this->preamble_detect_ > 0) ? ((this->preamble_detect_ - 1) | 0x04) : 0x00;
|
|
277
|
+
buf[3] = this->sync_value_.size() * 8;
|
|
278
|
+
buf[4] = 0x00;
|
|
279
|
+
buf[5] = 0x00;
|
|
280
|
+
buf[6] = payload_length;
|
|
281
|
+
buf[7] = this->crc_enable_ ? 0x06 : 0x01;
|
|
282
|
+
buf[8] = 0x00;
|
|
283
|
+
this->write_opcode_(RADIO_SET_PACKETPARAMS, buf, 9);
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
SX126xError SX126x::transmit_packet(const std::vector<uint8_t> &packet) {
|
|
288
|
+
if (this->payload_length_ > 0 && this->payload_length_ != packet.size()) {
|
|
289
|
+
ESP_LOGE(TAG, "Packet size does not match config");
|
|
290
|
+
return SX126xError::INVALID_PARAMS;
|
|
291
|
+
}
|
|
292
|
+
if (packet.empty() || packet.size() > this->get_max_packet_size()) {
|
|
293
|
+
ESP_LOGE(TAG, "Packet size out of range");
|
|
294
|
+
return SX126xError::INVALID_PARAMS;
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
SX126xError ret = SX126xError::NONE;
|
|
298
|
+
this->set_mode_standby(STDBY_XOSC);
|
|
299
|
+
if (this->payload_length_ == 0) {
|
|
300
|
+
this->set_packet_params_(packet.size());
|
|
301
|
+
}
|
|
302
|
+
this->write_fifo_(0x00, packet);
|
|
303
|
+
this->set_mode_tx();
|
|
304
|
+
|
|
305
|
+
// wait until transmit completes, typically the delay will be less than 100 ms
|
|
306
|
+
uint32_t start = millis();
|
|
307
|
+
while (!this->dio1_pin_->digital_read()) {
|
|
308
|
+
if (millis() - start > TRANSMIT_TIMEOUT_MS) {
|
|
309
|
+
ESP_LOGE(TAG, "Transmit packet failure");
|
|
310
|
+
ret = SX126xError::TIMEOUT;
|
|
311
|
+
break;
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
uint8_t buf[2];
|
|
316
|
+
buf[0] = 0xFF;
|
|
317
|
+
buf[1] = 0xFF;
|
|
318
|
+
this->write_opcode_(RADIO_CLR_IRQSTATUS, buf, 2);
|
|
319
|
+
if (this->rx_start_) {
|
|
320
|
+
this->set_mode_rx();
|
|
321
|
+
} else {
|
|
322
|
+
this->set_mode_sleep();
|
|
323
|
+
}
|
|
324
|
+
return ret;
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
void SX126x::call_listeners_(const std::vector<uint8_t> &packet, float rssi, float snr) {
|
|
328
|
+
for (auto &listener : this->listeners_) {
|
|
329
|
+
listener->on_packet(packet, rssi, snr);
|
|
330
|
+
}
|
|
331
|
+
this->packet_trigger_->trigger(packet, rssi, snr);
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
void SX126x::loop() {
|
|
335
|
+
if (!this->dio1_pin_->digital_read()) {
|
|
336
|
+
return;
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
uint16_t status;
|
|
340
|
+
uint8_t buf[3];
|
|
341
|
+
uint8_t rssi;
|
|
342
|
+
int8_t snr;
|
|
343
|
+
this->read_opcode_(RADIO_GET_IRQSTATUS, buf, 2);
|
|
344
|
+
this->write_opcode_(RADIO_CLR_IRQSTATUS, buf, 2);
|
|
345
|
+
status = (buf[0] << 8) | buf[1];
|
|
346
|
+
if ((status & IRQ_RX_DONE) == IRQ_RX_DONE) {
|
|
347
|
+
if ((status & IRQ_CRC_ERROR) != IRQ_CRC_ERROR) {
|
|
348
|
+
this->read_opcode_(RADIO_GET_PACKETSTATUS, buf, 3);
|
|
349
|
+
if (this->modulation_ == PACKET_TYPE_LORA) {
|
|
350
|
+
rssi = buf[0];
|
|
351
|
+
snr = buf[1];
|
|
352
|
+
} else {
|
|
353
|
+
rssi = buf[2];
|
|
354
|
+
snr = 0;
|
|
355
|
+
}
|
|
356
|
+
this->read_opcode_(RADIO_GET_RXBUFFERSTATUS, buf, 2);
|
|
357
|
+
this->packet_.resize(buf[0]);
|
|
358
|
+
this->read_fifo_(buf[1], this->packet_);
|
|
359
|
+
this->call_listeners_(this->packet_, (float) rssi / -2.0f, (float) snr / 4.0f);
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
void SX126x::run_image_cal() {
|
|
365
|
+
// the following values were taken from section 9.2.1 table 9-2
|
|
366
|
+
// in rev 2.1 of the datasheet
|
|
367
|
+
uint8_t buf[2] = {0, 0};
|
|
368
|
+
if (this->frequency_ > 900000000) {
|
|
369
|
+
buf[0] = 0xE1;
|
|
370
|
+
buf[1] = 0xE9;
|
|
371
|
+
} else if (this->frequency_ > 850000000) {
|
|
372
|
+
buf[0] = 0xD7;
|
|
373
|
+
buf[1] = 0xD8;
|
|
374
|
+
} else if (this->frequency_ > 770000000) {
|
|
375
|
+
buf[0] = 0xC1;
|
|
376
|
+
buf[1] = 0xC5;
|
|
377
|
+
} else if (this->frequency_ > 460000000) {
|
|
378
|
+
buf[0] = 0x75;
|
|
379
|
+
buf[1] = 0x81;
|
|
380
|
+
} else if (this->frequency_ > 425000000) {
|
|
381
|
+
buf[0] = 0x6B;
|
|
382
|
+
buf[1] = 0x6F;
|
|
383
|
+
}
|
|
384
|
+
if (buf[0] > 0 && buf[1] > 0) {
|
|
385
|
+
this->write_opcode_(RADIO_CALIBRATEIMAGE, buf, 2);
|
|
386
|
+
}
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
void SX126x::set_mode_rx() {
|
|
390
|
+
uint8_t buf[8];
|
|
391
|
+
|
|
392
|
+
// configure irq params
|
|
393
|
+
uint16_t irq = IRQ_RX_DONE | IRQ_RX_TX_TIMEOUT | IRQ_CRC_ERROR;
|
|
394
|
+
buf[0] = (irq >> 8) & 0xFF;
|
|
395
|
+
buf[1] = (irq >> 0) & 0xFF;
|
|
396
|
+
buf[2] = (irq >> 8) & 0xFF;
|
|
397
|
+
buf[3] = (irq >> 0) & 0xFF;
|
|
398
|
+
buf[4] = (IRQ_RADIO_NONE >> 8) & 0xFF;
|
|
399
|
+
buf[5] = (IRQ_RADIO_NONE >> 0) & 0xFF;
|
|
400
|
+
buf[6] = (IRQ_RADIO_NONE >> 8) & 0xFF;
|
|
401
|
+
buf[7] = (IRQ_RADIO_NONE >> 0) & 0xFF;
|
|
402
|
+
this->write_opcode_(RADIO_SET_DIOIRQPARAMS, buf, 8);
|
|
403
|
+
|
|
404
|
+
// set timeout to 0
|
|
405
|
+
buf[0] = 0x00;
|
|
406
|
+
this->write_opcode_(RADIO_SET_LORASYMBTIMEOUT, buf, 1);
|
|
407
|
+
|
|
408
|
+
// switch to continuous mode rx
|
|
409
|
+
buf[0] = 0xFF;
|
|
410
|
+
buf[1] = 0xFF;
|
|
411
|
+
buf[2] = 0xFF;
|
|
412
|
+
this->write_opcode_(RADIO_SET_RX, buf, 3);
|
|
413
|
+
}
|
|
414
|
+
|
|
415
|
+
void SX126x::set_mode_tx() {
|
|
416
|
+
uint8_t buf[8];
|
|
417
|
+
|
|
418
|
+
// configure irq params
|
|
419
|
+
uint16_t irq = IRQ_TX_DONE | IRQ_RX_TX_TIMEOUT;
|
|
420
|
+
buf[0] = (irq >> 8) & 0xFF;
|
|
421
|
+
buf[1] = (irq >> 0) & 0xFF;
|
|
422
|
+
buf[2] = (irq >> 8) & 0xFF;
|
|
423
|
+
buf[3] = (irq >> 0) & 0xFF;
|
|
424
|
+
buf[4] = (IRQ_RADIO_NONE >> 8) & 0xFF;
|
|
425
|
+
buf[5] = (IRQ_RADIO_NONE >> 0) & 0xFF;
|
|
426
|
+
buf[6] = (IRQ_RADIO_NONE >> 8) & 0xFF;
|
|
427
|
+
buf[7] = (IRQ_RADIO_NONE >> 0) & 0xFF;
|
|
428
|
+
this->write_opcode_(RADIO_SET_DIOIRQPARAMS, buf, 8);
|
|
429
|
+
|
|
430
|
+
// switch to single mode tx
|
|
431
|
+
buf[0] = 0x00;
|
|
432
|
+
buf[1] = 0x00;
|
|
433
|
+
buf[2] = 0x00;
|
|
434
|
+
this->write_opcode_(RADIO_SET_TX, buf, 3);
|
|
435
|
+
}
|
|
436
|
+
|
|
437
|
+
void SX126x::set_mode_sleep() {
|
|
438
|
+
uint8_t buf[1];
|
|
439
|
+
buf[0] = 0x05;
|
|
440
|
+
this->write_opcode_(RADIO_SET_SLEEP, buf, 1);
|
|
441
|
+
}
|
|
442
|
+
|
|
443
|
+
void SX126x::set_mode_standby(SX126xStandbyMode mode) {
|
|
444
|
+
uint8_t buf[1];
|
|
445
|
+
buf[0] = mode;
|
|
446
|
+
this->write_opcode_(RADIO_SET_STANDBY, buf, 1);
|
|
447
|
+
}
|
|
448
|
+
|
|
449
|
+
void SX126x::wait_busy_() {
|
|
450
|
+
// wait if the device is busy, the maximum delay is only be a few ms
|
|
451
|
+
// with most commands taking only a few us
|
|
452
|
+
uint32_t start = millis();
|
|
453
|
+
while (this->busy_pin_->digital_read()) {
|
|
454
|
+
if (millis() - start > BUSY_TIMEOUT_MS) {
|
|
455
|
+
ESP_LOGE(TAG, "Wait busy timeout");
|
|
456
|
+
this->mark_failed();
|
|
457
|
+
break;
|
|
458
|
+
}
|
|
459
|
+
}
|
|
460
|
+
}
|
|
461
|
+
|
|
462
|
+
void SX126x::dump_config() {
|
|
463
|
+
ESP_LOGCONFIG(TAG, "SX126x:");
|
|
464
|
+
LOG_PIN(" CS Pin: ", this->cs_);
|
|
465
|
+
LOG_PIN(" BUSY Pin: ", this->busy_pin_);
|
|
466
|
+
LOG_PIN(" RST Pin: ", this->rst_pin_);
|
|
467
|
+
LOG_PIN(" DIO1 Pin: ", this->dio1_pin_);
|
|
468
|
+
ESP_LOGCONFIG(TAG,
|
|
469
|
+
" HW Version: %15s\n"
|
|
470
|
+
" Frequency: %" PRIu32 " Hz\n"
|
|
471
|
+
" Bandwidth: %" PRIu32 " Hz\n"
|
|
472
|
+
" PA Power: %" PRId8 " dBm\n"
|
|
473
|
+
" PA Ramp: %" PRIu16 " us\n"
|
|
474
|
+
" Payload Length: %" PRIu32 "\n"
|
|
475
|
+
" CRC Enable: %s\n"
|
|
476
|
+
" Rx Start: %s",
|
|
477
|
+
this->version_, this->frequency_, BW_HZ[this->bandwidth_], this->pa_power_, RAMP[this->pa_ramp_],
|
|
478
|
+
this->payload_length_, TRUEFALSE(this->crc_enable_), TRUEFALSE(this->rx_start_));
|
|
479
|
+
if (this->modulation_ == PACKET_TYPE_GFSK) {
|
|
480
|
+
const char *shaping = "NONE";
|
|
481
|
+
if (this->shaping_ == GAUSSIAN_BT_0_3) {
|
|
482
|
+
shaping = "GAUSSIAN_BT_0_3";
|
|
483
|
+
} else if (this->shaping_ == GAUSSIAN_BT_0_5) {
|
|
484
|
+
shaping = "GAUSSIAN_BT_0_5";
|
|
485
|
+
} else if (this->shaping_ == GAUSSIAN_BT_0_7) {
|
|
486
|
+
shaping = "GAUSSIAN_BT_0_7";
|
|
487
|
+
} else if (this->shaping_ == GAUSSIAN_BT_1_0) {
|
|
488
|
+
shaping = "GAUSSIAN_BT_1_0";
|
|
489
|
+
}
|
|
490
|
+
ESP_LOGCONFIG(TAG,
|
|
491
|
+
" Modulation: FSK\n"
|
|
492
|
+
" Deviation: %" PRIu32 " Hz\n"
|
|
493
|
+
" Shaping: %s\n"
|
|
494
|
+
" Preamble Size: %" PRIu16 "\n"
|
|
495
|
+
" Preamble Detect: %" PRIu16 "\n"
|
|
496
|
+
" Bitrate: %" PRIu32 "b/s",
|
|
497
|
+
this->deviation_, shaping, this->preamble_size_, this->preamble_detect_, this->bitrate_);
|
|
498
|
+
} else if (this->modulation_ == PACKET_TYPE_LORA) {
|
|
499
|
+
const char *cr = "4/8";
|
|
500
|
+
if (this->coding_rate_ == LORA_CR_4_5) {
|
|
501
|
+
cr = "4/5";
|
|
502
|
+
} else if (this->coding_rate_ == LORA_CR_4_6) {
|
|
503
|
+
cr = "4/6";
|
|
504
|
+
} else if (this->coding_rate_ == LORA_CR_4_7) {
|
|
505
|
+
cr = "4/7";
|
|
506
|
+
}
|
|
507
|
+
ESP_LOGCONFIG(TAG,
|
|
508
|
+
" Modulation: LORA\n"
|
|
509
|
+
" Spreading Factor: %" PRIu8 "\n"
|
|
510
|
+
" Coding Rate: %s\n"
|
|
511
|
+
" Preamble Size: %" PRIu16,
|
|
512
|
+
this->spreading_factor_, cr, this->preamble_size_);
|
|
513
|
+
}
|
|
514
|
+
if (!this->sync_value_.empty()) {
|
|
515
|
+
ESP_LOGCONFIG(TAG, " Sync Value: 0x%s", format_hex(this->sync_value_).c_str());
|
|
516
|
+
}
|
|
517
|
+
if (this->is_failed()) {
|
|
518
|
+
ESP_LOGE(TAG, "Configuring SX126x failed");
|
|
519
|
+
}
|
|
520
|
+
}
|
|
521
|
+
|
|
522
|
+
} // namespace sx126x
|
|
523
|
+
} // namespace esphome
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
#pragma once
|
|
2
|
+
|
|
3
|
+
#include "esphome/components/spi/spi.h"
|
|
4
|
+
#include "esphome/core/automation.h"
|
|
5
|
+
#include "esphome/core/component.h"
|
|
6
|
+
#include "sx126x_reg.h"
|
|
7
|
+
#include <utility>
|
|
8
|
+
#include <vector>
|
|
9
|
+
|
|
10
|
+
namespace esphome {
|
|
11
|
+
namespace sx126x {
|
|
12
|
+
|
|
13
|
+
enum SX126xBw : uint8_t {
|
|
14
|
+
// FSK
|
|
15
|
+
SX126X_BW_4800,
|
|
16
|
+
SX126X_BW_5800,
|
|
17
|
+
SX126X_BW_7300,
|
|
18
|
+
SX126X_BW_9700,
|
|
19
|
+
SX126X_BW_11700,
|
|
20
|
+
SX126X_BW_14600,
|
|
21
|
+
SX126X_BW_19500,
|
|
22
|
+
SX126X_BW_23400,
|
|
23
|
+
SX126X_BW_29300,
|
|
24
|
+
SX126X_BW_39000,
|
|
25
|
+
SX126X_BW_46900,
|
|
26
|
+
SX126X_BW_58600,
|
|
27
|
+
SX126X_BW_78200,
|
|
28
|
+
SX126X_BW_93800,
|
|
29
|
+
SX126X_BW_117300,
|
|
30
|
+
SX126X_BW_156200,
|
|
31
|
+
SX126X_BW_187200,
|
|
32
|
+
SX126X_BW_234300,
|
|
33
|
+
SX126X_BW_312000,
|
|
34
|
+
SX126X_BW_373600,
|
|
35
|
+
SX126X_BW_467000,
|
|
36
|
+
// LORA
|
|
37
|
+
SX126X_BW_7810,
|
|
38
|
+
SX126X_BW_10420,
|
|
39
|
+
SX126X_BW_15630,
|
|
40
|
+
SX126X_BW_20830,
|
|
41
|
+
SX126X_BW_31250,
|
|
42
|
+
SX126X_BW_41670,
|
|
43
|
+
SX126X_BW_62500,
|
|
44
|
+
SX126X_BW_125000,
|
|
45
|
+
SX126X_BW_250000,
|
|
46
|
+
SX126X_BW_500000,
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
enum class SX126xError { NONE = 0, TIMEOUT, INVALID_PARAMS };
|
|
50
|
+
|
|
51
|
+
class SX126xListener {
|
|
52
|
+
public:
|
|
53
|
+
virtual void on_packet(const std::vector<uint8_t> &packet, float rssi, float snr) = 0;
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
class SX126x : public Component,
|
|
57
|
+
public spi::SPIDevice<spi::BIT_ORDER_MSB_FIRST, spi::CLOCK_POLARITY_LOW, spi::CLOCK_PHASE_LEADING,
|
|
58
|
+
spi::DATA_RATE_8MHZ> {
|
|
59
|
+
public:
|
|
60
|
+
size_t get_max_packet_size();
|
|
61
|
+
float get_setup_priority() const override { return setup_priority::PROCESSOR; }
|
|
62
|
+
void setup() override;
|
|
63
|
+
void loop() override;
|
|
64
|
+
void dump_config() override;
|
|
65
|
+
void set_bandwidth(SX126xBw bandwidth) { this->bandwidth_ = bandwidth; }
|
|
66
|
+
void set_bitrate(uint32_t bitrate) { this->bitrate_ = bitrate; }
|
|
67
|
+
void set_busy_pin(InternalGPIOPin *busy_pin) { this->busy_pin_ = busy_pin; }
|
|
68
|
+
void set_coding_rate(uint8_t coding_rate) { this->coding_rate_ = coding_rate; }
|
|
69
|
+
void set_crc_enable(bool crc_enable) { this->crc_enable_ = crc_enable; }
|
|
70
|
+
void set_deviation(uint32_t deviation) { this->deviation_ = deviation; }
|
|
71
|
+
void set_dio1_pin(InternalGPIOPin *dio1_pin) { this->dio1_pin_ = dio1_pin; }
|
|
72
|
+
void set_frequency(uint32_t frequency) { this->frequency_ = frequency; }
|
|
73
|
+
void set_hw_version(const std::string &hw_version) { this->hw_version_ = hw_version; }
|
|
74
|
+
void set_mode_rx();
|
|
75
|
+
void set_mode_tx();
|
|
76
|
+
void set_mode_standby(SX126xStandbyMode mode);
|
|
77
|
+
void set_mode_sleep();
|
|
78
|
+
void set_modulation(uint8_t modulation) { this->modulation_ = modulation; }
|
|
79
|
+
void set_pa_power(int8_t power) { this->pa_power_ = power; }
|
|
80
|
+
void set_pa_ramp(uint8_t ramp) { this->pa_ramp_ = ramp; }
|
|
81
|
+
void set_payload_length(uint8_t payload_length) { this->payload_length_ = payload_length; }
|
|
82
|
+
void set_preamble_detect(uint16_t preamble_detect) { this->preamble_detect_ = preamble_detect; }
|
|
83
|
+
void set_preamble_size(uint16_t preamble_size) { this->preamble_size_ = preamble_size; }
|
|
84
|
+
void set_rst_pin(InternalGPIOPin *rst_pin) { this->rst_pin_ = rst_pin; }
|
|
85
|
+
void set_rx_start(bool rx_start) { this->rx_start_ = rx_start; }
|
|
86
|
+
void set_rf_switch(bool rf_switch) { this->rf_switch_ = rf_switch; }
|
|
87
|
+
void set_shaping(uint8_t shaping) { this->shaping_ = shaping; }
|
|
88
|
+
void set_spreading_factor(uint8_t spreading_factor) { this->spreading_factor_ = spreading_factor; }
|
|
89
|
+
void set_sync_value(const std::vector<uint8_t> &sync_value) { this->sync_value_ = sync_value; }
|
|
90
|
+
void set_tcxo_voltage(uint8_t tcxo_voltage) { this->tcxo_voltage_ = tcxo_voltage; }
|
|
91
|
+
void set_tcxo_delay(uint32_t tcxo_delay) { this->tcxo_delay_ = tcxo_delay; }
|
|
92
|
+
void run_image_cal();
|
|
93
|
+
void configure();
|
|
94
|
+
SX126xError transmit_packet(const std::vector<uint8_t> &packet);
|
|
95
|
+
void register_listener(SX126xListener *listener) { this->listeners_.push_back(listener); }
|
|
96
|
+
Trigger<std::vector<uint8_t>, float, float> *get_packet_trigger() const { return this->packet_trigger_; };
|
|
97
|
+
|
|
98
|
+
protected:
|
|
99
|
+
void configure_fsk_ook_();
|
|
100
|
+
void configure_lora_();
|
|
101
|
+
void set_packet_params_(uint8_t payload_length);
|
|
102
|
+
uint8_t read_fifo_(uint8_t offset, std::vector<uint8_t> &packet);
|
|
103
|
+
void write_fifo_(uint8_t offset, const std::vector<uint8_t> &packet);
|
|
104
|
+
void write_opcode_(uint8_t opcode, uint8_t *data, uint8_t size);
|
|
105
|
+
uint8_t read_opcode_(uint8_t opcode, uint8_t *data, uint8_t size);
|
|
106
|
+
void write_register_(uint16_t reg, uint8_t *data, uint8_t size);
|
|
107
|
+
void read_register_(uint16_t reg, uint8_t *data, uint8_t size);
|
|
108
|
+
void call_listeners_(const std::vector<uint8_t> &packet, float rssi, float snr);
|
|
109
|
+
void wait_busy_();
|
|
110
|
+
Trigger<std::vector<uint8_t>, float, float> *packet_trigger_{new Trigger<std::vector<uint8_t>, float, float>()};
|
|
111
|
+
std::vector<SX126xListener *> listeners_;
|
|
112
|
+
std::vector<uint8_t> packet_;
|
|
113
|
+
std::vector<uint8_t> sync_value_;
|
|
114
|
+
InternalGPIOPin *busy_pin_{nullptr};
|
|
115
|
+
InternalGPIOPin *dio1_pin_{nullptr};
|
|
116
|
+
InternalGPIOPin *rst_pin_{nullptr};
|
|
117
|
+
std::string hw_version_;
|
|
118
|
+
char version_[16];
|
|
119
|
+
SX126xBw bandwidth_{SX126X_BW_125000};
|
|
120
|
+
uint32_t bitrate_{0};
|
|
121
|
+
uint32_t deviation_{0};
|
|
122
|
+
uint32_t frequency_{0};
|
|
123
|
+
uint32_t payload_length_{0};
|
|
124
|
+
uint32_t tcxo_delay_{0};
|
|
125
|
+
uint16_t preamble_detect_{0};
|
|
126
|
+
uint16_t preamble_size_{0};
|
|
127
|
+
uint8_t tcxo_voltage_{0};
|
|
128
|
+
uint8_t coding_rate_{0};
|
|
129
|
+
uint8_t modulation_{PACKET_TYPE_LORA};
|
|
130
|
+
uint8_t pa_ramp_{0};
|
|
131
|
+
uint8_t shaping_{0};
|
|
132
|
+
uint8_t spreading_factor_{0};
|
|
133
|
+
int8_t pa_power_{0};
|
|
134
|
+
bool crc_enable_{false};
|
|
135
|
+
bool rx_start_{false};
|
|
136
|
+
bool rf_switch_{false};
|
|
137
|
+
};
|
|
138
|
+
|
|
139
|
+
} // namespace sx126x
|
|
140
|
+
} // namespace esphome
|