From bb2b31c0426bae923c362f52547eaf0b159f862f Mon Sep 17 00:00:00 2001 From: Correl Date: Fri, 20 Jan 2023 15:32:26 -0500 Subject: [PATCH] Include OTA upload script --- platformio.ini | 3 +++ platformio_upload.py | 53 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 56 insertions(+) create mode 100644 platformio_upload.py diff --git a/platformio.ini b/platformio.ini index 3e9db79..5149547 100644 --- a/platformio.ini +++ b/platformio.ini @@ -25,3 +25,6 @@ build_flags = -DCORE_DEBUG_LEVEL=4 -DBOARD_HAS_PSRAM -mfix-esp32-psram-cache-issue +extra_scripts = platformio_upload.py +upload_protocol = custom +upload_url = http://esp32-874bbc/update diff --git a/platformio_upload.py b/platformio_upload.py new file mode 100644 index 0000000..1c5f0a6 --- /dev/null +++ b/platformio_upload.py @@ -0,0 +1,53 @@ +# Allows PlatformIO to upload directly to AsyncElegantOTA +# +# To use: +# - copy this script into the same folder as your platformio.ini +# - set the following for your project in platformio.ini: +# +# extra_scripts = platformio_upload.py +# upload_protocol = custom +# upload_url = +# +# An example of an upload URL: +# upload_URL = http://192.168.1.123/update + +import requests +import hashlib +Import('env') + +try: + from requests_toolbelt import MultipartEncoder, MultipartEncoderMonitor + from tqdm import tqdm +except ImportError: + env.Execute("$PYTHONEXE -m pip install requests_toolbelt") + env.Execute("$PYTHONEXE -m pip install tqdm") + from requests_toolbelt import MultipartEncoder, MultipartEncoderMonitor + from tqdm import tqdm + +def on_upload(source, target, env): + firmware_path = str(source[0]) + upload_url = env.GetProjectOption('upload_url') + + with open(firmware_path, 'rb') as firmware: + md5 = hashlib.md5(firmware.read()).hexdigest() + firmware.seek(0) + encoder = MultipartEncoder(fields={ + 'MD5': md5, + 'firmware': ('firmware', firmware, 'application/octet-stream')} + ) + + bar = tqdm(desc='Upload Progress', + total=encoder.len, + dynamic_ncols=True, + unit='B', + unit_scale=True, + unit_divisor=1024 + ) + + monitor = MultipartEncoderMonitor(encoder, lambda monitor: bar.update(monitor.bytes_read - bar.n)) + + response = requests.post(upload_url, data=monitor, headers={'Content-Type': monitor.content_type}) + bar.close() + print(response,response.text) + +env.Replace(UPLOADCMD=on_upload)