]> git.basschouten.com Git - openhab-addons.git/blob
946f21a2ef7037b604acdf5967f91e0967d4a6b6
[openhab-addons.git] /
1 /**
2  * Copyright (c) 2010-2022 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.avmfritz.internal.discovery;
14
15 import static org.openhab.binding.avmfritz.internal.AVMFritzBindingConstants.*;
16 import static org.openhab.core.thing.Thing.*;
17
18 import java.util.HashMap;
19 import java.util.Map;
20 import java.util.Set;
21 import java.util.stream.Collectors;
22 import java.util.stream.Stream;
23
24 import org.eclipse.jdt.annotation.NonNullByDefault;
25 import org.eclipse.jdt.annotation.Nullable;
26 import org.openhab.binding.avmfritz.internal.dto.AVMFritzBaseModel;
27 import org.openhab.binding.avmfritz.internal.dto.GroupModel;
28 import org.openhab.binding.avmfritz.internal.handler.AVMFritzBaseBridgeHandler;
29 import org.openhab.binding.avmfritz.internal.hardware.FritzAhaStatusListener;
30 import org.openhab.core.config.discovery.AbstractDiscoveryService;
31 import org.openhab.core.config.discovery.DiscoveryResult;
32 import org.openhab.core.config.discovery.DiscoveryResultBuilder;
33 import org.openhab.core.config.discovery.DiscoveryService;
34 import org.openhab.core.thing.ThingTypeUID;
35 import org.openhab.core.thing.ThingUID;
36 import org.openhab.core.thing.binding.ThingHandler;
37 import org.openhab.core.thing.binding.ThingHandlerService;
38 import org.slf4j.Logger;
39 import org.slf4j.LoggerFactory;
40
41 /**
42  * Discover all AHA (AVM Home Automation) devices connected to a FRITZ!Box device.
43  *
44  * @author Robert Bausdorf - Initial contribution
45  * @author Christoph Weitkamp - Added support for groups
46  */
47 @NonNullByDefault
48 public class AVMFritzDiscoveryService extends AbstractDiscoveryService
49         implements FritzAhaStatusListener, DiscoveryService, ThingHandlerService {
50
51     private final Logger logger = LoggerFactory.getLogger(AVMFritzDiscoveryService.class);
52     /**
53      * Handler of the bridge of which devices have to be discovered.
54      */
55     private @NonNullByDefault({}) AVMFritzBaseBridgeHandler bridgeHandler;
56
57     public AVMFritzDiscoveryService() {
58         super(Stream
59                 .of(SUPPORTED_LIGHTING_THING_TYPES, SUPPORTED_BUTTON_THING_TYPES_UIDS, SUPPORTED_HEATING_THING_TYPES,
60                         SUPPORTED_DEVICE_THING_TYPES_UIDS, SUPPORTED_GROUP_THING_TYPES_UIDS)
61                 .flatMap(Set::stream).collect(Collectors.toUnmodifiableSet()), 30);
62     }
63
64     @Override
65     public void activate() {
66         super.activate(null);
67         bridgeHandler.registerStatusListener(this);
68     }
69
70     @Override
71     public void deactivate() {
72         bridgeHandler.unregisterStatusListener(this);
73         super.deactivate();
74     }
75
76     @Override
77     public void startScan() {
78         logger.debug("Start manual scan on bridge {}", bridgeHandler.getThing().getUID());
79         bridgeHandler.handleRefreshCommand();
80     }
81
82     @Override
83     protected synchronized void stopScan() {
84         logger.debug("Stop manual scan on bridge {}", bridgeHandler.getThing().getUID());
85         super.stopScan();
86     }
87
88     @Override
89     public void setThingHandler(@NonNullByDefault({}) ThingHandler handler) {
90         if (handler instanceof AVMFritzBaseBridgeHandler) {
91             bridgeHandler = (AVMFritzBaseBridgeHandler) handler;
92         }
93     }
94
95     @Override
96     public @Nullable ThingHandler getThingHandler() {
97         return bridgeHandler;
98     }
99
100     @Override
101     public void onDeviceAdded(AVMFritzBaseModel device) {
102         ThingTypeUID thingTypeUID = new ThingTypeUID(BINDING_ID, bridgeHandler.getThingTypeId(device));
103         if (getSupportedThingTypes().contains(thingTypeUID)) {
104             ThingUID thingUID = new ThingUID(thingTypeUID, bridgeHandler.getThing().getUID(),
105                     bridgeHandler.getThingName(device));
106             onDeviceAddedInternal(thingUID, device);
107         } else {
108             logger.debug("Discovered unsupported device: {}", device);
109         }
110     }
111
112     @Override
113     public void onDeviceUpdated(ThingUID thingUID, AVMFritzBaseModel device) {
114         onDeviceAddedInternal(thingUID, device);
115     }
116
117     @Override
118     public void onDeviceGone(ThingUID thingUID) {
119         // nothing to do
120     }
121
122     private void onDeviceAddedInternal(ThingUID thingUID, AVMFritzBaseModel device) {
123         if (device.getPresent() == 1) {
124             Map<String, Object> properties = new HashMap<>();
125             properties.put(CONFIG_AIN, device.getIdentifier());
126             properties.put(PROPERTY_VENDOR, device.getManufacturer());
127             properties.put(PRODUCT_NAME, device.getProductName());
128             properties.put(PROPERTY_SERIAL_NUMBER, device.getIdentifier());
129             properties.put(PROPERTY_FIRMWARE_VERSION, device.getFirmwareVersion());
130             if (device instanceof GroupModel && ((GroupModel) device).getGroupinfo() != null) {
131                 properties.put(PROPERTY_MASTER, ((GroupModel) device).getGroupinfo().getMasterdeviceid());
132                 properties.put(PROPERTY_MEMBERS, ((GroupModel) device).getGroupinfo().getMembers());
133             }
134
135             DiscoveryResult discoveryResult = DiscoveryResultBuilder.create(thingUID).withProperties(properties)
136                     .withRepresentationProperty(CONFIG_AIN).withBridge(bridgeHandler.getThing().getUID())
137                     .withLabel(device.getName()).build();
138
139             thingDiscovered(discoveryResult);
140         } else {
141             thingRemoved(thingUID);
142         }
143     }
144 }