mission-control/scripts/update-space.ts
2026-01-28 17:37:10 +01:00

60 lines
2.1 KiB
TypeScript

import db from '../lib/db';
import * as satellite from 'satellite.js';
const MY_LAT = 55.6683;
const MY_LON = 12.5333;
const MY_ALT = 0; // Altitude in kilometers
async function updateISSData() {
console.log("🛰️ Fetching TLE data...");
const response = await fetch('https://celestrak.org/NORAD/elements/gp.php?CATNR=25544&FORMAT=tle');
const data = await response.text();
const lines = data.split('\n').filter(line => line.trim().length > 0);
const line1 = lines[1];
const line2 = lines[2];
// 1. Initialize satellite record from TLE
const satrec = satellite.twoline2satrec(line1, line2);
// 2. Observer coordinates in radians
const observerGd = {
longitude: satellite.degreesToRadians(MY_LON),
latitude: satellite.degreesToRadians(MY_LAT),
height: MY_ALT
};
let nextPassDate: Date | null = null;
const now = new Date();
// 3. Look ahead for the next 24 hours (1440 minutes)
for (let i = 0; i < 1440; i++) {
const checkTime = new Date(now.getTime() + i * 60000);
const positionAndVelocity = satellite.propagate(satrec, checkTime);
const gmst = satellite.gstime(checkTime);
// Calculate Look Angles (Azimuth, Elevation, Range)
if (typeof positionAndVelocity?.position !== 'boolean') {
const positionEcf = satellite.eciToEcf(positionAndVelocity!.position, gmst);
const lookAngles = satellite.ecfToLookAngles(observerGd, positionEcf);
const elevation = satellite.radiansToDegrees(lookAngles.elevation);
// If elevation > 0, the ISS is above your horizon!
if (elevation > 0) {
nextPassDate = checkTime;
break;
}
}
}
if (nextPassDate) {
const upsert = db.prepare('INSERT INTO iss_passes (id, pass_time) VALUES (1, ?) ON CONFLICT(id) DO UPDATE SET pass_time=excluded.pass_time');
upsert.run(nextPassDate.toISOString());
console.log(`✅ Real orbital pass found: ${nextPassDate.toISOString()}`);
} else {
console.log("❌ No pass found in the next 24 hours (check your TLE or coordinates).");
}
}
updateISSData().catch(console.error);