Zepp OS: Fetch sleep stages and score

Newer Zepp OS devices report sleep sessions separately, which include
accurate sleep stages, and a sleep score.

- Persist this data raw, since we don't know how to fully process it
- Overlay (and prefer) this data over sleep samples

Devices that do not support these such as the Mi Band 7 reply with
an unsuccessful fetch response, which is fine.
This commit is contained in:
José Rebelo
2025-03-23 15:56:11 +00:00
parent b91254265c
commit 849a7dc996
22 changed files with 475 additions and 70 deletions
@@ -56,7 +56,7 @@ public class GBDaoGenerator {
public static void main(String[] args) throws Exception {
final Schema schema = new Schema(98, MAIN_PACKAGE + ".entities");
final Schema schema = new Schema(99, MAIN_PACKAGE + ".entities");
Entity userAttributes = addUserAttributes(schema);
Entity user = addUserInfo(schema, userAttributes);
@@ -81,6 +81,7 @@ public class GBDaoGenerator {
addHuamiHeartRateRestingSample(schema, user, device);
addHuamiPaiSample(schema, user, device);
addHuamiSleepRespiratoryRateSample(schema, user, device);
addHuamiSleepSessionSample(schema, user, device);
addXiaomiActivitySample(schema, user, device);
addXiaomiSleepTimeSamples(schema, user, device);
addHeartPulseSamples(schema, user, device);
@@ -404,6 +405,13 @@ public class GBDaoGenerator {
return sleepRespiratoryRateSample;
}
private static Entity addHuamiSleepSessionSample(Schema schema, Entity user, Entity device) {
Entity sample = addEntity(schema, "HuamiSleepSessionSample");
addCommonTimeSampleProperties("AbstractHuamiSleepSessionSample", sample, user, device);
sample.addByteArrayProperty("data");
return sample;
}
private static Entity addXiaomiActivitySample(Schema schema, Entity user, Entity device) {
Entity activitySample = addEntity(schema, "XiaomiActivitySample");
addCommonActivitySampleProperties("AbstractActivitySample", activitySample, user, device);
@@ -925,7 +933,8 @@ public class GBDaoGenerator {
private static Entity addGarminSleepStatsSample(Schema schema, Entity user, Entity device) {
Entity sample = addEntity(schema, "GarminSleepStatsSample");
sample.addImport(MAIN_PACKAGE + ".model.SleepScoreSample");
addCommonTimeSampleProperties("SleepScoreSample", sample, user, device);
addCommonTimeSampleProperties("AbstractTimeSample", sample, user, device);
sample.implementsInterface("SleepScoreSample");
sample.addIntProperty("sleepScore").notNull().codeBeforeGetter(OVERRIDE);
return sample;
}