Changed device listener to be a list instead of single listener

This commit is contained in:
Ziver Koc 2021-06-25 22:26:02 +02:00
parent 8d9896f8b4
commit 53d471c0aa
24 changed files with 120 additions and 97 deletions

View file

@ -59,9 +59,9 @@ public interface HalAbstractController {
int size();
/**
* Set a listener that will receive all reports from the the registered devices.
* Add a listener to the controller that will receive all device reports from registered devices.
*/
void setListener(HalDeviceReportListener listener);
void addListener(HalDeviceReportListener listener);
/**
* Close any resources associated with this controller.

View file

@ -19,7 +19,7 @@ public abstract class HalAbstractControllerManager<T extends HalAbstractControll
private static final Logger logger = LogUtil.getLogger();
/** A map of all instantiated controllers **/
protected static Map<Class, HalAbstractController> controllerMap;
protected static Map<Class, HalAbstractController> controllerMap = new ConcurrentHashMap<>();;
/** All available sensor plugins **/
protected List<Class<? extends C>> availableDeviceConfigs = new ArrayList<>();
@ -43,8 +43,6 @@ public abstract class HalAbstractControllerManager<T extends HalAbstractControll
synchronized (this) {
if (controllerMap == null) {
controllerMap = new ConcurrentHashMap<>();
for (Iterator<Class<? extends HalAutostartController>> it = pluginManager.getClassIterator(HalAutostartController.class); it.hasNext(); ) {
Class controller = it.next();
getControllerInstance(controller); // Instantiate controller
@ -152,7 +150,7 @@ public abstract class HalAbstractControllerManager<T extends HalAbstractControll
// Assign the manager as a listener
if (this instanceof HalDeviceReportListener)
controller.setListener((HalDeviceReportListener) this);
controller.addListener((HalDeviceReportListener) this);
return controller;
}

View file

@ -144,7 +144,7 @@ public class EventControllerManagerTest {
}
@Override
public void setListener(HalDeviceReportListener listener) { }
public void addListener(HalDeviceReportListener listener) { }
@Override
public void close() { }

View file

@ -160,7 +160,7 @@ public class SensorControllerManagerTest {
}
@Override
public void setListener(HalDeviceReportListener listener) { }
public void addListener(HalDeviceReportListener listener) { }
@Override
public void close() { }

View file

@ -7,14 +7,14 @@ import se.hal.intf.*;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
public class DummyController implements HalSensorController, HalEventController, Runnable, HalDaemon {
private List<DummyDevice> registeredDevices = new ArrayList();
private HalDeviceReportListener sensorListener;
private HalDeviceReportListener eventListener;
private List<HalDeviceReportListener> deviceListeners = new CopyOnWriteArrayList<>();
public DummyController() {}
@ -36,10 +36,8 @@ public class DummyController implements HalSensorController, HalEventController,
for (DummyDevice device : registeredDevices) {
HalDeviceData data = device.generateData();
if (sensorListener != null && data instanceof HalSensorData) {
sensorListener.reportReceived((HalSensorConfig) device, (HalSensorData) data);
} else if (eventListener != null && data instanceof HalEventData) {
eventListener.reportReceived((HalEventConfig) device, (HalEventData) data);
for (HalDeviceReportListener deviceListener : deviceListeners) {
deviceListener.reportReceived(device, data);
}
}
} catch (Exception e) {
@ -60,7 +58,7 @@ public class DummyController implements HalSensorController, HalEventController,
@Override
public synchronized void send(HalEventConfig eventConfig, HalEventData eventData) {
// Nothing to do as this is a dummy
// Nothing to do as this is a dummy controller
}
@Override
@ -69,11 +67,8 @@ public class DummyController implements HalSensorController, HalEventController,
}
@Override
public void setListener(HalDeviceReportListener listener) {
if (listener instanceof SensorControllerManager)
sensorListener = listener;
else if (listener instanceof EventControllerManager)
eventListener = listener;
public void addListener(HalDeviceReportListener listener) {
deviceListeners.add(listener);
}
@Override

View file

@ -24,9 +24,10 @@
package se.hal.plugin.dummy;
import se.hal.intf.HalDeviceConfig;
import se.hal.intf.HalDeviceData;
public interface DummyDevice {
public interface DummyDevice extends HalDeviceConfig {
public HalDeviceData generateData();
HalDeviceData generateData();
}

View file

@ -1,9 +1,11 @@
package se.hal.plugin.dummy;
package se.hal.plugin.dummy.device;
import se.hal.intf.HalDeviceData;
import se.hal.intf.HalSensorConfig;
import se.hal.intf.HalSensorController;
import se.hal.intf.HalSensorData;
import se.hal.plugin.dummy.DummyController;
import se.hal.plugin.dummy.DummyDevice;
import se.hal.struct.devicedata.HumiditySensorData;

View file

@ -1,9 +1,11 @@
package se.hal.plugin.dummy;
package se.hal.plugin.dummy.device;
import se.hal.intf.HalDeviceData;
import se.hal.intf.HalEventConfig;
import se.hal.intf.HalEventController;
import se.hal.intf.HalEventData;
import se.hal.plugin.dummy.DummyController;
import se.hal.plugin.dummy.DummyDevice;
import se.hal.struct.devicedata.OnOffEventData;
public class DummySwitchEvent implements DummyDevice, HalEventConfig {

View file

@ -1,9 +1,11 @@
package se.hal.plugin.dummy;
package se.hal.plugin.dummy.device;
import se.hal.intf.HalDeviceData;
import se.hal.intf.HalSensorConfig;
import se.hal.intf.HalSensorController;
import se.hal.intf.HalSensorData;
import se.hal.plugin.dummy.DummyController;
import se.hal.plugin.dummy.DummyDevice;
import se.hal.struct.devicedata.TemperatureSensorData;

View file

@ -3,8 +3,8 @@
"name": "Hal-Dummy Devices",
"description": "Dummy devices with simulated data, can be used for demo or testing purposes.",
"interfaces": [
{"se.hal.intf.HalSensorConfig": "se.hal.plugin.dummy.DummyHumiditySensor"},
{"se.hal.intf.HalEventConfig": "se.hal.plugin.dummy.DummySwitchEvent"},
{"se.hal.intf.HalSensorConfig": "se.hal.plugin.dummy.DummyTemperatureSensor"}
{"se.hal.intf.HalEventConfig": "se.hal.plugin.dummy.device.DummySwitchEvent"},
{"se.hal.intf.HalSensorConfig": "se.hal.plugin.dummy.device.DummyHumiditySensor"},
{"se.hal.intf.HalSensorConfig": "se.hal.plugin.dummy.device.DummyTemperatureSensor"}
]
}

View file

@ -36,6 +36,8 @@ import zutil.net.mqtt.MqttSubscriptionListener;
import java.io.IOException;
import java.net.InetAddress;
import java.util.HashMap;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;
@ -46,7 +48,7 @@ public class HalMqttController implements HalAutostartController, MqttSubscripti
private MqttBroker mqttBroker;
private HashMap<String, HalMqttDeviceConfig> topics = new HashMap<>();
private HalDeviceReportListener eventListener;
private List<HalDeviceReportListener> deviceListeners = new CopyOnWriteArrayList<>();
// --------------------------
// Lifecycle methods
@ -105,8 +107,10 @@ public class HalMqttController implements HalAutostartController, MqttSubscripti
if (eventConfig != null && data.length > 0) {
HalMqttDeviceData eventData = new HalMqttDeviceData(data);
if (eventListener != null) {
eventListener.reportReceived(eventConfig, eventData);
if (deviceListeners != null) {
for (HalDeviceReportListener deviceListener : deviceListeners) {
deviceListener.reportReceived(eventConfig, eventData);
}
}
}
}
@ -120,8 +124,10 @@ public class HalMqttController implements HalAutostartController, MqttSubscripti
if (deviceConfig instanceof HalMqttDeviceConfig) {
HalMqttDeviceConfig mqttEvent = (HalMqttDeviceConfig) deviceConfig;
topics.put(mqttEvent.getTopic(), mqttEvent);
} else throw new IllegalArgumentException(
"Device config is not an instance of " + HalMqttDeviceConfig.class + ": " + deviceConfig.getClass());
} else {
throw new IllegalArgumentException(
"Device config is not an instance of " + HalMqttDeviceConfig.class + ": " + deviceConfig.getClass());
}
}
@Override
@ -147,7 +153,7 @@ public class HalMqttController implements HalAutostartController, MqttSubscripti
}
@Override
public void setListener(HalDeviceReportListener listener) {
eventListener = listener;
public void addListener(HalDeviceReportListener listener) {
deviceListeners.add(listener);
}
}

View file

@ -11,7 +11,9 @@ import zutil.osal.MultiCommandExecutor;
import java.net.InetAddress;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
@ -25,19 +27,18 @@ public class NetScanController implements HalEventController, HalAutostartContro
private static final String PARAM_IPSCAN = "netscan.ipscan";
private ScheduledExecutorService executor;
private HalDeviceReportListener listener;
private List<HalDeviceReportListener> deviceListeners = new CopyOnWriteArrayList<>();
/** A register and a cache of previous state **/
private HashMap<NetworkDevice, AvailabilityEventData> devices = new HashMap<>();
@Override
public boolean isAvailable() {
return ! InetUtil.getLocalInet4Address().isEmpty();
}
@Override
public void initialize() throws Exception {
public void initialize() {
executor = Executors.newScheduledThreadPool(2);
executor.scheduleAtFixedRate(NetScanController.this, 10_000, PING_INTERVAL, TimeUnit.MILLISECONDS);
if (HalContext.getBooleanProperty(PARAM_IPSCAN, true)) {
@ -64,7 +65,8 @@ public class NetScanController implements HalEventController, HalAutostartContro
for (Map.Entry<NetworkDevice, AvailabilityEventData> entry : devices.entrySet()) {
NetworkDevice device = entry.getKey();
AvailabilityEventData prevData = entry.getValue();
if (listener != null) {
if (!deviceListeners.isEmpty()) {
// We ping two times to increase reliability
boolean ping = false;
ping |= InetScanner.isReachable(device.getHost(), executor);
@ -76,7 +78,10 @@ public class NetScanController implements HalEventController, HalAutostartContro
AvailabilityEventData newData = new AvailabilityEventData(ping, System.currentTimeMillis());
entry.setValue(newData);
logger.fine("IP " + device.getHost() + " state has changed to " + newData);
listener.reportReceived(device, newData);
for (HalDeviceReportListener deviceListener : deviceListeners) {
deviceListener.reportReceived(device, newData);
}
}
}
}
@ -86,11 +91,13 @@ public class NetScanController implements HalEventController, HalAutostartContro
}
@Override
public void foundInetAddress(InetAddress ip) {
logger.fine("Auto Detected ip: "+ip.getHostAddress());
if (listener != null)
listener.reportReceived(
logger.fine("Auto Detected ip: " + ip.getHostAddress());
for (HalDeviceReportListener deviceListener : deviceListeners) {
deviceListener.reportReceived(
new NetworkDevice(ip.getHostAddress()),
new AvailabilityEventData(true, System.currentTimeMillis()));
}
}
@ -117,8 +124,8 @@ public class NetScanController implements HalEventController, HalAutostartContro
@Override
public void setListener(HalDeviceReportListener listener) {
this.listener = listener;
public void addListener(HalDeviceReportListener listener) {
deviceListeners.add(listener);
}

View file

@ -57,6 +57,8 @@ import zutil.log.LogUtil;
import zutil.osal.linux.app.NutUPSClient;
import java.util.HashMap;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
@ -74,7 +76,7 @@ public class NutUpsController implements HalSensorController, HalAutostartContro
private HashMap<String, NutUpsDevice> registeredDevices = new HashMap<>();
private NutUPSClient client;
private ScheduledExecutorService executor;
private HalDeviceReportListener listener;
private List<HalDeviceReportListener> deviceListeners = new CopyOnWriteArrayList<>();
@ -98,20 +100,23 @@ public class NutUpsController implements HalSensorController, HalAutostartContro
@Override
public void setListener(HalDeviceReportListener listener) {
this.listener = listener;
public void addListener(HalDeviceReportListener listener) {
deviceListeners.add(listener);
}
@Override
public void run() {
try {
if (client != null && listener != null) {
for (NutUPSClient.UPSDevice ups : client.getUPSList()) {
NutUpsDevice device = registeredDevices.get(ups.getId());
if (device == null)
device = new NutUpsDevice(ups);
listener.reportReceived(device, device.read(ups));
if (client != null) {
for (HalDeviceReportListener deviceListener : deviceListeners) {
for (NutUPSClient.UPSDevice ups : client.getUPSList()) {
NutUpsDevice device = registeredDevices.get(ups.getId());
if (device == null)
device = new NutUpsDevice(ups);
deviceListener.reportReceived(device, device.read(ups));
}
}
}
} catch (Exception e){

View file

@ -31,6 +31,7 @@ import zutil.log.LogUtil;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.logging.Logger;
@ -40,7 +41,7 @@ public class RTSPController implements HalCameraController {
private static final String CONFIG_RECORDING_PATH = "nvr.recording_path";
private List<RTSPCameraConfig> cameras = new ArrayList<>();
private HalDeviceReportListener listener;
private List<HalDeviceReportListener> deviceListeners = new CopyOnWriteArrayList<>();
public RTSPController() {}
@ -81,8 +82,8 @@ public class RTSPController implements HalCameraController {
}
@Override
public void setListener(HalDeviceReportListener listener) {
this.listener = listener;
public void addListener(HalDeviceReportListener listener) {
deviceListeners.add(listener);
}
}

View file

@ -1,11 +1,15 @@
package se.hal.plugin.raspberry;
import se.hal.intf.*;
import se.hal.plugin.raspberry.device.RPiPowerConsumptionSensor;
import se.hal.plugin.raspberry.device.RPiTemperatureSensor;
import se.hal.plugin.raspberry.hardware.RPiDS18B20;
import se.hal.plugin.raspberry.hardware.RPiInteruptPulseFlankCounter;
import zutil.log.LogUtil;
import java.util.HashMap;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;
@ -13,34 +17,31 @@ public class RPiController implements HalSensorController {
private static final Logger logger = LogUtil.getLogger();
private HashMap<String, RPiSensor> pinToSensorMap = new HashMap<>();
private HalDeviceReportListener sensorListener;
private List<HalDeviceReportListener> deviceListeners = new CopyOnWriteArrayList<>();
public RPiController(){
}
public RPiController() {}
@Override
public void initialize() throws Exception {
}
public void initialize() {}
@Override
public void register(HalDeviceConfig deviceConfig) {
if (deviceConfig instanceof RPiPowerConsumptionSensor){
RPiPowerConsumptionSensor powerConsumptionSensor = (RPiPowerConsumptionSensor) deviceConfig;
int gpioPin = powerConsumptionSensor.getGpioPin();
if (!pinToSensorMap.containsKey("GPIO_"+gpioPin)){
if (!pinToSensorMap.containsKey("GPIO_" + gpioPin)){
RPiInteruptPulseFlankCounter impulseCounter = new RPiInteruptPulseFlankCounter(gpioPin, this);
pinToSensorMap.put("GPIO_"+gpioPin, impulseCounter);
pinToSensorMap.put("GPIO_" + gpioPin, impulseCounter);
} else {
logger.warning("Cannot create a RPiPowerConsumptionSensor on GPIO pin " + gpioPin + " since is already is in use by another sensor.");
}
} else if (deviceConfig instanceof RPiTemperatureSensor){
RPiTemperatureSensor temperatureSensor = (RPiTemperatureSensor) deviceConfig;
String w1Address = temperatureSensor.get1WAddress();
if (!pinToSensorMap.containsKey("W1_"+w1Address)){
if (!pinToSensorMap.containsKey("W1_" + w1Address)){
RPiDS18B20 ds12b20 = new RPiDS18B20(w1Address, this);
pinToSensorMap.put("W1_"+w1Address, ds12b20);
pinToSensorMap.put("W1_" + w1Address, ds12b20);
} else {
logger.warning("Cannot create a RPi1WireTemperatureSensor on 1-Wire address " + w1Address + " since is already is in use by another sensor.");
}
@ -53,13 +54,13 @@ public class RPiController implements HalSensorController {
public void deregister(HalDeviceConfig deviceConfig) {
if (deviceConfig instanceof RPiPowerConsumptionSensor){
RPiPowerConsumptionSensor powerConsumptionSensor = (RPiPowerConsumptionSensor) deviceConfig;
RPiSensor sensorToDeregister = pinToSensorMap.remove("GPIO_"+powerConsumptionSensor.getGpioPin());
RPiSensor sensorToDeregister = pinToSensorMap.remove("GPIO_" + powerConsumptionSensor.getGpioPin());
if (sensorToDeregister != null){
sensorToDeregister.close();
}
} else if (deviceConfig instanceof RPiTemperatureSensor){
RPiTemperatureSensor temperatureSensor = (RPiTemperatureSensor) deviceConfig;
RPiSensor sensorToDeregister = pinToSensorMap.remove("W1_"+temperatureSensor.get1WAddress());
RPiSensor sensorToDeregister = pinToSensorMap.remove("W1_" + temperatureSensor.get1WAddress());
if (sensorToDeregister != null){
sensorToDeregister.close();
}
@ -75,8 +76,8 @@ public class RPiController implements HalSensorController {
}
@Override
public void setListener(HalDeviceReportListener listener) {
sensorListener = listener;
public void addListener(HalDeviceReportListener listener) {
deviceListeners.add(listener);
}
@Override
@ -88,10 +89,8 @@ public class RPiController implements HalSensorController {
}
public void sendDataReport(HalSensorConfig sensorConfig, HalSensorData sensorData){
if (sensorListener != null){
sensorListener.reportReceived(sensorConfig, sensorData);
} else {
logger.log(Level.WARNING, "Could not report data. No registered listener");
for (HalDeviceReportListener deviceListener : deviceListeners) {
deviceListener.reportReceived(sensorConfig, sensorData);
}
}

View file

@ -1,8 +1,9 @@
package se.hal.plugin.raspberry;
package se.hal.plugin.raspberry.device;
import se.hal.intf.HalSensorConfig;
import se.hal.intf.HalSensorController;
import se.hal.intf.HalSensorData;
import se.hal.plugin.raspberry.RPiController;
import se.hal.struct.devicedata.PowerConsumptionSensorData;
import zutil.ui.conf.Configurator;

View file

@ -1,8 +1,9 @@
package se.hal.plugin.raspberry;
package se.hal.plugin.raspberry.device;
import se.hal.intf.HalSensorConfig;
import se.hal.intf.HalSensorController;
import se.hal.intf.HalSensorData;
import se.hal.plugin.raspberry.RPiController;
import se.hal.struct.devicedata.TemperatureSensorData;
import zutil.ui.conf.Configurator;

View file

@ -5,7 +5,7 @@ import com.pi4j.io.w1.W1Master;
import com.pi4j.temperature.TemperatureScale;
import se.hal.plugin.raspberry.RPiController;
import se.hal.plugin.raspberry.RPiSensor;
import se.hal.plugin.raspberry.RPiTemperatureSensor;
import se.hal.plugin.raspberry.device.RPiTemperatureSensor;
import se.hal.struct.devicedata.TemperatureSensorData;
import zutil.log.LogUtil;
@ -33,12 +33,11 @@ public class RPiDS18B20 implements RPiSensor, Runnable {
//print out all sensors found
for (TemperatureSensor device : w1Mater.getDevices(TemperatureSensor.class)) {
logger.info(String.format("1-Wire temperature sensor divice found: %-20s: %3.1f"+DEGREE_SIGN+"C\n", device.getName(), device.getTemperature(TemperatureScale.CELSIUS)));
logger.info(String.format("1-Wire temperature sensor device found: %-20s: %3.1f"+DEGREE_SIGN+"C\n", device.getName(), device.getTemperature(TemperatureScale.CELSIUS)));
}
//schedule job
scheduler.scheduleAtFixedRate(this, 10, 60, TimeUnit.SECONDS); //wait 10s and run every 60s
}
public void close() {

View file

@ -5,7 +5,7 @@ import com.pi4j.io.gpio.event.GpioPinDigitalStateChangeEvent;
import com.pi4j.io.gpio.event.GpioPinListenerDigital;
import com.pi4j.wiringpi.GpioUtil;
import se.hal.plugin.raspberry.RPiController;
import se.hal.plugin.raspberry.RPiPowerConsumptionSensor;
import se.hal.plugin.raspberry.device.RPiPowerConsumptionSensor;
import se.hal.plugin.raspberry.RPiSensor;
import se.hal.plugin.raspberry.RPiUtility;
import se.hal.struct.devicedata.PowerConsumptionSensorData;

View file

@ -2,7 +2,7 @@
"version": 1.0,
"name": "Hal-RaspberryPi Sensors",
"interfaces": [
{"se.hal.intf.HalSensorConfig": "se.hal.plugin.raspberry.RPiPowerConsumptionSensor"},
{"se.hal.intf.HalSensorConfig": "se.hal.plugin.raspberry.RPiTemperatureSensor"}
{"se.hal.intf.HalSensorConfig": "se.hal.plugin.raspberry.device.RPiPowerConsumptionSensor"},
{"se.hal.intf.HalSensorConfig": "se.hal.plugin.raspberry.device.RPiTemperatureSensor"}
]
}

View file

@ -36,6 +36,7 @@ import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.Executors;
import java.util.logging.Level;
import java.util.logging.Logger;
@ -61,7 +62,7 @@ public class TellstickSerialComm implements Runnable,
protected TellstickParser parser = new TellstickParser();
private HalDeviceReportListener deviceListener;
private List<HalDeviceReportListener> deviceListeners = new CopyOnWriteArrayList<>();
private List<HalDeviceConfig> registeredDevices = Collections.synchronizedList(new ArrayList<HalDeviceConfig>());
@ -185,8 +186,9 @@ public class TellstickSerialComm implements Runnable,
receivedTransmissionSet.add(data);
}
private void reportEvent(HalDeviceConfig tellstickDevice, HalDeviceData deviceData) {
if (deviceListener != null)
for (HalDeviceReportListener deviceListener : deviceListeners) {
deviceListener.reportReceived(tellstickDevice, deviceData);
}
}
@Override
@ -249,8 +251,8 @@ public class TellstickSerialComm implements Runnable,
}
@Override
public void setListener(HalDeviceReportListener listener) {
deviceListener = listener;
public void addListener(HalDeviceReportListener listener) {
deviceListeners.add(listener);
}

View file

@ -77,7 +77,7 @@ public class DeConzZigbeeController implements HalSensorController, HalEventCont
}
@Override
public void setListener(HalDeviceReportListener listener) {
public void addListener(HalDeviceReportListener listener) {
}

View file

@ -30,6 +30,7 @@ import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;
@ -58,7 +59,7 @@ public class HalZigbeeController implements HalSensorController,
protected ZigBeeNetworkManager networkManager;
private Timer permitJoinTimer;
private HalDeviceReportListener deviceListener;
private List<HalDeviceReportListener> deviceListeners = new CopyOnWriteArrayList<>();
private List<ZigbeeHalDeviceConfig> registeredDevices = new ArrayList<>();
@ -277,7 +278,7 @@ public class HalZigbeeController implements HalSensorController,
cluster.addAttributeListener(new ZclAttributeListener() {
@Override
public void attributeUpdated(ZclAttribute attribute, Object value) {
if (deviceListener != null) {
for (HalDeviceReportListener deviceListener : deviceListeners) {
logger.finer("[Node: " + endpoint.getIeeeAddress() + ", Endpoint: " + endpoint.getEndpointId() + ", Cluster: " + attribute.getCluster().getId() + "] Attribute updated: attribute_name=" + attribute.getName() + ", value=" + attribute.getLastValue());
deviceListener.reportReceived(config, config.getDeviceData(attribute));
}
@ -285,8 +286,9 @@ public class HalZigbeeController implements HalSensorController,
});
// // TODO: Notify listener that a device is online
if (deviceListener != null)
for (HalDeviceReportListener deviceListener : deviceListeners) {
deviceListener.reportReceived(config, null);
}
}
}
@ -325,8 +327,8 @@ public class HalZigbeeController implements HalSensorController,
}
@Override
public void setListener(HalDeviceReportListener listener) {
deviceListener = listener;
public void addListener(HalDeviceReportListener listener) {
deviceListeners.add(listener);
}
@Override

View file

@ -6,6 +6,7 @@ import se.hal.intf.*;
import zutil.log.LogUtil;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.atomic.AtomicReference;
import java.util.logging.Logger;
@ -27,8 +28,7 @@ public class HalZWaveController implements HalSensorController, HalEventControll
private Options options;
private Manager manager;
private HalDeviceReportListener sensorListener;
private HalDeviceReportListener deviceListener;
private List<HalDeviceReportListener> deviceListeners = new CopyOnWriteArrayList<>();
private List<HalAbstractDevice> registeredDevices;
@ -320,8 +320,8 @@ public class HalZWaveController implements HalSensorController, HalEventControll
}
@Override
public void setListener(HalDeviceReportListener listener) {
deviceListener = listener;
public void addListener(HalDeviceReportListener listener) {
deviceListeners.add(listener);
}
}