Controlling a ZWO Seestar S30 Pro from Ekos via INDI
Context
ZWO’s Seestar S30 Pro (see the hardware page) is an all-in-one smart telescope (mount, optics, camera, processing) that exposes an ASCOM Alpaca API over the network (port 32323). The gordtulloch/indi-seestar project provides INDI drivers bridging this API to the KStars/Ekos ecosystem, letting you control the Seestar like any regular INDI mount.
This tutorial covers a full install on a dedicated Raspberry Pi (used here as a network gateway, to avoid loading the PC/StellarMate that already drives another mount) and the Ekos-side configuration, with S30 Pro specifics.
Architecture:
1┌─────────────┐ WiFi/Alpaca ┌──────────────┐ INDI/network ┌─────────────┐
2│ Seestar │ ───────────────▶ │ Raspberry Pi │ ───────────────▶│ Ekos/KStars │
3│ S30 Pro │ port 32323 │ indiserver │ port 7624 │ │
4└─────────────┘ └──────────────┘ └─────────────┘
Prerequisites
- A Raspberry Pi (2/3/4, with at least 16 GB SD card for compilation) on the same network as the Seestar
- Raspberry Pi OS Lite (32 or 64-bit depending on the Pi model)
- A machine running KStars/Ekos for control
1. Build libindi from source
⚠️ The libindi-dev package available via apt on Raspberry Pi OS is usually too old for these recent drivers (missing headers). libindi needs to be built from source.
1sudo apt-get install -y build-essential cmake git \
2 libnova-dev libcfitsio-dev libusb-1.0-0-dev zlib1g-dev libgsl-dev \
3 libjpeg-dev libcurl4-gnutls-dev libtiff-dev libfftw3-dev libev-dev
4
5cd ~
6git clone https://github.com/indilib/indi.git
7mkdir -p indi/build
8cd indi/build
9
10cmake -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_BUILD_TYPE=Release -DFIX_WARNINGS=OFF ..
11make -j2
12sudo make install
-DFIX_WARNINGS=OFF prevents recent GCC (14+) from blocking the build on warnings from unrelated legacy drivers.
2. Build the Alpaca and Seestar drivers
1cd ~
2git clone https://github.com/gordtulloch/indi-seestar.git
3
4cd indi-seestar/indi-alpaca
5mkdir build && cd build
6cmake .. && make -j2 && sudo make install
7
8cd ../../indi-seestar
9mkdir build && cd build
10cmake .. && make -j2 && sudo make install
3. Start the INDI server
⚠️ Despite what the project’s README suggests, there is no separate indi_seestar_telescope driver. Mount control goes through the generic indi_alpaca_telescope driver:
1indiserver -v indi_alpaca_telescope indi_seestar_ccd indi_alpaca_filterwheel indi_alpaca_focuser
4. Dual-camera support (telephoto + wide-angle)
The S30 Pro has two sensors. The indi_seestar_ccd driver hardcodes its INDI device name — running two instances as-is causes a name collision. Build a second instance under a distinct name:
1cp -r ~/indi-seestar/indi-seestar ~/indi-seestar/indi-seestar-wide
2sed -i 's/"Seestar CCD"/"Seestar CCD Wide"/' ~/indi-seestar/indi-seestar-wide/indi_seestar_ccd.cpp
3sed -i 's/indi_seestar_ccd/indi_seestar_ccd_wide/g' ~/indi-seestar/indi-seestar-wide/CMakeLists.txt
4sed -i 's/indi_seestar_ccd_wide\.cpp/indi_seestar_ccd.cpp/' ~/indi-seestar/indi-seestar-wide/CMakeLists.txt
5
6cd ~/indi-seestar/indi-seestar-wide
7mkdir build && cd build
8cmake .. && make -j2 && sudo make install
Launch with both cameras:
1indiserver -v indi_alpaca_telescope indi_seestar_ccd indi_seestar_ccd_wide indi_alpaca_filterwheel indi_alpaca_focuser
Configure the second instance (Seestar CCD Wide) with Device Number = 1 in its connection panel.
5. Ekos-side configuration
| Role | Driver |
|---|---|
| Mount | Alpaca Telescope |
| Camera | Seestar CCD (+ Seestar CCD Wide) |
| Filter Wheel | Alpaca FilterWheel |
| Focuser | Alpaca Focuser |
Two separate connections to keep straight:
- Ekos → Pi: Remote mode, Host = Pi’s IP, Port
7624 - Driver → Seestar (in each INDI control panel): Host = Seestar’s IP/hostname, Port
32323
⚠️ Don’t check “INDI Web Manager” if indiserver is started manually on the Pi (no indiwebmanager service) — it makes the connection fail.
Host/Port config persistence: filling the fields isn’t enough — go to the device panel’s Options tab, Configuration group, and click Save.
Optical Trains
Needed for a shared mount with two distinct camera chains. S30 Pro specs to enter under Telescope & Lens:
| Telephoto | Wide-angle | |
|---|---|---|
| Aperture | 30 mm | 3.4 mm |
| Focal Length | 160 mm | 6 mm |
| Focal Ratio | F/5.3 | F/1.75 |
| Field of view | ~4.6° | ~63° |
6. Remote arm opening
The Seestar folds its arm at rest. Park (closing) works correctly via Alpaca, but Unpark alone doesn’t physically reopen the arm.
Solution: Unpark unlocks goto capability (without moving), and a standard Goto opens the arm as a side effect. For a simple “wake-up” without a meaningful slew, target the horizon (altitude ≈ 0°):
1from astropy.coordinates import EarthLocation, AltAz, SkyCoord
2from astropy.time import Time
3import astropy.units as u
4
5location = EarthLocation(lat=<latitude>, lon=<longitude>, height=<altitude_m> * u.m)
6obstime = Time.now()
7altaz = AltAz(az=<chosen_azimuth> * u.deg, alt=0 * u.deg, location=location, obstime=obstime)
8radec = SkyCoord(altaz).icrs
9# radec.ra.deg / radec.dec.deg → send as a goto (Ekos, or via indi_setprop / pyindi-client)
Sequence: Unpark → Goto (computed RA/Dec) → arm opens and points.
Alt-Az vs Equatorial mode
The Seestar is natively alt-azimuth. Equatorial tracking without field rotation requires an equatorial wedge accessory, or mounting on an external equatorial mount. The Alpaca spec also forbids direct Alt/Az slewing (CanSlewAltAz = False) — every command must go through RA/Dec, converted via astropy as shown above when needed.
Known limitations
- No direct Alt/Az slew (Alpaca spec constraint)
- Filter wheel /
Unparkmay need a manual reconnect depending on firmware version - The
indi-seestarproject is still young (Seestar-specific drivers are alpha quality) — check the GitHub issues before updating firmware