Merge branch 'pr/transmitter_handling' into 'master'

Use server-side filtering when fetching transmitter success rates

See merge request cgbsat/auto-scheduler!5
merge-requests/1/head
cgbsat 2018-12-02 17:02:10 +00:00
commit dde72b7f45
2 changed files with 57 additions and 61 deletions

View File

@ -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)

29
utils.py 100644
View File

@ -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()