Skip to main content

AMSKY — Host software for AstroMeters sky quality & cloud sensors

AstroMeters Logo

Python host-side tools for the AstroMeters AMSKY all-sky sensors: a real-time GUI viewer, a headless logger, a terminal UI client, and a log plotting tool.

This release supports the AMSKY02 protocol.

The sensor combines two measurements that matter to astronomers and observatories:

  • Sky Quality Meter (SQM) — sky brightness in mag/arcsec², for light pollution assessment
  • Cloud detection — thermal IR sky temperature, for fast and reliable cloud coverage detection

The device streams CSV-style lines over USB CDC serial (115200 baud) or RS485. This package parses that stream, visualises it, serves it over HTTP, and archives it to HDF5 or CSV.

Using the older AMSKY01? Its protocol differs (no sensor/channel index, 16×12 thermal map) and is not handled by this release. Install amsky01 instead.


Installation

pip install amsky

This pulls in PySide6, pyqtgraph, numpy, pandas, matplotlib, h5py, pyserial and psutil.

If you only need headless logging on a small machine (e.g. a Raspberry Pi in an observatory), install into a virtual environment — the Qt dependency is large, but the viewer runs fine with --headless and no display attached.

Serial port permissions (Linux)

Your user needs access to the serial device. On most distributions:

sudo usermod -aG dialout $USER   # log out and back in

Command-line tools

Installing the package provides three commands.

amsky-viewer — real-time GUI viewer

The main application. Shows a live thermal map, sky quality, environmental data and per-channel light readings, with optional HDF5 logging and an HTTP JSON API.

# Live view from a connected sensor
amsky-viewer --port /dev/ttyACM0

# Live view with HDF5 logging and the HTTP API enabled
amsky-viewer --port /dev/ttyACM0 --log --api

# Replay a recorded HDF5 session at 4x speed
amsky-viewer --replay session.h5 --replay-speed 4

# Headless logging on a machine with no display
amsky-viewer --port /dev/ttyACM0 --headless --log --verbose
Option Description
--port PORT Serial port, e.g. /dev/ttyACM0
--baud BAUD Baud rate (default 115200)
--replay FILE Replay a recorded HDF5 log instead of reading a port
--replay-speed N Replay speed multiplier (default 1.0)
--vmin / --vmax Temperature limits for the thermal colour scale
--rotation DEG Rotate the thermal image
--log Enable HDF5 logging at startup
--log-name ID Device ID used in HDF5 filenames
--log-path PATH Directory for HDF5 files
--api Enable the HTTP JSON API at startup
--sqm-zp VALUE SQM calibration zero point (default 24.0)
--headless, --no-gui Run without a GUI — parse and log only
--verbose, -v Print received values to stdout
--stats-interval S Status summary interval in headless mode
--debug Show every message received on the serial line

amsky-cli — terminal client

A curses-based terminal UI with automatic CSV logging and rotation. Also usable over TCP instead of a serial port, which is handy when the sensor is exposed by a serial-to-network bridge.

amsky-cli --list-ports                    # discover connected devices
amsky-cli --port /dev/ttyACM0 --log       # TUI with CSV logging
amsky-cli --tcp 4001 --host observatory   # read from a network bridge
amsky-cli --port /dev/ttyACM0 --no-tui    # plain line output, good for pipes

amsky-plot — plot recorded CSV logs

amsky-plot data.csv                            # write amsky_plots.png
amsky-plot --interactive data.csv              # interactive window
amsky-plot -i -r 30 -o myplot.png data.csv     # interactive, refresh every 30 s
amsky-plot file1.csv file2.csv                 # combine several logs

Hardware

Thermal 2× MLX90642, 32×24 pixels
Light / SQM 2× TSL2591 behind a PCA9543A I²C multiplexer
Environment SHT4x — temperature, humidity, dew point
Interfaces USB-C (CDC serial) and RS485

The two TSL2591 channels are shown and logged separately as LIGHT0 and LIGHT1, and the two thermal sensors are displayed side by side as a single combined map.


Serial protocol

All data lines start with $. Lines starting with # are human-readable comments and should be ignored by parsers.

$HELLO,<model>,<serial>,<fw_version>,<git_hash>,<git_branch>
$light,<channel>,<lux>,<full_raw>,<ir_raw>,<gain>,<int_time>,<sqm>
$cloud,<sensor_id>,<tl>,<tr>,<bl>,<br>,<center>
$cloud_meta,<sensor_id>,<vdd>,<ta>
$hygro,<temperature>,<humidity>,<dew_point>
$thrmap,<sensor_id>,<pixel0>,...,<pixel767>

Notes:

  • $light carries a leading channel number (0 or 1) identifying which TSL2591 behind the I²C mux produced the reading.
  • $cloud and $cloud_meta carry a leading sensor_id selecting one of the two MLX90642 thermal sensors.
  • $cloud gives the four corner temperatures and the centre sky temperature in °C.
  • $thrmap is the full 32×24 thermal map — 768 values, enabled with the thrmap_on serial command.
  • $hygro is the only message with no index field.

Device configuration is stored in EEPROM and survives power cycles. See the protocol documentation for the full command set, including SQM calibration and the hardware alert output.


HDF5 logging

With --log, the viewer writes a self-describing HDF5 file containing resizable, timestamped datasets grouped per subsystem:

/sky<N>/       thermal map frames, timestamps, sensor temperature
/cloud<N>/     corner and centre temperatures
/light<C>/     full-spectrum, IR, gain, integration time per channel
/hygro/        temperature, humidity

Files are named from --log-name and the session start time, and can be replayed later with --replay.


HTTP JSON API

With --api, the viewer serves the most recent readings as JSON:

curl http://localhost:8080/data.json

Port 8080 is the default; it is configurable in the viewer's settings panel and is remembered between runs.

This makes it straightforward to feed an observatory dashboard, a weather-safety watchdog, or a home automation system without parsing the serial stream yourself.


Using the parsers from your own code

The modules are importable, so you can reuse the protocol parsing directly:

from amsky_viewer import parse_light, parse_cloud

channel, lux, full_raw, ir_raw, gain, itime, sqm = parse_light(
    "$light,0,12.34,1000,200,1,100,21.50"
)
sensor_id, tl, tr, bl, br, center = parse_cloud(
    "$cloud,1,-20.1,-20.2,-20.3,-20.4,-21.0"
)

Each parser returns None for a line it does not recognise or cannot parse, so they are safe to apply to a raw serial stream.


Author

Roman Dvořák, AstroMeters — info@astrometers.eu

To purchase AMSKY02, or for integration support, get in touch at info@astrometers.eu.

License

MIT — see LICENSE.

Metadata

Release files for amsky 1.0.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for amsky 1.0.0
File Size Uploaded Provenance
amsky-1.0.0.tar.gz 52.0 kB With provenance Details

Built distribution (wheel)

Table of built distributions (wheels) for amsky 1.0.0
File Interpreter ABI Platform
amsky-1.0.0-py3-none-any.whl Python 3 none any Details

Total release size: 94.1 kB

Release files / amsky-1.0.0.tar.gz

Download URL amsky-1.0.0.tar.gz
Size 52.0 kB
Tags Source
SHA-256 checksum
How to use checksums
a0bd1a9271eb9bf6416f97433f136484d4d021412160b20d445c5a6a091bace5
BLAKE2b-256 checksum
How to use checksums
f40ec927f9138b5bcc11581c80964919620acd1454a5f21c30cd9f3a90b2b236
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Aug 9, 2026.

Transparency log

Release files / amsky-1.0.0-py3-none-any.whl

Download URL amsky-1.0.0-py3-none-any.whl
Size 42.1 kB
Tags Python 3
SHA-256 checksum
How to use checksums
56cb065056ef463ce2efa287aa722fcb6fe8e513e55d5f28b37af97eca6b71d0
BLAKE2b-256 checksum
How to use checksums
1eb9f6ae7f62e036a914595d4d11659e62f80a78b804bf7c920837bbb2e357a2
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Aug 9, 2026.

Transparency log

Security for amsky 1.0.0

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

Full provenance

All 2 files in this release have been uploaded with provenance metadata.

Select from 2 files

Attestation for amsky-1.0.0.tar.gz

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Aug 9, 2026.

Transparency log

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page