Skip to content

Commit 8d552bf

Browse files
authored
Refactor and fix (openhab#17394)
Signed-off-by: Leo Siepel <[email protected]>
1 parent 5a3a0c0 commit 8d552bf

File tree

6 files changed

+36
-22
lines changed

6 files changed

+36
-22
lines changed

bundles/org.openhab.binding.smaenergymeter/src/main/java/org/openhab/binding/smaenergymeter/internal/SMAEnergyMeterHandlerFactory.java

+4-1
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@
1414

1515
import static org.openhab.binding.smaenergymeter.internal.SMAEnergyMeterBindingConstants.*;
1616

17+
import org.eclipse.jdt.annotation.NonNullByDefault;
18+
import org.eclipse.jdt.annotation.Nullable;
1719
import org.openhab.binding.smaenergymeter.internal.handler.SMAEnergyMeterHandler;
1820
import org.openhab.binding.smaenergymeter.internal.packet.PacketListenerRegistry;
1921
import org.openhab.core.thing.Thing;
@@ -31,6 +33,7 @@
3133
*
3234
* @author Osman Basha - Initial contribution
3335
*/
36+
@NonNullByDefault
3437
@Component(service = ThingHandlerFactory.class, configurationPid = "binding.smaenergymeter")
3538
public class SMAEnergyMeterHandlerFactory extends BaseThingHandlerFactory {
3639

@@ -47,7 +50,7 @@ public boolean supportsThingType(ThingTypeUID thingTypeUID) {
4750
}
4851

4952
@Override
50-
protected ThingHandler createHandler(Thing thing) {
53+
protected @Nullable ThingHandler createHandler(Thing thing) {
5154
ThingTypeUID thingTypeUID = thing.getThingTypeUID();
5255

5356
if (thingTypeUID.equals(THING_TYPE_ENERGY_METER)) {

bundles/org.openhab.binding.smaenergymeter/src/main/java/org/openhab/binding/smaenergymeter/internal/discovery/SMAEnergyMeterDiscoveryService.java

+6-1
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,12 @@ protected void startBackgroundDiscovery() {
7979
return;
8080
}
8181

82-
packetListener.addPayloadHandler(this);
82+
try {
83+
packetListener.addPayloadHandler(this);
84+
} catch (IOException e) {
85+
logger.warn("Could not start background discovery, unable to add PayloadHandler", e);
86+
return;
87+
}
8388
this.packetListener = packetListener;
8489
}
8590

bundles/org.openhab.binding.smaenergymeter/src/main/java/org/openhab/binding/smaenergymeter/internal/handler/EnergyMeter.java

+3-1
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
import java.nio.ByteBuffer;
1717
import java.util.Arrays;
1818

19+
import org.eclipse.jdt.annotation.NonNullByDefault;
1920
import org.openhab.core.library.types.DecimalType;
2021

2122
/**
@@ -26,11 +27,12 @@
2627
* @author Łukasz Dywicki - Extracted multicast group handling to
2728
* {@link org.openhab.binding.smaenergymeter.internal.packet.PacketListener}.
2829
*/
30+
@NonNullByDefault
2931
public class EnergyMeter {
3032

3133
private static final byte[] E_METER_PROTOCOL_ID = new byte[] { 0x60, 0x69 };
3234

33-
private String serialNumber;
35+
private String serialNumber = "";
3436
private final FieldDTO powerIn;
3537
private final FieldDTO energyIn;
3638
private final FieldDTO powerOut;

bundles/org.openhab.binding.smaenergymeter/src/main/java/org/openhab/binding/smaenergymeter/internal/handler/SMAEnergyMeterHandler.java

+6-3
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,10 @@
1515
import static org.openhab.binding.smaenergymeter.internal.SMAEnergyMeterBindingConstants.*;
1616

1717
import java.io.IOException;
18+
import java.util.Objects;
1819
import java.util.concurrent.TimeUnit;
1920

21+
import org.eclipse.jdt.annotation.NonNullByDefault;
2022
import org.eclipse.jdt.annotation.Nullable;
2123
import org.openhab.binding.smaenergymeter.internal.configuration.EnergyMeterConfig;
2224
import org.openhab.binding.smaenergymeter.internal.packet.FilteringPayloadHandler;
@@ -40,13 +42,14 @@
4042
*
4143
* @author Osman Basha - Initial contribution
4244
*/
45+
@NonNullByDefault
4346
public class SMAEnergyMeterHandler extends BaseThingHandler implements PayloadHandler {
4447

4548
private final Logger logger = LoggerFactory.getLogger(SMAEnergyMeterHandler.class);
4649
private final PacketListenerRegistry listenerRegistry;
4750
private @Nullable PacketListener listener;
4851
private @Nullable PayloadHandler handler;
49-
private String serialNumber;
52+
private String serialNumber = "";
5053

5154
public SMAEnergyMeterHandler(Thing thing, PacketListenerRegistry listenerRegistry) {
5255
super(thing);
@@ -73,8 +76,8 @@ public void initialize() {
7376
EnergyMeterConfig config = getConfigAs(EnergyMeterConfig.class);
7477

7578
try {
76-
serialNumber = config.getSerialNumber();
77-
if (serialNumber == null) {
79+
serialNumber = Objects.requireNonNullElse(config.getSerialNumber(), "");
80+
if (serialNumber.isBlank()) {
7881
updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.CONFIGURATION_PENDING,
7982
"Meter serial number missing");
8083
return;

bundles/org.openhab.binding.smaenergymeter/src/main/java/org/openhab/binding/smaenergymeter/internal/packet/DefaultPacketListenerRegistry.java

+3-1
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,9 @@ protected void shutdown() throws IOException {
6464
logger.warn("Multicast socket {} failed to terminate", entry.getKey(), e);
6565
}
6666
}
67-
scheduler.shutdownNow();
67+
if (!scheduler.isShutdown()) {
68+
scheduler.shutdownNow();
69+
}
6870
}
6971

7072
public ScheduledFuture<?> addTask(ReceivingTask runnable) {

bundles/org.openhab.binding.smaenergymeter/src/main/java/org/openhab/binding/smaenergymeter/internal/packet/PacketListener.java

+14-15
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
import java.net.DatagramPacket;
1717
import java.net.DatagramSocket;
1818
import java.net.InetAddress;
19+
import java.net.InetSocketAddress;
1920
import java.net.MulticastSocket;
2021
import java.util.List;
2122
import java.util.concurrent.CopyOnWriteArrayList;
@@ -55,7 +56,7 @@ public PacketListener(DefaultPacketListenerRegistry registry, String multicastGr
5556
this.port = port;
5657
}
5758

58-
public void addPayloadHandler(PayloadHandler handler) {
59+
public void addPayloadHandler(PayloadHandler handler) throws IOException {
5960
if (handlers.isEmpty()) {
6061
open();
6162
}
@@ -75,22 +76,19 @@ public boolean isOpen() {
7576
return socket != null && socket.isConnected();
7677
}
7778

78-
private void open() {
79+
private void open() throws IOException {
7980
if (isOpen()) {
8081
// no need to bind socket second time
8182
return;
8283
}
83-
try {
84-
MulticastSocket socket = new MulticastSocket(port);
85-
socket.setSoTimeout(5000);
86-
InetAddress address = InetAddress.getByName(multicastGroup);
87-
socket.joinGroup(address);
88-
89-
future = registry.addTask(new ReceivingTask(socket, multicastGroup + ":" + port, handlers));
90-
this.socket = socket;
91-
} catch (IOException e) {
92-
throw new RuntimeException("Could not open socket", e);
93-
}
84+
MulticastSocket socket = new MulticastSocket(port);
85+
socket.setSoTimeout(5000);
86+
InetAddress mcastGroupAddress = InetAddress.getByName(multicastGroup);
87+
InetSocketAddress socketAddress = new InetSocketAddress(mcastGroupAddress, port);
88+
socket.joinGroup(socketAddress, null);
89+
90+
future = registry.addTask(new ReceivingTask(socket, multicastGroup + ":" + port, handlers));
91+
this.socket = socket;
9492
}
9593

9694
void close() throws IOException {
@@ -100,10 +98,11 @@ void close() throws IOException {
10098
this.future = null;
10199
}
102100

103-
InetAddress address = InetAddress.getByName(multicastGroup);
101+
InetAddress mcastGroupAddress = InetAddress.getByName(multicastGroup);
102+
InetSocketAddress socketAddress = new InetSocketAddress(mcastGroupAddress, port);
104103
MulticastSocket socket = this.socket;
105104
if (socket != null) {
106-
socket.leaveGroup(address);
105+
socket.leaveGroup(socketAddress, null);
107106
socket.close();
108107
this.socket = null;
109108
}

0 commit comments

Comments
 (0)