127 lines
3.6 KiB
Python
127 lines
3.6 KiB
Python
#!/usr/bin/env python
|
|
#test
|
|
import os
|
|
from socket import *
|
|
from datetime import datetime, time
|
|
import math
|
|
|
|
import psycopg2
|
|
import psycopg2.extensions
|
|
from psycopg2.extras import Json
|
|
conn = psycopg2.connect(host='localhost', database='nws', user='nws', password='nws')
|
|
cursor = conn.cursor()
|
|
|
|
cursor.execute("SELECT stationid,lat,lon,tempf,dewpt, humidity,winddir,windspd,windgust,cwop,cwoptime,preciptotal, pressure from wusites WHERE (Active = True and CWOP IS NOT NULL) and (((EXTRACT(EPOCH FROM (current_timestamp - cwoptime ))/60) > 9 ) or (cwoptime ISNULL)) and ((EXTRACT(EPOCH FROM (current_timestamp - lastob ))/60) < 15 )")
|
|
allcwasites = cursor.fetchall()
|
|
print(allcwasites)
|
|
|
|
|
|
def decdeg2dms(dd,pad):
|
|
is_positive = dd >= 0
|
|
dd = abs(dd)
|
|
minutes,seconds = divmod(dd*3600,60)
|
|
degrees,minutes = divmod(minutes,60)
|
|
degrees = degrees
|
|
if pad == 'lat':
|
|
coord = str(int(degrees)).zfill(2) + str(int(minutes)).zfill(2) + '.' + str(int(seconds)).zfill(2)
|
|
if is_positive:
|
|
coord = coord + 'N'
|
|
if not(is_positive):
|
|
coord = coord + 'S'
|
|
if pad == 'lon':
|
|
coord = str(int(degrees)).zfill(3) + str(int(minutes)).zfill(2) + '.' + str(int(seconds)).zfill(2)
|
|
if is_positive:
|
|
coord = coord + 'E'
|
|
if not(is_positive):
|
|
coord = coord + 'W'
|
|
|
|
return (coord)
|
|
|
|
devicename = 'WURELAY' #This identifies your equipment/software. You can put anything you want. I use 'WS2902A', which is the model of weather station I have
|
|
|
|
|
|
for i in allcwasites:
|
|
stationid = i[0]
|
|
latitude = i[1]
|
|
longitude = i[2]
|
|
tempf = i[3]
|
|
dewpt = i[4]
|
|
humidity = i[5]
|
|
winddir = i[6]
|
|
windspd = i[7]
|
|
windgust = i[8]
|
|
callsign = i[9]
|
|
cwoptime = i[10]
|
|
preciptotal = i[11]
|
|
pressure = i[12]
|
|
latitude = decdeg2dms(latitude,'lat')
|
|
longitude = decdeg2dms(longitude,'lon')
|
|
print(i)
|
|
|
|
if tempf != None:
|
|
if tempf < 0:
|
|
temp = str(int(round(tempf))).zfill(3)
|
|
else:
|
|
temp = str(int(round(tempf))).zfill(3)
|
|
else:
|
|
temp = '...'
|
|
if (winddir != None and winddir > -1):
|
|
winddir = str(int(winddir)).zfill(3)
|
|
else:
|
|
winddir = '...'
|
|
if windspd != None:
|
|
if windspd > 99:
|
|
windspeed = '...'
|
|
else:
|
|
windspeed = str(int(math.ceil(windspd))).zfill(3)
|
|
else:
|
|
windspeed = '...'
|
|
if windgust != None:
|
|
if windgust > 99:
|
|
windgust = '...'
|
|
else:
|
|
windgust = str(int(math.ceil(windgust))).zfill(3)
|
|
else:
|
|
windgust = '...'
|
|
if humidity != None:
|
|
if humidity > 8:
|
|
humidity = str(int(humidity%100)).zfill(2)
|
|
else:
|
|
humidity = '...'
|
|
else:
|
|
humidity = '...'
|
|
if pressure != None:
|
|
if pressure > 29.00 and pressure < 31.00:
|
|
pressure = str(int(pressure * 338.63886666667)).zfill(5)
|
|
else:
|
|
pressure = '...'
|
|
else:
|
|
pressure = '...'
|
|
|
|
if preciptotal != None:
|
|
preciptotal = str(int(preciptotal*100)).zfill(3)
|
|
else:
|
|
preciptotal = '...'
|
|
packet = callsign + '>APRS,TCPIP*:@' + datetime.utcnow().strftime("%d%H%M") + 'z' + latitude + '/' + longitude + '_' + winddir + '/' + windspeed + 'g' + windgust + 't' + temp + 'r...P' + preciptotal + 'h' + humidity + 'b' + pressure + devicename
|
|
|
|
s = socket(AF_INET, SOCK_STREAM)
|
|
s.connect(('cwop.aprs.net', 14580))
|
|
print(packet)
|
|
s.send(('user ' + callsign + ' pass -1 vers Python\n').encode())
|
|
s.send((packet+'\n').encode())
|
|
s.shutdown(0)
|
|
s.close()
|
|
sql = 'UPDATE wusites set cwoptime = current_timestamp where cwop = %s'
|
|
val = (callsign,)
|
|
cursor.execute(sql,val)
|
|
conn.commit()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|