Commit c9afe0b0 authored by Gezer's avatar Gezer
Browse files

Added Query need some test

parent bc0f36b4
Showing with 77 additions and 8 deletions
+77 -8
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
)
......@@ -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)
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