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')
|