Skip to content

Commit 736de9b

Browse files
committed
WIP: add event to selection for chart
Signed-off-by: Jonas Remmert <jremmert@gmx.net>
1 parent 54267c3 commit 736de9b

File tree

2 files changed

+55
-48
lines changed

2 files changed

+55
-48
lines changed

server/django/sensordata/templates/device_dashboard.html

Lines changed: 24 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ <h3>Endpoint Details</h3>
6767
<th>Battery Voltage</th>
6868
<td>
6969
{% if selected_endpoint.battery_voltage %}
70-
{{ selected_endpoint.battery_voltage }} V
70+
{{ selected_endpoint.battery_voltage }} %
7171
{% else %}
7272
N/A
7373
{% endif %}
@@ -93,6 +93,20 @@ <h3>Endpoint Details</h3>
9393
</div>
9494
</div>
9595

96+
<div class="row mt-4">
97+
<div class="col-sm-12 col-md-6">
98+
<div class="form-group">
99+
<label for="event_type">Select Event for Visualization:</label>
100+
<select class="form-control" id="event_type" name="event_type">
101+
<option value="">-- Select an Event --</option>
102+
{% for event_type in event_types %}
103+
<option value="{{ event_type }}"> {{ event_type }} </option>
104+
{% endfor %}
105+
</select>
106+
</div>
107+
</div>
108+
</div>
109+
96110
<div class="row mt-4">
97111
<div class="col-sm-12 col-md-6">
98112
<div class="form-group">
@@ -116,7 +130,7 @@ <h3>Endpoint Details</h3>
116130

117131
<div class="row mt-4">
118132
<div class="col-sm-12">
119-
<h3 id="chartTitle">Resource Data</h3>
133+
<h3 id="chartTitle">Chart</h3>
120134
<div style="height: 400px; width: 100%;">
121135
<canvas id="resourceChart"></canvas>
122136
</div>
@@ -185,6 +199,7 @@ <h3 id="chartTitle">Resource Data</h3>
185199
options: {
186200
responsive: true,
187201
maintainAspectRatio: false,
202+
animation: false,
188203
plugins: {
189204
legend: {
190205
display: true,
@@ -256,10 +271,11 @@ <h3 id="chartTitle">Resource Data</h3>
256271
}
257272
});
258273

259-
document.getElementById('chartTitle').textContent = 'Resource Data for ' + data.resource_name;
274+
document.getElementById('chartTitle').textContent = 'Chart for ' + data.resource_name;
260275
}
261276

262277
var resourceTypeElement = document.getElementById('resource_type');
278+
var eventTypeElement = document.getElementById('event_type');
263279
var lowerLimitInput = document.getElementById('lower_limit');
264280
var upperLimitInput = document.getElementById('upper_limit');
265281
var maxYValueInput = document.getElementById('max_y_value');
@@ -268,9 +284,10 @@ <h3 id="chartTitle">Resource Data</h3>
268284
function fetchData(lowerLimit, upperLimit, maxYValue) {
269285
var endpoint = '{{ selected_endpoint.endpoint }}';
270286
var resourceType = resourceTypeElement ? resourceTypeElement.value : '';
287+
var eventType = eventTypeElement ? eventTypeElement.value : '';
271288

272289
if (endpoint && resourceType) {
273-
fetch(`?endpoint=${endpoint}&resource_type=${resourceType}`, {
290+
fetch(`?endpoint=${endpoint}&resource_type=${resourceType}&event_type=${eventType}`, {
274291
headers: {
275292
'X-Requested-With': 'XMLHttpRequest'
276293
}
@@ -305,13 +322,13 @@ <h3 id="chartTitle">Resource Data</h3>
305322
var upperLimit = parseFloat(upperLimitInput.value) || 100;
306323
var maxYValue = parseFloat(maxYValueInput.value) || null;
307324
fetchData(lowerLimit, upperLimit, maxYValue);
308-
}, 5000); // 5 seconds interval
325+
}, 1000); // 1 second interval
309326

310327
{% if graph_data %}
311328
updateChart({
312329
values: {{ graph_data.values | safe }},
313330
resource_name: '{{ selected_resource_type.name }}'
314-
}, {{ percentile_25 }}, {{ percentile_75 }}, null);
331+
}, null);
315332
{% endif %}
316333
});
317334

@@ -340,4 +357,4 @@ <h3 id="chartTitle">Resource Data</h3>
340357
</div>
341358
{% endif %}
342359
</div>
343-
{% endblock %}
360+
{% endblock %}

server/django/sensordata/views.py

Lines changed: 31 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -301,8 +301,8 @@ def device_dashboard_view(request):
301301
selected_resource_type = None
302302
graph_data = None
303303

304-
percentile_25 = None
305-
percentile_75 = None
304+
timestamps = []
305+
values = []
306306

307307
# Handle endpoint selection
308308
if 'endpoint' in request.GET:
@@ -339,13 +339,32 @@ def device_dashboard_view(request):
339339
selected_endpoint.battery_voltage = battery_voltage.int_value if battery_voltage else None
340340

341341
if 'resource_type' in request.GET:
342-
selected_resource_type = get_object_or_404(ResourceType, id=request.GET['resource_type'])
343-
last_seven_days = timezone.now() - timedelta(days=30)
344-
resources = Resource.objects.filter(
345-
endpoint=selected_endpoint,
346-
resource_type=selected_resource_type,
347-
timestamp_created__gte=last_seven_days
348-
).order_by('timestamp_created')
342+
if 'event_type' in request.GET and request.GET['event_type'] is not '':
343+
selected_resource_type = get_object_or_404(ResourceType,
344+
id=request.GET['resource_type'])
345+
last_event = Event.objects.filter(
346+
endpoint=selected_endpoint,
347+
event_type=request.GET['event_type']
348+
).order_by('-time').first()
349+
350+
evt_resources = EventResource.objects.filter(
351+
event=last_event
352+
).order_by('resource__timestamp_created')
353+
354+
resources = []
355+
for evt_resource in evt_resources:
356+
if evt_resource.resource.resource_type == selected_resource_type:
357+
resources.append(evt_resource.resource)
358+
359+
else:
360+
selected_resource_type = get_object_or_404(ResourceType,
361+
id=request.GET['resource_type'])
362+
last_seven_days = timezone.now() - timedelta(days=30)
363+
resources = Resource.objects.filter(
364+
endpoint=selected_endpoint,
365+
resource_type=selected_resource_type,
366+
timestamp_created__gte=last_seven_days
367+
).order_by('timestamp_created')
349368

350369
timestamps = [resource.timestamp_created.strftime('%Y-%m-%d %H:%M:%S') for resource in resources]
351370
values = [
@@ -354,57 +373,28 @@ def device_dashboard_view(request):
354373
else resource.int_value if selected_resource_type.data_type == 'TIME'
355374
else None for resource in resources
356375
]
357-
358-
if values:
359-
percentile_25 = np.percentile(values, 25)
360-
percentile_75 = np.percentile(values, 75)
361-
362376
graph_data = {
363377
'timestamps': timestamps,
364378
'values': values
365379
}
366380

367-
368381
resource_types = ResourceType.objects.filter(data_type__in=['INTEGER', 'FLOAT', 'TIME'])
382+
event_types = Event.objects.values_list('event_type', flat=True).distinct()
369383

370384
if request.headers.get('X-Requested-With') == 'XMLHttpRequest':
371-
if 'endpoint' in request.GET and 'resource_type' in request.GET:
372-
selected_endpoint = get_object_or_404(Endpoint, endpoint=request.GET['endpoint'])
373-
selected_resource_type = get_object_or_404(ResourceType, id=request.GET['resource_type'])
374-
last_thirty_days = timezone.now() - timedelta(days=30)
375-
resources = Resource.objects.filter(
376-
endpoint=selected_endpoint,
377-
resource_type=selected_resource_type,
378-
timestamp_created__gte=last_thirty_days
379-
).order_by('timestamp_created')
380-
timestamps = [resource.timestamp_created.strftime('%Y-%m-%d %H:%M:%S') for resource in resources]
381-
values = [
382-
resource.int_value if selected_resource_type.data_type == 'INTEGER'
383-
else resource.float_value if selected_resource_type.data_type == 'FLOAT'
384-
else resource.int_value if selected_resource_type.data_type == 'TIME'
385-
else None for resource in resources
386-
]
387-
388-
if values:
389-
percentile_25 = np.percentile(values, 25)
390-
percentile_75 = np.percentile(values, 75)
391-
392-
return JsonResponse({
385+
return JsonResponse({
393386
'timestamps': timestamps,
394387
'values': values,
395388
'resource_name': selected_resource_type.name,
396-
'percentile_25': percentile_25,
397-
'percentile_75': percentile_75
398389
})
399390

400391
context = {
401392
'endpoints': endpoints,
402393
'selected_endpoint': selected_endpoint,
403394
'resource_types': resource_types,
395+
'event_types': event_types,
404396
'selected_resource_type': selected_resource_type,
405397
'graph_data': graph_data,
406-
'percentile_25': percentile_25,
407-
'percentile_75': percentile_75,
408398
}
409399

410400
return render(request, 'device_dashboard.html', context)

0 commit comments

Comments
 (0)