From 1ad5d76bf0fe2b8e3a5c66d3319d2fd2e80ff943 Mon Sep 17 00:00:00 2001 From: Robert Goldmann <deadlocker@gmx.de> Date: Wed, 23 Sep 2020 19:37:59 +0200 Subject: [PATCH] added api methods for sensor --- docs/api.yml | 69 ++++++++++++++++++++++++++++++++++++++-- src/blueprints/Routes.py | 16 +++++++++- src/logic/Database.py | 14 ++++---- 3 files changed, 88 insertions(+), 11 deletions(-) diff --git a/docs/api.yml b/docs/api.yml index 99b4147..0bc3a2a 100644 --- a/docs/api.yml +++ b/docs/api.yml @@ -50,6 +50,44 @@ paths: application/json: schema: $ref: '#/components/schemas/Device' + /device/{deviceName}/sensors/{sensorName}: + get: + summary: Gets a specific device + operationId: device + parameters: + - in: path + name: deviceName + description: The device name + required: true + schema: + type: string + - in: path + name: sensorName + description: The sensor name + required: true + schema: + type: string + responses: + '200': + description: The sensor + content: + application/json: + schema: + $ref: '#/components/schemas/Sensor' + + /sensors: + get: + summary: Gets all sensors + operationId: sensors + responses: + '200': + description: All available sensors + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/Sensor' components: schemas: @@ -74,16 +112,41 @@ components: Device: type: object required: - - ID + - id - name properties: - ID: + id: type: integer example: 1 - Projectname: + name: type: string example: "My Device" + Sensor: + type: object + required: + - id + - device_id + - name + - sensor_type + - value + properties: + id: + type: integer + example: 1 + device_id: + type: integer + example: 1 + name: + type: string + example: "My Device" + sensor_type: + type: string + example: "temperature" + value: + type: string + example: "20.15" + SuccessResponse: required: - success diff --git a/src/blueprints/Routes.py b/src/blueprints/Routes.py index e0191cf..3ae54e1 100644 --- a/src/blueprints/Routes.py +++ b/src/blueprints/Routes.py @@ -55,6 +55,20 @@ def construct_blueprint(settings, version): database = Database(settings['database']['databasePath']) return jsonify(database.get_device(deviceName)) + @routes.route('/sensors', methods=['GET']) + def get_all_sensors(): + database = Database(settings['database']['databasePath']) + return jsonify(database.get_all_sensors()) + + @routes.route('/device/<deviceName>/sensors/<sensorName>', methods=['GET']) + def get_sensor(deviceName, sensorName): + database = Database(settings['database']['databasePath']) + device = database.get_device(deviceName) + if not device: + return jsonify({'success': False, 'msg': f'No device with name "{deviceName}" existing'}) + + return jsonify(database.get_sensor(device['id'], sensorName)) + @routes.route('/device/<deviceName>', methods=['POST']) def postSensorData(deviceName): try: @@ -80,7 +94,7 @@ def construct_blueprint(settings, version): sensorName = sensorParams[SensorParameters.NAME.value] sensorType = sensorParams[SensorParameters.TYPE.value] sensorValue = sensorParams[SensorParameters.VALUE.value] - sensor = database.get_sensor(device[0], sensorName) + sensor = database.get_sensor(device['id'], sensorName) if sensor: database.update_sensor(device, sensorName, sensorType, sensorValue) else: diff --git a/src/logic/Database.py b/src/logic/Database.py index c291030..cdf0843 100644 --- a/src/logic/Database.py +++ b/src/logic/Database.py @@ -1,7 +1,7 @@ import sqlite3 from datetime import datetime from enum import Enum -from typing import Tuple +from typing import Tuple, Dict from TheCodeLabs_BaseUtils import DefaultLogger @@ -87,18 +87,18 @@ class Database: deviceID, name, fetch_type=FetchType.ONE) - def add_sensor(self, device: Tuple[int, str], name: str, sensorType: str, value: str): - LOGGER.debug(f'Inserting new sensor "{name}" for device "{device[1]}" ' + def add_sensor(self, device: Dict[str, str], name: str, sensorType: str, value: str): + LOGGER.debug(f'Inserting new sensor "{name}" for device "{device["name"]}" ' f'(type: "{sensorType}", value: "{value}")') self.__query(f'INSERT INTO {self.TABLE_SENSOR}(name, device_id, type, value, timestamp ) ' f'VALUES(?, ?, ?, ?, ?)', - name, device[0], sensorType, value, self.__get_current_datetime(), + name, device['id'], sensorType, value, self.__get_current_datetime(), fetch_type=FetchType.NONE) - def update_sensor(self, device: Tuple[int, str], name: str, sensorType: str, value: str): - LOGGER.debug(f'Updating sensor "{name}" for device "{device[1]}" ' + def update_sensor(self, device: Dict[str, str], name: str, sensorType: str, value: str): + LOGGER.debug(f'Updating sensor "{name}" for device "{device["name"]}" ' f'(type: "{sensorType}", value: "{value}")') self.__query(f'UPDATE {self.TABLE_SENSOR} SET value = ?, timestamp = ? ' f'WHERE device_id = ? AND name = ?', - value, self.__get_current_datetime(), device[0], name, + value, self.__get_current_datetime(), device['id'], name, fetch_type=FetchType.NONE) -- GitLab