Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions realtimeMonitoring/realtimeGraph/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,4 +14,8 @@
path('logout/', LogoutView.as_view(), name='logout'),
path('historical/data',
download_csv_data, name='historical-data'),
#endpoint de estadisticas por hora
path("hourlyStats/", hourly_stats, name="hourlyStats"),
path("hourlyStats/<str:measure>", hourly_stats, name="hourlyStats"),

]
53 changes: 53 additions & 0 deletions realtimeMonitoring/realtimeGraph/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
from realtimeMonitoring import settings
import dateutil.relativedelta
from django.db.models import Avg, Max, Min, Sum
from django.db.models.functions import TruncHour


class DashboardView(TemplateView):
Expand Down Expand Up @@ -673,3 +674,55 @@ def get_statistic(dictionary, key):
@ register.filter
def add_str(str1, str2):
return str1 + str2


# POSTGRES
def hourly_stats(request, **kwargs):
measureParam = kwargs.get("measure", None)

measurements = Measurement.objects.all()
if measureParam is not None:
selectedMeasure = Measurement.objects.filter(name=measureParam)[0]
elif measurements.count() > 0:
selectedMeasure = measurements[0]
else:
return JsonResponse({"error": "No measurements found"}, status=400)

start, end = get_daterange(request)

qs = (
Data.objects
.filter(
measurement__name=selectedMeasure.name,
time__gte=start,
time__lte=end,
)
.annotate(hour=TruncHour("time"))
.values("hour")
.annotate(
min=Min("value"),
max=Max("value"),
avg=Avg("value"),
n=Count("time"),
)
.order_by("hour")
)

points = []
for row in qs:
hour_dt = row["hour"]
t_ms = int(hour_dt.timestamp() * 1000) if hour_dt else None
points.append({
"t": t_ms,
"min": row["min"] or 0,
"max": row["max"] or 0,
"avg": round(row["avg"], 2) if row["avg"] else 0,
"n": row["n"] or 0,
})

return JsonResponse({
"measure": selectedMeasure.name,
"from": int(start.timestamp() * 1000),
"to": int(end.timestamp() * 1000),
"points": points,
})