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.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

amsky-1.0.0.tar.gz (52.0 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

amsky-1.0.0-py3-none-any.whl (42.1 kB view details)

Uploaded Python 3

File details

Details for the file amsky-1.0.0.tar.gz.

File metadata

  • Download URL: amsky-1.0.0.tar.gz
  • Upload date:
  • Size: 52.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for amsky-1.0.0.tar.gz
Algorithm Hash digest
SHA256 a0bd1a9271eb9bf6416f97433f136484d4d021412160b20d445c5a6a091bace5
MD5 3cd57c39823c26c905dfc51dcba2a2ee
BLAKE2b-256 f40ec927f9138b5bcc11581c80964919620acd1454a5f21c30cd9f3a90b2b236

See more details on using hashes here.

Provenance

The following attestation bundles were made for amsky-1.0.0.tar.gz:

Publisher: publish-to-pypi.yml on roman-dvorak/AMSKY02

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file amsky-1.0.0-py3-none-any.whl.

File metadata

  • Download URL: amsky-1.0.0-py3-none-any.whl
  • Upload date:
  • Size: 42.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for amsky-1.0.0-py3-none-any.whl
Algorithm Hash digest
SHA256 56cb065056ef463ce2efa287aa722fcb6fe8e513e55d5f28b37af97eca6b71d0
MD5 92766fbe49b84e6a0d9303aa7551d1d9
BLAKE2b-256 1eb9f6ae7f62e036a914595d4d11659e62f80a78b804bf7c920837bbb2e357a2

See more details on using hashes here.

Provenance

The following attestation bundles were made for amsky-1.0.0-py3-none-any.whl:

Publisher: publish-to-pypi.yml on roman-dvorak/AMSKY02

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.
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