]> git.basschouten.com Git - openhab-addons.git/blob
2009353fff67be53cf0b478a41092d3092a23860
[openhab-addons.git] /
1 /**
2  * Copyright (c) 2010-2020 Contributors to the openHAB project
3  *
4  * See the NOTICE file(s) distributed with this work for additional
5  * information.
6  *
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
10  *
11  * SPDX-License-Identifier: EPL-2.0
12  */
13 package org.openhab.binding.zoneminder.internal.discovery;
14
15 import java.util.HashMap;
16 import java.util.Map;
17 import java.util.Set;
18
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;
34
35 import name.eskildsen.zoneminder.IZoneMinderMonitorData;
36
37 /**
38  *
39  * @author Martin S. Eskildsen - Initial contribution
40  */
41 public class ZoneMinderDiscoveryService extends AbstractDiscoveryService
42         implements DiscoveryService, ThingHandlerService {
43
44     private final Logger logger = LoggerFactory.getLogger(ZoneMinderDiscoveryService.class);
45
46     private @NonNullByDefault({}) ZoneMinderServerBridgeHandler serverHandler;
47
48     public ZoneMinderDiscoveryService() {
49         super(30);
50     }
51
52     @Override
53     public void setThingHandler(@Nullable ThingHandler handler) {
54         if (handler instanceof ZoneMinderServerBridgeHandler) {
55             this.serverHandler = (ZoneMinderServerBridgeHandler) handler;
56             this.serverHandler.setDiscoveryService(this);
57         }
58     }
59
60     @Override
61     public @Nullable ThingHandler getThingHandler() {
62         return serverHandler;
63     }
64
65     @Override
66     public void activate() {
67         logger.debug("[DISCOVERY]: Activating ZoneMinder discovery service for {}", serverHandler.getThing().getUID());
68     }
69
70     @Override
71     public void deactivate() {
72         logger.debug("[DISCOVERY]: Deactivating ZoneMinder discovery service for {}",
73                 serverHandler.getThing().getUID());
74     }
75
76     @Override
77     public Set<ThingTypeUID> getSupportedThingTypes() {
78         return ZoneMinderThingMonitorHandler.SUPPORTED_THING_TYPES;
79     }
80
81     @Override
82     public void startBackgroundDiscovery() {
83         logger.debug("[DISCOVERY]: Performing background discovery scan for {}", serverHandler.getThing().getUID());
84         discoverMonitors();
85     }
86
87     @Override
88     public void startScan() {
89         logger.debug("[DISCOVERY]: Starting discovery scan for {}", serverHandler.getThing().getUID());
90         discoverMonitors();
91     }
92
93     @Override
94     public synchronized void abortScan() {
95         super.abortScan();
96     }
97
98     @Override
99     protected synchronized void stopScan() {
100         super.stopScan();
101     }
102
103     protected String buildMonitorLabel(String id, String name) {
104         return String.format("%s [%s]", ZoneMinderConstants.ZONEMINDER_MONITOR_NAME, name);
105     }
106
107     protected synchronized void discoverMonitors() {
108         // Add all existing devices
109         for (IZoneMinderMonitorData monitor : serverHandler.getMonitors()) {
110             deviceAdded(monitor);
111         }
112     }
113
114     private boolean monitorThingExists(ThingUID newThingUID) {
115         return serverHandler.getThing().getThing(newThingUID) != null ? true : false;
116     }
117
118     /**
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.
121      *
122      * @param node the node to be added
123      */
124     public void deviceAdded(IZoneMinderMonitorData monitor) {
125         try {
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,
129                     monitorUID);
130
131             // Does Monitor exist?
132             if (!monitorThingExists(thingUID)) {
133                 logger.info("[DISCOVERY]: Monitor with Id='{}' and Name='{}' added", monitor.getId(),
134                         monitor.getName());
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);
141
142                 DiscoveryResult discoveryResult = DiscoveryResultBuilder.create(thingUID).withProperties(properties)
143                         .withBridge(bridgeUID).withLabel(buildMonitorLabel(monitor.getId(), monitor.getName())).build();
144
145                 thingDiscovered(discoveryResult);
146             }
147         } catch (Exception ex) {
148             logger.error("[DISCOVERY]: Error occurred when calling 'monitorAdded' from Discovery. Exception={}",
149                     ex.getMessage());
150         }
151     }
152 }