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
20ba60a7
Commit
20ba60a7
authored
Jun 01, 2025
by
Gezer
Browse files
Added CSV Endpoints
parent
c643194e
Changes
3
Hide whitespace changes
Inline
Side-by-side
backend/app/urls.py
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"
),
]
]
backend/app/views.py
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
backend/utils/influx.py
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
}
")
...
...
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