cosmicpiparserinflux.py-9e7.../cosmicpiparserinflux.py
2021-01-10 21:45:59 +01:00

131 lines
No EOL
5.4 KiB
Python

from influxdb import InfluxDBClient
import serial
import uuid
import random
import time
import datetime
import s2cell
dbframe = 0
cosmicdict = {
"DeviceID": 0,
"UTCUnixTime": 0,
"SubSeconds": 0.0,
"TemperatureC": 0.0,
"Humidity": 0.0,
"AccelX": 0.0,
"AccelY": 0.0,
"AccelZ": 0.0,
"MagX": 0.0,
"MagY": 0.0,
"MagZ": 0.0,
"Pressure": 0.0,
"Altitude": 0.0,
"Longitude": 0.0,
"Latitude": 0.0
}
nstimestamp = 0
s2celllocation = 0
print("starting")
ser = serial.Serial(port='/dev/serial0', baudrate=115200, parity=serial.PARITY_NONE, stopbits=serial.STOPBITS_ONE, bytesize=serial.EIGHTBITS, timeout=1)
print("connected to: " + ser.portstr)
print ("The device ID using uuid1() is : ",end="")
print (uuid.uuid1().int)
cosmicdict['DeviceID']=uuid.uuid1().int
print("DB connection")
client = InfluxDBClient(host='localhost', port=8086)
client.create_database('cosmicpilocal')
data=[]
#ser.write("help\n");
while True:
line = ser.readline();
if line:
#print(line.decode('utf-8'))
line_str = str(line.decode('utf-8'))
data_type = line_str.split(':')[0]
gps_type = line_str.split(',')[0]
#print(data_type)
#print(gps_type)
if data_type in cosmicdict.keys():
data = line_str.split(':')[1].split(';')[0]
cosmicdict[data_type] = float(data)
if data_type == "PPS":
gps_lock_sting = line_str.split(':')[2]
gps_lock_sting = gps_lock_sting.split(';')[0]
if (len(gps_lock_sting) == 1):
cosmicdict[UTCUnixTim] += 1
gps_type = line_str.split(',')[0]
if gps_type == "$GPZDA" or gps_type == "$GNZDA":
if (line_str.count(',') == 6):
g_time_string = line_str.split(',')[1].split('.')[0] # has format hhmmss
hour = int(g_time_string[0:2])
minute = int(g_time_string[2:4])
second = int(g_time_string[4:6])
day = int(line_str.split(',')[2])
month = int(line_str.split(',')[3])
year = int(line_str.split(',')[4])
time_from_gps = datetime.datetime(year,month,day,hour,minute,second,tzinfo=None)
cosmicdict['UTCUnixTime'] = (time_from_gps - datetime.datetime(1970, 1, 1)).total_seconds()
if gps_type == "$GPGGA":
# sanity check
if (line_str.count(',') == 14):
# use this as documentation for the string: http://aprs.gids.nl/nmea/#gga
lat = line_str.split(',')[2]
lat = float(lat[0:2])
minutes = line_str.split(',')[2]
minutes = float(minutes[2:len(minutes)])
lat += minutes / 60.
if line_str.split(',')[3] == 'S':
lat = -lat
lon = line_str.split(',')[4]
lon = float(lon[0:3])
minutes = line_str.split(',')[4]
minutes = float(minutes[3:len(minutes)])
lon += minutes / 60.
if line_str.split(',')[5] == 'W':
lon = -lon
cosmicdict['Latitude'] = lat
cosmicdict['Longitude'] = lon
if data_type == "Event":
if ((line_str.count(':') == 3) and (line_str.count(';') == 1)):
sub_sec_string = line_str.split(':')[2]
sub_sec_string = sub_sec_string.split(';')[0]
if sub_sec_string.count('/') == 1:
# this is the newer format and we need to divide the first number by the second one
divisors = sub_sec_string.split('/')
current_subSeconds = float(divisors[0]) / float(divisors[1])
cosmicdict['SubSeconds'] = current_subSeconds
print(cosmicdict)
#conversion to ns for influx
#add s and ns, then multiply by 1e9
nstimestamp = cosmicdict['UTCUnixTime']+cosmicdict['SubSeconds']
nstimestamp = nstimestamp*1e9
nstimestamp = int(nstimestamp)
s2celllocation = s2cell.lat_lon_to_cell_id(cosmicdict['Latitude'],cosmicdict['Longitude'])
data = []
data.append("{measurement},id={DeviceID} s2_cell_id={s2_cell_id},lat={latitude},lon={longitude},Temp={Temp},Hum={Hum},Accelx={Accelx},Accely={Accely},Accelz={Accelz},Magx={Magx},Magy={Magy},Magz={Magz},Press={Pressx},Alt={Altx} {timestamp}"
.format(measurement='CosmicPiV1.8.1',
DeviceID=cosmicdict['DeviceID'],
s2_cell_id=s2celllocation,
latitude=cosmicdict['Longitude'],
longitude=cosmicdict['Latitude'],
Temp=cosmicdict['TemperatureC'],
Hum=cosmicdict['Humidity'],
Accelx=cosmicdict['AccelX'],
Accely=cosmicdict['AccelY'],
Accelz=cosmicdict['AccelZ'],
Magx=cosmicdict['MagX'],
Magy=cosmicdict['MagY'],
Magz=cosmicdict['MagZ'],
Pressx=cosmicdict['Pressure'],
Altx=cosmicdict['Altitude'],
timestamp=nstimestamp))
print(data)
client.write_points(data, database='cosmicpilocal', time_precision='n', batch_size=1, protocol='line')