Skip to content

Latest commit

 

History

History
296 lines (223 loc) · 13.3 KB

File metadata and controls

296 lines (223 loc) · 13.3 KB

Aurora Chaser

An Axis camera that knows where to look — and when not to bother.

Aurora Chaser reads the NOAA space-weather nowcast every few minutes, works out which part of the sky is actually worth photographing from your camera's position, and turns the lens there. Then it checks the sun, the cloud and the moon — and stands down when the answer is no.

Standalone ACAP for AXIS OS 12. No CamScripter dependency, no account, no API key.

65,160 grid cells evaluated per scan
~30 min forecast lead time
1,687 km detection reach
4 gates, multiplied
0 API keys required

The problem

Aurora apps tell you something is happening. They don't point a camera at it.

A geomagnetic index is not a photograph. Between "Kp is 6" and a usable frame sit three questions no space-weather feed answers: is it dark where the camera is, is the sky clear in that direction, and is the arc high enough above the horizon to fill a frame at all. Aurora Chaser answers all four, then acts on the answer.

Three things that make it unusual

It aims. Not an alert — a PTZ movement. The app ranks every visible cell of the auroral oval, clusters them into arcs, and drives the camera to the brightest one via presets, CamSwitcher views, or absolute pan/tilt. Tilt is calculated, not configured: the apparent elevation of a curtain follows from its distance.

It knows when not to. Four conditions multiply. Any one at zero zeroes the result — a 90% aurora forecast at noon scores exactly nothing, and the app says so rather than swinging a camera at a sunlit sky. When it stands down it names the reason: activity, darkness, cloud or moonlight.

It sees red aurora. Most models track the green curtain at 110 km. Aurora Chaser evaluates the red 630 nm layer at 230 km too, which clears the horizon from 500 km further away. That is the difference between detecting a mid-latitude storm and reporting an empty sky.


How it decides

activity × darkness × clear sky × moonlight = score

A storm is one condition — convection is there or it is not. An aurora you can actually photograph is a conjunction, and three parts of it have nothing to do with space weather. Multiplying is the honest model: it makes a perfect forecast under overcast worth zero, exactly as it is in reality.

The multiplicative form pays for itself twice. It cannot produce a confident-looking score from a single strong input, and because one factor is always the smallest, the app gets a free diagnostic — the limiting factor — which is what the interface shows instead of a bare "quiet".

Gate Source Behaviour
Activity OVATION grid, boosted by solar wind and ground magnetometers Probability of visible aurora at each cell, weighted by how high it sits
Darkness Solar elevation, computed locally Hard gate. Zero above −6°, full below −15°, linear ramp between
Clear sky Open-Meteo cloud cover Sampled at the camera and along each candidate sightline; the worse wins
Moonlight Lunar phase + altitude, computed locally Soft penalty, up to 40% at full moon near the zenith

The darkness gate

The camera waits for the sun to drop below −6°.

Civil twilight ends at a solar elevation of −6°. Above that, no aurora is visible at any strength, so the app scores zero and — importantly — short-circuits before making a single network request. There is no reason to pull a 900 KB grid at two in the afternoon.

Below −6° the gate opens gradually rather than snapping on, because twilight genuinely fades the aurora in. Full credit arrives at −15°, close to astronomical darkness. Both thresholds are configurable; a bright display punches through earlier, which is what the −6° start allows for.

Sun elevation Darkness factor
0% daylight — no fetch made
−3° 0% civil twilight
−6° 0% gate opens
−8° 22% brightest arcs only
−10.5° 50% nautical twilight
−13° 78%
−15° 100% full darkness

Polar day is handled properly. Above the Arctic Circle in summer the sun never sets. Rather than reporting a permanent "quiet", the app searches forward 36 hours, finds no crossing, and states plainly: no darkness in the next 36 h. A camera in Tromsø reports the midnight sun instead of pretending.

Moonlight, for context. A full moon 60° up keeps 60% of the score; the same moon below the horizon costs nothing; a new moon overhead costs nothing. Phase and altitude are both accounted for.

Around the September equinox the gate is open for roughly 9.6 hours at Tromsø and 10.8 hours at Prague — Prague, being lower latitude, gets the longer true-dark window at that date.


Why the search radius is 1,200 km

Aurora is not on the ground — so Earth's curvature sets the reach.

A storm-chasing camera samples 80 km around itself, because storms sit on the surface. Aurora sits 100–400 km up, which means a curtain far beyond the visible landscape is still well above the horizon. Two emission layers matter, and they behave very differently.

Band Wavelength Altitude Horizon Character
Green 557.7 nm oxygen ~110 km 1,175 km Structured curtain — rays, folds, visible motion
Red 630 nm oxygen 200–400 km 1,687 km Diffuse top; fainter, slower, often the only thing visible from mid latitudes

Apparent elevation by distance

Ground distance Green 110 km Red 230 km What you'd frame
100 km 47.0° 65.7° overhead — wide lens, look up
300 km 18.6° 35.6° high arc, clean foreground
600 km 7.6° 17.9° classic horizon arc
1000 km 1.7° 8.2° low glow, needs a clear horizon
1200 km below horizon 5.2° RED — mid-latitude storm signature
1600 km below horizon 0.8° extreme range, red only

Elevation angles account for Earth curvature and are computed by the app for every candidate cell; the same value drives PTZ tilt.

This is why mid-latitude cameras work at all. During the May 2024 G5 storm, observers in Bohemia at 50°N photographed red aurora whose base sat over the Baltic — they were seeing the top of a curtain hundreds of kilometres away. A model evaluating only the 110 km layer discards those cells as "below horizon" and reports nothing, on precisely the nights that matter most south of 60°N. Aurora Chaser evaluates both layers, keeps whichever clears the horizon, and labels which one you are looking at.


Data sources

All free, all public, no API key required.

Source What it provides Cadence Role
NOAA SWPC OVATION
services.swpc.noaa.gov/json/ovation_aurora_latest.json
Global 1°×1° grid of visible-aurora probability — 65,160 cells, both hemispheres ~5 min, ~30 min ahead The aiming source. Arrives pre-sampled, so one fetch covers the planet
Planetary Kp
.../products/noaa-planetary-k-index-forecast.json
3-hourly geomagnetic index plus a 3-day forecast 3 h Planning, and the fallback target
Real-time solar wind
.../json/rtsw/rtsw_mag_1m.json
Interplanetary field Bz/Bt, speed and density, measured at L1 by IMAP (ACE backup) 1 min 30–60 minutes of genuine early warning
Open-Meteo Cloud cover — total, low, mid, high — at the camera and along each sightline per scan The gate that decides whether any of the above matters
AuroraWatch UK (Lancaster University) Ground magnetometer status — green / yellow / amber / red 3 min Optional corroboration. Has no direction, so it never aims
Sun & Moon Solar elevation, lunar phase and altitude instant Computed on the camera. No network, no dependency, no failure mode

Why Bz matters more than Kp

Kp is a three-hour average, published after the fact — an app watching only Kp is always reporting the past. Bz is measured 1.5 million km upstream at the L1 point, which is roughly how long the plasma takes to reach us. A strongly southward Bz couples the solar wind to Earth's field and the oval expands within the hour; a northward Bz can sit on a 700 km/s stream and produce nothing at all.

Aurora Chaser uses Bz as a surge multiplier on top of the grid, precisely because the grid is already 30 minutes old when you read it.

Solar wind Surge boost
Bz +2 nT, 700 km/s 0.00 — fast but northward
Bz −5 nT, 450 km/s 0.23
Bz −10 nT, 550 km/s 0.52
Bz −15 nT, 650 km/s 0.86
Bz −25 nT, 800 km/s 1.00 — severe

How far south the oval reaches

Kp Equatorward boundary Roughly
3 60.4° Oslo, Helsinki
5 56.3° Edinburgh, Moscow
7 52.2° Amsterdam, Warsaw
8 50.1° Prague, Kraków
9 48.1° Munich, Vienna

Corrected geomagnetic latitude. Cities are indicative — geomagnetic and geographic latitude differ, and red aurora is visible from well south of the boundary.


What the operator sees

The gate panel — four live bars (activity, darkness, clear sky, moonlight) with the limiting one highlighted. It answers the question the app gets asked most: it says quiet, why?

The map — every visible cell plotted in its band colour, sized by score. Cells below the horizon are never drawn; they are physically invisible, however bright the oval looks on a flat map. Click one to lock the camera to it.

Burned-in overlay — fifteen fields to CamOverlay Custom Graphics or InfoTicker: band, bearing, probability, elevation, Kp, Bz, cloud, moon and more, live on the video.

A real status line:

RED 62% · NNW 348° · 8° up · 65% cloud · Bz −9.4

Red band means the 630 nm top only — a low northern glow, not a structured curtain. Eight degrees up means a clear horizon matters. That one line tells a photographer what lens and what exposure before they leave the building.


Reliability

Degrades toward still-useful, never toward silently wrong. Unattended cameras fail at 3 a.m. with nobody watching, so every failure path was chosen deliberately.

Situation Behaviour Reasoning
OVATION unreachable, cache under 45 min Serve the cached grid A 20-minute-old real oval beats a synthetic guess
OVATION unreachable, cold cache, Kp high Synthesise a poleward target on the modelled oval boundary Crude, but better than parking during a G3
Cloud API down The gate opens Refusing to chase because a weather API is down is the wrong failure
AuroraWatch reports green No penalty, ever The station may be far away — absence of evidence is not evidence of absence
Polar day Reports "no darkness in 36 h" Honest, and distinguishable from "nothing happening"
Daylight Short-circuits before any network call Costs nothing to be right early
Camera command fails Logged and swallowed; scanning continues One bad PTZ call must not stop the loop

Specifications

Platform

Package Standalone ACAP .eap — no CamScripter dependency
AXIS OS 12.10 – 13 (manifest schema 2.0)
Architecture aarch64 (ARTPEC-8/9) · armv7hf (ARTPEC-7)
Runtime Node.js 20, bundled — AXIS OS ships none
Dependencies None at runtime. Pure Node standard library
Package size ~30 MB, dominated by the Node binary

Behaviour

Aiming modes PTZ presets · CamSwitcher views · absolute pan/tilt/zoom
Search radius 1,200 km default, clamped to the horizon
Scan interval 5 min — matches OVATION regeneration
Anti-jitter 15° arc clustering, 12° hysteresis, 3 min dwell
Coverage 180° arc centred on north by default
Overlay CamOverlay Custom Graphics + InfoTicker, 15 fields
Access Local LAN or CamStreamer Cloud (device-connect.net)

Why clustering matters. The OVATION grid is noisy at single-cell level. Without merging cells into arcs, the chosen bearing jitters 10–20° between scans and the camera spends the night chasing statistical noise. Aurora Chaser merges by circular mean within 15° buckets before ranking — averaging 355° and 5° naively gives 180°, which points the camera at the ground.


Getting started

  1. Install — camera UI → System → Apps → Add app → upload the .eap matching your chip.
  2. Set the location — latitude and longitude of the camera. This is the origin for every bearing, distance and elevation, so precision matters more than in any storm app: latitude decides whether the oval is overhead, on the horizon, or out of reach.
  3. Assign presets or views — give each the compass bearing it faces. The app does the rest.

Settings UI at http://<camera>/local/aurora_chaser/.


Aurora Chaser v1.0.1 — standalone ACAP for AXIS OS 12. Built on the Storm Chaser platform, sharing its VAPIX, CamSwitcher and CamOverlay integration.

NOAA SWPC data is public domain. Open-Meteo's free tier is non-commercial — set an API key for commercial deployments. AuroraWatch UK data © Lancaster University; see their API terms. Aurora emission altitudes and the Kp oval-boundary table follow standard published values; all figures in this document are computed by the shipping code.