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
1 month 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 = [
path
(
"api/register"
,
views
.
register
,
name
=
"register"
),
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/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
from
django.http
import
HttpResponse
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
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
...
...
@@ -71,10 +74,9 @@ def register(request):
@
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"
]
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
)
...
...
@@ -120,3 +122,59 @@ def get_rooms(request):
rooms
.
add
(
record
.
get_value
())
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:
'''
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"
):
query
=
f
'''
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