Source code for apps.api.views.measurement_view

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)