Spaces:
Running
Running
Update app.py
Browse files
app.py
CHANGED
|
@@ -180,59 +180,90 @@ def get_all_data():
|
|
| 180 |
|
| 181 |
|
| 182 |
|
| 183 |
-
|
| 184 |
-
@app.route('/plot_ph', methods=['GET'])
|
| 185 |
def plot_ph():
|
| 186 |
try:
|
| 187 |
-
|
| 188 |
-
|
| 189 |
-
|
| 190 |
-
|
| 191 |
-
|
| 192 |
-
|
| 193 |
-
|
| 194 |
-
|
| 195 |
-
|
| 196 |
-
|
| 197 |
-
|
| 198 |
-
|
| 199 |
-
|
| 200 |
-
|
| 201 |
-
|
| 202 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 203 |
|
| 204 |
-
#
|
| 205 |
-
|
| 206 |
-
plt.plot(dates, ph_values, marker='o', linestyle='-', color='b') # Точки соединены линией
|
| 207 |
-
plt.title('График значений pH')
|
| 208 |
-
plt.xlabel('Дата и время')
|
| 209 |
-
plt.ylabel('Значение pH')
|
| 210 |
-
plt.xticks(rotation=90) # Поворачиваем подписи оси X вертикально
|
| 211 |
-
plt.grid(True)
|
| 212 |
-
|
| 213 |
-
# Убираем лишние надписи на графике
|
| 214 |
-
plt.tick_params(axis='x', which='both', length=0) # Убираем засечки на оси X
|
| 215 |
-
|
| 216 |
-
# Автоматическое масштабирование подписей оси X
|
| 217 |
-
plt.gca().xaxis.set_major_locator(plt.MaxNLocator(10)) # Отображаем не более 10 подписей
|
| 218 |
-
|
| 219 |
-
# Увеличиваем ширину надписей оси X
|
| 220 |
-
plt.gcf().subplots_adjust(bottom=0.4) # Увеличиваем пространство снизу для надписей
|
| 221 |
-
|
| 222 |
-
# Сохраняем график в буфер
|
| 223 |
-
buffer = io.BytesIO()
|
| 224 |
-
plt.savefig(buffer, format='png')
|
| 225 |
-
buffer.seek(0)
|
| 226 |
-
|
| 227 |
-
# Кодируем график в base64
|
| 228 |
-
plot_data = base64.b64encode(buffer.getvalue()).decode('utf-8')
|
| 229 |
-
|
| 230 |
-
# Возвращаем график в формате HTML
|
| 231 |
-
return f'''
|
| 232 |
<html>
|
| 233 |
<body>
|
| 234 |
-
<h1
|
| 235 |
-
<
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 236 |
</body>
|
| 237 |
</html>
|
| 238 |
'''
|
|
@@ -246,7 +277,6 @@ def plot_ph():
|
|
| 246 |
|
| 247 |
|
| 248 |
|
| 249 |
-
|
| 250 |
@app.route("/")
|
| 251 |
def index():
|
| 252 |
return flask.render_template('index.html')
|
|
|
|
| 180 |
|
| 181 |
|
| 182 |
|
| 183 |
+
@app.route('/plot_ph', methods=['GET', 'POST'])
|
|
|
|
| 184 |
def plot_ph():
|
| 185 |
try:
|
| 186 |
+
# Если метод POST, обрабатываем данные из формы
|
| 187 |
+
if request.method == 'POST':
|
| 188 |
+
start_date = request.form.get('start_date')
|
| 189 |
+
end_date = request.form.get('end_date')
|
| 190 |
+
|
| 191 |
+
# Преобразуем даты в формат datetime
|
| 192 |
+
start_date = datetime.strptime(start_date, '%Y-%m-%dT%H:%M')
|
| 193 |
+
end_date = datetime.strptime(end_date, '%Y-%m-%dT%H:%M')
|
| 194 |
+
|
| 195 |
+
conn = sqlite3.connect('system_data.db')
|
| 196 |
+
cursor = conn.cursor()
|
| 197 |
+
|
| 198 |
+
# Выполняем запрос для получения данных по параметру ph, dey и wek в заданном диапазоне
|
| 199 |
+
cursor.execute('''
|
| 200 |
+
SELECT date_time, ph, dey, wek
|
| 201 |
+
FROM system_data
|
| 202 |
+
WHERE date_time BETWEEN ? AND ?
|
| 203 |
+
ORDER BY date_time
|
| 204 |
+
''', (start_date, end_date))
|
| 205 |
+
rows = cursor.fetchall()
|
| 206 |
+
|
| 207 |
+
conn.close()
|
| 208 |
+
|
| 209 |
+
# Проверяем, есть ли данные
|
| 210 |
+
if not rows:
|
| 211 |
+
return jsonify({'status': 'error', 'message': 'Нет данных для построения графика в выбранном диапазоне'}), 400
|
| 212 |
+
|
| 213 |
+
# Разделяем данные на дату и время, а также добавляем значения из столбцов dey и wek
|
| 214 |
+
dates = [f"{row[0]} d: {row[2]} w: {row[3]}" for row in rows] # Дата и время + dey + wek
|
| 215 |
+
ph_values = [float(row[1]) for row in rows] # Значения pH
|
| 216 |
+
|
| 217 |
+
# Создаем график
|
| 218 |
+
plt.figure(figsize=(15, 6)) # Увеличиваем ширину графика
|
| 219 |
+
plt.plot(dates, ph_values, marker='o', linestyle='-', color='b') # Точки соединены линией
|
| 220 |
+
plt.title('График значений pH')
|
| 221 |
+
plt.xlabel('Дата и время')
|
| 222 |
+
plt.ylabel('Значение pH')
|
| 223 |
+
plt.xticks(rotation=90) # Поворачиваем подписи оси X вертикально
|
| 224 |
+
plt.grid(True)
|
| 225 |
+
|
| 226 |
+
# Убираем лишние надписи на графике
|
| 227 |
+
plt.tick_params(axis='x', which='both', length=0) # Убираем засечки на оси X
|
| 228 |
+
|
| 229 |
+
# Автоматическое масштабирование подписей оси X
|
| 230 |
+
plt.gca().xaxis.set_major_locator(plt.MaxNLocator(10)) # Отображаем не более 10 подписей
|
| 231 |
+
|
| 232 |
+
# Увеличиваем ширину надписей оси X
|
| 233 |
+
plt.gcf().subplots_adjust(bottom=0.4) # Увеличиваем пространство снизу для надписей
|
| 234 |
+
|
| 235 |
+
# Сохраняем график в буфер
|
| 236 |
+
buffer = io.BytesIO()
|
| 237 |
+
plt.savefig(buffer, format='png')
|
| 238 |
+
buffer.seek(0)
|
| 239 |
+
|
| 240 |
+
# Кодируем график в base64
|
| 241 |
+
plot_data = base64.b64encode(buffer.getvalue()).decode('utf-8')
|
| 242 |
+
|
| 243 |
+
# Возвращаем график в формате HTML
|
| 244 |
+
return f'''
|
| 245 |
+
<html>
|
| 246 |
+
<body>
|
| 247 |
+
<h1>График значений pH</h1>
|
| 248 |
+
<img src="data:image/png;base64,{plot_data}" alt="График pH">
|
| 249 |
+
</body>
|
| 250 |
+
</html>
|
| 251 |
+
'''
|
| 252 |
|
| 253 |
+
# Если метод GET, отображаем форму для выбора даты и времени
|
| 254 |
+
return '''
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 255 |
<html>
|
| 256 |
<body>
|
| 257 |
+
<h1>Выберите диапазон даты и времени для графика pH</h1>
|
| 258 |
+
<form method="POST">
|
| 259 |
+
<label for="start_date">Начало:</label>
|
| 260 |
+
<input type="datetime-local" id="start_date" name="start_date" required>
|
| 261 |
+
<br><br>
|
| 262 |
+
<label for="end_date">Конец:</label>
|
| 263 |
+
<input type="datetime-local" id="end_date" name="end_date" required>
|
| 264 |
+
<br><br>
|
| 265 |
+
<button type="submit">Показать график</button>
|
| 266 |
+
</form>
|
| 267 |
</body>
|
| 268 |
</html>
|
| 269 |
'''
|
|
|
|
| 277 |
|
| 278 |
|
| 279 |
|
|
|
|
| 280 |
@app.route("/")
|
| 281 |
def index():
|
| 282 |
return flask.render_template('index.html')
|