]> git.basschouten.com Git - openhab-addons.git/blob
295f39266657675ba4b6eacd113c74a751fa373f
[openhab-addons.git] /
1 /**
2  * Copyright (c) 2010-2024 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.smaenergymeter.internal.discovery;
14
15 import static org.openhab.binding.smaenergymeter.internal.SMAEnergyMeterBindingConstants.*;
16
17 import java.io.IOException;
18 import java.util.HashMap;
19 import java.util.Map;
20 import java.util.Set;
21
22 import org.eclipse.jdt.annotation.NonNullByDefault;
23 import org.eclipse.jdt.annotation.Nullable;
24 import org.openhab.binding.smaenergymeter.internal.handler.EnergyMeter;
25 import org.openhab.binding.smaenergymeter.internal.packet.PacketListener;
26 import org.openhab.binding.smaenergymeter.internal.packet.PacketListenerRegistry;
27 import org.openhab.binding.smaenergymeter.internal.packet.PayloadHandler;
28 import org.openhab.core.config.discovery.AbstractDiscoveryService;
29 import org.openhab.core.config.discovery.DiscoveryResult;
30 import org.openhab.core.config.discovery.DiscoveryResultBuilder;
31 import org.openhab.core.config.discovery.DiscoveryService;
32 import org.openhab.core.thing.Thing;
33 import org.openhab.core.thing.ThingTypeUID;
34 import org.openhab.core.thing.ThingUID;
35 import org.osgi.service.component.annotations.Activate;
36 import org.osgi.service.component.annotations.Component;
37 import org.osgi.service.component.annotations.Reference;
38 import org.slf4j.Logger;
39 import org.slf4j.LoggerFactory;
40
41 /**
42  * The {@link SMAEnergyMeterDiscoveryService} class implements a service
43  * for discovering the SMA Energy Meter.
44  *
45  * @author Osman Basha - Initial contribution
46  */
47 @NonNullByDefault
48 @Component(service = DiscoveryService.class, configurationPid = "discovery.smaenergymeter")
49 public class SMAEnergyMeterDiscoveryService extends AbstractDiscoveryService implements PayloadHandler {
50
51     private final Logger logger = LoggerFactory.getLogger(SMAEnergyMeterDiscoveryService.class);
52     private final PacketListenerRegistry listenerRegistry;
53     private @Nullable PacketListener packetListener;
54
55     @Activate
56     public SMAEnergyMeterDiscoveryService(@Reference PacketListenerRegistry listenerRegistry) {
57         super(SUPPORTED_THING_TYPES_UIDS, 15, true);
58         this.listenerRegistry = listenerRegistry;
59     }
60
61     @Override
62     public Set<ThingTypeUID> getSupportedThingTypes() {
63         return SUPPORTED_THING_TYPES_UIDS;
64     }
65
66     @Override
67     protected void startBackgroundDiscovery() {
68         PacketListener packetListener = this.packetListener;
69         if (packetListener != null) {
70             return;
71         }
72
73         logger.debug("Start SMAEnergyMeter background discovery");
74         try {
75             packetListener = listenerRegistry.getListener(PacketListener.DEFAULT_MCAST_GRP,
76                     PacketListener.DEFAULT_MCAST_PORT);
77         } catch (IOException e) {
78             logger.warn("Could not start background discovery", e);
79             return;
80         }
81
82         packetListener.addPayloadHandler(this);
83         this.packetListener = packetListener;
84     }
85
86     @Override
87     protected void stopBackgroundDiscovery() {
88         PacketListener packetListener = this.packetListener;
89         if (packetListener != null) {
90             packetListener.removePayloadHandler(this);
91             this.packetListener = null;
92         }
93     }
94
95     @Override
96     public void startScan() {
97     }
98
99     @Override
100     public void handle(EnergyMeter energyMeter) throws IOException {
101         String identifier = energyMeter.getSerialNumber();
102         logger.debug("Adding a new SMA Energy Meter with S/N '{}' to inbox", identifier);
103         Map<String, Object> properties = new HashMap<>();
104         properties.put(Thing.PROPERTY_VENDOR, "SMA");
105         properties.put(Thing.PROPERTY_SERIAL_NUMBER, identifier);
106         ThingUID uid = new ThingUID(THING_TYPE_ENERGY_METER, identifier);
107         DiscoveryResult result = DiscoveryResultBuilder.create(uid).withProperties(properties)
108                 .withRepresentationProperty(Thing.PROPERTY_SERIAL_NUMBER).withLabel("SMA Energy Meter #" + identifier)
109                 .build();
110         thingDiscovered(result);
111
112         logger.debug("Thing discovered '{}'", result);
113     }
114 }