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

RoleDriver
MountAlpaca Telescope
CameraSeestar CCD (+ Seestar CCD Wide)
Filter WheelAlpaca FilterWheel
FocuserAlpaca 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:

TelephotoWide-angle
Aperture30 mm3.4 mm
Focal Length160 mm6 mm
Focal RatioF/5.3F/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 / Unpark may need a manual reconnect depending on firmware version
  • The indi-seestar project is still young (Seestar-specific drivers are alpha quality) — check the GitHub issues before updating firmware

References

comments powered by Disqus

Translations: