From 980ceab8267515a86eeed945434e84083041e1e7 Mon Sep 17 00:00:00 2001 From: Jonas Remmert Date: Sun, 22 Sep 2024 19:31:03 +0200 Subject: [PATCH] WIP: add event to selection for chart Signed-off-by: Jonas Remmert --- .../templates/device_dashboard.html | 31 ++++++-- server/django/sensordata/views.py | 73 ++++++++----------- 2 files changed, 56 insertions(+), 48 deletions(-) diff --git a/server/django/sensordata/templates/device_dashboard.html b/server/django/sensordata/templates/device_dashboard.html index 690f1a2..42d4f51 100644 --- a/server/django/sensordata/templates/device_dashboard.html +++ b/server/django/sensordata/templates/device_dashboard.html @@ -67,7 +67,7 @@

Endpoint Details

Battery Voltage {% if selected_endpoint.battery_voltage %} - {{ selected_endpoint.battery_voltage }} V + {{ selected_endpoint.battery_voltage }} % {% else %} N/A {% endif %} @@ -93,6 +93,20 @@

Endpoint Details

+
+
+
+ + +
+
+
+
@@ -116,7 +130,7 @@

Endpoint Details

-

Resource Data

+

Chart

@@ -185,6 +199,7 @@

Resource Data

options: { responsive: true, maintainAspectRatio: false, + animation: false, plugins: { legend: { display: true, @@ -256,10 +271,11 @@

Resource Data

} }); - document.getElementById('chartTitle').textContent = 'Resource Data for ' + data.resource_name; + document.getElementById('chartTitle').textContent = 'Chart for ' + data.resource_name; } var resourceTypeElement = document.getElementById('resource_type'); + var eventTypeElement = document.getElementById('event_type'); var lowerLimitInput = document.getElementById('lower_limit'); var upperLimitInput = document.getElementById('upper_limit'); var maxYValueInput = document.getElementById('max_y_value'); @@ -268,9 +284,10 @@

Resource Data

function fetchData(lowerLimit, upperLimit, maxYValue) { var endpoint = '{{ selected_endpoint.endpoint }}'; var resourceType = resourceTypeElement ? resourceTypeElement.value : ''; + var eventType = eventTypeElement ? eventTypeElement.value : ''; if (endpoint && resourceType) { - fetch(`?endpoint=${endpoint}&resource_type=${resourceType}`, { + fetch(`?endpoint=${endpoint}&resource_type=${resourceType}&event_type=${eventType}`, { headers: { 'X-Requested-With': 'XMLHttpRequest' } @@ -305,13 +322,13 @@

Resource Data

var upperLimit = parseFloat(upperLimitInput.value) || 100; var maxYValue = parseFloat(maxYValueInput.value) || null; fetchData(lowerLimit, upperLimit, maxYValue); - }, 5000); // 5 seconds interval + }, 1000); // 1 second interval {% if graph_data %} updateChart({ values: {{ graph_data.values | safe }}, resource_name: '{{ selected_resource_type.name }}' - }, {{ percentile_25 }}, {{ percentile_75 }}, null); + }, null); {% endif %} }); @@ -340,4 +357,4 @@

Resource Data

{% endif %}
-{% endblock %} \ No newline at end of file +{% endblock %} diff --git a/server/django/sensordata/views.py b/server/django/sensordata/views.py index 18f3a7c..3a83423 100644 --- a/server/django/sensordata/views.py +++ b/server/django/sensordata/views.py @@ -301,8 +301,8 @@ def device_dashboard_view(request): selected_resource_type = None graph_data = None - percentile_25 = None - percentile_75 = None + timestamps = [] + values = [] # Handle endpoint selection if 'endpoint' in request.GET: @@ -339,13 +339,33 @@ def device_dashboard_view(request): selected_endpoint.battery_voltage = battery_voltage.int_value if battery_voltage else None if 'resource_type' in request.GET: - selected_resource_type = get_object_or_404(ResourceType, id=request.GET['resource_type']) - last_seven_days = timezone.now() - timedelta(days=30) - resources = Resource.objects.filter( - endpoint=selected_endpoint, - resource_type=selected_resource_type, - timestamp_created__gte=last_seven_days - ).order_by('timestamp_created') + if 'event_type' in request.GET and request.GET['event_type'] is not '': + selected_resource_type = get_object_or_404(ResourceType, + id=request.GET['resource_type']) + logger.info(request.GET) + last_event = Event.objects.filter( + endpoint=selected_endpoint, + event_type=request.GET['event_type'] + ).order_by('-time').first() + + evt_resources = EventResource.objects.filter( + event=last_event + ).order_by('resource__timestamp_created') + + resources = [] + for evt_resource in evt_resources: + if evt_resource.resource.resource_type == selected_resource_type: + resources.append(evt_resource.resource) + + else: + selected_resource_type = get_object_or_404(ResourceType, + id=request.GET['resource_type']) + last_seven_days = timezone.now() - timedelta(days=30) + resources = Resource.objects.filter( + endpoint=selected_endpoint, + resource_type=selected_resource_type, + timestamp_created__gte=last_seven_days + ).order_by('timestamp_created') timestamps = [resource.timestamp_created.strftime('%Y-%m-%d %H:%M:%S') for resource in resources] values = [ @@ -354,57 +374,28 @@ def device_dashboard_view(request): else resource.int_value if selected_resource_type.data_type == 'TIME' else None for resource in resources ] - - if values: - percentile_25 = np.percentile(values, 25) - percentile_75 = np.percentile(values, 75) - graph_data = { 'timestamps': timestamps, 'values': values } - resource_types = ResourceType.objects.filter(data_type__in=['INTEGER', 'FLOAT', 'TIME']) + event_types = Event.objects.values_list('event_type', flat=True).distinct() if request.headers.get('X-Requested-With') == 'XMLHttpRequest': - if 'endpoint' in request.GET and 'resource_type' in request.GET: - selected_endpoint = get_object_or_404(Endpoint, endpoint=request.GET['endpoint']) - selected_resource_type = get_object_or_404(ResourceType, id=request.GET['resource_type']) - last_thirty_days = timezone.now() - timedelta(days=30) - resources = Resource.objects.filter( - endpoint=selected_endpoint, - resource_type=selected_resource_type, - timestamp_created__gte=last_thirty_days - ).order_by('timestamp_created') - timestamps = [resource.timestamp_created.strftime('%Y-%m-%d %H:%M:%S') for resource in resources] - values = [ - resource.int_value if selected_resource_type.data_type == 'INTEGER' - else resource.float_value if selected_resource_type.data_type == 'FLOAT' - else resource.int_value if selected_resource_type.data_type == 'TIME' - else None for resource in resources - ] - - if values: - percentile_25 = np.percentile(values, 25) - percentile_75 = np.percentile(values, 75) - - return JsonResponse({ + return JsonResponse({ 'timestamps': timestamps, 'values': values, 'resource_name': selected_resource_type.name, - 'percentile_25': percentile_25, - 'percentile_75': percentile_75 }) context = { 'endpoints': endpoints, 'selected_endpoint': selected_endpoint, 'resource_types': resource_types, + 'event_types': event_types, 'selected_resource_type': selected_resource_type, 'graph_data': graph_data, - 'percentile_25': percentile_25, - 'percentile_75': percentile_75, } return render(request, 'device_dashboard.html', context)