这是indexloc提供的服务,不要输入任何密码
Skip to content
This repository was archived by the owner on May 17, 2021. It is now read-only.
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,32 @@ public class NestBinding extends AbstractActiveBinding<NestBindingProvider> impl
/**
* used to store events that we have sent ourselves; we need to remember them for not reacting to them
*/
private List<String> ignoreEventList = Collections.synchronizedList(new ArrayList<String>());
private static class Update {
private String itemName;
private State state;

Update(final String itemName, final State state) {
this.itemName = itemName;
this.state = state;
}

@Override
public boolean equals(Object o) {
if (o == null || !(o instanceof Update)) {
return false;
}
return (this.itemName == null ? ((Update) o).itemName == null : this.itemName.equals(((Update) o).itemName))
&& (this.state == null ? ((Update) o).state == null : this.state.equals(((Update) o).state));
}

@Override
public int hashCode() {
return (this.itemName == null ? 0 : this.itemName.hashCode())
^ (this.state == null ? 0 : this.state.hashCode());
}
}

private List<Update> ignoreEventList = Collections.synchronizedList(new ArrayList<Update>());

/**
* The most recently received data model, or <code>null</code> if none have been retrieved yet.
Expand Down Expand Up @@ -178,8 +203,9 @@ private void readNest(OAuthCredentials oauthCredentials) throws Exception {
* we need to make sure that we won't send out this event to Nest again, when receiving it on the
* openHAB bus
*/
ignoreEventList.add(itemName + newState.toString());
logger.trace("Added event (item='{}', newState='{}') to the ignore event list", itemName, newState);
ignoreEventList.add(new Update(itemName, newState));
logger.trace("Added event (item='{}', newState='{}') to the ignore event list (size={})",
itemName, newState, ignoreEventList.size());
this.eventPublisher.postUpdate(itemName, newState);
}
}
Expand Down Expand Up @@ -283,8 +309,7 @@ private void commandNest(final String itemName, final Command command) {
}

private boolean isEcho(String itemName, State state) {
String ignoreEventListKey = itemName + state.toString();
if (ignoreEventList.remove(ignoreEventListKey)) {
if (ignoreEventList.remove(new Update(itemName, state))) {
logger.debug(
"We received this event (item='{}', state='{}') from Nest, so we don't send it back again -> ignore!",
itemName, state);
Expand Down Expand Up @@ -316,44 +341,47 @@ private void updateNest(final String itemName, final State newState) {
if (provider == null) {
logger.warn("no matching binding provider found [itemName={}, newState={}]", itemName, newState);
return;
} else {
}

try {
logger.debug("About to set property '{}' to '{}'", property, newState);
if (!provider.isOutBound(itemName)) {
logger.warn("attempt to update non-outbound item skipped [itemName={}, newState={}]", itemName, newState);
return;
}

// Ask the old DataModel to generate a new DataModel that only contains the update we want to send
DataModel updateDataModel = oldDataModel.updateDataModel(property, newState);
try {
logger.debug("About to set property '{}' to '{}'", property, newState);

logger.trace("Data model for update: {}", updateDataModel);
// Ask the old DataModel to generate a new DataModel that only contains the update we want to send
DataModel updateDataModel = oldDataModel.updateDataModel(property, newState);

if (updateDataModel == null) {
return;
}
logger.trace("Data model for update: {}", updateDataModel);

OAuthCredentials oauthCredentials = getOAuthCredentials(DEFAULT_USER_ID);
if (updateDataModel == null) {
return;
}

if (oauthCredentials == null) {
logger.warn("Unable to locate credentials for item {}; aborting update.", itemName);
return;
}
OAuthCredentials oauthCredentials = getOAuthCredentials(DEFAULT_USER_ID);

// If we don't have an access token yet, retrieve one.
if (oauthCredentials.noAccessToken()) {
if (!oauthCredentials.retrieveAccessToken()) {
logger.warn("Sending update skipped.");
return;
}
}
if (oauthCredentials == null) {
logger.warn("Unable to locate credentials for item {}; aborting update.", itemName);
return;
}

UpdateDataModelRequest request = new UpdateDataModelRequest(oauthCredentials.accessToken,
updateDataModel);
DataModelResponse response = request.execute();
if (response.isError()) {
logger.error("Error updating data model: {}", response);
// If we don't have an access token yet, retrieve one.
if (oauthCredentials.noAccessToken()) {
if (!oauthCredentials.retrieveAccessToken()) {
logger.warn("Sending update skipped.");
return;
}
} catch (Exception e) {
logger.error("Unable to update data model", e);
}

UpdateDataModelRequest request = new UpdateDataModelRequest(oauthCredentials.accessToken, updateDataModel);
DataModelResponse response = request.execute();
if (response.isError()) {
logger.error("Error updating data model: {}", response);
}
} catch (Exception e) {
logger.error("Unable to update data model", e);
}
}

Expand Down