habboy/data_server/code/HabHubInterface.py

297 wiersze
8.5 KiB
Python

#!/usr/bin/env python3
"""
misc utility functions for habitat queries
"""
import string
import sys
import json
from time import time
from pprint import pprint
import urllib3
urllib3.disable_warnings()
http = urllib3.PoolManager()
import formatSentence
def getFlights():
_url = (
"http://habitat.habhub.org/habitat/_design/flight/_view/end_start_including_payloads?startkey=["
+ str(int(time()))
+ "]&include_docs=True"
)
flights_json = http.request("GET", _url)
flights = json.loads(flights_json.data.decode("utf-8"))["rows"]
res = [f for f in flights if f["doc"]["type"] == "flight"]
return res
def getPayloads(i_flights=None):
_url = (
"http://habitat.habhub.org/habitat/_design/flight/_view/end_start_including_payloads?startkey=["
+ str(int(time()))
+ "]&include_docs=True"
)
all_docs = http.request("GET", _url)
all_docs = json.loads(all_docs.data.decode("utf-8"))["rows"]
if not i_flights:
i_flights = getFlights()
flyingPayloadsIds = []
for f in i_flights:
flyingPayloadsIds.extend(f["doc"]["payloads"])
res = []
for f in all_docs:
if (
f["doc"]["type"] == "payload_configuration"
and f["doc"]["_id"] in flyingPayloadsIds
):
# f['telemetry'] = getTelemetry( f['doc']['sentences'][0]['callsign'] )
res.append(f)
return res
def getCallsignsForPayloadId(payload_id):
flights = getFlights()
payloads = getPayloads(flights)
for p in payloads:
if p["doc"]["_id"] == payload_id:
return p["doc"]["sentences"][0]["callsign"]
return None
"""
def getTelemetry(i_payloadName, max_positions=1 ):
data_url = "http://spacenear.us/tracker/datanew.php"
data_str = "mode=position&type=positions&format=json&max_positions=" + str(max_positions) + "&position_id=0&vehicles=" + urllib2.quote(i_payloadName)
_url = data_url + '?' + data_str
res = http.request('GET', _url)
res = json.loads(res.data.decode('utf-8'))
res = res['positions']['position']
return res
"""
def defaultSensorsInfo(i_sentence):
"""
treat all sensors as string
except: sentence_id, time, lat, lon, alt
"""
if not i_sentence:
return None
num_sensors = len(formatSentence.getData(i_sentence))
sensors_info_arr = [
{"name": "sensor_" + str(x), "sensor": "base.string"}
for x in range(num_sensors)
]
# sentence_id
sensors_info_arr[0]["name"] = "sentence_id"
sensors_info_arr[0]["sensor"] = "base.ascii_int"
# time
sensors_info_arr[1]["name"] = "time"
sensors_info_arr[1]["sensor"] = "stdtelem.time"
# lat
sensors_info_arr[2]["name"] = "latitude"
sensors_info_arr[2]["sensor"] = "stdtelem.coordinate"
# lon
sensors_info_arr[3]["name"] = "longitude"
sensors_info_arr[3]["sensor"] = "stdtelem.coordinate"
# alt
sensors_info_arr[4]["name"] = "altitude"
sensors_info_arr[4]["sensor"] = "base.ascii_float"
return sensors_info_arr
def getSentenceInfo(i_payload_id, i_sentence=None):
# print('getSentenceInfo', (i_payload_id, i_sentence))
example_output = [
{"name": "sentence_id", "sensor": "base.ascii_int"},
{"name": "time", "sensor": "stdtelem.time"},
{"name": "latitude", "sensor": "stdtelem.coordinate", "format": "dd.dddd"},
{"name": "longitude", "sensor": "stdtelem.coordinate", "format": "dd.dddd"},
{"name": "altitude", "sensor": "base.ascii_int"},
{"name": "temperature_internal", "sensor": "base.ascii_float"},
{"name": "temperature_external", "sensor": "base.ascii_float"},
{"name": "satellites", "sensor": "base.ascii_int"},
{"name": "some_float1", "sensor": "base.ascii_float"},
{"name": "some_float2", "sensor": "base.ascii_float"},
{"name": "some_float3", "sensor": "base.ascii_float"},
{"name": "some_float4", "sensor": "base.ascii_float"},
{"name": "packets_err", "sensor": "base.ascii_int"},
{"name": "flags", "sensor": "base.string"},
]
# ARY
example_output = [
{"name": "sentence_id", "sensor": "base.ascii_int"},
{"name": "time", "sensor": "stdtelem.time"},
{"name": "latitude", "sensor": "stdtelem.coordinate", "format": "dd.dddd"},
{"name": "longitude", "sensor": "stdtelem.coordinate", "format": "dd.dddd"},
{"name": "altitude", "sensor": "base.ascii_int"},
{"name": "elev", "sensor": "base.ascii_int"},
{"name": "temperature_internal", "sensor": "base.ascii_float"},
{"name": "temperature_external", "sensor": "base.ascii_float"},
{"name": "pressure", "sensor": "base.ascii_float"},
{"name": "mesg", "sensor": "base.string"},
]
# return example_output
result = None
payloads = getPayloads(getFlights())
for p in payloads:
# print("payload ", p['doc']['_id'], p['doc']['name'], i_payload_id)
# if p['doc']['_id'] == i_payload_id or p['doc']['name'] == i_payload_id:
if (
p["doc"]["_id"] == i_payload_id
or p["doc"]["sentences"][0]["callsign"] == i_payload_id
):
result = p["doc"]["sentences"][0]["fields"]
break
else:
pass
# print(p)
'''
if not result and i_sentence:
result = defaultSensorsInfo(i_sentence)
print("Building Default sensor datainfo based on sentence: " + i_sentence)
pprint(result)
return result
'''
return result
"""
def getLastSentence_faked(i_payload_name):
getLastSentence.last_id += 1
result = "CALLSIGN," + str(getLastSentence.last_id) + ",15:41:24,44.32800,-74.14427,00491,0,0,12,30.7,0.0,0.001,20.2,958,1b*6BC9"
result = formatSentence.formatSentence(result)
return ""
return result
getLastSentence_faked.last_id = 0
"""
def getLastSentence(i_payload_id):
_url = (
"http://habitat.habhub.org/habitat/_design/flight/_view/end_start_including_payloads?startkey=["
+ str(int(time()))
+ "]&include_docs=True"
)
try:
flights_json = http.request("GET", _url)
except urllib3.exceptions.MaxRetryError:
return None
flights = json.loads(flights_json.data.decode("utf-8"))["rows"]
flight_id = None
for f in flights:
if f["doc"]["type"] != "flight":
continue
if i_payload_id in f["doc"]["payloads"]:
flight_id = f["doc"]["_id"]
break
if flight_id:
try:
r = http.request(
"GET",
'http://habitat.habhub.org/habitat/_design/payload_telemetry/_view/flight_payload_time?startkey=["'
+ flight_id
+ '","'
+ i_payload_id
+ '",[]]&endkey=["'
+ flight_id
+ '","'
+ i_payload_id
+ '"]&include_docs=True&descending=True&limit=1',
)
except urllib3.exceptions.MaxRetryError:
return None
telemetry = json.loads(r.data.decode("utf-8"))["rows"]
if telemetry:
try:
telemetry = json.loads(r.data.decode("utf-8"))["rows"][-1]
last_sentence = telemetry["doc"]["data"]["_sentence"]
last_sentence = last_sentence.strip()
except KeyError:
pprint(telemetry)
return ""
print(last_sentence)
return last_sentence
return None
def uploadChaseCar(car_data):
r = None
try:
r = http.request(
"GET",
'http://spacenear.us/tracker/track.php',
fields = car_data
)
except urllib3.exceptions.MaxRetryError:
return False
if r.status != 200:
print(r.data)
return False
return True
if __name__ == "__main__":
flights = getFlights()
payloads = getPayloads(flights)
"""
print "Flights:"
pprint(flights)
print "==================================="
print "payloads:"
pprint(payloads)
print "==================================="
for p in payloads:
print "telemetry ", p['doc']['name']
pprint( getTelemetry(p['doc']['name']) )
print "==================================="
print('M6')
pprint ( getTelemetry('M6') )
print "==================================="
print( getSentenceInfo('MI6') )
"""
pprint(getSentenceInfo("5facec9731fc190ce510c9f1ee6e4bb8"))
# pprint( getLastSentence('5facec9731fc190ce510c9f1ee6e4bb8') )
# //////////////////////////////
# print( getSentenceInfo( 0, 'fro3,3,220759,52.029996,21.999550,130.0,80.0,80.0,80.0*CE7D') )