poprawki
This commit is contained in:
52
app.py
52
app.py
@@ -7,7 +7,7 @@ import logging
|
||||
from flask import Flask, render_template, jsonify, request
|
||||
from flask_socketio import SocketIO
|
||||
from influxdb import InfluxDBClient
|
||||
from datetime import datetime, timedelta
|
||||
from datetime import datetime, timedelta, timezone
|
||||
import config
|
||||
import hashlib
|
||||
|
||||
@@ -144,17 +144,22 @@ def get_timeseries(phase_id):
|
||||
finally:
|
||||
client.close()
|
||||
|
||||
from datetime import datetime, timedelta, timezone
|
||||
|
||||
@app.route('/api/events')
|
||||
def get_events():
|
||||
client = get_influx_client()
|
||||
range_p = request.args.get('range', '24h')
|
||||
start_p = request.args.get('start')
|
||||
end_p = request.args.get('end')
|
||||
|
||||
now_utc = datetime.now(timezone.utc)
|
||||
|
||||
# Blokada dla zakresów powyżej 61 dni
|
||||
if not (start_p and end_p) and "d" in range_p:
|
||||
try:
|
||||
days = int(''.join(filter(str.isdigit, range_p)))
|
||||
if days > 61:
|
||||
return jsonify({"error": "range_too_large", "message": "Zbyt duży zakres. Zaznacz obszar na wykresie."})
|
||||
except: pass
|
||||
|
||||
if start_p and end_p:
|
||||
dt_view_start = datetime.fromisoformat(start_p.replace('Z', '+00:00'))
|
||||
dt_view_end = datetime.fromisoformat(end_p.replace('Z', '+00:00'))
|
||||
@@ -164,7 +169,6 @@ def get_events():
|
||||
num = int(''.join(filter(str.isdigit, clean_range)))
|
||||
unit = clean_range[-1]
|
||||
delta = timedelta(hours=num) if unit == 'h' else timedelta(days=num)
|
||||
|
||||
dt_view_start = now_utc - delta
|
||||
dt_view_end = now_utc
|
||||
time_filter = f"time > now() - {clean_range} - 24h"
|
||||
@@ -172,12 +176,13 @@ def get_events():
|
||||
all_events = []
|
||||
try:
|
||||
for p_id, p_cfg in config.PHASES.items():
|
||||
# min() + fill(0) dla pewnego wykrywania zaników
|
||||
query = f'''
|
||||
SELECT mean("value") AS volts
|
||||
SELECT min("value") AS volts
|
||||
FROM "{config.MEASUREMENT}"
|
||||
WHERE "entity_id" = '{p_cfg["entity_id"]}'
|
||||
AND {time_filter}
|
||||
GROUP BY time(1m) fill(none)
|
||||
GROUP BY time(1m) fill(0)
|
||||
'''
|
||||
result = client.query(query)
|
||||
points = list(result.get_points())
|
||||
@@ -185,14 +190,31 @@ def get_events():
|
||||
i = 0
|
||||
while i < len(points):
|
||||
val = points[i].get('volts')
|
||||
if val is not None and float(val) < 207:
|
||||
if val is None:
|
||||
i += 1
|
||||
continue
|
||||
|
||||
v_now = float(val)
|
||||
ev_type = None
|
||||
|
||||
if v_now < 100: ev_type = "zanik"
|
||||
elif 100 <= v_now < 207: ev_type = "niskie"
|
||||
elif v_now > 253: ev_type = "wysokie"
|
||||
|
||||
if ev_type:
|
||||
start_str = points[i]['time']
|
||||
dt_s = datetime.fromisoformat(start_str.replace('Z', '+00:00'))
|
||||
|
||||
j = i
|
||||
while j + 1 < len(points):
|
||||
v_next = points[j+1].get('volts')
|
||||
if v_next is not None and float(v_next) < 207:
|
||||
v_next_val = points[j+1].get('volts')
|
||||
next_type = None
|
||||
if v_next_val is not None:
|
||||
v_next = float(v_next_val)
|
||||
if v_next < 100: next_type = "zanik"
|
||||
elif 100 <= v_next < 207: next_type = "niskie"
|
||||
elif v_next > 253: next_type = "wysokie"
|
||||
|
||||
if next_type == ev_type:
|
||||
j += 1
|
||||
else:
|
||||
break
|
||||
@@ -200,19 +222,19 @@ def get_events():
|
||||
end_str = points[j]['time']
|
||||
dt_e = datetime.fromisoformat(end_str.replace('Z', '+00:00'))
|
||||
|
||||
duration = (dt_e - dt_s).total_seconds() / 120
|
||||
duration = (dt_e - dt_s).total_seconds() / 60 + 1
|
||||
|
||||
if duration >= 0.5:
|
||||
if duration >= 5.1:
|
||||
if dt_e >= dt_view_start and dt_s <= dt_view_end:
|
||||
all_events.append({
|
||||
"start": start_str,
|
||||
"end": end_str,
|
||||
"phase": p_id,
|
||||
"duration": round(duration, 1)
|
||||
"type": ev_type,
|
||||
"duration": int(round(duration, 0))
|
||||
})
|
||||
i = j
|
||||
i += 1
|
||||
|
||||
return jsonify(sorted(all_events, key=lambda x: x['start'], reverse=True))
|
||||
except Exception as e:
|
||||
app.logger.error(f"Event Logic Error: {e}")
|
||||
|
||||
Reference in New Issue
Block a user