[remoteopenhab] Consider ItemStateChangedEvent events when relevant (#9243)
Fix #9190 Signed-off-by: Laurent Garnier <lg.hc@free.fr>
This commit is contained in:
parent
aba5e2c996
commit
7edfbc6391
|
@ -22,7 +22,9 @@ import java.time.format.DateTimeParseException;
|
|||
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;
|
||||
|
@ -112,6 +114,8 @@ public class RemoteopenhabBridgeHandler extends BaseBridgeHandler
|
|||
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,
|
||||
|
@ -181,6 +185,7 @@ public class RemoteopenhabBridgeHandler extends BaseBridgeHandler
|
|||
logger.debug("Disposing remote openHAB handler for bridge {}", getThing().getUID());
|
||||
stopStreamingUpdates();
|
||||
stopCheckConnectionJob();
|
||||
channelsLastStates.clear();
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -192,7 +197,7 @@ public class RemoteopenhabBridgeHandler extends BaseBridgeHandler
|
|||
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();
|
||||
|
@ -332,7 +337,7 @@ public class RemoteopenhabBridgeHandler extends BaseBridgeHandler
|
|||
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());
|
||||
|
@ -411,8 +416,8 @@ public class RemoteopenhabBridgeHandler extends BaseBridgeHandler
|
|||
}
|
||||
|
||||
@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
|
||||
|
@ -435,7 +440,8 @@ public class RemoteopenhabBridgeHandler extends BaseBridgeHandler
|
|||
}
|
||||
}
|
||||
|
||||
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);
|
||||
|
@ -555,6 +561,12 @@ public class RemoteopenhabBridgeHandler extends BaseBridgeHandler
|
|||
}
|
||||
}
|
||||
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(),
|
||||
|
|
|
@ -27,7 +27,7 @@ public interface RemoteopenhabItemsDataListener {
|
|||
/**
|
||||
* A new ItemStateEvent was published.
|
||||
*/
|
||||
void onItemStateEvent(String itemName, String stateType, String state);
|
||||
void onItemStateEvent(String itemName, String stateType, String state, boolean onlyIfStateChanged);
|
||||
|
||||
/**
|
||||
* A new ItemAddedEvent was published.
|
||||
|
|
|
@ -359,14 +359,20 @@ public class RemoteopenhabRestClient {
|
|||
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");
|
||||
|
@ -414,7 +420,6 @@ public class RemoteopenhabRestClient {
|
|||
.forEach(listener -> listener.onChannelTriggered(triggerEvent.channel, triggerEvent.event));
|
||||
break;
|
||||
case "ItemStatePredictedEvent":
|
||||
case "ItemStateChangedEvent":
|
||||
case "ItemCommandEvent":
|
||||
case "ThingStatusInfoEvent":
|
||||
case "ThingUpdatedEvent":
|
||||
|
|
Loading…
Reference in New Issue