Massive refactoring, new Sensor/Event class structure, controller instantiation disabled as it needs some more work

Former-commit-id: 0d2c15d63ea44c45c018fec59877a374122dacd4
This commit is contained in:
Ziver Koc 2015-12-23 01:17:30 +01:00
parent fc05f82f31
commit 588ac41956
20 changed files with 232 additions and 155 deletions

View file

@ -1,8 +1,7 @@
package se.koc.hal; package se.koc.hal;
import se.koc.hal.intf.HalSensorController; import se.koc.hal.intf.HalSensorController;
import se.koc.hal.struct.HalEvent; import se.koc.hal.struct.Sensor;
import se.koc.hal.struct.HalSensor;
import zutil.log.LogUtil; import zutil.log.LogUtil;
import zutil.plugin.PluginData; import zutil.plugin.PluginData;
import zutil.plugin.PluginManager; import zutil.plugin.PluginManager;
@ -26,14 +25,14 @@ public class ControllerManager {
public void register(HalSensor sensor) throws IllegalAccessException, InstantiationException { public void register(Sensor sensor) throws IllegalAccessException, InstantiationException {
Class<? extends HalSensorController> c = sensor.getController(); Class<? extends HalSensorController> c = sensor.getController();
HalSensorController controller; HalSensorController controller;
if (controllerMap.containsKey(c)) if (controllerMap.containsKey(c))
controller = controllerMap.get(c); controller = controllerMap.get(c);
else { else {
// Instantiate controller // Instantiate controller
logger.fine("Instantiating controller: " + c.getName()); logger.fine("Instantiating new controller: " + c.getName());
controller = c.newInstance(); controller = c.newInstance();
controllerMap.put(c, controller); controllerMap.put(c, controller);
} }
@ -41,7 +40,7 @@ public class ControllerManager {
controller.register(sensor); controller.register(sensor);
} }
public void deregister(HalSensor sensor){ public void deregister(Sensor sensor){
Class<? extends HalSensorController> c = sensor.getController(); Class<? extends HalSensorController> c = sensor.getController();
HalSensorController controller; HalSensorController controller;
if (controllerMap.containsKey(c)) { if (controllerMap.containsKey(c)) {
@ -70,7 +69,7 @@ public class ControllerManager {
Iterator<PluginData> it = pluginManager.iterator(); Iterator<PluginData> it = pluginManager.iterator();
while (it.hasNext()){ while (it.hasNext()){
PluginData plugin = it.next(); PluginData plugin = it.next();
Iterator<Class<?>> pluginIt = plugin.getClassIterator(HalSensor.class); Iterator<Class<?>> pluginIt = plugin.getClassIterator(Sensor.class);
while (pluginIt.hasNext()){ while (pluginIt.hasNext()){
manager.availableSensors.add(pluginIt.next()); manager.availableSensors.add(pluginIt.next());
} }

View file

@ -10,7 +10,7 @@ import se.koc.hal.intf.HalHttpPage;
import se.koc.hal.page.PCConfigureHttpPage; import se.koc.hal.page.PCConfigureHttpPage;
import se.koc.hal.page.PCHeatMapHttpPage; import se.koc.hal.page.PCHeatMapHttpPage;
import se.koc.hal.page.PCOverviewHttpPage; import se.koc.hal.page.PCOverviewHttpPage;
import se.koc.hal.struct.HalSensor; import se.koc.hal.struct.Sensor;
import zutil.db.DBConnection; import zutil.db.DBConnection;
import zutil.io.file.FileUtil; import zutil.io.file.FileUtil;
import zutil.log.CompactLogFormatter; import zutil.log.CompactLogFormatter;
@ -45,11 +45,11 @@ public class PowerChallenge {
DBConnection db = HalContext.getDB(); DBConnection db = HalContext.getDB();
// Init sensors and controllers // Init sensors and controllers
ControllerManager.initialize(); /* ControllerManager.initialize();
for(HalSensor sensor : HalSensor.getLocalSensors(db)){ for(Sensor sensor : Sensor.getLocalSensors(db)){
//ControllerManager.getInstance().register(sensor); ControllerManager.getInstance().register(sensor);
} }
*/
// init daemons // init daemons
daemons = new HalDaemon[]{ daemons = new HalDaemon[]{
new DataAggregatorDaemon(), new DataAggregatorDaemon(),

View file

@ -2,8 +2,8 @@ package se.koc.hal.deamon;
import se.koc.hal.HalContext; import se.koc.hal.HalContext;
import se.koc.hal.intf.HalDaemon; import se.koc.hal.intf.HalDaemon;
import se.koc.hal.struct.HalSensor; import se.koc.hal.struct.Sensor;
import se.koc.hal.struct.HalSensor.AggregationMethod; import se.koc.hal.intf.HalSensor.AggregationMethod;
import se.koc.hal.struct.PowerConsumptionSensor; import se.koc.hal.struct.PowerConsumptionSensor;
import se.koc.hal.util.TimeUtility; import se.koc.hal.util.TimeUtility;
import zutil.db.DBConnection; import zutil.db.DBConnection;
@ -31,8 +31,8 @@ public class DataAggregatorDaemon implements HalDaemon {
@Override @Override
public void run(){ public void run(){
try { try {
List<HalSensor> sensorList = HalSensor.getLocalSensors(HalContext.getDB()); List<Sensor> sensorList = Sensor.getLocalSensors(HalContext.getDB());
for(HalSensor sensor : sensorList){ for(Sensor sensor : sensorList){
logger.fine("Aggregating sensor_id: " + sensor.getId()); logger.fine("Aggregating sensor_id: " + sensor.getId());
aggregateSensor(sensor); aggregateSensor(sensor);
} }
@ -42,7 +42,7 @@ public class DataAggregatorDaemon implements HalDaemon {
} }
} }
public void aggregateSensor(HalSensor sensor) { public void aggregateSensor(Sensor sensor) {
//if(sensor instanceof PowerConsumptionSensor){ //if(sensor instanceof PowerConsumptionSensor){
logger.fine("The sensor is of type: " + PowerConsumptionSensor.class.getSimpleName()); logger.fine("The sensor is of type: " + PowerConsumptionSensor.class.getSimpleName());
logger.fine("aggregating raw data to five minute periods"); logger.fine("aggregating raw data to five minute periods");
@ -61,7 +61,7 @@ public class DataAggregatorDaemon implements HalDaemon {
* @param sensor The sensor for to aggregate data * @param sensor The sensor for to aggregate data
* @param toPeriodSizeInMs The period length in ms to aggregate to * @param toPeriodSizeInMs The period length in ms to aggregate to
*/ */
private void aggregateRawData(HalSensor sensor, long toPeriodSizeInMs, int expectedSampleCount){ private void aggregateRawData(Sensor sensor, long toPeriodSizeInMs, int expectedSampleCount){
long sensorId = sensor.getId(); long sensorId = sensor.getId();
AggregationMethod aggrMethod = sensor.getAggregationMethod(); AggregationMethod aggrMethod = sensor.getAggregationMethod();
DBConnection db = HalContext.getDB(); DBConnection db = HalContext.getDB();
@ -98,7 +98,7 @@ public class DataAggregatorDaemon implements HalDaemon {
* @param fromPeriodSizeInMs The period length in ms to aggregate from * @param fromPeriodSizeInMs The period length in ms to aggregate from
* @param toPeriodSizeInMs The period length in ms to aggregate to * @param toPeriodSizeInMs The period length in ms to aggregate to
*/ */
private void aggrigateAggregatedData(HalSensor sensor, long fromPeriodSizeInMs, long toPeriodSizeInMs){ private void aggrigateAggregatedData(Sensor sensor, long fromPeriodSizeInMs, long toPeriodSizeInMs){
long sensorId = sensor.getId(); long sensorId = sensor.getId();
AggregationMethod aggrMethod = sensor.getAggregationMethod(); AggregationMethod aggrMethod = sensor.getAggregationMethod();
int expectedSampleCount = (int)Math.ceil((double)toPeriodSizeInMs / (double)fromPeriodSizeInMs); int expectedSampleCount = (int)Math.ceil((double)toPeriodSizeInMs / (double)fromPeriodSizeInMs);
@ -158,7 +158,7 @@ public class DataAggregatorDaemon implements HalDaemon {
int sum = 0; int sum = 0;
float confidenceSum = 0; float confidenceSum = 0;
int samples = 0; int samples = 0;
long highestSequenceId = HalSensor.getHighestSequenceId(sensorId); long highestSequenceId = Sensor.getHighestSequenceId(sensorId);
PreparedStatement preparedInsertStmt = HalContext.getDB().getPreparedStatement( PreparedStatement preparedInsertStmt = HalContext.getDB().getPreparedStatement(
"INSERT INTO sensor_data_aggr(sensor_id, sequence_id, timestamp_start, timestamp_end, data, confidence) VALUES(?, ?, ?, ?, ?, ?)"); "INSERT INTO sensor_data_aggr(sensor_id, sequence_id, timestamp_start, timestamp_end, data, confidence) VALUES(?, ?, ?, ?, ?, ?)");
while(result.next()){ while(result.next()){

View file

@ -2,7 +2,7 @@ package se.koc.hal.deamon;
import se.koc.hal.HalContext; import se.koc.hal.HalContext;
import se.koc.hal.intf.HalDaemon; import se.koc.hal.intf.HalDaemon;
import se.koc.hal.struct.HalSensor; import se.koc.hal.struct.Sensor;
import se.koc.hal.struct.PowerConsumptionSensor; import se.koc.hal.struct.PowerConsumptionSensor;
import se.koc.hal.util.TimeUtility; import se.koc.hal.util.TimeUtility;
import zutil.db.DBConnection; import zutil.db.DBConnection;
@ -30,8 +30,8 @@ public class DataCleanupDaemon implements HalDaemon {
@Override @Override
public void run(){ public void run(){
try { try {
List<HalSensor> sensorList = HalSensor.getSensors(HalContext.getDB()); List<Sensor> sensorList = Sensor.getSensors(HalContext.getDB());
for(HalSensor sensor : sensorList){ for(Sensor sensor : sensorList){
logger.fine("Deleting old data for sensor id: " + sensor.getId()); logger.fine("Deleting old data for sensor id: " + sensor.getId());
cleanupSensor(sensor); cleanupSensor(sensor);
} }
@ -41,7 +41,7 @@ public class DataCleanupDaemon implements HalDaemon {
} }
} }
public void cleanupSensor(HalSensor sensor) { public void cleanupSensor(Sensor sensor) {
//if(sensor instanceof PowerConsumptionSensor){ //if(sensor instanceof PowerConsumptionSensor){
logger.fine("The sensor is of type: " + PowerConsumptionSensor.class.getSimpleName()); logger.fine("The sensor is of type: " + PowerConsumptionSensor.class.getSimpleName());
if(sensor.getUser().isExternal()){ if(sensor.getUser().isExternal()){

View file

@ -4,7 +4,7 @@ import se.koc.hal.HalContext;
import se.koc.hal.deamon.DataSynchronizationDaemon.SensorDataDTO; import se.koc.hal.deamon.DataSynchronizationDaemon.SensorDataDTO;
import se.koc.hal.deamon.DataSynchronizationDaemon.SensorDataListDTO; import se.koc.hal.deamon.DataSynchronizationDaemon.SensorDataListDTO;
import se.koc.hal.intf.HalDaemon; import se.koc.hal.intf.HalDaemon;
import se.koc.hal.struct.HalSensor; import se.koc.hal.struct.Sensor;
import se.koc.hal.struct.User; import se.koc.hal.struct.User;
import zutil.db.DBConnection; import zutil.db.DBConnection;
import zutil.log.LogUtil; import zutil.log.LogUtil;
@ -47,12 +47,12 @@ public class DataSynchronizationClient implements HalDaemon {
ObjectOutputStream out = new ObjectOutputStream(s.getOutputStream()); ObjectOutputStream out = new ObjectOutputStream(s.getOutputStream());
ObjectInputStream in = new ObjectInputStream(s.getInputStream()); ObjectInputStream in = new ObjectInputStream(s.getInputStream());
List<HalSensor> sensors = HalSensor.getSensors(db, user); List<Sensor> sensors = Sensor.getSensors(db, user);
for(HalSensor sensor : sensors){ for(Sensor sensor : sensors){
if(sensor.isSynced()) { if(sensor.isSynced()) {
PeerDataReqDTO req = new PeerDataReqDTO(); PeerDataReqDTO req = new PeerDataReqDTO();
req.sensorId = sensor.getExternalId(); req.sensorId = sensor.getExternalId();
req.offsetSequenceId = HalSensor.getHighestSequenceId(sensor.getId()); req.offsetSequenceId = Sensor.getHighestSequenceId(sensor.getId());
out.writeObject(req); out.writeObject(req);
SensorDataListDTO dataList = (SensorDataListDTO) in.readObject(); SensorDataListDTO dataList = (SensorDataListDTO) in.readObject();

View file

@ -0,0 +1,11 @@
package se.koc.hal.intf;
/**
* Created by Ziver on 2015-12-23.
*/
public interface HalEvent {
public Class<? extends HalEventController> getController();
}

View file

@ -1,6 +1,6 @@
package se.koc.hal.intf; package se.koc.hal.intf;
import se.koc.hal.struct.HalEvent; import se.koc.hal.struct.Event;
/** /**
* Created by Ziver on 2015-12-15. * Created by Ziver on 2015-12-15.
@ -9,18 +9,18 @@ public interface HalEventController {
/** /**
* Will register an event type to be handled by this controller * Will register an event type to be handled by this controller
*/ */
public void register(HalEvent event); public void register(Event event);
/** /**
* Deregisters an event from this controller, the controller * Deregisters an event from this controller, the controller
* will no longer handle that type of event * will no longer handle that type of event
*/ */
public void deregister(HalEvent event); public void deregister(Event event);
/** /**
* @param event transmit this event if possible. * @param event transmit this event if possible.
*/ */
public void send(HalEvent event); public void send(Event event);
/** /**
* @return the number of registered objects * @return the number of registered objects

View file

@ -0,0 +1,18 @@
package se.koc.hal.intf;
/**
* Created by Ziver on 2015-12-23.
*/
public interface HalSensor {
enum AggregationMethod{
SUM,
AVERAGE
}
public AggregationMethod getAggregationMethod();
public Class<? extends HalSensorController> getController();
}

View file

@ -1,6 +1,6 @@
package se.koc.hal.intf; package se.koc.hal.intf;
import se.koc.hal.struct.HalSensor; import se.koc.hal.struct.Sensor;
/** /**
* Created by Ziver on 2015-12-15. * Created by Ziver on 2015-12-15.
@ -10,13 +10,13 @@ public interface HalSensorController {
/** /**
* Will register a sensor type to be handled by this controller * Will register a sensor type to be handled by this controller
*/ */
public void register(HalSensor sensor); public void register(Sensor sensor);
/** /**
* Deregisters a sensor from this controller, the controller * Deregisters a sensor from this controller, the controller
* will no longer handle that type of sensor * will no longer handle that type of sensor
*/ */
public void deregister(HalSensor sensor); public void deregister(Sensor sensor);
/** /**
* @return the number of registered objects * @return the number of registered objects

View file

@ -2,7 +2,7 @@ package se.koc.hal.page;
import se.koc.hal.HalContext; import se.koc.hal.HalContext;
import se.koc.hal.intf.HalHttpPage; import se.koc.hal.intf.HalHttpPage;
import se.koc.hal.struct.HalSensor; import se.koc.hal.struct.Sensor;
import se.koc.hal.struct.User; import se.koc.hal.struct.User;
import zutil.db.DBConnection; import zutil.db.DBConnection;
import zutil.io.file.FileUtil; import zutil.io.file.FileUtil;
@ -30,7 +30,7 @@ public class PCConfigureHttpPage extends HalHttpPage {
if(request.containsKey("action")){ if(request.containsKey("action")){
String action = request.get("action"); String action = request.get("action");
int id = (request.containsKey("id") ? Integer.parseInt(request.get("id")) : -1); int id = (request.containsKey("id") ? Integer.parseInt(request.get("id")) : -1);
HalSensor sensor; Sensor sensor;
User user; User user;
switch(action) { switch(action) {
// Local User // Local User
@ -42,7 +42,7 @@ public class PCConfigureHttpPage extends HalHttpPage {
// Local Sensors // Local Sensors
case "create_local_sensor": case "create_local_sensor":
sensor = new HalSensor(); sensor = new Sensor();
sensor.setName(request.get("name")); sensor.setName(request.get("name"));
sensor.setType(request.get("type")); sensor.setType(request.get("type"));
sensor.setConfig(request.get("config")); sensor.setConfig(request.get("config"));
@ -50,7 +50,7 @@ public class PCConfigureHttpPage extends HalHttpPage {
sensor.setSynced(true); sensor.setSynced(true);
sensor.save(db); sensor.save(db);
case "modify_local_sensor": case "modify_local_sensor":
sensor = HalSensor.getSensor(db, id); sensor = Sensor.getSensor(db, id);
if(sensor != null){ if(sensor != null){
sensor.setName(request.get("name")); sensor.setName(request.get("name"));
sensor.setType(request.get("type")); sensor.setType(request.get("type"));
@ -59,7 +59,7 @@ public class PCConfigureHttpPage extends HalHttpPage {
} }
break; break;
case "remove_local_sensor": case "remove_local_sensor":
sensor = HalSensor.getSensor(db, id); sensor = Sensor.getSensor(db, id);
if(sensor != null) if(sensor != null)
sensor.delete(db); sensor.delete(db);
break; break;
@ -88,7 +88,7 @@ public class PCConfigureHttpPage extends HalHttpPage {
// External Sensors // External Sensors
case "modify_external_sensor": case "modify_external_sensor":
sensor = HalSensor.getSensor(db, id); sensor = Sensor.getSensor(db, id);
if(sensor != null){ if(sensor != null){
sensor.setSynced(Boolean.parseBoolean(request.get("sync"))); sensor.setSynced(Boolean.parseBoolean(request.get("sync")));
sensor.save(db); sensor.save(db);
@ -100,9 +100,9 @@ public class PCConfigureHttpPage extends HalHttpPage {
// Output // Output
Templator tmpl = new Templator(FileUtil.find("web-resource/configure.tmpl")); Templator tmpl = new Templator(FileUtil.find("web-resource/configure.tmpl"));
tmpl.set("user", localUser); tmpl.set("user", localUser);
tmpl.set("localSensor", HalSensor.getLocalSensors(db)); tmpl.set("localSensor", Sensor.getLocalSensors(db));
tmpl.set("extUsers", User.getExternalUsers(db)); tmpl.set("extUsers", User.getExternalUsers(db));
tmpl.set("extSensor", HalSensor.getExternalSensors(db)); tmpl.set("extSensor", Sensor.getExternalSensors(db));
return tmpl; return tmpl;

View file

@ -23,12 +23,15 @@
package se.koc.hal.plugin.tellstick; package se.koc.hal.plugin.tellstick;
import com.fazecast.jSerialComm.SerialPort; import com.fazecast.jSerialComm.SerialPort;
import se.koc.hal.intf.HalSensorController;
import se.koc.hal.struct.Sensor;
import zutil.log.InputStreamLogger; import zutil.log.InputStreamLogger;
import zutil.log.LogUtil; import zutil.log.LogUtil;
import zutil.log.OutputStreamLogger; import zutil.log.OutputStreamLogger;
import zutil.struct.TimedHashSet; import zutil.struct.TimedHashSet;
import java.io.*; import java.io.*;
import java.util.concurrent.Executors;
import java.util.logging.Level; import java.util.logging.Level;
import java.util.logging.Logger; import java.util.logging.Logger;
@ -36,7 +39,7 @@ import java.util.logging.Logger;
* This version of the TwoWaySerialComm example makes use of the * This version of the TwoWaySerialComm example makes use of the
* SerialPortEventListener to avoid polling. * SerialPortEventListener to avoid polling.
*/ */
public class TellstickSerialComm extends Thread{ public class TellstickSerialComm implements Runnable, HalSensorController {
private static final long TRANSMISSION_UNIQUENESS_TTL = 300; // milliseconds private static final long TRANSMISSION_UNIQUENESS_TTL = 300; // milliseconds
private static final Logger logger = LogUtil.getLogger(); private static final Logger logger = LogUtil.getLogger();
private static TellstickSerialComm instance; private static TellstickSerialComm instance;
@ -50,8 +53,9 @@ public class TellstickSerialComm extends Thread{
private TellstickChangeListener listener; private TellstickChangeListener listener;
public TellstickSerialComm(){ public TellstickSerialComm() throws Exception {
set = new TimedHashSet(TRANSMISSION_UNIQUENESS_TTL); set = new TimedHashSet(TRANSMISSION_UNIQUENESS_TTL);
connect("COM6");
} }
public void connect(String portName) throws Exception { public void connect(String portName) throws Exception {
@ -64,14 +68,29 @@ public class TellstickSerialComm extends Thread{
in = new BufferedReader(new InputStreamReader(new InputStreamLogger(serial.getInputStream()), "UTF-8")); in = new BufferedReader(new InputStreamReader(new InputStreamLogger(serial.getInputStream()), "UTF-8"));
out = new BufferedWriter(new OutputStreamWriter(new OutputStreamLogger(serial.getOutputStream()), "UTF-8")); out = new BufferedWriter(new OutputStreamWriter(new OutputStreamLogger(serial.getOutputStream()), "UTF-8"));
this.start(); Executors.newSingleThreadExecutor().submit(this);
}
public void close() {
if(serial != null) {
try {
serial.closePort();
in.close();
out.close();
} catch (IOException e) {
logger.log(Level.SEVERE, null, e);
}
}
serial = null;
in = null;
out = null;
} }
public void run() { public void run() {
try { try {
String data; String data;
while ((data = in.readLine()) != null) { while (in != null && (data = in.readLine()) != null) {
if ((data.startsWith("+S") || data.startsWith("+T"))) { if ((data.startsWith("+S") || data.startsWith("+T"))) {
synchronized (this) { synchronized (this) {
this.notifyAll(); this.notifyAll();
@ -117,15 +136,17 @@ public class TellstickSerialComm extends Thread{
} }
public static TellstickSerialComm getInstance(){
if(instance == null){ @Override
try { public void register(Sensor sensor) {
instance = new TellstickSerialComm();
instance.connect("COM6");
} catch (Exception e) {
logger.log(Level.SEVERE, null, e);
} }
@Override
public void deregister(Sensor sensor) {
} }
return instance; @Override
public int size() {
return 0;
} }
} }

View file

@ -1,11 +1,15 @@
package se.koc.hal.plugin.tellstick.protocols; package se.koc.hal.plugin.tellstick.protocols;
import se.koc.hal.intf.HalSensor;
import se.koc.hal.intf.HalSensorController;
import se.koc.hal.plugin.tellstick.TellstickProtocol; import se.koc.hal.plugin.tellstick.TellstickProtocol;
import se.koc.hal.plugin.tellstick.TellstickSerialComm;
import se.koc.hal.struct.PowerConsumptionSensor;
/** /**
* Created by Ziver on 2015-11-19. * Created by Ziver on 2015-11-19.
*/ */
public class Oregon0x1A2D implements TellstickProtocol { public class Oregon0x1A2D implements TellstickProtocol, PowerConsumptionSensor {
double temperature = 0; double temperature = 0;
double humidity = 0; double humidity = 0;
@ -74,4 +78,16 @@ public class Oregon0x1A2D implements TellstickProtocol {
public double getHumidity(){ public double getHumidity(){
return humidity; return humidity;
} }
@Override
public AggregationMethod getAggregationMethod() {
return AggregationMethod.SUM;
}
@Override
public Class<? extends HalSensorController> getController() {
return TellstickSerialComm.class;
}
} }

View file

@ -22,8 +22,10 @@
package se.koc.hal.struct; package se.koc.hal.struct;
import se.koc.hal.intf.HalEvent;
/** /**
* Created by Ziver on 2015-05-07. * Created by Ziver on 2015-05-07.
*/ */
public class DimmerEvent extends HalEvent{ public abstract class DimmerEvent implements HalEvent {
} }

View file

@ -0,0 +1,56 @@
package se.koc.hal.struct;
import se.koc.hal.intf.HalEvent;
import se.koc.hal.intf.HalEventController;
import zutil.db.DBConnection;
import zutil.db.bean.DBBean;
import zutil.db.bean.DBBeanSQLResultHandler;
import zutil.log.LogUtil;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
* Created by Ziver on 2015-12-15.
*/
@DBBean.DBTable("event")
public class Event extends DBBean{
private static final Logger logger = LogUtil.getLogger();
// Event specific data
private String name;
private String type;
private String config;
// Event specific data
private transient HalEvent eventData;
// User configuration
private User user;
public static List<Event> getEvents(DBConnection db) throws SQLException {
PreparedStatement stmt = db.getPreparedStatement( "SELECT * FROM event" );
return DBConnection.exec(stmt, DBBeanSQLResultHandler.createList(Event.class, db) );
}
private HalEvent getEventData(){
if(eventData == null) {
try {
Class c = Class.forName(type);
eventData = (HalEvent) c.newInstance();
} catch (Exception e){
logger.log(Level.SEVERE, null, e);
}
}
return eventData;
}
public Class<? extends HalEventController> getController(){
return getEventData().getController();
}
}

View file

@ -1,37 +0,0 @@
package se.koc.hal.struct;
import se.koc.hal.intf.HalEventController;
import zutil.db.DBConnection;
import zutil.db.bean.DBBean;
import zutil.db.bean.DBBeanSQLResultHandler;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.List;
/**
* Created by Ziver on 2015-12-15.
*/
@DBBean.DBTable("event")
public class HalEvent extends DBBean{
// Event specific data
private String name;
private String type;
private String config;
// User configuration
private User user;
public static List<HalEvent> getEvents(DBConnection db) throws SQLException {
PreparedStatement stmt = db.getPreparedStatement( "SELECT * FROM event" );
return DBConnection.exec(stmt, DBBeanSQLResultHandler.createList(HalEvent.class, db) );
}
public Class<? extends HalEventController> getController(){
return null;
}
}

View file

@ -1,7 +1,9 @@
package se.koc.hal.struct; package se.koc.hal.struct;
import se.koc.hal.intf.HalSensor;
/** /**
* Created by Ziver on 2015-12-03. * Created by Ziver on 2015-12-03.
*/ */
public class PowerConsumptionSensor extends HalSensor { public interface PowerConsumptionSensor extends HalSensor {
} }

View file

@ -1,28 +1,31 @@
package se.koc.hal.struct; package se.koc.hal.struct;
import se.koc.hal.HalContext; import se.koc.hal.HalContext;
import se.koc.hal.intf.HalEvent;
import se.koc.hal.intf.HalSensor;
import se.koc.hal.intf.HalSensorController; import se.koc.hal.intf.HalSensorController;
import zutil.db.DBConnection; import zutil.db.DBConnection;
import zutil.db.bean.DBBean; import zutil.db.bean.DBBean;
import zutil.db.bean.DBBeanSQLResultHandler; import zutil.db.bean.DBBeanSQLResultHandler;
import zutil.db.handler.SimpleSQLResult; import zutil.db.handler.SimpleSQLResult;
import zutil.log.LogUtil;
import java.sql.PreparedStatement; import java.sql.PreparedStatement;
import java.sql.SQLException; import java.sql.SQLException;
import java.util.List; import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
@DBBean.DBTable("sensor") @DBBean.DBTable("sensor")
public class HalSensor extends DBBean{ public class Sensor extends DBBean{
public enum AggregationMethod{ private static final Logger logger = LogUtil.getLogger();
SUM,
AVERAGE
}
// Sensor specific data // Sensor specific data
private String name; private String name;
private String type; private String type;
private String config; private String config;
// Sensor specific data
private transient HalSensor sensorData;
// User configuration // User configuration
@DBColumn("user_id") @DBColumn("user_id")
@ -33,32 +36,31 @@ public class HalSensor extends DBBean{
public static List<HalSensor> getExternalSensors(DBConnection db) throws SQLException{ public static List<Sensor> getExternalSensors(DBConnection db) throws SQLException{
PreparedStatement stmt = db.getPreparedStatement( "SELECT sensor.* FROM sensor,user WHERE user.external == 1 AND user.id == sensor.user_id" ); PreparedStatement stmt = db.getPreparedStatement( "SELECT sensor.* FROM sensor,user WHERE user.external == 1 AND user.id == sensor.user_id" );
return DBConnection.exec(stmt, DBBeanSQLResultHandler.createList(HalSensor.class, db) ); return DBConnection.exec(stmt, DBBeanSQLResultHandler.createList(Sensor.class, db) );
} }
public static List<HalSensor> getLocalSensors(DBConnection db) throws SQLException{ public static List<Sensor> getLocalSensors(DBConnection db) throws SQLException{
PreparedStatement stmt = db.getPreparedStatement( "SELECT sensor.* FROM sensor,user WHERE user.external == 0 AND user.id == sensor.user_id" ); PreparedStatement stmt = db.getPreparedStatement( "SELECT sensor.* FROM sensor,user WHERE user.external == 0 AND user.id == sensor.user_id" );
return DBConnection.exec(stmt, DBBeanSQLResultHandler.createList(HalSensor.class, db) ); return DBConnection.exec(stmt, DBBeanSQLResultHandler.createList(Sensor.class, db) );
} }
public static List<HalSensor> getSensors(DBConnection db, User user) throws SQLException{ public static List<Sensor> getSensors(DBConnection db, User user) throws SQLException{
PreparedStatement stmt = db.getPreparedStatement( "SELECT * FROM sensor WHERE user_id == ?" ); PreparedStatement stmt = db.getPreparedStatement( "SELECT * FROM sensor WHERE user_id == ?" );
stmt.setLong(1, user.getId()); stmt.setLong(1, user.getId());
return DBConnection.exec(stmt, DBBeanSQLResultHandler.createList(HalSensor.class, db) ); return DBConnection.exec(stmt, DBBeanSQLResultHandler.createList(Sensor.class, db) );
} }
public static List<HalSensor> getSensors(DBConnection db) throws SQLException{ public static List<Sensor> getSensors(DBConnection db) throws SQLException{
PreparedStatement stmt = db.getPreparedStatement( "SELECT * FROM sensor" ); PreparedStatement stmt = db.getPreparedStatement( "SELECT * FROM sensor" );
return DBConnection.exec(stmt, DBBeanSQLResultHandler.createList(HalSensor.class, db) ); return DBConnection.exec(stmt, DBBeanSQLResultHandler.createList(Sensor.class, db) );
} }
public static HalSensor getSensor(DBConnection db, int id) throws SQLException{ public static Sensor getSensor(DBConnection db, int id) throws SQLException{
return DBBean.load(db, HalSensor.class, id); return DBBean.load(db, Sensor.class, id);
} }
public static long getHighestSequenceId(long sensorId) throws SQLException{ public static long getHighestSequenceId(long sensorId) throws SQLException{
PreparedStatement stmt = HalContext.getDB().getPreparedStatement("SELECT MAX(sequence_id) FROM sensor_data_aggr WHERE sensor_id == ?"); PreparedStatement stmt = HalContext.getDB().getPreparedStatement("SELECT MAX(sequence_id) FROM sensor_data_aggr WHERE sensor_id == ?");
stmt.setLong(1, sensorId); stmt.setLong(1, sensorId);
@ -67,6 +69,17 @@ public class HalSensor extends DBBean{
} }
private HalSensor getSensorData(){
if(sensorData == null) {
try {
Class c = Class.forName(type);
sensorData = (HalSensor) c.newInstance();
} catch (Exception e){
logger.log(Level.SEVERE, null, e);
}
}
return sensorData;
}
public String getName() { public String getName() {
return name; return name;
@ -107,11 +120,11 @@ public class HalSensor extends DBBean{
} }
public AggregationMethod getAggregationMethod(){ public HalSensor.AggregationMethod getAggregationMethod(){
return AggregationMethod.SUM; return getSensorData().getAggregationMethod();
} }
public Class<? extends HalSensorController> getController(){ public Class<? extends HalSensorController> getController(){
return null; return getSensorData().getController();
} }
} }

View file

@ -22,44 +22,16 @@
package se.koc.hal.struct; package se.koc.hal.struct;
import se.koc.hal.intf.HalEvent;
import se.koc.hal.plugin.tellstick.TellstickSerialComm; import se.koc.hal.plugin.tellstick.TellstickSerialComm;
import se.koc.hal.plugin.tellstick.protocols.NexaSelfLearning; import se.koc.hal.plugin.tellstick.protocols.NexaSelfLearning;
/** /**
* Created by Ziver on 2015-05-07. * Created by Ziver on 2015-05-07.
*/ */
public class SwitchEvent extends HalEvent{ public interface SwitchEvent extends HalEvent {
private String name;
private NexaSelfLearning nexa;
public boolean isOn();
public SwitchEvent(String name, NexaSelfLearning nexa){ public void turnOn();
this.name = name; public void turnOff();
this.nexa = nexa;
}
public String getName() {
return name;
}
public boolean isOn(){
return nexa.isEnabled();
}
public void turnOn(){
nexa.setEnable(true);
TellstickSerialComm.getInstance().write(nexa);
}
public void turnOff(){
nexa.setEnable(false);
TellstickSerialComm.getInstance().write(nexa);
}
public boolean equals(Object obj){
if(obj instanceof String)
return name.equals(obj);
if(obj instanceof NexaSelfLearning)
return nexa.equals(obj);
return this == obj;
}
} }

View file

@ -1,7 +1,13 @@
package se.koc.hal.struct; package se.koc.hal.struct;
import se.koc.hal.intf.HalSensor;
/** /**
* Created by Ziver on 2015-12-03. * Created by Ziver on 2015-12-03.
*/ */
public class TemperatureSensor extends HalSensor { public interface TemperatureSensor extends HalSensor {
public double getTemperature();
public double getHumidity();
} }

View file

@ -43,8 +43,6 @@ public class TelstickSerialCommTest {
} }
}); });
logger.info("Connecting to com port..."); logger.info("Connecting to com port...");
//comm.connect("COM5");
comm.setDaemon(false);
comm.connect("/dev/ttyUSB1"); comm.connect("/dev/ttyUSB1");
logger.info("Up and Running"); logger.info("Up and Running");