Skip to content
GitLab
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in
Toggle navigation
Menu
Open sidebar
co2ampel2
Web
Commits
c9afe0b0
Commit
c9afe0b0
authored
1 month ago
by
Gezer
Browse files
Options
Download
Email Patches
Plain Diff
Added Query need some test
parent
bc0f36b4
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
backend/app/views.py
+39
-2
backend/app/views.py
backend/utils/influx.py
+38
-6
backend/utils/influx.py
with
77 additions
and
8 deletions
+77
-8
backend/app/views.py
+
39
-
2
View file @
c9afe0b0
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
)
This diff is collapsed.
Click to expand it.
backend/utils/influx.py
+
38
-
6
View file @
c9afe0b0
...
...
@@ -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
)
This diff is collapsed.
Click to expand it.
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment