Skip to content
Snippets Groups Projects
Select Git revision
  • fb155bada40170feb313023470520a7156e9187a
  • master default protected
2 results

platformio_upload.py

Blame
  • platformio_upload.py 1.66 KiB
    # 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 = <your 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)