Implemented sensor filtering for json endpoint

This commit is contained in:
Ziver Koc 2016-11-29 16:45:30 +01:00
parent d26a9d0018
commit 909c8ea2b3
3 changed files with 65 additions and 33 deletions

View file

@ -10,7 +10,7 @@
</div>
<script>
$(function(){
createChart("#chart", "/data/sensor?aggr=minute&sensor_id={{sensor.getID()}}", 5*60*1000);
createChart("#chart", "/data/sensor?aggr=minute&id={{sensor.getID()}}", 5*60*1000);
});
</script>

View file

@ -1,5 +1,6 @@
package se.hal.intf;
import zutil.log.LogUtil;
import zutil.net.http.HttpHeader;
import zutil.net.http.HttpPage;
import zutil.net.http.HttpPrintStream;
@ -10,12 +11,13 @@ import zutil.parser.json.JSONWriter;
import java.io.IOException;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
* A interface defining a Hal json endpoint
*/
public abstract class HalJsonPage extends HalHttpPage{
private static final Logger logger = LogUtil.getLogger();
public HalJsonPage(String id) {
super(id);
@ -34,8 +36,10 @@ public abstract class HalJsonPage extends HalHttpPage{
out.setHeader("Content-Type", "application/json");
JSONWriter writer = new JSONWriter(out);
try{
writer.write(jsonRespond(session, cookie, request));
writer.write(
jsonRespond(session, cookie, request));
} catch (Exception e){
logger.log(Level.SEVERE, null, e);
DataNode root = new DataNode(DataNode.DataType.Map);
root.set("error", e.getMessage());
writer.write(root);

View file

@ -6,6 +6,7 @@ import se.hal.intf.HalJsonPage;
import se.hal.struct.Sensor;
import se.hal.util.AggregateDataListSqlResult;
import se.hal.util.UTCTimeUtility;
import zutil.ArrayUtil;
import zutil.db.DBConnection;
import zutil.log.LogUtil;
import zutil.parser.DataNode;
@ -16,8 +17,15 @@ import java.util.Map;
import java.util.logging.Logger;
/**
* Request parameters:
* aggr: Aggrigation periods. Possible values: minute,hour,day,week
* Available HTTP Get Request parameters:
* <pre>
* Sensor filtering parameters:
* id: comma separated numeric id for specific sensors
* type: sensor data type name
*
* Data filtering parameters:
* aggr: Aggrigation periods, needs to be provided to retrieve data. Possible values: minute,hour,day,week
* </pre>
*/
public class SensorJsonPage extends HalJsonPage {
private static final Logger logger = LogUtil.getLogger();
@ -37,45 +45,70 @@ public class SensorJsonPage extends HalJsonPage {
DataNode root = new DataNode(DataNode.DataType.List);
//// Get sensors
String[] req_ids = null;
if (request.get("id") != null)
req_ids = request.get("id").split(",");
String req_type = request.get("type");
List<Sensor> sensors = new ArrayList<>();
for (Sensor sensor : Sensor.getSensors(db)) {
if (sensor.getDeviceConfig() != null) // Show all sensors for now
// if (sensor.getDeviceConfig() != null &&
// sensor.getDeviceConfig().getSensorDataClass() == PowerConsumptionSensorData.class)
if (sensor.getDeviceConfig() == null) // Show all sensors for now
continue;
if (req_ids == null && req_type==null) // no options defined, then add all sensors
sensors.add(sensor);
else if (req_ids != null && ArrayUtil.contains(req_ids, ""+sensor.getId())) // id filtering
sensors.add(sensor);
else if (req_type != null && !req_type.isEmpty() &&
sensor.getDeviceConfig().getSensorDataClass().getSimpleName().contains(req_type)) // device type filtering
sensors.add(sensor);
}
//// Figure out aggregation period
SensorDataAggregatorDaemon.AggregationPeriodLength aggrType;
long aggrLength = UTCTimeUtility.INFINITY;
switch (request.get("aggr")) {
case "minute":
default:
aggrType = SensorDataAggregatorDaemon.AggregationPeriodLength.FIVE_MINUTES;
aggrLength = UTCTimeUtility.DAY_IN_MS;
break;
case "hour":
aggrType = SensorDataAggregatorDaemon.AggregationPeriodLength.HOUR;
aggrLength = UTCTimeUtility.WEEK_IN_MS;
break;
case "day":
aggrType = SensorDataAggregatorDaemon.AggregationPeriodLength.DAY;
break;
case "week":
aggrType = SensorDataAggregatorDaemon.AggregationPeriodLength.WEEK;
break;
SensorDataAggregatorDaemon.AggregationPeriodLength aggrType = null;
long aggrLength = -1;
if (request.get("aggr") != null) {
switch (request.get("aggr")) {
case "minute":
aggrType = SensorDataAggregatorDaemon.AggregationPeriodLength.FIVE_MINUTES;
aggrLength = UTCTimeUtility.DAY_IN_MS;
break;
case "hour":
aggrType = SensorDataAggregatorDaemon.AggregationPeriodLength.HOUR;
aggrLength = UTCTimeUtility.WEEK_IN_MS;
break;
case "day":
aggrType = SensorDataAggregatorDaemon.AggregationPeriodLength.DAY;
aggrLength = UTCTimeUtility.INFINITY;
break;
case "week":
aggrType = SensorDataAggregatorDaemon.AggregationPeriodLength.WEEK;
aggrLength = UTCTimeUtility.INFINITY;
break;
}
}
/// Generate DataNode
for (Sensor sensor : sensors) {
addAggregateDataToDataNode(root, sensor, aggrLength,
DataNode deviceNode = new DataNode(DataNode.DataType.Map);
deviceNode.set("id", sensor.getId());
deviceNode.set("name", sensor.getName());
deviceNode.set("user", sensor.getUser().getUsername());
deviceNode.set("type", sensor.getDeviceConfig().getSensorDataClass().getSimpleName());
deviceNode.set("x", sensor.getX());
deviceNode.set("y", sensor.getY());
if (aggrLength > 0) {
addAggregateDataToDataNode(deviceNode, aggrLength,
AggregateDataListSqlResult.getAggregateDataForPeriod(db, sensor, aggrType, aggrLength));
}
root.add(deviceNode);
}
return root;
}
private void addAggregateDataToDataNode(DataNode root, Sensor sensor, long endTime, List<AggregateDataListSqlResult.AggregateData> dataList) {
private void addAggregateDataToDataNode(DataNode deviceNode, long endTime, List<AggregateDataListSqlResult.AggregateData> dataList) {
DataNode timestampNode = new DataNode(DataNode.DataType.List);
DataNode dataNode = new DataNode(DataNode.DataType.List);
// end timestamp
@ -95,13 +128,8 @@ public class SensorJsonPage extends HalJsonPage {
timestampNode.add(System.currentTimeMillis());
dataNode.add((String)null);
DataNode deviceNode = new DataNode(DataNode.DataType.Map);
deviceNode.set("name", sensor.getName());
deviceNode.set("user", sensor.getUser().getUsername());
deviceNode.set("type", sensor.getDeviceConfig().getSensorDataClass().getSimpleName());
deviceNode.set("timestamps", timestampNode);
deviceNode.set("data", dataNode);
root.add(deviceNode);
}
}