import static org.openhab.binding.smaenergymeter.internal.SMAEnergyMeterBindingConstants.*;
+import org.eclipse.jdt.annotation.NonNullByDefault;
+import org.eclipse.jdt.annotation.Nullable;
import org.openhab.binding.smaenergymeter.internal.handler.SMAEnergyMeterHandler;
import org.openhab.binding.smaenergymeter.internal.packet.PacketListenerRegistry;
import org.openhab.core.thing.Thing;
*
* @author Osman Basha - Initial contribution
*/
+@NonNullByDefault
@Component(service = ThingHandlerFactory.class, configurationPid = "binding.smaenergymeter")
public class SMAEnergyMeterHandlerFactory extends BaseThingHandlerFactory {
}
@Override
- protected ThingHandler createHandler(Thing thing) {
+ protected @Nullable ThingHandler createHandler(Thing thing) {
ThingTypeUID thingTypeUID = thing.getThingTypeUID();
if (thingTypeUID.equals(THING_TYPE_ENERGY_METER)) {
return;
}
- packetListener.addPayloadHandler(this);
+ try {
+ packetListener.addPayloadHandler(this);
+ } catch (IOException e) {
+ logger.warn("Could not start background discovery, unable to add PayloadHandler", e);
+ return;
+ }
this.packetListener = packetListener;
}
import java.nio.ByteBuffer;
import java.util.Arrays;
+import org.eclipse.jdt.annotation.NonNullByDefault;
import org.openhab.core.library.types.DecimalType;
/**
* @author Ćukasz Dywicki - Extracted multicast group handling to
* {@link org.openhab.binding.smaenergymeter.internal.packet.PacketListener}.
*/
+@NonNullByDefault
public class EnergyMeter {
private static final byte[] E_METER_PROTOCOL_ID = new byte[] { 0x60, 0x69 };
- private String serialNumber;
+ private String serialNumber = "";
private final FieldDTO powerIn;
private final FieldDTO energyIn;
private final FieldDTO powerOut;
import static org.openhab.binding.smaenergymeter.internal.SMAEnergyMeterBindingConstants.*;
import java.io.IOException;
+import java.util.Objects;
import java.util.concurrent.TimeUnit;
+import org.eclipse.jdt.annotation.NonNullByDefault;
import org.eclipse.jdt.annotation.Nullable;
import org.openhab.binding.smaenergymeter.internal.configuration.EnergyMeterConfig;
import org.openhab.binding.smaenergymeter.internal.packet.FilteringPayloadHandler;
*
* @author Osman Basha - Initial contribution
*/
+@NonNullByDefault
public class SMAEnergyMeterHandler extends BaseThingHandler implements PayloadHandler {
private final Logger logger = LoggerFactory.getLogger(SMAEnergyMeterHandler.class);
private final PacketListenerRegistry listenerRegistry;
private @Nullable PacketListener listener;
private @Nullable PayloadHandler handler;
- private String serialNumber;
+ private String serialNumber = "";
public SMAEnergyMeterHandler(Thing thing, PacketListenerRegistry listenerRegistry) {
super(thing);
EnergyMeterConfig config = getConfigAs(EnergyMeterConfig.class);
try {
- serialNumber = config.getSerialNumber();
- if (serialNumber == null) {
+ serialNumber = Objects.requireNonNullElse(config.getSerialNumber(), "");
+ if (serialNumber.isBlank()) {
updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.CONFIGURATION_PENDING,
"Meter serial number missing");
return;
logger.warn("Multicast socket {} failed to terminate", entry.getKey(), e);
}
}
- scheduler.shutdownNow();
+ if (!scheduler.isShutdown()) {
+ scheduler.shutdownNow();
+ }
}
public ScheduledFuture<?> addTask(ReceivingTask runnable) {
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
+import java.net.InetSocketAddress;
import java.net.MulticastSocket;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
this.port = port;
}
- public void addPayloadHandler(PayloadHandler handler) {
+ public void addPayloadHandler(PayloadHandler handler) throws IOException {
if (handlers.isEmpty()) {
open();
}
return socket != null && socket.isConnected();
}
- private void open() {
+ private void open() throws IOException {
if (isOpen()) {
// no need to bind socket second time
return;
}
- try {
- MulticastSocket socket = new MulticastSocket(port);
- socket.setSoTimeout(5000);
- InetAddress address = InetAddress.getByName(multicastGroup);
- socket.joinGroup(address);
-
- future = registry.addTask(new ReceivingTask(socket, multicastGroup + ":" + port, handlers));
- this.socket = socket;
- } catch (IOException e) {
- throw new RuntimeException("Could not open socket", e);
- }
+ MulticastSocket socket = new MulticastSocket(port);
+ socket.setSoTimeout(5000);
+ InetAddress mcastGroupAddress = InetAddress.getByName(multicastGroup);
+ InetSocketAddress socketAddress = new InetSocketAddress(mcastGroupAddress, port);
+ socket.joinGroup(socketAddress, null);
+
+ future = registry.addTask(new ReceivingTask(socket, multicastGroup + ":" + port, handlers));
+ this.socket = socket;
}
void close() throws IOException {
this.future = null;
}
- InetAddress address = InetAddress.getByName(multicastGroup);
+ InetAddress mcastGroupAddress = InetAddress.getByName(multicastGroup);
+ InetSocketAddress socketAddress = new InetSocketAddress(mcastGroupAddress, port);
MulticastSocket socket = this.socket;
if (socket != null) {
- socket.leaveGroup(address);
+ socket.leaveGroup(socketAddress, null);
socket.close();
this.socket = null;
}