upydev | Command line tool for MicroPython devices | Command Line Interface library

 by   Carglglz Python Version: 0.4.3 License: MIT

kandi X-RAY | upydev Summary

kandi X-RAY | upydev Summary

upydev is a Python library typically used in Telecommunications, Media, Telecom, Utilities, Command Line Interface applications. upydev has no bugs, it has no vulnerabilities, it has build file available, it has a Permissive License and it has low support. You can install using 'pip install upydev' or download it from GitHub, PyPI.

To see more information about upydev toolbox sources, requirements, tested devices, etc see ABOUT doc.
Support
    Quality
      Security
        License
          Reuse

            kandi-support Support

              upydev has a low active ecosystem.
              It has 42 star(s) with 6 fork(s). There are 9 watchers for this library.
              OutlinedDot
              It had no major release in the last 12 months.
              There are 8 open issues and 10 have been closed. On average issues are closed in 4 days. There are no pull requests.
              It has a neutral sentiment in the developer community.
              The latest version of upydev is 0.4.3

            kandi-Quality Quality

              upydev has 0 bugs and 0 code smells.

            kandi-Security Security

              upydev has no vulnerabilities reported, and its dependent libraries have no vulnerabilities reported.
              upydev code analysis shows 0 unresolved vulnerabilities.
              There are 0 security hotspots that need review.

            kandi-License License

              upydev is licensed under the MIT License. This license is Permissive.
              Permissive licenses have the least restrictions, and you can use them in most projects.

            kandi-Reuse Reuse

              upydev releases are available to install and integrate.
              Deployable package is available in PyPI.
              Build file is available. You can build the component from source.
              Installation instructions are available. Examples and code snippets are not available.

            Top functions reviewed by kandi - BETA

            kandi has reviewed upydev and discovered the below as its top functions. This is intended to give you an instant insight into upydev implemented functionality, and help decide if they suit your requirements.
            • Create key bindings
            • Parse the input stream
            • Enter a new tag
            • Read count bytes from the stack
            • Execute a devicemanagement action
            • Expand margs
            • Return the address of a given entry point
            • Check if device is in ZeroTier group
            • Calls custom shell command
            • Forward an IRQ event
            • Sync a device
            • Calls custom shell commands
            • Calls custom command
            • Generate a shasum for multiple files
            • Generate shell command
            • Run fileio action
            • Generate key generation key
            • Configure the interface
            • Send a file
            • Convert an integer to bytes
            • Execute shell REPL action
            • Run wstool
            • Debug action
            • Perform firmware action
            • Handle serial tool
            • Bletool
            Get all kandi verified functions for this library.

            upydev Key Features

            No Key Features are available at this moment for upydev.

            upydev Examples and Code Snippets

            No Code Snippets are available at this moment for upydev.

            Community Discussions

            QUESTION

            Argparse outputting help text twice
            Asked 2022-Feb-25 at 21:44

            After an hour googling, I can't find anybody who has had anything resembling this issue besides myself. I created a command line interface with argparse. Originally I had tried to leverage argparse's built in help text behavior. But my boss isn't satisfied with the default help text, so he is having me write up the full usage/help text in a text file and just display the entire file.

            For some reason, in a certain case, its outputting the text twice.

            Here is the basics of how my program is broken down:

            I have a top level parser. I read in my help text file, set it to a string help_text, and then set "usage=help_text" on the parser. Then I create subparsers (4 of them and then a base case) to create subcommands. Only one of those subparsers has any additional arguments (one positional, one optional). Before I reworked the help text, I had help text for each individual subcommand by using "help=" but now those are all blank. Lastly, I have set up a base case to display the help text whenever no subcommands are given.

            Here is the behavior I'm getting:

            When I call the main function with no subcommands and no arguments, my help_text from the text file outputs, and then like 2-3 additional lines of boiler plate I can't seem to get rid of. Also because the word usage appears in my text file, it says "usage: usage"

            When I call the main command and then type --help, the exact same thing happens as above.

            When I call the one subcommand that has a required positional argument and I don't include that argument... it spits out the entire help text twice. Right above the second time it prints, it prints the default usage line for that subcommand.

            Lastly, when I use a different subcommand that has no arguments and give it an argument (one too many) it spits out everything completely correctly without even the extra couple lines at the end.

            I don't know how to make heads or tales about this. Here is the main function of the script (I can verify that this problem occurs only in the main function where argparse is used, not the other functions that the main function calls):

            ...

            ANSWER

            Answered 2022-Feb-25 at 21:44

            With a modification of your main:

            Source https://stackoverflow.com/questions/71270655

            QUESTION

            Solving conda environment stuck
            Asked 2021-Dec-22 at 18:02

            I'm trying to install conda environment using the command:

            ...

            ANSWER

            Answered 2021-Dec-22 at 18:02

            This solves fine (), but is indeed a complex solve mainly due to:

            • underspecification
            • lack of modularization
            Underspecification

            This particular environment specification ends up installing well over 300 packages. And there isn't a single one of those that are constrained by the specification. That is a huge SAT problem to solve and Conda will struggle with this. Mamba will help solve faster, but providing additional constraints can vastly reduce the solution space.

            At minimum, specify a Python version (major.minor), such as python=3.9. This is the single most effective constraint.

            Beyond that, putting minimum requirements on central packages (those that are dependencies of others) can help, such as minimum NumPy.

            Lack of Modularization

            I assume the name "devenv" means this is a development environment. So, I get that one wants all these tools immediately at hand. However, Conda environment activation is so simple, and most IDE tooling these days (Spyder, VSCode, Jupyter) encourages separation of infrastructure and the execution kernel. Being more thoughtful about how environments (emphasis on the plural) are organized and work together, can go a long way in having a sustainable and painless data science workflow.

            The environment at hand has multiple red flags in my book:

            • conda-build should be in base and only in base
            • snakemake should be in a dedicated environment
            • notebook (i.e., Jupyter) should be in a dedicated environment, co-installed with nb_conda_kernels; all kernel environments need are ipykernel

            I'd probably also have the linting/formatting packages separated, but that's less an issue. The real killer though is snakemake - it's just a massive piece of infrastructure and I'd strongly encourage keeping that separated.

            Source https://stackoverflow.com/questions/70451652

            QUESTION

            Mysql Error while piping database to different server
            Asked 2021-Nov-28 at 19:48

            I have a strange error here. The command I am executing is this:

            ...

            ANSWER

            Answered 2021-Nov-28 at 19:48

            By default, when you use mysqldump DB, the output includes table-creation statements, but no CREATE DATABASE statement. It just assumes you have created an empty schema first.

            So you could do this to create the schema first:

            Source https://stackoverflow.com/questions/70146691

            QUESTION

            Shell script to pull row counts from all Hive tables in multiple Hive databases
            Asked 2021-Nov-22 at 07:57

            I am trying to create a shell script that will pull row counts in all tables from multiple databases. All of the databases follow the same naming convention "the_same_databasename_<%>" except the final layer in the name, which varies. I am trying to run the following:

            use ; show tables; select count(*) from ;

            Since I have 40 different databases, I would need to run the first two queries for each database 40 different times, plus the select count query even more depending on how many table in the database (very time consuming). I have my PuTTy configuration settings set to save my PuTTy sessions into a .txt on my local directory, so I can have the row count results displayed right in my command line interface. So far this is what I have but not sure how to include the final commands to get the actual row counts from the tables in each database.

            ...

            ANSWER

            Answered 2021-Nov-22 at 07:57

            You can use nested for-loop:

            Source https://stackoverflow.com/questions/70057982

            QUESTION

            See workspace in MATLAB command line terminal
            Asked 2021-Nov-20 at 09:18

            Is there any command to see all variable names, types and values in command line interface? Similar to Matlab's Workspace? I already know about command whos but it doesn't show the values, It just shows names and types.

            Thanks :)

            ...

            ANSWER

            Answered 2021-Nov-20 at 09:18

            QUESTION

            How can I fix "Failed to compile src/index.js 'firebase' is not defined no-undef"?
            Asked 2021-Nov-12 at 21:59

            I am trying to use a React web app to read and write stuff in a Firebase realtime database. Every time I run "npm run start", I get this error message.

            ...

            ANSWER

            Answered 2021-Nov-12 at 21:59

            Recently, Firebase announced that version 9 of Firebase SDK JS is generally available. This was done to do some optimisations. Try using:

            Source https://stackoverflow.com/questions/68959965

            QUESTION

            Array of structs only takes last value in C
            Asked 2021-Nov-05 at 19:41

            I'm trying to make a simple command line interface, but i'm having a probleme for parsing commands :

            process_t is a structure contient the path of the command with arguments to be stored in the variable argv.

            ...

            ANSWER

            Answered 2021-Nov-05 at 11:12

            You're trying to use the block-local array argv, which is recreated for every command and, what's worse, doesn't even exist any longer after parse_cmd has returned. An array object with sufficient lifetime has to be used; you can do this by changing

            Source https://stackoverflow.com/questions/69844231

            QUESTION

            How to detect if Python is running in Git Bash terminal, or Windows cmd?
            Asked 2021-Oct-17 at 16:37

            I'd like to give my Python scripts the ability to detect whether it was executed in a Git Bash terminal, or the Windows cmd command line interface. For example, I'm trying to write a function to clear the terminal (regardless of which terminal it is), e.g. echoes the clear command if in Git Bash, or cls if in cmd.

            I've tried using sys.platform to detect this, but it returns win32 regardless of which type of terminal it was ran in.

            ...

            ANSWER

            Answered 2021-Oct-17 at 05:23

            I don't believe what you're asking for is possible, but there are several answers here that show all the detections you can do to use the correct type of clear. Usually, it's just best to either make your own window or not clear the screen, sadly.

            Source https://stackoverflow.com/questions/69601508

            QUESTION

            Connecting to MySQL server in a script returns error, but it works fine in a terminal
            Asked 2021-Oct-12 at 15:28

            I'm trying to write a bash script which will install and set up a MySQL server automatically. The problem is that when my script executes the following command:

            ...

            ANSWER

            Answered 2021-Oct-12 at 15:28

            Well, I'm not entirely sure what was wrong, but I think it came down to one process not finishing before another process started. I inserted a sleep 5 in the script - just before the last line where I'm trying to connect to the server, and that worked. I also wrapped the line in a while loop, giving it up to 5 attempts to connect to the server, and if it fails, it will wait a further 5 seconds. Currently this seems to work fairly reliably and I am able to connect to the MySQL server.

            So either way the problem appears to be solved.

            Source https://stackoverflow.com/questions/69538440

            QUESTION

            Python 3 + Click: CLI arguments get butchered when calling one command from another
            Asked 2021-Sep-10 at 16:18

            I am using Python 3.9 and Click to build a small command line interface utility, but I am getting strange errors, specifically when I attempt to call one function decorated as a @click.command() from another function that is also decorated the same way.

            I have distilled my program down to the bare minimum to explain what I mean.

            This is my program

            ...

            ANSWER

            Answered 2021-Sep-10 at 16:18

            Community Discussions, Code Snippets contain sources that include Stack Exchange Network

            Vulnerabilities

            No vulnerabilities reported

            Install upydev

            First be sure that the WebREPL daemon is enabled and running see:. $ pip install upydev or $ pip install --upgrade upydev to update to the last version available. upydev will use local working directory configuration unless it does not find any or manually indicated with -g option. This means that if the first argument is not a Mode keyword or a upy command keyword it assumes it is a 'raw' upy command to send to the upy device.
            WebREPL: a prompt over-wifi
            WebREPL: web-browser interactive prompt
            To save configuration in working directory: $ upydev config -t [UPYDEVICE IP] -p [PASSWORD] e.g: $ upydev config -t 192.168.1.58 -p mypass
            To save configuration globally use -g flag: $ upydev config -t [UPYDEVICE IP] -p [PASSWORD] -g e.g. $ upydev config -t 192.168.1.58 -p mypass -g
            upydev config: save upy device settings (see -p, -t, -g), so the target and password arguments wont be required any more
            upydev put : to upload a file to upy device (see -f, -s , -dir, -rst; for multiple files see -fre option and use -wdl to put only new or modified files.)
            upydev get : to download a file from upy device (see -f , -dir, -s; for multiple files see -fre option)
            upydev sync : for a faster transfer of large files (this needs sync_tool.py in upy device) (see -f, -s and -lh; for multiple files see -fre option)
            upydev d_sync: to recursively sync a folder in upydevice filesystem use -dir to indicate the folder (must be in cwd), use -tree to see dir structure, or -s sd to sync to an Sd card mounted as 'sd'. Use -wdl to sync only new or modified files.
            upydev cmd : for debugging purpose, to send command to upy device ; (see -c, -r, -rl); Examples: $ upydev cmd -c "led.on()" $ upydev cmd -r "print('Hello uPy')" $ upydev cmd -rl "function_that_print_multiple_lines()" tip: simple commands can be used without quotes; but for commands with parenthesis or special characters use quotes, for example: 'dummy_func()' ; use double quotes "" when the command includes a string like this example: "uos.listdir('/sd')"
            upydev wrepl : to enter the terminal WebREPL; CTRL-x to exit, CTRL-d to do soft reset To see more keybinding info do CTRL-k (Added custom keybindings and autocompletion on tab to the previous work see: Terminal WebREPL for the original work)
            upydev wssrepl : to enter the terminal WebSecureREPL; CTRL-x to exit, CTRL-d to do soft reset To see more keybindings info do CTRL-k. REPL over WebSecureSockets (This needs use of sslgen_key -tfkey, update_upyutils and enable WebSecureREPL in the device import wss_repl;wss_repl.start(ssl=True))
            upydev srepl : to enter the terminal serial repl using picocom, indicate port by -port option (to exit do CTRL-a, CTRL-x) (see: Picocom for more information)
            upydev ping : pings the target to see if it is reachable, CTRL-C to stop
            upydev run : just calls import 'script', where 'script' is indicated by -f option (script must be in upy device or in sd card indicated by -s option and the sd card must be already mounted as 'sd'); Supports CTRL-C to stop the execution and exit nicely.
            upydev install : install libs to '/lib' path with upip; indicate lib with -f option
            upydev mpyx : to froze a module/script indicated with -f option, and save some RAM, it uses mpy-cross tool (see mpy-cross for more information)
            upydev timeit : to measure execution time of a module/script indicated with -f option. source: timed_function
            upydev fw: to list or get available firmware versions, use -md option to indicate operation: to list do: upydev fw -md list -b [BOARD] , board could be 'esp32', 'esp8266' or 'PYBD' for example (web scraping from micropython downloads page ) (use list latest -b [BOARD] to see the latest available firmware) *results can be filtered further with -n option, e.g. -n idf3 to get do: upydev fw -md get [firmware file] or upydev fw -md get latest -b [BOARD] to get the latest available firmware. (this uses curl) *results can be filtered further with -n option, e.g. -n idf3 to see available serial ports do: upydev fw -md list serial_ports
            upydev flash: to flash a firmware file to the upydevice, a serial port must be indicated to flash do: upydev flash -port [serial port] -f [firmware file] (just for esp8266 and esp32)
            upydev see: to get specific command help info indicated with -c option
            upydev find: to get a list of possible upy devices. Scans the local network to find devices with port 8266 (WebREPL) open. Use -n option to perform n scans (A single scan may not find all the devices)
            upydev diagnose to make a diagnostic test of the device (sends useful commands to get device state info)
            upydev errlog: if error.log is present in the upydevice, this shows the content (cat('error.log')). If error.log in sd use -s sd (This command needs upysh installed, do upydev install -f upysh)
            upydev stream_test: to test download speed (from device to host). Default test is 10 MB of random bytes are sent in chunks of 20 kB and received in chunks of 32 kB. To change test parameters use -chunk_tx , -chunk_rx, and -total_size.
            upydev sysctl to start/stop a script without following the output. To follow initiate wrepl/srepl as normal, and exit with CTRL-x (webrepl) or CTRL-A,X (srepl) TO START: use -start[SCRIPT_NAME], TO STOP: use -stop [SCRIPT_NAME]
            upydev log to log the output of a upydevice script, indicate script with -f option, and the sys.stdout log level and file log level with -dslev and -dflev (defaults are debug for sys.stdout and error for file). To log in background use -daemon option, then the log will be redirected to a file with level -dslev. To stop the 'daemon' log mode use -stopd and indicate script with -f option. 'Normal' file log and 'Daemon' file log are under .upydev_logs folder in $HOME directory, named after the name of the script. To follow an on going 'daemon' mode log, use -follow option and indicate the script with -f option.
            upydev update_upyutils: to update the latest versions of sync_tool.py, upylog.py, upynotify.py, upysh2.py, upysecrets.py, ssl_repl.py, uping.py, time_it.py, wss_repl.py and wss_helper.py (these are uploaded to the '/lib' folder of the upydevice)
            upydev debug: to execute a local script line by line in the target upydevice, use -f option to indicate the file. To enter next line press ENTER, to finish PRESS C then ENTER. To break a while loop do CTRL-C.
            upydev gen_rsakey To generate RSA-2048 bit key that will be shared with the device (it is unique for each device) use -tfkey to send this key to the device (use only if connected directly to the AP of the device or a "secure" wifi e.g. local/home). If not connected to a "secure" wifi upload the key (it is stored in upydev.path) by USB/Serial connection.
            upydev rf_wrkey To "refresh" the WebREPL password with a new random password derivated from the RSA key previously generated. A token then is sent to the device to generate the same password from the RSA key previously uploaded. This won't leave any clues in the TCP Websocekts packages of the current WebREPL password. (Only the token will be visible; check this using wireshark) (This needs upysecrets.py)
            upydev crypto_wrepl:To enter the terminal CryptoWebREPL a E2EE wrepl/shell terminal; CTRL-x to exit, CTRL-u to toggle encryption mode (enabled by default) To see more keybindings info do CTRL-k. By default resets after exit, use -rkey option to refresh the WebREPL password with a new random password, after exit. This passowrd will be stored in the working directory or in global directory with -g option. (This mode needs upysecrets.py)
            upydev upy to acces crypto_wrepl in a 'ssh' style command to be used like e.g.: upydev upy@192.168.1.42 or if a device is stored in a global group called "UPY_G" (this needs to be created first doing e.g. upydev make_group -g -f UPY_G -devs foo_device 192.168.1.42 myfoopass) The device can be accesed as upydev upy@foo_device or redirect any command as e.g. upydev ping -@foo_device
            upydev sslgen_key (This needs openssl available in $PATH) To generate ECDSA key and a self-signed certificate to enable SSL sockets This needs a passphrase, that will be required every time the key is loaded. Use -tfkey to upload this key to the device (use only if connected directly to the AP of the device or a "secure" wifi e.g. local/home). If not connected to a "secure" wifi upload the key (it is stored in upydev.path) by USB/Serial connection.
            upydev ssl_wrepl: To enter the terminal SSLWebREPL a E2EE wrepl/shell terminal (SSL sockets); CTRL-x to exit, CTRL-u to toggle encryption mode (enabled by default) To see more keybindings info do CTRL-k. By default resets after exit. (This mode needs ssl_repl.py) use -rkey option to refresh the WebREPL password with a new random password, after exit. This passowrd will be stored in the working directory or in global directory with -g option. (This mode needs ssl_repl.py, upysecrets.py for -rfkey) *(Use -nem option to use without encryption (for esp8266))
            upydev ssl: to acces ssl_wrepl in a 'ssh' style command to be used like e.g.: upydev ssl@192.168.1.42 or if a device is stored in a global group called "UPY_G" (this needs to be created first doing e.g. $ upydev make_group -g -f UPY_G -devs foo_device 192.168.1.42 myfoopass) The device can be accesed as $ upydev ssl@foo_device or redirect any command as e.g. $ upydev ping -@foo_device
            upydev sh_srepl: To enter the serial terminal SHELL-REPL; CTRL-x to exit, To see more keybindings info do CTRL-k. By default resets after exit. To configure a serial device use -t for baudrate and -p for serial port To acces without previous configuration: sh_srepl -port [serial port] -b [baudrate] (default baudrate is 115200) To acces with previous configuration: sh_srepl (if device configured in current working directory) sh_srepl -@ foo_device (if foo_device is configured in global group 'UPY_G')
            upydev shr: to acces the serial terminal SHELL-REPL in a 'ssh' style command to be used like e.g.: upydev shr@/dev/tty.usbmodem3370377430372 or if a device is stored in a global group called "UPY_G" (this needs to be created first doing e.g. upydev make_group -g -f UPY_G -devs foo_device 115200 /dev/tty.usbmodem3370377430372) The device can be accesed as upydev shr@foo_device
            upydev wssl: to access ssl_wrepl if WebSecureREPL is enabled in a 'ssh' style command to be used like e.g.: upydev wssl@192.168.1.42 or if a device is stored in a global group called "UPY_G" (this needs to be created first doing e.g. upydev make_group -g -f UPY_G -devs foo_device 192.168.1.42 myfoopass) then the device can be accessed as upydev wssl@foo_device.
            upydev set_wss: To toggle between WebSecureREPL and WebREPL, to enable WebSecureREPL do 'set_wss', to disable 'set_wss -wss'
            upydev jupyterc: to run MicroPython upydevice kernel for jupyter console, CTRL-D to exit, %lsmagic to see magic commands and how to connect to a device either WebREPL (%websocketconnect) or Serial connection (%serialconnect). Hit tab to autcomplete magic commands, and MicroPython/Python code. (This needs jupyter and MicroPython upydevice kernel to be installed)
            upydev make_group: to make a group of boards to send commands to. Use -f for the name of the group and -devs option to indicate a name, ip and the password of each board. (To store the group settings globally use -g option)
            upydev mg_group: to manage a group of boards to send commands to. Use -G for the name of the group and -add option to add devices (indicate a name, ip and the password of each board) or -rm to remove devices (indicated by name). More info at GitBook Wiki.
            General: These commands should work 'out of the box' in any MicroPython running board with WebREPL daemon enabled.
            Wifi utils : This commands make easier to save/load wifi configuration (STA and AP ) and connect to an access point or enable its own (needs wifiutils.py in upydevice, see upyutils directory)
            SD: These commands need sdcard.py in the upy device, and a sd module/shield at least.
            INPUT: These commands need a specific sensor module and the appropriate script in the upydevice (All these scripts are under upyutils directory) ADC: commands that make use of the ADCs from the board, or an external ADC module (ADS1115) (for external module needs 'ads1115.py' and 'init_ADS.py') IMU: commands that make use of the LSM9DS1 module, although other IMU modules could be easily implemented (needs 'lsm9ds1.py' and 'init_MY_IMU.py') WEATHER: commands that make use of the BME280 module, although other weather sensor modules could be easily implemented (needs 'bme280.py' and 'init_BME280.py') POWER: commands that make use of the INA219 module.(needs 'ina219.py' and 'init_INA219.py')
            OUTPUT: These commands use the DAC or PWM of the board, some needs an actuator module (buzzer or motor driver and a motor) at least and the appropriate script in the upydevice. DAC: to generate an analog signal (dc value, sine wave or square wave at the momment) (needs 'dac_signal_gen.py') BUZZER: to drive a buzzer with PWM (needs 'buzzertools.py') DC MOTOR: to control a DC motor (needs a motor driver and the appropriate script) (needs 'dcmotor.py') SERVO: to drive a servo motor (needs 'servo.py') STEPPER MOTOR: to drive stepper motor (needs a motor driver and 'stepper.py')
            NETWORKING: MQTT: commands to connect to a broker, subscribe to topic, publish and receive messages (needs 'mqtt_client.py') SOCKETS: commands to start client/server socket and send/receive messages (needs 'socket_client_server.py') UREQUEST: commands to make http requests, and get json or text output
            PORT/BOARD SPECIFIC COMMANDS: battery : if running on battery, gets battery voltage (esp32 huzzah feather) pinout : to see the pinout reference/info of a board, indicated by -b option, to request a single or a list of pins info use -po option (currently just esp32 huzzah feather) specs : to see the board specs, indicated by -b option (currently just esp32 huzzah feather) pin_status: to see pin state, to request a specific set use -po option

            Support

            For any new features, suggestions and bugs create an issue on GitHub. If you have any questions check and ask questions on community page Stack Overflow .
            Find more information at:

            Find, review, and download reusable Libraries, Code Snippets, Cloud APIs from over 650 million Knowledge Items

            Find more libraries
            Install
          • PyPI

            pip install upydev

          • CLONE
          • HTTPS

            https://github.com/Carglglz/upydev.git

          • CLI

            gh repo clone Carglglz/upydev

          • sshUrl

            git@github.com:Carglglz/upydev.git

          • Stay Updated

            Subscribe to our newsletter for trending solutions and developer bootcamps

            Agree to Sign up and Terms & Conditions

            Share this Page

            share link

            Consider Popular Command Line Interface Libraries

            ohmyzsh

            by ohmyzsh

            terminal

            by microsoft

            thefuck

            by nvbn

            fzf

            by junegunn

            hyper

            by vercel

            Try Top Libraries by Carglglz

            upydevice

            by CarglglzPython

            NFC_PN532_SPI

            by CarglglzPython

            jupyter_upydevice_kernel

            by CarglglzPython

            upyble

            by CarglglzPython

            bleico

            by CarglglzPython