Added Sensor trigger

This commit is contained in:
Ziver Koc 2017-03-30 18:13:11 +02:00
parent 5b67dde4e4
commit 3329695671
5 changed files with 114 additions and 64 deletions

View file

@ -21,6 +21,7 @@
{"se.hal.intf.HalTrigger": "se.hal.trigger.DateTimeTrigger"},
{"se.hal.intf.HalTrigger": "se.hal.trigger.EventTrigger"},
{"se.hal.intf.HalTrigger": "se.hal.trigger.SensorTrigger"},
{"se.hal.intf.HalTrigger": "se.hal.trigger.TimerTrigger"},
{"se.hal.intf.HalAction": "se.hal.action.SendEventAction"}
]

View file

@ -2,6 +2,7 @@ package se.hal.struct;
import se.hal.ControllerManager;
import se.hal.HalContext;
import se.hal.intf.HalDeviceData;
import se.hal.intf.HalDeviceReportListener;
import zutil.db.DBConnection;
import zutil.db.bean.DBBean;
@ -23,7 +24,7 @@ import java.util.logging.Logger;
* @param <C> is the device configuration class
* @param <D> is the device data class
*/
public abstract class AbstractDevice<T extends AbstractDevice, C,D> extends DBBean {
public abstract class AbstractDevice<T extends AbstractDevice, C,D extends HalDeviceData> extends DBBean {
private static final Logger logger = LogUtil.getLogger();
// Sensor specific data

View file

@ -0,0 +1,69 @@
package se.hal.trigger;
import se.hal.TriggerManager;
import se.hal.intf.HalDeviceData;
import se.hal.intf.HalDeviceReportListener;
import se.hal.intf.HalTrigger;
import se.hal.struct.AbstractDevice;
import zutil.ui.Configurator;
import zutil.ui.Configurator.PostConfigurationActionListener;
import zutil.ui.Configurator.PreConfigurationActionListener;
/**
* An abstract class that implements generic device data logic
*/
public abstract class DeviceTrigger implements HalTrigger,
PreConfigurationActionListener,
PostConfigurationActionListener, HalDeviceReportListener<AbstractDevice> {
@Configurator.Configurable("Device ID")
protected int deviceId = -1;
@Configurator.Configurable("Trigger only on change")
protected boolean triggerOnChange = true;
@Configurator.Configurable("Data to compare to")
protected double expectedData;
private transient HalDeviceData receivedData;
@Override
public void preConfigurationAction(Configurator configurator, Object obj) {
AbstractDevice device = getDevice(deviceId);
if (device != null)
device.removeReportListener(this);
reset();
}
@Override
public void postConfigurationAction(Configurator configurator, Object obj) {
AbstractDevice device = getDevice(deviceId);
if (device != null)
device.addReportListener(this);
}
@Override
public void receivedReport(AbstractDevice device) {
receivedData = device.getDeviceData();
// Instant trigger evaluation
if (triggerOnChange)
TriggerManager.getInstance().evaluateAndExecute();
}
@Override
public boolean evaluate() {
if (receivedData != null)
return expectedData == receivedData.getData();
return false;
}
@Override
public void reset() {
if (triggerOnChange) // only reset if we want to trigger on change
receivedData = null;
}
protected abstract AbstractDevice getDevice(long id);
}

View file

@ -1,16 +1,8 @@
package se.hal.trigger;
import se.hal.HalContext;
import se.hal.TriggerManager;
import se.hal.intf.HalDeviceReportListener;
import se.hal.intf.HalEventData;
import se.hal.intf.HalTrigger;
import se.hal.struct.Event;
import zutil.db.DBConnection;
import zutil.log.LogUtil;
import zutil.ui.Configurator;
import zutil.ui.Configurator.PostConfigurationActionListener;
import zutil.ui.Configurator.PreConfigurationActionListener;
import java.sql.SQLException;
import java.util.logging.Level;
@ -19,71 +11,23 @@ import java.util.logging.Logger;
/**
*
*/
public class EventTrigger implements HalTrigger,
PreConfigurationActionListener,
PostConfigurationActionListener, HalDeviceReportListener<Event> {
public class EventTrigger extends DeviceTrigger{
private static final Logger logger = LogUtil.getLogger();
@Configurator.Configurable("Event Device ID")
private int eventId = -1;
@Configurator.Configurable("Trigger only on change")
private boolean triggerOnChange = true;
@Configurator.Configurable("Data to compare to")
private double expectedData;
private transient HalEventData receivedData;
private Event getEvent(long id){
@Override
protected Event getDevice(long id) {
try {
if (eventId >= 0)
return Event.getEvent(HalContext.getDB(), eventId);
if (id >= 0)
return Event.getEvent(HalContext.getDB(), id);
} catch (SQLException e){ logger.log(Level.SEVERE, null, e);}
return null;
}
@Override
public void preConfigurationAction(Configurator configurator, Object obj) {
Event event = getEvent(eventId);
if (event != null)
event.removeReportListener(this);
reset();
}
@Override
public void postConfigurationAction(Configurator configurator, Object obj) {
Event event = getEvent(eventId);
if (event != null)
event.addReportListener(this);
}
@Override
public void receivedReport(Event device) {
receivedData = device.getDeviceData();
// Instant trigger evaluation
if (triggerOnChange)
TriggerManager.getInstance().evaluateAndExecute();
}
@Override
public boolean evaluate() {
if (receivedData != null)
return expectedData == receivedData.getData();
return false;
}
@Override
public void reset() {
if (triggerOnChange) // only reset if we want to trigger on change
receivedData = null;
}
@Override
public String toString(){
Event event = getEvent(eventId);
Event event = getDevice(deviceId);
return "Trigger " + (triggerOnChange ? "on" : "when") +
" event: "+eventId+" ("+(event != null ? event.getName() : null) + ")" +
" event: "+ deviceId +" ("+(event != null ? event.getName() : null) + ")" +
" == "+ expectedData;
}

View file

@ -0,0 +1,35 @@
package se.hal.trigger;
import se.hal.HalContext;
import se.hal.struct.Event;
import se.hal.struct.Sensor;
import zutil.log.LogUtil;
import java.sql.SQLException;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
*
*/
public class SensorTrigger extends DeviceTrigger{
private static final Logger logger = LogUtil.getLogger();
@Override
protected Sensor getDevice(long id) {
try {
if (id >= 0)
return Sensor.getSensor(HalContext.getDB(), id);
} catch (SQLException e){ logger.log(Level.SEVERE, null, e);}
return null;
}
@Override
public String toString(){
Sensor sensor = getDevice(deviceId);
return "Trigger " + (triggerOnChange ? "on" : "when") +
" sensor: "+ deviceId +" ("+(sensor != null ? sensor.getName() : null) + ")" +
" == "+ expectedData;
}
}