import static org.openhab.binding.powermax.internal.PowermaxBindingConstants.*;
-import java.util.HashMap;
-import java.util.Hashtable;
-import java.util.Map;
-
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.eclipse.jdt.annotation.Nullable;
-import org.openhab.binding.powermax.internal.discovery.PowermaxDiscoveryService;
import org.openhab.binding.powermax.internal.handler.PowermaxBridgeHandler;
import org.openhab.binding.powermax.internal.handler.PowermaxThingHandler;
import org.openhab.core.config.core.Configuration;
-import org.openhab.core.config.discovery.DiscoveryService;
import org.openhab.core.i18n.TimeZoneProvider;
import org.openhab.core.io.transport.serial.SerialPortManager;
import org.openhab.core.thing.Bridge;
import org.openhab.core.thing.binding.BaseThingHandlerFactory;
import org.openhab.core.thing.binding.ThingHandler;
import org.openhab.core.thing.binding.ThingHandlerFactory;
-import org.osgi.framework.ServiceRegistration;
import org.osgi.service.component.annotations.Activate;
import org.osgi.service.component.annotations.Component;
import org.osgi.service.component.annotations.Reference;
@Component(service = ThingHandlerFactory.class, configurationPid = "binding.powermax")
public class PowermaxHandlerFactory extends BaseThingHandlerFactory {
- private final Map<ThingUID, ServiceRegistration<?>> discoveryServiceRegs = new HashMap<>();
-
private final SerialPortManager serialPortManager;
private final TimeZoneProvider timeZoneProvider;
ThingTypeUID thingTypeUID = thing.getThingTypeUID();
if (SUPPORTED_BRIDGE_TYPES_UIDS.contains(thingTypeUID)) {
- PowermaxBridgeHandler handler = new PowermaxBridgeHandler((Bridge) thing, serialPortManager);
- registerDiscoveryService(handler);
- return handler;
+ return new PowermaxBridgeHandler((Bridge) thing, serialPortManager);
} else if (SUPPORTED_THING_TYPES_UIDS.contains(thingTypeUID)) {
return new PowermaxThingHandler(thing, timeZoneProvider);
}
return null;
}
-
- @Override
- protected void removeHandler(ThingHandler thingHandler) {
- if (thingHandler instanceof PowermaxBridgeHandler) {
- // remove discovery service, if bridge handler is removed
- unregisterDiscoveryService((PowermaxBridgeHandler) thingHandler);
- }
- }
-
- private synchronized void registerDiscoveryService(PowermaxBridgeHandler bridgeHandler) {
- PowermaxDiscoveryService discoveryService = new PowermaxDiscoveryService(bridgeHandler);
- discoveryService.activate();
- discoveryServiceRegs.put(bridgeHandler.getThing().getUID(),
- bundleContext.registerService(DiscoveryService.class.getName(), discoveryService, new Hashtable<>()));
- }
-
- private synchronized void unregisterDiscoveryService(PowermaxBridgeHandler bridgeHandler) {
- ServiceRegistration<?> serviceReg = discoveryServiceRegs.remove(bridgeHandler.getThing().getUID());
- if (serviceReg != null) {
- PowermaxDiscoveryService service = (PowermaxDiscoveryService) bundleContext
- .getService(serviceReg.getReference());
- serviceReg.unregister();
- if (service != null) {
- service.deactivate();
- }
- }
- }
}
import java.util.HashMap;
import java.util.Map;
+import org.eclipse.jdt.annotation.NonNullByDefault;
+import org.eclipse.jdt.annotation.Nullable;
import org.openhab.binding.powermax.internal.PowermaxBindingConstants;
import org.openhab.binding.powermax.internal.config.PowermaxX10Configuration;
import org.openhab.binding.powermax.internal.config.PowermaxZoneConfiguration;
import org.openhab.core.thing.Thing;
import org.openhab.core.thing.ThingUID;
import org.openhab.core.thing.binding.ThingHandler;
+import org.openhab.core.thing.binding.ThingHandlerService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
* all enrolled zones and X10 devices
*
* @author Laurent Garnier - Initial contribution
+ * @author Laurent Garnier - Use ThingHandlerService
*/
-public class PowermaxDiscoveryService extends AbstractDiscoveryService implements PowermaxPanelSettingsListener {
+@NonNullByDefault
+public class PowermaxDiscoveryService extends AbstractDiscoveryService
+ implements PowermaxPanelSettingsListener, ThingHandlerService {
private final Logger logger = LoggerFactory.getLogger(PowermaxDiscoveryService.class);
private static final int SEARCH_TIME = 5;
- private PowermaxBridgeHandler bridgeHandler;
+ private @Nullable PowermaxBridgeHandler bridgeHandler;
/**
* Creates a PowermaxDiscoveryService with background discovery disabled.
*/
- public PowermaxDiscoveryService(PowermaxBridgeHandler bridgeHandler) {
+ public PowermaxDiscoveryService() {
super(PowermaxBindingConstants.SUPPORTED_THING_TYPES_UIDS, SEARCH_TIME, true);
- this.bridgeHandler = bridgeHandler;
+ }
+
+ @Override
+ public void setThingHandler(ThingHandler handler) {
+ if (handler instanceof PowermaxBridgeHandler) {
+ bridgeHandler = (PowermaxBridgeHandler) handler;
+ }
+ }
+
+ @Override
+ public @Nullable ThingHandler getThingHandler() {
+ return bridgeHandler;
}
/**
* Activates the Discovery Service.
*/
+ @Override
public void activate() {
- bridgeHandler.registerPanelSettingsListener(this);
+ super.activate(null);
+ PowermaxBridgeHandler handler = bridgeHandler;
+ if (handler != null) {
+ handler.registerPanelSettingsListener(this);
+ }
}
/**
*/
@Override
public void deactivate() {
- bridgeHandler.unregisterPanelSettingsListener(this);
+ PowermaxBridgeHandler handler = bridgeHandler;
+ if (handler != null) {
+ handler.unregisterPanelSettingsListener(this);
+ }
+ super.deactivate();
}
@Override
protected void startScan() {
logger.debug("Updating discovered things (new scan)");
- updateFromSettings(bridgeHandler.getPanelSettings());
+ PowermaxBridgeHandler handler = bridgeHandler;
+ if (handler != null) {
+ updateFromSettings(handler.getPanelSettings());
+ }
}
@Override
- public void onPanelSettingsUpdated(PowermaxPanelSettings settings) {
+ public void onPanelSettingsUpdated(@Nullable PowermaxPanelSettings settings) {
logger.debug("Updating discovered things (global settings updated)");
updateFromSettings(settings);
}
@Override
- public void onZoneSettingsUpdated(int zoneNumber, PowermaxPanelSettings settings) {
+ public void onZoneSettingsUpdated(int zoneNumber, @Nullable PowermaxPanelSettings settings) {
logger.debug("Updating discovered things (zone {} updated)", zoneNumber);
PowermaxZoneSettings zoneSettings = (settings == null) ? null : settings.getZoneSettings(zoneNumber);
updateFromZoneSettings(zoneNumber, zoneSettings);
}
- private void updateFromSettings(PowermaxPanelSettings settings) {
- if (settings != null) {
+ private void updateFromSettings(@Nullable PowermaxPanelSettings settings) {
+ PowermaxBridgeHandler handler = bridgeHandler;
+ if (handler != null && settings != null) {
long beforeUpdate = new Date().getTime();
for (int i = 1; i <= settings.getNbZones(); i++) {
}
// Remove not updated discovered things
- removeOlderResults(beforeUpdate, bridgeHandler.getThing().getUID());
+ removeOlderResults(beforeUpdate, handler.getThing().getUID());
}
}
- private void updateFromZoneSettings(int zoneNumber, PowermaxZoneSettings zoneSettings) {
- if (zoneSettings != null) {
+ private void updateFromZoneSettings(int zoneNumber, @Nullable PowermaxZoneSettings zoneSettings) {
+ PowermaxBridgeHandler handler = bridgeHandler;
+ if (handler != null && zoneSettings != null) {
// Prevent for adding already known zone
- for (Thing thing : bridgeHandler.getThing().getThings()) {
+ for (Thing thing : handler.getThing().getThings()) {
ThingHandler thingHandler = thing.getHandler();
if (thing.getThingTypeUID().equals(PowermaxBindingConstants.THING_TYPE_ZONE)
&& thingHandler instanceof PowermaxThingHandler) {
}
}
- ThingUID bridgeUID = bridgeHandler.getThing().getUID();
+ ThingUID bridgeUID = handler.getThing().getUID();
ThingUID thingUID = new ThingUID(PowermaxBindingConstants.THING_TYPE_ZONE, bridgeUID,
String.valueOf(zoneNumber));
String sensorType = zoneSettings.getSensorType();
}
}
- private void updateFromDeviceSettings(int deviceNumber, PowermaxX10Settings deviceSettings) {
- if (deviceSettings != null && deviceSettings.isEnabled()) {
+ private void updateFromDeviceSettings(int deviceNumber, @Nullable PowermaxX10Settings deviceSettings) {
+ PowermaxBridgeHandler handler = bridgeHandler;
+ if (handler != null && deviceSettings != null && deviceSettings.isEnabled()) {
// Prevent for adding already known X10 device
- for (Thing thing : bridgeHandler.getThing().getThings()) {
+ for (Thing thing : handler.getThing().getThings()) {
ThingHandler thingHandler = thing.getHandler();
if (thing.getThingTypeUID().equals(PowermaxBindingConstants.THING_TYPE_X10)
&& thingHandler instanceof PowermaxThingHandler) {
}
}
- ThingUID bridgeUID = bridgeHandler.getThing().getUID();
+ ThingUID bridgeUID = handler.getThing().getUID();
ThingUID thingUID = new ThingUID(PowermaxBindingConstants.THING_TYPE_X10, bridgeUID,
String.valueOf(deviceNumber));
String name = (deviceSettings.getName() != null) ? deviceSettings.getName()