import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
+import java.util.HashMap;
import java.util.List;
+import java.util.Map;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
private @Nullable ScheduledFuture<?> checkConnectionJob;
private RemoteopenhabRestClient restClient;
+ private Map<ChannelUID, State> channelsLastStates = new HashMap<>();
+
public RemoteopenhabBridgeHandler(Bridge bridge, HttpClient httpClient, HttpClient httpClientTrustingCert,
ClientBuilder clientBuilder, SseEventSourceFactory eventSourceFactory,
RemoteopenhabChannelTypeProvider channelTypeProvider,
logger.debug("Disposing remote openHAB handler for bridge {}", getThing().getUID());
stopStreamingUpdates();
stopCheckConnectionJob();
+ channelsLastStates.clear();
}
@Override
try {
if (command instanceof RefreshType) {
String state = restClient.getRemoteItemState(channelUID.getId());
- updateChannelState(channelUID.getId(), null, state);
+ updateChannelState(channelUID.getId(), null, state, false);
} else if (isLinked(channelUID)) {
restClient.sendCommandToRemoteItem(channelUID.getId(), command);
String commandStr = command.toFullString();
try {
items = restClient.getRemoteItems("name,state");
for (RemoteopenhabItem item : items) {
- updateChannelState(item.name, null, item.state);
+ updateChannelState(item.name, null, item.state, false);
}
} catch (RemoteopenhabException e) {
logger.debug("{}", e.getMessage());
}
@Override
- public void onItemStateEvent(String itemName, String stateType, String state) {
- updateChannelState(itemName, stateType, state);
+ public void onItemStateEvent(String itemName, String stateType, String state, boolean onlyIfStateChanged) {
+ updateChannelState(itemName, stateType, state, onlyIfStateChanged);
}
@Override
}
}
- private void updateChannelState(String itemName, @Nullable String stateType, String state) {
+ private void updateChannelState(String itemName, @Nullable String stateType, String state,
+ boolean onlyIfStateChanged) {
Channel channel = getThing().getChannel(itemName);
if (channel == null) {
logger.trace("No channel for item {}", itemName);
}
}
if (channelState != null) {
+ if (onlyIfStateChanged && channelState.equals(channelsLastStates.get(channel.getUID()))) {
+ logger.trace("ItemStateChangedEvent ignored for item {} as state is identical to the last state",
+ itemName);
+ return;
+ }
+ channelsLastStates.put(channel.getUID(), channelState);
updateState(channel.getUID(), channelState);
String channelStateStr = channelState.toFullString();
logger.debug("updateState {} with {}", channel.getUID(),
case "ItemStateEvent":
itemName = extractItemNameFromTopic(event.topic, event.type, "state");
payload = jsonParser.fromJson(event.payload, RemoteopenhabEventPayload.class);
- itemsListeners
- .forEach(listener -> listener.onItemStateEvent(itemName, payload.type, payload.value));
+ itemsListeners.forEach(
+ listener -> listener.onItemStateEvent(itemName, payload.type, payload.value, false));
+ break;
+ case "ItemStateChangedEvent":
+ itemName = extractItemNameFromTopic(event.topic, event.type, "statechanged");
+ payload = jsonParser.fromJson(event.payload, RemoteopenhabEventPayload.class);
+ itemsListeners.forEach(
+ listener -> listener.onItemStateEvent(itemName, payload.type, payload.value, true));
break;
case "GroupItemStateChangedEvent":
itemName = extractItemNameFromTopic(event.topic, event.type, "statechanged");
payload = jsonParser.fromJson(event.payload, RemoteopenhabEventPayload.class);
- itemsListeners
- .forEach(listener -> listener.onItemStateEvent(itemName, payload.type, payload.value));
+ itemsListeners.forEach(
+ listener -> listener.onItemStateEvent(itemName, payload.type, payload.value, false));
break;
case "ItemAddedEvent":
itemName = extractItemNameFromTopic(event.topic, event.type, "added");
.forEach(listener -> listener.onChannelTriggered(triggerEvent.channel, triggerEvent.event));
break;
case "ItemStatePredictedEvent":
- case "ItemStateChangedEvent":
case "ItemCommandEvent":
case "ThingStatusInfoEvent":
case "ThingUpdatedEvent":