diff --git a/backend/app/views.py b/backend/app/views.py index 6934b6337f69e34e773a95964cdb28d984087440..cac6be3190eb6cde1b2d57185446c1dff11b9c2b 100644 --- a/backend/app/views.py +++ b/backend/app/views.py @@ -1,8 +1,10 @@ +import os from django.shortcuts import render from django.http import JsonResponse from django.views.decorators.csrf import ensure_csrf_cookie, csrf_protect import json - +from backend.utils.influx import InfluxDBHelper +from dotenv import load_dotenv from django.views.decorators.http import require_http_methods from django.views.decorators.csrf import csrf_exempt from django.contrib.auth import authenticate, login, logout @@ -28,7 +30,7 @@ def login_view(request): return JsonResponse( {"success": False, "message": "Invalid JSON"}, status=400 ) - + user = authenticate(request, username=email, password=password) if user: @@ -65,3 +67,38 @@ def register(request): else: errors = form.errors.as_json() return JsonResponse({"error": errors}, status=400) + +@require_http_methods(["GET"]) +def room_data_range(request): + try: + data = json.loads(request.body.decode("utf-8")) + room = data["room"] + start = data["start"] + stop = data["stop"] + + if not room: + return JsonResponse({"error": "Missing 'room' parameter"}, status=400) + + load_dotenv() + client = InfluxDBHelper( + url=os.getenv("INFLUXDB_URL"), + token=os.getenv("INFLUXDB_TOKEN"), + org=os.getenv("INFLUXDB_ORG"), + bucket=os.getenv("INFLUXDB_BUCKET"), + ) + + tables = client.get_room_data_in_range(room, start, stop) + results = [] + for table in tables: + for record in table.records: + results.append({ + "time": str(record.get_time()), + "field": record.get_field(), + "value": record.get_value(), + }) + + return JsonResponse({"room": room, "data": results}, status = 200) + except json.JSONDecodeError: + return JsonResponse( + {"success": False, "message": "Invalid JSON"}, status=400 + ) diff --git a/backend/utils/influx.py b/backend/utils/influx.py index 44fa5c39fac94911d50dd5db03a5e34af74dbb43..01408c685ea7de624a56fd3dd1403d9e5fcf2f0e 100644 --- a/backend/utils/influx.py +++ b/backend/utils/influx.py @@ -39,14 +39,46 @@ class InfluxDBHelper: ''' return self.query_api.query(org=self.org, query=query) - def get_latest_room_data(self, room_id: str): - """ """ + def get_latest_room_data(self, room_id: str, start: str = "-5M", stop: str = "now()"): query = f''' from(bucket: "{self.bucket}") - |> range(start: -5m) - |> filter(fn: (r) => r["_measurement"] == "co2") - |> filter(fn: (r) => r["room"] == "{room_id}") - |> last() + |> range(start: {start}, stop: {stop}) + |> filter(fn: (r) => r["_measurement"] == "sensor_data") + |> filter(fn: (r) => r["room"] == "{room_id}") + |> filter(fn: (r) => r["_field"] == "co2" or r["_field"] == "humidity" or r["_field"] == "temperature") ''' return self.query_api.query(org=self.org, query=query) + + def get_room_data_in_range(self, room_id: str, start: str = "-30d", stop: str = "now()"): + query = f''' + from(bucket: "{self.bucket}") + |> range(start: {start}, stop: {stop}) + |> filter(fn: (r) => r["_measurement"] == "sensor_data") + |> filter(fn: (r) => r["room"] == "{room_id}") + |> filter(fn: (r) => r["_field"] == "co2" or r["_field"] == "humidity" or r["_field"] == "temperature") + ''' + return self.query_api.query(org=self.org, query=query) + + def list_rooms(self): + query = f''' + import "influxdata/influxdb/schema" + schema.tagValues( + bucket: "{self.bucket}", + tag: "room" + ) + ''' + return self.query_api.query(org=self.org, query=query) + + def get_aggregated_room_data(self, room_id: str, window: str = "1h"): + query = f''' + from(bucket: "{self.bucket}") + |> range(start: -30d) + |> filter(fn: (r) => r["_measurement"] == "sensor_data") + |> filter(fn: (r) => r["room"] == "{room_id}") + |> filter(fn: (r) => r["_field"] == "co2" or r["_field"] == "humidity" or r["_field"] == "temperature") + |> aggregateWindow(every: {window}, fn: mean, createEmpty: false) + |> yield(name: "mean") + ''' + return self.query_api.query(org=self.org, query=query) +