diff --git a/hal-core/resource/resource/web/css/hal.css b/hal-core/resource/resource/web/css/hal.css index b34f6adb..297886f4 100644 --- a/hal-core/resource/resource/web/css/hal.css +++ b/hal-core/resource/resource/web/css/hal.css @@ -132,4 +132,17 @@ body { } .c3-line { stroke-width: 2px; -} \ No newline at end of file +} + + +.anim-spin { + animation: spin 2s infinite linear; +} +@keyframes spin { + 0% { + transform: rotate(0deg); + } + 100% { + transform: rotate(359deg); + } +} diff --git a/hal-core/resource/resource/web/plugin_config.tmpl b/hal-core/resource/resource/web/plugin_config.tmpl index 0548dfbe..7defb185 100644 --- a/hal-core/resource/resource/web/plugin_config.tmpl +++ b/hal-core/resource/resource/web/plugin_config.tmpl @@ -50,15 +50,24 @@ {{.getClass().getName()}} + {{#.isScannable()}}
+ {{#.isScanning()}} + + {{/.isScanning()}} + {{^.isScanning()}} + {{/.isScanning()}}
+ {{/.isScannable()}}
diff --git a/hal-core/src/se/hal/EventControllerManager.java b/hal-core/src/se/hal/EventControllerManager.java index 8a2fb8a0..8cc33abf 100644 --- a/hal-core/src/se/hal/EventControllerManager.java +++ b/hal-core/src/se/hal/EventControllerManager.java @@ -92,7 +92,7 @@ public class EventControllerManager extends HalAbstractControllerManager c = event.getController(); - HalEventController controller = controllerMap.get(c); + HalEventController controller = (HalEventController) controllerMap.get(c); if (controller != null) { logger.info("Deregistering event(id: " + event.getId() + "): " + event.getDeviceConfig().getClass()); controller.deregister(event.getDeviceConfig()); @@ -175,14 +175,6 @@ public class EventControllerManager extends HalAbstractControllerManager getControllers() { - return controllerMap.values(); - } - public static EventControllerManager getInstance(){ return instance; diff --git a/hal-core/src/se/hal/intf/HalAbstractControllerManager.java b/hal-core/src/se/hal/intf/HalAbstractControllerManager.java index 75f292cf..072de6f7 100644 --- a/hal-core/src/se/hal/intf/HalAbstractControllerManager.java +++ b/hal-core/src/se/hal/intf/HalAbstractControllerManager.java @@ -4,8 +4,8 @@ import zutil.ClassUtil; import zutil.log.LogUtil; import zutil.plugin.PluginManager; -import java.lang.reflect.InvocationTargetException; import java.util.*; +import java.util.concurrent.ConcurrentHashMap; import java.util.logging.Level; import java.util.logging.Logger; @@ -19,7 +19,7 @@ public abstract class HalAbstractControllerManager controllerMap = new HashMap<>(); + protected static Map controllerMap = new ConcurrentHashMap<>(); /** All available sensor plugins **/ protected List> availableDeviceConfigs = new ArrayList<>(); @@ -44,7 +44,7 @@ public abstract class HalAbstractControllerManager controllerClass = (Class) deviceConfig.getDeclaredConstructor().newInstance().getDeviceControllerClass(); - if (controllerClass.isAssignableFrom(HalAutoScannableController.class)) { + if (controllerClass.isAssignableFrom(HalAutostartController.class)) { getControllerInstance(controllerClass); // Instantiate controller } } catch (Exception e) { @@ -111,14 +111,14 @@ public abstract class HalAbstractControllerManager getControllers() { - return controllerMap.values(); + public static List getControllers() { + return new ArrayList<>(controllerMap.values()); } /** * Will return a singleton controller instance of the given class. * If a instance does not exist yet the a new instance will be allocated - * depending on if the controller is ready thorough the {@link HalAutoScannableController#isAvailable()} method. + * depending on if the controller is ready thorough the {@link HalAutostartController#isAvailable()} method. * * @param clazz is the class of the wanted object instance wanted * @return A singleton instance of the input clazz or null if the class is unavailable or not ready to be instantiated. @@ -127,14 +127,14 @@ public abstract class HalAbstractControllerManager eventConfigurations = new ArrayList<>(); + private ArrayList eventConfigurations = new ArrayList<>(); public EventConfigWebPage() { @@ -32,7 +32,7 @@ public class EventConfigWebPage extends HalWebPage { super.getRootNav().createSubNav("Settings").createSubNav(this.getId(), "Event Settings").setWeight(200); for (Class c : EventControllerManager.getInstance().getAvailableDeviceConfigs()) - eventConfigurations.add(new ClassConfigurationData(c)); + eventConfigurations.add(new ClassConfigurationFacade(c)); } @Override diff --git a/hal-core/src/se/hal/page/PluginConfigWebPage.java b/hal-core/src/se/hal/page/PluginConfigWebPage.java index 325a4719..e405cd6b 100644 --- a/hal-core/src/se/hal/page/PluginConfigWebPage.java +++ b/hal-core/src/se/hal/page/PluginConfigWebPage.java @@ -4,6 +4,7 @@ import se.hal.HalContext; import se.hal.HalServer; import se.hal.intf.HalAbstractController; import se.hal.intf.HalAbstractControllerManager; +import se.hal.intf.HalScannableController; import se.hal.intf.HalWebPage; import zutil.ObjectUtil; import zutil.io.file.FileUtil; @@ -52,25 +53,36 @@ public class PluginConfigWebPage extends HalWebPage { case "controller_scan": String controllerName = request.get("controller"); + + HalAbstractController controller = null; + for (HalAbstractController c : HalAbstractControllerManager.getControllers()) { + if (c.getClass().getName().equals(controllerName)) { + controller = c; + break; + } + } + + if (controller != null) { + if (controller instanceof HalScannableController) { + ((HalScannableController) controller).startScan(); + + HalAlertManager.getInstance().addAlert(new UserMessage( + MessageLevel.SUCCESS, "Initiated scanning on controller: " + controllerName, MessageTTL.ONE_VIEW)); + } else { + HalAlertManager.getInstance().addAlert(new UserMessage( + MessageLevel.ERROR, "Controller " + controllerName + " does not support scanning.", MessageTTL.ONE_VIEW)); + } + } else { + HalAlertManager.getInstance().addAlert(new UserMessage( + MessageLevel.ERROR, "Unable to find controller: " + controllerName, MessageTTL.ONE_VIEW)); + } break; } } - List controllers = new LinkedList<>(); - for (HalAbstractControllerManager manager : HalServer.getControllerManagers()) { - Collection managerControllers = manager.getControllers(); - - if (!ObjectUtil.isEmpty(managerControllers)) { - for (HalAbstractController controller : managerControllers) { - if (!controllers.contains(controller)) - controllers.add(controller); - } - } - } - Templator tmpl = new Templator(FileUtil.find(TEMPLATE)); tmpl.set("plugins", HalServer.getAllPlugins()); - tmpl.set("controllers", controllers); + tmpl.set("controllers", HalAbstractControllerManager.getControllers()); return tmpl; } } diff --git a/hal-core/src/se/hal/page/SensorConfigWebPage.java b/hal-core/src/se/hal/page/SensorConfigWebPage.java index f1bd12fd..16573f22 100644 --- a/hal-core/src/se/hal/page/SensorConfigWebPage.java +++ b/hal-core/src/se/hal/page/SensorConfigWebPage.java @@ -3,7 +3,7 @@ package se.hal.page; import se.hal.HalContext; import se.hal.SensorControllerManager; import se.hal.intf.HalWebPage; -import se.hal.struct.ClassConfigurationData; +import se.hal.util.ClassConfigurationFacade; import se.hal.struct.Sensor; import se.hal.struct.User; import zutil.ObjectUtil; @@ -23,7 +23,7 @@ public class SensorConfigWebPage extends HalWebPage { private static final Logger logger = LogUtil.getLogger(); private static final String TEMPLATE = HalContext.RESOURCE_WEB_ROOT + "/sensor_config.tmpl"; - private ArrayList sensorConfigurations; + private ArrayList sensorConfigurations; public SensorConfigWebPage() { @@ -32,7 +32,7 @@ public class SensorConfigWebPage extends HalWebPage { sensorConfigurations = new ArrayList<>(); for (Class c : SensorControllerManager.getInstance().getAvailableDeviceConfigs()) - sensorConfigurations.add(new ClassConfigurationData(c)); + sensorConfigurations.add(new ClassConfigurationFacade(c)); } @Override diff --git a/hal-core/src/se/hal/page/TriggerWebPage.java b/hal-core/src/se/hal/page/TriggerWebPage.java index 92961c2a..51fcf77e 100644 --- a/hal-core/src/se/hal/page/TriggerWebPage.java +++ b/hal-core/src/se/hal/page/TriggerWebPage.java @@ -4,7 +4,7 @@ import se.hal.HalContext; import se.hal.TriggerManager; import se.hal.intf.HalWebPage; import se.hal.struct.Action; -import se.hal.struct.ClassConfigurationData; +import se.hal.util.ClassConfigurationFacade; import se.hal.struct.Trigger; import se.hal.struct.TriggerFlow; import zutil.ObjectUtil; @@ -23,8 +23,8 @@ public class TriggerWebPage extends HalWebPage { private static final Logger logger = LogUtil.getLogger(); private static final String TEMPLATE = HalContext.RESOURCE_WEB_ROOT + "/trigger.tmpl"; - private ArrayList triggerConfigurators; - private ArrayList actionConfigurators; + private ArrayList triggerConfigurators; + private ArrayList actionConfigurators; public TriggerWebPage() { @@ -33,10 +33,10 @@ public class TriggerWebPage extends HalWebPage { triggerConfigurators = new ArrayList<>(); for (Class c : TriggerManager.getInstance().getAvailableTriggers()) - triggerConfigurators.add(new ClassConfigurationData(c)); + triggerConfigurators.add(new ClassConfigurationFacade(c)); actionConfigurators = new ArrayList<>(); for (Class c : TriggerManager.getInstance().getAvailableActions()) - actionConfigurators.add(new ClassConfigurationData(c)); + actionConfigurators.add(new ClassConfigurationFacade(c)); } @Override diff --git a/hal-core/src/se/hal/struct/ClassConfigurationData.java b/hal-core/src/se/hal/util/ClassConfigurationFacade.java similarity index 74% rename from hal-core/src/se/hal/struct/ClassConfigurationData.java rename to hal-core/src/se/hal/util/ClassConfigurationFacade.java index 1d794d6a..0a26ca88 100644 --- a/hal-core/src/se/hal/struct/ClassConfigurationData.java +++ b/hal-core/src/se/hal/util/ClassConfigurationFacade.java @@ -1,4 +1,4 @@ -package se.hal.struct; +package se.hal.util; import zutil.ui.conf.Configurator; import zutil.ui.conf.Configurator.ConfigurationParam; @@ -6,12 +6,12 @@ import zutil.ui.conf.Configurator.ConfigurationParam; /** * A Data class used by the dynamic class configuration pages */ -public class ClassConfigurationData { +public class ClassConfigurationFacade { public Class clazz; public ConfigurationParam[] params; - public ClassConfigurationData(Class clazz) { + public ClassConfigurationFacade(Class clazz) { this.clazz = clazz; this.params = Configurator.getConfiguration(clazz); } diff --git a/plugins/hal-mqtt/src/se/hal/plugin/mqtt/HalMqttController.java b/plugins/hal-mqtt/src/se/hal/plugin/mqtt/HalMqttController.java index d7d53ea4..0dc64195 100644 --- a/plugins/hal-mqtt/src/se/hal/plugin/mqtt/HalMqttController.java +++ b/plugins/hal-mqtt/src/se/hal/plugin/mqtt/HalMqttController.java @@ -39,7 +39,7 @@ import java.util.HashMap; import java.util.logging.Level; import java.util.logging.Logger; -public class HalMqttController implements HalAutoScannableController, MqttSubscriptionListener, HalEventController { +public class HalMqttController implements HalAutostartController, MqttSubscriptionListener, HalEventController { private final Logger logger = LogUtil.getLogger(); private MulticastDnsServer mDns; diff --git a/plugins/hal-mqtt/src/se/hal/plugin/mqtt/plugin.json b/plugins/hal-mqtt/src/se/hal/plugin/mqtt/plugin.json index c3af9969..4757ef30 100644 --- a/plugins/hal-mqtt/src/se/hal/plugin/mqtt/plugin.json +++ b/plugins/hal-mqtt/src/se/hal/plugin/mqtt/plugin.json @@ -2,6 +2,6 @@ "version": 0.1, "name": "Hal-MQTT", "interfaces": [ - {"se.hal.intf.HalAutoScannableController": "se.hal.plugin.mqtt.HalMqttController"} + {"se.hal.intf.HalAutostartController": "se.hal.plugin.mqtt.HalMqttController"} ] } \ No newline at end of file diff --git a/plugins/hal-netscan/src/se/hal/plugin/netscan/NetScanController.java b/plugins/hal-netscan/src/se/hal/plugin/netscan/NetScanController.java index 3fcd128c..63df7fc4 100644 --- a/plugins/hal-netscan/src/se/hal/plugin/netscan/NetScanController.java +++ b/plugins/hal-netscan/src/se/hal/plugin/netscan/NetScanController.java @@ -19,7 +19,7 @@ import java.util.concurrent.TimeUnit; import java.util.logging.Level; import java.util.logging.Logger; -public class NetScanController implements HalEventController, HalAutoScannableController, InetScanListener, Runnable { +public class NetScanController implements HalEventController, HalAutostartController, InetScanListener, Runnable { public static Logger logger = LogUtil.getLogger(); private static final int NETWORK_SYNC_INTERVAL = 3 * 60 * 60 * 1000; // 3 hours private static final int PING_INTERVAL = 10 * 1000; // 10 sec diff --git a/plugins/hal-netscan/src/se/hal/plugin/netscan/plugin.json b/plugins/hal-netscan/src/se/hal/plugin/netscan/plugin.json index d20867a4..7b08f8f2 100644 --- a/plugins/hal-netscan/src/se/hal/plugin/netscan/plugin.json +++ b/plugins/hal-netscan/src/se/hal/plugin/netscan/plugin.json @@ -2,7 +2,7 @@ "version": 1.0, "name": "Hal-Network Scanner", "interfaces": [ - {"se.hal.intf.HalAutoScannableController": "se.hal.plugin.netscan.NetScanController"}, + {"se.hal.intf.HalAutostartController": "se.hal.plugin.netscan.NetScanController"}, {"se.hal.intf.HalEventConfig": "se.hal.plugin.netscan.NetworkDevice"} ] } \ No newline at end of file diff --git a/plugins/hal-nutups/src/se/hal/plugin/nutups/NutUpsController.java b/plugins/hal-nutups/src/se/hal/plugin/nutups/NutUpsController.java index cd1ea141..d9d89f81 100644 --- a/plugins/hal-nutups/src/se/hal/plugin/nutups/NutUpsController.java +++ b/plugins/hal-nutups/src/se/hal/plugin/nutups/NutUpsController.java @@ -49,7 +49,7 @@ package se.hal.plugin.nutups; import se.hal.HalContext; -import se.hal.intf.HalAutoScannableController; +import se.hal.intf.HalAutostartController; import se.hal.intf.HalDeviceConfig; import se.hal.intf.HalDeviceReportListener; import se.hal.intf.HalSensorController; @@ -64,7 +64,7 @@ import java.util.logging.Level; import java.util.logging.Logger; -public class NutUpsController implements HalSensorController, HalAutoScannableController, Runnable { +public class NutUpsController implements HalSensorController, HalAutostartController, Runnable { public static Logger logger = LogUtil.getLogger(); private static final int SYNC_INTERVAL = 60 * 1000; diff --git a/plugins/hal-nutups/src/se/hal/plugin/nutups/plugin.json b/plugins/hal-nutups/src/se/hal/plugin/nutups/plugin.json index 67bfb4f2..6109204b 100644 --- a/plugins/hal-nutups/src/se/hal/plugin/nutups/plugin.json +++ b/plugins/hal-nutups/src/se/hal/plugin/nutups/plugin.json @@ -2,7 +2,7 @@ "version": 1.0, "name": "Hal-NUT UPS", "interfaces": [ - {"se.hal.intf.HalAutoScannableController": "se.hal.plugin.nutups.NutUpsController"}, + {"se.hal.intf.HalAutostartController": "se.hal.plugin.nutups.NutUpsController"}, {"se.hal.intf.HalSensorConfig": "se.hal.plugin.nutups.NutUpsDevice"} ] } \ No newline at end of file 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 3fce339c..e067f608 100644 --- a/plugins/hal-nvr/src/se/hal/plugin/nvr/CameraControllerManager.java +++ b/plugins/hal-nvr/src/se/hal/plugin/nvr/CameraControllerManager.java @@ -47,11 +47,6 @@ public class CameraControllerManager extends HalAbstractControllerManager getControllers() { - return null; - } - public void initialize(PluginManager pluginManager){ super.initialize(pluginManager); diff --git a/plugins/hal-nvr/src/se/hal/plugin/nvr/page/CameraConfigWebPage.java b/plugins/hal-nvr/src/se/hal/plugin/nvr/page/CameraConfigWebPage.java index 03abfbfd..87d9ecb1 100644 --- a/plugins/hal-nvr/src/se/hal/plugin/nvr/page/CameraConfigWebPage.java +++ b/plugins/hal-nvr/src/se/hal/plugin/nvr/page/CameraConfigWebPage.java @@ -29,7 +29,7 @@ import se.hal.intf.HalWebPage; import se.hal.page.HalAlertManager; import se.hal.plugin.nvr.CameraControllerManager; import se.hal.plugin.nvr.struct.Camera; -import se.hal.struct.ClassConfigurationData; +import se.hal.util.ClassConfigurationFacade; import se.hal.struct.User; import zutil.ObjectUtil; import zutil.db.DBConnection; @@ -47,7 +47,7 @@ public class CameraConfigWebPage extends HalWebPage { private static final Logger logger = LogUtil.getLogger(); private static final String TEMPLATE = HalContext.RESOURCE_WEB_ROOT + "/camera_config.tmpl"; - private ArrayList cameraConfigurations; + private ArrayList cameraConfigurations; public CameraConfigWebPage() { @@ -56,7 +56,7 @@ public class CameraConfigWebPage extends HalWebPage { cameraConfigurations = new ArrayList<>(); for (Class c : CameraControllerManager.getInstance().getAvailableDeviceConfigs()) - cameraConfigurations.add(new ClassConfigurationData(c)); + cameraConfigurations.add(new ClassConfigurationFacade(c)); } @Override diff --git a/plugins/hal-tellstick/src/se/hal/plugin/tellstick/TellstickSerialComm.java b/plugins/hal-tellstick/src/se/hal/plugin/tellstick/TellstickSerialComm.java index ac7178cc..d7377386 100644 --- a/plugins/hal-tellstick/src/se/hal/plugin/tellstick/TellstickSerialComm.java +++ b/plugins/hal-tellstick/src/se/hal/plugin/tellstick/TellstickSerialComm.java @@ -46,7 +46,7 @@ import java.util.logging.Logger; * communication and reporting to Hal */ public class TellstickSerialComm implements Runnable, - HalSensorController, HalEventController, HalAutoScannableController { + HalSensorController, HalEventController, HalAutostartController { private static final Logger logger = LogUtil.getLogger(); private static String CONFIG_TELLSTICK_COM_PORT = "tellstick.com_port"; diff --git a/plugins/hal-tellstick/src/se/hal/plugin/tellstick/plugin.json b/plugins/hal-tellstick/src/se/hal/plugin/tellstick/plugin.json index 6032aef4..f6962c5d 100644 --- a/plugins/hal-tellstick/src/se/hal/plugin/tellstick/plugin.json +++ b/plugins/hal-tellstick/src/se/hal/plugin/tellstick/plugin.json @@ -2,7 +2,7 @@ "version": 1.0, "name": "Hal-Tellstick", "interfaces": [ - {"se.hal.intf.HalAutoScannableController": "se.hal.plugin.tellstick.TellstickSerialComm"}, + {"se.hal.intf.HalAutostartController": "se.hal.plugin.tellstick.TellstickSerialComm"}, {"se.hal.intf.HalSensorConfig": "se.hal.plugin.tellstick.device.Oregon0x1A2D"}, {"se.hal.intf.HalEventConfig": "se.hal.plugin.tellstick.device.NexaSelfLearning"} diff --git a/plugins/hal-zigbee-deconz/src/se/hal/plugin/zigbee/deconz/zigbee/DeConzZigbeeController.java b/plugins/hal-zigbee-deconz/src/se/hal/plugin/zigbee/deconz/zigbee/DeConzZigbeeController.java index f84e0f5f..3647d33f 100644 --- a/plugins/hal-zigbee-deconz/src/se/hal/plugin/zigbee/deconz/zigbee/DeConzZigbeeController.java +++ b/plugins/hal-zigbee-deconz/src/se/hal/plugin/zigbee/deconz/zigbee/DeConzZigbeeController.java @@ -36,7 +36,7 @@ import java.util.logging.Logger; *

* Rest documentatiuon for deConz: https://dresden-elektronik.github.io/deconz-rest-doc/ */ -public class DeConzZigbeeController implements HalSensorController, HalEventController, HalAutoScannableController { +public class DeConzZigbeeController implements HalSensorController, HalEventController, HalAutostartController { private static final Logger logger = LogUtil.getLogger(); public static final String CONFIG_ZIGBEE_REST_URL = "zigbee.rest_url"; diff --git a/plugins/hal-zigbee-deconz/src/se/hal/plugin/zigbee/deconz/zigbee/plugin.json_disabled b/plugins/hal-zigbee-deconz/src/se/hal/plugin/zigbee/deconz/zigbee/plugin.json_disabled index 045c34ad..25af9c1c 100644 --- a/plugins/hal-zigbee-deconz/src/se/hal/plugin/zigbee/deconz/zigbee/plugin.json_disabled +++ b/plugins/hal-zigbee-deconz/src/se/hal/plugin/zigbee/deconz/zigbee/plugin.json_disabled @@ -3,6 +3,6 @@ "name": "Hal-Zigbee-DeConz", "description": "A Zigbee plugin interfacing with a DeConz service.", "interfaces": [ - {"se.hal.intf.HalAutoScannableController": "se.hal.plugin.zigbee.deconz.zigbee.HalDeconzZigbeeController"} + {"se.hal.intf.HalAutostartController": "se.hal.plugin.zigbee.deconz.zigbee.HalDeconzZigbeeController"} ] } \ No newline at end of file diff --git a/plugins/hal-zigbee/src/se/hal/plugin/zigbee/HalZigbeeController.java b/plugins/hal-zigbee/src/se/hal/plugin/zigbee/HalZigbeeController.java index 11e1fa42..6437f55e 100644 --- a/plugins/hal-zigbee/src/se/hal/plugin/zigbee/HalZigbeeController.java +++ b/plugins/hal-zigbee/src/se/hal/plugin/zigbee/HalZigbeeController.java @@ -31,7 +31,7 @@ import java.util.logging.Logger; */ public class HalZigbeeController implements HalSensorController, HalEventController, - HalAutoScannableController, + HalAutostartController, ZigBeeAnnounceListener, ZigBeeNetworkNodeListener, HalScannableController { diff --git a/plugins/hal-zigbee/src/se/hal/plugin/zigbee/plugin.json b/plugins/hal-zigbee/src/se/hal/plugin/zigbee/plugin.json index 235f2d0f..aca8ed61 100644 --- a/plugins/hal-zigbee/src/se/hal/plugin/zigbee/plugin.json +++ b/plugins/hal-zigbee/src/se/hal/plugin/zigbee/plugin.json @@ -3,6 +3,6 @@ "name": "Hal-Zigbee", "description": "A Zigbee plugin for directly connecting to a CC2531 device over serial port.", "interfaces": [ - {"se.hal.intf.HalAutoScannableController": "se.hal.plugin.zigbee.HalZigbeeController"} + {"se.hal.intf.HalAutostartController": "se.hal.plugin.zigbee.HalZigbeeController"} ] } \ No newline at end of file diff --git a/plugins/hal-zwave/src/se/hal/plugin/zwave/HalZWaveController.java b/plugins/hal-zwave/src/se/hal/plugin/zwave/HalZWaveController.java index 63a9a529..aff33944 100644 --- a/plugins/hal-zwave/src/se/hal/plugin/zwave/HalZWaveController.java +++ b/plugins/hal-zwave/src/se/hal/plugin/zwave/HalZWaveController.java @@ -15,7 +15,7 @@ import java.util.logging.Logger; * * @author Ziver Koc */ -public class HalZWaveController implements HalSensorController, HalEventController, HalAutoScannableController, NotificationWatcher { +public class HalZWaveController implements HalSensorController, HalEventController, HalAutostartController, NotificationWatcher { private static final Logger logger = LogUtil.getLogger(); public static final String CONFIG_ZWAVE_PORT = "zwave.com_port";