-
Notifications
You must be signed in to change notification settings - Fork 0
/
database.py
237 lines (178 loc) · 9.59 KB
/
database.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
#!usr/bin/env python
# -*- coding: utf-8 -*-
#vprocess6 - CECS: Felipe Hooper 14 de mayo
'''
Adquisición de datos por sockets (ZMQ) para la base de datos.
'''
import os, sys, time, datetime, sqlite3, sqlitebck, logging, communication, zmq
DIR="/home/pi/vprocess6"
logging.basicConfig(filename = DIR + '/log/database.log', level=logging.INFO, format='%(asctime)s:%(levelname)s:%(message)s')
TIME_MIN_BD = 0.01 #1 # 1 [s]
flag_database = "False"
flag_database_local = False
def update_db(real_data, ficha_producto, connector, c, first_time, BACKUP):
#CREACION DE TABLAS TEMP1(Sombrero), TEMP2(Mosto), TEMP_ (promedio). CADA ITEM ES UNA COLUMNA
#TABLA FULL CON TODA LA DATA
c.execute('CREATE TABLE IF NOT EXISTS PROCESO (ID INTEGER PRIMARY KEY autoincrement, FECHA TIMESTAMP NOT NULL, HORA TIMESTAMP NOT NULL, Densidad_Opt REAL, TASA_Crec REAL, Etanol REAL, SUSTRATO_i REAL, MEZCLADOR REAL, BOMBA1 REAL, BOMBA2 REAL, T_SETPOINT REAL, TEMPERATURA REAL, pH_SETPOINT REAL, pH REAL )')
#CREACION DE TABLAS TEMP1(Sombrero), TEMP2(Mosto), TEMP_ (promedio). CADA ITEM ES UNA COLUMNA
c.execute('CREATE TABLE IF NOT EXISTS TEMPERATURA (ID INTEGER PRIMARY KEY autoincrement, FECHA_HORA TIMESTAMP NOT NULL, MAGNITUD REAL)')
c.execute('CREATE TABLE IF NOT EXISTS PH (ID INTEGER PRIMARY KEY autoincrement, FECHA_HORA TIMESTAMP NOT NULL, MAGNITUD REAL)')
c.execute('CREATE TABLE IF NOT EXISTS OD (ID INTEGER PRIMARY KEY autoincrement, FECHA_HORA TIMESTAMP NOT NULL, MAGNITUD REAL)')
logging.info("Se crearon las tablas!!!")
#se guardan las tablas agregados en la db si no existian
connector.commit()
#INSERCION DE LOS DATOS MEDIDOS, TABLA FULL CON TODA LA DATA, NULL es para el ID
#Densidad_Opt #TASA_Crec #Etanol #sustrato_i #mezclador #bomba1 #bomba2 #Temp_setpoint #Temp_measure #pH_setpoint #pH_measure
try:
c.execute("INSERT INTO PROCESO VALUES (NULL, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", (datetime.datetime.now().strftime("%Y-%m-%d"), datetime.datetime.now().strftime("%H:%M:%S"), ficha_producto[0], ficha_producto[1], ficha_producto[2], ficha_producto[3], ficha_producto[4], ficha_producto[10], ficha_producto[11], ficha_producto[9], real_data[1], ficha_producto[8], real_data[3] ))
#Insercion solo de los datos de sensores
c.execute("INSERT INTO PH VALUES (NULL,?,?)", (datetime.datetime.now().strftime("%Y-%m-%d,%H:%M:%S"), round(float(real_data[3]),2)))
c.execute("INSERT INTO OD VALUES (NULL,?,?)", (datetime.datetime.now().strftime("%Y-%m-%d,%H:%M:%S"), round(float(real_data[2]),2)))
c.execute("INSERT INTO TEMPERATURA VALUES (NULL,?,?)", (datetime.datetime.now().strftime("%Y-%m-%d,%H:%M:%S"), round(float(real_data[1]),2)))
logging.info("se insertaron todos los datos en db")
except:
#print "no se pudo insertar dato en db"
logging.info("no se pudo insertar datos en db")
#se guardan los datos agregados en la db
connector.commit()
#Backup DB in RAM to DISK SD
if BACKUP:
filedb = DIR + '/database/backup__' + first_time + '__.db'
bck = sqlite3.connect(filedb)
sqlitebck.copy(connector, bck)
try:
os.system('sqlite3 -header -csv %s "select * from PROCESO;" > /home/pi/vprocess6/csv/%s' % (filedb,filedb[28:-3])+'PROCESO.csv' )
logging.info("\n Backup CSV REALIZADO \n")
except:
logging.info("\n Backup FULL NO REALIZADO, NO REALIZADO \n")
try:
#Se guarda el nombre de la db para ser utilizado en app.py
f = open(DIR + "/name_db.txt","w")
f.write(filedb + '\n')
f.close()
except:
#print "no se pudo guardar el nombre de la DB para ser revisada en app.py"
logging.info("no se pudo guardar el nombre de la DB para ser revisada en app.py")
return True
def main():
#ficha_producto = [0.0,0.0,0.0,0.0,0.0,"vacio_uchile2","vacio_uchile2",0,0.0,0,0,0] #ficha_producto[9]=set_data[4]:temparatura set point
#ficha_producto_save = ficha_producto #ficha_producto[10] = set_data[0]: bomba1
#ficha_producto[11] = set_data[3]: bomba2
topicfilter = "w"
#####Listen measures - estructura para zmq listen de ficha_producto ################
port_sub1 = "5554"
context_sub1 = zmq.Context()
socket_sub1 = context_sub1.socket(zmq.SUB)
socket_sub1.connect ("tcp://localhost:%s" % port_sub1)
socket_sub1.setsockopt(zmq.SUBSCRIBE, topicfilter)
#####Listen measures - estructura para zmq listen real_data (measures from myserial.py)
port_sub2 = "5557"
context_sub2 = zmq.Context()
socket_sub2 = context_sub2.socket(zmq.SUB)
socket_sub2.connect ("tcp://localhost:%s" % port_sub2)
socket_sub2.setsockopt(zmq.SUBSCRIBE, topicfilter)
####################################################################################
i = 0 #Hora__%H_%M_%S__Fecha__%d-%m-%y
first_time = time.strftime("Fecha__%d-%m-%y__Hora__%H_%M_%S")
TIME_BCK = 5 #600 #10 min
connector = sqlite3.connect(':memory:', detect_types = sqlite3.PARSE_DECLTYPES|sqlite3.PARSE_COLNAMES)
c = connector.cursor()
#Algoritmo de respaldo cada "TIME_BCK [s]"
BACKUP = False
start_time = time.time()
end_time = time.time()
real_data = 0
ficha_producto = 0
global flag_database_local, flag_database
#reviso constantemente
while True:
############## ZMQ connection for download data ficha_producto ###############
try:
ficha_producto = socket_sub1.recv(flags=zmq.NOBLOCK).split()[1];
ficha_producto = ficha_producto.split(",")
ficha_producto_save = ficha_producto
#ficha_producto_save = ficha_producto
#log para depuracion
'''
f = open(DIR + "/para_basedatos.txt","a+")
f.write(str(ficha_producto) + "__up__" + "\n" )
f.close()
'''
except zmq.Again:
pass
#ZMQ connection for download real_data (measures from myserial.py)
try:
temporal = socket_sub2.recv(flags=zmq.NOBLOCK).split()
if temporal != "":
real_data = temporal
except zmq.Again:
pass
########################## ZMQ connections #######################################
#reviso la primera vez si cambio el flag, y luego sirve para revisar cuando salga por que fue apagado el flag desde app.py
try:
f = open(DIR + "/flag_database.txt","r")
flag_database = f.readlines()[-1]
f.close()
#logging.info("FLAG_DATABASE WHILE SUPERIOR:")
if flag_database == "True":
flag_database_local = True
else:
flag_database_local = False
except:
pass
#logging.info("no se pudo leer el flag en el while principal")
while flag_database_local:
############## ZMQ connection for download data ficha_producto ###############
try:
ficha_producto = socket_sub1.recv(flags=zmq.NOBLOCK).split()[1];
ficha_producto = ficha_producto.split(",")
ficha_producto_save = ficha_producto
#ficha_producto_save = ficha_producto
#log para depuracion
'''
f = open(DIR + "/para_basedatos.txt","a+")
f.write(str(ficha_producto) + "__down__" + "\n" )
f.close()
'''
except zmq.Again:
pass
#ZMQ connection for download real_data (measures from myserial.py)
try:
temporal = socket_sub2.recv(flags=zmq.NOBLOCK).split()
if temporal != "":
real_data = temporal
except zmq.Again:
pass
########################## ZMQ connections #######################################
delta = end_time - start_time
if delta <= TIME_BCK:
BACKUP = False
end_time = time.time()
else:
start_time = time.time()
end_time = time.time()
BACKUP = True
#Aqui se determina el tiempo con que guarda datos la BD.- 23 julio: no estoy seguro que sea asi como lo puse antes...
time.sleep(TIME_MIN_BD)
try:
f = open(DIR + "/flag_database.txt","r")
flag_database = f.readlines()[-1][:-1]
f.close()
#logging.info("FLAG_DATABASE WHILE SECUNDARIO:")
if flag_database == "True":
flag_database_local = True
else:
flag_database_local = False
except:
logging.info("no se pudo leer el flag en el while secundario")
#log de grabacion: cada 10 seg (dado el time sleep: TIME_MIN_BD del while) se actualiza el log
if i is 100:
try:
#nuevo 23 julio 2020
update_db(real_data, ficha_producto, connector, c, first_time, True)
i = 0
except:
logging.info("no se pudo leer grabar el log de grabar on")
i += 1
if __name__ == "__main__":
main()