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 = [ ...@@ -9,4 +9,6 @@ urlpatterns = [
path("api/register", views.register, name="register"), path("api/register", views.register, name="register"),
path("api/room_data_range", views.room_data_range, name="room_data_range"), 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/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 import os
from django.http import HttpResponse
from django.shortcuts import render from django.shortcuts import render
from django.http import JsonResponse from django.http import JsonResponse
from django.views.decorators.csrf import ensure_csrf_cookie, csrf_protect from django.views.decorators.csrf import ensure_csrf_cookie, csrf_protect
import json import json
from backend.utils.influx import InfluxDBHelper from utils.influx import InfluxDBHelper
from dotenv import load_dotenv from dotenv import load_dotenv
from django.views.decorators.http import require_http_methods from django.views.decorators.http import require_http_methods
from django.views.decorators.csrf import csrf_exempt from django.views.decorators.csrf import csrf_exempt
...@@ -71,10 +74,9 @@ def register(request): ...@@ -71,10 +74,9 @@ def register(request):
@require_http_methods(["GET"]) @require_http_methods(["GET"])
def room_data_range(request): def room_data_range(request):
try: try:
data = json.loads(request.body.decode("utf-8")) room = request.GET.get("room")
room = data["room"] start = request.GET.get("start", "-30d")
start = data["start"] stop = request.GET.get("stop", "now()")
stop = data["stop"]
if not room: if not room:
return JsonResponse({"error": "Missing 'room' parameter"}, status=400) return JsonResponse({"error": "Missing 'room' parameter"}, status=400)
...@@ -120,3 +122,59 @@ def get_rooms(request): ...@@ -120,3 +122,59 @@ def get_rooms(request):
rooms.add(record.get_value()) rooms.add(record.get_value())
return JsonResponse({"rooms": sorted(rooms)}) 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: ...@@ -69,6 +69,17 @@ class InfluxDBHelper:
''' '''
return self.query_api.query(org=self.org, query=query) 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"): def get_aggregated_room_data(self, room_id: str, window: str = "1h"):
query = f''' query = f'''
from(bucket: "{self.bucket}") 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