Skip to content
GitLab
Explore
Projects
Groups
Snippets
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in
Toggle navigation
Menu
Open sidebar
co2ampel2
Web
Commits
20ba60a7
Commit
20ba60a7
authored
3 months ago
by
Gezer
Browse files
Options
Download
Email Patches
Plain Diff
Added CSV Endpoints
parent
c643194e
main
backup_aaron
backup_ade
No related merge requests found
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
backend/app/urls.py
+2
-0
backend/app/urls.py
backend/app/views.py
+63
-5
backend/app/views.py
backend/utils/influx.py
+11
-0
backend/utils/influx.py
with
76 additions
and
5 deletions
+76
-5
backend/app/urls.py
+
2
-
0
View file @
20ba60a7
...
@@ -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"
),
]
]
This diff is collapsed.
Click to expand it.
backend/app/views.py
+
63
-
5
View file @
20ba60a7
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
This diff is collapsed.
Click to expand it.
backend/utils/influx.py
+
11
-
0
View file @
20ba60a7
...
@@ -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
}
")
...
...
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
Menu
Explore
Projects
Groups
Snippets