diff --git a/schedule_single_station.py b/schedule_single_station.py index 8dfe4c1..12f3f7d 100755 --- a/schedule_single_station.py +++ b/schedule_single_station.py @@ -6,17 +6,20 @@ import ephem import math import random from datetime import datetime, timedelta -import itertools from satellite_tle import fetch_tles import os import glob import lxml.html import argparse import logging +from utils import get_active_transmitter_info, \ + get_transmitter_stats, \ + DB_BASE_URL, \ + NETWORK_BASE_URL + _LOG_LEVEL_STRINGS = ['CRITICAL', 'ERROR', 'WARNING', 'INFO', 'DEBUG'] - class twolineelement: """TLE class""" @@ -64,9 +67,9 @@ def get_scheduled_passes_from_network(ground_station, tmin, tmax): logging.info("Requesting scheduled passes for ground station %d" % ground_station) while True: if start: - r = client.get( - "https://network.satnogs.org/api/observations/?ground_station=%d" % - ground_station) + r = client.get('{}/observations/?ground_station={:d}'.format( + NETWORK_BASE_URL, + ground_station)) start = False else: nextpage = r.links.get("next") @@ -245,7 +248,9 @@ def get_groundstation_info(ground_station_id): # Loop found = False - r = client.get("https://network.satnogs.org/api/stations/?id=%d" % ground_station_id) + r = client.get("{}/stations/?id={:d}".format( + NETWORK_BASE_URL, + ground_station_id)) for o in r.json(): if o['id'] == ground_station_id: found = True @@ -258,25 +263,6 @@ def get_groundstation_info(ground_station_id): return {} -def get_active_transmitter_info(fmin, fmax): - # Open session - logging.info("Fetching transmitter information from DB.") - client = requests.session() - r = client.get("https://db.satnogs.org/api/transmitters") - logging.info("Transmitters received!") - - # Loop - transmitters = [] - for o in r.json(): - if o["downlink_low"]: - if o["alive"] and o["downlink_low"] > fmin and o["downlink_low"] <= fmax: - transmitter = {"norad_cat_id": o["norad_cat_id"], - "uuid": o["uuid"]} - transmitters.append(transmitter) - logging.info("Transmitters filtered based on ground station capability.") - return transmitters - - def get_last_update(fname): try: fp = open(fname, "r") @@ -312,26 +298,6 @@ def schedule_observation( session.post(obsURL, data=form, headers={'referer': obsURL}) -def get_transmitter_success_rate(norad, uuid): - logging.debug("Requesting transmitter success rates for satellite %d" % norad) - transmitters = requests.get( - "https://network.satnogs.org/transmitters/" + - str(norad)).json()["transmitters"] - success_rate = 0 - good_count = 0 - data_count = 0 - for transmitter in transmitters: - logging.debug("Fetching transmitter %s success rates" % transmitter["uuid"]) - if transmitter["uuid"] == uuid: - success_rate = transmitter["success_rate"] - good_count = transmitter["good_count"] - data_count = transmitter["data_count"] - break - - logging.debug("Transmitter success rates for satellite %d received!" % norad) - return success_rate, good_count, data_count - - def _log_level_string_to_int(log_level_string): if log_level_string not in _LOG_LEVEL_STRINGS: message = 'invalid choice: {0} (choose from {1})'.format(log_level_string, @@ -436,13 +402,15 @@ if __name__ == "__main__": fp.write(tnow.strftime("%Y-%m-%dT%H:%M:%S") + "\n") # Get active transmitters in frequency range of each antenna - transmitters = [] + transmitters = {} for antenna in ground_station['antenna']: - transmitters.append( - get_active_transmitter_info( - antenna["frequency"], - antenna["frequency_max"])) - transmitters = list(itertools.chain.from_iterable(transmitters)) + for transmitter in get_active_transmitter_info(antenna["frequency"], + antenna["frequency_max"]): + transmitters[transmitter['uuid']] = transmitter + + # Get NORAD IDs + norad_cat_ids = sorted( + set([transmitter["norad_cat_id"] for transmitter in transmitters.values()])) # Store transmitters fp = open( @@ -452,23 +420,22 @@ if __name__ == "__main__": ground_station_id), "w") logging.info("Requesting transmitter success rates.") - for transmitter in transmitters: - success_rate, good_count, data_count = get_transmitter_success_rate( - transmitter["norad_cat_id"], transmitter["uuid"]) + transmitters_stats = get_transmitter_stats() + for transmitter in transmitters_stats: + if not transmitter['uuid'] in transmitters.keys(): + pass + fp.write( "%05d %s %d %d %d\n" % (transmitter["norad_cat_id"], transmitter["uuid"], - success_rate, - good_count, - data_count)) + transmitter["success_rate"], + transmitter["good_count"], + transmitter["data_count"])) + logging.info("Transmitter success rates received!") fp.close() - # Get NORAD IDs - norad_cat_ids = sorted( - set([transmitter["norad_cat_id"] for transmitter in transmitters])) - # Get TLEs tles = fetch_tles(norad_cat_ids) diff --git a/utils.py b/utils.py new file mode 100644 index 0000000..e050c8d --- /dev/null +++ b/utils.py @@ -0,0 +1,29 @@ +import requests +import logging + +DB_BASE_URL = 'https://db.satnogs.org/api' +NETWORK_BASE_URL = 'https://network.satnogs.org/api' + + +def get_active_transmitter_info(fmin, fmax): + # Open session + logging.info("Fetching transmitter information from DB.") + r = requests.get('{}/transmitters'.format(DB_BASE_URL)) + logging.info("Transmitters received!") + + # Loop + transmitters = [] + for o in r.json(): + if o["downlink_low"]: + if o["alive"] and o["downlink_low"] > fmin and o["downlink_low"] <= fmax: + transmitter = {"norad_cat_id": o["norad_cat_id"], + "uuid": o["uuid"]} + transmitters.append(transmitter) + logging.info("Transmitters filtered based on ground station capability.") + return transmitters + + +def get_transmitter_stats(): + logging.debug("Requesting transmitter success rates for all satellite") + transmitters = requests.get('{}/transmitters/'.format(NETWORK_BASE_URL)) + return transmitters.json()