2 * Copyright (c) 2010-2024 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.verisure.internal.discovery;
15 import java.util.Collection;
18 import org.eclipse.jdt.annotation.NonNullByDefault;
19 import org.eclipse.jdt.annotation.Nullable;
20 import org.openhab.binding.verisure.internal.VerisureHandlerFactory;
21 import org.openhab.binding.verisure.internal.VerisureSession;
22 import org.openhab.binding.verisure.internal.VerisureThingConfiguration;
23 import org.openhab.binding.verisure.internal.dto.VerisureThingDTO;
24 import org.openhab.binding.verisure.internal.handler.VerisureBridgeHandler;
25 import org.openhab.core.config.discovery.AbstractDiscoveryService;
26 import org.openhab.core.config.discovery.DiscoveryResult;
27 import org.openhab.core.config.discovery.DiscoveryResultBuilder;
28 import org.openhab.core.config.discovery.DiscoveryService;
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;
36 * The discovery service, notified by a listener on the VerisureSession.
38 * @author Jarle Hjortland - Initial contribution
39 * @author Jan Gustafsson - Further development
43 public class VerisureThingDiscoveryService extends AbstractDiscoveryService
44 implements DiscoveryService, ThingHandlerService {
46 private static final int SEARCH_TIME_SECONDS = 60;
47 private final Logger logger = LoggerFactory.getLogger(VerisureThingDiscoveryService.class);
49 private @NonNullByDefault({}) VerisureBridgeHandler verisureBridgeHandler;
50 private @NonNullByDefault({}) ThingUID bridgeUID;
52 public VerisureThingDiscoveryService() {
53 super(VerisureHandlerFactory.SUPPORTED_THING_TYPES, SEARCH_TIME_SECONDS);
57 public void startScan() {
58 logger.debug("VerisureThingDiscoveryService:startScan");
59 removeOlderResults(getTimestampOfLastScan());
60 if (verisureBridgeHandler != null) {
61 VerisureSession session = verisureBridgeHandler.getSession();
62 if (session != null) {
63 Collection<VerisureThingDTO> verisureThings = session.getVerisureThings();
64 verisureThings.stream().forEach(thing -> {
65 logger.debug("Discovered thing: {}", thing);
66 onThingAddedInternal(thing);
72 private void onThingAddedInternal(VerisureThingDTO thing) {
73 logger.debug("VerisureThingDiscoveryService:OnThingAddedInternal");
74 ThingUID thingUID = getThingUID(thing);
75 String deviceId = thing.getDeviceId();
76 if (thingUID != null) {
77 if (verisureBridgeHandler != null) {
78 String className = thing.getClass().getSimpleName();
79 String label = "Type: " + className + " Device Id: " + deviceId;
80 if (thing.getLocation() != null) {
81 label += ", Location: " + thing.getLocation();
83 if (thing.getSiteName() != null) {
84 label += ", Site name: " + thing.getSiteName();
86 DiscoveryResult discoveryResult = DiscoveryResultBuilder.create(thingUID).withBridge(bridgeUID)
87 .withLabel(label).withProperty(VerisureThingConfiguration.DEVICE_ID_LABEL, deviceId)
88 .withRepresentationProperty(VerisureThingConfiguration.DEVICE_ID_LABEL).build();
89 logger.debug("thinguid: {}, bridge {}, label {}", thingUID, bridgeUID, deviceId);
90 thingDiscovered(discoveryResult);
93 logger.debug("Discovered unsupported thing of type '{}' with deviceId {}", thing.getClass(), deviceId);
97 private @Nullable ThingUID getThingUID(VerisureThingDTO thing) {
98 ThingUID thingUID = null;
99 if (verisureBridgeHandler != null) {
100 String deviceId = thing.getDeviceId();
101 // Make sure device id is normalized, i.e. replace all non character/digits with empty string
102 deviceId = VerisureThingConfiguration.normalizeDeviceId(deviceId);
103 thingUID = new ThingUID(thing.getThingTypeUID(), bridgeUID, deviceId);
109 public void activate() {
110 super.activate(Map.of(DiscoveryService.CONFIG_PROPERTY_BACKGROUND_DISCOVERY, true));
114 public void deactivate() {
119 public void setThingHandler(@Nullable ThingHandler handler) {
120 if (handler instanceof VerisureBridgeHandler verisureBridgeHandler) {
121 this.verisureBridgeHandler = verisureBridgeHandler;
122 bridgeUID = verisureBridgeHandler.getUID();
127 public @Nullable ThingHandler getThingHandler() {
128 return verisureBridgeHandler;