Spaces:
Sleeping
Sleeping
import flask | |
from flask import request, jsonify | |
import os | |
import sqlite3 | |
from datetime import datetime | |
import matplotlib.pyplot as plt | |
import io | |
import base64 | |
from dotenv import load_dotenv | |
import globs | |
from flask import render_template | |
load_dotenv() | |
# Инициализация базы данных | |
def init_db(db_name): | |
conn = sqlite3.connect(db_name) | |
cursor = conn.cursor() | |
# Создаем таблицу | |
cursor.execute(''' | |
CREATE TABLE IF NOT EXISTS system_data ( | |
id INTEGER PRIMARY KEY AUTOINCREMENT, -- Автоинкрементный счётчик | |
date_time TEXT, -- Дата и время | |
dey TEXT, | |
wek TEXT, | |
v_hid TEXT, | |
v_min TEXT, | |
ph TEXT, | |
ec TEXT, | |
tS TEXT, | |
tA TEXT, | |
hDm TEXT, | |
sVen TEXT, | |
rFul TEXT, | |
rLi TEXT, | |
rWat TEXT, | |
rRas TEXT, | |
rPH TEXT, | |
rEC TEXT, | |
rSl TEXT, | |
rLe TEXT, | |
alW TEXT | |
) | |
''') | |
conn.commit() | |
conn.close() | |
# Глобальные переменные | |
globs.dey = 0 | |
globs.wek = 0 | |
globs.v_hid = 0 | |
globs.v_min = 0 | |
globs.ph = 0 | |
globs.ec = 0 | |
globs.tS = 0 | |
globs.tA = 0 | |
globs.hDm = 0 | |
globs.sVen = 0 | |
globs.rFul = 0 | |
globs.rLi = 0 | |
globs.rWat = 0 | |
globs.rRas = 0 | |
globs.rPH = 0 | |
globs.rEC = 0 | |
globs.rSl = 0 | |
globs.rLe = 0 | |
globs.alW = 0 | |
globs.ph_eep = 0 | |
globs.ph_on_eep = 0 | |
globs.ec_eep = 0 | |
globs.ec_A_eep = 0 | |
globs.ec_B_eep = 0 | |
globs.ec_C_eep = 0 | |
globs.l_ON_h_eep = 0 | |
globs.l_ON_m_eep = 0 | |
globs.l_OFF_h_eep = 0 | |
globs.l_OFF_m_eep = 0 | |
globs.t_Voz_eep = 0 | |
# Создаем экземпляр Flask-приложения | |
app = flask.Flask(__name__, template_folder="./") | |
app.config['DEBUG'] = True | |
# Функция сохранения в базу | |
def save_data_to_db(db_name, data): | |
try: | |
conn = sqlite3.connect(db_name) | |
cursor = conn.cursor() | |
# Получаем текущую дату и время | |
current_time = datetime.now().strftime('%Y-%m-%d %H:%M:%S') | |
# Вставляем данные в таблицу | |
cursor.execute(''' | |
INSERT INTO system_data ( | |
date_time, dey, wek, v_hid, v_min, ph, ec, tS, tA, hDm, sVen, rFul, rLi, rWat, rRas, rPH, rEC, rSl, rLe, alW | |
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) | |
''', ( | |
current_time, # Дата и время | |
data['dey'], data['wek'], data['v_hid'], data['v_min'], data['ph'], data['ec'], | |
data['tS'], data['tA'], data['hDm'], data['sVen'], data['rFul'], data['rLi'], | |
data['rWat'], data['rRas'], data['rPH'], data['rEC'], data['rSl'], data['rLe'], data['alW'] | |
)) | |
conn.commit() | |
conn.close() | |
except Exception as e: | |
return jsonify({'status': 'error', 'message': str(e)}), 500 | |
# Маршрут сохранения в базу | |
def sav_db_api(): | |
# Инициализируем базу данных | |
init_db('system_data.db') | |
# Получаем данные из запроса | |
data = { | |
'dey': request.args.get('dey'), | |
'wek': request.args.get('wek'), | |
'v_hid': request.args.get('v_hid'), | |
'v_min': request.args.get('v_min'), | |
'ph': request.args.get('ph'), | |
'ec': request.args.get('ec'), | |
'tS': request.args.get('tS'), | |
'tA': request.args.get('tA'), | |
'hDm': request.args.get('hDm'), | |
'sVen': request.args.get('sVen'), | |
'rFul': request.args.get('rFul'), | |
'rLi': request.args.get('rLi'), | |
'rWat': request.args.get('rWat'), | |
'rRas': request.args.get('rRas'), | |
'rPH': request.args.get('rPH'), | |
'rEC': request.args.get('rEC'), | |
'rSl': request.args.get('rSl'), | |
'rLe': request.args.get('rLe'), | |
'alW': request.args.get('alW') | |
} | |
# Проверяем, что все необходимые параметры переданы | |
required_params = ['dey', 'wek', 'v_hid', 'v_min', 'ph', 'ec', 'tS', 'tA', 'hDm', 'sVen', 'rFul', 'rLi', 'rWat', 'rRas', 'rPH', 'rEC', 'rSl', 'rLe', 'alW'] | |
for param in required_params: | |
if data[param] is None: | |
return jsonify({'status': 'error', 'message': f'Отсутствует параметр: {param}'}), 400 | |
# Сохраняем данные в базу | |
save_data_to_db('system_data.db', data) | |
# Возвращаем ответ | |
return jsonify({'status': 'success', 'message': 'Данные сохранены'}) | |
# Маршрут для вывода всех данных из таблицы | |
def get_all_data(): | |
try: | |
conn = sqlite3.connect('system_data.db') | |
cursor = conn.cursor() | |
# Выполняем запрос для получения всех данных из таблицы | |
cursor.execute('SELECT * FROM system_data') | |
rows = cursor.fetchall() | |
# Получаем названия столбцов | |
column_names = [description[0] for description in cursor.description] | |
# Преобразуем данные в формат JSON | |
data = [] | |
for row in rows: | |
data.append(dict(zip(column_names, row))) | |
conn.close() | |
# Возвращаем данные в формате JSON | |
return jsonify(data) | |
except Exception as e: | |
return jsonify({'status': 'error', 'message': str(e)}), 500 | |
# Маршрут для вывода графика pH с датой и временем | |
def plot_ph(): | |
try: | |
conn = sqlite3.connect('system_data.db') | |
cursor = conn.cursor() | |
# Выполняем запрос для получения данных по параметру ph, dey и wek | |
cursor.execute('SELECT date_time, ph, dey, wek FROM system_data ORDER BY date_time') | |
rows = cursor.fetchall() | |
conn.close() | |
# Проверяем, есть ли данные | |
if not rows: | |
return jsonify({'status': 'error', 'message': 'Нет данных для построения графика'}), 400 | |
# Разделяем данные на дату и время, а также добавляем значения из столбцов dey и wek | |
dates = [f"{row[0]} d: {row[2]} w: {row[3]}" for row in rows] # Дата и время + dey + wek | |
ph_values = [float(row[1]) for row in rows] # Значения pH | |
# Создаем график | |
plt.figure(figsize=(15, 6)) # Увеличиваем ширину графика | |
plt.plot(dates, ph_values, marker='o', linestyle='-', color='b') # Точки соединены линией | |
plt.title('График значений pH') | |
plt.xlabel('Дата и время') | |
plt.ylabel('Значение pH') | |
plt.xticks(rotation=90) # Поворачиваем подписи оси X вертикально | |
plt.grid(True) | |
# Убираем лишние надписи на графике | |
plt.tick_params(axis='x', which='both', length=0) # Убираем засечки на оси X | |
# Автоматическое масштабирование подписей оси X | |
plt.gca().xaxis.set_major_locator(plt.MaxNLocator(10)) # Отображаем не более 10 подписей | |
# Увеличиваем ширину надписей оси X | |
plt.gcf().subplots_adjust(bottom=0.4) # Увеличиваем пространство снизу для надписей | |
# Сохраняем график в буфер | |
buffer = io.BytesIO() | |
plt.savefig(buffer, format='png') | |
buffer.seek(0) | |
# Кодируем график в base64 | |
plot_data = base64.b64encode(buffer.getvalue()).decode('utf-8') | |
# Возвращаем график в формате HTML | |
return f''' | |
<html> | |
<body> | |
<h1>График значений pH</h1> | |
<img src="data:image/png;base64,{plot_data}" alt="График pH"> | |
</body> | |
</html> | |
''' | |
except Exception as e: | |
return jsonify({'status': 'error', 'message': str(e)}), 500 | |
def index(): | |
return flask.render_template('index.html') | |
def online(): | |
return render_template('online.html') | |
def online_api(): | |
return jsonify(dey=globs.dey, | |
wek=globs.wek, | |
v_hid=globs.v_hid, | |
v_min=globs.v_min, | |
ph=globs.ph, | |
ec=globs.ec, | |
tS=globs.tS, | |
tA=globs.tA, | |
hDm=globs.hDm, | |
sVen=globs.sVen, | |
rFul=globs.rFul, | |
rLi=globs.rLi, | |
rWat=globs.rWat, | |
rRas=globs.rRas, | |
rPH=globs.rPH, | |
rEC=globs.rEC, | |
rSl=globs.rSl, | |
rLe=globs.rLe, | |
alW=globs.alW | |
) | |
def settings(): | |
return render_template('settings.html') | |
def settings_api(): | |
return jsonify(ph_eep=globs.ph_eep, | |
ph_on_eep=globs.ph_on_eep, | |
ec_eep=globs.ec_eep, | |
ec_A_eep=globs.ec_A_eep, | |
ec_B_eep=globs.ec_B_eep, | |
ec_C_eep=globs.ec_C_eep, | |
l_ON_h_eep=globs.l_ON_h_eep, | |
l_ON_m_eep=globs.l_ON_m_eep, | |
l_OFF_h_eep=globs.l_OFF_h_eep, | |
l_OFF_m_eep=globs.l_OFF_m_eep, | |
t_Voz_eep=globs.t_Voz_eep | |
) | |
def set_pH_value(): | |
ph_value = request.args.get('value') | |
globs.ph_set = ph_value | |
globs.eep_set = 1 | |
return "pH value set successfully" | |
def ph_on_value(): | |
ph_on_value = request.args.get('value') | |
globs.ph_on_set = ph_on_value | |
globs.eep_set = 2 | |
return "EC value set successfully" | |
def set_EC_value(): | |
ec_value = request.args.get('value') | |
globs.ec_set = ec_value | |
globs.eep_set = 3 | |
return "EC value set successfully" | |
def ec_A_setValue(): | |
ec_A_setValue = request.args.get('value') | |
globs.ec_A_set = ec_A_setValue | |
globs.eep_set = 4 | |
return "EC value set successfully" | |
def ec_B_setValue(): | |
ec_B_setValue = request.args.get('value') | |
globs.ec_B_set = ec_B_setValue | |
globs.eep_set = 5 | |
return "EC value set successfully" | |
def ec_C_setValue(): | |
ec_C_setValue = request.args.get('value') | |
globs.ec_C_set = ec_C_setValue | |
globs.eep_set = 6 | |
return "EC value set successfully" | |
def l_ON_set(): | |
globs.l_ON_h_set = request.args.get('l_ON_h_set') | |
globs.l_ON_m_set = request.args.get('l_ON_m_set') | |
globs.eep_set = 7 | |
return "EC value set successfully" | |
def l_OFF_set(): | |
globs.l_OFF_h_set = request.args.get('l_OFF_h_set') | |
globs.l_OFF_m_set = request.args.get('l_OFF_m_set') | |
globs.eep_set = 8 | |
return "EC value set successfully" | |
def t_Voz_eep_set(): | |
t_Voz_eep_set = request.args.get('value') | |
globs.ec_t_Voz_set = t_Voz_eep_set | |
globs.eep_set = 9 | |
return "EC value set successfully" | |
def but_start(): | |
globs.eep_set = 10 | |
return jsonify(value_set="start") | |
def but_stop(): | |
globs.eep_set = 11 | |
return jsonify(value_set="stop") | |
def but_res(): | |
globs.eep_set = 12 | |
return jsonify(value_set="res") | |
def but_sliv(): | |
globs.eep_set = 13 | |
return jsonify(value_set="sliv") | |
def handle_api(): | |
response = api() | |
return response | |
def handle_save_db(): | |
response = save_db() | |
return response | |
def set_res(): | |
globs.eep_set = 0 | |
return jsonify(value_set="reset") | |
if __name__ == '__main__': | |
app.run(host='0.0.0.0', port=int(os.environ.get('PORT', 7860))) |