Skip to content

Search documentation

Find a section by name or by what it says.

Documentation

Installing a device pool

A device pool is a small program that runs on the machine your boards are plugged into. It owns the serial ports, and it is the only thing that talks to a board directly — everything else talks to it. It connects out to the platform, so there is no port to open and no address to publish.

Before you start

  • A 64-bit Windows 10 or 11 PC, or a Linux machine on x86-64 or 64-bit ARM (a Raspberry Pi 4 or 5 is the usual choice).
  • Your ESP32 boards, and a data USB cable for each. Many cables sold with power banks carry power only: the board lights up and the computer never sees it.
  • The address you open this web app at. The installers below already have it filled in.

USB drivers. Boards whose USB port is wired straight to the chip (most ESP32-C3, C5, C6 and S3 boards) need no driver on Windows 10 or later or on Linux. Classic ESP32 boards usually have a small USB-to-serial chip next to the connector — a CP210x or a CH340/CH343. Linux includes both. Windows normally installs them on its own the first time the board is plugged in; if the board shows up in Device Manager as an unknown device or with a warning sign, install the vendor's driver:

When it works, the board appears in Device Manager under Ports (COM & LPT) as a COM port, such as COM3. The number can change when you plug into a different USB socket; the pool follows it.

Install on Windows

Open PowerShell (Start menu, type PowerShell) and paste this line. It downloads the pool, checks it against the published checksum, installs it for your user account, writes the address to connect to, and starts it in that window.

powershell
irm {{ORIGIN}}/downloads/install.ps1 | iex
No administrator rights needed. Installs to %LOCALAPPDATA%\Programs\csi-device-pool and adds it to your PATH.

To have the pool start by itself every time you log in, and keep running with no window open, use this form instead:

powershell
& ([scriptblock]::Create((irm {{ORIGIN}}/downloads/install.ps1))) -Autostart
Registers a Scheduled Task for your account and shows the claim code once the pool connects.

Prefer to do it by hand? Download the Windows build, unzip it, and create a file named csi-device-pool.env next to csi-device-pool.exe containing:

text
CSI_AGENT_URL=wss://{{HOST}}/ws/pool

Then double-click csi-device-pool.exe. Without that file it stops and tells you exactly what is missing, rather than trying to connect to nothing.

A file downloaded through a browser may trigger Windows protected your PC. Choose More info, then Run anyway. The PowerShell installer avoids this, and it verifies the download before running anything.

Install on Linux

One line. It detects your architecture, fetches the matching build, checks it against the published checksum, and installs it.

sh
curl -fsSL {{ORIGIN}}/downloads/install.sh | sh
Installs to /usr/local/bin. Pass --help to see the options.

To run it as a service that starts at boot, add --systemd. The address to connect to is already filled in, so the service is ready to start:

sh
curl -fsSL {{ORIGIN}}/downloads/install.sh | sh -s -- --systemd
sudo systemctl enable --now csi-device-pool
journalctl -u csi-device-pool -f
The last command follows the pool's log, which is where the claim code appears.

Both installers verify the download against the checksum in the release manifest and refuse to continue if they disagree. If you would rather check by hand, every published file is listed in SHA256SUMS beside it.

Which Linux build to take

There are two Linux builds. The difference is whether the reference sensors are included, and that decides what your machine needs to have on it already. Windows has one build, without reference sensors.

staticthe default
One file, no dependencies of any kind. Runs on any Linux of the right architecture, including minimal container images. Handles ESP boards; no camera or microphone reference sensors.
full--flavour full
Adds camera and microphone reference sensors, which record alongside the CSI and give you something to check an answer against. Needs libudev1, libasound2 and libv4l-0 present — the installer checks and tells you the exact command if they are missing.

Take the static build unless you know you want reference sensors. It is the same detector code either way; the sensors are extra inputs, not better ones.

On Debian, Ubuntu or Raspberry Pi OS the full build is also published as a .deb, which lets apt pull the libraries in for you:

sh
curl -fsSLO {{ORIGIN}}/downloads/latest/cm-pool-aarch64-linux-full.deb
sudo apt install ./cm-pool-aarch64-linux-full.deb
Use x86_64 in place of aarch64 on a PC. Every release's exact files are listed in /downloads/manifest.json.

The package installs the binary to /usr/bin and nothing else — no service unit, and nothing is started for you. To run it as a service, use the install script with --systemd.

Pair it with your account

The first time the pool connects, it prints a claim code. In the PowerShell window or the Linux terminal it looks like this; with Windows autostart the installer shows it for you, and it is also in the log file.

text
=== This pool is UNCLAIMED. Claim code: A1B2C3D4 ===
  1. In the app, open Devices in the sidebar.
  2. Under Device pools, choose Claim pool.
  3. Enter the 8-character code. The pool appears in the list as connected.

The code expires after 15 minutes. If it is refused, restart the pool and use the new code it prints. Once claimed, the pool reconnects on its own after restarts and reboots, and never prints a code again.

The claim code is a live credential for as long as it is valid — whoever enters it claims that pool into their organization. Treat it like a password rather than a serial number, and do not paste it into a ticket.

Add your boards

With the pool claimed, plug in your boards. They appear under Devices → Detected boards. For each one:

  1. Identify reads what the board is running.
  2. Flash installs the platform firmware. The pool downloads the right image for the chip itself; there is nothing to fetch by hand. A board on a USB-to-serial chip takes about a minute.
  3. Register adds it to your fleet, and it shows as Ready.

Flash before you register. A registered board has no flash button until you remove it again.

Keeping it running

On Windows, -Autostart registers a Scheduled Task named *Connected Motion device pool* that starts the pool when you log in and restarts it if it stops. Its output goes to %LOCALAPPDATA%\csi-device-pool\logs\pool.log. On Linux, the --systemd service starts at boot and logs to the journal.

The pool's data directory is its identity. It holds the id and access token generated on first run — on Windows in %APPDATA%\connectedmotion\csi-device-pool\data, on Linux in ~/.local/share/csi-device-pool (or /var/lib/csi-device-pool for the service). A pool started against an empty data directory enrols as a brand-new, unclaimed pool, and every board registered against the old one is orphaned. Back that directory up before moving a pool to another machine, and restore it rather than re-pairing.

To uninstall on Windows, run the installer with -Uninstall. It removes the program, the Scheduled Task and the PATH entry, and keeps the identity so a reinstall reconnects as the same, already-claimed pool. Add -PurgeIdentity to delete that too.

powershell
& ([scriptblock]::Create((irm {{ORIGIN}}/downloads/install.ps1))) -Uninstall

Troubleshooting