Skip to content

Commit

Permalink
Speeded up graphs.
Browse files Browse the repository at this point in the history
  • Loading branch information
shajen committed Feb 4, 2024
1 parent 9f7d6e1 commit 337754d
Show file tree
Hide file tree
Showing 2 changed files with 30 additions and 21 deletions.
15 changes: 9 additions & 6 deletions graphs/models.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
from django.db.models.functions import TruncMinute, TruncHour, TruncDay, TruncWeek, TruncMonth, TruncYear
from django.db.models import Min, Max, Avg, Count
from datetime import timedelta
from django.db import models
from django.db.models import Count, F, Value
from django.db.models import F, Func, Value
from django.db.models import Min, Max, Avg, Count
from django.db.models.functions import TruncMinute, TruncHour, TruncDay, TruncWeek, TruncMonth, TruncYear
from django.utils import timezone
from datetime import timedelta


class SensorType(models.Model):
Expand Down Expand Up @@ -39,7 +41,7 @@ class Sensor(models.Model):
def __str__(self):
return "%s (%s)" % (self.name, self.serial)

def get_data(self, aggregation_time, min_max_enabled):
def get_data(self, datetime_begin, datetime_end, aggregation_time, min_max_enabled):
data = {}
data["name"] = self.name
data["unit"] = self.sensor_type.unit
Expand All @@ -60,10 +62,11 @@ def get_data(self, aggregation_time, min_max_enabled):
trunc = TruncMinute

measurements = (
self.measurement_set.annotate(date=trunc("posted_date"))
self.measurement_set.filter(posted_date__range=(datetime_begin, datetime_end))
.annotate(date=trunc("posted_date"))
.values("date")
.annotate(min=Min("value"), max=Max("value"), avg=Avg("value"), count=Count("id"))
.order_by()
.order_by("date")
)
data["mean_data"] = [[m["date"].timestamp() * 1000, m["avg"]] for m in measurements]
if min_max_enabled:
Expand Down
36 changes: 21 additions & 15 deletions graphs/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,23 @@
from monitor.settings import FALLBACK_API_KEY


@require_http_methods(["GET"])
def get_datetime_range(request):
now = timezone.now()
last_hours = request.GET.get("last_hours", "")
datetime_begin = request.GET.get("datetime_begin", "")
datetime_end = request.GET.get("datetime_end", "")

if not last_hours and not datetime_begin:
last_hours = 24
if last_hours:
datetime_begin = now - timedelta(hours=int(last_hours))
datetime_end = now
if not datetime_end:
datetime_end = now
return (datetime_begin, datetime_end)


@require_http_methods(["GET"])
def temperature_measurement_add(request):
data = {"status": 0}
Expand Down Expand Up @@ -42,19 +59,7 @@ def temperature_measurement_add(request):
@login_required()
@permission_required("graphs.view_sensor", raise_exception=True)
def prefetch_sensors_measurement(request, sensors):
now = timezone.now()
last_hours = request.GET.get("last_hours", "")
datetime_begin = request.GET.get("datetime_begin", "")
datetime_end = request.GET.get("datetime_end", "")

if not last_hours and not datetime_begin:
last_hours = 24
if last_hours:
datetime_begin = now - timedelta(hours=int(last_hours))
datetime_end = now
if not datetime_end:
datetime_end = now

(datetime_begin, datetime_end) = get_datetime_range(request)
measurements = Measurement.objects.filter(posted_date__range=(datetime_begin, datetime_end)).order_by("posted_date")
return sensors.prefetch_related(Prefetch("measurement_set", queryset=measurements))

Expand All @@ -78,7 +83,7 @@ def get_sensors(request):
except:
sensors = Sensor.objects.none()
name = ""
return (prefetch_sensors_measurement(request, sensors), name)
return (sensors, name)


@require_http_methods(["GET"])
Expand All @@ -90,7 +95,8 @@ def graphs(request):
aggregation_time = request.GET.get("aggregation_time", "minute")
min_max_enabled = "min_max" in request.GET
(sensors, data["name"]) = get_sensors(request)
data["sensors"] = [s.get_data(aggregation_time, min_max_enabled) for s in sensors]
(datetime_begin, datetime_end) = get_datetime_range(request)
data["sensors"] = [s.get_data(datetime_begin, datetime_end, aggregation_time, min_max_enabled) for s in sensors]
return JsonResponse(data, safe=False)
else:
(_, name) = get_sensors(request)
Expand Down

0 comments on commit 337754d

Please sign in to comment.