from rest_framework import status
from rest_framework.response import Response
from apps.api.serializers.serializers import (
MeasurementSerializer
)
from rest_framework.permissions import IsAuthenticated
from apps.core.models.measurement import Measurement
from apps.core.models.device import Device
from apps.core.models.area import Area
from apps.core.models.sensor import Sensor
from apps.core.models.physical_unit import PhysicalUnit
from apps.api.exceptions import ApiException, ValidationException
from rest_framework.views import APIView
from datetime import datetime
from influxdb_client import InfluxDBClient, Point, WritePrecision
from influxdb_client.client.write_api import SYNCHRONOUS
[docs]class MeasurementManagement(APIView):
# permission_classes = (IsAuthenticated,)
[docs] def post(self, request):
'''
serializer = MeasurementSerializer(data=request.data, many=True)
if not serializer.is_valid() or serializer.data == []:
raise ValidationException(f"Validation error: {serializer.errors}", status.HTTP_400_BAD_REQUEST)
serializer.save()
return_data = [{
'id': single_measurement.id,
'value': single_measurement.value.__str__(),
'datetime': single_measurement.datetime.isoformat()
} for single_measurement in serializer.instance]
'''
# parse json data
val = ''
device_id = ''
sensor_id = ''
return_data = {}
f = open('request.log', 'a')
try:
val = str(request.data[0]['value'])
device_id = str(request.data[0]['device'])
sensor_id = str(request.data[0]['sensor'])
return_data = {'id': '1', 'value': val, 'datetime': datetime.now().isoformat()}
f.write(datetime.now().strftime("%d/%m/%Y %H:%M:%S"))
f.write(' ')
f.write(device_id)
f.write(' ')
f.write(val)
except:
f.write('Error')
# create connection
token = "165QS6Q0l-aYhj0KCWi7yvBqcjO6faPgUkBJqG30qpXI0Gvnr3WvZzo1FWRA9JVJ8vn-F9z91N0aRB3kD38ldA=="
org = "my-org"
bucket = "my-bucket"
client = InfluxDBClient(url="http://influx_database:8086", token=token, org=org)
write_api = client.write_api(write_options=SYNCHRONOUS)
# write data
#data4 = "m4,device=" + device_id + ", sensor=" + sensor_id + " value=" + val
data = 'generator_test,device_id={},sensor_id={} value={}'.format(device_id, sensor_id, val)
#data = 'm6,sensor_id={} value={}'.format(sensor_id, val)
f.write(' ')
f.write(data)
f.write('\n')
f.close()
write_api.write(bucket, org, data)
return Response(status=status.HTTP_201_CREATED, data=return_data)
[docs]class DeviceLastMeasurement(APIView):
# permission_classes = (IsAuthenticated,)
[docs] def get(self, request, device_id):
# create connection
token = "165QS6Q0l-aYhj0KCWi7yvBqcjO6faPgUkBJqG30qpXI0Gvnr3WvZzo1FWRA9JVJ8vn-F9z91N0aRB3kD38ldA=="
org = "my-org"
bucket = "my-bucket"
client = InfluxDBClient(url="http://influx_database:8086", token=token, org=org)
query_api = client.query_api()
query = ' from(bucket:"my-bucket") |> range(start: -30m) |> filter(fn:(r) => r._measurement == "generator_test") |> filter(fn:(r) => r.device_id == "' + str(device_id) + '")'
result = query_api.query(org=org, query=query)
response = []
for table in result:
for record in table:
response.append({
"id": "to do",
record.get_field(): record.get_value(),
"datetime": record.get_time(),
"physical_unit": {
"physical_unit_name": "to do",
"id": "to do"
}
})
return Response(status=status.HTTP_200_OK, data=response[len(response) - 1])
[docs]class DeviceMeasurementsFromPeriod(APIView):
# permission_classes = (IsAuthenticated,)
# parameters time_from and time_to are expected in iso format
[docs] def get(self, request, device_id):
try:
time_from = request.GET.get('time_from', '')
time_to = request.GET.get('time_to', '')
if time_from == '' or time_to == '':
measurements = Measurement.objects.filter(device_id=device_id).order_by('-datetime')[:10]
else:
time_from = datetime.fromisoformat(time_from)
time_to = datetime.fromisoformat(time_to)
if time_from > time_to:
raise ValueError(f"Invalid value of 'time_from' parameter. "
f"Value can not be bigger than 'time_to' value")
measurements = Measurement.objects.filter(device_id=device_id) \
.filter(datetime__gt=time_from) \
.filter(datetime__lt=time_to)
serialized = MeasurementSerializer(measurements, many=True)
except (ValueError, TypeError) as e:
raise ApiException(f"Invalid value of datetime was specified! "
f"next error was raised: {e}", status.HTTP_400_BAD_REQUEST)
except Measurement.DoesNotExist:
raise ApiException("Measurements in specified time period do not exist", status.HTTP_404_NOT_FOUND)
response = [{
'id': measurement.id,
'value': measurement.value.__str__(),
'datetime': measurement.datetime.isoformat(),
'physical_unit': {
'physical_unit_name': measurement.physical_unit.unit_name,
'id': measurement.physical_unit.id
}
} for measurement in serialized.instance]
return Response(status=status.HTTP_200_OK, data=response)
[docs]class AreaMeasurements(APIView):
[docs] def get(self, request, area_id):
f = open('error.log','a')
f.write('New request for area ')
f.write(str(area_id))
f.write('\n')
try:
obj = Device.objects.filter(area_id=area_id)
ids = []
sensor_ids = []
for x in list(obj):
ids.append(x.id)
f.write('device: ' + str(x.id))
f.write('\n')
sens = Sensor.objects.filter(device_id=x.id)
f.write('sensors:\n')
for i in list(sens):
f.write(str(i.id))
f.write('\n')
sensor_ids.append(i.id)
# create connection
token = "165QS6Q0l-aYhj0KCWi7yvBqcjO6faPgUkBJqG30qpXI0Gvnr3WvZzo1FWRA9JVJ8vn-F9z91N0aRB3kD38ldA=="
org = "my-org"
bucket = "my-bucket"
client = InfluxDBClient(url="http://influx_database:8086", token=token, org=org)
query_api = client.query_api()
response = []
for s_id in sensor_ids:
query = ' from(bucket:"my-bucket") |> range(start: -365d, stop: now()) |> filter(fn:(r) => r._measurement == "generator_test") |> filter(fn:(r) => r.sensor_id == "' + str(s_id) + '") |> last(column: "_time")'
#query = ' from(bucket:"my-bucket") |> range(start: -30m) |> filter(fn:(r) => r._measurement == "generator_test") |> filter(fn:(r) => r.sensor_id == "' + str(s_id) + '")'
result = query_api.query(org=org, query=query)
for table in result:
for record in table:
response.append({
"sensor_id": s_id,
record.get_field(): record.get_value(),
"datetime": record.get_time(),
})
'''
result_record = result[0][len(result[0] - 1)]
response.append({
"sensor_id": s_id,
result_record.get_field(): result_record.get_value(),
"datetime": record.get_time(),
})
'''
except Exception as e:
f.write('dojebalo sa to\n')
f.write(str(e))
return Response(status=status.HTTP_200_OK, data=str(e))
f.close()
return Response(status=status.HTTP_200_OK, data=response)