import os import yaml import pymongo import datetime from flask import Flask, redirect from flask_restful import Resource, Api, abort, reqparse app = Flask(__name__) api = Api(app) config = None with open("/etc/l2-sensors/conf.yml", 'r') as f: config = yaml.load(f.read()) if config is None: raise ValueError("Failed to load configuration.") client = pymongo.MongoClient( os.environ['DB_PORT_27017_TCP_ADDR'], int(os.environ['DB_PORT_27017_TCP_PORT']), ) client.particule.authenticate(config['db']['mongo']['username'], config['db']['mongo']['password']) db = client.particule @app.route("/") def index(): return """ Temperature, pressure and humidity at level2
""" parser = reqparse.RequestParser() parser.add_argument('year', type=int, help='Year') parser.add_argument('month', type=int, help='Month') parser.add_argument('day', type=int, help='Day') class GenericResource(Resource): name = None def _get_cursor(self, begin=None, end=None): req = {"name": self.name} if not isinstance(begin, (datetime.datetime, type(None))): raise TypeError("begin must be datetime") if not isinstance(end, (datetime.datetime, type(None))): raise TypeError("end must be datetime") if begin is not None and end is not None: req['_date'] = { "$lte": end, "$gte": begin } return db.measure.find(req).sort("_date", 1) def value_filter(self, value): return value def get(self): args = parser.parse_args() begin, end = None, None if args['year'] and args['month'] and args['day']: try: selected_date = datetime.datetime(args['year'], args['month'], args['day']) begin = selected_date end = begin + datetime.timedelta(1) except Exception as e: abort(400, message="Date incorrect") cursor = self._get_cursor(begin, end) if not cursor.count(): abort(404, message="No data found for this date") data = [ { "date":i['_date'].isoformat(), "value": self.value_filter(i['result']) } for i in cursor ] return {"data": data} class TemperatureResource(GenericResource): name = "temperatureC" def value_filter(self, value): return round(value, 3) class PressureResource(GenericResource): name = "pressure" def value_filter(self, value): return round(value, 3) class HumidityResource(GenericResource): name = "humidity" def value_filter(self, value): return round(value) api.add_resource(TemperatureResource, '/temperature') api.add_resource(PressureResource, '/pressure') api.add_resource(HumidityResource, '/humidity') if __name__ == "__main__": app.run()