Skip to content

Releases: josephdadams/ptz-pilot

Release list

v1.0.0

Choose a tag to compare

@github-actions github-actions released this 03 Oct 00:42

Fly your PTZ cameras with a game controller.
Proportional pan, tilt, zoom and focus — push further, move faster.

An Xbox controller driving a camera in PTZ Pilot: live stick view, output speeds and stick assignments

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

Xbox Wireless Controller
Gamepads
Xbox, PlayStation, Switch Pro, 8BitDo and more, over USB or Bluetooth
DJI RC-N1 remote controller
DJI RC-N1
A spare drone remote, through its USB-C port: two sticks and the gimbal wheel
Magicsee R1 ring controller
Magicsee R1
A one-handed Bluetooth ring, in game mode (@ + B)

…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.

A Hanwha Wisenet camera in PTZ Pilot: presets, movement controls and connection settings

⚙️ How it works

  1. 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.
  2. 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.
  3. 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 DJI RC-N1 in PTZ Pilot: right stick pan and tilt, left stick zoom, wheel focus

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.

A Magicsee R1 in PTZ Pilot, with its triggers set to zoom while held

🛟 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