A full-stack, distributed, real-time platform for collecting, streaming, and intelligently analysing optical seeing and space weather telemetry β from an Arduino sensor, through an Apache Kafka event bus, to a React dashboard.
Aetheris AI is an enterprise-grade, distributed IoT intelligence platform built for the collection and real-time analysis of optical atmospheric seeing and space weather data. The system bridges a physical Arduino-based sensor array and a cloud backend, enabling astronomers, observatories, and researchers to monitor ionospheric scintillation, ambient conditions, and hardware health from any browser β in real time.
The platform is designed around three independently deployable modules:
| Module | Technology | Role |
|---|---|---|
aetheris-edge |
Spring Boot 4 + JavaFX 17 + Apache Kafka | Edge agent β reads Arduino sensor data over USB/Serial, streams to Kafka |
aetheris-ai |
Spring Boot 4 + Spring Security + WebSocket + PostgreSQL | Cloud backend β consumes Kafka events, persists data, exposes REST & WebSocket APIs |
aetheris-dashboard |
React 19 + TypeScript 6 + Vite 8 + Recharts | Web frontend β real-time telemetry visualisation, anomaly feed, configurable alerting |
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β HARDWARE LAYER β
β Arduino Sensor Array ββ(USB/Serial Β· jSerialComm)βββΆ aetheris-edge β
β Measurements: Seeing (arcsec) Β· Input Voltage (V) Β· Temperature (Β°C) β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β
Kafka Producer Β· SensorPayloadDTO Β· spring-kafka
β
βΌ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β APACHE KAFKA EVENT BUS β
β Topic: "sensor-data" β
β (Zookeeper + Kafka Broker on port 9092) β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β
Kafka Consumer Β· @KafkaListener
β
βΌ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β CLOUD BACKEND (aetheris-ai) β
β Spring Boot 4.1 Β· Spring Security (JWT/Stateless) Β· Spring WebSocket β
β JPA/Hibernate Β· PostgreSQL 15 Β· BCrypt Β· CORS-configured β
β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β AI INTELLIGENCE ENGINE β β
β β β LSTM / TFT Forecasting β Seeing prediction 5β30 min ahead β β
β β β‘ Isolation Forest / Autoencoder β Scintillation classifier β β
β β β’ LLM RAG Agent β NL telemetry queries + NOAA/NASA fusion β β
β β (ONNX Runtime Β· Vector DB Β· Function Calling) β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β Domains: admin Β· alerting Β· forecasting Β· telemetry β
β Layers: presentation Β· application Β· domain Β· infrastructure β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β
WebSocket (STOMP) Β· REST API (/api/v1/) Β· LLM Chat Endpoint
β
βΌ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β WEB FRONTEND (aetheris-dashboard) β
β React 19 Β· TypeScript 6 Β· Vite 8 Β· TailwindCSS 4 Β· Framer Motion 13 β
β Recharts Β· Axios Β· React Router v7 Β· Lucide Icons β
β β
β Pages: Home (landing) Β· Dashboard (live telemetry Β· anomalies Β· alerts)β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
- Real-time Arduino Ingestion β Async serial port connection via
jSerialCommwithCompletableFuture-based non-blocking port management and automatic IO buffer flushing - Apache Kafka Producer β Streams structured
SensorPayloadDTOJSON events to thesensor-datatopic at 1 Hz usingKafkaTemplate<String, SensorPayloadDTO> - JavaFX Desktop Agent β Native desktop UI with live gauge display for Seeing (arcsec), Input Voltage (V), and Ambient Temperature (Β°C)
- Resilient Reading Thread β Daemon thread with graceful disconnect detection, stale-byte flushing, and reconnect event signalling via JavaFX
Platform.runLater() - Internet Connectivity Monitoring β
ConnectivityServicemonitors outbound network health of the edge device - Open Weather Integration β
WeatherServicefetches ambient meteorological data to correlate with optical seeing conditions
- Clean Layered Architecture β Strict separation across
presentation,application,domain, andinfrastructurelayers following Domain-Driven Design principles - JWT Stateless Authentication β Spring Security 6 with
jjwt0.11.5, BCrypt password hashing, and role-based access control (ROLE_ADMIN) - Domain-Driven Design β Bounded contexts for
admin,alerting,forecasting, andtelemetry - Admin Lifecycle Management β Full registration β login β IP capture flow with a
UserStatusstate machine (PENDING β ACTIVE β BANNED) - WebSocket Real-time Broadcast β STOMP WebSocket pushes live sensor events from Kafka consumer to all connected dashboard clients
- PostgreSQL Persistence β JPA/Hibernate with UUID primary keys,
LocalDateTimeaudit fields, and@Enumeratedstatus columns - Stateless REST API β Versioned at
/api/v1/with CORS pre-configured for the Vite dev server
- Live Telemetry Charts β Real-time Recharts visualisation for Seeing (arcsec), Input Voltage (V), and Ambient Temperature (Β°C) with configurable critical/warning threshold lines
- Animated Anomaly Feed β Framer Motion-powered event log classifying hardware noise spikes, ionospheric scintillation bursts (S4 index), cloud cover events, and system stabilisation
- Configurable Alerting β User-adjustable critical/warning thresholds; independent toggles for email and in-dashboard notifications
- Historical Archive Table β Session-level event archive with one-click CSV download
- Protected Routing β
ProtectedRoutecomponent with JWT-awareaxiosinterceptors for authenticated navigation - Particle Background β Canvas-based animated particle field for a premium observatory aesthetic
- Dark / Light Mode β Full theme toggle with React context propagation throughout the layout
Aetheris AI is not a passive monitoring tool. Its cloud backend embeds three AI sub-systems that transform raw hardware telemetry into operational foresight.
Replace static threshold alerts with a multi-horizon time-series forecasting model.
| Attribute | Detail |
|---|---|
| Models | LSTM Β· Temporal Fusion Transformer (TFT) Β· XGBoost ensemble |
| Runtime | ONNX Runtime embedded in Java β zero Python dependency in production |
| Inputs | Voltage time-series Β· Seeing index Β· Temperature gradient Β· Solar zenith angle |
| Horizon | 5-minute, 15-minute, and 30-minute rolling predictions |
| Output | Probabilistic seeing forecast + confidence interval bands on dashboard |
| Operational Impact | Allows ground stations to pre-adjust adaptive optics, scale laser transmission power, or reroute satellite downlinks before atmospheric fading occurs |
Unsupervised ML running directly on the live Kafka data stream.
| Attribute | Detail |
|---|---|
| Models | Isolation Forest Β· Autoencoder (reconstruction error threshold) |
| Classification Labels | IONOSPHERIC_SCINTILLATION Β· HARDWARE_NOISE_SPIKE Β· CLOUD_ATTENUATION Β· THERMAL_DISTURBANCE Β· WIND_SHAKE |
| Key Signal | Differentiates genuine optical scintillation (S4 index rise) from hardware or environmental noise |
| Operational Impact | Eliminates false alarms and ensures clean, standardised data flows into long-term research archives |
Natural language interface fusing logged telemetry with live space weather feeds.
| Attribute | Detail |
|---|---|
| Architecture | Retrieval-Augmented Generation (RAG) with Function Calling |
| Data Sources | PostgreSQL telemetry archive Β· NOAA solar flare feeds Β· NASA geomagnetic index APIs |
| Storage | Vector Database for semantic telemetry search |
| Example Query | "Analyse optical stability during today's 14:00 satellite pass and flag any scintillation anomalies correlated with solar activity." |
| Output | The agent executes DB queries, synthesises space weather data, and generates executive diagnostic reports automatically |
π¬ Telemetry Intelligence β Hidden Physics in Raw Data
The three hardware channels (Input Voltage, Seeing arcsec, Temperature) are far more than simple gauges. The AI engine extracts the following derived science from them.
The analog voltage is a direct proxy for the amount of sunlight hitting the photodiode. By analyzing how this voltage behaves over time, you can extract:
-
Cloud Cover & Transparency Transients: Detect rapid absolute voltage drops unrelated to micro-fluctuations. Classify events as
Cirrus Cloud PassageorHeavy Obscurationrather than bad seeing. -
Turbulence Frequency Spectrum: Fast Fourier Transform (FFT) on the high-frequency voltage stream. High-frequency noise β fast high-altitude jet streams; Low-frequency β slow low-altitude thermal mixing.
-
Signal-to-Noise Ratio (SNR): Logarithmic
$\text{SNR}_{\text{dB}} = 20 \log_{10} \left( \frac{\mu}{\sigma} \right)$ over a rolling window(N) = (N)Hz x (N)sec. Critical metric for optical satellite laser downlinks to determine if a signal can be locked.
The seeing index measures the angular resolution limit caused by the atmosphere. It is the primary metric for astronomers, but it can be mathematically converted into deeper optical parameters:
- Fried Parameter (rβ): This is the most crucial metric for Adaptive Optics (AO) systems. It represents the diameter of a telescope over which the optical phase distortion is roughly 1 radian. You can derive it directly from the
seeing angle (π)at a specificwavelength (π, Variable Input)using the relationship:
-
Worked Example (Seeing = 5.4 arcseconds)
-
$\lambda$ (500 nm):$5 \times 10^{-7}$ meters (Convert To Meters)Standard -
$\epsilon$ (5.4 arcsec to rad):$5.4 \times 4.848 \times 10^{-6} = 2.618 \times 10^{-5}$ radians (Convert To Radians)
-
-
Rate of Degradation (First Derivative): By calculating the rate of change (π("Seeing" )/ππ‘) over a
(N)-minute rolling window, you can determine momentum. A seeing value of 3.0 is acceptable, but a value of 3.0 with a rapid positive trajectory indicates the observing window is about to collapse.-
Linear Regression Slope (Enterprise Standard): To calculate true momentum and ignore hardware jitter, calculate the slope (
$m$ ) of the linear best-fit line across all 300 data points in the window. The slope represents the average rate of change per second.$$\Large \frac{dS}{dt} = \frac{N \sum (t_i S_i) - \sum t_i \sum S_i}{N \sum (t_i^2) - (\sum t_i)^2}$$ -
A slope near 0.0 indicates stable seeing.
-
A positive slope (e.g., +0.05 arcsec/sec) indicates deteriorating seeing (turbulence is increasing).
-
A negative slope indicates improving conditions.
-
Temperature is rarely just about the weather; in hardware engineering, it is a critical calibration tool.
-
Sensor Thermal Drift Calibration: Photodiode sensitivity and op-amp baseline voltages change with temperature (dark current). By mapping voltage changes against temperature changes, your backend can apply a dynamic thermal calibration curve to remove
hardware noisefrom theatmospheric noise. -
Dome/Local Seeing Identification: If the ambient temperature changes rapidly (e.g., as the sun heats the observatory dome or the telescope tube), it creates local thermal currents. By cross-referencing rapid temperature changes with seeing degradation, your AI can flag the bad seeing as
Local Thermal Disturbancerather thanIonospheric Scintillation.
When all three channels are fed together into a time-series model, the AI unlocks:
- Scintillation Regime Classification β Groups data into distinct atmospheric states:
Dawn Thermal MixingΒ·Stable Mid-DayΒ·High-Altitude Jet ShearΒ·Ionospheric Storm - Hardware Anomaly Detection β If voltage flatlines while temperature spikes, the AI deduces overheating or sensor fault, triggering a maintenance alert instead of an atmospheric alert
- Adaptive Optics Feed β rβ values and turbulence spectrum output are exposed as an API endpoint consumable by external deformable mirror control systems
| Tool | Minimum Version |
|---|---|
| Java JDK | 21 |
| Maven | 3.9+ |
| Node.js | 20+ |
| Docker Desktop | Any recent |
| Arduino IDE | For sensor firmware flashing |
# Start PostgreSQL (project root)
docker compose up -d
# Start Kafka broker (edge module)
cd aetheris-edge/kafka
docker compose up -d
# Kafka UI available at http://localhost:8080# From project root
./mvnw spring-boot:run
# REST API: http://localhost:8080/api/v1/
# WebSocket: ws://localhost:8080/wscd aetheris-edge
./mvnw spring-boot:run
# A JavaFX window opens β select the Arduino COM port and click Connectcd aetheris-dashboard
npm install
npm run dev
# Dashboard: http://localhost:5173POST /api/v1/auth/register β RegisterService β BCrypt hash β PostgreSQL (status: PENDING)
POST /api/v1/auth/login β LoginService β JwtService.generateToken() β JWT Bearer token
Authorization: Bearer <token> β SecurityFilterChain β JwtFilter β SecurityContext
- All routes under
/api/v1/auth/**are publicly accessible - Every other route requires a valid JWT Bearer token
- Sessions are fully stateless β no server-side session storage (
SessionCreationPolicy.STATELESS) - Accounts blocked with
UserStatus.BANNEDare rejected by Spring Security'sisAccountNonLocked()hook
aetheris-ai/ β Cloud Backend (Spring Boot WAR)
βββ src/main/java/com/ai/aetheris/
β βββ presentation/controllers/auth/ AuthController.java
β βββ application/
β β βββ services/auth/ LoginService Β· RegisterService
β β βββ repositories/admin/ AdminRepository
β β βββ dtos/auth/ RegisterAdminRequest Β· LoginRequest
β βββ domain/
β β βββ admin/entities/ Admin.java (implements UserDetails)
β β βββ shared/enums/ UserStatus (PENDING Β· ACTIVE Β· BANNED)
β β βββ alerting/ β in progress
β β βββ forecasting/ β in progress
β β βββ telemetry/ β in progress
β βββ infrastructure/
β βββ security/ JwtService.java
β βββ config/ SecurityConfig.java
βββ docker-compose.yml PostgreSQL 15 (port 5432)
βββ pom.xml Spring Boot 4.1 Β· Java 21
aetheris-edge/ β Edge Agent (Spring Boot + JavaFX)
βββ src/main/java/com/agent/aetheris/
β βββ AetherisEdgeFxApplication.java JavaFX + Spring bootstrap
β βββ application/service/
β β βββ home/ ArduinoConnectionService Β· DataReadingThreadService
β β βββ internet/ ConnectivityService
β β βββ weather/ WeatherService
β βββ infrastructure/config/ KafkaProducerConfig
β βββ presentation/controller/ HomeController (FXML JavaFX)
βββ kafka/docker-compose.yml Zookeeper + Kafka + Kafka UI
βββ pom.xml Kafka Β· JavaFX Β· jSerialComm Β· Jackson
aetheris-dashboard/ β React Frontend (Vite + TypeScript)
βββ src/
β βββ pages/ home.tsx Β· dashboard.tsx Β· auth/
β βββ components/ TelemetryChart Β· ParticleBackground Β· Toast Β· ProtectedRoute
β βββ layouts/ AppLayout (dark/light mode context)
β βββ api/ axios clients with JWT interceptors
βββ package.json React 19 Β· TS 6 Β· Vite 8 Β· TailwindCSS 4
| Concern | Technology |
|---|---|
| Framework | Spring Boot 4.1.0 (WAR packaging, Tomcat provided) |
| Security | Spring Security 6, JJWT 0.11.5, BCrypt |
| Persistence | Spring Data JPA, Hibernate, PostgreSQL 15 |
| Real-time | Spring WebSocket (STOMP) |
| Language | Java 21 (LTS), Lombok |
| Concern | Technology |
|---|---|
| Framework | Spring Boot 4.1.0 |
| Desktop UI | JavaFX 17 (controls Β· fxml Β· media) |
| Serial I/O | jSerialComm 2.10.3 |
| Event Streaming | Apache Kafka Β· spring-kafka 4.1.0 |
| Serialisation | Jackson Databind |
| Concern | Technology |
|---|---|
| Framework | React 19, TypeScript 6 |
| Build Tool | Vite 8 |
| Styling | TailwindCSS 4 |
| Animation | Framer Motion 13 |
| Charts | Recharts 3 |
| Routing | React Router v7 |
| Icons | Lucide React |
| HTTP Client | Axios |
- Arduino-to-Kafka edge data pipeline with JavaFX desktop agent
- JWT-secured Spring Boot REST API with stateless session management
- Real-time React dashboard with live telemetry charts and dual thresholds
- Admin registration, login, and
UserStatuslifecycle management - Glass Effect UI, dark/light mode, protected routing
- Real-time Signal-to-Noise Ratio (SNR) and Variance graph
- Kafka consumer β WebSocket STOMP bridge in cloud backend (FR-02 completion)
- LSTM / TFT predictive seeing forecasting engine via ONNX Runtime (FR-03)
- Isolation Forest edge anomaly classification model (FR-04 upgrade)
- rβ (Fried Parameter) computation and AO API endpoint
- Anomaly classification feed (hardware noise Β· ionospheric Β· cloud Β· environmental)
- LLM RAG Agent with NOAA/NASA space weather data fusion (FR-08)
- FFT turbulence frequency spectrum analysis on voltage stream
- SNR dashboard metric for optical satellite laser downlink assessment
- Automated email alerting via Spring Mail on threshold breach (FR-07 upgrade)
- Exponential backoff auto-reconnect in edge agent (NFR-02)
- Multi-observatory multi-tenant architecture
- Grafana + InfluxDB metrics integration
- Mobile-responsive progressive web app (PWA)
Contributions, issues, and feature requests are welcome!
- Fork the repository
- Create a feature branch β
git checkout -b feature/your-feature - Commit your changes β
git commit -m 'feat: describe your change' - Push to the branch β
git push origin feature/your-feature - Open a Pull Request
Please review SECURITY.md before reporting any vulnerabilities.
This project is licensed under the MIT License β see the LICENSE file for details.
Built with β Java 21, βοΈ React 19, and π°οΈ a genuine passion for space weather science.
β Star this repo if you find it interesting!
