Some small refactoring
This commit is contained in:
parent
edaa23f0f6
commit
5716584772
15 changed files with 161 additions and 68 deletions
|
|
@ -122,9 +122,9 @@
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label class="control-label">Type:</label>
|
<label class="control-label">Type:</label>
|
||||||
<select class="form-control" name="type">
|
<select class="form-control" name="type">
|
||||||
{{#availableEvents}}
|
{{#availableEventConfigClasses}}
|
||||||
<option>{{.getName()}}</option>
|
<option>{{.getName()}}</option>
|
||||||
{{/availableEvents}}
|
{{/availableEventConfigClasses}}
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
@ -142,7 +142,7 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div id="event-data-conf-template" class="hidden">
|
<div id="event-data-conf-template" class="hidden">
|
||||||
{{#localEventConf}}
|
{{#availableEventObjectConfig}}
|
||||||
<div id="{{.clazz.getName()}}">
|
<div id="{{.clazz.getName()}}">
|
||||||
{{#.params}}
|
{{#.params}}
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
|
|
@ -158,6 +158,6 @@
|
||||||
</div>
|
</div>
|
||||||
{{/.params}}
|
{{/.params}}
|
||||||
</div>
|
</div>
|
||||||
{{/localEventConf}}
|
{{/availableEventObjectConfig}}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,11 +1,16 @@
|
||||||
///////////////////////////////// Autostart
|
// --------------------------------------------------------
|
||||||
|
// Autostart
|
||||||
|
// --------------------------------------------------------
|
||||||
|
|
||||||
$(function(){
|
$(function(){
|
||||||
$(".toggle-switch").bootstrapSwitch();
|
$(".toggle-switch").bootstrapSwitch();
|
||||||
|
|
||||||
$(".timestamp").relTimestamp();
|
$(".timestamp").relTimestamp();
|
||||||
});
|
});
|
||||||
|
|
||||||
////////////////////////////////////// JQuery helper functions
|
// --------------------------------------------------------
|
||||||
|
// JQuery helper functions
|
||||||
|
// --------------------------------------------------------
|
||||||
|
|
||||||
// $.attr() # returns all attributes of an element
|
// $.attr() # returns all attributes of an element
|
||||||
(function(old) {
|
(function(old) {
|
||||||
|
|
@ -28,7 +33,11 @@ $(function(){
|
||||||
};
|
};
|
||||||
})($.fn.attr);
|
})($.fn.attr);
|
||||||
|
|
||||||
// converts all timestamps to human readable time and date
|
// --------------------------------------------------------
|
||||||
|
// Timestamps
|
||||||
|
// --------------------------------------------------------
|
||||||
|
|
||||||
|
// Converts all timestamps to human readable time and date
|
||||||
$.fn.relTimestamp = function() {
|
$.fn.relTimestamp = function() {
|
||||||
return this.each(function() {
|
return this.each(function() {
|
||||||
var timestamp = parseInt($(this).text());
|
var timestamp = parseInt($(this).text());
|
||||||
|
|
@ -45,10 +54,10 @@ $.fn.relTimestamp = function() {
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// --------------------------------------------------------
|
||||||
|
// Chart functions
|
||||||
|
// --------------------------------------------------------
|
||||||
|
|
||||||
////////////////////////////////////// Hal functions
|
|
||||||
|
|
||||||
////////////// Chart functions
|
|
||||||
function createChart(elementId, url, updateTime=-1){
|
function createChart(elementId, url, updateTime=-1){
|
||||||
var tickConf = {count: 20};
|
var tickConf = {count: 20};
|
||||||
if (updateTime < 60*60*1000)
|
if (updateTime < 60*60*1000)
|
||||||
|
|
@ -127,30 +136,33 @@ function getChartData(json){
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
////////////// Dynamic forms
|
// --------------------------------------------------------
|
||||||
|
// Dynamic forms
|
||||||
|
// --------------------------------------------------------
|
||||||
|
|
||||||
var dynamicConf = {};
|
var dynamicConf = {};
|
||||||
|
|
||||||
function initDynamicModalForm(modalId, formTemplateId = null, templateID = null){
|
function initDynamicModalForm(modalId, formTemplateId = null, templateID = null){
|
||||||
// read in all configurations into global variable (to skip naming issues)
|
// read in all configurations into global variable (to skip naming issues)
|
||||||
if (formTemplateId != null) {
|
if (formTemplateId != null) {
|
||||||
dynamicConf[formTemplateId] = [];
|
dynamicConf[formTemplateId] = [];
|
||||||
$("#"+templateID+" div").each(function(){
|
$("#" + templateID + " div").each(function(){
|
||||||
dynamicConf[formTemplateId][$(this).attr("id")] = $(this).html();
|
dynamicConf[formTemplateId][$(this).attr("id")] = $(this).html();
|
||||||
});
|
});
|
||||||
// Update dynamic inputs
|
// Update dynamic inputs
|
||||||
$("#"+modalId+" select[name=type]").change(function(){
|
$("#" + modalId + " select[name=type]").change(function(){
|
||||||
$("#"+modalId+" #"+formTemplateId).html(dynamicConf[formTemplateId][$(this).val()]);
|
$("#" + modalId + " #" + formTemplateId).html(dynamicConf[formTemplateId][$(this).val()]);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
// click event
|
// click event
|
||||||
$("#"+modalId).on('show.bs.modal', function (event) {
|
$("#" + modalId).on('show.bs.modal', function (event) {
|
||||||
var button = $(event.relatedTarget);
|
var button = $(event.relatedTarget);
|
||||||
var modal = $(this);
|
var modal = $(this);
|
||||||
|
|
||||||
// Reset all inputs
|
// Reset all inputs
|
||||||
if (formTemplateId != null)
|
if (formTemplateId != null)
|
||||||
modal.find("#"+formTemplateId).empty(); // clear form div
|
modal.find("#" + formTemplateId).empty(); // clear form div
|
||||||
|
|
||||||
// select dynamic form
|
// select dynamic form
|
||||||
var selector = modal.find("select[name=type]");
|
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");
|
if (value=="true") input.attr("checked", "true");
|
||||||
else input.removeAttr("checked");
|
else input.removeAttr("checked");
|
||||||
// Add default false value as a unchecked checkbox is not included in the post
|
// Add default false value as a unchecked checkbox is not included in the post
|
||||||
input.parent().prepend("<input type='hidden' name='"+input.attr("name")+"' value='false' />");
|
input.parent().prepend("<input type='hidden' name='" + input.attr("name") + "' value='false' />");
|
||||||
} else {
|
} else {
|
||||||
input.val(value);
|
input.val(value);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -224,9 +224,9 @@
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label class="control-label">Type:</label>
|
<label class="control-label">Type:</label>
|
||||||
<select class="form-control" name="type">
|
<select class="form-control" name="type">
|
||||||
{{#availableSensors}}
|
{{#availableSensorConfigClasses}}
|
||||||
<option>{{.getName()}}</option>
|
<option>{{.getName()}}</option>
|
||||||
{{/availableSensors}}
|
{{/availableSensorConfigClasses}}
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
<div class="checkbox">
|
<div class="checkbox">
|
||||||
|
|
@ -251,7 +251,7 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div id="sensor-data-conf-template" class="hidden">
|
<div id="sensor-data-conf-template" class="hidden">
|
||||||
{{#localSensorConf}}
|
{{#availableSensorObjectConfig}}
|
||||||
<div id="{{.clazz.getName()}}">
|
<div id="{{.clazz.getName()}}">
|
||||||
{{#.params}}
|
{{#.params}}
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
|
|
@ -267,7 +267,7 @@
|
||||||
</div>
|
</div>
|
||||||
{{/.params}}
|
{{/.params}}
|
||||||
</div>
|
</div>
|
||||||
{{/localSensorConf}}
|
{{/availableSensorObjectConfig}}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -109,7 +109,7 @@ public class EventControllerManager extends HalAbstractControllerManager<HalEven
|
||||||
* Registers a Event class type as usable by the manager
|
* Registers a Event class type as usable by the manager
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public void addAvailableDevice(Class<? extends HalEventConfig> eventClass) {
|
public void addAvailableDeviceConfig(Class<? extends HalEventConfig> eventClass) {
|
||||||
if (!availableEvents.contains(eventClass))
|
if (!availableEvents.contains(eventClass))
|
||||||
availableEvents.add(eventClass);
|
availableEvents.add(eventClass);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -111,7 +111,7 @@ public class SensorControllerManager extends HalAbstractControllerManager<HalAbs
|
||||||
* Registers a Sensor class type as usable by the manager
|
* Registers a Sensor class type as usable by the manager
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public void addAvailableDevice(Class<? extends HalSensorConfig> sensorConfigClass) {
|
public void addAvailableDeviceConfig(Class<? extends HalSensorConfig> sensorConfigClass) {
|
||||||
if (!availableSensors.contains(sensorConfigClass))
|
if (!availableSensors.contains(sensorConfigClass))
|
||||||
availableSensors.add(sensorConfigClass);
|
availableSensors.add(sensorConfigClass);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -31,7 +31,7 @@ public abstract class HalAbstractControllerManager<T extends HalAbstractControll
|
||||||
|
|
||||||
if (genericClasses.length >= 1 && genericClasses[0] != null) {
|
if (genericClasses.length >= 1 && genericClasses[0] != null) {
|
||||||
for (Iterator<Class<C>> it = pluginManager.getClassIterator(genericClasses[0]); it.hasNext(); ) {
|
for (Iterator<Class<C>> it = pluginManager.getClassIterator(genericClasses[0]); it.hasNext(); ) {
|
||||||
addAvailableDevice(it.next());
|
addAvailableDeviceConfig(it.next());
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
logger.severe("Unable to retrieve Controller class from generics.");
|
logger.severe("Unable to retrieve Controller class from generics.");
|
||||||
|
|
@ -63,7 +63,7 @@ public abstract class HalAbstractControllerManager<T extends HalAbstractControll
|
||||||
/**
|
/**
|
||||||
* Registers a device configuration class type as usable by the manager
|
* Registers a device configuration class type as usable by the manager
|
||||||
*/
|
*/
|
||||||
public abstract void addAvailableDevice(Class<? extends C> deviceConfigClass);
|
public abstract void addAvailableDeviceConfig(Class<? extends C> deviceConfigClass);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return a List of all available devices that can be registered with this manager
|
* @return a List of all available devices that can be registered with this manager
|
||||||
|
|
|
||||||
|
|
@ -3,14 +3,14 @@ package se.hal.intf;
|
||||||
import java.util.concurrent.ScheduledExecutorService;
|
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 {
|
public interface HalDaemon extends Runnable {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Setup the execution of the daemon with the provided executor.
|
* 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);
|
void initiate(ScheduledExecutorService executor);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -22,14 +22,13 @@ public class EventConfigWebPage extends HalWebPage {
|
||||||
private static final Logger logger = LogUtil.getLogger();
|
private static final Logger logger = LogUtil.getLogger();
|
||||||
private static final String TEMPLATE = HalContext.RESOURCE_WEB_ROOT + "/event_config.tmpl";
|
private static final String TEMPLATE = HalContext.RESOURCE_WEB_ROOT + "/event_config.tmpl";
|
||||||
|
|
||||||
private ArrayList<ClassConfigurationData> eventConfigurations;
|
private ArrayList<ClassConfigurationData> eventConfigurations = new ArrayList<>();
|
||||||
|
|
||||||
|
|
||||||
public EventConfigWebPage() {
|
public EventConfigWebPage() {
|
||||||
super("event_config");
|
super("event_config");
|
||||||
super.getRootNav().createSubNav("Settings").createSubNav(this.getId(), "Event Settings").setWeight(200);
|
super.getRootNav().createSubNav("Settings").createSubNav(this.getId(), "Event Settings").setWeight(200);
|
||||||
|
|
||||||
eventConfigurations = new ArrayList<>();
|
|
||||||
for (Class c : EventControllerManager.getInstance().getAvailableDeviceConfigs())
|
for (Class c : EventControllerManager.getInstance().getAvailableDeviceConfigs())
|
||||||
eventConfigurations.add(new ClassConfigurationData(c));
|
eventConfigurations.add(new ClassConfigurationData(c));
|
||||||
}
|
}
|
||||||
|
|
@ -50,7 +49,6 @@ public class EventConfigWebPage extends HalWebPage {
|
||||||
Event event;
|
Event event;
|
||||||
|
|
||||||
switch(request.get("action")) {
|
switch(request.get("action")) {
|
||||||
// Local events
|
|
||||||
case "create_local_event":
|
case "create_local_event":
|
||||||
logger.info("Creating new event: " + request.get("name"));
|
logger.info("Creating new event: " + request.get("name"));
|
||||||
event = new Event();
|
event = new Event();
|
||||||
|
|
@ -110,9 +108,9 @@ public class EventConfigWebPage extends HalWebPage {
|
||||||
Templator tmpl = new Templator(FileUtil.find(TEMPLATE));
|
Templator tmpl = new Templator(FileUtil.find(TEMPLATE));
|
||||||
tmpl.set("user", localUser);
|
tmpl.set("user", localUser);
|
||||||
tmpl.set("localEvents", Event.getLocalEvents(db));
|
tmpl.set("localEvents", Event.getLocalEvents(db));
|
||||||
tmpl.set("localEventConf", eventConfigurations);
|
|
||||||
tmpl.set("detectedEvents", EventControllerManager.getInstance().getDetectedDevices());
|
tmpl.set("detectedEvents", EventControllerManager.getInstance().getDetectedDevices());
|
||||||
tmpl.set("availableEvents", EventControllerManager.getInstance().getAvailableDeviceConfigs());
|
tmpl.set("availableEventConfigClasses", EventControllerManager.getInstance().getAvailableDeviceConfigs());
|
||||||
|
tmpl.set("availableEventObjectConfig", eventConfigurations);
|
||||||
|
|
||||||
return tmpl;
|
return tmpl;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -174,11 +174,11 @@ public class SensorConfigWebPage extends HalWebPage {
|
||||||
Templator tmpl = new Templator(FileUtil.find(TEMPLATE));
|
Templator tmpl = new Templator(FileUtil.find(TEMPLATE));
|
||||||
tmpl.set("user", localUser);
|
tmpl.set("user", localUser);
|
||||||
tmpl.set("localSensors", Sensor.getLocalSensors(db));
|
tmpl.set("localSensors", Sensor.getLocalSensors(db));
|
||||||
tmpl.set("localSensorConf", sensorConfigurations);
|
|
||||||
tmpl.set("detectedSensors", SensorControllerManager.getInstance().getDetectedDevices());
|
tmpl.set("detectedSensors", SensorControllerManager.getInstance().getDetectedDevices());
|
||||||
tmpl.set("extUsers", User.getExternalUsers(db));
|
tmpl.set("extUsers", User.getExternalUsers(db));
|
||||||
tmpl.set("extSensor", Sensor.getExternalSensors(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;
|
return tmpl;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -38,7 +38,6 @@ public class SensorOverviewWebPage extends HalWebPage {
|
||||||
DBConnection db = HalContext.getDB();
|
DBConnection db = HalContext.getDB();
|
||||||
int id = (ObjectUtil.isEmpty(request.get("id")) ? -1 : Integer.parseInt(request.get("id")));
|
int id = (ObjectUtil.isEmpty(request.get("id")) ? -1 : Integer.parseInt(request.get("id")));
|
||||||
|
|
||||||
// Save new input
|
|
||||||
if (id >= 0) {
|
if (id >= 0) {
|
||||||
Sensor sensor = Sensor.getSensor(db, id);
|
Sensor sensor = Sensor.getSensor(db, id);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -20,17 +20,17 @@ public class EventControllerManagerTest {
|
||||||
public void addAvailableEventDevice(){
|
public void addAvailableEventDevice(){
|
||||||
assertEquals(0, manager.getAvailableDeviceConfigs().size());
|
assertEquals(0, manager.getAvailableDeviceConfigs().size());
|
||||||
|
|
||||||
manager.addAvailableDevice(TestEvent1.class);
|
manager.addAvailableDeviceConfig(TestEvent1.class);
|
||||||
assertEquals(1, manager.getAvailableDeviceConfigs().size());
|
assertEquals(1, manager.getAvailableDeviceConfigs().size());
|
||||||
assertTrue(manager.getAvailableDeviceConfigs().contains(TestEvent1.class));
|
assertTrue(manager.getAvailableDeviceConfigs().contains(TestEvent1.class));
|
||||||
|
|
||||||
manager.addAvailableDevice(TestEvent2.class);
|
manager.addAvailableDeviceConfig(TestEvent2.class);
|
||||||
assertEquals(2, manager.getAvailableDeviceConfigs().size());
|
assertEquals(2, manager.getAvailableDeviceConfigs().size());
|
||||||
assertTrue(manager.getAvailableDeviceConfigs().contains(TestEvent1.class));
|
assertTrue(manager.getAvailableDeviceConfigs().contains(TestEvent1.class));
|
||||||
assertTrue(manager.getAvailableDeviceConfigs().contains(TestEvent2.class));
|
assertTrue(manager.getAvailableDeviceConfigs().contains(TestEvent2.class));
|
||||||
|
|
||||||
// Add duplicate Event
|
// Add duplicate Event
|
||||||
manager.addAvailableDevice(TestEvent1.class);
|
manager.addAvailableDeviceConfig(TestEvent1.class);
|
||||||
assertEquals("No duplicate check",2, manager.getAvailableDeviceConfigs().size());
|
assertEquals("No duplicate check",2, manager.getAvailableDeviceConfigs().size());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -76,7 +76,7 @@ public class EventControllerManagerTest {
|
||||||
private Event registerEvent(HalEventConfig config){
|
private Event registerEvent(HalEventConfig config){
|
||||||
Event Event = new Event();
|
Event Event = new Event();
|
||||||
Event.setDeviceConfig(config);
|
Event.setDeviceConfig(config);
|
||||||
manager.addAvailableDevice(config.getClass());
|
manager.addAvailableDeviceConfig(config.getClass());
|
||||||
manager.register(Event);
|
manager.register(Event);
|
||||||
return Event;
|
return Event;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -20,17 +20,17 @@ public class SensorControllerManagerTest {
|
||||||
public void addAvailableDevice(){
|
public void addAvailableDevice(){
|
||||||
assertEquals(Collections.EMPTY_LIST, manager.getAvailableDeviceConfigs());
|
assertEquals(Collections.EMPTY_LIST, manager.getAvailableDeviceConfigs());
|
||||||
|
|
||||||
manager.addAvailableDevice(TestSensor1.class);
|
manager.addAvailableDeviceConfig(TestSensor1.class);
|
||||||
assertEquals(1, manager.getAvailableDeviceConfigs().size());
|
assertEquals(1, manager.getAvailableDeviceConfigs().size());
|
||||||
assertTrue(manager.getAvailableDeviceConfigs().contains(TestSensor1.class));
|
assertTrue(manager.getAvailableDeviceConfigs().contains(TestSensor1.class));
|
||||||
|
|
||||||
manager.addAvailableDevice(TestSensor2.class);
|
manager.addAvailableDeviceConfig(TestSensor2.class);
|
||||||
assertEquals(2, manager.getAvailableDeviceConfigs().size());
|
assertEquals(2, manager.getAvailableDeviceConfigs().size());
|
||||||
assertTrue(manager.getAvailableDeviceConfigs().contains(TestSensor1.class));
|
assertTrue(manager.getAvailableDeviceConfigs().contains(TestSensor1.class));
|
||||||
assertTrue(manager.getAvailableDeviceConfigs().contains(TestSensor2.class));
|
assertTrue(manager.getAvailableDeviceConfigs().contains(TestSensor2.class));
|
||||||
|
|
||||||
// Add duplicate sensor
|
// Add duplicate sensor
|
||||||
manager.addAvailableDevice(TestSensor1.class);
|
manager.addAvailableDeviceConfig(TestSensor1.class);
|
||||||
assertEquals("No duplicate check",2, manager.getAvailableDeviceConfigs().size());
|
assertEquals("No duplicate check",2, manager.getAvailableDeviceConfigs().size());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -77,7 +77,7 @@ public class SensorControllerManagerTest {
|
||||||
private Sensor registerSensor(HalSensorConfig config){
|
private Sensor registerSensor(HalSensorConfig config){
|
||||||
Sensor sensor = new Sensor();
|
Sensor sensor = new Sensor();
|
||||||
sensor.setDeviceConfig(config);
|
sensor.setDeviceConfig(config);
|
||||||
manager.addAvailableDevice(config.getClass());
|
manager.addAvailableDeviceConfig(config.getClass());
|
||||||
manager.register(sensor);
|
manager.register(sensor);
|
||||||
return sensor;
|
return sensor;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -43,7 +43,7 @@ public class CameraControllerManager extends HalAbstractControllerManager<HalCam
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void addAvailableDevice(Class deviceConfigClass) {
|
public void addAvailableDeviceConfig(Class deviceConfigClass) {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,5 @@
|
||||||
dependencies {
|
dependencies {
|
||||||
def ZIGBEE_LIB_VERSION = "1.3.10"
|
def ZIGBEE_LIB_VERSION = "1.3.11"
|
||||||
//def ZIGBEE_LIB_VERSION = "1.3.11-SNAPSHOT"
|
|
||||||
|
|
||||||
implementation project(':hal-core')
|
implementation project(':hal-core')
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,11 +1,10 @@
|
||||||
package se.hal.plugin.zigbee;
|
package se.hal.plugin.zigbee;
|
||||||
|
|
||||||
|
|
||||||
import com.zsmartsystems.zigbee.ZigBeeNetworkManager;
|
import com.zsmartsystems.zigbee.*;
|
||||||
import com.zsmartsystems.zigbee.ZigBeeProfileType;
|
|
||||||
import com.zsmartsystems.zigbee.ZigBeeStatus;
|
|
||||||
import com.zsmartsystems.zigbee.app.basic.ZigBeeBasicServerExtension;
|
import com.zsmartsystems.zigbee.app.basic.ZigBeeBasicServerExtension;
|
||||||
import com.zsmartsystems.zigbee.app.discovery.ZigBeeDiscoveryExtension;
|
import com.zsmartsystems.zigbee.app.discovery.ZigBeeDiscoveryExtension;
|
||||||
|
import com.zsmartsystems.zigbee.app.iasclient.ZigBeeIasCieExtension;
|
||||||
import com.zsmartsystems.zigbee.app.otaserver.ZigBeeOtaUpgradeExtension;
|
import com.zsmartsystems.zigbee.app.otaserver.ZigBeeOtaUpgradeExtension;
|
||||||
import com.zsmartsystems.zigbee.dongle.cc2531.ZigBeeDongleTiCc2531;
|
import com.zsmartsystems.zigbee.dongle.cc2531.ZigBeeDongleTiCc2531;
|
||||||
import com.zsmartsystems.zigbee.dongle.conbee.ZigBeeDongleConBee;
|
import com.zsmartsystems.zigbee.dongle.conbee.ZigBeeDongleConBee;
|
||||||
|
|
@ -14,18 +13,29 @@ import com.zsmartsystems.zigbee.security.ZigBeeKey;
|
||||||
import com.zsmartsystems.zigbee.serialization.DefaultDeserializer;
|
import com.zsmartsystems.zigbee.serialization.DefaultDeserializer;
|
||||||
import com.zsmartsystems.zigbee.serialization.DefaultSerializer;
|
import com.zsmartsystems.zigbee.serialization.DefaultSerializer;
|
||||||
import com.zsmartsystems.zigbee.transport.*;
|
import com.zsmartsystems.zigbee.transport.*;
|
||||||
|
import com.zsmartsystems.zigbee.zcl.clusters.*;
|
||||||
|
import com.zsmartsystems.zigbee.zdo.command.NetworkAddressRequest;
|
||||||
|
import com.zsmartsystems.zigbee.zdo.field.NodeDescriptor;
|
||||||
import se.hal.HalContext;
|
import se.hal.HalContext;
|
||||||
import se.hal.intf.*;
|
import se.hal.intf.*;
|
||||||
import se.hal.intf.HalAbstractDevice;
|
import se.hal.intf.HalAbstractDevice;
|
||||||
import zutil.log.LogUtil;
|
import zutil.log.LogUtil;
|
||||||
|
|
||||||
import java.util.List;
|
import java.nio.channels.Channel;
|
||||||
|
import java.util.*;
|
||||||
import java.util.logging.Logger;
|
import java.util.logging.Logger;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
import java.util.stream.Stream;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
public class HalZigbeeController implements HalSensorController, HalEventController, HalAutoScannableController {
|
public class HalZigbeeController implements HalSensorController,
|
||||||
|
HalEventController,
|
||||||
|
HalAutoScannableController,
|
||||||
|
ZigBeeAnnounceListener,
|
||||||
|
ZigBeeNetworkNodeListener {
|
||||||
|
|
||||||
private static final Logger logger = LogUtil.getLogger();
|
private static final Logger logger = LogUtil.getLogger();
|
||||||
|
|
||||||
public static final String ZIGBEE_DONGLE_CC2531 = "CC2531";
|
public static final String ZIGBEE_DONGLE_CC2531 = "CC2531";
|
||||||
|
|
@ -45,6 +55,9 @@ public class HalZigbeeController implements HalSensorController, HalEventControl
|
||||||
|
|
||||||
public HalZigbeeController() {}
|
public HalZigbeeController() {}
|
||||||
|
|
||||||
|
// --------------------------
|
||||||
|
// Lifecycle Methods
|
||||||
|
// --------------------------
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean isAvailable() {
|
public boolean isAvailable() {
|
||||||
|
|
@ -56,7 +69,7 @@ public class HalZigbeeController implements HalSensorController, HalEventControl
|
||||||
initialize(HalContext.getStringProperty(CONFIG_ZIGBEE_PORT), HalContext.getStringProperty(CONFIG_ZIGBEE_DONGLE));
|
initialize(HalContext.getStringProperty(CONFIG_ZIGBEE_PORT), HalContext.getStringProperty(CONFIG_ZIGBEE_DONGLE));
|
||||||
}
|
}
|
||||||
public void initialize(String comPort, String dongleName) {
|
public void initialize(String comPort, String dongleName) {
|
||||||
serialPort = new ZigBeeJSerialCommPort(comPort);
|
serialPort = new ZigBeeJSerialCommPort(comPort, ZigBeeJSerialCommPort.DEFAULT_BAUD_RATE, ZigBeePort.FlowControl.FLOWCONTROL_OUT_RTSCTS);
|
||||||
dataStore = new ZigBeeDataStore();
|
dataStore = new ZigBeeDataStore();
|
||||||
TransportConfig transportOptions = new TransportConfig();
|
TransportConfig transportOptions = new TransportConfig();
|
||||||
|
|
||||||
|
|
@ -68,6 +81,8 @@ public class HalZigbeeController implements HalSensorController, HalEventControl
|
||||||
networkManager = new ZigBeeNetworkManager(dongle);
|
networkManager = new ZigBeeNetworkManager(dongle);
|
||||||
networkManager.setNetworkDataStore(dataStore);
|
networkManager.setNetworkDataStore(dataStore);
|
||||||
networkManager.setSerializer(DefaultSerializer.class, DefaultDeserializer.class);
|
networkManager.setSerializer(DefaultSerializer.class, DefaultDeserializer.class);
|
||||||
|
networkManager.addAnnounceListener(this);
|
||||||
|
networkManager.addNetworkNodeListener(this);
|
||||||
|
|
||||||
// Initialize Network
|
// Initialize Network
|
||||||
|
|
||||||
|
|
@ -80,40 +95,65 @@ public class HalZigbeeController implements HalSensorController, HalEventControl
|
||||||
// ------------------------
|
// ------------------------
|
||||||
|
|
||||||
networkManager.setDefaultProfileId(ZigBeeProfileType.ZIGBEE_HOME_AUTOMATION.getKey());
|
networkManager.setDefaultProfileId(ZigBeeProfileType.ZIGBEE_HOME_AUTOMATION.getKey());
|
||||||
|
networkManager.setZigBeeLinkKey(new ZigBeeKey(new int[] { // Add the default ZigBeeAlliance09 HA link key
|
||||||
transportOptions.addOption(TransportConfigOption.RADIO_TX_POWER, 3);
|
|
||||||
transportOptions.addOption(TransportConfigOption.TRUST_CENTRE_JOIN_MODE, TrustCentreJoinMode.TC_JOIN_SECURE);
|
|
||||||
transportOptions.addOption(TransportConfigOption.TRUST_CENTRE_LINK_KEY, new ZigBeeKey(new int[] { // Add the default ZigBeeAlliance09 HA link key
|
|
||||||
0x5A, 0x69, 0x67, 0x42, 0x65, 0x65, 0x41, 0x6C, 0x6C, 0x69, 0x61, 0x6E, 0x63, 0x65, 0x30, 0x39 }));
|
0x5A, 0x69, 0x67, 0x42, 0x65, 0x65, 0x41, 0x6C, 0x6C, 0x69, 0x61, 0x6E, 0x63, 0x65, 0x30, 0x39 }));
|
||||||
|
networkManager.setZigBeeNetworkKey(new ZigBeeKey("552FAAF9B5F49E75F1ADDA12215C2CA1")); // ZigBeeKey.createRandom();
|
||||||
|
networkManager.setZigBeeChannel(ZigBeeChannel.create(11));
|
||||||
|
networkManager.setZigBeePanId(65534); // (int) Math.floor((Math.random() * 65534));
|
||||||
|
networkManager.setZigBeeExtendedPanId(new ExtendedPanId("00124B001CCE1B5F")); // ExtendedPanId.createRandom();
|
||||||
|
|
||||||
|
//transportOptions.addOption(TransportConfigOption.TRUST_CENTRE_JOIN_MODE, TrustCentreJoinMode.TC_JOIN_INSECURE); // TC_JOIN_SECURE
|
||||||
dongle.updateTransportConfig(transportOptions);
|
dongle.updateTransportConfig(transportOptions);
|
||||||
|
|
||||||
// Register extensions
|
// Register extensions
|
||||||
|
|
||||||
networkManager.addExtension(new ZigBeeOtaUpgradeExtension());
|
networkManager.addExtension(new ZigBeeOtaUpgradeExtension());
|
||||||
networkManager.addExtension(new ZigBeeBasicServerExtension());
|
|
||||||
networkManager.addExtension(new ZigBeeDiscoveryExtension());
|
networkManager.addExtension(new ZigBeeDiscoveryExtension());
|
||||||
|
networkManager.addExtension(new ZigBeeIasCieExtension());
|
||||||
|
|
||||||
|
networkManager.addSupportedClientCluster(ZclBasicCluster.CLUSTER_ID);
|
||||||
|
networkManager.addSupportedClientCluster(ZclIdentifyCluster.CLUSTER_ID);
|
||||||
|
networkManager.addSupportedClientCluster(ZclGroupsCluster.CLUSTER_ID);
|
||||||
|
networkManager.addSupportedClientCluster(ZclScenesCluster.CLUSTER_ID);
|
||||||
|
networkManager.addSupportedClientCluster(ZclPollControlCluster.CLUSTER_ID);
|
||||||
|
networkManager.addSupportedClientCluster(ZclOnOffCluster.CLUSTER_ID);
|
||||||
|
networkManager.addSupportedClientCluster(ZclLevelControlCluster.CLUSTER_ID);
|
||||||
|
networkManager.addSupportedClientCluster(ZclColorControlCluster.CLUSTER_ID);
|
||||||
|
networkManager.addSupportedClientCluster(ZclPressureMeasurementCluster.CLUSTER_ID);
|
||||||
|
networkManager.addSupportedClientCluster(ZclTemperatureMeasurementCluster.CLUSTER_ID);
|
||||||
|
networkManager.addSupportedClientCluster(ZclThermostatCluster.CLUSTER_ID);
|
||||||
|
networkManager.addSupportedClientCluster(ZclRelativeHumidityMeasurementCluster.CLUSTER_ID);
|
||||||
|
networkManager.addSupportedClientCluster(ZclWindowCoveringCluster.CLUSTER_ID);
|
||||||
|
networkManager.addSupportedClientCluster(ZclBinaryInputBasicCluster.CLUSTER_ID);
|
||||||
|
|
||||||
|
networkManager.addSupportedServerCluster(ZclBasicCluster.CLUSTER_ID);
|
||||||
|
networkManager.addSupportedServerCluster(ZclIdentifyCluster.CLUSTER_ID);
|
||||||
|
networkManager.addSupportedServerCluster(ZclGroupsCluster.CLUSTER_ID);
|
||||||
|
networkManager.addSupportedServerCluster(ZclScenesCluster.CLUSTER_ID);
|
||||||
|
networkManager.addSupportedServerCluster(ZclPollControlCluster.CLUSTER_ID);
|
||||||
|
networkManager.addSupportedServerCluster(ZclOnOffCluster.CLUSTER_ID);
|
||||||
|
networkManager.addSupportedServerCluster(ZclLevelControlCluster.CLUSTER_ID);
|
||||||
|
networkManager.addSupportedServerCluster(ZclColorControlCluster.CLUSTER_ID);
|
||||||
|
networkManager.addSupportedServerCluster(ZclPressureMeasurementCluster.CLUSTER_ID);
|
||||||
|
networkManager.addSupportedServerCluster(ZclWindowCoveringCluster.CLUSTER_ID);
|
||||||
|
networkManager.addSupportedServerCluster(ZclBinaryInputBasicCluster.CLUSTER_ID);
|
||||||
|
|
||||||
// Startup Network
|
// Startup Network
|
||||||
|
|
||||||
logger.info("Starting up ZigBee Network...");
|
logger.info("Starting up ZigBee Network...");
|
||||||
ZigBeeStatus startResponse = networkManager.startup(false);
|
ZigBeeStatus startResponse = networkManager.startup(false);
|
||||||
logger.info("ZigBee Network startup finished with: " + startResponse);
|
logger.info("ZigBee Network startup finished with: " + startResponse);
|
||||||
|
|
||||||
// -----------
|
|
||||||
// Other stuff
|
|
||||||
// -----------
|
|
||||||
|
|
||||||
/*if (dongle instanceof ZigBeeDongleTiCc2531) {
|
|
||||||
ZigBeeDongleTiCc2531 tiDongle = (ZigBeeDongleTiCc2531) dongle;
|
|
||||||
tiDongle.setLedMode(1, false);
|
|
||||||
tiDongle.setLedMode(2, false);
|
|
||||||
}*/
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static ZigBeeTransportTransmit getDongle(String name, ZigBeePort serialPort, TransportConfig transportOptions) {
|
private static ZigBeeTransportTransmit getDongle(String name, ZigBeePort serialPort, TransportConfig transportOptions) {
|
||||||
switch (name) {
|
switch (name) {
|
||||||
case ZIGBEE_DONGLE_CC2531:
|
case ZIGBEE_DONGLE_CC2531:
|
||||||
|
HashSet<Integer> clusters = new HashSet<>();
|
||||||
|
clusters.add(ZclIasZoneCluster.CLUSTER_ID);
|
||||||
|
|
||||||
|
transportOptions.addOption(TransportConfigOption.SUPPORTED_OUTPUT_CLUSTERS, clusters);
|
||||||
transportOptions.addOption(TransportConfigOption.RADIO_TX_POWER, 3);
|
transportOptions.addOption(TransportConfigOption.RADIO_TX_POWER, 3);
|
||||||
|
|
||||||
return new ZigBeeDongleTiCc2531(serialPort);
|
return new ZigBeeDongleTiCc2531(serialPort);
|
||||||
case ZIGBEE_DONGLE_CONBEE:
|
case ZIGBEE_DONGLE_CONBEE:
|
||||||
return new ZigBeeDongleConBee(serialPort);
|
return new ZigBeeDongleConBee(serialPort);
|
||||||
|
|
@ -127,12 +167,57 @@ public class HalZigbeeController implements HalSensorController, HalEventControl
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void close() {
|
public void close() {
|
||||||
logger.info("Shutting down Zigbee port.");
|
logger.info("Shutting down Zigbee network.");
|
||||||
|
|
||||||
networkManager.shutdown();
|
networkManager.shutdown();
|
||||||
serialPort.close();
|
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
|
// Hal Overrides
|
||||||
// --------------------------
|
// --------------------------
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue