]> git.basschouten.com Git - openhab-addons.git/blob
e959f0466461b3eace697d102d70f5c81936dc80
[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             packetListener.open(30);
78         } catch (IOException e) {
79             logger.warn("Could not start background discovery", e);
80             return;
81         }
82
83         packetListener.addPayloadHandler(this);
84         this.packetListener = packetListener;
85     }
86
87     @Override
88     protected void stopBackgroundDiscovery() {
89         PacketListener packetListener = this.packetListener;
90         if (packetListener != null) {
91             packetListener.removePayloadHandler(this);
92             this.packetListener = null;
93         }
94     }
95
96     @Override
97     public void startScan() {
98     }
99
100     @Override
101     public void handle(EnergyMeter energyMeter) throws IOException {
102         String identifier = energyMeter.getSerialNumber();
103         logger.debug("Adding a new SMA Energy Meter with S/N '{}' to inbox", identifier);
104         Map<String, Object> properties = new HashMap<>();
105         properties.put(Thing.PROPERTY_VENDOR, "SMA");
106         properties.put(Thing.PROPERTY_SERIAL_NUMBER, identifier);
107         ThingUID uid = new ThingUID(THING_TYPE_ENERGY_METER, identifier);
108         DiscoveryResult result = DiscoveryResultBuilder.create(uid).withProperties(properties)
109                 .withRepresentationProperty(Thing.PROPERTY_SERIAL_NUMBER).withLabel("SMA Energy Meter #" + identifier)
110                 .build();
111         thingDiscovered(result);
112
113         logger.debug("Thing discovered '{}'", result);
114     }
115 }