1
0
mirror of https://codeberg.org/Freeyourgadget/Gadgetbridge synced 2024-12-26 02:25:50 +01:00

Amazfit GTS 3: Fix battery drain due to unanswered weather requests

- Reply with HTTP 404 to unknown weather endpoints
- Add some missing fields to weather responses

The official Zepp app itself gets a 404 when calling a /weather/tide
endpoint, so we don't know what the watch is supposed to receive.

Weather also seems to still not work correctly on the GTS 3, but this at
least fixes the request spam that was coming from the watch on the tide
endpoint.
This commit is contained in:
José Rebelo 2022-09-21 21:30:23 +01:00
parent cdc60cec51
commit a6cb73e843
2 changed files with 47 additions and 15 deletions

View File

@ -2237,9 +2237,16 @@ public abstract class Huami2021Support extends HuamiSupport {
final Huami2021Weather.Response response = Huami2021Weather.handleHttpRequest(path, query);
if (response != null) {
replyHttpSuccess(requestId, response.toJson());
return;
replyHttpSuccess(requestId, 200, response.toJson());
} else {
final Huami2021Weather.Response notFoundResponse = new Huami2021Weather.ErrorResponse(
-2001,
"Not found"
);
replyHttpSuccess(requestId, 404, notFoundResponse.toJson());
}
return;
}
LOG.error("Unhandled URL {}", url);
@ -2273,8 +2280,8 @@ public abstract class Huami2021Support extends HuamiSupport {
writeToChunked2021("http reply no internet", Huami2021Service.CHUNKED2021_ENDPOINT_HTTP, cmd, true);
}
private void replyHttpSuccess(final byte requestId, final String content) {
LOG.debug("Replying with success to http request {} with {}", requestId, content);
private void replyHttpSuccess(final byte requestId, final int status, final String content) {
LOG.debug("Replying with http {} request {} with {}", status, requestId, content);
final byte[] contentBytes = content.getBytes(StandardCharsets.UTF_8);
final ByteBuffer buf = ByteBuffer.allocate(8 + contentBytes.length);
@ -2283,7 +2290,7 @@ public abstract class Huami2021Support extends HuamiSupport {
buf.put((byte) 0x02);
buf.put(requestId);
buf.put(HTTP_RESPONSE_SUCCESS);
buf.put((byte) 0xc8); // ?
buf.put((byte) status);
buf.putInt(contentBytes.length);
buf.put(contentBytes);

View File

@ -99,6 +99,24 @@ public class Huami2021Weather {
}
}
public static class ErrorResponse extends Response {
private final int code;
private final String message;
public ErrorResponse(final int code, final String message) {
this.code = code;
this.message = message;
}
public int getCode() {
return code;
}
public String getMessage() {
return message;
}
}
public static abstract class Response {
public String toJson() {
return GSON.toJson(this);
@ -114,13 +132,13 @@ public class Huami2021Weather {
// locationKey=00.000,-0.000,xiaomi_accu:000000
public static class ForecastResponse extends Response {
public Date pubTime;
public List<Object> humidity = new ArrayList<>();
public List<String> humidity = new ArrayList<>();
public List<Range> temperature = new ArrayList<>();
public List<Range> weather = new ArrayList<>();
public List<Range> windDirection = new ArrayList<>();
public List<Range> sunRiseSet = new ArrayList<>();
public List<Range> windSpeed = new ArrayList<>();
public Object moonRiseSet = new Object();
public Object moonRiseSet = new Object(); // MoonRiseSet
public List<Object> airQualities = new ArrayList<>();
public ForecastResponse(final WeatherSpec weatherSpec, final int days) {
@ -176,6 +194,11 @@ public class Huami2021Weather {
}
}
private static class MoonRiseSet {
public List<String> moonPhaseValue = new ArrayList<>();
public List<Range> moonRise = new ArrayList<>();
}
private static class Range {
public String from;
public String to;
@ -224,6 +247,7 @@ public class Huami2021Weather {
// locationKey=00.000,-0.000,xiaomi_accu:000000
public static class CurrentResponse extends Response {
public CurrentWeatherModel currentWeatherModel;
public Object aqiModel = new Object();
public CurrentResponse(final WeatherSpec weatherSpec) {
this.currentWeatherModel = new CurrentWeatherModel(weatherSpec);
@ -305,14 +329,14 @@ public class Huami2021Weather {
// isGlobal=true
// locationKey=00.000,-0.000,xiaomi_accu:000000
public static class HourlyResponse extends Response {
public Object pubTime;
public Object weather;
public Object temperature;
public Object humidity;
public Object fxTime;
public Object windDirection;
public Object windSpeed;
public Object windScale;
public Date pubTime;
public List<String> weather;
public List<String> temperature;
public List<String> humidity;
public List<String> fxTime; // pubTime format
public List<String> windDirection;
public List<String> windSpeed;
public List<String> windScale; // each element in the form of 1-2
}
// /weather/alerts
@ -323,6 +347,7 @@ public class Huami2021Weather {
// isGlobal=true
// locationKey=00.000,-0.000,xiaomi_accu:000000
public static class AlertsResponse extends Response {
public List<IndexEntry> alerts = new ArrayList<>();
}
//@RequiresApi(api = Build.VERSION_CODES.O)