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)
+