Repository navigation
Releases: josephdadams/ptz-pilot
Release list
v1.0.0
Fly your PTZ cameras with a game controller.
Proportional pan, tilt, zoom and focus — push further, move faster.
PTZ Pilot is a macOS app that turns the controllers you already have — an Xbox or PlayStation pad, a DJI drone remote, even a tiny Bluetooth ring — into a proper PTZ joystick. Nudge a stick and the camera creeps; push it all the way and it flies. Every operator gets their own controller and camera, and it all keeps running from the menu bar.
⬇️ Download
| Mac | File |
|---|---|
| Apple Silicon (M1 and later) | ptz-pilot-v1.0.0-mac-arm64.dmg |
| Intel | ptz-pilot-v1.0.0-mac-x64.dmg |
Signed and notarized. Open the DMG and drag PTZ Pilot to Applications.
🎮 Works with
…and cameras over Sony VISCA over IP, VISCA over UDP / TCP / serial, Canon XC, Panasonic AW, Hikvision ISAPI, Hanwha Wisenet SUNAPI, ONVIF and KXWell control panels: Sony, PTZOptics, BirdDog, Canon, Panasonic, Hikvision, Hanwha, Axis, Dahua and most other IP PTZ cameras.
✨ What it does
- 🎚️ Truly proportional — a gentle nudge creeps, full stick flies. Deadzone, response curve, invert and top speed are tunable per axis.
- 🧩 Assign anything — pick a ready-made layout, or choose what each stick and trigger does: pan, tilt, zoom, focus or nothing.
- 🔘 Buttons that work for you — switch cameras, recall presets 1–16, go home, autofocus, or zoom and focus for as long as a button is held.
- 👥 Several operators at once — each controller drives its own camera with its own settings. Two on one camera share it: whoever pushes harder wins.
- 🖱️ Drive from the window too — presets, hold-to-move arrows and the arrow keys, for when no controller is handy.
- 🔍 Find cameras — ONVIF discovery lists the cameras answering on your network.
- 🔌 Remote control — a WebSocket API and a Companion module for status, live telemetry and control.
- 🧭 Lives in the menu bar — close the window and keep flying; reassign controllers right from the menu.
⚙️ How it works
- Add a camera. Pick its protocol, enter its address (and a login, if it needs one) and choose a speed profile. Profiles match each camera family's speed ranges, and every limit can be set by hand.
- Connect a controller. It appears in the sidebar and starts on the camera you're looking at. Gamepads show up once you press a button; the DJI remote connects over the USB-C port on its bottom.
- Fly. PTZ Pilot reads the controller dozens of times a second, shapes each axis through its deadzone and curve, and turns how far you push into the camera's own speed steps. The tiles show exactly what's being sent.
A one-stick controller like the Magicsee R1 has nowhere to put zoom, so out of the box its triggers zoom out and in while held, easing from a crawl up to full speed. Its stick is only on or off, so movement eases in the same way: tap to nudge, hold to build to full speed.
🛟 Built to fail safe
- A camera stops within 250 ms of its controller going quiet: unplugged, out of range or asleep.
- Every stop is sent twice, and a held movement is re-sent every 500 ms, so a dropped packet can't leave a camera turning.
- Quitting stops every camera before the app exits.
📝 Good to know
- The Magicsee R1 connects as a keyboard, so macOS asks for Input Monitoring the first time. Allow it, then reopen PTZ Pilot.
- Sony cameras reply to port 52381, so PTZ Pilot listens there. If another program holds that port, cameras still move but can't show their status.
- Hikvision and Hanwha cameras lock an account after a few failed logins, so PTZ Pilot backs off before retrying a rejected password. Saving the camera tries again straight away.
- The DJI remote reports its sticks and wheel, but not its buttons.
See the README for per-camera details and the API reference.
Read more on my blog here: https://techministry.blog/?p=4055






