diff --git a/hal-core/resource/resource/web/event_config.tmpl b/hal-core/resource/resource/web/event_config.tmpl
index 4ce353a2..14cd4fb8 100644
--- a/hal-core/resource/resource/web/event_config.tmpl
+++ b/hal-core/resource/resource/web/event_config.tmpl
@@ -122,9 +122,9 @@
@@ -142,7 +142,7 @@
- {{#localEventConf}}
+ {{#availableEventObjectConfig}}
{{#.params}}
@@ -158,6 +158,6 @@
{{/.params}}
- {{/localEventConf}}
+ {{/availableEventObjectConfig}}
diff --git a/hal-core/resource/resource/web/js/hal.js b/hal-core/resource/resource/web/js/hal.js
index 8f290c34..47971b62 100644
--- a/hal-core/resource/resource/web/js/hal.js
+++ b/hal-core/resource/resource/web/js/hal.js
@@ -1,11 +1,16 @@
-///////////////////////////////// Autostart
+// --------------------------------------------------------
+// Autostart
+// --------------------------------------------------------
+
$(function(){
$(".toggle-switch").bootstrapSwitch();
$(".timestamp").relTimestamp();
});
-////////////////////////////////////// JQuery helper functions
+// --------------------------------------------------------
+// JQuery helper functions
+// --------------------------------------------------------
// $.attr() # returns all attributes of an element
(function(old) {
@@ -28,7 +33,11 @@ $(function(){
};
})($.fn.attr);
-// converts all timestamps to human readable time and date
+// --------------------------------------------------------
+// Timestamps
+// --------------------------------------------------------
+
+// Converts all timestamps to human readable time and date
$.fn.relTimestamp = function() {
return this.each(function() {
var timestamp = parseInt($(this).text());
@@ -45,10 +54,10 @@ $.fn.relTimestamp = function() {
});
};
+// --------------------------------------------------------
+// Chart functions
+// --------------------------------------------------------
-////////////////////////////////////// Hal functions
-
-////////////// Chart functions
function createChart(elementId, url, updateTime=-1){
var tickConf = {count: 20};
if (updateTime < 60*60*1000)
@@ -127,30 +136,33 @@ function getChartData(json){
};
}
-////////////// Dynamic forms
+// --------------------------------------------------------
+// Dynamic forms
+// --------------------------------------------------------
+
var dynamicConf = {};
function initDynamicModalForm(modalId, formTemplateId = null, templateID = null){
// read in all configurations into global variable (to skip naming issues)
if (formTemplateId != null) {
dynamicConf[formTemplateId] = [];
- $("#"+templateID+" div").each(function(){
+ $("#" + templateID + " div").each(function(){
dynamicConf[formTemplateId][$(this).attr("id")] = $(this).html();
});
// Update dynamic inputs
- $("#"+modalId+" select[name=type]").change(function(){
- $("#"+modalId+" #"+formTemplateId).html(dynamicConf[formTemplateId][$(this).val()]);
+ $("#" + modalId + " select[name=type]").change(function(){
+ $("#" + modalId + " #" + formTemplateId).html(dynamicConf[formTemplateId][$(this).val()]);
});
}
// click event
- $("#"+modalId).on('show.bs.modal', function (event) {
+ $("#" + modalId).on('show.bs.modal', function (event) {
var button = $(event.relatedTarget);
var modal = $(this);
// Reset all inputs
if (formTemplateId != null)
- modal.find("#"+formTemplateId).empty(); // clear form div
+ modal.find("#" + formTemplateId).empty(); // clear form div
// select dynamic form
var selector = modal.find("select[name=type]");
@@ -169,7 +181,7 @@ function initDynamicModalForm(modalId, formTemplateId = null, templateID = null)
if (value=="true") input.attr("checked", "true");
else input.removeAttr("checked");
// Add default false value as a unchecked checkbox is not included in the post
- input.parent().prepend("");
+ input.parent().prepend("");
} else {
input.val(value);
}
diff --git a/hal-core/resource/resource/web/sensor_config.tmpl b/hal-core/resource/resource/web/sensor_config.tmpl
index 789ec4c5..e2d8d66a 100644
--- a/hal-core/resource/resource/web/sensor_config.tmpl
+++ b/hal-core/resource/resource/web/sensor_config.tmpl
@@ -224,9 +224,9 @@
@@ -251,7 +251,7 @@
- {{#localSensorConf}}
+ {{#availableSensorObjectConfig}}
{{#.params}}
@@ -267,7 +267,7 @@
{{/.params}}
- {{/localSensorConf}}
+ {{/availableSensorObjectConfig}}
diff --git a/hal-core/src/se/hal/EventControllerManager.java b/hal-core/src/se/hal/EventControllerManager.java
index 7f856b78..3658349c 100644
--- a/hal-core/src/se/hal/EventControllerManager.java
+++ b/hal-core/src/se/hal/EventControllerManager.java
@@ -109,7 +109,7 @@ public class EventControllerManager extends HalAbstractControllerManager eventClass) {
+ public void addAvailableDeviceConfig(Class extends HalEventConfig> eventClass) {
if (!availableEvents.contains(eventClass))
availableEvents.add(eventClass);
}
diff --git a/hal-core/src/se/hal/SensorControllerManager.java b/hal-core/src/se/hal/SensorControllerManager.java
index 1cbc89f2..d9ec0eed 100644
--- a/hal-core/src/se/hal/SensorControllerManager.java
+++ b/hal-core/src/se/hal/SensorControllerManager.java
@@ -111,7 +111,7 @@ public class SensorControllerManager extends HalAbstractControllerManager sensorConfigClass) {
+ public void addAvailableDeviceConfig(Class extends HalSensorConfig> sensorConfigClass) {
if (!availableSensors.contains(sensorConfigClass))
availableSensors.add(sensorConfigClass);
}
diff --git a/hal-core/src/se/hal/intf/HalAbstractControllerManager.java b/hal-core/src/se/hal/intf/HalAbstractControllerManager.java
index 4889b11e..8e6b945c 100644
--- a/hal-core/src/se/hal/intf/HalAbstractControllerManager.java
+++ b/hal-core/src/se/hal/intf/HalAbstractControllerManager.java
@@ -31,7 +31,7 @@ public abstract class HalAbstractControllerManager= 1 && genericClasses[0] != null) {
for (Iterator> it = pluginManager.getClassIterator(genericClasses[0]); it.hasNext(); ) {
- addAvailableDevice(it.next());
+ addAvailableDeviceConfig(it.next());
}
} else {
logger.severe("Unable to retrieve Controller class from generics.");
@@ -63,7 +63,7 @@ public abstract class HalAbstractControllerManager deviceConfigClass);
+ public abstract void addAvailableDeviceConfig(Class extends C> deviceConfigClass);
/**
* @return a List of all available devices that can be registered with this manager
diff --git a/hal-core/src/se/hal/intf/HalDaemon.java b/hal-core/src/se/hal/intf/HalDaemon.java
index c07186ca..126b509d 100644
--- a/hal-core/src/se/hal/intf/HalDaemon.java
+++ b/hal-core/src/se/hal/intf/HalDaemon.java
@@ -3,14 +3,14 @@ package se.hal.intf;
import java.util.concurrent.ScheduledExecutorService;
/**
- * Defines a stand alone process that will run parallel to Hal
+ * Defines a standalone process that will run parallel to the main application
*/
public interface HalDaemon extends Runnable {
/**
* Setup the execution of the daemon with the provided executor.
*
- * @param executor the scheduler provided by HAL for the daemon to setup its execution.
+ * @param executor the scheduler provided for the daemon to setup its execution.
*/
void initiate(ScheduledExecutorService executor);
diff --git a/hal-core/src/se/hal/page/EventConfigWebPage.java b/hal-core/src/se/hal/page/EventConfigWebPage.java
index df336993..82fa6c7c 100644
--- a/hal-core/src/se/hal/page/EventConfigWebPage.java
+++ b/hal-core/src/se/hal/page/EventConfigWebPage.java
@@ -22,14 +22,13 @@ public class EventConfigWebPage extends HalWebPage {
private static final Logger logger = LogUtil.getLogger();
private static final String TEMPLATE = HalContext.RESOURCE_WEB_ROOT + "/event_config.tmpl";
- private ArrayList eventConfigurations;
+ private ArrayList eventConfigurations = new ArrayList<>();
public EventConfigWebPage() {
super("event_config");
super.getRootNav().createSubNav("Settings").createSubNav(this.getId(), "Event Settings").setWeight(200);
- eventConfigurations = new ArrayList<>();
for (Class c : EventControllerManager.getInstance().getAvailableDeviceConfigs())
eventConfigurations.add(new ClassConfigurationData(c));
}
@@ -50,7 +49,6 @@ public class EventConfigWebPage extends HalWebPage {
Event event;
switch(request.get("action")) {
- // Local events
case "create_local_event":
logger.info("Creating new event: " + request.get("name"));
event = new Event();
@@ -110,9 +108,9 @@ public class EventConfigWebPage extends HalWebPage {
Templator tmpl = new Templator(FileUtil.find(TEMPLATE));
tmpl.set("user", localUser);
tmpl.set("localEvents", Event.getLocalEvents(db));
- tmpl.set("localEventConf", eventConfigurations);
tmpl.set("detectedEvents", EventControllerManager.getInstance().getDetectedDevices());
- tmpl.set("availableEvents", EventControllerManager.getInstance().getAvailableDeviceConfigs());
+ tmpl.set("availableEventConfigClasses", EventControllerManager.getInstance().getAvailableDeviceConfigs());
+ tmpl.set("availableEventObjectConfig", eventConfigurations);
return tmpl;
}
diff --git a/hal-core/src/se/hal/page/SensorConfigWebPage.java b/hal-core/src/se/hal/page/SensorConfigWebPage.java
index bd74e6e0..f1bd12fd 100644
--- a/hal-core/src/se/hal/page/SensorConfigWebPage.java
+++ b/hal-core/src/se/hal/page/SensorConfigWebPage.java
@@ -174,11 +174,11 @@ public class SensorConfigWebPage extends HalWebPage {
Templator tmpl = new Templator(FileUtil.find(TEMPLATE));
tmpl.set("user", localUser);
tmpl.set("localSensors", Sensor.getLocalSensors(db));
- tmpl.set("localSensorConf", sensorConfigurations);
tmpl.set("detectedSensors", SensorControllerManager.getInstance().getDetectedDevices());
tmpl.set("extUsers", User.getExternalUsers(db));
tmpl.set("extSensor", Sensor.getExternalSensors(db));
- tmpl.set("availableSensors", SensorControllerManager.getInstance().getAvailableDeviceConfigs());
+ tmpl.set("availableSensorConfigClasses", SensorControllerManager.getInstance().getAvailableDeviceConfigs());
+ tmpl.set("availableSensorObjectConfig", sensorConfigurations);
return tmpl;
diff --git a/hal-core/src/se/hal/page/SensorOverviewWebPage.java b/hal-core/src/se/hal/page/SensorOverviewWebPage.java
index 8881afc9..f1e2a35f 100644
--- a/hal-core/src/se/hal/page/SensorOverviewWebPage.java
+++ b/hal-core/src/se/hal/page/SensorOverviewWebPage.java
@@ -38,7 +38,6 @@ public class SensorOverviewWebPage extends HalWebPage {
DBConnection db = HalContext.getDB();
int id = (ObjectUtil.isEmpty(request.get("id")) ? -1 : Integer.parseInt(request.get("id")));
- // Save new input
if (id >= 0) {
Sensor sensor = Sensor.getSensor(db, id);
diff --git a/hal-core/test/se/hal/EventControllerManagerTest.java b/hal-core/test/se/hal/EventControllerManagerTest.java
index ee667a76..ff485590 100644
--- a/hal-core/test/se/hal/EventControllerManagerTest.java
+++ b/hal-core/test/se/hal/EventControllerManagerTest.java
@@ -20,17 +20,17 @@ public class EventControllerManagerTest {
public void addAvailableEventDevice(){
assertEquals(0, manager.getAvailableDeviceConfigs().size());
- manager.addAvailableDevice(TestEvent1.class);
+ manager.addAvailableDeviceConfig(TestEvent1.class);
assertEquals(1, manager.getAvailableDeviceConfigs().size());
assertTrue(manager.getAvailableDeviceConfigs().contains(TestEvent1.class));
- manager.addAvailableDevice(TestEvent2.class);
+ manager.addAvailableDeviceConfig(TestEvent2.class);
assertEquals(2, manager.getAvailableDeviceConfigs().size());
assertTrue(manager.getAvailableDeviceConfigs().contains(TestEvent1.class));
assertTrue(manager.getAvailableDeviceConfigs().contains(TestEvent2.class));
// Add duplicate Event
- manager.addAvailableDevice(TestEvent1.class);
+ manager.addAvailableDeviceConfig(TestEvent1.class);
assertEquals("No duplicate check",2, manager.getAvailableDeviceConfigs().size());
}
@@ -76,7 +76,7 @@ public class EventControllerManagerTest {
private Event registerEvent(HalEventConfig config){
Event Event = new Event();
Event.setDeviceConfig(config);
- manager.addAvailableDevice(config.getClass());
+ manager.addAvailableDeviceConfig(config.getClass());
manager.register(Event);
return Event;
}
diff --git a/hal-core/test/se/hal/SensorControllerManagerTest.java b/hal-core/test/se/hal/SensorControllerManagerTest.java
index 5a4c2298..f9d67a26 100644
--- a/hal-core/test/se/hal/SensorControllerManagerTest.java
+++ b/hal-core/test/se/hal/SensorControllerManagerTest.java
@@ -20,17 +20,17 @@ public class SensorControllerManagerTest {
public void addAvailableDevice(){
assertEquals(Collections.EMPTY_LIST, manager.getAvailableDeviceConfigs());
- manager.addAvailableDevice(TestSensor1.class);
+ manager.addAvailableDeviceConfig(TestSensor1.class);
assertEquals(1, manager.getAvailableDeviceConfigs().size());
assertTrue(manager.getAvailableDeviceConfigs().contains(TestSensor1.class));
- manager.addAvailableDevice(TestSensor2.class);
+ manager.addAvailableDeviceConfig(TestSensor2.class);
assertEquals(2, manager.getAvailableDeviceConfigs().size());
assertTrue(manager.getAvailableDeviceConfigs().contains(TestSensor1.class));
assertTrue(manager.getAvailableDeviceConfigs().contains(TestSensor2.class));
// Add duplicate sensor
- manager.addAvailableDevice(TestSensor1.class);
+ manager.addAvailableDeviceConfig(TestSensor1.class);
assertEquals("No duplicate check",2, manager.getAvailableDeviceConfigs().size());
}
@@ -77,7 +77,7 @@ public class SensorControllerManagerTest {
private Sensor registerSensor(HalSensorConfig config){
Sensor sensor = new Sensor();
sensor.setDeviceConfig(config);
- manager.addAvailableDevice(config.getClass());
+ manager.addAvailableDeviceConfig(config.getClass());
manager.register(sensor);
return sensor;
}
diff --git a/plugins/hal-nvr/src/se/hal/plugin/nvr/CameraControllerManager.java b/plugins/hal-nvr/src/se/hal/plugin/nvr/CameraControllerManager.java
index cfaf9238..7aac62d2 100644
--- a/plugins/hal-nvr/src/se/hal/plugin/nvr/CameraControllerManager.java
+++ b/plugins/hal-nvr/src/se/hal/plugin/nvr/CameraControllerManager.java
@@ -43,7 +43,7 @@ public class CameraControllerManager extends HalAbstractControllerManager clusters = new HashSet<>();
+ clusters.add(ZclIasZoneCluster.CLUSTER_ID);
+
+ transportOptions.addOption(TransportConfigOption.SUPPORTED_OUTPUT_CLUSTERS, clusters);
transportOptions.addOption(TransportConfigOption.RADIO_TX_POWER, 3);
+
return new ZigBeeDongleTiCc2531(serialPort);
case ZIGBEE_DONGLE_CONBEE:
return new ZigBeeDongleConBee(serialPort);
@@ -127,12 +167,57 @@ public class HalZigbeeController implements HalSensorController, HalEventControl
@Override
public void close() {
- logger.info("Shutting down Zigbee port.");
+ logger.info("Shutting down Zigbee network.");
networkManager.shutdown();
serialPort.close();
}
+ // --------------------------
+ // Zigbee Methods
+ // --------------------------
+
+ @Override
+ public void deviceStatusUpdate(ZigBeeNodeStatus deviceStatus, Integer networkAddress, IeeeAddress ieeeAddress) {
+ System.out.println(deviceStatus.name() + " status updated.");
+ }
+
+ @Override
+ public void announceUnknownDevice(Integer networkAddress) {
+ System.out.println("Unknown device: " + networkAddress);
+ }
+
+ @Override
+ public void nodeAdded(final ZigBeeNode node) {
+ System.out.println("nodeAdded: " + node);
+
+ // If this is the coordinator (NWK address 0), ignore this device
+ if (node.getLogicalType() == NodeDescriptor.LogicalType.COORDINATOR || node.getNetworkAddress() == 0) {
+ System.out.println(node.getIeeeAddress() + ": is a coordinator, skipping.");
+ return;
+ }
+
+ if (!node.isDiscovered()) {
+ System.out.println(node.getIeeeAddress() + ": Node discovery not complete");
+ return;
+ }
+
+ // Perform the device properties discovery.
+
+ System.out.println(node.getIeeeAddress() + ": " +
+ "Manufacturer=" + node.getNodeDescriptor().getManufacturerCode());
+ }
+
+ @Override
+ public void nodeUpdated(final ZigBeeNode node) {
+ System.out.println("nodeUpdated: " + node);
+ }
+
+ @Override
+ public void nodeRemoved(final ZigBeeNode node) {
+ System.out.println("nodeRemoved: " + node);
+ }
+
// --------------------------
// Hal Overrides
// --------------------------