2 * Copyright (c) 2010-2020 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.zoneminder.internal.discovery;
15 import java.util.HashMap;
19 import org.eclipse.jdt.annotation.NonNullByDefault;
20 import org.eclipse.jdt.annotation.Nullable;
21 import org.openhab.binding.zoneminder.internal.ZoneMinderConstants;
22 import org.openhab.binding.zoneminder.internal.handler.ZoneMinderServerBridgeHandler;
23 import org.openhab.binding.zoneminder.internal.handler.ZoneMinderThingMonitorHandler;
24 import org.openhab.core.config.discovery.AbstractDiscoveryService;
25 import org.openhab.core.config.discovery.DiscoveryResult;
26 import org.openhab.core.config.discovery.DiscoveryResultBuilder;
27 import org.openhab.core.config.discovery.DiscoveryService;
28 import org.openhab.core.thing.ThingTypeUID;
29 import org.openhab.core.thing.ThingUID;
30 import org.openhab.core.thing.binding.ThingHandler;
31 import org.openhab.core.thing.binding.ThingHandlerService;
32 import org.slf4j.Logger;
33 import org.slf4j.LoggerFactory;
35 import name.eskildsen.zoneminder.IZoneMinderMonitorData;
39 * @author Martin S. Eskildsen - Initial contribution
41 public class ZoneMinderDiscoveryService extends AbstractDiscoveryService
42 implements DiscoveryService, ThingHandlerService {
44 private final Logger logger = LoggerFactory.getLogger(ZoneMinderDiscoveryService.class);
46 private @NonNullByDefault({}) ZoneMinderServerBridgeHandler serverHandler;
48 public ZoneMinderDiscoveryService() {
53 public void setThingHandler(@Nullable ThingHandler handler) {
54 if (handler instanceof ZoneMinderServerBridgeHandler) {
55 this.serverHandler = (ZoneMinderServerBridgeHandler) handler;
56 this.serverHandler.setDiscoveryService(this);
61 public @Nullable ThingHandler getThingHandler() {
66 public void activate() {
67 logger.debug("[DISCOVERY]: Activating ZoneMinder discovery service for {}", serverHandler.getThing().getUID());
71 public void deactivate() {
72 logger.debug("[DISCOVERY]: Deactivating ZoneMinder discovery service for {}",
73 serverHandler.getThing().getUID());
77 public Set<ThingTypeUID> getSupportedThingTypes() {
78 return ZoneMinderThingMonitorHandler.SUPPORTED_THING_TYPES;
82 public void startBackgroundDiscovery() {
83 logger.debug("[DISCOVERY]: Performing background discovery scan for {}", serverHandler.getThing().getUID());
88 public void startScan() {
89 logger.debug("[DISCOVERY]: Starting discovery scan for {}", serverHandler.getThing().getUID());
94 public synchronized void abortScan() {
99 protected synchronized void stopScan() {
103 protected String buildMonitorLabel(String id, String name) {
104 return String.format("%s [%s]", ZoneMinderConstants.ZONEMINDER_MONITOR_NAME, name);
107 protected synchronized void discoverMonitors() {
108 // Add all existing devices
109 for (IZoneMinderMonitorData monitor : serverHandler.getMonitors()) {
110 deviceAdded(monitor);
114 private boolean monitorThingExists(ThingUID newThingUID) {
115 return serverHandler.getThing().getThing(newThingUID) != null ? true : false;
119 * This is called once the node is fully discovered. At this point we know most of the information about
120 * the device including manufacturer information.
122 * @param node the node to be added
124 public void deviceAdded(IZoneMinderMonitorData monitor) {
126 ThingUID bridgeUID = serverHandler.getThing().getUID();
127 String monitorUID = String.format("%s-%s", ZoneMinderConstants.THING_ZONEMINDER_MONITOR, monitor.getId());
128 ThingUID thingUID = new ThingUID(ZoneMinderConstants.THING_TYPE_THING_ZONEMINDER_MONITOR, bridgeUID,
131 // Does Monitor exist?
132 if (!monitorThingExists(thingUID)) {
133 logger.info("[DISCOVERY]: Monitor with Id='{}' and Name='{}' added", monitor.getId(),
135 Map<String, Object> properties = new HashMap<>(0);
136 properties.put(ZoneMinderConstants.PARAMETER_MONITOR_ID, Integer.valueOf(monitor.getId()));
137 properties.put(ZoneMinderConstants.PARAMETER_MONITOR_TRIGGER_TIMEOUT,
138 ZoneMinderConstants.PARAMETER_MONITOR_TRIGGER_TIMEOUT_DEFAULTVALUE);
139 properties.put(ZoneMinderConstants.PARAMETER_MONITOR_EVENTTEXT,
140 ZoneMinderConstants.MONITOR_EVENT_OPENHAB);
142 DiscoveryResult discoveryResult = DiscoveryResultBuilder.create(thingUID).withProperties(properties)
143 .withBridge(bridgeUID).withLabel(buildMonitorLabel(monitor.getId(), monitor.getName())).build();
145 thingDiscovered(discoveryResult);
147 } catch (Exception ex) {
148 logger.error("[DISCOVERY]: Error occurred when calling 'monitorAdded' from Discovery. Exception={}",