Add optiomal pio OTA upload support

Add custom upload (#928) and (#934)
This commit is contained in:
arendst 2017-09-30 15:53:50 +02:00
parent ab5b53703c
commit d609433b34
4 changed files with 171 additions and 5 deletions

104
pio/espupload.py Normal file
View File

@ -0,0 +1,104 @@
#!/usr/bin/python
#
# espupload by Theo Arends - 20170930
#
# Uploads binary file to OTA server
#
# Execute: espupload -u <Host_IP_address>:<Host_port>/<Host_path> -f <sketch.bin>
#
# Needs pycurl
# - pip install pycurl
import sys
import os
import optparse
import logging
import pycurl
HOST_URL = "domus1:80/api/upload-arduino.php"
def upload(hostUrl, filename):
url = 'http://%s' % (hostUrl)
c = pycurl.Curl()
c.setopt(c.URL, url)
# The "Expect:" is there to suppress "Expect: 100-continue" behaviour that is
# the default in libcurl when posting large bodies (and fails on lighttpd).
c.setopt(c.HTTPHEADER, ["Expect:"])
c.setopt(c.HTTPPOST, [('file', (c.FORM_FILE, filename, )), ])
c.perform()
c.close()
def parser():
parser = optparse.OptionParser(
usage = "%prog [options]",
description = "Upload image to over the air Host server for the esp8266 module with OTA support."
)
# destination ip and port
group = optparse.OptionGroup(parser, "Destination")
group.add_option("-u", "--host_url",
dest = "host_url",
action = "store",
help = "Host url",
default = HOST_URL
)
parser.add_option_group(group)
# image
group = optparse.OptionGroup(parser, "Image")
group.add_option("-f", "--file",
dest = "image",
help = "Image file.",
metavar = "FILE",
default = None
)
parser.add_option_group(group)
# output group
group = optparse.OptionGroup(parser, "Output")
group.add_option("-d", "--debug",
dest = "debug",
help = "Show debug output. And override loglevel with debug.",
action = "store_true",
default = False
)
parser.add_option_group(group)
(options, args) = parser.parse_args()
return options
# end parser
def main(args):
# get options
options = parser()
# adapt log level
loglevel = logging.WARNING
if (options.debug):
loglevel = logging.DEBUG
# end if
# logging
logging.basicConfig(level = loglevel, format = '%(asctime)-8s [%(levelname)s]: %(message)s', datefmt = '%H:%M:%S')
logging.debug("Options: %s", str(options))
if (not options.host_url or not options.image):
logging.critical("Not enough arguments.")
return 1
# end if
if not os.path.exists(options.image):
logging.critical('Sorry: the file %s does not exist', options.image)
return 1
# end if
upload(options.host_url, options.image)
# end main
if __name__ == '__main__':
sys.exit(main(sys.argv))
# end if

12
pio/http-uploader.py Normal file
View File

@ -0,0 +1,12 @@
Import("env")
from base64 import b64decode
env.Replace(UPLOADER="pio\espupload.py")
env.Replace(UPLOADERFLAGS="")
env.Replace(UPLOADCMD="$UPLOADER -u " + b64decode(ARGUMENTS.get("UPLOAD_PORT")) + " -f $SOURCES")
'''
env.Replace(UPLOADCMD="pio\espupload.py -f $SOURCES") # Windows
env.Replace(UPLOADCMD="pio/espupload.py -f $SOURCES") # Linux
'''

6
pio/sftp-uploader.py Normal file
View File

@ -0,0 +1,6 @@
Import("env")
from base64 import b64decode
env.Replace(UPLOADER="scp")
env.Replace(UPLOADERFLAGS="")
env.Replace(UPLOADCMD="$UPLOADER $SOURCES " + b64decode(ARGUMENTS.get("UPLOAD_PORT")) + "/" + b64decode(ARGUMENTS.get("PIOENV")) + ".bin")

View File

@ -10,13 +10,13 @@
[platformio] [platformio]
src_dir = sonoff src_dir = sonoff
; Uncomment one of the lines below to build/upload only one environment ; *** Uncomment one of the lines below to build/upload only one environment
;env_default = sonoff ;env_default = sonoff
;env_default = sonoff-NL ;env_default = sonoff-NL
;env_default = sonoff-minimal ;env_default = sonoff-minimal
;env_default = sonoff-ds18x20 ;env_default = sonoff-ds18x20
; Sonoff et al ; *** Sonoff et al
[env:sonoff] [env:sonoff]
platform = espressif8266 platform = espressif8266
framework = arduino framework = arduino
@ -25,10 +25,21 @@ board_flash_mode = dout
build_flags = -Wl,-Tesp8266.flash.1m0.ld -DMQTT_MAX_PACKET_SIZE=512 build_flags = -Wl,-Tesp8266.flash.1m0.ld -DMQTT_MAX_PACKET_SIZE=512
lib_deps = PubSubClient, NeoPixelBus, IRremoteESP8266, ArduinoJSON lib_deps = PubSubClient, NeoPixelBus, IRremoteESP8266, ArduinoJSON
; Serial Monitor options ; *** Serial Monitor options
monitor_baud = 115200 monitor_baud = 115200
; Sonoff et al ; *** Upload Serial reset method for Wemos and NodeMCU
;upload_resetmethod = nodemcu
; *** Upload file to OTA server using SCP
;upload_port = user@host:/path
;extra_scripts = pio/sftp-uploader.py
; *** Upload file to OTA server using HTTP
;upload_port = domus1:80/api/upload-arduino.php
;extra_scripts = pio/http-uploader.py
; *** Sonoff et al
[env:sonoff-NL] [env:sonoff-NL]
platform = espressif8266 platform = espressif8266
framework = arduino framework = arduino
@ -37,9 +48,20 @@ board_flash_mode = dout
build_flags = -Wl,-Tesp8266.flash.1m0.ld -DMQTT_MAX_PACKET_SIZE=512 -DMY_LANGUAGE=nl-NL build_flags = -Wl,-Tesp8266.flash.1m0.ld -DMQTT_MAX_PACKET_SIZE=512 -DMY_LANGUAGE=nl-NL
lib_deps = PubSubClient, NeoPixelBus, IRremoteESP8266, ArduinoJSON lib_deps = PubSubClient, NeoPixelBus, IRremoteESP8266, ArduinoJSON
; Serial Monitor options ; *** Serial Monitor options
monitor_baud = 115200 monitor_baud = 115200
; *** Upload Serial reset method for Wemos and NodeMCU
;upload_resetmethod = nodemcu
; *** Upload file to OTA server using SCP
;upload_port = user@host:/path
;extra_scripts = pio/sftp-uploader.py
; *** Upload file to OTA server using HTTP
;upload_port = domus1:80/api/upload-arduino.php
;extra_scripts = pio/http-uploader.py
; Sonoff minimal ; Sonoff minimal
[env:sonoff-minimal] ; Placeholder to be configured [env:sonoff-minimal] ; Placeholder to be configured
platform = espressif8266 platform = espressif8266
@ -52,6 +74,17 @@ lib_deps = PubSubClient, NeoPixelBus, IRremoteESP8266, ArduinoJSON
; Serial Monitor options ; Serial Monitor options
monitor_baud = 115200 monitor_baud = 115200
; *** Upload Serial reset method for Wemos and NodeMCU
;upload_resetmethod = nodemcu
; *** Upload file to OTA server using SCP
;upload_port = user@host:/path
;extra_scripts = pio/sftp-uploader.py
; *** Upload file to OTA server using HTTP
;upload_port = domus1:80/api/upload-arduino.php
;extra_scripts = pio/http-uploader.py
; Sonoff multiple DS18x20 ; Sonoff multiple DS18x20
[env:sonoff-ds18x20] [env:sonoff-ds18x20]
platform = espressif8266 platform = espressif8266
@ -63,3 +96,14 @@ lib_deps = PubSubClient, NeoPixelBus, IRremoteESP8266, ArduinoJSON, OneWire
; Serial Monitor options ; Serial Monitor options
monitor_baud = 115200 monitor_baud = 115200
; *** Upload Serial reset method for Wemos and NodeMCU
;upload_resetmethod = nodemcu
; *** Upload file to OTA server using SCP
;upload_port = user@host:/path
;extra_scripts = pio/sftp-uploader.py
; *** Upload file to OTA server using HTTP
;upload_port = domus1:80/api/upload-arduino.php
;extra_scripts = pio/http-uploader.py