// Assign old value
Value value = property.getChannelState().getCache();
Command command = TypeParser.parseCommand(value.getSupportedCommandTypes(), "OLDVALUE");
- property.getChannelState().getCache().update(command);
- // Try to update with new value
- updateValue = new StringType("SOMETHINGNEW");
- thingHandler.handleCommand(property.channelUID, updateValue);
- // Expect old value and no MQTT publish
- assertThat(property.getChannelState().getCache().getChannelState().toString(), is("OLDVALUE"));
- verify(connection, times(1)).publish(any(), any(), anyInt(), anyBoolean());
+ if (command != null) {
+ property.getChannelState().getCache().update(command);
+ // Try to update with new value
+ updateValue = new StringType("SOMETHINGNEW");
+ thingHandler.handleCommand(property.channelUID, updateValue);
+ // Expect old value and no MQTT publish
+ assertThat(property.getChannelState().getCache().getChannelState().toString(), is("OLDVALUE"));
+ verify(connection, times(1)).publish(any(), any(), anyInt(), anyBoolean());
+ }
}
public Object createSubscriberAnswer(InvocationOnMock invocation) {
import java.util.concurrent.TimeUnit;
import org.apache.commons.lang.StringUtils;
+import org.eclipse.jdt.annotation.NonNullByDefault;
+import org.eclipse.jdt.annotation.Nullable;
import org.openhab.binding.oceanic.internal.NetworkOceanicBindingConfiguration;
import org.openhab.binding.oceanic.internal.Throttler;
import org.openhab.core.thing.Thing;
*
* @author Karel Goderis - Initial contribution
*/
+@NonNullByDefault
public class NetworkOceanicThingHandler extends OceanicThingHandler {
private static final int REQUEST_TIMEOUT = 3000;
private final Logger logger = LoggerFactory.getLogger(NetworkOceanicThingHandler.class);
- private Socket socket;
- private InputStream inputStream;
- private OutputStream outputStream;
- protected ScheduledFuture<?> reconnectJob;
+ private @Nullable Socket socket;
+ private @Nullable InputStream inputStream;
+ private @Nullable OutputStream outputStream;
+ protected @Nullable ScheduledFuture<?> reconnectJob;
public NetworkOceanicThingHandler(Thing thing) {
super(thing);
}
@Override
- protected String requestResponse(String commandAsString) {
+ protected @Nullable String requestResponse(String commandAsString) {
synchronized (this) {
if (getThing().getStatus() == ThingStatus.ONLINE) {
NetworkOceanicBindingConfiguration config = getConfigAs(NetworkOceanicBindingConfiguration.class);
package org.openhab.binding.oceanic.internal.handler;
import java.math.BigDecimal;
-import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit;
-import org.eclipse.jdt.annotation.NonNull;
+import org.eclipse.jdt.annotation.NonNullByDefault;
+import org.eclipse.jdt.annotation.Nullable;
import org.openhab.binding.oceanic.internal.OceanicBindingConstants.OceanicChannelSelector;
import org.openhab.core.thing.Channel;
import org.openhab.core.thing.ChannelUID;
import org.openhab.core.types.Command;
import org.openhab.core.types.RefreshType;
import org.openhab.core.types.State;
-import org.openhab.core.types.Type;
import org.openhab.core.types.TypeParser;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
*
* @author Karel Goderis - Initial contribution
*/
+@NonNullByDefault
public abstract class OceanicThingHandler extends BaseThingHandler {
public static final String INTERVAL = "interval";
private final Logger logger = LoggerFactory.getLogger(OceanicThingHandler.class);
protected int bufferSize;
- protected ScheduledFuture<?> pollingJob;
+ protected @Nullable ScheduledFuture<?> pollingJob;
protected static String lastLineReceived = "";
- public OceanicThingHandler(@NonNull Thing thing) {
+ public OceanicThingHandler(Thing thing) {
super(thing);
}
updateProperties(properties);
} else {
State value = createStateForType(selector, response);
- updateState(theChannelUID, value);
+ if (value != null) {
+ updateState(theChannelUID, value);
+ }
}
} else {
logger.warn("Received an empty answer for '{}'", selector.name());
break;
}
String response = requestResponse(commandAsString);
- if (response.equals("ERR")) {
+ if ("ERR".equals(response)) {
logger.error("An error occurred while setting '{}' to {}", selector.toString(),
commandAsString);
}
}
@SuppressWarnings("unchecked")
- private State createStateForType(OceanicChannelSelector selector, String value) {
- Class<? extends Type> typeClass = selector.getTypeClass();
- List<Class<? extends State>> stateTypeList = new ArrayList<>();
-
- stateTypeList.add((Class<? extends State>) typeClass);
- State state = TypeParser.parseState(stateTypeList, selector.convertValue(value));
-
- return state;
+ private @Nullable State createStateForType(OceanicChannelSelector selector, String value) {
+ return TypeParser.parseState(List.of((Class<? extends State>) selector.getTypeClass()),
+ selector.convertValue(value));
}
- protected abstract String requestResponse(String commandAsString);
+ protected abstract @Nullable String requestResponse(String commandAsString);
}
import java.text.MessageFormat;
import java.time.Duration;
import java.util.ArrayList;
-import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
if (!channel.getProperties().containsKey(SmartMeterBindingConstants.CHANNEL_PROPERTY_OBIS)) {
addObisPropertyToChannel(obis, channel);
}
- updateState(channel.getUID(), state);
+ if (state != null) {
+ updateState(channel.getUID(), state);
+ }
updateStatus(ThingStatus.ONLINE, ThingStatusDetail.NONE);
} else {
MeterValue<?> value = this.smlDevice.getMeterValue(obis);
if (value != null) {
State state = getStateForObisValue(value, channel);
- updateState(channel.getUID(), state);
+ if (state != null) {
+ updateState(channel.getUID(), state);
+ }
}
}
}
}
@SuppressWarnings("unchecked")
- private <Q extends Quantity<Q>> State getStateForObisValue(MeterValue<?> value, @Nullable Channel channel) {
+ private @Nullable <Q extends Quantity<Q>> State getStateForObisValue(MeterValue<?> value,
+ @Nullable Channel channel) {
Unit<?> unit = value.getUnit();
String valueString = value.getValue();
if (unit != null) {
valueString += " " + value.getUnit();
}
- State state = TypeParser.parseState(Arrays.asList(QuantityType.class, StringType.class), valueString);
+ State state = TypeParser.parseState(List.of(QuantityType.class, StringType.class), valueString);
if (channel != null && state instanceof QuantityType) {
state = applyConformity(channel, (QuantityType<Q>) state);
Number conversionRatio = (Number) channel.getConfiguration()