Skills micropython-skills
git clone https://github.com/openclaw/skills
T=$(mktemp -d) && git clone --depth=1 https://github.com/openclaw/skills "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/0x1abin/micropython-skills" ~/.claude/skills/clawdbot-skills-micropython-skills && rm -rf "$T"
skills/0x1abin/micropython-skills/SKILL.mdmicropython-skills
AI Agent programmable co-processor skill collection. You (the Agent) generate MicroPython code, push it to devices via REPL, parse structured output, and iterate — turning hardware into your extended capability.
Quick Start
Python command: Use
on macOS/Linux,python3on Windows. On Windows,pythonis often a Microsoft Store stub that silently fails (exit code 49). On macOS/Linux,python3may not exist or may point to Python 2.python
Every interaction follows this flow:
- Probe — Run
to discover connected devicespython3 {SKILL_DIR}/scripts/device_probe.py
→ Device has MicroPython, proceed to step 2status: "ok"
→ ESP chip detected but no MicroPython. Ask user to confirm, then flash:status: "no_firmware"python3 {SKILL_DIR}/scripts/firmware_flash.py --port PORT --yes
→ No device connected. Guide user to connect hardware.status: "no_device"
→ Serial port not accessible. On Linux:status: "permission_denied"
. On Windows: check Device Manager for driver issues.sudo chmod 666 /dev/ttyACM0
- Connect — Default: USB via mpremote. Optional: WiFi via WebREPL (user must request)
- Execute — Generate MicroPython code and push to device
- Parse — Scan stdout for tagged lines (RESULT:/ERROR:/STATUS:/LOG:)
- Iterate — Adjust code based on results, repeat steps 3-5
Where
{SKILL_DIR} is the directory containing this SKILL.md file.
Connection Management
Default: USB (mpremote)
Always start by probing for devices:
python3 {SKILL_DIR}/scripts/device_probe.py
Execute code on device:
mpremote exec "import machine; print('RESULT:' + str(machine.freq()))"
Run a script file:
mpremote run script.py
For multi-line code, write a temporary
.py file locally, then mpremote run /path/to/task.py.
Serial port names vary by platform:
| Platform | Port Format | Example |
|---|---|---|
| Linux | /dev/ttyUSB0, /dev/ttyACM0 | |
| macOS | /dev/cu.usbserial-, /dev/cu.usbmodem | |
| Windows | COM3, COM4, ... | |
The scripts auto-detect the port — you rarely need to specify it manually.
Optional: WiFi (WebREPL)
Only switch to WiFi when the user explicitly requests it. The switch flow:
- Ask user for WiFi SSID and password
- Push WiFi + WebREPL config to device via USB:
python3 {SKILL_DIR}/scripts/wifi_setup.py --ssid "SSID" --password "PASS" --webrepl-password "repl123" - Note the IP address from the output
- From now on, execute code over WiFi:
python3 {SKILL_DIR}/scripts/webrepl_exec.py --host 192.168.1.100 --password repl123 --code "print('hello')" - USB cable can be disconnected
For detailed command reference, read
./references/connections.md.
Sub-skill Router
Based on user intent, read the corresponding sub-skill for domain-specific templates:
| User Intent Keywords | Sub-skill Path | Safety Tier |
|---|---|---|
| temperature, humidity, DHT, BME280, pressure, IMU, accelerometer, ADC, analog, ultrasonic, light sensor, photoresistor, read sensor | | Safe |
| GPIO, LED, blink, PWM, servo, motor, stepper, relay, NeoPixel, WS2812, buzzer, output, control, drive | | Cautious |
| WiFi, MQTT, HTTP, BLE, Bluetooth, NTP, WebSocket, AP mode, network, connect internet, publish, subscribe | | Cautious |
| PID, filter, Kalman, state machine, scheduler, data logging, moving average, control loop, algorithm | | Safe |
| scan I2C, scan SPI, device info, memory, filesystem, diagnose, health check, benchmark, pin state, what's connected | | Safe |
| save to device, 保存到设备, 开机自启, auto start, 下次还能用, persist, 断电保存 | See "Program Persistence" section below | Cautious/Dangerous |
| flash firmware, burn firmware, install MicroPython, no firmware, 烧录, 刷固件, 刷机 | | Dangerous |
| recovery, not responding, stuck, boot.py, main.py, reflash, brick | | Dangerous |
When a task spans multiple domains (e.g., "read sensor and publish via MQTT"), read all relevant sub-skills.
Structured Output Protocol
All MicroPython code you generate for the device MUST use tagged output lines:
| Tag | Purpose | Example |
|---|---|---|
| Success data (JSON) | |
| Error info | |
| Status indicator | |
| Debug info | |
Code template — every snippet you generate should follow this pattern:
import json from machine import Pin try: # ... your operation here ... print("RESULT:" + json.dumps({"key": value})) except Exception as e: print("ERROR:" + str(e))
Parse rules:
- Scan device stdout line by line
- Extract lines starting with
,RESULT:
,ERROR:
,STATUS:LOG: - Ignore all other output (MicroPython boot messages, REPL prompts, etc.)
- If
is found, diagnose and retry with adjusted codeERROR:
Safety Rules
| Tier | Operations | Agent Behavior |
|---|---|---|
| Safe | Sensor read, I2C/SPI scan, memory check, pin read, diagnostics | Execute directly |
| Cautious | GPIO output, PWM, WiFi connect, file write on device | Inform user what you're about to do, then execute |
| Dangerous | Overwrite boot.py/main.py, format filesystem, OTA update, flash firmware | Must get explicit user confirmation. Always backup first: |
Hard constraints:
- Never hardcode WiFi passwords in scripts saved to device — use variables or prompt user
- All loops must have iteration limits or timeouts — never generate infinite loops without exit conditions
- Before overwriting boot.py or main.py, always backup the existing file first
- Before controlling high-current devices (motors, relays), ask user to confirm wiring
For complete recovery procedures, read
./references/safety.md.
Workflow
As the Agent operating this co-processor, follow this mental model:
- Understand intent — What does the user want to achieve with the hardware?
- Check connection — Run device_probe.py if you haven't yet. Know your device's platform and capabilities.
- Route to sub-skill — Read the relevant sub-skill SKILL.md for code templates and domain knowledge
- Generate code — Write MicroPython code following the output protocol. Adapt pin numbers and parameters to the target platform.
- Push and capture — Execute via mpremote or WebREPL, capture full stdout
- Parse results — Extract RESULT:/ERROR: lines, parse JSON data
- Decide next step — If ERROR, diagnose and adjust. If RESULT, present to user or use for next operation.
- Maintain state — Remember which pins are in use, which peripherals are initialized, what the device's platform is
- Offer persistence — After a program runs successfully, ask the user if they want to save it to the device or set it to auto-start on boot
Program Persistence
After a program runs successfully, offer the user two options:
Option 1: Save to Device (for later manual use)
Save the script to the device's filesystem so it can be run anytime without re-uploading:
# Save script to device mpremote fs cp local_script.py :my_program.py # List saved scripts on device mpremote fs ls # Run a saved script mpremote exec "exec(open('my_program.py').read())"
This is a Cautious operation — inform the user before writing files to the device.
Option 2: Auto-start on Boot (write to main.py)
If the user wants the program to run automatically every time the device powers on:
- Always ask first — "要设置为开机自动运行吗?注意:如果程序有问题可能导致设备无法正常连接。"
- Backup existing main.py (if any):
mpremote fs cp :main.py ./main.py.bak - Upload as main.py:
mpremote fs cp local_script.py :main.py - Important: For auto-start scripts, wrap the main logic in a try/except and add a short startup delay so the user can interrupt if needed:
import time time.sleep(2) # 2s window for Ctrl-C interrupt # ... main logic ...
This is a Dangerous operation — require explicit user confirmation.
Disable Auto-start
If the device becomes hard to access due to a problematic main.py:
# Rename to disable (if mpremote can still connect) mpremote exec "import os; os.rename('main.py', 'main.py.disabled')" mpremote reset # Or delete it mpremote exec "import os; os.remove('main.py')" mpremote reset
If the device is completely unresponsive, follow the recovery steps in
./references/safety.md.
Platform Adaptation
After probing, adapt code to the detected platform:
| Platform | Key Capabilities |
|---|---|
| esp32 / esp32s3 | WiFi, BLE, Touch Pad, Deep Sleep, ULP, Hall Sensor |
| rp2040 | PIO state machines, dual core, no WiFi (unless Pico W) |
| stm32 | More timers, CAN bus, DAC |
| Generic | Standard module API only |
For ESP32-specific pin maps and APIs, read
./references/esp32.md.
Reference Files
Read these on demand — not every interaction needs them:
| File | When to Read |
|---|---|
| Troubleshooting connection issues, mpremote advanced usage, WebREPL protocol details |
| ESP32-specific pin maps, strapping pin warnings, deep sleep, NVS, BLE/WiFi API details |
| Device recovery, boot.py restore, filesystem repair, electrical safety |
Dependencies
Agent-side requirements:
—mpremote
(required for USB connection)pip install mpremote
—esptool
(required for chip detection and firmware flashing)pip install esptool
—pyserial
(required on Windows for COM port auto-detection; recommended on all platforms)pip install pyserial
—websocket-client
(only needed for WiFi/WebREPL mode)pip install websocket-client- Python 3.8+
Windows notes:
- Use
instead ofpythonto run scripts. On many Windows systems,python3is a Microsoft Store stub that returns exit code 49. On macOS/Linux, usepython3.python3- Without
, the scripts fall back to parsing thepyserialcommand output for COM port detection, which provides less detail (no VID/PID info). Installmodefor best results.pyserial
Device-side requirements:
- MicroPython firmware v1.19+ (v1.22+ recommended) — auto-installed by
if missingfirmware_flash.py - USB connection or WiFi reachability
External Endpoints
This skill accesses external services during specific operations:
| Endpoint | When Accessed | Purpose | Required? |
|---|---|---|---|
| Firmware flashing only () | Download latest stable MicroPython firmware binary for the detected chip | Only when flashing firmware |
| Firmware flashing only | Direct firmware download URL | Only when flashing firmware |
No telemetry, analytics, or data is sent to any external service. The skill operates entirely locally except for firmware downloads.
Security & Privacy
- No data collection: This skill does not collect, transmit, or store any user data
- No telemetry: No usage analytics, crash reports, or tracking of any kind
- Local-only operation: All device communication happens over local USB serial or local WiFi (WebREPL). No cloud relay or proxy is used
- WiFi credentials: When provided by the user, WiFi credentials are passed directly to the device via
and written to the device'smpremote
. They are never logged, stored on the host machine, or transmitted to external servicesboot.py - Firmware source: Firmware binaries are downloaded exclusively from
, the official MicroPython project sitemicropython.org - File system access: Helper scripts only access serial ports and the system temp directory (for firmware caching). No other host files are read or modified
Trust & Verification
- Open source: Full source code is available at the homepage repository
- No obfuscation: All Python scripts and Markdown files are human-readable
- Auditable: The
directory contains 4 self-contained Python scripts with no external dependencies beyondscripts/
,mpremote
,esptool
, andpyserialwebsocket-client - Evals included: The
file contains 5 test scenarios covering device probe, sensor read, actuator control, diagnostics, and recoveryevals/evals.json