a set of script to predict passes and make automated recordings of satellites. Intended to be run headless on an SoC. Original forked from https://github.com/va7eex/Pi_WXRX Improvements made for https://keet.space
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

89 lines
2.7 KiB

import requests
import json
import array
import sys
#Where we pull the data from.
web_tle = [ 'http://www.celestrak.com/NORAD/elements/weather.txt', 'https://www.celestrak.com/NORAD/elements/stations.txt' ]
#celestrak uses a different key value than I do, find all instances of their keys and replace with mine.
sats_of_interest = { 'NOAA-15':'NOAA 15', 'NOAA-18':'NOAA 18', 'NOAA-19':'NOAA 19'}
#NOAA 15 [B]
#1 25338U 98030A 16173.50363904 .00000079 00000-0 52195-4 0 9991
#2 25338 98.7825 177.6616 0010829 167.3279 192.8174 14.25734916941605
data = {}
line_num = 0
cur_sat_line = -1
cur_sat = ""
#This was originally intended to check that the data I was receiving was legitimate, very half-assed.
def check_line1(str):
if( len(str) == 69 ):
fields = {}
fields['line number'] = int(str[0:1])
fields['satellite number + classification'] = str[3:9]
fields['international designator'] = str[10:17]
fields['epoch'] = float(str[19:32])
fields['1st mean motion'] = float(str[34:43])
fields['2nd mean motion'] = str[45:52]
fields['BSTAR drag term'] = str[54:61]
fields['the number 0'] = int(str[62:63])
fields['element set number + checksum'] = int(str[65:69])
else:
return False
return True
def check_line2(str):
if( len(str) == 69 ):
fields = {}
fields['line number'] = str[0:1]
fields['satellite number'] = str[3:7]
fields['inclination'] = str[9:16]
fields['right ascension'] = str[18:25]
fields['eccentricity'] = str[27:33]
fields['argument of perigee'] = str[35:42]
fields['mean anomaly'] = str[44:51]
fields['mean motion + revolution number + checksum'] = str[53:69]
print fields
return fields
for field, data in fields.iteritems():
if( not float(data).isnum() ):
print field, data, "is not an number!"
return False
else:
return False
return True
for tle in web_tle:
page = requests.get(tle, stream=True)
for line in page.iter_lines():
#I don't actually remember why I made this var 'hsat'
for hsat, sat in sats_of_interest.iteritems():
if( line.startswith(sat) ):
cur_sat_line = line_num
cur_sat = hsat
#Enable this for data integrity check if you want.
if( line_num == cur_sat_line + 1 and cur_sat_line >= 0 ):
if( check_line1(line) ):
data[cur_sat] = line
# else:
# sys.exit("Malformed Data (Line 1), Exiting. " + line)
if( line_num == cur_sat_line + 2 and cur_sat_line >= 0 ):
if( check_line2(line) ):
data[cur_sat] = data[cur_sat] + '\n' + line
# else:
# sys.exit("Malformed Data (Line 2), Exiting. " + line)
line_num = line_num + 1
for s, tle in data.iteritems():
print s, '\n', tle
with open('sat_tle.txt', 'w') as fp:
json.dump(data, fp)