Commit 20ba60a7 authored by Gezer's avatar Gezer
Browse files

Added CSV Endpoints

No related merge requests found
Showing with 76 additions and 5 deletions
+76 -5
......@@ -9,4 +9,6 @@ urlpatterns = [
path("api/register", views.register, name="register"),
path("api/room_data_range", views.room_data_range, name="room_data_range"),
path("api/get_rooms", views.get_rooms, name="get_rooms"),
path("api/room_data_csv", views.room_data_csv_view, name="room_data_csv_view"),
path("api/room_data_csv_download", views.room_data_csv_download, name="room_data_csv_download"),
]
import csv
from io import StringIO
import os
from django.http import HttpResponse
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 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
......@@ -71,10 +74,9 @@ def register(request):
@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"]
room = request.GET.get("room")
start = request.GET.get("start", "-30d")
stop = request.GET.get("stop", "now()")
if not room:
return JsonResponse({"error": "Missing 'room' parameter"}, status=400)
......@@ -120,3 +122,59 @@ def get_rooms(request):
rooms.add(record.get_value())
return JsonResponse({"rooms": sorted(rooms)})
@require_http_methods(["GET"])
def room_data_csv_view(request):
room = request.GET.get("room")
start = request.GET.get("start", "-30d")
stop = request.GET.get("stop", "now()")
if not room:
return JsonResponse({"error": "Missing 'room' parameter"}, status=400)
client = InfluxDBHelper(
url=os.getenv("INFLUXDB_URL"),
token=os.getenv("INFLUXDB_TOKEN"),
org=os.getenv("INFLUXDB_ORG"),
bucket=os.getenv("INFLUXDB_BUCKET"),
)
csv_stream = client.get_room_data_csv(room_id=room, start=start, stop=stop)
decoded = csv_stream.decode("utf-8")
f = StringIO(decoded)
reader = csv.DictReader(f)
results = []
for row in reader:
# optional: nur Datenzeilen filtern
if row.get("_field") and row.get("_value"):
results.append({
"time": row["_time"],
"field": row["_field"],
"value": row["_value"],
})
return JsonResponse({"room": room, "data": results})
@require_http_methods(["GET"])
def room_data_csv_download(request):
room = request.GET.get("room")
start = request.GET.get("start", "-30d")
stop = request.GET.get("stop", "now()")
if not room:
return JsonResponse({"error": "Missing 'room' parameter"}, status=400)
client = InfluxDBHelper(
url=os.getenv("INFLUXDB_URL"),
token=os.getenv("INFLUXDB_TOKEN"),
org=os.getenv("INFLUXDB_ORG"),
bucket=os.getenv("INFLUXDB_BUCKET"),
)
csv_data = client.get_room_data_csv(room, start, stop)
response = HttpResponse(csv_data, content_type="text/csv")
response["Content-Disposition"] = f'attachment; filename="{room}_data.csv"'
return response
......@@ -69,6 +69,17 @@ class InfluxDBHelper:
'''
return self.query_api.query(org=self.org, query=query)
def get_room_data_csv(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_csv(query=query, org=self.org)
def get_aggregated_room_data(self, room_id: str, window: str = "1h"):
query = f'''
from(bucket: "{self.bucket}")
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment