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">
|
||||
<label class="control-label">Type:</label>
|
||||
<select class="form-control" name="type">
|
||||
{{#availableEvents}}
|
||||
{{#availableEventConfigClasses}}
|
||||
<option>{{.getName()}}</option>
|
||||
{{/availableEvents}}
|
||||
{{/availableEventConfigClasses}}
|
||||
</select>
|
||||
</div>
|
||||
|
||||
|
|
@ -142,7 +142,7 @@
|
|||
</div>
|
||||
</div>
|
||||
<div id="event-data-conf-template" class="hidden">
|
||||
{{#localEventConf}}
|
||||
{{#availableEventObjectConfig}}
|
||||
<div id="{{.clazz.getName()}}">
|
||||
{{#.params}}
|
||||
<div class="form-group">
|
||||
|
|
@ -158,6 +158,6 @@
|
|||
</div>
|
||||
{{/.params}}
|
||||
</div>
|
||||
{{/localEventConf}}
|
||||
{{/availableEventObjectConfig}}
|
||||
</div>
|
||||
|
||||
|
|
|
|||
|
|
@ -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 type='hidden' name='"+input.attr("name")+"' value='false' />");
|
||||
input.parent().prepend("<input type='hidden' name='" + input.attr("name") + "' value='false' />");
|
||||
} else {
|
||||
input.val(value);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -224,9 +224,9 @@
|
|||
<div class="form-group">
|
||||
<label class="control-label">Type:</label>
|
||||
<select class="form-control" name="type">
|
||||
{{#availableSensors}}
|
||||
{{#availableSensorConfigClasses}}
|
||||
<option>{{.getName()}}</option>
|
||||
{{/availableSensors}}
|
||||
{{/availableSensorConfigClasses}}
|
||||
</select>
|
||||
</div>
|
||||
<div class="checkbox">
|
||||
|
|
@ -251,7 +251,7 @@
|
|||
</div>
|
||||
</div>
|
||||
<div id="sensor-data-conf-template" class="hidden">
|
||||
{{#localSensorConf}}
|
||||
{{#availableSensorObjectConfig}}
|
||||
<div id="{{.clazz.getName()}}">
|
||||
{{#.params}}
|
||||
<div class="form-group">
|
||||
|
|
@ -267,7 +267,7 @@
|
|||
</div>
|
||||
{{/.params}}
|
||||
</div>
|
||||
{{/localSensorConf}}
|
||||
{{/availableSensorObjectConfig}}
|
||||
</div>
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -109,7 +109,7 @@ public class EventControllerManager extends HalAbstractControllerManager<HalEven
|
|||
* Registers a Event class type as usable by the manager
|
||||
*/
|
||||
@Override
|
||||
public void addAvailableDevice(Class<? extends HalEventConfig> eventClass) {
|
||||
public void addAvailableDeviceConfig(Class<? extends HalEventConfig> eventClass) {
|
||||
if (!availableEvents.contains(eventClass))
|
||||
availableEvents.add(eventClass);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -111,7 +111,7 @@ public class SensorControllerManager extends HalAbstractControllerManager<HalAbs
|
|||
* Registers a Sensor class type as usable by the manager
|
||||
*/
|
||||
@Override
|
||||
public void addAvailableDevice(Class<? extends HalSensorConfig> sensorConfigClass) {
|
||||
public void addAvailableDeviceConfig(Class<? extends HalSensorConfig> sensorConfigClass) {
|
||||
if (!availableSensors.contains(sensorConfigClass))
|
||||
availableSensors.add(sensorConfigClass);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -31,7 +31,7 @@ public abstract class HalAbstractControllerManager<T extends HalAbstractControll
|
|||
|
||||
if (genericClasses.length >= 1 && genericClasses[0] != null) {
|
||||
for (Iterator<Class<C>> 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<T extends HalAbstractControll
|
|||
/**
|
||||
* 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
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
|
|
@ -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<ClassConfigurationData> eventConfigurations;
|
||||
private ArrayList<ClassConfigurationData> 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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -43,7 +43,7 @@ public class CameraControllerManager extends HalAbstractControllerManager<HalCam
|
|||
}
|
||||
|
||||
@Override
|
||||
public void addAvailableDevice(Class deviceConfigClass) {
|
||||
public void addAvailableDeviceConfig(Class deviceConfigClass) {
|
||||
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1,6 +1,5 @@
|
|||
dependencies {
|
||||
def ZIGBEE_LIB_VERSION = "1.3.10"
|
||||
//def ZIGBEE_LIB_VERSION = "1.3.11-SNAPSHOT"
|
||||
def ZIGBEE_LIB_VERSION = "1.3.11"
|
||||
|
||||
implementation project(':hal-core')
|
||||
|
||||
|
|
|
|||
|
|
@ -1,11 +1,10 @@
|
|||
package se.hal.plugin.zigbee;
|
||||
|
||||
|
||||
import com.zsmartsystems.zigbee.ZigBeeNetworkManager;
|
||||
import com.zsmartsystems.zigbee.ZigBeeProfileType;
|
||||
import com.zsmartsystems.zigbee.ZigBeeStatus;
|
||||
import com.zsmartsystems.zigbee.*;
|
||||
import com.zsmartsystems.zigbee.app.basic.ZigBeeBasicServerExtension;
|
||||
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.dongle.cc2531.ZigBeeDongleTiCc2531;
|
||||
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.DefaultSerializer;
|
||||
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.intf.*;
|
||||
import se.hal.intf.HalAbstractDevice;
|
||||
import zutil.log.LogUtil;
|
||||
|
||||
import java.util.List;
|
||||
import java.nio.channels.Channel;
|
||||
import java.util.*;
|
||||
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();
|
||||
|
||||
public static final String ZIGBEE_DONGLE_CC2531 = "CC2531";
|
||||
|
|
@ -45,6 +55,9 @@ public class HalZigbeeController implements HalSensorController, HalEventControl
|
|||
|
||||
public HalZigbeeController() {}
|
||||
|
||||
// --------------------------
|
||||
// Lifecycle Methods
|
||||
// --------------------------
|
||||
|
||||
@Override
|
||||
public boolean isAvailable() {
|
||||
|
|
@ -56,7 +69,7 @@ public class HalZigbeeController implements HalSensorController, HalEventControl
|
|||
initialize(HalContext.getStringProperty(CONFIG_ZIGBEE_PORT), HalContext.getStringProperty(CONFIG_ZIGBEE_DONGLE));
|
||||
}
|
||||
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();
|
||||
TransportConfig transportOptions = new TransportConfig();
|
||||
|
||||
|
|
@ -68,6 +81,8 @@ public class HalZigbeeController implements HalSensorController, HalEventControl
|
|||
networkManager = new ZigBeeNetworkManager(dongle);
|
||||
networkManager.setNetworkDataStore(dataStore);
|
||||
networkManager.setSerializer(DefaultSerializer.class, DefaultDeserializer.class);
|
||||
networkManager.addAnnounceListener(this);
|
||||
networkManager.addNetworkNodeListener(this);
|
||||
|
||||
// Initialize Network
|
||||
|
||||
|
|
@ -80,40 +95,65 @@ public class HalZigbeeController implements HalSensorController, HalEventControl
|
|||
// ------------------------
|
||||
|
||||
networkManager.setDefaultProfileId(ZigBeeProfileType.ZIGBEE_HOME_AUTOMATION.getKey());
|
||||
|
||||
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
|
||||
networkManager.setZigBeeLinkKey(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 }));
|
||||
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);
|
||||
|
||||
// Register extensions
|
||||
|
||||
networkManager.addExtension(new ZigBeeOtaUpgradeExtension());
|
||||
networkManager.addExtension(new ZigBeeBasicServerExtension());
|
||||
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
|
||||
|
||||
logger.info("Starting up ZigBee Network...");
|
||||
ZigBeeStatus startResponse = networkManager.startup(false);
|
||||
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) {
|
||||
switch (name) {
|
||||
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);
|
||||
|
||||
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
|
||||
// --------------------------
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue