Skip to content

Commit

Permalink
[intesis] Improve session handling (openhab#16476)
Browse files Browse the repository at this point in the history
* [intesis] SESSION ID HANDLING IMPROVED

Signed-off-by: Christoph <fd0cwp@gmx.de>
Signed-off-by: Jørgen Austvik <jaustvik@acm.org>
  • Loading branch information
fd0cwp authored and austvik committed Mar 27, 2024
1 parent b37e221 commit 75c5e03
Show file tree
Hide file tree
Showing 2 changed files with 41 additions and 10 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ public class IntesisHomeJSonDTO {
public static class Response {
public boolean success;
public JsonElement data;
public JsonElement error;
}

public static class Data {
Expand All @@ -36,6 +37,11 @@ public static class Data {
public JsonElement dpval;
}

public static class ResponseError {
public int code;
public String message;
}

public static class Id {
public String sessionID; // Session ID
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@
import org.openhab.binding.intesis.internal.gson.IntesisHomeJSonDTO.Id;
import org.openhab.binding.intesis.internal.gson.IntesisHomeJSonDTO.Info;
import org.openhab.binding.intesis.internal.gson.IntesisHomeJSonDTO.Response;
import org.openhab.binding.intesis.internal.gson.IntesisHomeJSonDTO.ResponseError;
import org.openhab.core.library.types.DecimalType;
import org.openhab.core.library.types.OnOffType;
import org.openhab.core.library.types.QuantityType;
Expand Down Expand Up @@ -86,6 +87,8 @@ public class IntesisHomeHandler extends BaseThingHandler {

private IntesisHomeConfiguration config = new IntesisHomeConfiguration();

private String sessionId = "";

private @Nullable ScheduledFuture<?> refreshJob;

public IntesisHomeHandler(final Thing thing, final HttpClient httpClient,
Expand All @@ -109,6 +112,9 @@ public void initialize() {
updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.CONFIGURATION_ERROR, "Password not set");
return;
} else {
logger.trace("trying to log in - current session ID: {}", sessionId);
login();

// start background initialization:
scheduler.submit(() -> {
populateProperties();
Expand All @@ -129,6 +135,8 @@ public void dispose() {
refreshJob.cancel(true);
this.refreshJob = null;
}

logout(sessionId);
}

@Override
Expand Down Expand Up @@ -216,26 +224,29 @@ public void handleCommand(ChannelUID channelUID, Command command) {
}

public @Nullable String login() {
// lambda's can't modify local variables, so we use an array here to get around the issue
String[] sessionId = new String[1];
postRequest(
"{\"command\":\"login\",\"data\":{\"username\":\"Admin\",\"password\":\"" + config.password + "\"}}",
resp -> {
Data data = gson.fromJson(resp.data, Data.class);
ResponseError error = gson.fromJson(resp.error, ResponseError.class);
if (error != null) {
logger.debug("Login - Error: {}", error);
}
if (data != null) {
Id id = gson.fromJson(data.id, Id.class);
if (id != null) {
sessionId[0] = id.sessionID;
sessionId = id.sessionID.toString();
}
}
});
if (sessionId[0] != null && !sessionId[0].isEmpty()) {
logger.trace("Login - received session ID: {}", sessionId);
if (sessionId != null && !sessionId.isEmpty()) {
updateStatus(ThingStatus.ONLINE);
return sessionId[0];
} else {
updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.COMMUNICATION_ERROR, "SessionId not received");
return null;
sessionId = "";
}
return sessionId;
}

public @Nullable String logout(String sessionId) {
Expand Down Expand Up @@ -309,18 +320,34 @@ public void addChannel(String channelId, String itemType, @Nullable final Collec
}

private void postRequest(String request, Consumer<Response> handler) {
postRequest(request, handler, false);
}

private void postRequest(String request, Consumer<Response> handler, boolean retry) {
try {
logger.trace("request : '{}'", request);
String response = api.postRequest(config.ipAddress, request);
if (response != null) {
Response resp = gson.fromJson(response, Response.class);
if (resp != null) {
boolean success = resp.success;
if (success) {
if (resp.success) {
handler.accept(resp);
} else {
updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.COMMUNICATION_ERROR,
"Request unsuccessful");
ResponseError respError = gson.fromJson(resp.error, ResponseError.class);
if (respError != null) {
logger.warn("postRequest failed - respErrorCode: {} / respErrorMessage: {} / retry {}",
respError.code, respError.message, retry);
if (!retry && respError.code == 1) {
logger.debug(
"postRequest: trying to log in and retry request - respErrorCode: {} / respErrorMessage: {} / retry {}",
respError.code, respError.message, retry);
login();
postRequest(request, handler, true);
}
}

}
}
} else {
Expand All @@ -332,13 +359,11 @@ private void postRequest(String request, Consumer<Response> handler) {
}

private void postRequestInSession(UnaryOperator<String> requestFactory, Consumer<Response> handler) {
String sessionId = login();
if (sessionId != null) {
try {
String request = requestFactory.apply(sessionId);
postRequest(request, handler);
} finally {
logout(sessionId);
}
}
}
Expand Down

0 comments on commit 75c5e03

Please sign in to comment.