Repozitář maturitního projektu IVE. Vozítko ovládané přes internet, které sbírá data z modulů.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

178 lines
6.1 KiB

"""
JSON FORMAT
{
'success': '[TRUE OR FALSE]',
'name': '[NAME IDENTIFICATOR OF MODULE]',
'display_name': '[NAME THAT WILL BE DISPLAYED IN GUI]',
'description' : [NOT REQUIRED -> DESCRIPTION OF MODULE],
'error': '[NOT REQUIRED -> ERROR MESSAGES]',
'variables': [
{
'name': '[STRING]',
'type': '[DATA TYPE OF VALUE]',
'value': [VALUE],
'unit' : [NOT REQUIRED -> MEASURING UNIT],
},
{
'name': '[STRING]',
'type': '[DATA TYPE OF VALUE]',
'value': [VALUE],
'unit' : [NOT REQUIRED -> MEASURING UNIT],
},
... optional amount of variables
]
}
"""
import time, json, serial, random, os, sys, psycopg2
from datetime import datetime, timezone
from pprint import pprint
def config():
return {
"dbname" : "lucy_main",
"user" : "lucy_modules",
"password" : "lucy1234",
"host" : "localhost",
}
# UNUSED
def add_module_to_db(name, display_name, description=" ", error=" "):
conn = None
try:
params = config()
conn = psycopg2.connect(**params)
cur = conn.cursor()
cur.execute('INSERT INTO app_module (name, display_name, description, error, last_update) VALUES(%s, %s, %s, %s, %s)', (name, display_name, description, error, datetime.now(timezone.utc)))
conn.commit()
cur.close()
except (Exception, psycopg2.DatabaseError) as error:
print("-> ERROR while adding module: %s" % error)
finally:
if conn is not None:
conn.close()
# UNUSED
def save_value_to_db(module_name, variable, data_type, value):
conn = None
try:
params = config()
conn = psycopg2.connect(**params)
cur = conn.cursor()
cur.execute('INSERT INTO app_modulevalue (module_id, variable, data_type, value, unit, timestamp) VALUES((SELECT id from app_module WHERE name=%s), %s, %s, %s, %s, %s)', (module_name, variable, data_type, value, unit, datetime.now(timezone.utc)))
conn.commit()
cur.close()
except (Exception, psycopg2.DatabaseError) as error:
print("-> ERROR while adding module value: %s" % error)
finally:
if conn is not None:
conn.close()
def is_module_in_db(module_name, conn):
cur = conn.cursor()
cur.execute('SELECT id FROM app_module WHERE name=%s', (module_name, ))
rows = cur.fetchall()
if rows:
return True
else:
return False
def save_data_to_db(data):
conn = None
try:
params = config()
conn = psycopg2.connect(**params)
cur = conn.cursor()
module_name = data["name"]
if not is_module_in_db(module_name, conn):
cur.execute('INSERT INTO app_module (name, display_name, description, error, last_update)' \
'VALUES(%s, %s, %s, %s, %s)', (module_name, data["display_name"], data.get("description", ""), data.get("error", ""), datetime.now(timezone.utc)))
for variable in data["variables"]:
cur.execute('INSERT INTO app_modulevalue (module_id, variable, data_type, value, unit, timestamp) VALUES((SELECT id FROM app_module WHERE name=%s), %s, %s, %s, %s, %s)', (module_name, variable["name"], variable["type"], variable["value"], variable.get("unit", ""), datetime.now(timezone.utc)))
conn.commit()
cur.close()
print("-> data saved to database")
except (Exception, psycopg2.DatabaseError) as error:
print("-> ERROR while saving data to database: %s" % error)
finally:
if conn is not None:
conn.close()
if __name__ == "__main__":
print ("Ready...")
sys.stdout.flush()
while True:
time.sleep(0.2)
listOfInterfaces = [i for i in os.listdir('/dev') if (i.startswith('ttyUSB') or i.startswith('ttyACM'))]
for interface in listOfInterfaces:
sys.stdout.flush()
time.sleep(2)
for jk in range(1):
try:
ser = serial.Serial("/dev/%s" % interface, baudrate= 9600,
timeout=2.5,
parity=serial.PARITY_NONE,
bytesize=serial.EIGHTBITS,
stopbits=serial.STOPBITS_ONE
)
print("interface: %s" % interface)
data = {}
data["operation"] = "REQUEST_DATA"
data = json.dumps(data)
buf = []
if ser.isOpen():
for x in (data):
buf.append(ord(x))
ser.write(bytearray(buf))
time.sleep(2)
ser.write(bytearray(buf))
try:
incoming = ser.readline().decode("utf-8")
data = json.loads(incoming)
#print(data)
if data.get("success") == "true":
print("-> data recieved")
save_data_to_db(data)
elif data.get("success") == "false":
print("-> getting data wasn't sucessfull")
else:
print("-> data isn't valid")
# print recieved data
# print("## RECIEVED DATA ##")
# print('Name: %s' % data["name"])
# print('Display_name: %s' % data["display_name"])
# for variable in data["variables"]:
# print(variable["name"] + ": " + str(variable["value"]))
# print()
except Exception as e:
print (e)
ser.close()
else:
print ("-> opening error")
except Exception as e:
print (e)