2 * Copyright (c) 2010-2023 Contributors to the openHAB project
4 * See the NOTICE file(s) distributed with this work for additional
7 * This program and the accompanying materials are made available under the
8 * terms of the Eclipse Public License 2.0 which is available at
9 * http://www.eclipse.org/legal/epl-2.0
11 * SPDX-License-Identifier: EPL-2.0
13 package org.openhab.binding.dscalarm.internal.factory;
15 import static org.openhab.binding.dscalarm.internal.DSCAlarmBindingConstants.SUPPORTED_THING_TYPES_UIDS;
17 import java.util.HashMap;
18 import java.util.Hashtable;
21 import org.openhab.binding.dscalarm.internal.DSCAlarmBindingConstants;
22 import org.openhab.binding.dscalarm.internal.config.DSCAlarmPartitionConfiguration;
23 import org.openhab.binding.dscalarm.internal.config.DSCAlarmZoneConfiguration;
24 import org.openhab.binding.dscalarm.internal.config.EnvisalinkBridgeConfiguration;
25 import org.openhab.binding.dscalarm.internal.config.IT100BridgeConfiguration;
26 import org.openhab.binding.dscalarm.internal.config.TCPServerBridgeConfiguration;
27 import org.openhab.binding.dscalarm.internal.discovery.DSCAlarmDiscoveryService;
28 import org.openhab.binding.dscalarm.internal.handler.DSCAlarmBaseBridgeHandler;
29 import org.openhab.binding.dscalarm.internal.handler.EnvisalinkBridgeHandler;
30 import org.openhab.binding.dscalarm.internal.handler.IT100BridgeHandler;
31 import org.openhab.binding.dscalarm.internal.handler.KeypadThingHandler;
32 import org.openhab.binding.dscalarm.internal.handler.PanelThingHandler;
33 import org.openhab.binding.dscalarm.internal.handler.PartitionThingHandler;
34 import org.openhab.binding.dscalarm.internal.handler.TCPServerBridgeHandler;
35 import org.openhab.binding.dscalarm.internal.handler.ZoneThingHandler;
36 import org.openhab.core.config.core.Configuration;
37 import org.openhab.core.config.discovery.DiscoveryService;
38 import org.openhab.core.io.transport.serial.SerialPortManager;
39 import org.openhab.core.thing.Bridge;
40 import org.openhab.core.thing.Thing;
41 import org.openhab.core.thing.ThingTypeUID;
42 import org.openhab.core.thing.ThingUID;
43 import org.openhab.core.thing.binding.BaseThingHandlerFactory;
44 import org.openhab.core.thing.binding.ThingHandler;
45 import org.openhab.core.thing.binding.ThingHandlerFactory;
46 import org.osgi.framework.ServiceRegistration;
47 import org.osgi.service.component.annotations.Activate;
48 import org.osgi.service.component.annotations.Component;
49 import org.osgi.service.component.annotations.Reference;
50 import org.slf4j.Logger;
51 import org.slf4j.LoggerFactory;
54 * The {@link DSCAlarmHandlerFactory} is responsible for creating things and thing. handlers.
56 * @author Russell Stephens - Initial Contribution
58 @Component(service = ThingHandlerFactory.class, configurationPid = "binding.dscalarm")
59 public class DSCAlarmHandlerFactory extends BaseThingHandlerFactory {
61 private final Logger logger = LoggerFactory.getLogger(DSCAlarmHandlerFactory.class);
62 private final Map<ThingUID, ServiceRegistration<?>> discoveryServiceRegistrations = new HashMap<>();
64 private final SerialPortManager serialPortManager;
67 public DSCAlarmHandlerFactory(final @Reference SerialPortManager serialPortManager) {
68 this.serialPortManager = serialPortManager;
72 public Thing createThing(ThingTypeUID thingTypeUID, Configuration configuration, ThingUID thingUID,
74 if (DSCAlarmBindingConstants.ENVISALINKBRIDGE_THING_TYPE.equals(thingTypeUID)) {
75 ThingUID envisalinkBridgeUID = getEnvisalinkBridgeThingUID(thingTypeUID, thingUID, configuration);
76 logger.debug("createThing(): ENVISALINK_BRIDGE: Creating an '{}' type Thing - {}", thingTypeUID,
77 envisalinkBridgeUID.getId());
78 return super.createThing(thingTypeUID, configuration, envisalinkBridgeUID, null);
79 } else if (DSCAlarmBindingConstants.IT100BRIDGE_THING_TYPE.equals(thingTypeUID)) {
80 ThingUID it100BridgeUID = getIT100BridgeThingUID(thingTypeUID, thingUID, configuration);
81 logger.debug("createThing(): IT100_BRIDGE: Creating an '{}' type Thing - {}", thingTypeUID,
82 it100BridgeUID.getId());
83 return super.createThing(thingTypeUID, configuration, it100BridgeUID, null);
84 } else if (DSCAlarmBindingConstants.TCPSERVERBRIDGE_THING_TYPE.equals(thingTypeUID)) {
85 ThingUID tcpServerBridgeUID = getTCPServerBridgeThingUID(thingTypeUID, thingUID, configuration);
86 logger.debug("createThing(): TCP_SERVER_BRIDGE: Creating an '{}' type Thing - {}", thingTypeUID,
87 tcpServerBridgeUID.getId());
88 return super.createThing(thingTypeUID, configuration, tcpServerBridgeUID, null);
89 } else if (DSCAlarmBindingConstants.PANEL_THING_TYPE.equals(thingTypeUID)) {
90 ThingUID panelThingUID = getDSCAlarmPanelUID(thingTypeUID, thingUID, configuration, bridgeUID);
91 logger.debug("createThing(): PANEL_THING: Creating '{}' type Thing - {}", thingTypeUID,
92 panelThingUID.getId());
93 return super.createThing(thingTypeUID, configuration, panelThingUID, bridgeUID);
94 } else if (DSCAlarmBindingConstants.PARTITION_THING_TYPE.equals(thingTypeUID)) {
95 ThingUID partitionThingUID = getDSCAlarmPartitionUID(thingTypeUID, thingUID, configuration, bridgeUID);
96 logger.debug("createThing(): PARTITION_THING: Creating '{}' type Thing - {}", thingTypeUID,
97 partitionThingUID.getId());
98 return super.createThing(thingTypeUID, configuration, partitionThingUID, bridgeUID);
99 } else if (DSCAlarmBindingConstants.ZONE_THING_TYPE.equals(thingTypeUID)) {
100 ThingUID zoneThingUID = getDSCAlarmZoneUID(thingTypeUID, thingUID, configuration, bridgeUID);
101 logger.debug("createThing(): ZONE_THING: Creating '{}' type Thing - {}", thingTypeUID,
102 zoneThingUID.getId());
103 return super.createThing(thingTypeUID, configuration, zoneThingUID, bridgeUID);
104 } else if (DSCAlarmBindingConstants.KEYPAD_THING_TYPE.equals(thingTypeUID)) {
105 ThingUID keypadThingUID = getDSCAlarmKeypadUID(thingTypeUID, thingUID, configuration, bridgeUID);
106 logger.debug("createThing(): KEYPAD_THING: Creating '{}' type Thing - {}", thingTypeUID,
107 keypadThingUID.getId());
108 return super.createThing(thingTypeUID, configuration, keypadThingUID, bridgeUID);
111 throw new IllegalArgumentException(
112 "createThing(): The thing type " + thingTypeUID + " is not supported by the DSC Alarm binding.");
116 public boolean supportsThingType(ThingTypeUID thingTypeUID) {
117 return SUPPORTED_THING_TYPES_UIDS.contains(thingTypeUID);
121 * Get the Envisalink Bridge Thing UID.
123 * @param thingTypeUID
125 * @param configuration
128 private ThingUID getEnvisalinkBridgeThingUID(ThingTypeUID thingTypeUID, ThingUID thingUID,
129 Configuration configuration) {
130 if (thingUID == null) {
131 String ipAddress = (String) configuration.get(EnvisalinkBridgeConfiguration.IP_ADDRESS);
132 String bridgeID = ipAddress.replace('.', '_');
133 thingUID = new ThingUID(thingTypeUID, bridgeID);
139 * Get the IT-100 Bridge Thing UID.
141 * @param thingTypeUID
143 * @param configuration
146 private ThingUID getIT100BridgeThingUID(ThingTypeUID thingTypeUID, ThingUID thingUID, Configuration configuration) {
147 if (thingUID == null) {
148 String serialPort = (String) configuration.get(IT100BridgeConfiguration.SERIAL_PORT);
149 String bridgeID = serialPort.replace('.', '_');
150 thingUID = new ThingUID(thingTypeUID, bridgeID);
156 * Get the IT-100 Bridge Thing UID.
158 * @param thingTypeUID
160 * @param configuration
163 private ThingUID getTCPServerBridgeThingUID(ThingTypeUID thingTypeUID, ThingUID thingUID,
164 Configuration configuration) {
165 if (thingUID == null) {
166 String ipAddress = (String) configuration.get(TCPServerBridgeConfiguration.IP_ADDRESS);
167 String port = (String) configuration.get(TCPServerBridgeConfiguration.PORT);
168 String bridgeID = ipAddress.replace('.', '_') + "_" + port;
169 thingUID = new ThingUID(thingTypeUID, bridgeID);
175 * Get the Panel Thing UID.
177 * @param thingTypeUID
179 * @param configuration
183 private ThingUID getDSCAlarmPanelUID(ThingTypeUID thingTypeUID, ThingUID thingUID, Configuration configuration,
184 ThingUID bridgeUID) {
185 if (thingUID == null) {
186 String panelId = "panel";
187 thingUID = new ThingUID(thingTypeUID, panelId, bridgeUID.getId());
193 * Get the Partition Thing UID.
195 * @param thingTypeUID
197 * @param configuration
201 private ThingUID getDSCAlarmPartitionUID(ThingTypeUID thingTypeUID, ThingUID thingUID, Configuration configuration,
202 ThingUID bridgeUID) {
203 if (thingUID == null) {
204 String partitionId = "partition"
205 + (String) configuration.get(DSCAlarmPartitionConfiguration.PARTITION_NUMBER);
206 thingUID = new ThingUID(thingTypeUID, partitionId, bridgeUID.getId());
212 * Get the Zone Thing UID.
214 * @param thingTypeUID
216 * @param configuration
220 private ThingUID getDSCAlarmZoneUID(ThingTypeUID thingTypeUID, ThingUID thingUID, Configuration configuration,
221 ThingUID bridgeUID) {
222 if (thingUID == null) {
223 String zoneId = "zone" + (String) configuration.get(DSCAlarmZoneConfiguration.ZONE_NUMBER);
224 thingUID = new ThingUID(thingTypeUID, zoneId, bridgeUID.getId());
230 * Get the Keypad Thing UID.
232 * @param thingTypeUID
234 * @param configuration
238 private ThingUID getDSCAlarmKeypadUID(ThingTypeUID thingTypeUID, ThingUID thingUID, Configuration configuration,
239 ThingUID bridgeUID) {
240 if (thingUID == null) {
241 String keypadId = "keypad";
242 thingUID = new ThingUID(thingTypeUID, keypadId, bridgeUID.getId());
248 * Register the Thing Discovery Service for a bridge.
250 * @param dscAlarmBridgeHandler
252 private void registerDSCAlarmDiscoveryService(DSCAlarmBaseBridgeHandler dscAlarmBridgeHandler) {
253 DSCAlarmDiscoveryService discoveryService = new DSCAlarmDiscoveryService(dscAlarmBridgeHandler);
254 discoveryService.activate();
256 ServiceRegistration<?> discoveryServiceRegistration = bundleContext
257 .registerService(DiscoveryService.class.getName(), discoveryService, new Hashtable<>());
258 discoveryServiceRegistrations.put(dscAlarmBridgeHandler.getThing().getUID(), discoveryServiceRegistration);
260 logger.debug("registerDSCAlarmDiscoveryService(): Bridge Handler - {}, Class Name - {}, Discovery Service - {}",
261 dscAlarmBridgeHandler, DiscoveryService.class.getName(), discoveryService);
265 protected ThingHandler createHandler(Thing thing) {
266 ThingTypeUID thingTypeUID = thing.getThingTypeUID();
268 if (thingTypeUID.equals(DSCAlarmBindingConstants.ENVISALINKBRIDGE_THING_TYPE)) {
269 EnvisalinkBridgeHandler handler = new EnvisalinkBridgeHandler((Bridge) thing);
270 registerDSCAlarmDiscoveryService(handler);
271 logger.debug("createHandler(): ENVISALINKBRIDGE_THING: ThingHandler created for {}", thingTypeUID);
273 } else if (thingTypeUID.equals(DSCAlarmBindingConstants.IT100BRIDGE_THING_TYPE)) {
274 IT100BridgeHandler handler = new IT100BridgeHandler((Bridge) thing, serialPortManager);
275 registerDSCAlarmDiscoveryService(handler);
276 logger.debug("createHandler(): IT100BRIDGE_THING: ThingHandler created for {}", thingTypeUID);
278 } else if (thingTypeUID.equals(DSCAlarmBindingConstants.TCPSERVERBRIDGE_THING_TYPE)) {
279 TCPServerBridgeHandler handler = new TCPServerBridgeHandler((Bridge) thing);
280 registerDSCAlarmDiscoveryService(handler);
281 logger.debug("createHandler(): TCPSERVERBRIDGE_THING: ThingHandler created for {}", thingTypeUID);
283 } else if (thingTypeUID.equals(DSCAlarmBindingConstants.PANEL_THING_TYPE)) {
284 logger.debug("createHandler(): PANEL_THING: ThingHandler created for {}", thingTypeUID);
285 return new PanelThingHandler(thing);
286 } else if (thingTypeUID.equals(DSCAlarmBindingConstants.PARTITION_THING_TYPE)) {
287 logger.debug("createHandler(): PARTITION_THING: ThingHandler created for {}", thingTypeUID);
288 return new PartitionThingHandler(thing);
289 } else if (thingTypeUID.equals(DSCAlarmBindingConstants.ZONE_THING_TYPE)) {
290 logger.debug("createHandler(): ZONE_THING: ThingHandler created for {}", thingTypeUID);
291 return new ZoneThingHandler(thing);
292 } else if (thingTypeUID.equals(DSCAlarmBindingConstants.KEYPAD_THING_TYPE)) {
293 logger.debug("createHandler(): KEYPAD_THING: ThingHandler created for {}", thingTypeUID);
294 return new KeypadThingHandler(thing);
296 logger.debug("createHandler(): ThingHandler not found for {}", thingTypeUID);
302 protected void removeHandler(ThingHandler thingHandler) {
303 ServiceRegistration<?> discoveryServiceRegistration = discoveryServiceRegistrations
304 .get(thingHandler.getThing().getUID());
306 if (discoveryServiceRegistration != null) {
307 DSCAlarmDiscoveryService discoveryService = (DSCAlarmDiscoveryService) bundleContext
308 .getService(discoveryServiceRegistration.getReference());
309 discoveryService.deactivate();
310 discoveryServiceRegistration.unregister();
311 discoveryServiceRegistration = null;
312 discoveryServiceRegistrations.remove(thingHandler.getThing().getUID());
315 super.removeHandler(thingHandler);