Commit c9afe0b0 authored by Gezer's avatar Gezer
Browse files

Added Query need some test

parent bc0f36b4
import os
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 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
from django.contrib.auth import authenticate, login, logout from django.contrib.auth import authenticate, login, logout
...@@ -28,7 +30,7 @@ def login_view(request): ...@@ -28,7 +30,7 @@ def login_view(request):
return JsonResponse( return JsonResponse(
{"success": False, "message": "Invalid JSON"}, status=400 {"success": False, "message": "Invalid JSON"}, status=400
) )
user = authenticate(request, username=email, password=password) user = authenticate(request, username=email, password=password)
if user: if user:
...@@ -65,3 +67,38 @@ def register(request): ...@@ -65,3 +67,38 @@ def register(request):
else: else:
errors = form.errors.as_json() errors = form.errors.as_json()
return JsonResponse({"error": errors}, status=400) 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: ...@@ -39,14 +39,46 @@ class InfluxDBHelper:
''' '''
return self.query_api.query(org=self.org, query=query) 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''' query = f'''
from(bucket: "{self.bucket}") from(bucket: "{self.bucket}")
|> range(start: -5m) |> range(start: {start}, stop: {stop})
|> filter(fn: (r) => r["_measurement"] == "co2") |> filter(fn: (r) => r["_measurement"] == "sensor_data")
|> filter(fn: (r) => r["room"] == "{room_id}") |> filter(fn: (r) => r["room"] == "{room_id}")
|> last() |> filter(fn: (r) => r["_field"] == "co2" or r["_field"] == "humidity" or r["_field"] == "temperature")
''' '''
return self.query_api.query(org=self.org, query=query) 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