Metadata-Version: 2.4
Name: sensorkit
Version: 2.0.0b1
Summary: Autonomous observatory control for space domain awareness and time-domain astronomy: hardware drivers, satellite tracking, scheduling, and safety automation, distributed over NATS.
Project-URL: Homepage, https://github.com/sensorkit/sensorkit
Project-URL: Repository, https://github.com/sensorkit/sensorkit
Project-URL: Issues, https://github.com/sensorkit/sensorkit/issues
Author-email: Erik Small <erik.small@ensc.dev>, Ryan Swindle <ryanswindle@odysseyconsult.com>, David Zeleniak <david.zeleniak@e-o.solutions>
License-Expression: Apache-2.0
License-File: LICENSE
License-File: NOTICE
Keywords: alpaca,ascom,astronomy,automation,nats,observatory,satellite-tracking,space-domain-awareness,telescope
Classifier: Development Status :: 4 - Beta
Classifier: Framework :: AsyncIO
Classifier: Intended Audience :: Science/Research
Classifier: Operating System :: OS Independent
Classifier: Programming Language :: Python :: 3 :: Only
Classifier: Programming Language :: Python :: 3.13
Classifier: Topic :: Scientific/Engineering :: Astronomy
Requires-Python: >=3.13
Requires-Dist: aiofile>=3.9.0
Requires-Dist: astropy>=7.1.0
Requires-Dist: asyncclick==8.1.8
Requires-Dist: fastapi>=0.115.12
Requires-Dist: intervaltree>=3.1.0
Requires-Dist: loguru~=0.7
Requires-Dist: nats-py==2.14
Requires-Dist: pillow>=12.0.0
Requires-Dist: pydantic~=2.11
Requires-Dist: python-dateutil>=2.9.0.post0
Requires-Dist: python-dotenv>=1.2.2
Requires-Dist: pyyaml>=6.0.3
Requires-Dist: rich>=14.0.0
Requires-Dist: satkit>=0.8.3
Requires-Dist: scipy>=1.16.3
Requires-Dist: skyfield>=1.53
Requires-Dist: tzdata>=2025.2
Requires-Dist: uuid-utils>=0.11.0
Requires-Dist: uvicorn>=0.34.0
Requires-Dist: watchdog>=6.0.0
Provides-Extra: alpaca
Requires-Dist: alpyca>=3.1.1; extra == 'alpaca'
Requires-Dist: numpy>=1.24.0; extra == 'alpaca'
Provides-Extra: burr
Requires-Dist: astro-burr; extra == 'burr'
Provides-Extra: filesys
Provides-Extra: indigo
Requires-Dist: websockets>=14.0; extra == 'indigo'
Provides-Extra: nina
Requires-Dist: httpx; extra == 'nina'
Provides-Extra: node-platform
Requires-Dist: ourskyai-node-platform-api>=1.4.61; extra == 'node-platform'
Provides-Extra: otto
Requires-Dist: dropbox; extra == 'otto'
Requires-Dist: google-api-python-client; extra == 'otto'
Requires-Dist: google-auth; extra == 'otto'
Requires-Dist: google-auth-oauthlib; extra == 'otto'
Requires-Dist: udl-sdk; extra == 'otto'
Provides-Extra: pwi4
Requires-Dist: httpx; extra == 'pwi4'
Provides-Extra: sdasim
Requires-Dist: numpy>=1.24.0; extra == 'sdasim'
Requires-Dist: sdasim; extra == 'sdasim'
Provides-Extra: senpai
Requires-Dist: astro-senpai>=2.3.1; extra == 'senpai'
Provides-Extra: sky-transmission
Requires-Dist: allclear; extra == 'sky-transmission'
Requires-Dist: alpyca>=3.1.0; extra == 'sky-transmission'
Requires-Dist: imageio[pyav]; extra == 'sky-transmission'
Requires-Dist: matplotlib; extra == 'sky-transmission'
Provides-Extra: slack
Requires-Dist: aiohttp; extra == 'slack'
Requires-Dist: slack-sdk; extra == 'slack'
Provides-Extra: systemd
Requires-Dist: systemd-python==235; (sys_platform == 'linux') and extra == 'systemd'
Provides-Extra: thesky
Provides-Extra: thesky-simulator
Requires-Dist: dukpy>=0.5.0; extra == 'thesky-simulator'
Provides-Extra: udl
Requires-Dist: httpx; extra == 'udl'
Requires-Dist: udl-sdk; extra == 'udl'
Provides-Extra: webapi
Description-Content-Type: text/markdown

# SensorKit

**An open-source control system for autonomous observatories**, built for space domain awareness and time-domain astronomy. SensorKit connects your telescope hardware to an automation layer that decides — continuously and safely — when to open the dome, what to observe, and when to shut down, whether that's for a passing satellite, a transient follow-up, or an ordinary night of survey work.

You describe your site in a single YAML file: which mount, camera, and dome you have, what weather limits you trust, and which observing programs are allowed to request time. SensorKit runs the night.

## Highlights

- **Autonomous operation.** An agent service evaluates operating modes, weather and safety constraints, and program schedules — then starts up, tasks, and shuts down each sensor on its own. A single command hands control back to a human.
- **Speaks your hardware's language.** Drivers for ASCOM Alpaca, PlaneWave PWI4, and Software Bisque TheSky are included, with additional modules for INDIGO, NINA, and the Observable Space Node Platform.
- **Satellite tracking as a first-class citizen.** Targets can be fixed alt/az or ICRS positions, TLEs, state vectors, or precomputed ephemerides. SensorKit propagates orbits and drives mounts in rate-tracking modes for fast-moving objects.
- **Observing programs in a few dozen lines of Python.** A program advertises *when* it has work and produces the *next task* when asked. Scheduling, priorities, device sequencing, and FITS writing are handled for you.
- **Configuration-defined data flow.** Camera frames move through a pipeline you declare in YAML: FITS headers populated from live telescope state, compression, disk, or hand-off to analysis services.
- **Built to be pulled apart.** Every device driver, sensor controller, program, and the agent itself is an independent service communicating over [NATS JetStream](https://nats.io) — run them on different machines, restart them independently, swap them freely.

Batteries included: **Otto** (standalone satellite observation scheduling) and **UDL** (Unified Data Library tasking) observing programs, plus analysis modules for astrometry and photometry (**SENPAI**) and all-sky transmission. [SensorView](https://github.com/sensorkit/sensorview) is the graphical interface to a running system.

## Quick start

The repository ships a complete simulated observatory — mount, camera, dome, and weather simulators with the full automation stack on top. No hardware, just Docker:

```bash
git clone <repo-url>
cd sensorkit/deploy/simulated
docker compose up --build
```

Open [http://localhost:6080](http://localhost:6080) to watch the simulated mount slew to targets. The [quick start guide](docs/quickstart.md) walks through the rest: exploring the system with the CLI, connecting SensorView, and reading the 35-line observing program that drives it.

## Installation

```bash
pip install sensorkit
```

Hardware and feature support ships as optional extras — install only what your site uses:

```bash
pip install "sensorkit[alpaca,pwi4]"
```

SensorKit requires Python 3.13+ and a NATS server with JetStream enabled:

```bash
docker run -d --name nats -p 4222:4222 nats:alpine -js
export NATS_URL=nats://localhost:4222
```

See [Installation](docs/installation.md) for the full list of extras and how to go from an empty config to running services.

## Documentation

Full documentation lives in [`docs/`](docs/index.md) — quick start, installation, configuration, guides for devices, sensors, programs, and the agent, plus CLI and API references. To build and serve it locally:

```bash
uv run zensical serve
```

## Development

**Requirements:** Python 3.13+, [uv](https://docs.astral.sh/uv/)

```bash
git clone <repo-url>
cd sensorkit
uv sync --all-extras

# Run the test suite
uv run pytest core/tests

# Run tests against a live NATS server (requires Docker)
SK_TEST_BACKEND=nats ENV=local uv run pytest core/tests

# Lint and check import-layer contracts
uv run ruff check core modules
uv run lint-imports
```

To run the stack natively against the containerized simulators during development, see [Trying it against simulators](docs/installation.md#trying-it-against-simulators).

## Status

SensorKit is in **beta** and under active development. It runs real telescopes nightly, but APIs and configuration formats are still evolving, and some corners are unfinished. Feedback and issues are very welcome.

## Contributing

Contribution guidelines, PR process, and coding standards are still being documented. In the meantime, please open an issue before starting work on a significant change.

## License

Licensed under the [Apache License 2.0](LICENSE).
