Implemented sensor filtering for json endpoint
This commit is contained in:
parent
d26a9d0018
commit
909c8ea2b3
3 changed files with 65 additions and 33 deletions
|
|
@ -10,7 +10,7 @@
|
||||||
</div>
|
</div>
|
||||||
<script>
|
<script>
|
||||||
$(function(){
|
$(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>
|
</script>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,6 @@
|
||||||
package se.hal.intf;
|
package se.hal.intf;
|
||||||
|
|
||||||
|
import zutil.log.LogUtil;
|
||||||
import zutil.net.http.HttpHeader;
|
import zutil.net.http.HttpHeader;
|
||||||
import zutil.net.http.HttpPage;
|
import zutil.net.http.HttpPage;
|
||||||
import zutil.net.http.HttpPrintStream;
|
import zutil.net.http.HttpPrintStream;
|
||||||
|
|
@ -10,12 +11,13 @@ import zutil.parser.json.JSONWriter;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.logging.Level;
|
import java.util.logging.Level;
|
||||||
|
import java.util.logging.Logger;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A interface defining a Hal json endpoint
|
* A interface defining a Hal json endpoint
|
||||||
*/
|
*/
|
||||||
public abstract class HalJsonPage extends HalHttpPage{
|
public abstract class HalJsonPage extends HalHttpPage{
|
||||||
|
private static final Logger logger = LogUtil.getLogger();
|
||||||
|
|
||||||
public HalJsonPage(String id) {
|
public HalJsonPage(String id) {
|
||||||
super(id);
|
super(id);
|
||||||
|
|
@ -34,8 +36,10 @@ public abstract class HalJsonPage extends HalHttpPage{
|
||||||
out.setHeader("Content-Type", "application/json");
|
out.setHeader("Content-Type", "application/json");
|
||||||
JSONWriter writer = new JSONWriter(out);
|
JSONWriter writer = new JSONWriter(out);
|
||||||
try{
|
try{
|
||||||
writer.write(jsonRespond(session, cookie, request));
|
writer.write(
|
||||||
|
jsonRespond(session, cookie, request));
|
||||||
} catch (Exception e){
|
} catch (Exception e){
|
||||||
|
logger.log(Level.SEVERE, null, e);
|
||||||
DataNode root = new DataNode(DataNode.DataType.Map);
|
DataNode root = new DataNode(DataNode.DataType.Map);
|
||||||
root.set("error", e.getMessage());
|
root.set("error", e.getMessage());
|
||||||
writer.write(root);
|
writer.write(root);
|
||||||
|
|
|
||||||
|
|
@ -6,6 +6,7 @@ import se.hal.intf.HalJsonPage;
|
||||||
import se.hal.struct.Sensor;
|
import se.hal.struct.Sensor;
|
||||||
import se.hal.util.AggregateDataListSqlResult;
|
import se.hal.util.AggregateDataListSqlResult;
|
||||||
import se.hal.util.UTCTimeUtility;
|
import se.hal.util.UTCTimeUtility;
|
||||||
|
import zutil.ArrayUtil;
|
||||||
import zutil.db.DBConnection;
|
import zutil.db.DBConnection;
|
||||||
import zutil.log.LogUtil;
|
import zutil.log.LogUtil;
|
||||||
import zutil.parser.DataNode;
|
import zutil.parser.DataNode;
|
||||||
|
|
@ -16,8 +17,15 @@ import java.util.Map;
|
||||||
import java.util.logging.Logger;
|
import java.util.logging.Logger;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Request parameters:
|
* Available HTTP Get Request parameters:
|
||||||
* aggr: Aggrigation periods. Possible values: minute,hour,day,week
|
* <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 {
|
public class SensorJsonPage extends HalJsonPage {
|
||||||
private static final Logger logger = LogUtil.getLogger();
|
private static final Logger logger = LogUtil.getLogger();
|
||||||
|
|
@ -37,20 +45,31 @@ public class SensorJsonPage extends HalJsonPage {
|
||||||
DataNode root = new DataNode(DataNode.DataType.List);
|
DataNode root = new DataNode(DataNode.DataType.List);
|
||||||
|
|
||||||
//// Get sensors
|
//// 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<>();
|
List<Sensor> sensors = new ArrayList<>();
|
||||||
for (Sensor sensor : Sensor.getSensors(db)) {
|
for (Sensor sensor : Sensor.getSensors(db)) {
|
||||||
if (sensor.getDeviceConfig() != null) // Show all sensors for now
|
if (sensor.getDeviceConfig() == null) // Show all sensors for now
|
||||||
// if (sensor.getDeviceConfig() != null &&
|
continue;
|
||||||
// sensor.getDeviceConfig().getSensorDataClass() == PowerConsumptionSensorData.class)
|
|
||||||
|
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);
|
sensors.add(sensor);
|
||||||
}
|
}
|
||||||
|
|
||||||
//// Figure out aggregation period
|
//// Figure out aggregation period
|
||||||
SensorDataAggregatorDaemon.AggregationPeriodLength aggrType;
|
SensorDataAggregatorDaemon.AggregationPeriodLength aggrType = null;
|
||||||
long aggrLength = UTCTimeUtility.INFINITY;
|
long aggrLength = -1;
|
||||||
|
if (request.get("aggr") != null) {
|
||||||
switch (request.get("aggr")) {
|
switch (request.get("aggr")) {
|
||||||
case "minute":
|
case "minute":
|
||||||
default:
|
|
||||||
aggrType = SensorDataAggregatorDaemon.AggregationPeriodLength.FIVE_MINUTES;
|
aggrType = SensorDataAggregatorDaemon.AggregationPeriodLength.FIVE_MINUTES;
|
||||||
aggrLength = UTCTimeUtility.DAY_IN_MS;
|
aggrLength = UTCTimeUtility.DAY_IN_MS;
|
||||||
break;
|
break;
|
||||||
|
|
@ -60,22 +79,36 @@ public class SensorJsonPage extends HalJsonPage {
|
||||||
break;
|
break;
|
||||||
case "day":
|
case "day":
|
||||||
aggrType = SensorDataAggregatorDaemon.AggregationPeriodLength.DAY;
|
aggrType = SensorDataAggregatorDaemon.AggregationPeriodLength.DAY;
|
||||||
|
aggrLength = UTCTimeUtility.INFINITY;
|
||||||
break;
|
break;
|
||||||
case "week":
|
case "week":
|
||||||
aggrType = SensorDataAggregatorDaemon.AggregationPeriodLength.WEEK;
|
aggrType = SensorDataAggregatorDaemon.AggregationPeriodLength.WEEK;
|
||||||
|
aggrLength = UTCTimeUtility.INFINITY;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// Generate DataNode
|
/// Generate DataNode
|
||||||
for (Sensor sensor : sensors) {
|
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));
|
AggregateDataListSqlResult.getAggregateDataForPeriod(db, sensor, aggrType, aggrLength));
|
||||||
}
|
}
|
||||||
|
root.add(deviceNode);
|
||||||
|
}
|
||||||
|
|
||||||
return root;
|
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 timestampNode = new DataNode(DataNode.DataType.List);
|
||||||
DataNode dataNode = new DataNode(DataNode.DataType.List);
|
DataNode dataNode = new DataNode(DataNode.DataType.List);
|
||||||
// end timestamp
|
// end timestamp
|
||||||
|
|
@ -95,13 +128,8 @@ public class SensorJsonPage extends HalJsonPage {
|
||||||
timestampNode.add(System.currentTimeMillis());
|
timestampNode.add(System.currentTimeMillis());
|
||||||
dataNode.add((String)null);
|
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("timestamps", timestampNode);
|
||||||
deviceNode.set("data", dataNode);
|
deviceNode.set("data", dataNode);
|
||||||
root.add(deviceNode);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue