package org.wattdepot.extension.openeis.server; import org.restlet.data.Status; import org.wattdepot.common.domainmodel.Depository; import org.wattdepot.common.domainmodel.InterpolatedValue; import org.wattdepot.common.domainmodel.InterpolatedValueList; import org.wattdepot.common.domainmodel.Measurement; import org.wattdepot.common.exception.IdNotFoundException; import org.wattdepot.common.exception.NoMeasurementException; import org.wattdepot.common.util.tstamp.Tstamp; import org.wattdepot.extension.openeis.domainmodel.TimeInterval; import org.wattdepot.server.http.api.WattDepotServerResource; import javax.xml.datatype.XMLGregorianCalendar; import java.util.Date; import java.util.List; /** * OpenEISServer - Base class that provides functionality for getting Hourly average values for point data and * Hourly difference values. * * @author Cam Moore */ public class OpenEISServer extends WattDepotServerResource { /** * Returns the hourly point data for the given depositoryId, sensorId, and for the time interval. * * @param depositoryId The Depository. * @param sensorId The Sensor collecting the data. * @param howLong The length of time. * @param keepNulls if true returns InterpolatedValues with a value of null for missing data. * @return An InterpolatedValueList of the hourly data. */ public InterpolatedValueList getHourlyPointData(String depositoryId, String sensorId, TimeInterval howLong, boolean keepNulls) { XMLGregorianCalendar now = Tstamp.makeTimestamp(); now.setTime(0, 0, 0, 0); // set now to midnight Date nowDate = now.toGregorianCalendar().getTime(); XMLGregorianCalendar past = Tstamp.incrementDays(now, howLong.getNumDays() * -1); Date pastDate = past.toGregorianCalendar().getTime(); return getHourlyPointData(depositoryId, sensorId, pastDate, nowDate, keepNulls); } /** * Returns the average point data for the last year. * * @param depositoryId The Depository. * @param sensorId The Sensor * @param keepNulls if true returns InterpolatedValues with a value of null for missing data. * @return An InterpolatedValueList of the hourly data. */ public InterpolatedValueList getHourlyPointDataYear(String depositoryId, String sensorId, boolean keepNulls) { return getHourlyPointData(depositoryId, sensorId, TimeInterval.ONE_YEAR, keepNulls); } /** * Returns the hourly difference data for the given depositoryId, sensorId, and for the time interval. * * @param depositoryId The Depository. * @param sensorId The Sensor collecting the data. * @param howLong The length of time. * @param keepNulls if true returns InterpolatedValues with a value of null for missing data. * @return An InterpolatedValueList of the hourly data. */ public InterpolatedValueList getHourlyDifferenceData(String depositoryId, String sensorId, TimeInterval howLong, boolean keepNulls) { XMLGregorianCalendar now = Tstamp.makeTimestamp(); now.setTime(0, 0, 0, 0); // set now to midnight Date nowDate = now.toGregorianCalendar().getTime(); XMLGregorianCalendar past = Tstamp.incrementDays(now, howLong.getNumDays() * -1); Date pastDate = past.toGregorianCalendar().getTime(); return getHourlyDifferenceData(depositoryId, sensorId, pastDate, nowDate, keepNulls); } /** * Returns an InterpolatedValueList of the values starting at start with an interval of howLong. * * @param depositoryId The Depository. * @param sensorId The Sensor. * @param start The start date. * @param howLong The period to calculate the difference. * @param numIntervals How many values to calculate. * @param keepNulls if true returns InterpolatedValues with a value of null for missing data. * @return an InterpolatedValueList of the values. */ public InterpolatedValueList getDifferenceValues(String depositoryId, String sensorId, Date start, TimeInterval howLong, int numIntervals, boolean keepNulls) { if (isInRole(orgId)) { InterpolatedValueList ret = new InterpolatedValueList(); try { Depository depository = depot.getDepository(depositoryId, orgId, true); XMLGregorianCalendar startCal = Tstamp.makeTimestamp(start.getTime()); startCal.setTime(0, 0, 0, 0); // start at the beginning of the day. XMLGregorianCalendar endCal = Tstamp.incrementDays(startCal, howLong.getNumDays()); for (int i = 0; i < numIntervals; i++) { Date begin = startCal.toGregorianCalendar().getTime(); Date end = endCal.toGregorianCalendar().getTime(); Double val = null; try { val = depot.getValue(depositoryId, orgId, sensorId, begin, end, false); } catch (NoMeasurementException e) { val = null; } InterpolatedValue v = new InterpolatedValue(sensorId, val, depository.getMeasurementType(), begin, end); if (val == null) { ret.getMissingData().add(v); if (keepNulls) { ret.getInterpolatedValues().add(v); } } else { ret.getInterpolatedValues().add(v); } startCal = Tstamp.incrementDays(startCal, howLong.getNumDays()); endCal = Tstamp.incrementDays(endCal, howLong.getNumDays()); } return ret; } catch (IdNotFoundException e) { setStatus(Status.CLIENT_ERROR_BAD_REQUEST, e.getMessage()); return null; } } else { setStatus(Status.CLIENT_ERROR_BAD_REQUEST, "Bad credentials."); return null; } } /** * Returns the hourly difference data as an InterpolatedValueList. * * @param depositoryId The Depository. * @param sensorId The Sensor. * @param start The start of the period. * @param end The end of the period. * @param keepNulls if true inserts InterpolatedValues with a value of null in the return list. * @return An InterpolatedValueList of the hourly differences. */ public InterpolatedValueList getHourlyDifferenceData(String depositoryId, String sensorId, Date start, Date end, boolean keepNulls) { if (isInRole(orgId)) { try { Depository depository = depot.getDepository(depositoryId, orgId, true); XMLGregorianCalendar startCal = Tstamp.makeTimestamp(start.getTime()); startCal.setTime(0, 0, 0, 0); XMLGregorianCalendar endCal = Tstamp.makeTimestamp(end.getTime()); endCal.setTime(0, 0, 0, 0); endCal = Tstamp.incrementDays(endCal, 1); List<XMLGregorianCalendar> times = Tstamp.getTimestampList(startCal, endCal, 60); InterpolatedValueList ret = new InterpolatedValueList(); for (int i = 1; i < times.size(); i++) { XMLGregorianCalendar begin = times.get(i - 1); Date beginDate = begin.toGregorianCalendar().getTime(); XMLGregorianCalendar stop = times.get(i); Date endDate = stop.toGregorianCalendar().getTime(); Double val = null; try { val = depot.getValue(depositoryId, orgId, sensorId, beginDate, endDate, false); } catch (NoMeasurementException e) { // if there are no measurements just add null val = null; } InterpolatedValue iv = new InterpolatedValue(sensorId, val, depository.getMeasurementType(), beginDate, endDate); if (!keepNulls) { if (val != null) { ret.getInterpolatedValues().add(iv); } else { ret.getMissingData().add(iv); } } else { ret.getInterpolatedValues().add(iv); if (val == null) { ret.getMissingData().add(iv); } } } return ret; } catch (IdNotFoundException e) { setStatus(Status.CLIENT_ERROR_BAD_REQUEST, e.getMessage()); return null; } } else { setStatus(Status.CLIENT_ERROR_BAD_REQUEST, "Bad credentials."); return null; } } /** * Returns the hourly average data as an InterpolatedValueList. * * @param depositoryId The Depository. * @param sensorId The Sensor. * @param start The start of the period. * @param end The end of the period. * @param keepNulls if true insert InterpolatedValues with a null value. * @return An InterpolatedValueList of the hourly averages. */ public InterpolatedValueList getHourlyPointData(String depositoryId, String sensorId, Date start, Date end, boolean keepNulls) { if (isInRole(orgId)) { InterpolatedValueList ret = new InterpolatedValueList(); try { Depository depository = depot.getDepository(depositoryId, orgId, true); XMLGregorianCalendar startCal = Tstamp.makeTimestamp(start.getTime()); startCal.setTime(0, 0, 0, 0); XMLGregorianCalendar endCal = Tstamp.makeTimestamp(end.getTime()); endCal.setTime(0, 0, 0, 0); endCal = Tstamp.incrementDays(endCal, 1); List<XMLGregorianCalendar> times = Tstamp.getTimestampList(startCal, endCal, 60); for (int i = 1; i < times.size(); i++) { XMLGregorianCalendar begin = times.get(i - 1); Date beginDate = begin.toGregorianCalendar().getTime(); XMLGregorianCalendar stop = times.get(i); Date endDate = stop.toGregorianCalendar().getTime(); Double val = 0.0; List<Measurement> measurements = depot.getMeasurements(depositoryId, orgId, sensorId, beginDate, endDate, false); if (measurements.size() > 0) { for (Measurement m : measurements) { val += m.getValue(); } val = val / measurements.size(); } else { val = null; } InterpolatedValue iv = new InterpolatedValue(sensorId, val, depository.getMeasurementType(), beginDate, endDate); if (!keepNulls) { if (val != null) { ret.getInterpolatedValues().add(iv); } else { ret.getMissingData().add(iv); } } else { ret.getInterpolatedValues().add(iv); if (val == null) { ret.getMissingData().add(iv); } } } return ret; } catch (IdNotFoundException e) { setStatus(Status.CLIENT_ERROR_BAD_REQUEST, e.getMessage()); return null; } } else { setStatus(Status.CLIENT_ERROR_BAD_REQUEST, "Bad credentials."); return null; } } }