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.onewire.internal.discovery;
15 import static org.openhab.binding.onewire.internal.OwBindingConstants.*;
17 import java.util.Date;
18 import java.util.HashMap;
19 import java.util.HashSet;
20 import java.util.List;
24 import org.eclipse.jdt.annotation.NonNullByDefault;
25 import org.openhab.binding.onewire.internal.OwException;
26 import org.openhab.binding.onewire.internal.SensorId;
27 import org.openhab.binding.onewire.internal.device.OwSensorType;
28 import org.openhab.binding.onewire.internal.handler.OwserverBridgeHandler;
29 import org.openhab.core.config.discovery.AbstractDiscoveryService;
30 import org.openhab.core.config.discovery.DiscoveryResult;
31 import org.openhab.core.config.discovery.DiscoveryResultBuilder;
32 import org.openhab.core.thing.ThingTypeUID;
33 import org.openhab.core.thing.ThingUID;
34 import org.slf4j.Logger;
35 import org.slf4j.LoggerFactory;
38 * The {@link OwDiscoveryService} implements the discovery service for the OneWire binding.
40 * @author Jan N. Klug - Initial contribution
43 public class OwDiscoveryService extends AbstractDiscoveryService {
44 private final Logger logger = LoggerFactory.getLogger(OwDiscoveryService.class);
46 private final OwserverBridgeHandler owBridgeHandler;
47 private final ThingUID bridgeUID;
49 Map<SensorId, OwDiscoveryItem> owDiscoveryItems = new HashMap<>();
50 Set<SensorId> associatedSensors = new HashSet<>();
52 public OwDiscoveryService(OwserverBridgeHandler owBridgeHandler) {
53 super(SUPPORTED_THING_TYPES, 60, false);
54 this.owBridgeHandler = owBridgeHandler;
55 this.bridgeUID = owBridgeHandler.getThing().getUID();
56 logger.debug("registering discovery service for {}", owBridgeHandler);
59 private void scanDirectory(String baseDirectory) {
60 List<SensorId> directoryList;
62 logger.trace("scanning {} on bridge {}", baseDirectory, bridgeUID);
64 directoryList = owBridgeHandler.getDirectory(baseDirectory);
65 } catch (OwException e) {
66 logger.info("empty directory '{}' for {}", baseDirectory, bridgeUID);
70 // find all valid sensors
71 for (SensorId directoryEntry : directoryList) {
73 OwDiscoveryItem owDiscoveryItem = new OwDiscoveryItem(owBridgeHandler, directoryEntry);
74 if (owDiscoveryItem.getSensorType() == OwSensorType.DS2409) {
75 // scan hub sub-directories
76 logger.trace("found hub {}, scanning sub-directories", directoryEntry);
78 scanDirectory(owDiscoveryItem.getSensorId().getFullPath() + "/main/");
79 scanDirectory(owDiscoveryItem.getSensorId().getFullPath() + "/aux/");
81 // add found sensor to list
82 logger.trace("found sensor {} (type: {})", directoryEntry, owDiscoveryItem.getSensorType());
84 owDiscoveryItems.put(owDiscoveryItem.getSensorId(), owDiscoveryItem);
85 associatedSensors.addAll(owDiscoveryItem.getAssociatedSensorIds());
87 } catch (OwException e) {
88 logger.debug("error while scanning for sensors in directory {} on bridge {}: {}", baseDirectory,
89 bridgeUID, e.getMessage());
95 public void startScan() {
99 owDiscoveryItems.entrySet().removeIf(s -> associatedSensors.contains(s.getKey()));
101 // make discovery results
102 for (OwDiscoveryItem owDiscoveryItem : owDiscoveryItems.values()) {
103 owDiscoveryItem.checkSensorType();
105 ThingTypeUID thingTypeUID = owDiscoveryItem.getThingTypeUID();
107 String normalizedId = owDiscoveryItem.getNormalizedSensorId();
108 ThingUID thingUID = new ThingUID(thingTypeUID, bridgeUID, normalizedId);
109 logger.debug("created thing UID {} for sensor {}, type {}", thingUID, owDiscoveryItem.getSensorId(),
110 owDiscoveryItem.getSensorType());
112 Map<String, Object> properties = new HashMap<>();
113 properties.put(PROPERTY_MODELID, owDiscoveryItem.getSensorType().toString());
114 properties.put(PROPERTY_VENDOR, owDiscoveryItem.getVendor());
115 properties.put(CONFIG_ID, owDiscoveryItem.getSensorId().getFullPath());
117 DiscoveryResult discoveryResult = DiscoveryResultBuilder.create(thingUID).withThingType(thingTypeUID)
118 .withProperties(properties).withBridge(bridgeUID).withLabel(owDiscoveryItem.getLabel()).build();
120 thingDiscovered(discoveryResult);
121 } catch (OwException e) {
122 logger.info("sensor-id {}: {}", owDiscoveryItem.getSensorId(), e.getMessage());
128 protected synchronized void stopScan() {
129 removeOlderResults(getTimestampOfLastScan());
134 public void deactivate() {
135 removeOlderResults(new Date().getTime());