Skip to content
Snippets Groups Projects
Select Git revision
  • adb1c3ce69a6c9a70c605c54045ab5a9f6a0a283
  • master default
  • renovate/fastapi-0.x
  • v2.21.0
  • v2.20.1
  • v2.20.0
  • v2.19.0
  • v2.18.1
  • v2.18.0
  • v2.17.0
  • v2.16.0
  • v2.15.0
  • v2.14.0
  • v2.13.1
  • v2.13.0
  • v2.12.0
  • v2.11.0
  • v2.10.0
  • v2.9.0
  • v2.8.0
  • v2.7.0
  • v2.6.0
  • v2.5.0
23 results

Measurements.py

Blame
  • Measurements.py 4.04 KiB
    from typing import Dict
    
    from flask import Blueprint, jsonify, request
    
    from logic.AuthenticationWrapper import require_api_key
    from logic.BackupService import BackupService
    from logic.Parameters import DeviceParameters, SensorParameters, MeasurementParameters
    from logic.RequestValidator import RequestValidator, ValidationError
    from logic.database.Database import Database
    
    
    def construct_blueprint(settings: Dict, backupService: BackupService):
        measurements = Blueprint('measurements', __name__)
    
        @measurements.route('/measurements/minMax', methods=['GET'])
        def get_min_and_max_for_sensor_ids():
            if 'sensorIds' not in request.args:
                return jsonify({'message': 'Parameter "sensorIds" missing'}), 400
    
            if 'startDateTime' not in request.args:
                return jsonify({'message': 'Parameter "startDateTime" missing'}), 400
    
            if 'endDateTime' not in request.args:
                return jsonify({'message': 'Parameter "endDateTime" missing'}), 400
    
            sensorIds = request.args.get('sensorIds').split(',')
            startDateTime = request.args.get('startDateTime')
            endDateTime = request.args.get('endDateTime')
    
            database = Database(settings['database']['databasePath'], backupService)
    
            values = []
            for sensorId in sensorIds:
                sensorId = int(sensorId)
                measurementsForSensor = database.measurementAccess.get_all_measurements_for_sensor(sensorId,
                                                                                                   startDateTime,
                                                                                                   endDateTime)
                for measurement in measurementsForSensor:
                    values.append(float(measurement['value']))
    
            if values:
                return jsonify({
                    'min': min(values),
                    'max': max(values)
                })
    
            return jsonify({
                'min': None,
                'max': None
            })
    
        @measurements.route('/measurements', methods=['POST'])
        @require_api_key(password=settings['api']['key'])
        def add_multiple_measurements():
            try:
                parameters = RequestValidator.validate(request, DeviceParameters.get_values())
                database = Database(settings['database']['databasePath'], backupService)
    
                deviceName = parameters[DeviceParameters.DEVICE.value]
                if not database.deviceAccess.get_device_by_name(deviceName):
                    database.deviceAccess.add_device(deviceName)
                device = database.deviceAccess.get_device_by_name(deviceName)
    
                sensors = parameters[DeviceParameters.SENSORS.value]
                for sensor in sensors:
                    sensorParams = RequestValidator.validate_parameters(sensor,
                                                                        [SensorParameters.NAME.value,
                                                                         SensorParameters.TYPE.value,
                                                                         SensorParameters.VALUE.value],
                                                                        f'sensor "{sensor}"')
                    sensor = __add_sensor_if_not_exists(database, int(device['id']), sensorParams)
                    database.measurementAccess.add_measurement(int(sensor['id']),
                                                               sensorParams[SensorParameters.VALUE.value])
            except ValidationError as e:
                return e.response, 400
    
            return jsonify({'success': True})
    
        def __add_sensor_if_not_exists(database: Database, deviceID: int, sensorParams: Dict) -> Dict[str, str]:
            sensorName = sensorParams[SensorParameters.NAME.value]
            sensorType = sensorParams[SensorParameters.TYPE.value]
            sensor = database.sensorAccess.get_sensor_by_name_and_device_id(deviceID, sensorName)
            if sensor:
                return sensor
    
            database.sensorAccess.add_sensor(deviceID, sensorName, sensorType)
            return database.sensorAccess.get_sensor_by_name_and_device_id(deviceID, sensorName)
    
        return measurements