+ return query.all()
+
+
+def select_sensordata_grouped(sensor_id, sensor_type, begin, end):
+ # determine resolution (interval in seconds for data points)
+ resolution = calc_grouping_resolution(begin, end)
+
+ # Let the database do the grouping. Example in SQL (MySQL):
+ # select to_seconds(datetime) DIV (60*60*24) as interval_id, min(datetime), max(datetime), min(temp), avg(temp), max(temp), count(temp) from openweathermap group by interval_id order by interval_id;
+ query = db.session.query(func.to_seconds(Sensors.timestamp).op('div')(resolution).label('g'),
+ func.from_unixtime(func.avg(func.unix_timestamp(Sensors.timestamp))).label('timestamp'),
+ func.avg(Sensors.value).label('value'),
+ Sensors.sensor_id, Sensors.value_type, Sensors.sensor_name)
+ if sensor_id is not None:
+ query = query.filter(Sensors.sensor_id == sensor_id)
+ if sensor_type is not None:
+ query = query.filter(Sensors.value_type == sensor_type)
+ query = query.filter(Sensors.timestamp >= begin)
+ query = query.filter(Sensors.timestamp <= end)
+ query = query.group_by('g', Sensors.sensor_id, Sensors.value_type, Sensors.sensor_name)
+ return query.all()
+
+
+def select_openweatherdata(cityid, begin, end):
+ query = OpenWeatherMap.query.filter(OpenWeatherMap.cityid == cityid)
+ if begin is not None:
+ query = query.filter(OpenWeatherMap.datetime >= begin)
+ if end is not None:
+ query = query.filter(OpenWeatherMap.datetime <= end)
+ return query.all()
+
+
+def select_openweatherdata_grouped(cityid, begin, end):
+ # determine resolution (interval in seconds for data points)
+ resolution = calc_grouping_resolution(begin, end)
+
+ # Let the database do the grouping. Example in SQL (MySQL):
+ # select to_seconds(datetime) DIV (60*60*24) as interval_id, min(datetime), max(datetime), min(temp), avg(temp), max(temp), count(temp) from openweathermap group by interval_id order by interval_id;
+ query = db.session.query(func.to_seconds(OpenWeatherMap.datetime).op('div')(resolution).label('g'),
+ func.from_unixtime(func.avg(func.unix_timestamp(OpenWeatherMap.datetime))).label('datetime'),
+ func.avg(OpenWeatherMap.temp).label('temp'),
+ OpenWeatherMap.cityid)
+ OpenWeatherMap.query.filter(OpenWeatherMap.cityid == cityid)
+ query = query.filter(OpenWeatherMap.datetime >= begin)
+ query = query.filter(OpenWeatherMap.datetime <= end)
+ query = query.group_by('g', OpenWeatherMap.cityid)
+ return query.all()
+
+
+def convert_to_c3(result, id, field_x, field_y):
+ c3result = defaultdict(list)
+ for row in result:
+ c3result[str(getattr(row, id))].append(getattr(row, field_y))
+ dt = getattr(row, field_x).strftime('%Y-%m-%d %H:%M:%S')
+ c3result[str(getattr(row, id)) + '_x'].append(dt)
+ return c3result
+
+
+def request_arg(key, type, default=None):
+ """Returns the key from the request if available, otherwise the default value.
+ In case type is provided and the key is present, the value is converted by calling type.
+ In other words: Reimplement request.args.get but don't return default value if
+ type raises a ValueError."""
+ if key in request.args:
+ try:
+ return type(request.args[key])
+ except ValueError as e:
+ abort(Response(str(e), 400))
+ else:
+ return default
+
+
+def sensordata(sensor_id=None, sensor_type=None):
+ begin = request_arg('begin', parse_datetime)
+ end = request_arg('end', parse_datetime)